tracks views
This commit is contained in:
parent
878d8af1bf
commit
76aade171d
25
cfp/forms.py
25
cfp/forms.py
|
@ -141,3 +141,28 @@ class CreateUserForm(forms.ModelForm):
|
|||
if commit:
|
||||
user.save()
|
||||
return user
|
||||
|
||||
|
||||
class TrackForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Track
|
||||
fields = ['name', 'description']
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.conference = kwargs.pop('conference')
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# we should manually check (site, name) uniqueness as the site is not part of the form
|
||||
def clean_name(self):
|
||||
name = self.cleaned_data['name']
|
||||
if (not self.instance or self.instance.name != name) \
|
||||
and Track.objects.filter(site=self.conference.site, name=name).exists():
|
||||
raise self.instance.unique_error_message(self._meta.model, ['name'])
|
||||
return name
|
||||
|
||||
def save(self, commit=True):
|
||||
track = super().save(commit=False)
|
||||
track.site = self.conference.site
|
||||
if commit:
|
||||
track.save()
|
||||
return track
|
||||
|
|
|
@ -145,14 +145,14 @@ class Track(PonyConfModel):
|
|||
class Meta:
|
||||
unique_together = ('site', 'name')
|
||||
|
||||
#def estimated_duration(self):
|
||||
# return sum([talk.estimated_duration for talk in self.talk_set.all()])
|
||||
def estimated_duration(self):
|
||||
return sum([talk.estimated_duration for talk in self.talk_set.all()])
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
#def get_absolute_url(self):
|
||||
# return reverse('list-talks') + '?track=%s' % self.slug
|
||||
def get_absolute_url(self):
|
||||
return reverse('talk-list') + '?track=%s' % self.slug
|
||||
|
||||
|
||||
class TalkCategory(models.Model): # type of talk (conf 30min, 1h, stand, …)
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
<ul class="nav nav-tabs nav-justified subnav">
|
||||
{% comment %}
|
||||
<li{% block topicstab %}{% endblock %}><a href="{% url 'list-topics' %}"><span class="glyphicon glyphicon-tag"></span> {% trans "Topics" %}</a></li>
|
||||
<li{% block trackstab %}{% endblock %}><a href="{% url 'list-tracks' %}"><span class="glyphicon glyphicon-screenshot"></span> {% trans "Tracks" %}</a></li>
|
||||
<li{% block volunteerstab %}{% endblock %}><a href="{% url 'list-volunteers' %}"><span class="glyphicon glyphicon-thumbs-up"></span> {% trans "Volunteers" %}</a></li>
|
||||
<li{% block roomstab %}{% endblock %}><a href="{% url 'list-rooms' %}"><span class="glyphicon glyphicon-tent"></span> {% trans "Rooms" %}</a></li>
|
||||
<li{% block scheduletab %}{% endblock %}><a href="{% url 'show-schedule' %}"><span class="glyphicon glyphicon-calendar"></span> {% trans "Schedule" %}</a></li>
|
||||
|
@ -17,6 +16,7 @@
|
|||
{% endcomment %}
|
||||
<li{% block talkstab %}{% endblock %}><a href="{% url 'talk-list' %}"><span class="glyphicon glyphicon-blackboard"></span> {% trans "Talks" %}</a></li>
|
||||
<li{% block speakerstab %}{% endblock %}><a href="{% url 'participant-list' %}"><span class="glyphicon glyphicon-bullhorn"></span> {% trans "Speakers" %}</a></li>
|
||||
<li{% block trackstab %}{% endblock %}><a href="{% url 'track-list' %}"><span class="glyphicon glyphicon-screenshot"></span> {% trans "Tracks" %}</a></li>
|
||||
<li{% block conferencetab %}{% endblock %}><a href="{% url 'conference' %}"><span class="glyphicon glyphicon-asterisk"></span> {% trans "Conference" %}</a></li>
|
||||
{% if request.user.is_staff %}
|
||||
<li><a href="{% url 'admin:index' %}"><span class="glyphicon glyphicon-dashboard"></span> Django-Admin</a></li>
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
{% extends 'cfp/staff/base.html' %}
|
||||
|
||||
{% load bootstrap3 i18n %}
|
||||
|
||||
{% block trackstab %} class="active"{% endblock %}
|
||||
|
||||
{% block css %}
|
||||
{{ block.super }}
|
||||
{{ form.media.css }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{% trans "Track" %}</h1>
|
||||
|
||||
{% include "_form.html" %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block js_end %}
|
||||
{{ block.super }}
|
||||
{{ form.media.js }}
|
||||
{% endblock %}
|
|
@ -0,0 +1,35 @@
|
|||
{% extends 'cfp/staff/base.html' %}
|
||||
|
||||
{% load bootstrap3 cfp_tags i18n %}
|
||||
|
||||
{% block trackstab %} class="active"{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{% trans "Tracks" %}</h1>
|
||||
|
||||
<p><a href="{% url 'track-add' %}" class="btn btn-success">{% trans "Add a track" %}</a><p>
|
||||
|
||||
<div class="row">
|
||||
{% for track in track_list %}
|
||||
<div class="col-xs-6 col-sm-4">
|
||||
<h2>{{ track }}</h2>
|
||||
<p>{{ track.description }}</p>
|
||||
{% if request|staff %}
|
||||
{{ track.managers.count }} {% trans "manager" %}{{ track.managers.count|pluralize }}
|
||||
|
|
||||
<a href="{{ track.get_absolute_url }}">{{ track.talk_set.count }} {% trans "talk" %}{{ track.talk_set.count|pluralize }}</a>
|
||||
|
|
||||
{{ track.estimated_duration|duration_format }}
|
||||
|
|
||||
<a href="{% url 'track-edit' track.slug %}">{% bootstrap_icon "pencil" %}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% cycle '' '<div class="clearfix visible-xs"></div>' %}
|
||||
{% cycle '' '' '<div class="clearfix hidden-xs"></div>' %}
|
||||
{% empty %}
|
||||
<div class="col-xs-12"><em>{% trans "No tracks." %}</em></div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -9,3 +9,10 @@ register = template.Library()
|
|||
@register.filter
|
||||
def staff(request):
|
||||
return is_staff(request, request.user)
|
||||
|
||||
@register.filter('duration_format')
|
||||
def duration_format(value):
|
||||
value = int(value)
|
||||
hours = int(value/60)
|
||||
minutes = value%60
|
||||
return '%d h %02d' % (hours, minutes)
|
||||
|
|
|
@ -18,6 +18,9 @@ urlpatterns = [
|
|||
url(r'^staff/talks/(?P<talk_id>[\w\-]+)/edit/$', views.TalkEdit.as_view(), name='talk-edit'),
|
||||
url(r'^staff/speakers/$', views.participant_list, name='participant-list'),
|
||||
url(r'^staff/speakers/(?P<participant_id>[\w\-]+)/$', views.participant_details, name='participant-details'),
|
||||
url(r'^staff/tracks/$', views.TrackList.as_view(), name='track-list'),
|
||||
url(r'^staff/tracks/add/$', views.TrackCreate.as_view(), name='track-add'),
|
||||
url(r'^staff/tracks/(?P<slug>[-\w]+)/edit/$', views.TrackUpdate.as_view(), name='track-edit'),
|
||||
url(r'^staff/add-user/$', views.create_user, name='create-user'),
|
||||
url(r'^staff/select2/$', views.Select2View.as_view(), name='django_select2-json'),
|
||||
|
||||
|
|
31
cfp/views.py
31
cfp/views.py
|
@ -18,7 +18,7 @@ from .decorators import staff_required
|
|||
from .mixins import StaffRequiredMixin
|
||||
from .utils import is_staff
|
||||
from .models import Participant, Talk, TalkCategory, Vote, Track
|
||||
from .forms import TalkForm, TalkStaffForm, TalkFilterForm, ParticipantForm, ConferenceForm, CreateUserForm, STATUS_VALUES
|
||||
from .forms import TalkForm, TalkStaffForm, TalkFilterForm, ParticipantForm, ConferenceForm, CreateUserForm, STATUS_VALUES, TrackForm
|
||||
|
||||
|
||||
def home(request, conference):
|
||||
|
@ -346,6 +346,35 @@ class TalkEdit(StaffRequiredMixin, OnSiteMixin, UpdateView):
|
|||
return kwargs
|
||||
|
||||
|
||||
class TrackMixin(OnSiteMixin):
|
||||
model = Track
|
||||
|
||||
|
||||
class TrackList(StaffRequiredMixin, TrackMixin, ListView):
|
||||
template_name = 'cfp/staff/track_list.html'
|
||||
|
||||
|
||||
class TrackFormMixin(TrackMixin):
|
||||
template_name = 'cfp/staff/track_form.html'
|
||||
form_class = TrackForm
|
||||
success_url = reverse_lazy('track-list')
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs.update({
|
||||
'conference': self.kwargs['conference'],
|
||||
})
|
||||
return kwargs
|
||||
|
||||
|
||||
class TrackCreate(StaffRequiredMixin, TrackFormMixin, CreateView):
|
||||
pass
|
||||
|
||||
|
||||
class TrackUpdate(StaffRequiredMixin, TrackFormMixin, UpdateView):
|
||||
pass
|
||||
|
||||
|
||||
@staff_required
|
||||
def create_user(request, conference):
|
||||
form = CreateUserForm(request.POST or None)
|
||||
|
|
Loading…
Reference in New Issue