remotes/origin/PR-39
ArturBaybulatov 9 years ago
parent 8d3e19ed20
commit c9a83c0b05
  1. 15
      archilance/settings/base.py
  2. 4
      archilance/urls.py
  3. 11
      archilance/util.py
  4. 25
      common/forms.py
  5. 27
      common/migrations/0013_liveimageupload.py
  6. 11
      common/models.py
  7. 5
      common/urls.py
  8. 153
      common/views.py
  9. 5
      projects/models.py
  10. 2
      templates/partials/base.html
  11. 37
      templates/registration/registration_form.html
  12. 2
      users/forms.py
  13. 25
      users/signals.py
  14. 41
      users/templates/user_profile_edit.html

@ -1,4 +1,3 @@
from django.core.files.storage import FileSystemStorage
import os import os
@ -318,16 +317,4 @@ else:
WAGTAIL_SITE_NAME = 'PROEKTON' WAGTAIL_SITE_NAME = 'PROEKTON'
REGISTRATION_FORM = 'registration.forms.RegistrationFormTermsOfService' DEFAULT_FILE_STORAGE = 'archilance.util.ASCIIFileSystemStorage'
# class ASCIIFileSystemStorage(FileSystemStorage):
# def get_valid_name(self, name):
# symbols = (u"абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
# u"abvgdeejzijklmnoprstufhzcss_y_euaABVGDEEJZIJKLMNOPRSTUFHZCSS_Y_EUA")
#
# tr = {ord(a):ord(b) for a, b in zip(*symbols)}
# name = name.translate(tr)
# return super().get_valid_name(name)
#
# DEFAULT_FILE_STORAGE = ASCIIFileSystemStorage

@ -6,6 +6,7 @@ from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.generic import TemplateView from django.views.generic import TemplateView
from .views import HomeTemplateView, TestChatTemplateView, TestView from .views import HomeTemplateView, TestChatTemplateView, TestView
from common.views import CustomRegistrationView
from wallets.views import TmpCheckOrderView, TmpPaymentAvisoView from wallets.views import TmpCheckOrderView, TmpPaymentAvisoView
from wagtail.wagtailadmin import urls as wagtailadmin_urls from wagtail.wagtailadmin import urls as wagtailadmin_urls
@ -26,7 +27,10 @@ urlpatterns = [
url(r'^users/', include('users.urls')), url(r'^users/', include('users.urls')),
url(r'^common/', include('common.urls')), url(r'^common/', include('common.urls')),
url(r'^password/', include('password_reset.urls')), url(r'^password/', include('password_reset.urls')),
url(r'^users/register/$', CustomRegistrationView.as_view(), name='registration_register'),
url(r'^users/', include('registration.backends.default.urls')), url(r'^users/', include('registration.backends.default.urls')),
url(r'^admin/', admin.site.urls), url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')), url(r'^api/', include('api.urls')),
url(r'^cms/', include(wagtailadmin_urls)), url(r'^cms/', include(wagtailadmin_urls)),

@ -1,5 +1,6 @@
from django.core import validators from django.core import validators
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.files.storage import FileSystemStorage
from django.shortcuts import _get_queryset from django.shortcuts import _get_queryset
from django.utils import timezone from django.utils import timezone
from pprint import pprint, pformat from pprint import pprint, pformat
@ -151,3 +152,13 @@ def morph(number, words):
# #
# for i in range(0, 30): # for i in range(0, 30):
# print(i, morph(i, words)) # print(i, morph(i, words))
class ASCIIFileSystemStorage(FileSystemStorage):
def get_valid_name(self, name):
symbols = (u"абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
u"abvgdeejzijklmnoprstufhzcss_y_euaABVGDEEJZIJKLMNOPRSTUFHZCSS_Y_EUA")
tr = {ord(a):ord(b) for a, b in zip(*symbols)}
name = name.translate(tr)
return super().get_valid_name(name)

@ -1,4 +1,7 @@
from django import forms from django import forms
from registration.forms import RegistrationFormTermsOfService
import pydash as _; _.map = _.map_; _.filter = _.filter_
from .models import PrintOrder, PrintDocuments from .models import PrintOrder, PrintDocuments
@ -26,3 +29,25 @@ class PrintOrderForm(forms.ModelForm):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if self.instance.pk: if self.instance.pk:
self.fields['files'].queryset = self.instance.files self.fields['files'].queryset = self.instance.files
class CustomRegistrationForm(RegistrationFormTermsOfService):
USER_TYPES = (
('', 'Выберите роль'),
('customer', 'Заказчик'),
('contractor', 'Исполнитель'),
)
user_type = forms.ChoiceField(choices=USER_TYPES)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
if self.request.GET.get('type') == 'customer':
self.fields['user_type'].initial = 'customer'
elif self.request.GET.get('type') == 'contractor':
self.fields['user_type'].initial = 'contractor'
attrs = self.fields['user_type'].widget.attrs
attrs['class'] = _.join(_.compact((attrs.get('class'), 'selectpicker3')), ' ')

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-05 11:55
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('common', '0012_auto_20160901_2007'),
]
operations = [
migrations.CreateModel(
name='LiveImageUpload',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('file', models.ImageField(upload_to='live-image-upload/')),
('created_at', models.DateTimeField(default=django.utils.timezone.now)),
],
options={
'verbose_name': 'LiveImageUpload',
},
),
]

