diff --git a/chat/templates/chat_contractor.html b/chat/templates/chat_contractor.html index 2f27655..679a396 100644 --- a/chat/templates/chat_contractor.html +++ b/chat/templates/chat_contractor.html @@ -164,15 +164,6 @@
- {# {% for msg in chat_messages %}#} - {#
#} - {#
#} - {#

{{ msg.sender.get_full_name }}

#} - {# {{ msg.created }}#} - {#
#} - {#

{{ msg }}

#} - {#
#} - {# {% endfor %}#}
@@ -187,11 +178,21 @@ Не более 10 файлов с общим объемом 500мб
- отправить + отправить
+ +

Этапы работы

+
+

1 / Согласование условий

+

+ Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем. +

+
+
+

Для заметок

@@ -225,52 +226,9 @@
-
- -

- Дизай-проект квартиры на набережной 200 m2 -

-
-

- Заказчик: Группа Икс -

- - - - Полное описание заказа - -
-
-
-
-

- Иванов Петр Иванович -

- - 13.0.2016 / 21:05 - -
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit

-
-
-
-

- Вы -

- - 13.0.2016 / 21:05 - -
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit.

-
@@ -290,34 +248,8 @@ Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем.

-
-
-

- Этап 1Название этапа -

-

- Результаты этапа: Готовый чертеж 1 -

-
-

до 16.03.2015

- 30 000 -
-
-
-
-
-

- Этап 2Название этапа -

-

- Результаты этапа: Готовый чертеж 1 -

-
-

до 16.03.2015

- 30 000 -
-
-
+
+ @@ -368,13 +300,17 @@ }; sock.onmessage = function (event) { console.log(event.data); - alert(event.data); var message = JSON.parse(event.data); - var inbox = document.getElementById('message-chat-space'); + var inbox; + + if (message.answer_type == 'contact') { + inbox = document.getElementById('message-chat-space'); + } else if (message.answer_type == 'order' || message.answer_type == 'add_order') { + inbox = document.getElementById('message-chat-order-space'); + } inbox.innerHTML += '
' + - '

Иванов

13.0.2016
' + + '

ВЫ

13.0.2016
' + '

' + message.msg + '

'; - }; this.send_contact_message = function (userId) { @@ -419,11 +355,10 @@ var orderId = $(this).attr('data-id'); var recipentId = $(this).attr('data-recipent-id'); $("#chat-contractor-order #orderId").val(orderId); - $("#chat-contractor-order #recipentId").val(recipentId); + $("#chat-contractor-order #recipentOrderId").val(recipentId); var inbox = document.getElementById('message-chat-order-space'); inbox.innerHTML = ''; - $.ajax({ url: '/api/message', type: 'GET', @@ -434,7 +369,7 @@ var senderName = 'Вы'; var className = 'youChat'; - if (v.sender.id == currentChatUser) { + if (v.sender.id !== currentChatUser) { senderName = v.sender.username; className = ''; } @@ -445,6 +380,25 @@ } }); + + $.ajax({ + url: '/api/stages/', + type: 'GET', + data: {csrfmiddlewaretoken: csrftoken, 'order': orderId}, + dataType: 'json', + success: function (json) { + console.log(json.results); + var htmlInbox = ""; + $.each(json.results, function (i, v) { + htmlInbox += '
' + + '

Этап '+ v.pos +''+ v.name +'

' + + '

Результаты этапа:'+ v.result+'

' + + '

до 16.03.2015

'+ v.cost +'
'; + }); + $("#order-stages").html(htmlInbox); + } + }); + }); // Вытащить сообщения для конактов @@ -465,7 +419,6 @@ dataType: 'json', success: function (json) { $.each(json.results, function (i, v) { - console.log(v.sender.id); var senderName = 'Вы'; var className = 'youChat'; @@ -473,7 +426,6 @@ senderName = v.sender.username; className = ''; } - inbox.innerHTML += '
' + '

' + senderName + '

' + v.created + '
' + '

' + v.text + '

'; @@ -506,6 +458,26 @@ $("#chat").val(""); }); + $('#order-chat-add-message').on('click', function () { + var chatMessage = $("#chat-contractor-order #chat").val(); + var recipentId = $("#chat-contractor-order #recipentOrderId").val(); + var senderId = $("#chat-contractor-order #senderOrderId").val(); + var orderId = $("#chat-contractor-order #orderId").val(); + + socket.add_contact_message({ + "format_type": "add_message_order", + "data": { + "sender_id": senderId, + "recipent_id": recipentId, + "chat_message": chatMessage, + "order_id": orderId, + + } + }); + + $("#chat-contractor-order #chat").val(""); + + }); }); diff --git a/chat/templates/chat_customer.html b/chat/templates/chat_customer.html index 7f7399e..5e9c52e 100644 --- a/chat/templates/chat_customer.html +++ b/chat/templates/chat_customer.html @@ -157,9 +157,9 @@
- - - + + +
@@ -198,19 +198,22 @@ +
-
сохранить
+
согласовать
+
+

Для заметок

@@ -260,9 +263,9 @@ var recipentId = $(this).attr('data-recipent-id'); $("#chat-order-add #orderId").val(orderId); $("#chat-order-add #recipentId").val(recipentId); + $(".orderStagesInput").val(orderId); var inbox = document.getElementById('message-chat-order-space'); inbox.innerHTML = ''; - $.ajax({ url: '/api/message', type: 'GET', @@ -270,12 +273,39 @@ dataType: 'json', success: function (json) { $.each(json.results, function (i, v) { - inbox.innerHTML += '
' + - '

Иванов

13.0.2016
' + + var senderName = 'Вы'; + var className = 'youChat'; + + if (v.sender.id !== currentChatUser) { + senderName = v.sender.username; + className = ''; + } + + inbox.innerHTML += '
' + + '

'+ senderName +'

'+ v.created +'
' + '

' + v.text + '

'; }); } }); + + $.ajax({ + url: '/api/stages/', + type: 'GET', + data: {csrfmiddlewaretoken: csrftoken, 'order': orderId}, + dataType: 'json', + success: function (json) { + var htmlInbox = ""; + $.each(json.results, function (i, v) { + htmlInbox += '
' + + '

Этап '+ v.pos +''+ v.name +'

' + + '

Результаты этапа:'+ v.result+'

' + + '

до 16.03.2015

'+ v.cost +'
'; + }); + $("#order-stages").html(htmlInbox); + } + }); + + }); @@ -335,7 +365,6 @@ var senderId = $("#chat-order-add #senderId").val(); var orderId = $("#chat-order-add #orderId").val(); - socket.add_contact_message({ "format_type": "add_message_order", "data": { @@ -350,8 +379,6 @@ $("#chat-order-add #chat").val(""); }); - - }); var userId = '{{ request.user.pk }}'; @@ -368,13 +395,12 @@ }; sock.onmessage = function (event) { console.log(event.data); - alert(event.data); var message = JSON.parse(event.data); var inbox; if (message.answer_type == 'contact') { - inbox = document.getElementById('message-chat-order-space'); - } else if (message.answer_type == 'order') { inbox = document.getElementById('message-chat-space'); + } else if (message.answer_type == 'order' || message.answer_type == 'add_order') { + inbox = document.getElementById('message-chat-order-space') } inbox.innerHTML += '
' + '

Иванов

13.0.2016
' + diff --git a/chat/testapp.py b/chat/testapp.py index f8e5fa7..92df387 100644 --- a/chat/testapp.py +++ b/chat/testapp.py @@ -101,7 +101,7 @@ class TutorialHandler(websocket.WebSocketHandler): insert_sql = "INSERT INTO chat_message (id,text,created,order_id, sender_id,recipent_id, private_type) " \ "VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},'false')".format(message,order_id, sender_id, recipent_id) yield self.db.execute(insert_sql) - waiters = tuple(w for c, w in self.waiters if c == recipent_id) + 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': message, 'answer_type': 'add_order'}) diff --git a/projects/admin.py b/projects/admin.py index c924c0b..d878455 100644 --- a/projects/admin.py +++ b/projects/admin.py @@ -32,13 +32,17 @@ class ProjectAdmin(admin.ModelAdmin): form = ProjectAdminForm +class StageAdmin(admin.ModelAdmin): + list_display = ('name','status','pos','order',) + + admin.site.register(Answer) admin.site.register(Portfolio) admin.site.register(PortfolioPhoto) admin.site.register(Realty) admin.site.register(Order) admin.site.register(Candidate) -admin.site.register(Stage) +admin.site.register(Stage, StageAdmin) admin.site.register(BuildingClassfication) admin.site.register(ConstructionType) admin.site.register(Project, ProjectAdmin) diff --git a/projects/filters.py b/projects/filters.py index 26813da..0323424 100755 --- a/projects/filters.py +++ b/projects/filters.py @@ -62,6 +62,8 @@ class StageFilterSet(FilterSet): term = AllLookupsFilter() cost_type = AllLookupsFilter() term_type = AllLookupsFilter() + status = AllLookupsFilter() + pos = AllLookupsFilter() order = RelatedFilter('projects.filters.OrderFilterSet') class Meta: diff --git a/projects/migrations/0002_auto_20160725_1605.py b/projects/migrations/0002_auto_20160725_1605.py new file mode 100644 index 0000000..72874af --- /dev/null +++ b/projects/migrations/0002_auto_20160725_1605.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-25 13:05 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='stage', + name='created', + field=models.DateTimeField(default=datetime.datetime(2016, 7, 25, 13, 5, 40, 39347, tzinfo=utc)), + ), + migrations.AddField( + model_name='stage', + name='pos', + field=models.IntegerField(blank=True, default=0, null=True), + ), + migrations.AddField( + model_name='stage', + name='status', + field=models.CharField(choices=[('not_agreed', 'Не согласован'), ('in_process', 'В процессе'), ('completed', 'Завершен')], default='not_agreed', max_length=30), + ), + migrations.AlterField( + model_name='project', + name='deal_type', + field=models.CharField(choices=[('secure_deal', 'Безопасная сделка'), ('direct_payment', 'Прямая оплата')], default='secure_deal', max_length=20), + ), + ] diff --git a/projects/migrations/0003_auto_20160725_1606.py b/projects/migrations/0003_auto_20160725_1606.py new file mode 100644 index 0000000..c20c9ee --- /dev/null +++ b/projects/migrations/0003_auto_20160725_1606.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-25 13:06 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0002_auto_20160725_1605'), + ] + + operations = [ + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=datetime.datetime(2016, 7, 25, 13, 6, 34, 550741, tzinfo=utc)), + ), + ] diff --git a/projects/models.py b/projects/models.py index 70f05aa..f97d1ff 100644 --- a/projects/models.py +++ b/projects/models.py @@ -149,6 +149,13 @@ class Order(models.Model): verbose_name_plural = 'Заказы' +STATUSES = ( + ('not_agreed','Не согласован'), + ('in_process','В процессе'), + ('completed','Завершен'), +) + + class Stage(models.Model): cost = models.DecimalField(max_digits=10, decimal_places=0) cost_type = models.CharField(max_length=5, choices=CURRENCIES, default='rur') @@ -157,11 +164,15 @@ class Stage(models.Model): result = models.CharField(max_length=255) term = models.IntegerField(default=0) term_type = models.CharField(max_length=10, choices=TERMS, default='hour') + status = models.CharField(choices=STATUSES, max_length=30, default='not_agreed') + created = models.DateTimeField(default=timezone.now()) + pos = models.IntegerField(default=0, null=True, blank=True) def __str__(self): return self.name class Meta: + ordering = ['pos'] verbose_name = 'Этап' verbose_name_plural = 'Этапы' diff --git a/projects/serializers.py b/projects/serializers.py index 604a0df..45cf44a 100755 --- a/projects/serializers.py +++ b/projects/serializers.py @@ -74,6 +74,9 @@ class StageSerializer(ModelSerializer): 'name', 'order', 'result', + 'pos', + 'status', + ) diff --git a/requirements/base.txt b/requirements/base.txt index cfc10d3..60af455 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -36,5 +36,6 @@ six==1.10.0 sorl-thumbnail==12.3 sqlparse==0.1.19 tornado==4.3 -natsort +nats +ort django-mathfilters diff --git a/users/migrations/0002_auto_20160725_1605.py b/users/migrations/0002_auto_20160725_1605.py new file mode 100644 index 0000000..490435d --- /dev/null +++ b/users/migrations/0002_auto_20160725_1605.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-25 13:05 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='contractorresume', + name='resume_file', + field=models.FileField(blank=True, null=True, upload_to='users/resume/files/'), + ), + migrations.AlterField( + model_name='contractorresume', + name='text', + field=models.TextField(blank=True, null=True), + ), + ]