Skip to content

Commit 04abab6

Browse files
authored
Merge pull request mozboz#8 from webisteme/master
Django integration
2 parents 29e972c + 90db6d1 commit 04abab6

32 files changed

+1024
-273
lines changed

Makefile

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
virtualenv:
3+
[ -d .env ] || virtualenv .env
4+
.env/bin/pip install -r requirements.txt
5+
echo "Now type \"source .env/bin/activate\" to active python env"
6+
7+
8+
installpostgres:
9+
sudo apt-get install postgresql
10+
sudo -u postgres psql -c "CREATE USER tfm LOGIN ENCRYPTED PASSWORD 'password';"
11+
sudo -u postgres createdb tfm -O tfm
12+
13+
resetdb:
14+
sudo -u postgres dropdb tfm
15+
sudo -u postgres createdb tfm -O tfm
16+
make setupdb
17+
18+
setupdb:
19+
.env/bin/python manage.py migrate
20+
.env/bin/python manage.py createsuperuser
21+
22+
runserver:
23+
.env/bin/python runserver_plus

README.md

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,35 @@
1-
# transformapetl
2-
#
1+
# Transformap ETL
32

4-
1. Setup
3+
## Setup dev:
54

6-
pip install -r requirements.txt
7-
cp transformap.example.conf transformap.conf [+ add database credentials]
5+
make installpostgres
6+
make virtualenv
7+
make setupdb
8+
source .env/bin/activate
9+
make runserver
10+
11+
Refer to Makefile for further details; it should serve as a guide to how to
12+
manage the local Python development environment.
13+
14+
## Postgresql JSONB field support in Django
15+
16+
The JSON field support appears to be quite good, django's queryset API supports
17+
several operations for querying data inside JSONB fields.
18+
19+
See: https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#containment-and-key-operations
20+
21+
## Usage
22+
23+
python manage.py transformap -i jobs/jobfile.json
24+
25+
Admin interface: /admin
26+
API URL: /places-api/
27+
New jobs should be created as .YAML files in jobs/
28+
29+
## Misc
30+
31+
ETL business logic: places/management/commands
32+
REST API configuration: places/api.py
833

9-
2. Usage
1034

11-
python transformap.py -i jobs/charlotte.yaml
1235

jobs/osm.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@ transform:
2727
source_field_name: wheelchair
2828
target_field_name: wheelchair_accessible
2929
load:
30-
definition: "Convergir map"
31-
owner: "Convergir"
30+
definition: "OSM map"
31+
owner: "OSM"

logging.conf

Lines changed: 0 additions & 34 deletions
This file was deleted.

manage.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
5+
if __name__ == "__main__":
6+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tfm.settings")
7+
try:
8+
from django.core.management import execute_from_command_line
9+
except ImportError:
10+
# The above import may fail for some other reason. Ensure that the
11+
# issue is really that Django is missing to avoid masking other
12+
# exceptions on Python 2.
13+
try:
14+
import django
15+
except ImportError:
16+
raise ImportError(
17+
"Couldn't import Django. Are you sure it's installed and "
18+
"available on your PYTHONPATH environment variable? Did you "
19+
"forget to activate a virtual environment?"
20+
)
21+
raise
22+
execute_from_command_line(sys.argv)

places/admin.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from django.contrib import admin
2+
3+
from places.models import MapOwner, MapInstance, MapObject, MapData, \
4+
MapDefinition, SchemaField, SchemaVersion
5+
6+
7+
8+
class MapObjectAdmin(admin.ModelAdmin):
9+
list_display = ('id', 'map_instance', 'longitude', 'latitude', 'date_created')
10+
list_display_links = ('id', )
11+
12+
13+
class MapInstanceAdmin(admin.ModelAdmin):
14+
list_display = ('id', 'schema', 'map_definition', 'date_created')
15+
list_display_links = ('id',)
16+
17+
18+
class MapOwnerAdmin(admin.ModelAdmin):
19+
list_display = ('id', 'name', 'date_created',)
20+
list_display_links = ('id',)
21+
22+
23+
class MapDefinitionAdmin(admin.ModelAdmin):
24+
list_display = ('id', 'name', 'owner', 'date_created')
25+
list_display_links = ('id',)
26+
27+
28+
class SchemaFieldAdmin(admin.ModelAdmin):
29+
list_display = ('id', 'schema', 'field_name', 'field_type')
30+
list_display_links = ('id',)
31+
32+
33+
class SchemaVersionAdmin(admin.ModelAdmin):
34+
list_display = ('id', 'map_definition', 'map_owner', 'date_created')
35+
list_display_links = ('id',)
36+
37+
38+
class MapDataAdmin(admin.ModelAdmin):
39+
list_display = ('id', 'map_instance', 'map_object', 'schema_field')
40+
list_display_links = ('id',)
41+
42+
43+
44+
admin.site.register(MapObject, MapObjectAdmin)
45+
admin.site.register(MapInstance, MapInstanceAdmin)
46+
admin.site.register(MapOwner, MapOwnerAdmin)
47+
admin.site.register(MapDefinition, MapDefinitionAdmin)
48+
admin.site.register(SchemaField, SchemaFieldAdmin)
49+
admin.site.register(SchemaVersion, SchemaVersionAdmin)
50+
admin.site.register(MapData, MapDataAdmin)
51+

