def __init__(self, data=None, files=None, instance=None,
                 save_as_new=False, prefix=None, queryset=None, **kwargs):
        if self.parent_fk_name:
            if instance is None:
                self.instance = self.fk.model()
            else:
                self.instance = instance

            self.save_as_new = save_as_new
            if self.instance.id:
                object = getattr(instance, self.parent_fk_name)
                if object and object.id:
                    qs = self.model.objects.filter(pk=object.id)
                else:
                    qs = self.model.objects.none()
            else:
                qs = self.model.objects.none()
                self.extra = 1
            BaseModelFormSet.__init__(self, data, files, prefix=prefix,
                                      queryset=qs, **kwargs)
        else:
            BaseInlineFormSet.__init__(self,
                data=data,
                files=files,
                instance=instance,
                save_as_new=save_as_new, prefix=prefix, queryset=queryset, **kwargs)
Exemple #2
0
    def __init__(self, data=None, files=None, instance=None, save_as_new=False, prefix=None, queryset=None, **kwargs):
        from django.db.models.fields.related import RelatedObject

        if instance is None:
            self.instance = self.fk.rel.to()
        else:
            self.instance = instance
        self.save_as_new = save_as_new
        # is there a better way to get the object descriptor?
        self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
        if queryset is None:
            queryset = self.model._default_manager
        # manually set queryset as evaluated
        obj = self.model.get_field().value_from_object(self.instance)
        if obj:
            queryset._result_cache = [obj]
        BaseModelFormSet.__init__(self, data, files, prefix=prefix, queryset=queryset, **kwargs)
 def total_form_count(self):
     if self.data or self.files:
         if hasattr(self.management_form, 'cleaned_data'):
             return self.management_form.cleaned_data[TOTAL_FORM_COUNT]
         else:
             return 0
     else:
         return DjangoBaseModelFormSet.total_form_count(self)
Exemple #4
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 #5
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 #7
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 #8
0
    def __init__(self,
                 data=None,
                 files=None,
                 instance=None,
                 save_as_new=False,
                 prefix=None,
                 queryset=None,
                 **kwargs):
        if self.parent_fk_name:
            if instance is None:
                self.instance = self.fk.model()
            else:
                self.instance = instance

            self.save_as_new = save_as_new
            if self.instance.id:
                object = getattr(instance, self.parent_fk_name)
                if object and object.id:
                    qs = self.model.objects.filter(pk=object.id)
                else:
                    qs = self.model.objects.none()
            else:
                qs = self.model.objects.none()
                self.extra = 1
            BaseModelFormSet.__init__(self,
                                      data,
                                      files,
                                      prefix=prefix,
                                      queryset=qs,
                                      **kwargs)
        else:
            BaseInlineFormSet.__init__(self,
                                       data=data,
                                       files=files,
                                       instance=instance,
                                       save_as_new=save_as_new,
                                       prefix=prefix,
                                       queryset=queryset,
                                       **kwargs)
Exemple #9
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 #10
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)
 def initial_form_count(self):
     if self.data or self.files:
         cleaned_data = getattr(self.management_form, 'cleaned_data', {})
         return cleaned_data.get(INITIAL_FORM_COUNT, 0)
     else:
         return DjangoBaseModelFormSet.initial_form_count(self)
 def total_form_count(self):
     if self.data or self.files:
         cleaned_data = getattr(self.management_form, 'cleaned_data', {})
         return cleaned_data.get(TOTAL_FORM_COUNT, 0)
     else:
         return DjangoBaseModelFormSet.total_form_count(self)