瀏覽代碼

HUE-8530 [organization] Unify permissions for the admin wizard

Romain 5 年之前
父節點
當前提交
000172ce49

+ 1 - 1
apps/about/src/about/templates/admin_wizard.mako

@@ -89,7 +89,7 @@ ${ layout.menubar(section='quick_start') }
 
 
           <div id="step3" class="stepDetails hide">
           <div id="step3" class="stepDetails hide">
             <div>
             <div>
-              <h3>${ _('Install individual application examples') }</h3>
+              <h3>${ _('Install some data examples') }</h3>
               <ul class="unstyled samples">
               <ul class="unstyled samples">
               % if 'hive' in app_names:
               % if 'hive' in app_names:
                   <li>
                   <li>

+ 2 - 2
apps/about/src/about/views.py

@@ -22,7 +22,7 @@ import logging
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from desktop import appmanager
 from desktop import appmanager
-from desktop.auth.backend import is_admin
+from desktop.auth.backend import is_hue_admin
 from desktop.auth.decorators import admin_required
 from desktop.auth.decorators import admin_required
 from desktop.lib.django_util import JsonResponse, render, login_notrequired
 from desktop.lib.django_util import JsonResponse, render, login_notrequired
 from desktop.log.access import access_log_level
 from desktop.log.access import access_log_level
@@ -31,7 +31,7 @@ from desktop.views import collect_usage
 
 
 
 
 def admin_wizard(request):
 def admin_wizard(request):
-  if is_admin(request.user):
+  if is_hue_admin(request.user):
     apps = appmanager.get_apps(request.user)
     apps = appmanager.get_apps(request.user)
   else:
   else:
     apps = []
     apps = []

+ 7 - 7
desktop/core/src/desktop/templates/about_layout.mako

@@ -44,7 +44,7 @@ def is_selected(section, matcher):
                   <a href="${ url('about:admin_wizard') }">${_('Quick start')}</a>
                   <a href="${ url('about:admin_wizard') }">${_('Quick start')}</a>
                 </li>
                 </li>
               % endif
               % endif
-              % if is_admin(user):
+              % if is_hue_admin(user):
                 <li class="${is_selected(section, 'dump_config')}">
                 <li class="${is_selected(section, 'dump_config')}">
                   <a href="${ url('desktop.views.dump_config') }">${_('Configuration')}</a>
                   <a href="${ url('desktop.views.dump_config') }">${_('Configuration')}</a>
                 </li>
                 </li>
@@ -54,12 +54,12 @@ def is_selected(section, matcher):
                   <a href="${ url('desktop.lib.connectors.views.index') }">${_('Connectors')}</a>
                   <a href="${ url('desktop.lib.connectors.views.index') }">${_('Connectors')}</a>
                 </li>
                 </li>
               % endif
               % endif
-              % if is_admin(user):
-                % if ANALYTICS.IS_ENABLED.get():
-                <li class="${is_selected(section, 'analytics')}">
-                  <a href="${ url('desktop.lib.analytics.views.index') }">${_('Analytics')}</a>
-                </li>
-                % endif
+              % if ANALYTICS.IS_ENABLED.get() and (is_hue_admin(user) or is_admin(user)):
+              <li class="${is_selected(section, 'analytics')}">
+                <a href="${ url('desktop.lib.analytics.views.index') }">${_('Analytics')}</a>
+              </li>
+              % endif
+              % if is_hue_admin(user):
                 <li class="${is_selected(section, 'log_view')}">
                 <li class="${is_selected(section, 'log_view')}">
                   <a href="${ url('desktop.views.log_view') }">${_('Server Logs')}</a>
                   <a href="${ url('desktop.views.log_view') }">${_('Server Logs')}</a>
                 </li>
                 </li>

+ 4 - 6
desktop/core/src/desktop/templates/common_header.mako

@@ -15,18 +15,16 @@
 ## limitations under the License.
 ## limitations under the License.
 <%!
 <%!
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
+from webpack_loader.templatetags.webpack_loader import render_bundle
+
+from metadata.conf import has_optimizer, OPTIMIZER
 
 
 from desktop import conf
 from desktop import conf
+from desktop.auth.backend import is_admin
 from desktop.conf import USE_NEW_EDITOR
 from desktop.conf import USE_NEW_EDITOR
 from desktop.models import hue_version
 from desktop.models import hue_version
 from desktop.lib.i18n import smart_unicode
 from desktop.lib.i18n import smart_unicode
 
 
-from metadata.conf import has_optimizer, OPTIMIZER
-
-from desktop.auth.backend import is_admin
-
-from webpack_loader.templatetags.webpack_loader import render_bundle
-
 home_url = url('desktop_views_home')
 home_url = url('desktop_views_home')
 if USE_NEW_EDITOR.get():
 if USE_NEW_EDITOR.get():
   home_url = url('desktop_views_home2')
   home_url = url('desktop_views_home2')

