3 from django.utils.translation import ugettext as _
5 question_view = django.dispatch.Signal(providing_args=['instance', 'user'])
8 accepted_answer = models.OneToOneField('Answer', null=True, related_name="question_accepting")
9 closed = models.BooleanField(default=False)
10 closed_by = models.ForeignKey(User, null=True, blank=True, related_name='closed_questions')
11 closed_at = models.DateTimeField(null=True, blank=True)
12 close_reason = models.SmallIntegerField(choices=CLOSE_REASONS, null=True, blank=True)
13 subscribers = models.ManyToManyField(User, related_name='subscriptions', through='QuestionSubscription')
16 answer_count = models.PositiveIntegerField(default=0)
17 view_count = models.IntegerField(default=0)
18 favourite_count = models.IntegerField(default=0)
19 last_activity_at = models.DateTimeField(default=datetime.datetime.now)
20 last_activity_by = models.ForeignKey(User, related_name='last_active_in_questions')
22 favorited_by = models.ManyToManyField(User, through='FavoriteQuestion', related_name='favorite_questions')
24 class Meta(QandA.Meta):
25 db_table = u'question'
30 return _('[closed] ') + self.title
33 return _('[deleted] ') + self.title
38 def answer_accepted(self):
39 return self.accepted_answer is not None
42 super(Question, self).delete()
46 logging.debug('problem pinging google did you register you sitemap with google?')
48 def update_last_activity(self, user):
49 self.last_activity_by = user
50 self.last_activity_at = datetime.datetime.now()
53 def activate_revision(self, user, revision):
54 super(Question, self).activate_revision(user, revision)
55 self.update_last_activity(user)
58 def get_absolute_url(self):
59 return ('question', (), {'id': self.id, 'slug': django_urlquote(slugify(self.title))})
61 def get_answer_count_by_user(self, user_id):
62 from answer import Answer
63 query_set = Answer.objects.filter(author__id=user_id)
64 return query_set.filter(question=self).count()
66 def get_question_title(self):
68 attr = CONST['closed']
70 attr = CONST['deleted']
74 return u'%s %s' % (self.title, attr)
78 def get_revision_url(self):
79 return reverse('question_revisions', args=[self.id])
81 def get_latest_revision(self):
82 return self.revisions.all()[0]
84 def get_related_questions(self, count=10):
85 cache_key = '%s.related_questions:%d:%d' % (settings.APP_URL, count, self.id)
86 related_list = cache.get(cache_key)
88 if related_list is None:
89 related_list = Question.objects.values('id').filter(tags__id__in=[t.id for t in self.tags.all()]
90 ).exclude(id=self.id).exclude(deleted=True).annotate(frequency=models.Count('id')).order_by('-frequency')[:count]
91 cache.set(cache_key, related_list, 60 * 60)
93 return [Question.objects.get(id=r['id']) for r in related_list]
95 def __unicode__(self):
98 def question_viewed(instance, **kwargs):
99 instance.view_count += 1
102 question_view.connect(question_viewed)
104 class FavoriteQuestion(models.Model):
105 question = models.ForeignKey('Question')
106 user = models.ForeignKey(User, related_name='user_favorite_questions')
107 added_at = models.DateTimeField(default=datetime.datetime.now)
110 unique_together = ('question', 'user')
112 db_table = u'favorite_question'
114 def __unicode__(self):
115 return '[%s] favorited at %s' %(self.user, self.added_at)
117 def _update_question_fav_count(self, diff):
118 self.question.favourite_count = self.question.favourite_count + diff
121 def save(self, *args, **kwargs):
122 super(FavoriteQuestion, self).save(*args, **kwargs)
124 self._update_question_fav_count(1)
127 self._update_question_fav_count(-1)
128 super(FavoriteQuestion, self).delete()
130 class QuestionSubscription(models.Model):
131 user = models.ForeignKey(User)
132 question = models.ForeignKey(Question)
133 auto_subscription = models.BooleanField(default=True)
134 last_view = models.DateTimeField(default=datetime.datetime.now())
140 class QuestionRevision(NodeRevision):