Recherche de stage basique

This commit is contained in:
champeno 2015-08-26 13:58:18 +02:00
parent bdf7702be4
commit 75c341c943
4 changed files with 107 additions and 19 deletions

View file

@ -34,7 +34,7 @@ class Normalien(models.Model):
verbose_name_plural = u"Profils élèves" verbose_name_plural = u"Profils élèves"
def __unicode__(self): def __unicode__(self):
return unicode(self.user.username) return unicode(self.user)
def create_user_profile(sender, user, created, **kwargs): def create_user_profile(sender, user, created, **kwargs):

View file

@ -1,9 +1,63 @@
{% extends "skeleton.html" %} {% extends "skeleton.html" %}
{% load staticfiles %}
{% block extra_head %}
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=places" type="text/javascript"></script>
<script src="{% static 'script/jquery-1.11.1.min.js' %}" type="text/javascript"></script>
<script src="{% static 'script/jquery.geocomplete.min.js' %}" type="text/javascript"></script>
{% endblock %}
{% block content %} {% block content %}
<p><a href="{% url 'monstage:index' %}">Retour</a></p> <p><a href="{% url 'monstage:index' %}">Retour</a></p>
<h1>Recherche</h1> <h1>Rechercher des stages</h1>
<p>La recherche de stage n'est pas encore disponible. Elle devrait l'être à la rentrée 2015 !</p> <div id="searchbox">
{% endblock %} <form action="{% url 'monstage:search' %}" method="get">
<p>Critères :</p>
{{ form.as_p }}
<div id="map_searchlieu"></div>
<script>
$(function(){
$("#addlieu").geocomplete({
map: "#map_searchlieu",
types: ["geocode", "establishment"],
}).on("geocode:result", function(event, result){ $("#map_searchlieu").css("display", "block"); digere(result); console.log(result); });
});
var fieldcount = {{ numforms }};
var places = $("#places");
var predata;
function digere (gdata) {
var data = {};
for (var i in gdata.address_components) {
var obj = gdata.address_components[i];
for (var j in obj.types) {
switch(obj.types[j]) {
case "locality":
data["ville"] = obj.long_name;
break;
case "country":
data["pays"] = obj.short_name;
break;
}
}
}
data["name"] = gdata.name;
data["longitude"] = gdata.geometry.location.lng();
data["latitude"] = gdata.geometry.location.lat();
// TODO set to hidden inputs
}
</script>
<input type="submit" action="submit" />
</form>
</div>
{% if resultats %}
<p>{{ resultats.length }} stage(s) trouvé(s)</p>
{% for stage in resultats %}
<div class="stagefound">
<h3><a href="{% url 'monstage:stage' stage.id %}">{{ stage.sujet }}</a></h3>
<p>Par {{ stage.profil_user }} à {% for lieu in stage.lieux.all %}{% if not forloop.first %}{% if forloop.last %} et {% else %}, {% endif %}{% endif %}{{ lieu.name }} ({{ lieu.ville }}){% endfor %}.</p>
</div>
{% endfor %}
{% endif %}
{% endblock %}

View file

@ -26,6 +26,7 @@
{% block content %} {% block content %}
<p><a href="{% url 'monstage:home' %}">Retour</a></p> <p><a href="{% url 'monstage:home' %}">Retour</a></p>
<h1>{{ stage.sujet }}</h1>
{% if modifiable %} {% if modifiable %}
<form action="{% url 'monstage:stage_publish' stage.id %}" method="post"> <form action="{% url 'monstage:stage_publish' stage.id %}" method="post">
{% csrf_token %} {% csrf_token %}
@ -39,7 +40,6 @@
</div> </div>
</form> </form>
{% endif %} {% endif %}
<h1>{{ stage.sujet }}</h1>
<div id="stage_present"> <div id="stage_present">
<div id="stage_map"></div> <div id="stage_map"></div>
<div id="stage_misc"> <div id="stage_misc">

View file

@ -12,7 +12,7 @@ from django.forms.widgets import HiddenInput
from monstage.models import * from monstage.models import *
def addslashes(s): def addslashes(s):
d = {'"':'\\"', "'":"\\'", "\0":"\\\0", "\\":"\\\\", '\n':'\\n'} d = {'"':'\\"', "\0":"\\\0", "\\":"\\\\", '\n':'\\n'}
return ''.join(d.get(c, c) for c in s) return ''.join(d.get(c, c) for c in s)
def index(request): def index(request):
@ -129,7 +129,7 @@ class LieuForm(forms.ModelForm):
class Meta: class Meta:
model = Lieu model = Lieu
fields = ("name", "ville", "pays") fields = ("name", "type_lieu", "ville", "pays")
def is_to_delete(self): def is_to_delete(self):
return self.cleaned_data['delete'] 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()] prevLieuxStage = [k for k in stage.lieustage_set.all()]
lieuforms = [] lieuforms = []
deleted = [] deleted = []
for i in range(0, int(request.POST['numplaces'])): for i in range(0, int(request.POST['numplaces'])): # Pour chaque lieu
toSave = False toSave = False
if request.POST.get('%d-name' % i, False): # Lieu à créer if request.POST.get('%d-name' % i, False): # Lieu à créer
bullshit += str(i) + 'a ' bullshit += str(i) + 'a '
@ -173,9 +173,9 @@ def stage_edit_lieu(request, stage_id):
valid = False valid = False
lieuforms.append(lieuform) lieuforms.append(lieuform)
continue 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 pass
else: else: # On crée un nouveau lieu
lieu = lieuform.save() lieu = lieuform.save()
lieu.save() lieu.save()
lieuform.save_m2m() lieuform.save_m2m()
@ -189,26 +189,26 @@ def stage_edit_lieu(request, stage_id):
valid = False valid = False
lieuforms.append(lieuform) lieuforms.append(lieuform)
continue 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: if len(prevLieuxStage) > 0:
deleted.append(prevLieuxStage.pop(0)) deleted.append(prevLieuxStage.pop(0))
else: else: # On récupère le lieu concerné
lieuforms.append(lieuform) lieuforms.append(lieuform)
lieu = Lieu.objects.get( pk = lieuform.cleaned_data['lieu_id'] ) lieu = Lieu.objects.get( pk = lieuform.cleaned_data['lieu_id'] )
toSave = True toSave = True
if toSave: # Mise à jour des liens lieu - stage if toSave: # Mise à jour des lieuStage
if len(prevLieuxStage) > 0: if len(prevLieuxStage) > 0: # On met à jour un lieuStage conservé (même lieu)
lieustage = prevLieuxStage.pop(0) lieustage = prevLieuxStage.pop(0)
lieustage.lieu = lieu lieustage.lieu = lieu
lieustage.save() 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 = deleted.pop(0)
lieustage.lieu = lieu lieustage.lieu = lieu
lieustage.save() lieustage.save()
else: else: # On en crée un nouveau
LieuStage.objects.create(lieu = lieu, stage = stage) LieuStage.objects.create(lieu = lieu, stage = stage)
if valid: if valid:
for lieustage in deleted: for lieustage in deleted: # On supprime effectivement les lieuStages non réutilisé
lieustage.delete() lieustage.delete()
return HttpResponseRedirect(reverse('monstage:stage_edit_feedback', args=(stage.id,))) return HttpResponseRedirect(reverse('monstage:stage_edit_feedback', args=(stage.id,)))
else: else:
@ -269,5 +269,39 @@ def detail(request, question_id):
# Recherche de stages # 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): def search(request):
return render(request, 'monstage/search.html') 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})