diff --git a/apps/common/README.md b/apps/common/README.md index 6aac06589..400f19fc8 100644 --- a/apps/common/README.md +++ b/apps/common/README.md @@ -1,3 +1,18 @@ +# Common app + +Common app provide common view, function or others. + +Common app shouldn't rely on other apps, because It may lead to cycle +import. + +If your want to implement some function or class, you should think +whether other app use or not. If yes, You should make in common. + +If the ability more relate to your app tightness, It's mean your app +provide this ability, not common, You should write it on your app utils. + + + ## Celery usage diff --git a/apps/common/utils.py b/apps/common/utils.py index 0d2a4284c..d2437537b 100644 --- a/apps/common/utils.py +++ b/apps/common/utils.py @@ -2,6 +2,7 @@ # from __future__ import unicode_literals +from six import string_types from itertools import chain import string @@ -52,30 +53,43 @@ def combine_seq(s1, s2, callback=None): seq = chain(s1, s2) if callback: seq = map(callback, seq) - return seq def search_object_attr(obj, value='', attr_list=None, ignore_case=False): + """It's provide a method to search a object attribute equal some value + + If object some attribute equal :param: value, return True else return False + + class A(): + name = 'admin' + age = 7 + + :param obj: A object + :param value: A string match object attribute + :param attr_list: Only match attribute in attr_list + :param ignore_case: Ignore case + :return: Boolean + """ + if value == '': + return True + try: object_attr = obj.__dict__ except AttributeError: return False - if not isinstance(value, str): - return False - - if value == '': - return True - if attr_list is not None: + new_object_attr = {} for attr in attr_list: - object_attr.pop(attr) + new_object_attr[attr] = object_attr.pop(attr) + object_attr = new_object_attr - print(value) - print(object_attr) if ignore_case: - if value.lower() in map(string.lower, filter(lambda x: isinstance(x, (str, unicode)), object_attr.values())): + if not isinstance(value, string_types): + return False + + if value.lower() in map(string.lower, map(str, object_attr.values())): return True else: if value in object_attr.values(): diff --git a/apps/perms/models.py b/apps/perms/models.py index 6b3b88b3f..60e150672 100644 --- a/apps/perms/models.py +++ b/apps/perms/models.py @@ -55,7 +55,7 @@ class AssetPermission(models.Model): return [] def get_granted_assets(self): - return list(self.assets.all() or []) | set(self.get_granted_asset_groups_member()) + return list(set(self.assets.all() or []) | set(self.get_granted_asset_groups_member())) def get_granted_asset_groups_member(self): combine_assets = functools.partial(combine_seq, callback=AssetPermission.set_inherit) diff --git a/apps/perms/templates/perms/asset_permission_asset_list.html b/apps/perms/templates/perms/asset_permission_asset_list.html index c60ea49a8..baad101d1 100644 --- a/apps/perms/templates/perms/asset_permission_asset_list.html +++ b/apps/perms/templates/perms/asset_permission_asset_list.html @@ -28,6 +28,16 @@ {% trans 'Assets and asset gruops' %} +