makinacorpus / django-mapentity

Generic CRUD for geographic data
https://django-mapentity.readthedocs.io/en/stable/
BSD 3-Clause "New" or "Revised" License
42 stars 21 forks source link

Add form to import data #97

Open leplatrem opened 9 years ago

leplatrem commented 9 years ago

Besoins :

Specs :

Notes :

gutard commented 9 years ago

Le format Shapefile est constitué de 4 fichiers, l'import d'un ZIP peut certainement faciliter l'utilisation

Bout de code que j'ai écrit pour un autre projet dont on peut éventuellement s'inspirer:

    def from_native(self, data, files=None):
        """Read a zip file containing a shapefile"""
        if files is None:
            return None
        try:
            unzipped = zipfile.ZipFile(files['file'])
        except zipfile.BadZipFile:
            self._errors = "Should be a .zip file."
            return
        tmpdir = tempfile.mkdtemp()
        try:
            unzipped.extractall(tmpdir)
            srs = SpatialReference(settings.COMPASS_DEFAULT_SRID)
            shp_name = None
            for name in unzipped.namelist():
                fullname = os.path.join(tmpdir, name)
                if os.path.splitext(name)[1].lower() == '.shp':
                    shp_name = fullname
                if os.path.splitext(name)[1].lower() == '.prj':
                    srs = None
            if shp_name is None:
                self._errors = "The .zip file should contain a .shp file."
                return
            points = []
            try:
                lm = LayerMapping(Point, shp_name,
                                  {'name': 'name', 'point': 'POINT'},
                                  source_srs=srs)
            except LayerMapError:
                lm = LayerMapping(Point, shp_name, {'point': 'POINT'},
                                  source_srs=srs)
            def faked_save(point, **kwargs):
                point.user = self.context['request'].user
                points.append(point)
            with patch.object(Point, 'save', faked_save):
                lm.save()
        finally:
            shutil.rmtree(tmpdir)
        return points
camillemonchicourt commented 8 years ago

Je retombe sur ça et je me pose une question du coup. Tout le framework d'import qui est en train d'être développé dans Geotrek ne devrait pas être en partie factorisé dans Mapentity ?