New/edit record form
parent
913989f31c
commit
b32cac5a0b
|
@ -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
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
|
@ -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 %}
|
Reference in New Issue