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): |
||||
template_name = 'home.html' |
||||
|
||||
class TestChatTemplateView(TemplateView): |
||||
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,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 |
||||
conn = psycopg2.connect(database="archilance", user="postgres", password="postgres", host="localhost") |
||||
cursor = conn.cursor() |
||||
cursor.execute("SELECT 1") |
||||
rows = cursor.fetchall() |
||||
print(rows) |
||||
import momoko |
||||
|
||||
|
||||
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 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