remotes/origin/PR-39
ArturBaybulatov 9 years ago
parent c9a83c0b05
commit 65771dae39
  1. 53
      assets/index.js
  2. 11
      common/admin.py
  3. 9
      common/mixins.py
  4. 3
      common/models.py
  5. 129
      common/views.py
  6. 15
      users/forms.py
  7. 39
      users/templates/user_financial_info_edit.html
  8. 58
      users/templates/user_profile_edit.html
  9. 28
      users/views.py

@ -416,6 +416,59 @@ function loadAllPhotos(portfIds) {
// Live image upload ---------------------------------------
var $liveImageUploadContainer = $('.-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 stubImageUrl = $liveImageUploadContainer.data('stubImageUrl')
$liveImageUpload.fileupload({
dataType: 'json',
done: function($evt, data) {
var image = data.result.files[0]
$avatarImage.attr('src', image.thumbnailUrl)
$liveImageId.val(image.id)
$liveImageDelete.data('url', image.deleteUrl)
$liveImageDelete.css('display', 'block')
}
})
$liveImageDelete.on('click', function($evt) {
var $that = $(this)
$.post($that.data('url')).then(function(res) {
if (res.status == 'success') {
$avatarImage.attr('src', stubImageUrl)
$liveImageId.val('')
$that.css('display', 'none')
}
})
})
// Helpers ---------------------------------------------

@ -3,7 +3,15 @@ from django.contrib import admin
from mptt.admin import MPTTModelAdmin
import pydash as _; _.map = _.map_; _.filter = _.filter_
from .models import Location, MainPage, Settings, PrintOrder, PrintDocuments, Tooltip
from .models import (
LiveImageUpload,
Location,
MainPage,
PrintDocuments,
PrintOrder,
Settings,
Tooltip,
)
class LocationAdmin(MPTTModelAdmin):
@ -59,6 +67,7 @@ class TooltipAdmin(admin.ModelAdmin):
form = TooltipAdminForm
admin.site.register(LiveImageUpload)
admin.site.register(Location, LocationAdmin)
admin.site.register(MainPage, MainPageAdmin)
admin.site.register(PrintDocuments)

@ -0,0 +1,9 @@
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View
class NoCsrfMixin(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)

@ -112,7 +112,8 @@ class LiveImageUpload(models.Model):
created_at = models.DateTimeField(default=timezone.now)
class Meta:
verbose_name = 'LiveImageUpload'
verbose_name = 'Живая загрузка изображений'
verbose_name_plural = 'Живая загрузка изображений'
def __str__(self):
return self.file.url

@ -1,12 +1,12 @@
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import Group
from django.core.exceptions import PermissionDenied
from django.core.mail import send_mail, EmailMultiAlternatives
from django.core.urlresolvers import reverse, reverse_lazy
from django.http import JsonResponse
from django.shortcuts import render, redirect
from django.template.loader import get_template, render_to_string
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View, DetailView
from registration.backends.default.views import RegistrationView
import json
@ -16,6 +16,7 @@ from .forms import PrintOrderForm, CustomRegistrationForm
from .models import PrintDocuments, PrintOrder, Settings, LiveImageUpload
from archilance import util
from archilance.mixins import BaseMixin
from common.mixins import NoCsrfMixin
from users.models import ContractorResume
@ -81,100 +82,36 @@ class PrintDocumentCreate(BaseMixin, View):
class LiveImageUploadCreateView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
# try: data = json.loads(request.body.decode('utf-8'))
# except: data = {}
#
# crop = data.get('crop')
# image_id = data.get('imageId')
#
# if crop and image_id:
# old_pic = util.get_or_none(models.TmpAdvertPicture, pk=image_id)
#
# if old_pic:
# try: img = pil.Image.open(old_pic.file)
# except IOError: return http.JsonResponse({'files': [{'error': "Couldn't open an image"}]})
#
# format = img.format
#
# # exif = img._getexif()
# #
# # if exif:
# # orientation_exif_tag = 274
# # rotated_img = img.rotate({3: 180, 6: 270, 8: 90}[exif[orientation_exif_tag]])
#
# rotation = -crop.get('rotate')
#
# if rotation:
# img = img.rotate(rotation, expand=True)
#
# x, y = crop.get('x'), crop.get('y')
# x2, y2 = x + crop.get('width'), y + crop.get('height')
#
# cropped_img = img.crop((x, y, x2, y2)) # Left, upper, right, lower
#
# with io.BytesIO() as f:
# cropped_img.save(f, format=format)
# pic = models.TmpAdvertPicture.objects.create()
# pic.file.save(old_pic.file.name, ContentFile(f.getvalue()))
# pic.save()
#
# old_pic.file.delete()
# old_pic.delete()
# else:
# return http.JsonResponse({'files': [{'error': 'No image found'}]})
# else:
# image = request.FILES.get('_images')
#
# if image:
# pic = models.TmpAdvertPicture.objects.create(file=image)
# else:
# return http.JsonResponse({'files': [{'error': 'No image provided'}]})
#------------------------------------------------
print('###########################################')
print('Uploading a file...')
print('###########################################')
image = request.FILES.get('image')
if image:
img = LiveImageUpload.objects.create(file=image)
else:
return JsonResponse({'files': [{'error': 'No image provided'}]})
return JsonResponse({'files': [{
'id': img.pk,
'name': img.file.name,
'size': img.file.size,
'url': img.file.url,
'thumbnailUrl': img.file.url,
'deleteUrl': reverse('common:live-image-upload-delete', kwargs={'pk': img.pk}),
'deleteType': 'POST',
}]})
class LiveImageUploadDeleteView(View):
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
img = util.get_or_none(LiveImageUpload, pk=kwargs.get('pk'))
if img:
img.file.delete()
img.delete()
return JsonResponse({'success': True})
else:
return JsonResponse({'success': False})
class LiveImageUploadCreateView(NoCsrfMixin, LoginRequiredMixin, View):
def post(self, request, *args, **kwargs):
image = request.FILES.get('image')
if not image:
return JsonResponse({'files': [{'error': 'No image provided'}]})
live_img = LiveImageUpload.objects.create(file=image)
return JsonResponse({'files': [{
'id': live_img.pk,
'name': live_img.file.name,
'size': live_img.file.size,
'url': live_img.file.url,
'thumbnailUrl': live_img.file.url,
'deleteUrl': reverse('common:live-image-upload-delete', kwargs={'pk': live_img.pk}),
'deleteType': 'POST',
}]})
class LiveImageUploadDeleteView(NoCsrfMixin, LoginRequiredMixin, View):
def post(self, request, *args, **kwargs):
live_img = util.get_or_none(LiveImageUpload, pk=kwargs.get('pk'))
if live_img:
live_img.file.delete()
live_img.delete()
return JsonResponse({'status': 'success'})
else:
return JsonResponse({'status': 'failure'})
class CustomRegistrationView(RegistrationView):

@ -3,7 +3,7 @@ import itertools
import pydash as _; _.map = _.map_; _.filter = _.filter_
from .models import User, UserFinancialInfo, Team, ContractorResume, ContractorResumeFiles, GENDERS
from common.models import Location
from common.models import Location, LiveImageUpload
from projects.models import Project, Realty, BuildingClassfication, ConstructionType
from specializations.models import Specialization
@ -36,7 +36,6 @@ class ContractorResumeFilesForm(forms.ModelForm):
)
class UserProfileEditForm(forms.ModelForm):
gender = forms.ChoiceField(
choices=GENDERS,
@ -44,11 +43,15 @@ class UserProfileEditForm(forms.ModelForm):
required=False,
)
live_image = forms.ModelChoiceField(
queryset=LiveImageUpload.objects.all(),
required=False,
)
class Meta:
model = User
fields = (
# 'avatar', #...........................
'contractor_specializations',
'cro',
'date_of_birth',
@ -73,11 +76,15 @@ class UserProfileEditForm(forms.ModelForm):
class UserProfileBasicInfoEditForm(forms.ModelForm):
live_image = forms.ModelChoiceField(
queryset=LiveImageUpload.objects.all(),
required=False,
)
class Meta:
model = User
fields = (
'avatar',
'contractor_specializations',
'first_name',
'last_name',

@ -3,6 +3,19 @@
{% load thumbnail %}
{% block head_css %}
<style>
.-live-image-delete-parent {position: relative}
.-live-image-delete {
position: absolute;
top: 0;
right: 0;
background-color: white;
}
</style>
{% endblock %}
{% block content %}
{% include 'partials/header.html' %}
@ -19,25 +32,34 @@
<div class="projectsBlock disTab">
<div class="col-lg-12">
<div class="col-lg-3 divCol3">
<div class="col-lg-3 divCol3 -live-image-upload-container" data-stub-image-url="{% static 'img/profile.jpg' %}">
<div class="avatar">
<div class="avatarInset">
{% if form.avatar.value %}
{% thumbnail form.avatar.value "235x224" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
<div class="avatarInset -live-image-delete-parent">
<a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a>
{% if request.user.avatar %}
{% thumbnail request.user.avatar "235x224" crop="center" as avatar %}
<img src="{{ avatar.url }}" alt="profile-image" class="-avatar-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
<img src="{% static 'img/profile.jpg' %}" alt="profile-image" class="-avatar-image">
{% endif %}
</div>
</div>
<div class="menuUser upload-img disTab">
<div class="upload2 up-l1">
<input type="file" name="{{ form.avatar.html_name }}">
<input type="file" name="image" data-url="{% url 'common:live-image-upload-create' %}" class="-live-image-upload">
<p>Загрузить фотографию</p>
</div>
</div>
<div {% if not TESTING %}style="display: none"{% endif %}>
<input type="text" name="live_image" class="-live-image-id">
</div>
</div>
<div class="col-lg-9 divCol9">
<div class="col-lg-4">
<p class="name-edit-p">ФИО</p>
@ -52,7 +74,7 @@
<p class="name-edit-p">Специализации</p>
<div id="simpleSpecContainer">
<div class="i polsF1 pols-edit disTab -simple-spec-widget" style="display: none">
<div class="polsF1 pols-edit disTab -simple-spec-widget" style="display: none">
<input type="hidden" class="-simple-spec-select" style="width: 100%">
<input type="hidden" class="-chosen-simple-spec-id" name="{{ form.contractor_specializations.html_name }}">
</div>
@ -230,4 +252,3 @@
</div>
</div>
{% endblock %}

@ -3,6 +3,19 @@
{% load thumbnail %}
{% block head_css %}
<style>
.-live-image-delete-parent {position: relative}
.-live-image-delete {
position: absolute;
top: 0;
right: 0;
background-color: white;
}
</style>
{% endblock %}
{% block content %}
{% include 'partials/header.html' %}
@ -19,9 +32,11 @@
<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-upload-container" data-stub-image-url="{% static 'img/profile.jpg' %}">
<div class="avatar">
<div class="avatarInset">
<div class="avatarInset -live-image-delete-parent">
<a href="#" onclick="return false" class="btn close -live-image-delete" style="display: none">&times;</a>
{% if request.user.avatar %}
{% thumbnail request.user.avatar "235x224" crop="center" as avatar %}
<img src="{{ avatar.url }}" alt="profile-image" class="-avatar-image">
@ -32,18 +47,19 @@
</div>
</div>
{# <div class="menuUser upload-img disTab">#}
{# <div class="upload2 up-l1">#}
{# <input type="file" name="image" data-url="{% url 'common:live-image-upload-create' %}" class="-live-image-upload">#}
{# #}
{# <p>Загрузить фотографию</p>#}
{# </div>#}
{# </div>#}
{# #}
{# <div s--tyle="display: none">#}
{# <input type="text" value="{{ form.live_images.value }}" name="{{ form.live_images.html_name }}" class="-live-image-id">#}
{# </div>#}
<div class="menuUser upload-img disTab">
<div class="upload2 up-l1">
<input type="file" name="image" data-url="{% url 'common:live-image-upload-create' %}" class="-live-image-upload">
<p>Загрузить фотографию</p>
</div>
</div>
<div {% if not TESTING %}style="display: none"{% endif %}>
<input type="text" name="live_image" class="-live-image-id">
</div>
</div>
<div class="col-lg-9 divCol9">
<div class="col-lg-4">
<p class="name-edit-p">ФИО</p>
@ -171,19 +187,3 @@
</div>
</div>
{% endblock %}
{% block js_block %}
<script>
{# $('.-live-image-upload').first().fileupload({#}
{# dataType: 'json',#}
{# #}
{# done: function($evt, data) {#}
{# console.log('###################################')#}
{# console.log('Uploading a file...')#}
{# console.log('###################################')#}
{# #}
{# $('.-avatar-image').attr('src', data.result.files[0].thumbnailUrl)#}
{# }#}
{# })#}
</script>
{% endblock %}

@ -61,10 +61,22 @@ class UserProfileEditView(BaseMixin, View):
specs = request.POST.getlist('contractor_specializations')
request.POST.setlist('contractor_specializations', _.compact(specs)) # Ignore empty input values
form = self.form_class(request.POST, request.FILES, request=request, instance=request.user)
form = self.form_class(request.POST, request=request, instance=request.user)
if form.is_valid():
form.save()
user = form.save()
live_image = form.cleaned_data.get('live_image')
if live_image:
new_image = ContentFile(live_image.file.read())
new_image.name = live_image.file.name
user.avatar = new_image
user.save()
live_image.file.delete()
live_image.delete()
messages.info(request, 'Пользователь успешно отредактирован')
redirect_to = request.POST.get('next')
@ -117,7 +129,19 @@ class UserFinancialInfoEditView(BaseMixin, View):
user = form.save()
fin_info = fin_info_form.save()
live_image = form.cleaned_data.get('live_image')
if live_image:
new_image = ContentFile(live_image.file.read())
new_image.name = live_image.file.name
user.avatar = new_image
live_image.file.delete()
live_image.delete()
user.financial_info = fin_info
user.save()
messages.info(request, 'Финансовая информация успешно отредактирована')

Loading…
Cancel
Save