def render_tag(self, context, obj, signal, notice_type, kwa, varname): observer = context['request'].user content_type = ContentType.objects.get_for_model(obj) observed = False if is_observing(observed=obj, observer=observer, signal=signal): observed = True result = '' perm = permission_by_label(obj, 'view') allowed = observer.is_authenticated() and ( observer.has_perm(perm, obj) or observed # Can stop oserving for closed observed object ) if allowed: local_context = copy.copy(context) local_context.update(kwa) local_context.update({ "object": obj, "object_id": obj.pk, "content_type_id": content_type.pk, 'observer': observer, "signal": signal, "notice_type": notice_type, "observed": observed, }) result = render_to_string('notification/observe_link.html', local_context) if varname: context[varname] = result return '' return result
def observe(observed, observer, notice_type_label, signal="post_save"): """ Create a new ObservedItem. To be used by applications to register a user as an observer for some object. """ perm = permission_by_label(observed, 'view') if not (observer.is_authenticated() and observer.has_perm(perm, observed)): raise PermissionDenied() notice_type = NoticeType.objects.get(label=notice_type_label) observed_item = ObservedItem( user=observer, observed_object=observed, notice_type=notice_type, signal=signal ) observed_item.save() return observed_item
def send_now(users, label, extra_context=None, on_site=True, sender=None): """ Creates a new notice. This is intended to be how other apps create new notices. notification.send(user, "friends_invite_sent", { "spam": "eggs", "foo": "bar", ) You can pass in on_site=False to prevent the notice emitted from being displayed on the site. """ sent = {} if extra_context is None: extra_context = {} notice_type = NoticeType.objects.get(label=label) notice_uid = extra_context.get('notice_uid', None) current_language = translation.get_language() current_timezone = timezone.get_current_timezone() for user in users: obj = extra_context.get('context_object', extra_context.get('observed', None)) if obj and not user.has_perm(permission_by_label(obj, 'view'), obj): continue if notice_uid: try: NoticeUid.objects.get(notice_uid=notice_uid, recipient=user) continue except NoticeUid.DoesNotExist: NoticeUid.objects.create(notice_uid=notice_uid, recipient=user) # Deprecated # get user language for user from language store defined in # NOTIFICATION_LANGUAGE_MODULE setting try: language = get_notification_language(user) except LanguageStoreNotAvailable: language = None # Deprecated result = {'pass': True} results = should_deliver.send( sender=Notice, result=result, recipient=user, label=label, notice_type=notice_type, extra_context=extra_context, sender_user=sender ) if not result['pass']: continue if False in [i[1] for i in results]: continue results = configure.send( sender=Notice, recipient=user, label=label, notice_type=notice_type, extra_context=extra_context, sender_user=sender ) configs = [i[1] for i in results if i[1]] configs.sort(key=lambda x: x.get('order', 0)) # TODO: Let pass config as argument of function, or as item of extra_context??? config = { 'language': language or current_language, 'timezone': current_timezone, 'send': True, } for i in configs: config.update(i) if not config['send']: continue with translation.override(config['language']), timezone.override(config['timezone']): for (medium_id, backend_label), backend in list(NOTIFICATION_BACKENDS.items()): if backend.can_send(user, notice_type): backend.deliver(user, sender, notice_type, extra_context) delivered.send( sender=Notice, recipient=user, notice_type=notice_type, extra_context=extra_context, sender_user=sender, medium_id=medium_id, backend_label=backend_label, backend=backend ) sent.setdefault(backend_label, 0) sent[backend_label] += 1 return sent