def validate_and_save_form(cls, info: ResolveInfo, input: dict,
                            form: forms.ModelForm) -> 'MutationCreate':
     if form.is_valid() and cls.before_save(info, input, form):
         cls.save(info, input, form)
         return cls.after_save(info, input, form)
     else:
         return cls.validation_error(form)
Beispiel #2
0
	def is_valid(self):
		result = ModelForm.is_valid(self)
		if self.data["required_hours_from"] != "" and self.data["required_hours_to"] != "":
			if int(self.data["required_hours_from"]) > int(self.data["required_hours_to"]):
				self._errors["required_hours_to"] = '1'
				self._errors['required_hours_from'] = '2'
				result = False
		return result
Beispiel #3
0
	def is_valid(self):
		if ModelForm.is_valid(self):	
			programm = L_get_left_programm(self.instance.year, self.instance.semester, self.instance.id)
			if programm[self.instance.course][self.instance.course_number][self.instance.course_type] < self.instance.num_of_groups:
				return False
		else:
			return False
		return True
Beispiel #4
0
    def register_view(self, request, form_url='', extra_context=None):
        request.user = STAFF_REGISTER
        ModelForm = self.get_form(request, None)

        if request.method == 'POST':
            form = ModelForm(request.POST, request.FILES, instance=None)
            if form.is_valid():
                form_validated = True
                new_object = self.save_form(request, form, change=False)
            else:
                form_validated = False
                new_object = form.instance

            formsets, inline_instances = self._create_formsets(request, new_object)
            if all_valid(formsets) and form_validated:
                self.save_model(request, new_object, form, False)

            self.log_addition(request, new_object)
            return self.response_add(request, new_object, post_url_continue='/management/login/')
        else:
            initial = self.get_changeform_initial_data(request)
            form = ModelForm(initial=initial)
            formsets, inline_instances = self._create_formsets(request, self.model())

            adminForm = helpers.AdminForm(form,
                                          list(self.get_fieldsets(request, None)),
                                          self.get_prepopulated_fields(request, None),
                                          self.get_readonly_fields(request, None),
                                          model_admin=self)
            media = self.media + adminForm.media

            inline_formsets = self.get_inline_formsets(request, formsets, inline_instances, None)
            for inline_formset in inline_formsets:
                media = media + inline_formset.media

            context = dict(self.admin_site.each_context(),
                           title=u'注册%s' % force_text(self.model._meta.verbose_name),
                           adminform=adminForm,
                           object_id=None,
                           original=None,
                           is_popup=(IS_POPUP_VAR in request.POST or
                                     IS_POPUP_VAR in request.GET),
                           to_field=None,
                           media=media,
                           # formsets=formsets,
                           inline_admin_formsets=inline_formsets,
                           errors=helpers.AdminErrorList(form, formsets),
                           preserved_filters=self.get_preserved_filters(request))

            context.update(extra_context or {})
            return self.render_change_form(request,
                                           context,
                                           add=True,
                                           change=False,
                                           obj=None,
                                           form_url=form_url)
Beispiel #5
0
    def change_view(self,request,nid):
        item=self.model.objects.filter(pk=nid).first()
        ModelForm = self.get_model_class()
        if request.method == 'POST':
            modelform=ModelForm(request.POST,instance=item)
            if modelform.is_valid():
                modelform.save()
                return redirect(self.get_list_url())
        else:
            modelform=ModelForm(instance=item)

        return render(request, 'change_view.html',locals())
Beispiel #6
0
 def _is_valid(self):
     res = ModelForm.is_valid(self)
     if self.instance.id is None:
         return res
     for f in FlagType.objects.all():
         fv = self.data[f.name]
         d = {'item': self.instance.id, 'type': f.id, 'value': fv}
         try:
             fg = Flag.objects.get(item=self.instance.id, type=f.id)
         except Flag.DoesNotExist:
             continue
         ff = FlagForm(d, instance=fg)
         if not ff.is_valid():
             res = False
             self.errors[f.name] = ff.errors
     return res
