Added in Project support to be used in concert with Tags on Slice, Site, Sliver and...
[plstackapi.git] / planetstack / core / admin.py
index 0c90b9a..76810f6 100644 (file)
@@ -11,10 +11,14 @@ from django.contrib.admin.widgets import FilteredSelectMultiple
 from django.contrib.auth.forms import ReadOnlyPasswordHashField
 from django.contrib.auth.signals import user_logged_in
 from django.utils import timezone
+from django.contrib.contenttypes import generic
+
 import django_evolution 
 
+class PlStackTabularInline(admin.TabularInline):
+    exclude = ['enacted']
 
-class ReadonlyTabularInline(admin.TabularInline):
+class ReadonlyTabularInline(PlStackTabularInline):
     can_delete = False
     extra = 0
     editable_fields = []
@@ -30,36 +34,40 @@ class ReadonlyTabularInline(admin.TabularInline):
     def has_add_permission(self, request):
         return False
 
-class SliverInline(admin.TabularInline):
+class TagInline(generic.GenericTabularInline):
+    model = Tag
+    exclude = ['enacted']
+    extra = 1
+
+class SliverInline(PlStackTabularInline):
     model = Sliver
     fields = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
     extra = 0
     #readonly_fields = ['ip', 'instance_name', 'image']
     readonly_fields = ['ip', 'instance_name']
     
-
-class SiteInline(admin.TabularInline):
+class SiteInline(PlStackTabularInline):
     model = Site
     extra = 0
 
-class UserInline(admin.TabularInline):
+class UserInline(PlStackTabularInline):
     model = User
     fields = ['email', 'firstname', 'lastname']
     extra = 0
 
-class SliceInline(admin.TabularInline):
+class SliceInline(PlStackTabularInline):
     model = Slice
     extra = 0
 
-class RoleInline(admin.TabularInline):
+class RoleInline(PlStackTabularInline):
     model = Role
     extra = 0 
 
-class NodeInline(admin.TabularInline):
+class NodeInline(PlStackTabularInline):
     model = Node
     extra = 0
 
-class SitePrivilegeInline(admin.TabularInline):
+class SitePrivilegeInline(PlStackTabularInline):
     model = SitePrivilege
     extra = 0
 
@@ -85,9 +93,10 @@ class SitePrivilegeInline(admin.TabularInline):
                 kwargs['queryset'] = users
         return super(SitePrivilegeInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
-class SliceMembershipInline(admin.TabularInline):
+class SliceMembershipInline(PlStackTabularInline):
     model = SliceMembership
     extra = 0
+    fields = ('user', 'role')
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'slice':
@@ -111,7 +120,7 @@ class SliceMembershipInline(admin.TabularInline):
 
         return super(SliceMembershipInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
-class SliceTagInline(admin.TabularInline):
+class SliceTagInline(PlStackTabularInline):
     model = SliceTag
     extra = 0
 
@@ -125,6 +134,7 @@ class PlainTextWidget(forms.HiddenInput):
 
 class PlanetStackBaseAdmin(admin.ModelAdmin):
     save_on_top = False
+    exclude = ['enacted']
 
 class RoleAdmin(PlanetStackBaseAdmin):
     fieldsets = [
@@ -132,7 +142,6 @@ class RoleAdmin(PlanetStackBaseAdmin):
     ]
     list_display = ('role_type',)
 
-
 class DeploymentAdminForm(forms.ModelForm):
     sites = forms.ModelMultipleChoiceField(
         queryset=Site.objects.all(),
@@ -185,7 +194,7 @@ class SiteAdmin(PlanetStackBaseAdmin):
     ]
     list_display = ('name', 'login_base','site_url', 'enabled')
     filter_horizontal = ('deployments',)
-    inlines = [NodeInline, UserInline, SitePrivilegeInline]
+    inlines = [TagInline, NodeInline, UserInline, SitePrivilegeInline]
     search_fields = ['name']
 
     def queryset(self, request):
@@ -204,6 +213,17 @@ class SiteAdmin(PlanetStackBaseAdmin):
             # hide MyInline in the add view
             if obj is None:
                 continue
+            if isinstance(inline, SliceInline):
+                inline.model.caller = request.user
+            yield inline.get_formset(request, obj)
+
+    def get_formsets(self, request, obj=None):
+        for inline in self.get_inline_instances(request, obj):
+            # hide MyInline in the add view
+            if obj is None:
+                continue
+            if isinstance(inline, SliverInline):
+                inline.model.caller = request.user
             yield inline.get_formset(request, obj)
 
 class SitePrivilegeAdmin(PlanetStackBaseAdmin):
@@ -247,10 +267,10 @@ class SitePrivilegeAdmin(PlanetStackBaseAdmin):
             qs = qs.filter(site__in=sites)
         return qs
 
-class SliceAdmin(OSModelAdmin):
+class SliceAdmin(PlanetStackBaseAdmin):
     fields = ['name', 'site', 'serviceClass', 'description', 'slice_url']
     list_display = ('name', 'site','serviceClass', 'slice_url')
-    inlines = [SliverInline, SliceMembershipInline, SliceTagInline]
+    inlines = [SliverInline, SliceMembershipInline, TagInline, SliceTagInline]
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'site':
@@ -280,11 +300,8 @@ class SliceAdmin(OSModelAdmin):
             # hide MyInline in the add view
             if obj is None:
                 continue
-            # give inline object access to driver and caller
-            auth = request.session.get('auth', {})
-            auth['tenant'] = obj.name       # meed to connect using slice's tenant
-            inline.model.os_manager = OpenStackManager(auth=auth, caller=request.user)
-            inline.model.creator = request.user
+            if isinstance(inline, SliverInline):
+                inline.model.caller = request.user
             yield inline.get_formset(request, obj)
 
     def get_queryset(self, request):
@@ -292,7 +309,12 @@ class SliceAdmin(OSModelAdmin):
         if request.user.is_superuser:
             return qs
         # users can only see slices at their site
-        return qs.filter(site=request.user.site) 
+        return qs.filter(site=request.user.site)
+
+    def save_model(self, request, obj, form, change):
+        # update openstack connection to use this site/tenant
+        obj.caller = request.user
+        obj.save() 
 
 class SliceMembershipAdmin(PlanetStackBaseAdmin):
     fieldsets = [
@@ -350,14 +372,13 @@ class SliceMembershipAdmin(PlanetStackBaseAdmin):
         obj.os_manager = OpenStackManager(auth=auth, caller=request.user)
         obj.delete()
 
-
 class ImageAdmin(admin.ModelAdmin):
     fields = ['image_id', 'name', 'disk_format', 'container_format']
 
 class NodeAdmin(admin.ModelAdmin):
     list_display = ('name', 'site', 'deployment')
     list_filter = ('deployment',)
-
+    inlines = [TagInline]
 
 class SliverForm(forms.ModelForm):
     class Meta:
@@ -369,12 +390,19 @@ class SliverForm(forms.ModelForm):
             'instance_name': PlainTextWidget(),
         }
 
+class ProjectAdmin(admin.ModelAdmin):
+    exclude = ['enacted']
+
+class TagAdmin(admin.ModelAdmin):
+    exclude = ['enacted']
+
 class SliverAdmin(PlanetStackBaseAdmin):
     form = SliverForm
     fieldsets = [
         ('Sliver', {'fields': ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'key', 'node', 'deploymentNetwork']})
     ]
     list_display = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'key', 'node', 'deploymentNetwork']
