root/trunk/blog/models.py

Revision 75, 5.3 kB (checked in by nobu, 5 months ago)
Line 
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
Note: See TracBrowser for help on using the browser.