diff --git a/monstage/models.py b/monstage/models.py
index 373888c..c3df808 100644
--- a/monstage/models.py
+++ b/monstage/models.py
@@ -34,7 +34,7 @@ class Normalien(models.Model):
verbose_name_plural = u"Profils élèves"
def __unicode__(self):
- return unicode(self.user.username)
+ return unicode(self.user)
def create_user_profile(sender, user, created, **kwargs):
diff --git a/monstage/templates/monstage/search.html b/monstage/templates/monstage/search.html
index 96c9b23..d84a50a 100644
--- a/monstage/templates/monstage/search.html
+++ b/monstage/templates/monstage/search.html
@@ -1,9 +1,63 @@
{% extends "skeleton.html" %}
+{% load staticfiles %}
+{% block extra_head %}
+
+
+
+{% endblock %}
{% block content %}
La recherche de stage n'est pas encore disponible. Elle devrait l'être à la rentrée 2015 !
-{% endblock %}
-
+
diff --git a/monstage/views.py b/monstage/views.py
index cabbc8f..b6532f3 100644
--- a/monstage/views.py
+++ b/monstage/views.py
@@ -12,7 +12,7 @@ from django.forms.widgets import HiddenInput
from monstage.models import *
def addslashes(s):
- d = {'"':'\\"', "'":"\\'", "\0":"\\\0", "\\":"\\\\", '\n':'\\n'}
+ d = {'"':'\\"', "\0":"\\\0", "\\":"\\\\", '\n':'\\n'}
return ''.join(d.get(c, c) for c in s)
def index(request):
@@ -129,7 +129,7 @@ class LieuForm(forms.ModelForm):
class Meta:
model = Lieu
- fields = ("name", "ville", "pays")
+ fields = ("name", "type_lieu", "ville", "pays")
def is_to_delete(self):
return self.cleaned_data['delete']
@@ -164,7 +164,7 @@ def stage_edit_lieu(request, stage_id):
prevLieuxStage = [k for k in stage.lieustage_set.all()]
lieuforms = []
deleted = []
- for i in range(0, int(request.POST['numplaces'])):
+ for i in range(0, int(request.POST['numplaces'])): # Pour chaque lieu
toSave = False
if request.POST.get('%d-name' % i, False): # Lieu à créer
bullshit += str(i) + 'a '
@@ -173,9 +173,9 @@ def stage_edit_lieu(request, stage_id):
valid = False
lieuforms.append(lieuform)
continue
- if lieuform.is_to_delete():
+ if lieuform.is_to_delete(): # On ne fait rien : le lieu est nouveau donc n'était pas encore en mémoire
pass
- else:
+ else: # On crée un nouveau lieu
lieu = lieuform.save()
lieu.save()
lieuform.save_m2m()
@@ -189,26 +189,26 @@ def stage_edit_lieu(request, stage_id):
valid = False
lieuforms.append(lieuform)
continue
- if lieuform.is_to_delete():
+ if lieuform.is_to_delete(): # On transvase de prevLieuxStage vers deleted pour conserver l'assignation des commentaires
if len(prevLieuxStage) > 0:
deleted.append(prevLieuxStage.pop(0))
- else:
+ else: # On récupère le lieu concerné
lieuforms.append(lieuform)
lieu = Lieu.objects.get( pk = lieuform.cleaned_data['lieu_id'] )
toSave = True
- if toSave: # Mise à jour des liens lieu - stage
- if len(prevLieuxStage) > 0:
+ if toSave: # Mise à jour des lieuStage
+ if len(prevLieuxStage) > 0: # On met à jour un lieuStage conservé (même lieu)
lieustage = prevLieuxStage.pop(0)
lieustage.lieu = lieu
lieustage.save()
- elif len(deleted) > 0:
+ elif len(deleted) > 0: # On réutilise l'emplacement d'un lieuStage qui a été supprimé (pour éviter de perdre les commentaires)
lieustage = deleted.pop(0)
lieustage.lieu = lieu
lieustage.save()
- else:
+ else: # On en crée un nouveau
LieuStage.objects.create(lieu = lieu, stage = stage)
if valid:
- for lieustage in deleted:
+ for lieustage in deleted: # On supprime effectivement les lieuStages non réutilisé
lieustage.delete()
return HttpResponseRedirect(reverse('monstage:stage_edit_feedback', args=(stage.id,)))
else:
@@ -269,5 +269,39 @@ def detail(request, question_id):
# Recherche de stages
#
+class SearchForm(forms.Form):
+ matiere = forms.ChoiceField(label='Matière :', required=False, choices=tuple([('','Toute matière')] + [(mat.id, mat.name) for mat in StageMatiere.objects.all()]))
+ thematiques = forms.CharField(label='Thématiques :', required=False)
+
+ latitude = forms.DecimalField(widget=HiddenInput(), required=False)
+ longitude = forms.DecimalField(widget=HiddenInput(), required=False)
+ tolerance = forms.DecimalField(label='Dans un rayon de (en km) :', initial=100, required=False)
+ lieu = forms.CharField(label=u'A proximité de :', required=False)
+
+
def search(request):
- return render(request, 'monstage/search.html')
\ No newline at end of file
+ stages = None
+ if request.GET:
+ form = SearchForm(request.GET)
+ if form.is_valid():
+ lon = form.cleaned_data['longitude']
+ lat = form.cleaned_data['latitude']
+ stages = Stage.objects
+ if lat and lon:
+ coords = GEOSGeometry('POINT(%f %f)' % (lon, lat), srid=4326)
+ distance = {'km': form.cleaned_data['tolerance']}
+ lieux = Lieu.objects.filter(coord__distance_lte=(coords, measure.D(**distance)))
+ lieux = lieux.distance(coords).order_by('distance')
+ stages = lieux.stage_set
+ matiere = form.cleaned_data['matiere']
+ if matiere:
+ stages = stages.filter(matieres__pk=matiere)
+ thematiques = form.cleaned_data['thematiques']
+ if thematiques:
+ #todo
+ pass
+ stages = stages.all()
+ else:
+ form = SearchForm()
+ return render(request, 'monstage/search.html', {'form':form, 'resultats':stages})
+