Skip to content
This repository has been archived by the owner on Jun 29, 2020. It is now read-only.

Commit

Permalink
Merge pull request #856 from kawazrepos/fix/activities
Browse files Browse the repository at this point in the history
Activityの修正
  • Loading branch information
miio committed Mar 8, 2015
2 parents 53fb3d4 + 762ba58 commit f8f366a
Show file tree
Hide file tree
Showing 27 changed files with 383 additions and 90 deletions.
12 changes: 5 additions & 7 deletions src/kawaz/apps/blogs/tests/test_activity.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
# ! -*- coding: utf-8 -*-
#
# created by giginet on 2014/10/18
#
from kawaz.apps.blogs.tests.factories import EntryFactory
from kawaz.core.activities.tests.testcases import BaseActivityMediatorTestCase

__author__ = 'giginet'


class EntryActivityMediatorTestCase(BaseActivityMediatorTestCase):
factory_class = EntryFactory
Expand All @@ -15,7 +9,11 @@ def test_create(self):
self._test_create()

def test_update(self):
self._test_partial_update(context_names=('title_updated', 'body_updated'), title="タイトル変えました", body='本文変えました')
self._test_partial_update(
context_names=('title_updated', 'body_updated'),
title="タイトル変えました",
body='本文変えました'
)

def test_delete(self):
self._test_delete()
Expand Down
2 changes: 0 additions & 2 deletions src/kawaz/apps/events/activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,6 @@ def alter(self, instance, activity, **kwargs):
activity = Activity(content_type=ct,
object_id=instance.pk,
status=status)
# snapshot を保存
activity.snapshot = instance
# 追加・削除されたユーザーのIDを保存
activity.remarks = " ".join(map(str, kwargs.get('pk_set')))
return activity
Expand Down
2 changes: 2 additions & 0 deletions src/kawaz/apps/events/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,9 +248,11 @@ def active_attendees(self):
from django.db.models.signals import post_save
from django.db.models.signals import post_delete
from django.dispatch import receiver
from kawaz.core.utils.signals import disable_for_loaddata


@receiver(post_save, sender=Event)
@disable_for_loaddata
def join_organizer(**kwargs):
"""
作成者を自動的に参加させるシグナルレシーバ
Expand Down
1 change: 0 additions & 1 deletion src/kawaz/apps/events/tests/test_activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from .factories import EventFactory, PersonaFactory, CategoryFactory
from kawaz.core.activities.tests.testcases import BaseActivityMediatorTestCase
from ..models import Event
from ..activity import EventActivityMediator


class EventActivityMediatorTestCase(BaseActivityMediatorTestCase):
Expand Down
9 changes: 6 additions & 3 deletions src/kawaz/apps/products/tests/test_activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ def test_package_release_added(self):

activity = activities[0]
self.assertEqual(activity.status, 'release_added')
self.assertEqual(activity.snapshot, self.object)
self.assertEqual(activity.snapshot,
self.object)
# remarksにリリースのapp_label,model,pkが入る
remarks = 'products,packagerelease,{}'.format(release.pk)
self.assertEqual(activity.remarks, remarks)
Expand All @@ -71,7 +72,8 @@ def test_url_release_added(self):

activity = activities[0]
self.assertEqual(activity.status, 'release_added')
self.assertEqual(activity.snapshot, self.object)
self.assertEqual(activity.snapshot,
self.object)
# remarksにリリースのapp_label,model,pkが入る
remarks = 'products,urlrelease,{}'.format(release.pk)
self.assertEqual(activity.remarks, remarks)
Expand Down Expand Up @@ -119,7 +121,8 @@ def test_screenshot_added(self):

activity = activities[0]
self.assertEqual(activity.status, 'screenshot_added')
self.assertEqual(activity.snapshot, self.object)
self.assertEqual(activity.snapshot,
self.object)
# remarksにスクリーンショットのpkが入る
remarks = str(ss.pk)
self.assertEqual(activity.remarks, remarks)
Expand Down
5 changes: 0 additions & 5 deletions src/kawaz/apps/projects/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +0,0 @@
#! -*- coding: utf-8 -*-
#
# created by giginet on 2014/4/15
#
__author__ = 'giginet'
2 changes: 2 additions & 0 deletions src/kawaz/apps/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,9 +220,11 @@ def active_members(self):

from django.db.models.signals import post_save
from django.dispatch import receiver
from kawaz.core.utils.signals import disable_for_loaddata


@receiver(post_save, sender=Project)
@disable_for_loaddata
def join_administrator(**kwargs):
"""
プロジェクト作成時に自動的に管理者をプロジェクトに参加させるシグナル処理
Expand Down
6 changes: 0 additions & 6 deletions src/kawaz/apps/projects/tests/test_activity.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
# ! -*- coding: utf-8 -*-
#
# created by giginet on 2014/10/18
#
from .factories import ProjectFactory
from kawaz.core.activities.tests.testcases import BaseActivityMediatorTestCase

__author__ = 'giginet'


class ProjectActivityMediatorTestCase(BaseActivityMediatorTestCase):
factory_class = ProjectFactory
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
import kawaz.core.files.storages
import kawaz.core.activities.hatenablog.models


