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
|
import datetime
from django.db import models
from forum import const
from forum.models import base
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(base.MetaContent, base.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(base.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(base.MetaContent, base.UserContent):
"""A flag on a Question or Answer indicating offensive content."""
flagged_at = models.DateTimeField(default=datetime.datetime.now)
objects = FlaggedItemManager()
class Meta(base.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(base.MetaContent, base.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='')
_urlize = True
_use_markdown = False
class Meta(base.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
def set_text(self, text):
self.comment = text
def parse(self):
return base.parse_post_text(self)
def save(self,**kwargs):
base.save_post(self)
def get_updated_activity_type(self, created = False):
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 get_time_of_last_edit(self):
return self.added_at
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
|