X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fcore%2Fadmin.py;h=3818f0b6994dfb546e7db44ffbb82eb7950e4592;hb=c114a1f632f8559c6c30bef9e241963b6990c452;hp=4846a2816840d64040a4d7bbe947330c7807793b;hpb=ad664759f5b2ecdc6d6ff8e796b9e8c44a7cc9ac;p=plstackapi.git diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py index 4846a28..3818f0b 100644 --- a/planetstack/core/admin.py +++ b/planetstack/core/admin.py @@ -31,7 +31,7 @@ def backend_icon(obj): # backend_status, enacted, updated): if (obj.enacted is not None) and obj.enacted >= obj.updated: return '' else: - if obj.backend_status == "Provisioning in progress" or obj.backend_status=="": + if ((obj.backend_status is not None) and obj.backend_status.startswith("0 -")) or obj.backend_status == "Provisioning in progress" or obj.backend_status=="": return '' % obj.backend_status else: return '' % html_escape(obj.backend_status, quote=True) @@ -340,9 +340,9 @@ class NetworkLookerUpper: class SliverInline(PlStackTabularInline): model = Sliver - fields = ['backend_status_icon', 'all_ips_string', 'instance_name', 'slice', 'deployment', 'flavor', 'image', 'node'] + fields = ['backend_status_icon', 'all_ips_string', 'instance_id', 'instance_name', 'slice', 'deployment', 'flavor', 'image', 'node'] extra = 0 - readonly_fields = ['backend_status_icon', 'all_ips_string', 'instance_name'] + readonly_fields = ['backend_status_icon', 'all_ips_string', 'instance_id', 'instance_name'] suit_classes = 'suit-tab suit-tab-slivers' def queryset(self, request): @@ -404,16 +404,6 @@ class DeploymentPrivilegeInline(PlStackTabularInline): def queryset(self, request): return DeploymentPrivilege.select_by_user(request.user) -class ControllerPrivilegeInline(PlStackTabularInline): - model = ControllerPrivilege - extra = 0 - suit_classes = 'suit-tab suit-tab-admin-only' - fields = ['backend_status_icon', 'user','role','controller'] - readonly_fields = ('backend_status_icon', ) - - def queryset(self, request): - return ControllerPrivilege.select_by_user(request.user) - class ControllerSiteInline(PlStackTabularInline): model = ControllerSite extra = 0 @@ -643,7 +633,7 @@ class DeploymentAdmin(PlanetStackBaseAdmin): # nodes no longer direclty connected to deployments #suit_form_tabs =(('sites','Deployment Details'),('nodes','Nodes'),('deploymentprivileges','Privileges'),('tags','Tags'),('imagedeployments','Images')) - suit_form_tabs =(('sites','Deployment Details'),('deploymentprivileges','Privileges'),('tags','Tags'),('imagedeployments','Images')) + suit_form_tabs =(('sites','Deployment Details'),('deploymentprivileges','Privileges')) def get_form(self, request, obj=None, **kwargs): if request.user.isReadOnlyUser(): @@ -679,7 +669,7 @@ class ControllerAdminForm(forms.ModelForm): super(ControllerAdminForm, self).__init__(*args, **kwargs) if self.instance and self.instance.pk: - self.fields['sites'].initial = [x.site_deployment for x in self.instance.controllersite.all()] + self.fields['sites'].initial = [x.site for x in self.instance.controllersite.all()] def manipulate_m2m_objs(self, this_obj, selected_objs, all_relations, relation_class, local_attrname, foreign_attrname): """ helper function for handling m2m relations from the MultipleChoiceField @@ -726,7 +716,7 @@ class ControllerAdminForm(forms.ModelForm): class ControllerAdmin(PlanetStackBaseAdmin): model = Controller - fieldList = ['name', 'version', 'backend_type', 'auth_url', 'admin_user', 'admin_tenant','admin_password'] + fieldList = ['name', 'backend_type', 'version', 'auth_url', 'admin_user', 'admin_tenant','admin_password'] #fieldsets = [(None, {'fields': fieldList, 'classes':['suit-tab suit-tab-general']})] inlines = [ControllerSiteInline] # ,ControllerImagesInline] list_display = ['backend_status_icon', 'name', 'version', 'backend_type'] @@ -752,6 +742,13 @@ class ControllerAdmin(PlanetStackBaseAdmin): return AdminFormMetaClass + def save_model(self, request, obj, form, change): + # update openstack connection to use this site/tenant + obj.save_by_user(request.user) + + def delete_model(self, request, obj): + obj.delete_by_user(request.user) + class ServiceAttrAsTabInline(PlStackTabularInline): model = ServiceAttribute fields = ['name','value'] @@ -773,20 +770,18 @@ class ServiceAdmin(PlanetStackBaseAdmin): ('serviceattrs','Additional Attributes'), ) +class SiteNodeInline(PlStackTabularInline): + model = Node + fields = ['name', 'site_deployment'] + extra = 0 + suit_classes = 'suit-tab suit-tab-nodes' + class SiteAdmin(PlanetStackBaseAdmin): fieldList = ['backend_status_text', 'name', 'site_url', 'enabled', 'is_public', 'login_base', 'accountLink','location'] fieldsets = [ (None, {'fields': fieldList, 'classes':['suit-tab suit-tab-general']}), #('Deployment Networks', {'fields': ['deployments'], 'classes':['suit-tab suit-tab-deployments']}), ] - suit_form_tabs =(('general', 'Site Details'), - ('users','Users'), - ('siteprivileges','Privileges'), - ('deployments','Deployments'), - ('slices','Slices'), - #('nodes','Nodes'), - ('tags','Tags'), - ) readonly_fields = ['backend_status_text', 'accountLink'] user_readonly_fields = ['name', 'deployments','site_url', 'enabled', 'is_public', 'login_base', 'accountLink'] @@ -794,9 +789,26 @@ class SiteAdmin(PlanetStackBaseAdmin): list_display = ('backend_status_icon', 'name', 'login_base','site_url', 'enabled') list_display_links = ('backend_status_icon', 'name', ) filter_horizontal = ('deployments',) - inlines = [SliceInline,UserInline,TagInline, SitePrivilegeInline, SiteDeploymentInline] + inlines = [SliceInline,UserInline,TagInline, SitePrivilegeInline, SiteDeploymentInline, SiteNodeInline] + admin_inlines = [ControllerSiteInline] search_fields = ['name'] + @property + def suit_form_tabs(self): + tabs = [('general', 'Site Details'), + ('users','Users'), + ('siteprivileges','Privileges'), + ('deployments','Deployments'), + ('slices','Slices'), + ('nodes','Nodes'), + ] + + request=getattr(_thread_locals, "request", None) + if request and request.user.is_admin: + tabs.append( ('admin-only', 'Admin-Only') ) + + return tabs + def queryset(self, request): return Site.select_by_user(request.user) @@ -902,7 +914,7 @@ class ControllerSliceInline(PlStackTabularInline): verbose_name_plural = "Controller Slices" suit_classes = 'suit-tab suit-tab-admin-only' fields = ['backend_status_icon', 'controller', 'tenant_id'] - readonly_fields = ('backend_status_icon', ) + readonly_fields = ('backend_status_icon', 'controller' ) class SliceAdmin(PlanetStackBaseAdmin): form = SliceForm @@ -922,8 +934,8 @@ class SliceAdmin(PlanetStackBaseAdmin): ('slicenetworks','Networks'), ('sliceprivileges','Privileges'), ('slivers','Slivers'), - ('tags','Tags'), ('reservations','Reservations'), + ('tags','Tags'), ] request=getattr(_thread_locals, "request", None) @@ -946,7 +958,7 @@ class SliceAdmin(PlanetStackBaseAdmin): def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): deployment_nodes = [] for node in Node.objects.all(): - deployment_nodes.append( (node.site_deployment.id, node.id, node.name) ) + deployment_nodes.append( (node.site_deployment.deployment.id, node.id, node.name) ) deployment_flavors = [] for flavor in Flavor.objects.all(): @@ -1065,7 +1077,7 @@ class NodeAdmin(PlanetStackBaseAdmin): user_readonly_fields = ['name','site_deployment'] user_readonly_inlines = [TagInline,SliverInline] - suit_form_tabs =(('details','Node Details'),('slivers','Slivers'),('tags','Tags')) + suit_form_tabs =(('details','Node Details'),('slivers','Slivers')) class SliverForm(forms.ModelForm): @@ -1076,6 +1088,7 @@ class SliverForm(forms.ModelForm): widgets = { 'ip': PlainTextWidget(), 'instance_name': PlainTextWidget(), + 'instance_id': PlainTextWidget(), 'slice': LinkedSelect, 'deployment': LinkedSelect, 'node': LinkedSelect, @@ -1091,15 +1104,13 @@ class TagAdmin(PlanetStackBaseAdmin): class SliverAdmin(PlanetStackBaseAdmin): form = SliverForm fieldsets = [ - ('Sliver Details', {'fields': ['backend_status_text', 'slice', 'deployment', 'node', 'ip', 'instance_name', 'flavor', 'image', ], 'classes': ['suit-tab suit-tab-general'], }) + ('Sliver Details', {'fields': ['backend_status_text', 'slice', 'deployment', 'node', 'ip', 'instance_id', 'instance_name', 'flavor', 'image', ], 'classes': ['suit-tab suit-tab-general'], }) ] readonly_fields = ('backend_status_text', ) - list_display = ['backend_status_icon', 'ip', 'instance_name', 'slice', 'flavor', 'image', 'node', 'deployment'] + list_display = ['backend_status_icon', 'ip', 'instance_id', 'instance_name', 'slice', 'flavor', 'image', 'node', 'deployment'] list_display_links = ('backend_status_icon', 'ip',) - suit_form_tabs =(('general', 'Sliver Details'), - ('tags','Tags'), - ) + suit_form_tabs =(('general', 'Sliver Details'),) inlines = [TagInline] @@ -1201,6 +1212,14 @@ class UserDashboardViewInline(PlStackTabularInline): suit_classes = 'suit-tab suit-tab-dashboards' fields = ['user', 'dashboardView', 'order'] +class ControllerUserInline(PlStackTabularInline): + model = ControllerUser + extra = 0 + suit_classes = 'suit-tab suit-tab-admin-only' + fields = ['controller', 'user', 'kuser_id'] + readonly_fields=['controller'] + + class UserAdmin(PermissionCheckingAdminMixin, UserAdmin): # Note: Make sure PermissionCheckingAdminMixin is listed before # admin.ModelAdmin in the class declaration. @@ -1215,10 +1234,11 @@ class UserAdmin(PermissionCheckingAdminMixin, UserAdmin): # The fields to be used in displaying the User model. # These override the definitions on the base UserAdmin # that reference specific fields on auth.User. - list_display = ('email', 'firstname', 'lastname', 'site', 'last_login') + list_display = ('backend_status_icon', 'email', 'firstname', 'lastname', 'site', 'last_login') + list_display_links = ("email",) list_filter = ('site',) - inlines = [SlicePrivilegeInline,SitePrivilegeInline,ControllerPrivilegeInline,UserDashboardViewInline] - + inlines = [SlicePrivilegeInline,SitePrivilegeInline,UserDashboardViewInline] + admin_inlines = [ControllerUserInline] fieldListLoginDetails = ['backend_status_text', 'email','site','password','is_active','is_readonly','is_admin','public_key'] fieldListContactInfo = ['firstname','lastname','phone','timezone'] @@ -1231,7 +1251,7 @@ class UserAdmin(PermissionCheckingAdminMixin, UserAdmin): add_fieldsets = ( (None, { 'classes': ('wide',), - 'fields': ('email', 'firstname', 'lastname', 'is_readonly', 'phone', 'public_key','password1', 'password2')}, + 'fields': ('site', 'email', 'firstname', 'lastname', 'is_readonly', 'phone', 'public_key','password1', 'password2')}, ), ) readonly_fields = ('backend_status_text', ) @@ -1246,12 +1266,17 @@ class UserAdmin(PermissionCheckingAdminMixin, UserAdmin): if getattr(_thread_locals, "obj", None) is None: return [] else: - return (('general','Login Details'), + tabs = [('general','Login Details'), ('contact','Contact Information'), ('sliceprivileges','Slice Privileges'), ('siteprivileges','Site Privileges'), - ('controllerprivileges','Controller Privileges'), - ('dashboards','Dashboard Views')) + ('dashboards','Dashboard Views')] + + request=getattr(_thread_locals, "request", None) + if request and request.user.is_admin: + tabs.append( ('admin-only', 'Admin-Only') ) + + return tabs def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'site': @@ -1270,9 +1295,10 @@ class ControllerDashboardViewInline(PlStackTabularInline): class DashboardViewAdmin(PlanetStackBaseAdmin): fieldsets = [('Dashboard View Details', - {'fields': ['backend_status_text', 'name', 'url'], + {'fields': ['backend_status_text', 'name', 'url', 'enabled'], 'classes': ['suit-tab suit-tab-general']}) ] + list_display = ["name", "enabled", "url"] readonly_fields = ('backend_status_text', ) inlines = [ControllerDashboardViewInline]