1 from plstackapi.core.models import Site
2 from plstackapi.core.models import *
3 from django.contrib import admin
4 from django.contrib.auth.models import Group
6 from django import forms
7 from django.utils.safestring import mark_safe
8 from django.contrib.auth.admin import UserAdmin
9 from django.contrib.admin.widgets import FilteredSelectMultiple
10 from django.contrib.auth.forms import ReadOnlyPasswordHashField
13 class ReadonlyTabularInline(admin.TabularInline):
18 def get_readonly_fields(self, request, obj=None):
20 for field in self.model._meta.get_all_field_names():
21 if (not field == 'id'):
22 if (field not in self.editable_fields):
26 def has_add_permission(self, request):
29 class SliverInline(admin.TabularInline):
31 fields = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
34 class SiteInline(admin.TabularInline):
38 class NodeInline(admin.TabularInline):
42 class PlanetStackBaseAdmin(admin.ModelAdmin):
45 class DeploymentNetworkAdminForm(forms.ModelForm):
46 sites = forms.ModelMultipleChoiceField(
47 queryset=Site.objects.all(),
49 widget=FilteredSelectMultiple(
50 verbose_name=('Sites'), is_stacked=False
54 model = DeploymentNetwork
56 def __init__(self, *args, **kwargs):
57 super(DeploymentNetworkAdminForm, self).__init__(*args, **kwargs)
59 if self.instance and self.instance.pk:
60 self.fields['sites'].initial = self.instance.sites.all()
62 def save(self, commit=True):
63 deploymentNetwork = super(DeploymentNetworkAdminForm, self).save(commit=False)
66 deploymentNetwork.save()
68 if deploymentNetwork.pk:
69 deploymentNetwork.sites = self.cleaned_data['sites']
72 return deploymentNetwork
74 class DeploymentNetworkAdmin(PlanetStackBaseAdmin):
75 form = DeploymentNetworkAdminForm
76 inlines = [NodeInline,]
78 class SiteAdmin(admin.ModelAdmin):
80 (None, {'fields': ['name', 'site_url', 'enabled', 'is_public', 'login_base']}),
81 ('Location', {'fields': ['latitude', 'longitude']}),
82 ('Deployment Networks', {'fields': ['deployments']})
84 list_display = ('name', 'login_base','site_url', 'enabled')
85 filter_horizontal = ('deployments',)
86 inlines = [NodeInline,]
87 search_fields = ['name']
89 class KeyAdmin(admin.ModelAdmin):
91 ('Key', {'fields': ['name', 'key', 'type', 'blacklisted', 'user']})
93 list_display = ['name', 'key', 'type', 'blacklisted', 'user']
95 class SliceAdmin(PlanetStackBaseAdmin):
96 fields = ['name', 'site', 'instantiation', 'description', 'slice_url']
97 list_display = ('name', 'site','slice_url', 'instantiation')
98 inlines = [SliverInline]
100 class SubnetAdmin(admin.ModelAdmin):
101 fields = ['cidr', 'ip_version', 'start', 'end', 'slice']
102 list_display = ('slice','cidr', 'start', 'end', 'ip_version' )
104 class ImageAdmin(admin.ModelAdmin):
105 fields = ['image_id', 'name', 'disk_format', 'container_format']
107 class NodeAdmin(admin.ModelAdmin):
108 list_display = ('name', 'site', 'deploymentNetwork')
109 list_filter = ('deploymentNetwork',)
111 class RoleAdmin(admin.ModelAdmin):
113 ('Role', {'fields': ['role_type']})
115 list_display = ('role_type',)
117 class PlainTextWidget(forms.Widget):
118 def render(self, _name, value, attrs):
119 return mark_safe(value) if value is not None else ''
121 class SliverForm(forms.ModelForm):
123 ip = forms.CharField(widget=PlainTextWidget)
126 'ip': PlainTextWidget(),
129 class SliverAdmin(admin.ModelAdmin):
132 ('Sliver', {'fields': ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']})
134 list_display = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
137 class UserCreationForm(forms.ModelForm):
138 """A form for creating new users. Includes all the required
139 fields, plus a repeated password."""
140 password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
141 password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
145 fields = ('email', 'firstname', 'lastname', 'phone', 'site')
147 def clean_password2(self):
148 # Check that the two password entries match
149 password1 = self.cleaned_data.get("password1")
150 password2 = self.cleaned_data.get("password2")
151 if password1 and password2 and password1 != password2:
152 raise forms.ValidationError("Passwords don't match")
155 def save(self, commit=True):
156 # Save the provided password in hashed format
157 user = super(UserCreationForm, self).save(commit=False)
158 user.set_password(self.cleaned_data["password1"])
164 class UserChangeForm(forms.ModelForm):
165 """A form for updating users. Includes all the fields on
166 the user, but replaces the password field with admin's
167 password hash display field.
169 password = ReadOnlyPasswordHashField()
174 def clean_password(self):
175 # Regardless of what the user provides, return the initial value.
176 # This is done here, rather than on the field, because the
177 # field does not have access to the initial value
178 return self.initial["password"]
181 class PLUserAdmin(UserAdmin):
185 # The forms to add and change user instances
186 form = UserChangeForm
187 add_form = UserCreationForm
189 # The fields to be used in displaying the User model.
190 # These override the definitions on the base UserAdmin
191 # that reference specific fields on auth.User.
192 list_display = ('email', 'site', 'firstname', 'lastname', 'last_login')
193 list_filter = ('site',)
195 (None, {'fields': ('email', 'password')}),
196 ('Personal info', {'fields': ('firstname','lastname','phone','site')}),
197 #('Important dates', {'fields': ('last_login',)}),
201 'classes': ('wide',),
202 'fields': ('email', 'firstname', 'lastname', 'phone', 'site', 'password1', 'password2')}
205 search_fields = ('email',)
206 ordering = ('email',)
207 filter_horizontal = ()
209 # Now register the new UserAdmin...
210 admin.site.register(PLUser, PLUserAdmin)
211 # ... and, since we're not using Django's builtin permissions,
212 # unregister the Group model from admin.
213 admin.site.unregister(Group)
215 admin.site.register(Site, SiteAdmin)
216 admin.site.register(SitePrivilege)
217 admin.site.register(Slice, SliceAdmin)
218 admin.site.register(SliceMembership)
219 admin.site.register(Subnet, SubnetAdmin)
220 admin.site.register(Image, ImageAdmin)
221 admin.site.register(Node, NodeAdmin)
222 admin.site.register(Sliver, SliverAdmin)
223 admin.site.register(Flavor)
224 admin.site.register(Key, KeyAdmin)
225 admin.site.register(Role, RoleAdmin)
226 admin.site.register(DeploymentNetwork, DeploymentNetworkAdmin)