Source code for oioioi.notifications.processors
import random
import string
from django.conf import settings
from django.contrib.sessions.models import Session
from django.template.loader import render_to_string
from django.utils.functional import lazy
from oioioi.notifications.models import NotificationsSession
[docs]def generate_token():
new_token = ''.join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(32)
)
# It is very improbable, but it could happen that the generated token
# is already present in the dictionary. Let's generate new one.
if NotificationsSession.objects.filter(uid=new_token).exists():
return generate_token()
return new_token
[docs]def get_notifications_session(session):
try:
return NotificationsSession.objects.get(session=session.session_key)
except NotificationsSession.DoesNotExist:
notifications_session = NotificationsSession()
notifications_session.uid = generate_token()
notifications_session.session = Session.objects.get(pk=session.session_key)
notifications_session.save()
return notifications_session
[docs]def notification_processor(request):
if not request.user.is_authenticated:
return {}
def generator():
notifications_session_id = get_notifications_session(request.session).uid
return render_to_string(
'notifications/notifications.html',
dict(
notif_server_url=settings.NOTIFICATIONS_SERVER_URL,
notifications_session_id=notifications_session_id,
),
)
return {'extra_navbar_right_notifications': lazy(generator, str)()}