diff --git a/studenteval/admin.py b/studenteval/admin.py index 57a2faf..9211148 100644 --- a/studenteval/admin.py +++ b/studenteval/admin.py @@ -3,24 +3,43 @@ from studenteval.models import cl_Student_eval from django.urls import reverse from django.utils.html import format_html from . import views +from rangefilter.filters import * +from django.core.exceptions import PermissionDenied - +def is_member(user, group): + return user.groups.filter(name=group).exists() class _cl_Student_eval_admin(admin.ModelAdmin): + request = None + + list_display = ('ID','action_buttons','sStudent', "get_ref_of_eval", "nEval_Type", "nEval_Mode", "sAuthor", 'get_mirrored') - list_display = ('ID','sStudent', "get_ref_of_eval", "nEval_Type", "nEval_Mode", "sAuthor", 'get_mirrored', 'action_buttons') def action_buttons(self, obj): - action1_url = '/student_eval/show_pdf/{}/'.format(obj.uuid) + action1_url = f"/student_eval/show_pdf/{obj.uuid}/?dtDate__range__gte={self.request.GET.get('dtDate__range__gte')}&dtDate__range__lte={self.request.GET.get('dtDate__range__lte')}" return format_html('Voir PDF', action1_url) action_buttons.short_description = 'Voir la fiche PDF' + def get_queryset(self, request): + self.request = request + return super(_cl_Student_eval_admin, self).get_queryset(request) + search_fields = ['sStudent', 'sRef'] - list_filter = ['sStudent',"sAuthor", "nEval_Type", "nEval_Mode"] + list_filter = ['sStudent',"sAuthor", "nEval_Type", "nEval_Mode", ('dtDate', DateRangeFilter)] + + def get_form(self, request, obj=None, **kwargs): + user_obj = request.user + author_id = obj.Author.id if obj.Author is not None else 0 + student_id = obj.Student.id if obj.Student is not None else 0 + + if not user_obj.id == author_id and not user_obj.id == student_id and not is_member(user_obj, "FI-Encadrants"): + raise PermissionDenied + return super().get_form(request, obj, **kwargs) + #fields = ["Vehicle", "nType",'sTitle', "sDesc","dtStart", "dtEnd", "Author"] diff --git a/studenteval/filters.py b/studenteval/filters.py new file mode 100644 index 0000000..d21a0a1 --- /dev/null +++ b/studenteval/filters.py @@ -0,0 +1,10 @@ +import django_filters +from studenteval.models import cl_Student_eval + +class cl_Student_eval_Filter(django_filters.FilterSet): + + class Meta: + model = cl_Student_eval + fields = { + 'Student' : ['exact'] + } diff --git a/studenteval/migrations/0001_initial.py b/studenteval/migrations/0001_initial.py new file mode 100644 index 0000000..0eac285 --- /dev/null +++ b/studenteval/migrations/0001_initial.py @@ -0,0 +1,48 @@ +# Generated by Django 4.0 on 2023-08-11 17:22 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='cl_Student_eval', + fields=[ + ('uuid', models.UUIDField(default=uuid.UUID('619562fd-9ca4-45be-8504-c136ddc0864f'), editable=False, primary_key=True, serialize=False)), + ('sAuthor', models.CharField(max_length=120, verbose_name='Auteur')), + ('sAuthor_2e', models.CharField(max_length=120, verbose_name='Second auteur')), + ('sStudent', models.CharField(max_length=120, verbose_name="Nom de l'étudiant/stagiaire")), + ('nEval_Type', models.CharField(choices=[('1', 'Intervention'), ('2', 'Journée')], default=1, max_length=1, verbose_name='Type de suivi')), + ('dtDate', models.DateField(default=django.utils.timezone.now, verbose_name='Date')), + ('sRef', models.CharField(max_length=120, verbose_name='N° de référence / FIP')), + ('nEval_Mode', models.CharField(choices=[('1', 'Auto-évaluation'), ('2', 'Ecadrant')], default=1, max_length=1, verbose_name='Mode de suivi ')), + ('sDesc_neg', models.TextField(verbose_name='Points à améliorer')), + ('sDesc_pos', models.TextField(verbose_name='Points positifs')), + ('sDesc_global', models.TextField(verbose_name="Avis global sur l'intervention/journée/exercice")), + ('nInter_Nature', models.CharField(choices=[('1', 'Trauma'), ('2', 'non-Trauma')], default=1, max_length=1, verbose_name='Nature')), + ('nInter_Priority', models.CharField(choices=[('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'S1'), ('5', 'S2'), ('6', 'S3'), ('7', 'Exercice')], default=1, max_length=1, verbose_name='Priorité')), + ('nInter_Complexity', models.CharField(choices=[('1', 'Stable / Simple'), ('2', 'Stable / Complexe'), ('3', 'Instable / Simple'), ('4', 'Instable / Complexe')], default=1, max_length=1, verbose_name='Nature de complexité')), + ('sInter_Desc', models.TextField(verbose_name='Description courte')), + ('nStudent_Roles', models.CharField(choices=[('1', 'Leader'), ('2', 'Équipier'), ('3', '3e position (observateur')], default=1, max_length=1, verbose_name="Rôle de l'étudiant/stagiaire")), + ('dtUpdated', models.DateTimeField(auto_now=True, verbose_name='date updated')), + ('dtCreated', models.DateTimeField(auto_now_add=True, verbose_name='date published')), + ('Author', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eval_author', to='auth.user', verbose_name='Auteur')), + ('Author_2e', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eval_second_author', to='auth.user', verbose_name='Second auteur')), + ('Student', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='auth.user', verbose_name='Nom du stagiaire/étudaint')), + ], + options={ + 'verbose_name': 'Suivi étudiants - stagiaires', + 'verbose_name_plural': 'Suivis étudiants - stagiaires', + }, + ), + ] diff --git a/studenteval/migrations/0002_alter_cl_student_eval_uuid.py b/studenteval/migrations/0002_alter_cl_student_eval_uuid.py new file mode 100644 index 0000000..745a329 --- /dev/null +++ b/studenteval/migrations/0002_alter_cl_student_eval_uuid.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2023-08-11 17:27 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('studenteval', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='cl_student_eval', + name='uuid', + field=models.UUIDField(default=uuid.UUID('0ec70ee4-a015-42ea-aa8b-cf385010d233'), editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/studenteval/migrations/0003_alter_cl_student_eval_author_2e_and_more.py b/studenteval/migrations/0003_alter_cl_student_eval_author_2e_and_more.py new file mode 100644 index 0000000..0d12e36 --- /dev/null +++ b/studenteval/migrations/0003_alter_cl_student_eval_author_2e_and_more.py @@ -0,0 +1,31 @@ +# Generated by Django 4.0 on 2023-08-11 17:51 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('studenteval', '0002_alter_cl_student_eval_uuid'), + ] + + operations = [ + migrations.AlterField( + model_name='cl_student_eval', + name='Author_2e', + field=models.ForeignKey(limit_choices_to={'groups__name': 'FI-Encadrants'}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eval_second_author', to='auth.user', verbose_name='Second auteur'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='Student', + field=models.ForeignKey(limit_choices_to={'groups__name': 'FI-Étudiants'}, null=True, on_delete=django.db.models.deletion.SET_NULL, to='auth.user', verbose_name='Nom du stagiaire/étudaint'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='uuid', + field=models.UUIDField(default=uuid.UUID('aade911f-b849-4235-be64-85ed63673322'), editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/studenteval/migrations/0004_remove_cl_student_eval_nstudent_roles_and_more.py b/studenteval/migrations/0004_remove_cl_student_eval_nstudent_roles_and_more.py new file mode 100644 index 0000000..0f83e46 --- /dev/null +++ b/studenteval/migrations/0004_remove_cl_student_eval_nstudent_roles_and_more.py @@ -0,0 +1,39 @@ +# Generated by Django 4.0 on 2023-08-11 18:08 + +from django.db import migrations, models +import django.utils.timezone +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('studenteval', '0003_alter_cl_student_eval_author_2e_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='cl_student_eval', + name='nStudent_Roles', + ), + migrations.AddField( + model_name='cl_student_eval', + name='nStudent_Role', + field=models.CharField(choices=[('1', 'Leader'), ('2', 'Équipier'), ('3', '3e position (observateur)')], default=1, max_length=1, verbose_name="Rôle de l'étudiant/stagiaire"), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='dtDate', + field=models.DateField(default=django.utils.timezone.now, verbose_name='Date concernée'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='nEval_Mode', + field=models.CharField(choices=[('1', 'Auto-évaluation'), ('2', 'Encadrant')], default=1, max_length=1, verbose_name='Mode de suivi '), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='uuid', + field=models.UUIDField(default=uuid.UUID('01f714cc-4405-420e-996c-5d3a0df76250'), editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/studenteval/migrations/0005_alter_cl_student_eval_author_2e_and_more.py b/studenteval/migrations/0005_alter_cl_student_eval_author_2e_and_more.py new file mode 100644 index 0000000..0fb911c --- /dev/null +++ b/studenteval/migrations/0005_alter_cl_student_eval_author_2e_and_more.py @@ -0,0 +1,61 @@ +# Generated by Django 4.0 on 2023-08-11 18:14 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('studenteval', '0004_remove_cl_student_eval_nstudent_roles_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='cl_student_eval', + name='Author_2e', + field=models.ForeignKey(blank=True, limit_choices_to={'groups__name': 'FI-Encadrants'}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='eval_second_author', to='auth.user', verbose_name='Second auteur'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='nEval_Type', + field=models.CharField(choices=[('1', 'Intervention/Exercice'), ('2', 'Journée')], default=1, max_length=1, verbose_name='Type de suivi'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='nInter_Complexity', + field=models.CharField(blank=True, choices=[('1', 'Stable / Simple'), ('2', 'Stable / Complexe'), ('3', 'Instable / Simple'), ('4', 'Instable / Complexe')], default=1, max_length=1, verbose_name='Nature de complexité'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='nInter_Nature', + field=models.CharField(blank=True, choices=[('1', 'Trauma'), ('2', 'non-Trauma')], default=1, max_length=1, verbose_name='Nature'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='nInter_Priority', + field=models.CharField(blank=True, choices=[('1', 'P1'), ('2', 'P2'), ('3', 'P3'), ('4', 'S1'), ('5', 'S2'), ('6', 'S3'), ('7', 'Exercice')], default=1, max_length=1, verbose_name='Priorité'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='nStudent_Role', + field=models.CharField(blank=True, choices=[('1', 'Leader'), ('2', 'Équipier'), ('3', '3e position (observateur)')], default=1, max_length=1, verbose_name="Rôle de l'étudiant/stagiaire"), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='sAuthor_2e', + field=models.CharField(blank=True, max_length=120, verbose_name='Second auteur'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='sInter_Desc', + field=models.TextField(blank=True, verbose_name='Description courte'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='uuid', + field=models.UUIDField(default=uuid.UUID('090d4087-8142-46bd-9af6-9cf3a4530d60'), editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/studenteval/migrations/0006_alter_cl_student_eval_sref_and_more.py b/studenteval/migrations/0006_alter_cl_student_eval_sref_and_more.py new file mode 100644 index 0000000..498ca52 --- /dev/null +++ b/studenteval/migrations/0006_alter_cl_student_eval_sref_and_more.py @@ -0,0 +1,24 @@ +# Generated by Django 4.0 on 2023-08-11 18:19 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('studenteval', '0005_alter_cl_student_eval_author_2e_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='cl_student_eval', + name='sRef', + field=models.CharField(blank=True, max_length=120, verbose_name='N° de référence / FIP'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='uuid', + field=models.UUIDField(default=uuid.UUID('d284f62d-691a-4e36-a63a-0accebe949ee'), editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/studenteval/migrations/0007_cl_student_eval_id_alter_cl_student_eval_uuid.py b/studenteval/migrations/0007_cl_student_eval_id_alter_cl_student_eval_uuid.py new file mode 100644 index 0000000..31d4f7c --- /dev/null +++ b/studenteval/migrations/0007_cl_student_eval_id_alter_cl_student_eval_uuid.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0 on 2023-08-11 19:01 + +from django.db import migrations, models +import studenteval.models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('studenteval', '0006_alter_cl_student_eval_sref_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='cl_student_eval', + name='ID', + field=models.IntegerField(default=studenteval.models.increment_ID, editable=False, unique=True, verbose_name='ID du Suivi'), + ), + migrations.AlterField( + model_name='cl_student_eval', + name='uuid', + field=models.UUIDField(default=uuid.UUID('bb6f22e7-e78d-492f-a8ec-87a154482db1'), editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/studenteval/migrations/0008_alter_cl_student_eval_uuid.py b/studenteval/migrations/0008_alter_cl_student_eval_uuid.py new file mode 100644 index 0000000..b8e3ea2 --- /dev/null +++ b/studenteval/migrations/0008_alter_cl_student_eval_uuid.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0 on 2023-08-11 19:02 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('studenteval', '0007_cl_student_eval_id_alter_cl_student_eval_uuid'), + ] + + operations = [ + migrations.AlterField( + model_name='cl_student_eval', + name='uuid', + field=models.UUIDField(default=uuid.UUID('ba52e37d-25c3-44fa-bec8-2af3e6bd5458'), editable=False, primary_key=True, serialize=False), + ), + ] diff --git a/studenteval/models.py b/studenteval/models.py index 7dd6296..ed3eacb 100644 --- a/studenteval/models.py +++ b/studenteval/models.py @@ -143,6 +143,8 @@ class cl_Student_eval(models.Model): if sStudent is None: sStudent = self.sStudent + print(f"get_all_evals_for_student launched ! {sStudent}") + self.a_evals = [] evals = cl_Student_eval.objects.filter(sStudent=sStudent).order_by('sRef') for eval in evals: @@ -152,29 +154,42 @@ class cl_Student_eval(models.Model): #print(self.a_evals) return self.a_evals - @admin.display(description="Présence d'évaluation mirroir", boolean=True) + @admin.display(description="Mirroir ?", boolean=True) def get_mirrored(self): self.get_all_evals_for_student() self.get_mirror_eval(self.a_evals) return self.mirrored def get_eval_type(self): - return EVAL_TYPE[int(self.nEval_Type)-1][1] - - def get_inter_nature(self): - return INTER_NATURE[int(self.nInter_Nature)-1][1] + if isinstance(self.nEval_Type, int): + return EVAL_TYPE[int(self.nEval_Type) - 1][1] + return "Unknown" def get_inter_complexity(self): - return INTER_COMPLEXITY[int(self.nInter_Nature)-1][1] + if isinstance(self.nInter_Nature, int): + return INTER_COMPLEXITY[int(self.nInter_Nature) - 1][1] + return "Unknown" def get_inter_priority(self): - return INTER_PRIORITY[int(self.nInter_Priority)-1][1] + if isinstance(self.nInter_Priority, int): + return INTER_PRIORITY[int(self.nInter_Priority) - 1][1] + return "Unknown" def get_eval_mode(self): - return EVAL_MODE[int(self.nEval_Mode)-1][1] + if isinstance(self.nEval_Mode, int): + return EVAL_MODE[int(self.nEval_Mode) - 1][1] + return "Unknown" def get_student_role(self): - return STUDENT_ROLE[int(self.nStudent_Role)-1][1] + if isinstance(self.nStudent_Role, int): + return STUDENT_ROLE[int(self.nStudent_Role) - 1][1] + return "Unknown" + + def get_inter_nature(self): + if isinstance(self.nInter_Nature,int): + return INTER_NATURE[int(self.nInter_Nature)-1][1] + return "Uncknow" + @@ -212,6 +227,9 @@ def import_data_csv(): value = line[key] if key == "dtDate": value = datetime.strptime(value, "%d.%m.%Y").date() + elif key == "sStudent": + temp_obj = cl_Student_eval( + setattr(new_eval, key,value) new_eval.save() diff --git a/studenteval/templates/base.html b/studenteval/templates/base.html new file mode 100644 index 0000000..76aecbe --- /dev/null +++ b/studenteval/templates/base.html @@ -0,0 +1,51 @@ +{% load static %} + + + + + + + + + + + + + + + Intranet StudentEval + + +
+ + {% block content %} + {% endblock %} + + + {% block script %} + {% endblock %} +
+ + \ No newline at end of file diff --git a/studenteval/templates/studenteval/base_studenteval.html b/studenteval/templates/studenteval/base_studenteval.html new file mode 100644 index 0000000..bba7f29 --- /dev/null +++ b/studenteval/templates/studenteval/base_studenteval.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+ {% block cl_content %} + {% endblock %} +
+{% endblock %} \ No newline at end of file diff --git a/studenteval/templates/studenteval/cl_student_eval.html b/studenteval/templates/studenteval/cl_student_eval.html new file mode 100644 index 0000000..8f870ac --- /dev/null +++ b/studenteval/templates/studenteval/cl_student_eval.html @@ -0,0 +1,124 @@ +
+

