root/bitstructures/trunk/substructure/models.py

Revision 74, 2.2 kB (checked in by simon, 3 months ago)

Implemented tagging.
Switched to arrows for the "Newer | Older" navigation.
Removed special behaviour for logged in users.

Line 
1 from django.db import models
2
3 class Entry(models.Model):
4     """
5     >>> from datetime import datetime
6     >>> test1 = Entry()
7     >>> test1.id = 1
8     >>> test1.slug = 'testentry1'
9     >>> test1.is_published()
10     False
11     >>> test1.is_draft()
12     True
13     >>> test1.get_absolute_url()
14     '/drafts/testentry1'
15     >>> test2 = Entry()
16     >>> test2.id = 2
17     >>> test2.slug = 'testentry2'
18     >>> test2.date_published = datetime(2001, 2, 3)
19     >>> test2.is_published()
20     True
21     >>> test2.is_draft()
22     False
23     >>> test2.get_absolute_url()
24     '/2001/02/testentry2'
25     """
26
27     slug = models.SlugField(unique=True, blank=False)
28     title = models.CharField(maxlength=200, blank=False)
29     date_published = models.DateTimeField(null=True, blank=True)
30     text = models.TextField(blank=False)
31
32     def __str__(self):
33         return self.title
34
35     def is_published(self):
36         return bool(self.date_published)
37
38     def is_draft(self):
39         return not self.is_published()
40
41     def get_absolute_url(self):
42         if self.is_published():
43             year = self.date_published.year
44             month = self.date_published.month
45             return '/%04d/%02d/%s' % (year, month, self.slug)
46         else:
47             return '/drafts/%s' % (self.slug)
48
49     def tags(self):
50         entrytags = EntryTag.objects.select_related().filter(entry=self).order_by('number')
51         tags = []
52         for entrytag in entrytags:
53             tags.append(entrytag.tag)
54         return tags
55
56     class Admin:
57         fields = (
58             (None, {'fields': ('title', 'slug', 'date_published')}),
59             (None, {'fields': ('text',), 'classes': 'monospace'})
60         )
61         list_display = ('title', 'get_absolute_url', 'date_published')
62         ordering = ['-date_published']
63
64 class Tag(models.Model):
65     name = models.CharField(maxlength=50, blank=False)
66
67     def __str__(self):
68         return self.name
69
70     def get_absolute_url(self):
71         return '/tagged-with/%s' % (self.name)
72
73     class Admin:
74         pass
75
76 class EntryTag(models.Model):
77     entry = models.ForeignKey(Entry)
78     tag = models.ForeignKey(Tag)
79     number = models.IntegerField()
80
81     class Admin:
82         list_display = ('entry', 'tag', 'number')
83         ordering = ['entry']
Note: See TracBrowser for help on using the browser.