remotes/origin/setup
ArturBaybulatov 10 years ago
commit d26868ddb7
  1. 2
      api/urls.py
  2. 9
      api/views.py
  3. 14
      chat/filters.py
  4. 9
      chat/models.py
  5. 19
      chat/serializers.py
  6. 1
      chat/templates/chat_contractor.html
  7. 315
      chat/templates/chat_customer.html
  8. 38
      chat/testapp.py
  9. 12
      chat/views.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

@ -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

@ -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

@ -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 = 'Сообщения'

@ -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',
)

@ -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 += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +

@ -1,10 +1,305 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% block content %}
{% include 'partials/header.html' %}
<div class="container mainScore">
<div class="row">
<div class="col-lg-12 allProjects">
<h1>Чат</h1>
</div>
<div class="btnReadyBlock disTab">
<div class="triangle1"></div>
<div class="col-lg-6 col-lg-offset-3 tabsChat">
<div class="profileTabs2">
<ul class="nav nav-tabs nav-justified">
<li role="presentation" class="active">
<a href="#tab1" data-toggle="tab">Личные</a>
</li>
<li role="presentation">
<a href="#tab2" data-toggle="tab">Исполнители</a>
</li>
</ul>
</div>
</div>
</div>
<div class="tab-content">
<div class="chatBlock disTab tab-pane fade in active" id="tab1">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
{% for contact in customer_contacts %}
<div class="message messd user-block" data-id="{{ contact.recipent_id}}">
<div class="imgMess">
<img src="{% static 'img/mess.png' %}" alt="mess-image">
</div>
<p class="nameMess">
<a href="#">Тестовый контакт</a>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
<span>0</span>
<a href="javascript:void(0)" class="deleteMess">
Удалить контакт
</a>
</div>
{% endfor %}
</div>
</div>
<div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space">
</div>
<form id="contact-chat-form">
<input type="text" value="{{ request.user.pk }}" name="senderId" id="senderId" />
<input type="text" value="" name="recipentId" id="recipentId" />
<textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<div class="bunChat">
<div class="setChat box-sizing">
<p>Прикрепить файл</p>
<span>
Не более 10 файлов с общим объемом 500мб
</span>
</div>
<a id="contact-chat-add-message" href="javascript:void(0)">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrChat1">
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
<div class="message">
<div class="imgMess">
<img src="img/mess.png" alt="mess-image">
</div>
<p class="nameMess">
<a href="#">Иванов Петр Иванович</a>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
</div>
</div>
<div class="col-lg-12 startChat">
<div class="insetSC1">
Начало:
<span>Срок сдачи:</span>
</div>
<div class="insetSC2">
13.0.2016
<span>13.0.2016</span>
</div>
</div>
<div class="col-lg-12 documentsChat">
<p>Входящие документы</p>
<ul>
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
<a href="javascript:void(0)">
Распечатать с помощью ресурса
</a>
</div>
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="javascript:void()">сохранить</a>
</div>
<div class="closeChat closeChat1">
<a href="javascript:void(0)">
Закрыть проект<br>и оставить отзыв
</a>
</div>
<div class="closeChat closeChat2">
<a href="javascript:void(0)">
Закрыть проект<br>и оставить отзыв
</a>
</div>
</div>
</div>
<div class="chatBlock disTab tab-pane fade" id="tab2">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
<p>Заказы</p>
{% for order in orders %}
<div class="orderBlock box-sizing order-block" data-id="{{ order.order.id }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ order }}
</p>
<div class="hideOBB">
<p class="pOB">
<span>Испонитель:</span> {{ order.order.contractor.get_full_name }}
</p>
{# <p class="pOB">#}
{# <span>Чаты:</span> Иванов, Петров, Пенкин#}
{# </p>#}
<a href="javascript:void(0)" class="linkChat11">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
</div>
{% endfor%}
</div>
</div>
<div class="col-lg-6 commChat">
<div id="message-chat-order-space">
{% for msg in chat_messages %}
{# <div class="col-lg-12 insetCommChat {% if msg.sender.pk == request.user.pk %}youChat{% endif %}">#}
{# <div class="topCommChat">#}
{# <p class="nameCommChat {% if msg.sender.pk == request.user.pk %}greenNCC{% endif %}">{{ msg.sender.get_full_name }}</p>#}
{# <span>{{ msg.created }}</span>#}
{# </div>#}
{# <p class="textCommChat">{{ msg }}</p>#}
{# </div>#}
{% endfor %}
</div>
<form id="chat-order-add">
<input type="text" name="senderId" value="{{ request.user.pk }}"/>
<input type="text" name="recipentId" id="recipentId" value="" />
<input type="text" name="orderId" id="orderId" value="" />
<textarea id="chat" class="box-sizing"></textarea>
<div class="bunChat">
<div class="setChat box-sizing">
<p>Прикрепить файл</p>
<span>
Не более 10 файлов с общим объемом 500мб
</span>
</div>
<a href="javascript:void(0)">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrTAB">
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2" ></textarea>
<a href="javascript:void()">сохранить</a>
</div>
<div class="linkChatB box-sizing disTab">
<a href="javascript:void(0)">предложить проект</a>
</div>
</div>
</div>
</div>
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %}
{% block js_block %}
<script type="text/javascript">
$(function(){
var socket = new SocketHandler();
var form = document.getElementById('message_form');
$('.order-block').on('click',function(){
var orderId = $(this).attr('data-id');
$("#chat-order-add #orderId").val(orderId);
var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = '';
socket.send_order_message(orderId);
});
$('.user-block').on('click', function(){
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML = '';
socket.send_contact_message(userId);
});
$('#contact-chat-add-message').on('click', function(){
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();
var senderId = $("#senderId").val();
socket.add_contact_message({
"format_type": "add_message_contact",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
}
});
$("#chat").val("");
});
});
var SocketHandler = function(){
var url = 'ws://127.0.0.1:8888/chat';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function(){
console.log("Start connect");
intervalId = setInterval(function(){sock.send('{"dummy": 1}');}, 150);
};
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');
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + message.msg +'</p></div>';
};
this.send_order_message = function(orderId){
var data = {
"format_type": "order_message",
"order_id": orderId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.send_contact_message = function(userId){
var data = {
"format_type": "add_message",
"user_id": userId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.add_contact_message = function(messageData){
console.log(messageData);
sock.send(JSON.stringify(messageData));
};
this.send_message = function(form){
var elements = form.elements;
var data = {};
var i=0;
for(var i; i< elements.length; i++){
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}
</script>
{% endblock %}

@ -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()

@ -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})

Loading…
Cancel
Save