diff --git a/cfp/forms.py b/cfp/forms.py index efb5122..1579aab 100644 --- a/cfp/forms.py +++ b/cfp/forms.py @@ -98,6 +98,23 @@ class TalkFilterForm(forms.Form): self.fields['track'].choices = [('none', _('Not assigned'))] + list(tracks.values_list('slug', 'name')) +class TalkActionForm(forms.Form): + talks = forms.MultipleChoiceField(choices=[]) + decision = forms.NullBooleanField(label=_('Accept talk?')) + track = forms.ChoiceField(required=False, choices=[], label=_('Assign to a track')) + room = forms.ChoiceField(required=False, choices=[], label=_('Put in a room')) + + def __init__(self, *args, **kwargs): + site = kwargs.pop('site') + talks = kwargs.pop('talks') + super().__init__(*args, **kwargs) + self.fields['talks'].choices = [(talk.token, None) for talk in talks.all()] + tracks = Track.objects.filter(site=site) + self.fields['track'].choices = [(None, "---------")] + list(tracks.values_list('slug', 'name')) + rooms = Room.objects.filter(site=site) + self.fields['room'].choices = [(None, "---------")] + list(rooms.values_list('slug', 'name')) + + ParticipantForm = modelform_factory(Participant, fields=('name', 'email', 'biography')) diff --git a/cfp/templates/cfp/staff/talk_list.html b/cfp/templates/cfp/staff/talk_list.html index 6503f4c..36025d1 100644 --- a/cfp/templates/cfp/staff/talk_list.html +++ b/cfp/templates/cfp/staff/talk_list.html @@ -31,11 +31,13 @@ +
+ - {% comment %}{% endcomment %} + @@ -48,7 +50,7 @@ {% endif %} - {% comment %}{% endcomment %} +
{% trans "Total:" %} {{ talk_list|length }} {% trans "talk" %}{{ talk_list|length|pluralize }}
{% trans "Title" %} {% trans "Intervention kind" %} {% trans "Speakers" %}
{{ talk.title }} {{ talk.category }} @@ -75,4 +77,18 @@ {% endfor %}
+
+
+

{% trans "For selected talks:" %}

