working prototype without mercurial repo
[redakcja.git] / apps / wiki / models.py
1 # -*- coding: utf-8 -*-
2 #
3 # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
4 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
5 #
6 from django.db import models
7 from django.utils.translation import ugettext_lazy as _
8
9 from dvcs import models as dvcs_models
10
11
12 import logging
13 logger = logging.getLogger("fnp.wiki")
14
15
16 class Book(models.Model):
17     """ A document edited on the wiki """
18
19     slug = models.SlugField(_('slug'), max_length=255, unique=True)
20     title = models.CharField(_('displayed title'), max_length=255, blank=True)
21     doc = models.ForeignKey(dvcs_models.Document, editable=False)
22     gallery = models.CharField(_('scan gallery name'), max_length=255, blank=True)
23
24     class Meta:
25         ordering = ['title']
26         verbose_name = _('book')
27         verbose_name_plural = _('books')
28
29     def __unicode__(self):
30         return self.title
31
32     @classmethod
33     def create(cls, creator=None, text=u'', *args, **kwargs):
34         instance = cls(*args, **kwargs)
35         instance.doc = dvcs_models.Document.create(creator=creator, text=text)
36         instance.save()
37         return instance
38
39     @staticmethod
40     def listener_create(sender, instance, created, **kwargs):
41         if created and instance.doc is None:
42             instance.doc = dvcs_models.Document.objects.create()
43             instance.save()
44
45 models.signals.post_save.connect(Book.listener_create, sender=Book)
46
47
48
49 '''
50 from wiki import settings, constants
51 from slughifi import slughifi
52
53 from django.http import Http404
54
55
56
57
58 class Document(object):
59
60     def add_tag(self, tag, revision, author):
61         """ Add document specific tag """
62         logger.debug("Adding tag %s to doc %s version %d", tag, self.name, revision)
63         self.storage.vstorage.add_page_tag(self.name, revision, tag, user=author)
64
65     @property
66     def plain_text(self):
67         return re.sub(self.META_REGEX, '', self.text, 1)
68
69     def meta(self):
70         result = {}
71
72         m = re.match(self.META_REGEX, self.text)
73         if m:
74             for line in m.group(1).split('\n'):
75                 try:
76                     k, v = line.split(':', 1)
77                     result[k.strip()] = v.strip()
78                 except ValueError:
79                     continue
80
81         gallery = result.get('gallery', slughifi(self.name.replace(' ', '_')))
82
83         if gallery.startswith('/'):
84             gallery = os.path.basename(gallery)
85
86         result['gallery'] = gallery
87         return result
88
89     def info(self):
90         return self.storage.vstorage.page_meta(self.name, self.revision)
91
92
93
94 '''
95 class Theme(models.Model):
96     name = models.CharField(_('name'), max_length=50, unique=True)
97
98     class Meta:
99         ordering = ('name',)
100         verbose_name = _('theme')
101         verbose_name_plural = _('themes')
102
103     def __unicode__(self):
104         return self.name
105
106     def __repr__(self):
107         return "Theme(name=%r)" % self.name
108