diff options
Diffstat (limited to 'chimere/utils.py')
| -rw-r--r-- | chimere/utils.py | 86 | 
1 files changed, 80 insertions, 6 deletions
| diff --git a/chimere/utils.py b/chimere/utils.py index 3266548..09255d0 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -21,20 +21,24 @@  Utilitaries  """ +import datetime  import os -import tempfile  import re +import StringIO +import tempfile  import urllib2  import unicodedata  import zipfile -import StringIO  from lxml import etree  from osgeo import osr  from django.conf import settings -from django.contrib.gis.gdal import DataSource +from django.contrib.gis.gdal import DataSource, Driver, OGRGeometry, \ +                                    OGRGeomType, SpatialReference, check_err +from django.contrib.gis.gdal.libgdal import lgdal  from django.core.exceptions import ObjectDoesNotExist +from django.shortcuts import render_to_response  from django.utils.translation import ugettext_lazy as _  from chimere import get_version @@ -192,13 +196,21 @@ class KMLManager(ImportManager):                      m.categories.add(cat)          return (new_item, updated_item, msg) +    @classmethod +    def export(cls, queryset): +        dct = {'name':settings.PROJECT_NAME, +               'description':unicode(datetime.date.today()), +               'locations':queryset.all() +        } +        filename = unicode_normalize(settings.PROJECT_NAME + dct['description']\ +                                     + '.kml') +        result = render_to_response('chimere/export.kml', dct) +        return filename, result +  class ShapefileManager(ImportManager):      u"""      Shapefile importer      """ -    def __init__(self, importer_instance): -        self.importer_instance = importer_instance -      def get(self, source=None):          u"""          Get data from the source @@ -306,6 +318,68 @@ class ShapefileManager(ImportManager):              os.removedirs(dr)          return (new_item, updated_item, msg) +    @classmethod +    def export(cls, queryset): +        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.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() +        return filename, zip_stream  RE_NODE = re.compile('node\[([^\]]*)\]') | 
