Example #1
0
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)")
Example #2
0
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)"))
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
 def __init__(self, max_length=None, min_length=None, *args, **kwargs):
     RegexField.__init__(self, trigger_re, max_length, min_length, *args, **kwargs)
Example #6
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)])
Example #7
0
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
Example #8
0
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
Example #9
0
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'})
        }