#ARC-18 Fixes

remotes/origin/PR-39
Mukhtar 9 years ago
parent c355a09eb7
commit e0b887ee3e
  1. 15
      assets/js/chat.js
  2. 9
      assets/js/chat_contractor.js
  3. 3
      assets/js/chat_customer.js
  4. 2
      chat/serializers.py
  5. 9
      chat/templates/chat_contractor.html
  6. 6
      chat/templates/chat_customer.html
  7. 29
      chat/views.py
  8. 2
      projects/serializers.py
  9. 5
      users/models.py
  10. 3
      users/templatetags/user_tags.py

@ -563,15 +563,14 @@ function dialog (message, yesCallback, notCallback) {
var recipentId = $("#chat-order-add #recipentId").val(); var recipentId = $("#chat-order-add #recipentId").val();
var senderId = $("#chat-order-add #senderId").val(); var senderId = $("#chat-order-add #senderId").val();
var orderId = $("#chat-order-add #orderId").val(); var orderId = $("#chat-order-add #orderId").val();
var sendLinks = $("#document-send-order a");
if (chatMessage) { if (chatMessage || sendLinks.length > 0) {
var sendLinks = $("#document-send-order a");
var sendLinkIds = ""; var sendLinkIds = "";
var documentLinks = ""; var documentLinks = "";
var documentAttachFiles = ""; var documentAttachFiles = "";
$.each(sendLinks, function (i, v) { $.each(sendLinks, function (i, v) {
sendLinkIds += $(this).attr('data-id') + ';'; sendLinkIds += $(this).attr('data-id') + ';';
documentLinks += 'Входящий файл: <br> <a href="'+ $(this).attr('href') + '">'+ $(this).text() +'</a><br>'; documentLinks += 'Приложенный файл. скачать: <br> <a href="'+ $(this).attr('href') + '">'+ $(this).text() +'</a><br>';
documentAttachFiles += '<li style="word-break: break-all;">' + documentAttachFiles += '<li style="word-break: break-all;">' +
'<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' + '<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' +
'<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>'; '<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>';
@ -605,16 +604,18 @@ function dialog (message, yesCallback, notCallback) {
var chatMessage = $("#chat").val(); var chatMessage = $("#chat").val();
var recipentId = $("#recipentContactId").val(); var recipentId = $("#recipentContactId").val();
var senderId = $("#senderContactId").val(); var senderId = $("#senderContactId").val();
if (chatMessage) { var sendLinks = $("#document-send-contact a");
if (chatMessage || sendLinks.length > 0) {
$("#contact-chat-form .errorEmptyMessage").hide(); $("#contact-chat-form .errorEmptyMessage").hide();
var sendLinks = $("#document-send-contact a");
var sendLinkIds = ""; var sendLinkIds = "";
var documentLinks = ""; var documentLinks = "";
var documentAttachFiles = ""; var documentAttachFiles = "";
$.each(sendLinks, function (i, v) { $.each(sendLinks, function (i, v) {
sendLinkIds += $(this).attr('data-id') + ';'; sendLinkIds += $(this).attr('data-id') + ';';
documentLinks += 'Входящий файл: <br> <a href="'+ $(this).attr('href') + '">'+ $(this).text() +'</a><br>'; documentLinks += 'Приложенный файл. скачать: <br> <a href="'+ $(this).attr('href') + '">'+ $(this).text() +'</a><br>';
documentAttachFiles += '<li style="word-break: break-all;">' + documentAttachFiles += '<li style="word-break: break-all;">' +
'<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' + '<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' +
'<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>'; '<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>';

@ -588,15 +588,14 @@ $(function () {
var orderId = $("#team-chat-form #orderTeamId").val(); var orderId = $("#team-chat-form #orderTeamId").val();
var documentSendIds = $("#documentSendIds").val(); var documentSendIds = $("#documentSendIds").val();
var teamIds = $("#team-chat-form #teamIds").val(); var teamIds = $("#team-chat-form #teamIds").val();
var sendLinks = $("#document-send a");
if (chatMessage) { if (chatMessage || sendLinks.length > 0) {
var sendLinks = $("#document-send a");
var sendLinkIds = ""; var sendLinkIds = "";
var documentLinks = ""; var documentLinks = "";
var documentAttachFiles = ""; var documentAttachFiles = "";
$.each(sendLinks, function (i, v) { $.each(sendLinks, function (i, v) {
sendLinkIds += $(this).attr('data-id') + ';'; sendLinkIds += $(this).attr('data-id') + ';';
documentLinks += 'Входящий файл: <br> <a href="' + $(this).attr('href') + '">' + $(this).text() + '</a><br>'; documentLinks += 'Приложенный файл. скачать: <br> <a href="' + $(this).attr('href') + '">' + $(this).text() + '</a><br>';
documentAttachFiles += '<li style="word-break: break-all;">' + documentAttachFiles += '<li style="word-break: break-all;">' +
'<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' + '<a class="file-link" href="' + $(this).attr('href') + '">' + $(this).text() + '</a>' +
'<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>'; '<div class="remove-document" data-id="' + $(this).attr('data-id') + '" style="right:-10px;"></div></li>';
@ -622,6 +621,8 @@ $(function () {
$("#team-chat-form #chatText").val(""); $("#team-chat-form #chatText").val("");
$("#document-send").html(""); $("#document-send").html("");
$("#documentSendIds").val(""); $("#documentSendIds").val("");
} else {
$("#team-chat-form .errorEmptyMessage").show();
} }
}); });

@ -303,6 +303,7 @@ $(function () {
$(".new-stages-form").each(function (i, v) { $(".new-stages-form").each(function (i, v) {
var _this = $(this); var _this = $(this);
console.log($(this).serialize());
$.ajax({ $.ajax({
url: '/api/stages/', url: '/api/stages/',
type: 'POST', type: 'POST',
@ -332,7 +333,7 @@ $(function () {
$(".update-stages-form").each(function (i, v) { $(".update-stages-form").each(function (i, v) {
var _this = $(this); var _this = $(this);
var currentStageId = parseInt($(this).attr('data-stage-id')); var currentStageId = parseInt($(this).attr('data-stage-id'));
console.log($(this).serialize());
$.ajax({ $.ajax({
url: '/api/stages/' + currentStageId + '/', url: '/api/stages/' + currentStageId + '/',
type: 'PUT', type: 'PUT',

@ -63,7 +63,7 @@ class MessageSerializer(ModelSerializer):
out = obj.text out = obj.text
documents = obj.documents.all() documents = obj.documents.all()
if len(documents)>0: if len(documents)>0:
documents_str = '<br>'.join(['Приложенный файл: <br><a target="_blank" href="/chat/download/' + doc.file.name + '">' + doc.file.name + '</a>' for doc in documents]) documents_str = '<br>'.join(['Приложенный файл. скачать: <br><a target="_blank" href="/chat/download/' + doc.file.name + '">' + doc.file.name + '</a>' for doc in documents])
out += '<br><br>' + documents_str out += '<br><br>' + documents_str
return out return out

@ -7,7 +7,7 @@
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
<div class="col-lg-12 allProjects"> <div class="col-lg-12 allProjects">
<h1>Чат {{ request.user }} {{ request.user.pk }}</h1> <h1>Чат</h1>
</div> </div>
<div class="btnReadyBlock disTab"> <div class="btnReadyBlock disTab">
@ -17,15 +17,15 @@
<ul class="nav nav-tabs nav-justified"> <ul class="nav nav-tabs nav-justified">
<li role="presentation"> <li role="presentation">
<a href="#tab1" data-toggle="tab">Личные<span class="count-tab">0</span></a> <a href="#tab1" data-toggle="tab">Личные<span class="count-tab">{{ contacts_users_count }}</span></a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#tab2" data-toggle="tab">Заказчики<span class="count-tab">0</span></a> <a href="#tab2" data-toggle="tab">Заказчики<span class="count-tab">{{ orders_ms_count }}</span></a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#tab3" data-toggle="tab">Исполнители,Группы<span class="count-tab">0</span></a> <a href="#tab3" data-toggle="tab">Исполнители,Группы<span class="count-tab">{{ teams_ms_count }}</span></a>
</li> </li>
</ul> </ul>
@ -321,6 +321,7 @@
<input type="hidden" name="team_ids" id="teamIds"> <input type="hidden" name="team_ids" id="teamIds">
<input type="hidden" name="document-send" id="documentSendIds"> <input type="hidden" name="document-send" id="documentSendIds">
<textarea id="chatText" class="chat-textarea box-sizing"></textarea> <textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p>
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing upload"> <div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-team"> <input type="file" name="file" id="upload-document-team">

@ -7,7 +7,7 @@
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
<div class="col-lg-12 allProjects"> <div class="col-lg-12 allProjects">
<h1>Чат {{ request.user.get_score }}</h1> <h1>Чат</h1>
</div> </div>
<div class="btnReadyBlock disTab"> <div class="btnReadyBlock disTab">
<div class="triangle1"></div> <div class="triangle1"></div>
@ -15,10 +15,10 @@
<div class="profileTabs2"> <div class="profileTabs2">
<ul class="nav nav-tabs nav-justified"> <ul class="nav nav-tabs nav-justified">
<li role="presentation"> <li role="presentation">
<a href="#tab1" data-toggle="tab">Личные<span class="count-tab">0</span></a> <a href="#tab1" data-toggle="tab">Личные<span class="count-tab">{{ contacts_users_count }}</span></a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#tab2" data-toggle="tab">Исполнители<span class="count-tab">0</span> <a href="#tab2" data-toggle="tab">Исполнители<span class="count-tab">{{ orders_ms_count }}</span>
</a> </a>
</li> </li>
</ul> </ul>

@ -9,7 +9,7 @@ from wsgiref.util import FileWrapper
from .response import JSONResponse, response_mimetype from .response import JSONResponse, response_mimetype
from .utils import serialize from .utils import serialize
from .models import Message, Documents from .models import Message, Documents, NewMessage
from projects.models import Order, Project from projects.models import Order, Project
from wallets.models import Transaction from wallets.models import Transaction
from users.models import User, Team from users.models import User, Team
@ -53,16 +53,25 @@ class ChatUserView(LoginRequiredMixin, View):
users_ids.append(b) users_ids.append(b)
if user_id: if user_id:
users_ids.append(int(user_id)) users_ids.append(int(user_id))
print(users_ids)
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)) chat_messages = Message.objects.filter(Q(sender=request.user.pk) | Q(recipent=request.user.pk))
orders = request.user.customer_projects.select_related('order').filter(state='active').exclude(order__contractor__isnull=True, order__team__isnull=True) orders = request.user.customer_projects.select_related('order').filter(state='active').exclude(order__contractor__isnull=True, order__team__isnull=True)
order_ids = [order.order.pk for order in orders]
transaction = Transaction.objects.get_or_create(customer=request.user, type='reservation', complete=False) transaction = Transaction.objects.get_or_create(customer=request.user, type='reservation', complete=False)
self.template_name = 'chat_customer.html'
contacts_users_count = request.user.new_messages.filter(message__sender__in=users_ids,
message__order__isnull=True,
message__team__isnull=True
).count()
orders_ms_count = request.user.new_messages.filter(message__order__in=order_ids, message__team__isnull=True).count()
self.template_name = 'chat_customer.html'
return render(request, self.template_name, {'contacts_users': contacts_users, return render(request, self.template_name, {'contacts_users': contacts_users,
'chat_messages': chat_messages, 'chat_messages': chat_messages,
'contacts_users_count': contacts_users_count,
'orders_ms_count': orders_ms_count,
'orders': orders, 'orders': orders,
'transaction': transaction[0], 'transaction': transaction[0],
'YANDEX_MONEY': settings.YANDEX_MONEY, 'YANDEX_MONEY': settings.YANDEX_MONEY,
@ -90,17 +99,31 @@ class ChatUserView(LoginRequiredMixin, View):
users_ids.append(b) users_ids.append(b)
if user_id: if user_id:
users_ids.append(int(user_id)) users_ids.append(int(user_id))
contacts_users = User.objects.filter(pk__in=users_ids) contacts_users = User.objects.filter(pk__in=users_ids)
contacts_users_count = request.user.new_messages.filter(message__sender__in=users_ids,
message__order__isnull=True,
message__team__isnull=True
).count()
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')
your_teams = Team.objects.filter(Q(contractors__id=request.user.pk) | Q(owner=request.user)) your_teams = Team.objects.filter(Q(contractors__id=request.user.pk) | Q(owner=request.user))
orders_ms_count = request.user.new_messages.filter(message__order__in=orders, message__team__isnull=True).count()
teams_ms_count = request.user.new_messages.filter(message__team__in=your_teams, message__order__isnull=True).count()
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,
'contacts_users_count': contacts_users_count,
'orders_ms_count': orders_ms_count,
'teams_ms_count': teams_ms_count,
'chat_messages': chat_messages, 'chat_messages': chat_messages,
'team_orders': team_orders, 'team_orders': team_orders,
'your_teams': your_teams, 'your_teams': your_teams,
}) })

@ -80,7 +80,7 @@ class StageSerializer(ModelSerializer):
term = serializers.DateField(format="%d.%m.%Y", input_formats=['%d.%m.%Y',]) term = serializers.DateField(format="%d.%m.%Y", input_formats=['%d.%m.%Y',])
def validate(self, data): def validate(self, data):
if hasattr(data, 'pos') and data['pos'] > 1: if 'pos' in data and data['pos'] > 1:
pos = data['pos'] -1 pos = data['pos'] -1
stage_last = Stage.objects.filter(order=data['order'], pos=pos) stage_last = Stage.objects.filter(order=data['order'], pos=pos)
if stage_last: if stage_last:

@ -5,8 +5,6 @@ from django.db import models
from django.db.models import Sum from django.db.models import Sum
from django.utils import timezone, formats from django.utils import timezone, formats
from mptt.models import TreeForeignKey, TreeManyToManyField from mptt.models import TreeForeignKey, TreeManyToManyField
from pprint import pprint
import datetime
import pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _; _.map = _.map_; _.filter = _.filter_
from archilance import util from archilance import util
@ -216,9 +214,6 @@ class User(AbstractBaseUser, PermissionsMixin):
def has_team(self): def has_team(self):
return self.is_contractor() and bool(util.get_related_or_none(self, 'team')) return self.is_contractor() and bool(util.get_related_or_none(self, 'team'))
def is_owner_profile(self, user_id):
pass
def is_owner_team(self): def is_owner_team(self):
return Team.objects.filter(owner=self.pk).exists() return Team.objects.filter(owner=self.pk).exists()

@ -61,9 +61,10 @@ def get_new_count_message(team_pk,user=None):
count = NewMessage.objects.filter(user=user, message__team=team_pk, message__order__isnull=True).count() count = NewMessage.objects.filter(user=user, message__team=team_pk, message__order__isnull=True).count()
return count return count
@register.simple_tag @register.simple_tag
def get_new_count_for_contact(contact, current_user): def get_new_count_for_contact(contact, current_user):
count = current_user.new_messages.filter(message__sender=contact).count() count = current_user.new_messages.filter(message__sender=contact, message__order__isnull=True, message__team__isnull=True).count()
return count return count

Loading…
Cancel
Save