class AuthorizationForm(forms.ModelForm):

    first_name = forms.CharField(label="Nom", required=False)

    last_name = forms.CharField(label="Prenom", required=False)

    username = forms.CharField(label="Nom d'utilisateur")

    level = forms.ModelChoiceField(
        label="Niveau d'autorisation",
        queryset=UserLevelPermission.objects.filter(rank__gte=1).order_by('rank'),
        empty_label=None)

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)
        if self.instance and hasattr(self.instance, 'user'):
            self.fields['first_name'].initial = self.instance.user.first_name
            self.fields['last_name'].initial = self.instance.user.last_name
            self.fields['level'].initial = self.instance.level
            self.fields['username'].initial = self.instance.user.username
            self.fields['first_name'].disabled = True
            self.fields['last_name'].disabled = True
            self.fields['username'].disabled = True

    class Meta:
        model = Authorization
        fields = (
            'first_name',
            'last_name',
            'username',
            'level',
        )
Exemple #2
0
class RespuestaOpcionesForm(forms.Form):
    """!
    Clase que permite crear el formulario para las respuestas de tipo Opciones

    @author Manuel Zambrano
    @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
    @date 29-08-2018
    @version 1.0.0
    """

    respuesta = forms.ModelChoiceField(label='Opcion',
                                       queryset=Opcion.objects.all(),
                                       required=True,
                                       empty_label=None)

    def __init__(self, *arg, **kwargs):
        """!
        Funcion que muestra el init del formulario

        @author Manuel Zambrano
        @copyright <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU Public License versión 2 (GPLv2)</a>
        @date 29-08-2018
        @version 1.0.0
        """

        super(RespuestaOpcionesForm, self).__init__(*arg, **kwargs)
Exemple #3
0
class FeatureLinkForm(forms.ModelForm):

    feature_to = forms.ModelChoiceField(
        label="Signalement lié", queryset=Feature.objects.all(),
        empty_label=None)

    class Meta:
        model = FeatureLink
        fields = (
            'relation_type',
            'feature_to',
        )

    def __init__(self, *args, **kwargs):
        feature_type = kwargs.pop('feature_type', None)
        feature = kwargs.pop('feature', None)
        super().__init__(*args, **kwargs)
        qs = Feature.objects.all()
        if feature_type:
            qs = qs.filter(
                feature_type=feature_type
            )
        if feature:
            qs = qs.exclude(
                feature_id=feature.feature_id
            )
        try:
            self.fields['feature_to'].queryset = qs
            self.fields['feature_to'].label_from_instance = lambda obj: "{} ({} - {})".format(
                obj.title, obj.display_creator, obj.created_on.strftime("%d/%m/%Y %H:%M"))
        except Exception:
            logger.exception('No related features found')
Exemple #4
0
class HomeForm(forms.Form):
    name = forms.CharField(
        min_length=1,
        max_length=255,
        strip=True,
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )
    lat = forms.FloatField(
        widget=forms.HiddenInput()
    )
    lng = forms.FloatField(
        widget=forms.HiddenInput()
    )
    radius = forms.IntegerField(
        max_value='1000000000',
        min_value='5',
        widget=forms.NumberInput(attrs={'class': 'form-control'}),
        initial=50
    )
    module = forms.ModelChoiceField(
        widget=forms.RadioSelect,
        queryset=Module.objects.all(),
        empty_label='モジュールを選択',
        required=True
    )

    class Meta:
        labels = {
            'radius': 'Radius',
            'name': 'Name',
            'module': 'Module'
        }
