from django.core.urlresolvers import reverse, NoReverseMatch
import django_evolution
+import threading
+
+# thread locals necessary to work around a django-suit issue
+_thread_locals = threading.local()
def backend_icon(obj): # backend_status, enacted, updated):
#return "%s %s %s" % (str(obj.updated), str(obj.enacted), str(obj.backend_status))
def clean(self):
cleaned_data = super(SliceForm, self).clean()
name = cleaned_data.get('name')
- site_id = cleaned_data.get('site')
- site = Slice.objects.get(id=site_id)
+ site = cleaned_data.get('site')
+ if (not isinstance(site,Site)):
+ # previous code indicates 'site' could be a site_id and not a site?
+ site = Slice.objects.get(id=site.id)
if not name.startswith(site.login_base):
raise forms.ValidationError('slice name must begin with %s' % site.login_base)
return cleaned_data
inline.model.caller = request.user
yield inline.get_formset(request, obj)
+ def save_model(self, request, obj, form, change):
+ obj.save()
+ # create default public slice networks
+ public_net = Network(
+ name = obj.name+'-public',
+ template = NetworkTemplate.objects.get(name='Public dedicated IPv4'),
+ owner = obj
+ )
+ public_net.save()
+ public_slice_net = NetworkSlice(network=public_net, slice=obj)
+ public_slice_net.save()
+ # create default private slice networks
+ private_net = Network(
+ name = obj.name+'-private',
+ template = NetworkTemplate.objects.get(name='Private'),
+ owner = obj
+ )
+ private_net.save()
+ private_slice_net = NetworkSlice(network=private_net, slice=obj)
+ private_slice_net.save()
+
+
class SlicePrivilegeAdmin(PlanetStackBaseAdmin):
fieldsets = [
add_fieldsets = (
(None, {
'classes': ('wide',),
- 'fields': ('email', 'firstname', 'lastname', 'is_readonly', 'phone', 'public_key','password1', 'password2')}
+ 'fields': ('email', 'firstname', 'lastname', 'is_readonly', 'phone', 'public_key','password1', 'password2')},
),
)
readonly_fields = ('backend_status_text', )
user_readonly_fields = fieldListLoginDetails + fieldListContactInfo
- suit_form_tabs =(('general','Login Details'),
- ('contact','Contact Information'),
- ('sliceprivileges','Slice Privileges'),
- ('siteprivileges','Site Privileges'),
- ('deploymentprivileges','Deployment Privileges'),
- ('dashboards','Dashboard Views'))
+ def get_form(self, request, obj=None):
+ # Save obj in thread-local storage, so suit_form_tabs can use it to
+ # determine whether we're in edit or add mode.
+ _thread_locals.request = request
+ _thread_locals.obj = obj
+ return super(UserAdmin, self).get_form(request, obj)
+
+ @property
+ def suit_form_tabs(self):
+ if getattr(_thread_locals, "obj", None) is None:
+ return []
+ else:
+ return (('general','Login Details'),
+ ('contact','Contact Information'),
+ ('sliceprivileges','Slice Privileges'),
+ ('siteprivileges','Site Privileges'),
+ ('deploymentprivileges','Deployment Privileges'),
+ ('dashboards','Dashboard Views'))
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'site':