1 from core.models import Site
2 from core.models import *
3 from openstack.manager import OpenStackManager
5 from django.contrib import admin
6 from django.contrib.auth.models import Group
7 from django import forms
8 from django.utils.safestring import mark_safe
9 from django.contrib.auth.admin import UserAdmin
10 from django.contrib.admin.widgets import FilteredSelectMultiple
11 from django.contrib.auth.forms import ReadOnlyPasswordHashField
12 from django.contrib.auth.signals import user_logged_in
13 from django.utils import timezone
14 from django.contrib.contenttypes import generic
15 from suit.widgets import LinkedSelect
17 import django_evolution
19 class PlStackTabularInline(admin.TabularInline):
22 class ReservationInline(PlStackTabularInline):
25 suit_classes = 'suit-tab suit-tab-reservations'
28 class ReadonlyTabularInline(PlStackTabularInline):
33 def get_readonly_fields(self, request, obj=None):
35 for field in self.model._meta.get_all_field_names():
36 if (not field == 'id'):
37 if (field not in self.editable_fields):
41 def has_add_permission(self, request):
44 class UserMembershipInline(generic.GenericTabularInline):
48 suit_classes = 'suit-tab suit-tab-membership'
50 def queryset(self, request):
51 qs = super(UserMembershipInline, self).queryset(request)
52 return qs.filter(user=request.user)
54 class MemberInline(generic.GenericTabularInline):
58 suit_classes = 'suit-tab suit-tab-members'
60 class TagInline(generic.GenericTabularInline):
64 suit_classes = 'suit-tab suit-tab-tags'
66 class SliverInline(PlStackTabularInline):
68 fields = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
70 #readonly_fields = ['ip', 'instance_name', 'image']
71 readonly_fields = ['ip', 'instance_name']
72 suit_classes = 'suit-tab suit-tab-slivers'
75 class SiteInline(PlStackTabularInline):
78 suit_classes = 'suit-tab suit-tab-sites'
80 class UserInline(PlStackTabularInline):
82 fields = ['email', 'firstname', 'lastname']
84 suit_classes = 'suit-tab suit-tab-users'
86 class SliceInline(PlStackTabularInline):
88 fields = ['name','enabled','description','slice_url']
90 suit_classes = 'suit-tab suit-tab-slices'
93 class RoleInline(PlStackTabularInline):
96 suit_classes = 'suit-tab suit-tab-roles'
98 class NodeInline(PlStackTabularInline):
101 suit_classes = 'suit-tab suit-tab-nodes'
103 class SlicePrivilegeInline(PlStackTabularInline):
104 model = SlicePrivilege
106 suit_classes = 'suit-tab suit-tab-sliceprivileges'
108 class DeploymentPrivilegeInline(PlStackTabularInline):
109 model = DeploymentPrivilege
111 suit_classes = 'suit-tab suit-tab-deploymentprivileges'
113 class SitePrivilegeInline(PlStackTabularInline):
114 model = SitePrivilege
116 suit_classes = 'suit-tab suit-tab-siteprivileges'
118 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
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)
140 class SitePrivilegeInline(PlStackTabularInline):
141 model = SitePrivilege
142 suit_classes = 'suit-tab suit-tab-siteprivileges'
144 fields = ('user', 'site','role')
146 class SlicePrivilegeInline(PlStackTabularInline):
147 model = SlicePrivilege
148 suit_classes = 'suit-tab suit-tab-sliceprivileges'
150 fields = ('user', 'slice','role')
152 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)
172 return super(SlicePrivilegeInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
174 class SliceTagInline(PlStackTabularInline):
178 class PlainTextWidget(forms.HiddenInput):
179 input_type = 'hidden'
181 def render(self, name, value, attrs=None):
184 return mark_safe(str(value) + super(PlainTextWidget, self).render(name, value, attrs))
186 class PlanetStackBaseAdmin(admin.ModelAdmin):
188 exclude = ['enacted']
190 #class RoleMemberForm(forms.ModelForm):
192 # member=forms.ModelChoiceField(queryset=Member.objects.all()) #first get all
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)
197 # self.fields["member"].queryset = member.objects.filter(
199 class RoleMemberInline (admin.StackedInline):
201 # form = RoleMemberForm
203 def get_formset(self,request,obj=None, **kwargs):
204 self.form.request=request
205 return super(RoleMemberInline, self).get_formset(request, obj, **kwargs)
207 class SliceRoleAdmin(PlanetStackBaseAdmin):
211 class SiteRoleAdmin(PlanetStackBaseAdmin):
215 class RoleAdmin(PlanetStackBaseAdmin):
217 ('Role', {'fields': ['role_type', 'description','content_type'],
218 'classes':['collapse']})
220 inlines = [ MemberInline,]
221 list_display = ('role_type','description','content_type')
224 class DeploymentAdminForm(forms.ModelForm):
225 sites = forms.ModelMultipleChoiceField(
226 queryset=Site.objects.all(),
228 widget=FilteredSelectMultiple(
229 verbose_name=('Sites'), is_stacked=False
236 class DeploymentAdmin(PlanetStackBaseAdmin):
237 form = DeploymentAdminForm
238 inlines = [MemberInline,NodeInline,SliverInline,TagInline]
240 (None, {'fields': ['sites'], 'classes':['suit-tab suit-tab-sites']}),]
241 suit_form_tabs =(('sites', 'Sites'),('nodes','Nodes'),('members','Members'),('tags','Tags'))
243 class SiteAdmin(PlanetStackBaseAdmin):
245 (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']}),
248 suit_form_tabs =(('general', 'Site Details'),
250 ('members','Privileges'),
251 ('deployments','Deployments'),
256 list_display = ('name', 'login_base','site_url', 'enabled')
257 filter_horizontal = ('deployments',)
258 inlines = [SliceInline,UserInline,TagInline, NodeInline, MemberInline]
259 search_fields = ['name']
261 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)
272 def get_formsets(self, request, obj=None):
273 for inline in self.get_inline_instances(request, obj):
274 # hide MyInline in the add view
277 if isinstance(inline, SliceInline):
278 inline.model.caller = request.user
279 yield inline.get_formset(request, obj)
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
286 if isinstance(inline, SliverInline):
287 inline.model.caller = request.user
288 yield inline.get_formset(request, obj)
290 class SitePrivilegeAdmin(PlanetStackBaseAdmin):
292 (None, {'fields': ['user', 'site', 'role'], 'classes':['collapse']})
294 list_display = ('user', 'site', 'role')
296 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
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))
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
317 return super(SitePrivilegeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
319 def queryset(self, request):
320 # admins can see all privileges. Users can only see privileges at sites
321 # where they have the admin role or pi role.
322 qs = super(SitePrivilegeAdmin, self).queryset(request)
323 if not request.user.is_admin:
324 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)
331 class SliceAdmin(PlanetStackBaseAdmin):
332 fieldsets = [('Slice Details', {'fields': ['name', 'site', 'serviceClass', 'description', 'slice_url'], 'classes':['suit-tab suit-tab-general']}),]
333 list_display = ('name', 'site','serviceClass', 'slice_url')
334 inlines = [SlicePrivilegeInline,SliverInline, TagInline, ReservationInline]
337 suit_form_tabs =(('general', 'Slice Details'),
338 ('sliceprivileges','Privileges'),
339 ('slivers','Slivers'),
341 ('reservations','Reservations'),
344 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
354 return super(SliceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
356 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:
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)
367 def get_formsets(self, request, obj=None):
368 for inline in self.get_inline_instances(request, obj):
369 # hide MyInline in the add view
372 if isinstance(inline, SliverInline):
373 inline.model.caller = request.user
374 yield inline.get_formset(request, obj)
376 def get_queryset(self, request):
377 qs = super(SliceAdmin, self).get_queryset(request)
378 if request.user.is_superuser:
380 # users can only see slices at their site
381 return qs.filter(site=request.user.site)
383 def save_model(self, request, obj, form, change):
384 # update openstack connection to use this site/tenant
385 obj.caller = request.user
388 class SlicePrivilegeAdmin(PlanetStackBaseAdmin):
390 (None, {'fields': ['user', 'slice', 'role']})
392 list_display = ('user', 'slice', 'role')
394 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
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
415 return super(SlicePrivilegeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
417 def queryset(self, request):
418 # admins can see all memberships. Users can only see memberships of
419 # slices where they have the admin role.
420 qs = super(SlicePrivilegeAdmin, self).queryset(request)
421 if not request.user.is_admin:
422 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)
430 def save_model(self, request, obj, form, change):
431 # 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)
437 def delete_model(self, request, obj):
438 # 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)
445 class ImageAdmin(PlanetStackBaseAdmin):
447 fieldsets = [('Image Details',
448 {'fields': ['image_id', 'name', 'disk_format', 'container_format'],
449 'classes': ['suit-tab suit-tab-general']})
452 suit_form_tabs =(('general','Image Details'),('slivers','Slivers'))
454 inlines = [SliverInline]
456 class NodeForm(forms.ModelForm):
459 'site': LinkedSelect,
460 'deployment': LinkedSelect
463 class NodeAdmin(admin.ModelAdmin):
465 exclude = ['enacted']
466 list_display = ('name', 'site', 'deployment')
467 list_filter = ('deployment',)
468 inlines = [TagInline,SliverInline]
469 fieldsets = [('Node Details', {'fields': ['name','site','deployment'], 'classes':['suit-tab suit-tab-details']})]
471 suit_form_tabs =(('details','Node Details'),('slivers','Slivers'),('tags','Tags'))
474 class SliverForm(forms.ModelForm):
477 ip = forms.CharField(widget=PlainTextWidget)
478 instance_name = forms.CharField(widget=PlainTextWidget)
480 'ip': PlainTextWidget(),
481 'instance_name': PlainTextWidget(),
482 'slice': LinkedSelect,
483 'deploymentNetwork': LinkedSelect,
484 'node': LinkedSelect,
485 'image': LinkedSelect
488 class ProjectAdmin(admin.ModelAdmin):
489 exclude = ['enacted']
490 inlines = [TagInline]
492 class MemberAdmin(admin.ModelAdmin):
493 exclude = ['enacted']
494 list_display = ['role', 'rightContent_type', 'content_type', 'content_object',]
496 class TagAdmin(admin.ModelAdmin):
497 exclude = ['enacted']
498 list_display = ['project', 'name', 'value', 'content_type', 'content_object',]
500 class SliverAdmin(PlanetStackBaseAdmin):
503 ('Sliver Details', {'fields': ['slice', 'deploymentNetwork', 'node', 'ip', 'instance_name', 'numberCores', 'image', ], 'classes': ['suit-tab suit-tab-general'], })
505 list_display = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork']
507 suit_form_tabs =(('general', 'Sliver Details'),
511 inlines = [TagInline]
513 def formfield_for_foreignkey(self, db_field, request, **kwargs):
514 if db_field.name == 'slice':
515 if not request.user.is_admin:
516 slices = set([sm.slice.name for sm in SlicePrivilege.objects.filter(user=request.user)])
517 kwargs['queryset'] = Slice.objects.filter(name__in=list(slices))
519 return super(SliverAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
521 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:
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)
534 def get_formsets(self, request, obj=None):
535 # make some fields read only if we are updating an existing record
537 #self.readonly_fields = ('ip', 'instance_name')
538 self.readonly_fields = ()
540 self.readonly_fields = ()
541 #self.readonly_fields = ('ip', 'instance_name', 'slice', 'image', 'key')
543 for inline in self.get_inline_instances(request, obj):
544 # hide MyInline in the add view
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)
553 def save_model(self, request, obj, form, change):
554 # 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)
558 obj.creator = request.user
561 def delete_model(self, request, obj):
562 # 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)
568 class 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)
576 fields = ('email', 'firstname', 'lastname', 'phone', 'public_key')
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")
586 def save(self, commit=True):
587 # Save the provided password in hashed format
588 user = super(UserCreationForm, self).save(commit=False)
589 user.password = self.cleaned_data["password1"]
590 #user.set_password(self.cleaned_data["password1"])
596 class 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.
601 password = ReadOnlyPasswordHashField()
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"]
613 class UserAdmin(UserAdmin):
617 # The forms to add and change user instances
618 form = UserChangeForm
619 add_form = UserCreationForm
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.
624 list_display = ('email', 'username','firstname', 'lastname', 'is_admin', 'last_login')
626 inlines = [SlicePrivilegeInline,SitePrivilegeInline,DeploymentPrivilegeInline]
628 ('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']}),
630 #('Important dates', {'fields': ('last_login',)}),
634 'classes': ('wide',),
635 'fields': ('email', 'username','firstname', 'lastname', 'phone', 'public_key','password1', 'password2')}
638 search_fields = ('email',)
639 ordering = ('email',)
640 filter_horizontal = ()
642 suit_form_tabs =(('general','Login Details'),('contact','Contact Information'),('sliceprivileges','Slice Privileges'),('siteprivileges','Site Privileges'),('deploymentprivileges','Deployment Privileges'))
644 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
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)))
654 return super(UserAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
656 class ServiceResourceInline(admin.TabularInline):
657 exclude = ['enacted']
658 model = ServiceResource
661 class ServiceClassAdmin(admin.ModelAdmin):
662 exclude = ['enacted']
663 list_display = ('name', 'commitment', 'membershipFee')
664 inlines = [ServiceResourceInline]
666 class ReservedResourceInline(admin.TabularInline):
667 exclude = ['enacted']
668 model = ReservedResource
670 suit_classes = 'suit-tab suit-tab-reservedresources'
672 def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
673 field = super(ReservedResourceInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
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]
682 field.queryset = field.queryset.none()
\r
683 elif db_field.name == 'sliver':
\r
684 # restrict slivers to those that belong to the slice
\r
685 if request._slice is not None:
\r
686 field.queryset = field.queryset.filter(slice = request._slice)
688 field.queryset = field.queryset.none()
\r
692 class ReservationChangeForm(forms.ModelForm):
696 'slice' : LinkedSelect
699 class 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())
704 css = {'all': ('planetstack.css',)} # .field-refresh { display: none; }
706 def clean_slice(self):
707 slice = self.cleaned_data.get("slice")
708 x = ServiceResource.objects.filter(serviceClass = slice.serviceClass, calendarReservable=True)
710 raise forms.ValidationError("The slice you selected does not have a service class that allows reservations")
716 'slice' : LinkedSelect
720 class 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
727 """ don't validate anything other than slice """
728 dont_validate_fields = ("startTime", "duration")
730 def full_clean(self):
731 result = super(ReservationAddForm, self).full_clean()
733 for fieldname in self.dont_validate_fields:
734 if fieldname in self._errors:
735 del self._errors[fieldname]
739 """ don't save anything """
743 class ReservationAdmin(admin.ModelAdmin):
744 exclude = ['enacted']
745 fieldsets = [('Reservation Details', {'fields': ['startTime', 'duration','slice'], 'classes': ['suit-tab suit-tab-general']})]
746 list_display = ('startTime', 'duration')
747 form = ReservationAddForm
749 suit_form_tabs = (('general','Reservation Details'), ('reservedresources','Reserved Resources'))
751 inlines = [ReservedResourceInline]
753 def add_view(self, request, form_url='', extra_context=None):
754 timezone.activate(request.user.timezone)
755 request._refresh = False
756 request._slice = None
757 if request.method == 'POST':
758 # "refresh" will be set to "1" if the form was submitted due to
759 # a change in the Slice dropdown.
760 if request.POST.get("refresh","1") == "1":
761 request._refresh = True
762 request.POST["refresh"] = "0"
764 # Keep track of the slice that was selected, so the
765 # reservedResource inline can filter items for the slice.
766 request._slice = request.POST.get("slice",None)
767 if (request._slice is not None):
768 request._slice = Slice.objects.get(id=request._slice)
770 result = super(ReservationAdmin, self).add_view(request, form_url, extra_context)
773 def changelist_view(self, request, extra_context = None):
774 timezone.activate(request.user.timezone)
775 return super(ReservationAdmin, self).changelist_view(request, extra_context)
777 def get_form(self, request, obj=None, **kwargs):
780 # For changes, set request._slice to the slice already set in the
782 request._slice = obj.slice
783 self.form = ReservationChangeForm
785 if getattr(request, "_refresh", False):
786 self.form = ReservationAddRefreshForm
788 self.form = ReservationAddForm
789 return super(ReservationAdmin, self).get_form(request, obj, **kwargs)
791 def get_readonly_fields(self, request, obj=None):
792 if (obj is not None):
793 # Prevent slice from being changed after the reservation has been
799 # register a signal that caches the user's credentials when they log in
800 def cache_credentials(sender, user, request, **kwds):
801 auth = {'username': request.POST['username'],
802 'password': request.POST['password']}
803 request.session['auth'] = auth
804 user_logged_in.connect(cache_credentials)
806 # Now register the new UserAdmin...
807 admin.site.register(User, UserAdmin)
808 # ... and, since we're not using Django's builtin permissions,
809 # unregister the Group model from admin.
810 admin.site.unregister(Group)
812 #Do not show django evolution in the admin interface
813 from django_evolution.models import Version, Evolution
814 admin.site.unregister(Version)
815 admin.site.unregister(Evolution)
818 # When debugging it is often easier to see all the classes, but for regular use
819 # only the top-levels should be displayed
822 admin.site.register(Deployment, DeploymentAdmin)
823 admin.site.register(Site, SiteAdmin)
824 admin.site.register(Slice, SliceAdmin)
825 admin.site.register(Project, ProjectAdmin)
826 admin.site.register(ServiceClass, ServiceClassAdmin)
827 admin.site.register(Reservation, ReservationAdmin)
828 #admin.site.register(SliceRole, SliceRoleAdmin)
829 #admin.site.register(SiteRole, SiteRoleAdmin)
830 #admin.site.register(PlanetStackRole)
831 #admin.site.register(DeploymentRole)
834 #admin.site.register(PlanetStack)
835 admin.site.register(Tag, TagAdmin)
836 admin.site.register(Node, NodeAdmin)
837 #admin.site.register(SlicePrivilege, SlicePrivilegeAdmin)
838 #admin.site.register(SitePrivilege, SitePrivilegeAdmin)
839 admin.site.register(Role, RoleAdmin)
840 admin.site.register(Member, MemberAdmin)
841 admin.site.register(Sliver, SliverAdmin)
842 admin.site.register(Image, ImageAdmin)