Răsfoiți Sursa

HUE-1176 [jb] Allow to customize the landing page / main button default action

     $.post("/desktop/api2/get_user_preferences/default_app", {
        set: ko.mapping.toJSON({app: 'editor', interpreter: 'pig'})
      }, function(data) {
        console.log(ko.mapping.toJSON(data));
      });

     $.post("/desktop/api2/get_user_preferences/default_app", {
        set: ko.mapping.toJSON({app: 'dashboard'})
      }, function(data) {
        console.log(ko.mapping.toJSON(data));
      });

     $.get("/desktop/api2/get_user_preferences/default_app", function(data) {
        console.log(ko.mapping.toJSON(data));
      });
Romain Rigaux 8 ani în urmă
părinte
comite
6574562fed

+ 34 - 1
desktop/core/src/desktop/api2.py

@@ -41,7 +41,8 @@ from desktop.lib.django_util import JsonResponse
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.export_csvxls import make_response
 from desktop.lib.i18n import smart_str, force_unicode
-from desktop.models import Document2, Document, Directory, FilesystemException, uuid_default, ClusterConfig
+from desktop.models import Document2, Document, Directory, FilesystemException, uuid_default, ClusterConfig,\
+  UserPreferences
 
 
 LOG = logging.getLogger(__name__)
@@ -574,6 +575,38 @@ def _update_imported_oozie_document(doc, uuids_map):
 
   return doc
 
+
+def user_preferences(request, key=None):
+  response = {'status': 0, 'data': {}}
+
+  if request.method != "POST":
+    if key is not None:
+      try:
+        x = UserPreferences.objects.get(user=request.user, key=key)
+        response['data'] = {key: x.value}
+      except UserPreferences.DoesNotExist:
+        response['data'] = None
+    else:
+      response['data'] = dict((x.key, x.value) for x in UserPreferences.objects.filter(user=request.user))
+  else:
+    if "set" in request.POST:
+      try:
+        x = UserPreferences.objects.get(user=request.user, key=key)
+      except UserPreferences.DoesNotExist:
+        x = UserPreferences(user=request.user, key=key)
+      x.value = request.POST["set"]
+      x.save()
+      response['data'] = {key: x.value}
+    elif "delete" in request.POST:
+      try:
+        x = UserPreferences.objects.get(user=request.user, key=key)
+        x.delete()
+      except UserPreferences.DoesNotExist:
+        pass
+
+  return JsonResponse(response)
+
+
 def search_entities(request):
   sources = json.loads(request.POST.get('sources')) or []
 

+ 5 - 5
desktop/core/src/desktop/lib/django_util_test.py

@@ -162,13 +162,13 @@ def test_reverse_with_get():
   # Basic view
   assert_equal("/", reverse_with_get("desktop.views.index"))
   # Arguments for the view
-  assert_equal("/desktop/prefs/foo", reverse_with_get("desktop.views.prefs", kwargs=dict(key="foo")))
+  assert_equal("/desktop/api2/get_user_preferences/foo", reverse_with_get("desktop.api2.user_preferences", kwargs=dict(key="foo")))
   # Arguments for the view as well as GET parameters
-  assert_equal("/desktop/prefs/foo?a=1&b=2",
-    reverse_with_get("desktop.views.prefs", kwargs=dict(key="foo"), get=dict(a=1,b=2)))
+  assert_equal("/desktop/api2/get_user_preferences/foo?a=1&b=2",
+    reverse_with_get("desktop.api2.user_preferences", kwargs=dict(key="foo"), get=dict(a=1,b=2)))
   # You can use a list of args instead of kwargs, too
-  assert_equal("/desktop/prefs/foo?a=1&b=2",
-    reverse_with_get("desktop.views.prefs", args=["foo"], get=dict(a=1,b=2)))
+  assert_equal("/desktop/api2/get_user_preferences/foo?a=1&b=2",
+    reverse_with_get("desktop.api2.user_preferences", args=["foo"], get=dict(a=1,b=2)))
   # Just GET parameters
   assert_equal("/?a=1", reverse_with_get("desktop.views.index", get=dict(a="1")))
   # No GET parameters

+ 21 - 10
desktop/core/src/desktop/models.py

@@ -1515,7 +1515,18 @@ class ClusterConfig():
 
   @property
   def main_quick_action(self):
-    return self._get_editor()['interpreters'][1] # TODO handle default and user personal one
+    try:
+      default_app = json.loads(UserPreferences.objects.get(user=self.user, key='default_app').value)
+      app = self.get_apps()[default_app['app']]
+      if default_app.get('interpreter'):
+        return [interpreter for interpreter in app['interpreters'] if interpreter['type'] == default_app['interpreter']][0]
+      else:
+        return app
+    except UserPreferences.DoesNotExist:
+      pass
+    except Exception:
+      LOG.exception('Could not load back default app')
+    return self.get_apps().values()[0]['interpreters'][0]
 
 
   def _get_editor(self):
@@ -1541,10 +1552,10 @@ class ClusterConfig():
 
     if interpreters:
       return {
-          'name': 'editor',
-          'displayName': _('Editor'),
-          'interpreters': interpreters,
-          'page': interpreters[0 if len(interpreters) == 1 else 1]['page']
+        'name': 'editor',
+        'displayName': _('Editor'),
+        'interpreters': interpreters,
+        'page': interpreters[0 if len(interpreters) == 1 else 1]['page']
       }
     else:
       return None
