Add intranet app

This commit is contained in:
Claude Paroz 2018-08-16 10:50:00 +02:00
parent c96bd0d0db
commit 9773957baf
11 changed files with 167 additions and 1 deletions

View file

@ -24,6 +24,7 @@ INSTALLED_APPS = [
'django.contrib.staticfiles',
'tinymce',
'cms',
'intranet',
]

View file

@ -32,9 +32,13 @@ urlpatterns = [
path('upload/', views.UploadDocListView.as_view(), name='uploaddoc-list'),
path('concept/<int:pk>/', 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/<path:path>', serve,
{'document_root': os.path.join(settings.MEDIA_ROOT, 'doc'), 'show_indexes': False}
),
path('media/intranet/<path:path>', serve,
{'document_root': os.path.join(settings.MEDIA_ROOT, 'intranet'), 'show_indexes': False}
),
]

0
intranet/__init__.py Normal file
View file

25
intranet/admin.py Normal file
View file

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

View file

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

View file

33
intranet/models.py Normal file
View file

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

7
intranet/urls.py Normal file
View file

@ -0,0 +1,7 @@
from django.urls import path
from intranet import views
urlpatterns = [
path('list/', views.IntranetListView.as_view(), name='intranet-list'),
]

33
intranet/views.py Normal file
View file

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

View file

@ -85,7 +85,10 @@
<td>{{ object.processus.domaine.responsable.descr|safe }}</td>
</tr>
</table>
<p><a href="{% url 'module-pdf' object.id %}">Imprimer en PDF</a></p>
<p>
<a href="{% url 'module-pdf' object.id %}">Imprimer en PDF</a>
&nbsp;&nbsp; &nbsp;<a href="{% url 'intranet-list' %}">Documents de cours (connexion requise)</a>
</p>
</div>
{% endblock %}

View file

@ -0,0 +1,33 @@
{% extends "cms/base_site.html" %}
{% load i18n static %}
{% block extrastyle %}
{{ block.super }}
<style type="text/css">
ul li {float: none;}
</style>
{% endblock %}
{% block content %}
<div id="content-main">
<h1>Documents de cours</h1>
{% regroup object_list by module as module_list %}
<ul>
{% for module in module_list %}
<li><h3>{{ module.grouper }}</h3>
<ol>
{% for doc in module.list %}
<li><a href="{{ doc.doc.url }}">{{ doc.doc.name }} ({{ doc.get_authorization_display }})</a></li>
{% endfor %}
</ol>
</li>
{% empty %}
<p><i>Désolé, aucun document disponible pour le moment.</i></p>
{% endfor %}
</ul>
{% if user.is_staff %}
<hr>
<p><a href="{% url 'admin:intranet_intranetdoc_changelist' %}">Gestion des documents</a></p>
{% endif %}
</div>
{% endblock %}