7e19cf1470e76a8d9842a4056d00fec45a2b8a01
[plstackapi.git] / plstackapi / core / admin.py
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
5
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
11
12
13 class 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
29 class SliverInline(admin.TabularInline):
30     model = Sliver
31     fields = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
32     extra = 0
33
34 class SiteInline(admin.TabularInline):
35     model = Site
36     extra = 0
37
38 class NodeInline(admin.TabularInline):
39     model = Node
40     extra = 0
41
42 class PlanetStackBaseAdmin(admin.ModelAdmin):
43     save_on_top = False
44
45 class 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
74 class DeploymentNetworkAdmin(PlanetStackBaseAdmin):
75     form = DeploymentNetworkAdminForm
76     inlines = [NodeInline,]
77
78 class 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
89 class KeyAdmin(admin.ModelAdmin):
90     fieldsets = [
91         ('Key', {'fields': ['name', 'key', 'type', 'blacklisted', 'user']})
92     ]
93     list_display = ['name', 'key', 'type', 'blacklisted', 'user']
94
95 class SliceAdmin(PlanetStackBaseAdmin):
96     fields = ['name', 'site', 'instantiation', 'description', 'slice_url']
97     list_display = ('name', 'site','slice_url', 'instantiation')
98     inlines = [SliverInline]
99
100 class SubnetAdmin(admin.ModelAdmin):
101     fields = ['cidr', 'ip_version', 'start', 'end', 'slice']
102     list_display = ('slice','cidr', 'start', 'end', 'ip_version' )
103
104 class ImageAdmin(admin.ModelAdmin):
105     fields = ['image_id', 'name', 'disk_format', 'container_format']
106
107 class NodeAdmin(admin.ModelAdmin):
108     list_display = ('name', 'site', 'deploymentNetwork')
109     list_filter = ('deploymentNetwork',)
110
111 class RoleAdmin(admin.ModelAdmin):
112     fieldsets = [
113         ('Role', {'fields': ['role_type']})
114     ]
115     list_display = ('role_type',)
116
117 class PlainTextWidget(forms.Widget):
118     def render(self, _name, value, attrs):
119         return mark_safe(value) if value is not None else ''
120
121 class SliverForm(forms.ModelForm):
122     class Meta:
123         ip = forms.CharField(widget=PlainTextWidget)
124         model = Sliver
125         widgets = {
126             'ip': PlainTextWidget(),
127         }
128
129 class SliverAdmin(admin.ModelAdmin):
130     form = SliverForm
131     fieldsets = [
132         ('Sliver', {'fields': ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']})
133     ]
134     list_display = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
135
136
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)
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
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.
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
181 class 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...
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)
214
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)
227