From 8ef7e8f1336d110d92cb9f0d29965eb8b603bb68 Mon Sep 17 00:00:00 2001
From: Mukhtar
Date: Tue, 23 Aug 2016 16:30:27 +0300
Subject: [PATCH 1/3] #ARC-16 Fixes
---
assets/js/chat.js | 16 ++++++---
chat/chat.py | 25 ++++++++++----
chat/serializers.py | 2 ++
chat/templates/chat_customer.html | 23 ++++---------
projects/templates/project_detail.html | 45 +++++++-------------------
projects/urls.py | 2 +-
projects/views.py | 9 ++++--
users/mixins.py | 7 ++--
wallets/forms.py | 1 +
wallets/signals.py | 2 +-
wallets/templates/score-detail.html | 17 +++++-----
wallets/views.py | 13 ++++++--
12 files changed, 82 insertions(+), 80 deletions(-)
diff --git a/assets/js/chat.js b/assets/js/chat.js
index 93c8c3b..1375c1f 100644
--- a/assets/js/chat.js
+++ b/assets/js/chat.js
@@ -1,6 +1,6 @@
var SocketHandler = function () {
domain = domain.replace(':' + port, '');
- var url = 'ws://' + domain + '/chat/' + userId + '/';
+ var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
@@ -23,9 +23,17 @@ var SocketHandler = function () {
alert('approve stages');
}
if (inbox) {
- inbox.innerHTML += '' +
- '
' + message.msg + '
';
+ var textMessage = message.msg;
+ var classMessage = 'youChat';
+ var senderName = 'Вы';
+ var timeMessage = message.msg_time;
+ if (message.sender_id != userId){
+ senderName = message.sender_name;
+ classMessage = '';
+ }
+ inbox.innerHTML += '' +
+ '
'+ senderName +'
' + timeMessage + '' +
+ '
' + textMessage + '
';
}
};
diff --git a/chat/chat.py b/chat/chat.py
index c4143ab..84897e0 100644
--- a/chat/chat.py
+++ b/chat/chat.py
@@ -1,4 +1,4 @@
-import os.path
+import html
from tornado import gen, web, websocket, escape, options
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
@@ -33,7 +33,6 @@ class ChatHandler(websocket.WebSocketHandler):
if 'dummy' in parsed:
return
- print(parsed['format_type'])
if 'approve_stages' in parsed['format_type']:
self.approve_stages(parsed)
else:
@@ -60,6 +59,8 @@ class ChatHandler(websocket.WebSocketHandler):
order_id = message_data['data'].get('order_id', None)
team_id = message_data['data'].get('team_id', None)
message = message_data['data'].get('chat_message', None)
+ message = html.escape(message)
+ message = message.replace('\n', '
')
answer_type = message_data['format_type']
private_type = 'true' if not order_id and not team_id else 'false'
@@ -74,14 +75,26 @@ class ChatHandler(websocket.WebSocketHandler):
insert_sql = "INSERT INTO chat_message (id,text,created, sender_id,recipent_id," \
" private_type,team_id, order_id,is_delete,is_new) " \
- "VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5},{6},{7})".\
+ "VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5},{6},{7}) RETURNING id".\
format(message, sender_id, recipent_id, private_type, team_value,order_value, is_delete, is_new)
- yield self.db.execute(insert_sql)
- waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id)
+ cursor_list = yield dict(cursor=self.db.execute(insert_sql))
+ cursor = cursor_list.get('cursor')
+ result = cursor.fetchone()
+ message_id = result[0]
+ select_last_sql = "SELECT chat_message.id, chat_message.text, chat_message.created, chat_message.sender_id," \
+ "users_user.id, users_user.username FROM chat_message" \
+ " INNER JOIN users_user ON (chat_message.sender_id = users_user.id)" \
+ " WHERE chat_message.id = {0}".format(message_id)
+
+ cursor_msg = yield self.db.execute(select_last_sql)
+ msg_data = cursor_msg.fetchone()
+ sender_name = msg_data[5]
+ msg_time = msg_data[2].strftime("%Y-%m-%d %H:%M:%S")
+ 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': answer_type})
+ waiter.write_message({'msg': message, 'msg_time': msg_time, 'sender_id': sender_id, 'sender_name': sender_name, 'answer_type': answer_type})
def check_origin(self, origin):
return True
diff --git a/chat/serializers.py b/chat/serializers.py
index cd43c8d..e4d8467 100644
--- a/chat/serializers.py
+++ b/chat/serializers.py
@@ -1,3 +1,4 @@
+from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from .models import Message, Notes, Documents
@@ -20,6 +21,7 @@ class DocumentsSerializer(ModelSerializer):
class MessageSerializer(ModelSerializer):
sender = UserSerializer()
recipent = UserSerializer()
+ created = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
class Meta:
model = Message
diff --git a/chat/templates/chat_customer.html b/chat/templates/chat_customer.html
index 12c4df7..a3db522 100644
--- a/chat/templates/chat_customer.html
+++ b/chat/templates/chat_customer.html
@@ -72,7 +72,7 @@
- отправить
+ отправить
@@ -108,7 +108,7 @@
Испонитель: {{ order.order.contractor.get_full_name }}
-
+
Полное описание заказа
@@ -134,7 +134,7 @@
Не более 10 файлов с общим объемом 500мб
- отправить
+ отправить
@@ -448,18 +448,7 @@
}
ii--;
});
-
-
}
-{# #}
-{# var updateFormStages = $(".update-stages-form");#}
-{# var limitCount = countStage + 1;#}
-{# for (var i = 2; i < limitCount; i++) {#}
-{# var stageCopy = $("#stage1").clone().attr("id", "stage" + i).addClass("stages_form");#}
-{# stageCopy.find('.stage-span-id').html(i);#}
-{# $("#stage1").after(stageCopy);#}
-{##}
-{# }#}
});
$('.order-block').on('click', function () {
@@ -545,7 +534,8 @@
});
- $('#contact-chat-add-message').on('click', function () {
+ $('#contact-chat-add-message').on('click', function (e) {
+ e.preventDefault();
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();
var senderId = $("#senderId").val();
@@ -566,7 +556,8 @@
alert('add review');
});
- $('#order-chat-add-message').on('click', function () {
+ $('#order-chat-add-message').on('click', function (e) {
+ e.preventDefault();
var chatMessage = $("#chat-order-add #chat").val();
var recipentId = $("#chat-order-add #recipentId").val();
var senderId = $("#chat-order-add #senderId").val();
diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html
index e4d6105..2dcd2a3 100644
--- a/projects/templates/project_detail.html
+++ b/projects/templates/project_detail.html
@@ -36,21 +36,8 @@
{{ project.customer.get_full_name }} [{{ project.customer.username }}]
На сайте {{ project.created|naturaltime }}
-
- {% if not request.user.is_contractor %}
-
- {% endif %}
-
- {% if request.user.is_contractor %}
+
- Рейтинг: 0
@@ -64,27 +51,13 @@
- {% endif %}
-
-
- {% specialization_widget contractor.pk %}
-{#
#}
-{#
#}
-{# Специализации:#}
-{#
#}
-{#
#}
-
+
- -
- {{ project.created }}
-
- -
- {{ project.get_work_type_display }}
-
+ - {{ project.created }}
+ - {{ project.get_work_type_display }}
-
{% if project.cro %}
-
+ {% empty %}
+ В группе пока нет участников
{% endfor %}
@@ -176,15 +177,19 @@
+ {% empty %}
+
+
Работ в портфолио пока нет
+
{% endfor %}
-
-
+{# TODO:#}
+{# #}
@@ -208,38 +213,45 @@
+ {% empty %}
+
+
Готовых работ пока нет
+
{% endfor %}
-
+{# TODO#}
+{# #}
+ {% for review in reviews %}
- Иванов Петр Иванович
+ {{ review.get_sender }}
-
- Безопасная сделка
-
+ {% if review.project.deal_type == 'secure_deal' %}
+
+ Безопасная сделка
+
+ {% endif %}
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum
-
+ {{ review.text|safe }}
+ {% empty %}
+
+ {% endfor %}
diff --git a/users/templates/contractor_profile.html b/users/templates/contractor_profile.html
index 0d69861..55c0941 100644
--- a/users/templates/contractor_profile.html
+++ b/users/templates/contractor_profile.html
@@ -196,7 +196,12 @@
{% endif %}
+ {% empty %}
+
+
Работ в портфолио пока нет
+
{% endfor %}
+
@@ -455,6 +460,10 @@
+ {% empty %}
+
{% endfor %}
diff --git a/users/views.py b/users/views.py
index d87e666..e51ba37 100644
--- a/users/views.py
+++ b/users/views.py
@@ -375,6 +375,7 @@ class ContractorOfficeDetailView(DetailView):
work_sells = WorkSell.objects.filter(contractor__in=user_ids)
context['portfolios'] = portfolios
context['work_sells'] = work_sells
+ context['reviews'] = Review.objects.filter(target_contractor__in=user_ids)
return context
diff --git a/wallets/views.py b/wallets/views.py
index e5a11f8..84df34c 100644
--- a/wallets/views.py
+++ b/wallets/views.py
@@ -1,27 +1,25 @@
-from django.conf import urls, settings
+from django.conf import settings
from django.contrib import messages
+from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Sum
-from django.http import HttpResponse, JsonResponse, HttpResponseForbidden
+from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, get_object_or_404
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import DetailView, CreateView
from django.views.generic.base import View
-from pprint import pprint, pformat
-import logging
+from users.models import User
from .forms import WithDrawForm, TmpCheckOrderForm, TmpPaymentAvisoForm
from .models import InvoiceHistory, WithDraw, Transaction
-from users.mixins import CheckForUserMixin
-from users.models import User
class ScoreDetailView(DetailView):
model = User
template_name = 'score-detail.html'
context_object_name = 'user_score'
-
+
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
user_score_balance = InvoiceHistory.objects.filter(user=self.get_object()).aggregate(Sum('sum'))
@@ -30,16 +28,15 @@ class ScoreDetailView(DetailView):
return context
-class ScoreView(View):
+class ScoreView(LoginRequiredMixin, View):
template_name = 'score-detail.html'
def get(self, request, *args, **kwargs):
- # transaction = Transaction.objects.get_or_create(customer=request.user, complete=False)
- transaction = Transaction.objects.create(customer=request.user,type='add')
+ transaction = Transaction.objects.create(customer=request.user, type='add')
user_score = get_object_or_404(User.objects, pk=kwargs.get('pk'))
current_sum_info = InvoiceHistory.objects.filter(user=user_score).aggregate(Sum('sum'))
user_score_balance = current_sum_info['sum__sum'] or 0
-
+
return render(request, self.template_name, {
'transaction': transaction,
'YANDEX_MONEY': settings.YANDEX_MONEY,
@@ -96,23 +93,22 @@ class WithDrawCreate(CreateView):
return super().form_invalid(form)
-
# Yandex Money ------------------------------------------------
class TmpCheckOrderView(View):
form_class = TmpCheckOrderForm
-
+
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
-
+
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
-
+
# trans = form.cleaned_data.get('transaction')
-
+
if form.is_valid():
res = """
@@ -141,21 +137,21 @@ class TmpCheckOrderView(View):
invoice_id=form.cleaned_data.get('invoiceId'),
shop_id=form.cleaned_data.get('shopId'),
)
-
+
return HttpResponse(res, content_type='application/xml')
# return HttpResponse('{msg}'.format(msg=pformat(form.errors))) # Debug
class TmpPaymentAvisoView(View):
form_class = TmpPaymentAvisoForm
-
+
@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
-
+
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
-
+
if form.is_valid():
transaction = form.cleaned_data.get('transaction_id')
transaction.complete = True
@@ -173,7 +169,7 @@ class TmpPaymentAvisoView(View):
invoice_id=form.cleaned_data.get('invoiceId'),
shop_id=form.cleaned_data.get('shopId'),
)
-
+
return HttpResponse(res, content_type='application/xml')
else:
res = """
@@ -183,6 +179,6 @@ class TmpPaymentAvisoView(View):
message="Payment aviso, validation error"
techMessage="Payment aviso, validation error"/>
""".format(date=timezone.now().isoformat())
-
+
return HttpResponse(res, content_type='application/xml')
# return HttpResponse('{msg}'.format(msg=pformat(form.errors))) # Debug