blob: 730937a4d81597ca91adec9a5cd54b776c84079f [file] [log] [blame]
Siobhan Tully30fd4292013-05-10 08:59:56 -04001from core.models import Site
2from core.models import *
3from openstack.manager import OpenStackManager
Tony Macke59a7c82013-04-27 11:08:10 -04004
Tony Mack7130ac32013-03-22 21:58:00 -04005from django.contrib import admin
Siobhan Tully53437282013-04-26 19:30:27 -04006from django.contrib.auth.models import Group
Siobhan Tully4bc09f22013-04-10 21:15:21 -04007from django import forms
Tony Mackd90cdbf2013-04-16 22:48:40 -04008from django.utils.safestring import mark_safe
Tony Mack7130ac32013-03-22 21:58:00 -04009from django.contrib.auth.admin import UserAdmin
Siobhan Tully4bc09f22013-04-10 21:15:21 -040010from django.contrib.admin.widgets import FilteredSelectMultiple
Siobhan Tully53437282013-04-26 19:30:27 -040011from django.contrib.auth.forms import ReadOnlyPasswordHashField
Scott Bakeracd45142013-05-19 16:19:16 -070012from django.contrib.auth.signals import user_logged_in
13from django.utils import timezone
Siobhan Tullyde5450d2013-06-21 11:35:33 -040014from django.contrib.contenttypes import generic
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040015from suit.widgets import LinkedSelect
Tony Mack7130ac32013-03-22 21:58:00 -040016
Siobhan Tullyde5450d2013-06-21 11:35:33 -040017import django_evolution
Siobhan Tully4bc09f22013-04-10 21:15:21 -040018
Siobhan Tullyd3515752013-06-21 16:34:53 -040019class PlStackTabularInline(admin.TabularInline):
20 exclude = ['enacted']
21
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040022class ReservationInline(PlStackTabularInline):
23 model = Reservation
24 extra = 0
25 suit_classes = 'suit-tab suit-tab-reservations'
26
27
Siobhan Tullyd3515752013-06-21 16:34:53 -040028class ReadonlyTabularInline(PlStackTabularInline):
Siobhan Tully4bc09f22013-04-10 21:15:21 -040029 can_delete = False
30 extra = 0
31 editable_fields = []
32
33 def get_readonly_fields(self, request, obj=None):
34 fields = []
35 for field in self.model._meta.get_all_field_names():
36 if (not field == 'id'):
37 if (field not in self.editable_fields):
38 fields.append(field)
39 return fields
40
41 def has_add_permission(self, request):
42 return False
43
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040044class UserMembershipInline(generic.GenericTabularInline):
45 model = Member
46 exclude = ['enacted']
47 extra = 1
48 suit_classes = 'suit-tab suit-tab-membership'
49
50 def queryset(self, request):
51 qs = super(UserMembershipInline, self).queryset(request)
52 return qs.filter(user=request.user)
53
54class MemberInline(generic.GenericTabularInline):
55 model = Member
56 exclude = ['enacted']
57 extra = 1
58 suit_classes = 'suit-tab suit-tab-members'
59
Siobhan Tullyde5450d2013-06-21 11:35:33 -040060class TagInline(generic.GenericTabularInline):
61 model = Tag
62 exclude = ['enacted']
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040063 extra = 0
64 suit_classes = 'suit-tab suit-tab-tags'
Siobhan Tullyde5450d2013-06-21 11:35:33 -040065
Siobhan Tullyd3515752013-06-21 16:34:53 -040066class SliverInline(PlStackTabularInline):
Siobhan Tully4bc09f22013-04-10 21:15:21 -040067 model = Sliver
Tony Mackb0d97422013-06-10 09:57:45 -040068 fields = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
Siobhan Tully4bc09f22013-04-10 21:15:21 -040069 extra = 0
Tony Mack3777b012013-05-07 21:38:06 -040070 #readonly_fields = ['ip', 'instance_name', 'image']
71 readonly_fields = ['ip', 'instance_name']
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040072 suit_classes = 'suit-tab suit-tab-slivers'
Tony Mackc2835a92013-05-28 09:18:49 -040073
Siobhan Tully567e3e62013-06-21 18:03:16 -040074
Siobhan Tullyd3515752013-06-21 16:34:53 -040075class SiteInline(PlStackTabularInline):
Siobhan Tully4bc09f22013-04-10 21:15:21 -040076 model = Site
77 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040078 suit_classes = 'suit-tab suit-tab-sites'
Siobhan Tully4bc09f22013-04-10 21:15:21 -040079
Siobhan Tullyd3515752013-06-21 16:34:53 -040080class UserInline(PlStackTabularInline):
Siobhan Tully30fd4292013-05-10 08:59:56 -040081 model = User
Siobhan Tully47ae1b52013-05-10 15:53:14 -040082 fields = ['email', 'firstname', 'lastname']
Siobhan Tully30fd4292013-05-10 08:59:56 -040083 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040084 suit_classes = 'suit-tab suit-tab-users'
Siobhan Tully30fd4292013-05-10 08:59:56 -040085
Siobhan Tullyd3515752013-06-21 16:34:53 -040086class SliceInline(PlStackTabularInline):
Tony Mack00d361f2013-04-28 10:28:42 -040087 model = Slice
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040088 fields = ['name','enabled','description','slice_url']
Tony Mack00d361f2013-04-28 10:28:42 -040089 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040090 suit_classes = 'suit-tab suit-tab-slices'
91
Tony Mack00d361f2013-04-28 10:28:42 -040092
Siobhan Tullyd3515752013-06-21 16:34:53 -040093class RoleInline(PlStackTabularInline):
Tony Mack00d361f2013-04-28 10:28:42 -040094 model = Role
95 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040096 suit_classes = 'suit-tab suit-tab-roles'
Tony Mack00d361f2013-04-28 10:28:42 -040097
Siobhan Tullyd3515752013-06-21 16:34:53 -040098class NodeInline(PlStackTabularInline):
Siobhan Tully4bc09f22013-04-10 21:15:21 -040099 model = Node
100 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400101 suit_classes = 'suit-tab suit-tab-nodes'
102
103class SlicePrivilegeInline(PlStackTabularInline):
104 model = SlicePrivilege
105 extra = 0
106 suit_classes = 'suit-tab suit-tab-sliceprivileges'
107
108class DeploymentPrivilegeInline(PlStackTabularInline):
109 model = DeploymentPrivilege
110 extra = 0
111 suit_classes = 'suit-tab suit-tab-deploymentprivileges'
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400112
Siobhan Tullyd3515752013-06-21 16:34:53 -0400113class SitePrivilegeInline(PlStackTabularInline):
Siobhan Tullyaa1bcd52013-05-10 12:43:09 -0400114 model = SitePrivilege
115 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400116 suit_classes = 'suit-tab suit-tab-siteprivileges'
Siobhan Tullyaa1bcd52013-05-10 12:43:09 -0400117
Tony Mackc2835a92013-05-28 09:18:49 -0400118 def formfield_for_foreignkey(self, db_field, request, **kwargs):
119 if db_field.name == 'site':
120 if not request.user.is_admin:
121 # only show sites where user is an admin or pi
122 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
123 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
124 login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
125 sites = Site.objects.filter(login_base__in=login_bases)
126 kwargs['queryset'] = sites
127
128 if db_field.name == 'user':
129 if not request.user.is_admin:
130 # only show users from sites where caller has admin or pi role
131 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
132 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
133 sites = [site_privilege.site for site_privilege in site_privileges]
134 site_privileges = SitePrivilege.objects.filter(site__in=sites)
135 emails = [site_privilege.user.email for site_privilege in site_privileges]
136 users = User.objects.filter(email__in=emails)
137 kwargs['queryset'] = users
138 return super(SitePrivilegeInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
139
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400140class SitePrivilegeInline(PlStackTabularInline):
141 model = SitePrivilege
142 suit_classes = 'suit-tab suit-tab-siteprivileges'
Siobhan Tullyaa1bcd52013-05-10 12:43:09 -0400143 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400144 fields = ('user', 'site','role')
145
146class SlicePrivilegeInline(PlStackTabularInline):
147 model = SlicePrivilege
148 suit_classes = 'suit-tab suit-tab-sliceprivileges'
149 extra = 0
150 fields = ('user', 'slice','role')
Siobhan Tullyaa1bcd52013-05-10 12:43:09 -0400151
Tony Mackc2835a92013-05-28 09:18:49 -0400152 def formfield_for_foreignkey(self, db_field, request, **kwargs):
153 if db_field.name == 'slice':
154 if not request.user.is_admin:
155 # only show slices at sites where caller has admin or pi role
156 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
157 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
158 sites = [site_privilege.site for site_privilege in site_privileges]
159 slices = Slice.objects.filter(site__in=sites)
160 kwargs['queryset'] = slices
161 if db_field.name == 'user':
162 if not request.user.is_admin:
163 # only show users from sites where caller has admin or pi role
164 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
165 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
166 sites = [site_privilege.site for site_privilege in site_privileges]
167 site_privileges = SitePrivilege.objects.filter(site__in=sites)
168 emails = [site_privilege.user.email for site_privilege in site_privileges]
169 users = User.objects.filter(email__in=emails)
170 kwargs['queryset'] = list(users)
171
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400172 return super(SlicePrivilegeInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
Tony Mackc2835a92013-05-28 09:18:49 -0400173
Siobhan Tullyd3515752013-06-21 16:34:53 -0400174class SliceTagInline(PlStackTabularInline):
Scott Baker307e06f2013-05-21 17:25:56 -0700175 model = SliceTag
176 extra = 0
177
Tony Mack5e71a662013-05-03 23:30:41 -0400178class PlainTextWidget(forms.HiddenInput):
179 input_type = 'hidden'
180
181 def render(self, name, value, attrs=None):
182 if value is None:
183 value = ''
Tony Mack1d6b85f2013-05-07 18:49:14 -0400184 return mark_safe(str(value) + super(PlainTextWidget, self).render(name, value, attrs))
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400185
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400186class PlanetStackBaseAdmin(admin.ModelAdmin):
187 save_on_top = False
Siobhan Tullyd3515752013-06-21 16:34:53 -0400188 exclude = ['enacted']
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400189
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400190#class RoleMemberForm(forms.ModelForm):
191# request=None
192# member=forms.ModelChoiceField(queryset=Member.objects.all()) #first get all
193#
194# def __init__(self,fata=None,files=None,auto_id='id_%s',prefix=None,initial=None,error_class=ErrorList,label_suffix=':',empty_permitted=False,instance=None):
195# super(RoleMemberForm,self).__init__data,files,auto_id,prefix,initial,error_class,label_suffix,empty_permitted,instance)
196#
197# self.fields["member"].queryset = member.objects.filter(
198
199class RoleMemberInline (admin.StackedInline):
200 model = Member
201# form = RoleMemberForm
202
203 def get_formset(self,request,obj=None, **kwargs):
204 self.form.request=request
205 return super(RoleMemberInline, self).get_formset(request, obj, **kwargs)
206
207class SliceRoleAdmin(PlanetStackBaseAdmin):
208 model = SliceRole
209 pass
210
211class SiteRoleAdmin(PlanetStackBaseAdmin):
212 model = SiteRole
213 pass
214
Tony Mack0553f282013-06-10 22:54:50 -0400215class RoleAdmin(PlanetStackBaseAdmin):
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400216 fieldsets = [
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400217 ('Role', {'fields': ['role_type', 'description','content_type'],
218 'classes':['collapse']})
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400219 ]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400220 inlines = [ MemberInline,]
221 list_display = ('role_type','description','content_type')
Tony Mackfdd4d802013-04-27 13:02:33 -0400222
Siobhan Tully567e3e62013-06-21 18:03:16 -0400223
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400224class DeploymentAdminForm(forms.ModelForm):
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400225 sites = forms.ModelMultipleChoiceField(
226 queryset=Site.objects.all(),
227 required=False,
228 widget=FilteredSelectMultiple(
229 verbose_name=('Sites'), is_stacked=False
230 )
231 )
232 class Meta:
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400233 model = Deployment
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400234
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400235
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400236class DeploymentAdmin(PlanetStackBaseAdmin):
237 form = DeploymentAdminForm
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400238 inlines = [MemberInline,NodeInline,SliverInline,TagInline]
239 fieldsets = [
240 (None, {'fields': ['sites'], 'classes':['suit-tab suit-tab-sites']}),]
241 suit_form_tabs =(('sites', 'Sites'),('nodes','Nodes'),('members','Members'),('tags','Tags'))
Tony Mack5cd13202013-05-01 21:48:38 -0400242
Tony Mack0553f282013-06-10 22:54:50 -0400243class SiteAdmin(PlanetStackBaseAdmin):
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400244 fieldsets = [
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400245 (None, {'fields': ['name', 'site_url', 'enabled', 'is_public', 'login_base', 'location'], 'classes':['suit-tab suit-tab-general']}),
246 ('Deployment Networks', {'fields': ['deployments'], 'classes':['suit-tab suit-tab-deployments']}),
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400247 ]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400248 suit_form_tabs =(('general', 'Site Details'),
249 ('users','Users'),
250 ('members','Privileges'),
251 ('deployments','Deployments'),
252 ('slices','Slices'),
253 ('nodes','Nodes'),
254 ('tags','Tags'),
255 )
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400256 list_display = ('name', 'login_base','site_url', 'enabled')
257 filter_horizontal = ('deployments',)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400258 inlines = [SliceInline,UserInline,TagInline, NodeInline, MemberInline]
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400259 search_fields = ['name']
260
Tony Mack04062832013-05-10 08:22:44 -0400261 def queryset(self, request):
262 # admins can see all keys. Users can only see sites they belong to.
263 qs = super(SiteAdmin, self).queryset(request)
264 if not request.user.is_admin:
265 valid_sites = [request.user.site.login_base]
266 roles = request.user.get_roles()
267 for tenant_list in roles.values():
268 valid_sites.extend(tenant_list)
269 qs = qs.filter(login_base__in=valid_sites)
270 return qs
271
Tony Mack5cd13202013-05-01 21:48:38 -0400272 def get_formsets(self, request, obj=None):
273 for inline in self.get_inline_instances(request, obj):
274 # hide MyInline in the add view
275 if obj is None:
276 continue
Tony Mack2bd5b412013-06-11 21:05:06 -0400277 if isinstance(inline, SliceInline):
278 inline.model.caller = request.user
279 yield inline.get_formset(request, obj)
280
281 def get_formsets(self, request, obj=None):
282 for inline in self.get_inline_instances(request, obj):
283 # hide MyInline in the add view
284 if obj is None:
285 continue
286 if isinstance(inline, SliverInline):
287 inline.model.caller = request.user
Tony Mack5cd13202013-05-01 21:48:38 -0400288 yield inline.get_formset(request, obj)
289
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400290class SitePrivilegeAdmin(PlanetStackBaseAdmin):
Tony Mack00d361f2013-04-28 10:28:42 -0400291 fieldsets = [
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400292 (None, {'fields': ['user', 'site', 'role'], 'classes':['collapse']})
Tony Mack00d361f2013-04-28 10:28:42 -0400293 ]
294 list_display = ('user', 'site', 'role')
295
Tony Mackc2835a92013-05-28 09:18:49 -0400296 def formfield_for_foreignkey(self, db_field, request, **kwargs):
297 if db_field.name == 'site':
298 if not request.user.is_admin:
299 # only show sites where user is an admin or pi
300 sites = set()
301 for site_privilege in SitePrivilege.objects.filer(user=request.user):
302 if site_privilege.role.role_type in ['admin', 'pi']:
303 sites.add(site_privilege.site)
304 kwargs['queryset'] = Site.objects.filter(site__in=list(sites))
305
306 if db_field.name == 'user':
307 if not request.user.is_admin:
308 # only show users from sites where caller has admin or pi role
309 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
310 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
311 sites = [site_privilege.site for site_privilege in site_privileges]
312 site_privileges = SitePrivilege.objects.filter(site__in=sites)
313 emails = [site_privilege.user.email for site_privilege in site_privileges]
314 users = User.objects.filter(email__in=emails)
315 kwargs['queryset'] = users
316
317 return super(SitePrivilegeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
318
Tony Mack04062832013-05-10 08:22:44 -0400319 def queryset(self, request):
320 # admins can see all privileges. Users can only see privileges at sites
Tony Mackc2835a92013-05-28 09:18:49 -0400321 # where they have the admin role or pi role.
Tony Mack04062832013-05-10 08:22:44 -0400322 qs = super(SitePrivilegeAdmin, self).queryset(request)
323 if not request.user.is_admin:
Tony Mackc2835a92013-05-28 09:18:49 -0400324 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
325 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
326 login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
327 sites = Site.objects.filter(login_base__in=login_bases)
328 qs = qs.filter(site__in=sites)
Tony Mack04062832013-05-10 08:22:44 -0400329 return qs
330
Tony Mack2bd5b412013-06-11 21:05:06 -0400331class SliceAdmin(PlanetStackBaseAdmin):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400332 fieldsets = [('Slice Details', {'fields': ['name', 'site', 'serviceClass', 'description', 'slice_url'], 'classes':['suit-tab suit-tab-general']}),]
Siobhan Tully30fd4292013-05-10 08:59:56 -0400333 list_display = ('name', 'site','serviceClass', 'slice_url')
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400334 inlines = [SlicePrivilegeInline,SliverInline, TagInline, ReservationInline]
335
336
337 suit_form_tabs =(('general', 'Slice Details'),
338 ('sliceprivileges','Privileges'),
339 ('slivers','Slivers'),
340 ('tags','Tags'),
341 ('reservations','Reservations'),
342 )
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400343
Tony Mackc2835a92013-05-28 09:18:49 -0400344 def formfield_for_foreignkey(self, db_field, request, **kwargs):
345 if db_field.name == 'site':
346 if not request.user.is_admin:
347 # only show sites where user is a pi or admin
348 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
349 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
350 login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
351 sites = Site.objects.filter(login_base__in=login_bases)
352 kwargs['queryset'] = sites
353
354 return super(SliceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
355
Tony Mack04062832013-05-10 08:22:44 -0400356 def queryset(self, request):
357 # admins can see all keys. Users can only see slices they belong to.
358 qs = super(SliceAdmin, self).queryset(request)
359 if not request.user.is_admin:
360 valid_slices = []
361 roles = request.user.get_roles()
362 for tenant_list in roles.values():
363 valid_slices.extend(tenant_list)
364 qs = qs.filter(name__in=valid_slices)
365 return qs
366
Tony Mack79748612013-05-01 14:52:03 -0400367 def get_formsets(self, request, obj=None):
368 for inline in self.get_inline_instances(request, obj):
369 # hide MyInline in the add view
370 if obj is None:
371 continue
Tony Mack2bd5b412013-06-11 21:05:06 -0400372 if isinstance(inline, SliverInline):
373 inline.model.caller = request.user
Tony Mack79748612013-05-01 14:52:03 -0400374 yield inline.get_formset(request, obj)
375
Tony Mackfdd4d802013-04-27 13:02:33 -0400376 def get_queryset(self, request):
377 qs = super(SliceAdmin, self).get_queryset(request)
378 if request.user.is_superuser:
379 return qs
380 # users can only see slices at their site
Tony Mack2bd5b412013-06-11 21:05:06 -0400381 return qs.filter(site=request.user.site)
382
383 def save_model(self, request, obj, form, change):
384 # update openstack connection to use this site/tenant
385 obj.caller = request.user
386 obj.save()
Tony Mackfdd4d802013-04-27 13:02:33 -0400387
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400388class SlicePrivilegeAdmin(PlanetStackBaseAdmin):
Tony Mack00d361f2013-04-28 10:28:42 -0400389 fieldsets = [
390 (None, {'fields': ['user', 'slice', 'role']})
391 ]
392 list_display = ('user', 'slice', 'role')
Tony Mack00d361f2013-04-28 10:28:42 -0400393
Tony Mackc2835a92013-05-28 09:18:49 -0400394 def formfield_for_foreignkey(self, db_field, request, **kwargs):
395 if db_field.name == 'slice':
396 if not request.user.is_admin:
397 # only show slices at sites where caller has admin or pi role
398 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
399 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
400 sites = [site_privilege.site for site_privilege in site_privileges]
401 slices = Slice.objects.filter(site__in=sites)
402 kwargs['queryset'] = slices
403
404 if db_field.name == 'user':
405 if not request.user.is_admin:
406 # only show users from sites where caller has admin or pi role
407 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
408 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
409 sites = [site_privilege.site for site_privilege in site_privileges]
410 site_privileges = SitePrivilege.objects.filter(site__in=sites)
411 emails = [site_privilege.user.email for site_privilege in site_privileges]
412 users = User.objects.filter(email__in=emails)
413 kwargs['queryset'] = users
414
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400415 return super(SlicePrivilegeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Tony Mackc2835a92013-05-28 09:18:49 -0400416
Tony Mack04062832013-05-10 08:22:44 -0400417 def queryset(self, request):
418 # admins can see all memberships. Users can only see memberships of
419 # slices where they have the admin role.
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400420 qs = super(SlicePrivilegeAdmin, self).queryset(request)
Tony Mack04062832013-05-10 08:22:44 -0400421 if not request.user.is_admin:
Tony Mackc2835a92013-05-28 09:18:49 -0400422 roles = Role.objects.filter(role_type__in=['admin', 'pi'])
423 site_privileges = SitePrivilege.objects.filter(user=request.user).filter(role__in=roles)
424 login_bases = [site_privilege.site.login_base for site_privilege in site_privileges]
425 sites = Site.objects.filter(login_base__in=login_bases)
426 slices = Slice.objects.filter(site__in=sites)
427 qs = qs.filter(slice__in=slices)
Tony Mack04062832013-05-10 08:22:44 -0400428 return qs
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400429
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400430 def save_model(self, request, obj, form, change):
Tony Mack951dab42013-05-02 19:51:45 -0400431 # update openstack connection to use this site/tenant
432 auth = request.session.get('auth', {})
433 auth['tenant'] = obj.slice.name
434 obj.os_manager = OpenStackManager(auth=auth, caller=request.user)
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400435 obj.save()
436
437 def delete_model(self, request, obj):
Tony Mack951dab42013-05-02 19:51:45 -0400438 # update openstack connection to use this site/tenant
439 auth = request.session.get('auth', {})
440 auth['tenant'] = obj.slice.name
441 obj.os_manager = OpenStackManager(auth=auth, caller=request.user)
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400442 obj.delete()
443
Siobhan Tully567e3e62013-06-21 18:03:16 -0400444
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400445class ImageAdmin(PlanetStackBaseAdmin):
446
447 fieldsets = [('Image Details',
448 {'fields': ['image_id', 'name', 'disk_format', 'container_format'],
449 'classes': ['suit-tab suit-tab-general']})
450 ]
451
452 suit_form_tabs =(('general','Image Details'),('slivers','Slivers'))
453
454 inlines = [SliverInline]
455
456class NodeForm(forms.ModelForm):
457 class Meta:
458 widgets = {
459 'site': LinkedSelect,
460 'deployment': LinkedSelect
461 }
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400462
463class NodeAdmin(admin.ModelAdmin):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400464 form = NodeForm
465 exclude = ['enacted']
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400466 list_display = ('name', 'site', 'deployment')
467 list_filter = ('deployment',)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400468 inlines = [TagInline,SliverInline]
469 fieldsets = [('Node Details', {'fields': ['name','site','deployment'], 'classes':['suit-tab suit-tab-details']})]
470
471 suit_form_tabs =(('details','Node Details'),('slivers','Slivers'),('tags','Tags'))
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400472
Siobhan Tully567e3e62013-06-21 18:03:16 -0400473
Tony Mackd90cdbf2013-04-16 22:48:40 -0400474class SliverForm(forms.ModelForm):
475 class Meta:
Tony Mack1d6b85f2013-05-07 18:49:14 -0400476 model = Sliver
Tony Mackd90cdbf2013-04-16 22:48:40 -0400477 ip = forms.CharField(widget=PlainTextWidget)
Tony Mack18261812013-05-02 16:39:20 -0400478 instance_name = forms.CharField(widget=PlainTextWidget)
Tony Mackd90cdbf2013-04-16 22:48:40 -0400479 widgets = {
480 'ip': PlainTextWidget(),
Tony Mack18261812013-05-02 16:39:20 -0400481 'instance_name': PlainTextWidget(),
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400482 'slice': LinkedSelect,
483 'deploymentNetwork': LinkedSelect,
484 'node': LinkedSelect,
485 'image': LinkedSelect
Siobhan Tully53437282013-04-26 19:30:27 -0400486 }
Tony Mackd90cdbf2013-04-16 22:48:40 -0400487
Siobhan Tullyd3515752013-06-21 16:34:53 -0400488class ProjectAdmin(admin.ModelAdmin):
489 exclude = ['enacted']
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400490 inlines = [TagInline]
491
492class MemberAdmin(admin.ModelAdmin):
493 exclude = ['enacted']
494 list_display = ['role', 'rightContent_type', 'content_type', 'content_object',]
Siobhan Tullyd3515752013-06-21 16:34:53 -0400495
496class TagAdmin(admin.ModelAdmin):
497 exclude = ['enacted']
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400498 list_display = ['project', 'name', 'value', 'content_type', 'content_object',]
Siobhan Tullyd3515752013-06-21 16:34:53 -0400499
Tony Mack9bcbe4f2013-04-29 08:13:27 -0400500class SliverAdmin(PlanetStackBaseAdmin):
Tony Mackd90cdbf2013-04-16 22:48:40 -0400501 form = SliverForm
Tony Mackcdec0902013-04-15 00:38:49 -0400502 fieldsets = [
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400503 ('Sliver Details', {'fields': ['slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'numberCores', 'image', ], 'classes': ['suit-tab suit-tab-general'], })
Tony Mackcdec0902013-04-15 00:38:49 -0400504 ]
Siobhan Tully5d7dc8d2013-07-02 13:17:33 -0400505 list_display = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400506
507 suit_form_tabs =(('general', 'Sliver Details'),
508 ('tags','Tags'),
509 )
510
Siobhan Tullyde5450d2013-06-21 11:35:33 -0400511 inlines = [TagInline]
Tony Mack53106f32013-04-27 16:43:01 -0400512
Tony Mackc2835a92013-05-28 09:18:49 -0400513 def formfield_for_foreignkey(self, db_field, request, **kwargs):
514 if db_field.name == 'slice':
515 if not request.user.is_admin:
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400516 slices = set([sm.slice.name for sm in SlicePrivilege.objects.filter(user=request.user)])
Tony Mackc2835a92013-05-28 09:18:49 -0400517 kwargs['queryset'] = Slice.objects.filter(name__in=list(slices))
518
519 return super(SliverAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
520
Tony Mack04062832013-05-10 08:22:44 -0400521 def queryset(self, request):
522 # admins can see all slivers. Users can only see slivers of
523 # the slices they belong to.
524 qs = super(SliverAdmin, self).queryset(request)
525 if not request.user.is_admin:
526 tenants = []
527 roles = request.user.get_roles()
528 for tenant_list in roles.values():
529 tenants.extend(tenant_list)
530 valid_slices = Slice.objects.filter(name__in=tenants)
531 qs = qs.filter(slice__in=valid_slices)
532 return qs
533
Tony Mack1d6b85f2013-05-07 18:49:14 -0400534 def get_formsets(self, request, obj=None):
535 # make some fields read only if we are updating an existing record
536 if obj == None:
537 #self.readonly_fields = ('ip', 'instance_name')
538 self.readonly_fields = ()
539 else:
Tony Mack1e889462013-05-10 21:34:54 -0400540 self.readonly_fields = ()
541 #self.readonly_fields = ('ip', 'instance_name', 'slice', 'image', 'key')
Tony Mack1d6b85f2013-05-07 18:49:14 -0400542
543 for inline in self.get_inline_instances(request, obj):
544 # hide MyInline in the add view
545 if obj is None:
546 continue
547 # give inline object access to driver and caller
548 auth = request.session.get('auth', {})
549 auth['tenant'] = obj.name # meed to connect using slice's tenant
550 inline.model.os_manager = OpenStackManager(auth=auth, caller=request.user)
551 yield inline.get_formset(request, obj)
Tony Mack53106f32013-04-27 16:43:01 -0400552
553 def save_model(self, request, obj, form, change):
Tony Mack951dab42013-05-02 19:51:45 -0400554 # update openstack connection to use this site/tenant
555 auth = request.session.get('auth', {})
556 auth['tenant'] = obj.slice.name
557 obj.os_manager = OpenStackManager(auth=auth, caller=request.user)
Tony Mackb0d97422013-06-10 09:57:45 -0400558 obj.creator = request.user
Tony Mack53106f32013-04-27 16:43:01 -0400559 obj.save()
560
561 def delete_model(self, request, obj):
Tony Mack951dab42013-05-02 19:51:45 -0400562 # update openstack connection to use this site/tenant
563 auth = request.session.get('auth', {})
564 auth['tenant'] = obj.slice.name
565 obj.os_manager = OpenStackManager(auth=auth, caller=request.user)
Tony Mack53106f32013-04-27 16:43:01 -0400566 obj.delete()
Tony Mackcdec0902013-04-15 00:38:49 -0400567
Siobhan Tully53437282013-04-26 19:30:27 -0400568class UserCreationForm(forms.ModelForm):
569 """A form for creating new users. Includes all the required
570 fields, plus a repeated password."""
571 password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
572 password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
573
574 class Meta:
Siobhan Tully30fd4292013-05-10 08:59:56 -0400575 model = User
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400576 fields = ('email', 'firstname', 'lastname', 'phone', 'public_key')
Siobhan Tully53437282013-04-26 19:30:27 -0400577
578 def clean_password2(self):
579 # Check that the two password entries match
580 password1 = self.cleaned_data.get("password1")
581 password2 = self.cleaned_data.get("password2")
582 if password1 and password2 and password1 != password2:
583 raise forms.ValidationError("Passwords don't match")
584 return password2
585
586 def save(self, commit=True):
587 # Save the provided password in hashed format
588 user = super(UserCreationForm, self).save(commit=False)
Tony Mackf9f4afb2013-05-01 21:02:12 -0400589 user.password = self.cleaned_data["password1"]
590 #user.set_password(self.cleaned_data["password1"])
Siobhan Tully53437282013-04-26 19:30:27 -0400591 if commit:
592 user.save()
593 return user
594
Siobhan Tully567e3e62013-06-21 18:03:16 -0400595
Siobhan Tully53437282013-04-26 19:30:27 -0400596class UserChangeForm(forms.ModelForm):
597 """A form for updating users. Includes all the fields on
598 the user, but replaces the password field with admin's
599 password hash display field.
600 """
601 password = ReadOnlyPasswordHashField()
602
603 class Meta:
Siobhan Tully30fd4292013-05-10 08:59:56 -0400604 model = User
Siobhan Tully53437282013-04-26 19:30:27 -0400605
606 def clean_password(self):
607 # Regardless of what the user provides, return the initial value.
608 # This is done here, rather than on the field, because the
609 # field does not have access to the initial value
610 return self.initial["password"]
611
Siobhan Tully567e3e62013-06-21 18:03:16 -0400612
Tony Mack2bd5b412013-06-11 21:05:06 -0400613class UserAdmin(UserAdmin):
Siobhan Tully53437282013-04-26 19:30:27 -0400614 class Meta:
615 app_label = "core"
616
617 # The forms to add and change user instances
618 form = UserChangeForm
619 add_form = UserCreationForm
620
621 # The fields to be used in displaying the User model.
622 # These override the definitions on the base UserAdmin
623 # that reference specific fields on auth.User.
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400624 list_display = ('email', 'username','firstname', 'lastname', 'is_admin', 'last_login')
625 list_filter = ()
626 inlines = [SlicePrivilegeInline,SitePrivilegeInline,DeploymentPrivilegeInline]
Siobhan Tully53437282013-04-26 19:30:27 -0400627 fieldsets = (
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400628 ('Login Details', {'fields': ('email', 'username','site','password', 'is_admin', 'public_key'), 'classes':['suit-tab suit-tab-general']}),
629 ('Contact Information', {'fields': ('firstname','lastname','phone', 'timezone'), 'classes':['suit-tab suit-tab-contact']}),
Siobhan Tully53437282013-04-26 19:30:27 -0400630 #('Important dates', {'fields': ('last_login',)}),
631 )
632 add_fieldsets = (
633 (None, {
634 'classes': ('wide',),
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400635 'fields': ('email', 'username','firstname', 'lastname', 'phone', 'public_key','password1', 'password2')}
Siobhan Tully53437282013-04-26 19:30:27 -0400636 ),
637 )
638 search_fields = ('email',)
639 ordering = ('email',)
640 filter_horizontal = ()
641
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400642 suit_form_tabs =(('general','Login Details'),('contact','Contact Information'),('sliceprivileges','Slice Privileges'),('siteprivileges','Site Privileges'),('deploymentprivileges','Deployment Privileges'))
643
Tony Mackc2835a92013-05-28 09:18:49 -0400644 def formfield_for_foreignkey(self, db_field, request, **kwargs):
645 if db_field.name == 'site':
646 if not request.user.is_admin:
647 # show sites where caller is an admin or pi
648 sites = []
649 for site_privilege in SitePrivilege.objects.filer(user=request.user):
650 if site_privilege.role.role_type in ['admin', 'pi']:
651 sites.append(site_privilege.site.login_base)
652 kwargs['queryset'] = Site.objects.filter(login_base__in(list(sites)))
653
654 return super(UserAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
655
Scott Baker3de3e372013-05-10 16:50:44 -0700656class ServiceResourceInline(admin.TabularInline):
smbaker4ff4f562013-06-30 23:48:25 -0700657 exclude = ['enacted']
Scott Baker3de3e372013-05-10 16:50:44 -0700658 model = ServiceResource
659 extra = 0
660
661class ServiceClassAdmin(admin.ModelAdmin):
smbaker4ff4f562013-06-30 23:48:25 -0700662 exclude = ['enacted']
Scott Baker3de3e372013-05-10 16:50:44 -0700663 list_display = ('name', 'commitment', 'membershipFee')
664 inlines = [ServiceResourceInline]
665
Scott Baker133c9212013-05-17 09:09:11 -0700666class ReservedResourceInline(admin.TabularInline):
smbakera3cf70c2013-06-27 02:01:41 -0700667 exclude = ['enacted']
Scott Baker133c9212013-05-17 09:09:11 -0700668 model = ReservedResource
669 extra = 0
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400670 suit_classes = 'suit-tab suit-tab-reservedresources'
Scott Baker133c9212013-05-17 09:09:11 -0700671
672 def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
673 field = super(ReservedResourceInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
674
675 if db_field.name == 'resource':
676 # restrict resources to those that the slice's service class allows
677 if request._slice is not None:
678 field.queryset = field.queryset.filter(serviceClass = request._slice.serviceClass, calendarReservable=True)
679 if len(field.queryset) > 0:
680 field.initial = field.queryset.all()[0]
681 else:
682 field.queryset = field.queryset.none()
683 elif db_field.name == 'sliver':
684 # restrict slivers to those that belong to the slice
685 if request._slice is not None:
686 field.queryset = field.queryset.filter(slice = request._slice)
687 else:
688 field.queryset = field.queryset.none()
689
690 return field
691
692class ReservationChangeForm(forms.ModelForm):
693 class Meta:
694 model = Reservation
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400695 widgets = {
696 'slice' : LinkedSelect
697 }
Scott Baker133c9212013-05-17 09:09:11 -0700698
699class ReservationAddForm(forms.ModelForm):
700 slice = forms.ModelChoiceField(queryset=Slice.objects.all(), widget=forms.Select(attrs={"onChange":"document.getElementById('id_refresh').value=1; submit()"}))
701 refresh = forms.CharField(widget=forms.HiddenInput())
702
703 class Media:
704 css = {'all': ('planetstack.css',)} # .field-refresh { display: none; }
705
706 def clean_slice(self):
707 slice = self.cleaned_data.get("slice")
708 x = ServiceResource.objects.filter(serviceClass = slice.serviceClass, calendarReservable=True)
709 if len(x) == 0:
710 raise forms.ValidationError("The slice you selected does not have a service class that allows reservations")
711 return slice
712
713 class Meta:
714 model = Reservation
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400715 widgets = {
716 'slice' : LinkedSelect
717 }
718
Scott Baker133c9212013-05-17 09:09:11 -0700719
720class ReservationAddRefreshForm(ReservationAddForm):
721 """ This form is displayed when the Reservation Form receives an update
722 from the Slice dropdown onChange handler. It doesn't validate the
723 data and doesn't save the data. This will cause the form to be
724 redrawn.
725 """
726
Scott Baker8737e5f2013-05-17 09:35:32 -0700727 """ don't validate anything other than slice """
728 dont_validate_fields = ("startTime", "duration")
729
Scott Baker133c9212013-05-17 09:09:11 -0700730 def full_clean(self):
731 result = super(ReservationAddForm, self).full_clean()
Scott Baker8737e5f2013-05-17 09:35:32 -0700732
733 for fieldname in self.dont_validate_fields:
734 if fieldname in self._errors:
735 del self._errors[fieldname]
736
Scott Baker133c9212013-05-17 09:09:11 -0700737 return result
738
739 """ don't save anything """
740 def is_valid(self):
741 return False
742
743class ReservationAdmin(admin.ModelAdmin):
smbakera3cf70c2013-06-27 02:01:41 -0700744 exclude = ['enacted']
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400745 fieldsets = [('Reservation Details', {'fields': ['startTime', 'duration','slice'], 'classes': ['suit-tab suit-tab-general']})]
Scott Baker133c9212013-05-17 09:09:11 -0700746 list_display = ('startTime', 'duration')
Scott Baker133c9212013-05-17 09:09:11 -0700747 form = ReservationAddForm
748
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400749 suit_form_tabs = (('general','Reservation Details'), ('reservedresources','Reserved Resources'))
750
751 inlines = [ReservedResourceInline]
752
Scott Baker133c9212013-05-17 09:09:11 -0700753 def add_view(self, request, form_url='', extra_context=None):
Scott Bakeracd45142013-05-19 16:19:16 -0700754 timezone.activate(request.user.timezone)
Scott Baker133c9212013-05-17 09:09:11 -0700755 request._refresh = False
756 request._slice = None
757 if request.method == 'POST':
Scott Baker8737e5f2013-05-17 09:35:32 -0700758 # "refresh" will be set to "1" if the form was submitted due to
759 # a change in the Slice dropdown.
Scott Baker133c9212013-05-17 09:09:11 -0700760 if request.POST.get("refresh","1") == "1":
761 request._refresh = True
762 request.POST["refresh"] = "0"
Scott Baker8737e5f2013-05-17 09:35:32 -0700763
764 # Keep track of the slice that was selected, so the
765 # reservedResource inline can filter items for the slice.
Scott Baker133c9212013-05-17 09:09:11 -0700766 request._slice = request.POST.get("slice",None)
767 if (request._slice is not None):
768 request._slice = Slice.objects.get(id=request._slice)
769
770 result = super(ReservationAdmin, self).add_view(request, form_url, extra_context)
771 return result
772
Scott Bakeracd45142013-05-19 16:19:16 -0700773 def changelist_view(self, request, extra_context = None):
774 timezone.activate(request.user.timezone)
775 return super(ReservationAdmin, self).changelist_view(request, extra_context)
776
Scott Baker133c9212013-05-17 09:09:11 -0700777 def get_form(self, request, obj=None, **kwargs):
Siobhan Tullyd3515752013-06-21 16:34:53 -0400778 request._obj_ = obj
779 if obj is not None:
780 # For changes, set request._slice to the slice already set in the
781 # object.
782 request._slice = obj.slice
783 self.form = ReservationChangeForm
784 else:
785 if getattr(request, "_refresh", False):
786 self.form = ReservationAddRefreshForm
787 else:
788 self.form = ReservationAddForm
789 return super(ReservationAdmin, self).get_form(request, obj, **kwargs)
790
Scott Baker133c9212013-05-17 09:09:11 -0700791 def get_readonly_fields(self, request, obj=None):
Siobhan Tullyd3515752013-06-21 16:34:53 -0400792 if (obj is not None):
793 # Prevent slice from being changed after the reservation has been
794 # created.
795 return ['slice']
796 else:
Scott Baker133c9212013-05-17 09:09:11 -0700797 return []
Scott Baker3de3e372013-05-10 16:50:44 -0700798
Tony Mack31c2b8f2013-04-26 20:01:42 -0400799# register a signal that caches the user's credentials when they log in
800def cache_credentials(sender, user, request, **kwds):
801 auth = {'username': request.POST['username'],
802 'password': request.POST['password']}
803 request.session['auth'] = auth
804user_logged_in.connect(cache_credentials)
805
Siobhan Tully53437282013-04-26 19:30:27 -0400806# Now register the new UserAdmin...
Siobhan Tully30fd4292013-05-10 08:59:56 -0400807admin.site.register(User, UserAdmin)
Siobhan Tully53437282013-04-26 19:30:27 -0400808# ... and, since we're not using Django's builtin permissions,
809# unregister the Group model from admin.
810admin.site.unregister(Group)
811
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400812#Do not show django evolution in the admin interface
813from django_evolution.models import Version, Evolution
814admin.site.unregister(Version)
815admin.site.unregister(Evolution)
816
817
818# When debugging it is often easier to see all the classes, but for regular use
819# only the top-levels should be displayed
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400820showAll = True
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400821
822admin.site.register(Deployment, DeploymentAdmin)
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400823admin.site.register(Site, SiteAdmin)
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400824admin.site.register(Slice, SliceAdmin)
Siobhan Tullyd3515752013-06-21 16:34:53 -0400825admin.site.register(Project, ProjectAdmin)
smbaker43591c32013-06-26 12:43:53 -0700826admin.site.register(ServiceClass, ServiceClassAdmin)
smbakera3cf70c2013-06-27 02:01:41 -0700827admin.site.register(Reservation, ReservationAdmin)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400828#admin.site.register(SliceRole, SliceRoleAdmin)
829#admin.site.register(SiteRole, SiteRoleAdmin)
830#admin.site.register(PlanetStackRole)
831#admin.site.register(DeploymentRole)
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400832
833if showAll:
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400834 #admin.site.register(PlanetStack)
Siobhan Tullyd3515752013-06-21 16:34:53 -0400835 admin.site.register(Tag, TagAdmin)
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400836 admin.site.register(Node, NodeAdmin)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400837 #admin.site.register(SlicePrivilege, SlicePrivilegeAdmin)
838 #admin.site.register(SitePrivilege, SitePrivilegeAdmin)
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400839 admin.site.register(Role, RoleAdmin)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400840 admin.site.register(Member, MemberAdmin)
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400841 admin.site.register(Sliver, SliverAdmin)
Siobhan Tullybf1153a2013-05-27 20:53:48 -0400842 admin.site.register(Image, ImageAdmin)
Tony Mack7130ac32013-03-22 21:58:00 -0400843