+ 1 - 1
desktop/core/src/desktop/templates/dump_config.mako

@@ -19,7 +19,7 @@ import logging
 import sys
 import sys
 
 
 from desktop.views import commonheader, commonfooter
 from desktop.views import commonheader, commonfooter
-from django.utils.translation import ugettext as _
+
 
 
 LOG = logging.getLogger(__name__)
 LOG = logging.getLogger(__name__)
 %>
 %>

+ 31 - 28
desktop/core/src/desktop/views.py

@@ -50,6 +50,7 @@ import desktop.log.log_buffer
 from desktop import appmanager
 from desktop import appmanager
 from desktop.api import massaged_tags_for_json, massaged_documents_for_json, _get_docs
 from desktop.api import massaged_tags_for_json, massaged_documents_for_json, _get_docs
 from desktop.auth.backend import is_admin
 from desktop.auth.backend import is_admin
+from desktop.auth.decorators import admin_required, hue_admin_required
 from desktop.conf import USE_NEW_EDITOR, HUE_LOAD_BALANCER, get_clusters, ENABLE_CONNECTORS
 from desktop.conf import USE_NEW_EDITOR, HUE_LOAD_BALANCER, get_clusters, ENABLE_CONNECTORS
 from desktop.lib import django_mako, fsmanager
 from desktop.lib import django_mako, fsmanager
 from desktop.lib.conf import GLOBAL_CONFIG, BoundConfig, _configs_from_dir
 from desktop.lib.conf import GLOBAL_CONFIG, BoundConfig, _configs_from_dir
@@ -180,6 +181,7 @@ def log_analytics(request):
   return JsonResponse({'status': 0})
   return JsonResponse({'status': 0})
 
 
 
 
+@hue_admin_required
 @access_log_level(logging.WARN)
 @access_log_level(logging.WARN)
 def log_view(request):
 def log_view(request):
   """
   """
@@ -187,26 +189,31 @@ def log_view(request):
   If it is attached to the root logger, this view will display that history,
   If it is attached to the root logger, this view will display that history,
   otherwise it will report that it can't be found.
   otherwise it will report that it can't be found.
   """
   """
-  if not is_admin(request.user):
-    return HttpResponse(_("You must be a superuser."))
-
   hostname = socket.gethostname()
   hostname = socket.gethostname()
   l = logging.getLogger()
   l = logging.getLogger()
+
   for h in l.handlers:
   for h in l.handlers:
     if isinstance(h, desktop.log.log_buffer.FixedBufferHandler):
     if isinstance(h, desktop.log.log_buffer.FixedBufferHandler):
-      return render('logs.mako', request, dict(log=[l for l in h.buf], query=request.GET.get("q", ""), hostname=hostname, is_embeddable=request.GET.get('is_embeddable', False)))
-
-  return render('logs.mako', request, dict(log=[_("No logs found!")], query='', hostname=hostname, is_embeddable=request.GET.get('is_embeddable', False)))
+      return render('logs.mako', request,
+        dict(
+          log=[l for l in h.buf],
+          query=request.GET.get("q", ""),
+          hostname=hostname, is_embeddable=request.GET.get('is_embeddable', False)
+        )
+      )
+
+  return render('logs.mako', request, dict(
+      log=[_("No logs found!")], query='', hostname=hostname, is_embeddable=request.GET.get('is_embeddable', False)
+    )
+  )
 
 
 
 
+@hue_admin_required
 @access_log_level(logging.WARN)
 @access_log_level(logging.WARN)
 def download_log_view(request):
 def download_log_view(request):
   """
   """
   Zip up the log buffer and then return as a file attachment.
   Zip up the log buffer and then return as a file attachment.
   """
   """
-  if not is_admin(request.user):
-    return HttpResponse(_("You must be a superuser."))
-
   l = logging.getLogger()
   l = logging.getLogger()
   for h in l.handlers:
   for h in l.handlers:
     if isinstance(h, desktop.log.log_buffer.FixedBufferHandler):
     if isinstance(h, desktop.log.log_buffer.FixedBufferHandler):
@@ -280,6 +287,7 @@ def status_bar(request):
   return HttpResponse(resp)
   return HttpResponse(resp)
 
 
 
 
+@hue_admin_required
 def dump_config(request):
 def dump_config(request):
   if not is_admin(request.user):
   if not is_admin(request.user):
     return HttpResponse(_("You must be a superuser."))
     return HttpResponse(_("You must be a superuser."))
@@ -287,26 +295,23 @@ def dump_config(request):
   return render("dump_config.mako", request, {})
   return render("dump_config.mako", request, {})
 
 
 
 
+@hue_admin_required
 @access_log_level(logging.WARN)
 @access_log_level(logging.WARN)
 def threads(request):
 def threads(request):
   """Dumps out server threads. Useful for debugging."""
   """Dumps out server threads. Useful for debugging."""
   out = string_io()
   out = string_io()
   dump_traceback(file=out)
   dump_traceback(file=out)
 
 