+ {% csrf_token %} + {% bootstrap_form_errors action_form %} + {% bootstrap_form action_form exclude="talks" %} + {% buttons %} + + {% endbuttons %} +
+
+ +
+ {% endblock %} diff --git a/cfp/urls.py b/cfp/urls.py index fb0cd70..7db0878 100644 --- a/cfp/urls.py +++ b/cfp/urls.py @@ -28,27 +28,5 @@ urlpatterns = [ url(r'^staff/rooms/(?P[-\w]+)/edit/$', views.RoomUpdate.as_view(), name='room-edit'), url(r'^staff/add-user/$', views.create_user, name='create-user'), url(r'^staff/select2/$', views.Select2View.as_view(), name='django_select2-json'), - #url(r'^markdown/$', views.markdown_preview, name='markdown'), - #url(r'^$', views.home, name='home'), - #url(r'^staff/$', views.staff, name='staff'), - #url(r'^conference/$', views.conference, name='edit-conference'), - #url(r'^talk/propose/$', views.participate, name='participate-as-speaker'), - #url(r'^talk/$', views.talk_list, name='list-talks'), - #url(r'^talk/add/$', views.talk_edit, name='add-talk'), - #url(r'^talk/edit/(?P[-\w]+)$', views.talk_edit, name='edit-talk'), - #url(r'^talk/vote/(?P[-\w]+)/(?P[-0-2]+)$', views.vote, name='vote'), - #url(r'^talk/details/(?P[-\w]+)$', views.TalkDetail.as_view(), name='show-talk'), - #url(r'^talk/accept/(?P[-\w]+)/$', views.talk_decide, {'accepted': True}, name='accept-talk'), - #url(r'^talk/decline/(?P[-\w]+)/$', views.talk_decide, {'accepted': False}, name='decline-talk'), - #url(r'^talk/assign-to-track/(?P[-\w]+)/(?P[-\w]+)/$', views.talk_assign_to_track, name='assign-talk-to-track'), - #url(r'^topic/$', views.TopicList.as_view(), name='list-topics'), - #url(r'^topic/add/$', views.TopicCreate.as_view(), name='add-topic'), - #url(r'^topic/(?P[-\w]+)/edit/$', views.TopicUpdate.as_view(), name='edit-topic'), - #url(r'^track/$', views.TrackList.as_view(), name='list-tracks'), - #url(r'^track/add/$', views.TrackCreate.as_view(), name='add-track'), - #url(r'^track/(?P[-\w]+)/edit/$', views.TrackUpdate.as_view(), name='edit-track'), - #url(r'^speakers/$', views.speaker_list, name='list-speakers'), - #url(r'^register/$', views.talk_registrable_list, name='list-registrable-talks'), - #url(r'^register/(?P[-\w]+)$', views.talk_register, name='register-for-a-talk'), ] diff --git a/cfp/views.py b/cfp/views.py index 486a82a..b27638b 100644 --- a/cfp/views.py +++ b/cfp/views.py @@ -18,7 +18,8 @@ from .decorators import staff_required from .mixins import StaffRequiredMixin, OnSiteMixin from .utils import is_staff from .models import Participant, Talk, TalkCategory, Vote, Track, Room -from .forms import TalkForm, TalkStaffForm, TalkFilterForm, ParticipantForm, ParticipantStaffForm, ConferenceForm, CreateUserForm, STATUS_VALUES, TrackForm, RoomForm +from .forms import TalkForm, TalkStaffForm, TalkFilterForm, TalkActionForm, ParticipantForm, \ + ParticipantStaffForm, ConferenceForm, CreateUserForm, STATUS_VALUES, TrackForm, RoomForm def home(request): @@ -169,6 +170,25 @@ def talk_list(request): talks = talks.filter(vote__user=request.user) else: talks = talks.exclude(vote__user=request.user) + # Action + action_form = TalkActionForm(request.POST or None, talks=talks, site=request.conference.site) + if request.method == 'POST' and action_form.is_valid(): + data = action_form.cleaned_data + for talk in data['talks']: + talk = Talk.objects.get(site=request.conference.site, token=talk) + if data['decision'] != None and data['decision'] != talk.accepted: + if data['decision']: + note = _("The talk has been accepted.") + else: + note = _("The talk has been declined.") + Message.objects.create(thread=talk.conversation, author=request.user, content=note) + talk.accepted = data['decision'] + if data['track']: + talk.track = Track.objects.get(site=request.conference.site, slug=data['track']) + if data['room']: + talk.room = Room.objects.get(site=request.conference.site, slug=data['room']) + talk.save() + return redirect(request.get_full_path()) # Sorting if request.GET.get('order') == 'desc': sort_reverse = True @@ -207,6 +227,7 @@ def talk_list(request): 'show_filters': show_filters, 'talk_list': talks, 'filter_form': filter_form, + 'action_form': action_form, 'sort_urls': sort_urls, 'sort_glyphicons': sort_glyphicons, }) @@ -243,6 +264,8 @@ def talk_vote(request, talk_id, score): def talk_decide(request, talk_id, accept): talk = get_object_or_404(Talk, token=talk_id, site=request.conference.site) if request.method == 'POST': + talk.accepted = accept + talk.save() # Does we need to send a notification to the proposer? m = request.POST.get('message', '').strip() if m: @@ -254,8 +277,6 @@ def talk_decide(request, talk_id, accept): else: note = _("The talk has been declined.") Message.objects.create(thread=talk.conversation, author=request.user, content=note) - talk.accepted = accept - talk.save() messages.success(request, _('Decision taken in account')) return redirect(talk.get_absolute_url()) return render(request, 'cfp/staff/talk_decide.html', {