validate Projects field in organization
[redakcja.git] / apps / organizations / models.py
1 # -*- coding: utf-8 -*-
2 from __future__ import unicode_literals
3
4 from django.core.urlresolvers import reverse
5 from django.contrib.auth.models import User
6 from django.db import models
7 from django.utils.encoding import python_2_unicode_compatible
8 from django.template.loader import render_to_string
9 from django.utils import translation
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(None, 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 (AssertionError, AttributeError):
87             return self.preview_html
88
89
90 @python_2_unicode_compatible
91 class UserCard(Card):
92     preview_html_template = 'organizations/snippets/user.html'
93     user = models.OneToOneField(User, primary_key=True)
94
95     def __str__(self):
96         return str(self.user)
97
98     def get_absolute_url(self):
99         return reverse('organizations_user', args=[self.user.pk])
100
101
102 @python_2_unicode_compatible
103 class Organization(Card):
104     preview_html_template = 'organizations/snippets/organization.html'
105
106     name = models.CharField(max_length=1024)
107     tags = models.ManyToManyField('catalogue.Tag', blank=True)
108     # logo = models.ImageField(upload_to='people/logo', blank=True)
109     # country = models.CharField(max_length=64, blank=True, choices=countries)
110     # www = models.URLField(blank=True)
111     # description = models.TextField(blank=True, default="")
112     # #projects = JSONField(default=[])
113     # projects = models.TextField(blank=True, default="")
114
115     # preview_html = models.TextField(blank=True, default="")
116
117     # created_at = models.DateTimeField(auto_now_add=True)
118
119     def __str__(self):
120         return self.name
121
122     def get_absolute_url(self):
123         return reverse("organizations_main", args=[self.pk])
124
125     def get_user_status(self, user):
126         if not user.is_authenticated():
127             return None
128         try:
129             member = self.membership_set.get(user=user)
130         except Membership.DoesNotExist:
131             return None
132         else:
133             return member.status
134
135     def is_member(self, user):
136         return self.get_user_status(user) in (
137             Membership.Status.OWNER, Membership.Status.REGULAR)
138
139     def is_owner(self, user):
140         return self.get_user_status(user) == Membership.Status.OWNER
141
142     def set_user_status(self, user, status):
143         try:
144             member = self.membership_set.get(user=user)
145         except Membership.DoesNotExist:
146             if status is not None:
147                 self.membership_set.create(user=user, status=status)
148         else:
149             if status is not None:
150                 member.status = status
151                 member.save()
152             else:
153                 member.delete()
154
155
156 class Membership(models.Model):
157     class Status:
158         PENDING = 'pending'
159         REGULAR = 'regular'
160         OWNER = 'owner'
161
162         choices = (
163             (PENDING, 'Membership pending'),
164             (REGULAR, 'Regular member'),
165             (OWNER, 'Organizaition owner'),
166         )
167
168     organization = models.ForeignKey(Organization)
169     user = models.ForeignKey(User)
170     status = models.CharField(max_length=10, choices=Status.choices, default=Status.REGULAR)
171     created_at = models.DateTimeField(auto_now_add=True)
172
173     class Meta:
174         ordering = ('user', 'organization')