+def backend_icon(value):
+ if value == "":
+ return ""
+ elif value == "Provisioning in progress":
+ return '<img src="/static/admin/img/icon_clock.gif">'
+ else:
+ return '<img src="/static/admin/img/icon_error.gif">'
+
+class PlainTextWidget(forms.HiddenInput):
+ input_type = 'hidden'
+
+ def render(self, name, value, attrs=None):
+ if value is None:
+ value = ''
+ return mark_safe(str(value) + super(PlainTextWidget, self).render(name, value, attrs))
+
+class BackendStatusIconWidget(forms.Widget):
+ def render(self, name, value, attrs=None):
+ return mark_safe('<div title="%s">%s</div>' % (value, backend_icon(value)))
+
+class BackendStatusFullWidget(forms.Widget):
+ def render(self, name, value, attrs=None):
+ return mark_safe('%s %s' % (backend_icon(value), value))
+
+class ReadOnlyAwareAdmin(admin.ModelAdmin):
+
+ def has_add_permission(self, request, obj=None):
+ return (not self.__user_is_readonly(request))
+
+ def has_delete_permission(self, request, obj=None):
+ return (not self.__user_is_readonly(request))
+
+ def save_model(self, request, obj, form, change):
+ if self.__user_is_readonly(request):
+ raise PermissionDenied
+ #pass
+ else:
+ return super(ReadOnlyAwareAdmin, self).save_model(request, obj, form, change)
+
+ def get_actions(self,request):
+ actions = super(ReadOnlyAwareAdmin,self).get_actions(request)
+
+ if self.__user_is_readonly(request):
+ if 'delete_selected' in actions:
+ del actions['delete_selected']
+
+ return actions
+
+ def change_view(self,request,object_id, extra_context=None):
+ if self.__user_is_readonly(request):
+ if not hasattr(self, "readonly_save"):\r
+ # save the original readonly fields\r
+ self.readonly_save = self.readonly_fields\r
+ self.inlines_save = self.inlines\r
+ if hasattr(self, "user_readonly_fields"):\r
+ self.readonly_fields=self.user_readonly_fields\r
+ if hasattr(self, "user_readonly_inlines"):\r
+ self.inlines = self.user_readonly_inlines\r
+ else:\r
+ if hasattr(self, "readonly_save"):\r
+ # restore the original readonly fields\r
+ self.readonly_fields = self.readonly_save\r
+ if hasattr(self, "inlines_save"):\r
+ self.inlines = self.inlines_save
+
+ try:
+ return super(ReadOnlyAwareAdmin, self).change_view(request, object_id, extra_context=extra_context)
+ except PermissionDenied:
+ pass
+ if request.method == 'POST':
+ raise PermissionDenied
+ request.readonly = True
+ return super(ReadOnlyAwareAdmin, self).change_view(request, object_id, extra_context=extra_context)
+
+ def __user_is_readonly(self, request):
+ return request.user.isReadOnlyUser()
+
+ def formfield_for_dbfield(self, db_field, **kwargs):
+ if (db_field.name == 'backend_status'):
+ kwargs['widget'] = BackendStatusFullWidget(attrs={"title": "foo"})
+ result = super(ReadOnlyAwareAdmin, self).formfield_for_dbfield(db_field, **kwargs)
+
+ if (db_field.name == 'backend_status'):
+ result.required = False
+
+ return result
+
+ def backend_status_icon(self, obj):
+ if hasattr(obj, 'backend_status'):
+ value = obj.backend_status
+ return mark_safe('<div title="%s">%s</div>' % (value, backend_icon(value)))
+ else:
+ return ""
+ backend_status_icon.short_description = ""
+
+
+class SingletonAdmin (ReadOnlyAwareAdmin):