blob: 7e19cf1470e76a8d9842a4056d00fec45a2b8a01 [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 Mack7130ac32013-03-22 21:58:00 -040011
Siobhan Tully4bc09f22013-04-10 21:15:21 -040012
13class ReadonlyTabularInline(admin.TabularInline):
14 can_delete = False
15 extra = 0
16 editable_fields = []
17
18 def get_readonly_fields(self, request, obj=None):
19 fields = []
20 for field in self.model._meta.get_all_field_names():
21 if (not field == 'id'):
22 if (field not in self.editable_fields):
23 fields.append(field)
24 return fields
25
26 def has_add_permission(self, request):
27 return False
28
29class SliverInline(admin.TabularInline):
30 model = Sliver
Siobhan Tullyc47c39d2013-04-17 06:47:26 -040031 fields = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
Siobhan Tully4bc09f22013-04-10 21:15:21 -040032 extra = 0
33
34class SiteInline(admin.TabularInline):
35 model = Site
36 extra = 0
37
38class NodeInline(admin.TabularInline):
39 model = Node
40 extra = 0
41
42class PlanetStackBaseAdmin(admin.ModelAdmin):
43 save_on_top = False
44
45class DeploymentNetworkAdminForm(forms.ModelForm):
46 sites = forms.ModelMultipleChoiceField(
47 queryset=Site.objects.all(),
48 required=False,
49 widget=FilteredSelectMultiple(
50 verbose_name=('Sites'), is_stacked=False
51 )
52 )
53 class Meta:
54 model = DeploymentNetwork
55
56 def __init__(self, *args, **kwargs):
57 super(DeploymentNetworkAdminForm, self).__init__(*args, **kwargs)
58
59 if self.instance and self.instance.pk:
60 self.fields['sites'].initial = self.instance.sites.all()
61
62 def save(self, commit=True):
63 deploymentNetwork = super(DeploymentNetworkAdminForm, self).save(commit=False)
64
65 if commit:
66 deploymentNetwork.save()
67
68 if deploymentNetwork.pk:
69 deploymentNetwork.sites = self.cleaned_data['sites']
70 self.save_m2m()
71
72 return deploymentNetwork
73
74class DeploymentNetworkAdmin(PlanetStackBaseAdmin):
75 form = DeploymentNetworkAdminForm
76 inlines = [NodeInline,]
77
78class SiteAdmin(admin.ModelAdmin):
79 fieldsets = [
80 (None, {'fields': ['name', 'site_url', 'enabled', 'is_public', 'login_base']}),
81 ('Location', {'fields': ['latitude', 'longitude']}),
82 ('Deployment Networks', {'fields': ['deployments']})
83 ]
84 list_display = ('name', 'login_base','site_url', 'enabled')
85 filter_horizontal = ('deployments',)
86 inlines = [NodeInline,]
87 search_fields = ['name']
88
Tony Mack759b57a2013-04-14 21:03:31 -040089class KeyAdmin(admin.ModelAdmin):
90 fieldsets = [
91 ('Key', {'fields': ['name', 'key', 'type', 'blacklisted', 'user']})
92 ]
93 list_display = ['name', 'key', 'type', 'blacklisted', 'user']
Tony Mack8484bdb2013-04-14 20:26:03 -040094
Siobhan Tully4bc09f22013-04-10 21:15:21 -040095class SliceAdmin(PlanetStackBaseAdmin):
96 fields = ['name', 'site', 'instantiation', 'description', 'slice_url']
97 list_display = ('name', 'site','slice_url', 'instantiation')
98 inlines = [SliverInline]
99
100class SubnetAdmin(admin.ModelAdmin):
101 fields = ['cidr', 'ip_version', 'start', 'end', 'slice']
Siobhan Tully53437282013-04-26 19:30:27 -0400102 list_display = ('slice','cidr', 'start', 'end', 'ip_version' )
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400103
104class ImageAdmin(admin.ModelAdmin):
105 fields = ['image_id', 'name', 'disk_format', 'container_format']
106
107class NodeAdmin(admin.ModelAdmin):
108 list_display = ('name', 'site', 'deploymentNetwork')
109 list_filter = ('deploymentNetwork',)
110
Tony Mackfd24d0d2013-04-14 00:59:17 -0400111class RoleAdmin(admin.ModelAdmin):
Tony Mackbc9cecf2013-04-14 13:56:38 -0400112 fieldsets = [
113 ('Role', {'fields': ['role_type']})
114 ]
Tony Mackfd24d0d2013-04-14 00:59:17 -0400115 list_display = ('role_type',)
116
Tony Mackd90cdbf2013-04-16 22:48:40 -0400117class PlainTextWidget(forms.Widget):
118 def render(self, _name, value, attrs):
119 return mark_safe(value) if value is not None else ''
120
121class SliverForm(forms.ModelForm):
122 class Meta:
123 ip = forms.CharField(widget=PlainTextWidget)
124 model = Sliver
125 widgets = {
126 'ip': PlainTextWidget(),
Siobhan Tully53437282013-04-26 19:30:27 -0400127 }
Tony Mackd90cdbf2013-04-16 22:48:40 -0400128
Tony Mackcdec0902013-04-15 00:38:49 -0400129class SliverAdmin(admin.ModelAdmin):
Tony Mackd90cdbf2013-04-16 22:48:40 -0400130 form = SliverForm
Tony Mackcdec0902013-04-15 00:38:49 -0400131 fieldsets = [
Tony Mackd90cdbf2013-04-16 22:48:40 -0400132 ('Sliver', {'fields': ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']})
Tony Mackcdec0902013-04-15 00:38:49 -0400133 ]
Tony Mackd90cdbf2013-04-16 22:48:40 -0400134 list_display = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
Tony Mackcdec0902013-04-15 00:38:49 -0400135
Siobhan Tully53437282013-04-26 19:30:27 -0400136
137class 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
209# Now register the new UserAdmin...
210admin.site.register(PLUser, PLUserAdmin)
211# ... and, since we're not using Django's builtin permissions,
212# unregister the Group model from admin.
213admin.site.unregister(Group)
214
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400215admin.site.register(Site, SiteAdmin)
216admin.site.register(SitePrivilege)
217admin.site.register(Slice, SliceAdmin)
218admin.site.register(SliceMembership)
219admin.site.register(Subnet, SubnetAdmin)
220admin.site.register(Image, ImageAdmin)
221admin.site.register(Node, NodeAdmin)
Tony Mackcdec0902013-04-15 00:38:49 -0400222admin.site.register(Sliver, SliverAdmin)
Tony Mack5cc16ba2013-04-09 10:30:45 -0400223admin.site.register(Flavor)
Tony Mack759b57a2013-04-14 21:03:31 -0400224admin.site.register(Key, KeyAdmin)
Tony Mackfd24d0d2013-04-14 00:59:17 -0400225admin.site.register(Role, RoleAdmin)
Siobhan Tully4bc09f22013-04-10 21:15:21 -0400226admin.site.register(DeploymentNetwork, DeploymentNetworkAdmin)
Tony Mack7130ac32013-03-22 21:58:00 -0400227