| 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'] |
|---|