コード例 #1
0
def generic_model_empty_formset(request, app, model):

    try:
        _temp = __import__('%s.models' % app, globals(), locals(), [model], -1)
    except ImportError:
        raise
    m = getattr(_temp, model)

    if not m._admin.inlines:
        return None

    inline = None
    for inlineopts in m._admin.inlines:
        _inline = inlineopts.get("form")
        prefix = inlineopts.get("prefix")
        if prefix == request.GET.get("fsname"):
            _temp = __import__('%s.forms' % app, globals(), locals(), [_inline], -1)
            inline = getattr(_temp, _inline)
            break

    if inline:
        fset = inlineformset_factory(m, inline._meta.model, form=inline, extra=1)
        fsins = fset(prefix=prefix)

        return HttpResponse(fsins.empty_form.as_table())
    return HttpResponse()
コード例 #2
0
    def empty_formset(self, request):
        m = self._model

        log.debug("XXX %s.forms", m._meta.app_label)
        log.debug("XXX globals() = %s", globals())
        log.debug("XXX locals() = %s", locals())

        if not m._admin.inlines:
            return None

        inline = None
        for inlineopts in m._admin.inlines:
            _inline = inlineopts.get("form")
            prefix = inlineopts.get("prefix")
            formset = inlineopts.get("formset")
            if prefix == request.GET.get("fsname"):
                _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
                break

        if inline:
            fset = inlineformset_factory(m,
                                         inline._meta.model,
                                         form=inline,
                                         formset=formset,
                                         extra=1)
            fsins = fset(prefix=prefix)

            return HttpResponse(fsins.empty_form.as_table())
        return HttpResponse()
コード例 #3
0
ファイル: options.py プロジェクト: noprobs/freenas
    def empty_formset(self, request):

        m = self._model

        if not m._admin.inlines:
            return None

        inline = None
        for inlineopts in m._admin.inlines:
            _inline = inlineopts.get("form")
            prefix = inlineopts.get("prefix")
            if prefix == request.GET.get("fsname"):
                _temp = __import__(
                    '%s.forms' % m._meta.app_label,
                    globals(),
                    locals(),
                    [_inline],
                    -1)
                inline = getattr(_temp, _inline)
                break

        if inline:
            fset = inlineformset_factory(
                m,
                inline._meta.model,
                form=inline,
                extra=1)
            fsins = fset(prefix=prefix)

            return HttpResponse(fsins.empty_form.as_table())
        return HttpResponse()
コード例 #4
0
ファイル: options.py プロジェクト: vaibhav-rbs/freenas
    def empty_formset(self, request):
        m = self._model

        log.debug("XXX %s.forms", m._meta.app_label)
        log.debug("XXX globals() = %s", globals())
        log.debug("XXX locals() = %s", locals())

        if not m._admin.inlines:
            return None

        inline = None
        for inlineopts in m._admin.inlines:
            _inline = inlineopts.get("form")
            prefix = inlineopts.get("prefix")
            formset = inlineopts.get("formset")
            if prefix == request.GET.get("fsname"):
                _temp = __import__("%s.forms" % m._meta.app_label, globals(), locals(), [_inline], -1)
                inline = getattr(_temp, _inline)
                if formset:
                    formset = getattr(_temp, formset)
                else:
                    formset = FreeBaseInlineFormSet
                break

        if inline:
            fset = inlineformset_factory(m, inline._meta.model, form=inline, formset=formset, extra=1)
            fsins = fset(prefix=prefix)

            return HttpResponse(fsins.empty_form.as_table())
        return HttpResponse()
コード例 #5
0
ファイル: options.py プロジェクト: genba/freenas
    def empty_formset(self, request):

        m = self._model

        if not m._admin.inlines:
            return None

        inline = None
        for inlineopts in m._admin.inlines:
            _inline = inlineopts.get("form")
            prefix = inlineopts.get("prefix")
            if prefix == request.GET.get("fsname"):
                _temp = __import__(
                    '%s.forms' % m._meta.app_label,
                    globals(),
                    locals(),
                    [_inline],
                    -1)
                inline = getattr(_temp, _inline)
                break

        if inline:
            fset = inlineformset_factory(
                m,
                inline._meta.model,
                form=inline,
                extra=1)
            fsins = fset(prefix=prefix)

            return HttpResponse(fsins.empty_form.as_table())
        return HttpResponse()
