Skip to content

Commit

Permalink
Merge pull request #2311 from szok/dns-change-form
Browse files Browse the repository at this point in the history
Dns change form
  • Loading branch information
xliiv committed Mar 22, 2016
2 parents f943226 + bf05cd4 commit 57bb729
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 54 deletions.
18 changes: 6 additions & 12 deletions src/ralph/dns/dnsaas.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import requests
from django.conf import settings
from django.utils.translation import ugettext_lazy as _

from ralph.dns.forms import RecordType
from ralph.helpers import cache
Expand Down Expand Up @@ -67,7 +68,7 @@ def get_dns_records(self, ipaddresses):
'ptr': item['name'] in ptr_list and item['type'] == 'A',
'owner': settings.DNSAAS_OWNER
})
return dns_records
return sorted(dns_records, key=lambda x: x['type'])

def update_dns_records(self, record):
"""
Expand Down Expand Up @@ -95,8 +96,7 @@ def update_dns_records(self, record):
}
request = self.session.patch(url, data=data)
if request.status_code != 200:
return False
return True
return request.json()

@cache()
def get_domain(self, domain_name):
Expand All @@ -118,8 +118,6 @@ def get_domain(self, domain_name):
if result:
return result[0]['url']

return False

def create_dns_records(self, record):
"""
Create new DNS record.
Expand All @@ -138,7 +136,7 @@ def create_dns_records(self, record):
logger.error(
'Domain not found for record {}'.format(record)
)
return False
return {'name': [_('Domain not found.')]}

data = {
'name': record['name'],
Expand All @@ -154,9 +152,7 @@ def create_dns_records(self, record):
}
request = self.session.post(url, data=data)
if request.status_code != 201:
return False

return True
return request.json()

def delete_dns_records(self, record_id):
"""
Expand All @@ -173,6 +169,4 @@ def delete_dns_records(self, record_id):
)
request = self.session.delete(url)
if request.status_code != 204:
return False

return True
return request.json()
2 changes: 1 addition & 1 deletion src/ralph/dns/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class DNSRecordForm(forms.Form):
)
type = forms.ChoiceField(
label=_("Record type"),
choices=[('', '-')] + RecordType(),
choices=RecordType(),
)
content = forms.CharField(
label=_('Content'),
Expand Down
51 changes: 34 additions & 17 deletions src/ralph/dns/templates/dns/dns_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,45 @@
<div class="row">
<div class="large-12 columns">
<h1>DNS edit</h1>
<form method="post" action="">
{% csrf_token %}
{{ formset.management_form }}
<table>
<thead>
{% for name, field in formset.0.fields.items %}
<th>{{ field.label }}</th>
{% endfor %}
</thead>
{% for form in formset %}
<thead>
{% for name, field in forms.0.fields.items %}
<th>{{ field.label }}</th>
{% endfor %}
<th></th>
<th></th>
</thead>
{% for form in forms %}
{% if form.non_field_errors %}
<tr class="field-row error">
<td colspan="{{ forms.0.fields.items|length|add:2 }}" class="error">
<ul class="errorlist">
{% for error in form.non_field_errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
</td>
</tr>
{% endif %}
<tr>
{% for field in form %}
<td>{{ field }} {{ field.errors }}</td>
{% endfor %}
<form method="post" action="">
{% csrf_token %}
{% for field in form %}
<td>{{ field }} {{ field.errors }}</td>
{% endfor %}
<td>
<input type="submit" class="button" value="{% trans 'Save' %}" />
</td>
<td>
{% if form.pk.value %}
<input type="submit" name="delete" class="button small alert" value="{% trans 'Delete' %}" onclick="return confirm('{% trans 'Are you sure to delete?' %}');" />
{% endif %}
</td>
</form>
</tr>
{% endfor %}
{% endfor %}
</table>
<br />
{% with show_save=True %}
{% include 'admin/submit_line.html' %}
{% endwith %}
</form>
</div>
</div>
{% endblock %}
62 changes: 38 additions & 24 deletions src/ralph/dns/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
import logging

from django.forms import BaseFormSet, formset_factory
from django.http import HttpResponseRedirect

from ralph.admin.views.extra import RalphDetailView
Expand All @@ -22,37 +21,52 @@ def __init__(self, *args, **kwargs):
self.dnsaas = DNSaaS()
return super().__init__(*args, **kwargs)

def get_formset(self):
FormSet = formset_factory( # noqa
DNSRecordForm, formset=BaseFormSet, extra=2,
can_delete=True
)
def get_forms(self):
forms = []
initial = self.dnsaas.get_dns_records(
self.object.ipaddress_set.all().values_list(
'address', flat=True
)
)
return FormSet(
data=self.request.POST or None,
initial=initial,
)
for item in initial:
forms.append(DNSRecordForm(item))

forms.append(DNSRecordForm())
return forms

def get(self, request, *args, **kwargs):
kwargs['formset'] = self.get_formset()
kwargs['forms'] = self.get_forms()
return super().get(request, *kwargs, **kwargs)

def post(self, request, *args, **kwargs):
formset = self.get_formset()
if formset.is_valid():
for i, form in enumerate(formset.forms):
if form.cleaned_data.get('DELETE'):
self.dnsaas.delete_dns_records(form.cleaned_data['pk'])
elif form.has_changed():
if form.cleaned_data['pk']:
self.dnsaas.update_dns_records(form.cleaned_data)
else:
self.dnsaas.create_dns_records(form.cleaned_data)
return HttpResponseRedirect('.')

kwargs['formset'] = formset
forms = self.get_forms()
posted_form = DNSRecordForm(request.POST)
for i, form in enumerate(forms):
if (
str(form.data.get('pk', '')) ==
str(posted_form.data.get('pk', ''))
):
forms[i] = posted_form
break

if posted_form.is_valid():
if posted_form.data.get('delete'):
errors = self.dnsaas.delete_dns_records(form.data['pk'])
elif posted_form.cleaned_data.get('pk'):
errors = self.dnsaas.update_dns_records(
posted_form.cleaned_data
)
else:
errors = self.dnsaas.create_dns_records(
posted_form.cleaned_data
)

if errors:
for field_name, field_errors in errors.items():
for field_error in field_errors:
posted_form.add_error(field_name, field_error)
else:
return HttpResponseRedirect('.')

kwargs['forms'] = forms
return super().get(request, *args, **kwargs)

0 comments on commit 57bb729

Please sign in to comment.