class Tag(TagBase):
name = models.CharField(_('name'), max_length=50, db_index=True)
- slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)
+ slug = models.SlugField(_('slug'), max_length=120, db_index=True)
sort_key = models.SlugField(_('sort key'), max_length=120, db_index=True)
category = models.CharField(_('category'), max_length=50, blank=False, null=False,
db_index=True, choices=TAG_CATEGORIES)
gazeta_link = models.CharField(blank=True, max_length=240)
wiki_link = models.CharField(blank=True, max_length=240)
+ categories_rev = {
+ 'autor': 'author',
+ 'epoka': 'epoch',
+ 'rodzaj': 'kind',
+ 'gatunek': 'genre',
+ 'motyw': 'theme',
+ 'polka': 'set',
+ }
+ categories_dict = dict((item[::-1] for item in categories_rev.iteritems()))
+
class Meta:
ordering = ('sort_key',)
verbose_name = _('tag')
verbose_name_plural = _('tags')
+ unique_together = (("slug", "category"),)
def __unicode__(self):
return self.name
@permalink
def get_absolute_url(self):
- return ('catalogue.views.tagged_object_list', [self.slug])
+ return ('catalogue.views.tagged_object_list', [self.url_chunk])
def has_description(self):
return len(self.description) > 0
@staticmethod
def get_tag_list(tags):
if isinstance(tags, basestring):
- tag_slugs = tags.split('/')
- return [Tag.objects.get(slug=slug) for slug in tag_slugs]
+ real_tags = []
+ ambiguous_slugs = []
+ category = None
+ tags_splitted = tags.split('/')
+ for index, name in enumerate(tags_splitted):
+ if name in Tag.categories_rev:
+ category = Tag.categories_rev[name]
+ else:
+ if category:
+ real_tags.append(Tag.objects.get(slug=name, category=category))
+ category = None
+ else:
+ try:
+ real_tags.append(Tag.objects.exclude(category='book').get(slug=name))
+ except Tag.MultipleObjectsReturned, e:
+ ambiguous_slugs.append(name)
+
+ if category:
+ # something strange left off
+ raise Tag.DoesNotExist()
+ if ambiguous_slugs:
+ # some tags should be qualified
+ e = Tag.MultipleObjectsReturned()
+ e.tags = real_tags
+ e.ambiguous_slugs = ambiguous_slugs
+ raise e
+ else:
+ return real_tags
else:
return TagBase.get_tag_list(tags)
+ @property
+ def url_chunk(self):
+ return '/'.join((Tag.categories_dict[self.category], self.slug))
+
-# TODO: why is this hard-coded ?
+# TODO: why is this hard-coded ?
def book_upload_path(ext):
def get_dynamic_path(book, filename):
return 'lektura/%s.%s' % (book.slug, ext)
objects = models.Manager()
tagged = managers.ModelTaggedItemManager(Tag)
tags = managers.TagDescriptor(Tag)
-
- _tag_counter = JSONField(editable=False, default='')
- _theme_counter = JSONField(editable=False, default='')
+
+ _tag_counter = JSONField(null=True, editable=False)
+ _theme_counter = JSONField(null=True, editable=False)
class AlreadyExists(Exception):
pass
def save(self, force_insert=False, force_update=False, reset_short_html=True, refresh_mp3=True):
if reset_short_html:
# Reset _short_html during save
+ update = {}
for key in filter(lambda x: x.startswith('_short_html'), self.__dict__):
+ update[key] = ''
self.__setattr__(key, '')
+ # Fragment.short_html relies on book's tags, so reset it here too
+ self.fragments.all().update(**update)
book = super(Book, self).save(force_insert, force_update)
@property
def name(self):
return self.title
-
+
def book_tag(self):
slug = ('l-' + self.slug)[:120]
- book_tag, created = Tag.objects.get_or_create(slug=slug)
+ book_tag, created = Tag.objects.get_or_create(slug=slug, category='book')
if created:
book_tag.name = self.title[:50]
book_tag.sort_key = slug
- book_tag.category = 'book'
book_tag.save()
return book_tag
book.save()
book_tags = []
- for category in ('kind', 'genre', 'author', 'epoch'):
- tag_name = getattr(book_info, category)
- tag_sort_key = tag_name
- if category == 'author':
- tag_sort_key = tag_name.last_name
- tag_name = ' '.join(tag_name.first_names) + ' ' + tag_name.last_name
- tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name))
- if created:
- tag.name = tag_name
- tag.sort_key = slughifi(tag_sort_key)
- tag.category = category
- tag.save()
- book_tags.append(tag)
+ categories = (('kinds', 'kind'), ('genres', 'genre'), ('authors', 'author'), ('epochs', 'epoch'))
+ for field_name, category in categories:
+ try:
+ tag_names = getattr(book_info, field_name)
+ except:
+ tag_names = [getattr(book_info, category)]
+ for tag_name in tag_names:
+ tag_sort_key = tag_name
+ if category == 'author':
+ tag_sort_key = tag_name.last_name
+ tag_name = ' '.join(tag_name.first_names) + ' ' + tag_name.last_name
+ tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name), category=category)
+ if created:
+ tag.name = tag_name
+ tag.sort_key = slughifi(tag_sort_key)
+ tag.save()
+ book_tags.append(tag)
book.tags = book_tags
continue
themes = []
for theme_name in theme_names:
- tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name))
+ tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme')
if created:
tag.name = theme_name
tag.sort_key = slughifi(theme_name)
- tag.category = 'theme'
tag.save()
themes.append(tag)
new_fragment.save()
book.save()
return book
-
-
+
+
def refresh_tag_counter(self):
tags = {}
for child in self.children.all().order_by():
self.set__tag_counter_value(tags)
self.save(reset_short_html=False, refresh_mp3=False)
return tags
-
+
@property
def tag_counter(self):
- if self._tag_counter == '':
+ if self._tag_counter is None:
return self.refresh_tag_counter()
return dict((int(k), v) for k, v in self.get__tag_counter_value().iteritems())
- #return self.get__tag_counter_value()
def refresh_theme_counter(self):
tags = {}
self.set__theme_counter_value(tags)
self.save(reset_short_html=False, refresh_mp3=False)
return tags
-
+
@property
def theme_counter(self):
- if self._theme_counter == '':
+ if self._theme_counter is None:
return self.refresh_theme_counter()
return dict((int(k), v) for k, v in self.get__theme_counter_value().iteritems())
- return self.get__theme_counter_value()
-
+
class Fragment(models.Model):
if short_html and len(short_html):
return mark_safe(short_html)
else:
- book_authors = [mark_safe(u'<a href="%s">%s</a>' % (tag.get_absolute_url(), tag.name))
- for tag in self.book.tags if tag.category == 'author']
-
setattr(self, key, unicode(render_to_string('catalogue/fragment_short.html',
- {'fragment': self, 'book': self.book, 'book_authors': book_authors})))
+ {'fragment': self})))
self.save()
return mark_safe(getattr(self, key))