aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2012-01-20 23:28:30 +0000
committerMichael Elkins <melkins@tislabs.com>2012-01-20 23:28:30 +0000
commitaeee0dc92a2862ea778b1efe6d8628f775c2239d (patch)
tree491530b051f08c1e27db77032264c604d29332fb
parentcf0e1de38f308becea793fe109116fcd1e20cf23 (diff)
create custom template tag for fetching the verbose_name or verbose_name_plural in generic object list/detail views
select page title based on verbose_name instead of passing in page_title rename templates to the default name selected by object_detail() and object_list() generic views use generic delete_object() view for parents and ghostbusters svn path=/branches/tk161/; revision=4252
-rw-r--r--rpkid/rpki/gui/app/models.py4
-rw-r--r--rpkid/rpki/gui/app/templates/app/app_base.html2
-rw-r--r--rpkid/rpki/gui/app/templates/app/ghostbuster_detail.html74
-rw-r--r--rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html53
-rw-r--r--rpkid/rpki/gui/app/templates/app/ghostbusterrequest_list.html (renamed from rpkid/rpki/gui/app/templates/app/ghostbuster_list.html)0
-rw-r--r--rpkid/rpki/gui/app/templates/app/object_detail.html8
-rw-r--r--rpkid/rpki/gui/app/templates/app/object_list.html3
-rw-r--r--rpkid/rpki/gui/app/templates/app/object_table.html3
-rw-r--r--rpkid/rpki/gui/app/templates/app/parent_detail.html36
-rw-r--r--rpkid/rpki/gui/app/templates/app/parent_view.html63
-rw-r--r--rpkid/rpki/gui/app/templatetags/__init__.py0
-rw-r--r--rpkid/rpki/gui/app/templatetags/app_extras.py13
-rw-r--r--rpkid/rpki/gui/app/urls.py2
-rw-r--r--rpkid/rpki/gui/app/views.py86
-rw-r--r--rpkid/setup.py4
15 files changed, 150 insertions, 201 deletions
diff --git a/rpkid/rpki/gui/app/models.py b/rpkid/rpki/gui/app/models.py
index aeccef2f..eb6c6a47 100644
--- a/rpkid/rpki/gui/app/models.py
+++ b/rpkid/rpki/gui/app/models.py
@@ -55,6 +55,7 @@ class Child(rpki.irdb.models.Child):
class Meta:
proxy = True
+ verbose_name_plural = 'children'
class Conf(rpki.irdb.models.ResourceHolderCA):
'''This is the center of the universe, also known as a place to
@@ -112,6 +113,7 @@ class ROARequest(rpki.irdb.models.ROARequest):
class ROARequestPrefix(rpki.irdb.models.ROARequestPrefix):
class Meta:
proxy = True
+ verbose_name = 'roa'
def __unicode__(self):
return u'ROA request prefix %s for asn %d' % (str(self.as_roa_prefix()), self.roa_request.asn)
@@ -160,6 +162,7 @@ class GhostbusterRequest(rpki.irdb.models.GhostbusterRequest):
class Meta:
ordering = ('family_name', 'given_name')
+ verbose_name = 'ghostbuster'
class Timestamp(models.Model):
"""Model to hold metadata about the collection of external data.
@@ -179,6 +182,7 @@ class Timestamp(models.Model):
class Repository(rpki.irdb.models.Repository):
class Meta:
proxy = True
+ verbose_name_plural = 'repositories'
@models.permalink
def get_absolute_url(self):
diff --git a/rpkid/rpki/gui/app/templates/app/app_base.html b/rpkid/rpki/gui/app/templates/app/app_base.html
index 4a436f6c..61b73290 100644
--- a/rpkid/rpki/gui/app/templates/app/app_base.html
+++ b/rpkid/rpki/gui/app/templates/app/app_base.html
@@ -14,7 +14,7 @@
<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_list %}">roas</a></li>
- <li><a href="{% url rpki.gui.app.views.ghostbusters_list %}">ghostbusters</a></li>
+ <li><a href="{% url rpki.gui.app.views.ghostbuster_list %}">ghostbusters</a></li>
<li><a href="{% url rpki.gui.app.views.repository_list %}">repositories</a></li>
{% if request.user.is_superuser %}
<li><a href="{% url rpki.gui.app.views.client_list %}">pubclients</a></li>
diff --git a/rpkid/rpki/gui/app/templates/app/ghostbuster_detail.html b/rpkid/rpki/gui/app/templates/app/ghostbuster_detail.html
deleted file mode 100644
index b86ad852..00000000
--- a/rpkid/rpki/gui/app/templates/app/ghostbuster_detail.html
+++ /dev/null
@@ -1,74 +0,0 @@
-{% extends "app/app_base.html" %}
-
-{% block content %}
-<!--
-<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>
--->
-
-<div class='page-header'>
- <h1>Ghostbuster View</h1>
-</div>
-
-<table class='zebra-striped'>
- <tr><td >Full Name</td><td>{{ object.full_name }}</td></tr>
-
- {% if object.honorific_prefix %}
- <tr><td >Honorific Prefix</td><td>{{ object.honorific_prefix }}</td></tr>
- {% endif %}
-
- {% if object.organization %}
- <tr><td >Organization</td><td>{{ object.organization }}</td></tr>
- {% endif %}
-
- {% if object.telephone %}
- <tr><td >Telephone</td><td>{{ object.telephone }}</td></tr>
- {% endif %}
-
- {% if object.email_address %}
- <tr><td >Email</td><td>{{ object.email_address }}</td></tr>
- {% endif %}
-
- {% if object.box %}
- <tr><td >P.O. Box</td><td>{{ object.box }}</td></tr>
- {% endif %}
-
- {% if object.extended %}
- <tr><td >Extended Address</td><td>{{ object.extended }}</td></tr>
- {% endif %}
-
- {% if object.street %}
- <tr><td >Street Address</td><td>{{ object.street }}</td></tr>
- {% endif %}
-
- {% if object.city %}
- <tr><td >City</td><td>{{ object.city }}</td></tr>
- {% endif %}
-
- {% if object.region %}
- <tr><td >Region</td><td>{{ object.region }}</td></tr>
- {% endif %}
-
- {% if object.code %}
- <tr><td >Postal Code</td><td>{{ object.code }}</td></tr>
- {% endif %}
-
- {% if object.country %}
- <tr><td >Country</td><td>{{ object.country }}</td></tr>
- {% endif %}
-
-</table>
-
-{% block extra %}
-<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>
-{% endblock %}
-
-{% endblock %}
-
-<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html
new file mode 100644
index 00000000..fa8915e4
--- /dev/null
+++ b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html
@@ -0,0 +1,53 @@
+{% extends "app/object_detail.html" %}
+
+{% block object_detail %}
+<table class='zebra-striped condensed-table'>
+ <tr><td >Full Name</td><td>{{ object.full_name }}</td></tr>
+
+ {% if object.honorific_prefix %}
+ <tr><td >Honorific Prefix</td><td>{{ object.honorific_prefix }}</td></tr>
+ {% endif %}
+
+ {% if object.organization %}
+ <tr><td >Organization</td><td>{{ object.organization }}</td></tr>
+ {% endif %}
+
+ {% if object.telephone %}
+ <tr><td >Telephone</td><td>{{ object.telephone }}</td></tr>
+ {% endif %}
+
+ {% if object.email_address %}
+ <tr><td >Email</td><td>{{ object.email_address }}</td></tr>
+ {% endif %}
+
+ {% if object.box %}
+ <tr><td >P.O. Box</td><td>{{ object.box }}</td></tr>
+ {% endif %}
+
+ {% if object.extended %}
+ <tr><td >Extended Address</td><td>{{ object.extended }}</td></tr>
+ {% endif %}
+
+ {% if object.street %}
+ <tr><td >Street Address</td><td>{{ object.street }}</td></tr>
+ {% endif %}
+
+ {% if object.city %}
+ <tr><td >City</td><td>{{ object.city }}</td></tr>
+ {% endif %}
+
+ {% if object.region %}
+ <tr><td >Region</td><td>{{ object.region }}</td></tr>
+ {% endif %}
+
+ {% if object.code %}
+ <tr><td >Postal Code</td><td>{{ object.code }}</td></tr>
+ {% endif %}
+
+ {% if object.country %}
+ <tr><td >Country</td><td>{{ object.country }}</td></tr>
+ {% endif %}
+
+</table>
+{% endblock object_detail %}
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/app/ghostbuster_list.html b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_list.html
index 327b79b1..327b79b1 100644
--- a/rpkid/rpki/gui/app/templates/app/ghostbuster_list.html
+++ b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_list.html
diff --git a/rpkid/rpki/gui/app/templates/app/object_detail.html b/rpkid/rpki/gui/app/templates/app/object_detail.html
index 0652b61f..3fd12e82 100644
--- a/rpkid/rpki/gui/app/templates/app/object_detail.html
+++ b/rpkid/rpki/gui/app/templates/app/object_detail.html
@@ -1,9 +1,10 @@
{% extends "app/app_base.html" %}
+{% load app_extras %}
{% block content %}
<div class='page-header'>
- <h1>{{ page_title }}
+ <h1>{% verbose_name object %}</h1>
</div>
{% block object_detail %}
@@ -22,10 +23,13 @@
</div>
{% else %}
<div class='actions'>
+ {% if can_edit %}
+ <a class='btn' href='{{ object.get_absolute_url }}/edit'>Edit</a>
+ {% endif %}
<a class='btn danger' href='{{ object.get_absolute_url }}/delete'>Delete</a>
</div>
{% endif %}
-{% endblock %}
+{% endblock content %}
<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/app/object_list.html b/rpkid/rpki/gui/app/templates/app/object_list.html
index f29f4a8c..e78eab98 100644
--- a/rpkid/rpki/gui/app/templates/app/object_list.html
+++ b/rpkid/rpki/gui/app/templates/app/object_list.html
@@ -1,11 +1,12 @@
{% extends "app/app_base.html" %}
+{% load app_extras %}
{# generic object list #}
{% block content %}
<div class='page-header'>
- <h1>{{ page_title }}</h1>
+ <h1>{% verbose_name_plural object_list %}</h1>
</div>
{% if object_list %}
diff --git a/rpkid/rpki/gui/app/templates/app/object_table.html b/rpkid/rpki/gui/app/templates/app/object_table.html
index 0ad145d3..4d154490 100644
--- a/rpkid/rpki/gui/app/templates/app/object_table.html
+++ b/rpkid/rpki/gui/app/templates/app/object_table.html
@@ -1,11 +1,12 @@
{% extends "app/app_base.html" %}
+{% load app_extras %}
{# Generic object list displayed as a table. #}
{% block content %}
<div class='page-header'>
- <h1>{{ page_title }}</h1>
+ <h1>{% verbose_name_plural object_list %}</h1>
</div>
{% if object_list %}
diff --git a/rpkid/rpki/gui/app/templates/app/parent_detail.html b/rpkid/rpki/gui/app/templates/app/parent_detail.html
new file mode 100644
index 00000000..850d5499
--- /dev/null
+++ b/rpkid/rpki/gui/app/templates/app/parent_detail.html
@@ -0,0 +1,36 @@
+{% extends "app/object_detail.html" %}
+
+{% block object_detail %}
+
+<h2>{{ object.handle }}</h2>
+
+<div class='row'>
+ <div class='span8'>
+ <h3>Delegated Addresses</h3>
+ <ul>
+ {% for c in object.certs.all %}
+ {% for a in c.address_ranges.all %}
+ <li>{{ a }}</li>
+ {% endfor %}
+ {% for a in c.address_ranges_v6.all %}
+ <li>{{ a }}</li>
+ {% endfor %}
+ {% endfor %}
+ </ul>
+ </div>
+
+ <div class='span8'>
+ <h3>Delegated ASNs</h3>
+ <ul>
+ {% for c in object.certs.all %}
+ {% for a in c.asn_ranges.all %}
+ <li>{{ a }}</li>
+ {% endfor %}
+ {% endfor %}
+ </ul>
+ </div>
+</div><!-- /row -->
+
+{% endblock object_detail %}
+
+<!-- vim: set sw=2: -->
diff --git a/rpkid/rpki/gui/app/templates/app/parent_view.html b/rpkid/rpki/gui/app/templates/app/parent_view.html
deleted file mode 100644
index 87645d71..00000000
--- a/rpkid/rpki/gui/app/templates/app/parent_view.html
+++ /dev/null
@@ -1,63 +0,0 @@
-{% extends "app/app_base.html" %}
-
-{% block content %}
-
-<div class='page-header'>
- <h1>Parent: {{ parent.handle }}</h1>
-</div>
-
-<div class='row'>
-
- <div class='span8'>
- <h2>Delegated Addresses</h2>
- <ul>
- {% for c in parent.certs.all %}
- {% for a in c.address_ranges.all %}
- <li>{{ a }}</li>
- {% endfor %}
- {% for a in c.address_ranges_v6.all %}
- <li>{{ a }}</li>
- {% endfor %}
- {% endfor %}
- </ul>
- </div>
-
- <div class='span8'>
- <h2>Delegated ASNs</h2>
- <ul>
- {% for c in parent.certs.all %}
- {% for a in c.asn_ranges.all %}
- <li>{{ a }}</li>
- {% endfor %}
- {% endfor %}
- </ul>
- </div>
-
-</div><!-- /row -->
-
-{% 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 "app/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/templatetags/__init__.py b/rpkid/rpki/gui/app/templatetags/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/rpkid/rpki/gui/app/templatetags/__init__.py
diff --git a/rpkid/rpki/gui/app/templatetags/app_extras.py b/rpkid/rpki/gui/app/templatetags/app_extras.py
new file mode 100644
index 00000000..d3d85dcf
--- /dev/null
+++ b/rpkid/rpki/gui/app/templatetags/app_extras.py
@@ -0,0 +1,13 @@
+from django import template
+
+register = template.Library()
+
+@register.simple_tag
+def verbose_name(obj):
+ "Return the model class' verbose name."
+ return obj._meta.verbose_name.title()
+
+@register.simple_tag
+def verbose_name_plural(qs):
+ "Return the verbose name for the model class."
+ return qs.model._meta.verbose_name_plural.title()
diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py
index 6f9f7140..e111b8c9 100644
--- a/rpkid/rpki/gui/app/urls.py
+++ b/rpkid/rpki/gui/app/urls.py
@@ -38,7 +38,7 @@ urlpatterns = patterns('',
(r'^child/(?P<pk>\d+)/export$', views.export_child_response),
(r'^child/(?P<pk>\d+)/export_repo$', views.export_child_repo_response),
(r'^child/(?P<pk>\d+)/destroy$', views.destroy_handle),
- (r'^gbr/$', views.ghostbusters_list),
+ (r'^gbr/$', views.ghostbuster_list),
(r'^gbr/create$', views.ghostbuster_create),
(r'^gbr/(?P<pk>\d+)$', views.ghostbuster_view),
(r'^gbr/(?P<pk>\d+)/edit$', views.ghostbuster_edit),
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index 14f33139..a35b4373 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -232,14 +232,30 @@ def parent_list(request):
"""List view for parent objects."""
conf = request.session['handle']
return object_list(request, queryset=conf.parents.all(),
- template_name='app/parent_list.html',
extra_context={
- 'page_title': 'Parents',
'create_url': reverse(parent_import),
'create_label': 'Import'})
@handle_required
+def parent_view(request, pk):
+ """Detail view for a particular parent."""
+ handle = request.session['handle']
+ qs = handle.parents.all()
+ return object_detail(request, qs, object_id=pk)
+
+
+@handle_required
+def parent_delete(request, pk):
+ conf = request.session['handle']
+ get_object_or_404(conf.parents, pk=pk) # confirm permission
+ return delete_object(request, model=models.Parent, object_id=pk,
+ post_delete_redirect=reverse(parent_list),
+ template_name='app/parent_detail.html',
+ extra_context={'confirm_delete': True})
+
+
+@handle_required
def child_import(request):
"""
Import a repository response.
@@ -273,7 +289,6 @@ def child_list(request):
return object_list(request, queryset=conf.children.all(),
template_name='app/child_list.html',
extra_context={
- 'page_title': 'Children',
'create_url': reverse(child_import),
'create_label': 'Import'})
@@ -320,14 +335,6 @@ def child_add_address(request, pk):
@handle_required
-def parent_view(request, pk):
- """Detail view for a particular parent."""
- handle = request.session['handle']
- parent = get_object_or_404(handle.parents.all(), pk=pk)
- return render('app/parent_view.html', {'parent': parent}, request)
-
-
-@handle_required
def child_view(request, pk):
'''Detail view of child for the currently selected handle.'''
handle = request.session['handle']
@@ -427,8 +434,7 @@ def roa_list(request):
qs = models.ROARequestPrefix.objects.filter(roa_request__issuer=conf)
return object_list(request, queryset=qs,
template_name='app/roa_request_list.html',
- extra_context={'page_title': 'ROA Requests',
- 'create_url': reverse(roa_create)})
+ extra_context={'create_url': reverse(roa_create)})
@handle_required
@@ -479,15 +485,13 @@ def roa_delete(request, pk):
@handle_required
-def ghostbusters_list(request):
+def ghostbuster_list(request):
"""
Display a list of all ghostbuster requests for the current Conf.
"""
conf = request.session['handle']
qs = models.GhostbusterRequest.objects.filter(issuer=conf)
- return object_list(request, queryset=qs,
- template_name='app/ghostbuster_list.html',
- extra_context={'page_title': 'Ghostbusters'})
+ return object_list(request, queryset=qs)
@handle_required
@@ -498,23 +502,17 @@ def ghostbuster_view(request, pk):
conf = request.session['handle']
qs = models.GhostbusterRequest.objects.filter(issuer=conf)
return object_detail(request, queryset=qs, object_id=pk,
- template_name='app/ghostbuster_detail.html')
+ extra_context={'can_edit': True})
@handle_required
def ghostbuster_delete(request, pk):
conf = request.session['handle']
-
- # verify that the object is owned by this conf
- obj = get_object_or_404(models.GhostbusterRequest, pk=pk, issuer=conf)
-
- # modeled loosely on the generic delete_object() view.
- if request.method == 'POST':
- obj.delete() # should cause a cascade delete of 'obj'
- return http.HttpResponseRedirect(reverse(ghostbusters_list))
-
- return render('app/ghostbuster_confirm_delete.html', {'object': obj},
- request)
+ get_object_or_404(models.GhostbusterRequest, issuer=conf, pk=pk) # permission check
+ return delete_object(request, model=models.GhostbusterRequest, object_id=pk,
+ post_delete_redirect=reverse(ghostbuster_list),
+ template_name='app/ghostbusterrequest_detail.html',
+ extra_context={'confirm_delete': True})
def _ghostbuster_edit(request, obj=None):
@@ -654,23 +652,6 @@ def child_delete(request, pk):
return render('app/child_delete_form.html', {'form': form, 'object': child}, request)
-@handle_required
-def parent_delete(request, pk):
- conf = request.session['handle']
- parent = get_object_or_404(conf.parents, pk=pk)
-
- if request.method == 'POST':
- form = forms.GenericConfirmationForm(request.POST, request.FILES)
- if form.is_valid():
- parent.delete()
- return http.HttpResponseRedirect(reverse(parent_list))
- else:
- form = forms.GenericConfirmationForm()
-
- return render('app/parent_view.html', {'form': form,
- 'parent': parent, 'submit_label': 'Delete'}, request)
-
-
@login_required
def destroy_handle(request, handle):
"""
@@ -781,7 +762,6 @@ def repository_list(request):
qs = models.Repository.objects.filter(issuer=conf)
return object_list(request, queryset=qs, template_name='app/repository_list.html',
extra_context={
- 'page_title': u'Repositories',
'create_url': reverse(repository_import),
'create_label': u'Import'})
@@ -790,8 +770,7 @@ def repository_list(request):
def repository_detail(request, pk):
conf = request.session['handle']
qs = models.Repository.objects.filter(issuer=conf)
- return object_detail(request, queryset=qs, object_id=pk, template_name='app/repository_detail.html',
- extra_context={'page_title': 'Repository Detail'})
+ return object_detail(request, queryset=qs, object_id=pk, template_name='app/repository_detail.html')
@handle_required
@@ -801,8 +780,7 @@ def repository_delete(request, pk):
return delete_object(request, model=models.Repository, object_id=pk,
post_delete_redirect=reverse(repository_list),
template_name='app/repository_detail.html',
- extra_context={'confirm_delete': True,
- 'page_title': 'Delete Repository'})
+ extra_context={'confirm_delete': True})
@handle_required
@@ -832,18 +810,14 @@ def repository_import(request):
@superuser_required
def client_list(request):
return object_list(request, queryset=models.Client.objects.all(),
- template_name='app/client_list.html',
extra_context={
- 'page_title': u'Publication Clients',
'create_url': reverse(client_import),
'create_label': u'Import'})
@superuser_required
def client_detail(request, pk):
- return object_detail(request, queryset=models.Client.objects, object_id=pk,
- template_name='app/client_detail.html',
- extra_context={'page_title': 'Publication Client Detail'})
+ return object_detail(request, queryset=models.Client.objects, object_id=pk)
@superuser_required
diff --git a/rpkid/setup.py b/rpkid/setup.py
index aebe8edc..348aa544 100644
--- a/rpkid/setup.py
+++ b/rpkid/setup.py
@@ -67,6 +67,6 @@ setup(name = "rpkitoolkit",
"rpki.gui", "rpki.gui.app", "rpki.gui.cacheview",
"rpki.gui.routeview" ],
ext_modules = [pow],
- package_data = { 'rpki.gui.app' : ['templates/*.html', 'templates/*/*.html'],
- 'rpki.gui.cacheview' : [ 'templates/*/*.html' ] },
+ package_data = {'rpki.gui.app': ['templates/*.html', 'templates/*/*.html', 'templatetags/*.py'],
+ 'rpki.gui.cacheview': ['templates/*/*.html']},
data_files = data_files)