Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add form to import data #97

Open
leplatrem opened this issue Oct 18, 2014 · 2 comments
Open

Add form to import data #97

leplatrem opened this issue Oct 18, 2014 · 2 comments

Comments

@leplatrem
Copy link
Collaborator

Besoins :

  • Permettre aux utilisateurs de charger leurs propres jeux de données
  • Faciliter la mise en place des instances client après livraison des jeux de données répondant aux critères

Specs :

  • Un formulaire permet de charger un fichier Shapefile|GeoJSON pour une entité (ex : tronçons dans Geotrek)
  • À la sélection du fichier source, la liste des colonnes est lue et présentée
  • Dans une première version, seules les colonnes dont le nom et le type correspondent à celles attendues seront utilisées
  • Si les attributs obligatoires ne sont pas présents dans le fichier, un message avertit l'utilisateur en présentant les détails (nom de l'attribut, type attendu, ...)
  • Le formulaire doit permettre à l'utilisateur de choisir ce qu'il adviendra des enregistrements existants et manquants (ex : supprimer les enregistrements qui ne sont pas dans le fichier, conserver ou écraser les enregistrements existants, créer ou ignorer les nouveaux, etc.)

Notes :

  • Un mécanisme doit permettre de spécifier la classe de déserialization (ex: topologies dans Geotrek, c.f. command loadpoi)
  • Le format Shapefile est constitué de 4 fichiers, l'import d'un ZIP peut certainement faciliter l'utilisation
  • La suppression d'enregistrements peut entrainer des suppressions en cascade : il faut avertir l'utilisateur
  • L'import des fichiers joints en masse semble difficile à envisager (formalisme, volume!)
  • Le mécanisme d'import doit être générique et doit pouvoir être mis en commun avec l'import en ligne de commande
  • Le formulaire pourrait être générique et doit pouvoir être utilisé dans l'adminsite pour les données qui ne sont pas des entités (ex : communes dans Geotrek)
@gutard
Copy link
Collaborator

gutard commented Oct 21, 2014

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
Copy link
Contributor

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 ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants