aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Fenner <fenner@electricrain.com>2010-02-22 22:44:06 +0000
committerBill Fenner <fenner@electricrain.com>2010-02-22 22:44:06 +0000
commit444dd7cf6090e945abf8366c70dc699ac2e912ec (patch)
treee8a85629b6d46e5f6903a920cd38a265ac2c895b
parentd4cdbf054556b5771e11e0a8b2fe27f7b2d4bd2f (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.py6
-rw-r--r--portal-gui/rpki/myrpki/models.py47
-rw-r--r--portal-gui/rpki/myrpki/urls.py9
-rw-r--r--portal-gui/rpki/myrpki/views.py9
-rw-r--r--portal-gui/rpki/settings.py5
-rw-r--r--portal-gui/rpki/templates/myrpki/cert_confirm_delete.html10
-rw-r--r--portal-gui/rpki/templates/myrpki/cert_detail.html12
-rw-r--r--portal-gui/rpki/templates/myrpki/cert_form.html11
-rw-r--r--portal-gui/rpki/templates/registration/login.html26
-rw-r--r--portal-gui/rpki/urls.py8
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'),
)