diff --git a/aircox/forms.py b/aircox/forms.py
index 2c71797..469dea7 100644
--- a/aircox/forms.py
+++ b/aircox/forms.py
@@ -1,10 +1,12 @@
from django import forms
-from django.forms import ModelForm, ImageField
+from django.forms import ModelForm, ImageField, FileField
from ckeditor.fields import RichTextField
from filer.models.imagemodels import Image
+from filer.models.filemodels import File
-from aircox.models import Comment, Program
+from aircox.models import Comment, Episode, Program
+from aircox.controllers.sound_file import SoundFile
class CommentForm(ModelForm):
@@ -35,3 +37,21 @@ class ProgramForm(ModelForm):
obj, _ = Image.objects.get_or_create(original_filename=file_obj.name, file=file_obj)
self.instance.cover = obj
super().save(commit=commit)
+
+
+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
+ )
diff --git a/aircox/templates/aircox/base.html b/aircox/templates/aircox/base.html
index a828f3f..42be5ce 100644
--- a/aircox/templates/aircox/base.html
+++ b/aircox/templates/aircox/base.html
@@ -1,3 +1,4 @@
+{% load static i18n thumbnail aircox %}
{% comment %}
Base website template. It displays various elements depending on context
variables.
@@ -10,8 +11,6 @@ Usefull context:
- sidebar_url_name: url name sidebar item complete list
- sidebar_url_parent: parent page for sidebar items complete list
{% endcomment %}
-{% load static i18n thumbnail aircox %}
-
diff --git a/aircox/templates/aircox/episode_detail.html b/aircox/templates/aircox/episode_detail.html
index 8ad5be2..abc06a9 100644
--- a/aircox/templates/aircox/episode_detail.html
+++ b/aircox/templates/aircox/episode_detail.html
@@ -3,6 +3,18 @@
{% load i18n aircox %}
+{% block top-nav-tools %}
+{% has_perm page page.program.change_permission_codename simple=True as can_edit %}
+{% if can_edit %}
+
+
+
+
+ {% translate "Edit" %}
+
+{% endif %}
+{% endblock %}
+
{% block content-container %}
diff --git a/aircox/templates/aircox/episode_form.html b/aircox/templates/aircox/episode_form.html
new file mode 100644
index 0000000..e86f672
--- /dev/null
+++ b/aircox/templates/aircox/episode_form.html
@@ -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 %}
+
+
+
+
+ {% translate "View" %}
+
+{% endblock %}
+
+{% block main %}
+
+{% endblock %}
diff --git a/aircox/templates/aircox/widgets/episode_item.html b/aircox/templates/aircox/widgets/episode_item.html
index 57648b4..02f23a1 100644
--- a/aircox/templates/aircox/widgets/episode_item.html
+++ b/aircox/templates/aircox/widgets/episode_item.html
@@ -25,12 +25,31 @@
{% endblock %}
-{% block content %}
-{% if not object.content %}
- {% with object.parent.content as content %}
- {{ block.super }}
- {% endwith %}
-{% else %}
- {{ block.super }}
+{% block actions %}
+{% if object.sound_set.public.count %}
+
+{% endif %}
+{% endblock %}
+
+{% block actions %}
+{% has_perm page object.program.change_permission_codename simple=True as can_edit %}
+{% if can_edit %}
+
+
+
+{% endif %}
+
+{% if object.sound_set.public.count %}
+
{% endif %}
{% endblock %}
diff --git a/aircox/urls.py b/aircox/urls.py
index 2d6ef13..f5c6f23 100755
--- a/aircox/urls.py
+++ b/aircox/urls.py
@@ -114,6 +114,11 @@ urls = [
views.EpisodeDetailView.as_view(),
name="episode-detail",
),
+ path(
+ _("programs/episodes//edit/"),
+ views.EpisodeUpdateView.as_view(),
+ name="episode-edit",
+ ),
path(_("podcasts/"), views.PodcastListView.as_view(), name="podcast-list"),
path(_("podcasts/c//"), views.PodcastListView.as_view(), name="podcast-list"),
# ---- others
diff --git a/aircox/views/__init__.py b/aircox/views/__init__.py
index f584d58..15a8171 100644
--- a/aircox/views/__init__.py
+++ b/aircox/views/__init__.py
@@ -2,7 +2,7 @@ from . import admin, errors
from .article import ArticleDetailView, ArticleListView
from .base import BaseAPIView, BaseView
from .diffusion import DiffusionListView, TimeTableView
-from .episode import EpisodeDetailView, EpisodeListView, PodcastListView
+from .episode import EpisodeDetailView, EpisodeListView, PodcastListView, EpisodeUpdateView
from .home import HomeView
from .log import LogListAPIView, LogListView
from .page import (
@@ -32,6 +32,7 @@ __all__ = (
"EpisodeDetailView",
"EpisodeListView",
"PodcastListView",
+ "EpisodeUpdateView",
"HomeView",
"LogListAPIView",
"LogListView",
diff --git a/aircox/views/episode.py b/aircox/views/episode.py
index 7d0c4a9..36b2c83 100644
--- a/aircox/views/episode.py
+++ b/aircox/views/episode.py
@@ -1,14 +1,20 @@
-from django.shortcuts import reverse
+from django.contrib.auth.mixins import UserPassesTestMixin
+from django.urls import reverse
+
+from aircox.forms import EpisodeForm
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",
"EpisodeListView",
"PodcastListView",
+ "EpisodeUpdateView",
)
@@ -39,3 +45,18 @@ class EpisodeListView(PageListView):
class PodcastListView(EpisodeListView):
attach_to_value = StaticPage.Target.PODCASTS
queryset = Episode.objects.published().with_podcasts().order_by("-pub_date")
+
+
+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})