diff --git a/AuthApp/funcs.py b/AuthApp/funcs.py new file mode 100644 index 0000000..139597f --- /dev/null +++ b/AuthApp/funcs.py @@ -0,0 +1,2 @@ + + diff --git a/AuthApp/middleware.py b/AuthApp/middleware.py new file mode 100644 index 0000000..bb9ea6f --- /dev/null +++ b/AuthApp/middleware.py @@ -0,0 +1,58 @@ +import json +import datetime +from django.http import HttpResponse +from django.conf import settings + + +def set_cookie(response, key, value, days_expire=7): + if days_expire is None: + max_age = 365 * 24 * 60 * 60 # one year + else: + max_age = days_expire * 24 * 60 * 60 + expires = datetime.datetime.strftime( + datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), + "%a, %d-%b-%Y %H:%M:%S GMT", + ) + response.set_cookie( + key, + value, + max_age=max_age, + expires=expires, + domain=settings.SESSION_COOKIE_DOMAIN, + secure=settings.SESSION_COOKIE_SECURE or None, + ) + + return response + +class ResponseInterceptionMiddleware: + # def __init__(self, get_response): + # self.get_response = get_response + # + # def __call__(self, request): + # return self.get_response(request) + # def process_request(self, request): + def __init__(self, get_response): + self.get_response = get_response + # One-time configuration and initialization. + + def __call__(self, request): + # Code to be executed for each request before + # the view (and later middleware) are called. + + # if request.user.is_authenticated: + # request = request.user.user_profile.save_user_alerts_to_session(request) + + response = self.get_response(request) + if request.user.is_authenticated: + for_save_to_session = request.user.user_profile.get_node_by_name('for_save_to_session') + if for_save_to_session: + for key, val in for_save_to_session.items(): + # request.session[key] = json.dumps(val) + # response.set_cookie(key, json.dumps(val)) + set_cookie(response, key, val, 30) + + # Code to be executed for each request/response after + # the view is called. + + return response + diff --git a/AuthApp/models.py b/AuthApp/models.py index 67b4e1e..5da0aeb 100644 --- a/AuthApp/models.py +++ b/AuthApp/models.py @@ -1,5 +1,8 @@ # coding=utf-8 from __future__ import unicode_literals + +import json + from django.contrib.auth.models import User from django.db import models from django.utils.translation import gettext_lazy as _ @@ -48,6 +51,13 @@ class UserProfile(BaseModel): on_delete=models.SET_NULL ) + def save_user_alerts_to_session(self, request): + for_save_to_session = self.get_node_by_name('for_save_to_session') + if for_save_to_session: + for key, val in for_save_to_session.items(): + request.session[key] = json.dumps(val) + return request + def __str__(self): if self.user: diff --git a/AuthApp/views.py b/AuthApp/views.py index 1762574..af9ead1 100644 --- a/AuthApp/views.py +++ b/AuthApp/views.py @@ -55,8 +55,13 @@ def user_profile_View(request): Dict = {} + user_online = request.session.get('online', False) + # request.COOKIES['user_id'] = request.user.id + t = loader.get_template('pages/profile/p_user_profile.html') - return HttpResponse(t.render(Dict, request)) + response = HttpResponse(t.render(Dict, request)) + response.set_cookie('user_id', request.user.id) + return response def login_View(request): diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py index 15f9475..3da4d34 100644 --- a/BaseModels/base_models.py +++ b/BaseModels/base_models.py @@ -34,6 +34,17 @@ class BaseModel(models.Model): else: return str(self.id) + def pop_node_by_name(self, node_name): + if not self.json_data or not node_name in self.json_data: + return None + + res = self.json_data[node_name] + del self.json_data[node_name] + self.save(update_fields=['json_data']) + + return res + + def get_node_by_name(self, node_name): if not self.json_data or not node_name in self.json_data: return None diff --git a/ChatServiceApp/js_views.py b/ChatServiceApp/js_views.py index cf9ec08..51fd327 100644 --- a/ChatServiceApp/js_views.py +++ b/ChatServiceApp/js_views.py @@ -102,9 +102,12 @@ def update_chat_ajax(request): }) html = render_to_string(tpl_name, res_Dict, request=request) + res_Dict.update({'receivers': get_chat_receivers_for_user(request.user)}) + users_list_html = render_to_string('blocks/profile/b_list_of_users_messenger.html', res_Dict, request=request) Dict.update({ 'html': html, + 'users_list_html': users_list_html, 'required_beep': True, }) return JsonResponse(Dict, status=200) @@ -185,6 +188,16 @@ def send_msg_ajax(request): 'text': data['text'] }) + session_data = { + 'for_save_to_session':{ + 'user_alerts':{ + 'new_message': True + } + } + } + + receiver.user_profile.add_node_to_json_data(session_data, save=True) + msg = Message.objects.create(**msg_create_kwargs) if ticket: diff --git a/TWB/settings.py b/TWB/settings.py index 7c546b3..c19d7f1 100644 --- a/TWB/settings.py +++ b/TWB/settings.py @@ -60,6 +60,7 @@ MIDDLEWARE = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'AuthApp.middleware.ResponseInterceptionMiddleware', ] ROOT_URLCONF = 'TWB.urls' diff --git a/static/js/check_new_messages.js b/static/js/check_new_messages.js index 1397e97..17b29b6 100644 --- a/static/js/check_new_messages.js +++ b/static/js/check_new_messages.js @@ -20,7 +20,8 @@ function check_new_messages_timeout(){ } check_msg = setInterval(function () { - + // let new_message = getNewMessageSession() + let user_online = userOnline('set') window = document.querySelector(".container-messages") if (window === null){ // @@ -29,7 +30,7 @@ function check_new_messages_timeout(){ check_new_messages(window,it) } }, - 1000) + 10000) } @@ -58,6 +59,7 @@ function check_new_messages (window,it){ data_new_messages.last_message_modifiedDT = last_message_time.dataset['modifieddt'] } + $.ajax({ headers: { "X-CSRFToken": $('input[name=csrfmiddlewaretoken]').val() }, url: '/ru/messages/update_chat/', @@ -69,6 +71,7 @@ function check_new_messages (window,it){ // enctype: 'json', data: JSON.stringify(data_new_messages), success: function(data){ + getNewMessageSession() success_check_new_messages(data) }, @@ -110,3 +113,16 @@ function success_check_new_messages (data) { } + +function userOnline (set=null,check=null) { + let user_online = null + if (set !== null){ + user_online = navigator.userActivation.isActive || navigator.userActivation.hasBeenActive === true; + sessionStorage.setItem('online',user_online) + + } else if (check !== null){ + user_online = navigator.userActivation.isActive || navigator.userActivation.hasBeenActive === true; + sessionStorage.getItem('online') + } + return user_online +} \ No newline at end of file diff --git a/static/js/global_js.js b/static/js/global_js.js new file mode 100644 index 0000000..abf8c58 --- /dev/null +++ b/static/js/global_js.js @@ -0,0 +1,11 @@ +$(document).ready(function (){ + getNewMessageSession() +}) + +function getNewMessageSession (){ + let new_message = JSON.parse( + sessionStorage.getItem('user_alerts') + ) + return new_message +} + diff --git a/static/js/user_profile(boris).js b/static/js/user_profile(boris).js index 3ba761c..58145ee 100644 --- a/static/js/user_profile(boris).js +++ b/static/js/user_profile(boris).js @@ -10,6 +10,7 @@ function createTicketShow () { // enctype: 'json', // data: formData, success: function(data){ + getNewMessageSession() document.querySelector(".insert-tech-place").innerHTML = data.html; @@ -80,6 +81,7 @@ function attachFileCreateTicket () { // enctype: 'json', data: data, success: function(data){ + getNewMessageSession() document.querySelector(".insert-tech-place").innerHTML = data.html; @@ -107,6 +109,7 @@ function attachFilemeassge () { // enctype: 'json', data: data, success: function(data){ + getNewMessageSession() document.querySelector(".insert-tech-place").innerHTML = data.html; @@ -130,6 +133,7 @@ function createTicket (el) { // enctype: 'json', data: formData, success: function(data){ + getNewMessageSession() document.querySelector(".insert-tech-place").innerHTML = data.html; @@ -169,6 +173,7 @@ function selectedUserMessenger (ticket_id=null,user_id=null){ // enctype: 'json', data: JSON.stringify(data), success: function(data){ + getNewMessageSession() document.querySelector(".info_profile").innerHTML = data.html; @@ -219,6 +224,7 @@ function sendMessage(id_ticket=null,sender,receiver){ // enctype: 'json', data: JSON.stringify(data), success: function(data){ + getNewMessageSession() document.querySelector(".container-messages").innerHTML = data.html; document.querySelector(".enter-message-inp").value = null @@ -251,6 +257,7 @@ function openTicket (ticket_id){ // enctype: 'json', data: JSON.stringify(data), success: function(data){ + getNewMessageSession() document.querySelector(".info_profile").innerHTML = data.html; diff --git a/static/js/user_profile.js b/static/js/user_profile.js index a6609a3..6c63705 100644 --- a/static/js/user_profile.js +++ b/static/js/user_profile.js @@ -10,6 +10,7 @@ function writeMessage(){ // enctype: 'json', // data: formData, success: function(data){ + getNewMessageSession() // location.href = '/profile' document.querySelector(".info_profile").innerHTML = data.html; @@ -35,6 +36,7 @@ function technicalSupport(){ // enctype: 'json', // data: formData, success: function(data){ + getNewMessageSession() console.log('data received') // location.href = '/profile' document.querySelector(".info_profile").innerHTML = data.html; @@ -59,6 +61,7 @@ function mySubscription(){ // enctype: 'json', // data: formData, success: function(data){ + getNewMessageSession() console.log('data received') // location.href = '/profile' document.querySelector(".info_profile").innerHTML = data.html; @@ -83,6 +86,7 @@ function myProfile(){ // enctype: 'json', // data: formData, success: function(data){ + getNewMessageSession() console.log('data received') // location.href = '/profile' document.querySelector(".info_profile").innerHTML = data.html; @@ -161,6 +165,7 @@ function searchTown(el){ // enctype: 'json', data: JSON.stringify(get_address_point), success: function(data){ + getNewMessageSession() return insertSearchList(data, el.name + '_list') }, error: function (data){ @@ -313,6 +318,7 @@ function sendRoute(el, routeID = null){ // enctype: 'json', data: formData, success: function(data){ + getNewMessageSession() console.log('data received') // location.href = '/profile' document.querySelector(".info_profile").innerHTML = data.html @@ -383,6 +389,7 @@ function createRoute(){ // enctype: 'json', // data: {}, success: function(data){ + getNewMessageSession() // console.log('data received') // location.href = '/profile' document.querySelector(".info_profile").innerHTML = data.html @@ -418,6 +425,7 @@ function getRoute(){ // enctype: 'json', // data: formData, success: function(data){ + getNewMessageSession() console.log('data received') // location.href = '/profile' document.querySelector(".info_profile").innerHTML = data.html; diff --git a/templates/blocks/profile/b_list_of_users_messenger.html b/templates/blocks/profile/b_list_of_users_messenger.html index 44b7b71..83ca9b5 100644 --- a/templates/blocks/profile/b_list_of_users_messenger.html +++ b/templates/blocks/profile/b_list_of_users_messenger.html @@ -3,6 +3,6 @@ Чаты:
{% for item in receivers %} - {% include "widgets/w_chat_right_panel_users.html" %} + {% include "widgets/w_chat_right_panel_user.html" %} {% endfor %}
diff --git a/templates/tb_base.html b/templates/tb_base.html index 1132407..8a6e258 100644 --- a/templates/tb_base.html +++ b/templates/tb_base.html @@ -13,6 +13,8 @@ + + {% block meta %} diff --git a/templates/widgets/w_chat_right_panel_users.html b/templates/widgets/w_chat_right_panel_user.html similarity index 100% rename from templates/widgets/w_chat_right_panel_users.html rename to templates/widgets/w_chat_right_panel_user.html