From c812f5918d18e9bbe11bf0c0e9c0cfe9a95f5e03 Mon Sep 17 00:00:00 2001 From: Mukhtar Date: Mon, 22 Aug 2016 21:16:49 +0300 Subject: [PATCH] #ARC-52 Add 403.html, 404.html, 500.html --- archilance/settings/dev.py | 1 - chat/app.py | 64 -------------- chat/app2.py | 102 ---------------------- chat/apps.py | 5 -- chat/chat.py | 10 ++- chat/migrations/0006_message_is_delete.py | 20 +++++ chat/models.py | 1 + chat/templates/chat.js | 74 ---------------- chat/templates/chat1.js | 75 ---------------- chat/templates/chat2.js | 68 --------------- chat/templates/chat_contractor.html | 18 ++-- chat/views.py | 7 +- projects/templates/project_detail.html | 19 ++-- projects/views.py | 2 +- templates/403.html | 14 +++ templates/404.html | 14 +++ templates/500.html | 15 ++++ users/views.py | 2 +- wallets/admin.py | 3 +- wallets/signals.py | 2 +- wallets/templates/score-detail.html | 2 +- wallets/views.py | 2 +- 22 files changed, 101 insertions(+), 419 deletions(-) delete mode 100644 chat/app.py delete mode 100644 chat/app2.py delete mode 100644 chat/apps.py create mode 100644 chat/migrations/0006_message_is_delete.py delete mode 100644 chat/templates/chat.js delete mode 100644 chat/templates/chat1.js delete mode 100644 chat/templates/chat2.js create mode 100644 templates/403.html create mode 100644 templates/404.html create mode 100644 templates/500.html diff --git a/archilance/settings/dev.py b/archilance/settings/dev.py index 9603670..a3da647 100644 --- a/archilance/settings/dev.py +++ b/archilance/settings/dev.py @@ -3,7 +3,6 @@ from .base import * # AUTH_PASSWORD_VALIDATORS = [] # INSTALLED_APPS += ['debug_toolbar',] - try: from .local import * except ImportError: diff --git a/chat/app.py b/chat/app.py deleted file mode 100644 index dedfad5..0000000 --- a/chat/app.py +++ /dev/null @@ -1,64 +0,0 @@ -from tornado import web, ioloop, options, websocket -import os.path - -clients = [] -messages = [] - -class Application(web.Application): - def __init__(self): - handlers = [ - (r"/", MainHandler), - (r"/chat", ChatHandler), - ] - settings = dict( - cookie_secret="tes12323hhdfdfre9312313", - template_path=os.path.join(os.path.dirname(__file__), "templates"), - static_path=os.path.join(os.path.dirname(__file__), "static"), - xsrf_cookies=True, - ) - super().__init__(handlers, **settings) - - -class MainHandler(web.RequestHandler): - - def get(self): - self.render("index.html") - - -class ChatHandler(websocket.WebSocketHandler): - - def open(self): - print("Web socket opened") - clients.append(self) - - def on_message(self, message): - messages.append({'msg':message}) - for msg in messages: - self.write_message(msg) - - def check_origin(self, origin): - return True - - -def main(): - options.parse_command_line() - app = Application() - app.listen(8888) - ioloop.IOLoop.current().start() - - - -if __name__ == '__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'}) diff --git a/chat/app2.py b/chat/app2.py deleted file mode 100644 index 96ede4c..0000000 --- a/chat/app2.py +++ /dev/null @@ -1,102 +0,0 @@ -import logging -import datetime -import os.path -from redis import StrictRedis -from tornado import web, websocket, escape, options, locale, ioloop -from tornado.httpserver import HTTPServer - -r = StrictRedis(db=1) - -logger = logging.getLogger('handlers') - -settings = { - 'cookie_secret': '__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__', - 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), - 'static_path': os.path.join(os.path.dirname(__file__), 'static'), - 'login_url': '/login', - 'xsrf_cookies': True, - 'debug': True, - 'autoreload': True, - 'server_traceback': True, -} - - -class Application(web.Application): - def __init__(self): - handlers = [ - (r"/",ChannelHandler), - (r"/chatsocket/(?P\w+)/", ChatSocketHandler) - ] - super().__init__(handlers=handlers, **settings) - - -class ChannelHandler(web.RequestHandler): - def get(self, *args, **kwargs): - title = kwargs.get('channel', 'main') - self.chnl = kwargs.get('channel', 'main') - cache = r.lrange('channels:{}'.format(title), 0, -1) - messages =(escape.json_decode(x) for x in cache) if cache else [] - print(messages) - - self.render('index2.html',messages=messages) - - -class ChatSocketHandler(websocket.WebSocketHandler): - - waiters = set() - - def open(self, *args, **kwargs): - self.chnl = kwargs.get('channel', 'main') - self.waiters.add((self.chnl, self)) - # self.chnl_key = 'channels:{}:users'.format(self.chnl) - # count = int(r.zcard(self.chnl_key)) - # r.zadd(self.chnl_key, count+1, "mukhtar") - # users = r.zrange(self.chnl_key,0,-1) - # self.send_updates() - - def on_close(self): - self.waiters.remove(self.chnl, self) - - def on_message(self, message): - parsed = escape.json_decode(message) - if 'dummy' in parsed: - return - - chat = { - 'parent': 'inbox', - 'body': parsed['message'], - 'user': 'Mukhtar', - 'time': datetime.datetime.now().strftime('%H:%M:%S %Y-%m-%d') - } - self.update_channel_history(chat) - self.send_updates(parsed); - - def update_channel_history(self,chat): - chnl = 'channels:{}'.format(self.chnl) - r.rpush(chnl, escape.json_encode(chat)) - r.ltrim(chnl, -25, -1) - - def send_updates(self, chat): - chnl_waiters = tuple(w for c, w in self.waiters) - for waiter in chnl_waiters: - try: - waiter.write_message(chat) - except: - pass - - def __del__(self): - r.zrem(self.chnl_key, self.current_user) - self.log('PUSHED OUT') - - -def main(): - options.parse_command_line() - app = Application() - server = HTTPServer(app) - server.listen(8888) - loop = ioloop.IOLoop.current() - loop.start() - - -if __name__ == '__main__': - main() diff --git a/chat/apps.py b/chat/apps.py deleted file mode 100644 index 8ebb9f0..0000000 --- a/chat/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class ChatConfig(AppConfig): - name = 'chat' diff --git a/chat/chat.py b/chat/chat.py index bc54fe1..2645140 100644 --- a/chat/chat.py +++ b/chat/chat.py @@ -64,12 +64,18 @@ class ChatHandler(websocket.WebSocketHandler): answer_type = message_data['format_type'] private_type = 'true' if not order_id and not team_id else 'false' is_new = 'true' + is_delete = 'false' team_value = "NULL" if team_id is None else team_id + if team_value and not recipent_id: + recipent_id = sender_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,is_new) " \ - "VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5},{6})".format(message, sender_id, recipent_id, private_type, team_value,order_value,is_new) + 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})".\ + 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) diff --git a/chat/migrations/0006_message_is_delete.py b/chat/migrations/0006_message_is_delete.py new file mode 100644 index 0000000..85d773c --- /dev/null +++ b/chat/migrations/0006_message_is_delete.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-22 16:24 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('chat', '0005_message_is_new'), + ] + + operations = [ + migrations.AddField( + model_name='message', + name='is_delete', + field=models.BooleanField(default=False), + ), + ] diff --git a/chat/models.py b/chat/models.py index dbd9eb2..04333f5 100644 --- a/chat/models.py +++ b/chat/models.py @@ -13,6 +13,7 @@ class Message(models.Model): recipent = models.ForeignKey(User, related_name='recipent_messages') private_type = models.BooleanField(default=False) team = models.ForeignKey(Team, related_name='messages', null=True, blank=True) + is_delete = models.BooleanField(default=False) is_new = models.BooleanField(default=True) def __str__(self): diff --git a/chat/templates/chat.js b/chat/templates/chat.js deleted file mode 100644 index d7f0942..0000000 --- a/chat/templates/chat.js +++ /dev/null @@ -1,74 +0,0 @@ -var SocketHandler = function () { - - domain = domain.replace(':' + port, ''); - var url = 'ws://' + domain + ':8888/chat/' + userId + '/'; - var sock = new WebSocket(url); - var intervalId; - sock.onopen = function () { - console.log("Start connect"); - intervalId = setInterval(function () { - sock.send('{"dummy": 1}'); - }, 150000); - }; - sock.onmessage = function (event) { - console.log(event.data); - var message = JSON.parse(event.data); - var inbox; - if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') { - inbox = document.getElementById('message-chat-space'); - } else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') { - inbox = document.getElementById('message-chat-order-space'); - } else if (message.answer_type == 'add_message_team') { - inbox = document.getElementById('message-chat-team-space'); - } - inbox.innerHTML += '
' + - '

ВЫ

Сейчас
' + - '

' + message.msg + '

'; - - }; - - 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_team_message = function (messageData) { - - console.log(messageData); - sock.send(JSON.stringify(messageData)); - } - - 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 = ""; - } - -} - diff --git a/chat/templates/chat1.js b/chat/templates/chat1.js deleted file mode 100644 index de9b61d..0000000 --- a/chat/templates/chat1.js +++ /dev/null @@ -1,75 +0,0 @@ -var SocketHandler = function () { - var userId = {{ request.user.pk }}; - var domain = '{{ request.META.HTTP_HOST }}'; - var port = '{{ request.META.SERVER_PORT }}'; - domain = domain.replace(':' + port, ''); - var url = 'ws://' + domain + ':8888/chat/' + userId + '/'; - var sock = new WebSocket(url); - var intervalId; - sock.onopen = function () { - console.log("Start connect"); - intervalId = setInterval(function () { - sock.send('{"dummy": 1}'); - }, 150000); - }; - sock.onmessage = function (event) { - console.log(event.data); - var message = JSON.parse(event.data); - var inbox; - if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') { - inbox = document.getElementById('message-chat-space'); - } else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') { - inbox = document.getElementById('message-chat-order-space'); - } else if (message.answer_type == 'add_message_team') { - inbox = document.getElementById('message-chat-team-space'); - } - inbox.innerHTML += '
' + - '

