diff --git a/api/urls.py b/api/urls.py index 9b19b2c..6fc2a21 100755 --- a/api/urls.py +++ b/api/urls.py @@ -17,6 +17,7 @@ from .views import ( StageViewSet, TeamViewSet, UserViewSet, + OrderViewSet, ) @@ -32,6 +33,7 @@ router.register(r'note', NoteViewSet) 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 5c9909c..8e4c5fd 100755 --- a/api/views.py +++ b/api/views.py @@ -2,9 +2,12 @@ from django.db.models import Q from rest_framework.viewsets import ModelViewSet from rest_framework import permissions -from projects.models import Project, Realty, Stage, Portfolio, PortfolioPhoto, Answer, AnswerFile -from projects.serializers import ProjectSerializer, RealtySerializer, StageSerializer, PortfolioSerializer, PortfolioPhotoSerializer, AnswerSerializer, AnswerFileSerializer -from projects.filters import ProjectFilterSet, RealtyFilterSet, StageFilterSet, PortfolioFilterSet, PortfolioPhotoFilterSet +from projects.models import Project, Realty, Stage, Portfolio, PortfolioPhoto, Answer, AnswerFile, Order +from projects.serializers import (ProjectSerializer, RealtySerializer, StageSerializer, + PortfolioSerializer, PortfolioPhotoSerializer, AnswerSerializer, + OrderSerializer, AnswerFileSerializer,) +from projects.filters import (ProjectFilterSet, RealtyFilterSet, StageFilterSet, PortfolioFilterSet, + OrderFilterSet, PortfolioPhotoFilterSet,) from specializations.models import Specialization from specializations.serializers import SpecializationSerializer @@ -108,6 +111,12 @@ class RealtyViewSet(ModelViewSet): filter_class = RealtyFilterSet +class OrderViewSet(ModelViewSet): + queryset = Order.objects.all() + serializer_class = OrderSerializer + filter_class = OrderFilterSet + + class SpecializationViewSet(ModelViewSet): try: # TODO: dirty queryset = Specialization.objects.root_nodes()[0].get_descendants() diff --git a/assets/js/chat.js b/assets/js/chat.js index d8e0883..647b0aa 100644 --- a/assets/js/chat.js +++ b/assets/js/chat.js @@ -1,6 +1,6 @@ var SocketHandler = function () { domain = domain.replace(':' + port, ''); - var url = 'ws://' + domain + '/chat/' + userId + '/'; + var url = 'ws://' + domain + ':8888/chat/' + userId + '/'; var sock = new WebSocket(url); var intervalId; sock.onopen = function () { @@ -20,6 +20,11 @@ var SocketHandler = function () { } else if (message.answer_type == 'add_message_team') { inbox = document.getElementById('message-chat-team-space'); } else if (message.answer_type == 'approve_stages') { + var resOrderId = message.order_id; + $.jGrowl(message.msg,{life: 2000}); + setTimeout(function () { + $("#orderBlock" + resOrderId).trigger('click'); + }, 2000); console.log('approve stages'); } if (inbox) { diff --git a/chat/chat.py b/chat/chat.py index 84897e0..53fc19c 100644 --- a/chat/chat.py +++ b/chat/chat.py @@ -43,14 +43,14 @@ class ChatHandler(websocket.WebSocketHandler): @gen.coroutine def approve_stages(self, data): - print(data) sender_id = data['data']['sender_id'] recipent_id = data['data']['recipent_id'] order_id = data['data'].get('order_id') + message = data['data'].get('msg', 'Этапы обновлены') answer_type = data['format_type'] waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id) for waiter in waiters: - waiter.write_message({'msg': 'Этапы обновлены', 'answer_type': answer_type}) + waiter.write_message({'msg': message, 'order_id': order_id, 'answer_type': answer_type}) @gen.coroutine def add_message(self, message_data): diff --git a/chat/templates/chat_contractor.html b/chat/templates/chat_contractor.html index 2d62b6f..e288b81 100644 --- a/chat/templates/chat_contractor.html +++ b/chat/templates/chat_contractor.html @@ -108,7 +108,7 @@
Заказы
{% for order in orders %}{{ order }}
1 / Согласование условий
- Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем. + Обсуджение задания и условий выполнения работы. + Подтверждение заказа исполнителем.
Этап ' + v.pos + '' + v.name + '
' + 'Результаты этапа:' + v.result + '
' + v.term + '
' + v.cost + 'В работе '+ stage.name +'
' + 'Результат этапа : '+ stage.result +'
' + - 'Срок сдачи 25.08.2016 ' + stage.cost + 'р.
' + - 'Завершить этап' + - 'Обратитьсяв арбитраж'; + 'Срок сдачи '+ stage.term +' ' + stage.cost + 'р.
'; + + if(!stage.close_contractor){ + stageWork += 'Завершить этап'; + }else{ + stageWork += 'Этап ожидает завершения статуса от заказчика
'; + } + stageWork += 'Обратитьсяв арбитраж'; $("#stagesWork").html(stageWork); - }else{ + }else{ $("#completeWork").hide(); - } - } }); + }); + //Добавить заметку. $('#add-note-button').on('click', function (e) { e.preventDefault(); $.ajax({ @@ -525,6 +562,7 @@ $('#tab2').on('click','.closeStage', function(e){ e.preventDefault(); var stageId = $(this).attr('data-stage-id'); + var _this = $(this); $.ajax({ url: '/api/stages/' + stageId + '/', type: 'PATCH', @@ -534,7 +572,17 @@ data: "close_contractor=True", dataType: 'json', success: function (json) { - alert(json); + + socket.send_stages_approve({ + "format_type": "approve_stages", + "data": { + "sender_id": _this.attr('data-sender-id'), + "recipent_id": _this.attr('data-recipent-id'), + "order_id": _this.attr('data-order-id'), + "msg": "Исполнитель завершил этап " + json.name, + } + }); + console.log(json); }, error: function (e) { diff --git a/chat/templates/chat_customer.html b/chat/templates/chat_customer.html index d9068f3..460d3c5 100644 --- a/chat/templates/chat_customer.html +++ b/chat/templates/chat_customer.html @@ -288,23 +288,22 @@ //Получить заказы function getStages(orderId, senderId, recipentId, secureOrder) { - $.ajax({ - url: '/api/stages/', - type: 'GET', - data: {csrfmiddlewaretoken: csrftoken, 'order': orderId}, - dataType: 'json', - success: function (json) { - var stageCount = json.results.length; + url:'/api/orders/' + orderId + '/', + type: 'GET', + data:{csrfmiddlewaretoken: csrftoken}, + dataType: 'json', + + }).then(function(data){ + var stagesResults = data.stages; + var stageCount = stagesResults.length; if (stageCount == 0) { $("#reserveSpace").hide(); stageCountVal = 1; } else { stageCountVal = stageCount; } - var htmlInbox = ""; - var htmlInboxStage = 'Какое кол-во этапов подразумевает работа? ' + '
'; @@ -320,13 +319,19 @@ 'Этап
В работе '+ stage.name +'
' + 'Результат этапа : '+ stage.result +'
' + 'Срок сдачи 25.08.2016 ' + stage.cost + 'р.
'; if (stage.close_contractor){ - stageWork += 'Закрыть этап '+ stage.pos +''; + stageWork += 'Закрыть этап '+ stage.pos +''; } $("#stagesWork").html(stageWork); - }else{ - $("#completeWork").hide(); } - } }); } @@ -389,6 +392,7 @@ $('#tab2').on('click','.closeStage', function(e){ e.preventDefault(); var stageId = $(this).attr('data-stage-id'); + var _this = $(this); $.ajax({ url: '/api/stages/' + stageId + '/', type: 'PATCH', @@ -398,6 +402,15 @@ data: {close_customer: true, status: 'completed'}, dataType: 'json', success: function (json) { + socket.send_stages_approve({ + "format_type": "approve_stages", + "data": { + "sender_id": _this.attr('data-sender-id'), + "recipent_id": _this.attr('data-recipent-id'), + "order_id": _this.attr('data-order-id'), + "msg": "Заказчик закрыл этап " + json.name, + } + }); console.log(json); }, error: function (e) { @@ -462,11 +475,14 @@ "sender_id": userId, "recipent_id": currentRecipentId, "order_id": currentOrderId, + "msg": "Этапы для заказа "+ currentOrderId +"изменены", } }); - setTimeout(function () { - getStages(currentOrderId,userId,currentRecipentId,secureOrder); - }, 1000); + +{# setTimeout(function () {#} +{# getStages(currentOrderId,userId,currentRecipentId,secureOrder);#} +{##} +{# }, 1000);#} }); @@ -474,33 +490,38 @@ $('#order-stages-tab').on('change', '#countStage', function () { var countStage = parseInt($(this).val()); var currentCountStage = $(".numberStepp").length; - - if (countStage > currentCountStage){ - for(var jj=currentCountStage; jj