fix in editor
[redakcja.git] / apps / organizations / models.py
1 from __future__ import unicode_literals
2
3 from django.core.urlresolvers import reverse
4 from django.contrib.auth.models import User
5 from django.db import models
6 from django.utils.encoding import python_2_unicode_compatible
7 from django.template.loader import render_to_string
8 from django.utils import translation 
9 #from jsonfield import JSONField
10
11
12 countries = [
13     ('intl', 'International'),
14     ('at', 'Austria'),
15     ('be', 'Belgium'),
16     ('gb', 'Bulgaria'),
17     ('hr', 'Croatia'),
18     ('cy', 'Cyprus'),
19     ('cz', 'Czech Republic'),
20     ('dk', 'Denmark'),
21     ('ee', 'Estonia'),
22     ('fi', 'Finland'),
23     ('fr', 'France'),
24     ('de', 'Germany'),
25     ('gr', 'Greece'),
26     ('hu', 'Hungary'),
27     ('ie', 'Ireland'),
28     ('it', 'Italy'),
29     ('lv', 'Latvia'),
30     ('lt', 'Lithuania'),
31     ('lu', 'Luxembourg'),
32     ('mt', 'Malta'),
33     ('nl', 'Netherlands'),
34     ('pl', 'Poland'),
35     ('pt', 'Portugal'),
36     ('ro', 'Romania'),
37     ('sk', 'Slovakia'),
38     ('si', 'Slovenia'),
39     ('es', 'Spain'),
40     ('se', 'Sweden'),
41     ('uk', 'United Kingdom'),
42 ]
43
44
45 class Card(models.Model):
46     logo = models.ImageField(upload_to='people/logo', blank=True)
47     country = models.CharField(max_length=64, blank=True, choices=countries)
48     www = models.URLField(blank=True)
49     description = models.TextField(blank=True, default="")
50     projects = models.TextField(blank=True, default="")
51
52     preview_html = models.TextField(blank=True, default="")
53     preview_html_pl = models.TextField(blank=True, default="")
54
55     created_at = models.DateTimeField(auto_now_add=True)
56
57     class Meta:
58         abstract = True
59
60     def save(self, *args, **kwargs):
61         translation.activate('en')
62         self.preview_html = render_to_string(self.preview_html_template, {
63             'org': self
64         })
65         translation.activate('pl')
66         self.preview_html_pl = render_to_string(self.preview_html_template, {
67             'org': self
68         })
69         ret = super(Card, self).save(*args, **kwargs)
70         return ret
71
72     def get_projects(self):
73         for project_line in self.projects.strip().split('\n'):
74             parts = project_line.strip().split(' ', 2)
75             if not parts or not parts[0]:
76                 continue
77             url, lang, desc = (parts + [''] * 2)[:3]
78             yield url, lang, desc
79
80     def get_preview_html(self):
81         lang = translation.get_language()
82         try:
83             p = getattr(self, "preview_html_%s" % lang)
84             assert p
85             return p
86         except:
87             return self.preview_html
88
89 @python_2_unicode_compatible
90 class UserCard(Card):
91     preview_html_template = 'organizations/snippets/user.html'
92     user = models.ForeignKey(User, unique=True, primary_key=True)
93
94     def __str__(self):
95         return str(self.user)
96
97     def get_absolute_url(self):
98         return reverse('organizations_user', args=[self.user.pk])
99
100
101 @python_2_unicode_compatible
102 class Organization(Card):
103     preview_html_template = 'organizations/snippets/organization.html'
104
105     name = models.CharField(max_length=1024)
106     #logo = models.ImageField(upload_to='people/logo', blank=True)
107     #country = models.CharField(max_length=64, blank=True, choices=countries)
108     #www = models.URLField(blank=True)
109     #description = models.TextField(blank=True, default="")
110     ##projects = JSONField(default=[])
111     #projects = models.TextField(blank=True, default="")
112
113     #preview_html = models.TextField(blank=True, default="")
114
115     #created_at = models.DateTimeField(auto_now_add=True)
116
117     def __str__(self):
118         return self.name
119
120     def get_absolute_url(self):
121         return reverse("organizations_main", args=[self.pk])
122
123     def get_user_status(self, user):
124         if not user.is_authenticated():
125             return None
126         try:
127             member = self.membership_set.get(user=user)
128         except Membership.DoesNotExist:
129             return None
130         else:
131             return member.status
132
133     def is_member(self, user):
134         return self.get_user_status(user) in (
135             Membership.Status.OWNER, Membership.Status.REGULAR)
136
137     def is_owner(self, user):
138         return self.get_user_status(user) == Membership.Status.OWNER
139
140     def set_user_status(self, user, status):
141         try:
142             member = self.membership_set.get(user=user)
143         except Membership.DoesNotExist:
144             if status is not None:
145                 self.membership_set.create(user=user, status=status)
146         else:
147             if status is not None:
148                 member.status = status
149                 member.save()
150             else:
151                 member.delete()
152
153
154 class Membership(models.Model):
155     class Status:
156         PENDING = 'pending'
157         REGULAR = 'regular'
158         OWNER = 'owner'
159
160         choices = (
161             (PENDING, 'Membership pending'),
162             (REGULAR, 'Regular member'),
163             (OWNER, 'Organizaition owner'),
164         )
165
166     organization = models.ForeignKey(Organization)
167     user = models.ForeignKey(User)
168     status = models.CharField(max_length=10, choices=Status.choices, default=Status.REGULAR)
169     created_at = models.DateTimeField(auto_now_add=True)
170
171     class Meta:
172         ordering = ('user', 'organization')