î
ªÍ X‚#  ã               @   s¶   d  Z  d d l m Z d d l m Z m Z m Z m Z m Z m	 Z	 m
 Z
 d d l m Z d d l m Z d d d d d	 „ Z d
 d „  Z d d d d d d d d d d d „	 Z d S)z 
This module is for inspecting OGR data sources and generating either
models for GeoDjango and/or mapping dictionaries for use with the
`LayerMapping` utility.
é    )Ú
DataSource)ÚOFTDateÚOFTDateTimeÚ
OFTIntegerÚOFTInteger64ÚOFTRealÚ	OFTStringÚOFTTime)Úsix)ÚzipZgeomFc             C   sÐ   t  |  t j ƒ r! t |  ƒ }  n t  |  t ƒ r3 n t d ƒ ‚ i  } xN |  | j D]? } | j ƒ  } | d d … d k rˆ | d 7} n  | | | <qS W|  | j } | r¶ | j ƒ  n  t	 | ƒ j
 ƒ  | | <| S)aÜ  
    Given a DataSource, generates a dictionary that may be used
    for invoking the LayerMapping utility.

    Keyword Arguments:
     `geom_name` => The name of the geometry field to use for the model.

     `layer_key` => The key for specifying which layer in the DataSource to use;
       defaults to 0 (the first layer).  May be an integer index or a string
       identifier for the layer.

     `multi_geom` => Boolean (default: False) - specify as multigeometry.
    z>Data source parameter must be a string or a DataSource object.é   NÚ_Úfieldéÿÿÿÿ)Ú
isinstancer
   Ústring_typesr   Ú	TypeErrorÚfieldsÚlowerÚ	geom_typeÚto_multiÚstrÚupper)Údata_sourceÚ	geom_nameÚ	layer_keyÚ
multi_geomÚ_mappingr   ÚmfieldÚgtype© r    úQ/home/ubuntu/projects/ifolica/build/django/django/contrib/gis/utils/ogrinspect.pyÚmapping   s     r"   c              O   s#   d j  d d „  t |  | Ž  Dƒ ƒ S)a¢
  
    Given a data source (either a string or a DataSource object) and a string
    model name this function will generate a GeoDjango model.

    Usage:

    >>> from django.contrib.gis.utils import ogrinspect
    >>> ogrinspect('/path/to/shapefile.shp','NewModel')

    ...will print model definition to stout

    or put this in a python script and use to redirect the output to a new
    model like:

    $ python generate_model.py > myapp/models.py

    # generate_model.py
    from django.contrib.gis.utils import ogrinspect
    shp_file = 'data/mapping_hacks/world_borders.shp'
    model_name = 'WorldBorders'

    print(ogrinspect(shp_file, model_name, multi_geom=True, srid=4326,
                     geom_name='shapes', blank=True))

    Required Arguments
     `datasource` => string or DataSource object to file pointer

     `model name` => string of name of new model class to create

    Optional Keyword Arguments
     `geom_name` => For specifying the model name for the Geometry Field.
       Otherwise will default to `geom`

     `layer_key` => The key for specifying which layer in the DataSource to use;
       defaults to 0 (the first layer).  May be an integer index or a string
       identifier for the layer.

     `srid` => The SRID to use for the Geometry Field.  If it can be determined,
       the SRID of the datasource is used.

     `multi_geom` => Boolean (default: False) - specify as multigeometry.

     `name_field` => String - specifies a field name to return for the
       `__unicode__`/`__str__` function (which will be generated if specified).

     `imports` => Boolean (default: True) - set to False to omit the
       `from django.contrib.gis.db import models` code from the
       autogenerated models thus avoiding duplicated imports when building
       more than one model by batching ogrinspect()

     `decimal` => Boolean or sequence (default: False).  When set to True
       all generated model fields corresponding to the `OFTReal` type will
       be `DecimalField` instead of `FloatField`.  A sequence of specific
       field names to generate as `DecimalField` may also be used.

     `blank` => Boolean or sequence (default: False).  When set to True all
       generated model fields will have `blank=True`.  If the user wants to
       give specific fields to have blank, then a list/tuple of OGR field
       names may be used.

     `null` => Boolean (default: False) - When set to True all generated
       model fields will have `null=True`.  If the user wants to specify
       give specific fields to have null, then a list/tuple of OGR field
       names may be used.

    Note: This routine calls the _ogrinspect() helper to do the heavy lifting.
    Ú