Exemple #5
0
class ProjectForm(forms.ModelForm):
    european_network = forms.BooleanField(
        label=
        u"Etre visible sur le réseau européen des villes et territoires durables (<a target='_blank' href='http://rfsc.eu/fr/'>RFSC</a>)",
        required=False,
        help_text=
        u"En cochant cette case, la fiche d'identité de votre projet sera visible sur le site du 'cadre de référence des villes et territoires durables', favorisant la mise en réseau des collectivités européennes ayant des expériences en matière d'aménagement durable."
    )
    commune = forms.ModelChoiceField(
        label="Commune principale",
        help_text=u"Sur quelle commune est situé l'ÉcoQuartier",
        queryset=Commune.objects.all(),
        widget=autocomplete.ModelSelect2(url='commune-autocomplete'))
    communes = forms.ModelMultipleChoiceField(
        label="Autres communes",
        help_text="Si le projet est sur plusieurs communes",
        queryset=Commune.objects.all(),
        widget=autocomplete.ModelSelect2Multiple(url='commune-autocomplete'),
        required=False)
    coordonnees_geographiques = GeometryCollectionField(
        label="Localisation du projet",
        help_text=u"Dessiner sur la carte la zone où se trouve votre projet",
    )

    type_operations = forms.ModelMultipleChoiceField(
        label=u"Type d'opérations (plusieurs choix possibles)",
        queryset=TypeOperation.objects.all(),
        widget=forms.CheckboxSelectMultiple(),
        required=False)
    vocations = forms.ModelMultipleChoiceField(
        label=u"Vocations (plusieurs choix possibles)",
        queryset=Vocation.objects.all(),
        widget=forms.CheckboxSelectMultiple(),
        required=False)
    demarches = forms.ModelMultipleChoiceField(
        label=
        u"Engagement dans d'autres démarches de développement durable (plusieurs choix possibles)",
        queryset=Demarche.objects.all(),
        widget=forms.CheckboxSelectMultiple(),
        required=False)
    tags = forms.ModelMultipleChoiceField(
        label=
        u"Points forts du projet (plusieurs choix possibles dans la limite de 5)",
        queryset=Tag.objects.all(),
        widget=forms.CheckboxSelectMultiple(),
        required=False)

    class Meta:
        model = Project
        fields = [
            'nom', 'commune', 'communes', 'project_manager_lastname',
            'project_manager_firstname', 'project_manager_mail',
            'project_manager_structure', 'project_developer_lastname',
            'project_developer_firstname', 'project_developer_mail',
            'project_developer_structure', 'plusieurs_tranches',
            'coordonnees_geographiques', 'type_operations', 'vocations',
            'procedure', 'description', 'demarches', 'demarches_autres',
            'tags', 'charte'
        ]
Exemple #6
0
class ContextLayerForm(forms.ModelForm):
    layer = forms.ModelChoiceField(label="Couche",
                                   queryset=Layer.objects.all(),
                                   empty_label=None)

    class Meta:
        model = ContextLayer
        fields = ['layer', 'order', 'opacity']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['order'].widget = HiddenInput()
Exemple #7
0
class BasicInformationForm(forms.ModelForm):
    """Form for Basic Information model."""
    name = forms.CharField(
        required=True,
        label='Your name',
        widget=forms.TextInput(
            attrs={
                'placeholder': 'John Doe'})
    )
    email = forms.EmailField(
        required=True,
        label='Your email',
        widget=forms.EmailInput(
            attrs={
                'readonly': 'readonly',
                'placeholder': '*****@*****.**'})
    )
    website = forms.URLField(
        required=False,
        label='Your website',
        widget=forms.URLInput(
            attrs={
                'placeholder': 'http://john.doe.com'})
    )
    role = forms.ModelChoiceField(
        label='Your role',
        queryset=Role.objects.filter(sort_number__gte=1),
        initial=1)
    email_updates = forms.BooleanField(
        required=False,
        label='Receive project news and updates')
    location = forms.PointField(
        label='Click your location on the map',
        widget=LeafletWidget())

    class Meta:
        """Association between models and this form."""
        model = User
        fields = ['name', 'email', 'website', 'role', 'location',
                  'email_updates']

    def save(self, commit=True):
        """Save form.

        :param commit: Whether committed to db or not.
        :type commit: bool
        """
        user = super(BasicInformationForm, self).save(commit=False)
        if commit:
            user.save()
        return user
