diff --git a/src/dyns/controllers.py b/src/dyns/controllers.py index 051a5e5..39700be 100644 --- a/src/dyns/controllers.py +++ b/src/dyns/controllers.py @@ -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 diff --git a/src/dyns/templates/new-record.html.j2 b/src/dyns/templates/new-record.html.j2 new file mode 100644 index 0000000..b20abca --- /dev/null +++ b/src/dyns/templates/new-record.html.j2 @@ -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 %} +
  • Zones
  • +
  • {{ zone.name }}
  • +
  • New Record
  • +{% endblock %} diff --git a/src/dyns/templates/record-form.html.j2 b/src/dyns/templates/record-form.html.j2 new file mode 100644 index 0000000..3647dc5 --- /dev/null +++ b/src/dyns/templates/record-form.html.j2 @@ -0,0 +1,79 @@ +{# vim: set sw=2 ts=2 sts=2 et : -#} +{% extends 'base.html.j2' %} +{% block body -%} +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +{%- set record_types = ( +'A', +'AAAA', +'CNAME', +'MX', +'NS', +'SRV', +'TXT', +) %} + +
    +
    + +
    +
    + +
    +
    +{%- if record %} + +{%- endif %} + +
    +
    +
    +{% endblock %} diff --git a/src/dyns/templates/record.html.j2 b/src/dyns/templates/record.html.j2 new file mode 100644 index 0000000..46eaf42 --- /dev/null +++ b/src/dyns/templates/record.html.j2 @@ -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 %} +
  • Zones
  • +
  • {{ record.zone }}
  • +
  • {{ record.host }} ({{ record.rdtype }})
  • +{%- endblock %}