From 58ceab2eab58fdbed72d159a092e7488164f0b57 Mon Sep 17 00:00:00 2001 From: Tris Date: Mon, 14 Sep 2020 16:32:37 +1000 Subject: [PATCH] Admin editing views --- interface/models.py | 4 ++ interface/static/interface/css/polyphonic.css | 45 +++++++++++++++---- .../templates/interface/default_form.html | 14 ++++++ interface/templates/interface/manage.html | 5 ++- .../templates/interface/project_base.html | 10 +++++ .../templates/interface/project_detail.html | 20 ++++----- .../templates/interface/project_form.html | 2 +- interface/templates/interface/register.html | 6 +-- .../templates/interface/resource_list.html | 37 +++++++++------ .../templates/interface/submission_list.html | 25 +++++++++++ interface/templates/interface/wiki.html | 4 ++ .../templates/interface/wikipage_form.html | 23 ++++++++++ interface/urls.py | 4 ++ interface/views.py | 37 ++++++++++++--- 14 files changed, 191 insertions(+), 45 deletions(-) create mode 100644 interface/templates/interface/default_form.html create mode 100644 interface/templates/interface/submission_list.html create mode 100644 interface/templates/interface/wikipage_form.html diff --git a/interface/models.py b/interface/models.py index e2cba05..3a00617 100644 --- a/interface/models.py +++ b/interface/models.py @@ -2,6 +2,7 @@ from django.db import models from django.utils.text import slugify from django.utils import timezone from django.conf import settings +from django.shortcuts import resolve_url import random @@ -87,6 +88,9 @@ class WikiPage(models.Model): title = models.CharField(max_length=255) markdown = models.TextField() + def get_absolute_url(self): + return resolve_url('wiki', project=self.project_id, pk=self.pk) + def __str__(self): return self.title diff --git a/interface/static/interface/css/polyphonic.css b/interface/static/interface/css/polyphonic.css index ed72b58..6fdd1f6 100644 --- a/interface/static/interface/css/polyphonic.css +++ b/interface/static/interface/css/polyphonic.css @@ -40,6 +40,12 @@ BODY { margin: 0px auto; } +.collapse { + display: flex; + flex-direction: row; + justify-content: space-around; +} + @media all and (max-width: 900px) { .mdhide { display: none; @@ -53,8 +59,12 @@ BODY { UL.nav-buttons { flex-direction: column; } + .collapse { + flex-direction: column; + } } + /* HEADER BAR */ .navigation { @@ -90,18 +100,13 @@ UL.nav-buttons > LI { margin: 2px 10px; } -.admin-actions { - text-align: right; - margin: 10px; -} - /* FORMS */ FORM.vertical { display: flex; flex-direction: column; max-width: 400px; - margin: 20px auto; + margin: 0px auto; } LABEL { @@ -112,6 +117,10 @@ TEXTAREA { height: 50px; } +INPUT[type=checkbox] { + margin-right: auto; +} + .form-actions { text-align: right; margin-top: 20px; @@ -200,10 +209,11 @@ H1 { text-align: center; } -TABLE { - width: 100%; +TD { + padding: 5px; } + TABLE.horizontal TH { text-align: right; } @@ -228,4 +238,23 @@ TABLE.horizontal TH { border: 1px solid var(--border-color); border-radius: 10px; padding: 5px; +} + +.admin-tools { + float: right; + padding: 10pt; +} + +.disabled { + background-color: #DDD; +} + +.dz-image { + width: 240px !important; +} + +.dz-progress { + width: 200px !important; + margin-left: -100px !important; + margin-top: 24px !important; } \ No newline at end of file diff --git a/interface/templates/interface/default_form.html b/interface/templates/interface/default_form.html new file mode 100644 index 0000000..a520dbe --- /dev/null +++ b/interface/templates/interface/default_form.html @@ -0,0 +1,14 @@ +{% extends "interface/project_base.html" %} + +{% block page %} +
+

{{ title }}

+
+ {% csrf_token %} + {{ form }} +
+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/interface/templates/interface/manage.html b/interface/templates/interface/manage.html index 43db88f..9ed4819 100644 --- a/interface/templates/interface/manage.html +++ b/interface/templates/interface/manage.html @@ -4,8 +4,9 @@

Manage {{ ensemble.name }}

- Joining code for participants:
- {{ ensemble_url }} + Joining instructions for participants

+ URL: {{ ensemble_url }}
+ Passphrase: {{ ensemble.passphrase }}

Sorry, not much you can do here yet. diff --git a/interface/templates/interface/project_base.html b/interface/templates/interface/project_base.html index 09c795c..959a369 100644 --- a/interface/templates/interface/project_base.html +++ b/interface/templates/interface/project_base.html @@ -2,6 +2,13 @@ {% block content %} +{% if request.is_admin %} +

+{% block admin %} +{% endblock %} +
+{% endif %} +

{{ project.name }}

{% block page %} No content @@ -15,6 +22,9 @@ No content {% endfor %} Resources + {% if request.is_admin %} + Submissions + {% endif %} Send a file
diff --git a/interface/templates/interface/project_detail.html b/interface/templates/interface/project_detail.html index f2373db..26c9ec1 100644 --- a/interface/templates/interface/project_detail.html +++ b/interface/templates/interface/project_detail.html @@ -3,25 +3,21 @@ {% block page %}

Due in {{ project.deadline|timeuntil }}!

-

There have been {{ project.submissions.count }} submissions so far...

-
- + {% with sub_count=project.submissions.count %} +

There have been {{ sub_count }} submission{{ sub_count|pluralize }} so far...

+ {% if sub_count %} +

Recent submissions

+
- {% for submission in project.submissions %} + {% for submission in project.submissions|slice:":5" %} - {% if request.is_admin %} - - {% endif %} {% endfor %}
{{ submission.date|timesince }} ago {{ submission.name }} ({{ submission.instrument }}) - -   - -
-
+ {% endif %} + {% endwith %}
{% endblock %} \ No newline at end of file diff --git a/interface/templates/interface/project_form.html b/interface/templates/interface/project_form.html index f9b7926..a65ec70 100644 --- a/interface/templates/interface/project_form.html +++ b/interface/templates/interface/project_form.html @@ -8,7 +8,7 @@ {% csrf_token %} {{ form }}
- +
diff --git a/interface/templates/interface/register.html b/interface/templates/interface/register.html index a61fdc3..26a20b0 100644 --- a/interface/templates/interface/register.html +++ b/interface/templates/interface/register.html @@ -4,7 +4,7 @@ {% if not request.user.is_authenticated %} {% endif %} -
+
{% if current %}

My Ensembles

@@ -13,9 +13,9 @@
  • {{ ensemble.name }}
  • {% endfor %} -
    {% endif %} -
    +

    Join an ensemble

    {% csrf_token %} diff --git a/interface/templates/interface/resource_list.html b/interface/templates/interface/resource_list.html index 508c3ee..620ab31 100644 --- a/interface/templates/interface/resource_list.html +++ b/interface/templates/interface/resource_list.html @@ -1,26 +1,40 @@ {% extends "interface/project_base.html" %} -{% block page %} +{% block admin %} + Add new +{% endblock %} + + {% block page %}

    Resources

    {% for resource in object_list %} {% with download=resource.presigned_url %}
    + {% if request.is_admin %} + + {% endif %}

    {{ resource.name }} {% if download %} - + Download - - {% endif %} - {% if request.is_admin %} - - Upload - + {% endif %}

    -

    {{ resource.description }}

    +

    + {{ resource.description }} + {% if not resource.visible %} +
    (This resource is hidden from participants) + {% endif %} +

    {% if download and resource.media_type == 'audio' %} {% endif %} @@ -28,10 +42,5 @@ {% endwith %} {% endfor %}
    - {% if request.is_admin %} - - {% endif %}
    {% endblock %} \ No newline at end of file diff --git a/interface/templates/interface/submission_list.html b/interface/templates/interface/submission_list.html new file mode 100644 index 0000000..95e036d --- /dev/null +++ b/interface/templates/interface/submission_list.html @@ -0,0 +1,25 @@ +{% extends "interface/project_base.html" %} + +{% block page %} + + + + + + + + {% for submission in object_list %} + + + + + + + + {% endfor %} + +
    DateTimeNameInstrument
    {{ submission.date.date }}{{ submission.date.time }}{{ submission.name }}{{ submission.instrument }} + + +
    +{% endblock %} \ No newline at end of file diff --git a/interface/templates/interface/wiki.html b/interface/templates/interface/wiki.html index 16bfcf7..1fde2fd 100644 --- a/interface/templates/interface/wiki.html +++ b/interface/templates/interface/wiki.html @@ -1,5 +1,9 @@ {% extends "interface/project_base.html" %} +{% block admin %} + +{% endblock %} + {% block page %}
    {{ wiki_html|safe }} diff --git a/interface/templates/interface/wikipage_form.html b/interface/templates/interface/wikipage_form.html new file mode 100644 index 0000000..038b83e --- /dev/null +++ b/interface/templates/interface/wikipage_form.html @@ -0,0 +1,23 @@ +{% extends "interface/project_base.html" %} + +{% block page %} + +
    +

    {{ title }}

    +

    {{ instructions }}

    + + {% csrf_token %} + {{ form }} +
    + +
    + +
    +{% endblock %} \ No newline at end of file diff --git a/interface/urls.py b/interface/urls.py index 7203ffe..f50461c 100644 --- a/interface/urls.py +++ b/interface/urls.py @@ -12,15 +12,19 @@ urlpatterns = [ path('', views.EnsembleDetailView.as_view(), name='ensemble_detail'), path('projects/', views.ProjectDetailView.as_view(), name="project_detail"), + path('projects//page/', views.WikiView.as_view(), name="wiki"), + path('projects//page//edit', views.WikiEditView.as_view(), name="wiki_edit"), path('projects//submission', views.SubmissionCreateView.as_view(), name="submission_create"), path('projects//submission/', views.SubmissionDetailView.as_view(), name="submission_detail"), path('projects//submission//upload', views.SubmissionUploadView.as_view(), name="submission_upload"), path('projects//submission//cancel', views.SubmissionCancelView.as_view(), name="submission_cancel"), + path('projects//submissions', views.SubmissionListView.as_view(), name="submission_list"), path('projects//resources', views.ResourceListView.as_view(), name="resource_list"), path('projects//resources/add', views.ResourceCreateView.as_view(), name="resource_create"), path('projects//resources/', views.ResourceUploadView.as_view(), name="resource_upload"), + path('projects//resources//edit', views.ResourceEditView.as_view(), name="resource_edit"), path('projects//resources//complete', views.ResourceCompleteView.as_view(), name="resource_complete"), ] \ No newline at end of file diff --git a/interface/views.py b/interface/views.py index 8624e32..5750dd8 100644 --- a/interface/views.py +++ b/interface/views.py @@ -2,7 +2,7 @@ from django.shortcuts import render, get_object_or_404, redirect, resolve_url from django.views.generic import TemplateView, View, RedirectView from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.list import ListView -from django.views.generic.edit import CreateView +from django.views.generic.edit import CreateView, UpdateView from django.views.generic.base import ContextMixin from django.http import HttpResponseRedirect from django.core.exceptions import SuspiciousOperation @@ -199,6 +199,16 @@ class WikiView(ProjectMixin, DetailView): data['wiki_html'] = markdown(self.object.markdown) return data +class WikiCreateView(ProjectMixin, CreateView): + admin_required = True + model = models.WikiPage + fields = ['title', 'markdown'] + +class WikiEditView(ProjectMixin, UpdateView): + admin_required = True + model = models.WikiPage + fields = ['title', 'markdown'] + class SubmissionCreateView(ProjectMixin, CreateView): model = models.Submission fields = ['name', 'instrument', 'notes'] @@ -250,17 +260,22 @@ class SubmissionCancelView(ProjectMixin, SingleObjectMixin, View): self.object.delete() return redirect('project_detail', pk=kwargs['project']) +class SubmissionListView(ProjectMixin, ListView): + model = models.Submission + admin_required = True + + def get_queryset(self): + return super().get_queryset().filter(complete=True).order_by('-pk') + class ResourceCreateView(ProjectMixin, CreateView): model = models.Resource fields = ['name', 'media_type', 'description'] template_name = 'interface/project_form.html' title = "Add a new resource" + admin_required = True def form_valid(self, form): - if not self.request.is_admin: - raise SuspiciousOperation("Must be logged in to create resources") - self.object = form.save(commit=False) self.object.project = self.get_project() self.object.save() @@ -291,7 +306,19 @@ class ResourceListView(ProjectMixin, ListView): model = models.Resource def get_queryset(self): - return super().get_queryset().filter(visible=True) + qs = super().get_queryset() + if not self.request.is_admin: + qs = qs.filter(visible=True) + return qs + +class ResourceEditView(ProjectMixin, UpdateView): + admin_required = True + model = models.Resource + fields = ['name', 'description', 'visible'] + template_name = 'interface/default_form.html' + + def get_success_url(self): + return resolve_url('resource_list', project=self.kwargs['project']) class ManageView(EnsembleMixin, TemplateView): template_name = 'interface/manage.html'