diff options
author | Michael Elkins <melkins@tislabs.com> | 2012-01-20 23:28:30 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2012-01-20 23:28:30 +0000 |
commit | aeee0dc92a2862ea778b1efe6d8628f775c2239d (patch) | |
tree | 491530b051f08c1e27db77032264c604d29332fb | |
parent | cf0e1de38f308becea793fe109116fcd1e20cf23 (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.py | 4 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/app_base.html | 2 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/ghostbuster_detail.html | 74 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html | 53 | ||||
-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.html | 8 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/object_list.html | 3 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/object_table.html | 3 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/parent_detail.html | 36 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/parent_view.html | 63 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templatetags/__init__.py | 0 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templatetags/app_extras.py | 13 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/urls.py | 2 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/views.py | 86 | ||||
-rw-r--r-- | rpkid/setup.py | 4 |
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) |