diff --git a/api/urls.py b/api/urls.py index e8b90c2..79287ed 100755 --- a/api/urls.py +++ b/api/urls.py @@ -30,7 +30,7 @@ router.register(r'contractorresume', ContractorResumeViewSet) router.register(r'contractorresumefiles', ContractorResumeFilesViewSet) router.register(r'documents', DocumentViewSet) router.register(r'locations', LocationViewSet) -router.register(r'message', MessageViewSet) +router.register(r'message', MessageViewSet, base_name='Message') router.register(r'note', NoteViewSet) router.register(r'orders', OrderViewSet) router.register(r'portfolio-photos', PortfolioPhotoViewSet) diff --git a/api/views.py b/api/views.py index a05e91a..27d998f 100755 --- a/api/views.py +++ b/api/views.py @@ -28,7 +28,7 @@ from common.models import Location from common.serializers import LocationSerializer from common.filters import LocationFilterSet -from chat.models import Message, Notes, Documents +from chat.models import Message, Notes, Documents, NewMessage from chat.serializers import MessageSerializer, NoteSerializer, DocumentsSerializer from chat.filters import MessageFilterSet, NoteFilterSet, DocumentFilterSet @@ -112,12 +112,12 @@ class NoteViewSet(ModelViewSet): class MessageViewSet(ModelViewSet): - queryset = Message.objects.all() + # queryset = Message.objects.all() serializer_class = MessageSerializer filter_class = MessageFilterSet def get_queryset(self): - queryset = Message.objects.filter(is_delete=False) + queryset = Message.objects.all() search_param = self.request.query_params.get('operand', None) recipent_id = self.request.query_params.get('recipent_id', None) sender_id = self.request.query_params.get('sender_id', None) @@ -126,7 +126,15 @@ class MessageViewSet(ModelViewSet): if search_param == 'in': queryset = queryset.filter(Q(sender__in=[sender_id,recipent_id]),Q(recipent__in=[sender_id,recipent_id])).\ filter(order__isnull=True).\ - filter(~Q(sender=F('recipent'))).order_by('created') + filter(~Q(sender=F('recipent'))) + + + queryset = queryset.order_by('created') + return queryset + + def filter_queryset(self, queryset): + queryset = super().filter_queryset(queryset) + qs = NewMessage.objects.filter(message__in=queryset, user=self.request.user).delete() return queryset @@ -167,13 +175,12 @@ class LocationViewSet(ModelViewSet): filter_class = LocationFilterSet - - class PortfolioPagination(PageNumberPagination): page_size = settings.API_PAGE_SIZE # Default page size page_size_query_param = 'page_size' # Provide custom page size through a query param max_page_size = 1000 + class PortfolioViewSet(ModelViewSet): queryset = Portfolio.objects.all() serializer_class = PortfolioSerializer @@ -181,7 +188,6 @@ class PortfolioViewSet(ModelViewSet): pagination_class = PortfolioPagination - class PortfolioPhotoViewSet(ModelViewSet): queryset = PortfolioPhoto.objects.all() serializer_class = PortfolioPhotoSerializer diff --git a/archilance/settings/base.py b/archilance/settings/base.py index 86b3daf..42c8493 100644 --- a/archilance/settings/base.py +++ b/archilance/settings/base.py @@ -266,7 +266,7 @@ if DEBUG: EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend' PAGE_SIZE = 10 # Non-api page size (regular views) -API_PAGE_SIZE = 100 # Django REST framework +API_PAGE_SIZE = 1000 # Django REST framework REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ diff --git a/assets/css/jquery.jgrowl.min.css b/assets/css/jquery.jgrowl.min.css new file mode 100644 index 0000000..ea39484 --- /dev/null +++ b/assets/css/jquery.jgrowl.min.css @@ -0,0 +1 @@ +.jGrowl{z-index:9999;color:#fff;font-size:12px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;position:fixed}.jGrowl.top-left{left:0;top:0}.jGrowl.top-right{right:0;top:0}.jGrowl.bottom-left{left:0;bottom:0}.jGrowl.bottom-right{right:0;bottom:0}.jGrowl.center{top:0;width:50%;left:25%}.jGrowl.center .jGrowl-closer,.jGrowl.center .jGrowl-notification{margin-left:auto;margin-right:auto}.jGrowl-notification{background-color:#000;opacity:.9;-ms-filter:alpha(90);filter:alpha(90);zoom:1;width:250px;padding:10px;margin:10px;text-align:left;display:none;border-radius:5px;min-height:40px}.jGrowl-notification .ui-state-highlight,.jGrowl-notification .ui-widget-content .ui-state-highlight,.jGrowl-notification .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}.jGrowl-notification .jGrowl-header{font-weight:700;font-size:.85em}.jGrowl-notification .jGrowl-close{background-color:transparent;color:inherit;border:none;z-index:99;float:right;font-weight:700;font-size:1em;cursor:pointer}.jGrowl-closer{background-color:#000;opacity:.9;-ms-filter:alpha(90);filter:alpha(90);zoom:1;width:250px;padding:10px;margin:10px;display:none;border-radius:5px;padding-top:4px;padding-bottom:4px;cursor:pointer;font-size:.9em;font-weight:700;text-align:center}.jGrowl-closer .ui-state-highlight,.jGrowl-closer .ui-widget-content .ui-state-highlight,.jGrowl-closer .ui-widget-header .ui-state-highlight{border:1px solid #000;background:#000;color:#fff}@media print{.jGrowl{display:none}} \ No newline at end of file diff --git a/assets/css/main.css b/assets/css/main.css index 20dc86f..1302101 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -5983,12 +5983,15 @@ a.linkS2[data-target="#withdraw-money"]{ border-radius: 50px; border: 1px solid #42B476; } + input[type="radio"]{ - opacity: 0; + opacity: 1; } + .wr-inset-pluss{ margin-top: 24px; } + .inset-gp .upload2{ float: left; margin: -15px 15px 0 12px; diff --git a/assets/js/chat.js b/assets/js/chat.js index 2f360c7..5ee15de 100644 --- a/assets/js/chat.js +++ b/assets/js/chat.js @@ -39,8 +39,7 @@ var SocketHandler = function () { }); setTimeout(function () { $("#orderBlock" + resOrderId).trigger('click'); - }, 2000); - console.log('approve stages'); + }, 200); } if (inbox) { @@ -77,8 +76,9 @@ function csrfSafeMethod(method) { var socket = new SocketHandler(); var csrftoken = getCookie('csrftoken'); -$(function () { + +$(function () { function dialog(message, yesCallback, notCallback) { $("#dialog_delete .modal-title").html(message); var dialog = $("#dialog_delete").modal('show'); @@ -93,48 +93,67 @@ $(function () { } var currentHash = URI(location.href).hash(); + + $('a[data-toggle="tab"]').on('show.bs.tab', function (e) { + var activeTab = $(this).attr('href').substring(1); + var liveHash = URI(location.href).hash(); + + switch(activeTab){ + case 'tab1': + setTimeout(function () { + if(liveHash.indexOf("#user") == 0) { + var userHashId = liveHash.replace("#user", ""); + $("#userBlock" + userHashId).trigger('click'); + } else { + $(".user-block").first().trigger('click'); + } + }, 100); + break; + + case 'tab2': + setTimeout(function () { + if(liveHash.indexOf("#order") == 0) { + var ordHashId = liveHash.replace("#order", ""); + $("#orderBlock" + ordHashId).trigger('click'); + } else { + $(".order-block").first().trigger('click'); + } + }, 100); + break; + + case 'tab3': + setTimeout(function () { + if(liveHash.indexOf("#teamorder") == 0) { + var teamHashId = liveHash.replace("#teamorder", ""); + $("#teamOrderBlock" + teamHashId).trigger('click'); + } else if(liveHash.indexOf("#myteam") == 0){ + var teamHashId = liveHash.replace("#myteam", ""); + $("#teamMyBlock" + teamHashId).trigger('click'); + } else { + var firstTeamBlock = $(".team-block").first(); + var firstTeamOrder = $(".team-order-block").first(); + if (firstTeamOrder.length == 1){ + firstTeamOrder.trigger('click'); + } else if(firstTeamBlock.length == 1){ + firstTeamBlock.trigger('click'); + } + } + }, 100); + + } + + }); + if (currentHash.indexOf("#order") == 0) { - var ordHashId = currentHash.replace("#order", ""); - setTimeout(function () { - $("#orderBlock" + ordHashId).trigger('click'); - $("a[href='#tab2']").trigger('click'); - }, 100); + $("a[href='#tab2']").trigger('click'); } else if(currentHash.indexOf("#user") == 0){ - var userHashId = currentHash.replace("#user", ""); - setTimeout(function () { - $("#userBlock" + userHashId).trigger('click'); - //$("a[href='#tab1']").trigger('click'); - }, 100); - } else if (currentHash.indexOf("#teamorder") == 0) { - var teamHashId = currentHash.replace("#teamorder", ""); - $("#teamOrderBlock" + teamHashId).trigger('click'); - $("a[href='#tab3']").trigger('click'); - } else if (currentHash.indexOf("#myteam") == 0){ - var teamHashId = currentHash.replace("#myteam", ""); - $("#teamMyBlock" + teamHashId).trigger('click'); - $("a[href='#tab3']").trigger('click'); - + $("a[href='#tab1']").trigger('click'); + } else if (currentHash.indexOf("#teamorder") == 0 || currentHash.indexOf("#myteam") == 0) { + $("a[href='#tab3']").trigger('click'); } else { - setTimeout(function () { - $(".user-block").first().trigger('click'); - location.hash = ''; - }, 10); - setTimeout(function () { - $(".order-block").first().trigger('click'); - location.hash = ''; - }, 500); - - setTimeout(function () { - var firstTeamBlock = $(".team-block").first(); - var firstTeamOrder = $(".team-order-block").first(); - if (firstTeamOrder.length == 1){ - firstTeamOrder.trigger('click'); - } else if(firstTeamBlock.length == 1){ - firstTeamBlock.trigger('click'); - } - location.hash = ''; - }, 1000); + $("a[href='#tab1']").trigger('click'); } + // Информация о заказе $(".full-order-info").click('on', function (e) { e.preventDefault(); @@ -220,12 +239,26 @@ $(function () { dataType: 'json', success: function (json) { if (json.status == 'ok') { + socket.send_stages_approve({ + "format_type": "approve_stages", + "data": { + "sender_id": json.sender, + "recipent_id": json.recipent, + "order_id": json.order, + "msg": "Заказчик зарезервировал сумму для этапов " + json.stages, + } + }); $("#reserve-stage-modal").modal('hide'); $("#orderBlock" + orderId).trigger('click'); + + }else if(json.status == 'error'){ + alert(json.message_error); } }, error: function (e, jqxhr) { + console.log(e); + console.log(jqxhr); } }) }); @@ -275,54 +308,54 @@ $(function () { docList.innerHTML = ''; $.ajax({ - url: '/api/documents', + url: '/api/message', type: 'GET', data: { csrfmiddlewaretoken: csrftoken, 'operand': 'in', 'sender_id': userId, - 'recipent_id': contactId, - 'is_delete': false, - 'is_send': true, + 'recipent_id': contactId }, dataType: 'json', - success: function (json) { - console.log(json); - $.each(json.results, function (i, v) { - docList.innerHTML += '
' + senderName + '
' + v.created + '' + v.text + '
' + senderName + '
' + v.created + '' + v.text + '
' + statusName + '
Срок сдачи ' + stage.term + ' ' + stage.cost + '
Этап ожидает завершения статуса от заказчика