'day': published_at.day, 'pk': self.pk }) return ('blogs_entry_update', (), { 'author': self.author.username, 'pk': self.pk }) from permission import add_permission_logic from kawaz.core.publishments.perms import PublishmentPermissionLogic from kawaz.core.personas.perms import ChildrenPermissionLogic from kawaz.core.personas.perms import KawazAuthorPermissionLogic add_permission_logic(Category, KawazAuthorPermissionLogic( field_name='author', any_permission=True )) add_permission_logic(Category, ChildrenPermissionLogic( add_permission=True )) add_permission_logic(Entry, KawazAuthorPermissionLogic( field_name='author', any_permission=True, )) add_permission_logic(Entry, PublishmentPermissionLogic()) from .activity import EntryActivityMediator registry.register(Entry, EntryActivityMediator())
return self.user.nickname def get_absolute_url(self): # TODO: このメソッドは使用しないため削除 # テンプレートなどで間違えて使用されていた場合を考えメソッド自体は # 一定期間残し、代わりに例外を投げる raise Exception( 'Profile.get_absolute_url is obsolete. ' 'Use Persona.get_absolute_url instead. ' 'e.g. user.profile.get_absolute_url => ' 'user.get_absolute_url' ) from ..activities.profile import ProfileActivityMediator from activities.registry import registry registry.register(Profile, ProfileActivityMediator()) class Skill(models.Model): """It is the model which indicates what users can""" label = models.CharField(_('Label'), unique=True, max_length=32) description = models.CharField(_('Description'), max_length=128) order = models.IntegerField(_("Order"), default=0) def __str__(self): return self.label class Meta: ordering = ('order', 'pk',) verbose_name = _("Skill") verbose_name_plural = _("Skills")
def setUp(self): registry.register(CommentTestArticle, ActivityMediator())
last_modifier = models.ForeignKey( settings.AUTH_USER_MODEL, verbose_name=_('Last modified by'), editable=False, null=True, related_name='last_modified_announcements') objects = AnnouncementManager() class Meta: ordering = ('-created_at',) verbose_name = _('Announcement') verbose_name_plural = _('Announcements') permissions = ( ('view_announcement', 'Can view the announcement'), ) def __str__(self): return self.title @models.permalink def get_absolute_url(self): kwargs = dict(pk=self.pk) if self.pub_state == 'draft': return ('announcements_announcement_update', (), kwargs) return ('announcements_announcement_detail', (), kwargs) from permission import add_permission_logic from .perms import AnnouncementPermissionLogic add_permission_logic(Announcement, AnnouncementPermissionLogic()) from .activity import AnnouncementActivityMediator registry.register(Announcement, AnnouncementActivityMediator())
def _get_upload_path(self, filename): basedir = os.path.join('thumbnails', 'activities', 'contrib', 'hatenablog') return os.path.join(basedir, filename) title = models.CharField(_('Title'), max_length=128) url = models.URLField(_('URL'), unique=True) thumbnail = models.ImageField(_('Image'), storage=OverwriteStorage(), upload_to=_get_upload_path, default='') md5 = models.CharField(max_length=32) created_at = models.DateTimeField(_('Created at')) def __str__(self): return self.title class Meta: ordering = ('-created_at', ) verbose_name = _('Hatenablog entry') verbose_name_plural = _('Hatenablog entries') def get_absolute_url(self): return self.url from .activity import HatenablogEntryActivityMediator from activities.registry import registry registry.register(HatenablogEntry, HatenablogEntryActivityMediator())
class Meta: ordering = ('pk', ) verbose_name = _('Screen shot') verbose_name_plural = _('Screen shots') def __str__(self): return '{}({})'.format(self.image.name, self.product.title) from permission import add_permission_logic from .perms import ProductPermissionLogic from kawaz.core.personas.perms import ChildrenPermissionLogic add_permission_logic( Product, ChildrenPermissionLogic(add_permission=True, change_permission=False, delete_permission=False)) add_permission_logic(Product, ProductPermissionLogic()) from .activity import ProductActivityMediator from activities.registry import registry registry.register(Product, ProductActivityMediator()) from .activity import ReleaseActivityMediator registry.register(PackageRelease, ReleaseActivityMediator()) registry.register(URLRelease, ReleaseActivityMediator()) from .activity import ScreenshotActivityMediator registry.register(Screenshot, ScreenshotActivityMediator())
from django_comments.models import Comment from .activity import CommentActivityMediator from activities.registry import registry registry.register(Comment, CommentActivityMediator()) from permission import add_permission_logic from .perms import CommentPermissionLogic add_permission_logic(Comment, CommentPermissionLogic())
""" created = kwargs.get('created') instance = kwargs.get('instance') if instance.pub_state != 'draft' and not instance.administrator in instance.members.all(): instance.join(instance.administrator) from permission import add_permission_logic from kawaz.core.personas.perms import KawazAuthorPermissionLogic from permission.logics import CollaboratorsPermissionLogic from kawaz.core.publishments.perms import PublishmentPermissionLogic from .perms import ProjectPermissionLogic add_permission_logic(Project, KawazAuthorPermissionLogic( field_name='administrator', change_permission=True, delete_permission=True )) add_permission_logic(Project, CollaboratorsPermissionLogic( field_name='members', change_permission=True, delete_permission=False )) add_permission_logic(Project, ProjectPermissionLogic()) add_permission_logic(Project, PublishmentPermissionLogic( author_field_name='administrator' )) from .activity import ProjectActivityMediator from activities.registry import registry registry.register(Project, ProjectActivityMediator())
editable=False, null=True, related_name='last_modified_announcements') objects = AnnouncementManager() class Meta: ordering = ('-created_at', ) verbose_name = _('Announcement') verbose_name_plural = _('Announcements') permissions = (('view_announcement', 'Can view the announcement'), ) def __str__(self): return self.title @models.permalink def get_absolute_url(self): kwargs = dict(pk=self.pk) if self.pub_state == 'draft': return ('announcements_announcement_update', (), kwargs) return ('announcements_announcement_detail', (), kwargs) from permission import add_permission_logic from .perms import AnnouncementPermissionLogic add_permission_logic(Announcement, AnnouncementPermissionLogic()) from .activity import AnnouncementActivityMediator registry.register(Announcement, AnnouncementActivityMediator())
def setUp(self): registry.register(CommentTestArticle, ActivityMediator())
"Letters, digits, and - are the only characters available.") % {'username': self.username}) # 使用不可のユーザー名が指定されていた場合はエラー if self.username in INVALID_USERNAMES: raise ValidationError( _("The username '%(username)s' is reserved. " "Please chose a different username.") % {'username': self.username}) # ニックネームが指定されていない場合は自動的にユーザー名を当てはめる if not self.nickname: self.nickname = self.username super().clean_fields(exclude=exclude, **kwargs) @models.permalink def get_absolute_url(self): return ('personas_persona_detail', (), {'slug': self.username}) # username に対し独自のValidationをかけているためデフォルトのhelp_textと # 実情があっていないため、強制的に書き換える Persona._meta.get_field('username').help_text = _( 'Required. 30 characters or fewer. Letters, digits and /-/_ only.') from permission import add_permission_logic from ..perms import PersonaPermissionLogic add_permission_logic(Persona, PersonaPermissionLogic()) from ..activities.persona import PersonaActivityMediator from activities.registry import registry registry.register(Persona, PersonaActivityMediator())
return ('personas_persona_detail', (), { 'slug': self.username }) # username に対し独自のValidationをかけているためデフォルトのhelp_textと # 実情があっていないため、強制的に書き換える Persona._meta.get_field('username').help_text = _( 'Required. 30 characters or fewer. Letters, digits and /-/_ only.' ) from permission import add_permission_logic from ..perms import PersonaPermissionLogic add_permission_logic(Persona, PersonaPermissionLogic()) from ..activities.persona import PersonaActivityMediator from activities.registry import registry registry.register(Persona, PersonaActivityMediator()) from django.dispatch import receiver from slack_invitation.slack import SlackInvitationClient, SlackInvitationException from registration.signals import user_accepted @receiver(user_accepted) def invite_to_slack(user, profile, request, **kwargs): try: team = getattr(settings, 'DJANGO_SLACK_INVITATION_TEAM', None) token = getattr(settings, 'DJANGO_SLACK_INVITATION_TOKEN', None) if not team or not token: raise ImproperlyConfigured('Both DJANGO_SLACK_INVITATION_TEAM and ' 'DJANGO_SLACK_INVITATION_TOKEN must be set') client = SlackInvitationClient(team, token)
basedir = os.path.join('thumbnails', 'activities', 'contrib', 'hatenablog') return os.path.join(basedir, filename) title = models.CharField(_('Title'), max_length=128) url = models.URLField(_('URL'), unique=True) thumbnail = models.ImageField(_('Image'), storage=OverwriteStorage(), upload_to=_get_upload_path, default='') md5 = models.CharField(max_length=32) created_at = models.DateTimeField(_('Created at')) def __str__(self): return self.title class Meta: ordering = ('-created_at',) verbose_name = _('Hatenablog entry') verbose_name_plural = _('Hatenablog entries') def get_absolute_url(self): return self.url from .activity import HatenablogEntryActivityMediator from activities.registry import registry registry.register(HatenablogEntry, HatenablogEntryActivityMediator())
return self.user.nickname def get_absolute_url(self): # TODO: このメソッドは使用しないため削除 # テンプレートなどで間違えて使用されていた場合を考えメソッド自体は # 一定期間残し、代わりに例外を投げる raise Exception( 'Profile.get_absolute_url is obsolete. ' 'Use Persona.get_absolute_url instead. ' 'e.g. user.profile.get_absolute_url => ' 'user.get_absolute_url' ) from ..activities.profile import ProfileActivityMediator from activities.registry import registry registry.register(Profile, ProfileActivityMediator()) class Skill(models.Model): """It is the model which indicates what users can""" label = models.CharField(_('Label'), unique=True, max_length=32) description = models.CharField(_('Description'), max_length=128) order = models.IntegerField(_("Order"), default=0) def __str__(self): return self.label class Meta: ordering = ('order', 'pk',) verbose_name = _("Skill") verbose_name_plural = _("Skills")
from django.test import TestCase from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from activities.models import Activity from activities.tests.models import ActivitiesTestModelA from activities.registry import registry from activities.mediator import ActivityMediator from kawaz.core.personas.models import Persona from kawaz.core.personas.tests.factories import PersonaFactory from kawaz.core.activities.tests.factories import ActivityFactory registry.register(ActivitiesTestModelA, ActivityMediator()) class ActivityViewTestCase(TestCase): def test_activities_activity_list_url(self): """ name=activities_activity_listから/activities/を引ける """ self.assertEqual(reverse('activities_activity_list'), '/activities/') def test_get_activities(self): """ 10件ずつActivityを取得できる """ ct = ContentType.objects.get_for_model(ActivitiesTestModelA) for i in range(15): test_model = ActivitiesTestModelA(text="hogehoge") test_model.save() r = self.client.get('/activities/')
from django.test import TestCase from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from activities.models import Activity from activities.tests.models import ActivitiesTestModelA from activities.registry import registry from activities.mediator import ActivityMediator from kawaz.core.personas.models import Persona from kawaz.core.personas.tests.factories import PersonaFactory from kawaz.core.activities.tests.factories import ActivityFactory __author__ = 'giginet' registry.register(ActivitiesTestModelA, ActivityMediator()) class ActivityViewTestCase(TestCase): def test_activities_activity_list_url(self): """ name=activities_activity_listから/activities/を引ける """ self.assertEqual(reverse('activities_activity_list'), '/activities/') def test_get_activities(self): """ 10件ずつActivityを取得できる """ ct = ContentType.objects.get_for_model(ActivitiesTestModelA) for i in range(15): test_model = ActivitiesTestModelA(text="hogehoge") test_model.save()
class Meta: ordering = ('pk',) verbose_name = _('Screen shot') verbose_name_plural = _('Screen shots') def __str__(self): return '{}({})'.format(self.image.name, self.product.title) from permission import add_permission_logic from .perms import ProductPermissionLogic from kawaz.core.personas.perms import ChildrenPermissionLogic add_permission_logic(Product, ChildrenPermissionLogic( add_permission=True, change_permission=False, delete_permission=False )) add_permission_logic(Product, ProductPermissionLogic()) from .activity import ProductActivityMediator from activities.registry import registry registry.register(Product, ProductActivityMediator()) from .activity import ReleaseActivityMediator registry.register(PackageRelease, ReleaseActivityMediator()) registry.register(URLRelease, ReleaseActivityMediator()) from .activity import ScreenshotActivityMediator registry.register(Screenshot, ScreenshotActivityMediator())
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): """ 作成者を自動的に参加させるシグナルレシーバ """ created = kwargs.get('created') instance = kwargs.get('instance') if created: instance.attend(instance.organizer) from permission import add_permission_logic from permission.logics.staff import StaffPermissionLogic from .perms import EventPermissionLogic from kawaz.core.publishments.perms import PublishmentPermissionLogic add_permission_logic(Event, EventPermissionLogic()), add_permission_logic(Event, PublishmentPermissionLogic( author_field_name='organizer')), add_permission_logic(Category, StaffPermissionLogic(any_permission=True)) from .activity import EventActivityMediator from activities.registry import registry registry.register(Event, EventActivityMediator())
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): """ 作成者を自動的に参加させるシグナルレシーバ """ created = kwargs.get('created') instance = kwargs.get('instance') if created: instance.attend(instance.organizer) from permission import add_permission_logic from permission.logics.staff import StaffPermissionLogic from .perms import EventPermissionLogic from kawaz.core.publishments.perms import PublishmentPermissionLogic add_permission_logic(Event, EventPermissionLogic()), add_permission_logic( Event, PublishmentPermissionLogic(author_field_name='organizer')), add_permission_logic(Category, StaffPermissionLogic(any_permission=True)) from .activity import EventActivityMediator from activities.registry import registry registry.register(Event, EventActivityMediator())