remotes/origin/PR-39
ArturBaybulatov 10 years ago
parent 1aa50cccc9
commit 42af1b4216
  1. 89
      assets/index.js
  2. 2
      assets/js/chat.js
  3. 8
      projects/forms.py
  4. 16
      projects/templates/contractor_portfolio_edit.html
  5. 30
      projects/views.py
  6. 2
      templates/partials/base.html
  7. 8
      users/templates/contractor_profile.html
  8. 6
      users/templates/user_financial_info_edit.html
  9. 6
      users/templates/user_profile_edit.html

@ -512,46 +512,54 @@ function loadAllPhotos(portfIds) {
// Live image upload --------------------------------------------
// Live image upload ---------------------------------------
;(function() { ;(function() {
var $liveImageUploadContainer = $('.-live-image-upload-container').first() var $container = $('.-live-image-upload-container').first()
var $avatarImage = $liveImageUploadContainer.find('.-avatar-image').first() var $liveImageUploadField = $container.find('.-live-image-upload-field').first()
var $liveImageUpload = $liveImageUploadContainer.find('.-live-image-upload').first() var liveImageDeleteClass = '.-live-image-delete'
var $liveImageId = $liveImageUploadContainer.find('.-live-image-id').first() var $imageDeleteBtns = $('.-image-delete')
var $liveImageDelete = $liveImageUploadContainer.find('.-live-image-delete').first()
$avatarImage.attr('orig-src', $avatarImage.attr('src')) var templ = _.template($container.find('.-templ').first().html())
var $res = $container.find('.-res').first()
$liveImageUpload.fileupload({ var images = []
$liveImageUploadField.fileupload({
url: LIVE_IMAGE_UPLOAD_URL, url: LIVE_IMAGE_UPLOAD_URL,
dataType: 'json', dataType: 'json',
done: function($evt, data) { done: function($evt, data) {
var image = data.result var image = data.result
images.push(image)
$avatarImage.attr('src', image.thumbnailUrl) render()
$liveImageId.val(image.id)
$liveImageDelete.data('url', image.deleteUrl)
$liveImageDelete.css('display', 'block')
} }
}) })
$liveImageDelete.on('click', function($evt) { $container.on('click', liveImageDeleteClass, function($evt) {
var $that = $(this) var $that = $(this)
var image = _.find({id: $that.data('imageId')}, images)
$.post($that.data('url')).then(function(res) { $.post(image.deleteUrl).then(function(res) {
if (res.status == 'success') { if (res.status == 'success') {
$avatarImage.attr('src', $avatarImage.attr('orig-src') || STUB_IMAGE_URL) remove(images, image)
$liveImageId.val('') render()
$that.css('display', 'none')
} }
}) })
}) })
$imageDeleteBtns.on('click', function($evt) {
$(this).closest('.-image-widget').remove()
})
// Helpers --------------------------------
function render() {
$res.html(templ({images: images}))
}
}()) }())
@ -562,21 +570,19 @@ function loadAllPhotos(portfIds) {
// Live image upload (multiple) -----------------------------------
// Live image avatar (single) upload ---------------------------------
;(function() { ;(function() {
var $container = $('.-live-image-upload-multiple-container').first() var $container = $('.-live-image-avatar-upload-container').first()
var $avatarImage = $container.find('.-avatar-image').first()
var $liveImageUpload = $container.find('.-live-image-upload').first() var $liveImageUpload = $container.find('.-live-image-upload').first()
var liveImageDeleteClass = '.-live-image-delete' var $liveImageId = $container.find('.-live-image-id').first()
var $liveImageDelete = $container.find('.-live-image-delete').first()
var templ = _.template($container.find('.-templ').first().html()) $avatarImage.attr('orig-src', $avatarImage.attr('src'))
var $res = $container.find('.-res').first()
var images = []
render()
$liveImageUpload.fileupload({ $liveImageUpload.fileupload({
url: LIVE_IMAGE_UPLOAD_URL, url: LIVE_IMAGE_UPLOAD_URL,
@ -584,29 +590,26 @@ function loadAllPhotos(portfIds) {
done: function($evt, data) { done: function($evt, data) {
var image = data.result var image = data.result
images.push(image)
render() $avatarImage.attr('src', image.thumbnailUrl)
$liveImageId.val(image.id)
$liveImageDelete.data('url', image.deleteUrl)
$liveImageDelete.css('display', 'block')
} }
}) })
$container.on('click', liveImageDeleteClass, function($evt) { $liveImageDelete.on('click', function($evt) {
var $that = $(this) var $that = $(this)
var image = _.find({id: $that.data('imageId')}, images)
$.post(image.deleteUrl).then(function(res) { $.post($that.data('url')).then(function(res) {
if (res.status == 'success') { if (res.status == 'success') {
remove(images, image) $avatarImage.attr('src', $avatarImage.attr('orig-src') || STUB_IMAGE_URL)
render() $liveImageId.val('')
$that.css('display', 'none')
} }
}) })
}) })
// Utils --------------------------------
function render() {
$res.html(templ({images: images}))
}
}()) }())

@ -1,6 +1,6 @@
var SocketHandler = function () { var SocketHandler = function () {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/'; var url = 'ws://' + domain + '/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {

@ -7,7 +7,7 @@ import itertools
from .models import Project, ProjectFile, Portfolio, Answer, AnswerMessage, Realty, PortfolioPhoto, Stage from .models import Project, ProjectFile, Portfolio, Answer, AnswerMessage, Realty, PortfolioPhoto, Stage
from archilance import util from archilance import util
from common.models import Location from common.models import Location, LiveImageUpload
from specializations.models import Specialization from specializations.models import Specialization
from users.models import User, Team from users.models import User, Team
@ -195,6 +195,12 @@ class PortfolioEditForm(forms.ModelForm):
required=False, required=False,
) )
live_images = forms.ModelMultipleChoiceField(
queryset=LiveImageUpload.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=False,
)
class Meta: class Meta:
model = Portfolio model = Portfolio

@ -5,10 +5,10 @@
{% block head_css %} {% block head_css %}
<style> <style>
.-live-image-upload-multiple-container .-position-relative-parent {position: relative} .-live-image-upload-container .-position-relative-parent {position: relative}
.-live-image-upload-multiple-container .-image-delete, .-live-image-upload-container .-image-delete,
.-live-image-upload-multiple-container .-live-image-delete { .-live-image-upload-container .-live-image-delete {
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
@ -102,11 +102,11 @@
<div class="textAreaBlock2 text-nn box-sizing disTab -live-image-upload-multiple-container"> <div class="textAreaBlock2 text-nn box-sizing disTab -live-image-upload-container">
<p>Фотографии</p> <p>Фотографии</p>
{% for photo in form.photos.field.queryset.all %} {% for photo in form.photos.field.queryset.all %}
<div class="col-lg-3"> <div class="col-lg-3 -image-widget">
<div class="-position-relative-parent" style="display: inline-block"> <div class="-position-relative-parent" style="display: inline-block">
<a href="#" onclick="return false" class="btn close -image-delete">&times;</a> <a href="#" onclick="return false" class="btn close -image-delete">&times;</a>
@ -127,7 +127,7 @@
<img src="<%- image.smallThumbnailUrl %>"> <img src="<%- image.smallThumbnailUrl %>">
</div> </div>
<input type="hidden" name="live_images" value="<%- image.id %>"> <input type="checkbox" name="{{ form.live_images.html_name }}" value="<%- image.id %>" checked style='display: none'>
</div> </div>
<% }) %> <% }) %>
</script> </script>
@ -135,9 +135,9 @@
<div class="-res"></div> <div class="-res"></div>
<div class="col-xs-12"> <div class="col-xs-12">
<input type="file" name="image" multiple class="-live-image-upload" style="display: none"> <input type="file" name="image" multiple class="-live-image-upload-field" style="display: none">
<a href="#" onclick="$(this).closest('.-live-image-upload-multiple-container').find('.-live-image-upload').first().click(); return false" class="btn btn-default add_file_to_port"> <a href="#" onclick="$(this).closest('.-live-image-upload-container').find('.-live-image-upload-field').first().click(); return false" class="btn btn-default add_file_to_port">
Выберите файлы Выберите файлы
</a> </a>
</div> </div>

@ -763,6 +763,36 @@ class ContractorPortfolioUpdateView(BaseMixin, UpdateView):
def get_success_url(self): def get_success_url(self):
return reverse('users:contractor-profile',kwargs={'pk':self.object.user_id}) return reverse('users:contractor-profile',kwargs={'pk':self.object.user_id})
def form_valid(self, form):
portfolio = form.instance
photos = form.cleaned_data['photos']
# # Doesn't work:
#
# portfolio.photos = photos
# portfolio.save()
PortfolioPhoto.objects.filter(portfolio=portfolio).delete()
for photo in photos:
PortfolioPhoto.objects.create(img=photo.img, portfolio=portfolio)
live_images = form.cleaned_data['live_images']
# import code; code.interact(local=dict(globals(), **locals()))
for live_image in live_images:
new_image = ContentFile(live_image.file.read())
# new_image.name = live_image.file.name
PortfolioPhoto.objects.create(img=new_image, portfolio=portfolio)
live_image.file.delete()
live_image.delete()
return super().form_valid(form)
class PortfolioDelete(DeleteView): class PortfolioDelete(DeleteView):

@ -86,7 +86,7 @@
if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/510/work-projects') != 0)) { if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/510/work-projects') != 0)) {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/'; var url = 'ws://' + domain + '/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {

@ -205,8 +205,8 @@
<script type="text/x-template" class="-portfolio-item-templ"> <script type="text/x-template" class="-portfolio-item-templ">
<div class="col-lg-4"> <div class="col-lg-4">
<div class="insetCol box-sizing disTab"> <div class="insetCol box-sizing disTab">
<div class="imgGal" style="background:rgba(0, 0, 0, 0) url('<%- portfolio.photos[0].img %>') no-repeat scroll center center / cover"> <div class="imgGal" style="background:rgba(0, 0, 0, 0) url('<%- portfolio.photos[0] && portfolio.photos[0].img %>') no-repeat scroll center center / cover">
<a class="open-modal-image" href="<%- portfolio.photos[0].img %>"><div class="imgFigure"></div></a> <a class="open-modal-image" href="<%- portfolio.photos[0] && portfolio.photos[0].img %>"><div class="imgFigure"></div></a>
</div> </div>
</div> </div>
@ -285,8 +285,8 @@
<div class="col-lg-4"> <div class="col-lg-4">
<div class="insetCol box-sizing disTab"> <div class="insetCol box-sizing disTab">
<a href="#"> <a href="#">
<div class="imgGal" style="background:rgba(0, 0, 0, 0) url('<%- workSell.photos[0].img %>') no-repeat scroll center center / cover"> <div class="imgGal" style="background:rgba(0, 0, 0, 0) url('<%- workSell.photos[0] && workSell.photos[0].img %>') no-repeat scroll center center / cover">
<a class="open-modal-image" href="<%- workSell.photos[0].img %>"><div class="imgFigure"></div></a> <a class="open-modal-image" href="<%- workSell.photos[0] && workSell.photos[0].img %>"><div class="imgFigure"></div></a>
</div> </div>
</a> </a>

@ -5,9 +5,9 @@
{% block head_css %} {% block head_css %}
<style> <style>
.-live-image-upload-container .-position-relative-parent {position: relative} .-live-image-avatar-upload-container .-position-relative-parent {position: relative}
.-live-image-upload-container .-live-image-delete { .-live-image-avatar-upload-container .-live-image-delete {
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
@ -32,7 +32,7 @@
<div class="projectsBlock disTab"> <div class="projectsBlock disTab">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="col-lg-3 divCol3 -live-image-upload-container"> <div class="col-lg-3 divCol3 -live-image-avatar-upload-container">
<div class="avatar"> <div class="avatar">
<div class="avatarInset -position-relative-parent"> <div class="avatarInset -position-relative-parent">
<a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a> <a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a>

@ -5,9 +5,9 @@
{% block head_css %} {% block head_css %}
<style> <style>
.-live-image-upload-container .-position-relative-parent {position: relative} .-live-image-avatar-upload-container .-position-relative-parent {position: relative}
.-live-image-upload-container .-live-image-delete { .-live-image-avatar-upload-container .-live-image-delete {
position: absolute; position: absolute;
top: 0; top: 0;
right: 0; right: 0;
@ -32,7 +32,7 @@
<div class="projectsBlock disTab"> <div class="projectsBlock disTab">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="col-lg-3 divCol3 -live-image-upload-container"> <div class="col-lg-3 divCol3 -live-image-avatar-upload-container">
<div class="avatar"> <div class="avatar">
<div class="avatarInset -position-relative-parent"> <div class="avatarInset -position-relative-parent">
<a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a> <a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a>

Loading…
Cancel
Save