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}))
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}))
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, })
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, })
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 ""}))
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, })
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, })
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()))
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()))
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, })
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, }, )
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 '' }))
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 }))
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 }))