From: Yoan Le Clanche Date: Mon, 24 Aug 2026 08:37:27 +0000 (+0200) Subject: Conferences can now have multiple professors X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=2d61c74d83c39d29d87fa2c9252355c408e9ece0;p=teleforma.git Conferences can now have multiple professors --- diff --git a/teleforma/admin.py b/teleforma/admin.py index 753fb6f0..189c609e 100644 --- a/teleforma/admin.py +++ b/teleforma/admin.py @@ -169,6 +169,7 @@ class MediaAdmin(admin.ModelAdmin): class ConferenceAdmin(admin.ModelAdmin): exclude = ['readers', 'keywords'] search_fields = ['public_id', 'id', 'title'] + filter_horizontal = ['professor',] autocomplete_fields = ['docs_description', 'suggested_seminars', 'suggested_conferences'] actions = ['export_conference'] diff --git a/teleforma/migrations/0027_conference_professor_m2m.py b/teleforma/migrations/0027_conference_professor_m2m.py new file mode 100644 index 00000000..6a16d9ef --- /dev/null +++ b/teleforma/migrations/0027_conference_professor_m2m.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from django.db import migrations, models + + +def copy_professor(apps, schema_editor): + """Move the single FK professor into the new M2M relation.""" + Conference = apps.get_model('teleforma', 'Conference') + for conf in Conference.objects.exclude(professor_single__isnull=True): + conf.professor.add(conf.professor_single_id) + + +def reverse_professor(apps, schema_editor): + """Keep the first M2M professor as the single FK professor.""" + Conference = apps.get_model('teleforma', 'Conference') + for conf in Conference.objects.all(): + first = conf.professor.first() + if first: + conf.professor_single = first + conf.save(update_fields=['professor_single']) + + +class Migration(migrations.Migration): + + dependencies = [ + ('teleforma', '0026_conference_secondary_subject'), + ] + + operations = [ + migrations.RenameField( + model_name='conference', + old_name='professor', + new_name='professor_single', + ), + migrations.AddField( + model_name='conference', + name='professor', + field=models.ManyToManyField(blank=True, related_name='conference', to='teleforma.Professor', verbose_name='professor'), + ), + migrations.RunPython(copy_professor, reverse_professor), + migrations.RemoveField( + model_name='conference', + name='professor_single', + ), + ] diff --git a/teleforma/models/core.py b/teleforma/models/core.py index fd243a57..8d573b88 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -964,8 +964,8 @@ class Conference(Displayable, WebclassMixin, ProductCodeMixin, SuggestionsMixin) course = models.ForeignKey('Course', related_name='conference', verbose_name=_('course'), on_delete=models.CASCADE) course_type = models.ForeignKey('CourseType', related_name='conference', verbose_name=_('course type'), null=True, blank=True, on_delete=models.SET_NULL) - professor = models.ForeignKey('Professor', related_name='conference', verbose_name=_('professor'), - blank=True, null=True, on_delete=models.SET_NULL) + professor = models.ManyToManyField('Professor', related_name='conference', verbose_name=_('professor'), + blank=True) session = models.CharField(_('session'), choices=session_choices, max_length=16, default="1") @@ -1076,16 +1076,12 @@ class Conference(Displayable, WebclassMixin, ProductCodeMixin, SuggestionsMixin) } def __str__(self): - if self.professor: - list = [self.title, self.course.title, - self.session, - self.professor.user.first_name, - self.professor.user.last_name, - str(self.date_begin)] - else: - list = [self.title, self.course.title, - self.session, - str(self.date_begin)] + list = [self.title, self.course.title, self.session] + if self.pk: + for professor in self.professor.all(): + list.append(professor.user.first_name) + list.append(professor.user.last_name) + list.append(str(self.date_begin)) return ' - '.join(list) def save(self, **kwargs): @@ -1098,16 +1094,18 @@ class Conference(Displayable, WebclassMixin, ProductCodeMixin, SuggestionsMixin) {'id':'organization','value': self.course.department.organization, 'class':'', 'label': 'Organization'}, {'id': 'department', 'value': self.course.department , 'class':'', 'label': 'Department'}, {'id': 'period', 'value': self.period, 'class':'', 'label': 'Period'}, - {'id': 'professor', 'value': self.professor, 'class':'' , 'label': 'Professor'}, + {'id': 'professor', 'value': ', '.join(str(p) for p in self.professor.all()), 'class':'' , 'label': 'Professor'}, {'id': 'session', 'value': self.session, 'class':'' , 'label': 'Session'}, {'id': 'comment', 'value': self.comment, 'class':'' , 'label': 'Comment'}, ] return dict def to_json_dict(self): + professors = self.professor.all() data = {'id': self.public_id, 'course_code': self.course.code, - 'professor_id': self.professor.user.username, + 'professor_id': professors[0].user.username if professors else '', + 'professor_ids': [p.user.username for p in professors], 'period': self.period.name, 'department': self.department.name, 'session': self.session, diff --git a/teleforma/templates/teleforma/course.html b/teleforma/templates/teleforma/course.html index 96c3862c..aa8418e5 100644 --- a/teleforma/templates/teleforma/course.html +++ b/teleforma/templates/teleforma/course.html @@ -54,7 +54,7 @@ {% for conference in course.conference.all %} {{ conference.session }} -{{ conference.professor.user.first_name }} {{ conference.professor.user.last_name }} +{% for professor in conference.professor.all %}{{ professor.user.first_name }} {{ professor.user.last_name }}{% if not forloop.last %}, {% endif %}{% endfor %} {{ conference.date_begin }} diff --git a/teleforma/templates/teleforma/course_conference.html b/teleforma/templates/teleforma/course_conference.html index 46b69e32..2a34eef6 100644 --- a/teleforma/templates/teleforma/course_conference.html +++ b/teleforma/templates/teleforma/course_conference.html @@ -59,11 +59,11 @@
-{% if conference.professor %} +{% if conference.professor.all %}
{% trans "Course" %}
{{ conference.course.title }} - {{ conference.course_type }}
{% trans "Session" %}
{{ conference.session }}
-
{% trans "Professor" %}
-
{{ conference.professor }}
+
{% if conference.professor.count > 1 %}{% trans "Professors" %}{% else %}{% trans "Professor" %}{% endif %}
+
{% for professor in conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% endif %} {% if conference.comment %}
{% trans "Comment" %}
{{ conference.comment }}
{% endif %}
{% trans "Begin date" %}
{{ conference.date_begin }}
diff --git a/teleforma/templates/teleforma/course_conference_audio.html b/teleforma/templates/teleforma/course_conference_audio.html index 26e0599c..c0ba0d24 100644 --- a/teleforma/templates/teleforma/course_conference_audio.html +++ b/teleforma/templates/teleforma/course_conference_audio.html @@ -35,7 +35,7 @@  {% trans "Video" %}
-{{ course.title }}{% if course.description %} - {{ course.description }}{% endif %} - {{ conference.session }} - {{ conference.professor }} +{{ course.title }}{% if course.description %} - {{ course.description }}{% endif %} - {{ conference.session }} - {% for professor in conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
@@ -63,7 +63,7 @@
{% trans "Title" %}
{{ conference.course.title }}
-
{% trans "Professor" %}
{{ conference.professor }}
+
{% if conference.professor.count > 1 %}{% trans "Professors" %}{% else %}{% trans "Professor" %}{% endif %}
{% for professor in conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% trans "Session" %}
{{ conference.session }}
{% trans "Room" %}
{{ conference.room }}
{% trans "Begin" %}
{{ conference.date_begin }}
diff --git a/teleforma/templates/teleforma/course_media.html b/teleforma/templates/teleforma/course_media.html index de28f8cf..da3b957d 100644 --- a/teleforma/templates/teleforma/course_media.html +++ b/teleforma/templates/teleforma/course_media.html @@ -119,9 +119,9 @@ {% if media.conference %}
{% trans "Course" %}
{{ media.course.title }} - {{ media.course_type }}
{% trans "Session" %}
{{ media.conference.session }}
-{% if media.conference.professor %} -
{% trans "Professor" %}
-
{{ media.conference.professor }}
+{% if media.conference.professor.all %} +
{% if media.conference.professor.count > 1 %}{% trans "Professors" %}{% else %}{% trans "Professor" %}{% endif %}
+
{% for professor in media.conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% endif %} {% if media.conference.comment %}
{% trans "Comment" %}
{{ media.conference.comment }}
{% endif %}
{% trans "Begin date" %}
{{ media.conference.date_begin }}
diff --git a/teleforma/templates/teleforma/course_media_transcoded.html b/teleforma/templates/teleforma/course_media_transcoded.html index 2fa6fc10..50171ad8 100644 --- a/teleforma/templates/teleforma/course_media_transcoded.html +++ b/teleforma/templates/teleforma/course_media_transcoded.html @@ -92,9 +92,9 @@ $(document).ready(function(){ {% if media.conference %}
{% trans "Course" %}
{{ media.course.title }} - {{ media.course_type }}
{% trans "Session" %}
{{ media.conference.session }}
-{% if media.conference.professor %} -
{% trans "Professor" %}
-
{{ media.conference.professor }}
+{% if media.conference.professor.all %} +
{% if media.conference.professor.count > 1 %}{% trans "Professors" %}{% else %}{% trans "Professor" %}{% endif %}
+
{% for professor in media.conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% endif %} {% if media.conference.comment %}
{% trans "Comment" %}
{{ media.conference.comment }}
{% endif %}
{% trans "Begin date" %}
{{ media.conference.date_begin }}
diff --git a/teleforma/templates/teleforma/course_webclass.html b/teleforma/templates/teleforma/course_webclass.html index 0bfe1827..eab3d7ea 100644 --- a/teleforma/templates/teleforma/course_webclass.html +++ b/teleforma/templates/teleforma/course_webclass.html @@ -71,15 +71,15 @@
- {% if conference.professor %} + {% if conference.professor.all %}
{% trans "Course" %}
{{ conference.course.title }}{% if conference.course_type != None %} - {{ conference.course_type }}{% endif %}
Niveau
{{ conference.level }}
-
{% trans "Professor" %}
-
{{ conference.professor }}
+
{% if conference.professor.count > 1 %}{% trans "Professors" %}{% else %}{% trans "Professor" %}{% endif %}
+
{% for professor in conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% endif %} {% if conference.comment %}
{% trans "Comment" %}
{{ conference.comment }}
{% endif %} diff --git a/teleforma/templates/teleforma/inc/conference_list.html b/teleforma/templates/teleforma/inc/conference_list.html index 0bc22c36..0f3cec02 100644 --- a/teleforma/templates/teleforma/inc/conference_list.html +++ b/teleforma/templates/teleforma/inc/conference_list.html @@ -24,7 +24,7 @@
{% trans "Title" %}
{{ stream.conference.course.title }}
{% trans "Session" %}
{{ stream.conference.session }}
-
{% trans "Professor" %}
{{ stream.conference.professor }}
+
{% if stream.conference.professor.count > 1 %}{% trans "Professors" %}{% else %}{% trans "Professor" %}{% endif %}
{% for professor in stream.conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% trans "Begin" %}
{{ stream.conference.date_begin }}
diff --git a/teleforma/templates/teleforma/inc/media_list.html b/teleforma/templates/teleforma/inc/media_list.html index 51fdd6d2..b225ff20 100644 --- a/teleforma/templates/teleforma/inc/media_list.html +++ b/teleforma/templates/teleforma/inc/media_list.html @@ -31,8 +31,8 @@
{% trans "Title" %}
{{ media.conference.course.title }}
{% trans "Session" %}
{{ media.conference.session }}
- {% if media.conference.professor %} -
{% trans "Professor" %}
{{ media.conference.professor }}
+ {% if media.conference.professor.all %} +
{% if media.conference.professor.count > 1 %}{% trans "Professors" %}{% else %}{% trans "Professor" %}{% endif %}
{% for professor in media.conference.professor.all %}{{ professor }}{% if not forloop.last %}, {% endif %}{% endfor %}
{% endif %}
{% trans "Begin" %}
{{ media.conference.date_begin }}
{% if media.conference.comment %} diff --git a/teleforma/views/core.py b/teleforma/views/core.py index fbf11d04..28c788a9 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -680,16 +680,19 @@ class ConferenceRecordView(FormView): course=course, course_type=course_type) if c: conf.session = conference['session'] - if conference['professor_id']: - user = User.objects.filter(username=conference['professor_id']) + professor_ids = conference.get('professor_ids') or [] + if not professor_ids and conference['professor_id']: + professor_ids = [conference['professor_id']] + for professor_id in professor_ids: + user = User.objects.filter(username=professor_id) if user: - conf.professor = Professor.objects.get(user=user[0]) + professor = Professor.objects.get(user=user[0]) else: - user = User(username=conference['professor_id']) + user = User(username=professor_id) user.save() professor = Professor(user=user) professor.save() - conf.professor = professor + conf.professor.add(professor) try: organization, c = Organization.objects.get_or_create(name=conference['organization']) conf.room, c = Room.objects.get_or_create(name=conference['room'],