diff --git a/ponyconf/settings.py b/ponyconf/settings.py index e5af6ac..f464c2d 100644 --- a/ponyconf/settings.py +++ b/ponyconf/settings.py @@ -166,6 +166,7 @@ BOWER_INSTALLED_APPS = ( 'jquery-ui', 'jquery-cookie', 'select2', + 'eonasdan-bootstrap-datetimepicker', ) LOGIN_REDIRECT_URL = 'home' diff --git a/proposals/forms.py b/proposals/forms.py index 3160244..d360814 100644 --- a/proposals/forms.py +++ b/proposals/forms.py @@ -125,4 +125,4 @@ class TopicForm(forms.ModelForm): return name -ConferenceForm = modelform_factory(Conference, fields=['home']) +ConferenceForm = modelform_factory(Conference, fields=['cfp_opening_date', 'cfp_closing_date', 'home']) diff --git a/proposals/migrations/0013_auto_20160928_1802.py b/proposals/migrations/0013_auto_20160928_1802.py new file mode 100644 index 0000000..dbee273 --- /dev/null +++ b/proposals/migrations/0013_auto_20160928_1802.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.1 on 2016-09-28 18:02 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('proposals', '0012_topic_track'), + ] + + operations = [ + migrations.AddField( + model_name='conference', + name='cfp_closing_date', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + migrations.AddField( + model_name='conference', + name='cfp_opening_date', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + ] diff --git a/proposals/models.py b/proposals/models.py index d7cb8ec..a8716e2 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -7,6 +7,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext +from django.utils import timezone from autoslug import AutoSlugField @@ -20,6 +21,16 @@ class Conference(models.Model): site = models.OneToOneField(Site, on_delete=models.CASCADE) home = models.TextField(blank=True, default="") + cfp_opening_date = models.DateTimeField(null=True, blank=True, default=None) + cfp_closing_date = models.DateTimeField(null=True, blank=True, default=None) + + def cfp_is_open(self): + now = timezone.now() + if self.cfp_opening_date and now < self.cfp_opening_date: + return False + if self.cfp_closing_date and now > self.cfp_closing_date: + return False + return True def __str__(self): return str(self.site) diff --git a/proposals/templates/proposals/conference.html b/proposals/templates/proposals/conference.html index ccdc890..43ad7de 100644 --- a/proposals/templates/proposals/conference.html +++ b/proposals/templates/proposals/conference.html @@ -2,39 +2,39 @@ {% load bootstrap3 staticfiles i18n %} -{% block talktab %} class="active"{% endblock %} +{% block admintab %} class=active{% endblock %} {% block content %} -

{% trans "Conference settings" %}

-
-
-

{% trans "Home page" %}

-
-
-
- {% csrf_token %} - -
-
-
- -
+
+

{% trans "Home page" %}

-
-
+
+ + {% csrf_token %} + {% bootstrap_field form.cfp_opening_date addon_after='' %} + {% bootstrap_field form.cfp_closing_date addon_after='' %} + +
+
+
+ +
+
+
+
+
+
+ +
+
+
-
- -
-
- -
{% endblock %} @@ -42,6 +42,7 @@ {% block css %} {{ block.super }} {{ form.media.css }} + {% endblock css %} {% block js_end %} @@ -50,6 +51,28 @@ + + + {% endblock js_end %} diff --git a/proposals/templates/proposals/participate.html b/proposals/templates/proposals/participate.html index d715b15..685ad60 100644 --- a/proposals/templates/proposals/participate.html +++ b/proposals/templates/proposals/participate.html @@ -19,6 +19,10 @@ {% endif %}
+{% if conf.cfp_is_open %} {% trans "Propose a talk" %} +{% else %} +{% trans "Sorry, the Call for Participation is closed." %} +{% endif %} {% endblock %} diff --git a/proposals/views.py b/proposals/views.py index a7eb3f9..10151cc 100644 --- a/proposals/views.py +++ b/proposals/views.py @@ -17,7 +17,7 @@ from django.http import HttpResponse from accounts.models import Participation from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin from accounts.decorators import orga_required, staff_required -from accounts.utils import is_staff +from accounts.utils import is_staff, is_orga from conversations.models import ConversationWithParticipant, ConversationAboutTalk, Message @@ -53,12 +53,14 @@ def conference(request): @login_required def participate(request): - talks = Talk.objects.filter(site=get_current_site(request)) + site = get_current_site(request) + talks = Talk.objects.filter(site=site) my_talks = talks.filter(speakers=request.user) proposed_talks = talks.exclude(speakers=request.user).filter(proposer=request.user) return render(request, 'proposals/participate.html', { 'my_talks': my_talks, 'proposed_talks': proposed_talks, + 'conf': site.conference, }) @staff_required @@ -135,18 +137,24 @@ def talk_list(request): @login_required def talk_edit(request, talk=None): - if talk: - talk = get_object_or_404(Talk, slug=talk, site=get_current_site(request)) + site = get_current_site(request) + if talk: # edit existing talk + talk = get_object_or_404(Talk, slug=talk, site=site) if not talk.is_editable_by(request.user): raise PermissionDenied() - form = TalkForm(request.POST or None, instance=talk, site=get_current_site(request)) - if not is_staff(request, request.user): - form.fields.pop('track') + else: # add new talk + if not site.conference.cfp_is_open(): + raise PermissionDenied() + form = TalkForm(request.POST or None, instance=talk, site=site) if talk: form.fields['title'].disabled = True form.fields['topics'].disabled = True + if not talk.is_editable_by(request.user): + form.fields.pop('track') else: form.fields['speakers'].initial = [request.user] + if not is_orga(request, request.user): + form.fields.pop('track') if request.method == 'POST' and form.is_valid(): if hasattr(talk, 'id'): talk = form.save()