From 879d9f1f5b47b1541e0c1ee29190172e03186adb Mon Sep 17 00:00:00 2001 From: kbyte Date: Thu, 25 Jun 2015 16:13:53 +0200 Subject: [PATCH] chiamate ajax --- .gitignore | 3 +- README.md | 2 +- comuni_italiani/urls.py | 33 +++++ comuni_italiani/views.py | 281 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 comuni_italiani/urls.py diff --git a/.gitignore b/.gitignore index 1aa7416..4839eeb 100644 --- a/.gitignore +++ b/.gitignore @@ -57,4 +57,5 @@ docs/_build/ target/ .idea -*.iml \ No newline at end of file +*.iml +djangotest/ diff --git a/README.md b/README.md index 04199e9..c2a5981 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ In ogni caso sarà vostro compito fare i dovuti aggiustamenti. **A quando risale l'ultimo aggiornamento dei dati?**
L'applicazione ha già inclusi i dati istat aggiornati al 30 gennaio 2015 -**Perchè documentazione e documentazione sono in Italiano?**
+**Perchè documentazione e codice sorgente sono in Italiano?**
Questa appliazione ha uno scopo intimamente riservato al "mercato" italiano. In genere se si ha la necessità di utilizzare luoghi e lingue diverse consiglio l'uso di django-cities-light oppure di django-cities diff --git a/comuni_italiani/urls.py b/comuni_italiani/urls.py new file mode 100644 index 0000000..ea09edb --- /dev/null +++ b/comuni_italiani/urls.py @@ -0,0 +1,33 @@ +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^elenco/comuni/provincia/(?P[0-9]+)/$', + views.elenco_comuni_provincia, name="elenco_comuni_provincia"), + url(r'^elenco/comuni/provincia/$', + views.elenco_comuni_provincia, name="elenco_comuni_provincia_post"), + + url(r'^elenco/comuni/regione/(?P[0-9]+)/$', + views.elenco_comuni_regione, name="elenco_comuni_regione"), + url(r'^elenco/comuni/regione/$', + views.elenco_comuni_regione, name="elenco_comuni_regione_post"), + + url(r'^elenco/comuni/citta_metro/(?P[0-9]+)/$', + views.elenco_comuni_cittmetro, name="elenco_comuni_cittmetro"), + url(r'^elenco/comuni/citta_metro/$', + views.elenco_comuni_cittmetro, name="elenco_comuni_cittmetro_post"), + + url(r'^elenco/province/regione/(?P[0-9]+)/$', + views.elenco_province_regione, name="elenco_province_regione"), + url(r'^elenco/province/regione/$', + views.elenco_province_regione, name="elenco_province_regione_post"), + + url(r'^elenco/province/$', views.elenco_province, name="elenco_province"), + url(r'^elenco/regioni/$', views.elenco_regioni, name="elenco_regioni"), + url(r'^elenco/citta_metro/$', views.elenco_citta_metro, name="elenco_citta_metro"), + + url(r'^ricerca/comune/$', views.ricerca_comune, name="ricerca_comune"), + url(r'^ricerca/provincia/$', views.ricerca_provincia, name="ricerca_provincia"), + url(r'^ricerca/regione/$', views.ricerca_regione, name="ricerca_regione"), +] \ No newline at end of file diff --git a/comuni_italiani/views.py b/comuni_italiani/views.py index 6f954c9..fc6309d 100644 --- a/comuni_italiani/views.py +++ b/comuni_italiani/views.py @@ -1,3 +1,284 @@ # -*- coding: utf-8 -*- +import json + +from django.core.exceptions import ObjectDoesNotExist +from django.http import JsonResponse from django.shortcuts import render +from .models import * + +def jsonize_comuni(comuni): + result = list() + + for comune in comuni: + result.append( + { + 'codice_istat': comune.codice_istat, + 'codice_catastale': comune.codice_catastale, + 'name': comune.name, + 'codice_provincia': comune.provincia.codice_provincia, + 'targa_provincia': comune.provincia.codice_targa, + 'codice_cittametropolitana': comune.citta_metropolitana.codice_cittametropolitana if comune.citta_metropolitana is not None else None, + 'is_capoluogo': comune.is_capoluogo, + 'altitudine': comune.altitudine, + 'superficie': comune.superficie, + 'popolazione': comune.popolazione + } + ) + + return result + +def jsonize_cittametro(citta_metro): + result = list() + + for cm in citta_metro: + result.append( + { + 'name': cm.name, + 'codice_cittametropolitana': cm.codice_cittametropolitana, + } + ) + + return result + +def jsonize_province(province): + result = list() + + for provincia in province: + result.append( + { + 'codice_provincia': provincia.codice_provincia, + 'codice_targa': provincia.codice_targa, + 'name': provincia.name, + 'codice_regione': provincia.regione.codice_regione, + 'name_regione': provincia.regione.name, + } + ) + + return result + + +def jsonize_regioni(regioni): + result = list() + + for regione in regioni: + result.append( + { + 'codice_regione': regione.codice_regione, + 'name': regione.name, + } + ) + + return result + + +def check_elenco_parameters(request, codice): + if request.method == 'POST': + if codice is not None or 'codice' not in request.POST: + return (None, JsonResponse({ + 'result_code': 401, + })) + + try: + return (int(request.POST['codice']), None) + except ValueError: + return (None, JsonResponse({ + 'result_code': 401, + })) + else: + return (int(codice), None) + +def elenco_comuni_provincia(request, codice=None): + (codice_provincia, error) = check_elenco_parameters(request, codice) + + if error is not None: + return error + + try: + provincia = Provincia.objects.get(codice_provincia=codice_provincia) + except ObjectDoesNotExist: + return JsonResponse({'result_code': 404}) + + qs = Comune.objects.filter(provincia=codice_provincia).all() + + comuni = jsonize_comuni(qs) + + return JsonResponse({ + 'result_code': 200, + 'codice_provincia': codice_provincia, + 'name': provincia.name, + 'codice_targa': provincia.codice_targa, + 'comuni': comuni + }) + +def elenco_comuni_regione(request, codice=None): + (codice_regione, error) = check_elenco_parameters(request, codice) + + if error is not None: + return error + + try: + regione = Regione.objects.get(codice_regione=codice_regione) + except ObjectDoesNotExist: + return JsonResponse({'result_code': 404}) + + qs = Comune.objects.filter(provincia__regione=codice_regione) + + comuni = jsonize_comuni(qs) + + return JsonResponse({ + 'result_code': 200, + 'codice_regione': codice_regione, + 'name': regione.name, + 'comuni': comuni + }) + + +def elenco_comuni_cittmetro(request, codice=None): + (codice_citta_metro, error) = check_elenco_parameters(request, codice) + + if error is not None: + return error + + try: + cittm = CittaMetropolitana.objects.get(codice_cittametropolitana=codice_citta_metro) + except ObjectDoesNotExist: + return JsonResponse({'result_code': 404}) + + qs = Comune.objects.filter(citta_metropolitana=codice_citta_metro) + + comuni = jsonize_comuni(qs) + + return JsonResponse({ + 'result_code': 200, + 'codice_citta_metro': codice_citta_metro, + 'name': cittm.name, + 'comuni': comuni + }) + +def elenco_citta_metro(request): + qs = CittaMetropolitana.objects.all() + + citta_metro = jsonize_cittametro(qs) + + return JsonResponse({ + 'result_code': 200, + 'citta_metro': citta_metro + }) + + +def elenco_province_regione(request, codice=None): + (codice_regione, error) = check_elenco_parameters(request, codice) + + if error is not None: + return error + + try: + regione = Regione.objects.get(codice_regione=codice_regione) + except ObjectDoesNotExist: + return JsonResponse({'result_code': 404}) + + qs = Provincia.objects.filter(regione=codice_regione) + + province = jsonize_province(qs) + + return JsonResponse({ + 'result_code': 200, + 'codice_regione': codice_regione, + 'name': regione.name, + 'province': province + }) + +def elenco_province(request): + qs = Provincia.objects.all() + province = jsonize_province(qs) + + return JsonResponse({ + 'result_code': 200, + 'province': province + }) + +def elenco_regioni(request): + qs = Regione.objects.all() + regioni = jsonize_regioni(qs) + + return JsonResponse({ + 'result_code': 200, + 'regioni': regioni + }) + +def check_ricerca_params(request): + take = 20 + skip = 0 + + if request.method != 'POST' or 'nome' not in request.POST: + return (take, skip, JsonResponse({ + 'result_code': 401, + })) + + try: + if 'take' in request.POST: + take = int(request.POST['take']) + + if 'skip' in request.POST: + skip = int(request.POST['skip']) + + if take <= 0 or skip < 0: + raise ValueError() + except ValueError: + return (take, skip, JsonResponse({ + 'result_code': 401, + })) + + return (take, skip, None) + +def ricerca_comune(request): + (take, skip, error) = check_ricerca_params(request) + + if error is not None: + return error + + qs = Comune.objects.filter(name__icontains=request.POST['nome'])[skip:skip+take] + + comuni = jsonize_comuni(qs) + + return JsonResponse({ + 'result_code': 200, + 'comuni': comuni, + 'take': take, + 'skip': skip + }) + +def ricerca_provincia(request): + (take, skip, error) = check_ricerca_params(request) + + if error is not None: + return error + + qs = Provincia.objects.filter(name__icontains=request.POST['nome'])[skip:skip+take] + + province = jsonize_province(qs) + + return JsonResponse({ + 'result_code': 200, + 'province': province, + 'take': take, + 'skip': skip + }) + +def ricerca_regione(request): + (take, skip, error) = check_ricerca_params(request) + + if error is not None: + return error + + qs = Regione.objects.filter(name__icontains=request.POST['nome'])[skip:skip+take] + + regioni = jsonize_regioni(qs) + + return JsonResponse({ + 'result_code': 200, + 'regioni': regioni, + 'take': take, + 'skip': skip + }) \ No newline at end of file