From 9126c8ca5ec1af20404610289045c950e95f5886 Mon Sep 17 00:00:00 2001 From: Ben Thorner Date: Mon, 30 May 2022 15:37:54 +0100 Subject: [PATCH] Move _template_ methods to TemplateList class This is a straight move with a few minor tweaks: - Some references to self.X in the code from Service now need to become self.service.X. - Some reference to self.service.Y in TemplateList can now become self.Y for the methods that were migrated. The remaining _template_ methods in Service are still called from multiple places and there's no performance gain to motivate moving them out of the Service class, which is now a more manageable size. --- app/models/service.py | 89 ------------------------------- app/models/template_list.py | 101 +++++++++++++++++++++++++++++++++--- 2 files changed, 95 insertions(+), 95 deletions(-) diff --git a/app/models/service.py b/app/models/service.py index 161cd2f60..5698b1e25 100644 --- a/app/models/service.py +++ b/app/models/service.py @@ -223,22 +223,6 @@ class Service(JSONModel, SortByNameMixin): def all_template_ids(self): return {template['id'] for template in self.all_templates} - def get_templates(self, template_type='all', template_folder_id=None, user=None): - if user and template_folder_id: - folder = self.get_template_folder(template_folder_id) - if not user.has_template_folder_permission(folder): - return [] - - if isinstance(template_type, str): - template_type = [template_type] - if template_folder_id: - template_folder_id = str(template_folder_id) - return [ - template for template in self.all_templates - if (set(template_type) & {'all', template['template_type']}) - and template.get('folder') == template_folder_id - ] - def get_template(self, template_id, version=None): return service_api_client.get_service_template(self.id, template_id, version)['data'] @@ -552,63 +536,6 @@ class Service(JSONModel, SortByNameMixin): def all_template_folder_ids(self): return {folder['id'] for folder in self.all_template_folders} - def get_user_template_folders(self, user): - """Returns a modified list of folders a user has permission to view - - For each folder, we do the following: - - if user has no permission to view the folder, skip it - - if folder is visible and its parent is visible, we add it to the list of folders - we later return without modifying anything - - if folder is visible, but the parent is not, we iterate through the parent until we - either find a visible parent or reach root folder. On each iteration we concatenate - invisible parent folder name to the front of our folder name, modifying the name, and we - change parent_folder_id attribute to a higher level parent. This flattens the path to the - folder making sure it displays in the closest visible parent. - - """ - user_folders = [] - for folder in self.all_template_folders: - if not user.has_template_folder_permission(folder, service=self): - continue - parent = self.get_template_folder(folder["parent_id"]) - if user.has_template_folder_permission(parent, service=self): - user_folders.append(folder) - else: - folder_attrs = { - "id": folder["id"], "name": folder["name"], "parent_id": folder["parent_id"], - "users_with_permission": folder["users_with_permission"] - } - while folder_attrs["parent_id"] is not None: - folder_attrs["name"] = [ - parent["name"], - folder_attrs["name"], - ] - if parent["parent_id"] is None: - folder_attrs["parent_id"] = None - else: - parent = self.get_template_folder(parent["parent_id"]) - folder_attrs["parent_id"] = parent.get("id", None) - if user.has_template_folder_permission(parent, service=self): - break - user_folders.append(folder_attrs) - return user_folders - - def get_template_folders(self, template_type='all', parent_folder_id=None, user=None): - if user: - folders = self.get_user_template_folders(user) - else: - folders = self.all_template_folders - if parent_folder_id: - parent_folder_id = str(parent_folder_id) - - return [ - folder for folder in folders - if ( - folder['parent_id'] == parent_folder_id - and self.is_folder_visible(folder['id'], template_type, user) - ) - ] - def get_template_folder(self, folder_id): if folder_id is None: return { @@ -618,22 +545,6 @@ class Service(JSONModel, SortByNameMixin): } return self._get_by_id(self.all_template_folders, folder_id) - def is_folder_visible(self, template_folder_id, template_type='all', user=None): - - if template_type == 'all': - return True - - if self.get_templates(template_type, template_folder_id): - return True - - if any( - self.is_folder_visible(child_folder['id'], template_type, user) - for child_folder in self.get_template_folders(template_type, template_folder_id, user) - ): - return True - - return False - def get_template_folder_path(self, template_folder_id): folder = self.get_template_folder(template_folder_id) diff --git a/app/models/template_list.py b/app/models/template_list.py index 4621f6735..13f8e2d51 100644 --- a/app/models/template_list.py +++ b/app/models/template_list.py @@ -23,15 +23,15 @@ class TemplateList(): def get_templates_and_folders(self, template_type, template_folder_id, user, ancestors): - for item in self.service.get_template_folders( + for item in self.get_template_folders( template_type, template_folder_id, user, ): yield TemplateListFolder( item, - folders=self.service.get_template_folders( + folders=self.get_template_folders( template_type, item['id'], user ), - templates=self.service.get_templates( + templates=self.get_templates( template_type, item['id'] ), ancestors=ancestors, @@ -42,7 +42,7 @@ class TemplateList(): ): yield sub_item - for item in self.service.get_templates( + for item in self.get_templates( template_type, template_folder_id, user ): yield TemplateListTemplate( @@ -51,6 +51,95 @@ class TemplateList(): service_id=self.service.id, ) + def get_templates(self, template_type='all', template_folder_id=None, user=None): + if user and template_folder_id: + folder = self.service.get_template_folder(template_folder_id) + if not user.has_template_folder_permission(folder): + return [] + + if isinstance(template_type, str): + template_type = [template_type] + if template_folder_id: + template_folder_id = str(template_folder_id) + return [ + template for template in self.service.all_templates + if (set(template_type) & {'all', template['template_type']}) + and template.get('folder') == template_folder_id + ] + + def get_user_template_folders(self, user): + """Returns a modified list of folders a user has permission to view + + For each folder, we do the following: + - if user has no permission to view the folder, skip it + - if folder is visible and its parent is visible, we add it to the list of folders + we later return without modifying anything + - if folder is visible, but the parent is not, we iterate through the parent until we + either find a visible parent or reach root folder. On each iteration we concatenate + invisible parent folder name to the front of our folder name, modifying the name, and we + change parent_folder_id attribute to a higher level parent. This flattens the path to the + folder making sure it displays in the closest visible parent. + + """ + user_folders = [] + for folder in self.service.all_template_folders: + if not user.has_template_folder_permission(folder, service=self.service): + continue + parent = self.service.get_template_folder(folder["parent_id"]) + if user.has_template_folder_permission(parent, service=self.service): + user_folders.append(folder) + else: + folder_attrs = { + "id": folder["id"], "name": folder["name"], "parent_id": folder["parent_id"], + "users_with_permission": folder["users_with_permission"] + } + while folder_attrs["parent_id"] is not None: + folder_attrs["name"] = [ + parent["name"], + folder_attrs["name"], + ] + if parent["parent_id"] is None: + folder_attrs["parent_id"] = None + else: + parent = self.service.get_template_folder(parent["parent_id"]) + folder_attrs["parent_id"] = parent.get("id", None) + if user.has_template_folder_permission(parent, service=self.service): + break + user_folders.append(folder_attrs) + return user_folders + + def get_template_folders(self, template_type='all', parent_folder_id=None, user=None): + if user: + folders = self.get_user_template_folders(user) + else: + folders = self.service.all_template_folders + if parent_folder_id: + parent_folder_id = str(parent_folder_id) + + return [ + folder for folder in folders + if ( + folder['parent_id'] == parent_folder_id + and self.is_folder_visible(folder['id'], template_type, user) + ) + ] + + def is_folder_visible(self, template_folder_id, template_type='all', user=None): + + if template_type == 'all': + return True + + if self.get_templates(template_type, template_folder_id): + return True + + if any( + self.is_folder_visible(child_folder['id'], template_type, user) + for child_folder in self.get_template_folders(template_type, template_folder_id, user) + ): + return True + + return False + @property def as_id_and_name(self): return [(item.id, item.name) for item in self] @@ -70,10 +159,10 @@ class ServiceTemplateList(TemplateList): def __iter__(self): template_list_service = TemplateListService( self.service, - templates=self.service.get_templates( + templates=self.get_templates( template_folder_id=None, ), - folders=self.service.get_template_folders( + folders=self.get_template_folders( parent_folder_id=None, ), )