blob: dae2256d3c88d562cddba326f4f80bdf8b0bd8ff [file] [log] [blame]
Siobhan Tully4bc09f22013-04-10 21:15:21 -04001from plstackapi.core.models import Site
Tony Mackf1c12242013-04-09 16:08:43 -04002from plstackapi.core.models import *
Tony Mack7130ac32013-03-22 21:58:00 -04003from django.contrib import admin
Siobhan Tully53437282013-04-26 19:30:27 -04004from django.contrib.auth.models import Group
5
Siobhan Tully4bc09f22013-04-10 21:15:21 -04006from django import forms
Tony Mackd90cdbf2013-04-16 22:48:40 -04007from django.utils.safestring import mark_safe
Tony Mack7130ac32013-03-22 21:58:00 -04008from django.contrib.auth.admin import UserAdmin
Siobhan Tully4bc09f22013-04-10 21:15:21 -04009from django.contrib.admin.widgets import FilteredSelectMultiple
Siobhan Tully53437282013-04-26 19:30:27 -040010from django.contrib.auth.forms import ReadOnlyPasswordHashField
Tony Mack31c2b8f2013-04-26 20:01:42 -040011from django.contrib.auth.signals import user_logged_in
Tony Mack7130ac32013-03-22 21:58:00 -040012
Siobhan Tully4bc09f22013-04-10 21:15:21 -040013
14class ReadonlyTabularInline(admin.TabularInline):
15 can_delete = False
16 extra = 0
17 editable_fields = []
18
19 def get_readonly_fields(self, request, obj=None):
20 fields = []
21 for field in self.model._meta.get_all_field_names():
22 if (not field == 'id'):
23 if (field not in self.editable_fields):
24 fields.append(field)
25 return fields
26
27 def has_add_permission(self, request):
28 return False
29
30class SliverInline(admin.TabularInline):
31 model = Sliver
Siobhan Tullyc47c39d2013-04-17 06:47:26 -040032 fields = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
Siobhan Tully4bc09f22013-04-10 21:15:21 -040033 extra = 0
34
35class SiteInline(admin.TabularInline):
36 model = Site
37 extra = 0
38
39class NodeInline(admin.TabularInline):
40 model = Node
41 extra = 0
42
43class PlanetStackBaseAdmin(admin.ModelAdmin):
44 save_on_top = False
45
46class DeploymentNetworkAdminForm(forms.ModelForm):
47 sites = forms.ModelMultipleChoiceField(
48 queryset=Site.objects.all(),
49 required=False,
50 widget=FilteredSelectMultiple(
51 verbose_name=('Sites'), is_stacked=False
52 )
53 )
54 class Meta:
55 model = DeploymentNetwork
56
57 def __init__(self, *args, **kwargs):
58 super(DeploymentNetworkAdminForm, self).__init__(*args, **kwargs)
59
60 if self.instance and self.instance.pk:
61 self.fields['sites'].initial = self.instance.sites.all()
62
63 def save(self, commit=True):
64 deploymentNetwork = super(DeploymentNetworkAdminForm, self).save(commit=False)
65
66 if commit:
67 deploymentNetwork.save()
68
69 if deploymentNetwork.pk:
70 deploymentNetwork.sites = self.cleaned_data['sites']
71 self.save_m2m()
72
73 return deploymentNetwork
74
75class DeploymentNetworkAdmin(PlanetStackBaseAdmin):
76 form = DeploymentNetworkAdminForm
77 inlines = [NodeInline,]
78
79class SiteAdmin(admin.ModelAdmin):
80 fieldsets = [
81 (None, {'fields': ['name', 'site_url', 'enabled', 'is_public', 'login_base']}),
82 ('Location', {'fields': ['latitude', 'longitude']}),
83 ('Deployment Networks', {'fields': ['deployments']})
84 ]
85 list_display = ('name', 'login_base','site_url', 'enabled')
86 filter_horizontal = ('deployments',)
87 inlines = [NodeInline,]
88 search_fields = ['name']
89
Tony Mack759b57a2013-04-14 21:03:31 -040090class KeyAdmin(admin.ModelAdmin):
91 fieldsets = [
92 ('Key', {'fields': ['name', 'key', 'type', 'blacklisted', 'user']})
93 ]
94 list_display = ['name', 'key', 'type', 'blacklisted', 'user']
Tony Mack8484bdb2013-04-14 20:26:03 -040095
Siobhan Tully4bc09f22013-04-10 21:15:21 -040096class SliceAdmin(PlanetStackBaseAdmin):
97 fields = ['name', 'site', 'instantiation', 'description', 'slice_url']
98 list_display = ('name', 'site','slice_url', 'instantiation')
99 inlines = [SliverInline]
100
101class SubnetAdmin(admin.ModelAdmin):
102 fields = ['cidr', 'ip_version', 'start', 'end', 'slice']
Siobhan Tully53437282013-04-26 19:30:27 -0400103 list_display = ('slice','cidr', 'start', 'end', 'ip_version' )
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400104
105class ImageAdmin(admin.ModelAdmin):
106 fields = ['image_id', 'name', 'disk_format', 'container_format']
107
108class NodeAdmin(admin.ModelAdmin):
109 list_display = ('name', 'site', 'deploymentNetwork')
110 list_filter = ('deploymentNetwork',)
111
Tony Mackfd24d0d2013-04-14 00:59:17 -0400112class RoleAdmin(admin.ModelAdmin):
Tony Mackbc9cecf2013-04-14 13:56:38 -0400113 fieldsets = [
114 ('Role', {'fields': ['role_type']})
115 ]
Tony Mackfd24d0d2013-04-14 00:59:17 -0400116 list_display = ('role_type',)
117
Tony Mackd90cdbf2013-04-16 22:48:40 -0400118class PlainTextWidget(forms.Widget):
119 def render(self, _name, value, attrs):
120 return mark_safe(value) if value is not None else ''
121
122class SliverForm(forms.ModelForm):
123 class Meta:
124 ip = forms.CharField(widget=PlainTextWidget)
125 model = Sliver
126 widgets = {
127 'ip': PlainTextWidget(),
Siobhan Tully53437282013-04-26 19:30:27 -0400128 }
Tony Mackd90cdbf2013-04-16 22:48:40 -0400129
Tony Mackcdec0902013-04-15 00:38:49 -0400130class SliverAdmin(admin.ModelAdmin):
Tony Mackd90cdbf2013-04-16 22:48:40 -0400131 form = SliverForm
Tony Mackcdec0902013-04-15 00:38:49 -0400132 fieldsets = [
Tony Mackd90cdbf2013-04-16 22:48:40 -0400133 ('Sliver', {'fields': ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']})
Tony Mackcdec0902013-04-15 00:38:49 -0400134 ]
Tony Mackd90cdbf2013-04-16 22:48:40 -0400135 list_display = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
Tony Mackcdec0902013-04-15 00:38:49 -0400136
Siobhan Tully53437282013-04-26 19:30:27 -0400137class 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)
142
143 class Meta:
144 model = PLUser
145 fields = ('email', 'firstname', 'lastname', 'phone', 'site')
146
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")
153 return password2
154
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"])
159 if commit:
160 user.save()
161 return user
162
163
164class 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.
168 """
169 password = ReadOnlyPasswordHashField()
170
171 class Meta:
172 model = PLUser
173
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"]
179
180
181class PLUserAdmin(UserAdmin):
182 class Meta:
183 app_label = "core"
184
185 # The forms to add and change user instances
186 form = UserChangeForm
187 add_form = UserCreationForm
188
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',)
194 fieldsets = (
195 (None, {'fields': ('email', 'password')}),
196 ('Personal info', {'fields': ('firstname','lastname','phone','site')}),
197 #('Important dates', {'fields': ('last_login',)}),
198 )
199 add_fieldsets = (
200 (None, {
201 'classes': ('wide',),
202 'fields': ('email', 'firstname', 'lastname', 'phone', 'site', 'password1', 'password2')}
203 ),
204 )
205 search_fields = ('email',)
206 ordering = ('email',)
207 filter_horizontal = ()
208
Tony Mack31c2b8f2013-04-26 20:01:42 -0400209# register a signal that caches the user's credentials when they log in
210def cache_credentials(sender, user, request, **kwds):
211 auth = {'username': request.POST['username'],
212 'password': request.POST['password']}
213 request.session['auth'] = auth
214user_logged_in.connect(cache_credentials)
215
Siobhan Tully53437282013-04-26 19:30:27 -0400216# Now register the new UserAdmin...
217admin.site.register(PLUser, PLUserAdmin)
218# ... and, since we're not using Django's builtin permissions,
219# unregister the Group model from admin.
220admin.site.unregister(Group)
221
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400222admin.site.register(Site, SiteAdmin)
223admin.site.register(SitePrivilege)
224admin.site.register(Slice, SliceAdmin)
225admin.site.register(SliceMembership)
226admin.site.register(Subnet, SubnetAdmin)
227admin.site.register(Image, ImageAdmin)
228admin.site.register(Node, NodeAdmin)
Tony Mackcdec0902013-04-15 00:38:49 -0400229admin.site.register(Sliver, SliverAdmin)
Tony Mack5cc16ba2013-04-09 10:30:45 -0400230admin.site.register(Flavor)
Tony Mack759b57a2013-04-14 21:03:31 -0400231admin.site.register(Key, KeyAdmin)
Tony Mackfd24d0d2013-04-14 00:59:17 -0400232admin.site.register(Role, RoleAdmin)
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400233admin.site.register(DeploymentNetwork, DeploymentNetworkAdmin)
Tony Mack7130ac32013-03-22 21:58:00 -0400234