Add intranet app
This commit is contained in:
parent
c96bd0d0db
commit
9773957baf
11 changed files with 167 additions and 1 deletions
|
|
@ -24,6 +24,7 @@ INSTALLED_APPS = [
|
|||
'django.contrib.staticfiles',
|
||||
'tinymce',
|
||||
'cms',
|
||||
'intranet',
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
0
intranet/__init__.py
Normal file
25
intranet/admin.py
Normal file
25
intranet/admin.py
Normal 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)
|
||||
27
intranet/migrations/0001_Add_Intranet_app.py
Normal file
27
intranet/migrations/0001_Add_Intranet_app.py
Normal 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',
|
||||
},
|
||||
),
|
||||
]
|
||||
0
intranet/migrations/__init__.py
Normal file
0
intranet/migrations/__init__.py
Normal file
33
intranet/models.py
Normal file
33
intranet/models.py
Normal 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
7
intranet/urls.py
Normal 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
33
intranet/views.py
Normal 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()
|
||||
|
|
@ -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>
|
||||
<a href="{% url 'intranet-list' %}">Documents de cours (connexion requise)</a>
|
||||
</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
|||
33
templates/intranet/list.html
Normal file
33
templates/intranet/list.html
Normal 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 %}
|
||||
Loading…
Add table
Add a link
Reference in a new issue