diff --git a/common/settings.py b/common/settings.py index 6a672b0..a121030 100644 --- a/common/settings.py +++ b/common/settings.py @@ -24,6 +24,7 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'tinymce', 'cms', + 'intranet', ] diff --git a/common/urls.py b/common/urls.py index 99208da..373a7d4 100644 --- a/common/urls.py +++ b/common/urls.py @@ -32,9 +32,13 @@ urlpatterns = [ path('upload/', views.UploadDocListView.as_view(), name='uploaddoc-list'), path('concept//', views.ConceptDetailView.as_view(), name='concept-detail'), path('tinymce/', include('tinymce.urls'), name='tinymce-js'), + path('intranet/', include('intranet.urls'), name='intranet'), # Serve docs by Django to allow LoginRequiredMiddleware to apply path('media/doc/', serve, {'document_root': os.path.join(settings.MEDIA_ROOT, 'doc'), 'show_indexes': False} ), + path('media/intranet/', serve, + {'document_root': os.path.join(settings.MEDIA_ROOT, 'intranet'), 'show_indexes': False} + ), ] diff --git a/intranet/__init__.py b/intranet/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/intranet/admin.py b/intranet/admin.py new file mode 100644 index 0000000..da16f51 --- /dev/null +++ b/intranet/admin.py @@ -0,0 +1,25 @@ +import os + +from django.conf import settings +from django.contrib import admin + +from intranet.models import IntranetDoc + + +@admin.register(IntranetDoc) +class IntranetDocAdmin(admin.ModelAdmin): + list_display = ('__str__', 'module', 'authorization') + + def save_model(self, request, obj, form, change): + searched_file = 'intranet/{0}'.format(form.cleaned_data['doc']) + try: + doc = IntranetDoc.objects.get(doc=searched_file) + form.save() + # Override previous file + filename = os.path.join(settings.MEDIA_ROOT, searched_file) + file = request.FILES['doc'] + with open(filename, 'wb+') as destination: + for chunk in file.chunks(): + destination.write(chunk) + except IntranetDoc.DoesNotExist: + super().save_model(request, obj, form, change) diff --git a/intranet/migrations/0001_Add_Intranet_app.py b/intranet/migrations/0001_Add_Intranet_app.py new file mode 100644 index 0000000..d8667f9 --- /dev/null +++ b/intranet/migrations/0001_Add_Intranet_app.py @@ -0,0 +1,27 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('cms', '0009_drop_unneeded_defaults'), + ] + + operations = [ + migrations.CreateModel( + name='IntranetDoc', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('doc', models.FileField(unique=True, upload_to='intranet')), + ('published', models.BooleanField(default=True)), + ('authorization', models.SmallIntegerField(choices=[(3, 'admin'), (2, 'prof'), (1, 'étudiant'), (0, 'aucun')], default=0, verbose_name='autorisation')), + ('module', models.ForeignKey(on_delete=models.deletion.PROTECT, to='cms.Module')), + ], + options={ + 'verbose_name': 'Document Intranet', + 'verbose_name_plural': 'Documents Intranet', + }, + ), + ] diff --git a/intranet/migrations/__init__.py b/intranet/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/intranet/models.py b/intranet/models.py new file mode 100644 index 0000000..7a98e84 --- /dev/null +++ b/intranet/models.py @@ -0,0 +1,33 @@ +from django.contrib.auth.models import User +from django.db import models +from django.db.models.signals import pre_delete +from django.dispatch import receiver + +from cms.models import Module + + +class IntranetDoc(models.Model): + AUTHORIZATION_CHOICES = { + (0, 'aucun'), + (1, 'étudiant'), + (2, 'prof'), + (3, 'admin') + } + + doc = models.FileField(upload_to='intranet', unique=True) + module = models.ForeignKey(Module, null=False, on_delete=models.PROTECT) + published = models.BooleanField(default=True) + authorization = models.SmallIntegerField("autorisation", choices=AUTHORIZATION_CHOICES, default=0) + + class Meta: + verbose_name = 'Document Intranet' + verbose_name_plural = 'Documents Intranet' + + def __str__(self): + return self.doc.name + + +@receiver(pre_delete, sender=IntranetDoc) +def remove_file(**kwargs): + instance = kwargs.get('instance') + instance.doc.delete(save=False) diff --git a/intranet/urls.py b/intranet/urls.py new file mode 100644 index 0000000..a4f6d8f --- /dev/null +++ b/intranet/urls.py @@ -0,0 +1,7 @@ +from django.urls import path +from intranet import views + + +urlpatterns = [ + path('list/', views.IntranetListView.as_view(), name='intranet-list'), +] diff --git a/intranet/views.py b/intranet/views.py new file mode 100644 index 0000000..1bd6525 --- /dev/null +++ b/intranet/views.py @@ -0,0 +1,33 @@ +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import ListView + +from cms.models import Module +from intranet.models import IntranetDoc + + +class IntranetListView(LoginRequiredMixin, ListView): + model = IntranetDoc + template_name = 'intranet/list.html' + login_url = '/login/' + + def get_queryset(self): + groups = self.request.user.groups.values_list('name',flat=True) + qs = IntranetDoc.objects.filter(published=True) + if self.request.user.is_superuser: + qs = qs.filter(authorization__in=[1,2,3]) + if 'prof' in groups: + qs = qs.filter(authorization__in=[1,2]) + if 'Student_1_year' in groups or 'Student_2_year' in groups or 'Student_3_year' in groups: + modules = Module.objects.all().order_by('code') + modules_selected = [] + student_access = { + 'Student_1_year': [m for m in modules if m.sem1 > 0 or m.sem2 > 0], + 'Student_2_year': [m for m in modules if m.sem3 > 0 or m.sem4 > 0], + 'Student_3_year': [m for m in modules if m.sem5 > 0 or m.sem6 > 0], + } + for group in groups: + for mod in student_access[group]: + modules_selected.append(mod.code) + qs = qs.filter(module__code__in=modules_selected, authorization=1) + else: + return qs.none() diff --git a/templates/cms/module_detail.html b/templates/cms/module_detail.html index 33304f1..1b11f3f 100644 --- a/templates/cms/module_detail.html +++ b/templates/cms/module_detail.html @@ -85,7 +85,10 @@ {{ object.processus.domaine.responsable.descr|safe }} -

Imprimer en PDF

+

+ Imprimer en PDF +     Documents de cours (connexion requise) +

{% endblock %} diff --git a/templates/intranet/list.html b/templates/intranet/list.html new file mode 100644 index 0000000..3b45da7 --- /dev/null +++ b/templates/intranet/list.html @@ -0,0 +1,33 @@ +{% extends "cms/base_site.html" %} +{% load i18n static %} + +{% block extrastyle %} +{{ block.super }} + +{% endblock %} + +{% block content %} +
+

Documents de cours

+ {% regroup object_list by module as module_list %} + + {% if user.is_staff %} +
+

Gestion des documents

+ {% endif %} +
+{% endblock %}