Beispiel #7
0
 def _is_valid(self):
     res = ModelForm.is_valid(self)
     if self.instance.id is None:
         return res
     for f in FlagType.objects.all():
         fv = self.data[f.name]
         d = {'item': self.instance.id, 'type': f.id, 'value': fv}
         try:
             fg = Flag.objects.get(item=self.instance.id, type=f.id)
         except Flag.DoesNotExist:
             continue
         ff = FlagForm(d, instance=fg)
         if not ff.is_valid():
             res = False
             self.errors[f.name] = ff.errors
     return res
Beispiel #8
0
    def add_view(self, request, form_url='', extra_context=None):
        "The 'add' admin view for this model."
        model = self.model
        opts = model._meta

        if not self.has_add_permission(request):
            raise PermissionDenied

        ModelForm = self.get_form(request)
        formsets = []
        if request.method == 'POST':
            form = ModelForm(request.POST, request.FILES)
            if form.is_valid():
                form_validated = True
                new_object = self.save_form(request, form, change=False)
            else:
                form_validated = False
                new_object = self.model()
            prefixes = {}
            for FormSet in self.get_formsets(request):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(data=request.POST, files=request.FILES,
                                  instance=new_object,
                                  save_as_new=request.POST.has_key("_saveasnew"),
                                  prefix=prefix)
                formsets.append(formset)
            if all_valid(formsets) and form_validated:
                # Here is the modified code.
                for formset, inline in zip(formsets, self.inline_instances):
                    if not isinstance(inline, ReverseInlineModelAdmin):
                        continue
                    obj = formset.save()[0]
                    setattr(new_object, inline.parent_fk_name, obj)
                self.save_model(request, new_object, form, change=False)
                form.save_m2m()
                for formset in formsets:
                    self.save_formset(request, form, formset, change=False)

                self.log_addition(request, new_object)
                return self.response_add(request, new_object)
        else:
            # Prepare the dict of initial data from the request.
            # We have to special-case M2Ms as a list of comma-separated PKs.
            initial = dict(request.GET.items())
            for k in initial:
                try:
                    f = opts.get_field(k)
                except models.FieldDoesNotExist:
                    continue
                if isinstance(f, models.ManyToManyField):
                    initial[k] = initial[k].split(",")
            form = ModelForm(initial=initial)
            prefixes = {}
            for FormSet in self.get_formsets(request):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(instance=self.model(), prefix=prefix)
                formsets.append(formset)

        adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields)
        media = self.media + adminForm.media

        inline_admin_formsets = []
        for inline, formset in zip(self.inline_instances, formsets):
            fieldsets = list(inline.get_fieldsets(request))
            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, fieldsets)
            inline_admin_formsets.append(inline_admin_formset)
            media = media + inline_admin_formset.media

        context = {
            'title': _('Add %s') % force_unicode(opts.verbose_name),
            'adminform': adminForm,
            'is_popup': request.REQUEST.has_key('_popup'),
            'show_delete': False,
            'media': mark_safe(media),
            'inline_admin_formsets': inline_admin_formsets,
            'errors': helpers.AdminErrorList(form, formsets),
            #'root_path': self.admin_site.root_path,
            'app_label': opts.app_label,
        }
        context.update(extra_context or {})
        return self.render_change_form(request, context, form_url=form_url, add=True)
	def change_view(self, request, object_id, form_url='', extra_context=None):
		"The 'change' admin view for this model."
		model = self.model
		opts = model._meta

		obj = self.get_object(request, unquote(object_id))

		if not self.has_change_permission(request, obj):

			raise PermissionDenied

		if obj is None:
			from django.http import Http404
			from django.utils.html import escape
			raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)})

		if request.method == 'POST' and "_saveasnew" in request.POST:
			return self.add_view(request, form_url=reverse('admin:%s_%s_add' % (
				opts.app_label, opts.model_name),
				current_app=self.admin_site.name))

		ModelForm = self.get_form(request, obj)
		formsets = []
		if request.method == 'POST':
			form = ModelForm(request.POST, request.FILES, instance=obj)
			if form.is_valid():
				form_validated = True
				new_object = self.save_form(request, form, change=True)
			else:
				form_validated = False
				new_object = form.instance

			formsets, inline_instances = self._create_formsets(request, new_object)
			if all_valid(formsets) and form_validated:
				self.save_model(request, new_object, form, True)
				self.save_related(request, form, formsets, True)
				change_message = self.construct_change_message(request, form, formsets)
				self.log_change(request, new_object, change_message)
				return self.response_change(request, new_object)

		else:
			form = ModelForm(instance=obj)
			formsets, inline_instances = self._create_formsets(request, obj)

		adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj),
			self.get_prepopulated_fields(request, obj),
			self.get_readonly_fields(request, obj),
			model_admin=self)
		media = self.media + adminForm.media

		inline_admin_formsets = []
		for inline, formset in zip(inline_instances, formsets):
			fieldsets = list(inline.get_fieldsets(request, obj))
			readonly = list(inline.get_readonly_fields(request, obj))
			prepopulated = dict(inline.get_prepopulated_fields(request, obj))
			inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
				fieldsets, prepopulated, readonly, model_admin=self)
			inline_admin_formsets.append(inline_admin_formset)
			media = media + inline_admin_formset.media

		context = dict(self.admin_site.each_context(),
			title=_('Change %s') % force_text(opts.verbose_name),
			adminform=adminForm,
			object_id=object_id,
			original=obj,
			is_popup=(IS_POPUP_VAR in request.POST or
					  IS_POPUP_VAR in request.GET),
			to_field=request.POST.get(TO_FIELD_VAR,
									  request.GET.get(TO_FIELD_VAR)),
			media=media,
			inline_admin_formsets=inline_admin_formsets,
			errors=helpers.AdminErrorList(form, formsets),
			app_label=opts.app_label,
			preserved_filters=self.get_preserved_filters(request),
		)
		context.update(extra_context or {})
		return self.render_change_form(request, context, change=True, obj=obj, form_url=form_url)
	def add_view(self, request, form_url='', extra_context=None):
		"The 'add' admin view for this model."
		model = self.model
		opts = model._meta
		if not self.has_add_permission(request):
			raise PermissionDenied

		ModelForm = self.get_form(request)
		formsets = []
		if request.method == 'POST':
			form = ModelForm(request.POST, request.FILES)
			if form.is_valid():
				form_validated = True
				new_object = self.save_form(request, form, change=False)
			else:
				form_validated = False
				new_object = self.model()
			prefixes = {}
			FormSets = []
			formsets, inline_instances = self._create_formsets(request, new_object)
			if all_valid(formsets) and form_validated:
				# Here is the modified code.
				for formset, inline in zip(formsets, self.inline_instances):
					if not isinstance(inline, ReverseInlineModelAdmin):
						continue
					obj = formset.save()[0]
					setattr(new_object, inline.parent_fk_name, obj)
				self.save_model(request, new_object, form, change=False)
				form.save_m2m()
				for formset in formsets:
					self.save_formset(request, form, formset, change=False)

				self.log_addition(request, new_object)
				return self.response_add(request, new_object)
		else:
			# Prepare the dict of initial data from the request.
			# We have to special-case M2Ms as a list of comma-separated PKs.
			initial = dict(request.GET.items())
			for k in initial:
				try:
					f = opts.get_field(k)
				except FieldDoesNotExist:
					continue
				if isinstance(f, models.ManyToManyField):
					initial[k] = initial[k].split(",")
			form = ModelForm(initial=initial)
			formsets, inline_instances = self._create_formsets(request, self.model())

		adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
			self.get_prepopulated_fields(request),
			self.get_readonly_fields(request),
			model_admin=self)
		media = self.media + adminForm.media

		inline_admin_formsets = []
		for inline, formset in zip(inline_instances, formsets):
			fieldsets = list(inline.get_fieldsets(request))
			readonly = list(inline.get_readonly_fields(request))
			prepopulated = dict(inline.get_prepopulated_fields(request))
			inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
				fieldsets, prepopulated, readonly, model_admin=self)
			inline_admin_formsets.append(inline_admin_formset)
			media = media + inline_admin_formset.media

		context = dict(self.admin_site.each_context(),
			title=_('Add %s') % force_text(opts.verbose_name),
			adminform=adminForm,
			is_popup=(IS_POPUP_VAR in request.POST or
					  IS_POPUP_VAR in request.GET),
			to_field=request.POST.get(TO_FIELD_VAR,
									  request.GET.get(TO_FIELD_VAR)),
			media=media,
			inline_admin_formsets=inline_admin_formsets,
			errors=helpers.AdminErrorList(form, formsets),
			app_label=opts.app_label,
			preserved_filters=self.get_preserved_filters(request),
		)
		context.update(extra_context or {})
		return self.render_change_form(request, context, form_url=form_url, add=True)
