tracks views

This commit is contained in:
Élie Bouttier 2017-08-02 20:25:43 +02:00
parent 878d8af1bf
commit 76aade171d
8 changed files with 128 additions and 6 deletions

View File

@ -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

View File

@ -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, …)

View File

@ -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>&nbsp;{% trans "Topics" %}</a></li>
<li{% block trackstab %}{% endblock %}><a href="{% url 'list-tracks' %}"><span class="glyphicon glyphicon-screenshot"></span>&nbsp;{% trans "Tracks" %}</a></li>
<li{% block volunteerstab %}{% endblock %}><a href="{% url 'list-volunteers' %}"><span class="glyphicon glyphicon-thumbs-up"></span>&nbsp;{% trans "Volunteers" %}</a></li>
<li{% block roomstab %}{% endblock %}><a href="{% url 'list-rooms' %}"><span class="glyphicon glyphicon-tent"></span>&nbsp;{% trans "Rooms" %}</a></li>
<li{% block scheduletab %}{% endblock %}><a href="{% url 'show-schedule' %}"><span class="glyphicon glyphicon-calendar"></span>&nbsp;{% trans "Schedule" %}</a></li>
@ -17,6 +16,7 @@
{% endcomment %}
<li{% block talkstab %}{% endblock %}><a href="{% url 'talk-list' %}"><span class="glyphicon glyphicon-blackboard"></span>&nbsp;{% trans "Talks" %}</a></li>
<li{% block speakerstab %}{% endblock %}><a href="{% url 'participant-list' %}"><span class="glyphicon glyphicon-bullhorn"></span>&nbsp;{% trans "Speakers" %}</a></li>
<li{% block trackstab %}{% endblock %}><a href="{% url 'track-list' %}"><span class="glyphicon glyphicon-screenshot"></span>&nbsp;{% trans "Tracks" %}</a></li>
<li{% block conferencetab %}{% endblock %}><a href="{% url 'conference' %}"><span class="glyphicon glyphicon-asterisk"></span>&nbsp;{% trans "Conference" %}</a></li>
{% if request.user.is_staff %}
<li><a href="{% url 'admin:index' %}"><span class="glyphicon glyphicon-dashboard"></span>&nbsp;Django-Admin</a></li>

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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)

View File

@ -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'),

View File

@ -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)