?seduta a osr:SedutaAssemblea. ?seduta osr:dataSeduta ?dataSeduta. ?seduta osr:legislatura ?legislatura. ?votazione a osr:Votazione. ?votazione osr:seduta ?seduta. FILTER(str(?dataSeduta)="%s") } ORDER BY ?seduta """ % today fields_votazioni = ["votazione","seduta"] results_votazioni = run_query(settings.sparql_senato, query_votazioni) # per ogni seduta estrae il numero delle votazioni relative for votazioni in results_votazioni: nvotazione = votazioni["votazione"] query_votazione = """ PREFIX osr: <http://dati.senato.it/osr/> PREFIX ocd: <http://dati.camera.it/ocd/> select distinct ?votazione ?label ?favorevoli ?contrari ?astenuti ?presenti ?missione ?maggioranza ?nlegale ?esito ?votanti where { ?votazione a osr:Votazione. ?votazione osr:favorevoli ?favorevoli.
def import_seduta(results_sedute, error_mail_body): seduta_day = "" sedute_result = {} for seduta in results_sedute: # total result will be the comprehensive collection of data about a seduta and # all its votazioni seduta_isimported = True votazioni_isimported = {} sedute_result[seduta['numero']]= {} seduta_result = {} print "query seduta " + seduta['numero'] # query per prendere tutti i dati della singola seduta query_seduta = """ PREFIX osr: <http://dati.senato.it/osr/> PREFIX ocd: <http://dati.camera.it/ocd/> select ?data ?tipoSeduta ?numero where { ?seduta_id a osr:SedutaAssemblea. ?seduta_id osr:legislatura ?legislatura. ?seduta_id osr:numeroSeduta ?numero. ?seduta_id osr:dataSeduta ?data. ?seduta_id osr:tipoSeduta ?tipoSeduta. FILTER( ?numero = """+seduta['numero'] +""" and ?legislatura = """+legislatura_id +""" ) } """ results_seduta = None try: results_seduta = run_query(sparql_senato, query_seduta,query_delay, Json=False) except ConnectionError,e: error_type = "sparql_connection_fail" error_mail_body['sparql_connection'].append(error_messages[error_type]%e) send_error_mail(script_name, smtp_server, notification_system, notification_list, error_mail_body) exit(0) if results_seduta is None: # se non trova la seduta genera msg di errore error_type = "obj_not_found" error_mail_body['sparql_connection'].append(error_messages[error_type]%query_seduta) else: # TODO: inserimenti con api dei dati della seduta # aggiunge i metadati della seduta al dizionario totale seduta_result['metadata'] = results_seduta # prende il giorno della seduta per verificare i senatori in carica quel giorno # il booleano seduta_new_day evita di rifare piu' volte la query sui sen.in carica quando stiamo # trattando sedute diverse avvenute nello stesso giorno seduta_new_day = False if seduta_day != results_seduta[0]['data']: seduta_new_day = True seduta_day = results_seduta[0]['data'] #cerca tutte le votazioni per la presente seduta e se ce ne sono le importa query_seduta_votazioni = """ PREFIX osr: <http://dati.senato.it/osr/> PREFIX ocd: <http://dati.camera.it/ocd/> select ?votazione ?numero where { ?votazione a osr:Votazione. ?votazione osr:numero ?numero. ?votazione osr:seduta ?seduta. filter( str(?seduta) = str(\""""+seduta['seduta_id']+"""\")) } ORDER BY ?numero """ results_votazioni = None try: results_votazioni = run_query(sparql_senato, query_seduta_votazioni,query_delay) except ConnectionError,e: error_type = "sparql_connection_fail" error_mail_body['sparql_connection'].append(error_messages[error_type]%e) send_error_mail(script_name, smtp_server, notification_system, notification_list, error_mail_body) exit(0) if results_votazioni is not None: seduta_result['votazioni']={} for votazione in results_votazioni: votazioni_isimported[votazione['votazione']]=True error_mail_body[votazione['votazione']]=[] print "query sed:" +seduta['numero']+", votazione:"+votazione['votazione'] query_votazione = """ PREFIX osr: <http://dati.senato.it/osr/> PREFIX ocd: <http://dati.camera.it/ocd/> select ?field ?value where { ?votazione a osr:Votazione. ?votazione ?field ?value. filter( str(?votazione) = str(\""""+votazione['votazione']+"""\")) } ORDER BY ?field """ results_votazione = None try: results_votazione = run_query(sparql_senato, query_votazione,query_delay,Json=True) except ConnectionError,e: error_type = "sparql_connection_fail" error_mail_body['sparql_connection'].append(error_messages[error_type]%e) send_error_mail(script_name, smtp_server, notification_system, notification_list, error_mail_body) exit(0) print "tipo votazione: "+results_votazione[osr_prefix+'tipoVotazione'][0] if results_votazione is None: # se non trova la votazione genera msg di errore error_type = "obj_not_found" error_mail_body['sparql_connection'].append(error_messages[error_type]%query_votazione) else: seduta_result['votazioni'][votazione['votazione']] = results_votazione # CHECK 1 # controlla la correttezza dei dati numerici della votazione # e delle liste di id check_campi = [] # se la votazione non e' segreta if results_votazione[osr_prefix+'tipoVotazione'][0] != 'segreta': # per ogni campo da controllare controlla che esista il totale numerico. # se il totale e' maggiore di 0 allora deve esistere anche la lista con gli id riferiti al campo # se la lista esiste allora il numero di id deve essere = al totale numerico for (k, campi) in enumerate(campi_controllo_somme): if osr_prefix+campi[1] in results_votazione.keys(): if int(results_votazione[osr_prefix+campi[1]][0])>0: if osr_prefix+campi[0] in results_votazione.keys(): if len(results_votazione[osr_prefix+campi[0]]) == \ int(results_votazione[osr_prefix+campi[1]][0]): campo_validation=True else: campo_validation=False else: campo_validation=False else: if int(results_votazione[osr_prefix+campi[1]][0])==0: campo_validation=True else: campo_validation=False else: campo_validation=False check_campi.append(campo_validation) if not campo_validation: print campi[0]+" : "+str(campo_validation) else: # se la votazione e' segreta controlla che ci siano i totali numerici dei campi indicati for (k, campi) in enumerate(campi_controllo_somme): if osr_prefix+campi[1] not in results_votazione.keys(): campo_validation=False else: campo_validation= True check_campi.append(campo_validation) if not campo_validation: print campi[0]+" : "+str(campo_validation) # dopo il controllo di check campi passa il valore finale a votazioni_isimported check_conteggi = True for check in check_campi: if check is False: check_conteggi = False if check_conteggi is False: votazioni_isimported[votazione['votazione']]=False # CHECK 2 # effettua controlli sulle somme # votanti= favorevoli + contrari + astenuti check_somme = True somma_votanti = int(results_votazione[osr_prefix+"favorevoli"][0]) + \ int(results_votazione[osr_prefix+"contrari"][0])+ \ int(results_votazione[osr_prefix+"astenuti"][0]) if int(results_votazione[osr_prefix+"votanti"][0]) != somma_votanti: print "Somma votanti non corretta: %s != %s" % (somma_votanti, results_votazione[osr_prefix+"votanti"][0]) error_type = "somma_votanti" error_mail_body[votazione['votazione']].append(error_messages[error_type]% (somma_votanti, results_votazione[osr_prefix+"votanti"][0])) check_somme = False # presenti = votanti + presidente + richiedenteNonVotante somma_presenti = int(results_votazione[osr_prefix+"votanti"][0]) if osr_prefix+"presidente" in results_votazione.keys(): somma_presenti += 1 if osr_prefix+"richiedenteNonVotante" in results_votazione.keys(): somma_presenti += len(results_votazione[osr_prefix+"richiedenteNonVotante"]) if int(results_votazione[osr_prefix+"presenti"][0]) != somma_presenti: print "Somma presenti non corretta: %s != %s" % (somma_presenti, results_votazione[osr_prefix+"presenti"][0]) error_type = "somma_presenti" error_mail_body[votazione['votazione']].append(error_messages[error_type]% (somma_presenti, results_votazione[osr_prefix+"presenti"][0])) check_somme = False if check_somme is False: votazioni_isimported[votazione['votazione']]=False # CHECK 3 # effettua i controlli sulla votazione basati sui senatori in carica quel giorno # da notare che la data di fine Mandato puo' anche non esserci se il sen. # e' attualmente in carica check_incarica = True # prende la lista completa di senatori in carica quel giorno dallo sparql endpoint if seduta_new_day is True: query_incarica = """ PREFIX osr: <http://dati.senato.it/osr/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> PREFIX ocd:<http://dati.camera.it/ocd/> SELECT DISTINCT ?senatore ?nome ?cognome ?inizioMandato ?fineMandato ?tipoMandato WHERE { ?senatore a osr:Senatore. ?senatore foaf:firstName ?nome. ?senatore foaf:lastName ?cognome. ?senatore osr:mandato ?mandato. ?mandato osr:legislatura ?legislaturaMandato. ?mandato osr:inizio ?inizioMandato. ?mandato osr:tipoMandato ?tipoMandato. OPTIONAL { ?mandato osr:fine ?fineMandato. } FILTER(str(?legislaturaMandato)='%s') FILTER(?inizioMandato <= "%s"^^xsd:date ) FILTER(!bound(?fineMandato) || ?fineMandato > "%s"^^xsd:date ) } ORDER BY ?cognome ?nome """ % ( legislatura_id, seduta_day, seduta_day) senatori_incarica_sparql = None try: senatori_incarica_sparql = run_query(sparql_senato, query_incarica,query_delay) except ConnectionError,e: error_type = "sparql_connection_fail" error_mail_body['sparql_connection'].append(error_messages[error_type]%e) send_error_mail(script_name, smtp_server, notification_system, notification_list, error_mail_body) exit(0) # controlla che tutti i senatori in astenuto, congedo missione, contrario, # favorevole, richiedente non votante, e presidente siano in carica quel giorno senatori_seduta_sparql = results_votazione[osr_prefix+'presente'] if osr_prefix+"inCongedoMissione" in results_votazione.keys(): senatori_seduta_sparql.extend(results_votazione[osr_prefix+'inCongedoMissione']) senatori_seduta_sparql.extend(results_votazione[osr_prefix+'presidente']) # prende la lista completa di senatori in carica quel giorno dalle Api if seduta_new_day is True: parlamento_api_incarica = parlamento_api_host +parlamento_api_url +"/" + \ parlamento_api_leg_prefix + "/" + \ parlamento_api_parlamentari_prefix+"/"+ \ "?ramo=S&data="+seduta_day+"&page_size=500&format=json" r_incarica_list= None try: r_incarica_list = requests.get(parlamento_api_incarica) except requests.exceptions.ConnectionError: error_type = "api_connection_fail" error_mail_body['api_connection'].append(error_messages[error_type]%parlamento_api_incarica) send_error_mail(script_name, smtp_server, notification_system, notification_list, error_mail_body) exit(0) r_incarica_json = r_incarica_list.json() totale_senatori_api = r_incarica_json['results'] # se il n. di senatori in carica secondo le api != n. sen in carica dello sparql da' errore if len(totale_senatori_api) != len(senatori_incarica_sparql): error_type = "senatori_incarica" print error_messages[error_type] % (len(totale_senatori_api),len(senatori_incarica_sparql)) error_mail_body[votazione['votazione']].append( error_messages[error_type]% (len(totale_senatori_api),len(senatori_incarica_sparql)) ) check_incarica = False # trova gli eventuali senatori mancanti nelle api o nei dati dallo sparql for senatore_api in totale_senatori_api: trovato = False i=0 while not trovato and i < len(senatori_incarica_sparql): senatore_sparql=senatori_incarica_sparql[i]['senatore'] senatore_noprefix = senatore_sparql.replace(senatore_prefix,"") if senatore_noprefix == str(senatore_api['carica']['parliament_id']): trovato = True i+=1 if not trovato: # sparql_id_mismatch error_type = "sparql_id_mismatch" print error_messages[error_type] % (str(senatore_api['carica']['parliament_id'])) error_mail_body[votazione['votazione']].append( error_messages[error_type]% (str(senatore_api['carica']['parliament_id'])) ) check_incarica=False for senatore_sparql in senatori_incarica_sparql: trovato = False senatore_noprefix = senatore_sparql['senatore'].replace(senatore_prefix,"") i=0 while not trovato and i < len(totale_senatori_api): senatore_api = totale_senatori_api[i] if senatore_noprefix == str(senatore_api['carica']['parliament_id']): trovato = True i += 1 if not trovato: # api_id_mismatch error_type = "api_id_mismatch" print error_messages[error_type] % (str(senatore_noprefix)) error_mail_body[votazione['votazione']].append( error_messages[error_type]% (str(senatore_noprefix)) ) check_incarica=False if check_incarica is False: votazioni_isimported[votazione['votazione']]=False else: # TODO: calcolare gli assenti # se un senatore in carica non e' nella lista senatori_seduta_sparql che # comprende i presenti + presidente + in congedo missione , allora # viene considerato assente senatori_assenti = [] for senatore_ass in senatori_incarica_sparql: senatore_ass_id = senatore_ass['senatore'] trovato = False i=0 while not trovato and i < len(senatori_seduta_sparql): if senatore_ass_id == senatori_seduta_sparql[i]: trovato = True i += 1 if trovato is False: senatori_assenti.append(senatore_ass)
# vedo su sparql se sono presenti sedute successive print "query sedute" query_sedute = """ PREFIX osr: <http://dati.senato.it/osr/> PREFIX ocd: <http://dati.camera.it/ocd/> select ?seduta_id ?numero where { ?seduta_id a osr:SedutaAssemblea. ?seduta_id osr:numeroSeduta ?numero. ?seduta_id osr:legislatura """ + legislatura_id +""" FILTER( ?numero > """ + n_last_seduta +""") } ORDER BY ?numero """ results_sedute = run_query(sparql_senato, query_sedute,query_delay) if results_sedute != -1: # se sono presenti sedute non importate le importa if len(results_sedute)>0: for seduta in results_sedute: # total result will be the comprehensive collection of data about a seduta and # all its votazioni total_result = {} print "query seduta " + seduta['numero'] # query per prendere tutti i dati della singola seduta query_seduta = """ PREFIX osr: <http://dati.senato.it/osr/> PREFIX ocd: <http://dati.camera.it/ocd/> select ?data ?tipoSeduta ?numero
PREFIX ocd: <http://dati.camera.it/ocd/> select ?seduta_id ?numero where { ?seduta_id a osr:SedutaAssemblea. ?seduta_id osr:numeroSeduta ?numero. ?seduta_id osr:legislatura """ + legislatura_id +""" FILTER( ?numero > """ +str(n_last_seduta) +""") } ORDER BY ?numero """ results_sedute = None try: results_sedute = run_query(sparql_senato, query_sedute,query_delay) except ConnectionError,e: error_type = "sparql_connection_fail" error_mail_body['sparql_connection'].append(error_messages[error_type]%e) send_error_mail(script_name, smtp_server, notification_system, notification_list, error_mail_body) exit(0) if results_sedute is not None: # se sono presenti sedute non importate le importa if len(results_sedute)>0: total_result = import_seduta(results_sedute, error_mail_body) # scrive un file per ogni seduta importata con tutti i dati delle votazioni associate for seduta in total_result.keys():