kawaz.apps.blogs.models のソースコード

import datetime
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.utils.timezone import get_default_timezone
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError
from activities.registry import registry
from kawaz.core.db.decorators import validate_on_save
from kawaz.core.publishments.models import PUB_STATES
from kawaz.core.publishments.models import PublishmentManagerMixin


[ドキュメント]class Category(models.Model): """ ブログが所属するカテゴリーモデル カテゴリーは各ユーザーがそれぞれ所有するもので、自身のブログの整理に利用する 目的で存在する。 """ label = models.CharField(_('Category name'), max_length=255) # TODO Fix Me # editable=FalseにしてるとAPIからアクセスできない author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('Author'), related_name='blog_categories') class Meta: # カテゴリはユーザーが所有するものなので unique together を指定 unique_together = (('author', 'label'),) def __str__(self): return "{}({})".format(self.label, self.author.username) @models.permalink
[ドキュメント] def get_absolute_url(self): return ('blogs_entry_category_list', (), {'author': self.author.username, 'pk': self.pk})
[ドキュメント]class EntryManager(models.Manager, PublishmentManagerMixin): pass
@validate_on_save
[ドキュメント]class Entry(models.Model): """ ブログ記事モデル """ pub_state = models.CharField(_("Publish status"), max_length=10, choices=PUB_STATES, default="public") title = models.CharField(_('Title'), max_length=255) body = models.TextField(_('Body')) category = models.ForeignKey(Category, verbose_name=_('Category'), related_name="entries", blank=True, null=True) author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('Author'), related_name='blog_entries', editable=False) created_at = models.DateTimeField(_('Created at'), auto_now_add=True) updated_at = models.DateTimeField(_('Modified at'), auto_now=True) published_at = models.DateTimeField(_('Published at'), null=True, editable=False) objects = EntryManager() class Meta: ordering = ('-updated_at', 'title') verbose_name = _('Entry') verbose_name_plural = _('Entries') permissions = ( ('view_entry', 'Can view the entry'), ) def __str__(self): return self.title @property def published_at_date(self): """公開日""" if not self.published_at: return None return datetime.datetime.date(self.published_at)
[ドキュメント] def save(self, *args, **kwargs): if not self.published_at: # 記事の状態が下書き以外の場合は公開日時を自動的に指定 # これは最初の公開時のみに行われるため 公開->下書き->公開 としても # 最初の公開日が変更されることはない if self.pub_state != 'draft': self.published_at = timezone.now() super().save(*args, **kwargs)
[ドキュメント] def clean(self): if self.category and self.author != self.category.author: raise ValidationError('Category must be owned by author.') super().clean()
@models.permalink
[ドキュメント] def get_absolute_url(self): if self.published_at: tz = get_default_timezone() published_at = self.published_at.astimezone(tz) return ('blogs_entry_detail', (), { 'author': self.author.username, 'year': published_at.year, 'month': published_at.month, '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())