forked from nathanborror/django-basic-apps
/
models.py
185 lines (144 loc) · 5.79 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
from django.db import models
from django.db.models import permalink
from django.contrib.auth.models import User
from django.conf import settings
from basic.tools.shortcuts import build_filename
GROUP_OWNER = 0
GROUP_MODERATOR = 1
GROUP_MEMBER = 2
GROUP_MEMBER_CHOICES = (
(GROUP_OWNER, 'Owner'),
(GROUP_MODERATOR, 'Moderator'),
(GROUP_MEMBER, 'Member')
)
def get_icon_path(instance, filename):
if instance.pk:
group = Group.objects.get(pk=instance.pk)
if group.icon:
return group.icon.path.replace(settings.MEDIA_ROOT, '')
return build_filename(instance, filename)
class Group(models.Model):
""" Group model """
title = models.CharField(blank=False, max_length=255)
slug = models.SlugField(unique=True, help_text="Used for the Group URL: http://example.com/groups/the-club/")
tease = models.TextField(blank=True, help_text="Brief explaination of what this group is. Shows up when the group is listed amoung other groups.")
creator = models.ForeignKey(User, related_name='created_groups', help_text="Serves as a record as who the original creator was in case ownership is transfered.")
icon = models.FileField(upload_to=get_icon_path, blank=True, help_text="Needs to be larger than 120x120 pixels.")
invite_only = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.title
@permalink
def get_absolute_url(self):
return ('groups:group', None, {'slug': self.slug})
def owners(self):
return self.members.filter(status=0)
def moderators(self):
return self.members.filter(status=1)
def is_member(self, user):
try:
member = self.members.get(user=user)
return member
except:
return None
class GroupPage(models.Model):
""" GroupPage model """
group = models.ForeignKey(Group, related_name='pages')
title = models.CharField(blank=True, max_length=100)
slug = models.SlugField(help_text='Used for the page URL.')
body = models.TextField(blank=True)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.title
class Meta:
unique_together = (('slug', 'group'),)
@permalink
def get_absolute_url(self):
return ('groups:page', None, {
'slug': self.group.slug,
'page_slug': self.slug
})
class GroupTopic(models.Model):
""" GroupTopic model """
group = models.ForeignKey(Group, related_name='topics')
user = models.ForeignKey(User, related_name='group_topics')
title = models.CharField(blank=False, max_length=100)
description = models.TextField(blank=True)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
ordering = ('-id',)
def __unicode__(self):
return self.title
@permalink
def get_absolute_url(self):
return ('groups:topic', [self.group.slug, self.pk])
@permalink
def get_edit_url(self):
return ('groups:topic_edit', [self.group.slug, self.pk])
@permalink
def get_remove_url(self):
return ('groups:topic_remove', [self.group.slug, self.pk])
class GroupMessageManager(models.Manager):
"""Returns messages that are flagged as active."""
def get_query_set(self):
return super(GroupMessageManager, self).get_query_set().filter(is_active=True)
class GroupMessage(models.Model):
""" GroupMessage model """
topic = models.ForeignKey(GroupTopic, related_name="messages")
user = models.ForeignKey(User)
message = models.TextField(blank=False)
is_active = models.BooleanField(default=True)
objects = GroupMessageManager()
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.message
@permalink
def get_absolute_url(self):
return ('groups:message',
[self.topic.group.slug, self.topic.pk, self.pk])
@permalink
def get_edit_url(self):
return ('groups:message_edit',
[self.topic.group.slug, self.topic.pk, self.pk])
@permalink
def get_remove_url(self):
return ('groups:message_remove',
[self.topic.group.slug, self.topic.pk, self.pk])
class GroupMemberManager(models.Manager):
"""Returns memebers that belong to a group"""
def is_member(self, group, user):
if user.is_anonymous():
return False
if self.filter(group=group, user=user).count() > 0:
return True
return False
def is_owner(self, group, user):
if user.is_anonymous():
return False
if self.filter(group=group, user=user, status=GROUP_OWNER).count() > 0:
return True
return False
def is_moderator(self, group, user):
if user.is_anonymous():
return False
if self.filter(group=group, user=user, status__in=(GROUP_MODERATOR, GROUP_OWNER)).count() > 0:
return True
return False
class GroupMember(models.Model):
""" GroupMember model """
user = models.ForeignKey(User, related_name='group_memberships')
group = models.ForeignKey(Group, related_name='members')
status = models.PositiveSmallIntegerField(choices=GROUP_MEMBER_CHOICES, default=GROUP_MEMBER)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
objects = GroupMemberManager()
class Meta:
unique_together = (('user', 'group'),)
def __unicode__(self):
return self.user.username