remotes/origin/setup
ArturBaybulatov 10 years ago
commit 2d2dbb8ddc
  1. 12
      chat/app.py
  2. 22
      chat/migrations/0002_message_team.py
  3. 3
      chat/models.py
  4. 101
      chat/templates/chat_contractor.html
  5. 94
      chat/testapp.py
  6. 7
      chat/views.py
  7. 1
      projects/filters.py
  8. 28
      projects/migrations/0009_auto_20160802_1226.py
  9. 1
      projects/models.py
  10. 1
      projects/serializers.py
  11. 12
      users/filters.py
  12. 16
      users/serializers.py

@ -50,3 +50,15 @@ def main():
if __name__ == '__main__': if __name__ == '__main__':
main() main()
@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'})

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-02 14:32
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0003_auto_20160726_1931'),
('chat', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='message',
name='team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team_messages', to='users.Team'),
),
]

@ -2,7 +2,7 @@ from django.db import models
from django.utils import timezone from django.utils import timezone
from projects.models import Order from projects.models import Order
from users.models import User from users.models import User, Team
class Message(models.Model): class Message(models.Model):
@ -12,6 +12,7 @@ class Message(models.Model):
sender = models.ForeignKey(User, related_name='sender_messages') sender = models.ForeignKey(User, related_name='sender_messages')
recipent = models.ForeignKey(User, related_name='recipent_messages') recipent = models.ForeignKey(User, related_name='recipent_messages')
private_type = models.BooleanField(default=False) private_type = models.BooleanField(default=False)
team = models.ForeignKey(Team, related_name='team_messages', null=True, blank=True)
def __str__(self): def __str__(self):
return self.text return self.text

