kawaz.apps.products.activity のソースコード

from django.contrib.contenttypes.models import ContentType
from django_comments.models import Comment
from django.conf import settings
from kawaz.apps.products.models import AbstractRelease, Screenshot
from activities.mediator import ActivityMediator


[ドキュメント]class ProductActivityMediator(ActivityMediator): notifiers = settings.ACTIVITIES_DEFAULT_NOTIFIERS + ('twitter_kawaz_official',)
[ドキュメント] def alter(self, instance, activity, **kwargs): # 状態がdraftの場合は通知しない if activity and activity.status == 'updated': if activity.previous: # 通知が必要な状態の変更を詳細に記録する previous = activity.previous.snapshot is_created = lambda x: ( not getattr(previous, x) and getattr(instance, x) ) is_updated = lambda x: ( getattr(previous, x) and getattr(instance, x) and getattr(previous, x) != getattr(instance, x) ) is_deleted = lambda x: ( getattr(previous, x) and not getattr(instance, x) ) remarks = [] attributes = ( 'title', 'description', 'thumbnail', 'trailer' ) for attribute in attributes: if is_created(attribute): remarks.append(attribute + '_created') elif is_updated(attribute): remarks.append(attribute + '_updated') elif is_deleted(attribute): remarks.append(attribute + '_deleted') if not remarks: # 通知が必要な変更ではないため通知しない return None activity.remarks = "\n".join(remarks) return activity
[ドキュメント] def prepare_context(self, activity, context, typename=None): context = super().prepare_context(activity, context, typename) if activity.status == 'updated': # remarks に保存された変更状態を利便のためフラグ化 for flag in activity.remarks.split(): context[flag] = True elif activity.status == 'comment_added': # コメントが付いたとき、remarksにcommentのpkが入ってるはずなので # 取得してcontextに渡す try: comment = Comment.objects.get(pk=int(activity.remarks)) context['comment'] = comment except: pass elif activity.status == 'release_added': # releaseをcontextに加える try: app_label, model, pk = activity.remarks.split(',') ct = ContentType.objects.get_by_natural_key(app_label, model) release_class = ct.model_class() release = release_class.objects.get(pk=pk) context['release'] = release except: pass elif activity.status == 'screenshot_added': # コメントが付いたとき、remarksにscreenshotのpkが入ってるはずなので # 取得してcontextに渡す try: ss = Screenshot.objects.get(pk=int(activity.remarks)) context['screenshot'] = ss except: pass return context
[ドキュメント]class ReleaseActivityMediator(ActivityMediator):
[ドキュメント] def alter(self, instance, activity, **kwargs): if activity and activity.status == 'created': target = instance.product # リリースが作成されたとき、対象オブジェクトを書き換える ct = ContentType.objects.get_for_model(type(target)) pk = target.pk activity.content_type = ct activity.object_id = pk activity.status = 'release_added' # URLRelease, PackageRelease、どちらにも対応できるように付いた # リリースのCTを <app_label>,<model>,<pk>の書式で入れている release_ct = ContentType.objects.get_for_model(type(instance)) activity.remarks = ','.join((release_ct.app_label, release_ct.model, str(instance.pk))) return activity return None
[ドキュメント]class ScreenshotActivityMediator(ActivityMediator):
[ドキュメント] def alter(self, instance, activity, **kwargs): if activity and activity.status == 'created': target = instance.product # スクリーンショットが作成されたとき、対象オブジェクトを書き換える ct = ContentType.objects.get_for_model(type(target)) pk = target.pk activity.content_type = ct activity.object_id = pk activity.status = 'screenshot_added' # Screenshotのpkをremarksに入れる activity.remarks = str(instance.pk) return activity return None