Source code for openassembly.pirate_messages.templatetags.notificationtags

from django import template
from django import forms
from django.http import HttpResponse, HttpResponseRedirect
from django.utils import simplejson
from pirate_messages.models import Notification, Message
from django.db import transaction
from django.middleware import csrf
from django.contrib.contenttypes.models import ContentType
from pirate_profile.models import Profile
from django.utils.encoding import smart_str
from pirate_core.helpers import clean_html
from pirate_forum.models import get_rangelist

from pirate_messages.tasks import set_to_read

from collections import defaultdict
import datetime
from pirate_signals.models import notification_send

from django.shortcuts import get_object_or_404

from pirate_core.views import HttpRedirectException, namespace_get

from customtags.decorators import block_decorator
register = template.Library()
block = block_decorator(register)

get_namespace = namespace_get('pp_messages')


@block
[docs]def pp_has_mail(context, nodelist, *args, **kwargs): context.push() namespace = get_namespace(context) user = kwargs.get('user', None) reset = kwargs.get('reset', None) notes = Notification.objects.filter(receiver=user, is_read=False) unread = Message.objects.filter(read=False, receiver=user) count = len(notes) + len(unread) if count == 0: has_mail = False else: has_mail = True namespace['has_mail'] = has_mail namespace['count'] = count output = nodelist.render(context) context.pop() return output
@block
[docs]def pp_notification_unread_list_get(context, nodelist, *args, **kwargs): context.push() namespace = get_namespace(context) user = kwargs.get('user', None) reset = kwargs.get('reset', None) notes = Notification.objects.all() notes = notes.filter(receiver=user, is_read=False) notes = notes.order_by('-submit_date') if reset == None: for i in notes: i.is_read = True i.save() namespace['notifications'] = notes namespace['count'] = len(notes) output = nodelist.render(context) context.pop() return output
@block
[docs]def pp_notification_read_list_get(context, nodelist, *args, **kwargs): context.push() namespace = get_namespace(context) user = kwargs.get('user', None) notes = Notification.objects.all() notes = notes.filter(receiver=user, is_read=True) notes = notes.order_by('-submit_date') namespace['notifications'] = notes
@block
[docs]def pp_notification_list_get(context, nodelist, *args, **kwargs): context.push() namespace = get_namespace(context) user = kwargs.get('user', None) start = kwargs.get('start', None) end = kwargs.get('end', None) get_new = kwargs.get('get_new', None) if user.is_authenticated(): if start is None or end is None: start = 0 end = 20 else: try: start = int(start) end = int(end) except: raise ValueError('start and end arguments must be of integer type') count = 0 notes = Notification.objects.all() readnotes = notes.filter(receiver=user, is_read=True) count += readnotes.count() readnotes = readnotes.order_by('-submit_date') namespace['notifications'] = list(readnotes[start:end]) unotes = notes.filter(receiver=user, is_read=False) count += unotes.count() namespace['unreadcount'] = unotes.count() notes = notes.order_by('-submit_date') namespace['unreadnotifications'] = list(unotes) mesnotes = list(unotes) retnotes = process_notes(mesnotes, "unread") retnotes.extend(process_notes(readnotes, "read")) set_to_read.apply_async(args=[unotes]) namespace['notifications'] = retnotes else: count = 0 namespace['count'] = count output = nodelist.render(context) context.pop() return output #process the notes, aggregate messages with a common sender together
[docs]def process_notes(mesnotes, t): ctype = ContentType.objects.get_for_model(Message) retnotes = [] messages = {} for i in mesnotes: if i.content_type == ctype: if i.sender_pk in messages: messages[i.sender_pk] = (messages[i.sender_pk][0], messages[i.sender_pk][1] + 1, t) else: messages[i.sender_pk] = (i, 1, t) else: retnotes.append((i, 0, t)) retnotes.extend(messages.values()) return retnotes