コード例 #6
0
ファイル: options.py プロジェクト: freenas/freenas
    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')
コード例 #7
0
ファイル: options.py プロジェクト: freenas/freenas
    def add(self, request, mf=None):
        """
        Magic happens here

        We dynamically import the module based on app and model names
        passed as view argument

        From there we retrieve the ModelForm associated (which was discovered
        previously on the auto_generate process)
        """
        from freenasUI.freeadmin.navtree import navtree
        from freenasUI.freeadmin.views import JsonResp

        m = self._model
        app = self._model._meta.app_label
        context = {
            'app': app,
            'model': m,
            'modeladmin': m._admin,
            'mf': mf,
            'model_name': m._meta.model_name,
            'verbose_name': m._meta.verbose_name,
            'extra_js': m._admin.extra_js,
        }

        if not isinstance(navtree._modelforms[m], dict):
            mf = navtree._modelforms[m]
        else:
            if mf is None:
                try:
                    mf = navtree._modelforms[m][m._admin.create_modelform]
                except:
                    try:
                        mf = navtree._modelforms[m][m._admin.edit_modelform]
                    except:
                        mf = list(navtree._modelforms[m].values())[-1]
            else:
                mf = navtree._modelforms[m][mf]

        instance = m()
        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' % app,
                        globals(),
                        locals(),
                        [inline],
                        0)
                    inline = getattr(_temp, inline)

                    if formset:
                        formset = getattr(_temp, formset)
                    else:
                        formset = FreeBaseInlineFormSet

                    extrakw = {
                        'can_delete': False
                    }
                    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(
                        'add',
                        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)
                    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,
                        error=True,
                        message=e.value,
                        events=["serviceFailed(\"%s\")" % e.service])
                except MiddlewareError as e:
                    return JsonResp(
                        request,
                        error=True,
                        message=_("Error: %s") % str(e))
            else:
                return JsonResp(request, form=mf, formsets=formsets)

        else:
            mf = mf()
            if m._admin.advanced_fields:
                mf.advanced_fields.extend(m._admin.advanced_fields)
            if m._admin.inlines:
                extrakw = {
                    'can_delete': False
                }
                for inlineopts in m._admin.inlines:
                    inline = inlineopts.get("form")
                    prefix = inlineopts.get("prefix")
                    formset = inlineopts.get("formset")

                    _temp = __import__(
                        '%s.forms' % app,
                        globals(),
                        locals(),
                        [inline],
                        0)
                    inline = getattr(_temp, inline)

                    if formset:
                        formset = getattr(_temp, formset)
                    else:
                        formset = FreeBaseInlineFormSet

                    fset_fac = inlineformset_factory(
                        m,
                        inline._meta.model,
                        form=inline,
                        formset=formset,
                        extra=1,
                        **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,
        })

        context.update(self.get_extra_context('add', request=request, form=mf))

        template = "%s/%s_add.html" % (
            m._meta.app_label,
            m._meta.object_name.lower(),
        )
        try:
            get_template(template)
        except TemplateDoesNotExist:
            template = 'freeadmin/generic_model_add.html'

        return render(request, template, context)
コード例 #8
0
    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')
コード例 #9
0
    def add(self, request, mf=None):
        """
        Magic happens here

        We dynamically import the module based on app and model names
        passed as view argument

        From there we retrieve the ModelForm associated (which was discovered
        previously on the auto_generate process)
        """
        from freenasUI.freeadmin.navtree import navtree
        from freenasUI.freeadmin.views import JsonResp

        m = self._model
        app = self._model._meta.app_label
        context = {
            'app': app,
            'model': m,
            'modeladmin': m._admin,
            'mf': mf,
            'model_name': m._meta.model_name,
            'verbose_name': m._meta.verbose_name,
            'extra_js': m._admin.extra_js,
        }

        if not isinstance(navtree._modelforms[m], dict):
            mf = navtree._modelforms[m]
        else:
            if mf is None:
                try:
                    mf = navtree._modelforms[m][m._admin.create_modelform]
                except:
                    try:
                        mf = navtree._modelforms[m][m._admin.edit_modelform]
                    except:
                        mf = list(navtree._modelforms[m].values())[-1]
            else:
                mf = navtree._modelforms[m][mf]

        instance = m()
        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' % app, globals(), locals(),
                                       [inline], 0)
                    inline = getattr(_temp, inline)

                    if formset:
                        formset = getattr(_temp, formset)
                    else:
                        formset = FreeBaseInlineFormSet

                    extrakw = {'can_delete': False}
                    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(
                        'add',
                        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)
                    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,
                        error=True,
                        message=e.value,
                        events=["serviceFailed(\"%s\")" % e.service])
                except MiddlewareError as e:
                    return JsonResp(request,
                                    error=True,
                                    message=_("Error: %s") % str(e))
            else:
                return JsonResp(request, form=mf, formsets=formsets)

        else:
            mf = mf()
            if m._admin.advanced_fields:
                mf.advanced_fields.extend(m._admin.advanced_fields)
            if m._admin.inlines:
                extrakw = {'can_delete': False}
                for inlineopts in m._admin.inlines:
                    inline = inlineopts.get("form")
                    prefix = inlineopts.get("prefix")
                    formset = inlineopts.get("formset")

                    _temp = __import__('%s.forms' % app, globals(), locals(),
                                       [inline], 0)
                    inline = getattr(_temp, inline)

                    if formset:
                        formset = getattr(_temp, formset)
                    else:
                        formset = FreeBaseInlineFormSet

                    fset_fac = inlineformset_factory(m,
                                                     inline._meta.model,
                                                     form=inline,
                                                     formset=formset,
                                                     extra=1,
                                                     **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,
        })

        context.update(self.get_extra_context('add', request=request, form=mf))

        template = "%s/%s_add.html" % (
            m._meta.app_label,
            m._meta.object_name.lower(),
        )
        try:
            get_template(template)
        except TemplateDoesNotExist:
            template = 'freeadmin/generic_model_add.html'

        return render(request, template, context)
コード例 #10
0
ファイル: options.py プロジェクト: vaibhav-rbs/freenas
    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 = 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], -1)
                    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 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()
                    for name, fsinfo in 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 ServiceFailed, e:
                    return JsonResp(
                        request,
                        form=mf,
                        error=True,
                        message=_("The service failed to restart."),
                        events=['serviceFailed("%s")' % e.service],
                    )
                except MiddlewareError, e:
                    return JsonResp(request, form=mf, error=True, message=_(u"Error: %s") % unicode(e))
コード例 #11
0
ファイル: options.py プロジェクト: genba/freenas
    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,
            '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 = 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")
                    _temp = __import__(
                        '%s.forms' % m._meta.app_label,
                        globals(),
                        locals(),
                        [inline],
                        -1)
                    inline = getattr(_temp, inline)
                    extrakw = {
                        'can_delete': True,
                    }
                    fset = inlineformset_factory(
                        m,
                        inline._meta.model,
                        form=inline,
                        extra=0,
                        **extrakw)
                    try:
                        fsname = 'formset_%s' % (
                            inline._meta.model._meta.module_name,
                        )
                        formsets[fsname] = fset(
                            request.POST,
                            prefix=prefix,
                            instance=instance)
                    except dforms.ValidationError:
                        pass

            for name, fs in formsets.items():
                for frm in fs.forms:
                    frm.parent = mf
                valid &= fs.is_valid()

            valid &= mf.is_valid(formsets=formsets)

            if valid:
                try:
                    mf.save()
                    for name, fs in formsets.items():
                        fs.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 ServiceFailed, e:
                    return JsonResp(
                        request,
                        form=mf,
                        error=True,
                        message=_("The service failed to restart."),
                        events=["serviceFailed(\"%s\")" % e.service])
                except MiddlewareError, e:
                    return JsonResp(
                        request,
                        form=mf,
                        error=True,
                        message=_(u"Error: %s") % unicode(e))