Beispiel #11
0
    def changeform_view(self, request, object_id=None, form_url="", extra_context=None):

        to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR))
        if to_field and not self.to_field_allowed(request, to_field):
            raise DisallowedModelAdminToField("The field %s cannot be referenced." % to_field)

        model = self.model
        opts = model._meta
        add = object_id is None

        if add:
            if not self.has_add_permission(request):
                raise PermissionDenied
            obj = None

        else:
            obj = self.get_object(request, unquote(object_id), to_field)

            if not self.has_change_permission(request, obj):
                raise PermissionDenied

            if obj is None:
                raise Http404(
                    _("%(name)s object with primary key %(key)r does not exist.")
                    % {"name": force_text(opts.verbose_name), "key": escape(object_id)}
                )

            if request.method == "POST" and "_saveasnew" in request.POST:
                return self.add_view(
                    request,
                    form_url=reverse(
                        "admin:%s_%s_add" % (opts.app_label, opts.model_name), current_app=self.admin_site.name
                    ),
                )

        ModelForm = self.get_form(request, obj)
        if request.method == "POST":
            form = ModelForm(request.POST, request.FILES, instance=obj)
            if form.is_valid():
                form_validated = True
                new_object = self.save_form(request, form, change=not add)
            else:
                form_validated = False
                new_object = form.instance
            formsets, inline_instances = self._create_formsets(request, new_object, change=not add)
            if all_valid(formsets) and form_validated:

                if "_publish" in request.POST:
                    new_object.published = True
                elif "_unpublish" in request.POST:
                    new_object.published = False

                self.save_model(request, new_object, form, not add)
                self.save_related(request, form, formsets, not add)
                if add:
                    self.log_addition(request, new_object)
                    return self.response_add(request, new_object)
                else:
                    change_message = self.construct_change_message(request, form, formsets)
                    self.log_change(request, new_object, change_message)
                    return self.response_change(request, new_object)
        else:
            if add:
                initial = self.get_changeform_initial_data(request)
                form = ModelForm(initial=initial)
                formsets, inline_instances = self._create_formsets(request, self.model(), change=False)
            else:
                form = ModelForm(instance=obj)
                formsets, inline_instances = self._create_formsets(request, obj, change=True)

        adminForm = helpers.AdminForm(
            form,
            list(self.get_fieldsets(request, obj)),
            self.get_prepopulated_fields(request, obj),
            self.get_readonly_fields(request, obj),
            model_admin=self,
        )
        media = self.media + adminForm.media

        inline_formsets = self.get_inline_formsets(request, formsets, inline_instances, obj)
        for inline_formset in inline_formsets:
            media = media + inline_formset.media

        context = dict(
            self.admin_site.each_context(request),
            title=(_("Add %s") if add else _("Change %s")) % force_text(opts.verbose_name),
            adminform=adminForm,
            object_id=object_id,
            original=obj,
            is_popup=(IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET),
            to_field=to_field,
            media=media,
            inline_admin_formsets=inline_formsets,
            errors=helpers.AdminErrorList(form, formsets),
            preserved_filters=self.get_preserved_filters(request),
        )

        context.update(extra_context or {})

        return self.render_change_form(request, context, add=add, change=not add, obj=obj, form_url=form_url)
