diff --git a/api/urls.py b/api/urls.py index 46d44c2..f64ce8a 100755 --- a/api/urls.py +++ b/api/urls.py @@ -6,6 +6,7 @@ from .views import ( RealtyViewSet, SpecializationViewSet, UserViewSet, + MessageViewSet, ) @@ -16,5 +17,6 @@ router.register(r'projects', ProjectViewSet) router.register(r'realties', RealtyViewSet) router.register(r'specializations', SpecializationViewSet) router.register(r'users', UserViewSet) +router.register(r'message', MessageViewSet) urlpatterns = router.urls diff --git a/api/views.py b/api/views.py index 7629e70..e629711 100755 --- a/api/views.py +++ b/api/views.py @@ -16,6 +16,9 @@ from common.models import Location from common.serializers import LocationSerializer from common.filters import LocationFilterSet +from chat.models import Message +from chat.serializers import MessageSerializer +from chat.filters import MessageFilterSet class ProjectViewSet(ModelViewSet): queryset = Project.objects.all() @@ -23,6 +26,12 @@ class ProjectViewSet(ModelViewSet): filter_class = ProjectFilterSet +class MessageViewSet(ModelViewSet): + queryset = Message.objects.all() + serializer_class = MessageSerializer + filter_class = MessageFilterSet + + class RealtyViewSet(ModelViewSet): queryset = Realty.objects.all() serializer_class = RealtySerializer diff --git a/chat/filters.py b/chat/filters.py new file mode 100644 index 0000000..63c24e0 --- /dev/null +++ b/chat/filters.py @@ -0,0 +1,14 @@ +from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter + +from .models import Message + + +class MessageFilterSet(FilterSet): + text = AllLookupsFilter() + created = AllLookupsFilter() + sender = RelatedFilter('users.filters.UserFilterSet') + recipent = RelatedFilter('users.filters.UserFilterSet') + private_type = AllLookupsFilter() + + class Meta: + model = Message diff --git a/chat/models.py b/chat/models.py index 63517e5..2b5d506 100644 --- a/chat/models.py +++ b/chat/models.py @@ -20,4 +20,13 @@ class Message(models.Model): verbose_name = 'Сообщение' verbose_name_plural = 'Сообщения' +class Notes(models.Model): + text = models.TextField() + + + def __str__(self): + return self.text + class Meta: + verbose_name = 'Сообщение' + verbose_name_plural = 'Сообщения' diff --git a/chat/serializers.py b/chat/serializers.py new file mode 100644 index 0000000..9cdf3c0 --- /dev/null +++ b/chat/serializers.py @@ -0,0 +1,19 @@ +from rest_framework.serializers import ModelSerializer + +from .models import Message +from users.serializers import UserSerializer + +class MessageSerializer(ModelSerializer): + sender = UserSerializer() + recipent = UserSerializer() + + class Meta: + model = Message + + fields = ( + 'text', + 'created', + 'sender', + 'recipent', + 'private_type', + ) diff --git a/chat/templates/chat_contractor.html b/chat/templates/chat_contractor.html index 1308463..9a1d1d7 100644 --- a/chat/templates/chat_contractor.html +++ b/chat/templates/chat_contractor.html @@ -407,6 +407,7 @@ }; sock.onmessage = function(event){ console.log(event.data); + alert(event.data); var message = JSON.parse(event.data); var inbox = document.getElementById('message-chat-space'); inbox.innerHTML += '
' + diff --git a/chat/templates/chat_customer.html b/chat/templates/chat_customer.html index e149a39..72b2d93 100644 --- a/chat/templates/chat_customer.html +++ b/chat/templates/chat_customer.html @@ -1,10 +1,305 @@ - - - - - Title - - - - - +{% extends 'partials/base.html' %} +{% load staticfiles %} +{% block content %} +{% include 'partials/header.html' %} +
+
+
+

Чат

+
+
+
+
+ +
+
+
+
+
+
+

Контакты

+ {% for contact in customer_contacts %} + + + {% endfor %} + +
+
+
+
+
+
+ + + + +
+
+

Прикрепить файл

+ + Не более 10 файлов с общим объемом 500мб + +
+ + отправить + +
+
+ +
+
+
+

Контакты

+ +
+
+
+ Начало: + Срок сдачи: +
+
+ 13.0.2016 + 13.0.2016 +
+
+
+

Входящие документы

+
    +
  • + Архитерурное 2.jpg + 7мб +
    +
  • +
+ + Распечатать с помощью ресурса + +
+
+

Для заметок

+ + сохранить +
+ + +
+
+
+
+ +
+

Заказы

+ {% for order in orders %} +
+ +

+ {{ order }} +

+
+

+ Испонитель: {{ order.order.contractor.get_full_name }} +

+{#

#} +{# Чаты: Иванов, Петров, Пенкин#} +{#

#} + + + Полное описание заказа + +
+
+ {% endfor%} +
+ +
+
+
+ {% for msg in chat_messages %} +{#
#} +{#
#} +{#

{{ msg.sender.get_full_name }}

#} +{# {{ msg.created }}#} +{#
#} +{#

{{ msg }}

#} +{#
#} + {% endfor %} +
+
+ + + + +
+
+

Прикрепить файл

+ + Не более 10 файлов с общим объемом 500мб + +
+ отправить +
+
+
+
+
+

Для заметок

+ + сохранить +
+ +
+
+
+ {% include 'partials/footer.html' %} +
+
+ +{% endblock %} + +{% block js_block %} + + +{% endblock %} diff --git a/chat/testapp.py b/chat/testapp.py index cfddf02..97edcfc 100644 --- a/chat/testapp.py +++ b/chat/testapp.py @@ -41,8 +41,8 @@ class TestHandler(web.RequestHandler): print(type(d[1])) print(str(d[1])) -class TutorialHandler(websocket.WebSocketHandler): +class TutorialHandler(websocket.WebSocketHandler): @property def db(self): return self.application.db @@ -56,20 +56,20 @@ class TutorialHandler(websocket.WebSocketHandler): # @gen.coroutine def on_message(self, message): parsed = escape.json_decode(message) - print(parsed) - if 'dummy' in parsed: return if parsed['format_type'] == 'add_message_contact': - self.add_message_for_contact(parsed['data']['chat_message'], parsed['data']['sender_id'], parsed['data']['recipent_id']) + self.add_message_for_contact(parsed['data']['chat_message'], parsed['data']['sender_id'], + parsed['data']['recipent_id']) + elif parsed['format_type'] == 'order_message': + self.get_messages_from_order_chat(parsed['order_id']) else: self.get_messages_from_order(parsed['user_id']) def on_close(self): self.waiters.remove(self) - # # insert_sql = "INSERT INTO chat_message (id,text,created,order_id, user_id) VALUES (DEFAULT,'{0}',NOW(),6,4)".format(str(parsed['message'])) # yield self.db.execute(insert_sql) # @@ -81,12 +81,10 @@ class TutorialHandler(websocket.WebSocketHandler): @gen.coroutine def add_message_for_contact(self, message, sender_id, recipent_id): insert_sql = "INSERT INTO chat_message (id,text,created,order_id, sender_id,recipent_id, private_type) " \ - "VALUES (DEFAULT,'{0}',NOW(),NULL,{1},{2},'true')".format(message,sender_id, recipent_id) + "VALUES (DEFAULT,'{0}',NOW(),NULL,{1},{2},'true')".format(message, sender_id, recipent_id) yield self.db.execute(insert_sql) - # last_select_sql = "SELECT text FROM chat_message " - # last_message = yield self.db.execute("SELECT ") for waiter in self.waiters: - waiter.write_message({'msg': message}) + waiter.write_message({'msg': message, 'answer_type': 'add_contact'}) @gen.coroutine def get_messages_from_order(self, order_id): @@ -95,20 +93,22 @@ class TutorialHandler(websocket.WebSocketHandler): messages = cursor.fetchall() for msg in messages: for waiter in self.waiters: - waiter.write_message({'msg': msg[0]}) + waiter.write_message({'msg': msg[0], 'answer_type': 'order'}) + + @gen.coroutine + def get_messages_from_order_chat(self, order_id): + sql = "SELECT text FROM chat_message WHERE order_id=" + order_id + cursor = yield self.db.execute(sql) + messages = cursor.fetchall() + for msg in messages: + for waiter in self.waiters: + waiter.write_message({'msg': msg[0], 'answer_type': 'contact'}) def check_origin(self, origin): return True - # @gen.coroutine - # def get(self): - # cursor = yield self.db.execute("SELECT * FROM users_user WHERE id=2") - # data = cursor.fetchone() - # print(data[0]) - # self.finish() class Application(web.Application): - def __init__(self): handlers = [ (r"/chat", TutorialHandler), @@ -128,12 +128,10 @@ if __name__ == '__main__': ioloop=ioloop, ) future = application.db.connect() - ioloop.add_future(future, lambda f: ioloop.stop()) + ioloop.add_future(future, lambda f: ioloop.stop()) ioloop.start() future.result() http_server = HTTPServer(application) http_server.listen(8888, 'localhost') ioloop.start() - - diff --git a/chat/views.py b/chat/views.py index 02a5960..1e6ce01 100644 --- a/chat/views.py +++ b/chat/views.py @@ -6,20 +6,24 @@ from .models import Message class ChatUserView(View): - template_name = 'chat_user.html' + template_name = '' def get(self, request, *args, **kwargs): if request.user.is_authenticated() and request.user.is_customer(): - # orders + customer_contacts = Message.objects.values('sender_id','recipent_id').filter(Q(recipent_id=6)| Q(sender_id=6)).distinct() + chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk)) + orders = request.user.projects.select_related('order').all() self.template_name = 'chat_customer.html' + return render(request, self.template_name, {'customer_contacts': customer_contacts, + 'chat_messages': chat_messages, + 'orders': orders}) else: orders = request.user.orders.all() contractor_contacts = request.user.sender_messages.values('recipent_id').distinct('recipent_id').\ values('recipent_id__email', 'recipent_id__first_name', 'recipent_id__last_name', 'recipent_id__id') chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk)).order_by('created') self.template_name = 'chat_contractor.html' - - return render(request, self.template_name, {'orders': orders, + return render(request, self.template_name, {'orders': orders, 'contractor_contacts': contractor_contacts, 'chat_messages': chat_messages})