fix: multisite issue with proposed categories

This commit is contained in:
Élie Bouttier 2017-07-30 18:07:09 +02:00
parent 4412af7eaf
commit 2f2ce124c3
5 changed files with 32 additions and 17 deletions

View File

@ -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

View File

@ -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'))

View File

@ -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+'>'

View File

@ -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())

View File

@ -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():