Skip to content

Commit

Permalink
more specific field types
Browse files Browse the repository at this point in the history
  • Loading branch information
sheppard committed Jan 3, 2017
1 parent 6918905 commit 237c07a
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 16 deletions.
1 change: 1 addition & 0 deletions rest/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -534,5 +534,6 @@ def version(self):
vfile.close()
return self._version


# Default router instance, c.f. django.contrib.admin.sites.site
router = ModelRouter()
32 changes: 21 additions & 11 deletions rest/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.contrib.gis.db import models as model_fields
from django.contrib.gis.geos import GEOSGeometry
from django.utils import timezone
from collections import OrderedDict

from django.conf import settings

Expand Down Expand Up @@ -61,17 +62,18 @@ def to_representation(self, value):


class BaseModelSerializer(JSONFormSerializer, serializers.ModelSerializer):
xlsform_types = {
serializers.FileField: 'binary',
serializers.DateField: 'date',
serializers.DateTimeField: 'dateTime',
serializers.FloatField: 'decimal',
GeometryField: 'geoshape',
serializers.IntegerField: 'int',
serializers.CharField: 'string',
serializers.ChoiceField: 'select1',
serializers.TimeField: 'time',
}
xlsform_types = OrderedDict((
(serializers.ImageField, 'image'),
(serializers.FileField, 'binary'),
(serializers.DateField, 'date'),
(serializers.DateTimeField, 'dateTime'),
(serializers.FloatField, 'decimal'),
(GeometryField, 'geoshape'),
(serializers.IntegerField, 'int'),
(serializers.CharField, 'string'),
(serializers.ChoiceField, 'select1'),
(serializers.TimeField, 'time'),
))

def get_fields_for_config(self):
fields = self.get_fields()
Expand Down Expand Up @@ -160,6 +162,14 @@ def get_wq_field_info(self, name, field):
if isinstance(field, field_type):
info['type'] = xlsform_type
break
if info['type'] == 'geoshape':
source = self.Meta.model._meta.get_field(name)
geom_type = getattr(source, 'geom_type', None)
if geom_type == 'POINT':
info['type'] = 'geopoint'
elif geom_type == 'LINESTRING':
info['type'] = 'geotrace'

return info

def get_wq_foreignkey_info(self, model):
Expand Down
24 changes: 20 additions & 4 deletions tests/rest_app/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.db import models
from django.contrib.gis.db.models import GeometryField, GeoManager
from django.contrib.gis.db import models
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from wq.db.patterns.models import LabelModel
Expand Down Expand Up @@ -61,9 +60,26 @@ class Item(LabelModel):

class GeometryModel(LabelModel):
name = models.CharField(max_length=255)
geometry = GeometryField(srid=settings.SRID)
geometry = models.GeometryField(srid=settings.SRID)

objects = GeoManager()
objects = models.GeoManager()


class PointModel(LabelModel):
name = models.CharField(max_length=255)
geometry = models.PointField(srid=settings.SRID)

objects = models.GeoManager()


class FileModel(LabelModel):
name = models.CharField(max_length=255)
file = models.FileField(upload_to='files')


class ImageModel(LabelModel):
name = models.CharField(max_length=255)
image = models.ImageField(upload_to='files')


class SlugModel(LabelModel):
Expand Down
15 changes: 14 additions & 1 deletion tests/rest_app/rest.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from wq.db import rest
from .models import (
RootModel, UserManagedModel, Parent, Child, ItemType, Item, GeometryModel,
RootModel, UserManagedModel, Parent, Child, ItemType, Item,
GeometryModel, PointModel, FileModel, ImageModel,
SlugModel, SlugRefParent, SlugRefChild,
DateModel, ChoiceModel, TranslatedModel,
)
Expand Down Expand Up @@ -44,6 +45,18 @@
GeometryModel,
fields="__all__",
)
rest.router.register_model(
PointModel,
fields="__all__",
)
rest.router.register_model(
FileModel,
fields="__all__",
)
rest.router.register_model(
ImageModel,
fields="__all__",
)
rest.router.register_model(
SlugModel,
lookup="code",
Expand Down
17 changes: 17 additions & 0 deletions tests/test_rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,23 @@ def test_rest_config_json_label(self):
pconf['label_template'],
)

def test_rest_config_subtype(self):
conf = self.get_config('geometrymodel')
field = self.get_field(conf, 'geometry')
self.assertEqual(field['type'], 'geoshape')

conf = self.get_config('pointmodel')
field = self.get_field(conf, 'geometry')
self.assertEqual(field['type'], 'geopoint')

conf = self.get_config('filemodel')
field = self.get_field(conf, 'file')
self.assertEqual(field['type'], 'binary')

conf = self.get_config('imagemodel')
field = self.get_field(conf, 'image')
self.assertEqual(field['type'], 'image')

# Test url="" use case
def test_rest_list_at_root(self):
response = self.client.get("/.json")
Expand Down

0 comments on commit 237c07a

Please sign in to comment.