src/hdalab/management/commands/import_insee_csv.py
author ymh <ymh.work@gmail.com>
Wed, 11 Apr 2018 12:19:47 +0200
branchdocumentation
changeset 693 09e00f38d177
parent 281 bc0f26b1acc2
permissions -rw-r--r--
Add hdabo/hdalab documentations
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
693
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     1
# -*- coding: utf-8 -*-
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     2
'''
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     3
Importe des codes INSEE et les coordonnées géographiques d'un fichier CSV.
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     4
Crée des objects :class:`hdalab.models.dataviz.InseeCoords`.
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     5
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     6
Attention cette commande de remplace pas ni n'efface de données existante dans la base (la clef étant le numéro INSEE).
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     7
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     8
**Usage**: ``django-admin import_insee_csv <chemin_vers_fichier_csv>``
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
     9
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    10
'''
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    11
from django.core.management.base import BaseCommand, CommandError
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    12
from SPARQLWrapper import SPARQLWrapper, JSON
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    13
from hdalab.models import InseeCoords
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    14
import json
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    15
import csv
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    16
import re
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    17
import sys
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    18
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    19
class Command(BaseCommand):
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    20
    '''
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    21
    Command to export tags
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    22
    '''
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    23
    args = '<path_to_csv_file>'
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    24
    options = ''
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    25
    help = """Imports Insee codes and geographic coordinates from a csv file"""
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    26
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    27
    def handle(self, *args, **options):
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    28
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    29
        if len(args) == 0 or not args[0]:
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    30
            raise CommandError("Give a CSV File to import")
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    31
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    32
        filename = args[0]
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    33
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    34
        csvfile = open(filename, "rb")
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    35
        dialect = csv.Sniffer().sniff(csvfile.read(1024))
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    36
        csvfile.seek(0)
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    37
        reader = csv.reader(csvfile, dialect)
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    38
        fieldstoget = [ 'ville', 'insee', 'latitude', 'longitude' ]
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    39
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    40
        for i,line in enumerate(reader):
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    41
            if i == 0:
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    42
                fields = {}
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    43
                minlength = 0
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    44
                for j,field in enumerate(line):
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    45
                    for fieldname in fieldstoget:
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    46
                        if re.search('(?i)%s' % fieldname, field):
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    47
                            fields[fieldname] = j
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    48
                            minlength = max(j,minlength)
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    49
            else:
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    50
                if len(line) > minlength:
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    51
                    rawdata = dict([(k,line[v].strip()) for k,v in fields.iteritems()])
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    52
                    #print "Processing line %d" % i
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    53
                    #print rawdata
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    54
                    try:
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    55
                        latitude = float(rawdata['latitude'].replace(',','.'))
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    56
                        longitude = float(rawdata['longitude'].replace(',','.')) if rawdata['longitude'] != '-' else 0
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    57
                        insee = int(rawdata['insee'])
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    58
                        ville = unicode(rawdata['ville'], 'iso-8859-1')
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    59
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    60
                        InseeCoords.objects.get_or_create(insee=insee, city_name=ville, latitude=latitude, longitude=longitude)
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    61
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    62
                    except:
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    63
                        print line, "Error :", sys.exc_info()[1]
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    64
09e00f38d177 Add hdabo/hdalab documentations
ymh <ymh.work@gmail.com>
parents: 281
diff changeset
    65
        csvfile.close()