margins for paypal form on small screens
[wolnelektury.git] / src / picture / models.py
index 7732e20..643149a 100644 (file)
@@ -10,10 +10,11 @@ from django.conf import settings
 from django.contrib.contenttypes.fields import GenericRelation
 from django.core.files.storage import FileSystemStorage
 from django.utils.datastructures import SortedDict
-from fnpdjango.utils.text.slughifi import slughifi
+from slugify import slugify
 from ssify import flush_ssi_includes
 
 from catalogue.models.tag import prefetched_relations
+from catalogue.utils import split_tags
 from picture import tasks
 from StringIO import StringIO
 import jsonfield
@@ -139,6 +140,9 @@ class Picture(models.Model):
     def author_unicode(self):
         return self.tag_unicode('author')
 
+    def tags_by_category(self):
+        return split_tags(self.tags)
+
     @permalink
     def get_absolute_url(self):
         return 'picture.views.picture_detail', [self.slug]
@@ -162,7 +166,7 @@ class Picture(models.Model):
             return None
 
     @classmethod
-    def from_xml_file(cls, xml_file, image_file=None, image_store=None, overwrite=False):
+    def from_xml_file(cls, xml_file, image_file=None, image_store=None, overwrite=False, search_index=True):
         """
         Import xml and it's accompanying image file.
         If image file is missing, it will be fetched by librarian.picture.ImageStore
@@ -220,7 +224,7 @@ class Picture(models.Model):
                         # str.capitalize() is wrong, because it also lowers letters
                         objname = objname[0].upper() + objname[1:]
                         tag, created = catalogue.models.Tag.objects.get_or_create(
-                            slug=slughifi(objname), category='thing')
+                            slug=slugify(objname), category='thing')
                         if created:
                             tag.name = objname
                             setattr(tag, 'name_%s' % lang, tag.name)
@@ -245,7 +249,7 @@ class Picture(models.Model):
                     for motifs in part['themes']:
                         for motif in motifs.split(','):
                             tag, created = catalogue.models.Tag.objects.get_or_create(
-                                slug=slughifi(motif), category='theme')
+                                slug=slugify(motif), category='theme')
                             if created:
                                 tag.name = motif
                                 tag.sort_key = sortify(tag.name)
@@ -287,6 +291,8 @@ class Picture(models.Model):
             picture.xml_file.save("%s.xml" % picture.slug, File(xml_file))
             picture.save()
             tasks.generate_picture_html(picture.id)
+            if not settings.NO_SEARCH_INDEX and search_index:
+                tasks.index_picture.delay(picture.id, picture_info=picture_xml.picture_info)
 
         if close_xml_file:
             xml_file.close()
@@ -383,3 +389,17 @@ class Picture(models.Model):
                 ]
             for lang in languages
             ])
+
+    def search_index(self, picture_info=None, index=None, index_tags=True, commit=True):
+        if index is None:
+            from search.index import Index
+            index = Index()
+        try:
+            index.index_picture(self, picture_info)
+            if index_tags:
+                index.index_tags()
+            if commit:
+                index.index.commit()
+        except Exception, e:
+            index.index.rollback()
+            raise e