예제 #1
0
파일: forms.py 프로젝트: simensma/sherpa
    def clean(self):
        cleaned_data = super(ForeningDataForm, self).clean()

        if cleaned_data.get('choose_contact') == 'person':
            if cleaned_data.get('contact_person') is None and \
                (cleaned_data.get('contact_person_name') is None or cleaned_data.get('contact_person_name') == ''):
                self.add_error(
                    'contact_person_name',
                    u"Hvis det er en kontaktperson som kan kontaktes, må du oppgi et navn eller velge en person " \
                    u"fra medlemsregisteret.",
                )

        type_ = cleaned_data.get('type')
        parents = cleaned_data.get('parents')

        if type_ in ['sentral', 'forening']:
            # In this case, the UI will have hidden the parents input, but it might still have a value, so
            # force it to empty. The hiding of the field should make this behavior intuitive.
            cleaned_data['parent'] = []
            parents = []

        # These types must have a parent, but that can't be enforced on the DB-level for *new* foreninger since parents
        # are a M2M-relationship (so the child needs to be saved before the parent can be related), so check it here.
        elif type_ in ['turlag', 'turgruppe'] and len(parents) == 0:
            self.add_error(
                'parents',
                u"%s må ha en moderforening!" % (
                    'Et turlag' if type_ == 'turlag' else 'En turgruppe',
                )
            )
            parents = None

        # Non DNT admins cannot *create* forening with type forening/sentral
        # Note that this might be legal in derived classes, so check this only for the base class
        # Shouldn't be possible without a manual POST
        if type(self) == ForeningDataForm and not self._user.is_admin_in_dnt_central() and type_ in ['sentral', 'forening']:
            self.add_error(
                'type',
                u"Du har ikke tillatelse til å opprette sentrale grupper eller medlemsforeninger. Vennligst ta " \
                u"kontakt med DNT sentralt.",
            )

        # Validate the new forening type and parents relationship
        try:
            forening = Forening()
            forening.validate_relationships(
                simulate_type=type_,
                simulate_parents=parents,
            )

        except ForeningWithItselfAsParent:
            # Shouldn't be possible without a manual POST
            self.add_error(
                'parents',
                u"%s kan ikke være underlagt seg selv." % forening.name
            )

        except SentralForeningWithRelation:
            # Shouldn't be possible without a manual POST
            self.add_error(
                'parents',
                u"En sentral forening kan ikke ha noen koblinger til andre foreningstyper."
            )

        except ForeningWithForeningParent:
            self.add_error(
                'parents',
                u"En forening kan ikke være underlagt en annen forening."
            )

        except TurlagWithTurlagParent:
            self.add_error(
                'parents',
                u"Et turlag kan ikke være underlagt et annet turlag."
            )

        except TurgruppeWithTurgruppeParent:
            self.add_error(
                'parents',
                u"En turgruppe kan ikke være underlagt en annen turgruppe."
            )

        except ForeningWithTurlagParent:
            self.add_error(
                'parents',
                u"Foreninger kan ikke være underlagt turlag/turgrupper."
            )

        except TurlagWithTurgruppeParent:
            self.add_error(
                'parents',
                u"Et turlag kan ikke være underlagt en turgruppe."
            )
