diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-05-04 20:49:15 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-05-04 20:49:15 +0200 | 
| commit | 8752c3258b67013cf4fa35f2d1c26685f1574d4f (patch) | |
| tree | 9018d9d6084885fa527cfa3859462e4d347ddba7 /chimere/admin.py | |
| parent | 4c22ae3b7b939a2d7a036e93939c22c3c27f82c2 (diff) | |
| download | Chimère-8752c3258b67013cf4fa35f2d1c26685f1574d4f.tar.bz2 Chimère-8752c3258b67013cf4fa35f2d1c26685f1574d4f.zip | |
Exports refactoring
Diffstat (limited to 'chimere/admin.py')
| -rw-r--r-- | chimere/admin.py | 78 | 
1 files changed, 3 insertions, 75 deletions
| diff --git a/chimere/admin.py b/chimere/admin.py index b6febd1..cfe3bf7 100644 --- a/chimere/admin.py +++ b/chimere/admin.py @@ -21,17 +21,10 @@  Settings for administration pages  """  import datetime -import tempfile -import unicodedata -import zipfile -from StringIO import StringIO  from django import forms  from django.conf import settings  from django.contrib import admin -from django.contrib.gis.gdal.libgdal import lgdal -from django.contrib.gis.gdal import Driver, OGRGeometry, OGRGeomType, \ -                                    SpatialReference, check_err  from django.http import HttpResponse  from django.shortcuts import render_to_response  from django.utils.translation import ugettext_lazy as _ @@ -42,7 +35,7 @@ from chimere.forms import MarkerAdminForm, RouteAdminForm, AreaAdminForm,\  from chimere.models import Category, Icon, SubCategory, Marker, \             PropertyModel, News, Route, Area, ColorTheme, Color, RouteFile,\             MultimediaType, MultimediaFile, PictureFile, Importer -from chimere.utils import unicode_normalize +from chimere.utils import unicode_normalize, ShapefileManager, KMLManager  from chimere.widgets import TextareaWidget  def get_areas_for_user(user): @@ -68,15 +61,9 @@ def export_to_kml(modeladmin, request, queryset):      u"""      Export data to KML      """ -    dct = {'name':settings.PROJECT_NAME, -           'description':unicode(datetime.date.today()), -           'locations':queryset.all() -    } -    result = render_to_response('chimere/export.kml', dct) +    filename, result = KMLManager.export(queryset)      response = HttpResponse(result,                          mimetype='application/vnd.google-earth.kml+xml') -    filename = unicode_normalize(settings.PROJECT_NAME + dct['description'] + \ -                                 '.kml')      response['Content-Disposition'] = 'attachment; filename=%s' % filename      return response  export_to_kml.short_description = _(u"Export to KML") @@ -85,66 +72,7 @@ def export_to_shapefile(modeladmin, request, queryset):      u"""      Export data to Shapefile      """ -    date = unicode(datetime.date.today()) - -    tmp = tempfile.NamedTemporaryFile(suffix='.shp', mode='w+b') -    tmp.close() - -    tmp_name = tmp.name -    field_names = [field.name for field in queryset.model._meta.fields] -    geo_field = getattr(queryset.model, -                        'point' if 'point' in field_names else 'route')._field - -    dr = Driver('ESRI Shapefile') -    ds = lgdal.OGR_Dr_CreateDataSource(dr._ptr, tmp_name, None) -    if ds is None: -        raise Exception(_(u'Could not create file!')) -    ogr_type = OGRGeomType(geo_field.geom_type).num -    srs = SpatialReference(geo_field.srid) - -    layer = lgdal.OGR_DS_CreateLayer(ds, 'lyr', srs._ptr, ogr_type, None) - -    for field_name in ('name', 'category'): -        fld = lgdal.OGR_Fld_Create(field_name, 4) -        added = lgdal.OGR_L_CreateField(layer, fld, 0) -        check_err(added) - -    feature_def = lgdal.OGR_L_GetLayerDefn(layer) - -    for item in queryset: -        # duplicate items when in several categories -        for category in item.categories.all(): -            feat = lgdal.OGR_F_Create(feature_def) -            lgdal.OGR_F_SetFieldString(feat, 0, -                                   str(unicode_normalize(item.name)[:80])) -            lgdal.OGR_F_SetFieldString(feat, 1, -                                   str(unicode_normalize(category.name)[:80])) - -            geom = getattr(item, geo_field.name) -            if not geom: -                continue -            ogr_geom = OGRGeometry(geom.wkt, srs) -            check_err(lgdal.OGR_F_SetGeometry(feat, ogr_geom._ptr)) -            check_err(lgdal.OGR_L_SetFeature(layer, feat)) -    # Cleaning up -    check_err(lgdal.OGR_L_SyncToDisk(layer)) -    lgdal.OGR_DS_Destroy(ds) -    lgdal.OGRCleanupAll() - -    # writing to a zip file -    filename = unicode_normalize(settings.PROJECT_NAME) + '-' + date -    buff = StringIO() -    zip_file = zipfile.ZipFile(buff, 'w', zipfile.ZIP_DEFLATED) -    suffixes = ['shp', 'shx', 'prj', 'dbf'] -    for suffix in suffixes: -        name = tmp_name.replace('.shp', '.' + suffix) -        arcname = '.'.join((filename, suffix)) -        zip_file.write(name, arcname=arcname) -    zip_file.close() -    buff.flush() -    zip_stream = buff.getvalue() -    buff.close() - +    filename, zip_stream = ShapefileManager.export(queryset)      # Stick it all in a django HttpResponse      response = HttpResponse()      response['Content-Disposition'] = 'attachment; filename=%s.zip' % filename | 