Beispiel #12
0
    def add_view(self, request, form_url='', extra_context=None):
        "The 'add' admin view for this model."
        model = self.model
        opts = model._meta

        if not self.has_add_permission(request):
            raise PermissionDenied

        ModelForm = self.get_form(request)
        formsets = []
        if request.method == 'POST':
            form = ModelForm(request.POST, request.FILES)
            if form.is_valid():
                form_validated = True
                new_object = self.save_form(request, form, change=False)
            else:
                form_validated = False
                new_object = self.model()
            prefixes = {}
            for FormSet in self.get_formsets(request):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(data=request.POST, files=request.FILES,
                                  instance=new_object,
                                  save_as_new=request.POST.has_key("_saveasnew"),
                                  prefix=prefix)
                formsets.append(formset)
            if all_valid(formsets) and form_validated:
                # Here is the modified code.
                for formset, inline in zip(formsets, self.inline_instances):
                    if not isinstance(inline, ReverseInlineModelAdmin):
                        continue
                    obj = formset.save()[0]
                    setattr(new_object, inline.parent_fk_name, obj)
                self.save_model(request, new_object, form, change=False)
                form.save_m2m()
                for formset in formsets:
                    self.save_formset(request, form, formset, change=False)

                self.log_addition(request, new_object)
                return self.response_add(request, new_object)
        else:
            # Prepare the dict of initial data from the request.
            # We have to special-case M2Ms as a list of comma-separated PKs.
            initial = dict(request.GET.items())
            for k in initial:
                try:
                    f = opts.get_field(k)
                except models.FieldDoesNotExist:
                    continue
                if isinstance(f, models.ManyToManyField):
                    initial[k] = initial[k].split(",")
            form = ModelForm(initial=initial)
            prefixes = {}
            for FormSet in self.get_formsets(request):
                prefix = FormSet.get_default_prefix()
                prefixes[prefix] = prefixes.get(prefix, 0) + 1
                if prefixes[prefix] != 1:
                    prefix = "%s-%s" % (prefix, prefixes[prefix])
                formset = FormSet(instance=self.model(), prefix=prefix)
                formsets.append(formset)

        adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields)
        media = self.media + adminForm.media

        inline_admin_formsets = []
        for inline, formset in zip(self.inline_instances, formsets):
            fieldsets = list(inline.get_fieldsets(request))
            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, fieldsets)
            inline_admin_formsets.append(inline_admin_formset)
            media = media + inline_admin_formset.media

        context = {
            'title': _('Add %s') % force_unicode(opts.verbose_name),
            'adminform': adminForm,
            'is_popup': '_popup' in request.REQUEST,
            'show_delete': False,
            'media': mark_safe(media),
            'inline_admin_formsets': inline_admin_formsets,
            'errors': helpers.AdminErrorList(form, formsets),
            'root_path': self.admin_site.root_path,
            'app_label': opts.app_label,
        }
        context.update(extra_context or {})
        return self.render_change_form(request, context, form_url=form_url, add=True)
