9d3300a2fc0e6f22143027223f66eb4739b81d85
[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     tags = models.ManyToManyField('catalogue.Tag')
107     # logo = models.ImageField(upload_to='people/logo', blank=True)
108     # country = models.CharField(max_length=64, blank=True, choices=countries)
109     # www = models.URLField(blank=True)
110     # description = models.TextField(blank=True, default="")
111     # #projects = JSONField(default=[])
112     # projects = models.TextField(blank=True, default="")
113
114     # preview_html = models.TextField(blank=True, default="")
115
116     # created_at = models.DateTimeField(auto_now_add=True)
117
118     def __str__(self):
119         return self.name
120
121     def get_absolute_url(self):
122         return reverse("organizations_main", args=[self.pk])
123
124     def get_user_status(self, user):
125         if not user.is_authenticated():
126             return None
127         try:
128             member = self.membership_set.get(user=user)
129         except Membership.DoesNotExist:
130             return None
131         else:
132             return member.status
133
134     def is_member(self, user):
135         return self.get_user_status(user) in (
136             Membership.Status.OWNER, Membership.Status.REGULAR)
137
138     def is_owner(self, user):
139         return self.get_user_status(user) == Membership.Status.OWNER
140
141     def set_user_status(self, user, status):
142         try:
143             member = self.membership_set.get(user=user)
144         except Membership.DoesNotExist:
145             if status is not None:
146                 self.membership_set.create(user=user, status=status)
147         else:
148             if status is not None:
149                 member.status = status
150                 member.save()
151             else:
152                 member.delete()
153
154
155 class Membership(models.Model):
156     class Status:
157         PENDING = 'pending'
158         REGULAR = 'regular'
159         OWNER = 'owner'
160
161         choices = (
162             (PENDING, 'Membership pending'),
163             (REGULAR, 'Regular member'),
164             (OWNER, 'Organizaition owner'),
165         )
166
167     organization = models.ForeignKey(Organization)
168     user = models.ForeignKey(User)
169     status = models.CharField(max_length=10, choices=Status.choices, default=Status.REGULAR)
170     created_at = models.DateTimeField(auto_now_add=True)
171
172     class Meta:
173         ordering = ('user', 'organization')