Commit ff77df36 authored by Skia's avatar Skia

Add basic right management to forum. Need to test it!

parent 4dd6f01e
Pipeline #737 failed with stage
in 3 minutes and 10 seconds
...@@ -38,7 +38,9 @@ class Command(BaseCommand): ...@@ -38,7 +38,9 @@ class Command(BaseCommand):
Site(id=4000, domain=settings.SITH_URL, name=settings.SITH_NAME).save() Site(id=4000, domain=settings.SITH_URL, name=settings.SITH_NAME).save()
root_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) root_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
Group(name="Root").save() Group(name="Root").save()
Group(name="Not registered users").save() Group(name="Public").save()
Group(name="Subscribers").save()
Group(name="Old subscribers").save()
Group(name="Accounting admin").save() Group(name="Accounting admin").save()
Group(name="Communication admin").save() Group(name="Communication admin").save()
Group(name="Counter admin").save() Group(name="Counter admin").save()
...@@ -46,6 +48,7 @@ class Command(BaseCommand): ...@@ -46,6 +48,7 @@ class Command(BaseCommand):
Group(name="Banned from counters").save() Group(name="Banned from counters").save()
Group(name="Banned to subscribe").save() Group(name="Banned to subscribe").save()
Group(name="SAS admin").save() Group(name="SAS admin").save()
Group(name="Forum admin").save()
self.reset_index("core", "auth") self.reset_index("core", "auth")
root = User(id=0, username='root', last_name="", first_name="Bibou", root = User(id=0, username='root', last_name="", first_name="Bibou",
email="ae.info@utbm.fr", email="ae.info@utbm.fr",
......
...@@ -204,6 +204,10 @@ class User(AbstractBaseUser): ...@@ -204,6 +204,10 @@ class User(AbstractBaseUser):
return False return False
if group_id == settings.SITH_GROUP_PUBLIC_ID: if group_id == settings.SITH_GROUP_PUBLIC_ID:
return True return True
if group_id == settings.SITH_GROUP_SUBSCRIBERS_ID:
return self.is_subscribed()
if group_id == settings.SITH_GROUP_OLD_SUBSCRIBERS_ID:
return self.was_subscribed()
if group_name == settings.SITH_MAIN_MEMBERS_GROUP: # We check the subscription if asked if group_name == settings.SITH_MAIN_MEMBERS_GROUP: # We check the subscription if asked
return self.is_subscribed() return self.is_subscribed()
if group_name[-len(settings.SITH_BOARD_SUFFIX):] == settings.SITH_BOARD_SUFFIX: if group_name[-len(settings.SITH_BOARD_SUFFIX):] == settings.SITH_BOARD_SUFFIX:
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models from django.db import migrations, models
import django.utils.timezone
from django.conf import settings from django.conf import settings
...@@ -16,36 +17,45 @@ class Migration(migrations.Migration): ...@@ -16,36 +17,45 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='Forum', name='Forum',
fields=[ fields=[
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)),
('name', models.CharField(verbose_name='name', max_length=64)), ('name', models.CharField(verbose_name='name', max_length=64)),
('description', models.CharField(default='', verbose_name='description', max_length=256)), ('description', models.CharField(default='', verbose_name='description', max_length=256)),
('is_category', models.BooleanField(default=False, verbose_name='is a category')), ('is_category', models.BooleanField(default=False, verbose_name='is a category')),
('edit_groups', models.ManyToManyField(to='core.Group', blank=True, related_name='editable_forums')), ('edit_groups', models.ManyToManyField(default=[4], related_name='editable_forums', blank=True, to='core.Group')),
('owner_group', models.ForeignKey(to='core.Group', default=4, related_name='owned_forums')), ('owner_group', models.ForeignKey(default=12, related_name='owned_forums', to='core.Group')),
('parent', models.ForeignKey(blank=True, null=True, to='forum.Forum', related_name='children')), ('parent', models.ForeignKey(null=True, related_name='children', blank=True, to='forum.Forum')),
('view_groups', models.ManyToManyField(to='core.Group', blank=True, related_name='viewable_forums')), ('view_groups', models.ManyToManyField(default=[2], related_name='viewable_forums', blank=True, to='core.Group')),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name='ForumMessage', name='ForumMessage',
fields=[ fields=[
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)),
('title', models.CharField(default='', blank=True, verbose_name='title', max_length=64)), ('title', models.CharField(default='', verbose_name='title', blank=True, max_length=64)),
('message', models.TextField(verbose_name='message', default='')), ('message', models.TextField(default='', verbose_name='message')),
('author', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='forum_messages')), ('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date')),
('author', models.ForeignKey(related_name='forum_messages', to=settings.AUTH_USER_MODEL)),
], ],
options={
'ordering': ['id'],
},
), ),
migrations.CreateModel( migrations.CreateModel(
name='ForumTopic', name='ForumTopic',
fields=[ fields=[
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)),
('author', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='forum_topics')), ('title', models.CharField(default='', verbose_name='title', max_length=64)),
('forum', models.ForeignKey(to='forum.Forum', related_name='topics')), ('description', models.CharField(default='', verbose_name='description', max_length=256)),
('author', models.ForeignKey(related_name='forum_topics', to=settings.AUTH_USER_MODEL)),
('forum', models.ForeignKey(related_name='topics', to='forum.Forum')),
], ],
options={
'ordering': ['-id'],
},
), ),
migrations.AddField( migrations.AddField(
model_name='forummessage', model_name='forummessage',
name='topic', name='topic',
field=models.ForeignKey(to='forum.ForumTopic', related_name='messages'), field=models.ForeignKey(related_name='messages', to='forum.ForumTopic'),
), ),
] ]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('forum', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='forumtopic',
name='title',
field=models.CharField(verbose_name='title', max_length=64, default=''),
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('forum', '0002_forumtopic_title'),
]
operations = [
migrations.AlterModelOptions(
name='forumtopic',
options={'ordering': ['messages__date', '-id']},
),
migrations.AddField(
model_name='forummessage',
name='date',
field=models.DateTimeField(verbose_name='date', default=django.utils.timezone.now),
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('forum', '0003_auto_20170121_0311'),
]
operations = [
migrations.AddField(
model_name='forumtopic',
name='description',
field=models.CharField(max_length=256, verbose_name='description', default=''),
),
]
...@@ -17,10 +17,13 @@ class Forum(models.Model): ...@@ -17,10 +17,13 @@ class Forum(models.Model):
description = models.CharField(_('description'), max_length=256, default="") description = models.CharField(_('description'), max_length=256, default="")
is_category = models.BooleanField(_('is a category'), default=False) is_category = models.BooleanField(_('is a category'), default=False)
parent = models.ForeignKey('Forum', related_name='children', null=True, blank=True) parent = models.ForeignKey('Forum', related_name='children', null=True, blank=True)
owner_group = models.ForeignKey(Group, related_name="owned_forums", edit_groups = models.ManyToManyField(Group, related_name="editable_forums", blank=True,
default=settings.SITH_GROUP_COM_ADMIN_ID) default=[settings.SITH_GROUP_OLD_SUBSCRIBERS_ID])
edit_groups = models.ManyToManyField(Group, related_name="editable_forums", blank=True) view_groups = models.ManyToManyField(Group, related_name="viewable_forums", blank=True,
view_groups = models.ManyToManyField(Group, related_name="viewable_forums", blank=True) default=[settings.SITH_GROUP_PUBLIC_ID])
def is_owned_by(self, user):
return user.is_in_group(settings.SITH_GROUP_FORUM_ADMIN_ID)
def check_loop(self): def check_loop(self):
"""Raise a validation error when a loop is found within the parent list""" """Raise a validation error when a loop is found within the parent list"""
...@@ -58,6 +61,15 @@ class ForumTopic(models.Model): ...@@ -58,6 +61,15 @@ class ForumTopic(models.Model):
class Meta: class Meta:
ordering = ['-id'] # TODO: add date message ordering ordering = ['-id'] # TODO: add date message ordering
def is_owned_by(self, user):
return self.forum.is_owned_by(user) or user.id == self.author.id
def can_be_edited_by(self, user):
return user.can_edit(self.forum)
def can_be_viewed_by(self, user):
return user.can_view(self.forum)
def __str__(self): def __str__(self):
return "%s" % (self.title) return "%s" % (self.title)
...@@ -66,7 +78,7 @@ class ForumTopic(models.Model): ...@@ -66,7 +78,7 @@ class ForumTopic(models.Model):
class ForumMessage(models.Model): class ForumMessage(models.Model):
""" """
"A ForumMessage object is a message in the forum" Cpt. Obvious "A ForumMessage object represents a message in the forum" -- Cpt. Obvious
""" """
topic = models.ForeignKey(ForumTopic, related_name='messages') topic = models.ForeignKey(ForumTopic, related_name='messages')
author = models.ForeignKey(User, related_name='forum_messages') author = models.ForeignKey(User, related_name='forum_messages')
...@@ -77,6 +89,15 @@ class ForumMessage(models.Model): ...@@ -77,6 +89,15 @@ class ForumMessage(models.Model):
class Meta: class Meta:
ordering = ['id'] ordering = ['id']
def is_owned_by(self, user):
return self.topic.is_owned_by(user) or user.id == self.author.id
def can_be_edited_by(self, user):
return user.can_edit(self.topic)
def can_be_viewed_by(self, user):
return user.can_view(self.topic)
def get_absolute_url(self): def get_absolute_url(self):
return self.topic.get_absolute_url() return self.topic.get_absolute_url()
...@@ -11,6 +11,5 @@ urlpatterns = [ ...@@ -11,6 +11,5 @@ urlpatterns = [
url(r'^topic/(?P<topic_id>[0-9]+)$', ForumTopicDetailView.as_view(), name='view_topic'), url(r'^topic/(?P<topic_id>[0-9]+)$', ForumTopicDetailView.as_view(), name='view_topic'),
url(r'^topic/(?P<topic_id>[0-9]+)/edit$', ForumTopicEditView.as_view(), name='edit_topic'), url(r'^topic/(?P<topic_id>[0-9]+)/edit$', ForumTopicEditView.as_view(), name='edit_topic'),
url(r'^topic/(?P<topic_id>[0-9]+)/new_message$', ForumMessageCreateView.as_view(), name='new_message'), url(r'^topic/(?P<topic_id>[0-9]+)/new_message$', ForumMessageCreateView.as_view(), name='new_message'),
# url(r'^(?P<club_id>[0-9]+)/tools$', ClubToolsView.as_view(), name='tools'),
] ]
...@@ -8,15 +8,16 @@ from django.conf import settings ...@@ -8,15 +8,16 @@ from django.conf import settings
from django import forms from django import forms
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin, TabedViewMixin
from forum.models import Forum, ForumMessage, ForumTopic from forum.models import Forum, ForumMessage, ForumTopic
class ForumMainView(ListView): class ForumMainView(CanViewMixin, ListView):
queryset = Forum.objects.filter(parent=None) queryset = Forum.objects.filter(parent=None)
template_name = "forum/main.jinja" template_name = "forum/main.jinja"
class ForumCreateView(CreateView): class ForumCreateView(CanCreateMixin, CreateView):
model = Forum model = Forum
fields = ['name', 'parent', 'is_category', 'owner_group', 'edit_groups', 'view_groups'] fields = ['name', 'parent', 'is_category', 'edit_groups', 'view_groups']
template_name = "core/create.jinja" template_name = "core/create.jinja"
def get_initial(self): def get_initial(self):
...@@ -25,19 +26,19 @@ class ForumCreateView(CreateView): ...@@ -25,19 +26,19 @@ class ForumCreateView(CreateView):
init['parent'] = parent init['parent'] = parent
return init return init
class ForumEditView(UpdateView): class ForumEditView(CanEditPropMixin, UpdateView):
model = Forum model = Forum
pk_url_kwarg = "forum_id" pk_url_kwarg = "forum_id"
fields = ['name', 'parent', 'is_category', 'owner_group', 'edit_groups', 'view_groups'] fields = ['name', 'parent', 'is_category', 'edit_groups', 'view_groups']
template_name = "core/edit.jinja" template_name = "core/edit.jinja"
success_url = reverse_lazy('forum:main') success_url = reverse_lazy('forum:main')
class ForumDetailView(DetailView): class ForumDetailView(CanViewMixin, DetailView):
model = Forum model = Forum
template_name = "forum/forum.jinja" template_name = "forum/forum.jinja"
pk_url_kwarg = "forum_id" pk_url_kwarg = "forum_id"
class ForumTopicCreateView(CreateView): class ForumTopicCreateView(CanCreateMixin, CreateView):
model = ForumMessage model = ForumMessage
fields = ['title', 'message'] fields = ['title', 'message']
template_name = "core/create.jinja" template_name = "core/create.jinja"
...@@ -55,19 +56,19 @@ class ForumTopicCreateView(CreateView): ...@@ -55,19 +56,19 @@ class ForumTopicCreateView(CreateView):
form.instance.author = self.request.user form.instance.author = self.request.user
return super(ForumTopicCreateView, self).form_valid(form) return super(ForumTopicCreateView, self).form_valid(form)
class ForumTopicEditView(UpdateView): class ForumTopicEditView(CanEditPropMixin, UpdateView):
model = ForumTopic model = ForumTopic
fields = ['title', 'forum'] fields = ['title', 'forum']
pk_url_kwarg = "topic_id" pk_url_kwarg = "topic_id"
template_name = "core/edit.jinja" template_name = "core/edit.jinja"
class ForumTopicDetailView(DetailView): class ForumTopicDetailView(CanViewMixin, DetailView):
model = ForumTopic model = ForumTopic
pk_url_kwarg = "topic_id" pk_url_kwarg = "topic_id"
template_name = "forum/topic.jinja" template_name = "forum/topic.jinja"
context_object_name = "topic" context_object_name = "topic"
class ForumMessageCreateView(CreateView): class ForumMessageCreateView(CanCreateMixin, CreateView):
model = ForumMessage model = ForumMessage
fields = ['title', 'message'] fields = ['title', 'message']
template_name = "core/create.jinja" template_name = "core/create.jinja"
......
...@@ -261,13 +261,17 @@ SITH_SCHOOL_START_YEAR = 1999 ...@@ -261,13 +261,17 @@ SITH_SCHOOL_START_YEAR = 1999
SITH_GROUP_ROOT_ID = 1 SITH_GROUP_ROOT_ID = 1
SITH_GROUP_PUBLIC_ID = 2 SITH_GROUP_PUBLIC_ID = 2
SITH_GROUP_ACCOUNTING_ADMIN_ID = 3 SITH_GROUP_SUBSCRIBERS_ID = 3
SITH_GROUP_COM_ADMIN_ID = 4 SITH_GROUP_OLD_SUBSCRIBERS_ID = 4
SITH_GROUP_COUNTER_ADMIN_ID = 5 SITH_GROUP_ACCOUNTING_ADMIN_ID = 5
SITH_GROUP_BANNED_ALCOHOL_ID = 6 SITH_GROUP_COM_ADMIN_ID = 6
SITH_GROUP_BANNED_COUNTER_ID = 7 SITH_GROUP_COUNTER_ADMIN_ID = 7
SITH_GROUP_BANNED_SUBSCRIPTION_ID = 8 SITH_GROUP_BANNED_ALCOHOL_ID = 8
SITH_GROUP_SAS_ADMIN_ID = 9 SITH_GROUP_BANNED_COUNTER_ID = 9
SITH_GROUP_BANNED_SUBSCRIPTION_ID = 10
SITH_GROUP_SAS_ADMIN_ID = 11
SITH_GROUP_FORUM_ADMIN_ID = 12
SITH_CLUB_REFOUND_ID = 89 SITH_CLUB_REFOUND_ID = 89
SITH_COUNTER_REFOUND_ID = 38 SITH_COUNTER_REFOUND_ID = 38
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment