예제 #1
0
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
예제 #2
0
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()
예제 #3
0
파일: forms.py 프로젝트: mrudtf/datawinners
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')
예제 #4
0
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
예제 #6
0
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
예제 #7
0
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)])
예제 #8
0
파일: forms.py 프로젝트: mrudtf/datawinners
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