class OrganizationForm(ModelForm): required_css_class = 'required' name = forms.CharField(required=True, label=_('Organization name')) sector = forms.CharField(required=False, widget=( forms.Select(attrs={'class': 'width-200px'}, choices=get_organization_sectors())), label=_('Organization Sector')) address = forms.CharField(required=True, max_length=30, label=_('Address')) city = forms.CharField(max_length=30, required=True, label=_('City')) state = forms.CharField(max_length=30, required=False, label=_('State / Province')) country = forms.CharField(required=True, widget=( forms.Select(attrs={'class': 'width-200px', 'disabled': 'disabled'}, choices=get_country_list())), label=_('Country')) zipcode = forms.CharField(max_length=30, required=True, label=_('Postal / Zip Code')) office_phone = PhoneNumberField(required=False, label=_("Office Phone Number"), error_message=_("Please enter a valid phone number.")) website = forms.URLField(required=False, label=_('Website')) class Meta: model = Organization exclude = ('in_trial_mode', 'active_date', 'is_deactivate_email_sent', 'addressline2', 'language', 'status', 'status_changed_datetime') def update(self): if self.is_valid(): self.save() return self
class UserProfileForm(forms.Form): required_css_class = 'required' title = forms.CharField(max_length=30, required=False, label=_("Job title")) full_name = forms.CharField(max_length=80, required=True, label=_('Name')) username = forms.EmailField(max_length=75, required=True, label=_("Email"), error_messages={ 'invalid': _('Enter a valid email address. Example:[email protected]')}) mobile_phone = PhoneNumberField(required=True, label=_("Phone Number"), error_message=_("Please enter a valid phone number.")) def __init__(self, organization=None, reporter_id=None, *args, **kwargs): self.organization = organization self.reporter_id = reporter_id forms.Form.__init__(self, *args, **kwargs) def clean_mobile_phone(self): mobile_number = self.cleaned_data.get('mobile_phone') validator = MobileNumberValidater(self.organization, mobile_number, self.reporter_id) valid, message = validator.validate() if not valid and message: raise ValidationError(message) return self.cleaned_data.get('mobile_phone') def clean_username(self): username = self.cleaned_data.get('username') if datasender_count_with(username) > 0: raise ValidationError(_("This email address is already in use. Please supply a different email address")) return self.cleaned_data.get('username').lower()
class UserProfileForm(forms.Form): required_css_class = 'required' title = forms.CharField(max_length=30, required=False, label=_("Job title")) first_name = forms.CharField(max_length=30, required=True, label=_('First name')) last_name = forms.CharField(max_length=30, required=True, label=_('Last name')) username = forms.EmailField(max_length=75, required=True, label=_("Email"), error_messages={ 'invalid': _('Enter a valid email address. Example:[email protected]')}) mobile_phone = PhoneNumberField(required=True, label=_("Phone Number")) def __init__(self, organization=None, *args, **kwargs): self.organization = organization forms.Form.__init__(self, *args, **kwargs) def clean_mobile_phone(self): mobile_number = self.cleaned_data.get('mobile_phone') validator = get_unique_mobile_number_validator(self.organization) if not validator(self.organization, mobile_number): raise ValidationError(_("This phone number is already in use. Please supply a different phone number")) return self.cleaned_data.get('mobile_phone') def clean_username(self): username = self.cleaned_data.get('username') if User.objects.filter(username=username).count() > 0: raise ValidationError(_("This email address is already in use. Please supply a different email address")) return self.cleaned_data.get('username')
class FullRegistrationForm(MinimalRegistrationForm): organization_address = forms.CharField(required=True, max_length=30, label=_('Address')) organization_addressline2 = forms.CharField(required=False, max_length=30, label=_('Address line 2')) organization_state = forms.CharField(max_length=30, required=False, label=_('State / Province')) organization_zipcode = forms.RegexField( required=True, max_length=30, regex="^[a-zA-Z\d-]*$", error_message=_("Please enter a valid Postal / Zip code"), label=_('Postal / Zip Code')) organization_office_phone = PhoneNumberField( required=False, label=_("Office Phone Number"), error_message=_("Please enter a valid phone number.")) organization_website = forms.URLField(required=False, label=_('Website')) account_type, invoice_period, preferred_payment = payment_details_form() def clean_mobile_phone(self): return self.cleaned_data['mobile_phone']
def create(self, field): telephone_number_field = PhoneNumberField(label=field.label, initial=field.value, required=field.is_required(), help_text=field.instruction) telephone_number_field.widget.attrs["watermark"] = get_text_field_constraint_text(field) telephone_number_field.widget.attrs['style'] = 'padding-top: 7px;' if field.name == LOCATION_TYPE_FIELD_NAME and isinstance(field, HierarchyField): telephone_number_field.widget.attrs['class'] = 'location_field' return telephone_number_field
class MinimalRegistrationForm(RegistrationFormUniqueEmail): required_css_class = 'required' title = forms.CharField(label=_("Job title"), max_length=30, required=False) email = forms.EmailField(widget=forms.TextInput(attrs=dict({'class': 'required'}, maxlength=75)), label=_("Email address"), error_messages={ 'invalid': _('Enter a valid email address. Example:[email protected]')}) password1 = forms.CharField(required=True, widget=forms.PasswordInput(render_value=False), label=_("Password"), min_length=6) password2 = forms.CharField(required=True, widget=forms.PasswordInput(render_value=False), label=_("Password (again)")) full_name = forms.CharField(max_length=30, required=True, label=_('Name')) mobile_phone = PhoneNumberField(required=True, label=_("Mobile Phone Number"), error_message=_("Please enter a valid phone number.")) organization_name = forms.CharField(required=True, max_length=30, label=_('Organization Name')) organization_sector = forms.CharField(required=False, widget=( forms.Select(attrs={'class': 'width-200px'}, choices=get_organization_sectors())), label=_('Organization Sector')) organization_country = forms.CharField(required=True, widget=( forms.Select(attrs={'class': 'width-200px'}, choices=get_country_list())), label=_('Country')) organization_city = forms.CharField(max_length=30, required=True, label=_('City')) username = forms.CharField(max_length=30, required=False) language = forms.CharField(widget=forms.HiddenInput(), max_length=2, initial=_("en")) def clean_mobile_phone(self): mobile_number = self.cleaned_data.get('mobile_phone') if len(DataSenderOnTrialAccount.objects.filter(mobile_number=(mobile_number))) > 0 or \ mobile_number in get_trial_account_user_phone_numbers(): raise ValidationError(_("This phone number is already in use. Please supply a different phone number")) return self.cleaned_data.get('mobile_phone') def clean_email(self): email = super(MinimalRegistrationForm, self).clean_email() return email.lower() def strip_and_validate(self, field_name): if self.cleaned_data.get(field_name): self.cleaned_data[field_name] = self.cleaned_data.get(field_name).strip() if self.cleaned_data.get(field_name) == "": self._errors[field_name] = self.error_class([self.fields[field_name].error_messages['required']]) def clean(self): for field_name in ['full_name', 'organization_name', 'organization_city']: self.strip_and_validate(field_name) if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: if self.cleaned_data['password1'] != self.cleaned_data['password2']: msg = _("The two password fields didn't match.") self._errors['password1'] = self.error_class([msg]) else: if self.cleaned_data['password1'] != self.cleaned_data['password1'].strip(): msg = _("There should not be any space at the beginning and the end of the password.") self._errors['password1'] = self.error_class([msg]) return self.cleaned_data
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' 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