@ -105,3 +105,14 @@ class Tooltip(models.Model):
def __str__(self): def __str__(self):
return self.name return self.name
class LiveImageUpload(models.Model):
file = models.ImageField(upload_to='live-image-upload/')
created_at = models.DateTimeField(default=timezone.now)
class Meta:
verbose_name = 'LiveImageUpload'
def __str__(self):
return self.file.url

@ -3,6 +3,8 @@ from django.conf import urls
from .views import ( from .views import (
PrintDocumentCreate, PrintDocumentCreate,
PrintOrderDetailView, PrintOrderDetailView,
LiveImageUploadCreateView,
LiveImageUploadDeleteView,
) )
app_name = 'common' app_name = 'common'
@ -10,4 +12,7 @@ app_name = 'common'
urlpatterns = [ urlpatterns = [
urls.url(r'^printdocument/create/$', PrintDocumentCreate.as_view(), name='create'), urls.url(r'^printdocument/create/$', PrintDocumentCreate.as_view(), name='create'),
urls.url(r'^printorder/(?P<pk>\d+)/$', PrintOrderDetailView.as_view(), name='print-order-detail'), urls.url(r'^printorder/(?P<pk>\d+)/$', PrintOrderDetailView.as_view(), name='print-order-detail'),
urls.url(r'^live-image-upload/create/$', LiveImageUploadCreateView.as_view(), name='live-image-upload-create'),
urls.url(r'^live-image-upload/(?P<pk>\d+)/delete/$', LiveImageUploadDeleteView.as_view(), name='live-image-upload-delete'),
] ]

@ -1,12 +1,22 @@
from django.shortcuts import render, redirect
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.models import Group
from django.core.mail import send_mail, EmailMultiAlternatives 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.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 django.views.generic import View, DetailView
from archilance.mixins import BaseMixin from registration.backends.default.views import RegistrationView
import json
import jsonschema
from .forms import PrintOrderForm from .forms import PrintOrderForm, CustomRegistrationForm
from .models import PrintDocuments, PrintOrder, Settings from .models import PrintDocuments, PrintOrder, Settings, LiveImageUpload
from archilance import util
from archilance.mixins import BaseMixin
from users.models import ContractorResume
class PrintOrderDetailView(DetailView): class PrintOrderDetailView(DetailView):
@ -68,3 +78,138 @@ class PrintDocumentCreate(BaseMixin, View):
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
context.update({'form': form}) context.update({'form': form})
return render(request, self.template_name, context) return render(request, self.template_name, context)
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 CustomRegistrationView(RegistrationView):
form_class = CustomRegistrationForm
template_name = 'registration/registration_form.html'
success_url = reverse_lazy('registration_complete')
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['request'] = self.request
return kwargs
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.request.GET.get('type') in ('customer', 'contractor'):
context['hide_user_type'] = True
return context
def register(self, form):
user = super().register(form)
if form.cleaned_data.get('customer'):
group = Group.objects.get(name='Заказчики')
elif form.cleaned_data.get('contractor'):
group = Group.objects.get(name='Исполнители')
else:
group = None
if group:
user.groups.add(group)
user.contractor_resume = ContractorResume.objects.create(text='')
user.save()
return user

@ -147,7 +147,10 @@ class Answer(models.Model):
author = GenericForeignKey('content_type', 'object_id') author = GenericForeignKey('content_type', 'object_id')
def get_first_message(self): def get_first_message(self):
return self.messages.first().text message = self.messages.first()
if message:
return message.text
def __str__(self): def __str__(self):
return "{author}'s answer ({id})".format(author=type(self.author).__name__, id=self.pk) return "{author}'s answer ({id})".format(author=type(self.author).__name__, id=self.pk)