class Migration(migrations.Migration):

dependencies = [
('hatenablog', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='hatenablogentry',
name='thumbnail',
field=models.ImageField(upload_to=kawaz.core.activities.hatenablog.models.HatenablogEntry._get_upload_path, storage=kawaz.core.files.storages.OverwriteStorage(), verbose_name='Image', default=''),
preserve_default=True,
),
]
18 changes: 10 additions & 8 deletions src/kawaz/core/activities/tests/testcases.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
# ! -*- coding: utf-8 -*-
#
# created by giginet on 2014/10/18
#
from django.contrib.contenttypes.models import ContentType
from django.template import Context
from django.test import TestCase
from activities.models import Activity
from activities.registry import registry
from kawaz.core.comments.tests.factories import CommentFactory

__author__ = 'giginet'

class BaseActivityMediatorTestCase(TestCase):
factory_class = None
Expand Down Expand Up @@ -40,15 +35,20 @@ def _test_partial_update(self, context_names = (), **fields):
context = Context()
context = mediator.prepare_context(activity, context)
for name in context_names:
self.assertTrue(name in context, 'context variable {} is not contained'.format(name))
self.assertTrue(
name in context,
'context variable {} is not contained'.format(name)
)

self._test_render(activities[0])

def _test_delete(self):
ct = ContentType.objects.get_for_model(self.object)
pk = self.object.pk
self.object.delete()
activity = Activity.objects.filter(content_type=ct, object_id=pk).first()
activity = Activity.objects.filter(
content_type=ct, object_id=pk
).first()

self.assertEqual(activity.status, 'deleted')

Expand All @@ -63,6 +63,7 @@ def _test_comment_added(self):
# コメントをする
comment = CommentFactory(content_object=self.object)

mediator = registry.get(self.object)
activities = Activity.objects.get_for_object(self.object)
self.assertEqual(nactivities + 1, activities.count())

Expand All @@ -75,7 +76,8 @@ def _test_comment_added(self):
self._test_render(activity)
mediator = registry.get(activity)
context = mediator.prepare_context(activity, Context())
self.assertTrue('comment' in context, """context doesn't contain 'comment'""")
self.assertTrue('comment' in context,
"context doesn't contain 'comment'")


def _test_render(self, activity):
Expand Down
14 changes: 9 additions & 5 deletions src/kawaz/core/comments/activity.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
# ! -*- coding: utf-8 -*-
#
# created by giginet on 2014/10/23
#
from django.contrib.contenttypes.models import ContentType
from kawaz.core.personas.models import Persona
from activities.models import Activity
from activities.mediator import ActivityMediator
from activities.registry import registry

__author__ = 'giginet'

class CommentActivityMediator(ActivityMediator):

def translate_snapshot(self, snapshot):
# 可能な限り対象モデルに合わせたスナップショットを作成する
try:
mediator = registry.get(snapshot)
except KeyError:
mediator = super()
return mediator.translate_snapshot(snapshot)

def alter(self, instance, activity, **kwargs):
if activity and activity.status == 'created':
target = instance.content_object
Expand Down
34 changes: 23 additions & 11 deletions src/kawaz/core/personas/activities/persona.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,36 @@
# ! -*- coding: utf-8 -*-
#
# created by giginet on 2014/10/15
#
from django_comments import Comment
from activities.mediator import ActivityMediator
from ..models.persona import Persona

__author__ = 'giginet'

class PersonaActivityMediator(ActivityMediator):
class PersonaActivityMediatorBase(ActivityMediator):
def serialize_snapshot(self, snapshot):
serialized_snapshot = super().serialize_snapshot(snapshot)
if isinstance(snapshot, Persona):
# スナップショット対象がペルソナの場合対応するプロフィール状態
# もスナップショットとして保持しておく
profile = getattr(snapshot, '_profile', None)
profile = super().serialize_snapshot(profile) if profile else None
serialized_snapshot['extra_fields'] = {
'_profile': profile,
}
return serialized_snapshot


class PersonaActivityMediator(PersonaActivityMediatorBase):
"""
Note:
Personaは3つのMediatorからさまざまなイベントが発行される
activated: Profileの作成(ユーザーのアクティベート時にプロフィールが作成されるため、
プロフィールが生成されたときをアクティベートされたと判定している)
activated: Profileの作成(ユーザーのアクティベート時にプロフィールが
作成されるため、プロフィールが生成されたときをアクティベート
されたと判定している)
profile_updated: プロフィールの更新
comment_added: コメントの追加
account_added: アカウントの追加
updatedイベントは初回更新時の前回との差分がないとき、`last_login`カラムが更新されるだけでも通知されてしまう問題があり
対処が面倒なので、ユーザーの更新は一切通知されない仕様にする
updatedイベントは初回更新時の前回との差分がないとき、`last_login`カラム
が更新されるだけでも通知されてしまう問題があり対処が面倒なので、ユーザ
の更新は一切通知されない仕様にする
"""

def alter(self, instance, activity, **kwargs):
Expand All @@ -29,7 +41,7 @@ def alter(self, instance, activity, **kwargs):

