d736c027f0da586a7f2f6cbaf13c1b3c95a04836
[redakcja.git] / apps / toolbar / 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
10 class ButtonGroup(models.Model):
11     name = models.CharField(max_length = 32)
12     slug = models.SlugField()
13     position = models.IntegerField(default = 0)
14
15     class Meta:
16         ordering = ('position', 'name',)
17         verbose_name, verbose_name_plural = _('button group'), _('button groups')
18
19     def __unicode__(self):
20         return self.name
21
22     def to_dict(self, with_buttons = False):
23         d = {'name': self.name, 'position': self.position}
24
25         if with_buttons:
26             d['buttons'] = [ b.to_dict() for b in self.button_set.all() ]
27
28         return d
29
30 #class ButtonGroupManager(models.Manager):
31 #
32 #    def with_buttons(self):
33 #        from django.db import connection
34 #        cursor = connection.cursor()
35 #        cursor.execute("""
36 #            SELECT g.name, g.slug, CONCAT(b.slug),
37 #            FROM toolbar_buttongroup as g LEFT JOIN toolbar_button as b
38 #
39 #            WHERE p.id = r.poll_id
40 #            GROUP BY 1, 2, 3
41 #            ORDER BY 3 DESC""")
42 #        result_list = []
43 #        for row in cursor.fetchall():
44 #            p = self.model(id=row[0], question=row[1], poll_date=row[2])
45 #            p.num_responses = row[3]
46 #            result_list.append(p)
47 #        return result_list
48
49 class Button(models.Model):
50     label = models.CharField(max_length = 32)
51     slug = models.SlugField(unique = True) #unused
52
53     # behaviour
54     params = models.TextField(default = '[]') # TODO: should be a JSON field
55     scriptlet = models.ForeignKey('Scriptlet', null = True, blank = True)
56     link = models.CharField(max_length = 256, blank = True, default = '')
57
58     # ui related stuff
59     accesskey = models.CharField(null = True, max_length = 1)
60         
61     tooltip = models.CharField(blank = True, max_length = 120)
62
63     # Why the button is restricted to have the same position in each group ?
64     # position = models.IntegerField(default=0)   
65     group = models.ManyToManyField(ButtonGroup)
66
67     class Meta:
68         ordering = ('slug',)
69         verbose_name, verbose_name_plural = _('button'), _('buttons')
70
71     @property
72     def full_tooltip(self):
73         return u"%s %s" % (self.tooltip, "[Alt+%s]" % self.accesskey if self.accesskey else "")
74
75     def to_dict(self):
76         return {
77             'label': self.label,
78             'tooltip': self.tooltip,
79             'accesskey': self.accesskey,            
80             'params': self.params,
81             'scriptlet_id': self.scriptlet_id
82         }
83
84     def __unicode__(self):
85         return self.label
86
87 class Scriptlet(models.Model):
88     name = models.CharField(max_length = 64, primary_key = True)
89     code = models.TextField()
90
91     def __unicode__(self):
92         return _(u'javascript') + u':' + self.name