@ -23,9 +23,11 @@
<a href="#tab2" data-toggle="tab">Заказчики</a> <a href="#tab2" data-toggle="tab">Заказчики</a>
</li> </li>
{% if team_orders %}
<li role="presentation"> <li role="presentation">
<a href="#tab3" data-toggle="tab">Исполнители</a> <a href="#tab3" data-toggle="tab">Исполнители</a>
</li> </li>
{% endif %}
</ul> </ul>
</div> </div>
</div> </div>
@ -163,34 +165,51 @@
</div> </div>
<!-- End block Tab2--> <!-- End block Tab2-->
{% if team_orders %}
<!-- Tab3 groups block --> <!-- Tab3 groups block -->
<div class="chatBlock disTab tab-pane fade" id="tab3"> <div class="chatBlock disTab tab-pane fade" id="tab3">
<div class="col-lg-3 wrMessages"> <div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
<p>Заказы</p> <p>Заказы</p>
<div class="orderBlock box-sizing orAct"> {% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing orAct" data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk}}">
<span class="dimovChat"></span> <span class="dimovChat"></span>
<p class="titleOB"> <p class="titleOB">
Дизай-проект квартиры на набережной 200 m2 {{ torder }}
</p> </p>
<div class="hideOBB disTab"> <div class="hideOBB disTab">
<p class="pOB"> <p class="pOB">
<span>Заказчик:</span> Группа Икс {# <span>Заказчик:</span> {{ torder.project.customer }}#}
<span>Исполнитель:</span> {{ torder.team.name }}
</p> </p>
<ul class="listChat1"> <ul class="listChat1">
<li>Иванов Петр Иванович</li> {% for tuser in torder.team.users.all %}
<li>Сергей Пенкин</li> <li>{{ tuser }}</li>
{% endfor %}
</ul> </ul>
<p class="pOB">
<span>Чаты:</span>
{% for tuser in torder.team.users.all %}
<span class="team-chat-user" data-id="{{ tuser.pk }}">{{ tuser.username }},</span>
{% endfor %}
</p>
<a href="javascript:void(0)" class="linkChat11"> <a href="javascript:void(0)" class="linkChat11">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа Полное описание заказа
</a> </a>
</div> </div>
</div> </div>
{% endfor %}
</div> </div>
</div> </div>
<div class="col-lg-6 commChat"> <div class="col-lg-6 commChat">
<textarea id="chat" class="box-sizing"></textarea> <form id="team-chat-form">
<input type="text" name="sender" id="senderId" value="{{ request.user.pk }}" />
<input type="text" name="recipent" id="recipentId" value="" />
<input type="text" name="order" id="orderId" value="" />
<input type="text" name="team" id="teamId" value="" />
<textarea id="chatText" class="box-sizing"></textarea>
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing"> <div class="setChat box-sizing">
<p>Прикрепить файл</p> <p>Прикрепить файл</p>
@ -198,39 +217,16 @@
Не более 10 файлов с общим объемом 500мб Не более 10 файлов с общим объемом 500мб
</span> </span>
</div> </div>
<a href="javascript:void(0)">отправить</a> <a href="javascript:void(0)" id="add-team-chat-message">отправить</a>
</div> </div>
</form>
</div> </div>
<div class="col-lg-3 wrstepschat"> <div class="col-lg-3 wrstepschat">
<p>Этапы работы</p>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">1 / Согласование условий</p>
<p class="textStepss">
Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем.
</p>
</div>
<div id="order-stages"></div>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">2 / Резервирование</p>
<p class="textStepss">
Резервирование заказчиком суммы оплаты по заказ. Деньги перечисляются и хранятся на
сайте.
</p>
<ul>
<li>Сумма еще не зарезервирована</li>
<li>Сумма за этап1, Зарезервирована</li>
</ul>
</div>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">3 / Выполнение работы</p>
<p class="textStepss">
Процесс выполнения задания в заказе до получения заказчиком итогового результата работы.
</p>
</div>
</div> </div>
</div> </div>
<!-- End block Tab3--> <!-- End block Tab3-->
{% endif %}
</div> </div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
@ -258,9 +254,9 @@
var message = JSON.parse(event.data); var message = JSON.parse(event.data);
var inbox; var inbox;
if (message.answer_type == 'contact') { if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') {
inbox = document.getElementById('message-chat-space'); inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_order') { } else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
inbox = document.getElementById('message-chat-order-space'); inbox = document.getElementById('message-chat-order-space');
} }
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' + inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
@ -277,6 +273,11 @@
console.log(data); console.log(data);
}; };
this.add_team_message = function(messageData){
console.log(messageData);
sock.send(JSON.stringify(messageData));
}
this.add_contact_message = function (messageData) { this.add_contact_message = function (messageData) {
console.log(messageData); console.log(messageData);
sock.send(JSON.stringify(messageData)); sock.send(JSON.stringify(messageData));
@ -311,6 +312,18 @@
}); });
}); });
$(".team-chat-user").on('click',function(){
var recipentId = $(this).attr('data-id');
$("#team-chat-form #recipentId").val(recipentId);
});
$(".team-order-block").on('click', function(){
var teamId = $(this).attr('data-team-id');
var orderId = $(this).attr('data-order-id');
$("#team-chat-form #teamId").val(teamId);
$("#team-chat-form #orderId").val(orderId);
});
// Вытащить сообщения для чата заказа // Вытащить сообщения для чата заказа
$('.order-block').on('click', function () { $('.order-block').on('click', function () {
$('.order-block').each(function () { $('.order-block').each(function () {
@ -453,6 +466,26 @@
}); });
//Добавить сообщение для исполнителей в группе
$("#add-team-chat-message").on('click', function(){
var chatMessage = $("#team-chat-form #chatText").val();
var recipentId = $("#team-chat-form #recipentId").val();
var senderId = $("#team-chat-form #senderId").val();
var teamId = $("#team-chat-form #teamId").val();
socket.add_team_message({
"format_type": "add_message_team",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
"team_id": teamId,
}
});
});
// Добавить сообщение для контакта // Добавить сообщение для контакта
$('#contact-chat-add-message').on('click', function () { $('#contact-chat-add-message').on('click', function () {
var chatMessage = $("#chat").val(); var chatMessage = $("#chat").val();

@ -26,29 +26,7 @@ class BaseHandler(web.RequestHandler):
return self.application.db return self.application.db
class TestHandler(web.RequestHandler): class ChatHandler(websocket.WebSocketHandler):
@property
def db(self):
return self.application.db
@gen.coroutine
def get(self, *args, **kwargs):
sql = "SELECT text,created FROM chat_message"
cursor = yield self.db.execute(sql)
data = cursor.fetchall()
for d in data:
print(d[1])
print(type(d[1]))
print(str(d[1]))
class NotificationHandler(websocket.WebSocketHandler):
@property
def db(self):
return self.application.db
class TutorialHandler(websocket.WebSocketHandler):
@property @property
def db(self): def db(self):
return self.application.db return self.application.db
@ -65,63 +43,36 @@ class TutorialHandler(websocket.WebSocketHandler):
if 'dummy' in parsed: if 'dummy' in parsed:
return return
if parsed['format_type'] == 'add_message_contact': self.add_message(parsed)
self.add_message_for_contact(parsed['data']['chat_message'], parsed['data']['sender_id'],
parsed['data']['recipent_id'])
elif parsed['format_type'] == 'add_message_order':
self.add_message_for_order(parsed['data']['chat_message'], parsed['data']['sender_id'],
parsed['data']['recipent_id'], parsed['data']['order_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): def on_close(self):
self.waiters.remove((self.user_id, self)) self.waiters.remove((self.user_id, self))
# insert_sql = "INSERT INTO chat_message (id,text,created,order_id, user_id) VALUES (DEFAULT,'{0}',NOW(),6,4)".format(str(parsed['message'])) # waiter.write_message({'msg': message, 'answer_type': 'add_contact'})
# yield self.db.execute(insert_sql) # waiter.write_message({'msg': message, 'answer_type': 'add_order'})
#
# # cursor = yield self.db.execute("SELECT * FROM chat_message")
# # data = cursor.fetchall()
# for waiter in self.waiters:
# waiter.write_message({'msg': parsed['message']})
@gen.coroutine @gen.coroutine
def add_message_for_contact(self, message, sender_id, recipent_id): def add_message(self, message_data):
insert_sql = "INSERT INTO chat_message (id,text,created,order_id, sender_id,recipent_id, private_type) " \ sender_id = message_data['data']['sender_id']
"VALUES (DEFAULT,'{0}',NOW(),NULL,{1},{2},'true')".format(message, sender_id, recipent_id) recipent_id = message_data['data']['recipent_id']
yield self.db.execute(insert_sql) order_id = message_data['data'].get('order_id', None)
waiters = tuple(w for c, w in self.waiters if c == recipent_id) team_id = message_data['data'].get('team_id', None)
for waiter in waiters: message = message_data['data'].get('chat_message', None)
waiter.write_message({'msg': message, 'answer_type': 'add_contact'})
answer_type = message_data['format_type']
private_type = 'true' if not order_id and not team_id else 'false'
team_value = "NULL" if team_id is None else team_id
order_value = "NULL" if order_id is None else order_id
insert_sql = "INSERT INTO chat_message (id,text,created, sender_id,recipent_id, private_type,team_id, order_id) " \
"VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5})".format(message, sender_id, recipent_id, private_type, team_value,order_value)
@gen.coroutine
def add_message_for_order(self, message, sender_id,recipent_id, order_id):
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) yield self.db.execute(insert_sql)
waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_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'})
@gen.coroutine
def get_messages_from_order(self, order_id):
sql = "SELECT text FROM chat_message WHERE recipent_id=" + order_id
cursor = yield self.db.execute(sql)
messages = cursor.fetchall()
for msg in messages:
for waiter in self.waiters:
waiter.write_message(json.dumps({'msg': msg[0], 'answer_type': 'order'}))
@gen.coroutine for waiter in waiters:
def get_messages_from_order_chat(self, order_id): waiter.write_message({'msg': message, 'answer_type': answer_type})
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
@ -130,8 +81,7 @@ class TutorialHandler(websocket.WebSocketHandler):
class Application(web.Application): class Application(web.Application):
def __init__(self): def __init__(self):
handlers = [ handlers = [
(r"/chat/(?P<user_id>\d+)/", TutorialHandler), (r"/chat/(?P<user_id>\d+)/", ChatHandler),
(r"/test", TestHandler),
] ]
super().__init__(handlers=handlers, **settings) super().__init__(handlers=handlers, **settings)

@ -45,10 +45,15 @@ class ChatUserView(View):
contacts_users = User.objects.filter(pk__in=users_ids) contacts_users = User.objects.filter(pk__in=users_ids)
chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk)).order_by( chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk)).order_by(
'created') 'created')
if request.user.is_owner_team():
team_orders = request.user.team.team_orders.all()
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,
'contacts_users': contacts_users, 'contacts_users': contacts_users,
'chat_messages': chat_messages 'chat_messages': chat_messages,
'team_orders': team_orders,
}) })