コード例 #12
0
ファイル: options.py プロジェクト: bravechou2009/freenas
                        '%s.forms' % app,
                        globals(),
                        locals(),
                        [inline],
                        -1)
                    inline = getattr(_temp, inline)

                    if formset:
                        formset = getattr(_temp, formset)
                    else:
                        formset = FreeBaseInlineFormSet

                    fset_fac = inlineformset_factory(
                        m,
                        inline._meta.model,
                        form=inline,
                        formset=formset,
                        extra=1,
                        **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'),
コード例 #13
0
ファイル: options.py プロジェクト: noprobs/freenas
    def add(self, request, mf=None):
        """
        Magic happens here

        We dynamically import the module based on app and model names
        passed as view argument

        From there we retrieve the ModelForm associated (which was discovered
        previously on the auto_generate process)
        """
        from freenasUI.freeadmin.navtree import navtree
        from freenasUI.freeadmin.views import JsonResp

        m = self._model
        app = self._model._meta.app_label
        context = {
            'app': app,
            'model': m,
            'modeladmin': m._admin,
            'mf': mf,
            'verbose_name': m._meta.verbose_name,
            'extra_js': m._admin.extra_js,
        }

        if not isinstance(navtree._modelforms[m], dict):
            mf = navtree._modelforms[m]
        else:
            if mf is None:
                try:
                    mf = navtree._modelforms[m][m._admin.create_modelform]
                except:
                    try:
                        mf = navtree._modelforms[m][m._admin.edit_modelform]
                    except:
                        mf = navtree._modelforms[m].values()[-1]
            else:
                mf = navtree._modelforms[m][mf]

        instance = m()
        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")
                    _temp = __import__(
                        '%s.forms' % app,
                        globals(),
                        locals(),
                        [inline],
                        -1)
                    inline = getattr(_temp, inline)
                    extrakw = {
                        'can_delete': False
                    }
                    fset = inlineformset_factory(
                        m,
                        inline._meta.model,
                        form=inline,
                        extra=0,
                        **extrakw)
                    try:
                        fsname = 'formset_%s' % (
                            inline._meta.model._meta.module_name,
                        )
                        formsets[fsname] = fset(
                            request.POST,
                            prefix=prefix,
                            instance=instance)
                    except dforms.ValidationError:
                        pass

            for name, fs in formsets.items():
                for frm in fs.forms:
                    frm.parent = mf
                valid &= fs.is_valid()

            valid &= mf.is_valid(formsets=formsets)

            if valid:
                try:
                    mf.save()
                    for name, fs in formsets.items():
                        fs.save()
                    events = []
                    if hasattr(mf, "done") and callable(mf.done):
                        mf.done(request=request, events=events)
                    return JsonResp(
                        request,
                        form=mf,
                        formsets=formsets,
                        message=_("%s successfully updated.") % (
                            m._meta.verbose_name,
                        ),
                        events=events)
                except MiddlewareError, e:
                    return JsonResp(
                        request,
                        error=True,
                        message=_(u"Error: %s") % unicode(e))
                except ServiceFailed, e:
                    return JsonResp(
                        request,
                        error=True,
                        message=_("The service failed to restart.")
                    )
コード例 #14
0
def generic_model_edit(request, app, model, oid, mf=None):

    try:
        _temp = __import__('%s.models' % app, globals(), locals(), [model], -1)
    except ImportError:
        raise
    m = getattr(_temp, model)

    if request.GET.has_key("inline"):
        inline = True
    else:
        inline = False

    context = {
        'app': app,
        'model': model,
        'modeladmin': m._admin,
        'mf': mf,
        'oid': oid,
        'inline': inline,
        'extra_js': m._admin.extra_js,
        'verbose_name': m._meta.verbose_name,
    }

    if m._admin.deletable is False:
        context.update({'deletable': False})
    if request.GET.has_key("deletable") and not context.has_key("deletable"):
        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 == None:
            try:
                mf = navtree._modelforms[m][m.FreeAdmin.edit_modelform]
            except:
                mf = 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)

        if mf.is_valid():
            valid = True
        else:
            valid = False

        if m._admin.inlines:
            for inlineopts in m._admin.inlines:
                inline = inlineopts.get("form")
                prefix = inlineopts.get("prefix")
                _temp = __import__('%s.forms' % app, globals(), locals(), [inline], -1)
                inline = getattr(_temp, inline)
                extrakw = {
                    'can_delete': True,
                    }
                fset = inlineformset_factory(m, inline._meta.model, form=inline, extra=0, **extrakw)
                try:
                    formsets['formset_%s' % inline._meta.model._meta.module_name] = fset(request.POST, prefix=prefix, instance=instance)
                except dforms.ValidationError:
                    pass

        for name, fs in formsets.items():
            for frm in fs.forms:
                frm.parent  = mf
            valid &= fs.is_valid()

        if valid:
            try:
                mf.save()
                for name, fs in formsets.items():
                    fs.save()
                events = []
                if hasattr(mf, "done") and callable(mf.done):
                    #FIXME: temporary workaround to do not change all MF to accept this arg
                    try:
                        mf.done(request=request, events=events)
                    except TypeError:
                        mf.done()
                if request.GET.has_key("iframe"):
                    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 ServiceFailed, e:
                return JsonResp(request, form=mf, error=True, message=_("The service failed to restart.") % m._meta.verbose_name, events=["serviceFailed(\"%s\")" % e.service])
            except MiddlewareError, e:
                return JsonResp(request, form=mf, error=True, message=_("Error: %s") % str(e))
