def clean(self): data = self.cleaned_data #controllo codice fiscale bimbo codfiscale = data.get('codfis_bimbo').upper() if not codicefiscale.is_valid(codfiscale): raise forms.ValidationError( 'Codice fiscale del minore non corretto') #ricerca di domande per questo bimbo recs = Domande.objects.filter(pr_codfiscale=codfiscale, pr_stato__lte=2) if recs.count( ) > 0: #esiste un'altra preform con lo stesso cidfis minore e stato non annullato #and not self.instance.pk raise forms.ValidationError( "Presente già un'altra domanda per il minore con cod.fiscale " + codfiscale + '.') data['codfis_bimbo'] = codfiscale #controllo codice fiscale richiedente codfiscale = data.get('codice_fiscale').upper() if not codicefiscale.is_valid(codfiscale): raise forms.ValidationError( 'Codice fiscale del richiedente non corretto') data['codice_fiscale'] = codfiscale.upper() data['email'] = data.get('email').upper() self.cleaned_data = data if self.errors: print(self.errors) return self.cleaned_data
def is_correct(root: T.Any, info: T.Any, **args: T.Dict[T.Text, T.Any]) -> bool: cf = args.get("cf") if cf: try: return codicefiscale.is_valid(cf) except ValueError: return False raise ValueError("Missing argument.")
def decode_fiscal_number(request): """ Estrae i dati a partire dal codice fiscale :return: JsonResponse con statusCode e dati (in caso di successo) """ cf = request.GET.get('CF').upper() try: isvalid = codicefiscale.is_valid(cf) or codicefiscale.is_omocode(cf) decode_cf = codicefiscale.decode(cf) if isvalid: am = AddressMunicipality.objects.filter( code__iexact=decode_cf['birthplace']['code']).first() if am: nation_code = 'Z000' else: nation_code = decode_cf['birthplace']['code'] return JsonResponse({ 'statusCode': StatusCode.OK.value, 'codeOfNation': nation_code, 'placeOfBirth': '', 'countyOfBirth': '', 'dateOfBirth': decode_cf['birthdate'].strftime('%d/%m/%Y'), 'gender': decode_cf['sex'] }) StatusCode_city, city = get_city_id( decode_cf['birthplace']['code'], decode_cf['birthdate'].strftime('%Y-%m-%d')) if StatusCode_city == 200: return JsonResponse({ 'statusCode': StatusCode.OK.value, 'codeOfNation': nation_code, 'placeOfBirth': decode_cf['birthplace']['code'], 'countyOfBirth': city, 'dateOfBirth': decode_cf['birthdate'].strftime('%d/%m/%Y'), 'gender': decode_cf['sex'] }) except Exception as e: LOG.warning("Exception: {}".format(str(e)), extra=set_client_ip(request)) return JsonResponse({'statusCode': StatusCode.EXC.value}) return JsonResponse({'statusCode': StatusCode.ERROR.value})
def clean_fiscalNumber(self): fiscalNumber = self.cleaned_data.get('fiscalNumber').upper() try: isvalid = codicefiscale.is_valid(fiscalNumber) or codicefiscale.is_omocode(fiscalNumber) except Exception as e: LOG.warning("Warning: {}".format(str(e)), extra=set_client_ip()) isvalid = False if not isvalid: raise ValidationError("Il codice fiscale inserito non è valido") return
def test_is_valid(self): self.assertTrue(codicefiscale.is_valid('CCCFBA85D03L219P')) self.assertTrue(codicefiscale.is_valid('CCC FBA 85 D03 L219 P')) self.assertTrue(codicefiscale.is_valid('CCC-FBA-85-D03-L219-P')) self.assertFalse( codicefiscale.is_valid('CCCFBA85D03L219PP')) # too long self.assertFalse( codicefiscale.is_valid('CCCFBA85D03L219B')) # wrong CIN self.assertFalse( codicefiscale.is_valid('CCCFBA85D03L219')) # too short self.assertFalse( codicefiscale.is_valid('CCCFBA85D00L219')) # wrong birthdate day self.assertFalse( codicefiscale.is_valid('CCCFBA85D99L219')) # wrong birthdate day
def test_valid_fake_users(self): """ Generated users should have valid attributes according to https://www.agid.gov.it/sites/default/files/repository_files/regole_tecniche/tabella_attributi_idp_v1_0.pdf """ for name, info in self.provider.all().items(): attrs = info['attrs'] user_fiscal_code = re.sub(r'^TINIT-', '', attrs['fiscalNumber']) self.assertTrue( fiscalcode.is_valid(user_fiscal_code), "{} is not a valid Italian fiscal code".format( user_fiscal_code))
def clean_fiscalNumber(self): fiscalNumber = self.cleaned_data.get('fiscalNumber').upper() message = "Il codice fiscale inserito non è valido" try: isvalid = codicefiscale.is_valid(fiscalNumber) or codicefiscale.is_omocode(fiscalNumber) birth_date = codicefiscale.decode(fiscalNumber)['birthdate'] if isvalid and calculate_age(birth_date) < 18: isvalid = False message = "Il codice fiscale inserito deve appartenere ad una persona maggiorenne" if isvalid and fiscalNumber in get_all_operator_cf(): isvalid = False message = "Il codice fiscale inserito non deve appartenere ad un operatore/admin" except Exception as e: LOG.warning("Warning: {}".format(str(e)), extra=set_client_ip()) isvalid = False if not isvalid: raise ValidationError(message) return
def clean_fiscal_code(s): return "".join(s.split()).upper() INFO_MESSAGE = ( "- Per ricominciare digita /ricomincia", "- Per cancellarti digita /cancella", "- Se vuoi più informazioni o vuoi segnalare un errore digita /info", ) @bot.message_handler( func=lambda message: message.text and codicefiscale.is_valid(clean_fiscal_code(message.text)) ) def fiscal_code_message(message): fiscal_code = clean_fiscal_code(message.text) telegram_id = str(message.from_user.id) with db.transaction() as t: user = db.user.by_telegram_id(t, telegram_id) if user: subscription = db.subscription.last_by_user(t, user["id"]) if ( subscription and subscription["ulss_id"] and not subscription["fiscal_code"] ): # We do a sync check for locations right after. To avoid
def clean(self): data = self.cleaned_data # controllo codice fiscale richiedente if data.get('so_cod_fis'): codice_fiscale = data.get('so_cod_fis').upper() if not codicefiscale.is_valid(codice_fiscale): raise forms.ValidationError('Codice fiscale del richiedente non corretto') dt_nascita=data.get('so_nasc_dt') str_dtnascita = str(dt_nascita.day) + '/' + str(dt_nascita.month) + '/' + str(dt_nascita.year) dati_decodecf = codicefiscale.decode(codice_fiscale) #if dati_decodecf['birthplace']['name'] != data.get('so_nasc_com').upper(): # raise forms.ValidationError('Luogo di nascita non coerente con quello ricavato dal codice fiscale del richiedente.') # cf_calcolato = codicefiscale.encode(surname=data.get('so_cognome'), name=data.get('so_nome'), sex=data.get('so_sesso'), birthdate=str_dtnascita, birthplace=data.get('so_nasc_com')) #if (cf_calcolato != codice_fiscale) and (codice_fiscale not in codicefiscale.decode(cf_calcolato)['omocodes']): # alert_msg = 'Codice fiscale del richiedente non coerente con i dati anagrafici indicati' # raise forms.ValidationError(alert_msg) data['so_cod_fis'] = codice_fiscale if data.get('pr_codfiscale'): codice_fiscale = data.get('pr_codfiscale').upper() if not codicefiscale.is_valid(codice_fiscale): raise forms.ValidationError('Codice fiscale del minore non corretto') dt_nascita=data.get('pr_nasc_dt') str_dtnascita = str(dt_nascita.day) + '/' + str(dt_nascita.month) + '/' + str(dt_nascita.year) dati_decodecf = codicefiscale.decode(codice_fiscale) # if dati_decodecf['birthplace']['name'] != data.get('pr_nasc_com').upper(): # raise forms.ValidationError('Luogo di nascita non coerente con quello ricavato dal codice fiscale del minore.') #cf_calcolato= build_cf(data.get('pr_cognome'), data.get('pr_nome'), datetime.datetime(dt_nascita.year, dt_nascita.month, dt_nascita.day), data.get('pr_sesso'), comune_cf) cf_calcolato = codicefiscale.encode(surname=data.get('pr_cognome'), name=data.get('pr_nome'), sex=data.get('pr_sesso'), birthdate=str_dtnascita, birthplace=data.get('pr_nasc_com')) #print("CF calcolato:"+cf_calcolato) #if (cf_calcolato != codice_fiscale) and (codice_fiscale not in codicefiscale.decode(cf_calcolato)['omocodes']): # raise forms.ValidationError('Codice fiscale del minore non coerente con i dati anagrafici') # controllo presenza domanda con stesso codice fiscale alunno domande_alunno = Domande.objects.filter(pr_codfiscale=codice_fiscale, pr_stato__gte=0, pr_stato__lt=5) if domande_alunno.count() > 1: if not self.instance.pk: # siamo in inserimento raise forms.ValidationError( 'Già presente in archivio una richiesta di buoni Miur per minore con cod.fiscale:' + codice_fiscale) elif self.instance.pk != domande_alunno[0].id: # in fase di modifica raise forms.ValidationError( 'Già presente in archivio una richiesta di buoni Miur per minore con cod.fiscale:' + codice_fiscale) # controllo valid. data di nascita if data.get('pr_nasc_dt'): if data.get('pr_nasc_dt') < datetime.date(2013, 1, 1): raise forms.ValidationError("Anno di nascita minimo 2013") elif data.get('pr_nasc_dt') >= date.today(): raise forms.ValidationError("Ammesse solo date passate per data nascita") # controllo presenza tutti i campi IBAN per riscossione banca if data.get('so_risc_diretta') == 'N': if not data.get('so_banca_iban'): raise forms.ValidationError("Indicare l'IBAN dell'intestatario") if data.get('pr_tipo_asilo')=='P' and (not data.get('pr_num_tot_ricevute') or not data.get('pr_importo_tot_ricevute')): raise forms.ValidationError("Indicare il numero delle ricevute di spesa da allegare con il loro importo complessivo.") # controlli sui dati domicilio per non residenti if data.get('so_flag_residente') == 0: if not (data.get('so_domicilio')): raise forms.ValidationError("Obbligatorio, per in non residenti, indicare il domicilio") if not data.get('pr_data_richiesta'): data['pr_data_richiesta'] = timezone.now #controllo su spesa mensile if data.get('pr_fascia_asilo') == 'N': if data.get('pr_spesa_mese') <= 168: raise forms.ValidationError("Si accettano solo domande con spesa mensile superiore a 168 euro.") else: if data.get('pr_spesa_mese') <= 120: raise forms.ValidationError("Si accettano solo domande con spesa mensile superiore a 120 euro.") data['so_cognome'] = data.get('so_cognome').upper() data['so_nome'] = data.get('so_nome').upper() data['so_nasc_com'] = data.get('so_nasc_com').upper() data['pr_cognome'] = data.get('pr_cognome').upper() data['pr_nome'] = data.get('pr_nome').upper() data['pr_nasc_com'] = data.get('pr_nasc_com').upper() data['so_flag_residente'] = data.get('so_flag_residente') data['pr_stato'] = 0 if data.get('pr_fascia_asilo')=='N': # controlli per fascia nido # obbligatori tutti i dati della DSU if not (data.get('pr_prot_isee_inps') and data.get('pr_data_isee_inps') and data.get('pr_isee')): raise forms.ValidationError("Riempire tutti i campi dell'attestazione DSU" ) #controllo protocollo INPS currdata = timezone.now() curranno = currdata.strftime("%Y") protdsu=data.get('pr_prot_isee_inps').upper() prefix = 'INPS-ISEE-' prima_parte_curranno = prefix + curranno + '-' prima_parte_annoprec = prefix + str(int(curranno)-1) + '-' if ((protdsu[0:15] != prima_parte_curranno) and (protdsu[0:15] != prima_parte_annoprec)) or (protdsu[24:27] != '-00') or (protdsu == prefix + curranno +'-XXXXXXXXX-00'): #or (protdsu == 'INPS-ISEE-' + curranno + '-XXXXXXXXX-00') raise forms.ValidationError('Inserire un numero protocollo DSU nel formato INPS-ISEE-anno-XXXXXXXXX-00 con anno '+ str(int(curranno)-1) + ' oppure ' + curranno) data['pr_prot_isee_inps'] = protdsu # controlli sulla data DSU datadsu=data.get('pr_data_isee_inps') if datadsu < datetime.date(int(curranno)-1, 1, 1): raise forms.ValidationError("Ammesse solo date dal I gennaio " + str(int(curranno)-1)) elif datadsu > datetime.date.today(): raise forms.ValidationError("Ammesse solo date passate") if data.get('pr_tipo_asilo') == 'C': #svuota i campi delle ricevute se l'asilo è pubblico data['pr_num_tot_ricevute'] = None data['pr_importo_tot_ricevute'] = None return data