X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fcore%2Fadmin.py;h=365c0dc9038c3d3ef2aecf968937e006b075149f;hb=093d2fa46db97509dcf76e7b059393ed4fc632c3;hp=b0f0446ec5b729295cc6d78d018a915b7c9d9839;hpb=5312bf970db9172a4dec896bdf6f13c8fd921f91;p=plstackapi.git diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py index b0f0446..365c0dc 100644 --- a/planetstack/core/admin.py +++ b/planetstack/core/admin.py @@ -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 @@ -552,7 +542,7 @@ class DeploymentAdminForm(forms.ModelForm): self.fields['accessControl'].initial = "allow site " + request.user.site.name if self.instance and self.instance.pk: - self.fields['sites'].initial = [x.site for x in self.instance.sitedeployments.all()] + self.fields['sites'].initial = [x for x in self.instance.sitesdeployments.all()] self.fields['images'].initial = [x.image for x in self.instance.imagedeployments.all()] self.fields['flavors'].initial = self.instance.flavors.all() @@ -604,7 +594,7 @@ class DeploymentAdminForm(forms.ModelForm): # create/destroy the through models ourselves. There has to be # a better way... - self.manipulate_m2m_objs(deployment, self.cleaned_data['sites'], deployment.sitedeployments.all(), SiteDeployment, "deployment", "site") + self.manipulate_m2m_objs(deployment, self.cleaned_data['sites'], deployment.sitedeployment.all(), SiteDeployment, "deployment", "site") self.manipulate_m2m_objs(deployment, self.cleaned_data['images'], deployment.imagedeployments.all(), ImageDeployments, "deployment", "image") # manipulate_m2m_objs doesn't work for Flavor/Deployment relationship # so well handle that manually here @@ -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(): @@ -662,12 +652,12 @@ class DeploymentAdmin(PlanetStackBaseAdmin): return AdminFormMetaClass class ControllerAdminForm(forms.ModelForm): - site_deployments = forms.ModelMultipleChoiceField( - queryset=SiteDeployment.objects.all(), + sites = forms.ModelMultipleChoiceField( + queryset=Site.objects.all(), required=False, - help_text="Select which sites deployments are managed by this controller", + help_text="Select which sites are managed by this controller", widget=FilteredSelectMultiple( - verbose_name=('Site Deployments'), is_stacked=False + verbose_name=('Sites'), is_stacked=False ) ) @@ -679,7 +669,7 @@ class ControllerAdminForm(forms.ModelForm): super(ControllerAdminForm, self).__init__(*args, **kwargs) if self.instance and self.instance.pk: - self.fields['site_deployments'].initial = [x.site_deployment for x in self.instance.controllersitedeployments.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 @@ -717,7 +707,7 @@ class ControllerAdminForm(forms.ModelForm): # save_m2m() doesn't seem to work with 'through' relations. So we # create/destroy the through models ourselves. There has to be # a better way... - self.manipulate_m2m_objs(controller, self.cleaned_data['site_deployments'], controller.controllersitedeployments.all(), ControllerSite, "controller", "site_deployment") + self.manipulate_m2m_objs(controller, self.cleaned_data['sites'], controller.controllersite.all(), ControllerSite, "controller", "site") pass self.save_m2m() @@ -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) @@ -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): @@ -1097,9 +1109,7 @@ class SliverAdmin(PlanetStackBaseAdmin): list_display = ['backend_status_icon', 'ip', '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 +1211,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. @@ -1217,8 +1235,8 @@ class UserAdmin(PermissionCheckingAdminMixin, UserAdmin): # that reference specific fields on auth.User. list_display = ('email', 'firstname', 'lastname', 'site', 'last_login') 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 +1249,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 +1264,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 +1293,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]