Pārlūkot izejas kodu

HUE-8155 [metastore] Properly handle and recover from errors when modifying tags fails

Johan Ahlen 7 gadi atpakaļ
vecāks
revīzija
eef008ab0d

+ 4 - 2
desktop/core/src/desktop/static/desktop/js/apiHelper.js

@@ -1728,14 +1728,16 @@ var ApiHelper = (function () {
   };
 
   ApiHelper.prototype.addNavTags = function (entityId, tags) {
-    return $.post(NAV_URLS.ADD_TAGS, {
+    var self = this;
+    return self.simplePost(NAV_URLS.ADD_TAGS, {
       id: ko.mapping.toJSON(entityId),
       tags: ko.mapping.toJSON(tags)
     });
   };
 
   ApiHelper.prototype.deleteNavTags = function (entityId, tags) {
-    return $.post(NAV_URLS.DELETE_TAGS, {
+    var self = this;
+    return self.simplePost(NAV_URLS.DELETE_TAGS, {
       id: ko.mapping.toJSON(entityId),
       tags: ko.mapping.toJSON(tags)
     });

+ 8 - 8
desktop/core/src/desktop/static/desktop/js/dataCatalog.js

@@ -1237,16 +1237,16 @@ var DataCatalog = (function () {
       if (self.canHaveNavigatorMetadata()) {
         self.getNavigatorMeta().done(function (navMeta) {
           if (navMeta && typeof navMeta.identity !== 'undefined') {
-            ApiHelper.getInstance().addNavTags(navMeta.identity, tags).done(function (response) {
-              if (response && response.entity) {
-                self.navigatorMeta = response.entity;
+            ApiHelper.getInstance().addNavTags(navMeta.identity, tags).done(function (entity) {
+              if (entity) {
+                self.navigatorMeta = entity;
                 self.navigatorMetaPromise = $.Deferred().resolve(self.navigatorMeta).promise();
                 self.saveLater();
               } else {
                 deferred.reject();
               }
               deferred.resolve(self.navigatorMeta);
-            });
+            }).fail(deferred.reject);
           } else {
             deferred.reject();
           }
@@ -1270,16 +1270,16 @@ var DataCatalog = (function () {
       if (self.canHaveNavigatorMetadata()) {
         self.getNavigatorMeta().done(function (navMeta) {
           if (navMeta && typeof navMeta.identity !== 'undefined') {
-            ApiHelper.getInstance().deleteNavTags(navMeta.identity, tags).done(function (response) {
-              if (response && response.entity) {
-                self.navigatorMeta = response.entity;
+            ApiHelper.getInstance().deleteNavTags(navMeta.identity, tags).done(function (entity) {
+              if (entity) {
+                self.navigatorMeta = entity;
                 self.navigatorMetaPromise = $.Deferred().resolve(self.navigatorMeta).promise();
                 self.saveLater();
               } else {
                 deferred.reject();
               }
               deferred.resolve(self.navigatorMeta);
-            });
+            }).fail(deferred.reject);
           } else {
             deferred.reject();
           }

+ 4 - 11
desktop/core/src/desktop/templates/ko_components/ko_nav_tags.mako

@@ -135,23 +135,16 @@ from django.utils.translation import ugettext as _
 
         var deleteTagsPromise = tagsToRemove.length > 0 ? ko.unwrap(self.catalogEntry).deleteNavigatorTags(tagsToRemove) : $.Deferred().resolve().promise();
 
-        addTagsPromise.fail(function (error) {
-          hueUtils.logError(error);
-          $(document).trigger('error', '${ _("Could not add tags, see the server log for details.") }');
-        });
-
-        deleteTagsPromise.fail(function (error) {
-          hueUtils.logError(error);
-          $(document).trigger('error', '${ _("Could not remove tags, see the server log for details.") }');
-        });
-
         $.when(addTagsPromise, deleteTagsPromise).done(function () {
           if (tagsToAdd.length || tagsToRemove.length) {
             DataCatalog.updateAllNavigatorTags(tagsToAdd, tagsToRemove);
             ko.unwrap(self.catalogEntry).save();
           }
-          self.loading(false);
           self.loadTags();
+        }).fail(function () {
+          self.hasErrors(true);
+        }).always(function () {
+          self.loading(false);
         });
       };
 

+ 14 - 16
desktop/libs/metadata/src/metadata/navigator_api.py

@@ -400,8 +400,6 @@ def get_entity(request):
 @require_POST
 @error_handler
 def add_tags(request):
-  response = {'status': -1}
-
   api = NavigatorApi(request.user)
   entity_id = json.loads(request.POST.get('id', '""'))
   tags = json.loads(request.POST.get('tags', "[]"))
@@ -414,20 +412,19 @@ def add_tags(request):
     'operationText': 'Adding tags %s to entity %s' % (tags, entity_id)
   }
 
-  if not entity_id or not tags or not isinstance(tags, list) or not is_allowed:
-    response['error'] = _("add_tags requires an 'id' parameter and 'tags' parameter that is a non-empty list of tags")
-  else:
-    response['entity'] = api.add_tags(entity_id, tags)
-    response['status'] = 0
+  if not is_allowed:
+    raise Exception("The user does not have proper Hue permissions to add Navigator tags.")
+  if not entity_id:
+    raise Exception("Missing required parameter 'id' for the Hue add_tags API.")
+  if not tags:
+    raise Exception("Missing required parameter 'tags' for the Hue add_tags API.")
 
-  return JsonResponse(response)
+  return JsonResponse(api.add_tags(entity_id, tags))
 
 
 @require_POST
 @error_handler
 def delete_tags(request):
-  response = {'status': -1}
-
   api = NavigatorApi(request.user)
   entity_id = json.loads(request.POST.get('id', '""'))
   tags = json.loads(request.POST.get('tags', '[]'))
@@ -440,13 +437,14 @@ def delete_tags(request):
     'operationText': 'Removing tags %s to entity %s' % (tags, entity_id)
   }
 
-  if not entity_id or not tags or not isinstance(tags, list) or not is_allowed:
-    response['error'] = _("add_tags requires an 'id' parameter and 'tags' parameter that is a non-empty list of tags")
-  else:
-    response['entity'] = api.delete_tags(entity_id, tags)
-    response['status'] = 0
+  if not is_allowed:
+    raise Exception("The user does not have proper Hue permissions to delete Navigator tags.")
+  if not entity_id:
+    raise Exception("Missing required parameter 'id' for the Hue delete_tags API.")
+  if not tags:
+    raise Exception("Missing required parameter 'tags' for the Hue delete_tags API.")
 
-  return JsonResponse(response)
+  return JsonResponse(api.delete_tags(entity_id, tags))
 
 
 @require_POST