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:
%(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 %}