From 2f2ce124c3a588826f7e0395c251a4e61646b4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89lie=20Bouttier?= Date: Sun, 30 Jul 2017 18:07:09 +0200 Subject: [PATCH] fix: multisite issue with proposed categories --- cfp/admin.py | 6 ++++++ cfp/forms.py | 20 +++++++++++++++----- cfp/models.py | 12 ++++++------ cfp/utils.py | 3 ++- cfp/views.py | 8 +++----- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/cfp/admin.py b/cfp/admin.py index 0293484..3e90e88 100644 --- a/cfp/admin.py +++ b/cfp/admin.py @@ -9,6 +9,12 @@ from .models import Conference, Participant, Talk, TalkCategory, Track class ConferenceAdmin(SiteAdminMixin, admin.ModelAdmin): filter_horizontal = ('staff',) + def has_add_permission(self, request): + return False + + def has_delete_permission(self, request, obj=None): + return False + class ParticipantAdmin(SiteAdminMixin, admin.ModelAdmin): pass diff --git a/cfp/forms.py b/cfp/forms.py index f5fdd73..63be1c8 100644 --- a/cfp/forms.py +++ b/cfp/forms.py @@ -1,12 +1,22 @@ from django import forms from django.forms.models import modelform_factory -from .models import Participant, Talk +from .models import Participant, Talk, TalkCategory -class ProposeForm(forms.Form): - pass +class TalkForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + conference = kwargs.pop('conference') + staff = kwargs.pop('staff') + super().__init__(*args, **kwargs) + if staff: + self.fields['category'].queryset = TalkCategory.objects.filter(site=conference.site) + else: + self.fields['category'].queryset = conference.opened_categories + + class Meta: + model = Talk + fields = ('category', 'title', 'description','notes') -ParticipantForm = modelform_factory(Participant, fields=['email']) -TalkForm = modelform_factory(Talk, fields=['title']) +ParticipantForm = modelform_factory(Participant, fields=('name','email', 'biography')) diff --git a/cfp/models.py b/cfp/models.py index 4d9ce56..514f49e 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -49,12 +49,12 @@ class Conference(models.Model): # events = Event.objects.filter(site=self.site) # return any(map(lambda x: x.is_open(), events)) - #@property - #def opened_events(self): - # now = timezone.now() - # return Event.objects.filter(site=self.site)\ - # .filter(Q(opening_date__isnull=True) | Q(opening_date__lte=now))\ - # .filter(Q(closing_date__isnull=True) | Q(closing_date__gte=now)) + @property + def opened_categories(self): + now = timezone.now() + return TalkCategory.objects.filter(site=self.site)\ + .filter(Q(opening_date__isnull=True) | Q(opening_date__lte=now))\ + .filter(Q(closing_date__isnull=True) | Q(closing_date__gte=now)) def from_email(self): return self.name+' <'+self.contact_email+'>' diff --git a/cfp/utils.py b/cfp/utils.py index c98d84c..d2b9c9c 100644 --- a/cfp/utils.py +++ b/cfp/utils.py @@ -37,4 +37,5 @@ def markdown_to_html(md): def is_staff(request, user): - return user.is_authenticated and (user.is_superuser or user in site.conference.staff) + conference = get_current_conf(request) + return user.is_authenticated and (user.is_superuser or conference.staff.filter(pk=user.pk).exists()) diff --git a/cfp/views.py b/cfp/views.py index efc1146..999ea82 100644 --- a/cfp/views.py +++ b/cfp/views.py @@ -1,6 +1,5 @@ from django.core.mail import send_mail from django.core.urlresolvers import reverse_lazy -from django.forms.models import modelform_factory from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import ugettext_lazy as _ @@ -8,7 +7,9 @@ from django.views.generic import FormView, TemplateView from django.contrib import messages from cfp.decorators import staff_required +from .utils import is_staff from .models import Participant, Talk, Vote +from .forms import TalkForm, ParticipantForm def home(request, conference): @@ -28,10 +29,8 @@ def talk_proposal(request, conference, talk_id=None, participant_id=None): talk = get_object_or_404(Talk, token=talk_id, site=site) participant = get_object_or_404(Participant, token=participant_id, site=site) - ParticipantForm = modelform_factory(Participant, fields=('name','email', 'biography')) participant_form = ParticipantForm(request.POST or None, instance=participant) - TalkForm = modelform_factory(Talk, fields=('category', 'title', 'description','notes')) - talk_form = TalkForm(request.POST or None, instance=talk) + talk_form = TalkForm(request.POST or None, conference=conference, staff=is_staff(request, request.user), instance=talk) if request.method == 'POST' and talk_form.is_valid() and participant_form.is_valid(): talk = talk_form.save(commit=False) @@ -98,7 +97,6 @@ def talk_proposal_speaker_edit(request, conference, talk_id, participant_id=None if participant_id: participant = get_object_or_404(Participant, token=participant_id, site=conference.site) - ParticipantForm = modelform_factory(Participant, fields=('name','email', 'biography')) participant_form = ParticipantForm(request.POST or None, instance=participant) if request.method == 'POST' and participant_form.is_valid():