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, RealtyViewSet,
SpecializationViewSet, SpecializationViewSet,
UserViewSet, UserViewSet,
MessageViewSet,
) )
@ -16,5 +17,6 @@ router.register(r'projects', ProjectViewSet)
router.register(r'realties', RealtyViewSet) router.register(r'realties', RealtyViewSet)
router.register(r'specializations', SpecializationViewSet) router.register(r'specializations', SpecializationViewSet)
router.register(r'users', UserViewSet) router.register(r'users', UserViewSet)
router.register(r'message', MessageViewSet)
urlpatterns = router.urls urlpatterns = router.urls

@ -16,6 +16,9 @@ from common.models import Location
from common.serializers import LocationSerializer from common.serializers import LocationSerializer
from common.filters import LocationFilterSet from common.filters import LocationFilterSet
from chat.models import Message
from chat.serializers import MessageSerializer
from chat.filters import MessageFilterSet
class ProjectViewSet(ModelViewSet): class ProjectViewSet(ModelViewSet):
queryset = Project.objects.all() queryset = Project.objects.all()
@ -23,6 +26,12 @@ class ProjectViewSet(ModelViewSet):
filter_class = ProjectFilterSet filter_class = ProjectFilterSet
class MessageViewSet(ModelViewSet):
queryset = Message.objects.all()
serializer_class = MessageSerializer
filter_class = MessageFilterSet
class RealtyViewSet(ModelViewSet): class RealtyViewSet(ModelViewSet):
queryset = Realty.objects.all() queryset = Realty.objects.all()
serializer_class = RealtySerializer 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 = 'Сообщение'
verbose_name_plural = 'Сообщения' 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){ sock.onmessage = function(event){
console.log(event.data); console.log(event.data);
alert(event.data);
var message = JSON.parse(event.data); var message = JSON.parse(event.data);
var inbox = document.getElementById('message-chat-space'); var inbox = document.getElementById('message-chat-space');
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' + inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +

@ -1,10 +1,305 @@
<!DOCTYPE html> {% extends 'partials/base.html' %}
<html lang="en"> {% load staticfiles %}
<head> {% block content %}
<meta charset="UTF-8"> {% include 'partials/header.html' %}
<title>Title</title> <div class="container mainScore">
</head> <div class="row">
<body> <div class="col-lg-12 allProjects">
<h1>Чат</h1>
</body> </div>
</html> <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(type(d[1]))
print(str(d[1])) print(str(d[1]))
class TutorialHandler(websocket.WebSocketHandler):
class TutorialHandler(websocket.WebSocketHandler):
@property @property
def db(self): def db(self):
return self.application.db return self.application.db
@ -56,20 +56,20 @@ class TutorialHandler(websocket.WebSocketHandler):
# @gen.coroutine # @gen.coroutine
def on_message(self, message): def on_message(self, message):
parsed = escape.json_decode(message) parsed = escape.json_decode(message)
print(parsed)
if 'dummy' in parsed: if 'dummy' in parsed:
return return
if parsed['format_type'] == 'add_message_contact': 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: else:
self.get_messages_from_order(parsed['user_id']) self.get_messages_from_order(parsed['user_id'])
def on_close(self): def on_close(self):
self.waiters.remove(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'])) # 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) # yield self.db.execute(insert_sql)
# #
@ -81,12 +81,10 @@ class TutorialHandler(websocket.WebSocketHandler):
@gen.coroutine @gen.coroutine
def add_message_for_contact(self, message, sender_id, recipent_id): 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) " \ 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) 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: for waiter in self.waiters:
waiter.write_message({'msg': message}) waiter.write_message({'msg': message, 'answer_type': 'add_contact'})
@gen.coroutine @gen.coroutine
def get_messages_from_order(self, order_id): def get_messages_from_order(self, order_id):
@ -95,20 +93,22 @@ class TutorialHandler(websocket.WebSocketHandler):
messages = cursor.fetchall() messages = cursor.fetchall()
for msg in messages: for msg in messages:
for waiter in self.waiters: 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): def check_origin(self, origin):
return True 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): class Application(web.Application):
def __init__(self): def __init__(self):
handlers = [ handlers = [
(r"/chat", TutorialHandler), (r"/chat", TutorialHandler),
@ -128,12 +128,10 @@ if __name__ == '__main__':
ioloop=ioloop, ioloop=ioloop,
) )
future = application.db.connect() future = application.db.connect()
ioloop.add_future(future, lambda f: ioloop.stop()) ioloop.add_future(future, lambda f: ioloop.stop())
ioloop.start() ioloop.start()
future.result() future.result()
http_server = HTTPServer(application) http_server = HTTPServer(application)
http_server.listen(8888, 'localhost') http_server.listen(8888, 'localhost')
ioloop.start() ioloop.start()

@ -6,20 +6,24 @@ from .models import Message
class ChatUserView(View): class ChatUserView(View):
template_name = 'chat_user.html' template_name = ''
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer(): 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' self.template_name = 'chat_customer.html'
return render(request, self.template_name, {'customer_contacts': customer_contacts,
'chat_messages': chat_messages,
'orders': orders})
else: else:
orders = request.user.orders.all() orders = request.user.orders.all()
contractor_contacts = request.user.sender_messages.values('recipent_id').distinct('recipent_id').\ 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') 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') chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk)).order_by('created')
self.template_name = 'chat_contractor.html' 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, 'contractor_contacts': contractor_contacts,
'chat_messages': chat_messages}) 'chat_messages': chat_messages})

Loading…
Cancel
Save