def prepare_context(self, activity, context, typename=None):
context = super().prepare_context(activity, context, typename)
if activity.status == 'updated' or activity.status == 'profile_updated':
if activity.status in ('updated', 'profile_updated'):
# remarks に保存された変更状態を利便のためフラグ化
# また、プロフィールの更新についてもcontextを発行している
for flag in activity.remarks.split():
Expand Down
17 changes: 7 additions & 10 deletions src/kawaz/core/personas/activities/profile.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
from django.contrib.contenttypes.models import ContentType
from activities.mediator import ActivityMediator
from .persona import PersonaActivityMediatorBase

__author__ = 'giginet'

class ProfileActivityMediator(ActivityMediator):
class ProfileActivityMediator(PersonaActivityMediatorBase):
def alter(self, instance, activity, **kwargs):
if activity and activity.status in ('created', 'updated'):
# あるユーザーのプロフィールが更新、作成されたとき
# そのActivityをプロフィールについてではなく、
# そのプロフィールの持ち主のユーザーに所属させる
target = instance.user
ct = ContentType.objects.get_for_model(type(target))
pk = target.pk
ct = ContentType.objects.get_for_model(instance.user)
activity.content_type = ct
activity.object_id = pk
activity.object_id = instance.user.pk
if activity.status == 'updated':
activity.status = 'profile_updated'
elif activity.status == 'created':
Expand All @@ -27,18 +25,17 @@ def alter(self, instance, activity, **kwargs):
return None


class AccountActivityMediator(ActivityMediator):
class AccountActivityMediator(PersonaActivityMediatorBase):
def alter(self, instance, activity, **kwargs):
if activity and activity.status == 'created':
# プロフィールに新しくサービスアカウントが作成されたとき
# このActivityをユーザーの物にしてしまう
# また、ステータスも`account_added`に変える
# remarksには付いたアカウントのPKを入れる
target = instance.profile.user
ct = ContentType.objects.get_for_model(type(target))
pk = target.pk
ct = ContentType.objects.get_for_model(instance.profile.user)
activity.content_type = ct
activity.object_id = pk
activity.object_id = instance.profile.user.pk
activity.status = 'account_added'
activity.remarks = str(instance.pk)
return activity
2 changes: 1 addition & 1 deletion src/kawaz/core/personas/models/persona.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class ActivePersonaManager(PersonaManager):

def get_queryset(self):
# 常に無効なユーザーは含まない
return super().get_query_set().filter(is_active=True)
return super().get_queryset().filter(is_active=True)


class PersonaBase(ModelBase):
Expand Down
2 changes: 1 addition & 1 deletion src/kawaz/core/personas/tests/factories/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
class ProfileFactory(factory.django.DjangoModelFactory):
FACTORY_FOR = Profile

birthday = datetime.datetime(2009, 10, 15, tzinfo=timezone.utc)
birthday = datetime.date(2009, 10, 15)
place = 'グランエターナ'
url = 'http://www.kawaz.org/'
user = factory.SubFactory(PersonaFactory)
Expand Down
22 changes: 12 additions & 10 deletions src/kawaz/core/personas/tests/test_activity.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
# ! -*- coding: utf-8 -*-
#
# created by giginet on 2014/10/18
#
import datetime
from django.template import Context
from activities.models import Activity
from activities.registry import registry
from ..models.profile import Profile
from .factories import PersonaFactory, ProfileFactory, AccountFactory
from kawaz.core.activities.tests.testcases import BaseActivityMediatorTestCase

__author__ = 'giginet'


class PersonaActivityMediatorTestCase(BaseActivityMediatorTestCase):
factory_class = PersonaFactory
Expand Down Expand Up @@ -54,16 +49,22 @@ def test_activated(self):
self.assertEqual(Activity.objects.count(), nactivity + 1)
activity = Activity.objects.first()
self.assertEqual(activity.status, 'activated')
self.assertEqual(activity.snapshot, profile.user)
self.assertEqual(activity.snapshot,
profile.user)

def test_update_profile(self):
"""
あるユーザーのProfileを更新したとき、profile_updated Activityが発行される
ユーザーのProfileを更新したとき、profile_updated Activityが発行される
"""
profile = ProfileFactory()

# Profileを更新する
fields = {'place': 'ネルフ本部', 'birthday': datetime.datetime(2112, 9, 21), 'url': 'http://nerv.com/', 'remarks': 'ねむい'}
fields = {
'place': 'ネルフ本部',
'birthday': datetime.date(2112, 9, 21),
'url': 'http://nerv.com/',
'remarks': 'ねむい',
}
activities = Activity.objects.get_for_object(profile.user)
self.assertEqual(len(activities), 1)
for field, value in fields.items():
Expand Down Expand Up @@ -96,7 +97,8 @@ def test_delete(self):

def test_account_added(self):
"""
アカウントを作成したとき、ユーザーに対してaccount_added Activityが発行される
アカウントを作成したとき、ユーザーに対してaccount_added Activityが
発行される
"""

# アカウントを作る
Expand Down

0 comments on commit f8f366a

Please sign in to comment.