def clean(self): BaseModelFormSet.clean(self) if not self.is_valid(): return deleted_ids = set() ids_to_data = {} parents = {} # first pass: get the deleted items and map parents to items for i, data in enumerate(self.cleaned_data): ids_to_data[data['id']] = data if data.get('DELETE'): deleted_ids.add(data['id']) if data.get('parent'): parents.setdefault(data['parent'], set()).add(i) # second pass: check for cycles for data in self.cleaned_data: category = data s = set([category['id']]) while category['parent']: if category['parent'] in s: if len(s) == 1: # parent set to itself error = ("A category cannot be its own parent. " "Please change the parent category") else: error = ("Some categories have conflicting parents. " "Please change one or more of the parent " "categories") names = ', '.join([category.name for category in s]) raise forms.ValidationError('%s: %s' % (error, names)) category = ids_to_data[category['parent']] s.add(category['id']) # third pass: set children of deleted items to None: for parent in deleted_ids: if parent not in parents: continue for form_index in parents[parent]: form = self.forms[form_index] form.instance.parent = None form.instance.save()
def clean(self): BaseModelFormSet.clean(self) if not self.is_valid(): return deleted_ids = set() ids_to_data = {} parents = {} # first pass: get the deleted items and map parents to items for i, data in enumerate(self.cleaned_data): ids_to_data[data['id']] = data if data.get('DELETE'): deleted_ids.add(data['id']) if data.get('parent'): parents.setdefault(data['parent'], set()).add(i) # second pass: check for cycles for data in self.cleaned_data: category = data s = set([category['id']]) while category['parent']: if category['parent'] in s: if len(s) == 1: # parent set to itself error = ("A category cannot be its own parent. " "Please change the parent category") else: error = ("Some categories have conflicting parents. " "Please change one or more of the parent " "categories") names = ', '.join([category.name for category in s]) raise forms.ValidationError('%s: %s' % (error, names)) category = ids_to_data[category['parent']] s.add(category['id']) # third pass: set children of deleted items to None: for parent in deleted_ids: if parent not in parents: continue for form_index in parents[parent]: form = self.forms[form_index] form.instance.parent = None form.instance.save()
def clean(self): BaseModelFormSet.clean(self) if any(self.errors): # don't bother doing anything if the form isn't valid return for form in list(self.deleted_forms): form.cleaned_data[DELETION_FIELD_NAME] = False form.instance.status = models.Video.REJECTED form.instance.save() bulk_edits = self.extra_forms[0].cleaned_data for key in list(bulk_edits.keys()): # get the list because we'll be # changing the dictionary if not bulk_edits[key]: del bulk_edits[key] bulk_action = self.data.get('bulk_action', '') if bulk_action: bulk_edits['action'] = bulk_action if bulk_edits: for form in self.initial_forms: if not form.cleaned_data['BULK']: continue for key, value in bulk_edits.items(): if key == 'action': # do something to the video method = getattr(self, 'action_%s' % value) method(form) elif key == 'tags': form.cleaned_data[key] = value elif key == 'categories': # categories append, not replace form.cleaned_data[key] = ( list(form.cleaned_data[key]) + list(value)) elif key == 'authors': form.cleaned_data[key] = value else: setattr(form.instance, key, value) self.can_delete = False
def clean(self): BaseModelFormSet.clean(self) if any(self.errors): # don't bother doing anything if the form isn't valid return for form in list(self.deleted_forms): form.cleaned_data[DELETION_FIELD_NAME] = False form.instance.status = models.Video.REJECTED form.instance.save() bulk_edits = self.extra_forms[0].cleaned_data for key in list(bulk_edits.keys()): # get the list because we'll be # changing the dictionary if not bulk_edits[key]: del bulk_edits[key] bulk_action = self.data.get('bulk_action', '') if bulk_action: bulk_edits['action'] = bulk_action if bulk_edits: for form in self.initial_forms: if not form.cleaned_data['BULK']: continue for key, value in bulk_edits.items(): if key == 'action': # do something to the video method = getattr(self, 'action_%s' % value) method(form) elif key == 'tags': form.cleaned_data[key] = value elif key == 'categories': # categories append, not replace form.cleaned_data[key] = ( list(form.cleaned_data[key]) + list(value)) elif key == 'authors': form.cleaned_data[key] = value else: setattr(form.instance, key, value) self.can_delete = False
def clean(self): bulk_edits = self.extra_forms[0].cleaned_data for key in list(bulk_edits.keys()): # get the list because we'll be # changing the dictionary if bulk_edits[key] in ['', None] or key == 'id': del bulk_edits[key] if bulk_edits: for form in self.bulk_forms: for key, value in bulk_edits.items(): if key == 'auto_categories': # categories append, not replace form.cleaned_data[key] = ( list(form.cleaned_data[key]) + list(value)) else: form.cleaned_data[key] = value form.instance = construct_instance(form, form.instance, form._meta.fields, form._meta.exclude) return BaseModelFormSet.clean(self)
def clean(self): bulk_edits = self.extra_forms[0].cleaned_data for key in list(bulk_edits.keys()): # get the list because we'll be # changing the dictionary if bulk_edits[key] in ['', None] or key == 'id': del bulk_edits[key] if bulk_edits: for form in self.bulk_forms: for key, value in bulk_edits.items(): if key == 'auto_categories': # categories append, not replace form.cleaned_data[key] = ( list(form.cleaned_data[key]) + list(value)) else: form.cleaned_data[key] = value form.instance = construct_instance(form, form.instance, form._meta.fields, form._meta.exclude) return BaseModelFormSet.clean(self)