Beispiel #1
0
def cydns_view(request, pk=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    # kwargs everywhere in the dispatchers.
    obj_type = request.path.split('/')[2]

    Klass, FormKlass = get_klasses(obj_type)
    obj = get_object_or_404(Klass, pk=pk) if pk else None

    if request.method == 'POST':
        page_obj = None

        form = FormKlass(request.POST, instance=obj)
        try:
            if perm(request, ACTION_CREATE, obj=obj, obj_class=Klass):
                obj = form.save()
                # If domain, add to current ctnr.
                if is_ajax_form(request):
                    return HttpResponse(json.dumps({'success': True}))

                if (hasattr(obj, 'ctnr_set') and
                        not obj.ctnr_set.exists()):
                    obj.ctnr_set.add(request.session['ctnr'])
                    return redirect(obj.get_list_url())

        except (ValidationError, ValueError), e:
            if hasattr(e, 'messages'):
                e = e.messages

            if not form._errors:
                form._errors = ErrorDict()
                form._errors['__all__'] = ErrorList(e)

            if is_ajax_form(request):
                return HttpResponse(json.dumps({'errors': form.errors}))
Beispiel #2
0
def cy_delete(request):
    """DELETE. DELETE. DELETE."""
    if not request.POST:
        return redirect(request.META.get('HTTP_REFERER', ''))

    obj_type = request.POST.get('obj_type', None)
    pk = request.POST.get('pk', None)
    Klass, _ = get_klasses(obj_type)
    obj = Klass.objects.filter(id=pk)
    if obj.exists():
        obj = obj.get()
    else:
        return HttpResponse(json.dumps({'error': 'Object does not exist'}))
    try:
        if perm(request, ACTION_DELETE, obj=obj):
            if Klass.__name__ == 'Ctnr':
                request = ctnr_delete_session(request, obj)
            obj.delete()
    except ValidationError as e:
        return HttpResponse(json.dumps({'error': ', '.join(e.messages)}))

    referer = request.META.get('HTTP_REFERER', obj.get_list_url())
    if referer.endswith('/'):
        referer = obj.get_list_url()

    # if the obj is an av do not redirect to av list view
    if 'av' in obj_type:
        referer = request.META.get( 'HTTP_REFERER', '')

    return HttpResponse(json.dumps({'msg': 'Object was successfully deleted',
                                    'url': referer}))
Beispiel #3
0
def cy_delete(request):
    """DELETE. DELETE. DELETE."""
    if not request.POST:
        return redirect(request.META.get('HTTP_REFERER', ''))

    obj_type = request.POST.get('obj_type', None)
    pk = request.POST.get('pk', None)
    Klass, _ = get_klasses(obj_type)
    obj = Klass.objects.filter(id=pk)
    if obj.exists():
        obj = obj.get()
    else:
        return HttpResponse(json.dumps({'error': 'Object does not exist'}))
    try:
        if perm(request, ACTION_DELETE, obj=obj):
            if Klass.__name__ == 'Ctnr':
                request = ctnr_delete_session(request, obj)
            obj.delete()
    except ValidationError as e:
        return HttpResponse(json.dumps({'error': ', '.join(e.messages)}))

    referer = request.META.get('HTTP_REFERER', obj.get_list_url())
    if referer.endswith('/'):
        referer = obj.get_list_url()

    # if the obj is an av do not redirect to av list view
    if 'av' in obj_type:
        referer = request.META.get( 'HTTP_REFERER', '')

    return HttpResponse(json.dumps({'msg': 'Object was successfully deleted',
                                    'url': referer}))
Beispiel #4
0
def cy_view(request, template, pk=None, obj_type=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    # kwargs everywhere in the dispatchers.
    obj_type = obj_type or request.path.split('/')[2]

    Klass, FormKlass = get_klasses(obj_type)
    obj = get_object_or_404(Klass, pk=pk) if pk else None
    form = None
    if request.method == 'POST':
        object_table = None
        page_obj = None

        form = FormKlass(request.POST, instance=obj)
        if form.is_valid():
            try:
                if perm(request, ACTION_CREATE, obj=obj, obj_class=Klass):
                    obj = form.save()

                    if Klass.__name__ == 'Ctnr':
                        request = ctnr_update_session(request, obj)

                    if (hasattr(obj, 'ctnr_set') and
                            not obj.ctnr_set.exists()):
                        obj.ctnr_set.add(request.session['ctnr'])

                    object_table = tablefy([obj], request=request)
                    return HttpResponse(
                        json.dumps({'row': object_table}))

            except (ValidationError, ValueError) as e:
                if form.errors is None:
                    form.errors = ErrorDict()
                form.errors.update(e.message_dict)
                return HttpResponse(json.dumps({'errors': form.errors}))
            except DatabaseError as e:  # DatabaseError(number, description)
                if form.errors is None:
                    form.errors = ErrorDict()
                form.errors.setdefault('__all__', []).append(e.args[1])
                return HttpResponse(json.dumps({'errors': form.errors}))
        else:
            return HttpResponse(json.dumps({'errors': form.errors}))
    elif request.method == 'GET':
        object_list = _filter(request, Klass)
        form = FormKlass(instance=obj)
        page_obj = make_paginator(request, do_sort(request, object_list), 50)
        object_table = tablefy(page_obj, request=request)

    if isinstance(form, UsabilityFormMixin):
        form.make_usable(request)

    return cy_render(request, template, {
        'form': form,
        'obj': obj,
        'page_obj': page_obj,
        'object_table': object_table,
        'obj_type': obj_type,
        'pretty_obj_type': Klass.pretty_type,
        'pk': pk,
    })
Beispiel #5
0
def cydns_view(request, pk=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    # kwargs everywhere in the dispatchers.
    obj_type = request.path.split('/')[2]

    Klass, FormKlass = get_klasses(obj_type)
    obj = get_object_or_404(Klass, pk=pk) if pk else None

    if request.method == 'POST':
        page_obj = None

        form = FormKlass(request.POST, instance=obj)
        try:
            if perm(request, ACTION_CREATE, obj=obj, obj_class=Klass):
                obj = form.save()
                # If domain, add to current ctnr.
                if is_ajax_form(request):
                    return HttpResponse(json.dumps({'success': True}))

                if (hasattr(obj, 'ctnr_set') and not obj.ctnr_set.exists()):
                    obj.ctnr_set.add(request.session['ctnr'])
                    return redirect(obj.get_list_url())

        except (ValidationError, ValueError), e:
            if hasattr(e, 'messages'):
                e = e.messages

            if not form._errors:
                form._errors = ErrorDict()
                form._errors['__all__'] = ErrorList(e)

            if is_ajax_form(request):
                return HttpResponse(json.dumps({'errors': form.errors}))
Beispiel #6
0
def cy_view(request, template, pk=None, obj_type=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    # kwargs everywhere in the dispatchers.
    obj_type = obj_type or request.path.split('/')[2]

    Klass, FormKlass = get_klasses(obj_type)
    obj = get_object_or_404(Klass, pk=pk) if pk else None
    form = None
    if request.method == 'POST':
        object_table = None
        page_obj = None

        form = FormKlass(request.POST, instance=obj)
        if form.is_valid():
            try:
                if perm(request, ACTION_CREATE, obj=obj, obj_class=Klass):
                    obj = form.save()

                    if Klass.__name__ == 'Ctnr':
                        request = ctnr_update_session(request, obj)

                    if (hasattr(obj, 'ctnr_set')
                            and not obj.ctnr_set.exists()):
                        obj.ctnr_set.add(request.session['ctnr'])

                    object_table = tablefy([obj], request=request)
                    return HttpResponse(json.dumps({'row': object_table}))

            except (ValidationError, ValueError) as e:
                if form.errors is None:
                    form.errors = ErrorDict()
                form.errors.update(e.message_dict)
                return HttpResponse(json.dumps({'errors': form.errors}))
            except DatabaseError as e:  # DatabaseError(number, description)
                if form.errors is None:
                    form.errors = ErrorDict()
                form.errors.setdefault('__all__', []).append(e.args[1])
                return HttpResponse(json.dumps({'errors': form.errors}))
        else:
            return HttpResponse(json.dumps({'errors': form.errors}))
    elif request.method == 'GET':
        object_list = _filter(request, Klass)
        form = FormKlass(instance=obj)
        page_obj = make_paginator(request, do_sort(request, object_list), 50)
        object_table = tablefy(page_obj, request=request)

    if isinstance(form, UsabilityFormMixin):
        form.make_usable(request)

    return cy_render(
        request, template, {
            'form': form,
            'obj': obj,
            'page_obj': page_obj,
            'object_table': object_table,
            'obj_type': obj_type,
            'pretty_obj_type': Klass.pretty_type,
            'pk': pk,
        })
Beispiel #7
0
def get_update_form(request, get_klasses_fn):
    """
    Update view called asynchronously from the list_create view
    """
    obj_type = request.GET.get("object_type", "")
    record_pk = request.GET.get("pk", "")
    related_type = request.GET.get("related_type", "")
    related_pk = request.GET.get("related_pk", "")
    kwargs = json.loads(request.GET.get("data", "{}").replace("'", '"'))
    if not obj_type:
        raise Http404

    Klass, FormKlass, FQDNFormKlass = get_klasses_fn(obj_type)

    try:
        # Get the object if updating.
        if record_pk:
            record = Klass.objects.get(pk=record_pk)
            if perm(request, cy.ACTION_UPDATE, obj=record):
                if FQDNFormKlass:
                    form = FQDNFormKlass(instance=record)
                else:
                    form = FormKlass(instance=record)
        else:
            #  Get form to create a new object and prepopulate
            if related_type and related_pk:
                form = FormKlass(initial=dict({related_type: related_pk}.items() + kwargs.items()))
            else:
                form = FormKlass(initial=kwargs)
    except ObjectDoesNotExist:
        raise Http404

    return HttpResponse(json.dumps({"form": form.as_p(), "pk": record_pk or ""}))
Beispiel #8
0
def cydns_view(request, pk=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    # kwargs everywhere in the dispatchers.
    obj_type = request.path.split('/')[2]

    # Get the record form.
    Klass, FormKlass, FQDNFormKlass = get_klasses(obj_type)

    # Get the object if updating.
    record = get_object_or_404(Klass, pk=pk) if pk else None
    form = FQDNFormKlass(instance=record)

    if request.method == 'POST':
        qd, domain, errors = _fqdn_to_domain(request.POST.copy())
        # Validate form.
        if errors:
            print errors
            fqdn_form = FQDNFormKlass(request.POST)
            fqdn_form._errors = ErrorDict()
            fqdn_form._errors['__all__'] = ErrorList(errors)
            return render(request, 'cydns/cydns_view.html', {
                'form': fqdn_form,
                'obj_type': obj_type,
                'pk': pk,
                'obj': record
            })
        else:
            form = FormKlass(qd, instance=record)

        try:
            if perm(request, cy.ACTION_CREATE, obj=record, obj_class=Klass):
                record = form.save()
                # If domain, add to current ctnr.
                if obj_type == 'domain':
                    request.session['ctnr'].domains.add(record)
                    return redirect(record.get_list_url())
        except (ValidationError, ValueError):
            form = _revert(domain, request.POST, form, FQDNFormKlass)

    object_list = _filter(request, Klass)
    page_obj = make_paginator(request, do_sort(request, object_list), 50)

    return render(
        request, 'cydns/cydns_view.html', {
            'form': form,
            'obj': record,
            'page_obj': page_obj,
            'object_table': tablefy(page_obj, views=True),
            'obj_type': obj_type,
            'pk': pk,
        })
Beispiel #9
0
def cydns_view(request, pk=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    # kwargs everywhere in the dispatchers.
    obj_type = request.path.split('/')[2]

    # Get the record form.
    Klass, FormKlass, FQDNFormKlass = get_klasses(obj_type)

    # Get the object if updating.
    record = get_object_or_404(Klass, pk=pk) if pk else None
    form = FQDNFormKlass(instance=record)

    if request.method == 'POST':
        qd, domain, errors = _fqdn_to_domain(request.POST.copy())
        # Validate form.
        if errors:
            print errors
            fqdn_form = FQDNFormKlass(request.POST)
            fqdn_form._errors = ErrorDict()
            fqdn_form._errors['__all__'] = ErrorList(errors)
            return render(request, 'cydns/cydns_view.html', {
                'form': fqdn_form,
                'obj_type': obj_type,
                'pk': pk,
                'obj': record
            })
        else:
            form = FormKlass(qd, instance=record)

        try:
            if perm(request, cy.ACTION_CREATE, obj=record, obj_class=Klass):
                record = form.save()
                # If domain, add to current ctnr.
                if obj_type == 'domain':
                    request.session['ctnr'].domains.add(record)
                    return redirect(record.get_list_url())
        except (ValidationError, ValueError):
            form = _revert(domain, request.POST, form, FQDNFormKlass)

    object_list = _filter(request, Klass)
    page_obj = make_paginator(
        request, do_sort(request, object_list), 50)

    return render(request, 'cydns/cydns_view.html', {
        'form': form,
        'obj': record,
        'page_obj': page_obj,
        'object_table': tablefy(page_obj, views=True),
        'obj_type': obj_type,
        'pk': pk,
    })
Beispiel #10
0
def cy_delete(request, pk, get_klasses_fn):
    """DELETE. DELETE. DELETE."""
    obj_type = request.path.split('/')[2]
    Klass, FormKlass, FQDNFormKlass = get_klasses_fn(obj_type)
    obj = get_object_or_404(Klass, pk=pk)

    try:
        if perm(request, cy.ACTION_DELETE, obj=obj):
            obj.delete()
    except ValidationError as e:
        messages.error(request, ', '.join(e.messages))

    return redirect(request.META.get('HTTP_REFERER', obj.get_list_url()))
Beispiel #11
0
def cy_delete(request, pk, get_klasses_fn):
    """DELETE. DELETE. DELETE."""
    obj_type = request.path.split("/")[2]
    Klass, FormKlass, FQDNFormKlass = get_klasses_fn(obj_type)
    obj = get_object_or_404(Klass, pk=pk)

    try:
        if perm(request, cy.ACTION_DELETE, obj=obj):
            obj.delete()
    except ValidationError as e:
        messages.error(request, ", ".join(e.messages))

    return redirect(request.META.get("HTTP_REFERER", obj.get_list_url()))
Beispiel #12
0
def cy_view(request, get_klasses_fn, template, pk=None, obj_type=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    obj_type = obj_type or request.path.split('/')[2]

    Klass, FormKlass, FQDNFormKlass = get_klasses_fn(obj_type)
    obj = get_object_or_404(Klass, pk=pk) if pk else None
    form = FormKlass(instance=obj)

    if request.method == 'POST':
        form = FormKlass(request.POST, instance=obj)

        if form.is_valid():
            try:
                if perm(request, cy.ACTION_CREATE, obj=obj, obj_class=Klass):
                    obj = form.save()
                    return redirect(
                        request.META.get('HTTP_REFERER', obj.get_list_url()))
            except (ValidationError, ValueError) as e:
                if form._errors is None:
                    form._errors = ErrorDict()
                form._errors["__all__"] = ErrorList(e.messages)
                return render(request, template, {
                    'form': form,
                    'obj': obj,
                    'obj_type': obj_type,
                    'pk': pk,
                })
    elif request.method == 'GET':
        form = FormKlass(initial=qd_to_py_dict(request.GET))

    object_list = _filter(request, Klass)
    page_obj = make_paginator(request, do_sort(request, object_list), 50)

    return render(
        request, template, {
            'form': form,
            'obj': obj,
            'page_obj': page_obj,
            'object_table': tablefy(page_obj),
            'obj_type': obj_type,
            'pk': pk,
        })
Beispiel #13
0
def cy_view(request, get_klasses_fn, template, pk=None, obj_type=None):
    """List, create, update view in one for a flatter heirarchy. """
    # Infer obj_type from URL, saves trouble of having to specify
    obj_type = obj_type or request.path.split("/")[2]

    Klass, FormKlass, FQDNFormKlass = get_klasses_fn(obj_type)
    obj = get_object_or_404(Klass, pk=pk) if pk else None
    form = FormKlass(instance=obj)

    if request.method == "POST":
        form = FormKlass(request.POST, instance=obj)

        if form.is_valid():
            try:
                if perm(request, cy.ACTION_CREATE, obj=obj, obj_class=Klass):
                    obj = form.save()
                    return redirect(request.META.get("HTTP_REFERER", obj.get_list_url()))
            except (ValidationError, ValueError) as e:
                if form._errors is None:
                    form._errors = ErrorDict()
                form._errors["__all__"] = ErrorList(e.messages)
                return render(request, template, {"form": form, "obj": obj, "obj_type": obj_type, "pk": pk})
    elif request.method == "GET":
        form = FormKlass(initial=qd_to_py_dict(request.GET))

    object_list = _filter(request, Klass)
    page_obj = make_paginator(request, do_sort(request, object_list), 50)

    return render(
        request,
        template,
        {
            "form": form,
            "obj": obj,
            "page_obj": page_obj,
            "object_table": tablefy(page_obj),
            "obj_type": obj_type,
            "pk": pk,
        },
    )
Beispiel #14
0
def get_update_form(request, get_klasses_fn):
    """
    Update view called asynchronously from the list_create view
    """
    obj_type = request.GET.get('object_type', '')
    record_pk = request.GET.get('pk', '')
    related_type = request.GET.get('related_type', '')
    related_pk = request.GET.get('related_pk', '')
    kwargs = json.loads(request.GET.get('data', '{}').replace("'", "\""))
    if not obj_type:
        raise Http404

    Klass, FormKlass, FQDNFormKlass = get_klasses_fn(obj_type)

    try:
        # Get the object if updating.
        if record_pk:
            record = Klass.objects.get(pk=record_pk)
            if perm(request, cy.ACTION_UPDATE, obj=record):
                if FQDNFormKlass:
                    form = FQDNFormKlass(instance=record)
                else:
                    form = FormKlass(instance=record)
        else:
            #  Get form to create a new object and prepopulate
            if related_type and related_pk:
                form = FormKlass(
                    initial=dict({related_type: related_pk}.items() +
                                 kwargs.items()))
            else:
                form = FormKlass(initial=kwargs)
    except ObjectDoesNotExist:
        raise Http404

    return HttpResponse(
        json.dumps({
            'form': form.as_p(),
            'pk': record_pk or ''
        }))
Beispiel #15
0
def get_update_form(request):
    """
    Update view called asynchronously from the list_create view
    Returns an http response including the form, form_title,
    submit_btn_label, and pk.
    """
    obj_type = request.GET.get('obj_type', '')
    record_pk = request.GET.get('pk', '')
    related_type = request.GET.get('related_type', '')
    related_pk = request.GET.get('related_pk', '')
    kwargs = json.loads(request.GET.get('data', '{}').replace("'", "\""))
    if kwargs:
        print kwargs

    if not obj_type:
        raise Http404

    Klass, FormKlass = get_klasses(obj_type)
    form_title = 'Creating {0}'.format(Klass.pretty_type)
    submit_btn_label = 'Create {0}'.format(Klass.pretty_type)

    try:
        # Get the object if updating.
        if record_pk:
            record = Klass.objects.get(pk=record_pk)
            form_title = form_title.replace('Creating', 'Updating')
            submit_btn_label = submit_btn_label.replace('Create', 'Update')
            if perm(request, ACTION_UPDATE, obj=record):
                form = FormKlass(instance=record)
        else:
            #  Get form to create a new object and prepopulate
            if related_type and related_pk:

                # This try-except is faster than
                # `'entity' in ...get_all_field_names()`.
                try:
                    # test if the model has an 'entity' field
                    FormKlass._meta.model._meta.get_field('entity')
                    # autofill the 'entity' field
                    kwargs['entity'] = related_pk
                except:     # no 'entity' field
                    pass

                initial = copy(kwargs)
                initial[related_type] = related_pk
                form = FormKlass(initial=initial)

                if related_type == 'range' and not obj_type.endswith('_av'):
                    for field in ['vrf', 'site', 'next_ip']:
                        form.fields[field].widget = forms.HiddenInput()
                    form.fields['ip_str'].widget.attrs['readonly'] = True
                    form.fields['ip_type'].widget.attrs['readonly'] = True
                    ip_type = form.fields['ip_type'].initial
                    form.fields['ip_type'].choices = [
                        (str(ip_type), "IPv{0}".format(ip_type))]

                if FormKlass.__name__ == 'RangeForm':
                    Network = get_model('cyder', 'network')
                    network = Network.objects.get(id=related_pk)
                    network_str = network.network_str.split('/')
                    initial = '.'.join(
                        network_str[0].split('.')[:int(network_str[1])/8])
                    if int(network_str[1]) < 32:
                        initial += '.'
                    form = FormKlass(initial=dict(
                        {'start_str': initial,
                         'end_str': initial,
                         related_type: related_pk}.items() + kwargs.items()))

            else:
                form = FormKlass(initial=kwargs)

    except ObjectDoesNotExist:
        raise Http404

    if related_type in form.fields:
        RelatedKlass, _ = get_klasses(related_type)
        form.fields[related_type] = ModelChoiceField(
            widget=HiddenInput, empty_label=None,
            queryset=RelatedKlass.objects.filter(pk=int(related_pk)))

    if isinstance(form, UsabilityFormMixin):
        form.make_usable(request)

    return HttpResponse(
        json.dumps({
            'form': form.as_p(),
            'form_title': form_title,
            'submit_btn_label': submit_btn_label,
            'pk': record_pk
        }))
Beispiel #16
0
def get_update_form(request):
    """
    Update view called asynchronously from the list_create view
    Returns an http response including the form, form_title,
    submit_btn_label, and pk.
    """
    obj_type = request.GET.get('obj_type', '')
    record_pk = request.GET.get('pk', '')
    related_type = request.GET.get('related_type', '')
    related_pk = request.GET.get('related_pk', '')
    kwargs = json.loads(request.GET.get('data', '{}').replace("'", "\""))
    if kwargs:
        print kwargs

    if not obj_type:
        raise Http404

    Klass, FormKlass = get_klasses(obj_type)
    form_title = 'Creating {0}'.format(Klass.pretty_type)
    submit_btn_label = 'Create {0}'.format(Klass.pretty_type)

    try:
        # Get the object if updating.
        if record_pk:
            record = Klass.objects.get(pk=record_pk)
            form_title = form_title.replace('Creating', 'Updating')
            submit_btn_label = submit_btn_label.replace('Create', 'Update')
            if perm(request, ACTION_UPDATE, obj=record):
                form = FormKlass(instance=record)
        else:
            #  Get form to create a new object and prepopulate
            if related_type and related_pk:

                # This try-except is faster than
                # `'entity' in ...get_all_field_names()`.
                try:
                    # test if the model has an 'entity' field
                    FormKlass._meta.model._meta.get_field('entity')
                    # autofill the 'entity' field
                    kwargs['entity'] = related_pk
                except:     # no 'entity' field
                    pass

                initial = copy(kwargs)
                initial[related_type] = related_pk
                if 'ctnr' in FormKlass.base_fields:
                    initial['ctnr'] = request.session['ctnr']
                form = FormKlass(initial=initial)
                if 'ctnr' in FormKlass.base_fields and \
                        request.session['ctnr'].name != 'global':
                    form.fields['ctnr'].widget = forms.HiddenInput()

                if related_type == 'range' and not obj_type.endswith('_av'):
                    for field in ['vrf', 'site', 'next_ip']:
                        form.fields[field].widget = forms.HiddenInput()
                    form.fields['ip_str'].widget.attrs['readonly'] = True
                    form.fields['ip_type'].widget.attrs['readonly'] = True
                    ip_type = form.fields['ip_type'].initial
                    form.fields['ip_type'].choices = [
                        (str(ip_type), "IPv{0}".format(ip_type))]

                if FormKlass.__name__ == 'RangeForm':
                    Network = get_model('cyder', 'network')
                    network = Network.objects.get(id=related_pk)
                    network_str = network.network_str.split('/')
                    initial = '.'.join(
                        network_str[0].split('.')[:int(network_str[1])/8])
                    if int(network_str[1]) < 32:
                        initial += '.'
                    form = FormKlass(initial=dict(
                        {'start_str': initial,
                         'end_str': initial,
                         related_type: related_pk}.items() + kwargs.items()))

            else:
                form = FormKlass(initial=kwargs)

    except ObjectDoesNotExist:
        raise Http404

    if related_type in form.fields:
        RelatedKlass, _ = get_klasses(related_type)
        form.fields[related_type] = ModelChoiceField(
            widget=HiddenInput, empty_label=None,
            queryset=RelatedKlass.objects.filter(pk=int(related_pk)))

    if isinstance(form, UsabilityFormMixin):
        form.make_usable(request)
    return HttpResponse(
        json.dumps({
            'form': form.as_p(),
            'form_title': form_title,
            'submit_btn_label': submit_btn_label,
            'pk': record_pk
        }))