0919f7610b425198f3930e1353ce8f6565f72347
[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
9
10 countries = [
11     ('intl', 'International'),
12     ('at', 'Austria'),
13     ('be', 'Belgium'),
14     ('gb', 'Bulgaria'),
15     ('hr', 'Croatia'),
16     ('cy', 'Cyprus'),
17     ('cz', 'Czech Republic'),
18     ('dk', 'Denmark'),
19     ('ee', 'Estonia'),
20     ('fi', 'Finland'),
21     ('fr', 'France'),
22     ('de', 'Germany'),
23     ('gr', 'Greece'),
24     ('hu', 'Hungary'),
25     ('ie', 'Ireland'),
26     ('it', 'Italy'),
27     ('lv', 'Latvia'),
28     ('lt', 'Lithuania'),
29     ('lu', 'Luxembourg'),
30     ('mt', 'Malta'),
31     ('nl', 'Netherlands'),
32     ('pl', 'Poland'),
33     ('pt', 'Portugal'),
34     ('ro', 'Romania'),
35     ('sk', 'Slovakia'),
36     ('si', 'Slovenia'),
37     ('es', 'Spain'),
38     ('se', 'Sweden'),
39     ('uk', 'United Kingdom'),
40 ]
41
42
43 class Card(models.Model):
44     logo = models.ImageField(upload_to='people/logo', blank=True)
45     country = models.CharField(max_length=64, blank=True, choices=countries)
46     www = models.URLField(blank=True)
47     description = models.TextField(blank=True, default="")
48     projects = models.TextField(blank=True, default="")
49
50     created_at = models.DateTimeField(auto_now_add=True)
51
52     class Meta:
53         abstract = True
54
55     def get_projects(self):
56         for project_line in self.projects.strip().split('\n'):
57             parts = project_line.strip().split(None, 2)
58             if not parts or not parts[0]:
59                 continue
60             url, lang, desc = (parts + [''] * 2)[:3]
61             yield url, lang, desc
62
63
64 @python_2_unicode_compatible
65 class UserCard(Card):
66     user = models.OneToOneField(User, primary_key=True)
67
68     def __str__(self):
69         return self.user.get_full_name()
70
71     def get_absolute_url(self):
72         return reverse('organizations_user', args=[self.user.pk])
73
74
75 @python_2_unicode_compatible
76 class Organization(Card):
77     name = models.CharField(max_length=1024)
78     tags = models.ManyToManyField('catalogue.Tag', blank=True)
79
80     def __str__(self):
81         return self.name
82
83     def get_absolute_url(self):
84         return reverse("organizations_main", args=[self.pk])
85
86     def get_user_status(self, user):
87         if not user.is_authenticated():
88             return None
89         try:
90             member = self.membership_set.get(user=user)
91         except Membership.DoesNotExist:
92             return None
93         else:
94             return member.status
95
96     def is_member(self, user):
97         return self.get_user_status(user) in (
98             Membership.Status.OWNER, Membership.Status.REGULAR)
99
100     def is_owner(self, user):
101         return self.get_user_status(user) == Membership.Status.OWNER
102
103     def set_user_status(self, user, status):
104         try:
105             member = self.membership_set.get(user=user)
106         except Membership.DoesNotExist:
107             if status is not None:
108                 self.membership_set.create(user=user, status=status)
109         else:
110             if status is not None:
111                 member.status = status
112                 member.save()
113             else:
114                 member.delete()
115
116
117 class Membership(models.Model):
118     class Status:
119         PENDING = 'pending'
120         REGULAR = 'regular'
121         OWNER = 'owner'
122
123         choices = (
124             (PENDING, 'Membership pending'),
125             (REGULAR, 'Regular member'),
126             (OWNER, 'Organizaition owner'),
127         )
128
129     organization = models.ForeignKey(Organization)
130     user = models.ForeignKey(User)
131     status = models.CharField(max_length=10, choices=Status.choices, default=Status.REGULAR)
132     created_at = models.DateTimeField(auto_now_add=True)
133
134     class Meta:
135         ordering = ('user', 'organization')