예제 #2
0
    def clean(self):
        cleaned_data = super().clean()

        type_ = cleaned_data.get('type')
        parents = cleaned_data.get('parents')

        if type_ in ['sentral', 'forening']:
            # In this case, the UI will have hidden the parents input, but it might still have a value, so
            # force it to empty. The hiding of the field should make this behavior intuitive.
            cleaned_data['parent'] = []
            parents = []

        # These types must have a parent, but that can't be enforced on the DB-level for *new* foreninger since parents
        # are a M2M-relationship (so the child needs to be saved before the parent can be related), so check it here.
        if type_ in ['turlag', 'turgruppe'] and len(parents) == 0:
            self.add_error(
                'parents',
                "%s må ha en moderforening!" % (
                    'Et turlag' if type_ == 'turlag' else 'En turgruppe',
                )
            )
            parents = None

        # Non DNT admins cannot set type forening/sentral
        if not self._user.is_admin_in_dnt_central() and type_ in ['sentral', 'forening']:
            self.add_error(
                'type',
                "Du har ikke tillatelse til å opprette sentrale grupper eller medlemsforeninger. Vennligst ta " \
                "kontakt med DNT sentralt.",
            )

        # Validate the new forening type and parents relationship
        try:
            forening = Forening()
            forening.validate_relationships(
                simulate_type=type_,
                simulate_parents=parents,
            )

        except ForeningWithItselfAsParent:
            self.add_error(
                'parents',
                "%s kan ikke være underlagt seg selv." % forening.name
            )

        except SentralForeningWithRelation:
            self.add_error(
                'parents',
                "En sentral forening kan ikke ha noen koblinger til andre foreningstyper."
            )

        except ForeningWithForeningParent:
            self.add_error(
                'parents',
                "En forening kan ikke være underlagt en annen forening."
            )

        except TurlagWithTurlagParent:
            self.add_error(
                'parents',
                "Et turlag kan ikke være underlagt et annet turlag."
            )

        except TurgruppeWithTurgruppeParent:
            self.add_error(
                'parents',
                "En turgruppe kan ikke være underlagt en annen turgruppe."
            )

        except ForeningWithTurlagParent:
            self.add_error(
                'parents',
                "Foreninger kan ikke være underlagt turlag/turgrupper."
            )

        except TurlagWithTurgruppeParent:
            self.add_error(
                'parents',
                "Et turlag kan ikke være underlagt en turgruppe."
            )

        return cleaned_data
예제 #3
0
    def clean(self):
        cleaned_data = super().clean()

        type_ = cleaned_data.get('type')
        parents = cleaned_data.get('parents')

        if type_ in ['sentral', 'forening']:
            # In this case, the UI will have hidden the parents input, but it might still have a value, so
            # force it to empty. The hiding of the field should make this behavior intuitive.
            cleaned_data['parent'] = []
            parents = []

        # These types must have a parent, but that can't be enforced on the DB-level for *new* foreninger since parents
        # are a M2M-relationship (so the child needs to be saved before the parent can be related), so check it here.
        if type_ in ['turlag', 'turgruppe'] and len(parents) == 0:
            self.add_error(
                'parents',
                "%s må ha en moderforening!" % (
                    'Et turlag' if type_ == 'turlag' else 'En turgruppe',
                )
            )
            parents = None

        # The following check should be skipped if this form is actually an
        # instance of the EditForeningForm subclass
        if not isinstance(self, EditForeningForm):
            # Non DNT admins cannot set type forening/sentral. Note that the
            # edit form should allow non-admins to save objects of this type
            # as long as it isn't changed.
            if not self._user.is_admin_in_dnt_central() and type_ in ['sentral', 'forening']:
                self.add_error(
                    'type',
                    "Du har ikke tillatelse til å opprette sentrale grupper eller medlemsforeninger. Vennligst ta " \
                    "kontakt med DNT sentralt.",
                )

        # Validate focus_id
        focus_id = cleaned_data['focus_id']
        if focus_id is not None:
            others = Forening.objects.filter(
                focus_id=focus_id
            ).exclude(
                id=cleaned_data['forening'].id
            )

            if others.count():
                other = others.all()[0]
                self.add_error(
                    'focus_id',
                    (
                        f"Focus ID «{focus_id}» er allerede registrert på "
                        f"foreningen {other.name}."
                    )
                )

        # Validate the new forening type and parents relationship
        try:
            forening = Forening()
            forening.validate_relationships(
                simulate_type=type_,
                simulate_parents=parents,
            )

        except ForeningWithItselfAsParent:
            self.add_error(
                'parents',
                "%s kan ikke være underlagt seg selv." % forening.name
            )

        except SentralForeningWithRelation:
            self.add_error(
                'parents',
                "En sentral forening kan ikke ha noen koblinger til andre foreningstyper."
            )

        except ForeningWithForeningParent:
            self.add_error(
                'parents',
                "En forening kan ikke være underlagt en annen forening."
            )

        except TurlagWithTurlagParent:
            self.add_error(
                'parents',
                "Et turlag kan ikke være underlagt et annet turlag."
            )

        except TurgruppeWithTurgruppeParent:
            self.add_error(
                'parents',
                "En turgruppe kan ikke være underlagt en annen turgruppe."
            )

        except ForeningWithTurlagParent:
            self.add_error(
                'parents',
                "Foreninger kan ikke være underlagt turlag/turgrupper."
            )

        except TurlagWithTurgruppeParent:
            self.add_error(
                'parents',
                "Et turlag kan ikke være underlagt en turgruppe."
            )

        return cleaned_data