# coding: utf-8 from tastypie.resources import ModelResource from avisstage.models import Lieu, Stage, Normalien, StageMatiere from tastypie.authentication import SessionAuthentication from django.contrib.gis import geos from tastypie import fields, utils from django.urls import reverse class LieuResource(ModelResource): stages = fields.ToManyField("avisstage.api.StageResource", "stages", use_in="detail", full=True) class Meta: queryset = Lieu.objects.all() resource_name = "lieu" fields = ["nom", "ville", "pays", "coord", "type_lieu", "id"] authentication = SessionAuthentication() def build_filters(self, filters=None, **kwargs): if filters is None: filters = {} orm_filters = super(LieuResource, self).build_filters(filters, **kwargs) 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 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() 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)) bundle.data['url'] = reverse("avisstage:stage", kwargs={"pk": obj.id}); return bundle 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()