X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fcore%2Fadmin.py;h=d1f6f8659906f1c7fea4e801a4c0d3d528ee60a3;hb=63d1a55aebd5e370a64576dd576dac4ce27dde20;hp=86b2b3c31f77428caf1972b3597f17d2c6829c9e;hpb=34b502f51d2fc727249a1185f3a586311a8fdea5;p=plstackapi.git diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py index 86b2b3c..d1f6f86 100644 --- a/planetstack/core/admin.py +++ b/planetstack/core/admin.py @@ -16,13 +16,37 @@ from suit.widgets import LinkedSelect from django.core.exceptions import PermissionDenied from django.core.urlresolvers import reverse, NoReverseMatch -import django_evolution +import django_evolution + +def backend_icon(value): + if value == "": + return "" + elif value == "Provisioning in progress": + return '' + else: + return '' + +class PlainTextWidget(forms.HiddenInput): + input_type = 'hidden' + + def render(self, name, value, attrs=None): + if value is None: + value = '' + return mark_safe(str(value) + super(PlainTextWidget, self).render(name, value, attrs)) + +class BackendStatusIconWidget(forms.Widget): + def render(self, name, value, attrs=None): + return mark_safe('
%s
' % (value, backend_icon(value))) + +class BackendStatusFullWidget(forms.Widget): + def render(self, name, value, attrs=None): + return mark_safe('%s %s' % (backend_icon(value), value)) class ReadOnlyAwareAdmin(admin.ModelAdmin): def has_add_permission(self, request, obj=None): return (not self.__user_is_readonly(request)) - + def has_delete_permission(self, request, obj=None): return (not self.__user_is_readonly(request)) @@ -71,6 +95,25 @@ class ReadOnlyAwareAdmin(admin.ModelAdmin): def __user_is_readonly(self, request): return request.user.isReadOnlyUser() + def formfield_for_dbfield(self, db_field, **kwargs): + if (db_field.name == 'backend_status'): + kwargs['widget'] = BackendStatusFullWidget(attrs={"title": "foo"}) + result = super(ReadOnlyAwareAdmin, self).formfield_for_dbfield(db_field, **kwargs) + + if (db_field.name == 'backend_status'): + result.required = False + + return result + + def backend_status_icon(self, obj): + if hasattr(obj, 'backend_status'): + value = obj.backend_status + return mark_safe('
%s
' % (value, backend_icon(value))) + else: + return "" + backend_status_icon.short_description = "" + + class SingletonAdmin (ReadOnlyAwareAdmin): def has_add_permission(self, request): if not super(SingletonAdmin, self).has_add_permission(request): @@ -150,44 +193,50 @@ class PlStackTabularInline(admin.TabularInline): selflink.allow_tags = True selflink.short_description = "Details" -class ReadOnlyTabularInline(PlStackTabularInline): - can_delete = False + def has_add_permission(self, request): + return not request.user.isReadOnlyUser() def get_readonly_fields(self, request, obj=None): - return self.fields + readonly_fields = list(self.readonly_fields)[:] + if request.user.isReadOnlyUser(): + for field in self.fields: + if not field in readonly_fields: + readonly_fields.append(field) + return readonly_fields + + def formfield_for_dbfield(self, db_field, **kwargs): + if (db_field.name == 'backend_status'): + kwargs['widget'] = BackendStatusIconWidget() + + result = super(PlStackTabularInline, self).formfield_for_dbfield(db_field, **kwargs) + if (db_field.name == 'backend_status'): + result.label = "" + result.required = False + + return result + +class PlStackGenericTabularInline(generic.GenericTabularInline): def has_add_permission(self, request): - return False + return not request.user.isReadOnlyUser() -class ReservationROInline(ReadOnlyTabularInline): - model = Reservation - extra = 0 - suit_classes = 'suit-tab suit-tab-reservations' - fields = ['startTime','slice','duration'] + def get_readonly_fields(self, request, obj=None): + readonly_fields = list(self.readonly_fields)[:] + if request.user.isReadOnlyUser(): + for field in self.fields: + if not field in readonly_fields: + readonly_fields.append(field) + return readonly_fields class ReservationInline(PlStackTabularInline): model = Reservation extra = 0 suit_classes = 'suit-tab suit-tab-reservations' - + def queryset(self, request): return Reservation.select_by_user(request.user) -class TagROInline(generic.GenericTabularInline): - model = Tag - extra = 0 - suit_classes = 'suit-tab suit-tab-tags' - can_delete = False - fields = ['service', 'name', 'value'] - - def get_readonly_fields(self, request, obj=None): - return self.fields - - def has_add_permission(self, request): - return False - - -class TagInline(generic.GenericTabularInline): +class TagInline(PlStackGenericTabularInline): model = Tag extra = 0 suit_classes = 'suit-tab suit-tab-tags' @@ -201,6 +250,8 @@ class NetworkLookerUpper: the ip address for that network. """ + byNetworkName = {} # class variable + def __init__(self, name): self.short_description = name self.__name__ = name @@ -216,16 +267,22 @@ class NetworkLookerUpper: def __str__(self): return self.network_name -class SliverROInline(ReadOnlyTabularInline): - model = Sliver - fields = ['ip', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node'] - suit_classes = 'suit-tab suit-tab-slivers' + @staticmethod + def get(network_name): + """ We want to make sure we alwars return the same NetworkLookerUpper + because sometimes django will cause them to be instantiated multiple + times (and we don't want different ones in form.fields vs + SliverInline.readonly_fields). + """ + if network_name not in NetworkLookerUpper.byNetworkName: + NetworkLookerUpper.byNetworkName[network_name] = NetworkLookerUpper(network_name) + return NetworkLookerUpper.byNetworkName[network_name] class SliverInline(PlStackTabularInline): model = Sliver - fields = ['ip', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node'] + fields = ['backend_status', 'all_ips_string', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node'] extra = 0 - readonly_fields = ['ip', 'instance_name'] + readonly_fields = ['all_ips_string', 'instance_name'] suit_classes = 'suit-tab suit-tab-slivers' def queryset(self, request): @@ -239,51 +296,47 @@ class SliverInline(PlStackTabularInline): # then find the child with class "field-node" # then find the child with that is a select # then return its id - kwargs['widget'] = forms.Select(attrs={'onChange': "update_nodes(this, $($($(this).closest('tr')[0]).children('.field-node')[0]).children('select')[0].id);"}) + kwargs['widget'] = forms.Select(attrs={'onChange': "update_nodes(this, $($(this).closest('tr')[0]).find('.field-node select')[0].id)"}) #kwargs['widget'] = forms.Select(attrs={'onChange': "console.log($($($(this).closest('tr')[0]).children('.field-node')[0]).children('select')[0].id);"}) field = super(SliverInline, self).formfield_for_foreignkey(db_field, request, **kwargs) return field -# Note this is breaking in the admin.py when trying to use an inline to add a node/image -# def _declared_fieldsets(self): -# # Return None so django will call get_fieldsets and we can insert our -# # dynamic fields -# return None -# -# def get_readonly_fields(self, request, obj=None): -# readonly_fields = super(SliverInline, self).get_readonly_fields(request, obj) -# -# # Lookup the networks that are bound to the slivers, and add those -# # network names to the list of readonly fields. -# -# for sliver in obj.slivers.all(): -# for nbs in sliver.networksliver_set.all(): -# if nbs.ip: -# network_name = nbs.network.name -# if network_name not in [str(x) for x in readonly_fields]: -# readonly_fields.append(NetworkLookerUpper(network_name)) -# -# return readonly_fields -# -# def get_fieldsets(self, request, obj=None): -# form = self.get_formset(request, obj).form -# # fields = the read/write files + the read-only fields -# fields = self.fields -# for fieldName in self.get_readonly_fields(request,obj): -# if not fieldName in fields: -# fields.append(fieldName) -# -# return [(None, {'fields': fields})] - - - -class SiteROInline(ReadOnlyTabularInline): - model = Site - extra = 0 - fields = ['name', 'login_base', 'site_url', 'enabled'] - suit_classes = 'suit-tab suit-tab-sites' +""" + SMBAKER: This is the old code that implemented each network type as a + separate column in the sliver table. + + def _declared_fieldsets(self): + # Return None so django will call get_fieldsets and we can insert our + # dynamic fields + return None + + def get_readonly_fields(self, request, obj=None): + readonly_fields = list(super(SliverInline, self).get_readonly_fields(request, obj)) + + # Lookup the networks that are bound to the slivers, and add those + # network names to the list of readonly fields. + + for sliver in obj.slivers.all(): + for nbs in sliver.networksliver_set.all(): + if nbs.ip: + network_name = nbs.network.name + if network_name not in [str(x) for x in readonly_fields]: + readonly_fields.append(NetworkLookerUpper.get(network_name)) + + return readonly_fields + + def get_fieldsets(self, request, obj=None): + form = self.get_formset(request, obj).form + # fields = the read/write files + the read-only fields + fields = list(self.fields) + for fieldName in self.get_readonly_fields(request,obj): + if not fieldName in fields: + fields.append(fieldName) + + return [(None, {'fields': fields})] +""" class SiteInline(PlStackTabularInline): model = Site @@ -293,74 +346,44 @@ class SiteInline(PlStackTabularInline): def queryset(self, request): return Site.select_by_user(request.user) -class UserROInline(ReadOnlyTabularInline): - model = User - fields = ['email', 'firstname', 'lastname'] - extra = 0 - suit_classes = 'suit-tab suit-tab-users' - class UserInline(PlStackTabularInline): model = User - fields = ['email', 'firstname', 'lastname'] + fields = ['backend_status', 'email', 'firstname', 'lastname'] extra = 0 suit_classes = 'suit-tab suit-tab-users' def queryset(self, request): return User.select_by_user(request.user) -class SliceROInline(ReadOnlyTabularInline): - model = Slice - suit_classes = 'suit-tab suit-tab-slices' - fields = ['name','site', 'serviceClass', 'service'] - class SliceInline(PlStackTabularInline): model = Slice - fields = ['name','site', 'serviceClass', 'service'] + fields = ['backend_status', 'name', 'site', 'serviceClass', 'service'] extra = 0 suit_classes = 'suit-tab suit-tab-slices' def queryset(self, request): return Slice.select_by_user(request.user) -class NodeROInline(ReadOnlyTabularInline): - model = Node - extra = 0 - suit_classes = 'suit-tab suit-tab-nodes' - fields = ['name','deployment','site'] - class NodeInline(PlStackTabularInline): model = Node extra = 0 suit_classes = 'suit-tab suit-tab-nodes' - fields = ['name','deployment','site'] - -class DeploymentPrivilegeROInline(ReadOnlyTabularInline): - model = DeploymentPrivilege - extra = 0 - suit_classes = 'suit-tab suit-tab-deploymentprivileges' - fields = ['user','role','deployment'] + fields = ['backend_status', 'name','deployment','site'] class DeploymentPrivilegeInline(PlStackTabularInline): model = DeploymentPrivilege extra = 0 suit_classes = 'suit-tab suit-tab-deploymentprivileges' - fields = ['user','role','deployment'] + fields = ['backend_status', 'user','role','deployment'] def queryset(self, request): return DeploymentPrivilege.select_by_user(request.user) -#CLEANUP DOUBLE SitePrivilegeInline -class SitePrivilegeROInline(ReadOnlyTabularInline): - model = SitePrivilege - extra = 0 - suit_classes = 'suit-tab suit-tab-siteprivileges' - fields = ['user','site', 'role'] - class SitePrivilegeInline(PlStackTabularInline): model = SitePrivilege extra = 0 suit_classes = 'suit-tab suit-tab-siteprivileges' - fields = ['user','site', 'role'] + fields = ['backend_status', 'user','site', 'role'] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'site': @@ -373,19 +396,11 @@ class SitePrivilegeInline(PlStackTabularInline): def queryset(self, request): return SitePrivilege.select_by_user(request.user) -class SiteDeploymentROInline(ReadOnlyTabularInline): - model = SiteDeployments - #model = Site.deployments.through - extra = 0 - suit_classes = 'suit-tab suit-tab-deployments' - fields = ['deployment','site'] - class SiteDeploymentInline(PlStackTabularInline): model = SiteDeployments - #model = Site.deployments.through extra = 0 suit_classes = 'suit-tab suit-tab-deployments' - fields = ['deployment','site'] + fields = ['backend_status', 'deployment','site'] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'site': @@ -399,37 +414,23 @@ class SiteDeploymentInline(PlStackTabularInline): return SiteDeployments.select_by_user(request.user) -class SlicePrivilegeROInline(ReadOnlyTabularInline): - model = SlicePrivilege - extra = 0 - suit_classes = 'suit-tab suit-tab-sliceprivileges' - fields = ['user', 'slice', 'role'] - class SlicePrivilegeInline(PlStackTabularInline): model = SlicePrivilege suit_classes = 'suit-tab suit-tab-sliceprivileges' extra = 0 - fields = ('user', 'slice','role') + fields = ('backend_status', 'user', 'slice', 'role') def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'slice': - kwargs['queryset'] = Slice.select_by_user(request.user) + kwargs['queryset'] = Slice.select_by_user(request.user) if db_field.name == 'user': - kwargs['queryset'] = User.select_by_user(request.user) + kwargs['queryset'] = User.select_by_user(request.user) return super(SlicePrivilegeInline, self).formfield_for_foreignkey(db_field, request, **kwargs) def queryset(self, request): return SlicePrivilege.select_by_user(request.user) -class SliceNetworkROInline(ReadOnlyTabularInline): - model = Network.slices.through - extra = 0 - verbose_name = "Network Connection" - verbose_name_plural = "Network Connections" - suit_classes = 'suit-tab suit-tab-slicenetworks' - fields = ['network'] - class SliceNetworkInline(PlStackTabularInline): model = Network.slices.through selflink_fieldname = "network" @@ -437,15 +438,7 @@ class SliceNetworkInline(PlStackTabularInline): verbose_name = "Network Connection" verbose_name_plural = "Network Connections" suit_classes = 'suit-tab suit-tab-slicenetworks' - fields = ['network'] - -class ImageDeploymentsROInline(ReadOnlyTabularInline): - model = ImageDeployments - extra = 0 - verbose_name = "Image Deployments" - verbose_name_plural = "Image Deployments" - suit_classes = 'suit-tab suit-tab-imagedeployments' - fields = ['image', 'deployment', 'glance_image_id'] + fields = ['backend_status', 'network'] class ImageDeploymentsInline(PlStackTabularInline): model = ImageDeployments @@ -453,20 +446,12 @@ class ImageDeploymentsInline(PlStackTabularInline): verbose_name = "Image Deployments" verbose_name_plural = "Image Deployments" suit_classes = 'suit-tab suit-tab-imagedeployments' - fields = ['image', 'deployment', 'glance_image_id'] + fields = ['backend_status', 'image', 'deployment', 'glance_image_id'] readonly_fields = ['glance_image_id'] -class PlainTextWidget(forms.HiddenInput): - input_type = 'hidden' - - def render(self, name, value, attrs=None): - if value is None: - value = '' - return mark_safe(str(value) + super(PlainTextWidget, self).render(name, value, attrs)) - class PlanetStackBaseAdmin(ReadOnlyAwareAdmin): save_on_top = False - + def save_model(self, request, obj, form, change): obj.caller = request.user # update openstack connection to use this site/tenant @@ -583,11 +568,12 @@ class SiteAssocInline(PlStackTabularInline): class DeploymentAdmin(PlanetStackBaseAdmin): model = Deployment - fieldList = ['name','sites', 'images', 'accessControl'] + fieldList = ['backend_status', 'name', 'sites', 'images', 'accessControl'] fieldsets = [(None, {'fields': fieldList, 'classes':['suit-tab suit-tab-sites']})] inlines = [DeploymentPrivilegeInline,NodeInline,TagInline] # ,ImageDeploymentsInline] + list_display = ['backend_status_icon', 'name'] + list_display_links = ('backend_status_icon', 'name', ) - user_readonly_inlines = [DeploymentPrivilegeROInline,NodeROInline,TagROInline] # ,ImageDeploymentsROInline] user_readonly_fields = ['name'] suit_form_tabs =(('sites','Deployment Details'),('nodes','Nodes'),('deploymentprivileges','Privileges'),('tags','Tags')) # ,('imagedeployments','Images')) @@ -608,12 +594,6 @@ class DeploymentAdmin(PlanetStackBaseAdmin): return AdminFormMetaClass -class ServiceAttrAsTabROInline(ReadOnlyTabularInline): - model = ServiceAttribute - fields = ['name','value'] - extra = 0 - suit_classes = 'suit-tab suit-tab-serviceattrs' - class ServiceAttrAsTabInline(PlStackTabularInline): model = ServiceAttribute fields = ['name','value'] @@ -621,13 +601,13 @@ class ServiceAttrAsTabInline(PlStackTabularInline): suit_classes = 'suit-tab suit-tab-serviceattrs' class ServiceAdmin(PlanetStackBaseAdmin): - list_display = ("name","description","versionNumber","enabled","published") - fieldList = ["name","description","versionNumber","enabled","published"] + list_display = ("backend_status_icon","name","description","versionNumber","enabled","published") + list_display_links = ('backend_status_icon', 'name', ) + fieldList = ["backend_status","name","description","versionNumber","enabled","published"] fieldsets = [(None, {'fields': fieldList, 'classes':['suit-tab suit-tab-general']})] inlines = [ServiceAttrAsTabInline,SliceInline] user_readonly_fields = fieldList - user_readonly_inlines = [ServiceAttrAsTabROInline,SliceROInline] suit_form_tabs =(('general', 'Service Details'), ('slices','Slices'), @@ -635,7 +615,7 @@ class ServiceAdmin(PlanetStackBaseAdmin): ) class SiteAdmin(PlanetStackBaseAdmin): - fieldList = ['name', 'site_url', 'enabled', 'is_public', 'login_base', 'accountLink','location'] + fieldList = ['backend_status', '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']}), @@ -645,15 +625,15 @@ class SiteAdmin(PlanetStackBaseAdmin): ('siteprivileges','Privileges'), ('deployments','Deployments'), ('slices','Slices'), - ('nodes','Nodes'), + ('nodes','Nodes'), ('tags','Tags'), ) readonly_fields = ['accountLink'] user_readonly_fields = ['name', 'deployments','site_url', 'enabled', 'is_public', 'login_base', 'accountLink'] - user_readonly_inlines = [SliceROInline,UserROInline,TagROInline, NodeROInline, SitePrivilegeROInline,SiteDeploymentROInline] - list_display = ('name', 'login_base','site_url', 'enabled') + 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, NodeInline, SitePrivilegeInline, SiteDeploymentInline] search_fields = ['name'] @@ -699,11 +679,12 @@ class SiteAdmin(PlanetStackBaseAdmin): class SitePrivilegeAdmin(PlanetStackBaseAdmin): - fieldList = ['user', 'site', 'role'] + fieldList = ['backend_status', 'user', 'site', 'role'] fieldsets = [ (None, {'fields': fieldList, 'classes':['collapse']}) ] - list_display = ('user', 'site', 'role') + list_display = ('backend_status_icon', 'user', 'site', 'role') + list_display_links = list_display user_readonly_fields = fieldList user_readonly_inlines = [] @@ -746,18 +727,18 @@ class SliceForm(forms.ModelForm): class Meta: model = Slice widgets = { - 'service': LinkedSelect + 'service': LinkedSelect } class SliceAdmin(PlanetStackBaseAdmin): form = SliceForm - fieldList = ['name', 'site', 'serviceClass', 'enabled','description', 'service', 'slice_url', 'max_slivers'] + fieldList = ['backend_status', 'name', 'site', 'serviceClass', 'enabled','description', 'service', 'slice_url', 'max_slivers'] fieldsets = [('Slice Details', {'fields': fieldList, 'classes':['suit-tab suit-tab-general']}),] - list_display = ('name', 'site','serviceClass', 'slice_url', 'max_slivers') + list_display = ('backend_status_icon', 'name', 'site','serviceClass', 'slice_url', 'max_slivers') + list_display_links = ('backend_status_icon', 'name', ) inlines = [SlicePrivilegeInline,SliverInline, TagInline, ReservationInline,SliceNetworkInline] user_readonly_fields = fieldList - user_readonly_inlines = [SlicePrivilegeROInline,SliverROInline,TagROInline, ReservationROInline, SliceNetworkROInline] suit_form_tabs =(('general', 'Slice Details'), ('slicenetworks','Networks'), @@ -802,9 +783,10 @@ class SliceAdmin(PlanetStackBaseAdmin): class SlicePrivilegeAdmin(PlanetStackBaseAdmin): fieldsets = [ - (None, {'fields': ['user', 'slice', 'role']}) + (None, {'fields': ['backend_status', 'user', 'slice', 'role']}) ] - list_display = ('user', 'slice', 'role') + list_display = ('backend_status_icon', 'user', 'slice', 'role') + list_display_links = list_display user_readonly_fields = ['user', 'slice', 'role'] user_readonly_inlines = [] @@ -826,22 +808,22 @@ class SlicePrivilegeAdmin(PlanetStackBaseAdmin): def save_model(self, request, obj, form, change): # update openstack connection to use this site/tenant auth = request.session.get('auth', {}) - auth['tenant'] = obj.slice.name + auth['tenant'] = obj.slice.slicename obj.os_manager = OpenStackManager(auth=auth, caller=request.user) obj.save() def delete_model(self, request, obj): # update openstack connection to use this site/tenant auth = request.session.get('auth', {}) - auth['tenant'] = obj.slice.name + auth['tenant'] = obj.slice.slicename obj.os_manager = OpenStackManager(auth=auth, caller=request.user) obj.delete() class ImageAdmin(PlanetStackBaseAdmin): - fieldsets = [('Image Details', - {'fields': ['name', 'disk_format', 'container_format'], + fieldsets = [('Image Details', + {'fields': ['backend_status', 'name', 'disk_format', 'container_format'], 'classes': ['suit-tab suit-tab-general']}) ] @@ -850,8 +832,10 @@ class ImageAdmin(PlanetStackBaseAdmin): inlines = [SliverInline, ImageDeploymentsInline] user_readonly_fields = ['name', 'disk_format', 'container_format'] - user_readonly_inlines = [SliverROInline, ImageDeploymentsROInline] - + + list_display = ['backend_status_icon', 'name'] + list_display_links = ('backend_status_icon', 'name', ) + class NodeForm(forms.ModelForm): class Meta: widgets = { @@ -861,11 +845,12 @@ class NodeForm(forms.ModelForm): class NodeAdmin(PlanetStackBaseAdmin): form = NodeForm - list_display = ('name', 'site', 'deployment') + list_display = ('backend_status_icon', 'name', 'site', 'deployment') + list_display_links = ('backend_status_icon', 'name', ) list_filter = ('deployment',) inlines = [TagInline,SliverInline] - fieldsets = [('Node Details', {'fields': ['name','site','deployment'], 'classes':['suit-tab suit-tab-details']})] + fieldsets = [('Node Details', {'fields': ['backend_status', 'name','site','deployment'], 'classes':['suit-tab suit-tab-details']})] user_readonly_fields = ['name','site','deployment'] user_readonly_inlines = [TagInline,SliverInline] @@ -888,16 +873,18 @@ class SliverForm(forms.ModelForm): } class TagAdmin(PlanetStackBaseAdmin): - list_display = ['service', 'name', 'value', 'content_type', 'content_object',] + list_display = ['backend_status_icon', 'service', 'name', 'value', 'content_type', 'content_object',] + list_display_links = list_display user_readonly_fields = ['service', 'name', 'value', 'content_type', 'content_object',] user_readonly_inlines = [] class SliverAdmin(PlanetStackBaseAdmin): form = SliverForm fieldsets = [ - ('Sliver Details', {'fields': ['slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'numberCores', 'image', ], 'classes': ['suit-tab suit-tab-general'], }) + ('Sliver Details', {'fields': ['backend_status', 'slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'numberCores', 'image', ], 'classes': ['suit-tab suit-tab-general'], }) ] - list_display = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork'] + list_display = ['backend_status_icon', 'ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork'] + list_display_links = ('backend_status_icon', 'ip',) suit_form_tabs =(('general', 'Sliver Details'), ('tags','Tags'), @@ -906,7 +893,6 @@ class SliverAdmin(PlanetStackBaseAdmin): inlines = [TagInline] user_readonly_fields = ['slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'numberCores', 'image'] - user_readonly_inlines = [TagROInline] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'slice': @@ -915,7 +901,7 @@ class SliverAdmin(PlanetStackBaseAdmin): return super(SliverAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) def queryset(self, request): - # admins can see all slivers. Users can only see slivers of + # admins can see all slivers. Users can only see slivers of # the slices they belong to. return Sliver.select_by_user(request.user) @@ -923,11 +909,11 @@ class SliverAdmin(PlanetStackBaseAdmin): def get_formsets(self, request, obj=None): # make some fields read only if we are updating an existing record if obj == None: - #self.readonly_fields = ('ip', 'instance_name') - self.readonly_fields = () + #self.readonly_fields = ('ip', 'instance_name') + self.readonly_fields = () else: - self.readonly_fields = () - #self.readonly_fields = ('ip', 'instance_name', 'slice', 'image', 'key') + self.readonly_fields = () + #self.readonly_fields = ('ip', 'instance_name', 'slice', 'image', 'key') for inline in self.get_inline_instances(request, obj): # hide MyInline in the add view @@ -1003,12 +989,6 @@ class UserDashboardViewInline(PlStackTabularInline): suit_classes = 'suit-tab suit-tab-dashboards' fields = ['user', 'dashboardView', 'order'] -class UserDashboardViewROInline(ReadOnlyTabularInline): - model = UserDashboardView - extra = 0 - suit_classes = 'suit-tab suit-tab-dashboards' - fields = ['user', 'dashboardView', 'order'] - class UserAdmin(UserAdmin): class Meta: app_label = "core" @@ -1021,15 +1001,14 @@ class UserAdmin(UserAdmin): # 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 = ('email', 'username','firstname', 'lastname', 'is_admin', 'last_login') list_filter = ('site',) inlines = [SlicePrivilegeInline,SitePrivilegeInline,DeploymentPrivilegeInline,UserDashboardViewInline] - fieldListLoginDetails = ['email','site','password','is_readonly','is_amin','public_key'] + fieldListLoginDetails = ['email','site','password','is_active','is_readonly','is_admin','public_key'] fieldListContactInfo = ['firstname','lastname','phone','timezone'] fieldsets = ( - ('Login Details', {'fields': ['email', 'site','password', 'is_readonly', 'is_admin', 'public_key'], 'classes':['suit-tab suit-tab-general']}), + ('Login Details', {'fields': ['backend_status', 'email', 'site','password', 'is_active', 'is_readonly', 'is_admin', 'public_key'], 'classes':['suit-tab suit-tab-general']}), ('Contact Information', {'fields': ('firstname','lastname','phone', 'timezone'), 'classes':['suit-tab suit-tab-contact']}), #('Dashboard Views', {'fields': ('dashboards',), 'classes':['suit-tab suit-tab-dashboards']}), #('Important dates', {'fields': ('last_login',)}), @@ -1045,7 +1024,6 @@ class UserAdmin(UserAdmin): filter_horizontal = () user_readonly_fields = fieldListLoginDetails + fieldListContactInfo - user_readonly_inlines = [SlicePrivilegeROInline,SitePrivilegeROInline,DeploymentPrivilegeROInline,UserDashboardViewROInline] suit_form_tabs =(('general','Login Details'), ('contact','Contact Information'), @@ -1082,8 +1060,10 @@ class UserAdmin(UserAdmin): # save the original readonly fields self.readonly_save = self.readonly_fields self.inlines_save = self.inlines - self.readonly_fields=self.user_readonly_fields - self.inlines = self.user_readonly_inlines + if hasattr(self, "user_readonly_fields"): + self.readonly_fields=self.user_readonly_fields + if hasattr(self, "user_readonly_inlines"): + self.inlines = self.user_readonly_inlines else: if hasattr(self, "readonly_save"): # restore the original readonly fields @@ -1107,36 +1087,36 @@ class UserAdmin(UserAdmin): def queryset(self, request): return User.select_by_user(request.user) + def formfield_for_dbfield(self, db_field, **kwargs): + if (db_field.name == 'backend_status'): + kwargs['widget'] = BackendStatusFullWidget(attrs={"title": "foo"}) + result = super(UserAdmin, self).formfield_for_dbfield(db_field, **kwargs) + + if (db_field.name == 'backend_status'): + result.required = False + + return result + class DashboardViewAdmin(PlanetStackBaseAdmin): fieldsets = [('Dashboard View Details', - {'fields': ['name', 'url'], + {'fields': ['backend_status', 'name', 'url'], 'classes': ['suit-tab suit-tab-general']}) ] suit_form_tabs =(('general','Dashboard View Details'),) -class ServiceResourceROInline(ReadOnlyTabularInline): - model = ServiceResource - extra = 0 - fields = ['serviceClass', 'name', 'maxUnitsDeployment', 'maxUnitsNode', 'maxDuration', 'bucketInRate', 'bucketMaxSize', 'cost', 'calendarReservable'] - class ServiceResourceInline(PlStackTabularInline): model = ServiceResource extra = 0 class ServiceClassAdmin(PlanetStackBaseAdmin): - list_display = ('name', 'commitment', 'membershipFee') + list_display = ('backend_status_icon', 'name', 'commitment', 'membershipFee') + list_display_links = ('backend_status_icon', 'name', ) inlines = [ServiceResourceInline] user_readonly_fields = ['name', 'commitment', 'membershipFee'] user_readonly_inlines = [] -class ReservedResourceROInline(ReadOnlyTabularInline): - model = ReservedResource - extra = 0 - fields = ['sliver', 'resource','quantity','reservationSet'] - suit_classes = 'suit-tab suit-tab-reservedresources' - class ReservedResourceInline(PlStackTabularInline): model = ReservedResource extra = 0 @@ -1217,7 +1197,7 @@ class ReservationAddRefreshForm(ReservationAddForm): return False class ReservationAdmin(PlanetStackBaseAdmin): - fieldList = ['slice', 'startTime', 'duration'] + fieldList = ['backend_status', 'slice', 'startTime', 'duration'] fieldsets = [('Reservation Details', {'fields': fieldList, 'classes': ['suit-tab suit-tab-general']})] list_display = ('startTime', 'duration') form = ReservationAddForm @@ -1225,7 +1205,6 @@ class ReservationAdmin(PlanetStackBaseAdmin): suit_form_tabs = (('general','Reservation Details'), ('reservedresources','Reserved Resources')) inlines = [ReservedResourceInline] - user_readonly_inlines = [ReservedResourceROInline] user_readonly_fields = fieldList def add_view(self, request, form_url='', extra_context=None): @@ -1278,24 +1257,17 @@ class ReservationAdmin(PlanetStackBaseAdmin): return Reservation.select_by_user(request.user) class NetworkParameterTypeAdmin(PlanetStackBaseAdmin): - list_display = ("name", ) + list_display = ("backend_status_icon", "name", ) + list_display_links = ('backend_status_icon', 'name', ) user_readonly_fields = ['name'] user_readonly_inlines = [] class RouterAdmin(PlanetStackBaseAdmin): - list_display = ("name", ) + list_display = ("backend_status_icon", "name", ) + list_display_links = ('backend_status_icon', 'name', ) user_readonly_fields = ['name'] user_readonly_inlines = [] -class RouterROInline(ReadOnlyTabularInline): - model = Router.networks.through - extra = 0 - verbose_name_plural = "Routers" - verbose_name = "Router" - suit_classes = 'suit-tab suit-tab-routers' - - fields = ['name', 'owner', 'permittedNetworks', 'networks'] - class RouterInline(PlStackTabularInline): model = Router.networks.through extra = 0 @@ -1303,30 +1275,16 @@ class RouterInline(PlStackTabularInline): verbose_name = "Router" suit_classes = 'suit-tab suit-tab-routers' -class NetworkParameterROInline(ReadOnlyTabularInline): +class NetworkParameterInline(PlStackGenericTabularInline): model = NetworkParameter - extra = 1 - verbose_name_plural = "Parameters" - verbose_name = "Parameter" - suit_classes = 'suit-tab suit-tab-netparams' - fields = ['parameter', 'value', 'content_type', 'object_id', 'content_object'] - -class NetworkParameterInline(generic.GenericTabularInline): - model = NetworkParameter - extra = 1 + extra = 0 verbose_name_plural = "Parameters" verbose_name = "Parameter" suit_classes = 'suit-tab suit-tab-netparams' - -class NetworkSliversROInline(ReadOnlyTabularInline): - fields = ['network', 'sliver', 'ip', 'port_id'] - model = NetworkSliver - extra = 0 - verbose_name_plural = "Slivers" - verbose_name = "Sliver" - suit_classes = 'suit-tab suit-tab-networkslivers' + fields = ['backend_status', 'parameter', 'value'] class NetworkSliversInline(PlStackTabularInline): + fields = ['backend_status', 'network','sliver','ip'] readonly_fields = ("ip", ) model = NetworkSliver selflink_fieldname = "sliver" @@ -1335,14 +1293,6 @@ class NetworkSliversInline(PlStackTabularInline): verbose_name = "Sliver" suit_classes = 'suit-tab suit-tab-networkslivers' -class NetworkSlicesROInline(ReadOnlyTabularInline): - model = NetworkSlice - extra = 0 - verbose_name_plural = "Slices" - verbose_name = "Slice" - suit_classes = 'suit-tab suit-tab-networkslices' - fields = ['network','slice'] - class NetworkSlicesInline(PlStackTabularInline): model = NetworkSlice selflink_fieldname = "slice" @@ -1350,18 +1300,19 @@ class NetworkSlicesInline(PlStackTabularInline): verbose_name_plural = "Slices" verbose_name = "Slice" suit_classes = 'suit-tab suit-tab-networkslices' + fields = ['backend_status', 'network','slice'] class NetworkAdmin(PlanetStackBaseAdmin): - list_display = ("name", "subnet", "ports", "labels") + list_display = ("backend_status_icon", "name", "subnet", "ports", "labels") + list_display_links = ('backend_status_icon', 'name', ) readonly_fields = ("subnet", ) inlines = [NetworkParameterInline, NetworkSliversInline, NetworkSlicesInline, RouterInline] fieldsets = [ - (None, {'fields': ['name','template','ports','labels','owner','guaranteedBandwidth', 'permitAllSlices','permittedSlices','network_id','router_id','subnet_id','subnet'], 'classes':['suit-tab suit-tab-general']}),] + (None, {'fields': ['backend_status', 'name','template','ports','labels','owner','guaranteedBandwidth', 'permitAllSlices','permittedSlices','network_id','router_id','subnet_id','subnet'], 'classes':['suit-tab suit-tab-general']}),] user_readonly_fields = ['name','template','ports','labels','owner','guaranteedBandwidth', 'permitAllSlices','permittedSlices','network_id','router_id','subnet_id','subnet'] - user_readonly_inlines = [NetworkParameterROInline, NetworkSliversROInline, NetworkSlicesROInline, RouterROInline] suit_form_tabs =( ('general','Network Details'), @@ -1371,7 +1322,8 @@ class NetworkAdmin(PlanetStackBaseAdmin): ('routers','Routers'), ) class NetworkTemplateAdmin(PlanetStackBaseAdmin): - list_display = ("name", "guaranteedBandwidth", "visibility") + list_display = ("backend_status_icon", "name", "guaranteedBandwidth", "visibility") + list_display_links = ('backend_status_icon', 'name', ) user_readonly_fields = ["name", "guaranteedBandwidth", "visibility"] user_readonly_inlines = []