blob: 19f519010ec5ac0ecf3b907c48919941f624e3f9 [file] [log] [blame]
Scott Baker25467ff2016-08-04 09:50:22 -07001from django.contrib import admin
2
3from services.hpc.models import *
4from django import forms
5from django.utils.safestring import mark_safe
6from django.contrib.auth.admin import UserAdmin
7from django.contrib.admin.widgets import FilteredSelectMultiple
8from django.contrib.auth.forms import ReadOnlyPasswordHashField
9from django.contrib.auth.signals import user_logged_in
10from django.utils import timezone
11from suit.widgets import LinkedSelect
12from core.admin import ServiceAppAdmin,SliceInline,ServiceAttrAsTabInline, ReadOnlyAwareAdmin, XOSTabularInline, SliderWidget, ServicePrivilegeInline
13from core.middleware import get_request
14
15from functools import update_wrapper
16from django.contrib.admin.views.main import ChangeList
17from django.core.urlresolvers import reverse, NoReverseMatch
18from django.contrib.admin.utils import quote
19
20from filteredadmin import FilteredChangeList, FilteredAdmin, FilteredInline
21
22class HpcServiceForm(forms.ModelForm):
23 scale = forms.IntegerField(widget = SliderWidget, required=False)
24
25 def __init__(self, *args, **kwargs):
26 super(HpcServiceForm, self).__init__(*args, **kwargs)
27 if ("instance" in kwargs) and (hasattr(kwargs["instance"], "scale")):
28 self.fields['scale'].initial = kwargs["instance"].scale
29
30 def save(self, *args, **kwargs):
31 if self.cleaned_data['scale']:
32 self.instance.scale = self.cleaned_data['scale']
33
34 return super(HpcServiceForm, self).save(*args, **kwargs)
35
36class HpcServiceAdmin(ReadOnlyAwareAdmin):
37 model = HpcService
38 verbose_name = "HPC Service"
39 verbose_name_plural = "HPC Service"
40 list_display = ("backend_status_icon", "name","enabled")
41 list_display_links = ('backend_status_icon', 'name', )
42 fieldsets = [(None, {'fields': ['backend_status_text', 'name','scale','enabled','versionNumber', 'description', "cmi_hostname", "hpc_port80", "watcher_hpc_network", "watcher_dnsredir_network", "watcher_dnsdemux_network"], 'classes':['suit-tab suit-tab-general']})]
43 readonly_fields = ('backend_status_text', )
44 inlines = [SliceInline,ServiceAttrAsTabInline,ServicePrivilegeInline]
45 form = HpcServiceForm
46
47 extracontext_registered_admins = True
48
49 user_readonly_fields = ["name", "enabled", "versionNumber", "description"]
50
51 suit_form_tabs =(('general', 'HPC Service Details'),
52 ('administration', 'Administration'),
53 ('tools', 'Tools'),
54 ('slices','Slices'),
55 ('serviceattrs','Additional Attributes'),
56 ('serviceprivileges','Privileges'),
57 )
58
59 suit_form_includes = (('hpcadmin.html', 'top', 'administration'),
60 ('hpctools.html', 'top', 'tools') )
61
62 def url_for_model_changelist(self, request, model):
63 if not request.resolver_match.args:
64 return reverse('admin:%s_%s_changelist' % (model._meta.app_label, model._meta.model_name), current_app=model._meta.app_label)
65 else:
66 obj_id = request.resolver_match.args[0]
67 changelist_url = reverse('admin:%s_%s_filteredchangelist' % (model._meta.app_label, model._meta.model_name), args=(obj_id,), current_app=model._meta.app_label)
68 return changelist_url
69
70class HPCAdmin(FilteredAdmin):
71 # Change the application breadcrumb to point to an HPC Service if one is
72 # defined
73
74 custom_app_breadcrumb_name = "Hpc"
75 @property
76 def custom_app_breadcrumb_url(self):
77 services = HpcService.objects.all()
78 if len(services)==1:
79 return "/admin/hpc/hpcservice/%s/" % services[0].id
80 else:
81 return "/admin/hpc/hpcservice/"
82
83class CDNPrefixInline(FilteredInline):
84 model = CDNPrefix
85 extra = 0
86 suit_classes = 'suit-tab suit-tab-prefixes'
87 fields = ('backend_status_icon', 'cdn_prefix_id', 'prefix', 'defaultOriginServer', 'enabled')
88 readonly_fields = ('backend_status_icon', 'cdn_prefix_id',)
89
90class OriginServerInline(FilteredInline):
91 model = OriginServer
92 extra = 0
93 suit_classes = 'suit-tab suit-tab-origins'
94 fields = ('backend_status_icon', 'origin_server_id', 'url')
95 readonly_fields = ('backend_status_icon', 'origin_server_id')
96
97class ContentProviderInline(FilteredInline):
98 model = ContentProvider
99 extra = 0
100 suit_classes = 'suit-tab suit-tab-cps'
101 fields = ('backend_status_icon', 'content_provider_id', 'name', 'enabled')
102 readonly_fields = ('backend_status_icon', 'content_provider_id',)
103
104class OriginServerAdmin(HPCAdmin):
105 list_display = ('backend_status_icon', 'url','protocol','redirects','contentProvider','authenticated','enabled' )
106 list_display_links = ('backend_status_icon', 'url', )
107
108 fields = ('backend_status_text', 'url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description' )
109 readonly_fields = ('backend_status_text', 'origin_server_id',)
110 user_readonly_fields = ('url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description')
111
112class ContentProviderForm(forms.ModelForm):
113 users = forms.ModelMultipleChoiceField(
114 queryset=User.objects.all(),
115 required=False,
116 help_text="Select which users can manage this ContentProvider",
117 widget=FilteredSelectMultiple(
118 verbose_name=('Users'), is_stacked=False
119 )
120 )
121
122 class Meta:
123 model = ContentProvider
124 widgets = {
125 'serviceProvider' : LinkedSelect
126 }
127 fields = '__all__'
128
129 def __init__(self, *args, **kwargs):
130 request = kwargs.pop('request', None)
131 super(ContentProviderForm, self).__init__(*args, **kwargs)
132
133 if self.instance and self.instance.pk:
134 self.fields['users'].initial = self.instance.users.all()
135
136class ContentProviderAdmin(HPCAdmin):
137 form = ContentProviderForm
138 list_display = ('backend_status_icon', 'name','description','enabled' )
139 list_display_links = ('backend_status_icon', 'name', )
140 readonly_fields = ('backend_status_text', )
141 admin_readonly_fields = ('backend_status_text', )
142 cp_readonly_fields = ('backend_status_text', 'name', 'enabled', 'serviceProvider', 'users')
143 fieldsets = [ (None, {'fields': ['backend_status_text', 'name','enabled','description','serviceProvider','users'], 'classes':['suit-tab suit-tab-general']})]
144
145 inlines = [CDNPrefixInline, OriginServerInline]
146
147 user_readonly_fields = ('name','description','enabled','serviceProvider','users')
148
149 suit_form_tabs = (('general','Details'),('prefixes','CDN Prefixes'), ('origins','Origin Servers'))
150
151 def change_view(self,request, *args, **kwargs):
152 if request.user.is_admin:
153 self.readonly_fields = self.admin_readonly_fields
154 else:
155 self.readonly_fields = self.cp_readonly_fields
156
157 return super(ContentProviderAdmin, self).change_view(request, *args, **kwargs)
158
159 def has_add_permission(self, request):
160 return request.user.is_admin
161
162 def has_delete_permission(self, request, obj=None):
163 return request.user.is_admin
164
165class ServiceProviderAdmin(HPCAdmin):
166 list_display = ('backend_status_icon', 'name', 'description', 'enabled')
167 list_display_links = ('backend_status_icon', 'name', )
168 fieldsets = [
169 (None, {'fields': ['backend_status_text', 'name','description','enabled', 'hpcService'], 'classes':['suit-tab suit-tab-general']})]
170#, ('Content Providers', {'fields':['contentProviders'],'classes':['suit-tab suit-tab-cps']})]
171
172 readonly_fields = ('backend_status_text', )
173 user_readonly_fields = ('name', 'description', 'enabled')
174
175 suit_form_tabs = (('general','Details'),('cps','Content Providers'))
176 inlines = [ContentProviderInline]
177
178class CDNPrefixForm(forms.ModelForm):
179 class Meta:
180 widgets = {
181 'contentProvider' : LinkedSelect
182 }
183 fields = '__all__'
184
185class CDNPrefixAdmin(HPCAdmin):
186 form = CDNPrefixForm
187 list_display = ['backend_status_icon', 'prefix','contentProvider']
188 list_display_links = ('backend_status_icon', 'prefix', )
189 fields = ['backend_status_text', 'prefix', 'contentProvider', 'cdn_prefix_id', 'description', 'defaultOriginServer', 'enabled']
190 readonly_fields = ('backend_status_text', )
191 user_readonly_fields = ['prefix','contentProvider', "cdn_prefix_id", "description", "defaultOriginServer", "enabled"]
192
193class SiteMapAdmin(HPCAdmin):
194 model = SiteMap
195 verbose_name = "Site Map"
196 verbose_name_plural = "Site Map"
197 list_display = ("backend_status_icon", "name", "contentProvider", "serviceProvider")
198 list_display_links = ('backend_status_icon', 'name', )
199 fields = ['backend_status_text', 'name', 'hpcService', 'cdnPrefix', 'contentProvider', 'serviceProvider', 'map', 'map_id']
200 user_readonly_fields = ('backend_status_text', "name", "hpcService", "cdnPrefix", "contentProvider", "serviceProvider", "description", "map")
201 readonly_fields = ('backend_status_text', )
202
203class AccessMapAdmin(HPCAdmin):
204 model = AccessMap
205 verbose_name = "Access Map"
206 verbose_name_plural = "Access Map"
207 list_display = ("backend_status_icon", "name", "contentProvider")
208 list_display_links = ('backend_status_icon', 'name', )
209 user_readonly_fields = ('backend_status_text', "name", "contentProvider", "description", "map")
210 readonly_fields = ('backend_status_text', )
211
212class HpcHealthCheckAdmin(HPCAdmin):
213 model = HpcHealthCheck
214 verbose_name = "Health Check"
215 verbose_name = "Health Checks"
216 list_display = ["backend_status_icon", "resource_name", "kind"]
217 list_display_links = ["backend_status_icon", "resource_name"]
218 fields = ["backend_status_text", "hpcService", "resource_name", "kind", "result_contains", "result_min_size", "result_max_size"]
219 readonly_fields = ["backend_status_text",]
220
221admin.site.register(ServiceProvider, ServiceProviderAdmin)
222admin.site.register(ContentProvider, ContentProviderAdmin)
223admin.site.register(CDNPrefix, CDNPrefixAdmin)
224admin.site.register(OriginServer,OriginServerAdmin)
225admin.site.register(HpcService, HpcServiceAdmin)
226admin.site.register(SiteMap, SiteMapAdmin)
227admin.site.register(AccessMap, AccessMapAdmin)
228admin.site.register(HpcHealthCheck, HpcHealthCheckAdmin)
229