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