@ -93,7 +93,7 @@
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {
console.log("Start connect"); //console.log("Start connect");
intervalId = setInterval(function () { intervalId = setInterval(function () {
sock.send('{"dummy": 1}'); sock.send('{"dummy": 1}');
}, 15000); }, 15000);

@ -8,22 +8,27 @@
</div> </div>
<div class="form-regestration"> <div class="form-regestration">
<form method="post">{% csrf_token %} <form method="post">{% csrf_token %}
{{ form.non_field_errors }} {{ form.non_field_errors }}
<div class="col-lg-12 select-reg polsF1">
{% if request.GET.type == 'customer' %} {% if not hide_user_type %}
<input type="hidden" name="group_id" value="Заказчики"/> <div class="col-lg-12 select-reg polsF1">
{% elif request.GET.type == 'contractor' %} {# {% if request.GET.type == 'customer' %}#}
<input type="hidden" name="group_id" value="Исполнители"/> {# <input type="hidden" name="user_type" value="customer">#}
{% else %} {# {% elif request.GET.type == 'contractor' %}#}
<div class="col-lg-12 select-reg polsF1"> {# <input type="hidden" name="user_type" value="contractor">#}
<select class="selectpicker3" name="group_id"> {# {% else %}#}
<option>Выберете вашу роль </option> {# <select name="{{ form.user_type.html_name }}" class="selectpicker3">#}
<option value="Исполнители">Исполнитель</option> {# {% for val, text in form.user_type.field.choices %}#}
<option value="Заказчики">Заказчик</option> {# <option value="{{ val }}" {% if form.user_type.value == val %}selected{% endif %}>{{ text }}</option>#}
</select> {# {% endfor %}#}
</div> {# </select>#}
{% endif %} {# {% endif %}#}
</div>
{{ form.user_type }}
{{ form.user_type.errors }}
</div>
{% endif %}
<div class="col-lg-12 select-reg"> <div class="col-lg-12 select-reg">
<input type="text" name="{{ form.username.name }}" value="{{ form.username.value }}" class="box-sizing email-reg" <input type="text" name="{{ form.username.name }}" value="{{ form.username.value }}" class="box-sizing email-reg"
placeholder="Nickname"> placeholder="Nickname">

@ -48,7 +48,7 @@ class UserProfileEditForm(forms.ModelForm):
model = User model = User
fields = ( fields = (
'avatar', # 'avatar', #...........................
'contractor_specializations', 'contractor_specializations',
'cro', 'cro',
'date_of_birth', 'date_of_birth',

@ -3,18 +3,13 @@ from django.contrib.auth.models import Group
from registration.signals import user_registered from registration.signals import user_registered
from users.models import ContractorResume from users.models import ContractorResume
@receiver(user_registered) # @receiver(user_registered)
def user_registered_callback(sender, user, request, **kwargs): # def user_registered_callback(sender, user, request, **kwargs):
# import code; code.interact(local=dict(globals(), **locals())) # # import code; code.interact(local=dict(globals(), **locals()))
group_name = request.POST['group_id'] or 'Исполнители' # group_name = request.POST['group_id'] or 'Исполнители'
g = Group.objects.get(name=group_name) # g = Group.objects.get(name=group_name)
g.user_set.add(user) # g.user_set.add(user)
if group_name == 'Исполнители': # if group_name == 'Исполнители':
resume = ContractorResume.objects.create(text='') # resume = ContractorResume.objects.create(text='')
user.contractor_resume = resume # user.contractor_resume = resume
user.save() # user.save()

@ -19,24 +19,30 @@
<div class="projectsBlock disTab"> <div class="projectsBlock disTab">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="col-lg-3 divCol3"> <div class="col-lg-3 divCol3 -live-image-upload-container">
<div class="avatar"> <div class="avatar">
<div class="avatarInset"> <div class="avatarInset">
{% if form.avatar.value %} {% if request.user.avatar %}
{% thumbnail form.avatar.value "235x224" crop="center" as im %} {% thumbnail request.user.avatar "235x224" crop="center" as avatar %}
<img src="{{ im.url }}" alt="profile-image"> <img src="{{ avatar.url }}" alt="profile-image" class="-avatar-image">
{% endthumbnail %} {% endthumbnail %}
{% else %} {% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image"> <img src="{% static 'img/profile.jpg' %}" alt="profile-image" class="-avatar-image">
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class="menuUser upload-img disTab">
<div class="upload2 up-l1"> {# <div class="menuUser upload-img disTab">#}
<input type="file" name="{{ form.avatar.html_name }}" class="-fileupload"> {# <div class="upload2 up-l1">#}
<p>Загрузить фотографию</p> {# <input type="file" name="image" data-url="{% url 'common:live-image-upload-create' %}" class="-live-image-upload">#}
</div> {# #}
</div> {# <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> </div>
<div class="col-lg-9 divCol9"> <div class="col-lg-9 divCol9">
<div class="col-lg-4"> <div class="col-lg-4">
@ -168,12 +174,15 @@
{% block js_block %} {% block js_block %}
<script> <script>
{# $('#fileupload').fileupload({#} {# $('.-live-image-upload').first().fileupload({#}
{# dataType: 'json',#} {# dataType: 'json',#}
{# done: function (e, data) {#} {# #}
{# $.each(data.result.files, function (index, file) {#} {# done: function($evt, data) {#}
{# $('<p/>').text(file.name).appendTo(document.body);#} {# console.log('###################################')#}
{# });#} {# console.log('Uploading a file...')#}
{# console.log('###################################')#}
{# #}
{# $('.-avatar-image').attr('src', data.result.files[0].thumbnailUrl)#}
{# }#} {# }#}
{# })#} {# })#}
</script> </script>

Loading…
Cancel
Save