Beispiel #13
0
    def _changeform_view(self, request, object_id, form_url, extra_context):
        """
        I know overriding such a long method is terrible! But I do not know what a better
        approach would be. I will take a look at this patch method to try to patch all_valid().
        https://docs.python.org/3/library/unittest.mock.html#unittest.mock.patch
        """
        to_field = request.POST.get(TO_FIELD_VAR,
                                    request.GET.get(TO_FIELD_VAR))
        if to_field and not self.to_field_allowed(request, to_field):
            raise DisallowedModelAdminToField(
                "The field %s cannot be referenced." % to_field)

        model = self.model
        opts = model._meta

        if request.method == 'POST' and '_saveasnew' in request.POST:
            object_id = None

        add = object_id is None

        if add:
            if not self.has_add_permission(request):
                raise PermissionDenied
            obj = None

        else:
            obj = self.get_object(request, unquote(object_id), to_field)

            if request.method == 'POST':
                if not self.has_change_permission(request, obj):
                    raise PermissionDenied
            else:
                if not self.has_view_or_change_permission(request, obj):
                    raise PermissionDenied

            if obj is None:
                return self._get_obj_does_not_exist_redirect(
                    request, opts, object_id)

        fieldsets = self.get_fieldsets(request, obj)
        ModelForm = self.get_form(request,
                                  obj,
                                  change=not add,
                                  fields=flatten_fieldsets(fieldsets))
        if request.method == 'POST':
            form = ModelForm(request.POST, request.FILES, instance=obj)
            form_validated = form.is_valid()
            if form_validated:
                new_object = self.save_form(request, form, change=not add)
            else:
                new_object = form.instance
            formsets, inline_instances = self._create_formsets(request,
                                                               new_object,
                                                               change=not add)
            if self.all_valid(form, formsets) and form_validated:
                self.save_model(request, new_object, form, not add)
                self.save_related(request, form, formsets, not add)
                change_message = self.construct_change_message(
                    request, form, formsets, add)
                if add:
                    self.log_addition(request, new_object, change_message)
                    return self.response_add(request, new_object)
                else:
                    self.log_change(request, new_object, change_message)
                    return self.response_change(request, new_object)
            else:
                form_validated = False
        else:
            if add:
                initial = self.get_changeform_initial_data(request)
                form = ModelForm(initial=initial)
                formsets, inline_instances = self._create_formsets(
                    request, form.instance, change=False)
            else:
                form = ModelForm(instance=obj)
                formsets, inline_instances = self._create_formsets(request,
                                                                   obj,
                                                                   change=True)

        if not add and not self.has_change_permission(request, obj):
            readonly_fields = flatten_fieldsets(fieldsets)
        else:
            readonly_fields = self.get_readonly_fields(request, obj)
        adminForm = helpers.AdminForm(
            form,
            list(fieldsets),
            # Clear prepopulated fields on a view-only form to avoid a crash.
            self.get_prepopulated_fields(request, obj)
            if add or self.has_change_permission(request, obj) else {},
            readonly_fields,
            model_admin=self)
        media = self.media + adminForm.media

        inline_formsets = self.get_inline_formsets(request, formsets,
                                                   inline_instances, obj)
        for inline_formset in inline_formsets:
            media = media + inline_formset.media

        if add:
            title = _('Add %s')
        elif self.has_change_permission(request, obj):
            title = _('Change %s')
        else:
            title = _('View %s')
        context = {
            **self.admin_site.each_context(request),
            'title': title % opts.verbose_name,
            'subtitle': str(obj) if obj else None,
            'adminform': adminForm,
            'object_id': object_id,
            'original': obj,
            'is_popup': IS_POPUP_VAR in request.POST
            or IS_POPUP_VAR in request.GET,
            'to_field': to_field,
            'media': media,
            'inline_admin_formsets': inline_formsets,
            'errors': helpers.AdminErrorList(form, formsets),
            'preserved_filters': self.get_preserved_filters(request),
        }

        # Hide the "Save" and "Save and continue" buttons if "Save as New" was
        # previously chosen to prevent the interface from getting confusing.
        if request.method == 'POST' and not form_validated and "_saveasnew" in request.POST:
            context['show_save'] = False
            context['show_save_and_continue'] = False
            # Use the change template instead of the add template.
            add = False

        context.update(extra_context or {})

        return self.render_change_form(request,
                                       context,
                                       add=add,
                                       change=not add,
                                       obj=obj,
                                       form_url=form_url)
