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." )
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
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