コード例 #15
0
ファイル: options.py プロジェクト: genba/freenas
                extrakw = {
                    'can_delete': False
                }
                for inlineopts in m._admin.inlines:
                    inline = inlineopts.get("form")
                    prefix = inlineopts.get("prefix")
                    _temp = __import__(
                        '%s.forms' % app,
                        globals(),
                        locals(),
                        [inline],
                        -1)
                    inline = getattr(_temp, inline)
                    fset = inlineformset_factory(
                        m,
                        inline._meta.model,
                        form=inline,
                        extra=1,
                        **extrakw)
                    fsname = 'formset_%s' % (
                        inline._meta.model._meta.module_name,
                    )
                    formsets[fsname] = fset(prefix=prefix, instance=instance)
                    formsets[fsname].verbose_name = (
                        inline._meta.model._meta.verbose_name
                    )

        context.update({
            'form': mf,
            'formsets': formsets,
        })
コード例 #16
0
ファイル: options.py プロジェクト: genba/freenas
    def add(self, request, mf=None):
        """
        Magic happens here

        We dynamically import the module based on app and model names
        passed as view argument

        From there we retrieve the ModelForm associated (which was discovered
        previously on the auto_generate process)
        """
        from freenasUI.freeadmin.navtree import navtree
        from freenasUI.freeadmin.views import JsonResp

        m = self._model
        app = self._model._meta.app_label
        context = {
            'app': app,
            'model': m,
            'modeladmin': m._admin,
            'mf': mf,
            'verbose_name': m._meta.verbose_name,
            'extra_js': m._admin.extra_js,
        }

        if not isinstance(navtree._modelforms[m], dict):
            mf = navtree._modelforms[m]
        else:
            if mf is None:
                try:
                    mf = navtree._modelforms[m][m._admin.create_modelform]
                except:
                    try:
                        mf = navtree._modelforms[m][m._admin.edit_modelform]
                    except:
                        mf = navtree._modelforms[m].values()[-1]
            else:
                mf = navtree._modelforms[m][mf]

        instance = m()
        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")
                    _temp = __import__(
                        '%s.forms' % app,
                        globals(),
                        locals(),
                        [inline],
                        -1)
                    inline = getattr(_temp, inline)
                    extrakw = {
                        'can_delete': False
                    }
                    fset = inlineformset_factory(
                        m,
                        inline._meta.model,
                        form=inline,
                        extra=0,
                        **extrakw)
                    try:
                        fsname = 'formset_%s' % (
                            inline._meta.model._meta.module_name,
                        )
                        formsets[fsname] = fset(
                            request.POST,
                            prefix=prefix,
                            instance=instance)
                    except dforms.ValidationError:
                        pass

            for name, fs in formsets.items():
                for frm in fs.forms:
                    frm.parent = mf
                valid &= fs.is_valid()

            valid &= mf.is_valid(formsets=formsets)

            if valid:
                try:
                    mf.save()
                    for name, fs in formsets.items():
                        fs.save()
                    events = []
                    if hasattr(mf, "done") and callable(mf.done):
                        mf.done(request=request, events=events)
                    return JsonResp(
                        request,
                        form=mf,
                        formsets=formsets,
                        message=_("%s successfully updated.") % (
                            m._meta.verbose_name,
                        ),
                        events=events)
                except MiddlewareError, e:
                    return JsonResp(
                        request,
                        error=True,
                        message=_(u"Error: %s") % unicode(e))
                except ServiceFailed, e:
                    return JsonResp(
                        request,
                        error=True,
                        message=_("The service failed to restart.")
                    )
