#951: verse-out-of-stanza issue
[redakcja.git] / apps / wiki / models.py
index d2b7460..ec9ded5 100644 (file)
@@ -3,11 +3,13 @@
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
+from django.db import models
 import re
 import os
 import vstorage
 from vstorage import DocumentNotFound
 from wiki import settings, constants
 import re
 import os
 import vstorage
 from vstorage import DocumentNotFound
 from wiki import settings, constants
+from slughifi import slughifi
 from django.utils.translation import ugettext_lazy as _
 
 from django.http import Http404
 from django.utils.translation import ugettext_lazy as _
 
 from django.http import Http404
@@ -15,12 +17,13 @@ from django.http import Http404
 import logging
 logger = logging.getLogger("fnp.wiki")
 
 import logging
 logger = logging.getLogger("fnp.wiki")
 
-_PCHARS_DICT = dict(zip((ord(x) for x in u"ĄĆĘŁŃÓŚŻŹąćęłńóśżź "), u"ACELNOSZZacelnoszz_"))
+
+# _PCHARS_DICT = dict(zip((ord(x) for x in u"ĄĆĘŁŃÓŚŻŹąćęłńóśżź "), u"ACELNOSZZacelnoszz_"))
+_PCHARS_DICT = dict(zip((ord(x) for x in u" "), u"_"))
 
 # I know this is barbaric, but I didn't find a better solution ;(
 def split_name(name):
     parts = name.translate(_PCHARS_DICT).split('__')
 
 # I know this is barbaric, but I didn't find a better solution ;(
 def split_name(name):
     parts = name.translate(_PCHARS_DICT).split('__')
-    logger.info("SPLIT %r -> %r", name, parts)
     return parts
 
 def join_name(*parts, **kwargs):
     return parts
 
 def join_name(*parts, **kwargs):
@@ -31,9 +34,9 @@ def join_name(*parts, **kwargs):
 def normalize_name(name):
     """
     >>> normalize_name("gąska".decode('utf-8'))
 def normalize_name(name):
     """
     >>> normalize_name("gąska".decode('utf-8'))
-    u'gaska'
+    u'g\u0105ska'
     """
     """
-    return name.translate(_PCHARS_DICT).lower()
+    return unicode(name).translate(_PCHARS_DICT)
 
 STAGE_TAGS_RE = re.compile(r'^#stage-finished: (.*)$', re.MULTILINE)
 
 
 STAGE_TAGS_RE = re.compile(r'^#stage-finished: (.*)$', re.MULTILINE)
 
@@ -50,6 +53,10 @@ class DocumentStorage(object):
         text, rev = self.vstorage.page_text_by_tag(name, tag)
         return Document(self, name=name, text=text, revision=rev)
 
         text, rev = self.vstorage.page_text_by_tag(name, tag)
         return Document(self, name=name, text=text, revision=rev)
 
+    def revert(self, name, revision):
+        text, rev = self.vstorage.revert(name, revision)
+        return Document(self, name=name, text=text, revision=rev)
+
     def get_or_404(self, *args, **kwargs):
         try:
             return self.get(*args, **kwargs)
     def get_or_404(self, *args, **kwargs):
         try:
             return self.get(*args, **kwargs)
@@ -67,7 +74,7 @@ class DocumentStorage(object):
         return document
 
     def create_document(self, text, name):
         return document
 
     def create_document(self, text, name):
-        title = u', '.join(p.title for p in split_name(name))
+        title = u', '.join(p.title() for p in split_name(name))
 
         if text is None:
             text = u''
 
         if text is None:
             text = u''
@@ -90,6 +97,9 @@ class DocumentStorage(object):
             changeset['description'] = STAGE_TAGS_RE.sub(stage_desc, changeset['description'])
             yield changeset
 
             changeset['description'] = STAGE_TAGS_RE.sub(stage_desc, changeset['description'])
             yield changeset
 
+    def doc_meta(self, title, revision=None):
+        return self.vstorage.page_meta(title, revision)
+
 
 
 class Document(object):
 
 
 class Document(object):
@@ -121,7 +131,7 @@ class Document(object):
                 except ValueError:
                     continue
 
                 except ValueError:
                     continue
 
-        gallery = result.get('gallery', self.name.replace(' ', '_'))
+        gallery = result.get('gallery', slughifi(self.name.replace(' ', '_')))
 
         if gallery.startswith('/'):
             gallery = os.path.basename(gallery)
 
         if gallery.startswith('/'):
             gallery = os.path.basename(gallery)
@@ -138,3 +148,18 @@ def getstorage():
 #
 # Django models
 #
 #
 # Django models
 #
+
+class Theme(models.Model):
+    name = models.CharField(_('name'), max_length=50, unique=True)
+
+    class Meta:
+        ordering = ('name',)
+        verbose_name = _('theme')
+        verbose_name_plural = _('themes')
+
+    def __unicode__(self):
+        return self.name
+
+    def __repr__(self):
+        return "Theme(name=%r)" % self.name
+