update requirements
[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
79     def __str__(self):
80         return self.name
81
82     def get_absolute_url(self):
83         return reverse("organizations_main", args=[self.pk])
84
85     def get_user_status(self, user):
86         if not user.is_authenticated():
87             return None
88         try:
89             member = self.membership_set.get(user=user)
90         except Membership.DoesNotExist:
91             return None
92         else:
93             return member.status
94
95     def is_member(self, user):
96         return self.get_user_status(user) in (
97             Membership.Status.OWNER, Membership.Status.REGULAR)
98
99     def is_owner(self, user):
100         return self.get_user_status(user) == Membership.Status.OWNER
101
102     def set_user_status(self, user, status):
103         try:
104             member = self.membership_set.get(user=user)
105         except Membership.DoesNotExist:
106             if status is not None:
107                 self.membership_set.create(user=user, status=status)
108         else:
109             if status is not None:
110                 member.status = status
111                 member.save()
112             else:
113                 member.delete()
114
115
116 class Membership(models.Model):
117     class Status:
118         PENDING = 'pending'
119         REGULAR = 'regular'
120         OWNER = 'owner'
121
122         choices = (
123             (PENDING, 'Membership pending'),
124             (REGULAR, 'Regular member'),
125             (OWNER, 'Organizaition owner'),
126         )
127
128     organization = models.ForeignKey(Organization)
129     user = models.ForeignKey(User)
130     status = models.CharField(max_length=10, choices=Status.choices, default=Status.REGULAR)
131     created_at = models.DateTimeField(auto_now_add=True)
132
133     class Meta:
134         ordering = ('user', 'organization')