Upload de contenus

This commit is contained in:
Hugo LEVY-FALK 2018-03-09 13:18:03 +01:00
parent c606570a99
commit 821a337582
10 changed files with 159 additions and 7 deletions

20
content/forms.py Normal file
View file

@ -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)

View file

@ -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'),
),
]

View file

@ -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'),
),
]

View file

@ -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'),
),
]

View file

@ -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'),
),
]

View file

@ -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'),
),
]

View file

@ -35,14 +35,16 @@ class Category(models.Model):
def get_upload_to(instance, filename): def get_upload_to(instance, filename):
extension = filename.split('.')[-1] 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): def validate_file_extension(value):
ext = os.path.splitext(value.name)[1] # [0] returns path+filename 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: 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): class Content(models.Model):

View file

@ -1,5 +1,7 @@
from django.urls import path from django.urls import path
from . import views
from .views import ( from .views import (
CreateCategory, CreateCategory,
ViewCategory, ViewCategory,
@ -33,8 +35,8 @@ urlpatterns = [
name='category-edit', name='category-edit',
), ),
path( path(
'new', 'new/<int:school_pk>',
CreateContent.as_view(), views.create_content,
name='content-new', name='content-new',
), ),
path( path(

View file

@ -1,10 +1,13 @@
from django.views import generic from django.views import generic
from django.urls import reverse, reverse_lazy 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.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib import messages from django.contrib import messages
from .models import Content, Category from .models import Content, Category
from users.models import School
from . import forms
from settings.models import SiteSettings 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.") messages.error(request, "Le téléversement de contenu n'est pas autorisé actuellement.")
return redirect(reverse("home")) return redirect(reverse("home"))
return super().dispatch(request, *args, **kwargs) 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'
})

View file

@ -147,7 +147,7 @@ Inscription validée
</a> </a>
<h2>Contenus</h2> <h2>Contenus</h2>
<a class="btn btn-success btn-sm" href="{% url 'content:content-new' %}"> <a class="btn btn-success btn-sm" href="{% url 'content:content-new' school.pk %}">
<i class="fa fa-plus"></i> <i class="fa fa-plus"></i>
Ajouter un contenu Ajouter un contenu
</a> </a>