#ARC-17 Add websocket notifications

remotes/origin/setup
Mukhtar 10 years ago
parent fde7c81fbf
commit 38b58c09fc
  1. 7
      archilance/settings/base.py
  2. 2
      archilance/settings/dev.py
  3. 6
      assets/css/extra.css
  4. 3
      assets/css/main.css
  5. 16
      assets/index.js
  6. 15
      assets/js/chat.js
  7. 35
      chat/templates/chat_customer.html
  8. 12
      chat/testapp.py
  9. 2
      templates/partials/base.html
  10. 4
      templates/partials/header.html
  11. 7
      users/pipeline.py
  12. 2
      users/serializers.py
  13. 2
      users/templates/add_email_form.html
  14. 32
      users/templates/contractor_profile.html
  15. 2
      users/views.py

@ -147,8 +147,11 @@ SOCIAL_AUTH_ODNOKLASSNIKI_OAUTH2_PUBLIC_NAME = 'CBADEFFLEBABABABA'
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '499898042244-bt7v18v4f46k8qg98n1ne8u2hjtmj0cn.apps.googleusercontent.com'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 's69NCyhSlwY0OuGGT8_dFI7E'
SOCIAL_AUTH_TWITTER_KEY = 'YAe05K4IYYxHhA6J1mTOdDBjq'
SOCIAL_AUTH_TWITTER_SECRET = 'iRuYqRRaoGkCD4ip74NICb8FeZMxvM6MZ8HLMbm1jX99o7pcaL'
# SOCIAL_AUTH_TWITTER_KEY = 'YAe05K4IYYxHhA6J1mTOdDBjq'
# SOCIAL_AUTH_TWITTER_SECRET = 'iRuYqRRaoGkCD4ip74NICb8FeZMxvM6MZ8HLMbm1jX99o7pcaL'
SOCIAL_AUTH_TWITTER_KEY = 'vZvKDqyosgeGuRwnY8mKy9sHV'
SOCIAL_AUTH_TWITTER_SECRET = 'ulPAOEMWscoBh7hldpKXXQksACUuSfp25GWAOSv5PiMV1o6Sah'
SOCIAL_AUTH_VK_OAUTH2_KEY = '5469025'
SOCIAL_AUTH_VK_OAUTH2_SECRET = '3Wild7HqYq6YFiLz9i7l'

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

@ -58,3 +58,9 @@
.mfp-fade.mfp-wrap.mfp-removing .mfp-content {
opacity: 0;
}
#jGrowl .jGrowl-notification {
background-color: #00bb7b;
font-size: 17px;
}

@ -5481,4 +5481,5 @@ input[type="radio"]:checked + span {
.imgProfile {
margin-left: -20px;
}
}
}

@ -448,3 +448,19 @@ function humanFileSize(bytes, si) {
return bytes.toFixed(1) + ' ' + units[u]
}
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}