@@ -1554,11 +1565,11 @@ class ClusterConfig():
 
     if IS_DASHBOARD_ENABLED.get():
       return {
-          'name': 'dashboard',
-          'displayName': _('Dashboard'),
-          'interpreters': interpreters,
-          'page': '/dashboard/new_search'
-        }
+        'name': 'dashboard',
+        'displayName': _('Dashboard'),
+        'interpreters': interpreters,
+        'page': '/dashboard/new_search'
+      }
     else:
       return None
 

+ 20 - 19
desktop/core/src/desktop/tests.py

@@ -281,35 +281,36 @@ def test_prefs():
   c = make_logged_in_client()
 
   # Get everything
-  response = c.get('/desktop/prefs/')
-  assert_equal('{}', response.content)
+  response = c.get('/desktop/api2/get_user_preferences/')
+  assert_equal({}, json.loads(response.content)['data'])
 
   # Set and get
-  response = c.get('/desktop/prefs/foo', dict(set="bar"))
-  assert_equal('true', response.content)
-  response = c.get('/desktop/prefs/foo')
-  assert_equal('"bar"', response.content)
+  response = c.post('/desktop/api2/get_user_preferences/foo', {'set': 'bar'})
+  assert_equal('bar', json.loads(response.content)['data']['foo'])
+  response = c.get('/desktop/api2/get_user_preferences/')
+  assert_equal('bar', json.loads(response.content)['data']['foo'])
 
   # Reset (use post this time)
-  c.post('/desktop/prefs/foo', dict(set="baz"))
-  response = c.get('/desktop/prefs/foo')
-  assert_equal('"baz"', response.content)
+  c.post('/desktop/api2/get_user_preferences/foo', {'set': 'baz'})
+  response = c.get('/desktop/api2/get_user_preferences/foo')
+  assert_equal('baz', json.loads(response.content)['data']['foo'])
 
   # Check multiple values
-  c.post('/desktop/prefs/elephant', dict(set="room"))
-  response = c.get('/desktop/prefs/')
-  assert_true("baz" in response.content)
-  assert_true("room" in response.content)
+  c.post('/desktop/api2/get_user_preferences/elephant', {'set': 'room'})
+  response = c.get('/desktop/api2/get_user_preferences/')
+  assert_true("baz" in json.loads(response.content)['data'].values(), response.content)
+  assert_true("room" in json.loads(response.content)['data'].values(), response.content)
 
   # Delete everything
-  c.get('/desktop/prefs/elephant', dict(delete=""))
-  c.get('/desktop/prefs/foo', dict(delete=""))
-  response = c.get('/desktop/prefs/')
-  assert_equal('{}', response.content)
+  c.post('/desktop/api2/get_user_preferences/elephant', {'delete': ''})
+  c.post('/desktop/api2/get_user_preferences/foo', {'delete': ''})
+  response = c.get('/desktop/api2/get_user_preferences/')
+  assert_equal({}, json.loads(response.content)['data'])
 
   # Check non-existent value
-  response = c.get('/desktop/prefs/doesNotExist')
-  assert_equal('null', response.content)
+  response = c.get('/desktop/api2/get_user_preferences/doesNotExist')
+  assert_equal(None, json.loads(response.content)['data'])
+
 
 def test_status_bar():
   """

+ 1 - 1
desktop/core/src/desktop/urls.py

@@ -81,7 +81,6 @@ dynamic_patterns += patterns('desktop.views',
   (r'^desktop/reset_all_debug','reset_all_debug'),
   (r'^bootstrap.js$', 'bootstrap'), # unused
 
-  (r'^desktop/prefs/(?P<key>\w+)?$', 'prefs'),
   (r'^desktop/status_bar/?$', 'status_bar'),
   (r'^desktop/debug/is_alive$','is_alive'),
   (r'^desktop/debug/is_idle$','is_idle'),
@@ -137,6 +136,7 @@ dynamic_patterns += patterns('desktop.api2',
   (r'^desktop/api2/doc/share/?$', 'share_document'),
 
   (r'^desktop/api2/get_config/?$', 'get_config'),
+  (r'^desktop/api2/get_user_preferences/(?P<key>\w+)?$', 'user_preferences'),
 
   (r'^desktop/api2/doc/export/?$', 'export_documents'),
   (r'^desktop/api2/doc/import/?$', 'import_documents'),

+ 0 - 30
desktop/core/src/desktop/views.py

@@ -200,36 +200,6 @@ def download_log_view(request):
   return render_to_response("logs.mako", dict(log=[_("No logs found.")], is_embeddable=request.GET.get('is_embeddable', False)))
 
 
-@access_log_level(logging.DEBUG)
-def prefs(request, key=None):
-  """Get or set preferences."""
-  if key is None:
-    d = dict( (x.key, x.value) for x in UserPreferences.objects.filter(user=request.user))
-    return render_json(d)
-  else:
-    if "set" in request.REQUEST:
-      try:
-        x = UserPreferences.objects.get(user=request.user, key=key)
-      except UserPreferences.DoesNotExist:
-        x = UserPreferences(user=request.user, key=key)
-      x.value = request.REQUEST["set"]
-      x.save()
-      return render_json(True)
-    if "delete" in request.REQUEST:
-      try:
-        x = UserPreferences.objects.get(user=request.user, key=key)
-        x.delete()
-        return render_json(True)
-      except UserPreferences.DoesNotExist:
-        return render_json(False)
-    else:
-      try:
-        x = UserPreferences.objects.get(user=request.user, key=key)
-        return render_json(x.value)
-      except UserPreferences.DoesNotExist:
-        return render_json(None)
-
-
 def bootstrap(request):
   """Concatenates bootstrap.js files from all installed Hue apps."""