remotes/origin/PR-39
ArturBaybulatov 9 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() {
var $liveImageUploadContainer = $('.-live-image-upload-container').first()
var $container = $('.-live-image-upload-container').first()
var $avatarImage = $liveImageUploadContainer.find('.-avatar-image').first()
var $liveImageUpload = $liveImageUploadContainer.find('.-live-image-upload').first()
var $liveImageId = $liveImageUploadContainer.find('.-live-image-id').first()
var $liveImageDelete = $liveImageUploadContainer.find('.-live-image-delete').first()
var $liveImageUploadField = $container.find('.-live-image-upload-field').first()
var liveImageDeleteClass = '.-live-image-delete'
var $imageDeleteBtns = $('.-image-delete')
$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,
dataType: 'json',
done: function($evt, data) {
var image = data.result
$avatarImage.attr('src', image.thumbnailUrl)
$liveImageId.val(image.id)
$liveImageDelete.data('url', image.deleteUrl)
$liveImageDelete.css('display', 'block')
images.push(image)
render()
}
})
$liveImageDelete.on('click', function($evt) {
$container.on('click', liveImageDeleteClass, function($evt) {
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') {
$avatarImage.attr('src', $avatarImage.attr('orig-src') || STUB_IMAGE_URL)
$liveImageId.val('')
$that.css('display', 'none')
remove(images, image)
render()
}
})
})
$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() {
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 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())
var $res = $container.find('.-res').first()
var images = []
render()
$avatarImage.attr('orig-src', $avatarImage.attr('src'))
$liveImageUpload.fileupload({
url: LIVE_IMAGE_UPLOAD_URL,
@ -584,29 +590,26 @@ function loadAllPhotos(portfIds) {
done: function($evt, data) {
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 image = _.find({id: $that.data('imageId')}, images)
$.post(image.deleteUrl).then(function(res) {
$.post($that.data('url')).then(function(res) {
if (res.status == 'success') {
remove(images, image)
render()
$avatarImage.attr('src', $avatarImage.attr('orig-src') || STUB_IMAGE_URL)
$liveImageId.val('')
$that.css('display', 'none')
}
})
})
// Utils --------------------------------
function render() {
$res.html(templ({images: images}))
}
}())

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

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

@ -5,10 +5,10 @@
{% block head_css %}
<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-multiple-container .-live-image-delete {
.-live-image-upload-container .-image-delete,
.-live-image-upload-container .-live-image-delete {
position: absolute;
top: 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>
{% 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">
<a href="#" onclick="return false" class="btn close -image-delete">&times;</a>
@ -127,7 +127,7 @@
<img src="<%- image.smallThumbnailUrl %>">
</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>
<% }) %>
</script>
@ -135,9 +135,9 @@
<div class="-res"></div>
<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>
</div>

@ -763,6 +763,36 @@ class ContractorPortfolioUpdateView(BaseMixin, UpdateView):
def get_success_url(self):
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):

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

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

@ -5,9 +5,9 @@
{% block head_css %}
<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;
top: 0;
right: 0;
@ -32,7 +32,7 @@
<div class="projectsBlock disTab">
<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="avatarInset -position-relative-parent">
<a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a>

@ -5,9 +5,9 @@
{% block head_css %}
<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;
top: 0;
right: 0;
@ -32,7 +32,7 @@
<div class="projectsBlock disTab">
<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="avatarInset -position-relative-parent">
<a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a>

Loading…
Cancel
Save