@ -2,20 +2,6 @@
* Created by mukhtar on 04.07.16.
*/
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat';
@ -29,7 +15,6 @@ var SocketHandler = function () {
};
sock.onmessage = function (event) {
console.log(event.data);
alert(event.data);
var message = JSON.parse(event.data);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +

@ -196,29 +196,48 @@
{% endblock %}
{% block js_block %}
<script type="text/javascript">
$(function(){
var socket = new SocketHandler();
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
$('.order-block').on('click',function(){
var orderId = $(this).attr('data-id');
$("#chat-order-add #orderId").val(orderId);
alert(orderId);
var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = '';
socket.send_order_message(orderId);
{# socket.send_order_message(orderId);#}
});
$('.user-block').on('click', function(){
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML = '';
socket.send_contact_message(userId);
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'recipent__id': userId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
console.log(v.sender.id);
console.log(v.recipent.id);
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
});
$('#contact-chat-add-message').on('click', function(){
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();

@ -42,6 +42,12 @@ class TestHandler(web.RequestHandler):
print(str(d[1]))
class NotificationHandler(websocket.WebSocketHandler):
@property
def db(self):
return self.application.db
class TutorialHandler(websocket.WebSocketHandler):
@property
def db(self):
@ -51,7 +57,9 @@ class TutorialHandler(websocket.WebSocketHandler):
def open(self, *args, **kwargs):
self.waiters.add(self)
print({'hello': 'test'})
# print(dir(self))
print(self.patch)
# print(self.waiters)
# @gen.coroutine
def on_message(self, message):
@ -93,7 +101,7 @@ class TutorialHandler(websocket.WebSocketHandler):
messages = cursor.fetchall()
for msg in messages:
for waiter in self.waiters:
waiter.write_message({'msg': msg[0], 'answer_type': 'order'})
waiter.write_message(json.dumps({'msg': msg[0], 'answer_type': 'order'}))
@gen.coroutine
def get_messages_from_order_chat(self, order_id):

@ -21,6 +21,7 @@
<link rel='stylesheet' href='{% static "css/swiper.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
<link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'>
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css" />
<link rel='stylesheet' href='{% static "css/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS -->
@ -49,6 +50,7 @@
<script src='{% static "lib/jquery.fileupload/js/vendor/jquery.ui.widget.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload-process.js" %}'></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script>
<script src='{% static "my-libs.js" %}'></script>

@ -61,7 +61,9 @@
</a>
{% elif request.user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}">
<img src="/media/img/profile.jpg" alt="profile-image">
{% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</a>
{% endif %}
</div>

@ -10,9 +10,10 @@ def test_contractor(backend, details, response, is_new=False, *args, **kwargs):
@partial
def add_email_for_user(backend, details, response, is_new=False, *args, **kwargs):
data = backend.strategy.request_data()
if details.get('contractor') is None:
if 'contractor' in kwargs['request']:
return {'contractor': kwargs['request']['contractor']}
# import code; code.interact(local=dict(globals(), **locals()))
if not details.get('email'):
if 'email' in kwargs['request']:
return {'email': kwargs['request']['email']}
else:
return render_to_response('add_email_form.html')
@partial

@ -24,7 +24,7 @@ class UserSerializer(ModelSerializer):
'last_name',
'last_time_visit',
'location',
'nickname',
'username',
'patronym',
'skype',
'website',

@ -3,7 +3,7 @@
{% block content %}
<h1>Введите свой email</h1>
<form method="post">
<input type="email" name="contractor">
<input type="email" name="email">
<input type="submit" value="Send">
</form>
{% endblock %}

@ -294,12 +294,14 @@
</div>
<div class="galleryWork2 gal-iss disTab">
{% for diplom in contractor.contractor_resume.resume_files.all %}
{% for diplom in resume_diploms %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
{% thumbnail diplom.img "210x334" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</div>
<div class="insetCol2 box-sizing disTab">
<p>
@ -325,12 +327,14 @@
</div>
<div class="galleryWork2 gal-iss disTab">
{% for cro in contractor.contractor_resume.resume_files.all %}
{% for cro in resume_cro %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
{% thumbnail cro.img "210x334" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</div>
<div class="insetCol2 box-sizing disTab">
<p>
@ -390,8 +394,26 @@
{% block js_block %}
<script type="text/javascript">
$(function(){
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) {
var notificationData =JSON.parse(event.data);
$.jGrowl("Вам пришло новое сообщение!" + notificationData.msg, { sticky: true });
};
}
$(function(){
var socket = new SocketHandler();
$('#worksell-add-form').on('submit', function(e){
e.preventDefault();
var dataSerializer = $(this).serialize();

@ -46,6 +46,8 @@ class ContractorProfileDetailView(DetailView):
context = super().get_context_data(**kwargs)
context['worksell_form'] = self.worksell_form_class
context['portfolio_form'] = self.portfolio_form_class
context['resume_diploms'] = self.object.contractor_resume.resume_files.filter(type='diplom')
context['resume_cro'] = self.object.contractor_resume.resume_files.filter(type='cro')
return context

Loading…
Cancel
Save