manually query the site object if it isn't present in the SliceForm's cleaned_data...
[plstackapi.git] / planetstack / core / admin.py
index 1f88758..34a77c0 100644 (file)
@@ -15,6 +15,7 @@ from django.contrib.contenttypes import generic
 from suit.widgets import LinkedSelect
 from django.core.exceptions import PermissionDenied
 from django.core.urlresolvers import reverse, NoReverseMatch
+from cgi import escape as html_escape
 
 import django_evolution
 import threading
@@ -30,14 +31,14 @@ def backend_icon(obj): # backend_status, enacted, updated):
         if obj.backend_status == "Provisioning in progress" or obj.backend_status=="":
             return '<span style="min-width:16px;" title="%s"><img src="/static/admin/img/icon_clock.gif"></span>' % obj.backend_status
         else:
-            return '<span style="min-width:16px;" title="%s"><img src="/static/admin/img/icon_error.gif"></span>' % obj.backend_status
+            return '<span style="min-width:16px;" title="%s"><img src="/static/admin/img/icon_error.gif"></span>' % html_escape(obj.backend_status, quote=True)
 
 def backend_text(obj):
     icon = backend_icon(obj)
     if (obj.enacted is not None) and obj.enacted >= obj.updated:
-        return "%s %s" % (icon, "successfully enacted") # enacted on %s" % str(obj.enacted))
+        return "%s %s" % (icon, "successfully enacted")
     else:
-        return "%s %s" % (icon, obj.backend_status)
+        return "%s %s" % (icon, html_escape(obj.backend_status, quote=True))
 
 class PlainTextWidget(forms.HiddenInput):
     input_type = 'hidden'
@@ -737,6 +738,9 @@ class SliceForm(forms.ModelForm):
         cleaned_data = super(SliceForm, self).clean()
         name = cleaned_data.get('name')
         site = cleaned_data.get('site')
+        slice_id = self.instance.id
+        if not site and slice_id:
+            site = Slice.objects.get(id=slice_id).site
         if (not isinstance(site,Site)):
             # previous code indicates 'site' could be a site_id and not a site?
             site = Slice.objects.get(id=site.id)
@@ -765,14 +769,6 @@ class SliceAdmin(PlanetStackBaseAdmin):
 
     user_readonly_fields = fieldList
 
-#    suit_form_tabs =(('general', 'Slice Details'),
-#        ('slicenetworks','Networks'),
-#        ('sliceprivileges','Privileges'),
-#        ('slivers','Slivers'),
-#        ('tags','Tags'),
-#        ('reservations','Reservations'),
-#    )
-
     @property
     def suit_form_tabs(self):
         tabs =[('general', 'Slice Details'),
@@ -788,6 +784,18 @@ class SliceAdmin(PlanetStackBaseAdmin):
             tabs.append( ('admin-only', 'Admin-Only') )
 
         return tabs
+    
+    def add_view(self, request, form_url='', extra_context=None):
+        # revert to default read-only fields
+        self.readonly_fields = ('backend_status_text',)
+        return super(SliceAdmin, self).add_view(request, form_url, extra_context=extra_context)
+
+    def change_view(self, request, object_id, form_url='', extra_context=None):
+        print object_id
+        # cannot change the site of an existing slice so make the site field read only
+        if object_id:
+            self.readonly_fields = ('backend_status_text','site')
+        return super(SliceAdmin, self).change_view(request, object_id, form_url)
 
     def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
         deployment_nodes = []
@@ -967,9 +975,9 @@ class SliverAdmin(PlanetStackBaseAdmin):
         # make some fields read only if we are updating an existing record
         if obj == None:
             #self.readonly_fields = ('ip', 'instance_name')
-            self.readonly_fields = ('backend_status_text')
+            self.readonly_fields = ('backend_status_text',)
         else:
-            self.readonly_fields = ('backend_status_text')
+            self.readonly_fields = ('backend_status_text',)
             #self.readonly_fields = ('ip', 'instance_name', 'slice', 'image', 'key')
 
         for inline in self.get_inline_instances(request, obj):
@@ -1316,12 +1324,22 @@ class NetworkSlicesInline(PlStackTabularInline):
     fields = ['backend_status_icon', 'network','slice']
     readonly_fields = ('backend_status_icon', )
 
+class NetworkDeploymentsInline(PlStackTabularInline):
+    model = NetworkDeployments
+    extra = 0
+    verbose_name_plural = "Network Deployments"
+    verbose_name = "Network Deployment"
+    suit_classes = 'suit-tab suit-tab-admin-only'
+    fields = ['backend_status_icon', 'deployment','net_id','subnet_id']
+    readonly_fields = ('backend_status_icon', )
+
 class NetworkAdmin(PlanetStackBaseAdmin):
     list_display = ("backend_status_icon", "name", "subnet", "ports", "labels")
     list_display_links = ('backend_status_icon', 'name', )
     readonly_fields = ("subnet", )
 
     inlines = [NetworkParameterInline, NetworkSliversInline, NetworkSlicesInline, RouterInline]
+    admin_inlines = [NetworkDeploymentsInline]
 
     fieldsets = [
         (None, {'fields': ['backend_status_text', 'name','template','ports','labels','owner','guaranteedBandwidth', 'permitAllSlices','permittedSlices','network_id','router_id','subnet_id','subnet'], 'classes':['suit-tab suit-tab-general']}),]
@@ -1329,13 +1347,22 @@ class NetworkAdmin(PlanetStackBaseAdmin):
     readonly_fields = ('backend_status_text', )
     user_readonly_fields = ['name','template','ports','labels','owner','guaranteedBandwidth', 'permitAllSlices','permittedSlices','network_id','router_id','subnet_id','subnet']
 
-    suit_form_tabs =(
-        ('general','Network Details'),
-        ('netparams', 'Parameters'),
-        ('networkslivers','Slivers'),
-        ('networkslices','Slices'),
-        ('routers','Routers'),
-    )
+    @property
+    def suit_form_tabs(self):
+        tabs=[('general','Network Details'),
+            ('netparams', 'Parameters'),
+            ('networkslivers','Slivers'),
+            ('networkslices','Slices'),
+            ('routers','Routers'),
+        ]
+
+        request=getattr(_thread_locals, "request", None)
+        if request and request.user.is_admin:
+            tabs.append( ('admin-only', 'Admin-Only') )
+
+        return tabs
+
+
 class NetworkTemplateAdmin(PlanetStackBaseAdmin):
     list_display = ("backend_status_icon", "name", "guaranteedBandwidth", "visibility")
     list_display_links = ('backend_status_icon', 'name', )