Skip to content

Commit

Permalink
Add more properties on POI JSON detail
Browse files Browse the repository at this point in the history
  • Loading branch information
leplatrem committed Sep 9, 2014
1 parent 1ca38fc commit 1cf30a4
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 83 deletions.
19 changes: 19 additions & 0 deletions geotrek/altimetry/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from rest_framework import serializers as rest_serializers
from django.core.urlresolvers import reverse

from geotrek.core.models import AltimetryMixin


class AltimetrySerializerMixin(rest_serializers.ModelSerializer):
elevation_area_url = rest_serializers.SerializerMethodField('get_elevation_area_url')
altimetric_profile = rest_serializers.SerializerMethodField('get_altimetric_profile_url')

class Meta:
fields = ('elevation_area_url', 'altimetric_profile') + \
tuple(AltimetryMixin.COLUMNS)

def get_elevation_area_url(self, obj):
return reverse('trekking:trek_elevation_area', kwargs={'pk': obj.pk})

def get_altimetric_profile_url(self, obj):
return reverse('trekking:trek_profile', kwargs={'pk': obj.pk})
57 changes: 57 additions & 0 deletions geotrek/common/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from django.core.urlresolvers import reverse
from django.db import models as django_db_models

from rest_framework import serializers as rest_serializers
from rest_framework import serializers as rest_fields


class TranslatedModelSerializer(rest_serializers.ModelSerializer):
def get_field(self, model_field):
kwargs = {}
if issubclass(
model_field.__class__,
(django_db_models.CharField,
django_db_models.TextField)):
if model_field.null:
kwargs['allow_none'] = True
kwargs['max_length'] = getattr(model_field, 'max_length')
return rest_fields.CharField(**kwargs)
return super(TranslatedModelSerializer, self).get_field(model_field)


class PictogramSerializerMixin(rest_serializers.ModelSerializer):
pictogram = rest_serializers.Field('get_pictogram_url')


class PicturesSerializerMixin(rest_serializers.ModelSerializer):
thumbnail = rest_serializers.Field(source='serializable_thumbnail')
pictures = rest_serializers.Field(source='serializable_pictures')

class Meta:
fields = ('thumbnail', 'pictures',)


class PublishableSerializerMixin(rest_serializers.ModelSerializer):
slug = rest_serializers.Field(source='slug')
published_status = rest_serializers.Field(source='published_status')

map_image_url = rest_serializers.Field(source='map_image_url')
printable = rest_serializers.SerializerMethodField('get_printable_url')
filelist_url = rest_serializers.SerializerMethodField('get_filelist_url')

def get_printable_url(self, obj):
appname = obj._meta.app_label
modelname = obj._meta.module_name
return reverse('%s:%s_printable' % (appname, modelname),
kwargs={'pk': obj.pk})

def get_filelist_url(self, obj):
appname = obj._meta.app_label
modelname = obj._meta.module_name
return reverse('get_attachments', kwargs={'app_label': appname,
'module_name': modelname,
'pk': obj.pk})

class Meta:
fields = ('name', 'slug', 'published', 'published_status', 'publication_date',
'map_image_url', 'filelist_url', 'printable')
95 changes: 12 additions & 83 deletions geotrek/trekking/serializers.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import json

import gpxpy
from django.db import models as django_db_models
from django.conf import settings
from django.core.urlresolvers import reverse
from rest_framework import serializers as rest_serializers

from rest_framework import serializers as rest_fields
from mapentity.serializers import GPXSerializer

from geotrek.core.models import AltimetryMixin
from geotrek.common.serializers import (PictogramSerializerMixin,
TranslatedModelSerializer, PicturesSerializerMixin,
PublishableSerializerMixin)
from geotrek.zoning.serializers import (DistrictSerializer, CitySerializer)
from geotrek.altimetry.serializers import AltimetrySerializerMixin
from geotrek.trekking import models as trekking_models
from geotrek.zoning import models as zoning_models


class TrekGPXSerializer(GPXSerializer):
Expand All @@ -26,82 +27,6 @@ def end_object(self, trek):
self.gpx.waypoints.append(wpt)


class TranslatedModelSerializer(rest_serializers.ModelSerializer):
def get_field(self, model_field):
kwargs = {}
if issubclass(
model_field.__class__,
(django_db_models.CharField,
django_db_models.TextField)):
if model_field.null:
kwargs['allow_none'] = True
kwargs['max_length'] = getattr(model_field, 'max_length')
return rest_fields.CharField(**kwargs)
return super(TranslatedModelSerializer, self).get_field(model_field)


class AltimetrySerializerMixin(rest_serializers.ModelSerializer):
elevation_area_url = rest_serializers.SerializerMethodField('get_elevation_area_url')
altimetric_profile = rest_serializers.SerializerMethodField('get_altimetric_profile_url')

class Meta:
fields = ('elevation_area_url', 'altimetric_profile') + \
tuple(AltimetryMixin.COLUMNS)

def get_elevation_area_url(self, obj):
return reverse('trekking:trek_elevation_area', kwargs={'pk': obj.pk})

def get_altimetric_profile_url(self, obj):
return reverse('trekking:trek_profile', kwargs={'pk': obj.pk})


class PictogramSerializerMixin(rest_serializers.ModelSerializer):
pictogram = rest_serializers.Field('get_pictogram_url')


