Skip to content

Instantly share code, notes, and snippets.

@ioggstream
Created October 4, 2018 17:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ioggstream/ef8d051ac07e5341f181646e5a8babf2 to your computer and use it in GitHub Desktop.
Save ioggstream/ef8d051ac07e5341f181646e5a8babf2 to your computer and use it in GitHub Desktop.
IndicePA mapping object
import json
import logging
from datetime import datetime
from dataclasses import dataclass
from ldap3 import ALL, SUBTREE, Connection, Server
username = "uid=yyy,o=utentildap"
password = "xxx"
host = "www.indicepa.it"
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger()
MOCK_ENTRY = {'objectClass': ['top', 'organization', 'organizationalUnit', 'ufficio'],
'description': ['Motorizzazione Civile Latina'],
'ou': ['Umc-Latina'],
'o': ['m_inf'],
'street': ['Strada Congiunte Destre'],
'postalCode': ['04100'],
'l': ['Latina'],
'provincia': 'LT',
'regione': 'Lazio',
'CodiceUnivocoUO': '98W3U5',
'aooRef': 'aoo=DGTC,o=m_inf,c=it',
'mail': ['umc-latina@pec.mit.gov.it'],
'dataVerifica': '2014-06-06',
'nomeResp': 'Dirigente non',
'cognomeResp': 'previsto',
'telephonenumberRespSFE': '077346631',
'MailRespSFE': 'umc-latina@pec.mit.gov.it',
'codiceUO': '98W3U5', # valorizzato solo se c'è il servizio di fatturazione
'canaleTrasmissivoSFE': 'SPCOOP',
'nomeSFE': 'FATTURAZIONE',
'intermediarioSFE': 'si',
'URISFE': 'https://MinisteroEconomiaFinanze.spcoop.gov.it/openspcoop/PA/MEF/DFP_SIFE_RicezioneFatture_1',
'codiceFiscaleSFE': '80007830591',
'dataVerificaCFSFE': '2014-04-10',
'dataAvvioSFE': '2014-06-06'
}
def connect3(host, username, password):
s = Server(host, use_ssl=False, get_info=ALL)
c = Connection(s, user=username, password=password)
log.debug("Binding")
if not c.bind():
raise Exception(c.result)
log.debug("Bound")
return c
def test_login3():
connect3(host, username, password)
def test_entry_latina():
LATINA = {
'objectClass': ['top', 'organization', 'amministrazione'], 'o': ['c_e472'], 'tipoAmm': 'L6',
'description': ['Comune di Latina'], 'postalCode': ['04100'], 'l': ['Latina'], 'provincia': 'LT',
'regione': 'Lazio', 'nomeResp': 'Damiano', 'cognomeResp': 'Coletta', 'titoloResp': 'Sindaco',
'sitoIstituzionale': 'www.comune.latina.it', 'st': ['ACCREDITATA'], 'dataVerifica': '2018-09-18',
'codiceFiscaleAmm': '00097020598', 'codiceAmm': '125155432201', 'street': ['Piazza del Popolo, 1'],
'macroTipoAmm': 'PA', 'mail': ['protocollo@pec.comune.latina.it'],
'contatti': ['segreteria.generale@pec.comune.latina.it#pec',
'servizio.attivitaproduttive@pec.comune.latina.it#pec', 'urp@pec.comune.latina.it#pec',
'scuolaculturasport@pec.comune.latina.it#pec'],
'nomeS': ['1#Albo Pretorio', '2#Gare e Appalti', '3#Moduli on-line', '4#Trasparenza Amministrativa',
'5#Ufficio TIA', '6#Residenze in tempo reale', '7#Ufficio di Stato Civile'],
'descrizioneS': ['1#Albo Pretorio', '2#Gare e Appalti on line', '3#Moduli on-line',
'4#Trasparenza Amministrativa', '5#Ufficio TIA', '6#Residenze in tempo reale',
'7#Ufficio di Stato Civile'],
'fruibS': ['1#true', '2#true', '3#true', '4#true', '5#true', '6#true', '7#true'],
'mailS': ['1#accessocivico@pec.comune.latina.it', '2#servizio.gare@pec.comune.latina.it',
'3#urp@pec.comune.latina.it', '4#accessocivico@pec.comune.latina.it',
'5#ufficio.tia@pec.comune.latina.it', '6#iscrizionianagrafiche@comune.latina.it',
'7#statocivile@pec.comune.latina.it'],
'servizioTelematico': ['1#http://trasparenza.comune.latina.it/web/trasparenza/albo-pretorio',
'2#http://www.comune.latina.it/c-638/gare-e-appalti-on-line',
'3#http://www.comune.latina.it/c-496/moduli-on-line',
'4#http://trasparenza.comune.latina.it',
'5#http://www.comune.latina.it/c-380/gestione-tia',
'6#http://www.comune.latina.it/a-8494/abitare/residenze-in-tempo-reale',
'7#http://www.comune.latina.it/c-138/stato-civile'],
'mailSPub': ['1#s', '2#s', '3#s', '4#s', '5#s', '6#s', '7#s'], 'telephonenumberS': ['7#0773652511']}
a = Amministrazione.from_ldap(**LATINA)
raise NotImplementedError
def test_search_latina3():
c = connect3(host, username, password)
c.search(search_base="c=it", search_scope=2, attributes="*",
size_limit=5, search_filter="(o=c_e472)")
for entry in c.response:
x = entry['attributes']
print("=" * 40, x)
try:
print("location", Location.from_ldap(**x).as_json())
print("responsabile", Responsabile.from_ldap(**x).as_json())
print("sfe", FatturazioneElettronica.from_ldap(**x).as_json())
except:
raise
def test_entries():
ret = Location.from_ldap(**MOCK_ENTRY)
assert ret.cap == '04100'
ret = Responsabile.from_ldap(**MOCK_ENTRY)
assert ret.telefono == '077346631'
ret = FatturazioneElettronica.from_ldap(**MOCK_ENTRY)
assert ret.codiceFiscale == '80007830591'
def test_ipa_entry():
ret = {
'codiceIpa': MOCK_ENTRY['o'][0],
'codiceAOO': 'aoo',
'codiceUffico': 'aaa',
'location': Location.from_ldap(**MOCK_ENTRY),
'responsabile': Responsabile.from_ldap(**MOCK_ENTRY),
'fatturazioneElettronica': FatturazioneElettronica.from_ldap(**MOCK_ENTRY)
}
if 'ufficio' in MOCK_ENTRY['objectClass']:
# Descrizione, CodiceUnivocoUfficio ed eventuale AOO
ret.update({
'ufficio': MOCK_ENTRY['ou'][0], 'codiceUnivocoUfficio': MOCK_ENTRY['CodiceUnivocoUO'], 'descrizione': MOCK_ENTRY['description']
})
raise NotImplementedError
def dataclass_json(self):
return json.dumps(self.__dict__)
@dataclass
class FatturazioneElettronica:
"""
'canaleTrasmissivoSFE': 'SPCOOP',
'nomeSFE': 'FATTURAZIONE',
'intermediarioSFE': 'si',
'URISFE': 'https://MinisteroEconomiaFinanze.spcoop.gov.it/openspcoop/PA/MEF/DFP_SIFE_RicezioneFatture_1',
'codiceFiscaleSFE': '80007830591',
'dataVerificaCFSFE': '2014-04-10',
'dataAvvioSFE': '2014-06-06'
"""
nome: str
uri: str
# TODO: il codiceFiscale della Fatturazione Elettronica è anche quello
# dell'ente?q
codiceFiscale: str
canaleTrasmissivo: str
intermediario: str
dataAvvio: datetime
dataVerificaCodiceFiscale: datetime
def json(self):
return dataclass_json(self)
@staticmethod
def from_ldap(nomeSFE, URISFE, canaleTrasmissivoSFE, intermediarioSFE, codiceFiscaleSFE, dataVerificaCFSFE, dataAvvioSFE, **kwargs):
return FatturazioneElettronica(
nome=nomeSFE, uri=URISFE, canaleTrasmissivo=canaleTrasmissivoSFE, intermediario=intermediarioSFE, codiceFiscale=codiceFiscaleSFE,
dataVerificaCodiceFiscale=dataVerificaCFSFE, dataAvvio=dataAvvioSFE
)
@dataclass
class Responsabile:
"""
Una persona Responsabile. Può essere di struttura, di SFE, ...
"""
nome_proprio: str
cognome: str
titolo: str = None
mail: str = None
telefono: str = None
ext: dict = None # attributi ulteriori
def json(self):
return dataclass_json(self)
@staticmethod
def from_ldap2(nomeResp, cognomeResp, titoloResp=None, MailRespSFE=None, telephonenumberRespSFE=None, **kwargs):
return Responsabile(nome_proprio=nomeResp, cognome=cognomeResp, titolo=titoloResp, mail=MailRespSFE, telefono=telephonenumberRespSFE)
@staticmethod
def from_ldap(**kwargs):
mappa_campi = {'MailRespSFE': 'mail',
'cognomeResp': 'cognome',
'nomeResp': 'nome_proprio',
'telephonenumberRespSFE': 'telefono',
'titoloResp': 'titolo'}
d = {mappa_campi[ldap_k]: ldap_v for ldap_k, ldap_v in kwargs.items() if ldap_k in mappa_campi}
return Responsabile(**d)
@dataclass
class Location:
via: str
cap: str
citta: str
provincia: str
regione: str
def json(self):
return dataclass_json(self)
@staticmethod
def from_ldap(**kwargs):
"""
'street': ['Strada Congiunte Destre'],
'postalCode': ['04100'],
'l': ['Latina'],
'provincia': 'LT',
'regione': 'Lazio',
:param street:
:param postalCode:
:param l:
:param provincia:
:param regione:
:param kwargs:
:return:
"""
mappa_campi = {
'street': 'via',
'postalCode': 'cap',
'l': 'citta',
'provincia': 'provincia',
'regione': 'regione'
}
d = {
mappa_campi[ldap_k]: ldap_v
for ldap_k, ldap_v in kwargs.items()
if ldap_k in mappa_campi
}
d = {k: ''.join(v) for k, v in d.items()}
return Location(**d)
@dataclass
class Amministrazione:
codice_ipa: str
descrizione: str
codice_fiscale: str
tipologia: str
categoria: str
# codice_unita_organizzativa: str
acronimo: str = None
sito_istituzionale: str = None
mail: list = None
pec: list = None
location: Location = None
responsabile: Responsabile = None
@staticmethod
def from_ldap2(o, tipoAmm, description, codiceFiscaleAmm, codiceAmm,
macroTipoAmm, sitoIstituzionale, **kwargs):
a = Amministrazione(
codice_ipa=o, descrizione=description, codice_fiscale=codiceFiscaleAmm,
sito_istituzionale=sitoIstituzionale, categoria=tipoAmm, tipologia=macroTipoAmm
)
a.location = Location.from_ldap(**kwargs)
a.responsabile = Responsabile.from_ldap(**kwargs)
return a
@staticmethod
def from_ldap(**kwargs):
mappa_campi = {
'o': 'codice_ipa',
'description': 'descrizione',
'codiceFiscaleAmm': 'codice_fiscale',
'tipoAmm': 'categoria',
'macroTipoAmm': 'tipologia',
'sitoIstituzionale': 'sito_istituzionale'
}
d = {
mappa_campi[ldap_k]: ldap_v
for ldap_k, ldap_v in kwargs.items()
if ldap_k in mappa_campi
}
#d = {k: ''.join(v) for k, v in d.items()}
a = Amministrazione(**d)
a.location = Location.from_ldap(**kwargs)
a.responsabile = Responsabile.from_ldap(**kwargs)
return a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment