From 0c70d1b76b58aa6e7b35122347c283a840d4577b Mon Sep 17 00:00:00 2001 From: Evarin Date: Mon, 2 Oct 2017 23:59:20 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20du=20champ=20pr=C3=A9stage,=20am=C3=A9l?= =?UTF-8?q?iorations=20UX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avisstage/forms.py | 5 +- .../migrations/0002_auto_20171002_2243.py | 31 +++++++ avisstage/models.py | 26 +++++- avisstage/sass/_stage_detail.scss | 5 ++ avisstage/static/css/screen.css | 46 +++++----- .../templates/avisstage/detail/avis.html | 3 + .../templates/avisstage/detail/stage.html | 4 +- avisstage/templates/avisstage/recherche.html | 89 ------------------- .../avisstage/recherche/recherche.html | 4 +- .../avisstage/recherche/resultats.html | 4 +- avisstage/templatetags/avisstage_tags.py | 9 ++ 11 files changed, 110 insertions(+), 116 deletions(-) create mode 100644 avisstage/migrations/0002_auto_20171002_2243.py delete mode 100644 avisstage/templates/avisstage/recherche.html diff --git a/avisstage/forms.py b/avisstage/forms.py index 1fb670e..8af5c57 100644 --- a/avisstage/forms.py +++ b/avisstage/forms.py @@ -56,6 +56,8 @@ class StageForm(forms.ModelForm): # Date de modification self.instance.date_maj = timezone.now() + + self.instance.update_stats(False) stage = super(StageForm, self).save(commit=commit) return stage @@ -64,12 +66,13 @@ class StageForm(forms.ModelForm): class AvisStageForm(HTMLTrimmerForm): class Meta: model = AvisStage - fields = ['chapo', 'avis_sujet', 'avis_ambiance', 'avis_admin', 'les_plus', 'les_moins'] + fields = ['chapo', 'avis_sujet', 'avis_ambiance', 'avis_admin', 'avis_prestage', 'les_plus', 'les_moins'] help_texts = { "chapo": u"\"Trop long, pas lu\" : une accroche résumant ce que vous avez pensé de ce séjour", "avis_ambiance": u"Avez-vous passé un bon moment à ce travail ? Étiez-vous assez guidé⋅e ? Aviez-vous un bon contact avec vos encadrant⋅e⋅s ? Y avait-il une bonne ambiance dans l'équipe ?", "avis_sujet": u"Quelle était votre mission ? Qu'en avez-vous retiré ? Le travail correspondait-il à vos attentes ? Était-ce à votre niveau, trop dur, trop facile ?", "avis_admin": u"Avez-vous commencé votre travail à la date prévue ? Était-ce compliqué d'obtenir les documents nécessaires (visa, contrats, etc) ? L'administration de l'établissement vous a-t-elle aidé⋅e ? Étiez-vous rémunéré⋅e ?", + "avis_prestage": u"Comment avez-vous trouvé où aller pour cette expérience ? À quel moment avez-vous commencé à chercher ? Avez-vous eu des entretiens pour obtenir votre place ? Avez-vous eu d'autres pistes, pourquoi avez-vous choisi cette option ?", "les_plus": u"Les principaux points positifs de cette expérience", "les_moins": u"Ce qui aurait pu être mieux", } diff --git a/avisstage/migrations/0002_auto_20171002_2243.py b/avisstage/migrations/0002_auto_20171002_2243.py new file mode 100644 index 0000000..59c0ea4 --- /dev/null +++ b/avisstage/migrations/0002_auto_20171002_2243.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-10-02 20:43 +from __future__ import unicode_literals + +from django.db import migrations, models +import tinymce.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('avisstage', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='avisstage', + name='avis_prestage', + field=tinymce.models.HTMLField(blank=True, default='', verbose_name='Avant le stage'), + ), + migrations.AddField( + model_name='stage', + name='len_avis_lieux', + field=models.IntegerField(default=0, verbose_name='Longueur des avis de lieu'), + ), + migrations.AddField( + model_name='stage', + name='len_avis_stage', + field=models.IntegerField(default=0, verbose_name='Longueur des avis de stage'), + ), + ] diff --git a/avisstage/models.py b/avisstage/models.py index 15d0001..f13b8b0 100644 --- a/avisstage/models.py +++ b/avisstage/models.py @@ -10,6 +10,7 @@ from django.template.defaultfilters import slugify from django.forms.widgets import DateInput from django.urls import reverse from django.utils import timezone +from django.utils.html import strip_tags from taggit_autosuggest.managers import TaggableManager from tinymce.models import HTMLField as RichTextField @@ -162,6 +163,8 @@ class Stage(models.Model): public = models.BooleanField(u"Visible publiquement", default=False) date_creation = models.DateTimeField(u"Créé le", default=timezone.now) date_maj = models.DateTimeField(u"Mis à jour le", default=timezone.now) + len_avis_stage = models.IntegerField(u"Longueur des avis de stage", default=0) + len_avis_lieux = models.IntegerField(u"Longueur des avis de lieu", default=0) # Caractéristiques du stage sujet = models.CharField(u"Sujet", max_length=500) @@ -221,6 +224,26 @@ class Stage(models.Model): def __unicode__(self): return u"%s (par %s)" % (self.sujet, self.auteur.user.username) + def update_stats(self, save=True): + def get_len(obj): + length = 0 + avis = obj.avis_all + for k, av in avis: + length += len(av.split()) + length += len(obj.chapo.split()) + length += len(obj.les_plus.split()) + length += len(obj.les_moins.split()) + return length + + if self.avis_stage: + self.len_avis_stage = get_len(self.avis_stage) + self.len_avis_lieux = 0 + for avis in self.avislieu_set.all(): + self.len_avis_lieux += get_len(avis) + + if save: + self.save() + class Meta: verbose_name = "Stage" @@ -235,6 +258,7 @@ class AvisStage(models.Model): avis_ambiance = RichTextField(u"L'ambiance de travail", blank=True) avis_sujet = RichTextField(u"La mission", blank=True) avis_admin = RichTextField(u"Formalités et administration", blank=True) + avis_prestage = RichTextField(u"Avant le stage", blank=True, default="") les_plus = models.TextField(u"Les plus de cette expérience", blank=True) les_moins = models.TextField(u"Les moins de cette expérience", blank=True) @@ -245,7 +269,7 @@ class AvisStage(models.Model): # Liste des champs d'avis, couplés à leur nom (pour l'affichage) @property def avis_all(self): - fields = ['avis_sujet', 'avis_ambiance', 'avis_admin'] + fields = ['avis_sujet', 'avis_ambiance', 'avis_admin', 'avis_prestage'] return [(AvisStage._meta.get_field(field).verbose_name, getattr(self, field, '')) for field in fields] diff --git a/avisstage/sass/_stage_detail.scss b/avisstage/sass/_stage_detail.scss index 78c7cc4..3f9fed4 100644 --- a/avisstage/sass/_stage_detail.scss +++ b/avisstage/sass/_stage_detail.scss @@ -158,6 +158,11 @@ article.stage { } } } + .avis-vides { + font-style: italic; + font-size: 0.9em; + text-align: center; + } } // Sommaire sur le côté diff --git a/avisstage/static/css/screen.css b/avisstage/static/css/screen.css index 1faebbc..f9f9fa4 100644 --- a/avisstage/static/css/screen.css +++ b/avisstage/static/css/screen.css @@ -542,25 +542,31 @@ article.stage section .plusmoins .moins:before { vertical-align: top; color: #c70660; } -/* line 165, ../../sass/_stage_detail.scss */ +/* line 161, ../../sass/_stage_detail.scss */ +article.stage section .avis-vides { + font-style: italic; + font-size: 0.9em; + text-align: center; +} +/* line 170, ../../sass/_stage_detail.scss */ article.stage .section-wrapper { display: table; margin-left: -15px; width: 100%; } -/* line 170, ../../sass/_stage_detail.scss */ +/* line 175, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc-wrapper, article.stage .section-wrapper > section { display: table-cell; vertical-align: top; } -/* line 174, ../../sass/_stage_detail.scss */ +/* line 179, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc-wrapper { max-width: 230px; width: 25%; padding: 5px; padding-right: 25px; } -/* line 180, ../../sass/_stage_detail.scss */ +/* line 185, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc { font-family: "Dosis", sans-serif; position: -webkit-sticky; @@ -571,12 +577,12 @@ article.stage .section-wrapper .toc { padding: 5px; box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.2); } -/* line 190, ../../sass/_stage_detail.scss */ +/* line 195, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc ul { list-style: none; padding: 0; } -/* line 195, ../../sass/_stage_detail.scss */ +/* line 200, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc a { display: block; color: inherit; @@ -585,45 +591,45 @@ article.stage .section-wrapper .toc a { padding: 5px; line-height: 1; } -/* line 203, ../../sass/_stage_detail.scss */ +/* line 208, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc a:hover { color: #8fcc33; } -/* line 207, ../../sass/_stage_detail.scss */ +/* line 212, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc .toc-h1 a { font-weight: 900; } -/* line 210, ../../sass/_stage_detail.scss */ +/* line 215, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc .toc-h2 { margin-top: 10px; font-weight: 400; } -/* line 214, ../../sass/_stage_detail.scss */ +/* line 219, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc .toc-h3 a { font-weight: 300; } -/* line 217, ../../sass/_stage_detail.scss */ +/* line 222, ../../sass/_stage_detail.scss */ article.stage .section-wrapper .toc .toc-active a { color: #0f4c82; } -/* line 224, ../../sass/_stage_detail.scss */ +/* line 229, ../../sass/_stage_detail.scss */ .misc-hdr { display: table; width: 100%; border-bottom: 1px solid #ccc; } -/* line 229, ../../sass/_stage_detail.scss */ +/* line 234, ../../sass/_stage_detail.scss */ .misc-hdr > * { display: table-cell; vertical-align: bottom; } -/* line 234, ../../sass/_stage_detail.scss */ +/* line 239, ../../sass/_stage_detail.scss */ .misc-hdr h1, .misc-hdr h3 { width: 100%; padding-right: 5px; } -/* line 238, ../../sass/_stage_detail.scss */ +/* line 243, ../../sass/_stage_detail.scss */ .misc-hdr .dates { width: 50px; background-color: #950548; @@ -634,28 +640,28 @@ article.stage .section-wrapper .toc .toc-active a { font-size: 0.8em; text-align: center; } -/* line 248, ../../sass/_stage_detail.scss */ +/* line 253, ../../sass/_stage_detail.scss */ .misc-hdr .dates span { display: block; } -/* line 251, ../../sass/_stage_detail.scss */ +/* line 256, ../../sass/_stage_detail.scss */ .misc-hdr .dates .year { font-size: 1.8em; } -/* line 259, ../../sass/_stage_detail.scss */ +/* line 264, ../../sass/_stage_detail.scss */ .edit-box { background: #eee; margin: 10px; padding: 10px 20px; text-align: center; } -/* line 265, ../../sass/_stage_detail.scss */ +/* line 270, ../../sass/_stage_detail.scss */ .edit-box.public { background: #cae3f9; border: 1px solid #125b9b; } -/* line 270, ../../sass/_stage_detail.scss */ +/* line 275, ../../sass/_stage_detail.scss */ .edit-box.prive { background: #fdcfe4; border: 1px solid #ad0654; diff --git a/avisstage/templates/avisstage/detail/avis.html b/avisstage/templates/avisstage/detail/avis.html index 1723210..2d62809 100644 --- a/avisstage/templates/avisstage/detail/avis.html +++ b/avisstage/templates/avisstage/detail/avis.html @@ -34,4 +34,7 @@ {% endif %} + {% if longueur < 15 %} +

