Lot of small improvement in the forum

This commit is contained in:
Skia
2017-02-24 01:50:09 +01:00
parent 3b16704227
commit c66b9b0512
4 changed files with 72 additions and 38 deletions

View File

@ -6,6 +6,7 @@ from django.core.exceptions import ValidationError
from django.db import IntegrityError, transaction
from django.core.urlresolvers import reverse
from django.utils import timezone
from django.utils.functional import cached_property
from datetime import datetime
import pytz
@ -16,6 +17,10 @@ from club.models import Club
class Forum(models.Model):
"""
The Forum class, made as a tree to allow nice tidy organization
owner_club allows club members to moderate there own topics
edit_groups allows to put any group as a forum admin
view_groups allows some groups to view a forum
"""
name = models.CharField(_('name'), max_length=64)
description = models.CharField(_('description'), max_length=256, default="")
@ -77,6 +82,10 @@ class Forum(models.Model):
def get_absolute_url(self):
return reverse('forum:view_forum', kwargs={'forum_id': self.id})
@cached_property
def parent_list(self):
return self.get_parent_list()
def get_parent_list(self):
l = []
p = self.parent
@ -85,22 +94,27 @@ class Forum(models.Model):
p = p.parent
return l
@cached_property
def topic_number(self):
return self.get_topic_number()
def get_topic_number(self):
number = self.topics.all().count()
for c in self.children.all():
number += c.get_topic_number()
number += c.topic_number
return number
@cached_property
def last_message(self):
return self.get_last_message()
def get_last_message(self):
last_msg = None
for m in ForumMessage.objects.order_by('-id'):
for m in ForumMessage.objects.select_related('topic__forum', 'author').order_by('-id'):
forum = m.topic.forum
if self in (forum.get_parent_list() + [forum]):
if self in (forum.parent_list + [forum]):
return m
last_msg = m
try:
pass
except: pass
return last_msg
class ForumTopic(models.Model):
@ -145,26 +159,34 @@ class ForumMessage(models.Model):
ordering = ['id']
def __str__(self):
return "%s" % (self.title)
return "%s - %s" % (self.id, self.title)
def is_owned_by(self, user):
return self.topic.is_owned_by(user) or user.id == self.author.id
def is_owned_by(self, user): # Anyone can create a topic: it's better to
# check the rights at the forum level, since it's more controlled
return self.topic.forum.is_owned_by(user) or user.id == self.author.id
def can_be_edited_by(self, user):
return user.is_owner(self.topic)
return user.can_edit(self.topic.forum)
def can_be_viewed_by(self, user):
return user.can_view(self.topic)
def can_be_moderated_by(self, user):
return user.is_in_group(settings.SITH_GROUP_FORUM_ADMIN_ID)
return self.topic.forum.is_owned_by(user)
def get_absolute_url(self):
return self.topic.get_absolute_url() + "#first_unread"
return self.topic.get_absolute_url() + "#msg_" + str(self.id)
def mark_as_read(self, user):
self.readers.add(user)
def is_read(self, user):
return (self.date < user.forum_infos.last_read_date) or (user in self.readers.all())
@cached_property
def deleted(self):
return self.is_deleted()
def is_deleted(self):
meta = self.metas.exclude(action="EDIT").order_by('-date').first()
if meta:
@ -184,7 +206,12 @@ class ForumMessageMeta(models.Model):
action = models.CharField(_("action"), choices=MESSAGE_META_ACTIONS, max_length=16)
class ForumUserInfo(models.Model):
user = models.OneToOneField(User, related_name="_forum_infos")
"""
This currently stores only the last date a user clicked "Mark all as read".
However, this can be extended with lot of user preferences dedicated to a
user, such as the favourite topics, the signature, and so on...
"""
user = models.OneToOneField(User, related_name="_forum_infos") # TODO: see to move that to the User class in order to reduce the number of db queries
last_read_date = models.DateTimeField(_('last read date'), default=datetime(year=settings.SITH_SCHOOL_START_YEAR,
month=1, day=1, tzinfo=pytz.UTC))