#ARC-52 Add 403.html, 404.html, 500.html

remotes/origin/PR-39
Mukhtar 10 years ago
parent df4695161c
commit c812f5918d
  1. 1
      archilance/settings/dev.py
  2. 64
      chat/app.py
  3. 102
      chat/app2.py
  4. 5
      chat/apps.py
  5. 10
      chat/chat.py
  6. 20
      chat/migrations/0006_message_is_delete.py
  7. 1
      chat/models.py
  8. 74
      chat/templates/chat.js
  9. 75
      chat/templates/chat1.js
  10. 68
      chat/templates/chat2.js
  11. 18
      chat/templates/chat_contractor.html
  12. 7
      chat/views.py
  13. 19
      projects/templates/project_detail.html
  14. 2
      projects/views.py
  15. 14
      templates/403.html
  16. 14
      templates/404.html
  17. 15
      templates/500.html
  18. 2
      users/views.py
  19. 3
      wallets/admin.py
  20. 2
      wallets/signals.py
  21. 2
      wallets/templates/score-detail.html
  22. 2
      wallets/views.py

@ -3,7 +3,6 @@ from .base import *
# AUTH_PASSWORD_VALIDATORS = [] # AUTH_PASSWORD_VALIDATORS = []
# INSTALLED_APPS += ['debug_toolbar',] # INSTALLED_APPS += ['debug_toolbar',]
try: try:
from .local import * from .local import *
except ImportError: except ImportError:

@ -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'})

@ -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<channel>\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()

@ -1,5 +0,0 @@
from django.apps import AppConfig
class ChatConfig(AppConfig):
name = 'chat'

@ -64,12 +64,18 @@ class ChatHandler(websocket.WebSocketHandler):
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'
is_new = 'true' is_new = 'true'
is_delete = 'false'
team_value = "NULL" if team_id is None else team_id 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 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) " \ insert_sql = "INSERT INTO chat_message (id,text,created, sender_id,recipent_id," \
"VALUES (DEFAULT,'{0}',NOW(),{1},{2},{3},{4},{5},{6})".format(message, sender_id, recipent_id, private_type, team_value,order_value,is_new) " 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) yield self.db.execute(insert_sql)
waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id) waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id)

@ -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),
),
]

@ -13,6 +13,7 @@ class Message(models.Model):
recipent = models.ForeignKey(User, related_name='recipent_messages') recipent = models.ForeignKey(User, related_name='recipent_messages')
private_type = models.BooleanField(default=False) private_type = models.BooleanField(default=False)
team = models.ForeignKey(Team, related_name='messages', null=True, blank=True) team = models.ForeignKey(Team, related_name='messages', null=True, blank=True)
is_delete = models.BooleanField(default=False)
is_new = models.BooleanField(default=True) is_new = models.BooleanField(default=True)
def __str__(self): def __str__(self):

@ -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 += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">ВЫ</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
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 = "";
}
}

@ -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 += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">ВЫ</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
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 = "";
}
}

@ -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 += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Вы</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
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 = "";
}
}

