remotes/origin/PR-39
ArturBaybulatov 10 years ago
commit d6f19afb5a
  1. 16
      assets/js/chat.js
  2. 25
      chat/chat.py
  3. 2
      chat/serializers.py
  4. 23
      chat/templates/chat_customer.html
  5. 24
      projects/templates/project_detail.html
  6. 2
      projects/urls.py
  7. 31
      projects/views.py
  8. 8
      ratings/templates/templatetags/ratings_widget.html
  9. 37
      ratings/templates/templatetags/specializations_widget.html
  10. 18
      ratings/templatetags/specializtions_tags.py
  11. 7
      users/mixins.py
  12. 58
      users/templates/contractor_office.html
  13. 9
      users/templates/contractor_profile.html
  14. 1
      users/views.py
  15. 1
      wallets/forms.py
  16. 2
      wallets/signals.py
  17. 17
      wallets/templates/score-detail.html
  18. 59
      wallets/views.py

@ -1,6 +1,6 @@
var SocketHandler = function () { var SocketHandler = function () {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/'; var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {
@ -23,9 +23,17 @@ var SocketHandler = function () {
alert('approve stages'); alert('approve stages');
} }
if (inbox) { if (inbox) {
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' + var textMessage = message.msg;
'<p class="nameCommChat">ВЫ</p> <span>Сейчас</span></div>' + var classMessage = 'youChat';
'<p class="textCommChat">' + message.msg + '</p></div>'; var senderName = 'Вы';
var timeMessage = message.msg_time;
if (message.sender_id != userId){
senderName = message.sender_name;
classMessage = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat '+ classMessage +'"><div class="topCommChat">' +
'<p class="nameCommChat">'+ senderName +'</p> <span>' + timeMessage + '</span></div>' +
'<p class="textCommChat">' + textMessage + '</p></div>';
} }
}; };

@ -1,4 +1,4 @@
import os.path import html
from tornado import gen, web, websocket, escape, options from tornado import gen, web, websocket, escape, options
from tornado.ioloop import IOLoop from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer from tornado.httpserver import HTTPServer
@ -33,7 +33,6 @@ class ChatHandler(websocket.WebSocketHandler):
if 'dummy' in parsed: if 'dummy' in parsed:
return return
print(parsed['format_type'])
if 'approve_stages' in parsed['format_type']: if 'approve_stages' in parsed['format_type']:
self.approve_stages(parsed) self.approve_stages(parsed)
else: else:
@ -60,6 +59,8 @@ class ChatHandler(websocket.WebSocketHandler):
order_id = message_data['data'].get('order_id', None) order_id = message_data['data'].get('order_id', None)
team_id = message_data['data'].get('team_id', None) team_id = message_data['data'].get('team_id', None)
message = message_data['data'].get('chat_message', None) message = message_data['data'].get('chat_message', None)
message = html.escape(message)
message = message.replace('\n', '<br />')
answer_type = message_data['format_type'] answer_type = message_data['format_type']
private_type = 'true' if not order_id and not team_id else 'false' 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," \ insert_sql = "INSERT INTO chat_message (id,text,created, sender_id,recipent_id," \
" private_type,team_id, order_id,is_delete,is_new) " \ " 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) format(message, sender_id, recipent_id, private_type, team_value,order_value, is_delete, is_new)
yield self.db.execute(insert_sql) cursor_list = yield dict(cursor=self.db.execute(insert_sql))
waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id) 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: 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): def check_origin(self, origin):
return True return True

@ -1,3 +1,4 @@
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from .models import Message, Notes, Documents from .models import Message, Notes, Documents
@ -20,6 +21,7 @@ class DocumentsSerializer(ModelSerializer):
class MessageSerializer(ModelSerializer): class MessageSerializer(ModelSerializer):
sender = UserSerializer() sender = UserSerializer()
recipent = UserSerializer() recipent = UserSerializer()
created = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
class Meta: class Meta:
model = Message model = Message