class PicturesSerializerMixin(rest_serializers.ModelSerializer):
thumbnail = rest_serializers.Field(source='serializable_thumbnail')
pictures = rest_serializers.Field(source='serializable_pictures')

class Meta:
fields = ('thumbnail', 'pictures',)


class PublishableSerializerMixin(rest_serializers.ModelSerializer):
slug = rest_serializers.Field(source='slug')
published_status = rest_serializers.Field(source='published_status')

map_image_url = rest_serializers.Field(source='map_image_url')
printable = rest_serializers.SerializerMethodField('get_printable_url')
filelist_url = rest_serializers.SerializerMethodField('get_filelist_url')

def get_printable_url(self, obj):
return reverse('trekking:trek_printable', kwargs={'pk': obj.pk})

def get_filelist_url(self, obj):
return reverse('get_attachments', kwargs={'app_label': 'trekking',
'module_name': 'trek',
'pk': obj.pk})

class Meta:
fields = ('name', 'slug', 'published', 'published_status', 'publication_date',
'map_image_url', 'filelist_url', 'printable')


class CitySerializer(rest_serializers.ModelSerializer):

class Meta:
model = zoning_models.City
fields = ('code', 'name')


class DistrictSerializer(rest_serializers.ModelSerializer):

class Meta:
model = zoning_models.District
fields = ('id', 'name')


class DifficultyLevelSerializer(PictogramSerializerMixin, TranslatedModelSerializer):
label = rest_serializers.Field(source='difficulty')

Expand Down Expand Up @@ -189,11 +114,12 @@ class Meta:
class TrekSerializer(PublishableSerializerMixin, PicturesSerializerMixin,
AltimetrySerializerMixin, TranslatedModelSerializer):

cities = CitySerializer(many=True)
districts = DistrictSerializer(many=True)

duration_pretty = rest_serializers.Field(source='duration_pretty')
difficulty = DifficultyLevelSerializer()
route = RouteSerializer()
cities = CitySerializer(many=True)
districts = DistrictSerializer(many=True)
information_desks = InformationDeskSerializer(many=True)
networks = NetworkSerializer(many=True)
themes = ThemeSerializer(many=True)
Expand Down Expand Up @@ -257,11 +183,14 @@ class Meta:

class POISerializer(PublishableSerializerMixin, PicturesSerializerMixin,
AltimetrySerializerMixin, TranslatedModelSerializer):
cities = CitySerializer(many=True)
districts = DistrictSerializer(many=True)

type = POITypeSerializer()

class Meta:
model = trekking_models.Trek
fields = ('id', 'description', 'type') + \
fields = ('id', 'description', 'type', 'cities', 'districts') + \
AltimetrySerializerMixin.Meta.fields + \
PublishableSerializerMixin.Meta.fields + \
PicturesSerializerMixin.Meta.fields
34 changes: 34 additions & 0 deletions geotrek/trekking/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,43 @@ def test_name(self):
self.assertEqual(self.result['name'],
self.poi.name)

def test_slug(self):
self.assertEqual(self.result['slug'],
self.poi.slug)

def test_published(self):
self.assertEqual(self.result['published'], False)

def test_published_status(self):
self.assertDictEqual(self.result['published_status'][0],
{u'lang': u'en', u'status': False, u'language': u'English'})

def test_type(self):
self.assertDictEqual(self.result['type'],
{'id': self.poi.type.pk,
'label': self.poi.type.label,
'pictogram': os.path.join(settings.MEDIA_URL, self.poi.type.pictogram.name),
})

def test_altimetry(self):
self.assertEqual(self.result['min_elevation'], 0.0)

def test_cities(self):
self.assertDictEqual(self.result['cities'][0],
{u"code": self.city.code,
u"name": self.city.name})

def test_districts(self):
self.assertDictEqual(self.result['districts'][0],
{u"id": self.district.id,
u"name": self.district.name})

def test_related_urls(self):
self.assertEqual(self.result['map_image_url'],
'/image/poi-%s.png' % self.pk)
self.assertEqual(self.result['filelist_url'],
'/paperclip/get/trekking/poi/%s/' % self.pk)


class TrekViewsTest(CommonTest):
model = Trek
Expand Down Expand Up @@ -387,6 +417,10 @@ def test_thumbnail(self):
self.assertEqual(self.result['thumbnail'],
os.path.join(settings.MEDIA_URL, self.attachment.attachment_file.name) + '.120x120_q85_crop.png')

def test_published_status(self):
self.assertDictEqual(self.result['published_status'][0],
{u'lang': u'en', u'status': True, u'language': u'English'})

def test_pictures(self):
self.assertDictEqual(self.result['pictures'][0],
{u'url': os.path.join(settings.MEDIA_URL, self.attachment.attachment_file.name) + '.800x800_q85.png',
Expand Down
25 changes: 25 additions & 0 deletions geotrek/zoning/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from rest_framework import serializers as rest_serializers

from geotrek.zoning import models as zoning_models


class CitySerializer(rest_serializers.ModelSerializer):

class Meta:
model = zoning_models.City
fields = ('code', 'name')


class DistrictSerializer(rest_serializers.ModelSerializer):

class Meta:
model = zoning_models.District
fields = ('id', 'name')


class RestrictedAreaSerializer(rest_serializers.ModelSerializer):
type = rest_serializers.Field(source='area_type.name')

class Meta:
model = zoning_models.RestrictedArea
fields = ('id', 'name', 'type')

0 comments on commit 1cf30a4

Please sign in to comment.