From 703c217ec2f4fa47836f565b608b43edc62a4f91 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Wed, 6 Feb 2019 17:02:09 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20formulaire=20de=20commentaire=20=C3=A9l?= =?UTF-8?q?=C3=A8ve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/urls.py | 1 + stages/admin.py | 3 +- stages/forms.py | 24 +++++++++- stages/migrations/0018_student_comments.py | 25 ++++++++++ stages/models.py | 11 +++++ stages/views/__init__.py | 16 ++++++- templates/class.html | 2 +- templates/student_comment.html | 56 ++++++++++++++++++++++ 8 files changed, 133 insertions(+), 5 deletions(-) create mode 100644 stages/migrations/0018_student_comments.py create mode 100644 templates/student_comment.html diff --git a/common/urls.py b/common/urls.py index 9e76748..3d0fc95 100644 --- a/common/urls.py +++ b/common/urls.py @@ -32,6 +32,7 @@ urlpatterns = [ path('classes//import_reports/', views.ImportReportsView.as_view(), name='import-reports'), path('classes/print_klass_list/', views.PrintKlassList.as_view(), name='print-klass-list'), + path('student//comment/', views.StudentCommentView.as_view(), name='student-comment'), path('candidate//send_convocation/', candidats_views.ConvocationView.as_view(), name='candidate-convocation'), diff --git a/stages/admin.py b/stages/admin.py index c788474..4c0ecce 100644 --- a/stages/admin.py +++ b/stages/admin.py @@ -8,7 +8,7 @@ from django.urls import reverse from django.utils.html import format_html from .models import ( - Teacher, Option, Student, Section, Level, Klass, Corporation, + Teacher, Option, Student, StudentFile, Section, Level, Klass, Corporation, CorpContact, Domain, Period, Availability, Training, Course, LogBookReason, LogBook, ExamEDESession, SupervisionBill ) @@ -329,6 +329,7 @@ admin.site.register(Level) admin.site.register(Klass, KlassAdmin) admin.site.register(Option) admin.site.register(Student, StudentAdmin) +admin.site.register(StudentFile) admin.site.register(Teacher, TeacherAdmin) admin.site.register(Course, CourseAdmin) admin.site.register(Corporation, CorporationAdmin) diff --git a/stages/forms.py b/stages/forms.py index f68375a..60d74a8 100644 --- a/stages/forms.py +++ b/stages/forms.py @@ -2,11 +2,12 @@ from django import forms from django.contrib.admin.widgets import AutocompleteSelect from django.db import transaction from django.db.models.deletion import Collector +from django.forms import inlineformset_factory from django.urls import reverse from tabimport import FileFactory, UnsupportedFileFormat -from .models import Corporation, Section, Period +from .models import Corporation, Period, Section, Student, StudentFile class StudentImportForm(forms.Form): @@ -113,3 +114,24 @@ class CorporationMergeForm(forms.Form): ).update(corporation=self.cleaned_data['corp_merge_to']) check_no_links(self.cleaned_data['corp_merge_from']) self.cleaned_data['corp_merge_from'].delete() + + +class StudentCommentForm(forms.ModelForm): + class Meta: + model = Student + fields = ('mc_comment',) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + FilesFormSet = inlineformset_factory(self._meta.model, StudentFile, fields='__all__', extra=1) + self.files_fset = FilesFormSet( + instance=self.instance, data=kwargs.get('data'), files=kwargs.get('files') + ) + + def is_valid(self): + return all([super().is_valid(), self.files_fset.is_valid()]) + + def save(self, **kwargs): + obj = super().save(**kwargs) + self.files_fset.save() + return obj diff --git a/stages/migrations/0018_student_comments.py b/stages/migrations/0018_student_comments.py new file mode 100644 index 0000000..abd191b --- /dev/null +++ b/stages/migrations/0018_student_comments.py @@ -0,0 +1,25 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('stages', '0017_add_login_field_for_student'), + ] + + operations = [ + migrations.CreateModel( + name='StudentFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('student', models.ForeignKey(on_delete=models.deletion.CASCADE, to='stages.Student')), + ('fichier', models.FileField(upload_to='etudiants')), + ('titre', models.CharField(max_length=200, verbose_name='Titre')), + ], + ), + migrations.AddField( + model_name='student', + name='mc_comment', + field=models.TextField(blank=True, verbose_name='Commentaires'), + ), + ] diff --git a/stages/models.py b/stages/models.py index 47b2a12..0668b46 100644 --- a/stages/models.py +++ b/stages/models.py @@ -307,6 +307,8 @@ class Student(models.Model): date_soutenance_mailed = models.DateTimeField("Convoc. env.", blank=True, null=True) date_confirm_received = models.DateTimeField("Récept. confirm", blank=True, null=True) # ============== Fields for examination ====================== + mc_comment = models.TextField("Commentaires", blank=True) + support_tabimport = True class Meta: @@ -369,6 +371,15 @@ class Student(models.Model): return missing +class StudentFile(models.Model): + student = models.ForeignKey(Student, on_delete=models.CASCADE) + fichier = models.FileField(upload_to='etudiants') + titre = models.CharField("Titre", max_length=200) + + def __str__(self): + return self.title + + class Corporation(models.Model): ext_id = models.IntegerField(null=True, blank=True, verbose_name='ID externe') name = models.CharField(max_length=100, verbose_name='Nom') diff --git a/stages/views/__init__.py b/stages/views/__init__.py index 88f71b7..efc9310 100644 --- a/stages/views/__init__.py +++ b/stages/views/__init__.py @@ -14,12 +14,12 @@ from django.urls import reverse, reverse_lazy from django.utils import timezone from django.utils.dateformat import format as django_format from django.utils.text import slugify -from django.views.generic import DetailView, FormView, TemplateView, ListView +from django.views.generic import DetailView, FormView, ListView, TemplateView, UpdateView from .base import EmailConfirmationBaseView, ZippedFilesBaseView from .export import OpenXMLExport from .imports import HPContactsImportView, HPImportView, ImportReportsView, StudentImportView -from ..forms import CorporationMergeForm, EmailBaseForm +from ..forms import CorporationMergeForm, EmailBaseForm, StudentCommentForm from ..models import ( Klass, Section, Student, Teacher, Corporation, CorpContact, Period, Training, Availability @@ -149,6 +149,18 @@ class KlassView(DetailView): return export.get_http_response('%s_export' % self.object.name.replace(' ', '_')) +class StudentCommentView(UpdateView): + template_name = 'student_comment.html' + model = Student + form_class = StudentCommentForm + + def get_success_url(self): + messages.success( + self.request, "L'enregistrement des commentaires pour %s a réussi." % self.object + ) + return reverse('class', args=[self.object.klass.pk]) + + class AttributionView(TemplateView): """ Base view for the attribution screen. Populate sections and referents. diff --git a/templates/class.html b/templates/class.html index 66fc129..dbc7e79 100644 --- a/templates/class.html +++ b/templates/class.html @@ -25,7 +25,7 @@ {% for student in students %} - {{ student }} + {{ student }} {{ student.birth_date }} {% if show_option_ase %} {{ student.option_ase|default_if_none:'-' }} diff --git a/templates/student_comment.html b/templates/student_comment.html new file mode 100644 index 0000000..485bc1f --- /dev/null +++ b/templates/student_comment.html @@ -0,0 +1,56 @@ +{% extends "admin/base_site.html" %} +{% load static %} + +{% block extrastyle %}{{ block.super }} + +{% endblock %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} +

{{ student }} +{% if perms.stages.change_student %} {% endif %} +

+ +
+ + + +
Date de naissance :{{ student.birth_date }}
Adresse :{{ student.street }}, {{ student.pcode }} {{ student.city }} {{ student.district }}
+
+
+ + + + +
Courriel :{{ student.email }}
Tél :{{ student.tel }}
Portable :{{ student.mobile }}
+
+{% if student.option_ase %} +
Orientation : {{ student.option_ase }}
+{% endif %} + +
{% csrf_token %} + {{ form.as_p }} + + {{ form.files_fset.management_form }} + {% for frm in form.files_fset %} +
{{ frm.as_p }}
+ {% endfor %} + +
+ +{% endblock %}