Pas grand-chose par ici. Peut-être aurez-vous plus d'informations en contactant directement l'auteur⋅e ?

+ {% endif %} diff --git a/avisstage/templates/avisstage/detail/stage.html b/avisstage/templates/avisstage/detail/stage.html index 7d7e118..ec399ae 100644 --- a/avisstage/templates/avisstage/detail/stage.html +++ b/avisstage/templates/avisstage/detail/stage.html @@ -109,10 +109,10 @@
- {% include "avisstage/detail/avis.html" with avis=object.avis_stage titre="Avis sur le travail" %} + {% include "avisstage/detail/avis.html" with avis=object.avis_stage titre="Avis sur le travail" auteur=object.auteur.user.username longueur=object.len_avis_stage %} {% for avis in object.avislieu_set.all %} - {% include "avisstage/detail/avis.html" with avis=avis titre=avis.lieu %} + {% include "avisstage/detail/avis.html" with avis=avis titre=avis.lieu auteur=object.auteur.user.username longueur=object.len_avis_lieux %} {% endfor %}
diff --git a/avisstage/templates/avisstage/recherche.html b/avisstage/templates/avisstage/recherche.html deleted file mode 100644 index 6c54266..0000000 --- a/avisstage/templates/avisstage/recherche.html +++ /dev/null @@ -1,89 +0,0 @@ -{% extends "avisstage/base.html" %} -{% load staticfiles %} - -{% block title %}Chercher un stage - ExperiENS{% endblock %} - - -{% block extra_head %} - - - - - - -{% endblock %} - - -{% block content %} -

Recherche

-
Ici, bientôt, un vrai formulaire de recherche
-

Dernières mises à jour

-
-

Carte des expériences

-
-
-{% endblock %} diff --git a/avisstage/templates/avisstage/recherche/recherche.html b/avisstage/templates/avisstage/recherche/recherche.html index bbfce08..102bd4d 100644 --- a/avisstage/templates/avisstage/recherche/recherche.html +++ b/avisstage/templates/avisstage/recherche/recherche.html @@ -9,6 +9,6 @@

Chercher un stage

{% include "avisstage/recherche/formulaire.html" with form=form %}

Ou alors

-

Afficher la carte de tous les stages

-

Afficher les dernières mises à jour

+

Afficher la carte de tous les stages, triés par dernière mise à jour

+{#

Afficher les dernières mises à jour

#} {% endblock %} diff --git a/avisstage/templates/avisstage/recherche/resultats.html b/avisstage/templates/avisstage/recherche/resultats.html index 00e79e3..435c79e 100644 --- a/avisstage/templates/avisstage/recherche/resultats.html +++ b/avisstage/templates/avisstage/recherche/resultats.html @@ -1,5 +1,5 @@ {% extends "avisstage/base.html" %} -{% load staticfiles %} +{% load staticfiles avisstage_tags %} {% block title %}Chercher un stage - ExperiENS{% endblock %} @@ -54,6 +54,8 @@
  • {{ thematique.name }}
  • {% endfor %}
  • {{ stage.date_debut|date:"Y" }}
  • +
  • Avis stage {{ stage.len_avis_stage|avis_len }}
  • +
  • Avis lieux {{ stage.len_avis_lieux|avis_len }}
  •   diff --git a/avisstage/templatetags/avisstage_tags.py b/avisstage/templatetags/avisstage_tags.py index 06fd300..bd67e08 100644 --- a/avisstage/templatetags/avisstage_tags.py +++ b/avisstage/templatetags/avisstage_tags.py @@ -24,3 +24,12 @@ def typonazisme(value): value = re.sub(r'(\w)\s*([,.])', u'\\1\\2', value) value = re.sub(r'([?!:,.])(\w)', u'\\1 \\2', value) return value + +@register.filter +def avis_len(value): + if value < 5: + return "vide" + elif value < 50: + return "court" + else: + return "fourni"