ВЫ

Сейчас
' + - '

' + message.msg + '

'; - - }; - - 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_team_message = function (messageData) { - - console.log(messageData); - sock.send(JSON.stringify(messageData)); - } - - 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 = ""; - } - - } diff --git a/chat/templates/chat2.js b/chat/templates/chat2.js deleted file mode 100644 index 6283706..0000000 --- a/chat/templates/chat2.js +++ /dev/null @@ -1,68 +0,0 @@ -var SocketHandler = function () { - var domain = '{{ request.META.HTTP_HOST }}'; - var port = '{{ request.META.SERVER_PORT }}'; - domain = domain.replace(':' + port, ''); - var url = 'ws://' + domain + ':8888/chat/' + userId + '/'; - var sock = new WebSocket(url); - var intervalId; - sock.onopen = function () { - console.log("Start connect"); - intervalId = setInterval(function () { - sock.send('{"dummy": 1}'); - }, 150000); - }; - sock.onmessage = function (event) { - console.log(event.data); - var message = JSON.parse(event.data); - var inbox; - if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') { - inbox = document.getElementById('message-chat-space'); - } else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') { - inbox = document.getElementById('message-chat-order-space'); - } else if (message.answer_type == 'add_message_team') { - inbox = document.getElementById('message-chat-team-space'); - } - inbox.innerHTML += '
' + - '

Вы

Сейчас
' + - '

' + message.msg + '

'; - - }; - - 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 = ""; - - } - } diff --git a/chat/templates/chat_contractor.html b/chat/templates/chat_contractor.html index f41dda4..48081e4 100644 --- a/chat/templates/chat_contractor.html +++ b/chat/templates/chat_contractor.html @@ -187,7 +187,6 @@

