experiENS/avisstage/api.py

92 lines
3.2 KiB
Python
Raw Normal View History

2017-04-16 00:03:04 +02:00
# coding: utf-8
from tastypie.resources import ModelResource
2017-04-20 23:04:07 +02:00
from avisstage.models import Lieu, Stage, Normalien, StageMatiere
from tastypie.authentication import SessionAuthentication
2017-04-16 00:03:04 +02:00
from django.contrib.gis import geos
2017-04-20 23:04:07 +02:00
from tastypie import fields, utils
2017-04-16 00:03:04 +02:00
2017-04-25 22:02:23 +02:00
from django.urls import reverse
2017-04-16 00:03:04 +02:00
class LieuResource(ModelResource):
2017-04-20 23:04:07 +02:00
stages = fields.ToManyField("avisstage.api.StageResource", "stages", use_in="detail", full=True)
2017-04-16 00:03:04 +02:00
class Meta:
queryset = Lieu.objects.all()
resource_name = "lieu"
fields = ["nom", "pays", "coord", "type_lieu", "id"]
2017-04-20 23:04:07 +02:00
authentication = SessionAuthentication()
2017-04-19 01:56:15 +02:00
def build_filters(self, filters=None, **kwargs):
2017-04-16 00:03:04 +02:00
if filters is None:
filters = {}
2017-04-20 23:04:07 +02:00
orm_filters = super(LieuResource, self).build_filters(filters, **kwargs)
2017-04-16 00:03:04 +02:00
if "lng" in filters and "lat" in filters:
lat = float(filters['lat'])
lng = float(filters['lng'])
pt = geos.Point((lng,lat), srid=4326)
self.reference_point = pt
orm_filters['coord__distance_lte'] = (pt, 50)
if "has_stage" in filters:
orm_filters['stages__public'] = True
2017-04-16 00:03:04 +02:00
return orm_filters
def dehydrate(self, bundle):
bundle = super(LieuResource, self).dehydrate(bundle)
obj = bundle.obj
bundle.data['coord'] = {'lat': float(obj.coord.y),
'lng': float(obj.coord.x)}
if "lat" in bundle.request.GET and "lng" in bundle.request.GET:
bundle.data['distance'] = self.reference_point.distance(bundle.obj.coord)
bundle.data["pays_nom"] = obj.get_pays_display()
bundle.data["type_lieu_nom"] = obj.get_type_lieu_display()
2017-04-20 23:04:07 +02:00
bundle.data["num_stages"] = obj.stages.filter(public=True).count()
return bundle
class StageResource(ModelResource):
class Meta:
queryset = Stage.objects.filter(public=True)
resource_name = "stage"
fields = ["sujet", "date_debut", "date_fin", "matieres", "id"]
authentication = SessionAuthentication()
def build_filters(self, filters=None, **kwargs):
if filters is None:
filters = {}
orm_filters = super(StageResource, self).build_filters(filters, **kwargs)
if "lieux" in filters:
flieux = map(int, filters['lieux'].split(','))
orm_filters['lieux__id__in'] = flieux
return orm_filters
def dehydrate(self, bundle):
bundle = super(StageResource, self).dehydrate(bundle)
obj = bundle.obj
bundle.data['auteur'] = obj.auteur.nom
bundle.data['thematiques'] = list(obj.thematiques.all().values_list("name", flat=True))
bundle.data['matieres'] = list(obj.matieres.all().values_list("nom", flat=True))
2017-04-25 22:02:23 +02:00
bundle.data['url'] = reverse("avisstage:stage", kwargs={"pk": obj.id});
2017-04-16 00:03:04 +02:00
return bundle
2017-04-20 23:04:07 +02:00
class AuteurResource(ModelResource):
stages = fields.ToManyField("avisstage.api.StageResource", "stages", use_in="detail")
class Meta:
queryset = Normalien.objects.all()
resource_name = "profil"
fields = ["id", "nom", "stages"]
authentication = SessionAuthentication()