@ -45,6 +45,7 @@ class ProjectFilterSet(FilterSet):
class OrderFilterSet(FilterSet): class OrderFilterSet(FilterSet):
id = AllLookupsFilter() id = AllLookupsFilter()
contractor = RelatedFilter('users.filters.UserFilterSet') contractor = RelatedFilter('users.filters.UserFilterSet')
team = RelatedFilter('users.filters.TeamFilterSet')
created = AllLookupsFilter() created = AllLookupsFilter()
project = RelatedFilter('projects.filters.ProjectFilterSet') project = RelatedFilter('projects.filters.ProjectFilterSet')
secure = AllLookupsFilter() secure = AllLookupsFilter()

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-02 09:26
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('users', '0003_auto_20160726_1931'),
('projects', '0008_merge'),
]
operations = [
migrations.AddField(
model_name='order',
name='team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team_orders', to='users.Team'),
),
migrations.AlterField(
model_name='stage',
name='created',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

@ -156,6 +156,7 @@ class AnswerFiles(models.Model):
class Order(models.Model): class Order(models.Model):
contractor = models.ForeignKey(User, null=True, blank=True, related_name='orders') contractor = models.ForeignKey(User, null=True, blank=True, related_name='orders')
team = models.ForeignKey(Team, null=True, blank=True, related_name='team_orders')
created = models.DateTimeField(default=timezone.now) created = models.DateTimeField(default=timezone.now)
project = models.OneToOneField(Project, related_name='order') project = models.OneToOneField(Project, related_name='order')
secure = models.BooleanField(default=False) secure = models.BooleanField(default=False)

@ -52,6 +52,7 @@ class OrderSerializer(ModelSerializer):
fields = ( fields = (
'id', 'id',
'contractor', 'contractor',
'team',
'created', 'created',
'project', 'project',
'secure', 'secure',

@ -1,5 +1,5 @@
from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import User from .models import User, Team
class UserFilterSet(FilterSet): class UserFilterSet(FilterSet):
id = AllLookupsFilter() id = AllLookupsFilter()
@ -12,3 +12,13 @@ class UserFilterSet(FilterSet):
class Meta: class Meta:
model = User model = User
class TeamFilterSet(FilterSet):
id = AllLookupsFilter()
name = AllLookupsFilter()
owner = RelatedFilter('users.filters.UserFilterSet')
class Meta:
model = Team

@ -1,10 +1,24 @@
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from .models import User from .models import User, Team
from projects.models import Project from projects.models import Project
class TeamSerializer(ModelSerializer):
class Meta:
model = Team
fields = (
'created',
'name',
'owner',
'specializations',
'users',
)
class UserSerializer(ModelSerializer): class UserSerializer(ModelSerializer):
class Meta: class Meta:
model = User model = User

Loading…
Cancel
Save