mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-25 18:44:23 +00:00
Add basic right management to forum. Need to test it!
This commit is contained in:
parent
4dd6f01e60
commit
ff77df3646
@ -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):
|
|||||||
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):
|
|||||||
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 @@
|
|||||||
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):
|
|||||||
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'),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
# -*- 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=''),
|
|
||||||
),
|
|
||||||
]
|
|
@ -1,24 +0,0 @@
|
|||||||
# -*- 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),
|
|
||||||
),
|
|
||||||
]
|
|
@ -1,19 +0,0 @@
|
|||||||
# -*- 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):
|
|||||||
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):
|
|||||||
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):
|
|||||||
|
|
||||||
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):
|
|||||||
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 = [
|
|||||||
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
|
|||||||
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):
|
|||||||
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):
|
|||||||
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
|
|||||||
|
|
||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user