SciPost Code Repository

Skip to content
Snippets Groups Projects
views.py 2.98 KiB
Newer Older
Jorran de Wit's avatar
Jorran de Wit committed
from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib.auth.models import User
Jorran de Wit's avatar
Jorran de Wit committed
from django.forms import model_to_dict
from django.http import JsonResponse
from django.shortcuts import get_object_or_404, redirect

from .models import Notification
from .utils import id2slug, slug2id


Jorran de Wit's avatar
Jorran de Wit committed
def is_test_user(user):
    return user.groups.filter(name='Testers').exists()


Jorran de Wit's avatar
Jorran de Wit committed
@user_passes_test(is_test_user)
def forward(request, slug):
    """
    Open the url of the target object of the notification and redirect.
    In addition, mark the notification as read.
    """
    notification = get_object_or_404(Notification, recipient=request.user, id=slug2id(slug))
    notification.mark_as_read()
    return redirect(notification.target.get_absolute_url())


Jorran de Wit's avatar
Jorran de Wit committed
@login_required
Jorran de Wit's avatar
Jorran de Wit committed
@user_passes_test(is_test_user)
def mark_toggle(request, slug=None):
Jorran de Wit's avatar
Jorran de Wit committed
    id = slug2id(slug)

    notification = get_object_or_404(Notification, recipient=request.user, id=id)
Jorran de Wit's avatar
Jorran de Wit committed
    notification.mark_toggle()
Jorran de Wit's avatar
Jorran de Wit committed

    _next = request.GET.get('next')
    if _next:
        return redirect(_next)

Jorran de Wit's avatar
Jorran de Wit committed
    if request.GET.get('json'):
        return JsonResponse({'unread': notification.unread})
Jorran de Wit's avatar
Jorran de Wit committed
    return redirect('notifications:all')
Jorran de Wit's avatar
Jorran de Wit committed


def live_unread_notification_count(request):
    if not request.user.is_authenticated():
        data = {'unread_count': 0}
    else:
        data = {'unread_count': request.user.notifications.unread().count()}
    return JsonResponse(data)


Jorran de Wit's avatar
Jorran de Wit committed
def live_notification_list(request):
Jorran de Wit's avatar
Jorran de Wit committed
    if not request.user.is_authenticated():
        data = {
           'unread_count': 0,
Jorran de Wit's avatar
Jorran de Wit committed
           'list': []
Jorran de Wit's avatar
Jorran de Wit committed
        }
        return JsonResponse(data)

    try:
        # Default to 5 as a max number of notifications
Jorran de Wit's avatar
Jorran de Wit committed
        num_to_fetch = max(int(request.GET.get('max', 5)), 1)
Jorran de Wit's avatar
Jorran de Wit committed
        num_to_fetch = min(num_to_fetch, 100)
    except ValueError:
        num_to_fetch = 5

Jorran de Wit's avatar
Jorran de Wit committed
    list = []
Jorran de Wit's avatar
Jorran de Wit committed
    for n in request.user.notifications.all()[:num_to_fetch]:
Jorran de Wit's avatar
Jorran de Wit committed
        struct = model_to_dict(n)
Jorran de Wit's avatar
Jorran de Wit committed
        struct['unread'] = struct['pseudo_unread']
Jorran de Wit's avatar
Jorran de Wit committed
        struct['slug'] = id2slug(n.id)
        if n.actor:
            if isinstance(n.actor, User):
Jorran de Wit's avatar
Jorran de Wit committed
                # Humanize if possible
                struct['actor'] = '{f} {l}'.format(f=n.actor.first_name, l=n.actor.last_name)
            else:
                struct['actor'] = str(n.actor)
Jorran de Wit's avatar
Jorran de Wit committed
        if n.target:
            if hasattr(n.target, 'notification_name'):
                struct['target'] = n.target.notification_name
            else:
                struct['target'] = str(n.target)
            struct['forward_link'] = n.get_absolute_url()
Jorran de Wit's avatar
Jorran de Wit committed
        if n.action_object:
            struct['action_object'] = str(n.action_object)
Jorran de Wit's avatar
Jorran de Wit committed
        struct['timesince'] = n.timesince()
Jorran de Wit's avatar
Jorran de Wit committed
        list.append(struct)
Jorran de Wit's avatar
Jorran de Wit committed

    if request.GET.get('mark_as_read'):
        # Mark all as read
        request.user.notifications.mark_all_as_read()

Jorran de Wit's avatar
Jorran de Wit committed
    data = {
        'unread_count': request.user.notifications.unread().count(),
Jorran de Wit's avatar
Jorran de Wit committed
        'list': list
Jorran de Wit's avatar
Jorran de Wit committed
    }
    return JsonResponse(data)