+ def save(self, *args, **kwargs):
+ flush_cache = flush_all_includes = False
+ if self.pk and self.category != 'set':
+ # Flush the whole views cache.
+ # Seem a little harsh, but changed tag names, descriptions
+ # and links come up at any number of places.
+ flush_cache = True
+
+ # Find in which languages we need to flush related includes.
+ old_self = type(self).objects.get(pk=self.pk)
+ # Category shouldn't normally be changed, but just in case.
+ if self.category != old_self.category:
+ flush_all_includes = True
+ languages_changed = self.languages_changed(old_self)
+
+ ret = super(Tag, self).save(*args, **kwargs)
+
+ if flush_cache:
+ caches[settings.CACHE_MIDDLEWARE_ALIAS].clear()
+ if flush_all_includes:
+ flush_ssi_includes()
+ else:
+ self.flush_includes()
+ self.after_change.send(sender=type(self), instance=self, languages=languages_changed)
+
+ return ret
+
+ def languages_changed(self, old):
+ all_langs = [lc for (lc, _ln) in settings.LANGUAGES]
+ if (old.category, old.slug) != (self.category, self.slug):
+ return all_langs
+ languages = set()
+ for lang in all_langs:
+ name_field = 'name_%s' % lang
+ if getattr(old, name_field) != getattr(self, name_field):
+ languages.add(lang)
+ return languages
+
+ def flush_includes(self, languages=True):
+ if not languages:
+ return
+ if languages is True:
+ languages = [lc for (lc, _ln) in settings.LANGUAGES]
+ flush_ssi_includes([
+ template % (self.pk, lang)
+ for template in [
+ '/api/include/tag/%d.%s.json',
+ '/api/include/tag/%d.%s.xml',
+ ]
+ for lang in languages
+ ])
+ flush_ssi_includes([
+ '/katalog/%s.json' % lang for lang in languages])
+