class EntityTypeForm(Form): error_css_class = 'error' required_css_class = 'required' entity_type_regex = RegexField( regex="^[A-Za-z\d\s]+$", max_length=20, error_message="Only letters and numbers are valid", required=True, label="New Subject(eg clinic, waterpoint etc)")
class EntityTypeForm(Form): error_css_class = 'error' required_css_class = 'required' entity_type_regex = RegexField( regex="^\s*([A-Za-z\d\s]+[A-Za-z\d]+)\s*$", max_length=20, error_message= _("Only letters and numbers are valid and you must provide more than just whitespaces." ), required=True, label=_("New Subject(eg clinic, waterpoint etc)"))
def clean(self, value): Field.clean(self, value) if value in EMPTY_VALUES: return value values = self.split(value) error_list = [] for value in values: try: value = RegexField.clean(self, value) except ValidationError, e: error_list.append(value)
def __init__(self, *args, **kwargs): postal_code_errors_messages = { 'max_length': _(u'Ensure the postalcode has at most %(max)d characters (it has %(length)d).' ), 'min_length': _(u'Ensure the postalcode has at least %(min)d characters (it has %(length)d).' ), 'invalid_postalcode': _(u'%(value)s is not a valid postalcode'), } fields = ( CharField(), RegexField( regex='^\d+.*$', error_message=_(u'Housenumber should start with a number')), DutchPostcodeField(error_messages=postal_code_errors_messages), CharField(), ) super(AddressField, self).__init__(fields, *args, **kwargs)
def __init__(self, max_length=None, min_length=None, *args, **kwargs): RegexField.__init__(self, trigger_re, max_length, min_length, *args, **kwargs)
class ReporterRegistrationForm(Form): required_css_class = 'required' name = RegexField(regex="[^0-9.,\s@#$%&*~]*", max_length=80, error_message=_("Please enter a valid value containing only letters a-z or A-Z or symbols '`- "), label=_("Name"), required=False) telephone_number = PhoneNumberField(required=True, label=_("Mobile Number"), error_message=_("Please enter a valid phone number.")) geo_code = CharField(max_length=30, required=False, label=_("GPS Coordinates")) location = CharField(max_length=500, required=False, label=_("Name")) project_id = CharField(required=False, widget=HiddenInput()) DEVICE_CHOICES = (('sms', mark_safe('<img src="/media/images/mini_mobile.png" /> <span>SMS</span>')), ( 'web', mark_safe('<img src="/media/images/mini_computer.png" /> <span>Web</span>' + smartphone_icon()))) devices = MultipleChoiceField(label=_('Device'), widget=CheckboxSelectMultiple(), choices=DEVICE_CHOICES, initial=['sms'], required=False, ) email = EmailField(required=False, widget=TextInput(attrs=dict({'class': 'required'}, maxlength=75)), label=_("E-Mail"), error_messages={ 'invalid': _('Enter a valid email address. Example:[email protected]')}) short_code = CharField(required=False, max_length=12, label=_("ID"), widget=TextInput(attrs=dict({'class': 'subject_field'}))) generated_id = BooleanField(required=False, initial=True) # Needed for telephone number validation org_id = None def __init__(self, org_id=None, *args, **kwargs): self.org_id = org_id super(ReporterRegistrationForm, self).__init__(*args, **kwargs) def _is_int(self, s): try: int(s) return True except ValueError: return False def _geo_code_format_validations(self, lat_long, msg): if len(lat_long) != 2: self._errors['geo_code'] = self.error_class([msg]) else: try: if not (-90 < float(lat_long[0]) < 90 and -180 < float(lat_long[1]) < 180): self._errors['geo_code'] = self.error_class([msg]) except Exception: self._errors['geo_code'] = self.error_class([msg]) def _geo_code_validations(self): geo_code = self.cleaned_data.get("geo_code").strip() if not bool(geo_code): return msg = _( "Incorrect GPS format. The GPS coordinates must be in the following format: xx.xxxx,yy.yyyy. Example -18.8665,47.5315") geo_code_string = geo_code.strip() geo_code_string = geo_code_string.replace(",", " ") geo_code_string = re.sub(' +', ' ', geo_code_string) if not is_empty(geo_code_string): lat_long = geo_code_string.split(" ") self._geo_code_format_validations(lat_long, msg) self.cleaned_data['geo_code'] = geo_code_string def clean(self): self.convert_email_to_lowercase() if not self.cleaned_data.get('generated_id') and not self.cleaned_data.get('short_code'): msg = _('This field is required.') self.errors['short_code'] = self.error_class([msg]) self._geo_code_validations() if not self.cleaned_data.get('project_id'): self.cleaned_data['is_data_sender'] = False else: self.cleaned_data['is_data_sender'] = 'True' return self.cleaned_data def clean_short_code(self): short_code = self.cleaned_data.get('short_code') if short_code: if len(short_code) > 12: msg = _("Unique ID should be less than 12 characters") self.errors['short_code'] = self.error_class([msg]) if not re.match("^[a-zA-Z0-9]+$", short_code): msg = _("Only letters and numbers are valid") self.errors['short_code'] = self.error_class([msg]) return short_code def clean_telephone_number(self): """ Validate telephone number. This expects the dbm to be set on the form before trying to clean. """ organization = Organization.objects.get(org_id=self.org_id) mobile_number = self.cleaned_data.get('telephone_number') if organization.in_trial_mode: datasender_filter = DataSenderOnTrialAccount.objects.filter(mobile_number=(mobile_number)) if datasender_filter.exclude(organization=organization).exists(): self._errors['telephone_number'] = self.error_class( [_(u"Sorry, this number has already been used for a different DataWinners Basic account.")]) return mobile_number def clean_email(self): """ Validate that the supplied email address is unique for the site. """ email = self.cleaned_data.get('email') if not email: return email if datasender_count_with(email) > 0: raise forms.ValidationError( _("This email address is already in use. Please supply a different email address.")) return self.cleaned_data['email'] def convert_email_to_lowercase(self): email = self.cleaned_data.get('email') if email is not None: self.cleaned_data['email'] = email.lower() def requires_web_access(self): return self.cleaned_data.get('email') def update_errors(self, validation_errors): mapper = {MOBILE_NUMBER_FIELD_CODE: 'telephone_number', GEO_CODE: GEO_CODE_FIELD_NAME} for field_code, error in validation_errors.iteritems(): self._errors[mapper.get(field_code)] = self.error_class([_(error)])
class ReporterRegistrationForm(Form): required_css_class = 'required' first_name = RegexField( regex="[^0-9.,\s@#$%&*~]*", max_length=20, error_message= "Please enter a valid value containing only letters a-z or A-Z or symbols '`- ", label="* Name") telephone_number = RegexField( required=True, regex="^[^a-zA-Z]*[0-9]+$", max_length=15, label="* Mobile Number", error_message="Please enter a valid phone number") geo_code = CharField(max_length=30, required=False, label="GPS: Enter Lat Long") location = CharField(max_length=100, required=False, label="Enter location") def __init__(self, *args, **kwargs): super(ReporterRegistrationForm, self).__init__(*args, **kwargs) self.fields['first_name'].widget.attrs[ 'watermark'] = "Enter Data Sender's name" self.fields['telephone_number'].widget.attrs[ 'watermark'] = "Enter Data Sender's number eg: " self.fields['location'].widget.attrs[ 'watermark'] = "Enter region, district or commune" self.fields['geo_code'].widget.attrs[ 'watermark'] = "Enter lat and long eg: 19.3 42.37" def _is_int(self, s): try: int(s) return True except ValueError: return False def clean_telephone_number(self): return ("").join([ each for each in self.cleaned_data['telephone_number'] if self._is_int(each) ]) def _geo_code_format_validations(self, lat_long, msg): if len(lat_long) != 2: self._errors['geo_code'] = self.error_class([msg]) else: try: if not (-90 < float(lat_long[0]) < 90 and -180 < float(lat_long[1]) < 180): self._errors['geo_code'] = self.error_class([msg]) except Exception: self._errors['geo_code'] = self.error_class([msg]) def _geo_code_validations(self, b): msg = "Incorrect GPS format. The GPS coordinates must be in the following format: xx.xxxx yy.yyyy. Example -18.8665 47.5315" geo_code_string = b.strip() geo_code_string = (' ').join(geo_code_string.split()) if not is_empty(geo_code_string): lat_long = geo_code_string.split(' ') self._geo_code_format_validations(lat_long, msg) self.cleaned_data['geo_code'] = geo_code_string def clean(self): a = self.cleaned_data.get("location") b = self.cleaned_data.get("geo_code") if not (bool(a) or bool(b)): msg = "Please fill out at least one location field correctly." self._errors['location'] = self.error_class([msg]) self._errors['geo_code'] = self.error_class([msg]) if bool(b): self._geo_code_validations(b) return self.cleaned_data
class ReporterRegistrationForm(Form): required_css_class = 'required' name = RegexField( regex="[^0-9.,\s@#$%&*~]*", max_length=20, error_message= _("Please enter a valid value containing only letters a-z or A-Z or symbols '`- " ), label=_("Name")) telephone_number = PhoneNumberField(required=True, label=_("Mobile Number")) geo_code = CharField(max_length=30, required=False, label=_("GPS: Enter Lat Long")) location = CharField(max_length=100, required=False, label=_("Name")) project_id = CharField(required=False, widget=HiddenInput()) DEVICE_CHOICES = ( ('sms', mark_safe( '<img src="/media/images/mini_mobile.png" /> <span>SMS</span>')), ('web', mark_safe( '<img src="/media/images/mini_computer.png" /> <span>Web</span>' + smartphone_icon()))) devices = MultipleChoiceField( label=_('Device'), widget=CheckboxSelectMultiple(), choices=DEVICE_CHOICES, initial=['sms'], required=False, ) email = EmailField( required=False, widget=TextInput(attrs=dict({'class': 'required'}, maxlength=75)), label=_("Email address"), error_messages={ 'invalid': _('Enter a valid email address. Example:[email protected]') }) short_code = RegexField( "^[a-zA-Z0-9]+$", label=_("Unique ID"), required=False, widget=TextInput(attrs=dict({ 'class': 'subject_field', 'disabled': 'disabled' })), error_message=_("Only letters and numbers are valid")) # Needed for telephone number validation org_id = None def __init__(self, org_id=None, *args, **kwargs): self.org_id = org_id super(ReporterRegistrationForm, self).__init__(*args, **kwargs) def _is_int(self, s): try: int(s) return True except ValueError: return False def _geo_code_format_validations(self, lat_long, msg): if len(lat_long) != 2: self._errors['geo_code'] = self.error_class([msg]) else: try: if not (-90 < float(lat_long[0]) < 90 and -180 < float(lat_long[1]) < 180): self._errors['geo_code'] = self.error_class([msg]) except Exception: self._errors['geo_code'] = self.error_class([msg]) def _geo_code_validations(self, b): msg = _( "Incorrect GPS format. The GPS coordinates must be in the following format: xx.xxxx,yy.yyyy. Example -18.8665,47.5315" ) geo_code_string = b.strip() geo_code_string = (' ').join(geo_code_string.split()) if not is_empty(geo_code_string): lat_long = filter(None, re.split("[ ,]", geo_code_string)) self._geo_code_format_validations(lat_long, msg) self.cleaned_data['geo_code'] = geo_code_string def clean(self): self.convert_email_to_lowercase() location = self.cleaned_data.get("location").strip() geo_code = self.cleaned_data.get("geo_code").strip() if not (bool(location) or bool(geo_code)): msg = _("Please fill out at least one location field correctly.") self._errors['location'] = self.error_class([msg]) self._errors['geo_code'] = self.error_class([msg]) if bool(geo_code): self._geo_code_validations(geo_code) return self.cleaned_data def clean_telephone_number(self): """ Validate telephone number. This expects the dbm to be set on the form before trying to clean. """ organization = Organization.objects.get(org_id=self.org_id) if organization.in_trial_mode: if DataSenderOnTrialAccount.objects.filter(mobile_number=( self.cleaned_data.get('telephone_number'))).exists(): self._errors['telephone_number'] = self.error_class([( u"Sorry, this number has already been used for a different DataWinners trial account." )]) return self.cleaned_data.get('telephone_number') def clean_email(self): """ Validate that the supplied email address is unique for the site. """ if not self.requires_web_access(): return None email = self.cleaned_data.get('email') if is_empty(email): msg = _('This field is required.') self._errors['email'] = self.error_class([msg]) return None if User.objects.filter(email__iexact=self.cleaned_data['email']): raise forms.ValidationError( _("This email address is already in use. Please supply a different email address." )) return self.cleaned_data['email'] def convert_email_to_lowercase(self): email = self.cleaned_data.get('email') if email is not None: self.cleaned_data['email'] = email.lower() def requires_web_access(self): devices = self.cleaned_data.get('devices') return devices.__contains__('web') def update_errors(self, validation_errors): mapper = {MOBILE_NUMBER_FIELD_CODE: 'telephone_number'} validation_error = validation_errors.get(MOBILE_NUMBER_FIELD_CODE) self._errors[mapper[MOBILE_NUMBER_FIELD_CODE]] = self.error_class( [validation_error]) def clean_short_code(self): short_code = self.cleaned_data.get('short_code') if short_code: self.fields.get("short_code").widget.attrs.pop("disabled") return short_code
class UserRegistrationCourseFormBase(ModelForm): pesel = PLPESELField(max_length=11, label=_("PESEL"), widget=TextInput(attrs={'type': 'number'}), required=False) postal_code = RegexField(label=_("Postal code"), regex=r"(?i)^[a-z0-9][a-z0-9\- ]{0,10}[a-z0-9]$") email = EmailField(label=_("E-mail address")) phone = CharField(label=_("Phone"), max_length=30) status_info = CharField(required=False, label=_("Status additional information"), widget=Select()) statement1 = BooleanField(required=True) statement2 = BooleanField(required=True) def __init__(self, *args, **kwargs): super(UserRegistrationCourseFormBase, self).__init__(*args, **kwargs) self.fields['statement1'].label = _( "I agree with <a href='{url}' target='_blank'>the project participant's declaration.</a>" ).format(url=static(settings.STATEMENT1_PDF)) self.fields['statement2'].label = _( "I consent to <a href='{url}' target='_blank'>the processing of my personal data to participate in the project.</a>" ).format(url=static(settings.STATEMENT2_PDF)) self.helper = FormHelper(self) self.helper.layout = Layout( Fieldset( '', Div(HTML( '<div class="col-lg-4 pl-lg-0 px-0"><h3 class="h4 mx-0">{}</h3></div>' .format(_("Participant details"))), Div(Div(Div( 'first_name', css_class="col-md-6 register-course__input-container"), Div('last_name', css_class= "col-md-6 register-course__input-container"), css_class="row"), Div(Div('citizenship', css_class= "col-md-6 register-course__input-container"), Div('pesel', css_class= "col-md-6 register-course__input-container"), css_class="row"), Div(Div('gender', css_class= "col-md-3 register-course__input-container"), Div('age', css_class= "col-md-3 register-course__input-container"), Div('education', css_class= "col-md-6 register-course__input-container"), css_class="row"), css_class="group col-lg-8 ml-lg-auto px-0"), css_class="d-flex flex-wrap"), Div(HTML('<hr class="w-100 pb-40" />'), HTML( '<div class="col-lg-4 pl-lg-0 px-0"><h3 class="h4 mx-0 w-67">{}</h3></div>' .format(_("Contact details / Postal address"))), Div(Div(Div( 'phone', css_class="col-md-6 register-course__input-container"), Div('email', css_class= "col-md-6 register-course__input-container"), css_class="row"), Div(Div('street', css_class= "col-md-6 register-course__input-container"), Div('street_no', css_class= "col-md-3 register-course__input-container"), Div('street_building_no', css_class= "col-md-3 register-course__input-container"), Div('postal_code', css_class= "col-md-6 register-course__input-container"), Div('city', css_class= "col-md-6 register-course__input-container"), css_class="row"), Div(Div('country', css_class= "col-md-6 register-course__input-container"), Div('voivodeship', css_class= "col-md-6 register-course__input-container"), Div('county', css_class= "col-md-6 register-course__input-container"), Div('commune', css_class= "col-md-6 register-course__input-container"), css_class="row"), css_class="group col-lg-8 ml-lg-auto px-0"), css_class="d-flex flex-wrap"), Div(HTML('<hr class="w-100 pb-40" />'), HTML( '<div class="col-lg-4 pl-lg-0 px-0"><h3 class="h4 mx-0">{}</h3></div>' .format(_("Additional information"))), Div(Div(Div( 'status', css_class="col-md-12 register-course__input-container" ), Div('status_info', css_class= "col-md-12 register-course__input-container"), Div('profession', css_class= "col-md-6 register-course__input-container"), Div('work_name', css_class= "col-md-6 register-course__input-container"), css_class="row"), Div(Div('start_project_date', css_class= "col-md-12 register-course__input-container"), Div('end_project_date', css_class= "col-md-12 register-course__input-container"), Div('start_support_date', css_class= "col-md-12 register-course__input-container"), css_class="row d-none"), Div(Div('origin', css_class= "col-md-12 register-course__input-container"), Div('homeless', css_class= "col-md-12 register-course__input-container"), Div('disabled_person', css_class= "col-md-12 register-course__input-container"), Div('social_disadvantage', css_class= "col-md-12 register-course__input-container"), css_class="row align-items-end"), css_class="group col-lg-8 ml-lg-auto px-0"), css_class="d-flex flex-wrap"), ), Div(HTML('<hr class="w-100 pb-40" />'), HTML( '<div class="col-lg-4 pl-lg-0 px-0"><h3 class="h4 mx-0">{}</h3></div>' .format(_("Required consents"))), Div('statement1', 'statement2', css_class="group mb-md-5 mb-4 col-lg-8 ml-lg-auto px-0"), css_class="d-flex flex-wrap"), Div( HTML('<hr class="w-100 pb-30 my-0" />'), Div(HTML( '<div class="col-lg-2 col-xs-12 col-md-3 mr-lg-auto order-3 order-md-1 d-flex"><img src="/static/images/logo-navoica.svg" alt="Logo Navoica.pl" class="navoica-logo img-fluid align-self-center" /></div>' ), Div(HTML( '<button class="btn btn-cancel rounded-0 mr-lg-5 mr-md-2 d-none">{}</button>' .format(_("Cancel"))), ButtonHolder( Submit('submit', _("Register me for the course"), css_class= 'button white w-100 rounded-0 btn-submit')), css_class= 'form-buttons d-flex flex-wrap oder-1 order-md-2 justify-content-between flex-column flex-md-row' ), css_class= 'd-flex justify-content-between flex-wrap align-items-center' )), ) class Meta: model = UserRegistrationCourse exclude = ('user', 'course_id', 'language_code') widgets = { 'origin': RadioSelect(attrs={'required': 'required'}), 'homeless': RadioSelect(attrs={'required': 'required'}), 'disabled_person': RadioSelect(attrs={'required': 'required'}), 'social_disadvantage': RadioSelect(attrs={'required': 'required'}) }