diff options
author | Bill Fenner <fenner@electricrain.com> | 2010-02-22 22:44:06 +0000 |
---|---|---|
committer | Bill Fenner <fenner@electricrain.com> | 2010-02-22 22:44:06 +0000 |
commit | 444dd7cf6090e945abf8366c70dc699ac2e912ec (patch) | |
tree | e8a85629b6d46e5f6903a920cd38a265ac2c895b | |
parent | d4cdbf054556b5771e11e0a8b2fe27f7b2d4bd2f (diff) |
Largely model updates, and an as yet fairly useless cert editor.
svn path=/portal-gui/rpki/myrpki/dashboardurls.py; revision=2993
-rw-r--r-- | portal-gui/rpki/myrpki/dashboardurls.py | 6 | ||||
-rw-r--r-- | portal-gui/rpki/myrpki/models.py | 47 | ||||
-rw-r--r-- | portal-gui/rpki/myrpki/urls.py | 9 | ||||
-rw-r--r-- | portal-gui/rpki/myrpki/views.py | 9 | ||||
-rw-r--r-- | portal-gui/rpki/settings.py | 5 | ||||
-rw-r--r-- | portal-gui/rpki/templates/myrpki/cert_confirm_delete.html | 10 | ||||
-rw-r--r-- | portal-gui/rpki/templates/myrpki/cert_detail.html | 12 | ||||
-rw-r--r-- | portal-gui/rpki/templates/myrpki/cert_form.html | 11 | ||||
-rw-r--r-- | portal-gui/rpki/templates/registration/login.html | 26 | ||||
-rw-r--r-- | portal-gui/rpki/urls.py | 8 |
10 files changed, 128 insertions, 15 deletions
diff --git a/portal-gui/rpki/myrpki/dashboardurls.py b/portal-gui/rpki/myrpki/dashboardurls.py new file mode 100644 index 00000000..ed11798e --- /dev/null +++ b/portal-gui/rpki/myrpki/dashboardurls.py @@ -0,0 +1,6 @@ +from django.conf.urls.defaults import * +import views + +urlpatterns = patterns('', + (r'^$', views.dashboard ), +) diff --git a/portal-gui/rpki/myrpki/models.py b/portal-gui/rpki/myrpki/models.py index 3a923ab3..5c765eae 100644 --- a/portal-gui/rpki/myrpki/models.py +++ b/portal-gui/rpki/myrpki/models.py @@ -12,35 +12,51 @@ class IPAddressField( models.CharField ): models.CharField.__init__( self, max_length=40, **kwargs ) class Cert( models.Model ): - conf = models.ForeignKey( 'Conf' ) name = models.CharField( unique=True, max_length=255 ) data = models.TextField() def __unicode__( self ): return self.name class Conf( models.Model ): + '''This is the center of the universe. + ''' handle = HandleField( unique=True, db_index=True ) repository_bpki_cert = models.ForeignKey( Cert, related_name='conf_bpki_cert' ) my_bpki_ta = models.ForeignKey( Cert, related_name='conf_my_ta' ) repository_handle = HandleField() owner = models.OneToOneField( Group ) + def __unicode__( self ): + return self.handle -class Child( models.Model ): - conf = models.ForeignKey( Conf ) - handle = HandleField() - validity = models.DateTimeField() - bpki_cert = models.ForeignKey( Cert ) - -class Prefix( models.Model ): - child = models.ForeignKey( Child ) +class AddressRange( models.Model ): lo = IPAddressField() hi = IPAddressField() + parent = models.ForeignKey( 'AddressRange', related_name='children', + blank=True, null=True ) + def __unicode__( self ): + return u"address range %s-%s" % ( self.lo, self.hi ) class Asn( models.Model ): - child = models.ForeignKey( Child ) min = models.IntegerField() max = models.IntegerField() + parent = models.ForeignKey( 'Asn', related_name='children', + blank=True, null=True ) + def __unicode__( self ): + if self.min == self.max: + return u"ASN %d" % ( self.min ) + else: + return u"ASNs %d-%d" % ( self.min, self.max ) + +class Child( models.Model ): + conf = models.ForeignKey( Conf ) + handle = HandleField() + validity = models.DateTimeField() + bpki_cert = models.ForeignKey( Cert ) + address_range = models.ManyToManyField( AddressRange ) + asn = models.ManyToManyField( Asn ) + def __unicode__( self ): + return u"%s's child %s" % ( self.conf, self.handle ) class Parent( models.Model ): conf = models.ForeignKey( Conf ) @@ -50,6 +66,11 @@ class Parent( models.Model ): https_bpki_cert = models.ForeignKey( Cert, related_name='parent_https' ) my_handle = HandleField() sia_base = models.URLField( verify_exists=False ) + address_range = models.ManyToManyField( AddressRange, + related_name='from_parent' ) + asn = models.ManyToManyField( Asn, related_name='from_parent' ) + def __unicode__( self ): + return u"%s's parent %s" % ( self.conf, self.handle ) # This table is really owned by the publication server. #class PubClient( models.Model ): @@ -59,10 +80,10 @@ class Parent( models.Model ): class Roa( models.Model ): conf = models.ForeignKey( Conf ) - prefix = IPAddressField() - len = models.IntegerField() + prefix = models.ManyToManyField( AddressRange ) max_len = models.IntegerField() asn = models.IntegerField() active = models.BooleanField() comments = models.TextField() - group = models.CharField( max_length=40 ) + def __unicode__( self ): + return u"%s's ROA for %d" % ( self.conf, self.asn ) diff --git a/portal-gui/rpki/myrpki/urls.py b/portal-gui/rpki/myrpki/urls.py new file mode 100644 index 00000000..f0fc56d6 --- /dev/null +++ b/portal-gui/rpki/myrpki/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls.defaults import * +import views + +urlpatterns = patterns('', + (r'^cert/add/$', views.cert_add ), + (r'^cert/(?P<id>\d+)/$', views.cert_view ), + (r'^cert/(?P<id>\d+)/edit/$', views.cert_edit ), + (r'^cert/(?P<id>\d+)/delete/$', views.cert_delete ), +) diff --git a/portal-gui/rpki/myrpki/views.py b/portal-gui/rpki/myrpki/views.py index cd24ff73..bd0e5a3c 100644 --- a/portal-gui/rpki/myrpki/views.py +++ b/portal-gui/rpki/myrpki/views.py @@ -1,4 +1,4 @@ -from django.views.generic.create_update import create_object, update_object, +from django.views.generic.create_update import create_object, update_object, \ delete_object from django.views.generic.list_detail import object_detail from django.contrib.auth.decorators import login_required @@ -40,9 +40,16 @@ def dashboard( request ): @login_required def cert_add( request ): + # todo: enforce that the saved form points to this conf return create_object( request, form_class=forms.CertForm ) @login_required +def cert_view( request, id ): + handle = handle( request ) + queryset = Cert.objects.filter( conf=handle ) + return object_detail( queryset=queryset, object_id=id ) + +@login_required def cert_edit( request, id ): cert = get_object_or_404( models.Cert, pk=id ) # make sure it is owned by the current handle diff --git a/portal-gui/rpki/settings.py b/portal-gui/rpki/settings.py index 5488fd0c..c4147149 100644 --- a/portal-gui/rpki/settings.py +++ b/portal-gui/rpki/settings.py @@ -69,12 +69,17 @@ TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. +#XXX + '/Users/fenner/src/portal-gui/rpki/templates', ) INSTALLED_APPS = ( 'django.contrib.auth', + 'django.contrib.admin', + 'django.contrib.admindocs', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'rpki.myrpki', + 'rpki.django_extensions', ) diff --git a/portal-gui/rpki/templates/myrpki/cert_confirm_delete.html b/portal-gui/rpki/templates/myrpki/cert_confirm_delete.html new file mode 100644 index 00000000..661f4cc0 --- /dev/null +++ b/portal-gui/rpki/templates/myrpki/cert_confirm_delete.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block content %} +<h1>Confirm Delete Cert</h1> + +<p>You would like to delete the certificate named {{ object.name }}. +<form action="" method="post"> +<input type="submit" value="Delete" /> +</form> +{% endblock %} diff --git a/portal-gui/rpki/templates/myrpki/cert_detail.html b/portal-gui/rpki/templates/myrpki/cert_detail.html new file mode 100644 index 00000000..d9a86c80 --- /dev/null +++ b/portal-gui/rpki/templates/myrpki/cert_detail.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block content %} +<h1>Cert {{ cert.name }}</h1> + +<p>I dunno if this is interesting, but if it is: + +<pre> +{{ cert.data }} +</pre> + +{% endblock %} diff --git a/portal-gui/rpki/templates/myrpki/cert_form.html b/portal-gui/rpki/templates/myrpki/cert_form.html new file mode 100644 index 00000000..31a0fa3f --- /dev/null +++ b/portal-gui/rpki/templates/myrpki/cert_form.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block content %} +<h1>Add/Edit Cert</h1> + +<form action="" method="post"> +{{ form }} +<input type="submit" value="Submit" /> +</form> + +{% endblock %} diff --git a/portal-gui/rpki/templates/registration/login.html b/portal-gui/rpki/templates/registration/login.html new file mode 100644 index 00000000..86b5392a --- /dev/null +++ b/portal-gui/rpki/templates/registration/login.html @@ -0,0 +1,26 @@ +{% extends "base.html" %} + +{% block content %} + +{% if form.errors %} +<p>Your username and password didn't match. Please try again.</p> +{% endif %} + +<form method="post" action="{% url django.contrib.auth.views.login %}"> +<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> + +{% endblock %} + diff --git a/portal-gui/rpki/urls.py b/portal-gui/rpki/urls.py index 51e6c0e9..e8e783c9 100644 --- a/portal-gui/rpki/urls.py +++ b/portal-gui/rpki/urls.py @@ -9,8 +9,14 @@ urlpatterns = patterns('', # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: - # (r'^admin/doc/', include('django.contrib.admindocs.urls')), + (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: (r'^admin/', include(admin.site.urls)), + + (r'^dashboard/', include('myrpki.dashboardurls')), + (r'^myrpki/', include('myrpki.urls')), + + (r'^accounts/login/$', 'django.contrib.auth.views.login'), + (r'^accounts/logout/$', 'django.contrib.auth.views.logout'), ) |