class ProjectModelForm(forms.ModelForm):

    title = forms.CharField(label='Titre', max_length=100)

    thumbnail = forms.ImageField(label="Illustration du projet", required=False)

    description = forms.CharField(
        label='Description', required=False, widget=forms.Textarea())

    moderation = forms.BooleanField(label='Modération', required=False)

    is_project_type = forms.BooleanField(
        label="Est un projet type", required=False)

    archive_feature = forms.IntegerField(
        label='Délai avant archivage', required=False)

    delete_feature = forms.IntegerField(
        label='Délai avant suppression', required=False)

    access_level_pub_feature = forms.ModelChoiceField(
        label='Visibilité des signalements publiés',
        queryset=UserLevelPermission.objects.filter(rank__lte=2).order_by('rank'),
        empty_label=None,)

    access_level_arch_feature = forms.ModelChoiceField(
        label='Visibilité des signalements archivés',
        queryset=UserLevelPermission.objects.filter(rank__lte=4).order_by('rank'),
        empty_label=None,)

    create_from = forms.CharField(required=False, widget=HiddenInput())

    class Meta:
        model = Project
        fields = [
            'title',
            'description',
            'moderation',
            'thumbnail',
            'access_level_pub_feature',
            'access_level_arch_feature',
            'archive_feature',
            'delete_feature',
            'is_project_type',
            'create_from',
        ]

    def __init__(self, *args, **kwargs):

        slug = kwargs.pop('create_from', None)
        project_type = Project.objects.filter(slug=slug).first()

        super().__init__(*args, **kwargs)
        instance = kwargs.get('instance')

        if instance:
            # Optionnel
            for key in ['archive_feature', 'delete_feature']:
                source = getattr(instance, key)
                self.fields[key].initial = source
        elif project_type:
            for key in [
                    'archive_feature', 'delete_feature',
                    'access_level_pub_feature', 'access_level_arch_feature',
                    'description', 'moderation', 'thumbnail']:
                source = getattr(project_type, key)
                self.fields[key].initial = source
            self.fields['title'].initial = "{} (Copie-{})".format(
                project_type.title, timezone.now().strftime("%d/%m/%Y %H:%M")
            )
            self.fields['title'].help_text = "Le titre d'un projet doit etre unique. "
            self.fields['create_from'].initial = slug
        else:
            self.fields['archive_feature'].initial = 0
            self.fields['delete_feature'].initial = 0

    def clean_title(self):
        title = self.cleaned_data.get('title')
        if self.instance.pk:
            if Project.objects.filter(title=title).exclude(pk=self.instance.pk).exists():
                msg = "Veuillez modifier le titre de votre projet, un projet avec ce titre existe déjà."
                raise forms.ValidationError(msg)
        else:
            if Project.objects.filter(title=title).exists():
                msg = "Veuillez modifier le titre de votre projet, un projet avec ce titre existe déjà."
                raise forms.ValidationError(msg)
        return title

    def clean(self):
        cleaned_data = super().clean()
        archive_feature = cleaned_data.get('archive_feature', None)
        delete_feature = cleaned_data.get('delete_feature', None)
        if archive_feature and delete_feature and archive_feature > delete_feature:
            raise forms.ValidationError({
                'archive_feature': "Le délais de suppression doit être supérieur au délais d'archivage. "
            })
        return cleaned_data
