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 '<img src="/static/admin/img/icon_clock.gif">'
+ else:
+ return '<img src="/static/admin/img/icon_error.gif">'
+
+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('<div title="%s">%s</div>' % (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))
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('<div title="%s">%s</div>' % (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):
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 not request.user.isReadOnlyUser()
model = Reservation
extra = 0
suit_classes = 'suit-tab suit-tab-reservations'
-
+
def queryset(self, request):
return Reservation.select_by_user(request.user)
class SliverInline(PlStackTabularInline):
model = Sliver
- fields = ['all_ips_string', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node']
+ fields = ['backend_status', 'all_ips_string', 'instance_name', 'slice', 'numberCores', 'deploymentNetwork', 'image', 'node']
extra = 0
readonly_fields = ['all_ips_string', 'instance_name']
suit_classes = 'suit-tab suit-tab-slivers'
class UserInline(PlStackTabularInline):
model = User
- fields = ['email', 'firstname', 'lastname']
+ fields = ['backend_status', 'email', 'firstname', 'lastname']
extra = 0
suit_classes = 'suit-tab suit-tab-users'
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'
model = Node
extra = 0
suit_classes = 'suit-tab suit-tab-nodes'
- fields = ['name','deployment','site']
+ 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)
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':
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':
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)
verbose_name = "Network Connection"
verbose_name_plural = "Network Connections"
suit_classes = 'suit-tab suit-tab-slicenetworks'
- fields = ['network']
+ fields = ['backend_status', 'network']
class ImageDeploymentsInline(PlStackTabularInline):
model = ImageDeployments
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
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_fields = ['name']
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]
)
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']}),
('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']
- 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']
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 = []
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
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 = []
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']})
]
user_readonly_fields = ['name', 'disk_format', 'container_format']
+ list_display = ['backend_status_icon', 'name']
+ list_display_links = ('backend_status_icon', 'name', )
+
class NodeForm(forms.ModelForm):
class Meta:
widgets = {
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]
}
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'),
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)
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
fieldListContactInfo = ['firstname','lastname','phone','timezone']
fieldsets = (
- ('Login Details', {'fields': ['email', 'site','password', 'is_active', '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',)}),
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']})
]
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']
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
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 = []
verbose_name_plural = "Parameters"
verbose_name = "Parameter"
suit_classes = 'suit-tab suit-tab-netparams'
- fields = ['parameter', 'value']
+ fields = ['backend_status', 'parameter', 'value']
class NetworkSliversInline(PlStackTabularInline):
- fields = ['network','sliver','ip']
+ fields = ['backend_status', 'network','sliver','ip']
readonly_fields = ("ip", )
model = NetworkSliver
selflink_fieldname = "sliver"
verbose_name_plural = "Slices"
verbose_name = "Slice"
suit_classes = 'suit-tab suit-tab-networkslices'
- fields = ['network','slice']
+ 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']
('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 = []