inline._meta.model._meta.verbose_name ) context.update({ 'form': mf, 'formsets': formsets, 'instance': instance, 'delete_url': reverse('freeadmin_%s_%s_delete' % ( m._meta.app_label, m._meta.module_name, ), kwargs={ 'oid': instance.id, }), 'hook_buttons': appPool.hook_form_buttons( str(type(mf).__name__), mf, 'edit', ), }) template = "%s/%s_edit.html" % ( m._meta.app_label, m._meta.object_name.lower(), ) try: get_template(template) except TemplateDoesNotExist: template = 'freeadmin/generic_model_edit.html' if 'iframe' in request.GET: resp = render(
def edit(self, request, oid, mf=None): from freenasUI.freeadmin.navtree import navtree from freenasUI.freeadmin.views import JsonResp m = self._model if 'inline' in request.GET: inline = True else: inline = False context = { 'app': m._meta.app_label, 'model': m, 'modeladmin': m._admin, 'mf': mf, 'oid': oid, 'inline': inline, 'extra_js': m._admin.extra_js, 'model_name': m._meta.model_name, 'verbose_name': m._meta.verbose_name, 'deletable': m._admin.deletable, } if 'deletable' in request.GET: context.update({'deletable': False}) instance = get_object_or_404(m, pk=oid) if not isinstance(navtree._modelforms[m], dict): mf = navtree._modelforms[m] else: if mf is None: try: mf = navtree._modelforms[m][m.FreeAdmin.edit_modelform] except: mf = list(navtree._modelforms[m].values())[-1] else: mf = navtree._modelforms[m][mf] formsets = {} if request.method == "POST": mf = mf(request.POST, request.FILES, instance=instance) if m._admin.advanced_fields: mf.advanced_fields.extend(m._admin.advanced_fields) valid = True if m._admin.inlines: for inlineopts in m._admin.inlines: inline = inlineopts.get("form") prefix = inlineopts.get("prefix") formset = inlineopts.get("formset") _temp = __import__( '%s.forms' % m._meta.app_label, globals(), locals(), [inline], 0) inline = getattr(_temp, inline) if formset: formset = getattr(_temp, formset) else: formset = FreeBaseInlineFormSet extrakw = { 'can_delete': True, } fset_fac = inlineformset_factory( m, inline._meta.model, form=inline, formset=formset, extra=0, **extrakw) try: fsname = 'formset_%s' % ( inline._meta.model._meta.model_name, ) fset = fset_fac( request.POST, prefix=prefix, parent=mf, instance=instance) if not fset.show_condition(): continue formsets[fsname] = { 'instance': fset, 'position': inlineopts.get('position', 'bottom'), } except dforms.ValidationError: pass for name, fsinfo in list(formsets.items()): for frm in fsinfo['instance'].forms: valid &= frm.is_valid() valid &= fsinfo['instance'].is_valid() valid &= mf.is_valid(formsets=formsets) if valid: if '__confirm' not in request.POST: message = self.get_confirm_message( 'edit', obj=instance, form=mf, ) if message: return JsonResp( request, confirm=self.confirm(message), ) try: mf.save() if not isinstance(mf, MiddlewareModelForm): for name, fsinfo in list(formsets.items()): fsinfo['instance'].save() events = [] if hasattr(mf, "done") and callable(mf.done): mf.done(request=request, events=events) if 'iframe' in request.GET: return JsonResp( request, form=mf, formsets=formsets, message=_("%s successfully updated.") % ( m._meta.verbose_name, )) else: return JsonResp( request, form=mf, formsets=formsets, message=_("%s successfully updated.") % ( m._meta.verbose_name, ), events=events) except ValidationErrors as e: handle_middleware_validation(mf, e) return JsonResp(request, form=mf, formsets=formsets) except ServiceFailed as e: return JsonResp( request, form=mf, error=True, message=e.value, events=["serviceFailed(\"%s\")" % e.service]) except MiddlewareError as e: return JsonResp( request, form=mf, error=True, message=_("Error: %s") % str(e)) else: return JsonResp(request, form=mf, formsets=formsets) else: mf = mf(instance=instance) if m._admin.advanced_fields: mf.advanced_fields.extend(m._admin.advanced_fields) if m._admin.inlines: extrakw = { 'can_delete': True, } for inlineopts in m._admin.inlines: inline = inlineopts.get("form") prefix = inlineopts.get("prefix") formset = inlineopts.get("formset") _temp = __import__( '%s.forms' % m._meta.app_label, globals(), locals(), [inline], 0) inline = getattr(_temp, inline) if formset: formset = getattr(_temp, formset) else: formset = FreeBaseInlineFormSet """ Do not add any extra empty form for the inline formset in case there is already any item in the relationship """ extra = 1 fk_name = None for field in inline._meta.model._meta.fields: if isinstance(field, ForeignKey) and m is field.rel.to: fk_name = field.name break if fk_name: qs = inline._meta.model.objects.filter( **{'%s__id' % fk_name: instance.pk} ) if qs.count() > 0: extra = 0 fset_fac = inlineformset_factory( m, inline._meta.model, form=inline, formset=formset, extra=extra, **extrakw) fsname = 'formset_%s' % ( inline._meta.model._meta.model_name, ) fset = fset_fac( prefix=prefix, instance=instance, parent=mf, ) if not fset.show_condition(): continue fset.verbose_name = ( inline._meta.model._meta.verbose_name ) formsets[fsname] = { 'instance': fset, 'position': inlineopts.get('position', 'bottom'), } context.update({ 'form': mf, 'formsets': formsets, 'instance': instance, 'delete_url': reverse('freeadmin_%s_%s_delete' % ( m._meta.app_label, m._meta.model_name, ), kwargs={ 'oid': instance.pk, }), 'hook_buttons': appPool.hook_form_buttons( str(type(mf).__name__), mf, 'edit', ), }) context.update(self.get_extra_context('edit', request=request, form=mf)) template = "%s/%s_edit.html" % ( m._meta.app_label, m._meta.object_name.lower(), ) try: get_template(template) except TemplateDoesNotExist: template = 'freeadmin/generic_model_edit.html' if 'iframe' in request.GET: resp = render( request, template, context, content_type='text/html') resp.content = ( "<html><body><textarea>" + resp.content + "</textarea></boby></html>") return resp else: return render( request, template, context, content_type='text/html')
'position': inlineopts.get('position', 'bottom'), } context.update({ 'form': mf, 'formsets': formsets, 'instance': instance, 'delete_url': reverse('freeadmin_%s_%s_delete' % ( m._meta.app_label, m._meta.model_name, ), kwargs={ 'oid': instance.id, }), 'hook_buttons': appPool.hook_form_buttons( str(type(mf).__name__), mf, 'edit', ), }) context.update(self.get_extra_context('edit')) template = "%s/%s_edit.html" % ( m._meta.app_label, m._meta.object_name.lower(), ) try: get_template(template) except TemplateDoesNotExist: template = 'freeadmin/generic_model_edit.html'
def edit(self, request, oid, mf=None): from freenasUI.freeadmin.navtree import navtree from freenasUI.freeadmin.views import JsonResp m = self._model if 'inline' in request.GET: inline = True else: inline = False context = { 'app': m._meta.app_label, 'model': m, 'modeladmin': m._admin, 'mf': mf, 'oid': oid, 'inline': inline, 'extra_js': m._admin.extra_js, 'model_name': m._meta.model_name, 'verbose_name': m._meta.verbose_name, 'deletable': m._admin.deletable, } if 'deletable' in request.GET: context.update({'deletable': False}) instance = get_object_or_404(m, pk=oid) if not isinstance(navtree._modelforms[m], dict): mf = navtree._modelforms[m] else: if mf is None: try: mf = navtree._modelforms[m][m.FreeAdmin.edit_modelform] except: mf = list(navtree._modelforms[m].values())[-1] else: mf = navtree._modelforms[m][mf] formsets = {} if request.method == "POST": mf = mf(request.POST, request.FILES, instance=instance) if m._admin.advanced_fields: mf.advanced_fields.extend(m._admin.advanced_fields) valid = True if m._admin.inlines: for inlineopts in m._admin.inlines: inline = inlineopts.get("form") prefix = inlineopts.get("prefix") formset = inlineopts.get("formset") _temp = __import__('%s.forms' % m._meta.app_label, globals(), locals(), [inline], 0) inline = getattr(_temp, inline) if formset: formset = getattr(_temp, formset) else: formset = FreeBaseInlineFormSet extrakw = { 'can_delete': True, } fset_fac = inlineformset_factory(m, inline._meta.model, form=inline, formset=formset, extra=0, **extrakw) try: fsname = 'formset_%s' % ( inline._meta.model._meta.model_name, ) fset = fset_fac(request.POST, prefix=prefix, parent=mf, instance=instance) formsets[fsname] = { 'instance': fset, 'position': inlineopts.get('position', 'bottom'), } except dforms.ValidationError: pass for name, fsinfo in list(formsets.items()): for frm in fsinfo['instance'].forms: valid &= frm.is_valid() valid &= fsinfo['instance'].is_valid() valid &= mf.is_valid(formsets=formsets) if valid: if '__confirm' not in request.POST: message = self.get_confirm_message( 'edit', obj=instance, form=mf, ) if message: return JsonResp( request, confirm=self.confirm(message), ) try: mf.save() if not isinstance(mf, MiddlewareModelForm): for name, fsinfo in list(formsets.items()): fsinfo['instance'].save() events = [] if hasattr(mf, "done") and callable(mf.done): mf.done(request=request, events=events) if 'iframe' in request.GET: return JsonResp(request, form=mf, formsets=formsets, message=_("%s successfully updated.") % (m._meta.verbose_name, )) else: return JsonResp(request, form=mf, formsets=formsets, message=_("%s successfully updated.") % (m._meta.verbose_name, ), events=events) except ValidationErrors as e: handle_middleware_validation(mf, e) return JsonResp(request, form=mf, formsets=formsets) except ServiceFailed as e: return JsonResp( request, form=mf, error=True, message=e.value, events=["serviceFailed(\"%s\")" % e.service]) except MiddlewareError as e: return JsonResp(request, form=mf, error=True, message=_("Error: %s") % str(e)) else: return JsonResp(request, form=mf, formsets=formsets) else: mf = mf(instance=instance) if m._admin.advanced_fields: mf.advanced_fields.extend(m._admin.advanced_fields) if m._admin.inlines: extrakw = { 'can_delete': True, } for inlineopts in m._admin.inlines: inline = inlineopts.get("form") prefix = inlineopts.get("prefix") formset = inlineopts.get("formset") _temp = __import__('%s.forms' % m._meta.app_label, globals(), locals(), [inline], 0) inline = getattr(_temp, inline) if formset: formset = getattr(_temp, formset) else: formset = FreeBaseInlineFormSet """ Do not add any extra empty form for the inline formset in case there is already any item in the relationship """ extra = 1 fk_name = None for field in inline._meta.model._meta.fields: if isinstance(field, ForeignKey) and m is field.rel.to: fk_name = field.name break if fk_name: qs = inline._meta.model.objects.filter( **{'%s__id' % fk_name: instance.pk}) if qs.count() > 0: extra = 0 fset_fac = inlineformset_factory(m, inline._meta.model, form=inline, formset=formset, extra=extra, **extrakw) fsname = 'formset_%s' % ( inline._meta.model._meta.model_name, ) fset = fset_fac( prefix=prefix, instance=instance, parent=mf, ) fset.verbose_name = (inline._meta.model._meta.verbose_name) formsets[fsname] = { 'instance': fset, 'position': inlineopts.get('position', 'bottom'), } context.update({ 'form': mf, 'formsets': formsets, 'instance': instance, 'delete_url': reverse('freeadmin_%s_%s_delete' % ( m._meta.app_label, m._meta.model_name, ), kwargs={ 'oid': instance.pk, }), 'hook_buttons': appPool.hook_form_buttons( str(type(mf).__name__), mf, 'edit', ), }) context.update(self.get_extra_context('edit', request=request, form=mf)) template = "%s/%s_edit.html" % ( m._meta.app_label, m._meta.object_name.lower(), ) try: get_template(template) except TemplateDoesNotExist: template = 'freeadmin/generic_model_edit.html' if 'iframe' in request.GET: resp = render(request, template, context, content_type='text/html') resp.content = ("<html><body><textarea>" + resp.content + "</textarea></boby></html>") return resp else: return render(request, template, context, content_type='text/html')
m, inline._meta.model, form=inline, formset=formset, extra=extra, **extrakw ) fsname = "formset_%s" % (inline._meta.model._meta.model_name,) fset = fset_fac(prefix=prefix, instance=instance, parent=mf) fset.verbose_name = inline._meta.model._meta.verbose_name formsets[fsname] = {"instance": fset, "position": inlineopts.get("position", "bottom")} context.update( { "form": mf, "formsets": formsets, "instance": instance, "delete_url": reverse( "freeadmin_%s_%s_delete" % (m._meta.app_label, m._meta.model_name), kwargs={"oid": instance.pk} ), "hook_buttons": appPool.hook_form_buttons(str(type(mf).__name__), mf, "edit"), } ) context.update(self.get_extra_context("edit")) template = "%s/%s_edit.html" % (m._meta.app_label, m._meta.object_name.lower()) try: get_template(template) except TemplateDoesNotExist: template = "freeadmin/generic_model_edit.html" if "iframe" in request.GET: resp = render(request, template, context, content_type="text/html") resp.content = "<html><body><textarea>" + resp.content + "</textarea></boby></html>" return resp