Merge "CI: Add SonarCloud scan GHA workflow"
[pti/o2.git] / o2common / views / route.py
index 08621ff..f152fc0 100644 (file)
@@ -98,8 +98,8 @@ class o2_marshal_with(marshal_with):
 
             req_args = request.args
             mask = self._gen_mask_from_selector(**req_args)
-
-            # mask = self.mask
+            if mask == '':
+                mask = self.mask
 
             # if has_request_context():
             # mask_header = current_app.config["RESTX_MASK_HEADER"]
@@ -129,50 +129,31 @@ class o2_marshal_with(marshal_with):
     def _gen_mask_from_selector(self, **kwargs) -> str:
         mask_val = ''
         if 'all_fields' in kwargs:
-            all_fields_without_space = kwargs['all_fields'].replace(" ", "")
-            logger.info('all_fields selector value is {}'.format(
+            all_fields_without_space = kwargs['all_fields'].strip()
+            logger.debug('all_fields selector value is {}'.format(
                 all_fields_without_space))
-            # all_fields = all_fields_without_space.lower()
-            # if 'true' == all_fields:
             selector = self.__gen_selector_from_model_with_value(
                 self.fields)
             mask_val = self.__gen_mask_from_selector(selector)
 
         elif 'fields' in kwargs and kwargs['fields'] != '':
-            fields_without_space = kwargs['fields'].replace(" ", "")
-
-            # filters = fields_without_space.split(',')
-
-            # mask_val_list = []
-            # for f in filters:
-            #     if '/' in f:
-            #         a = self.__gen_mask_tree(f)
-            #         mask_val_list.append(a)
-            #         continue
-            #     mask_val_list.append(f)
-            # mask_val = '{%s}' % ','.join(mask_val_list)
+            fields_without_space = kwargs['fields'].strip()
             selector = {}
-
             self.__update_selector_value(selector, fields_without_space, True)
             self.__set_default_mask(selector)
-
             mask_val = self.__gen_mask_from_selector(selector)
 
         elif 'exclude_fields' in kwargs and kwargs['exclude_fields'] != '':
-            exclude_fields_without_space = kwargs['exclude_fields'].replace(
-                " ", "")
-
+            exclude_fields_without_space = kwargs['exclude_fields'].strip()
             selector = self.__gen_selector_from_model_with_value(
                 self.fields)
-
             self.__update_selector_value(
                 selector, exclude_fields_without_space, False)
             self.__set_default_mask(selector)
-
             mask_val = self.__gen_mask_from_selector(selector)
+
         elif 'exclude_default' in kwargs and kwargs['exclude_default'] != '':
-            exclude_default_without_space = kwargs['exclude_default'].replace(
-                " ", "")
+            exclude_default_without_space = kwargs['exclude_default'].strip()
             exclude_default = exclude_default_without_space.lower()
             if 'true' == exclude_default:
                 mask_val = '{}'
@@ -212,7 +193,11 @@ class o2_marshal_with(marshal_with):
                                 val: bool):
         fields = filter.split(',')
         for f in fields:
+            f = f.strip()
             if '/' in f:
+                parent = f.split('/')[0]
+                if parent in selector and type(selector[parent]) is bool:
+                    selector[parent] = dict()
                 self.__update_selector_tree_value(selector, f, val)
                 continue
             if f not in self.fields:
@@ -235,6 +220,8 @@ class o2_marshal_with(marshal_with):
         for k, v in fields.items():
             if type(v) is dict:
                 s = self.__gen_mask_from_selector(v)
+                if s == '{}':
+                    continue
                 mask_li.append('%s%s' % (k, s))
                 continue
             if v:
@@ -243,5 +230,39 @@ class o2_marshal_with(marshal_with):
         return '{%s}' % ','.join(mask_li)
 
     def __set_default_mask(self, selector: dict, val: bool = True):
-        default_selector = str(getattr(self.fields, "__mask__"))[1:-1]
+        def convert_mask(mask):
+            # convert mask from {aa,bb,xxx{yyy}} structure to aa,bbxxx/yyy
+            stack = []
+            result = []
+            word = ''
+            for ch in mask:
+                if ch == '{':
+                    if word:
+                        stack.append(word)
+                        word = ''
+                elif ch == '}':
+                    if word:
+                        result.append('/'.join(stack + [word]))
+                        word = ''
+                    if stack:
+                        stack.pop()
+                elif ch == ',':
+                    if word:
+                        result.append('/'.join(stack + [word]))
+                        word = ''
+                else:
+                    word += ch
+            if word:
+                result.append(word)
+            return ','.join(result)
+
+        mask = getattr(self.fields, "__mask__")
+        mask = convert_mask(str(mask))
+        if not mask:
+            selector_all = self.__gen_selector_from_model_with_value(
+                self.fields)
+            for s in selector_all:
+                selector[s] = val
+            return
+        default_selector = mask
         self.__update_selector_value(selector, default_selector, val)