# -*- coding: utf-8 -*- # authentic2_auth_fedict - Fedict authentication for Authentic # Copyright (C) 2016 Entr'ouvert # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import time from urllib.parse import urljoin from django import forms from django.conf import settings from django.utils.translation import ugettext_lazy as _ import re import requests class NrnField(forms.CharField): def validate(self, value): super(NrnField, self).validate(value) if not value: return try: if (97 - int(value[:9]) % 97) != int(value[-2:]) and (97 - int('2' + value[:9]) % 97) != int( value[-2:] ): raise ValueError() except ValueError: raise forms.ValidationError(_('Invalid format for national registry number.')) class DateWidget(forms.TextInput): class Media: css = {'all': ('authentic2_auth_fedict/css/datetimepicker.css',)} js = ( 'authentic2_auth_fedict/js/bootstrap-datetimepicker.js', 'authentic2_auth_fedict/js/bootstrap-datetimepicker.fr.js', 'authentic2_auth_fedict/js/support.js', ) def __init__(self, attrs=None): if not attrs: attrs = {} attrs['class'] = 'date-widget' super(forms.TextInput, self).__init__(attrs=attrs) class DateField(forms.CharField): widget = DateWidget def validate(self, value): super(DateField, self).validate(value) if not value: return for format_string in ('%d/%m/%Y', '%Y-%m-%d'): try: time.strptime(value, format_string) except ValueError: continue break else: raise forms.ValidationError(_('Invalid format')) class StreetWidget(forms.TextInput): class Media: css = {'all': ('xstatic/themes/smoothness/jquery-ui.css',)} js = ( 'xstatic/jquery-ui.js', 'authentic2_auth_fedict/js/support.js', ) def __init__(self, attrs=None): if not attrs: attrs = {} attrs['class'] = 'street-widget' if getattr(settings, 'IMIO_STREETS_URL', None): street_url = settings.IMIO_STREETS_URL else: passerelle_url = list(settings.KNOWN_SERVICES['passerelle'].values())[0]['url'] street_url = urljoin(passerelle_url, '/imio-liege-lisrue/lisrue-be/voies/') attrs['data-autocomplete-url'] = street_url super(forms.TextInput, self).__init__(attrs=attrs) class StreetField(forms.CharField): widget = StreetWidget class CountryWidget(forms.Select): class Media: css = {'all': ('xstatic/themes/smoothness/jquery-ui.css',)} js = ( 'xstatic/jquery-ui.js', 'authentic2_auth_fedict/js/support.js', ) def __init__(self, attrs=None): if not attrs: attrs = {} attrs['class'] = 'country-widget' if getattr(settings, 'IMIO_COUNTRY_URL', None): country_url = settings.IMIO_COUNTRY_URL else: passerelle_url = list(settings.KNOWN_SERVICES['passerelle'].values())[0]['url'] country_url = urljoin(passerelle_url, '/csvdatasource/pays/data') try: self.choices = [(x['id'], x['text']) for x in requests.get(country_url).json()['data']] except ValueError: self.choices = [] super(forms.Select, self).__init__(attrs=attrs, choices=self.choices) class CountryField(forms.CharField): widget = CountryWidget choices = [] class NumHouseField(forms.CharField): def validate(self, value): super(NumHouseField, self).validate(value) if not value: return try: if not re.match("^[1-9][0-9]*$", value): raise ValueError() except ValueError: raise forms.ValidationError(getattr(settings, 'A2_NUMHOUSE_ERROR_MESSAGE', _('Invalid format'))) class NumPhoneField(forms.CharField): def validate(self, value): super(NumPhoneField, self).validate(value) if not value: return try: if not re.match("^(0|\\+|00)(\d{8,})", value): raise ValueError() except ValueError: raise forms.ValidationError(getattr(settings, 'A2_NUMPHONE_ERROR_MESSAGE', _('Invalid format')))