New/edit record form

master
Dustin 2015-02-15 19:22:24 -06:00
parent 913989f31c
commit b32cac5a0b
4 changed files with 146 additions and 10 deletions

View File

@ -126,7 +126,11 @@ class ZoneController(BaseController):
zone_d['records'] = list(map(model.Record.as_dict, zone.records))
json.dump(zone_d, response.body_file)
else:
response.text = self.render('zone.html.j2', zone=zone)
if 'new' in request.GET:
tmpl = 'new-record.html.j2'
else:
tmpl = 'zone.html.j2'
response.text = self.render(tmpl, zone=zone)
return response
HEAD = GET
@ -146,16 +150,33 @@ class ZoneController(BaseController):
response = request.ResponseClass()
response.content_type = None
zone = self.get_zone(name)
data = json.loads(request.text)
if request.content_type == 'application/x-www-form-urlencoded':
data = dict(request.POST)
elif request.content_type == 'application/json':
data = json.loads(request.text)
else:
raise milla.HTTPUnsupportedMediaType
zone_name = data.pop('zone', zone.name)
assert zone_name == zone.name
if 'ttl' in data and not data['ttl']:
del data['ttl']
if data['rdtype'] == 'MX':
try:
data['mx_prio'] = int(data['mx_prio'])
except (KeyError, TypeError):
data['mx_prio'] = 10
else:
data.pop('mx_prio', None)
record = model.Record(zone=zone_name, **data)
self.session.add(record)
self.session.commit()
response.status_int = 201
response.location = request.create_href_full(
'/records/{}'.format(record.id)
)
if request.want in ('html', 'xhtml'):
raise milla.HTTPSeeOther(location='/zones/{}'.format(zone_name))
else:
response.status_int = 201
response.location = request.create_href_full(
'/records/{}'.format(record.id)
)
return response
def DELETE(self, request, name):
@ -183,23 +204,36 @@ class RecordController(BaseController):
def GET(self, request, id):
response = request.ResponseClass()
response.content_type = 'application/json'
record = self.get_record(id)
json.dump(record.as_dict(), response.body_file)
if request.want == 'json':
response.content_type = 'application/json'
json.dump(record.as_dict(), response.body_file)
else:
response.text = self.render('record.html.j2', record=record)
return response
HEAD = GET
def PUT(self, request, id):
response = request.ResponseClass()
response.content_type = 'application/json'
response.content_type = None
record = self.get_record(id)
data = json.loads(request.text)
if request.content_type == 'application/x-www-form-urlencoded':
data = dict(request.POST)
elif request.content_type == 'application/json':
data = json.loads(request.text)
else:
raise milla.HTTPUnsupportedMediaType
if data['rdtype'] != 'MX':
data.pop('mx_prio', None)
for k, v in data.items():
assert k != 'zone'
assert hasattr(record, k)
setattr(record, k, v)
self.session.commit()
if request.want in ('html', 'xhtml'):
raise milla.HTTPSeeOther(location='/zones/{}'.format(record.zone))
response.status_int = 201
return response
def DELETE(self, request, id):
@ -208,5 +242,7 @@ class RecordController(BaseController):
record = self.get_record(id)
self.session.delete(record)
self.session.commit()
if request.want in ('html', 'xhtml'):
raise milla.HTTPSeeOther(location='/zones/{}'.format(record.zone))
response.status_int = 204
return response

View File

@ -0,0 +1,9 @@
{# vim: set sw=2 ts=2 sts=2 et : -#}
{% set page_title = 'New Record' %}
{% set record = None %}
{% extends 'record-form.html.j2' %}
{% block breadcrumbs %}
<li><a href="{{ url('/zones/') }}">Zones</a></li>
<li><a href="{{ url('/zones/') }}{{ zone.name }}">{{ zone.name }}</a></li>
<li class="current"><a href="{{ url('/zones/') }}{{ zone.name }}?new">New Record</a></li>
{% endblock %}

View File

@ -0,0 +1,79 @@
{# vim: set sw=2 ts=2 sts=2 et : -#}
{% extends 'base.html.j2' %}
{% block body -%}
<form method="post">
<div class="row">
<div class="medium-6 columns">
<label>Host:
<input type="text" name="host" required="required"
{%- if record %}
value="{{ record.host }}"
{%- endif %}
pattern="([a-zA-Z0-9\-]{1,63})|@" />
</label>
</div>
<div class="medium-6 columns">
<label>Zone:
<input type="text" disabled="disabled"
{%- if record %}
value="{{ record.zone }}"
{%- elif zone is defined %}
value="{{ zone.name }}"
{%- endif %}
/>
</label>
</div>
<div class="medium-4 columns">
<label><abbr title="Time To Live">TTL</abbr>:
<input type="number" name="ttl"
{%- if record %}
value="{{ record.ttl }}"
{%- endif %}
placeholder="3600" />
</label>
</div>
<div class="medium-4 columns">
{%- set record_types = (
'A',
'AAAA',
'CNAME',
'MX',
'NS',
'SRV',
'TXT',
) %}
<label>Type:<select name="rdtype">
{%- for t in record_types %}
<option{% if record and record.rdtype == t %} selected="selected" {% endif %}>{{ t }}</option>
{%- endfor %}
</select></label>
</div>
<div class="medium-4 columns">
<label>Priority (MX only):
<input type="number" name="mx_prio"
{%- if record %}
value="{{ record.mx_prio }}"
{%- endif %}
placeholder="10" />
</label>
</div>
<div class="column">
<label>Data:
<input type="text" name="data"
{%- if record %}
value="{{ record.data }}"
{%- endif %}
required="required" />
</label>
</div>
<div class="column text-right">
{%- if record %}
<button class="small alert button" type="submit" name="_method"
value="DELETE" formnovalidate="novalidate">Delete</button>
{%- endif %}
<button class="small button" type="submit"
{%- if record %} name="_method" value="PUT"{%- endif -%}>Submit</button>
</div>
</div>
</form>
{% endblock %}

View File

@ -0,0 +1,12 @@
{#- vim: set sw=2 ts=2 sts=2 et : -#}
{% if record.host == '@' -%}
{% set page_title = '{} ({})'.format(record.zone, record.rdtype) -%}
{% else -%}
{% set page_title = '{}.{} ({})'.format(record.host, record.zone, record.rdtype) -%}
{% endif -%}
{% extends 'record-form.html.j2' %}
{% block breadcrumbs %}
<li><a href="{{ url('/zones/') }}">Zones</a></li>
<li><a href="{{ url('/zones/') }}{{ record.zone }}">{{ record.zone }}</a></li>
<li class="current"><a href="{{ url('/records/') }}{{ record.id }}">{{ record.host }}</a> ({{ record.rdtype }})</li>
{%- endblock %}