diff --git a/api/urls.py b/api/urls.py index 6fc2a21..e0a3b38 100755 --- a/api/urls.py +++ b/api/urls.py @@ -8,6 +8,7 @@ from .views import ( LocationViewSet, MessageViewSet, NoteViewSet, + OrderViewSet, PortfolioPhotoViewSet, PortfolioViewSet, ProjectViewSet, @@ -17,7 +18,6 @@ from .views import ( StageViewSet, TeamViewSet, UserViewSet, - OrderViewSet, ) @@ -30,10 +30,10 @@ router.register(r'documents', DocumentViewSet) router.register(r'locations', LocationViewSet) router.register(r'message', MessageViewSet) router.register(r'note', NoteViewSet) +router.register(r'orders', OrderViewSet) router.register(r'portfolio-photos', PortfolioPhotoViewSet) router.register(r'portfolios', PortfolioViewSet) router.register(r'projects', ProjectViewSet) -router.register(r'orders', OrderViewSet) router.register(r'realties', RealtyViewSet) router.register(r'reviews', ReviewViewSet) router.register(r'specializations', SpecializationViewSet) diff --git a/api/views.py b/api/views.py index 8e4c5fd..a998e92 100755 --- a/api/views.py +++ b/api/views.py @@ -115,6 +115,7 @@ class OrderViewSet(ModelViewSet): queryset = Order.objects.all() serializer_class = OrderSerializer filter_class = OrderFilterSet + permission_classes = (permissions.IsAuthenticatedOrReadOnly,) class SpecializationViewSet(ModelViewSet): diff --git a/archilance/management/commands/generate_projects.py b/archilance/management/commands/generate_projects.py index 099330c..49daa9b 100644 --- a/archilance/management/commands/generate_projects.py +++ b/archilance/management/commands/generate_projects.py @@ -78,7 +78,7 @@ class Command(BaseCommand): project=project, contractor=_.sample((None, User.contractor_objects.order_by('?').first())), secure=_.sample((True, False)), - status=_.sample((True, False)), + status=_.sample(Order.STATUSES)[0], ) return project diff --git a/archilance/util.py b/archilance/util.py index b919d9f..361b400 100644 --- a/archilance/util.py +++ b/archilance/util.py @@ -1,4 +1,5 @@ from django.core import validators +from django.core.exceptions import ObjectDoesNotExist from django.shortcuts import _get_queryset from django.utils import timezone from pprint import pprint, pformat @@ -54,6 +55,15 @@ def get_or_none(klass, *args, **kwargs): return None +def get_related_or_none(obj, attr): + try: + rel = getattr(obj, attr) + except ObjectDoesNotExist: + rel = None + + return rel + + def get_attr_or_none(klass, *args, attr=None, **kwargs): object = get_or_none(klass, *args, **kwargs) diff --git a/assets/js/chat.js b/assets/js/chat.js index 2b07259..123ec42 100644 --- a/assets/js/chat.js +++ b/assets/js/chat.js @@ -21,7 +21,7 @@ var SocketHandler = function () { inbox = document.getElementById('message-chat-team-space'); } else if (message.answer_type == 'approve_stages') { var resOrderId = message.order_id; - $.jGrowl(message.msg,{ + $.jGrowl(message.msg, { life: 4000 }); setTimeout(function () { @@ -34,12 +34,12 @@ var SocketHandler = function () { var classMessage = 'youChat'; var senderName = 'Вы'; var timeMessage = message.msg_time; - if (message.sender_id != userId){ + if (message.sender_id != userId) { senderName = message.sender_name; classMessage = ''; } - inbox.innerHTML += '
'+ senderName +'
' + timeMessage + '' + senderName + '
' + timeMessage + '' + textMessage + '
' + file.name + '
'; + var document_send = $(htmlImg).appendTo("#document-send-order"); + }); + }, + fail: function (e) { + console.log(e); + }, + progressall: function (e, data) { + var progress = parseInt(data.loaded / data.total * 100, 10); + $('#progress .progress-bar').css( + 'width', + progress + '%' + ); + } + }).prop('disabled', !$.support.fileInput) + .parent().addClass($.support.fileInput ? undefined : 'disabled'); + }); diff --git a/chat/migrations/0007_auto_20160826_1458.py b/chat/migrations/0007_auto_20160826_1458.py new file mode 100644 index 0000000..39e17d8 --- /dev/null +++ b/chat/migrations/0007_auto_20160826_1458.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-26 11:58 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('chat', '0006_message_is_delete'), + ] + + operations = [ + migrations.AlterField( + model_name='documents', + name='recipent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='recipent_documents', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/chat/models.py b/chat/models.py index 04333f5..dd7f79a 100644 --- a/chat/models.py +++ b/chat/models.py @@ -44,7 +44,7 @@ class Documents(models.Model): order = models.ForeignKey(Order, related_name='documents', null=True, blank=True) team = models.ForeignKey(Team, related_name='documents', null=True, blank=True) sender = models.ForeignKey(User, related_name='sender_documents') - recipent = models.ForeignKey(User, related_name='recipent_documents') + recipent = models.ForeignKey(User, related_name='recipent_documents', null=True, blank=True) def __str__(self): return self.file.url diff --git a/chat/response.py b/chat/response.py new file mode 100644 index 0000000..e5e26f0 --- /dev/null +++ b/chat/response.py @@ -0,0 +1,19 @@ +import json +from django.http import HttpResponse + +MIMEANY = '*/*' +MIMEJSON = 'application/json' +MIMETEXT = 'text/plain' + + +def response_mimetype(request): + can_json = MIMEJSON in request.META['HTTP_ACCEPT'] + can_json |= MIMEANY in request.META['HTTP_ACCEPT'] + return MIMEJSON if can_json else MIMETEXT + + +class JSONResponse(HttpResponse): + def __init__(self, obj='', json_opts=None, mimetype=MIMEJSON, *args, **kwargs): + json_opts = json_opts if isinstance(json_opts, dict) else {} + content = json.dumps(obj, **json_opts) + super().__init__(content, mimetype, *args, **kwargs) diff --git a/chat/templates/arbitration_modal.html b/chat/templates/arbitration_modal.html new file mode 100644 index 0000000..af778e9 --- /dev/null +++ b/chat/templates/arbitration_modal.html @@ -0,0 +1,33 @@ +