From 821a337582bd25f2d856fc9879e67b18d4e5ecd3 Mon Sep 17 00:00:00 2001 From: Hugo LEVY-FALK Date: Fri, 9 Mar 2018 13:18:03 +0100 Subject: [PATCH] Upload de contenus --- content/forms.py | 20 +++++++++++++ content/migrations/0003_auto_20180309_1233.py | 19 ++++++++++++ content/migrations/0004_auto_20180309_1235.py | 19 ++++++++++++ content/migrations/0005_auto_20180309_1255.py | 18 +++++++++++ content/migrations/0006_auto_20180309_1257.py | 19 ++++++++++++ content/migrations/0007_auto_20180309_1315.py | 25 ++++++++++++++++ content/models.py | 8 +++-- content/urls.py | 6 ++-- content/views.py | 30 ++++++++++++++++++- users/templates/users/school.html | 2 +- 10 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 content/forms.py create mode 100644 content/migrations/0003_auto_20180309_1233.py create mode 100644 content/migrations/0004_auto_20180309_1235.py create mode 100644 content/migrations/0005_auto_20180309_1255.py create mode 100644 content/migrations/0006_auto_20180309_1257.py create mode 100644 content/migrations/0007_auto_20180309_1315.py diff --git a/content/forms.py b/content/forms.py new file mode 100644 index 0000000..dd958d3 --- /dev/null +++ b/content/forms.py @@ -0,0 +1,20 @@ +from django import forms + +from .models import Content, Category + + +class CreateContent(forms.ModelForm): + class Meta: + model = Content + fields = [ + 'name', + 'category', + 'file', + ] + + def __init__(self, school, *args, **kwargs): + super().__init__(*args, **kwargs) + self.instance.school = school + + already_created = map(lambda x:x.category.pk, school.content_set.select_related('category')) + self.fields['category'].queryset = Category.objects.exclude(pk__in=already_created) diff --git a/content/migrations/0003_auto_20180309_1233.py b/content/migrations/0003_auto_20180309_1233.py new file mode 100644 index 0000000..43e5cce --- /dev/null +++ b/content/migrations/0003_auto_20180309_1233.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0.1 on 2018-03-09 11:33 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0002_auto_20180309_1116'), + ] + + operations = [ + migrations.AlterField( + model_name='content', + name='school_owner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.School'), + ), + ] diff --git a/content/migrations/0004_auto_20180309_1235.py b/content/migrations/0004_auto_20180309_1235.py new file mode 100644 index 0000000..13c8170 --- /dev/null +++ b/content/migrations/0004_auto_20180309_1235.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0.1 on 2018-03-09 11:35 + +import content.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0003_auto_20180309_1233'), + ] + + operations = [ + migrations.AlterField( + model_name='content', + name='file', + field=models.FileField(upload_to=content.models.get_upload_to, verbose_name='Fichier'), + ), + ] diff --git a/content/migrations/0005_auto_20180309_1255.py b/content/migrations/0005_auto_20180309_1255.py new file mode 100644 index 0000000..e25d507 --- /dev/null +++ b/content/migrations/0005_auto_20180309_1255.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.1 on 2018-03-09 11:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0004_auto_20180309_1235'), + ] + + operations = [ + migrations.AlterField( + model_name='content', + name='file', + field=models.FileField(upload_to='', verbose_name='Fichier'), + ), + ] diff --git a/content/migrations/0006_auto_20180309_1257.py b/content/migrations/0006_auto_20180309_1257.py new file mode 100644 index 0000000..0c0febb --- /dev/null +++ b/content/migrations/0006_auto_20180309_1257.py @@ -0,0 +1,19 @@ +# Generated by Django 2.0.1 on 2018-03-09 11:57 + +import content.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0005_auto_20180309_1255'), + ] + + operations = [ + migrations.AlterField( + model_name='content', + name='file', + field=models.FileField(upload_to=content.models.get_upload_to, verbose_name='Fichier'), + ), + ] diff --git a/content/migrations/0007_auto_20180309_1315.py b/content/migrations/0007_auto_20180309_1315.py new file mode 100644 index 0000000..d006455 --- /dev/null +++ b/content/migrations/0007_auto_20180309_1315.py @@ -0,0 +1,25 @@ +# Generated by Django 2.0.1 on 2018-03-09 12:15 + +import content.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0006_auto_20180309_1257'), + ] + + operations = [ + migrations.AlterField( + model_name='content', + name='file', + field=models.FileField(upload_to=content.models.get_upload_to, validators=[content.models.validate_file_extension], verbose_name='Fichier'), + ), + migrations.AlterField( + model_name='content', + name='school_owner', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.School'), + ), + ] diff --git a/content/models.py b/content/models.py index 256b91f..aa8c90b 100644 --- a/content/models.py +++ b/content/models.py @@ -35,14 +35,16 @@ class Category(models.Model): def get_upload_to(instance, filename): extension = filename.split('.')[-1] - return "static/media/"+instance.school.name+"/"+instance.category.name+'.'+extension + proper_school = ''.join(e for e in instance.school_owner.name if e.isalnum() and ord(e)<128) + proper_name = ''.join(e for e in instance.category.name if e.isalnum() and ord(e)<128) + return "static/media/"+proper_school+"/"+proper_name+'.'+extension def validate_file_extension(value): ext = os.path.splitext(value.name)[1] # [0] returns path+filename - valid_extensions = ['mp4', 'avi', 'mov'] + valid_extensions = ['.mp4', '.avi', '.mov'] if not ext.lower() in valid_extensions: - raise ValidationError(u'Unsupported file extension.') + raise ValidationError(u'Format non supporté : {}'.format(ext)) class Content(models.Model): diff --git a/content/urls.py b/content/urls.py index 2ae991c..f301203 100644 --- a/content/urls.py +++ b/content/urls.py @@ -1,5 +1,7 @@ from django.urls import path +from . import views + from .views import ( CreateCategory, ViewCategory, @@ -33,8 +35,8 @@ urlpatterns = [ name='category-edit', ), path( - 'new', - CreateContent.as_view(), + 'new/', + views.create_content, name='content-new', ), path( diff --git a/content/views.py b/content/views.py index 6cee7dd..cb243a4 100644 --- a/content/views.py +++ b/content/views.py @@ -1,10 +1,13 @@ from django.views import generic from django.urls import reverse, reverse_lazy -from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import get_object_or_404, redirect, render from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin +from django.contrib.admin.views.decorators import staff_member_required from django.contrib import messages from .models import Content, Category +from users.models import School +from . import forms from settings.models import SiteSettings @@ -121,3 +124,28 @@ class EditContent(PermissionRequiredMixin, generic.UpdateView): messages.error(request, "Le téléversement de contenu n'est pas autorisé actuellement.") return redirect(reverse("home")) return super().dispatch(request, *args, **kwargs) + + +def create_content(request, school_pk): + settings,_ = SiteSettings.objects.get_or_create() + if not settings.allow_upload : + messages.error(request, "Le téléversement de contenu n'est pas autorisé actuellement.") + return redirect(reverse("home")) + school = get_object_or_404(School, pk=school_pk) + can = request.user.is_staff or request.user == school.admin + if not can: + messages.error(request, 'Vous ne pouvez pas accéder à cette page') + return redirect(reverse('home')) + + content_form = forms.CreateContent(school, request.POST or None, request.FILES or None) + content_form.instance.school_owner = school + + if content_form.is_valid(): + content_form.save() + messages.success(request, "Contenu ajouté.") + return redirect(school.get_absolute_url()) + return render(request, 'edit.html', { + 'form' : content_form, + 'title' : 'Ajout de contenu', + 'validate' : 'Ajouter' + }) diff --git a/users/templates/users/school.html b/users/templates/users/school.html index c1ea193..7c58b22 100644 --- a/users/templates/users/school.html +++ b/users/templates/users/school.html @@ -147,7 +147,7 @@ Inscription validée

Contenus

- + Ajouter un contenu