{% block title %}Détails de l'évaluation ({{ object.ID }}) étudiant de {{ object.sStudent }}{% endblock %}

+
+
+ + + + + + + + + + + + + + + + + + + + {% if object.nEval_Type == "1" %} + + + + + + + + + + + + + + + + + + + + + + + + {% endif %} + + + +
Date de suivi{{ object.dtDate }}Date de d'écriture{{ object.dtCreated }}
Auteur{{ object.sAuthor }}Second auteur{{ object.sAuthor_2e }}
Type de suivi{{ object.get_eval_type }}
N° FIP{{ object.sRef }}Priorité{{ object.get_inter_priority }}
Description{{ object.sInter_Desc }}
Rôle de l'étudiant{{ object.get_student_role }}
Nature de l'intervention{{ object.get_inter_nature }}
Complexité de l'intervention{{ object.get_inter_complexity }}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Éléments positifs (auto-évaluation) + + Éléments positifs (Encadrant) +
+ {{object.o_Auto_eval.sDesc_pos}} + + {{object.o_Encadrant_eval.sDesc_pos}} +
+ Éléments à améliorer (auto-évaluation) + + Éléments améliorer (Encadrant) +
+ {{object.o_Auto_eval.sDesc_neg}} + + {{object.o_Encadrant_eval.sDesc_neg}} +
+
+ + +
+
+ + + + + + + + + + + + + + + + + +
Avis Global
{{ object.o_Encadrant_eval.sDesc_global }}
Avis Global (auto)
{{ object.o_Auto_eval.sDesc_global }}
+
+ + +
\ No newline at end of file diff --git a/studenteval/templates/studenteval/cl_student_eval_detail.html b/studenteval/templates/studenteval/cl_student_eval_detail.html index 458404d..4747fb8 100644 --- a/studenteval/templates/studenteval/cl_student_eval_detail.html +++ b/studenteval/templates/studenteval/cl_student_eval_detail.html @@ -1,137 +1,12 @@ +{% extends 'studenteval/base_studenteval.html' %} + +{% block url_nav %} +
  • + Voir toutes les évaluations +
  • +{% endblock %} +{% block cl_content %} + {% include 'studenteval/cl_student_eval.html' with object=object %} +{% endblock %} - - - - - - Détails de l'évaluation étudiant de {{ object.sStudent }} - - - -
    -

    {% block title %}Détails de l'évaluation ({{ object.ID }}) étudiant de {{ object.sStudent }}{% endblock %}

    -
    -
    - - - - - - - - - - - - - - - - - - - - {% if object.nEval_Type == "1" %} - - - - - - - - - - - - - - - - - - - - - - - - {% endif %} - - - -
    Date de suivi{{ object.dtDate }}Date de d'écriture{{ object.dtCreated }}
    Auteur{{ object.sAuthor }}Second auteur{{ object.sAuthor_2e }}
    Type de suivi{{ object.get_eval_type }}
    N° FIP{{ object.sRef }}Priorité{{ object.get_inter_priority }}
    Description{{ object.sInter_Desc }}
    Rôle de l'étudiant{{ object.get_student_role }}
    Nature de l'intervention{{ object.get_inter_nature }}
    Complexité de l'intervention{{ object.get_inter_complexity }}
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Éléments positifs (auto-évaluation) => {{object.o_Auto_eval.ID}} - - Éléments positifs (Encadrant) => {{object.o_Encadrant_eval.ID}} -
    - {{object.o_Auto_eval.sDesc_pos}} - - {{object.o_Encadrant_eval.sDesc_pos}} -
    - Éléments à améliorer (auto-évaluation) => {{object.o_Auto_eval.ID}} - - Éléments améliorer (Encadrant) => {{object.o_Encadrant_eval.ID}} -
    - {{object.o_Auto_eval.sDesc_neg}} - - {{object.o_Encadrant_eval.sDesc_neg}} -
    -
    - - -
    -
    - - - - - - - - - - - - - - - - - -
    Avis Global
    {{ object.o_Encadrant_eval.sDesc_global }}
    Avis Global (auto)
    {{ object.o_Auto_eval.sDesc_global }}
    -
    - - -
    - - diff --git a/studenteval/templates/studenteval/cl_student_eval_list.html b/studenteval/templates/studenteval/cl_student_eval_list.html new file mode 100644 index 0000000..75f09cb --- /dev/null +++ b/studenteval/templates/studenteval/cl_student_eval_list.html @@ -0,0 +1,19 @@ +{% extends 'studenteval/base_studenteval.html' %} + +{% block title %}Liste des évaluations{% endblock %} + +{% block cl_content %} +
    +
    + {% if object_list %} + {% for obj in object_list reversed %} + {% include 'studenteval/cl_student_eval.html' with object=obj %} + {% if not forloop.last %} +
    {% endif %} + {% endfor %} + {% else %} +

    There is no post.

    + {% endif %} +
    +
    +{% endblock %} \ No newline at end of file diff --git a/studenteval/urls.py b/studenteval/urls.py index c70c221..09d7658 100644 --- a/studenteval/urls.py +++ b/studenteval/urls.py @@ -9,6 +9,7 @@ app_name = "studenteval" urlpatterns = [ path('show_pdf//', views.student_eval_detail.as_view(), name='student_eval_detail'), + path('show_pdf_all//', views.student_eval_list.as_view(), name='student_eval_list'), #path('peremptions', views.view_peremptions, name='view_peremptions'), diff --git a/studenteval/views.py b/studenteval/views.py index a9e1763..0cc6ef2 100644 --- a/studenteval/views.py +++ b/studenteval/views.py @@ -1,20 +1,83 @@ -from django.http import HttpResponse +import requests +from django.contrib.auth.mixins import LoginRequiredMixin +from django.http import HttpResponse, Http404 from django.shortcuts import render from django.views.generic import ListView, UpdateView, DetailView, FormView, CreateView +from django.core.exceptions import PermissionDenied + from studenteval.models import cl_Student_eval +from studenteval.filters import cl_Student_eval_Filter def show_pdf(request, uuid): # Votre logique pour l'action 1 ici return HttpResponse("Action 1 a été effectuée pour l'objet avec l'ID : {}".format(uuid)) -class student_eval_detail(DetailView): +def is_member(user, group): + return user.groups.filter(name=group).exists() +class student_eval_detail(LoginRequiredMixin,DetailView): model =cl_Student_eval + login_url = "" + + def dispatch(self, request, *args, **kwargs): + user_obj = self.request.user + + author_id = self.get_object().Author.id if self.get_object().Author is not None else 0 + student_id = self.get_object().Student.id if self.get_object().Student is not None else 0 + + if not user_obj.id == author_id and not user_obj.id == student_id and not is_member(user_obj,"FI-Encadrants"): + raise PermissionDenied + + return super().dispatch(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) + context["dtDate__range__gte"] = self.request.GET.get('dtDate__range__gte') + context["dtDate__range__lte"] = self.request.GET.get('dtDate__range__lte') + self.object.get_all_evals_for_student() self.object.get_mirror_eval(self.object.a_evals) - return context \ No newline at end of file + + return context +class student_eval_list(LoginRequiredMixin,ListView): + model = cl_Student_eval + login_url = "" + + + + def get_queryset(self): + nStudent_id = self.kwargs['Student'] + return cl_Student_eval.objects.filter(Student=nStudent_id) + + + + def dispatch(self, request, *args, **kwargs): + user_obj = self.request.user + + #self.object_list.filter(Student=requests.GET['Student']) + + + ''' + author_id = self.get_object().Author.id if self.get_object().Author is not None else 0 + student_id = self.get_object().Student.id if self.get_object().Student is not None else 0 + + if not user_obj.id == author_id and not user_obj.id == student_id and not is_member(user_obj,"FI-Encadrants"): + raise PermissionDenied + ''' + + return super().dispatch(request, *args, **kwargs) + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context['my_objects'] =[] + + print(self.get_queryset()) + for object in self.get_queryset(): + object.get_all_evals_for_student() + object.get_mirror_eval(object.a_evals) + context['my_objects'].append(object) + + + return context diff --git a/venv/Lib/site-packages/jazzmin/static/jazzmin/js/main.js b/venv/Lib/site-packages/jazzmin/static/jazzmin/js/main.js index 0b4a54d..4140df0 100644 --- a/venv/Lib/site-packages/jazzmin/static/jazzmin/js/main.js +++ b/venv/Lib/site-packages/jazzmin/static/jazzmin/js/main.js @@ -38,10 +38,15 @@ $link.addClass('active'); } else if ($parent_link.length) { $parent_link.addClass('active'); - } - } + }; + const $a_active = $('a.nav-link.active'); + const $main_li_parent = $a_active.closest('li.nav-item.has-treeview'); + const $ul_child = $main_li_parent.children('ul'); + $ul_child.show(); + $main_li_parent.addClass('menu-is-opening menu-open'); + }; $(document).ready(function () { // Set active status on links @@ -56,8 +61,7 @@ const $changeListTable = $('#changelist .results table'); if ($changeListTable.length && !$changeListTable.hasClass('table table-striped')) { $changeListTable.addClass('table table-striped'); - } - + }; }); })(jQuery); diff --git a/venv/Lib/site-packages/jazzmin/templates/admin/login.html b/venv/Lib/site-packages/jazzmin/templates/admin/login.html index 8a07087..5c41ffc 100644 --- a/venv/Lib/site-packages/jazzmin/templates/admin/login.html +++ b/venv/Lib/site-packages/jazzmin/templates/admin/login.html @@ -1,135 +1,76 @@ -{% load i18n static jazzmin admin_urls %} -{% get_current_language as LANGUAGE_CODE %} -{% get_current_language_bidi as LANGUAGE_BIDI %} +{% extends "registration/base.html" %} + +{% load i18n jazzmin %} {% get_jazzmin_settings request as jazzmin_settings %} {% get_jazzmin_ui_tweaks as jazzmin_ui %} - - - - - - - - {% block title %}{{ title }} | {% trans 'Log in again' %}{% endblock %} - - - - - - - - - {% if jazzmin_ui.theme.name != 'default' %} - - {% endif %} - - {% if jazzmin_ui.dark_mode_theme %} - - {% endif %} - - - - - {% if jazzmin_settings.custom_css %} - - - {% endif %} - - - - - - - - - {% block extrastyle %} {% endblock %} - {% block extrahead %} {% endblock %} - - - -