diff --git a/cfp/forms.py b/cfp/forms.py index c45b3b6..c480c95 100644 --- a/cfp/forms.py +++ b/cfp/forms.py @@ -164,7 +164,7 @@ class UsersWidget(ModelSelect2MultipleWidget): class ConferenceForm(forms.ModelForm): class Meta: model = Conference - fields = ['name', 'home', 'venue', 'city', 'contact_email', 'reply_email', 'secure_domain', 'staff',] + fields = ['name', 'home', 'venue', 'city', 'contact_email', 'schedule_publishing_date', 'reply_email', 'secure_domain', 'staff',] widgets = { 'staff': UsersWidget(), } diff --git a/cfp/migrations/0009_conference_schedule_publishing_date.py b/cfp/migrations/0009_conference_schedule_publishing_date.py new file mode 100644 index 0000000..7e7eb6d --- /dev/null +++ b/cfp/migrations/0009_conference_schedule_publishing_date.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.3 on 2017-08-15 18:24 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cfp', '0008_auto_20170811_2342'), + ] + + operations = [ + migrations.AddField( + model_name='conference', + name='schedule_publishing_date', + field=models.DateTimeField(blank=True, default=None, null=True, verbose_name='Schedule publishing date'), + ), + ] diff --git a/cfp/models.py b/cfp/models.py index 9333e2c..e532f7d 100644 --- a/cfp/models.py +++ b/cfp/models.py @@ -31,6 +31,7 @@ class Conference(models.Model): reply_email = models.CharField(max_length=100, blank=True, verbose_name=_('Reply email')) staff = models.ManyToManyField(User, blank=True, verbose_name=_('Staff members')) secure_domain = models.BooleanField(default=True, verbose_name=_('Secure domain (HTTPS)')) + schedule_publishing_date = models.DateTimeField(null=True, blank=True, default=None, verbose_name=_('Schedule publishing date')) custom_css = models.TextField(blank=True) external_css_link = models.URLField(blank=True) @@ -48,6 +49,10 @@ class Conference(models.Model): .filter(Q(opening_date__isnull=True) | Q(opening_date__lte=now))\ .filter(Q(closing_date__isnull=True) | Q(closing_date__gte=now)) + @property + def schedule_available(self): + return self.schedule_publishing_date and self.schedule_publishing_date <= timezone.now() + def from_email(self): return self.name+' <'+self.contact_email+'>' diff --git a/cfp/planning.py b/cfp/planning.py index be9e4ae..99ae81b 100644 --- a/cfp/planning.py +++ b/cfp/planning.py @@ -217,31 +217,31 @@ class Program: for speaker in talk.speakers.all(): persons += ' %(person)s\n' % { 'person_id': speaker.id, - 'person': str(speaker.profile), + 'person': str(speaker), } links = '' registration = '' - if talk.registration_required and self.conference.subscriptions_open: - links += mark_safe(""" - %(link)s""" % { - 'link': reverse('register-for-a-talk', args=[talk.slug]), - }) - registration = """ - %(max)s - %(remain)s""" % { - 'max': talk.attendees_limit, - 'remain': talk.remaining_attendees or 0, - } - if talk.materials: - links += mark_safe(""" - %(link)s""" % { - 'link': talk.materials.url, - }) - if talk.video: - links += mark_safe(""" - %(link)s""" % { - 'link': talk.video, - }) + #if talk.registration_required and self.conference.subscriptions_open: + # links += mark_safe(""" + # %(link)s""" % { + # 'link': reverse('register-for-a-talk', args=[talk.slug]), + # }) + # registration = """ + # %(max)s + # %(remain)s""" % { + # 'max': talk.attendees_limit, + # 'remain': talk.remaining_attendees or 0, + # } + #if talk.materials: + # links += mark_safe(""" + # %(link)s""" % { + # 'link': talk.materials.url, + # }) + #if talk.video: + # links += mark_safe(""" + # %(link)s""" % { + # 'link': talk.video, + # }) days_xml += """ %(start)s %(duration)s @@ -252,7 +252,6 @@ class Program: %(track)s %(type)s - %(abstract)s %(description)s %(persons)s @@ -267,7 +266,6 @@ class Program: 'title': escape(talk.title), 'track': escape(talk.track or ''), 'type': escape(talk.category.label), - 'abstract': escape(talk.abstract), 'description': escape(talk.description), 'persons': persons, 'links': links, @@ -320,7 +318,7 @@ DTEND:{talk.dtend} SUMMARY:{talk.title} LOCATION:{talk.room} STATUS: CONFIRMED -DESCRIPTION:{talk.abstract}\n---\n\n{talk.description} +DESCRIPTION:{talk.description} UID:{site.domain}/{talk.id} END:VEVENT """ diff --git a/cfp/templates/cfp/schedule.html b/cfp/templates/cfp/schedule.html new file mode 100644 index 0000000..97c126d --- /dev/null +++ b/cfp/templates/cfp/schedule.html @@ -0,0 +1,13 @@ +{% extends 'base.html' %} + +{% load i18n %} + +{% block publicscheduletab %} class="active"{% endblock %} + +{% block content %} + +