@ -187,7 +187,6 @@
</p> </p>
<div class="hideOBB disTab"> <div class="hideOBB disTab">
<p class="pOB"> <p class="pOB">
{# <span>Заказчик:</span> {{ torder.project.customer }}#}
<span>Исполнитель:</span> {{ torder.team.name }} <span>Исполнитель:</span> {{ torder.team.name }}
</p> </p>
<ul class="listChat1"> <ul class="listChat1">
@ -195,10 +194,13 @@
<li>{{ tuser }}</li> <li>{{ tuser }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
<p class="pOB"> <p class="pOB">
<span>Чаты:</span> <span>Чаты:</span>
{% for tuser in torder.team.users.all %} {% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user"
data-id="{{ torder.team.owner.pk}}">{{ torder.team.owner.username }},</span>
{% endif %}
{% for tuser in torder.team.contractors.all %}
{% if request.user.pk != tuser.pk %} {% if request.user.pk != tuser.pk %}
<span class="team-chat-user" <span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }},</span> data-id="{{ tuser.pk }}">{{ tuser.username }},</span>
@ -217,11 +219,11 @@
<div class="col-lg-6 commChat"> <div class="col-lg-6 commChat">
<div id="message-chat-team-space"></div> <div id="message-chat-team-space"></div>
<form id="team-chat-form"> <form id="team-chat-form">
<input type="text" name="sender" id="senderId" value="{{ request.user.pk }}"/> <input type="hidden" name="sender" id="senderId" value="{{ request.user.pk }}"/>
<input type="text" name="recipent" id="recipentId" value=""/> <input type="hidden" name="recipent" id="recipentId" value=""/>
<input type="text" name="order" id="orderId" value=""/> <input type="hidden" name="order" id="orderId" value=""/>
<input type="text" name="team" id="teamId" value=""/> <input type="hidden" name="team" id="teamId" value=""/>
<input type="text" 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>
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing upload"> <div class="setChat box-sizing upload">

@ -6,7 +6,8 @@ from django.db.models import Q
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Message from .models import Message
from users.models import User from projects.models import Order
from users.models import User, Team
class ChatUserView(LoginRequiredMixin, View): class ChatUserView(LoginRequiredMixin, View):
@ -57,7 +58,9 @@ class ChatUserView(LoginRequiredMixin, View):
if request.user.is_owner_team(): if request.user.is_owner_team():
team_orders = request.user.team.orders.all() team_orders = request.user.team.orders.all()
else: 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' self.template_name = 'chat_contractor.html'
return render(request, self.template_name, {'orders': orders, return render(request, self.template_name, {'orders': orders,

@ -33,7 +33,7 @@
</div> </div>
</a> </a>
<p class="nameExecutor"> <p class="nameExecutor">
<a href="#">{{ project.customer.get_full_name }} [{{ project.customer.username }}]</a> <a href="{% url 'users:customer-profile-open-projects' project.customer.pk %}">{{ project.customer.get_full_name }} [{{ project.customer.username }}]</a>
</p> </p>
<p class="navv2">На сайте {{ project.created|naturaltime }}</p> <p class="navv2">На сайте {{ project.created|naturaltime }}</p>
@ -67,17 +67,12 @@
{% endif %} {% endif %}
<div class="col-lg-2 new-dashed"> <div class="col-lg-2 new-dashed">
<div class="dashedCol4 dashedCol44 dashedColColor"> {% specialization_widget contractor.pk %}
<p class="specUser"> {# <div class="dashedCol4 dashedCol44 dashedColColor">#}
Специализации: {# <p class="specUser">#}
</p> {# Специализации:#}
<div class="insetSpec"> {# </p>#}
<span>Интерьеры</span> {# </div>#}
</div>
<div class="insetSpec">
<span>Визуализация/3D</span>
</div>
</div>
</div> </div>
<div class="col-lg-3 retts new-list"> <div class="col-lg-3 retts new-list">

@ -335,7 +335,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('403 Forbidden') return HttpResponseForbidden()
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
form = self.form_class(request=request) form = self.form_class(request=request)

@ -0,0 +1,14 @@
{% extends 'partials/base.html' %}
{% block content %}
<section class="mainContainer">
{% include 'partials/header.html' %}
<div class="container-fluid">
<div class="row">
<p class="welcomeMain">Ошибка 403! Доступ ограничен.</p>
</div>
</div>
</section>
{% endblock %}

@ -0,0 +1,14 @@
{% extends 'partials/base.html' %}
{% block content %}
<section class="mainContainer">
{% include 'partials/header.html' %}
<div class="container-fluid">
<div class="row">
<p class="welcomeMain">404 ошибка сайта</p>
</div>
</div>
</section>
{% endblock %}

@ -0,0 +1,15 @@
{% extends 'partials/base.html' %}
{% block content %}
<section class="mainContainer">
{% include 'partials/header.html' %}
<div class="container-fluid">
<div class="row">
<p class="welcomeMain">500 ошибка сервера</p>
</div>
</div>
</section>
{% endblock %}

@ -539,7 +539,7 @@ class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
context_object_name = 'customer' context_object_name = 'customer'
def add_user_in_team(request): def join_user_in_team(request):
pass pass

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import InvoiceHistory, WithDraw, Transaction from .models import InvoiceHistory, WithDraw, Transaction, Wallet
class InvoiceHistoryAdmin(admin.ModelAdmin): class InvoiceHistoryAdmin(admin.ModelAdmin):
@ -18,3 +18,4 @@ class TransactionAdmin(admin.ModelAdmin):
admin.site.register(InvoiceHistory, InvoiceHistoryAdmin) admin.site.register(InvoiceHistory, InvoiceHistoryAdmin)
admin.site.register(WithDraw, WithDrawAdmin) admin.site.register(WithDraw, WithDrawAdmin)
admin.site.register(Transaction, TransactionAdmin) admin.site.register(Transaction, TransactionAdmin)
admin.site.register(Wallet)

@ -26,7 +26,7 @@ def add_invoice_history(sender, instance,created, **kwargs):
inv_history = InvoiceHistory() inv_history = InvoiceHistory()
inv_history.comment = 'Пополнение счета' inv_history.comment = 'Пополнение счета'
inv_history.sum = instance.sum inv_history.sum = instance.sum
inv_history.user = instance.user inv_history.user = instance.customer
inv_history.save() inv_history.save()

@ -18,7 +18,7 @@
{% if user_score.is_customer %} {% if user_score.is_customer %}
<div class="col-lg-6"> <div class="col-lg-6">
<a href="javascript:void(0)" data-toggle="modal" data-target="#fullfill-balance"class="linkS linkS1">пополнить</a> <a href="#" data-toggle="modal" data-target="#fullfill-balance"class="linkS linkS1">пополнить</a>
</div> </div>
{% endif %} {% endif %}

@ -17,7 +17,7 @@ from users.mixins import CheckForUserMixin
from users.models import User from users.models import User
class ScoreDetailView(CheckForUserMixin, 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'

Loading…
Cancel
Save