Exemple #1
0
    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()
Exemple #2
0
    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
Exemple #4
0
    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
Exemple #5
0
 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)
Exemple #6
0
 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)