blob: 138c61a4afaf651b1a16fecf731a51130b591dfb [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 Bakera9b8f612015-02-26 20:42:11 -080013from core.admin import ServiceAppAdmin,SliceInline,ServiceAttrAsTabInline, ReadOnlyAwareAdmin, XOSTabularInline
Scott Baker26a54942015-04-02 23:17:59 -070014
Scott Baker0e0d9682015-04-02 21:56:00 -070015from functools import update_wrapper
Scott Baker26a54942015-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):
21 def __init__(self, request, *args, **kwargs):
22 self.hpcService = getattr(request, "hpcService", None)
23 super(FilteredChangeList, self).__init__(request, *args, **kwargs)
24
25 def url_for_result(self, result):
26 if (self.hpcService is None):
27 return super(FilteredChangeList, self).url_for_result(result)
28
29 pk = getattr(result, self.pk_attname)
30 return reverse('admin:%s_%s_filteredchange' % (self.opts.app_label,
31 self.opts.model_name),
32 args=(quote(self.hpcService.id), quote(pk),),
33 current_app=self.model_admin.admin_site.name)
34
35class FilteredAdmin(ReadOnlyAwareAdmin):
36 """
37 One approach to filtering the HPC Admin views by HPCService. Encode
38 the HPCService into the URL for the changelist view. Then we could do our
39 custom filtering in self.filtered_changelist_view.
40
41 Note: also need to deal with the breadcrumb and the add view.
42 """
43
44 def get_urls(self):
45 from django.conf.urls import patterns, url
46
47 def wrap(view):
48 def wrapper(*args, **kwargs):
49 return self.admin_site.admin_view(view)(*args, **kwargs)
50 return update_wrapper(wrapper, view)
51
52 urls = super(FilteredAdmin, self).get_urls()
53 info = self.model._meta.app_label, self.model._meta.model_name
54 my_urls = [
55 url(r'^(.+)/filteredlist/$', wrap(self.filtered_changelist_view), name="%s_%s_filteredchangelist" % info),
56 url(r'^(.+)/(.+)/$', wrap(self.filtered_change_view), name='%s_%s_filteredchange' % info),
57 ]
58 return my_urls + urls
59
60 def add_extra_context(self, request, extra_context):
61 super(FilteredAdmin, self).add_extra_context(request, extra_context)
62
63 if getattr(request,"hpcService",None) is not None:
64 extra_context["custom_changelist_breadcrumb_url"] = "/admin/hpc/%s/%s/filteredlist/" % (self.model._meta.model_name, str(request.hpcService.id))
65 #extra_context["custom_add_url"] = "/admin/hpc/%s/%s/add/" % (self.model._meta.model_name, str(request.hpcService.id))
66
67 def filtered_changelist_view(self, request, hpcServiceId, extra_context=None):
68 request.hpcService = HpcService.objects.get(id=hpcServiceId)
69 return self.changelist_view(request, extra_context)
70
71 def filtered_change_view(self, request, hpcServiceId, object_id, extra_context=None):
72 request.hpcService = HpcService.objects.get(id=hpcServiceId)
73 return self.change_view(request, object_id, extra_context)
74
75 def get_queryset(self, request):
76 # request.hpcService will be set in filtered_changelist_view so we can
77 # use it to filter what will be displayed in the list.
78 qs = self.model.objects.all()
79 if (getattr(request,"hpcService",None) is not None) and (hasattr(self.model, "filter_by_hpcService")):
80 qs = self.model.filter_by_hpcService(qs, request.hpcService)
81 return qs
82
83 def get_changelist(self, request, **kwargs):
84 # We implement a custom ChangeList, so the URLs point to the
85 # filtered_change_view rather than the default change_view.
86 return FilteredChangeList
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040087
Scott Baker0e0d9682015-04-02 21:56:00 -070088class HpcServiceAdmin(ReadOnlyAwareAdmin):
Scott Baker446eaca2014-05-23 13:16:57 -070089 model = HpcService
90 verbose_name = "HPC Service"
91 verbose_name_plural = "HPC Service"
Scott Baker63d1a552014-08-21 15:19:07 -070092 list_display = ("backend_status_icon", "name","enabled")
93 list_display_links = ('backend_status_icon', 'name', )
Scott Baker1fa4e642015-03-30 19:14:52 -070094 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 -070095 readonly_fields = ('backend_status_text', )
Scott Baker446eaca2014-05-23 13:16:57 -070096 inlines = [SliceInline,ServiceAttrAsTabInline]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -040097
Scott Baker0e0d9682015-04-02 21:56:00 -070098 extracontext_registered_admins = True
99
Scott Baker446eaca2014-05-23 13:16:57 -0700100 user_readonly_fields = ["name", "enabled", "versionNumber", "description"]
Scott Baker446eaca2014-05-23 13:16:57 -0700101
102 suit_form_tabs =(('general', 'HPC Service Details'),
Scott Bakerd4050d92015-02-26 17:05:02 -0800103 ('administration', 'Administration'),
Scott Baker15c56a12015-03-20 15:59:56 -0700104 ('tools', 'Tools'),
Scott Baker446eaca2014-05-23 13:16:57 -0700105 ('slices','Slices'),
106 ('serviceattrs','Additional Attributes'),
107 )
108
Scott Baker15c56a12015-03-20 15:59:56 -0700109 suit_form_includes = (('hpcadmin.html', 'top', 'administration'),
110 ('hpctools.html', 'top', 'tools') )
Scott Bakerd4050d92015-02-26 17:05:02 -0800111
Scott Baker26a54942015-04-02 23:17:59 -0700112class HPCAdmin(FilteredAdmin):
Scott Bakerfbe38ee2015-02-27 12:12:14 -0800113 # Change the application breadcrumb to point to an HPC Service if one is
114 # defined
115
116 change_form_template = "admin/change_form_bc.html"
117 change_list_template = "admin/change_list_bc.html"
118 custom_app_breadcrumb_name = "Hpc"
119 @property
120 def custom_app_breadcrumb_url(self):
121 services = HpcService.objects.all()
122 if len(services)==1:
123 return "/admin/hpc/hpcservice/%s/" % services[0].id
124 else:
125 return "/admin/hpc/hpcservice/"
126
Scott Baker67db95f2015-02-18 15:50:11 -0800127class CDNPrefixInline(XOSTabularInline):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400128 model = CDNPrefix
129 extra = 0
130 suit_classes = 'suit-tab suit-tab-prefixes'
Scott Baker40c00762014-08-21 16:55:59 -0700131 fields = ('backend_status_icon', 'cdn_prefix_id', 'prefix', 'defaultOriginServer', 'enabled')
132 readonly_fields = ('backend_status_icon', 'cdn_prefix_id',)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400133
Scott Baker67db95f2015-02-18 15:50:11 -0800134class ContentProviderInline(XOSTabularInline):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400135 model = ContentProvider
136 extra = 0
137 suit_classes = 'suit-tab suit-tab-cps'
Scott Baker40c00762014-08-21 16:55:59 -0700138 fields = ('backend_status_icon', 'content_provider_id', 'name', 'enabled')
139 readonly_fields = ('backend_status_icon', 'content_provider_id',)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400140
Scott Bakerfbe38ee2015-02-27 12:12:14 -0800141class OriginServerAdmin(HPCAdmin):
Scott Baker63d1a552014-08-21 15:19:07 -0700142 list_display = ('backend_status_icon', 'url','protocol','redirects','contentProvider','authenticated','enabled' )
143 list_display_links = ('backend_status_icon', 'url', )
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400144
Scott Baker40c00762014-08-21 16:55:59 -0700145 fields = ('backend_status_text', 'url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description' )
146 readonly_fields = ('backend_status_text', 'origin_server_id',)
Scott Baker2a21ba12014-06-03 12:25:40 -0700147 user_readonly_fields = ('url','protocol','redirects','contentProvider','authenticated','enabled','origin_server_id','description')
Scott Baker446eaca2014-05-23 13:16:57 -0700148
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400149class ContentProviderForm(forms.ModelForm):
150 class Meta:
151 widgets = {
152 'serviceProvider' : LinkedSelect
153 }
154
Scott Bakerfbe38ee2015-02-27 12:12:14 -0800155class ContentProviderAdmin(HPCAdmin):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400156 form = ContentProviderForm
Scott Baker63d1a552014-08-21 15:19:07 -0700157 list_display = ('backend_status_icon', 'name','description','enabled' )
158 list_display_links = ('backend_status_icon', 'name', )
Scott Baker40c00762014-08-21 16:55:59 -0700159 fieldsets = [ (None, {'fields': ['backend_status_text', 'name','enabled','description','serviceProvider','users'], 'classes':['suit-tab suit-tab-general']})]
160 readonly_fields = ('backend_status_text', )
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400161
162 inlines = [CDNPrefixInline]
163
Scott Baker446eaca2014-05-23 13:16:57 -0700164 user_readonly_fields = ('name','description','enabled','serviceProvider','users')
Scott Baker446eaca2014-05-23 13:16:57 -0700165
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400166 suit_form_tabs = (('general','Details'),('prefixes','CDN Prefixes'))
167
Scott Bakerfbe38ee2015-02-27 12:12:14 -0800168class ServiceProviderAdmin(HPCAdmin):
Scott Baker63d1a552014-08-21 15:19:07 -0700169 list_display = ('backend_status_icon', 'name', 'description', 'enabled')
170 list_display_links = ('backend_status_icon', 'name', )
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400171 fieldsets = [
Scott Baker30350392015-03-13 09:17:33 -0700172 (None, {'fields': ['backend_status_text', 'name','description','enabled', 'hpcService'], 'classes':['suit-tab suit-tab-general']})]
Scott Baker446eaca2014-05-23 13:16:57 -0700173#, ('Content Providers', {'fields':['contentProviders'],'classes':['suit-tab suit-tab-cps']})]
174
Scott Baker40c00762014-08-21 16:55:59 -0700175 readonly_fields = ('backend_status_text', )
Scott Baker446eaca2014-05-23 13:16:57 -0700176 user_readonly_fields = ('name', 'description', 'enabled')
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400177
178 suit_form_tabs = (('general','Details'),('cps','Content Providers'))
179 inlines = [ContentProviderInline]
180
181class CDNPrefixForm(forms.ModelForm):
182 class Meta:
183 widgets = {
184 'contentProvider' : LinkedSelect
185 }
186
Scott Bakerfbe38ee2015-02-27 12:12:14 -0800187class CDNPrefixAdmin(HPCAdmin):
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400188 form = CDNPrefixForm
Scott Baker63d1a552014-08-21 15:19:07 -0700189 list_display = ['backend_status_icon', 'prefix','contentProvider']
190 list_display_links = ('backend_status_icon', 'prefix', )
Scott Baker40c00762014-08-21 16:55:59 -0700191 fields = ['backend_status_text', 'prefix', 'contentProvider', 'cdn_prefix_id', 'description', 'defaultOriginServer', 'enabled']
192 readonly_fields = ('backend_status_text', )
Scott Baker446eaca2014-05-23 13:16:57 -0700193 user_readonly_fields = ['prefix','contentProvider', "cdn_prefix_id", "description", "defaultOriginServer", "enabled"]
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400194
Scott Bakerfbe38ee2015-02-27 12:12:14 -0800195class SiteMapAdmin(HPCAdmin):
Scott Baker53491082014-03-13 23:15:19 -0700196 model = SiteMap
197 verbose_name = "Site Map"
198 verbose_name_plural = "Site Map"
Scott Baker63d1a552014-08-21 15:19:07 -0700199 list_display = ("backend_status_icon", "name", "contentProvider", "serviceProvider")
200 list_display_links = ('backend_status_icon', 'name', )
Scott Baker69873fd2015-03-13 09:24:25 -0700201 fields = ['backend_status_text', 'name', 'hpcService', 'cdnPrefix', 'contentProvider', 'serviceProvider', 'map', 'map_id']
202 user_readonly_fields = ('backend_status_text', "name", "hpcService", "cdnPrefix", "contentProvider", "serviceProvider", "description", "map")
Scott Baker40c00762014-08-21 16:55:59 -0700203 readonly_fields = ('backend_status_text', )
Scott Baker53491082014-03-13 23:15:19 -0700204
Scott Bakerfbe38ee2015-02-27 12:12:14 -0800205class AccessMapAdmin(HPCAdmin):
Scott Baker53491082014-03-13 23:15:19 -0700206 model = AccessMap
207 verbose_name = "Access Map"
208 verbose_name_plural = "Access Map"
Scott Baker63d1a552014-08-21 15:19:07 -0700209 list_display = ("backend_status_icon", "name", "contentProvider")
210 list_display_links = ('backend_status_icon', 'name', )
Scott Baker40c00762014-08-21 16:55:59 -0700211 user_readonly_fields = ('backend_status_text', "name", "contentProvider", "description", "map")
212 readonly_fields = ('backend_status_text', )
Scott Baker53491082014-03-13 23:15:19 -0700213
Scott Baker3b5fa5b2015-03-18 17:37:46 -0700214class HpcHealthCheckAdmin(HPCAdmin):
215 model = HpcHealthCheck
216 verbose_name = "Health Check"
217 verbose_name = "Health Checks"
218 list_display = ["backend_status_icon", "resource_name", "kind"]
219 list_display_links = ["backend_status_icon", "resource_name"]
220 fields = ["backend_status_text", "hpcService", "resource_name", "kind", "result_contains", "result_min_size", "result_max_size"]
221 readonly_fields = ["backend_status_text",]
222
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400223admin.site.register(ServiceProvider, ServiceProviderAdmin)
224admin.site.register(ContentProvider, ContentProviderAdmin)
225admin.site.register(CDNPrefix, CDNPrefixAdmin)
226admin.site.register(OriginServer,OriginServerAdmin)
Scott Baker446eaca2014-05-23 13:16:57 -0700227admin.site.register(HpcService, HpcServiceAdmin)
Scott Baker53491082014-03-13 23:15:19 -0700228admin.site.register(SiteMap, SiteMapAdmin)
229admin.site.register(AccessMap, AccessMapAdmin)
Scott Baker3b5fa5b2015-03-18 17:37:46 -0700230admin.site.register(HpcHealthCheck, HpcHealthCheckAdmin)
Siobhan Tullybfd11dc2013-09-03 12:59:24 -0400231