{% trans "Schedule" %}

+ +{{ program }} + +{% endblock %} diff --git a/cfp/templates/cfp/staff/base.html b/cfp/templates/cfp/staff/base.html index 65ad24a..ad76467 100644 --- a/cfp/templates/cfp/staff/base.html +++ b/cfp/templates/cfp/staff/base.html @@ -16,7 +16,7 @@  {% trans "Speakers" %}  {% trans "Tracks" %}  {% trans "Rooms" %} -  {% trans "Schedule" %} +  {% trans "Schedule" %}  {% trans "Conference" %} {% if request.user.is_staff %}
  •  Django-Admin
  • diff --git a/cfp/urls.py b/cfp/urls.py index 0d13a7b..a2aadf6 100644 --- a/cfp/urls.py +++ b/cfp/urls.py @@ -27,7 +27,8 @@ urlpatterns = [ url(r'^staff/rooms/(?P[-\w]+)/$', views.RoomDetail.as_view(), name='room-details'), 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/schedule/$', views.schedule, name='schedule'), + url(r'^staff/schedule/((?P[\w]+)/)?$', views.staff_schedule, name='staff-schedule'), url(r'^staff/select2/$', views.Select2View.as_view(), name='django_select2-json'), + url(r'^schedule/((?P[\w]+)/)?$', views.public_schedule, name='public-schedule'), #url(r'^markdown/$', views.markdown_preview, name='markdown'), ] diff --git a/cfp/views.py b/cfp/views.py index 0c18946..24a8082 100644 --- a/cfp/views.py +++ b/cfp/views.py @@ -7,6 +7,9 @@ from django.views.generic import FormView, TemplateView from django.contrib import messages from django.db.models import Q from django.views.generic import CreateView, DetailView, ListView, UpdateView +from django.http import HttpResponse, Http404 +from django.utils import timezone +from django.core.exceptions import PermissionDenied from django_select2.views import AutoResponseView @@ -468,18 +471,29 @@ def create_user(request): }) -@staff_required -def schedule(request): - program = Program(site=request.conference.site, pending=True, cache=False) - output = request.GET.get('format', 'html') - if output == 'html': - return render(request, 'cfp/staff/schedule.html', {'program': program.render('html')}) - elif output == 'xml': +def schedule(request, program_format, pending, cache, template): + program = Program(site=request.conference.site, pending=pending, cache=cache) + if program_format is None: + return render(request, template, {'program': program.render('html')}) + elif program_format == 'html': + return HttpResponse(program.render('html')) + elif program_format == 'xml': return HttpResponse(program.render('xml'), content_type="application/xml") - elif output == 'ics': + elif program_format == 'ics': return HttpResponse(program.render('ics'), content_type="text/calendar") else: - raise Http404("Format not available") + raise Http404(_("Format '%s' not available" % program_format)) + + +def public_schedule(request, program_format): + if not request.conference.schedule_available: + raise PermissionDenied + return schedule(request, program_format=program_format, pending=False, cache=True, template='cfp/schedule.html') + + +@staff_required +def staff_schedule(request, program_format): + return schedule(request, program_format=program_format, pending=True, cache=False, template='cfp/staff/schedule.html') class Select2View(StaffRequiredMixin, AutoResponseView): diff --git a/ponyconf/templates/base.html b/ponyconf/templates/base.html index 0a3a66e..9002583 100644 --- a/ponyconf/templates/base.html +++ b/ponyconf/templates/base.html @@ -21,6 +21,9 @@  {% trans "Home" %} {% endif %}  {% trans "Call for participation" %} + {% if conference.schedule_available %} +  {% trans "Schedule" %} + {% endif %} {% comment %} {% if request.user.is_authenticated %}  {% trans "Exhibitor" %} @@ -39,9 +42,6 @@  {% trans "Speakers" %}  Inbox  {% trans "Profile" %} - {% if request.user.is_staff %} -
  •   Administration
  • - {% endif %} {% endcomment %}
  •  {% trans "Logout" %}
  • {% else %}