Commit b1f414a7 authored by Guesdon Damien's avatar Guesdon Damien
Browse files

enh(sujet):Mise à jour doc dev + ajout mailling fix #12 fix #21

parent 5c372b6e
......@@ -101,7 +101,7 @@ Puis faire le git commit en prenant en compte les préconisations du praragraphe
exemeple :
```
git commit -a -m "enh(sujet): fix #<numéro de l'issue ciblé par la branche> descriptif des modifications"
git commit -a -m "enh(sujet): descriptif des modifications fix #<numéro de l'issue ciblé par la branche>"
```
Pour finir propager les modifications sur le dépôt Git:
......@@ -124,3 +124,4 @@ Pour les boutons d'actions dans une page:
* Ajout: success
* Modification: primary
* Suppression: danger
......@@ -40,7 +40,7 @@ class Semestre(models.Model):
return self.nom
def get_sujet_list(self):
"""Donne la liste des sujets actifs pour le semestre
"""Donne la liste des sujets actifs du semestre
:return: QuerySet(Sujet, ...)
"""
......@@ -51,7 +51,7 @@ class Semestre(models.Model):
:return: Integer
"""
return self.sujet_set.filter(actif=True).count()
return self.get_sujet_list().count()
class Campagne(models.Model):
"""
......@@ -71,6 +71,10 @@ class Campagne(models.Model):
def __str__(self):
return f"{self.annee} {self.get_semestre_display()}"
def get_short(self):
"""Affiche un nom cours pour la campagne."""
return f"{self.annee}S{self.semestre}"
def get_pao_visibles(self, user):
"""
......@@ -199,14 +203,18 @@ class Sujet(models.Model):
return resp
def get_nb_etudiants(self):
"""Combien d'étudiants sont inscrits à ce sujet pour la dernière campagne
"""Combien d'étudiants sont inscrits à ce sujet pour les campagnes ouvertes
:return Integer"""
try:
campagne = Campagne.objects.last()
except Exception:
return 0
return self.pao_set.filter(campagne=campagne).count()
return PAO.objects.filter(campagne__ouvert=True, sujet=self).count()
def get_pao_by_campagne(self, campagne):
"""
:param campagne: Campagne
:return: liste des PAO associés à ce sujet pour la campagne demandée
"""
return self.pao_set.filter(campagne=campagne)
class PAO(models.Model):
......
......@@ -8,7 +8,7 @@
<th>Nom</th>
<th>Prénom</th>
<th>Semestre</th>
<th>Sujet</th>
<th>PAO</th>
<th>Crédits</th>
<th>Responsables</th>
<th>Note</th>
......
......@@ -21,4 +21,7 @@
{% endfor %}
</tbody>
</table>
<p>Une campagne ouverte est une campagne sur laquelle un enseignant peut associer un étudiant à un PAO. Un PAO
est le lien entre un étudiant et un sujet. Le sujet est intemporel, alors qu'un PAO est forcément lié à une
campagne, un étudiant et un nombre de crédits.</p>
{% endblock %}
......@@ -29,7 +29,7 @@
<td><a href="{% url 'pao:sujet-detail' sujet.pk %}">{{ sujet.nom }}</a></td>
<td>{{ sujet.credits }}</td>
<td>{{ sujet.nb_etudiants_min }}</td>
<td>{{ sujet.get_nb_etudiants }}</td>
<td{% include 'projets/sujet_available.html' with nb=sujet.get_nb_etudiants max=sujet.nb_etudiants_max %}>{{ sujet.get_nb_etudiants }}</td>
<td>{{ sujet.nb_etudiants_max }}</td>
<td>{{ sujet.evaluation }}</td>
<td>{{ sujet.display_responsables }}</td>
......
{% if nb == 0 %}
class="alert-success"
{% elif nb < max %}
class="alert-warning"
{% elif nb >= max %}
class="alert-danger"
{% endif %}
......@@ -42,12 +42,22 @@
</tr>
<tr>
<td>PAO utilisant ce sujet</td>
<td>{% for pao in sujet.pao_set.all %}
<a href="{% url 'pao:pao-detail' pao.pk %}">{{ pao.etudiant.get_full_name }}</a>,
{% empty %}
aucune PAO
{% endfor %}
</td>
<td>
<table>
{% for campagne, liste_pao in campagnes.items %}
<tr><td>{{ campagne }}<br>
<a href="mailto:{% for pao in liste_pao %}{{ pao.etudiant.email }},{% endfor %}?subject=[PAO]{{ sujet.nom }}" class="btn btn-warning role="button"> Contacter les étudiants </a>
</td>
<td>
{% for pao in liste_pao %}
<a href="{% url 'pao:pao-detail' pao.pk %}">{{ pao.etudiant.get_full_name }}</a>,
{% endfor %}
</td></tr>
{% empty %}
aucune PAO
{% endfor %}
</table>
</td>
</tr>
{% if perms.projets.add_pao %}
<tr>
......@@ -60,7 +70,6 @@
<a href="{% url 'pao:sujet-delete' sujet.pk %}"
class="btn btn-danger {% if sujet.actif %}disabled{% endif %}"
role="button">Supprimer</a>
<a href="mailto:{% include 'projets/sujet_detail_etudiant_contact.html' %}?subject=[PAO]:{{ sujet.nom }}" class="btn btn-warning" role="button">Envoyer un mail à tout les étudiants</a>
</td>
</tr>
{% endif %}
......
{% for pao in sujet.pao_set.all %}{{ pao.etudiant.email }};{% endfor %}
......@@ -28,4 +28,8 @@
{% endfor %}
</tbody>
</table>
<p>Un sujet est intemporel, il n'a pas besoin d'être recréé entre chaque campagne. Si vous ne souhaitez plus
proposer un sujet (de manière temporaire ou définitive), il vous suffit de le désactiver. Dans ce cas, le sujet
ne sera plus visible dans la liste pour les étudiants, mais vous pourrez toujours le voir sur cette page.
Évidemment, vous avez la possibilité de le réactiver plus tard.</p>
{% endblock %}
......@@ -62,9 +62,21 @@ class SujetCreate(MenuSujet, edit.CreateView):
return super(SujetCreate, self).form_valid(form)
class SujetDetail(MenuSujet, generic.DetailView):
class SujetDetail(generic.DetailView):
model = Sujet
def get_context_data(self, **kwargs):
context = get_my_context(super().get_context_data(**kwargs))
context['menu_sujet'] = 'active'
# on prépare un dictionnaire avec les PAO par campagne
context['campagnes'] = {}
for campagne in Campagne.objects.all():
liste_pao = self.object.get_pao_by_campagne(campagne)
if liste_pao:
context['campagnes'][campagne.get_short()] = liste_pao
return context
class SujetList(MenuSujet, generic.ListView):
model = Sujet
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment