From 9df6082e16faaae1a4cbc5d72b40b6c867b514b0 Mon Sep 17 00:00:00 2001 From: champeno Date: Sun, 14 Jun 2015 23:04:43 +0200 Subject: [PATCH] =?UTF-8?q?Une=20interface=20moche=20mais=20compl=C3=A8te?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- experiENS/settings.py | 1 + monstage/migrations/0005_stage_thematiques.py | 22 ++++++++ monstage/models.py | 4 +- monstage/templates/monstage/stage.html | 51 ++++++++++++++++- .../templates/monstage/stage_edit_desc.html | 2 +- .../monstage/stage_edit_feedback.html | 2 +- .../templates/monstage/stage_edit_lieu.html | 2 +- monstage/urls.py | 1 - monstage/views.py | 55 ++++++++++--------- requirements.txt | 3 +- 10 files changed, 110 insertions(+), 33 deletions(-) create mode 100644 monstage/migrations/0005_stage_thematiques.py diff --git a/experiENS/settings.py b/experiENS/settings.py index 993c1f6..7e8cef2 100644 --- a/experiENS/settings.py +++ b/experiENS/settings.py @@ -38,6 +38,7 @@ INSTALLED_APPS = ( 'django.contrib.staticfiles', 'django.contrib.gis', 'monstage', + 'taggit', ) MIDDLEWARE_CLASSES = ( diff --git a/monstage/migrations/0005_stage_thematiques.py b/monstage/migrations/0005_stage_thematiques.py new file mode 100644 index 0000000..3ceb538 --- /dev/null +++ b/monstage/migrations/0005_stage_thematiques.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0001_initial'), + ('monstage', '0004_auto_20150614_1517'), + ] + + operations = [ + migrations.AddField( + model_name='stage', + name='thematiques', + field=taggit.managers.TaggableManager(to='taggit.Tag', through='taggit.TaggedItem', blank=True, help_text='A comma-separated list of tags.', verbose_name='Th\xe9matiques'), + preserve_default=True, + ), + ] diff --git a/monstage/models.py b/monstage/models.py index b5648b1..373888c 100644 --- a/monstage/models.py +++ b/monstage/models.py @@ -6,6 +6,8 @@ from django.utils.translation import ugettext_lazy as _ from django.contrib.gis.db import models as geomodels from django_cas_ng.signals import cas_user_authenticated +from taggit.managers import TaggableManager + from monstage.listepays import PAYS_CHOICES TYPE_STAGE_CHOICES = ( @@ -80,10 +82,10 @@ class Stage(models.Model): start_date = models.DateField(_(u"Date de début"), null = True) end_date = models.DateField(_(u"Date de fin"), null = True) sujet = models.CharField(_(u"Sujet"), max_length = 500) + thematiques = TaggableManager(_(u"Thématiques"), blank = True) encadrants = models.CharField(_(u"Encadrants"), max_length = 500, blank = True) lieux = models.ManyToManyField(Lieu, related_name = "stages", through = "LieuStage") matieres = models.ManyToManyField(StageMatiere, related_name = "stages") - # TODO : thematiques # Avis avis_encadrants = models.TextField(_(u"Avis sur les encadrants"), blank = True) diff --git a/monstage/templates/monstage/stage.html b/monstage/templates/monstage/stage.html index d9b5e6f..5e91c53 100644 --- a/monstage/templates/monstage/stage.html +++ b/monstage/templates/monstage/stage.html @@ -3,8 +3,57 @@ {% block content %}

{{ stage.sujet }}

Retour

- {% if modifiable %}

Modifier

{% endif %} + {% if modifiable %}

Modifier la description du stage (sujet, ...)

{% endif %}

Stage de {{ stage.profil_user.user.first_name }} {{ stage.profil_user.user.last_name }}

Du {{ stage.start_date }} au {{ stage.end_date }}

+

Matières : {% for matiere in stage.matieres.all %}{% if not forloop.first %}, {% endif %}{{ matiere.name }}{% endfor %}

+

Thématiques : {% for tag in stage.thematiques.names %}{% if not forloop.first %}, {% endif %}{{ tag }}{% endfor %}

+

A {% for lieu in stage.lieux.all %}{% if not forloop.first %}{% if forloop.last %} et {% else %}, {% endif %}{% endif %}{{ lieu.name }} ({{ lieu.ville }}){% endfor %}

+ {% if modifiable %}

Modifier les lieux du stage

{% endif %} + {% if modifiable %}

Modifier les avis sur le stage

{% endif %} +

Ressenti sur le stage

+ {% if stage.avis_encadrants %} +

Les encadrants

+

{{ stage.avis_encadrants }}

+ {% endif %} + {% if stage.avis_equipe %} +

L'équipe

+

{{ stage.avis_equipe }}

+ {% endif %} + {% if stage.avis_stage %} +

Le stage en général

+

{{ stage.avis_stage }}

+ {% endif %} + {% if stage.avis_admin %} +

L'administratif et le visa

+

{{ stage.avis_admin }}

+ {% endif %} + {% for lieustage in stage.lieustage_set.all %} +

La vie à {{ lieustage.lieu.ville }}, {{ lieustage.lieu.get_pays_display }}

+ {% if lieustage.avis_global %} +

Ressenti global du séjour

+

{{ lieustage.avis_global }}

+ {% endif %} + {% if lieustage.avis_lieudevie %} +

Mon lieu de vie

+

{{ lieustage.avis_lieudevie }}

+ {% endif %} + {% if lieustage.avis_lieustage %} +

Le lieu du stage : {{ lieustage.lieu.name }}

+

{{ lieustage.avis_lieustage }}

+ {% endif %} + {% if lieustage.avis_pratique %} +

S'installer / conseils pratiques

+

{{ lieustage.avis_pratique }}

+ {% endif %} + {% if lieustage.avis_visite %} +

A voir, à faire aux alentours de {{ lieustage.lieu.ville }}

+

{{ lieustage.avis_visite }}

+ {% endif %} + {% if lieustage.avis_anecdotes %} +

Anecdotes

+

{{ lieustage.avis_anecdotes }}

+ {% endif %} + {% endfor %} {% endblock %} diff --git a/monstage/templates/monstage/stage_edit_desc.html b/monstage/templates/monstage/stage_edit_desc.html index 06e00f6..4b670c5 100644 --- a/monstage/templates/monstage/stage_edit_desc.html +++ b/monstage/templates/monstage/stage_edit_desc.html @@ -2,7 +2,7 @@ {% block content %}

Modifier la description du stage "{{ stage.sujet }}"

-

Retour

+

Retour

{% csrf_token %} {{ form.as_p }} diff --git a/monstage/templates/monstage/stage_edit_feedback.html b/monstage/templates/monstage/stage_edit_feedback.html index 781b252..58a3dcd 100644 --- a/monstage/templates/monstage/stage_edit_feedback.html +++ b/monstage/templates/monstage/stage_edit_feedback.html @@ -3,7 +3,7 @@ {% block content %}

Avis sur le stage "{{ stage.sujet }}"

-

Retour

+

Retour

{{ debug }}

{% csrf_token %} diff --git a/monstage/templates/monstage/stage_edit_lieu.html b/monstage/templates/monstage/stage_edit_lieu.html index 743acb4..38944ff 100644 --- a/monstage/templates/monstage/stage_edit_lieu.html +++ b/monstage/templates/monstage/stage_edit_lieu.html @@ -15,7 +15,7 @@ {% block content %}

Lieux du stage "{{ stage.sujet }}"

-

Retour

+

Retour

{{ debug }}

diff --git a/monstage/urls.py b/monstage/urls.py index 84c7180..d20b616 100644 --- a/monstage/urls.py +++ b/monstage/urls.py @@ -9,7 +9,6 @@ urlpatterns = patterns('', url(r'^api/lieux/candidats/$', views.lieux_candidats, name='lieux_candidats'), url(r'^stage/(?P\d+)/$', views.stage, name='stage'), url(r'^stage/new/$', views.stage_add, name='stage_add'), - url(r'^stage/(?P\d+)/edit/$', views.stage_edit, name='stage_edit'), url(r'^stage/(?P\d+)/edit/description/$', views.stage_edit_desc, name='stage_edit_desc'), url(r'^stage/(?P\d+)/edit/lieu/$', views.stage_edit_lieu, name='stage_edit_lieu'), url(r'^stage/(?P\d+)/edit/avis/$', views.stage_edit_feedback, name='stage_edit_feedback'), diff --git a/monstage/views.py b/monstage/views.py index b68c673..4b67868 100644 --- a/monstage/views.py +++ b/monstage/views.py @@ -54,7 +54,7 @@ def stage(request, stage_id): class StageForm(forms.ModelForm): class Meta: model = Stage - fields = ("type_stage", "start_date", "end_date", "matieres", "sujet", "encadrants") + fields = ("type_stage", "start_date", "end_date", "matieres", "sujet", "thematiques", "encadrants") @login_required def stage_add(request): @@ -62,21 +62,28 @@ def stage_add(request): form = StageForm(request.POST) if form.is_valid: new_stage = form.save(commit = False) - new_stage.user = request.user.profil + new_stage.profil_user = request.user.profil new_stage.save() + form.save_m2m() return HttpResponseRedirect(reverse('monstage:stage_edit_lieu', args=(new_stage.id,))) else: form = StageForm() return render(request, 'monstage/stage_add.html', { 'form': form }) +@login_required def stage_edit_desc(request, stage_id): stage = get_object_or_404( Stage, pk = stage_id) if stage.profil_user != request.user.profil: return HttpResponseForbidden("Ce stage ne vous appartient pas") bullshit = "" if request.POST: - pass - return render(request, 'monstage/stage_edit_desc.html', { 'stage': stage, 'debug':bullshit }) + form = StageForm(request.POST, instance = stage) + if form.is_valid(): + form.save() + return HttpResponseRedirect(reverse('monstage:stage', args=(stage.id,))) + else: + form = StageForm(instance = stage) + return render(request, 'monstage/stage_edit_desc.html', { 'stage': stage, 'form':form }) class LieuStageForm(forms.Form): lieu_id = forms.IntegerField(widget = HiddenInput()) @@ -109,7 +116,7 @@ class LieuForm(forms.ModelForm): def save(self, *args, **kwargs): lieu = super(LieuForm, self).save(commit=False, *args, **kwargs) lieu.coord = GEOSGeometry('POINT(%f %f)' % (self.cleaned_data['latitude'], self.cleaned_data['longitude']), srid=4326) - return lieu.save(*args, **kwargs) + return lieu def lieux_candidats(request): if request.GET: @@ -135,7 +142,8 @@ def stage_edit_lieu(request, stage_id): lieuforms = [] deleted = [] for i in range(0, int(request.POST['numplaces'])): - if request.POST.get('%d-name' % i, False): # Lieu a modifier / créer + toSave = False + if request.POST.get('%d-name' % i, False): # Lieu à créer bullshit += str(i) + 'a ' lieuform = LieuForm(request.POST, prefix = str(i)) if not lieuform.is_valid(): @@ -146,12 +154,9 @@ def stage_edit_lieu(request, stage_id): pass else: lieu = lieuform.save() - if len(prevLieuxStage) > 0: - lieustage = prevLieuxStage.pop(0) - lieustage.lieu = lieu - lieustage.save() - else: - LieuStage.objects.create(lieu = lieu, stage = stage) + lieu.save() + lieuform.save_m2m() + toSave = True lieuforms.append(LieuStageForm(initial = {'lieu_id': lieu.id}, prefix = str(i))) elif request.POST.get('%d-lieu_id' % i, False): # Lien vers un lieu déjà existant bullshit += str(i) + 'b ' @@ -167,16 +172,18 @@ def stage_edit_lieu(request, stage_id): else: lieuforms.append(lieuform) lieu = Lieu.objects.get( pk = lieuform.cleaned_data['lieu_id'] ) - if len(prevLieuxStage) > 0: - lieustage = prevLieuxStage.pop(0) - lieustage.lieu = lieu - lieustage.save() - elif len(deleted) > 0: - lieustage = deleted.pop(0) - lieustage.lieu = lieu - lieustage.save() - else: - LieuStage.objects.create(lieu = lieu, stage = stage) + toSave = True + if toSave: # Mise à jour des liens lieu - stage + if len(prevLieuxStage) > 0: + lieustage = prevLieuxStage.pop(0) + lieustage.lieu = lieu + lieustage.save() + elif len(deleted) > 0: + lieustage = deleted.pop(0) + lieustage.lieu = lieu + lieustage.save() + else: + LieuStage.objects.create(lieu = lieu, stage = stage) if valid: for lieustage in deleted: lieustage.delete() @@ -218,10 +225,6 @@ def stage_edit_feedback(request, stage_id): forms_lieux = [(LieuStageFeedbackForm(instance = lieustage, prefix = lieustage.id), lieustage.lieu) for lieustage in stage.lieustage_set.all()] return render(request, 'monstage/stage_edit_feedback.html', { 'stage': stage, 'form_gen':form_gen, 'forms_lieux':forms_lieux }) -def stage_edit(request, stage_id): - stage = get_object_or_404( Stage, pk = stage_id) - return render(request, 'monstage/stage_edit.html', {'stage': stage}) - def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'monstage/detail.html', {'question': question}) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 3915523..3e8e341 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ django>=1.7 django-cas-ng psycopg2 -postgis \ No newline at end of file +postgis +django-taggit \ No newline at end of file