places/api.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
from places.models import MapOwner, MapInstance, MapObject, MapData, \
2+
MapDefinition, SchemaField, SchemaVersion
3+
4+
from rest_framework import filters, routers, serializers, viewsets
5+
6+
7+
# Map Owner
8+
9+
class MapOwnerSerializer(serializers.HyperlinkedModelSerializer):
10+
class Meta:
11+
model = MapOwner
12+
fields = ('name', 'date_created', 'date_modified')
13+
14+
class MapOwnerViewSet(viewsets.ModelViewSet):
15+
queryset = MapOwner.objects.all()
16+
serializer_class = MapOwnerSerializer
17+
18+
# Map Instance
19+
20+
class MapInstanceSerializer(serializers.HyperlinkedModelSerializer):
21+
class Meta:
22+
model = MapInstance
23+
fields = ('schema', 'map_definition', 'date_created', 'date_modified')
24+
25+
class MapInstanceViewSet(viewsets.ModelViewSet):
26+
queryset = MapInstance.objects.all()
27+
serializer_class = MapInstanceSerializer
28+
29+
# Map Object
30+
31+
class MapObjectSerializer(serializers.HyperlinkedModelSerializer):
32+
class Meta:
33+
model = MapObject
34+
fields = ('guid', 'map_instance', 'longitude', 'latitude', 'date_created', 'date_modified')
35+
36+
class MapObjectViewSet(viewsets.ModelViewSet):
37+
queryset = MapObject.objects.all()
38+
serializer_class = MapObjectSerializer
39+
40+
# Map Data
41+
42+
class MapDataSerializer(serializers.HyperlinkedModelSerializer):
43+
class Meta:
44+
model = MapData
45+
fields = ('map_instance', 'map_object', 'schema_field', 'field_value', 'date_created', 'date_modified')
46+
47+
class MapDataViewSet(viewsets.ModelViewSet):
48+
queryset = MapData.objects.all()
49+
serializer_class = MapDataSerializer
50+
51+
# Map Definition
52+
53+
class MapDefinitionSerializer(serializers.HyperlinkedModelSerializer):
54+
class Meta:
55+
model = MapDefinition
56+
fields = ('name', 'owner', 'date_created', 'date_modified')
57+
58+
class MapDefinitionViewSet(viewsets.ModelViewSet):
59+
queryset = MapDefinition.objects.all()
60+
serializer_class = MapDefinitionSerializer
61+
62+
# Schema Field
63+
64+
class SchemaFieldSerializer(serializers.HyperlinkedModelSerializer):
65+
class Meta:
66+
model = SchemaField
67+
fields = ('is_base_field', 'schema', 'field_name', 'field_type', 'field_description', 'date_created', 'date_modified')
68+
69+
class SchemaFieldViewSet(viewsets.ModelViewSet):
70+
queryset = SchemaField.objects.all()
71+
serializer_class = SchemaFieldSerializer
72+
73+
# Schema Version
74+
75+
class SchemaVersionSerializer(serializers.HyperlinkedModelSerializer):
76+
class Meta:
77+
model = SchemaVersion
78+
fields = ('map_definition', 'map_owner', 'date_created', 'date_modified')
79+
80+
class SchemaVersionViewSet(viewsets.ModelViewSet):
81+
queryset = SchemaVersion.objects.all()
82+
serializer_class = SchemaVersionSerializer
83+
84+
85+
86+
87+
router = routers.DefaultRouter()
88+
89+
router.register('map_owners', MapOwnerViewSet)
90+
router.register('map_instance', MapInstanceViewSet)
91+
router.register('map_object', MapObjectViewSet)
92+
router.register('map_data', MapDataViewSet)
93+
router.register('map_definition', MapDefinitionViewSet)
94+
router.register('schema_field', SchemaFieldViewSet)
95+
router.register('schema_version', SchemaVersionViewSet)
96+

places/apps.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from __future__ import unicode_literals
2+
3+
from django.apps import AppConfig
4+
5+
6+
class PlacesConfig(AppConfig):
7+
name = 'places'

places/management/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)