From 254126fd79d186381b0b2c3819827728568c84ce Mon Sep 17 00:00:00 2001 From: Skia Date: Sun, 29 Jan 2017 00:16:41 +0100 Subject: [PATCH] Add last unread function --- core/management/commands/populate.py | 6 ++-- core/models.py | 10 ++++++ core/static/core/style.css | 3 ++ forum/migrations/0004_forumuserinfo.py | 26 ++++++++++++++ .../0005_forumuserinfo_read_messages.py | 19 ++++++++++ forum/migrations/0006_auto_20170128_2243.py | 25 +++++++++++++ forum/models.py | 18 +++++++++- forum/templates/forum/forum.jinja | 36 ++++--------------- forum/templates/forum/last_unread.jinja | 24 +++++++++++++ forum/templates/forum/macros.jinja | 36 +++++++++++++++++++ forum/templates/forum/main.jinja | 15 ++++++-- forum/templates/forum/topic.jinja | 13 +++++++ forum/urls.py | 2 ++ forum/views.py | 32 +++++++++++++++++ 14 files changed, 229 insertions(+), 36 deletions(-) create mode 100644 forum/migrations/0004_forumuserinfo.py create mode 100644 forum/migrations/0005_forumuserinfo_read_messages.py create mode 100644 forum/migrations/0006_auto_20170128_2243.py create mode 100644 forum/templates/forum/last_unread.jinja diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index ee34c071..39c31630 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -18,7 +18,7 @@ from subscription.models import Subscription from counter.models import Customer, ProductType, Product, Counter from com.models import Sith, Weekmail from election.models import Election, Role, Candidature, ElectionList -from forum.models import Forum, ForumMessage +from forum.models import Forum, ForumMessage, ForumTopic class Command(BaseCommand): @@ -438,8 +438,10 @@ Welcome to the wiki page! room.save() Forum(name="AE", description="Réservé au bureau AE", parent=room).save() Forum(name="BdF", description="Réservé au bureau BdF", parent=room).save() - Forum(name="Hall de discussions", description="Pour toutes les discussions", parent=room).save() + hall = Forum(name="Hall de discussions", description="Pour toutes les discussions", parent=room) + hall.save() various = Forum(name="Divers", description="Pour causer de rien", is_category=True) various.save() Forum(name="Promos", description="Réservé aux Promos", parent=various).save() + ForumTopic(forum=hall) diff --git a/core/models.py b/core/models.py index bd3d3753..9baae375 100644 --- a/core/models.py +++ b/core/models.py @@ -426,6 +426,16 @@ class User(AbstractBaseUser): def subscribed(self): return self.is_in_group(settings.SITH_MAIN_MEMBERS_GROUP) + @property + def forum_infos(self): + try: + return self._forum_infos + except: + from forum.models import ForumUserInfo + infos = ForumUserInfo(user=self) + infos.save() + return infos + class AnonymousUser(AuthAnonymousUser): def __init__(self, request): super(AnonymousUser, self).__init__() diff --git a/core/static/core/style.css b/core/static/core/style.css index 8f3aaf34..a99dc417 100644 --- a/core/static/core/style.css +++ b/core/static/core/style.css @@ -412,6 +412,9 @@ textarea { margin: 2px; background: skyblue; } +.unread { + background: #e6ddad; +} .message h5 { font-size: 100%; } diff --git a/forum/migrations/0004_forumuserinfo.py b/forum/migrations/0004_forumuserinfo.py new file mode 100644 index 00000000..1c468201 --- /dev/null +++ b/forum/migrations/0004_forumuserinfo.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +from django.conf import settings +from django.utils.timezone import utc +import datetime + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('forum', '0003_forum_owner_club'), + ] + + operations = [ + migrations.CreateModel( + name='ForumUserInfo', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', auto_created=True, primary_key=True)), + ('last_read_date', models.DateTimeField(verbose_name='last read date', default=datetime.datetime(1999, 1, 1, 0, 0, tzinfo=utc))), + ('user', models.OneToOneField(related_name='_forum_infos', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/forum/migrations/0005_forumuserinfo_read_messages.py b/forum/migrations/0005_forumuserinfo_read_messages.py new file mode 100644 index 00000000..e0a23cfc --- /dev/null +++ b/forum/migrations/0005_forumuserinfo_read_messages.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('forum', '0004_forumuserinfo'), + ] + + operations = [ + migrations.AddField( + model_name='forumuserinfo', + name='read_messages', + field=models.ManyToManyField(to='forum.ForumMessage', related_name='readers', verbose_name='read messages'), + ), + ] diff --git a/forum/migrations/0006_auto_20170128_2243.py b/forum/migrations/0006_auto_20170128_2243.py new file mode 100644 index 00000000..ea9d17ec --- /dev/null +++ b/forum/migrations/0006_auto_20170128_2243.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('forum', '0005_forumuserinfo_read_messages'), + ] + + operations = [ + migrations.RemoveField( + model_name='forumuserinfo', + name='read_messages', + ), + migrations.AddField( + model_name='forummessage', + name='readers', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, related_name='read_messages', verbose_name='readers'), + ), + ] diff --git a/forum/models.py b/forum/models.py index 781b90aa..44875ed9 100644 --- a/forum/models.py +++ b/forum/models.py @@ -7,6 +7,9 @@ from django.db import IntegrityError, transaction from django.core.urlresolvers import reverse from django.utils import timezone +from datetime import datetime +import pytz + from core.models import User, MetaGroup, Group, SithFile from club.models import Club @@ -136,10 +139,14 @@ class ForumMessage(models.Model): title = models.CharField(_("title"), default="", max_length=64, blank=True) message = models.TextField(_("message"), default="") date = models.DateTimeField(_('date'), default=timezone.now) + readers = models.ManyToManyField(User, related_name="read_messages", verbose_name=_("readers")) class Meta: ordering = ['id'] + def __str__(self): + return "%s" % (self.title) + def is_owned_by(self, user): return self.topic.is_owned_by(user) or user.id == self.author.id @@ -150,5 +157,14 @@ class ForumMessage(models.Model): return user.can_view(self.topic) def get_absolute_url(self): - return self.topic.get_absolute_url() + return self.topic.get_absolute_url() + "#first_unread" + + def mark_as_read(self, user): + self.readers.add(user) + +class ForumUserInfo(models.Model): + user = models.OneToOneField(User, related_name="_forum_infos") + last_read_date = models.DateTimeField(_('last read date'), default=datetime(year=settings.SITH_SCHOOL_START_YEAR, + month=1, day=1, tzinfo=pytz.UTC)) + # read_messages = models.ManyToManyField(ForumMessage, related_name="readers", verbose_name=_("read messages")) diff --git a/forum/templates/forum/forum.jinja b/forum/templates/forum/forum.jinja index 747acf1c..dff85d15 100644 --- a/forum/templates/forum/forum.jinja +++ b/forum/templates/forum/forum.jinja @@ -1,6 +1,9 @@ {% extends "core/base.jinja" %} -{% from 'forum/macros.jinja' import display_forum %} -{% from 'core/macros.jinja' import user_profile_link %} +{% from 'forum/macros.jinja' import display_forum, display_topic %} + +{% block title %} +{{ forum }} +{% endblock %} {% block content %}
@@ -21,34 +24,7 @@ {{ display_forum(f, user) }} {% endfor %} {% for t in topics %} -
-
- -
{{ t.title }}
-

{{ t.description }}

-
- {% if user.is_owner(t) %} -
- Edit -
- {% endif %} -
-
-
-
- {{ user_profile_link(t.author) }} -
-
- {{ t.messages.count() }} -
-
-
- {% set last_msg = t.messages.order_by('id').last() %} - {{ user_profile_link(last_msg.author) }}
- {{ last_msg.date|date(DATETIME_FORMAT) }} {{ last_msg.date|time(DATETIME_FORMAT) }} -
-
-
+ {{ display_topic(t, user) }} {% endfor %} {% endblock %} diff --git a/forum/templates/forum/last_unread.jinja b/forum/templates/forum/last_unread.jinja new file mode 100644 index 00000000..51fb1b7c --- /dev/null +++ b/forum/templates/forum/last_unread.jinja @@ -0,0 +1,24 @@ +{% extends "core/base.jinja" %} +{% from 'forum/macros.jinja' import display_topic %} + +{% block title %} +{% trans %}Last unread messages{% endtrans %} +{% endblock %} + +{% block content %} +

+ Forum > +

+

{% trans %}Forum{% endtrans %}

+

{% trans %}Last unread messages{% endtrans %}

+

+ {% trans %}Mark all as read{% endtrans %} + {% trans %}Refresh{% endtrans %} +

+ {% for t in forumtopic_list %} + {{ display_topic(t, user, True) }} + {% endfor %} +{% endblock %} + + + diff --git a/forum/templates/forum/macros.jinja b/forum/templates/forum/macros.jinja index 6e924531..5bc40ed9 100644 --- a/forum/templates/forum/macros.jinja +++ b/forum/templates/forum/macros.jinja @@ -1,3 +1,5 @@ +{% from 'core/macros.jinja' import user_profile_link %} + {% macro display_forum(forum, user) %}
@@ -35,4 +37,38 @@
{% endmacro %} +{% macro display_topic(topic, user, first_unread=False) %} +
+
+ {% if first_unread %} + + {% else %} + + {% endif %} +
{{ topic.title }}
+

{{ topic.description }}

+
+ {% if user.is_owner(topic) %} + + {% endif %} +
+
+
+
+ {{ user_profile_link(topic.author) }} +
+
+ {{ topic.messages.count() }} +
+
+
+ {% set last_msg = topic.messages.order_by('id').last() %} + {{ user_profile_link(last_msg.author) }}
+ {{ last_msg.date|date(DATETIME_FORMAT) }} {{ last_msg.date|time(DATETIME_FORMAT) }} +
+
+
+{% endmacro %} diff --git a/forum/templates/forum/main.jinja b/forum/templates/forum/main.jinja index 49c0f976..37786d14 100644 --- a/forum/templates/forum/main.jinja +++ b/forum/templates/forum/main.jinja @@ -2,16 +2,25 @@ {% from 'core/macros.jinja' import user_profile_link %} {% from 'forum/macros.jinja' import display_forum %} +{% block title %} +{% trans %}Forum{% endtrans %} +{% endblock %} + {% block content %}

Forum >

{% trans %}Forum{% endtrans %}

- {% if user.is_in_group(settings.SITH_GROUP_FORUM_ADMIN_ID) or user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID) %} - New forum - {% endif %} + {% trans %}View last unread messages{% endtrans %} + {% trans %}Mark all as read{% endtrans %} + {% trans %}Refresh{% endtrans %}

+ {% if user.is_in_group(settings.SITH_GROUP_FORUM_ADMIN_ID) or user.is_in_group(settings.SITH_GROUP_COM_ADMIN_ID) %} +

+ {% trans %}New forum{% endtrans %} +

+ {% endif %} {% for f in forum_list %}
{{ display_forum(f, user) }} diff --git a/forum/templates/forum/topic.jinja b/forum/templates/forum/topic.jinja index 9d624cb0..0d61435e 100644 --- a/forum/templates/forum/topic.jinja +++ b/forum/templates/forum/topic.jinja @@ -1,6 +1,10 @@ {% extends "core/base.jinja" %} {% from 'core/macros.jinja' import user_profile_link %} +{% block title %} +{{ topic }} +{% endblock %} + {% block head %} {{ super() }}