aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpkid/portal-gui/apache/rpki.conf.in1
-rw-r--r--rpkid/rpki/gui/app/forms.py5
-rw-r--r--rpkid/rpki/gui/app/templates/base.html78
-rw-r--r--rpkid/rpki/gui/app/templates/registration/login.html41
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/asn_view.html105
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/child_view.html38
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/dashboard.html229
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html60
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html25
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html30
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html19
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html21
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/parent_view.html86
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html77
-rw-r--r--rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html15
-rw-r--r--rpkid/rpki/gui/app/urls.py3
-rw-r--r--rpkid/rpki/gui/app/views.py65
-rw-r--r--rpkid/rpki/gui/urls.py4
18 files changed, 495 insertions, 407 deletions
diff --git a/rpkid/portal-gui/apache/rpki.conf.in b/rpkid/portal-gui/apache/rpki.conf.in
index 9318549a..5670f8d3 100644
--- a/rpkid/portal-gui/apache/rpki.conf.in
+++ b/rpkid/portal-gui/apache/rpki.conf.in
@@ -28,5 +28,6 @@ Allow from all
# for use with Django 1.2
#Alias /media/ /var/www/html/media/
+#Alias /site_media/ /var/www/html/media/
# vim:ft=apache
diff --git a/rpkid/rpki/gui/app/forms.py b/rpkid/rpki/gui/app/forms.py
index aad9185d..ecac5e0a 100644
--- a/rpkid/rpki/gui/app/forms.py
+++ b/rpkid/rpki/gui/app/forms.py
@@ -215,8 +215,9 @@ def ImportChildForm(parent_conf, *args, **kwargs):
def ImportParentForm(conf, *args, **kwargs):
class wrapped(forms.Form):
- handle = forms.CharField(max_length=30, help_text="Parent's RPKI handle")
- xml = forms.FileField(help_text="XML response from parent", required=False)
+ handle = forms.CharField(max_length=30, help_text="Parent's RPKI handle", required=True)
+ xml = forms.FileField(help_text="XML response from parent", required=True,
+ widget=forms.FileInput(attrs={'class': 'xlarge'}))
def clean_handle(self):
if conf.parents.filter(handle=self.cleaned_data['handle']):
diff --git a/rpkid/rpki/gui/app/templates/base.html b/rpkid/rpki/gui/app/templates/base.html
index d6c859f2..abfa948a 100644
--- a/rpkid/rpki/gui/app/templates/base.html
+++ b/rpkid/rpki/gui/app/templates/base.html
@@ -1,36 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
<html>
-<head>
- <title>{% block title %}RPKI{% endblock %}</title>
- {% block head %}{% endblock %}
- <style type="text/css">
- #header { background-color: #00ccff; border-style: solid; border-width: thin; padding-left:2em }
- #sidebar { background-color: #dddddd; border-style: none solid solid; border-width: thin; float:left; min-width:9em }
- #content { float:left; margin-left:1em }
- ul.compact {list-style:none inside; margin-left:1em; padding-left:0}
- table { border: solid 1px; border-collapse: collapse }
- th { border: solid 1px; padding: 1em }
- td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1em }
- {% block css %}{% endblock %}
- </style>
-</head>
-<body>
- <div id="header">
- {% if user.is_authenticated %}
- <span style="float: right; font-size: 80%;">Logged in as {{ user }} |
- {% if user.is_staff %}<a href="/admin/">admin</a> |{% endif %}
- <a href="{% url django.contrib.auth.views.logout %}">Log Out</a></span>
- {% else %}
- <span style="float: right; font-size: 80%;"><a href="{% url django.contrib.auth.views.login %}">Log In</a></span>
- {% endif %}
- <h1>RPKI Portal GUI</h1>
- </div>
+ <head>
+ <meta name='Content-Type' content='text/html; charset=UTF-8'>
+ <title>{% block title %}RPKI{% endblock %}</title>
+ {% block head %}{% endblock %}
+ <link rel="stylesheet" href="/site_media/css/bootstrap.min.css">
+ <style type="text/css">
+ body { padding-top: 50px; }
+ {% block css %}{% endblock %}
+ </style>
+ </head>
+ <body>
+ <!-- TOP BAR -->
+ <div class="topbar">
+ <div class="topbar-inner">
+ <div class="container">
+ <a class="brand" href="#">rpki.net</a>
- <div id='sidebar'>
- {% block sidebar %}{% endblock %}
- </div>
+ <ul class='nav'>
+ {% if user.is_staff %}
+ <li><a href="/admin/">Admin</a></li>
+ {% endif %}
+ </ul>
- <div id="content">
- {% block content %}{% endblock %}
- </div>
-</body>
+ {% if user.is_authenticated %}
+ <ul class='nav secondary-nav'>
+ <li><p>Logged in as {{ user }}</li>
+ <li><a href="{% url django.contrib.auth.views.logout %}">Log Out</a></li>
+ </ul>
+ {% endif %}
+
+ </div>
+ </div>
+ </div><!-- topbar -->
+
+ <!-- MAIN CONTENT -->
+ <div class="container-fluid">
+ <div class='content'>
+ {% block content %}{% endblock %}
+ </div><!-- /content -->
+
+ <div class="sidebar">
+ {% block sidebar %}{% endblock %}
+ </div><!-- /sidebar -->
+ </div><!-- /container-fluid -->
+
+ </body>
</html>
diff --git a/rpkid/rpki/gui/app/templates/registration/login.html b/rpkid/rpki/gui/app/templates/registration/login.html
index f99e9a25..27ad21cf 100644
--- a/rpkid/rpki/gui/app/templates/registration/login.html
+++ b/rpkid/rpki/gui/app/templates/registration/login.html
@@ -3,24 +3,33 @@
{% block content %}
{% if form.errors %}
-<p>Your username and password didn't match. Please try again.</p>
+<div class='alert-message error'>
+ <p>Your username and password didn't match. Please try again.</p>
+</div>
{% endif %}
-<form method="post" action="{% url django.contrib.auth.views.login %}">{% csrf_token %}
-<table>
-<tr>
- <td>{{ form.username.label_tag }}</td>
- <td>{{ form.username }}</td>
-</tr>
-<tr>
- <td>{{ form.password.label_tag }}</td>
- <td>{{ form.password }}</td>
-</tr>
-</table>
-
-<input type="submit" value="login" />
-<input type="hidden" name="next" value="{{ next }}" />
+<form method="post" action="{% url django.contrib.auth.views.login %}">
+ {% csrf_token %}
+
+ <div class="clearfix">
+ {{ form.username.label_tag }}
+ <div class="input">
+ {{ form.username }}
+ </div>
+ </div>
+
+ <div class="clearfix">
+ {{ form.password.label_tag }}
+ <div class="input">
+ {{ form.password }}
+ </div>
+ </div>
+
+ <div class="actions">
+ <input type="submit" value="Login" class="btn primary" />
+ </div>
+
+ <input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}
-
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html b/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html
index 204a6677..e6666a2c 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/asn_view.html
@@ -1,47 +1,69 @@
-{% extends "base.html" %}
+{% extends "rpkigui/app_base.html" %}
-{% block css %}
-table { border-collapse: collapse }
-th { border: solid 1px; padding: 1em }
-td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1em }
-{% endblock %}
+{% block content %}
-{% block sidebar %}
-<ul class='compact'>
- <li> <a href="{{asn.get_absolute_url}}/allocate">give to child</a></li>
+<!--
+<ul class='breadcrumb'>
+ <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> <span class='divider'>/</span></li>
+ <li>AS <span class='divider'>/</span></li>
+ <li class='active'> {{ asn }}</li>
</ul>
-{% endblock %}
+-->
-{% block content %}
+<div class='page-header'>
+ <h1>AS View</h1>
+</div>
-<p id='breadcrumb'>
-<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> &gt; AS View &gt; {{ asn }}
-</p>
+<div class='row'>
+ <div class='span2'>
+ ASN
+ </div>
+ <div class='span11 offset2'>
+ {{ asn }}
+ </div>
+</div>
-<h1>AS View</h1>
+{% if asn.parent %}
+<div class='row'>
+ <div class='span2'>
+ Suballocated from
+ </div>
+ <div class='span11 offset2'>
+ <a href="{{ asn.parent.get_absolute_url }}">{{ asn.parent }}</a>
+ </div>
+</div>
+{% endif %}
-<table>
- <tr> <td>ASN:</td><td>{{ asn }}</td> </tr>
- {% if asn.parent %}
- <tr>
- <td>Suballocated from:</td>
- <td><a href="{{ asn.parent.get_absolute_url }}">{{ asn.parent }}</a></td>
- </tr>
- {% endif %}
- <tr>
- <td>Received from:</td>
- <td>
+<div class='row'>
+ <div class='span2'>
+ Received from
+ </div>
+ <div class='span11 offset2'>
{% for p in parent %}
<a href="{{ p.get_absolute_url }}">{{ p.handle }}</a>
{% endfor %}
- </td>
- </tr>
- <tr><td>Validity:</td><td>{{ asn.from_cert.all.0.not_before }} - {{ asn.from_cert.all.0.not_after }} </td></tr>
+ </div>
+</div>
- {% if asn.allocated %}
- <tr><td>Allocated:</td><td><a href="{{asn.allocated.get_absolute_url}}">{{asn.allocated.handle}}</a></td></tr>
- {% endif %}
-</table>
+<div class='row'>
+ <div class='span2'>
+ Validity
+ </div>
+ <div class='span11 offset2'>
+ {{ asn.from_cert.all.0.not_before }} - {{ asn.from_cert.all.0.not_after }}
+ </div>
+</div>
+
+{% if asn.allocated %}
+<div class='row'>
+ <div class='span2'>
+ Allocated
+ </div>
+ <div class='span11 offset2'>
+ <a href="{{asn.allocated.get_absolute_url}}">{{asn.allocated.handle}}</a>
+ </div>
+</div>
+{% endif %}
{% if asn.children.count %}
<h2>Suballocations</h2>
@@ -84,10 +106,21 @@ td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1e
{% if form %}
<h2>Edit</h2>
-<form method="POST" action="{{ request.get_full_path }}">{% csrf_token %}
- {{ form.as_p }}
- <input type="submit">
+<form method="POST" action="{{ request.get_full_path }}">
+ {% csrf_token %}
+ {% include "rpkigui/bootstrap_form.html" %}
+ <div class='actions'>
+ <input class='btn primary' value='Save' type="submit">
+ <a class='btn' href='{{ asn.get_absolute_url }}'>Cancel</a>
+ </div>
</form>
+{% else %}
+
+<div class='actions'>
+ <a class='btn' href="{{asn.get_absolute_url}}/allocate" title="give this ASN to a child">Allocate</a>
+</div>
{% endif %}
{% endblock %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/child_view.html b/rpkid/rpki/gui/app/templates/rpkigui/child_view.html
index 474798ce..2e4570da 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/child_view.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/child_view.html
@@ -1,21 +1,17 @@
-{% extends "base.html" %}
-
-{% block sidebar %}
-<ul class='compact'>
- <li><a href="{{ child.get_absolute_url }}/edit">edit</a></li>
- <li><a href="{{ child.get_absolute_url }}/export" title="download XML response file to return to child">export child response</a></li>
- <li><a href="{{ child.get_absolute_url }}/export_repo" title="download XML response to publication client request">export repo response</a></li>
- <li><a href="{{ child.get_absolute_url }}/delete" title="remove this handle as a RPKI child">delete</a></li>
- <li><a href="{{ child.get_absolute_url }}/destroy" title="completely remove a locally hosted resource handle and gui account">destroy</a></li>
-</ul>
-{% endblock %}
+{% extends "rpkigui/app_base.html" %}
{% block content %}
-<p id='breadcrumb'>
-<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle.handle }}</a> &gt; {{ child.handle }}
-</p>
+<!--
+<ul class='breadcrumb'>
+ <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle.handle }}</a> <span class='divider'>/</span></li>
+ <li>Children <span class='divider'>/</span></li>
+ <li class='active'>{{ child.handle }}</li>
+</ul>
+-->
-<h1>Child View</h1>
+<div class='page-header'>
+ <h1>Child View</h1>
+</div>
<table>
<tr>
@@ -50,11 +46,23 @@
<p style='font-style:italic'>none</p>
{% endif %}
+<hr>
+
{% if form %}
<form method='POST' action='{{ request.get_full_path }}'>
{% csrf_token %}
<input type='submit'/>
</form>
+{% else %}
+
+<div class='actions'>
+ <a class='btn' href="{{ child.get_absolute_url }}/edit">Edit</a>
+ <a class='btn' href="{{ child.get_absolute_url }}/export" title="download XML response file to return to child">Export child response</a></li>
+ <a class='btn' href="{{ child.get_absolute_url }}/export_repo" title="download XML response to publication client request">Export repo response</a></li>
+ <a class='btn danger' href="{{ child.get_absolute_url }}/delete" title="remove this handle as a RPKI child">Delete</a></li>
+ <a class='btn danger' href="{{ child.get_absolute_url }}/destroy" title="completely remove a locally hosted resource handle and gui account">Destroy</a></li>
+</div>
+
{% endif %}
{% endblock %}
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html b/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html
index e21eb4eb..497b9be2 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/dashboard.html
@@ -1,193 +1,108 @@
{% extends "base.html" %}
-{% block css %}
-table { border-collapse: collapse }
-th { border: solid 1px; padding: 1em }
-td { border: solid 1px; text-align: center; padding-left: 1em; padding-right: 1em }
-h2 { text-align:center; background-color:#dddddd }
-{% endblock %}
-
{% block sidebar %}
-<ul class='compact'>
- <li><a href="#parents">parents</a></li>
- <li><a href="#children">children</a></li>
- <li><a href="#roas">roas</a></li>
- <li><a href="#ghostbusters">ghostbusters</a></li>
- <li><a href="#unallocated">unallocated</a></li>
+<p><strong>{{ request.session.handle }}</strong>
+
+<ul class='unstyled'>
+ <li><a href="#">dashboard</a></li>
+ <li><a href="{% url rpki.gui.app.views.parent_list %}">parents</a></li>
+ <li><a href="{% url rpki.gui.app.views.child_list %}">children</a></li>
+ <li><a href="{% url rpki.gui.app.views.roa_request_list %}">roas</a></li>
+ <li><a href="{% url rpki.gui.app.views.ghostbusters_list %}">ghostbusters</a></li>
</ul>
-<ul class='compact'>
+<ul class='unstyled'>
<li><a href="{% url rpki.gui.app.views.conf_export %}" title="download XML identity to send to parent">export identity</a></li>
<li><a href="{% url rpki.gui.app.views.update_bpki %}" title="renew all BPKI certificates">update bpki</a></li>
<li><a href="{% url rpki.gui.app.views.conf_list %}" title="select a different resource handle to manage">select identity</a></li>
</ul>
-<ul class='compact'>
+{% if user.is_staff %}
+<ul class='unstyled'>
<li><a href="{% url rpki.gui.app.views.child_wizard %}" title="create a new locally hosted resource handle">create child wizard</a></li>
</ul>
+{% endif %}
-<ul class='compact'>
- <li><a href="{% url rpki.gui.app.views.import_parent %}" title="upload XML response from remote parent">import parent</a></li>
+<ul class='unstyled'>
<li><a href="{% url rpki.gui.app.views.import_repository %}" title="upload XML response from remote repository">import repository</a></li>
-</ul>
-
-<ul class='compact'>
- <li><a href="{% url rpki.gui.app.views.import_child %}" title="import a new child's identity.xml file">import child</a></li>
<li><a href="{% url rpki.gui.app.views.import_pubclient %}" title="import XML request from a publication client">import pubclient</a></li>
</ul>
-<ul class='compact'>
+<ul class='unstyled'>
<li><a href="{% url rpki.gui.app.views.refresh %}">refresh</a></li>
</ul>
{% endblock %}
{% block content %}
-<p id='breadcrumb'>{{ request.session.handle }} &gt; Dashboard</p>
-
-<h1>Dashboard</h1>
-
-<div class='separator'>
-<a name='parents'><h2>Parents</h2></a>
-
-{% if request.session.handle.parents.all %}
-<ul>
-{% for parent in request.session.handle.parents.all %}
-<li><a href="{{ parent.get_absolute_url }}">{{ parent.handle }}</a>
-<p>
-<table>
-<tr><th>Accepted Resource</th><th>Not Before</th><th>Not After</th></tr>
-{% for cert in parent.resources.all %}
-
-{% for asn in cert.asn.all %}
-<tr><td style='text-align:left'><a href="{{ asn.get_absolute_url }}">{{ asn }}</a></td>
-<td>{{cert.not_before}}</td>
-<td>{{cert.not_after}}</td>
-</tr>
-{% endfor %}
-
-{% for address in cert.address_range.all %}
-<tr>
- <td style='text-align: left'><a href="{{ address.get_absolute_url }}">{{ address }}</a></td>
- <td>{{cert.not_before}}</td>
- <td>{{cert.not_after}}</td>
-</tr>
-{% endfor %}
-
-{% endfor %} <!--certs-->
+<!--
+<ul class='breadcrumb'>
+ <li><a href='{% url rpki.gui.app.views.dashboard %}'>{{ request.session.handle }}</a><span class="divider">/</span></li>
+ <li class='active'>Dashboard</li>
+</ul>
+-->
+
+<div class='page-header'>
+ <h1>Dashboard</h1>
+</div>
+
+<!-- OVERVIEW ############################################################## -->
+
+<h2>Resources</h2>
+
+<table class='condensed-table zebra-striped'>
+ <tr>
+ <th>Resource</th>
+ <th>Valid Until</th>
+ <th>Parent</th>
+ </tr>
+
+ {% for object in asn_list %}
+ <tr>
+ <td><a href="{{ object.get_absolute_url }}">{{ object }}</a></td>
+ <td>{{ object.from_cert.all.0.not_after }}</td>
+ <td><a href="{{ object.from_cert.all.0.parent.get_absolute_url }}">{{ object.from_cert.all.0.parent.handle }}</a></th>
+ </tr>
+ {% endfor %}
+
+ {% for object in address_list %}
+ <tr>
+ <td><a href="{{ object.get_absolute_url }}">{{ object }}</a></td>
+ <td>{{ object.from_cert.all.0.not_after }}</td>
+ <td><a href="{{ object.from_cert.all.0.parent.get_absolute_url }}">{{ object.from_cert.all.0.parent.handle }}</a></th>
+ </tr>
+ {% endfor %}
</table>
-{% endfor %}
-</ul>
-{% else %}
-<p style='font-style:italic'>none</p>
-{% endif %}
+<!-- UNALLOCATED ##############################################################-->
+<div>
+ <h2>Unallocated Resources</h2>
+ <p>The following resources have not been allocated to a child, or appear in a ROA.
-</div><!--parents-->
-
-<div class='separator'>
- <a name='children'><h2>Children</h2></a>
-
-{% if request.session.handle.children.all %}
-<ul>
-{% for child in request.session.handle.children.all %}
-<li><a href="{% url rpki.gui.app.views.child_view child.handle %}">{{ child.handle }}</a>, valid until {{ child.valid_until }}
-{% if child.address_range.count or child.asn.count %}
-<p>Delegated resources:
-<ul>
-{% for asn in child.asn.all %}
-<li><a href="{{ asn.get_absolute_url }}">{{ asn }}</a></li>
-{% endfor %}
-{% for address in child.address_range.all %}
-<li><a href="{{ address.get_absolute_url}}">{{ address }}</a></li>
-{% endfor %}
-</ul>
-{% endif %}
-</li>
-{% endfor %}
-</ul>
-<!--
-<a href="/myrpki/import/child">[add]</a>
--->
-{% else %}
-<p style='font-style:italic'>none</p>
-{% endif %}
+ {% if asns or ars %}
-<p>
-Export resources delegated to children (csv): <a href="{% url rpki.gui.app.views.download_asns request.session.handle %}" title="ASs delegated to children">asns</a> |
-<a href="{% url rpki.gui.app.views.download_prefixes request.session.handle %}" title="prefixes delegated to children">prefixes</a>
+ {% if asns %}
+ <ul>
+ {% for asn in asns %}
+ <li>{{ asn.as_ul|safe }}
+ {% endfor %} <!-- ASNs -->
+ </ul>
+ {% endif %}
-</div>
+ {% if ars %}
+ <ul>
+ {% for addr in ars %}
+ <li>{{ addr.as_ul|safe }}
+ {% endfor %} <!-- addrs -->
+ </ul>
+ {% endif %}
-<div class='separator'> <!-- ROAs -->
- <a name='roas'><h2>ROA Requests</h2></a>
-
- {% if request.session.handle.roas.all %}
- <table>
- <tr> <th>Prefix</th> <th>ASN</th> </tr>
-
- {% for roa in request.session.handle.roas.all %}
- <tr>
- <td style='text-align: left'>
- <ul style='list-style-position: outside'>
- {% for req in roa.from_roa_request.all %}
- <li><a href="{{ req.prefix.get_absolute_url }}">{{ req.as_roa_prefix }}</a>
- {% endfor %}
- </ul>
- </td>
- <td>{{ roa.asn }}</td>
- </tr>
- {% endfor %}
- </table>
{% else %}
<p style='font-style:italic'>none</p>
{% endif %}
- <p><a href="{% url rpki.gui.app.views.download_roas request.session.handle %}">export (csv)</a>
-</div><!-- roas -->
-
-<div class='separator'><!-- ghostbusters -->
-<a name='ghostbusters'><h2>Ghostbuster Requests</h2></a>
- {% if request.session.handle.ghostbusters.all %}
- <ul>
- {% for gbr in request.session.handle.ghostbusters.all %}
- <li><a href="{{ gbr.get_absolute_url }}">{{ gbr.full_name }}</a> |
- <a href="{{ gbr.get_absolute_url }}/edit">edit</a> |
- <a href="{{ gbr.get_absolute_url }}/delete">delete</a>
- </li>
- {% endfor %}
- {% else %}
-<p style='font-style:italic'>none</p>
- {% endif %}
-</ul>
-<p><a href='{% url rpki.gui.app.views.ghostbuster_create %}'>add</a></p>
-</div>
-
-<div class='separator'>
-<a name='unallocated'><h2>Unallocated Resources</h2></a>
- {% if asns or ars %}
-
- {% if asns %}
- <ul>
- {% for asn in asns %}
- <li>{{ asn.as_ul|safe }}
- {% endfor %} <!-- ASNs -->
- </ul>
- {% endif %}
-
- {% if ars %}
- <ul>
- {% for addr in ars %}
- <li>{{ addr.as_ul|safe }}
- {% endfor %} <!-- addrs -->
- </ul>
- {% endif %}
-
- {% else %}
-<p style='font-style:italic'>none</p>
- {% endif %}
-
- </ul>
</div>
{% endblock %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html
index 4a9ed73a..fe3e3829 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_detail.html
@@ -1,69 +1,73 @@
-{% extends "base.html" %}
-
-{% block css %}
-td { padding-right: 1em }
-td.label { font-weight:bold }
-{% endblock %}
-
-{% block sidebar %}
-<ul class='compact'>
- <li><a href='{{ object.get_absolute_url }}/edit'>edit</a></li>
- <li><a href='{{ object.get_absolute_url }}/delete'>delete</a></li>
-</ul>
-{% endblock %}
+{% extends "rpkigui/app_base.html" %}
{% block content %}
-<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> &gt; <a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbuster Request</a> &gt; {{ object.full_name }}</p>
+<!--
+<ul class='breadcrumb'>
+ <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> <span class='divider'>/</span></li>
+ <li><a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbusters</a> <span class='divider'>/</span> </li>
+ <li class='active'>{{ object.full_name }}</li>
+</ul>
+-->
-<h1>Ghostbuster View</h1>
+<div class='page-header'>
+ <h1>Ghostbuster View</h1>
+</div>
-<table>
- <tr><td class='label'>Full Name</td><td>{{ object.full_name }}</td></tr>
+<table class='zebra-striped'>
+ <tr><td >Full Name</td><td>{{ object.full_name }}</td></tr>
{% if object.honorific_prefix %}
- <tr><td class='label'>Honorific Prefix</td><td>{{ object.honorific_prefix }}</td></tr>
+ <tr><td >Honorific Prefix</td><td>{{ object.honorific_prefix }}</td></tr>
{% endif %}
{% if object.organization %}
- <tr><td class='label'>Organization</td><td>{{ object.organization }}</td></tr>
+ <tr><td >Organization</td><td>{{ object.organization }}</td></tr>
{% endif %}
{% if object.telephone %}
- <tr><td class='label'>Telephone</td><td>{{ object.telephone }}</td></tr>
+ <tr><td >Telephone</td><td>{{ object.telephone }}</td></tr>
{% endif %}
{% if object.email_address %}
- <tr><td class='label'>Email</td><td>{{ object.email_address }}</td></tr>
+ <tr><td >Email</td><td>{{ object.email_address }}</td></tr>
{% endif %}
{% if object.box %}
- <tr><td class='label'>P.O. Box</td><td>{{ object.box }}</td></tr>
+ <tr><td >P.O. Box</td><td>{{ object.box }}</td></tr>
{% endif %}
{% if object.extended %}
- <tr><td class='label'>Extended Address</td><td>{{ object.extended }}</td></tr>
+ <tr><td >Extended Address</td><td>{{ object.extended }}</td></tr>
{% endif %}
{% if object.street %}
- <tr><td class='label'>Street Address</td><td>{{ object.street }}</td></tr>
+ <tr><td >Street Address</td><td>{{ object.street }}</td></tr>
{% endif %}
{% if object.city %}
- <tr><td class='label'>City</td><td>{{ object.city }}</td></tr>
+ <tr><td >City</td><td>{{ object.city }}</td></tr>
{% endif %}
{% if object.region %}
- <tr><td class='label'>Region</td><td>{{ object.region }}</td></tr>
+ <tr><td >Region</td><td>{{ object.region }}</td></tr>
{% endif %}
{% if object.code %}
- <tr><td class='label'>Postal Code</td><td>{{ object.code }}</td></tr>
+ <tr><td >Postal Code</td><td>{{ object.code }}</td></tr>
{% endif %}
{% if object.country %}
- <tr><td class='label'>Country</td><td>{{ object.country }}</td></tr>
+ <tr><td >Country</td><td>{{ object.country }}</td></tr>
{% endif %}
</table>
+
+<div class='actions'>
+ <a class='btn' href='{{ object.get_absolute_url }}/edit'>Edit</a>
+ <a class='btn danger' href='{{ object.get_absolute_url }}/delete'>Delete</a>
+</div>
+
{% block extra %}{% endblock %}
{% endblock %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html
index 0d77d796..18eb288f 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_form.html
@@ -2,17 +2,26 @@
{% block content %}
-<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> &gt; <a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbusters</a> &gt; Edit</p>
+<ul class='breadcrumb'>
+ <li><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> <span class='divider'>/</span></li>
+ <li> <a href="{% url rpki.gui.app.views.ghostbusters_list %}">Ghostbusters</a> <span class='divider'>/</span></li>
+ <li class='active'>Edit</li>
+</ul>
-<h1>Edit Ghostbuster Request</h1>
+<div class='page-header'>
+ <h1>Edit Ghostbuster Request</h1>
+</div>
<form action='{{ request.get_full_path }}' method='POST'>
- {% csrf_token %}
- <table>
-{{ form.as_table }}
+ {% csrf_token %}
+
+ {# include code to render form using Twitter Bootstrap CSS Framework #}
+ {% include "rpkigui/bootstrap_form.html" %}
+
+ <div class='actions'>
+ <input class='btn primary' type='submit' value='Save'>
+ <a class='btn' href="{{ object.get_absolute_url }}">Cancel</a>
+ </div>
-</table>
-<p></p><!-- add vertical space -->
- <input type='submit' value='Save' />
</form>
{% endblock %}
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html
index 6890782d..0280fca5 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/ghostbuster_list.html
@@ -1,23 +1,13 @@
-{% extends "base.html" %}
+{% extends "rpkigui/object_list.html" %}
-{% block sidebar %}
-<ul class='compact'>
- <li><a href='{% url rpki.gui.app.views.ghostbuster_create %}'>add</a></li>
-</ul>
-{% endblock %}
+{% block object_detail %}
+<li><a href="{{ object.get_absolute_url }}">{{ object.full_name }}</a></li>
+{% endblock object_detail %}
-{% block content %}
-<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> &gt; Ghostbusters</p>
+{% block actions %}
+<div class='actions'>
+ <a class='btn' href='{% url rpki.gui.app.views.ghostbuster_create %}' title='Create a new Ghostbuster Request'>Create</a>
+</div>
+{% endblock actions %}
-<h1>Ghostbuster Requests</h1>
-
-{% if object_list %}
-<ul>
- {% for obj in object_list %}
- <li><a href="{{ obj.get_absolute_url }}">{{ obj.full_name }}</a> | <a href="{{obj.get_absolute_url}}/edit">edit</a> | <a href="{{obj.get_absolute_url}}/delete">delete</a></li>
- {% endfor %}
-</ul>
-{% else %}
-<p style='font-style:italic'>none</p>
-{% endif %}
-{% endblock %}
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html b/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html
index acd6bf61..be0c87d9 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/import_child_form.html
@@ -1,13 +1,20 @@
-{% extends "base.html" %}
+{% extends "rpkigui/app_base.html" %}
{% block content %}
+<div class='page-header'>
+ <h1>Import Child</h1>
+</div>
+
<form enctype="multipart/form-data" method="POST" action="{{ request.get_full_path }}">
- {% csrf_token %}
- <table>
-{{ form.as_table }}
-</table>
-<input type="submit" value="Import">
+ {% csrf_token %}
+ {% include "rpkigui/bootstrap_form.html" %}
+ <div class='actions'>
+ <input class='btn primary' type="submit" value="Import">
+ <a class='btn' href="{% url rpki.gui.app.views.child_list %}">Cancel</a>
+ </div>
</form>
{% endblock %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html b/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html
index acd6bf61..1b90ee6c 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/import_parent_form.html
@@ -1,13 +1,20 @@
-{% extends "base.html" %}
+{% extends "rpkigui/app_base.html" %}
{% block content %}
+<div class='page-header'>
+ <h1>Import Parent</h1>
+</div>
+
<form enctype="multipart/form-data" method="POST" action="{{ request.get_full_path }}">
- {% csrf_token %}
- <table>
-{{ form.as_table }}
-</table>
-<input type="submit" value="Import">
+ {% csrf_token %}
+ {% include "rpkigui/bootstrap_form.html" %}
+ <div class='actions'>
+ <input class='btn primary' type="submit" value="Import">
+ <a class='btn' href="{% url rpki.gui.app.views.parent_list %}">Cancel</a>
+ </div>
</form>
-{% endblock %}
+{% endblock content %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html b/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html
index a57bd888..1a8721d1 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/parent_view.html
@@ -1,38 +1,68 @@
-{% extends "base.html" %}
+{% extends "rpkigui/app_base.html" %}
-{% block sidebar %}
-<ul class='compact'>
- <li><a href="{{ parent.get_absolute_url }}/delete">delete</a></li>
+{% block content %}
+
+<!--
+<ul class='breadcrumb'>
+ <li><a href='{% url rpki.gui.app.views.dashboard %}'>{{ request.session.handle }}</a><span class='divider'>/</span></li>
+ <li>Parents <span class='divider'>/</span></li>
+ <li class='active'>{{ parent.handle }}</li>
</ul>
-{% endblock %}
+-->
-{% block content %}
-<p id='breadcrumb'>
-<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle.handle }}</a> &gt; Parent View &gt; {{ parent.handle }}
-</p>
+<div class='page-header'>
+ <h1>Parent: {{ parent.handle }}</h1>
+</div>
-<h1>Parent View</h1>
+<div class='row'>
-<p>Parent: {{ parent.handle }}
+ <div class='span8'>
+ <h2>Delegated Addresses</h2>
+ <ul>
+ {% for c in parent.resources.all %}
+ {% for a in c.address_range.all %}
+ <li><a href="{{ a.get_absolute_url }}">{{ a }}</a></li>
+ {% endfor %}
+ {% endfor %}
+ </ul>
+ </div>
-<h2>Delegated Addresses</h2>
-<ul>
-{% for c in parent.resources.all %}
-{% for a in c.address_range.all %}
-<li><a href="{{ a.get_absolute_url }}">{{ a }}</a>
-{% endfor %}
-{% endfor %}
-</ul>
+ <div class='span8'>
+ <h2>Delegated ASNs</h2>
+ <ul>
+ {% for c in parent.resources.all %}
+ {% for a in c.asn.all %}
+ <li><a href="{{ a.get_absolute_url }}">{{ a }}</a></li>
+ {% endfor %}
+ {% endfor %}
+ </ul>
+ </div>
-<h2>Delegated ASNs</h2>
-<ul>
-{% for c in parent.resources.all %}
-{% for a in c.asn.all %}
-<li><a href="{{ a.get_absolute_url }}">{{ a }}</a>
-{% endfor %}
-{% endfor %}
-</ul>
+</div><!-- /row -->
-{% block form %}{% endblock %}
+{% if form %}
+
+<div class='alert-message warning'>
+ <P>Please confirm the following action.
+</div>
+
+<form method="POST" action="{{ request.get_full_path }}">
+ {% csrf_token %}
+ {% include "rpkigui/bootstrap_form.html" %}
+ <div class='actions'>
+ <input class='btn danger' type="submit" value="{{ submit_label }}">
+ <a class='btn' href="{{ parent.get_absolute_url}}">Cancel</a>
+ </div>
+</form>
+
+{% else %}
+
+<div class='actions'>
+ <a class='btn danger' href="{{ parent.get_absolute_url }}/delete" title="Delete this parent">Delete</a>
+</div>
+
+{% endif %}
{% endblock %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html b/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html
index 6679eff9..0a4ce3e3 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/prefix_view.html
@@ -1,50 +1,40 @@
-{% extends "base.html" %}
-
-{% block sidebar %}
-<ul class='compact'>
-{% if not addr.allocated %}
-<li><a href="{{addr.get_absolute_url}}/split">split</a></li>
-{% endif %}
-{% if not addr.roa_requests.all %}
-<li><a href="{{addr.get_absolute_url}}/allocate">give to child</a></li>
-{% endif %}
-{% if addr.is_prefix and not addr.allocated %}
-<li><a href="{{ addr.get_absolute_url }}/roa">roa</a></li>
-{% endif %}
-{% if not addr.allocated and addr.parent %}
-<li><a href="{{ addr.get_absolute_url }}/delete">delete</a></li>
-{% endif %}
-</ul>
-{% endblock %}
+{% extends "rpkigui/app_base.html" %}
{% block content %}
-<p id='breadcrumb'>
-<a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> &gt; Prefix View &gt; {{ addr }}
-</p>
+<!--
+<ul class='breadcrumb'>
+ <li><a href="{% url rpki.gui.app.views.dashboard %}">{{ request.session.handle }}</a> <span class='divider'>/</span></li>
+ <li>Prefixes <span class='divider'>/</span></li>
+ <li class='active'>{{ addr }}</li>
+</ul>
+-->
+
+<div class='page-header'>
<h1>Prefix View</h1>
+</div>
<table>
<tr> <td>Range:</td><td>{{ addr }}</td> </tr>
{% if addr.parent %}
<tr>
- <td>Suballocated from:</td>
+ <td>Suballocated from</td>
<td><a href="{{ addr.parent.get_absolute_url }}">{{ addr.parent }}</a></td>
</tr>
{% endif %}
<tr>
- <td>Received from:</td>
+ <td>Received from</td>
<td>
{% for p in parent %}
<a href="{{ p.get_absolute_url }}">{{ p.handle }}</a>
{% endfor %}
</td>
</tr>
- <tr><td>Validity:</td><td>{{ addr.from_cert.all.0.not_before }} - {{ addr.from_cert.all.0.not_after }} </td></tr>
+ <tr><td>Validity</td><td>{{ addr.from_cert.all.0.not_before }} - {{ addr.from_cert.all.0.not_after }} </td></tr>
{% if addr.allocated %}
<tr>
- <td>Allocated:</td>
+ <td>Allocated</td>
<td><a href="{{addr.allocated.get_absolute_url}}">{{ addr.allocated.handle }}</a></td>
</tr>
{% endif %}
@@ -61,14 +51,14 @@
{% if addr.roa_requests.count %}
<h2>ROA requests</h2>
-<table>
+<table class='zebra-striped'>
<tr><th>ASN</th><th>Max Length</th></tr>
{% for r in addr.roa_requests.all %}
<tr>
<td>{{ r.roa.asn }}</td>
<td>{{ r.max_length }}</td>
- <td><a href="{{ r.get_absolute_url }}/delete">delete</a></td>
+ <td><a class='btn danger' href="{{ r.get_absolute_url }}/delete">delete</a></td>
</tr>
{% endfor %}
</table>
@@ -84,13 +74,36 @@
{% endif %}
{% if form %}
-<div style='background-color: #dddddd'>
+
<h2>{{ form_title }}</h2>
-<form method="POST" action="{{ request.get_full_path }}">{% csrf_token %}
- {{ form.as_p }}
- <input type="submit">
+<form method="POST" action="{{ request.get_full_path }}">
+ {% csrf_token %}
+ {% include "rpkigui/bootstrap_form.html" %}
+ <div class='actions'>
+ <input class='btn primary' type="submit" value="{{ submit_value }}">
+ <a class='btn' href="{{ addr.get_absolute_url }}">Cancel</a>
+ </div>
</form>
-</div>
+
+{% else %}
+
+<div class='actions'>
+ {% if not addr.allocated %}
+ <a class='btn' href="{{addr.get_absolute_url}}/split" title="Divide this prefix into a smaller block">Split</a>
+ {% endif %}
+ {% if not addr.roa_requests.all %}
+ <a class='btn' href="{{addr.get_absolute_url}}/allocate" title="Give prefix to child">Allocate</a>
+ {% endif %}
+ {% if addr.is_prefix and not addr.allocated %}
+ <a class='btn' href="{{ addr.get_absolute_url }}/roa" title="Create a ROA request for this prefix">Issue ROA</a>
+ {% endif %}
+ {% if not addr.allocated and addr.parent %}
+ <a class='btn danger' href="{{ addr.get_absolute_url }}/delete" title="Delete this prefix">Delete</a>
+ {% endif %}
+</div><!-- actions -->
+
{% endif %} <!-- form -->
{% endblock %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html b/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html
index 7d5187d3..27854f6b 100644
--- a/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html
+++ b/rpkid/rpki/gui/app/templates/rpkigui/roa_request_confirm_delete.html
@@ -2,9 +2,15 @@
{% block content %}
-<p id='breadcrumb'><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> &gt; <a href="{{ object.prefix.get_absolute_url }}">{{ object.prefix }}</a> &gt; Delete ROA Request</p>
+<ul class='breadcrumb'>
+ <li><a href="{% url rpki.gui.app.views.dashboard %}">{{request.session.handle}}</a> <span class='divider'>/</span></li>
+ <li><a href="{{ object.prefix.get_absolute_url }}">{{ object.prefix }}</a> <span class='divider'>/</span></li>
+ <li class='active'>Delete ROA Request</li>
+</ul>
+<div class='page-header'>
<h1>Delete ROA Request</h1>
+</div>
<p>Please confirm that you would like to delete the following ROA request:</p>
@@ -17,8 +23,11 @@
<p></p><!--add some space-->
<form method='POST' action='{{ request.get_full_path }}'>
-{% csrf_token %}
-<input type='submit' value='Delete'/>
+ {% csrf_token %}
+ <div class='actions'>
+ <input class='btn danger' type='submit' value='Delete'/>
+ <a class='btn' href="{{ object.prefix.get_absolute_url }}">Cancel</a>
+ </div>
</form>
{% endblock %}
diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py
index ae9352b1..d428b031 100644
--- a/rpkid/rpki/gui/app/urls.py
+++ b/rpkid/rpki/gui/app/urls.py
@@ -23,8 +23,10 @@ urlpatterns = patterns('',
(r'^conf/export$', views.conf_export),
(r'^conf/list$', views.conf_list),
(r'^conf/select$', views.conf_select),
+ (r'^parent/$', views.parent_list),
(r'^parent/(?P<parent_handle>[^/]+)$', views.parent_view),
(r'^parent/(?P<parent_handle>[^/]+)/delete$', views.parent_delete),
+ (r'^child/$', views.child_list),
(r'^child/(?P<child_handle>[^/]+)$', views.child_view),
(r'^child/(?P<child_handle>[^/]+)/delete$', views.child_delete),
(r'^child/(?P<child_handle>[^/]+)/edit$', views.child_edit),
@@ -45,6 +47,7 @@ urlpatterns = patterns('',
(r'^gbr/(?P<pk>\d+)/delete$', views.ghostbuster_delete),
(r'^refresh$', views.refresh),
(r'^roa/(?P<pk>\d+)$', views.roa_view),
+ (r'^roareq/$', views.roa_request_list),
(r'^roareq/(?P<pk>\d+)$', views.roa_request_view),
(r'^roareq/(?P<pk>\d+)/delete$', views.roa_request_delete_view),
(r'^demo/down/asns/(?P<self_handle>[^/]+)$', views.download_asns),
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index 0fb34525..014a13a3 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -88,24 +88,17 @@ def render(template, context, request):
def dashboard(request, template_name='rpkigui/dashboard.html'):
'''The user's dashboard.'''
handle = request.session[ 'handle' ]
- # ... pick out data for the dashboard and return it
- # my parents
- # the resources that my parents have given me
- # the resources that I have accepted from my parents
- # my children
- # the resources that I have given my children
- # my roas
-
- # get list of ASNs used in my ROAs
- roa_asns = [r.asn for r in handle.roas.all()]
+
asns=[]
- for a in models.Asn.objects.filter(from_cert__parent__in=handle.parents.all()):
+ asn_list = models.Asn.objects.filter(from_cert__parent__in=handle.parents.all())
+ for a in asn_list:
f = AllocationTree.AllocationTreeAS(a)
if f.unallocated():
asns.append(f)
prefixes = []
- for p in models.AddressRange.objects.filter(from_cert__parent__in=handle.parents.all()):
+ address_list = models.AddressRange.objects.filter(from_cert__parent__in=handle.parents.all())
+ for p in address_list:
f = AllocationTree.AllocationTreeIP.from_prefix(p)
if f.unallocated():
prefixes.append(f)
@@ -113,7 +106,12 @@ def dashboard(request, template_name='rpkigui/dashboard.html'):
asns.sort(key=lambda x: x.range.min)
prefixes.sort(key=lambda x: x.range.min)
- return render(template_name, { 'conf': handle, 'asns': asns, 'ars': prefixes }, request)
+ return render(template_name, {
+ 'conf': handle,
+ 'asns': asns,
+ 'ars': prefixes,
+ 'asn_list': asn_list,
+ 'address_list': address_list }, request)
@login_required
def conf_list(request):
@@ -160,10 +158,28 @@ def conf_export(request):
return serve_xml(glue.read_identity(handle.handle), 'identity')
@handle_required
+def parent_list(request):
+ """List view for parent objects."""
+ conf = request.session['handle']
+
+ return object_list(request, queryset=conf.parents.all(), template_name='rpkigui/parent_list.html',
+ extra_context = { 'page_title': 'Parents' })
+
+@handle_required
+def child_list(request):
+ """List view for child objects."""
+ conf = request.session['handle']
+
+ return object_list(request, queryset=conf.children.all(),
+ template_name = 'rpkigui/child_list.html',
+ extra_context = { 'page_title': 'Children' })
+
+@handle_required
def parent_view(request, parent_handle):
"""Detail view for a particular parent."""
handle = request.session['handle']
parent = get_object_or_404(handle.parents, handle__exact=parent_handle)
+
return render('rpkigui/parent_view.html', { 'parent': parent }, request)
def get_parents_or_404(handle, obj):
@@ -219,6 +235,7 @@ class PrefixView(object):
form = None
form_title = None
+ submit_value = 'Submit'
def __init__(self, request, pk, form_class=None):
self.handle = request.session['handle']
@@ -243,7 +260,8 @@ class PrefixView(object):
return render('rpkigui/prefix_view.html',
{ 'addr': self.obj, 'parent': self.parent_set, 'unallocated': u,
'form': self.form,
- 'form_title': self.form_title if self.form_title else 'Edit' },
+ 'form_title': self.form_title if self.form_title else 'Edit',
+ 'submit_value': self.submit_value },
self.request)
def handle_get(self):
@@ -277,6 +295,7 @@ class PrefixSplitView(PrefixView):
'''Class for handling the prefix split form.'''
form_title = 'Split'
+ submit_value = 'Split'
def form_valid(self):
r = misc.parse_resource_range(self.form.cleaned_data['prefix'])
@@ -292,6 +311,7 @@ class PrefixAllocateView(PrefixView):
'''Class to handle the allocation to child form.'''
form_title = 'Give to Child'
+ submit_label = 'Allocate'
def handle_get(self):
self.form = forms.PrefixAllocateForm(
@@ -344,6 +364,7 @@ class PrefixRoaView(PrefixView):
'''Class for handling the ROA creation form.'''
form_title = 'Issue ROA'
+ submit_value = 'Create'
def form_valid(self):
asns = asnset(self.form.cleaned_data['asns'])
@@ -572,13 +593,23 @@ def roa_view(request, pk):
return
@handle_required
+def roa_request_list(request):
+ conf = request.session['handle']
+
+ return object_list(request, queryset=models.RoaRequest.objects.filter(roa__in=conf.roas.all()),
+ template_name='rpkigui/roa_request_list.html',
+ extra_context = { 'page_title': 'ROA Requests' })
+
+@handle_required
def ghostbusters_list(request):
"""
Display a list of all ghostbuster requests for the current Conf.
"""
conf = request.session['handle']
- return object_list(request, queryset=conf.ghostbusters.all(), template_name='rpkigui/ghostbuster_list.html')
+ return object_list(request, queryset=conf.ghostbusters.all(),
+ template_name='rpkigui/ghostbuster_list.html',
+ extra_context = { 'page_title': 'Ghostbusters' })
@handle_required
def ghostbuster_view(request, pk):
@@ -623,7 +654,7 @@ def _ghostbuster_edit(request, obj=None):
return http.HttpResponseRedirect(obj.get_absolute_url())
else:
form = form_class(instance=obj)
- return render('rpkigui/ghostbuster_form.html', { 'form': form }, request)
+ return render('rpkigui/ghostbuster_form.html', { 'form': form, 'object': obj }, request)
@handle_required
def ghostbuster_edit(request, pk):
@@ -841,7 +872,7 @@ def parent_delete(request, parent_handle):
else:
form = forms.GenericConfirmationForm()
- return render('rpkigui/parent_form.html', { 'form': form ,
+ return render('rpkigui/parent_view.html', { 'form': form ,
'parent': parent, 'submit_label': 'Delete' }, request)
@login_required
diff --git a/rpkid/rpki/gui/urls.py b/rpkid/rpki/gui/urls.py
index 70ea4056..93fc9373 100644
--- a/rpkid/rpki/gui/urls.py
+++ b/rpkid/rpki/gui/urls.py
@@ -37,4 +37,8 @@ urlpatterns = patterns('',
(r'^accounts/login/$', 'django.contrib.auth.views.login'),
(r'^accounts/logout/$', 'django.contrib.auth.views.logout',
{ 'next_page': '/rpki/' }),
+
+ # !!!REMOVE THIS BEFORE COMMITTING!!!
+ (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': '/var/www/html/media'}),
)