- {# Заказчик: {{ torder.project.customer }}#} Исполнитель: {{ torder.team.name }}

    @@ -195,10 +194,13 @@
  • {{ tuser }}
  • {% endfor %}
-

Чаты: - {% for tuser in torder.team.users.all %} + {% if request.user.pk != torder.team.owner.pk %} + {{ torder.team.owner.username }}, + {% endif %} + {% for tuser in torder.team.contractors.all %} {% if request.user.pk != tuser.pk %} {{ tuser.username }}, @@ -217,11 +219,11 @@

- - - - - + + + + +
diff --git a/chat/views.py b/chat/views.py index ad0fba5..63fb363 100644 --- a/chat/views.py +++ b/chat/views.py @@ -6,7 +6,8 @@ from django.db.models import Q from django.contrib.auth.mixins import LoginRequiredMixin from .models import Message -from users.models import User +from projects.models import Order +from users.models import User, Team class ChatUserView(LoginRequiredMixin, View): @@ -57,7 +58,9 @@ class ChatUserView(LoginRequiredMixin, View): if request.user.is_owner_team(): team_orders = request.user.team.orders.all() else: - team_orders = [] + teams = Team.objects.filter(contractors__id=request.user.pk).all() + team_orders = Order.objects.filter(team_id__in=[team.pk for team in teams]).all() + # team_orders = [] self.template_name = 'chat_contractor.html' return render(request, self.template_name, {'orders': orders, diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html index 3b793a2..e4d6105 100644 --- a/projects/templates/project_detail.html +++ b/projects/templates/project_detail.html @@ -33,7 +33,7 @@

- {{ project.customer.get_full_name }} [{{ project.customer.username }}] + {{ project.customer.get_full_name }} [{{ project.customer.username }}]

@@ -67,17 +67,12 @@ {% endif %}
-
-

- Специализации: -

-
- Интерьеры -
-
- Визуализация/3D -
-
+ {% specialization_widget contractor.pk %} +{#
#} +{#

#} +{# Специализации:#} +{#

#} +{#
#}
diff --git a/projects/views.py b/projects/views.py index c3364c4..73056ca 100644 --- a/projects/views.py +++ b/projects/views.py @@ -335,7 +335,7 @@ class CustomerProjectCreateView(BaseMixin, View): if request.user.is_authenticated() and request.user.is_customer(): return super().dispatch(request, *args, **kwargs) else: - return HttpResponseForbidden('403 Forbidden') + return HttpResponseForbidden() def get(self, request, *args, **kwargs): form = self.form_class(request=request) diff --git a/templates/403.html b/templates/403.html new file mode 100644 index 0000000..329b00d --- /dev/null +++ b/templates/403.html @@ -0,0 +1,14 @@ +{% extends 'partials/base.html' %} + +{% block content %} +
+ {% include 'partials/header.html' %} +
+
+

Ошибка 403! Доступ ограничен.

+
+
+
+{% endblock %} + + diff --git a/templates/404.html b/templates/404.html new file mode 100644 index 0000000..dc9655b --- /dev/null +++ b/templates/404.html @@ -0,0 +1,14 @@ +{% extends 'partials/base.html' %} + +{% block content %} +
+ {% include 'partials/header.html' %} +
+
+

404 ошибка сайта

+
+
+
+{% endblock %} + + diff --git a/templates/500.html b/templates/500.html new file mode 100644 index 0000000..579b776 --- /dev/null +++ b/templates/500.html @@ -0,0 +1,15 @@ + +{% extends 'partials/base.html' %} + +{% block content %} +
+ {% include 'partials/header.html' %} +
+
+

500 ошибка сервера

+
+
+
+{% endblock %} + + diff --git a/users/views.py b/users/views.py index 4586b7f..5e38009 100644 --- a/users/views.py +++ b/users/views.py @@ -539,7 +539,7 @@ class CustomerProfileCurrentProjectsView(BaseMixin, DetailView): context_object_name = 'customer' -def add_user_in_team(request): +def join_user_in_team(request): pass diff --git a/wallets/admin.py b/wallets/admin.py index b767137..5222dfb 100644 --- a/wallets/admin.py +++ b/wallets/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import InvoiceHistory, WithDraw, Transaction +from .models import InvoiceHistory, WithDraw, Transaction, Wallet class InvoiceHistoryAdmin(admin.ModelAdmin): @@ -18,3 +18,4 @@ class TransactionAdmin(admin.ModelAdmin): admin.site.register(InvoiceHistory, InvoiceHistoryAdmin) admin.site.register(WithDraw, WithDrawAdmin) admin.site.register(Transaction, TransactionAdmin) +admin.site.register(Wallet) diff --git a/wallets/signals.py b/wallets/signals.py index be2fbac..5322e7a 100644 --- a/wallets/signals.py +++ b/wallets/signals.py @@ -26,7 +26,7 @@ def add_invoice_history(sender, instance,created, **kwargs): inv_history = InvoiceHistory() inv_history.comment = 'Пополнение счета' inv_history.sum = instance.sum - inv_history.user = instance.user + inv_history.user = instance.customer inv_history.save() diff --git a/wallets/templates/score-detail.html b/wallets/templates/score-detail.html index 6eb9a50..9a9f2c9 100644 --- a/wallets/templates/score-detail.html +++ b/wallets/templates/score-detail.html @@ -18,7 +18,7 @@ {% if user_score.is_customer %} {% endif %} diff --git a/wallets/views.py b/wallets/views.py index eed87d9..ed0b3ba 100644 --- a/wallets/views.py +++ b/wallets/views.py @@ -17,7 +17,7 @@ from users.mixins import CheckForUserMixin from users.models import User -class ScoreDetailView(CheckForUserMixin, DetailView): +class ScoreDetailView(DetailView): model = User template_name = 'score-detail.html' context_object_name = 'user_score'