Adjusted SliverInline to only show valid fields for create/view. Used admin::Sliver...
[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 import forms
5 from django.utils.safestring import mark_safe
6 from django.contrib.auth.admin import UserAdmin
7 from django.contrib.admin.widgets import FilteredSelectMultiple
8
9
10 class ReadonlyTabularInline(admin.TabularInline):
11     can_delete = False
12     extra = 0
13     editable_fields = []
14
15     def get_readonly_fields(self, request, obj=None):
16         fields = []
17         for field in self.model._meta.get_all_field_names():
18             if (not field == 'id'):
19                 if (field not in self.editable_fields):
20                     fields.append(field)
21         return fields
22
23     def has_add_permission(self, request):
24         return False
25
26 class SliverInline(admin.TabularInline):
27     model = Sliver
28     fields = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
29     extra = 0
30
31 class SiteInline(admin.TabularInline):
32     model = Site
33     extra = 0
34
35 class NodeInline(admin.TabularInline):
36     model = Node
37     extra = 0
38
39 class PlanetStackBaseAdmin(admin.ModelAdmin):
40     save_on_top = False
41
42 class DeploymentNetworkAdminForm(forms.ModelForm):
43     sites = forms.ModelMultipleChoiceField(
44         queryset=Site.objects.all(),
45         required=False,
46         widget=FilteredSelectMultiple(
47             verbose_name=('Sites'), is_stacked=False
48         )
49     )
50     class Meta:
51         model = DeploymentNetwork
52
53     def __init__(self, *args, **kwargs):
54         super(DeploymentNetworkAdminForm, self).__init__(*args, **kwargs)
55
56         if self.instance and self.instance.pk:
57             self.fields['sites'].initial = self.instance.sites.all()
58
59     def save(self, commit=True):
60         deploymentNetwork = super(DeploymentNetworkAdminForm, self).save(commit=False)
61
62         if commit:
63             deploymentNetwork.save()
64
65         if deploymentNetwork.pk:
66             deploymentNetwork.sites = self.cleaned_data['sites']
67             self.save_m2m()
68
69         return deploymentNetwork
70
71 class DeploymentNetworkAdmin(PlanetStackBaseAdmin):
72     form = DeploymentNetworkAdminForm
73     inlines = [NodeInline,]
74
75 class SiteAdmin(admin.ModelAdmin):
76     fieldsets = [
77         (None, {'fields': ['name', 'site_url', 'enabled', 'is_public', 'login_base']}),
78         ('Location', {'fields': ['latitude', 'longitude']}),
79         ('Deployment Networks', {'fields': ['deployments']})
80     ]
81     list_display = ('name', 'login_base','site_url', 'enabled')
82     filter_horizontal = ('deployments',)
83     inlines = [NodeInline,]
84     search_fields = ['name']
85
86 class UserForm(forms.ModelForm):
87     class Meta:
88         password = forms.CharField(widget=forms.PasswordInput)
89         model = User
90         widgets = {
91             'password': forms.PasswordInput(),
92         }
93
94 class UserAdmin(admin.ModelAdmin):
95     form = UserForm
96     fieldsets = [
97         ('User', {'fields': ['firstname', 'lastname', 'email', 'password', 'phone', 'user_url', 'is_admin', 'site']})
98     ]
99     list_display = ['firstname', 'lastname', 'email', 'password', 'phone', 'user_url', 'is_admin', 'site']
100     search_fields = ['email'] 
101
102 class KeyAdmin(admin.ModelAdmin):
103     fieldsets = [
104         ('Key', {'fields': ['name', 'key', 'type', 'blacklisted', 'user']})
105     ]
106     list_display = ['name', 'key', 'type', 'blacklisted', 'user']
107
108 class SliceAdmin(PlanetStackBaseAdmin):
109     fields = ['name', 'site', 'instantiation', 'description', 'slice_url']
110     list_display = ('name', 'site','slice_url', 'instantiation')
111     inlines = [SliverInline]
112
113 class SubnetAdmin(admin.ModelAdmin):
114     fields = ['cidr', 'ip_version', 'start', 'end', 'slice']
115
116 class ImageAdmin(admin.ModelAdmin):
117     fields = ['image_id', 'name', 'disk_format', 'container_format']
118
119 class NodeAdmin(admin.ModelAdmin):
120     list_display = ('name', 'site', 'deploymentNetwork')
121     list_filter = ('deploymentNetwork',)
122
123 class RoleAdmin(admin.ModelAdmin):
124     fieldsets = [
125         ('Role', {'fields': ['role_type']})
126     ]
127     list_display = ('role_type',)
128
129 class PlainTextWidget(forms.Widget):
130     def render(self, _name, value, attrs):
131         return mark_safe(value) if value is not None else ''
132
133 class SliverForm(forms.ModelForm):
134     class Meta:
135         ip = forms.CharField(widget=PlainTextWidget)
136         model = Sliver
137         widgets = {
138             'ip': PlainTextWidget(),
139         } 
140
141 class SliverAdmin(admin.ModelAdmin):
142     form = SliverForm
143     fieldsets = [
144         ('Sliver', {'fields': ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']})
145     ]
146     list_display = ['ip', 'name', 'slice', 'flavor', 'image', 'key', 'node', 'deploymentNetwork']
147
148 admin.site.register(Site, SiteAdmin)
149 admin.site.register(SitePrivilege)
150 admin.site.register(Slice, SliceAdmin)
151 admin.site.register(SliceMembership)
152 admin.site.register(Subnet, SubnetAdmin)
153 admin.site.register(Image, ImageAdmin)
154 admin.site.register(Node, NodeAdmin)
155 admin.site.register(Sliver, SliverAdmin)
156 admin.site.register(Flavor)
157 admin.site.register(Key, KeyAdmin)
158 admin.site.register(Role, RoleAdmin)
159 admin.site.register(User, UserAdmin)
160 admin.site.register(DeploymentNetwork, DeploymentNetworkAdmin)
161