Beispiel #14
0
    def _change_confirmation_view(self, request, object_id, form_url,
                                  extra_context):
        # This code is taken from super()._changeform_view
        # https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1575-L1592
        to_field = request.POST.get(TO_FIELD_VAR,
                                    request.GET.get(TO_FIELD_VAR))
        if to_field and not self.to_field_allowed(request, to_field):
            raise DisallowedModelAdminToField(
                "The field %s cannot be referenced." % to_field)

        model = self.model
        opts = model._meta

        if SAVE_AS_NEW in request.POST:
            object_id = None

        add = object_id is None
        if add:
            if not self.has_add_permission(request):
                raise PermissionDenied

            obj = None
        else:
            obj = self.get_object(request, unquote(object_id), to_field)
            if obj is None:
                return self._get_obj_does_not_exist_redirect(
                    request, opts, object_id)

            if not self.has_view_or_change_permission(request, obj):
                raise PermissionDenied

        fieldsets = self.get_fieldsets(request, obj)
        ModelForm = self.get_form(request,
                                  obj,
                                  change=not add,
                                  fields=flatten_fieldsets(fieldsets))

        form = ModelForm(request.POST, request.FILES, instance=obj)
        form_validated = form.is_valid()
        if form_validated:
            new_object = self.save_form(request, form, change=not add)
        else:
            new_object = form.instance
        formsets, inline_instances = self._create_formsets(request,
                                                           new_object,
                                                           change=not add)
        # End code from super()._changeform_view
        # form.is_valid() checks both errors and "is_bound"
        # If form has errors, show the errors on the form instead of showing confirmation page
        if not form_validated:
            log("Invalid Form: return early")
            log(form.errors)
            # We must ensure that we ask for confirmation when showing errors
            extra_context = self._add_confirmation_options_to_extra_context(
                extra_context)
            return super()._changeform_view(request, object_id, form_url,
                                            extra_context)

        add_or_new = add or SAVE_AS_NEW in request.POST
        # Get changed data to show on confirmation
        changed_data = self._get_changed_data(form, model, obj, add_or_new)

        changed_confirmation_fields = set(
            self.get_confirmation_fields(request, obj)) & set(
                changed_data.keys())
        if not bool(changed_confirmation_fields):
            log("No change detected")
            # No confirmation required for changed fields, continue to save
            return super()._changeform_view(request, object_id, form_url,
                                            extra_context)

        # Parse the original save action from request
        save_action = None
        # No cover: There would not be a case of not request.POST.keys() and form is valid
        for key in request.POST.keys():  # pragma: no cover
            if key in SAVE_ACTIONS:
                save_action = key
                break

        cleared_fields = []
        if form.is_multipart():
            log("Caching files")
            cache.set(CACHE_KEYS["object"], new_object, CACHE_TIMEOUT)

            # Save files as tempfiles
            for field_name in request.FILES:
                file = request.FILES[field_name]
                self._file_cache.set(
                    format_cache_key(model=model.__name__, field=field_name),
                    file)

            # Handle when files are cleared - since the `form` object would not hold that info
            cleared_fields = self._get_cleared_fields(request)

        log("Render Change Confirmation")
        title_action = _("adding") if add_or_new else _("changing")
        context = {
            **self.admin_site.each_context(request),
            "preserved_filters":
            self.get_preserved_filters(request),
            "title":
            f"{_('Confirm')} {title_action} {opts.verbose_name}",
            "subtitle":
            str(obj),
            "object_name":
            str(obj),
            "object_id":
            object_id,
            "app_label":
            opts.app_label,
            "model_name":
            opts.model_name,
            "opts":
            opts,
            "changed_data":
            changed_data,
            "add":
            add,
            "save_as_new":
            SAVE_AS_NEW in request.POST,
            "submit_name":
            save_action,
            "form":
            form,
            "cleared_fields":
            cleared_fields,
            "formsets":
            formsets,
            **(extra_context or {}),
        }
        return self.render_change_confirmation(request, context)
Beispiel #15
0
	def is_valid(self):
		return ModelForm.is_valid(self)