1 | from django.db import models
|
---|
2 | from django.core import validators
|
---|
3 |
|
---|
4 | # Begin Models here
|
---|
5 | class Tag (models.Model):
|
---|
6 | name = models.CharField(core=True, maxlength=200)
|
---|
7 | slug = models.SlugField(prepopulate_from=('name',))
|
---|
8 | parent = models.ForeignKey('self', blank=True, null=True, related_name='child')
|
---|
9 | description = models.TextField(blank=True,help_text="Optional")
|
---|
10 |
|
---|
11 | class Admin:
|
---|
12 | list_display = ('name', '_parents_repr')
|
---|
13 |
|
---|
14 | def __str__(self):
|
---|
15 | p_list = self._recurse_for_parents(self)
|
---|
16 | p_list.append(self.name)
|
---|
17 | return self.get_separator().join(p_list)
|
---|
18 |
|
---|
19 | def get_absolute_url(self):
|
---|
20 | if self.parent_id:
|
---|
21 | return "/tag/%s/%s/" % (self.parent.slug, self.slug)
|
---|
22 | else:
|
---|
23 | return "/tag/%s/" % (self.slug)
|
---|
24 |
|
---|
25 | def _recurse_for_parents(self, cat_obj):
|
---|
26 | p_list = []
|
---|
27 | if cat_obj.parent_id:
|
---|
28 | p = cat_obj.parent
|
---|
29 | p_list.append(p.name)
|
---|
30 | more = self._recurse_for_parents(p)
|
---|
31 | p_list.extend(more)
|
---|
32 | if cat_obj == self and p_list:
|
---|
33 | p_list.reverse()
|
---|
34 | return p_list
|
---|
35 |
|
---|
36 | def get_separator(self):
|
---|
37 | return ' :: '
|
---|
38 |
|
---|
39 | def _parents_repr(self):
|
---|
40 | p_list = self._recurse_for_parents(self)
|
---|
41 | return self.get_separator().join(p_list)
|
---|
42 | _parents_repr.short_description = "Tag parents"
|
---|
43 |
|
---|
44 | def save(self):
|
---|
45 | p_list = self._recurse_for_parents(self)
|
---|
46 | if self.name in p_list:
|
---|
47 | raise validators.ValidationError("You must not save a category in itself!")
|
---|
48 | super(Tag, self).save()
|
---|
49 |
|
---|
50 |
|
---|