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 89cd43b..c4143ab 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_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 }}

-

Чаты: - {% 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 55b9298..263309f 100644 --- a/projects/views.py +++ b/projects/views.py @@ -346,7 +346,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/update.sh b/update.sh index dc25eff..8674d16 100644 --- a/update.sh +++ b/update.sh @@ -1,8 +1,11 @@ #!/usr/bin/env bash source ../env/bin/activate && +pip install -r requirements/base.txt && git reset --hard && git pull && +chmod +x update.sh && ./manage.py migrate --noinput && ./manage.py collectstatic --noinput && -supervisorctl restart arch \ No newline at end of file +supervisorctl restart arch && +./manage.py recalculation_spec \ No newline at end of file diff --git a/users/views.py b/users/views.py index 73166b0..d87e666 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..50d2f08 100644 --- a/wallets/signals.py +++ b/wallets/signals.py @@ -21,12 +21,12 @@ def send_for_accountant(sender, instance, created, **kwargs): @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: 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..3a059d9 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' @@ -40,7 +40,7 @@ class ScoreView(View): return HttpResponseForbidden('403 Forbidden') def get(self, request, *args, **kwargs): - transaction = Transaction.objects.create(customer=request.user) + transaction = Transaction.objects.get_or_create(customer=request.user, complete=False) user_score = get_object_or_404(User.customer_objects, pk=kwargs.get('pk')) return render(request, self.template_name, {