| 1 |
# vim: encoding=utf-8 : |
|---|
| 2 |
|
|---|
| 3 |
from datetime import datetime |
|---|
| 4 |
|
|---|
| 5 |
from django.dispatch import dispatcher |
|---|
| 6 |
from django.db import models |
|---|
| 7 |
from django.db.models import signals |
|---|
| 8 |
from django.utils.translation import ugettext_lazy as _ |
|---|
| 9 |
from blog.receivers import post_save_entry, post_save_comment, pre_delete_comment,\ |
|---|
| 10 |
post_save_trackback, pre_delete_trackback |
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
class Tag(models.Model): |
|---|
| 14 |
""" |
|---|
| 15 |
blog's tag. |
|---|
| 16 |
""" |
|---|
| 17 |
label = models.CharField(_(u'label'), max_length=100, default=None) |
|---|
| 18 |
|
|---|
| 19 |
class Meta: |
|---|
| 20 |
ordering = ('label',) |
|---|
| 21 |
verbose_name = _(u'tag') |
|---|
| 22 |
verbose_name_plural = _(u'tags') |
|---|
| 23 |
|
|---|
| 24 |
def __unicode__(self): |
|---|
| 25 |
return self.label |
|---|
| 26 |
|
|---|
| 27 |
@models.permalink |
|---|
| 28 |
def get_absolute_url(self): |
|---|
| 29 |
return ('blog_entry_tag', [self.label.lower()]) |
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 |
class Entry(models.Model): |
|---|
| 33 |
""" |
|---|
| 34 |
blog's entry. |
|---|
| 35 |
""" |
|---|
| 36 |
title = models.CharField(_(u'title'), max_length=255, default=None) |
|---|
| 37 |
slug = models.SlugField(_(u'slug')) |
|---|
| 38 |
description = models.TextField(_(u'description')) |
|---|
| 39 |
comments_count = models.IntegerField(_(u'comments count'), editable=False, default=0) |
|---|
| 40 |
trackbacks_count = models.IntegerField(_(u'trackbacks count'), editable=False, default=0) |
|---|
| 41 |
created_at = models.DateTimeField(_(u'created at'), editable=False, default=datetime.now) |
|---|
| 42 |
updated_at = models.DateTimeField(_(u'updated at'), editable=False) |
|---|
| 43 |
published_at = models.DateTimeField(_(u'published at'), editable=False, blank=True, null=True) |
|---|
| 44 |
is_published = models.BooleanField(_(u'is published'), default=True) |
|---|
| 45 |
is_active = models.BooleanField(_(u'is active'), default=True) |
|---|
| 46 |
tags = models.ManyToManyField(Tag) |
|---|
| 47 |
|
|---|
| 48 |
class Meta: |
|---|
| 49 |
ordering = ('-published_at',) |
|---|
| 50 |
verbose_name = _(u'entry') |
|---|
| 51 |
verbose_name_plural = _(u'entries') |
|---|
| 52 |
|
|---|
| 53 |
def __unicode__(self): |
|---|
| 54 |
return self.title |
|---|
| 55 |
|
|---|
| 56 |
@models.permalink |
|---|
| 57 |
def get_absolute_url(self): |
|---|
| 58 |
if not self.is_published: |
|---|
| 59 |
name = 'blog_entry_from_id' |
|---|
| 60 |
args = [self.id] |
|---|
| 61 |
else: |
|---|
| 62 |
name = 'blog_entry_detail' |
|---|
| 63 |
args = self.published_at.strftime('%Y,%m,%d').split(',') |
|---|
| 64 |
args.append(self.slug) |
|---|
| 65 |
return (name, args) |
|---|
| 66 |
|
|---|
| 67 |
@models.permalink |
|---|
| 68 |
def get_trackback_url(self): |
|---|
| 69 |
if not self.is_published: |
|---|
| 70 |
raise NotImplementedError(_(u'%r is not published.') % self) |
|---|
| 71 |
args = self.published_at.strftime('%Y,%m,%d').split(',') |
|---|
| 72 |
args.append(self.slug) |
|---|
| 73 |
return ('blog_trackback_create', args) |
|---|
| 74 |
|
|---|
| 75 |
def save(self): |
|---|
| 76 |
now = datetime.now() |
|---|
| 77 |
self.updated_at = now |
|---|
| 78 |
if self.is_published and self.published_at is None: |
|---|
| 79 |
self.published_at = now |
|---|
| 80 |
self.published_now = True |
|---|
| 81 |
self.save_base() |
|---|
| 82 |
|
|---|
| 83 |
def delete(self): |
|---|
| 84 |
self.is_active = False |
|---|
| 85 |
self.is_published = False |
|---|
| 86 |
self.save() |
|---|
| 87 |
|
|---|
| 88 |
|
|---|
| 89 |
class Comment(models.Model): |
|---|
| 90 |
""" |
|---|
| 91 |
blog's comment. |
|---|
| 92 |
""" |
|---|
| 93 |
entry = models.ForeignKey(Entry) |
|---|
| 94 |
name = models.CharField(_(u'name'), max_length=100, default=None) |
|---|
| 95 |
email = models.EmailField(_(u'mail address'), blank=True) |
|---|
| 96 |
url = models.URLField(_(u'URL'), blank=True) |
|---|
| 97 |
description = models.TextField(_(u'description')) |
|---|
| 98 |
created_at = models.DateTimeField(_(u'created at'), editable=False, default=datetime.now) |
|---|
| 99 |
|
|---|
| 100 |
class Meta: |
|---|
| 101 |
ordering = ('created_at',) |
|---|
| 102 |
verbose_name = _(u'comment') |
|---|
| 103 |
verbose_name_plural = _(u'comments') |
|---|
| 104 |
|
|---|
| 105 |
def __unicode__(self): |
|---|
| 106 |
return self.name |
|---|
| 107 |
|
|---|
| 108 |
def get_absolute_url(self): |
|---|
| 109 |
return self.entry.get_absolute_url() |
|---|
| 110 |
|
|---|
| 111 |
|
|---|
| 112 |
class TrackBack(models.Model): |
|---|
| 113 |
""" |
|---|
| 114 |
blog's track back. |
|---|
| 115 |
""" |
|---|
| 116 |
entry = models.ForeignKey(Entry) |
|---|
| 117 |
blog_name = models.CharField(_(u'blog name'), max_length=100, blank=True, default=_(u'untitled')) |
|---|
| 118 |
title = models.CharField(_(u'title'), max_length=100, blank=True, default=_(u'untitled')) |
|---|
| 119 |
url = models.URLField(_(u'URL')) |
|---|
| 120 |
excerpt = models.TextField(_(u'excerpt'), blank=True) |
|---|
| 121 |
created_at = models.DateTimeField(_(u'created at'), editable=False, default=datetime.now) |
|---|
| 122 |
|
|---|
| 123 |
class Meta: |
|---|
| 124 |
db_table = 'blog_track_back' |
|---|
| 125 |
unique_together = ('entry', 'url') |
|---|
| 126 |
ordering = ('created_at',) |
|---|
| 127 |
verbose_name = _(u'track back') |
|---|
| 128 |
verbose_name_plural = _(u'track back') |
|---|
| 129 |
|
|---|
| 130 |
def __unicode__(self): |
|---|
| 131 |
return self.url |
|---|
| 132 |
|
|---|
| 133 |
def get_absolute_url(self): |
|---|
| 134 |
return self.entry.get_absolute_url() |
|---|
| 135 |
|
|---|
| 136 |
|
|---|
| 137 |
class PingServer(models.Model): |
|---|
| 138 |
""" |
|---|
| 139 |
blog's update ping server. |
|---|
| 140 |
""" |
|---|
| 141 |
label = models.CharField(_(u'label'), max_length=100, default=None) |
|---|
| 142 |
url = models.URLField(_(u'URL'), unique=True) |
|---|
| 143 |
is_active = models.BooleanField(_(u'is active'), default=True) |
|---|
| 144 |
|
|---|
| 145 |
class Meta: |
|---|
| 146 |
db_table = 'blog_ping_server' |
|---|
| 147 |
ordering = ('label',) |
|---|
| 148 |
verbose_name = _(u'ping server') |
|---|
| 149 |
verbose_name_plural = _(u'ping servers') |
|---|
| 150 |
|
|---|
| 151 |
def __unicode__(self): |
|---|
| 152 |
return self.label |
|---|
| 153 |
|
|---|
| 154 |
def get_absolute_url(self): |
|---|
| 155 |
return self.url |
|---|
| 156 |
|
|---|
| 157 |
def delete(self): |
|---|
| 158 |
self.is_active = False |
|---|
| 159 |
self.save() |
|---|
| 160 |
|
|---|
| 161 |
|
|---|
| 162 |
dispatcher.connect(receiver=post_save_entry, signal=signals.post_save, sender=Entry) |
|---|
| 163 |
dispatcher.connect(receiver=post_save_comment, signal=signals.post_save, sender=Comment) |
|---|
| 164 |
dispatcher.connect(receiver=pre_delete_comment, signal=signals.pre_delete, sender=Comment) |
|---|
| 165 |
dispatcher.connect(receiver=post_save_trackback, signal=signals.post_save, sender=TrackBack) |
|---|
| 166 |
dispatcher.connect(receiver=pre_delete_trackback, signal=signals.pre_delete, sender=TrackBack) |
|---|
| 167 |
|
|---|
| 168 |
import blog.admin |
|---|