#977: slugify tool
[redakcja.git] / apps / wiki / models.py
index acad2c3..7cb20c6 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
@@ -32,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)
 
@@ -51,6 +53,9 @@ 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, **commit_args):
+        self.vstorage.revert(name, revision, **commit_args)
+
     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)
@@ -68,7 +73,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''
@@ -91,6 +96,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):
@@ -122,7 +130,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)
@@ -139,3 +147,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
+