Exemple #9
0
class EmpleadoForm(forms.Form):

    cedula = forms.CharField(required=False, label=u'Cédula')
    nombres = forms.CharField(max_length=250,
                              widget=forms.TextInput(attrs={'size': '30'}))
    apellido_paterno = forms.CharField(
        max_length=250, widget=forms.TextInput(attrs={'size': '30'}))
    apellido_materno = forms.CharField(
        max_length=250,
        widget=forms.TextInput(attrs={'size': '30'}),
        required=False)

    pais = forms.ModelChoiceField(
        queryset=Pais.objects.all(),
        empty_label="Escoger un pais",
        widget=forms.Select(attrs={
            'placeholder': 'País',
            'onChange': "getProvincias(this.value)"
        }))
    provincia = forms.ModelChoiceField(
        queryset=Provincia.objects.none(),
        empty_label="Escoger una provincia",
        widget=forms.Select(
            attrs={
                'placeholder': 'Provincia o estado',
                'onChange': "getCiudades(this.value)"
            }))
    ciudad = forms.ModelChoiceField(
        queryset=Ciudad.objects.none(),
        empty_label="Escoger una ciudad",
        widget=forms.Select(attrs={'placeholder': 'Ciudad o Cantón'}))

    sexo = forms.ChoiceField(choices=PersonaNatural.SEXO_CHOICES,
                             required=True)
    fecha_nacimiento = forms.DateField(required=False)
    observaciones = forms.CharField(widget=forms.Textarea())
    usuario = forms.CharField(max_length=13,
                              widget=forms.TextInput(attrs={'size': '30'}))
    contrasenia = forms.CharField(
        max_length=13, widget=forms.PasswordInput(attrs={'size': '30'}))
    email = forms.EmailField(max_length=25,
                             widget=forms.TextInput(attrs={'size': '30'}))
    plazas_trabajo = forms.ModelMultipleChoiceField(
        queryset=PlazaTrabajo.objects.all(), widget=forms.SelectMultiple)
    foto = forms.ImageField(required=False)

    def modificarQuerySet(self, pais_id, provincia_id):
        if pais_id not in ('', None):
            self.fields['provincia'].queryset = Provincia.objects.filter(
                pais__id=pais_id)

        if provincia_id not in ('', None):
            self.fields['ciudad'].queryset = Ciudad.objects.filter(
                provincia__id=provincia_id)

    def save(self, empleado=None):
        cleaned_data = super(EmpleadoForm, self).clean()

        if empleado is None:
            persona = Persona()
            persona.tipo = Persona.TIPO_PERSONA_NATURAL
            persona.observaciones = cleaned_data["observaciones"]
            persona.ruc = cleaned_data["cedula"]
            persona.nombre_comercial = ""
            persona.save()

            usuario = User()
            usuario.username = cleaned_data["usuario"]
            usuario.set_password(cleaned_data["contrasenia"])
            usuario.email = cleaned_data["email"]
            usuario.save()

            persona_natural = PersonaNatural()
            persona_natural.ciudad_nacimiento = cleaned_data['ciudad']
            persona_natural.cedula = cleaned_data["cedula"]
            persona_natural.nombres = cleaned_data["nombres"]
            persona_natural.apellido_paterno = cleaned_data["apellido_paterno"]
            persona_natural.apellido_materno = cleaned_data["apellido_materno"]
            persona_natural.persona = persona
            persona_natural.sexo = cleaned_data["sexo"]
            persona_natural.fecha_nacimiento = cleaned_data["fecha_nacimiento"]
            persona_natural.save()

            empleado = Empleado()
            empleado.persona = persona_natural
            empleado.usuario = usuario
            empleado.foto = cleaned_data["foto"]
            empleado.observaciones = cleaned_data["observaciones"]
            empleado.save()
            empleado.plazas_trabajo = cleaned_data["plazas_trabajo"]
            empleado.save()
        else:
            empleado.persona.nombres = cleaned_data["nombres"]
            empleado.persona.apellido_paterno = cleaned_data[
                "apellido_paterno"]
            empleado.persona.apellido_materno = cleaned_data[
                "apellido_materno"]
            empleado.persona.sexo = cleaned_data["sexo"]
            empleado.persona.cedula = cleaned_data["cedula"]
            empleado.persona.ciudad_nacimiento = cleaned_data["ciudad"]
            empleado.persona.save()

            empleado.usuario.email = cleaned_data["email"]
            empleado.usuario.save()

            empleado.foto = cleaned_data["foto"]
            empleado.observaciones = cleaned_data["observaciones"]
            empleado.save()

            empleado.plazas_trabajo = cleaned_data["plazas_trabajo"]
            empleado.save()

        return empleado

    def clean_usuario(self):
        if self.cleaned_data['usuario']:
            p = User.objects.filter(username=self.cleaned_data['usuario'])
            if len(p) > 0:
                raise forms.ValidationError(
                    _("Ya esxiste un usuario con este username"))
        return self.cleaned_data['usuario']
