Search code examples
tastypiegeodjango

Error add geometry in method POST Django-Tastypie


I have the following model with spatial support:

class Incidencia(gismodels.Model):
    nombre = models.CharField("Nombre", max_length=45)
    descripcion = models.TextField("Descripción", max_length=100)
    multimedia = models.ImageField("Evidencia multimedia", upload_to="evidencia")
    fecha = models.DateTimeField("Fecha de reporte",default=datetime.now,null=True, blank=True)

    geom = gismodels.PointField("Ubicación")
    objects = gismodels.GeoManager()

    class Meta:
        verbose_name = 'Incidencia'
        verbose_name_plural = "Incidencias"
        ordering = ["-fecha", "-nombre"]

However when trying to add an incidencia such as:

<form enctype="multipart/form-data" method="post" id="add_incidencia" name="add_incidencia" id="addincidencia">
    Nombre <input type="text" name="nombre">
    Descripcion <textarea name="descripcion"></textarea>
    Imagen <input type="file" name="multimedia">
    Geometria <input type="text" name="geom">
    <input type="submit" value="Submit">
</form>

with the values in:

curl -F "nombre=Incidencia 1" "descripcion=descripcion incidencia" -F "multimedia=@/home/samtux/valla.png" -F "geom={"coordinates":[-74.05016606562,4.6821406310872],"type":"Point"}" http://0.0.0.0:8000/api/v1/incidencia/

``` It returns the following error message:

{"error_message": "String or unicode input unrecognized as WKT EWKT, and HEXEWKB.", "traceback": "Traceback (most recent call last):\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/tastypie/resources.py\", line 201, in wrapper\n    response = callback(request, *args, **kwargs)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/tastypie/resources.py\", line 432, in dispatch_list\n    return self.dispatch('list', request, **kwargs)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/tastypie/resources.py\", line 464, in dispatch\n    response = method(request, **kwargs)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/tastypie/resources.py\", line 1340, in post_list\n    updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs))\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/tastypie/resources.py\", line 2104, in obj_create\n    return self.save(bundle)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/tastypie/resources.py\", line 2250, in save\n    bundle.obj.save()\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/db/models/base.py\", line 545, in save\n    force_update=force_update, update_fields=update_fields)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/db/models/base.py\", line 573, in save_base\n    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/db/models/base.py\", line 654, in _save_table\n    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/db/models/base.py\", line 687, in _do_insert\n    using=using, raw=raw)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/db/models/manager.py\", line 232, in _insert\n    return insert_query(self.model, objs, fields, **kwargs)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/db/models/query.py\", line 1510, in insert_query\n    query.insert_values(fields, objs, raw=raw)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/db/models/sql/subqueries.py\", line 212, in insert_values\n    value = getattr(obj, field.attname)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/contrib/gis/db/models/proxy.py\", line 40, in __get__\n    geom = self._klass(geom_value)\n\n  File \"/home/samtux/.virtualenvs/sdaVirtual/lib/python2.7/site-packages/django/contrib/gis/geos/geometry.py\", line 79, in __init__\n    raise ValueError('String or unicode input unrecognized as WKT EWKT, and HEXEWKB.')\n\nValueError: String or unicode input unrecognized as WKT EWKT, and HEXEWKB.\n"}

How I can send the geometry to the new event because I need to implement this multipart form to upload the image?.


Solution

  • I have seen that the error was caused by MultipartResource, since the geometry is handled as a string. So I made some modification from geom field in form as WKT "POINT (lat long)" and then convert it to as GeoJSON:

    class MultipartResource(object):
        def deserialize(self, request, data, format=None):
            if not format:
                format = request.META.get('CONTENT_TYPE', 'application/json')
    
            if format == 'application/x-www-form-urlencoded':
                return request.POST
    
            if format.startswith('multipart'):
                data = request.POST.copy()
                data.update(request.FILES)
                geom = simplejson.loads(GEOSGeometry(request.POST["geom"]).geojson) 
                request.POST["geom"] = geom
                data.update(request.POST)
                return data
    
            return super(MultipartResource, self).deserialize(request, data, format)