コード例 #17
0
     'can_delete': False
 }
 for inlineopts in m._admin.inlines:
     inline = inlineopts.get("form")
     prefix = inlineopts.get("prefix")
     _temp = __import__(
         '%s.forms' % app,
         globals(),
         locals(),
         [inline],
         -1)
     inline = getattr(_temp, inline)
     fset_fac = inlineformset_factory(
         m,
         inline._meta.model,
         form=inline,
         formset=FreeBaseInlineFormSet,
         extra=1,
         **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'),
コード例 #18
0
    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,
            '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 = 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")
                    _temp = __import__(
                        '%s.forms' % m._meta.app_label,
                        globals(),
                        locals(),
                        [inline],
                        -1)
                    inline = getattr(_temp, inline)
                    extrakw = {
                        'can_delete': True,
                    }
                    fset_fac = inlineformset_factory(
                        m,
                        inline._meta.model,
                        form=inline,
                        formset=FreeBaseInlineFormSet,
                        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 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()
                    for name, fsinfo in 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 ServiceFailed, e:
                    return JsonResp(
                        request,
                        form=mf,
                        error=True,
                        message=_("The service failed to restart."),
                        events=["serviceFailed(\"%s\")" % e.service])
                except MiddlewareError, e:
                    return JsonResp(
                        request,
                        form=mf,
                        error=True,
                        message=_(u"Error: %s") % unicode(e))
コード例 #19
0
ファイル: options.py プロジェクト: vaibhav-rbs/freenas
    def add(self, request, mf=None):
        """
        Magic happens here

        We dynamically import the module based on app and model names
        passed as view argument

        From there we retrieve the ModelForm associated (which was discovered
        previously on the auto_generate process)
        """
        from freenasUI.freeadmin.navtree import navtree
        from freenasUI.freeadmin.views import JsonResp

        m = self._model
        app = self._model._meta.app_label
        context = {
            "app": app,
            "model": m,
            "modeladmin": m._admin,
            "mf": mf,
            "model_name": m._meta.model_name,
            "verbose_name": m._meta.verbose_name,
            "extra_js": m._admin.extra_js,
        }

        if not isinstance(navtree._modelforms[m], dict):
            mf = navtree._modelforms[m]
        else:
            if mf is None:
                try:
                    mf = navtree._modelforms[m][m._admin.create_modelform]
                except:
                    try:
                        mf = navtree._modelforms[m][m._admin.edit_modelform]
                    except:
                        mf = navtree._modelforms[m].values()[-1]
            else:
                mf = navtree._modelforms[m][mf]

        instance = m()
        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" % app, globals(), locals(), [inline], -1)
                    inline = getattr(_temp, inline)

                    if formset:
                        formset = getattr(_temp, formset)
                    else:
                        formset = FreeBaseInlineFormSet

                    extrakw = {"can_delete": False}
                    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 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("add", obj=instance, form=mf)
                    if message:
                        return JsonResp(request, confirm=self.confirm(message))
                try:
                    mf.save()
                    for name, fsinfo in formsets.items():
                        fsinfo["instance"].save()
                    events = []
                    if hasattr(mf, "done") and callable(mf.done):
                        mf.done(request=request, events=events)
                    return JsonResp(
                        request,
                        form=mf,
                        formsets=formsets,
                        message=_("%s successfully updated.") % (m._meta.verbose_name,),
                        events=events,
                    )
                except MiddlewareError, e:
                    return JsonResp(request, error=True, message=_(u"Error: %s") % unicode(e))
                except ServiceFailed, e:
                    return JsonResp(request, error=True, message=_("The service failed to restart."))