Exemple #10
0
class ProjectModelForm(forms.ModelForm):

    title = forms.CharField(label='Titre', max_length=100)

    thumbnail = forms.ImageField(label="Illustration du projet",
                                 required=False)

    description = forms.CharField(label='Description',
                                  required=False,
                                  widget=forms.Textarea())

    moderation = forms.BooleanField(label='Modération', required=False)

    archive_feature = forms.IntegerField(label='Délai avant archivage',
                                         required=False)

    delete_feature = forms.IntegerField(label='Délai avant suppression',
                                        required=False)

    access_level_pub_feature = forms.ModelChoiceField(
        label='Visibilité des signalements publiés',
        queryset=UserLevelPermission.objects.filter(
            rank__lte=2).order_by('rank'),
        empty_label=None,
    )

    access_level_arch_feature = forms.ModelChoiceField(
        label='Visibilité des signalements archivés',
        queryset=UserLevelPermission.objects.filter(
            rank__lte=4).order_by('rank'),
        empty_label=None,
    )

    class Meta:
        model = Project
        fields = [
            'title',
            'description',
            'moderation',
            'thumbnail',
            'access_level_pub_feature',
            'access_level_arch_feature',
            'archive_feature',
            'delete_feature',
        ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        instance = kwargs.get('instance')

        if instance:
            self.fields['archive_feature'].initial = instance.archive_feature
            self.fields['delete_feature'].initial = instance.delete_feature
        else:
            self.fields['archive_feature'].initial = 0
            self.fields['delete_feature'].initial = 0

    def clean_title(self):
        title = self.cleaned_data.get('title')
        if self.instance.pk:
            if Project.objects.filter(title=title).exclude(
                    pk=self.instance.pk).exists():
                msg = "Veuillez modifier le titre de votre projet, un projet avec ce titre existe déjà."
                raise forms.ValidationError(msg)
        else:
            if Project.objects.filter(title=title).exists():
                msg = "Veuillez modifier le titre de votre projet, un projet avec ce titre existe déjà."
                raise forms.ValidationError(msg)
        return title

    def clean(self):
        cleaned_data = super().clean()
        archive_feature = cleaned_data.get('archive_feature', None)
        delete_feature = cleaned_data.get('delete_feature', None)
        if archive_feature and delete_feature and archive_feature > delete_feature:
            raise forms.ValidationError(
                "Le délai d'archivage doit être inférieur au délai de suppression. "
            )
        return cleaned_data
Exemple #11
0
class DealSpatialForm(BaseForm):
    exclude_in_export = ['target_region', 'contract_area', 'intended_area', 'production_area']
    ACCURACY_CHOICES = (
        ("", _("---------")),
        ("Country", _("Country")),
        ("Administrative region", _("Administrative region")),
        ("Approximate location", _("Approximate location")),
        ("Exact location", _("Exact location")),
        ("Coordinates", _("Coordinates")),
    )
    AREA_FIELDS = (
        'contract_area',
        'intended_area',
        'production_area',
    )

    form_title = _('Location')
    tg_location = TitleField(
        required=False, label="", initial=_("Location"))
    level_of_accuracy = forms.ChoiceField(
        required=False, label=_("Spatial accuracy level"),
        choices=ACCURACY_CHOICES)
    location = forms.CharField(
        required=True, label=_("Location"), widget=LocationWidget)
    point_lat = forms.CharField(
        required=False, label=_("Latitude"), widget=forms.TextInput,
        initial="")
    point_lon = forms.CharField(
        required=False, label=_("Longitude"), widget=forms.TextInput,
        initial="")
    facility_name = forms.CharField(
        required=False, label=_("Facility name"), widget=forms.TextInput,
        initial="")
    target_country = CountryField(required=False, label=_("Target Country"))
    target_region = forms.ModelChoiceField(
        required=False, label=_("Target Region"), widget=forms.HiddenInput,
        queryset=Region.objects.all().order_by("name"))
    location_description = forms.CharField(
        required=False, label=_("Location description"),
        widget=forms.TextInput, initial="")
    contract_area = AreaField(required=False, label=_("Contract area"))
    intended_area = AreaField(required=False, label=_("Intended area"))
    production_area = AreaField(required=False, label=_("Area in operation"))

    tg_location_comment = forms.CharField(
        required=False, label=_("Comment on Location"), widget=CommentInput)

    class Meta:
        name = 'location'

    def __init__(self, *args, **kwargs):
        '''
        Pass the values we need through to map widgets
        '''
        super().__init__(*args, **kwargs)

        lat_lon_attrs = self.get_default_lat_lon_attrs()

        # Bind area maps to the main location map
        area_attrs = {
            'bound_map_field_id': '{}-map'.format(self['location'].html_name)
        }
        area_attrs.update(lat_lon_attrs)

        location_attrs = self.get_location_map_widget_attrs()
        location_attrs.update(lat_lon_attrs)

        if area_attrs:
            for polygon_field in self.AREA_FIELDS:
                widget = AreaWidget(map_attrs=area_attrs)
                self.fields[polygon_field].widget = widget

        # Public field gets a mapwidget, so check for that
        if isinstance(self.fields['location'].widget, MapWidget):
            self.fields['location'].widget = MapWidget(attrs=location_attrs)
        else:
            self.fields['location'].widget = LocationWidget(
                map_attrs=location_attrs)

    def get_location_map_widget_attrs(self):
        attrs = {
            'show_layer_switcher': True,
        }

        bound_fields = (
            ('location', 'bound_location_field_id'),
            ('target_country', 'bound_target_country_field_id'),
            ('level_of_accuracy', 'bound_level_of_accuracy_field_id'),
            ('point_lat', 'bound_lat_field_id'),
            ('point_lon', 'bound_lon_field_id'),
        )
        for field, attr in bound_fields:
            try:
                attrs[attr] = self[field].auto_id
            except KeyError:
                pass

        return attrs

    def get_default_lat_lon_attrs(self):
        attrs = {}
        try:
            lat = float(self['point_lat'].value())
        except ValueError:
            lat = None

        try:
            lon = float(self['point_lon'].value())
        except ValueError:
            lon = None

        if lat and lon:
            attrs.update({
                'initial_center_lon': lon,
                'initial_center_lat': lat,
                'initial_point': [lon, lat],
            })

        return attrs

    def clean_area_field(self, field_name):
        value = self.cleaned_data[field_name]

        try:
            # Check if we got a file here, as
            value.name
            value.size
        except AttributeError:
            value_is_file = False
        else:
            value_is_file = True

        if value_is_file:
            # Files are the second widget, so append _1
            field_name = '{}_1'.format(self[field_name].html_name)
            shapefile_data = hasattr(self.files, 'getlist') and self.files.getlist(field_name) or self.files[field_name]
            try:
                value = parse_shapefile(shapefile_data)
            except ValueError as err:
                error_msg = _('Error parsing shapefile: %s') % err
                raise forms.ValidationError(error_msg)

        return value

    def clean_contract_area(self):
        return self.clean_area_field('contract_area')

    def clean_intended_area(self):
        return self.clean_area_field('intended_area')

    def clean_production_area(self):
        return self.clean_area_field('production_area')

    def get_attributes(self, request=None):
        attributes = super().get_attributes()

        # For polygon fields, pass the value directly
        for field_name in self.AREA_FIELDS:
            polygon_value = self.cleaned_data.get(field_name)
            attributes[field_name] = {'polygon': polygon_value}

        return attributes

    @classmethod
    def get_data(cls, activity, group=None, prefix=""):
        data = super().get_data(activity, group=group, prefix=prefix)

        for area_field_name in cls.AREA_FIELDS:
            area_attribute = activity.attributes.filter(
                fk_group__name=group, name=area_field_name).first()
            if area_attribute:
                data[area_field_name] = area_attribute.polygon

        return data

    def get_fields_display(self):
        fields = super().get_fields_display()
        # Hide coordinates depending on level of accuracy
        accuracy = self.initial.get('level_of_accuracy', '')
        if accuracy in ('Country', 'Administrative region', 'Approximate location'):
            for field in fields:
                if field['name'] in ('point_lat', 'point_lon'):
                    field['hidden'] = True
        return fields
Exemple #12
0
class PlaceForm(forms.Form):
    place_name = forms.CharField(label='Place Name', max_length=100)
    type = forms.ModelChoiceField(label='Place Type',
                                  queryset=BistroType.objects.all())
    location = forms.PointField(widget=BootstrapMapWidget(), required=False)
Exemple #13
0
class RegistrationForm(forms.ModelForm):
    """Form for user model."""
    name = forms.CharField(
        required=True,
        label='Your name',
        widget=forms.TextInput(
            attrs={'placeholder': 'John Doe'})
    )
    email = forms.EmailField(
        required=True,
        label='Your email',
        widget=forms.EmailInput(
            attrs={
                'placeholder': '*****@*****.**'})
    )
    password = forms.CharField(
        required=True,
        label='Your password',
        widget=forms.PasswordInput()
    )
    password2 = forms.CharField(
        required=True,
        label='Your password (again)',
        widget=forms.PasswordInput()
    )
    website = forms.URLField(
        required=False,
        label='Your website',
        widget=forms.URLInput(
            attrs={'placeholder': 'http://john.doe.com'})
    )
    location = forms.PointField(
        label='Click your location on the map',
        widget=LeafletWidget())
    role = forms.ModelChoiceField(
        label='Your role',
        queryset=Role.objects.filter(sort_number__gte=1),
        initial=1)
    email_updates = forms.BooleanField(
        required=False,
        label='Receive project news and updates')

    class Meta:
        """Association between models and this form."""
        model = User
        fields = ['name', 'email', 'password', 'password2', 'website', 'role',
                  'location', 'email_updates']

    def clean(self):
        """Verifies that the values entered into the password fields match."""
        cleaned_data = super(RegistrationForm, self).clean()
        if 'password' in cleaned_data and 'password2' in cleaned_data:
            if cleaned_data['password'] != cleaned_data['password2']:
                raise forms.ValidationError(
                    "Passwords don't match. Please enter both fields again.")
        return cleaned_data

    def save(self, commit=True):
        """Save form.

        :param commit: Whether committed to db or not.
        :type commit: bool
        """
        user = super(RegistrationForm, self).save(commit=False)
        user.set_password(self.cleaned_data['password'])
        if commit:
            user.save()
        return user