+ {% with full_name="'"|add:formset.prefix|add:"-' + cell.row + '-"|add:name|add:"'" %}
{% block row-field %}
- {% include "./form_field.html" with value="item.data."|add:name vbind=1 %}
+ {% include "./v_form_field.html" with value="item.data."|add:name name=full_name %}
{% endblock %}
+ {% endwith %}
[[ error ]] !
diff --git a/aircox/templates/aircox/dashboard/soundlist_editor.html b/aircox/templates/aircox/dashboard/soundlist_editor.html
index 4257321..050651c 100644
--- a/aircox/templates/aircox/dashboard/soundlist_editor.html
+++ b/aircox/templates/aircox/dashboard/soundlist_editor.html
@@ -1,11 +1,13 @@
{% extends "./list_editor.html" %}
{% block outer %}
+ {% with no_initial_form_count=True %}
{% with tag_id="inline-sounds" %}
{% with tag="a-sound-list-editor" %}
{{ block.super }}
{% endwith %}
{% endwith %}
+ {% endwith %}
{% endblock %}
diff --git a/aircox/templates/aircox/dashboard/v_form_field.html b/aircox/templates/aircox/dashboard/v_form_field.html
new file mode 100644
index 0000000..29e6882
--- /dev/null
+++ b/aircox/templates/aircox/dashboard/v_form_field.html
@@ -0,0 +1,24 @@
+{% comment %}
+Render a form field instance as field (to be used when no model instance is provided). Value is binded as vue, class to Bulma
+
+Context:
+- name: field name
+- field: form field
+- value: input ":v-model" attribute
+- hidden: if True, hidden field
+{% endcomment %}
+{% load aircox %}
+
+{% if field.is_hidden or hidden %}
+
+{% elif field|is_checkbox %}
+
+{% elif field|is_select %}
+
+{% else %}
+
+{% endif %}
diff --git a/aircox/views/episode.py b/aircox/views/episode.py
index 0e61359..fc0d45f 100644
--- a/aircox/views/episode.py
+++ b/aircox/views/episode.py
@@ -64,6 +64,7 @@ class EpisodeUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView):
def get_tracklist_formset(self, episode, **kwargs):
kwargs.update(
{
+ "prefix": "tracks",
"queryset": self.get_tracklist_queryset(episode),
"initial": {
"episode": episode.id,
@@ -78,6 +79,7 @@ class EpisodeUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView):
def get_soundlist_formset(self, episode, **kwargs):
kwargs.update(
{
+ "prefix": "sounds",
"queryset": self.get_soundlist_queryset(episode),
"initial": {
"program": episode.parent_id,
@@ -102,20 +104,29 @@ class EpisodeUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView):
return forms.SoundCreateForm(**kwargs)
def get_context_data(self, **kwargs):
- kwargs.update(
- {
- "soundlist_formset": self.get_soundlist_formset(self.object),
- "tracklist_formset": self.get_tracklist_formset(self.object),
- "sound_form": self.get_sound_form(self.object),
- }
+ forms = (
+ ("soundlist_formset", self.get_soundlist_formset),
+ ("tracklist_formset", self.get_tracklist_formset),
+ ("sound_form", self.get_sound_form),
)
+ for key, func in forms:
+ if key not in kwargs:
+ kwargs[key] = func(self.object)
return super().get_context_data(**kwargs)
def post(self, request, *args, **kwargs):
- super().post(request, *args, **kwargs)
- formset = self.get_formset(request.POST)
- if formset.is_valid():
- formset.save()
- return super().form_valid(formset)
- else:
- return super().form_valid(formset) # form_invalid(formset)
+ resp = super().post(request, *args, **kwargs)
+
+ formsets = {
+ "soundlist_formset": self.get_soundlist_formset(self.object, data=request.POST),
+ "tracklist_formset": self.get_tracklist_formset(self.object, data=request.POST),
+ }
+ invalid = False
+ for formset in formsets.values():
+ if not formset.is_valid():
+ invalid = True
+ else:
+ formset.save()
+ if invalid:
+ return self.get(request, **formsets)
+ return resp
diff --git a/aircox/views/page.py b/aircox/views/page.py
index 815dc82..e789814 100644
--- a/aircox/views/page.py
+++ b/aircox/views/page.py
@@ -196,7 +196,6 @@ class PageUpdateView(BaseView, UpdateView):
context_object_name = "page"
template_name = "aircox/page_form.html"
- # FIXME: remove?
def get_page(self):
return self.object
diff --git a/aircox/viewsets.py b/aircox/viewsets.py
index 1487fad..e59e31e 100644
--- a/aircox/viewsets.py
+++ b/aircox/viewsets.py
@@ -42,6 +42,12 @@ class SoundViewSet(BaseAPIView, viewsets.ModelViewSet):
filter_backends = (drf_filters.DjangoFilterBackend,)
filterset_class = filters.SoundFilterSet
+ def perform_create(self, serializer):
+ obj = serializer.save()
+ # FIXME: hack to avoid "TYPE_REMOVED" status
+ # -> file is saved to fs after object is saved to db
+ obj.save()
+
class TrackROViewSet(viewsets.ReadOnlyModelViewSet):
"""Track viewset used for auto completion."""
diff --git a/assets/src/components/ASoundListEditor.vue b/assets/src/components/ASoundListEditor.vue
index 611c766..1ca43b7 100644
--- a/assets/src/components/ASoundListEditor.vue
+++ b/assets/src/components/ASoundListEditor.vue
@@ -3,7 +3,6 @@
@@ -24,6 +23,7 @@
+
diff --git a/assets/src/index.js b/assets/src/index.js
index 1137ad7..64c5968 100644
--- a/assets/src/index.js
+++ b/assets/src/index.js
@@ -54,11 +54,13 @@ window.aircox = {
}
},
- onKeyPress(event) {
+ onKeyPress(/*event*/) {
+ /*
if(event.key == " ") {
this.player.togglePlay()
event.stopPropagation()
}
+ */
},
/**