+    inlines = [TagInline]
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'slice':
@@ -458,7 +486,6 @@ class UserCreationForm(forms.ModelForm):
             user.save()
         return user
 
-
 class UserChangeForm(forms.ModelForm):
     """A form for updating users. Includes all the fields on
     the user, but replaces the password field with admin's
@@ -475,8 +502,7 @@ class UserChangeForm(forms.ModelForm):
         # field does not have access to the initial value
         return self.initial["password"]
 
-
-class UserAdmin(UserAdmin, OSModelAdmin):
+class UserAdmin(UserAdmin):
     class Meta:
         app_label = "core"
 
@@ -623,25 +649,25 @@ class ReservationAdmin(admin.ModelAdmin):
         return super(ReservationAdmin, self).changelist_view(request, extra_context)
 
     def get_form(self, request, obj=None, **kwargs):
-        request._obj_ = obj\r
-        if obj is not None:\r
-            # For changes, set request._slice to the slice already set in the\r
-            # object.\r
-            request._slice = obj.slice\r
-            self.form = ReservationChangeForm\r
-        else:\r
-            if getattr(request, "_refresh", False):\r
-                self.form = ReservationAddRefreshForm\r
-            else:\r
-                self.form = ReservationAddForm\r
-        return super(ReservationAdmin, self).get_form(request, obj, **kwargs)\r
-\r
+        request._obj_ = obj
+        if obj is not None:
+            # For changes, set request._slice to the slice already set in the
+            # object.
+            request._slice = obj.slice
+            self.form = ReservationChangeForm
+        else:
+            if getattr(request, "_refresh", False):
+                self.form = ReservationAddRefreshForm
+            else:
+                self.form = ReservationAddForm
+        return super(ReservationAdmin, self).get_form(request, obj, **kwargs)
+
     def get_readonly_fields(self, request, obj=None):
-        if (obj is not None):\r
-            # Prevent slice from being changed after the reservation has been\r
-            # created.\r
-            return ['slice']\r
-        else:\r
+        if (obj is not None):
+            # Prevent slice from being changed after the reservation has been
+            # created.
+            return ['slice']
+        else:
             return []
 
 # register a signal that caches the user's credentials when they log in
@@ -670,10 +696,10 @@ showAll = False
 admin.site.register(Deployment, DeploymentAdmin)
 admin.site.register(Site, SiteAdmin)
 admin.site.register(Slice, SliceAdmin)
-#admin.site.register(Subnet)
-
+admin.site.register(Project, ProjectAdmin)
 
 if showAll:
+    admin.site.register(Tag, TagAdmin)
     admin.site.register(Node, NodeAdmin)
     admin.site.register(SliceMembership, SliceMembershipAdmin)
     admin.site.register(SitePrivilege, SitePrivilegeAdmin)