-  if not is_admin(request.user):
-    return HttpResponse(_("You must be a superuser."))
-
   if request.is_ajax():
   if request.is_ajax():
     return HttpResponse(out.getvalue(), content_type="text/plain")
     return HttpResponse(out.getvalue(), content_type="text/plain")
   else:
   else:
     return render("threads.mako", request, {'text': out.getvalue(), 'is_embeddable': request.GET.get('is_embeddable', False)})
     return render("threads.mako", request, {'text': out.getvalue(), 'is_embeddable': request.GET.get('is_embeddable', False)})
 
 
 
 
+@hue_admin_required
 @access_log_level(logging.WARN)
 @access_log_level(logging.WARN)
 def memory(request):
 def memory(request):
   """Dumps out server threads. Useful for debugging."""
   """Dumps out server threads. Useful for debugging."""
-  if not is_admin(request.user):
-    return HttpResponse(_("You must be a superuser."))
 
 
   if not hasattr(settings, 'MEMORY_PROFILER'):
   if not hasattr(settings, 'MEMORY_PROFILER'):
     return HttpResponse(_("You must enable the memory profiler via the memory_profiler config in the hue.ini."))
     return HttpResponse(_("You must enable the memory profiler via the memory_profiler config in the hue.ini."))
@@ -353,6 +358,7 @@ def global_js_constants(request):
     }
     }
   }), content_type="application/javascript")
   }), content_type="application/javascript")
 
 
+
 def ace_sql_location_worker(request):
 def ace_sql_location_worker(request):
   return HttpResponse(render('ace_sql_location_worker.mako', request, None), content_type="application/javascript")
   return HttpResponse(render('ace_sql_location_worker.mako', request, None), content_type="application/javascript")
 
 
@@ -427,6 +433,7 @@ _MAX_LOG_FRONTEND_EVENT_LENGTH = 1024
 
 
 _LOG_FRONTEND_LOGGER = logging.getLogger("desktop.views.log_frontend_event")
 _LOG_FRONTEND_LOGGER = logging.getLogger("desktop.views.log_frontend_event")
 
 
+
 @login_notrequired
 @login_notrequired
 def log_frontend_event(request):
 def log_frontend_event(request):
   """
   """
@@ -695,10 +702,9 @@ def collect_validation_messages(conf, error_list):
     error_list.append(error)
     error_list.append(error)
 
 
 
 
+@admin_required
 def check_config(request):
 def check_config(request):
   """Check config and view for the list of errors"""
   """Check config and view for the list of errors"""
-  if not is_admin(request.user):
-    return HttpResponse(_("You must be a superuser."))
 
 
   context = {
   context = {
     'conf_dir': os.path.realpath(os.getenv("HUE_CONF_DIR", get_desktop_root("conf"))),
     'conf_dir': os.path.realpath(os.getenv("HUE_CONF_DIR", get_desktop_root("conf"))),
@@ -711,19 +717,20 @@ def check_config(request):
     return render('check_config.mako', request, context, force_template=True)
     return render('check_config.mako', request, context, force_template=True)
 
 
 
 
+@admin_required
 def check_config_ajax(request):
 def check_config_ajax(request):
   """Alert administrators about configuration problems."""
   """Alert administrators about configuration problems."""
-  if not is_admin(request.user):
-    return HttpResponse('')
 
 
   error_list = _get_config_errors(request)
   error_list = _get_config_errors(request)
   if not error_list:
   if not error_list:
     # Return an empty response, rather than using the mako template, for performance.
     # Return an empty response, rather than using the mako template, for performance.
     return HttpResponse('')
     return HttpResponse('')
-  return render('config_alert_dock.mako',
-                request,
-                dict(error_list=error_list),
-                force_template=True)
+  else:
+    return render('config_alert_dock.mako',
+        request,
+        dict(error_list=error_list),
+        force_template=True
+    )
 
 
 
 
 def get_debug_level(request):
 def get_debug_level(request):
@@ -731,20 +738,16 @@ def get_debug_level(request):
 
 
 
 
 @require_POST
 @require_POST
+@admin_required
 def set_all_debug(request):
 def set_all_debug(request):
-  if not is_admin(request.user):
-    return JsonResponse({'status': 1, 'message': _('You must be a superuser.')})
-
   _set_all_debug()
   _set_all_debug()
 
 
   return JsonResponse({'status': 0, 'debug_all': True})
   return JsonResponse({'status': 0, 'debug_all': True})
 
 
 
 
 @require_POST
 @require_POST
+@admin_required
 def reset_all_debug(request):
 def reset_all_debug(request):
-  if not is_admin(request.user):
-    return JsonResponse({'status': 1, 'message': _('You must be a superuser.')})
-
   _reset_all_debug()
   _reset_all_debug()
 
 
   return JsonResponse({'status': 0, 'debug_all': False})
   return JsonResponse({'status': 0, 'debug_all': False})