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
|
from django.db import models
from base import MetaContent, UserContent
from base import render_post_text_and_get_newly_mentioned_users
from base import save_content
from forum import const
import datetime
class VoteManager(models.Manager):
def get_up_vote_count_from_user(self, user):
if user is not None:
return self.filter(user=user, vote=1).count()
else:
return 0
def get_down_vote_count_from_user(self, user):
if user is not None:
return self.filter(user=user, vote=-1).count()
else:
return 0
def get_votes_count_today_from_user(self, user):
if user is not None:
today = datetime.date.today()
return self.filter(user=user, voted_at__range=(today, today + datetime.timedelta(1))).count()
else:
return 0
class Vote(MetaContent, UserContent):
VOTE_UP = +1
VOTE_DOWN = -1
VOTE_CHOICES = (
(VOTE_UP, u'Up'),
(VOTE_DOWN, u'Down'),
)
vote = models.SmallIntegerField(choices=VOTE_CHOICES)
voted_at = models.DateTimeField(default=datetime.datetime.now)
objects = VoteManager()
class Meta(MetaContent.Meta):
unique_together = ('content_type', 'object_id', 'user')
db_table = u'vote'
def __unicode__(self):
return '[%s] voted at %s: %s' %(self.user, self.voted_at, self.vote)
def is_upvote(self):
return self.vote == self.VOTE_UP
def is_downvote(self):
return self.vote == self.VOTE_DOWN
def is_opposite(self, vote_type):
assert(vote_type in (self.VOTE_UP, self.VOTE_DOWN))
return self.vote != vote_type
class FlaggedItemManager(models.Manager):
def get_flagged_items_count_today(self, user):
if user is not None:
today = datetime.date.today()
return self.filter(user=user, flagged_at__range=(today, today + datetime.timedelta(1))).count()
else:
return 0
class FlaggedItem(MetaContent, UserContent):
"""A flag on a Question or Answer indicating offensive content."""
flagged_at = models.DateTimeField(default=datetime.datetime.now)
objects = FlaggedItemManager()
class Meta(MetaContent.Meta):
unique_together = ('content_type', 'object_id', 'user')
db_table = u'flagged_item'
def __unicode__(self):
return '[%s] flagged at %s' %(self.user, self.flagged_at)
class Comment(MetaContent, UserContent):
comment = models.CharField(max_length = const.COMMENT_HARD_MAX_LENGTH)
added_at = models.DateTimeField(default = datetime.datetime.now)
html = models.CharField(max_length = const.COMMENT_HARD_MAX_LENGTH, default='')
class Meta(MetaContent.Meta):
ordering = ('-added_at',)
db_table = u'comment'
def get_origin_post(self):
return self.content_object.get_origin_post()
#todo: maybe remove this wnen post models are unified
def get_text(self):
return self.comment
_render_text_and_get_newly_mentioned_users = \
render_post_text_and_get_newly_mentioned_users
_save = save_content
def save(self,**kwargs):
self._save(urlize_content = True)
def get_updated_activity_type(self):
if self.content_object.__class__.__name__ == 'Question':
return const.TYPE_ACTIVITY_COMMENT_QUESTION
elif self.content_object.__class__.__name__ == 'Answer':
return const.TYPE_ACTIVITY_COMMENT_ANSWER
def get_potentially_interested_users(self):
users = set()
users.update(
#get authors of parent object and all associated comments
self.content_object.get_author_list(
include_comments = True,
)
)
users -= set([self.user])#remove activity user
return list(users)
def delete(self, **kwargs):
#todo: not very good import in models of other models
#todo: potentially a circular import
from forum.models.user import Activity
Activity.objects.get_mentions(
mentioned_in = self
).delete()
super(Comment,self).delete(**kwargs)
def get_absolute_url(self):
origin_post = self.get_origin_post()
return '%s#comment-%d' % (origin_post.get_absolute_url(), self.id)
def get_latest_revision_number(self):
return 1
def __unicode__(self):
return self.comment
|