c             s   s   |  ] } | Vq d  S)Nr    )Ú.0Úsr    r    r!   ú	<genexpr>y   s    zogrinspect.<locals>.<genexpr>)ÚjoinÚ_ogrinspect)ÚargsÚkwargsr    r    r!   Ú
ogrinspect5   s    Dr+   NTc             #   sW  t  |  t j ƒ r! t |  ƒ }  n t  |  t ƒ r3 n t d ƒ ‚ |  | } | j ‰ ‡ f d d †  } | |
 ƒ ‰ | |	 ƒ ‰  | | ƒ } ‡  ‡ f d d †  } | rµ d Vd Vd Vn  d	 | Vx¾t ˆ | j | j | j	 ƒ D]ž\ } } } } | j
 ƒ  } | d d … d k r| d 7} n  | | ƒ } | t k r|| j
 ƒ  | k r`d | | | | f Vq{d | | d d … f VqÝ | t k r¤d | | d d … f VqÝ | t k rÌd | | d d … f VqÝ | t k ríd | | | f VqÝ | t k rd | | d d … f VqÝ | t k r=d | | d d … f VqÝ | t k red | | d d … f VqÝ t d | | f ƒ ‚ qÝ W| j } | r›| j ƒ  n  | j } | d k r| j d k rÈd } q| j j } | d k réd } q| d k rþd } qd | } n
 d | } d | | | f V| rSd Vd t j rDd n d | f Vn  d S) z§
    Helper routine for `ogrinspect` that generates GeoDjango models corresponding
    to the given data source.  See the `ogrinspect` docstring for more details.
    z>Data source parameter must be a string or a DataSource object.c                sE   t  |  t t f ƒ r& d d „  |  Dƒ S|  r= d d „  ˆ  Dƒ Sg  Sd  S)Nc             S   s   g  |  ] } | j  ƒ  ‘ q Sr    )r   )r$   r%   r    r    r!   ú
<listcomp>”   s   	 z6_ogrinspect.<locals>.process_kwarg.<locals>.<listcomp>c             S   s   g  |  ] } | j  ƒ  ‘ q Sr    )r   )r$   r%   r    r    r!   r,   –   s   	 )r   ÚlistÚtuple)Zkwarg)Ú
ogr_fieldsr    r!   Úprocess_kwarg’   s
    z"_ogrinspect.<locals>.process_kwargc                si   g  } |  j  ƒ  ˆ k r( | j d ƒ n  |  j  ƒ  ˆ  k rJ | j d ƒ n  | ra d d j | ƒ Sd Sd  S)Nz	null=Truez
blank=Truez, Ú )r   Úappendr'   )Ú
field_nameÚkwlist)Úblank_fieldsÚnull_fieldsr    r!   Úget_kwargs_strž   s    z#_ogrinspect.<locals>.get_kwargs_strzF# This is an auto-generated Django model module created by ogrinspect.z(from django.contrib.gis.db import modelsr1   zclass %s(models.Model):r   Nr   r   z@    %s = models.DecimalField(max_digits=%d, decimal_places=%d%s)z    %s = models.FloatField(%s)é   z     %s = models.IntegerField(%s)z#    %s = models.BigIntegerField(%s)z*    %s = models.CharField(max_length=%s%s)z    %s = models.DateField(%s)z!    %s = models.DateTimeField(%s)z    %s = models.TimeField(%s)zUnknown field type %s in %szsrid=-1iæ  zsrid=%sz    %s = models.%s(%s)z$    def __%s__(self): return self.%sr   Úunicoder   )r   r
   r   r   r   r   r   Zfield_widthsZfield_precisionsZfield_typesr   r   r   r   r   r   r   r	   r   r   ZdjangoZsrsÚsridÚPY3)r   Z
model_namer   r   r:   r   Z
name_fieldZimportsÚdecimalZblankÚnullZlayerr0   Zdecimal_fieldsr7   r3   ÚwidthZ	precisionZ
field_typer   Z
kwargs_strr   Z
geom_fieldZsrid_strr    )r5   r6   r/   r!   r(   |   sx    
		+					
r(   )Ú__doc__Zdjango.contrib.gis.gdalr   Zdjango.contrib.gis.gdal.fieldr   r   r   r   r   r   r	   Zdjango.utilsr
   Zdjango.utils.six.movesr   r"   r+   r(   r    r    r    r!   Ú<module>   s   4&G		