#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_KEY = '499898042244-bt7v18v4f46k8qg98n1ne8u2hjtmj0cn.apps.googleusercontent.com'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 's69NCyhSlwY0OuGGT8_dFI7E' SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 's69NCyhSlwY0OuGGT8_dFI7E'
SOCIAL_AUTH_TWITTER_KEY = 'YAe05K4IYYxHhA6J1mTOdDBjq' # SOCIAL_AUTH_TWITTER_KEY = 'YAe05K4IYYxHhA6J1mTOdDBjq'
SOCIAL_AUTH_TWITTER_SECRET = 'iRuYqRRaoGkCD4ip74NICb8FeZMxvM6MZ8HLMbm1jX99o7pcaL' # 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_KEY = '5469025'
SOCIAL_AUTH_VK_OAUTH2_SECRET = '3Wild7HqYq6YFiLz9i7l' SOCIAL_AUTH_VK_OAUTH2_SECRET = '3Wild7HqYq6YFiLz9i7l'

@ -2,7 +2,7 @@ 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 *

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

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

@ -448,3 +448,19 @@ function humanFileSize(bytes, si) {
return bytes.toFixed(1) + ' ' + units[u] 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. * 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 SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat'; var url = 'ws://127.0.0.1:8888/chat';
@ -29,7 +15,6 @@ var SocketHandler = function () {
}; };
sock.onmessage = function (event) { sock.onmessage = function (event) {
console.log(event.data); console.log(event.data);
alert(event.data);
var message = JSON.parse(event.data); var message = JSON.parse(event.data);
var inbox = document.getElementById('message-chat-space'); var inbox = document.getElementById('message-chat-space');
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' + inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +

@ -196,29 +196,48 @@
{% endblock %} {% endblock %}
{% block js_block %} {% block js_block %}
<script type="text/javascript"> <script type="text/javascript">
$(function(){ $(function(){
var socket = new SocketHandler(); var socket = new SocketHandler();
var form = document.getElementById('message_form'); var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
$('.order-block').on('click',function(){ $('.order-block').on('click',function(){
var orderId = $(this).attr('data-id'); var orderId = $(this).attr('data-id');
$("#chat-order-add #orderId").val(orderId); $("#chat-order-add #orderId").val(orderId);
alert(orderId);
var inbox = document.getElementById('message-chat-order-space'); var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = ''; 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'); $('.user-block').on('click', function () {
inbox.innerHTML = ''; var userId = $(this).attr('data-id');
socket.send_contact_message(userId); $("#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(){ $('#contact-chat-add-message').on('click', function(){
var chatMessage = $("#chat").val(); var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val(); var recipentId = $("#recipentId").val();

@ -42,6 +42,12 @@ class TestHandler(web.RequestHandler):
print(str(d[1])) print(str(d[1]))
class NotificationHandler(websocket.WebSocketHandler):
@property
def db(self):
return self.application.db
class TutorialHandler(websocket.WebSocketHandler): class TutorialHandler(websocket.WebSocketHandler):
@property @property
def db(self): def db(self):
@ -51,7 +57,9 @@ class TutorialHandler(websocket.WebSocketHandler):
def open(self, *args, **kwargs): def open(self, *args, **kwargs):
self.waiters.add(self) self.waiters.add(self)
print({'hello': 'test'}) # print(dir(self))
print(self.patch)
# print(self.waiters)
# @gen.coroutine # @gen.coroutine
def on_message(self, message): def on_message(self, message):
@ -93,7 +101,7 @@ class TutorialHandler(websocket.WebSocketHandler):
messages = cursor.fetchall() messages = cursor.fetchall()
for msg in messages: for msg in messages:
for waiter in self.waiters: 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 @gen.coroutine
def get_messages_from_order_chat(self, order_id): 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 "css/swiper.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.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' 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/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional 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/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.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload-process.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> <script src='{% static "my-libs.js" %}'></script>

@ -61,7 +61,9 @@
</a> </a>
{% elif request.user.is_customer %} {% elif request.user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}"> <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> </a>
{% endif %} {% endif %}
</div> </div>

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

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

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

@ -294,12 +294,14 @@
</div> </div>
<div class="galleryWork2 gal-iss disTab"> <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="col-lg-4">
<div class="insetCol box-sizing disTab"> <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 class="imgFigure"></div>
</div> </div>
{% endthumbnail %}
</div> </div>
<div class="insetCol2 box-sizing disTab"> <div class="insetCol2 box-sizing disTab">
<p> <p>
@ -325,12 +327,14 @@
</div> </div>
<div class="galleryWork2 gal-iss disTab"> <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="col-lg-4">
<div class="insetCol box-sizing disTab"> <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 class="imgFigure"></div>
</div> </div>
{% endthumbnail %}
</div> </div>
<div class="insetCol2 box-sizing disTab"> <div class="insetCol2 box-sizing disTab">
<p> <p>
@ -390,8 +394,26 @@
{% block js_block %} {% block js_block %}
<script type="text/javascript"> <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){ $('#worksell-add-form').on('submit', function(e){
e.preventDefault(); e.preventDefault();
var dataSerializer = $(this).serialize(); var dataSerializer = $(this).serialize();

@ -46,6 +46,8 @@ class ContractorProfileDetailView(DetailView):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['worksell_form'] = self.worksell_form_class context['worksell_form'] = self.worksell_form_class
context['portfolio_form'] = self.portfolio_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 return context

Loading…
Cancel
Save