blob: 20364b63eb7d92196d64c93b43e98eec9f9fe93e [file] [log] [blame]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -04001from django.contrib import admin
2
3from 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 django.contrib.contenttypes import generic
12from suit.widgets import LinkedSelect
Scott Baker7a056af2015-02-26 20:42:11 -080013from core.admin import ServiceAppAdmin,SliceInline,ServiceAttrAsTabInline, ReadOnlyAwareAdmin, XOSTabularInline
Scott Bakerbab421b2015-04-02 23:17:59 -070014
Scott Baker82f46172015-04-02 21:56:00 -070015from functools import update_wrapper
Scott Bakerbab421b2015-04-02 23:17:59 -070016from django.contrib.admin.views.main import ChangeList
17from django.core.urlresolvers import reverse
18from django.contrib.admin.utils import quote
19
20class FilteredChangeList(ChangeList):
Scott Baker31ebc472015-04-03 17:45:56 -070021 """ A special ChangeList with a doctored url_for_result function that
22 points to the filteredchange view instead of the default change
23 view.
24 """
25
Scott Bakerbab421b2015-04-02 23:17:59 -070026 def __init__(self, request, *args, **kwargs):
27 self.hpcService = getattr(request, "hpcService", None)
28 super(FilteredChangeList, self).__init__(request, *args, **kwargs)
29
30 def url_for_result(self, result):
31 if (self.hpcService is None):
32 return super(FilteredChangeList, self).url_for_result(result)
33
34 pk = getattr(result, self.pk_attname)
35 return reverse('admin:%s_%s_filteredchange' % (self.opts.app_label,
36 self.opts.model_name),
37 args=(quote(self.hpcService.id), quote(pk),),
38 current_app=self.model_admin.admin_site.name)
39
40class FilteredAdmin(ReadOnlyAwareAdmin):
41 """
42 One approach to filtering the HPC Admin views by HPCService. Encode
43 the HPCService into the URL for the changelist view. Then we could do our
44 custom filtering in self.filtered_changelist_view.
45
Scott Baker31ebc472015-04-03 17:45:56 -070046 To make this work, a few changes needed to be made to the change and
47 change_list templates.
48
49 1) "custom_changelist_breadcrumb_url" is used to replace the breadcrumb
50 in change and add views with one that will point back to the filtered
51 list.
52
53 2) "custom_add_url" is used to replace the Add button's URL with one
54 that points to the filtered add view.
55
56 TODO: Save & Add Another,
57 the add link when the changelist is empty
Scott Bakerbab421b2015-04-02 23:17:59 -070058 """
59
60 def get_urls(self):
61 from django.conf.urls import patterns, url
62
63 def wrap(view):
64 def wrapper(*args, **kwargs):
65 return self.admin_site.admin_view(view)(*args, **kwargs)
66 return update_wrapper(wrapper, view)
67
68 urls = super(FilteredAdmin, self).get_urls()
69 info = self.model._meta.app_label, self.model._meta.model_name
70 my_urls = [
71 url(r'^(.+)/filteredlist/$', wrap(self.filtered_changelist_view), name="%s_%s_filteredchangelist" % info),
Scott Baker31ebc472015-04-03 17:45:56 -070072 url(r'^(.+)/(.+)/filteredchange$', wrap(self.filtered_change_view), name='%s_%s_filteredchange' % info),
73 url(r'^(.+)/filteredadd/$', wrap(self.filtered_add_view), name='%s_%s_filteredadd' % info),
Scott Bakerbab421b2015-04-02 23:17:59 -070074 ]
75 return my_urls + urls
76
77 def add_extra_context(self, request, extra_context):
78 super(FilteredAdmin, self).add_extra_context(request, extra_context)
79
80 if getattr(request,"hpcService",None) is not None:
81 extra_context["custom_changelist_breadcrumb_url"] = "/admin/hpc/%s/%s/filteredlist/" % (self.model._meta.model_name, str(request.hpcService.id))
Scott Baker31ebc472015-04-03 17:45:56 -070082 extra_context["custom_add_url"] = "/admin/hpc/%s/%s/filteredadd/" % (self.model._meta.model_name, str(request.hpcService.id))
Scott Bakerbab421b2015-04-02 23:17:59 -070083
84 def filtered_changelist_view(self, request, hpcServiceId, extra_context=None):
85 request.hpcService = HpcService.objects.get(id=hpcServiceId)
Scott Baker31ebc472015-04-03 17:45:56 -070086 return self.changelist_view(request, extra_context=extra_context)
Scott Bakerbab421b2015-04-02 23:17:59 -070087
88 def filtered_change_view(self, request, hpcServiceId, object_id, extra_context=None):
89 request.hpcService = HpcService.objects.get(id=hpcServiceId)
Scott Baker31ebc472015-04-03 17:45:56 -070090 return self.change_view(request, object_id, extra_context=extra_context)
91
92 def filtered_add_view(self, request, hpcServiceId, extra_context=None):
93 request.hpcService = HpcService.objects.get(id=hpcServiceId)
94 return self.add_view(request, extra_context=extra_context)
Scott Bakerbab421b2015-04-02 23:17:59 -070095
96 def get_queryset(self, request):
97 # request.hpcService will be set in filtered_changelist_view so we can
98 # use it to filter what will be displayed in the list.
99 qs = self.model.objects.all()
100 if (getattr(request,"hpcService",None) is not None) and (hasattr(self.model, "filter_by_hpcService")):
101 qs = self.model.filter_by_hpcService(qs, request.hpcService)
102 return qs
103
104 def get_changelist(self, request, **kwargs):
105 # We implement a custom ChangeList, so the URLs point to the
106 # filtered_change_view rather than the default change_view.
107 return FilteredChangeList
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400108
Scott Baker82f46172015-04-02 21:56:00 -0700109class HpcServiceAdmin(ReadOnlyAwareAdmin):
Scott Baker446eaca2014-05-23 13:16:57 -0700110 model = HpcService
111 verbose_name = "HPC Service"
112 verbose_name_plural = "HPC Service"
Scott Baker63d1a552014-08-21 15:19:07 -0700113 list_display = ("backend_status_icon", "name","enabled")
114 list_display_links = ('backend_status_icon', 'name', )
Scott Bakerfeeb3832015-03-30 19:14:52 -0700115 fieldsets = [(None, {'fields': ['backend_status_text', 'name','enabled','versionNumber', 'description', "cmi_hostname"], 'classes':['suit-tab suit-tab-general']})]
Scott Baker40c00762014-08-21 16:55:59 -0700116 readonly_fields = ('backend_status_text', )
Scott Baker446eaca2014-05-23 13:16:57 -0700117 inlines = [SliceInline,ServiceAttrAsTabInline]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400118
Scott Baker82f46172015-04-02 21:56:00 -0700119 extracontext_registered_admins = True
120
Scott Baker446eaca2014-05-23 13:16:57 -0700121 user_readonly_fields = ["name", "enabled", "versionNumber", "description"]
Scott Baker446eaca2014-05-23 13:16:57 -0700122
123 suit_form_tabs =(('general', 'HPC Service Details'),
Scott Baker8642fa82015-02-26 17:05:02 -0800124 ('administration', 'Administration'),
Scott Bakerfbb71c72015-03-20 15:59:56 -0700125 ('tools', 'Tools'),
Scott Baker446eaca2014-05-23 13:16:57 -0700126 ('slices','Slices'),
127 ('serviceattrs','Additional Attributes'),
128 )
129
Scott Bakerfbb71c72015-03-20 15:59:56 -0700130 suit_form_includes = (('hpcadmin.html', 'top', 'administration'),
131 ('hpctools.html', 'top', 'tools') )
Scott Baker8642fa82015-02-26 17:05:02 -0800132
Scott Baker31ebc472015-04-03 17:45:56 -0700133 def url_for_model_changelist(self, request, model):
134 if not request.resolver_match.args:
135 return reverse('admin:%s_%s_changelist' % (model._meta.app_label, model._meta.model_name), current_app=model._meta.app_label)
136 else:
137 obj_id = request.resolver_match.args[0]
138 changelist_url = reverse('admin:%s_%s_filteredchangelist' % (model._meta.app_label, model._meta.model_name), args=(obj_id,), current_app=model._meta.app_label)
139 return changelist_url
140
Scott Bakerbab421b2015-04-02 23:17:59 -0700141class HPCAdmin(FilteredAdmin):
Scott Bakerc481b322015-02-27 12:12:14 -0800142 # Change the application breadcrumb to point to an HPC Service if one is
143 # defined
144
145 change_form_template = "admin/change_form_bc.html"
146 change_list_template = "admin/change_list_bc.html"
147 custom_app_breadcrumb_name = "Hpc"
148 @property
149 def custom_app_breadcrumb_url(self):
150 services = HpcService.objects.all()
151 if len(services)==1:
152 return "/admin/hpc/hpcservice/%s/" % services[0].id
153 else:
154 return "/admin/hpc/hpcservice/"
155
Scott Baker022cdcd2015-02-18 15:50:11 -0800156class CDNPrefixInline(XOSTabularInline):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400157 model = CDNPrefix
158 extra = 0
159 suit_classes = 'suit-tab suit-tab-prefixes'
Scott Baker40c00762014-08-21 16:55:59 -0700160 fields = ('backend_status_icon', 'cdn_prefix_id', 'prefix', 'defaultOriginServer', 'enabled')
161 readonly_fields = ('backend_status_icon', 'cdn_prefix_id',)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400162
Scott Baker022cdcd2015-02-18 15:50:11 -0800163class ContentProviderInline(XOSTabularInline):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400164 model = ContentProvider
165 extra = 0
166 suit_classes = 'suit-tab suit-tab-cps'
Scott Baker40c00762014-08-21 16:55:59 -0700167 fields = ('backend_status_icon', 'content_provider_id', 'name', 'enabled')
168 readonly_fields = ('backend_status_icon', 'content_provider_id',)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400169
Scott Bakerc481b322015-02-27 12:12:14 -0800170class OriginServerAdmin(HPCAdmin):
Scott Baker63d1a552014-08-21 15:19:07 -0700171 list_display = ('backend_status_icon', 'url','protocol','redirects','contentProvider','authenticated','enabled' )
172 list_display_links = ('backend_status_icon', 'url', )
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400173
Scott Baker40c00762014-08-21 16:55:59 -0700174 fields = ('backend_status_text', 'url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description' )
175 readonly_fields = ('backend_status_text', 'origin_server_id',)
Scott Baker2a21ba12014-06-03 12:25:40 -0700176 user_readonly_fields = ('url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description')
Scott Baker446eaca2014-05-23 13:16:57 -0700177
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400178class ContentProviderForm(forms.ModelForm):
179 class Meta:
180 widgets = {
181 'serviceProvider' : LinkedSelect
182 }
183
Scott Bakerc481b322015-02-27 12:12:14 -0800184class ContentProviderAdmin(HPCAdmin):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400185 form = ContentProviderForm
Scott Baker63d1a552014-08-21 15:19:07 -0700186 list_display = ('backend_status_icon', 'name','description','enabled' )
187 list_display_links = ('backend_status_icon', 'name', )
Scott Baker40c00762014-08-21 16:55:59 -0700188 fieldsets = [ (None, {'fields': ['backend_status_text', 'name','enabled','description','serviceProvider','users'], 'classes':['suit-tab suit-tab-general']})]
189 readonly_fields = ('backend_status_text', )
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400190
191 inlines = [CDNPrefixInline]
192
Scott Baker446eaca2014-05-23 13:16:57 -0700193 user_readonly_fields = ('name','description','enabled','serviceProvider','users')
Scott Baker446eaca2014-05-23 13:16:57 -0700194
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400195 suit_form_tabs = (('general','Details'),('prefixes','CDN Prefixes'))
196
Scott Bakerc481b322015-02-27 12:12:14 -0800197class ServiceProviderAdmin(HPCAdmin):
Scott Baker63d1a552014-08-21 15:19:07 -0700198 list_display = ('backend_status_icon', 'name', 'description', 'enabled')
199 list_display_links = ('backend_status_icon', 'name', )
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400200 fieldsets = [
Scott Baker8f910612015-03-13 09:17:33 -0700201 (None, {'fields': ['backend_status_text', 'name','description','enabled', 'hpcService'], 'classes':['suit-tab suit-tab-general']})]
Scott Baker446eaca2014-05-23 13:16:57 -0700202#, ('Content Providers', {'fields':['contentProviders'],'classes':['suit-tab suit-tab-cps']})]
203
Scott Baker40c00762014-08-21 16:55:59 -0700204 readonly_fields = ('backend_status_text', )
Scott Baker446eaca2014-05-23 13:16:57 -0700205 user_readonly_fields = ('name', 'description', 'enabled')
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400206
207 suit_form_tabs = (('general','Details'),('cps','Content Providers'))
208 inlines = [ContentProviderInline]
209
210class CDNPrefixForm(forms.ModelForm):
211 class Meta:
212 widgets = {
213 'contentProvider' : LinkedSelect
214 }
215
Scott Bakerc481b322015-02-27 12:12:14 -0800216class CDNPrefixAdmin(HPCAdmin):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400217 form = CDNPrefixForm
Scott Baker63d1a552014-08-21 15:19:07 -0700218 list_display = ['backend_status_icon', 'prefix','contentProvider']
219 list_display_links = ('backend_status_icon', 'prefix', )
Scott Baker40c00762014-08-21 16:55:59 -0700220 fields = ['backend_status_text', 'prefix', 'contentProvider', 'cdn_prefix_id', 'description', 'defaultOriginServer', 'enabled']
221 readonly_fields = ('backend_status_text', )
Scott Baker446eaca2014-05-23 13:16:57 -0700222 user_readonly_fields = ['prefix','contentProvider', "cdn_prefix_id", "description", "defaultOriginServer", "enabled"]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400223
Scott Bakerc481b322015-02-27 12:12:14 -0800224class SiteMapAdmin(HPCAdmin):
Scott Baker53491082014-03-13 23:15:19 -0700225 model = SiteMap
226 verbose_name = "Site Map"
227 verbose_name_plural = "Site Map"
Scott Baker63d1a552014-08-21 15:19:07 -0700228 list_display = ("backend_status_icon", "name", "contentProvider", "serviceProvider")
229 list_display_links = ('backend_status_icon', 'name', )
Scott Baker7e3b78c2015-03-13 09:24:25 -0700230 fields = ['backend_status_text', 'name', 'hpcService', 'cdnPrefix', 'contentProvider', 'serviceProvider', 'map', 'map_id']
231 user_readonly_fields = ('backend_status_text', "name", "hpcService", "cdnPrefix", "contentProvider", "serviceProvider", "description", "map")
Scott Baker40c00762014-08-21 16:55:59 -0700232 readonly_fields = ('backend_status_text', )
Scott Baker53491082014-03-13 23:15:19 -0700233
Scott Bakerc481b322015-02-27 12:12:14 -0800234class AccessMapAdmin(HPCAdmin):
Scott Baker53491082014-03-13 23:15:19 -0700235 model = AccessMap
236 verbose_name = "Access Map"
237 verbose_name_plural = "Access Map"
Scott Baker63d1a552014-08-21 15:19:07 -0700238 list_display = ("backend_status_icon", "name", "contentProvider")
239 list_display_links = ('backend_status_icon', 'name', )
Scott Baker40c00762014-08-21 16:55:59 -0700240 user_readonly_fields = ('backend_status_text', "name", "contentProvider", "description", "map")
241 readonly_fields = ('backend_status_text', )
Scott Baker53491082014-03-13 23:15:19 -0700242
Scott Baker8977c962015-03-18 17:37:46 -0700243class HpcHealthCheckAdmin(HPCAdmin):
244 model = HpcHealthCheck
245 verbose_name = "Health Check"
246 verbose_name = "Health Checks"
247 list_display = ["backend_status_icon", "resource_name", "kind"]
248 list_display_links = ["backend_status_icon", "resource_name"]
249 fields = ["backend_status_text", "hpcService", "resource_name", "kind", "result_contains", "result_min_size", "result_max_size"]
250 readonly_fields = ["backend_status_text",]
251
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400252admin.site.register(ServiceProvider, ServiceProviderAdmin)
253admin.site.register(ContentProvider, ContentProviderAdmin)
254admin.site.register(CDNPrefix, CDNPrefixAdmin)
255admin.site.register(OriginServer,OriginServerAdmin)
Scott Baker446eaca2014-05-23 13:16:57 -0700256admin.site.register(HpcService, HpcServiceAdmin)
Scott Baker53491082014-03-13 23:15:19 -0700257admin.site.register(SiteMap, SiteMapAdmin)
258admin.site.register(AccessMap, AccessMapAdmin)
Scott Baker8977c962015-03-18 17:37:46 -0700259admin.site.register(HpcHealthCheck, HpcHealthCheckAdmin)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400260