Compare commits
1 Commits
065250db39
...
5c6f3b1e0f
Author | SHA1 | Date | |
---|---|---|---|
5c6f3b1e0f |
|
@ -6,22 +6,13 @@
|
|||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<h2 class="subtitle is-3">{% trans 'My programs' %}</h2>
|
||||
<h2 class="subtitle is-3">Mes émissions</h2>
|
||||
{% if programs|length %}
|
||||
<ul>
|
||||
{% for p in programs %}
|
||||
<li>• <a href="{% url 'program-detail' slug=p.slug %}">{{ p.title }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<br />
|
||||
<h2 class="subtitle is-3">{% trans 'Episodes' %}</h2>
|
||||
{% for e in episodes %}
|
||||
<ul>
|
||||
<li>• <a href="{% url 'episode-detail' slug=e.slug %}">{{ e.title }}</a></li>
|
||||
</ul>
|
||||
{% endfor %}
|
||||
|
||||
{% else %}
|
||||
{% trans 'You are not listed as a program editor yet' %}
|
||||
{% endif %}
|
||||
|
|
|
@ -5,6 +5,19 @@
|
|||
{% include "aircox/program_sidebar.html" %}
|
||||
|
||||
|
||||
{% block top-nav-tools %}
|
||||
{% has_perm page page.program.change_permission_codename simple=True as can_edit %}
|
||||
{% if can_edit %}
|
||||
<a class="navbar-item" href="{% url 'episode-edit' page.pk %}" target="_self">
|
||||
<span class="icon is-small">
|
||||
<i class="fa fa-pen"></i>
|
||||
</span>
|
||||
<span>{% translate "Edit" %}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
<a-episode :page="{title: "{{ page.title }}", podcasts: {{ object.podcasts|json }}}">
|
||||
<template v-slot="{podcasts,page}">
|
||||
|
|
30
aircox/templates/aircox/episode_form.html
Normal file
30
aircox/templates/aircox/episode_form.html
Normal file
|
@ -0,0 +1,30 @@
|
|||
{% extends "aircox/basepage_detail.html" %}
|
||||
{% load static i18n humanize honeypot aircox %}
|
||||
|
||||
|
||||
{% block head_extra %}
|
||||
{{ form.media }}
|
||||
{% endblock %}
|
||||
|
||||
{% block init-scripts %}
|
||||
{% endblock %}
|
||||
|
||||
{% block top-nav-tools %}
|
||||
<a class="navbar-item" href="{% url 'episode-detail' object.slug %}" target="_self">
|
||||
<span class="icon is-small">
|
||||
<i class="fa fa-eye"></i>
|
||||
</span>
|
||||
<span>{% translate "View" %}</span>
|
||||
</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<form method="post" enctype="multipart/form-data">{% csrf_token %}
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
{% render_honeypot_field "website" %}
|
||||
</table>
|
||||
<br/>
|
||||
<input type="submit" value="Update" class="button is-success">
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -47,6 +47,13 @@ Context variables:
|
|||
|
||||
|
||||
{% block actions %}
|
||||
{% has_perm page object.program.change_permission_codename simple=True as can_edit %}
|
||||
{% if can_edit %}
|
||||
<a class="button" href="{% url 'episode-edit' object.pk %}" target="_self">
|
||||
<span class="icon is-small"><i class="fas fa-pen" alt="{% trans 'edit' %}"></i></span>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{% if object.sound_set.public.count %}
|
||||
<button class="button" @click="player.playButtonClick($event)"
|
||||
data-sounds="{{ object.podcasts|json }}">
|
||||
|
|
|
@ -97,6 +97,11 @@ urls = [
|
|||
views.ProgramUpdateView.as_view(),
|
||||
name="program-edit",
|
||||
),
|
||||
path(
|
||||
_("episode/<pk>/edit/"),
|
||||
views.EpisodeUpdateView.as_view(),
|
||||
name="episode-edit",
|
||||
),
|
||||
path(
|
||||
_("programs/<slug:parent_slug>/episodes/"),
|
||||
views.EpisodeListView.as_view(),
|
||||
|
|
|
@ -2,7 +2,7 @@ from . import admin, errors
|
|||
from .article import ArticleDetailView, ArticleListView
|
||||
from .base import BaseAPIView, BaseView
|
||||
from .diffusion import DiffusionListView
|
||||
from .episode import EpisodeDetailView, EpisodeListView
|
||||
from .episode import EpisodeDetailView, EpisodeListView, EpisodeUpdateView
|
||||
from .home import HomeView
|
||||
from .log import LogListAPIView, LogListView
|
||||
from .page import (
|
||||
|
@ -30,6 +30,7 @@ __all__ = (
|
|||
"DiffusionListView",
|
||||
"EpisodeDetailView",
|
||||
"EpisodeListView",
|
||||
"EpisodeUpdateView",
|
||||
"HomeView",
|
||||
"LogListAPIView",
|
||||
"LogListView",
|
||||
|
|
|
@ -1,7 +1,17 @@
|
|||
from django.contrib.auth.mixins import UserPassesTestMixin
|
||||
from django.forms import ModelForm, FileField
|
||||
from django.urls import reverse
|
||||
|
||||
from ckeditor.fields import RichTextField
|
||||
from filer.models.filemodels import File
|
||||
|
||||
from aircox.controllers.sound_file import SoundFile
|
||||
|
||||
from ..filters import EpisodeFilters
|
||||
from ..models import Episode, Program, StaticPage
|
||||
from .page import PageListView
|
||||
from .program import ProgramPageDetailView
|
||||
from .program import ProgramPageDetailView, BaseProgramMixin
|
||||
from .page import PageUpdateView
|
||||
|
||||
__all__ = (
|
||||
"EpisodeDetailView",
|
||||
|
@ -25,3 +35,36 @@ class EpisodeListView(PageListView):
|
|||
has_headline = True
|
||||
parent_model = Program
|
||||
attach_to_value = StaticPage.ATTACH_TO_EPISODES
|
||||
|
||||
|
||||
class EpisodeForm(ModelForm):
|
||||
content = RichTextField()
|
||||
new_podcast = FileField(required=False)
|
||||
|
||||
class Meta:
|
||||
model = Episode
|
||||
fields = ["content"]
|
||||
|
||||
def save(self, commit=True):
|
||||
file_obj = self.cleaned_data["new_podcast"]
|
||||
if file_obj:
|
||||
obj, _ = File.objects.get_or_create(original_filename=file_obj.name, file=file_obj)
|
||||
sound_file = SoundFile(obj.path)
|
||||
sound_file.sync(
|
||||
program=self.instance.program, episode=self.instance, type=0, is_public=True, is_downloadable=True
|
||||
)
|
||||
|
||||
|
||||
class EpisodeUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView):
|
||||
model = Episode
|
||||
form_class = EpisodeForm
|
||||
|
||||
def get_sidebar_queryset(self):
|
||||
return super().get_sidebar_queryset().filter(parent=self.program)
|
||||
|
||||
def test_func(self):
|
||||
program = self.get_object().program
|
||||
return self.request.user.has_perm("aircox.%s" % program.change_permission_codename)
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse("episode-detail", kwargs={"slug": self.get_object().slug})
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
from django.contrib.auth.decorators import login_required
|
||||
from django.template.response import TemplateResponse
|
||||
|
||||
from aircox.models import Episode, Program
|
||||
from aircox.models import Program
|
||||
|
||||
|
||||
@login_required
|
||||
def profile(request):
|
||||
programs, episodes = [], []
|
||||
programs = []
|
||||
ugroups = request.user.groups.all()
|
||||
for p in Program.objects.all():
|
||||
if p.editors in ugroups:
|
||||
programs.append(p)
|
||||
for e in Episode.objects.filter(parent=p):
|
||||
episodes.append(e)
|
||||
context = {"user": request.user, "programs": programs, "episodes": episodes}
|
||||
context = {"user": request.user, "programs": programs}
|
||||
return TemplateResponse(request, "accounts/profile.html", context)
|
||||
|
|
Loading…
Reference in New Issue
Block a user