From: Frédéric Péters Date: Sat, 7 May 2016 13:42:12 +0000 (+0200) Subject: add new "regie" page, to assist in producing an episode X-Git-Tag: v2021~209 X-Git-Url: https://git.0d.be/?p=django-panik-emissions.git;a=commitdiff_plain;h=d2597729852a6ca1c9d2f2a54da81203b76ead75 add new "regie" page, to assist in producing an episode --- diff --git a/emissions/migrations/0007_playlistelement.py b/emissions/migrations/0007_playlistelement.py new file mode 100644 index 0000000..0eec020 --- /dev/null +++ b/emissions/migrations/0007_playlistelement.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import emissions.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('emissions', '0006_auto_20160507_1315'), + ] + + operations = [ + migrations.CreateModel( + name='PlaylistElement', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('title', models.CharField(max_length=200, verbose_name='Title')), + ('notes', models.CharField(default=b'', max_length=200, verbose_name='Notes', blank=True)), + ('sound', models.FileField(upload_to=emissions.models.get_playlist_sound_path, max_length=250, verbose_name='Sound')), + ('order', models.PositiveIntegerField()), + ('episode', models.ForeignKey(to='emissions.Episode', null=True)), + ], + options={ + 'ordering': ['order'], + 'verbose_name': 'Playlist Element', + 'verbose_name_plural': 'Playlist Elements', + }, + bases=(models.Model,), + ), + ] diff --git a/emissions/models.py b/emissions/models.py index be32d88..9808b90 100644 --- a/emissions/models.py +++ b/emissions/models.py @@ -634,6 +634,27 @@ class Focus(models.Model): return None +def get_playlist_sound_path(instance, filename): + return os.path.join('playlists', instance.episode.emission.slug, + instance.episode.slug, os.path.basename(filename)) + + +class PlaylistElement(models.Model): + episode = models.ForeignKey('Episode', null=True) + title = models.CharField(_('Title'), max_length=200) + notes = models.CharField(_('Notes'), max_length=200, blank=True, default='') + sound = models.FileField(_('Sound'), upload_to=get_playlist_sound_path, max_length=250) + order = models.PositiveIntegerField() + + class Meta: + verbose_name = _('Playlist Element') + verbose_name_plural = _('Playlist Elements') + ordering = ['order'] + + def shortcut(self): + return chr(ord('a')+self.order-1) + + @receiver(pre_save, sender=Focus, dispatch_uid='focus_pre_save') def set_focus_on_save(sender, instance, **kwargs): object = instance.get_related_object() diff --git a/emissions/templates/emissions/episode_regie.html b/emissions/templates/emissions/episode_regie.html new file mode 100644 index 0000000..dff0d52 --- /dev/null +++ b/emissions/templates/emissions/episode_regie.html @@ -0,0 +1,107 @@ +{% extends "base.html" %} +{% load soundfiles panikdbtags %} +{% block appbar %} +

{{ episode.emission.title }} — {{ episode.title }}

+Retourner à l'épisode +{% endblock %} + +{% block content %} + +

+Démarrer l'émission +Terminer l'émission + +

+ + + + + +{% for element in playlist %} + + + + + + +{% endfor %} +
⠿⁣{{element.title}} [{{element.shortcut}}]{{element.notes}}
+ +{% if can_manage %} +
+

Ajouter à la playlist

+
+{% csrf_token %} + +
+{% endif %} + +{% endblock %} + +{% block page-end %} + +{% endblock %} diff --git a/emissions/urls.py b/emissions/urls.py index fa42a1c..0940b28 100644 --- a/emissions/urls.py +++ b/emissions/urls.py @@ -43,6 +43,10 @@ urlpatterns = patterns('', url(r'^(?P[\w,-]+)/(?P[\w,-]+)/sounds/(?P\d+)/$', SoundFileUpdateView.as_view(), name='soundfile-update'), + url(r'^(?P[\w,-]+)/(?P[\w,-]+)/regie/$', EpisodeRegieView.as_view(), name='episode-regie'), + url(r'^(?P[\w,-]+)/(?P[\w,-]+)/regie/update-order$', + EpisodeRegieUpdateOrderView.as_view(), name='episode-regie-update-order'), + url(r'^(?P[\w,-]+)/add-newsitem$', EmissionNewsItemAdd.as_view(), name='emission-newsitem-add'), diff --git a/emissions/views.py b/emissions/views.py index ae1551d..1bc8759 100644 --- a/emissions/views.py +++ b/emissions/views.py @@ -5,7 +5,7 @@ import os from django.core.exceptions import PermissionDenied from django.core.files.storage import DefaultStorage from django.core.urlresolvers import reverse_lazy -from django.http import HttpResponse, Http404 +from django.http import HttpResponse, Http404, HttpResponseRedirect from django.core.urlresolvers import reverse, reverse_lazy from django.shortcuts import redirect from django.utils.translation import ugettext as _, ugettext_lazy @@ -21,7 +21,8 @@ from django.contrib import messages import haystack.views from .models import Emission, Episode, Diffusion, Category, Schedule, \ - SoundFile, NewsItem, NewsCategory, Absence + SoundFile, NewsItem, NewsCategory, Absence, \ + PlaylistElement from .forms import EmissionForm, EpisodeForm, EpisodeNewForm, ScheduleForm, \ DiffusionForm, SoundFileForm, NewsItemForm, \ SoundFileEditForm, AbsenceForm @@ -39,7 +40,9 @@ __all__ = ['EmissionListView', 'EmissionDetailView', 'EmissionCreateView', 'NewsItemDeleteView', 'NewsItemAddView', 'SoundFileDeleteView', 'SoundFileUpdateView', 'EmissionAddAbsenceView', 'AbsenceDeleteView', - 'EmissionOpenChatView', 'EmissionCloseChatView'] + 'EmissionOpenChatView', 'EmissionCloseChatView', + 'EpisodeRegieView', + 'EpisodeRegieUpdateOrderView'] SUCCESS_MESSAGE = ugettext_lazy('Your changes will appear online in a few minutes.') @@ -554,3 +557,47 @@ class EmissionCloseChatView(DetailView): self.object.chat_open = None self.object.save() return redirect(self.object.get_absolute_url()) + + +class EpisodeRegieView(DetailView): + model = Episode + template_name = 'emissions/episode_regie.html' + + def get_object(self, queryset=None): + try: + return Episode.objects.get(slug=self.kwargs.get('slug'), + emission__slug=self.kwargs.get('emission_slug')) + except Episode.DoesNotExist: + raise Http404() + + def post(self, request, *args, **kwargs): + episode = self.get_object() + i = PlaylistElement.objects.filter(episode=episode).count() + for upload in request.FILES.getlist('playlist-element'): + playlist_element = PlaylistElement( + episode=episode, + title=upload.name, + sound=upload, + order=i+1) + playlist_element.save() + i += 1 + messages.info(request, _('%d files uploaded successfully.') % + len(request.FILES.getlist('playlist-element'))) + return HttpResponseRedirect('.') + + def get_context_data(self, **kwargs): + context = super(EpisodeRegieView, self).get_context_data(**kwargs) + context['playlist'] = PlaylistElement.objects.filter(episode=self.object.id) + try: + context['can_manage'] = self.request.user.can_manage(self.object) + except AttributeError: + pass + return context + +class EpisodeRegieUpdateOrderView(View): + def get(self, request, *args, **kwargs): + new_order = request.GET.getlist('new-order[]') + for element in PlaylistElement.objects.filter(id__in=new_order): + element.order = new_order.index(str(element.id)) + 1 + element.save() + return HttpResponse('ok')