Files
ihrm/notifications/views.py

262 lines
7.7 KiB
Python
Raw Normal View History

2023-08-01 16:47:47 +05:30
# -*- coding: utf-8 -*-
""" Django Notifications example views """
from distutils.version import ( # pylint: disable=no-name-in-module,import-error
StrictVersion,
)
2023-08-01 16:47:47 +05:30
from django import get_version
from django.contrib.auth.decorators import login_required
from django.forms import model_to_dict
from django.http import HttpResponse # noqa
2023-08-01 16:47:47 +05:30
from django.shortcuts import get_object_or_404, redirect
from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache
from django.views.generic import ListView
from swapper import load_model
from base.models import NotificationSound
2023-08-01 16:47:47 +05:30
from notifications import settings
from notifications.settings import get_config
from notifications.utils import id2slug, slug2id
Notification = load_model("notifications", "Notification")
2023-08-01 16:47:47 +05:30
if StrictVersion(get_version()) >= StrictVersion("1.7.0"):
2023-08-01 16:47:47 +05:30
from django.http import JsonResponse # noqa
else:
# Django 1.6 doesn't have a proper JsonResponse
import json
2023-08-01 16:47:47 +05:30
def date_handler(obj):
return obj.isoformat() if hasattr(obj, "isoformat") else obj
2023-08-01 16:47:47 +05:30
def JsonResponse(data): # noqa
return HttpResponse(
json.dumps(data, default=date_handler), content_type="application/json"
)
2023-08-01 16:47:47 +05:30
class NotificationViewList(ListView):
template_name = "notifications/list.html"
context_object_name = "notifications"
paginate_by = settings.get_config()["PAGINATE_BY"]
2023-08-01 16:47:47 +05:30
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(NotificationViewList, self).dispatch(request, *args, **kwargs)
2023-08-01 16:47:47 +05:30
class AllNotificationsList(NotificationViewList):
"""
Index page for authenticated user
"""
def get_queryset(self):
if settings.get_config()["SOFT_DELETE"]:
2023-08-01 16:47:47 +05:30
qset = self.request.user.notifications.active()
else:
qset = self.request.user.notifications.all()
return qset
class UnreadNotificationsList(NotificationViewList):
def get_queryset(self):
return self.request.user.notifications.unread()
@login_required
def mark_all_as_read(request):
request.user.notifications.mark_all_as_read()
_next = request.GET.get("next")
2023-08-01 16:47:47 +05:30
if _next:
return redirect(_next)
return redirect("notifications:unread")
2023-08-01 16:47:47 +05:30
@login_required
def mark_as_read(request, slug=None):
notification_id = slug2id(slug)
notification = get_object_or_404(
Notification, recipient=request.user, id=notification_id
)
2023-08-01 16:47:47 +05:30
notification.mark_as_read()
_next = request.GET.get("next")
2023-08-01 16:47:47 +05:30
if _next:
return redirect(_next)
return redirect("notifications:unread")
2023-08-01 16:47:47 +05:30
@login_required
def mark_as_unread(request, slug=None):
notification_id = slug2id(slug)
notification = get_object_or_404(
Notification, recipient=request.user, id=notification_id
)
2023-08-01 16:47:47 +05:30
notification.mark_as_unread()
_next = request.GET.get("next")
2023-08-01 16:47:47 +05:30
if _next:
return redirect(_next)
return redirect("notifications:unread")
2023-08-01 16:47:47 +05:30
@login_required
def delete(request, slug=None):
notification_id = slug2id(slug)
notification = get_object_or_404(
Notification, recipient=request.user, id=notification_id
)
2023-08-01 16:47:47 +05:30
if settings.get_config()["SOFT_DELETE"]:
2023-08-01 16:47:47 +05:30
notification.deleted = True
notification.save()
else:
notification.delete()
_next = request.GET.get("next")
2023-08-01 16:47:47 +05:30
if _next:
return redirect(_next)
return redirect("notifications:all")
2023-08-01 16:47:47 +05:30
@never_cache
def live_unread_notification_count(request):
try:
user_is_authenticated = request.user.is_authenticated()
except TypeError: # Django >= 1.11
user_is_authenticated = request.user.is_authenticated
if not user_is_authenticated:
data = {"unread_count": 0}
2023-08-01 16:47:47 +05:30
else:
data = {
"unread_count": request.user.notifications.unread().count(),
2023-08-01 16:47:47 +05:30
}
return JsonResponse(data)
@never_cache
def live_unread_notification_list(request):
"""Return a json with a unread notification list"""
2023-08-01 16:47:47 +05:30
try:
user_is_authenticated = request.user.is_authenticated()
except TypeError: # Django >= 1.11
user_is_authenticated = request.user.is_authenticated
if not user_is_authenticated:
data = {"unread_count": 0, "unread_list": []}
2023-08-01 16:47:47 +05:30
return JsonResponse(data)
default_num_to_fetch = get_config()["NUM_TO_FETCH"]
2023-08-01 16:47:47 +05:30
try:
# If they don't specify, make it 5.
num_to_fetch = request.GET.get("max", default_num_to_fetch)
2023-08-01 16:47:47 +05:30
num_to_fetch = int(num_to_fetch)
if not (1 <= num_to_fetch <= 100):
num_to_fetch = default_num_to_fetch
except ValueError: # If casting to an int fails.
num_to_fetch = default_num_to_fetch
unread_list = []
for notification in request.user.notifications.unread()[0:num_to_fetch]:
struct = model_to_dict(notification)
struct["slug"] = id2slug(notification.id)
2023-08-01 16:47:47 +05:30
if notification.actor:
struct["actor"] = str(notification.actor)
2023-08-01 16:47:47 +05:30
if notification.target:
struct["target"] = str(notification.target)
2023-08-01 16:47:47 +05:30
if notification.action_object:
struct["action_object"] = str(notification.action_object)
2023-08-01 16:47:47 +05:30
if notification.data:
struct["data"] = notification.data
2023-08-01 16:47:47 +05:30
unread_list.append(struct)
if request.GET.get("mark_as_read"):
2023-08-01 16:47:47 +05:30
notification.mark_as_read()
data = {
"unread_count": request.user.notifications.unread().count(),
"unread_list": unread_list,
2023-08-01 16:47:47 +05:30
}
return JsonResponse(data)
@never_cache
def live_all_notification_list(request):
"""Return a json with a unread notification list"""
2023-08-01 16:47:47 +05:30
try:
user_is_authenticated = request.user.is_authenticated()
except TypeError: # Django >= 1.11
user_is_authenticated = request.user.is_authenticated
if not user_is_authenticated:
data = {"all_count": 0, "all_list": []}
2023-08-01 16:47:47 +05:30
return JsonResponse(data)
default_num_to_fetch = get_config()["NUM_TO_FETCH"]
2023-08-01 16:47:47 +05:30
try:
# If they don't specify, make it 5.
num_to_fetch = request.GET.get("max", default_num_to_fetch)
2023-08-01 16:47:47 +05:30
num_to_fetch = int(num_to_fetch)
if not (1 <= num_to_fetch <= 100):
num_to_fetch = default_num_to_fetch
except ValueError: # If casting to an int fails.
num_to_fetch = default_num_to_fetch
all_list = []
for notification in request.user.notifications.all()[0:num_to_fetch]:
struct = model_to_dict(notification)
struct["slug"] = id2slug(notification.id)
2023-08-01 16:47:47 +05:30
if notification.actor:
struct["actor"] = str(notification.actor)
2023-08-01 16:47:47 +05:30
if notification.target:
struct["target"] = str(notification.target)
2023-08-01 16:47:47 +05:30
if notification.action_object:
struct["action_object"] = str(notification.action_object)
2023-08-01 16:47:47 +05:30
if notification.data:
struct["data"] = notification.data
2023-08-01 16:47:47 +05:30
all_list.append(struct)
if request.GET.get("mark_as_read"):
2023-08-01 16:47:47 +05:30
notification.mark_as_read()
data = {"all_count": request.user.notifications.count(), "all_list": all_list}
2023-08-01 16:47:47 +05:30
return JsonResponse(data)
def live_all_notification_count(request):
try:
user_is_authenticated = request.user.is_authenticated()
except TypeError: # Django >= 1.11
user_is_authenticated = request.user.is_authenticated
if not user_is_authenticated:
data = {"all_count": 0}
2023-08-01 16:47:47 +05:30
else:
data = {
"all_count": request.user.notifications.count(),
2023-08-01 16:47:47 +05:30
}
return JsonResponse(data)
@login_required
def notification_sound(request):
employee = request.user.employee_get
sound, created = NotificationSound.objects.get_or_create(employee=employee)
if not created:
sound.sound_enabled = not sound.sound_enabled
sound.save()
return HttpResponse("")