parent
d97543382e
commit
813ca37ec1
8 changed files with 304 additions and 23 deletions
@ -1,7 +1,13 @@ |
|||||||
from django.views.generic import TemplateView |
from django.views.generic import TemplateView, View |
||||||
|
from django.shortcuts import render |
||||||
|
from projects.models import Order |
||||||
|
|
||||||
class HomeTemplateView(TemplateView): |
class HomeTemplateView(TemplateView): |
||||||
template_name = 'home.html' |
template_name = 'home.html' |
||||||
|
|
||||||
class TestChatTemplateView(TemplateView): |
class TestChatTemplateView(View): |
||||||
template_name = 'chat_test.html' |
template_name = 'chat_test.html' |
||||||
|
|
||||||
|
def get(self,request,*args,**kwargs): |
||||||
|
order = Order.objects.get(pk=6) |
||||||
|
return render(request, self.template_name, {'order': order}) |
||||||
|
|||||||
@ -0,0 +1,13 @@ |
|||||||
|
from django.views.generic import TemplateView, View |
||||||
|
from django.shortcuts import render |
||||||
|
from projects.models import Order |
||||||
|
|
||||||
|
class HomeTemplateView(TemplateView): |
||||||
|
template_name = 'home.html' |
||||||
|
|
||||||
|
class TestChatTemplateView(View): |
||||||
|
template_name = 'chat_test.html' |
||||||
|
|
||||||
|
def get(self,request,*args,**kwargs): |
||||||
|
order = Order.objects.get(pk=6) |
||||||
|
return render(request, self.template_name, {'order': order}) |
||||||
@ -0,0 +1,39 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
# Generated by Django 1.9.6 on 2016-06-29 16:14 |
||||||
|
from __future__ import unicode_literals |
||||||
|
|
||||||
|
from django.conf import settings |
||||||
|
from django.db import migrations, models |
||||||
|
import django.db.models.deletion |
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration): |
||||||
|
|
||||||
|
dependencies = [ |
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||||
|
('chat', '0002_auto_20160608_1555'), |
||||||
|
] |
||||||
|
|
||||||
|
operations = [ |
||||||
|
migrations.RemoveField( |
||||||
|
model_name='message', |
||||||
|
name='user', |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='message', |
||||||
|
name='recipent', |
||||||
|
field=models.ForeignKey(default=5, on_delete=django.db.models.deletion.CASCADE, related_name='recipent_messages', to=settings.AUTH_USER_MODEL), |
||||||
|
preserve_default=False, |
||||||
|
), |
||||||
|
migrations.AddField( |
||||||
|
model_name='message', |
||||||
|
name='sender', |
||||||
|
field=models.ForeignKey(default=4, on_delete=django.db.models.deletion.CASCADE, related_name='sender_messages', to=settings.AUTH_USER_MODEL), |
||||||
|
preserve_default=False, |
||||||
|
), |
||||||
|
migrations.AlterField( |
||||||
|
model_name='message', |
||||||
|
name='order', |
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='order_messages', to='projects.Order'), |
||||||
|
), |
||||||
|
] |
||||||
@ -0,0 +1,22 @@ |
|||||||
|
from django.db import models |
||||||
|
from django.utils import timezone |
||||||
|
|
||||||
|
from projects.models import Order |
||||||
|
from users.models import User |
||||||
|
|
||||||
|
|
||||||
|
class Message(models.Model): |
||||||
|
text = models.TextField() |
||||||
|
created = models.DateTimeField(default=timezone.now) |
||||||
|
order = models.ForeignKey(Order, related_name='order_messages') |
||||||
|
sender = models.ForeignKey(User, related_name='sender_messages') |
||||||
|
recipent = models.ForeignKey(User, related_name='recipent_messages') |
||||||
|
|
||||||
|
def __str__(self): |
||||||
|
return self.text |
||||||
|
|
||||||
|
class Meta: |
||||||
|
verbose_name = 'Сообщение' |
||||||
|
verbose_name_plural = 'Сообщения' |
||||||
|
|
||||||
|
|
||||||
@ -1,6 +1,97 @@ |
|||||||
|
import os.path |
||||||
|
from tornado import gen, web, websocket, escape, options |
||||||
|
from tornado.ioloop import IOLoop |
||||||
|
from tornado.httpserver import HTTPServer |
||||||
|
from tornado.options import parse_command_line |
||||||
|
|
||||||
import psycopg2 |
import psycopg2 |
||||||
conn = psycopg2.connect(database="archilance", user="postgres", password="postgres", host="localhost") |
import momoko |
||||||
cursor = conn.cursor() |
|
||||||
cursor.execute("SELECT 1") |
|
||||||
rows = cursor.fetchall() |
settings = { |
||||||
print(rows) |
'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 BaseHandler(web.RequestHandler): |
||||||
|
@property |
||||||
|
def db(self): |
||||||
|
return self.application.db |
||||||
|
|
||||||
|
|
||||||
|
class TutorialHandler(websocket.WebSocketHandler): |
||||||
|
|
||||||
|
@property |
||||||
|
def db(self): |
||||||
|
return self.application.db |
||||||
|
|
||||||
|
waiters = set() |
||||||
|
|
||||||
|
def open(self, *args, **kwargs): |
||||||
|
self.waiters.add(self) |
||||||
|
# cursor = self.db.execute("SELECT * FROM users_user WHERE id=2") |
||||||
|
# data = cursor.fetchone() |
||||||
|
print({'hello': 'test'}) |
||||||
|
|
||||||
|
@gen.coroutine |
||||||
|
def on_message(self, message): |
||||||
|
parsed = escape.json_decode(message) |
||||||
|
if 'dummy' in parsed: |
||||||
|
return |
||||||
|
|
||||||
|
insert_sql = "INSERT INTO chat_message (id,text,created,order_id, user_id) VALUES (DEFAULT,'{0}',NOW(),6,4)".format(str(parsed['message'])) |
||||||
|
|
||||||
|
yield self.db.execute(insert_sql) |
||||||
|
|
||||||
|
cursor = yield self.db.execute("SELECT * FROM chat_message") |
||||||
|
data = cursor.fetchall() |
||||||
|
|
||||||
|
for waiter in self.waiters: |
||||||
|
waiter.write_message({'msg': parsed['message']}) |
||||||
|
|
||||||
|
|
||||||
|
def check_origin(self, origin): |
||||||
|
return True |
||||||
|
# @gen.coroutine |
||||||
|
# def get(self): |
||||||
|
# cursor = yield self.db.execute("SELECT * FROM users_user WHERE id=2") |
||||||
|
# data = cursor.fetchone() |
||||||
|
# print(data[0]) |
||||||
|
# self.finish() |
||||||
|
|
||||||
|
|
||||||
|
class Application(web.Application): |
||||||
|
|
||||||
|
def __init__(self): |
||||||
|
handlers = [ |
||||||
|
(r"/chat", TutorialHandler), |
||||||
|
] |
||||||
|
super().__init__(handlers=handlers, **settings) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
parse_command_line() |
||||||
|
application = Application() |
||||||
|
ioloop = IOLoop.instance() |
||||||
|
|
||||||
|
application.db = momoko.Pool( |
||||||
|
dsn='dbname=archilance user=postgres password=postgres host=localhost', |
||||||
|
size=1, |
||||||
|
ioloop=ioloop, |
||||||
|
) |
||||||
|
future = application.db.connect() |
||||||
|
ioloop.add_future(future, lambda f: ioloop.stop()) |
||||||
|
ioloop.start() |
||||||
|
future.result() |
||||||
|
|
||||||
|
http_server = HTTPServer(application) |
||||||
|
http_server.listen(8888, 'localhost') |
||||||
|
ioloop.start() |
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,70 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<meta charset="UTF-8"> |
||||||
|
<title>Title</title> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<h1>Демо чат</h1> |
||||||
|
<h2>{{ order}}</h2> |
||||||
|
|
||||||
|
|
||||||
|
<div id="message_chat"> |
||||||
|
{% for msg in order.order_messages.all %} |
||||||
|
<h3> {{msg}} </h3> |
||||||
|
{% endfor%} |
||||||
|
</div> |
||||||
|
|
||||||
|
<form method="post" id="message_form"> |
||||||
|
<textarea id="message" name="message"></textarea> |
||||||
|
<input type="submit" /> |
||||||
|
</form> |
||||||
|
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> |
||||||
|
<script type="text/javascript"> |
||||||
|
|
||||||
|
window.onload = function(){ |
||||||
|
var socket = new SocketHandler(); |
||||||
|
var form = document.getElementById('message_form'); |
||||||
|
|
||||||
|
form.onsubmit = function(e){ |
||||||
|
e.preventDefault(); |
||||||
|
console.log('submit click'); |
||||||
|
socket.send_message(form); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
var SocketHandler = function(){ |
||||||
|
var url = 'ws://127.0.0.1:8888/chat'; |
||||||
|
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); |
||||||
|
message = JSON.parse(event.data); |
||||||
|
var inbox = document.getElementById('message_chat'); |
||||||
|
inbox.innerHTML += '<h2>' + message.msg + '</h2>'; |
||||||
|
}; |
||||||
|
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 = ""; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
</script> |
||||||
|
</body> |
||||||
|
</html> |
||||||
Loading…
Reference in new issue