@ -72,7 +72,7 @@
</span> </span>
</div> </div>
<a id="contact-chat-add-message" href="javascript:void(0)">отправить</a> <a id="contact-chat-add-message" href="#">отправить</a>
</div> </div>
</form> </form>
@ -108,7 +108,7 @@
<p class="pOB"> <p class="pOB">
<span>Испонитель:</span> {{ order.order.contractor.get_full_name }} <span>Испонитель:</span> {{ order.order.contractor.get_full_name }}
</p> </p>
<a href="javascript:void(0)" class="linkChat11"> <a href="#" class="linkChat11">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа Полное описание заказа
</a> </a>
@ -134,7 +134,7 @@
Не более 10 файлов с общим объемом 500мб Не более 10 файлов с общим объемом 500мб
</span> </span>
</div> </div>
<a href="javascript:void(0)" id="order-chat-add-message">отправить</a> <a href="#" id="order-chat-add-message">отправить</a>
</div> </div>
</form> </form>
@ -448,18 +448,7 @@
} }
ii--; 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 () { $('.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 chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val(); var recipentId = $("#recipentId").val();
var senderId = $("#senderId").val(); var senderId = $("#senderId").val();
@ -566,7 +556,8 @@
alert('add review'); 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 chatMessage = $("#chat-order-add #chat").val();
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();

@ -580,9 +580,15 @@
</a> </a>
{% endif %} {% endif %}
<a href="{% url 'chat:chat-user' %}" class="candLink candLink2"> {% if not project.order.contractor and not project.order.team %}
предложить проект <form action="{% url 'projects:customer-offer-order' answer_id=answer.pk project_id=project.pk %}" method="POST" novalidate>
</a> {% csrf_token %}
<a href="#" onclick="$(this).closest('form').submit(); return false" class="candLink candLink2">
предложить проект
</a>
</form>
{% endif %}
<form action="{% url 'projects:reject-project-answer' pk=answer.pk %}" method="POST" novalidate> <form action="{% url 'projects:reject-project-answer' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %} {% csrf_token %}
@ -728,9 +734,15 @@
</div> </div>
<div class="col-lg-3 retts"> <div class="col-lg-3 retts">
<a href="{% url 'chat:chat-user' %}" class="candLink candLink2"> {% if not project.order.contractor and not project.order.team %}
предложить проект <form action="{% url 'projects:customer-offer-order' answer_id=answer.pk project_id=project.pk %}" method="POST" novalidate>
</a> {% csrf_token %}
<a href="#" onclick="$(this).closest('form').submit(); return false" class="candLink candLink2">
предложить проект
</a>
</form>
{% endif %}
<form action="{% url 'projects:reject-project-answer' pk=answer.pk %}" method="POST" novalidate> <form action="{% url 'projects:reject-project-answer' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %} {% csrf_token %}

@ -47,7 +47,7 @@ urlpatterns = [
urls.url(r'^candidate/comparison/sort/$', sort_candidates, name='comparison-sort'), urls.url(r'^candidate/comparison/sort/$', sort_candidates, name='comparison-sort'),
urls.url(r'^candidate/comparison/(?P<pk>\d+)/$', ProjectComparisonView.as_view(), name='comparison'), urls.url(r'^candidate/comparison/(?P<pk>\d+)/$', ProjectComparisonView.as_view(), name='comparison'),
urls.url(r'^offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'), urls.url(r'^offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='customer-offer-order'),
# urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'), # urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'),
] ]

@ -1,4 +1,5 @@
from django.conf import settings from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
@ -9,7 +10,7 @@ from django.db.models import Q, F
from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404 from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView, DetailView, CreateView, DeleteView, View, UpdateView, TemplateView, FormView from django.views.generic import ListView, DetailView, CreateView, DeleteView, View, UpdateView, TemplateView, FormView
from django.views.generic.base import ContextMixin
from hitcount.models import HitCount from hitcount.models import HitCount
from hitcount.views import HitCountMixin from hitcount.views import HitCountMixin
from pprint import pprint, pformat from pprint import pprint, pformat
@ -328,7 +329,7 @@ class CustomerProjectCreateView(BaseMixin, View):
if request.user.is_authenticated() and request.user.is_customer(): if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden() raise PermissionDenied
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
form = self.form_class(request=request) form = self.form_class(request=request)
@ -604,6 +605,7 @@ class CandidateDeleteView(DeleteView):
def get(self, *args, **kwargs): def get(self, *args, **kwargs):
return self.post(*args, **kwargs) return self.post(*args, **kwargs)
def sort_candidates(request): def sort_candidates(request):
if request.is_ajax(): if request.is_ajax():
items = request.POST.getlist('items[]') items = request.POST.getlist('items[]')
@ -623,8 +625,29 @@ def sort_candidates(request):
class OfferOrderView(View): class OfferOrderView(View):
template_name = 'chattest.html' template_name = 'chattest.html'
def get(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
return render(request, self.template_name) project_id = kwargs.get('project_id')
answer_id = kwargs.get('answer_id')
try:
project = Project.objects.get(pk=project_id)
except Project.DoesNotExist:
project = None
try:
answer = Answer.objects.get(pk=answer_id)
except Answer.DoesNotExist:
answer = None
order = project.order
if not order.contractor and not order.team:
if isinstance(answer.author, User):
order.contractor = answer.author
order.save()
elif isinstance(answer.author, Team):
order.team = answer.author
order.save()
redirect_url = reverse('chat:chat-user') + '?order_id=' + str(order.pk)
return HttpResponseRedirect(redirect_url)
def contractor_portfolio_create(request): def contractor_portfolio_create(request):

@ -1,12 +1,12 @@
<ul class="rettList {{ class_name }}"> <ul class="rettList {{ class_name }}">
<li>Рейтинг: <span> {{ ratings }}</span></li> <li>Рейтинг: <span> {{ ratings }}</span></li>
<li>Безопасные сделки: <span> 0</span></li> <li>Безопасные сделки: <span> {{ deals }}</span></li> {# TODO #}
<li> <li>
<a href="javascript:void(0)"> <a href="javascript:void(0)">
Отзывы: Отзывы:
<span> + 0</span> <span> + {{ reviews_p }}</span>
<small> 0</small> <small> {{ reviews_n }}</small>
<mark> - 0</mark> <mark> - {{ reviews_m }}</mark>
</a> </a>
</li> </li>
</ul> </ul>

@ -1,38 +1,3 @@
{#<!-- Новая вёрстка ---------------------------------------------------->#}
{##}
{# <div class="dashedCol4 dashedCol44">#}
{# <p class="specUser">#}
{# Специализации:#}
{# </p>#}
{# <div class="insetSpec">#}
{# <span>Интерьеры</span>#}
{# <span>2-й</span>#}
{# </div>#}
{# <div class="insetSpec">#}
{# <span>Визуализация/3D</span>#}
{# <span>45-й</span>#}
{# </div>#}
{# <div class="insetSpec">#}
{# <span>Экстерьеры</span>#}
{# <span>10-й</span>#}
{# </div>#}
{# <div class="showSpec">#}
{# <div class="insetSpec">#}
{# <span>Архитектура</span>#}
{# <span>3-й</span>#}
{# </div>#}
{# <div class="insetSpec">#}
{# <span>3D Моделирование</span>#}
{# <span>100-й</span>#}
{# </div>#}
{# </div>#}
{# <button class="showPress">#}
{# #}
{# </button>#}
{# </div>#}
<div class="dashedCol4"> <div class="dashedCol4">
<p class="specUser">Специализации:</p> <p class="specUser">Специализации:</p>
{% for spec in specializations %} {% for spec in specializations %}
@ -40,5 +5,7 @@
<span>{{ spec.specialization.name }}</span> <span>{{ spec.specialization.name }}</span>
<span>{{ spec.position }}-й</span> <span>{{ spec.position }}-й</span>
</div> </div>
{% empty %}
Рейтинги скоро будут рассчитаны
{% endfor %} {% endfor %}
</div> </div>

@ -1,11 +1,13 @@
from django import template from django import template
from archilance import util from projects.models import Order
from users.models import User, Team
from ratings.models import SpecializationRating from ratings.models import SpecializationRating
from reviews.models import Review
from users.models import User, Team
register = template.Library() register = template.Library()
@register.inclusion_tag('templatetags/specializations_widget.html', takes_context=True) @register.inclusion_tag('templatetags/specializations_widget.html', takes_context=True)
def specialization_widget(context, user_id, class_name=None): def specialization_widget(context, user_id, class_name=None):
user_id = int(user_id) user_id = int(user_id)
@ -25,18 +27,26 @@ def specialization_team_widget(context, team_id):
} }
@register.inclusion_tag("templatetags/ratings_widget.html", takes_context=True) @register.inclusion_tag("templatetags/ratings_widget.html", takes_context=True)
def ratings_widget(context, user_id, class_name=None): def ratings_widget(context, user_id, class_name=None):
ratings = User.objects.get(pk=user_id).rating ratings = User.objects.get(pk=user_id).rating
return { return {
'ratings': ratings, 'ratings': ratings,
'class_name': class_name 'class_name': class_name,
'deals': Order.objects.filter(secure=True, contractor_id=user_id, status=1).count(),
'reviews_n': Review.objects.filter(target_contractor_id=user_id, type='neutral').count(),
'reviews_m': Review.objects.filter(target_contractor_id=user_id, type='negative').count(),
'reviews_p': Review.objects.filter(target_contractor_id=user_id, type='positive').count(),
} }
@register.inclusion_tag("templatetags/ratings_widget.html", takes_context=True) @register.inclusion_tag("templatetags/ratings_widget.html", takes_context=True)
def ratings_team_widget(context, team_id): def ratings_team_widget(context, team_id):
ratings = Team.objects.get(pk=team_id).rating ratings = Team.objects.get(pk=team_id).rating
return { return {
'ratings': ratings, 'ratings': ratings,
'deals': Order.objects.filter(secure=True, team_id=team_id, status=1).count(),
'reviews_n': Review.objects.filter(target_team_id=team_id, type='neutral').count(),
'reviews_m': Review.objects.filter(target_team_id=team_id, type='negative').count(),
'reviews_p': Review.objects.filter(target_team_id=team_id, type='positive').count(),
} }

@ -1,5 +1,4 @@
from django.http import HttpResponseForbidden from django.core.exceptions import PermissionDenied
from django.contrib import messages
class CheckForUserMixin(object): class CheckForUserMixin(object):
@ -8,9 +7,9 @@ class CheckForUserMixin(object):
pk = kwargs.get('pk') pk = kwargs.get('pk')
if pk: if pk:
if request.user.pk != int(pk): if request.user.pk != int(pk):
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)

@ -91,7 +91,8 @@
<span>Программист</span> <span>Программист</span>
</div> </div>
{% empty %}
В группе пока нет участников
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
@ -176,15 +177,19 @@
</div> </div>
</div> </div>
</div> </div>
{% empty %}
<div class="col-lg-12">
<p style="text-align: center;margin-top: 25px;">Работ в портфолио пока нет</p>
</div>
{% endfor %} {% endfor %}
</div> </div>
{# TODO:#}
<div class="col-lg-9 col-lg-offset-3"> {# <div class="col-lg-9 col-lg-offset-3">#}
<div class="linkElse"> {# <div class="linkElse">#}
<a href="javascript:void(0)" class="showElse">показать еще</a> {# <a href="javascript:void(0)" class="showElse">показать еще</a>#}
</div> {# </div>#}
</div> {# </div>#}
</div> </div>
<div id="tab12" class="tab-pane fade"> <div id="tab12" class="tab-pane fade">
@ -208,38 +213,45 @@
</div> </div>
</div> </div>
{% empty %}
<div class="col-lg-12">
<p style="text-align: center;margin-top: 25px;">Готовых работ пока нет</p>
</div>
{% endfor %} {% endfor %}
</div> </div>
<div class="col-lg-9 col-lg-offset-3"> {# TODO#}
<div class="linkElse"> {# <div class="col-lg-9 col-lg-offset-3">#}
<a href="javascript:void(0)" class="showElse">показать еще</a> {# <div class="linkElse">#}
</div> {# <a href="javascript:void(0)" class="showElse">показать еще</a>#}
</div> {# </div>#}
{# </div>#}
</div> </div>
<div id="tab13" class="tab-pane fade"> <div id="tab13" class="tab-pane fade">
{% for review in reviews %}
<div class="new-comm-44"> <div class="new-comm-44">
<div class="col-lg-12"> <div class="col-lg-12">
<p class="nameComm"> <p class="nameComm">
<a href="#">Иванов Петр Иванович</a> <a href="">{{ review.get_sender }}</a>
</p> </p>
<span class="dateComm44"> {% if review.project.deal_type == 'secure_deal' %}
Безопасная сделка <span class="dateComm44">
</span> Безопасная сделка
</span>
{% endif %}
<div class="stars box-sizing"> <div class="stars box-sizing">
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
<a href="#">положительный отзыв</a> <a href="#">положительный отзыв</a>
</div> </div>
<p class="textComm44"> <p class="textComm44">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum {{ review.text|safe }}
</p> </p>
</div> </div>
</div> </div>
{% empty %}
<div class="new-comm-44">
<p style="text-align: center;">Отзывов пока нет</p>
</div>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>

@ -196,7 +196,12 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% empty %}
<div class="col-lg-4">
<p style="text-align: center;">Работ в портфолио пока нет</p>
</div>
{% endfor %} {% endfor %}
</div> </div>
<div class="col-lg-9 col-lg-offset-3"> <div class="col-lg-9 col-lg-offset-3">
@ -455,6 +460,10 @@
</p> </p>
</div> </div>
</div> </div>
{% empty %}
<div class="new-comm-44">
<p style="text-align: center;">Отзывов пока нет</p>
</div>
{% endfor %} {% endfor %}
</div> </div>
</div> </div>

@ -375,6 +375,7 @@ class ContractorOfficeDetailView(DetailView):
work_sells = WorkSell.objects.filter(contractor__in=user_ids) work_sells = WorkSell.objects.filter(contractor__in=user_ids)
context['portfolios'] = portfolios context['portfolios'] = portfolios
context['work_sells'] = work_sells context['work_sells'] = work_sells
context['reviews'] = Review.objects.filter(target_contractor__in=user_ids)
return context return context

@ -43,6 +43,7 @@ class TmpPaymentAvisoForm(forms.Form):
md5 = forms.CharField() md5 = forms.CharField()
shopId = forms.IntegerField() shopId = forms.IntegerField()
invoiceId = forms.IntegerField() invoiceId = forms.IntegerField()
orderSumAmount = forms.DecimalField()
def clean_action(self): def clean_action(self):
action = self.cleaned_data.get('action') action = self.cleaned_data.get('action')

@ -22,7 +22,7 @@ def send_for_accountant(sender, instance, created, **kwargs):
@receiver(post_save, sender=Transaction) @receiver(post_save, sender=Transaction)
def add_invoice_history(sender, instance, created, **kwargs): def add_invoice_history(sender, instance, created, **kwargs):
if 'add' in instance.type: if 'add' in instance.type and instance.complete:
inv_history = InvoiceHistory() inv_history = InvoiceHistory()
inv_history.comment = 'Пополнение счета' inv_history.comment = 'Пополнение счета'
inv_history.sum = instance.sum inv_history.sum = instance.sum

@ -23,7 +23,7 @@
{% endif %} {% endif %}
<div class="col-lg-6"> <div class="col-lg-6">
<a href="javascript:void(0)" data-toggle="modal" data-target="#withdraw-money" <a href="#" data-toggle="modal" data-target="#withdraw-money"
class="linkS linkS2">вывести средства</a> class="linkS linkS2">вывести средства</a>
</div> </div>
@ -75,15 +75,14 @@
<div class="modal-body"> <div class="modal-body">
<div style="height: 150px;"> <div style="height: 150px;">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Кол-во денег {{ YANDEX_MONEY.scid }}</p> <p>Кол-во денег</p>
<input type="text" name="sum"> <input type="text" name="sum">
<p>shopId: <input type='hidden' name='shopId' value='{{ YANDEX_MONEY.shop_id }}'></p> <input type='hidden' name='shopId' value='{{ YANDEX_MONEY.shop_id }}'>
<p>scid: <input type='hidden' name='scid' value='{{ YANDEX_MONEY.scid }}'></p> <input type='hidden' name='scid' value='{{ YANDEX_MONEY.scid }}'>
<p>customerNumber: <input type='hidden' name='customerNumber' value='{{ user_score.pk }}'></p> <input type='hidden' name='customerNumber' value='{{ user_score.pk }}'>
<p>paymentType: <input type='hidden' name='paymentType' value='AC'></p> <input type='hidden' name='paymentType' value='AC'>
<input type='hidden' name='transactionId' value='{{ transaction.pk }}'>
<p>transactionId: <input type='hidden' name='transactionId' value='{{ transaction.pk }}'></p>
</div> </div>
</div> </div>
@ -91,7 +90,7 @@
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button> <button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button>
<button type="submit" class="btn btn-primary">Вывести</button> <button type="submit" class="btn btn-primary">Пополнить</button>
</div> </div>
</form> </form>

@ -1,27 +1,25 @@
from django.conf import urls, settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Sum 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.shortcuts import render, get_object_or_404
from django.utils import timezone from django.utils import timezone
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.views.generic import DetailView, CreateView from django.views.generic import DetailView, CreateView
from django.views.generic.base import View 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 .forms import WithDrawForm, TmpCheckOrderForm, TmpPaymentAvisoForm
from .models import InvoiceHistory, WithDraw, Transaction from .models import InvoiceHistory, WithDraw, Transaction
from users.mixins import CheckForUserMixin
from users.models import User
class ScoreDetailView(DetailView): class ScoreDetailView(DetailView):
model = User model = User
template_name = 'score-detail.html' template_name = 'score-detail.html'
context_object_name = 'user_score' context_object_name = 'user_score'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
user_score_balance = InvoiceHistory.objects.filter(user=self.get_object()).aggregate(Sum('sum')) user_score_balance = InvoiceHistory.objects.filter(user=self.get_object()).aggregate(Sum('sum'))
@ -30,23 +28,20 @@ class ScoreDetailView(DetailView):
return context return context
class ScoreView(View): class ScoreView(LoginRequiredMixin, View):
template_name = 'score-detail.html' template_name = 'score-detail.html'
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs)
else:
return HttpResponseForbidden('403 Forbidden')
def get(self, request, *args, **kwargs): 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')
user_score = get_object_or_404(User.customer_objects, pk=kwargs.get('pk')) 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, { return render(request, self.template_name, {
'transaction': transaction, 'transaction': transaction,
'YANDEX_MONEY': settings.YANDEX_MONEY, 'YANDEX_MONEY': settings.YANDEX_MONEY,
'user_score': user_score, 'user_score': user_score,
'user_score_balance': user_score_balance,
}) })
@ -98,23 +93,22 @@ class WithDrawCreate(CreateView):
return super().form_invalid(form) return super().form_invalid(form)
# Yandex Money ------------------------------------------------ # Yandex Money ------------------------------------------------
class TmpCheckOrderView(View): class TmpCheckOrderView(View):
form_class = TmpCheckOrderForm form_class = TmpCheckOrderForm
@method_decorator(csrf_exempt) @method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
form = self.form_class(request.POST) form = self.form_class(request.POST)
# trans = form.cleaned_data.get('transaction') # trans = form.cleaned_data.get('transaction')
if form.is_valid(): if form.is_valid():
res = """<?xml version="1.0" encoding="utf-8"?> res = """<?xml version="1.0" encoding="utf-8"?>
<checkOrderResponse <checkOrderResponse
@ -127,7 +121,7 @@ class TmpCheckOrderView(View):
invoice_id=form.cleaned_data.get('invoiceId'), invoice_id=form.cleaned_data.get('invoiceId'),
shop_id=form.cleaned_data.get('shopId'), shop_id=form.cleaned_data.get('shopId'),
) )
return HttpResponse(res, content_type='application/xml') return HttpResponse(res, content_type='application/xml')
else: else:
res = """<?xml version="1.0" encoding="utf-8"?> res = """<?xml version="1.0" encoding="utf-8"?>
@ -143,22 +137,27 @@ class TmpCheckOrderView(View):
invoice_id=form.cleaned_data.get('invoiceId'), invoice_id=form.cleaned_data.get('invoiceId'),
shop_id=form.cleaned_data.get('shopId'), shop_id=form.cleaned_data.get('shopId'),
) )
return HttpResponse(res, content_type='application/xml') return HttpResponse(res, content_type='application/xml')
# return HttpResponse('<pre>{msg}</pre>'.format(msg=pformat(form.errors))) # Debug # return HttpResponse('<pre>{msg}</pre>'.format(msg=pformat(form.errors))) # Debug
class TmpPaymentAvisoView(View): class TmpPaymentAvisoView(View):
form_class = TmpPaymentAvisoForm form_class = TmpPaymentAvisoForm
@method_decorator(csrf_exempt) @method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
form = self.form_class(request.POST) form = self.form_class(request.POST)
if form.is_valid(): if form.is_valid():
transaction = form.cleaned_data.get('transaction_id')
transaction.complete = True
transaction.sum = form.cleaned_data.get('orderSumAmount')
transaction.save()
res = """<?xml version="1.0" encoding="utf-8"?> res = """<?xml version="1.0" encoding="utf-8"?>
<paymentAvisoResponse <paymentAvisoResponse
performedDatetime="{date}" performedDatetime="{date}"
@ -170,7 +169,7 @@ class TmpPaymentAvisoView(View):
invoice_id=form.cleaned_data.get('invoiceId'), invoice_id=form.cleaned_data.get('invoiceId'),
shop_id=form.cleaned_data.get('shopId'), shop_id=form.cleaned_data.get('shopId'),
) )
return HttpResponse(res, content_type='application/xml') return HttpResponse(res, content_type='application/xml')
else: else:
res = """<?xml version="1.0" encoding="utf-8"?> res = """<?xml version="1.0" encoding="utf-8"?>
@ -180,6 +179,6 @@ class TmpPaymentAvisoView(View):
message="Payment aviso, validation error" message="Payment aviso, validation error"
techMessage="Payment aviso, validation error"/> techMessage="Payment aviso, validation error"/>
""".format(date=timezone.now().isoformat()) """.format(date=timezone.now().isoformat())
return HttpResponse(res, content_type='application/xml') return HttpResponse(res, content_type='application/xml')
# return HttpResponse('<pre>{msg}</pre>'.format(msg=pformat(form.errors))) # Debug # return HttpResponse('<pre>{msg}</pre>'.format(msg=pformat(form.errors))) # Debug

Loading…
Cancel
Save