Skip to content

Commit 543be77

Browse files
authored
Merge pull request #4258 from alphagov/speed-up-templates-page-179736794
Optimise load time for service "Templates" page
2 parents f52a8c5 + 5b52aa2 commit 543be77

File tree

6 files changed

+294
-326
lines changed

6 files changed

+294
-326
lines changed

app/main/views/templates.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,12 @@ def choose_template(service_id, template_type='all', template_folder_id=None):
104104

105105
template_list = TemplateList(current_service, template_type, template_folder_id, current_user)
106106

107+
all_template_folders = [
108+
item.folder for item in TemplateList(service=current_service, user=current_user) if item.is_folder
109+
]
110+
107111
templates_and_folders_form = TemplateAndFoldersSelectionForm(
108-
all_template_folders=current_service.get_user_template_folders(current_user),
112+
all_template_folders=all_template_folders,
109113
template_list=template_list,
110114
template_type=template_type,
111115
available_template_types=current_service.available_template_types,
@@ -470,10 +474,9 @@ def manage_template_folder(service_id, template_folder_id):
470474
@user_has_permissions('manage_templates')
471475
def delete_template_folder(service_id, template_folder_id):
472476
template_folder = current_service.get_template_folder_with_user_permission_or_403(template_folder_id, current_user)
477+
template_list = TemplateList(service=current_service, template_folder_id=template_folder_id)
473478

474-
if len(current_service.get_template_folders_and_templates(
475-
template_type="all", template_folder_id=template_folder_id
476-
)) > 0:
479+
if not template_list.folder_is_empty:
477480
flash("You must empty this folder before you can delete it", 'info')
478481
return redirect(
479482
url_for(

app/models/service.py

Lines changed: 0 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -223,22 +223,6 @@ def all_templates(self):
223223
def all_template_ids(self):
224224
return {template['id'] for template in self.all_templates}
225225

226-
def get_templates(self, template_type='all', template_folder_id=None, user=None):
227-
if user and template_folder_id:
228-
folder = self.get_template_folder(template_folder_id)
229-
if not user.has_template_folder_permission(folder):
230-
return []
231-
232-
if isinstance(template_type, str):
233-
template_type = [template_type]
234-
if template_folder_id:
235-
template_folder_id = str(template_folder_id)
236-
return [
237-
template for template in self.all_templates
238-
if (set(template_type) & {'all', template['template_type']})
239-
and template.get('folder') == template_folder_id
240-
]
241-
242226
def get_template(self, template_id, version=None):
243227
return service_api_client.get_service_template(self.id, template_id, version)['data']
244228

@@ -552,63 +536,6 @@ def all_template_folders(self):
552536
def all_template_folder_ids(self):
553537
return {folder['id'] for folder in self.all_template_folders}
554538

555-
def get_user_template_folders(self, user):
556-
"""Returns a modified list of folders a user has permission to view
557-
558-
For each folder, we do the following:
559-
- if user has no permission to view the folder, skip it
560-
- if folder is visible and its parent is visible, we add it to the list of folders
561-
we later return without modifying anything
562-
- if folder is visible, but the parent is not, we iterate through the parent until we
563-
either find a visible parent or reach root folder. On each iteration we concatenate
564-
invisible parent folder name to the front of our folder name, modifying the name, and we
565-
change parent_folder_id attribute to a higher level parent. This flattens the path to the
566-
folder making sure it displays in the closest visible parent.
567-
568-
"""
569-
user_folders = []
570-
for folder in self.all_template_folders:
571-
if not user.has_template_folder_permission(folder, service=self):
572-
continue
573-
parent = self.get_template_folder(folder["parent_id"])
574-
if user.has_template_folder_permission(parent, service=self):
575-
user_folders.append(folder)
576-
else:
577-
folder_attrs = {
578-
"id": folder["id"], "name": folder["name"], "parent_id": folder["parent_id"],
579-
"users_with_permission": folder["users_with_permission"]
580-
}
581-
while folder_attrs["parent_id"] is not None:
582-
folder_attrs["name"] = [
583-
parent["name"],
584-
folder_attrs["name"],
585-
]
586-
if parent["parent_id"] is None:
587-
folder_attrs["parent_id"] = None
588-
else:
589-
parent = self.get_template_folder(parent["parent_id"])
590-
folder_attrs["parent_id"] = parent.get("id", None)
591-
if user.has_template_folder_permission(parent, service=self):
592-
break
593-
user_folders.append(folder_attrs)
594-
return user_folders
595-
596-
def get_template_folders(self, template_type='all', parent_folder_id=None, user=None):
597-
if user:
598-
folders = self.get_user_template_folders(user)
599-
else:
600-
folders = self.all_template_folders
601-
if parent_folder_id:
602-
parent_folder_id = str(parent_folder_id)
603-
604-
return [
605-
folder for folder in folders
606-
if (
607-
folder['parent_id'] == parent_folder_id
608-
and self.is_folder_visible(folder['id'], template_type, user)
609-
)
610-
]
611-
612539
def get_template_folder(self, folder_id):
613540
if folder_id is None:
614541
return {
@@ -618,22 +545,6 @@ def get_template_folder(self, folder_id):
618545
}
619546
return self._get_by_id(self.all_template_folders, folder_id)
620547

621-
def is_folder_visible(self, template_folder_id, template_type='all', user=None):
622-
623-
if template_type == 'all':
624-
return True
625-
626-
if self.get_templates(template_type, template_folder_id):
627-
return True
628-
629-
if any(
630-
self.is_folder_visible(child_folder['id'], template_type, user)
631-
for child_folder in self.get_template_folders(template_type, template_folder_id, user)
632-
):
633-
return True
634-
635-
return False
636-
637548
def get_template_folder_path(self, template_folder_id):
638549

639550
folder = self.get_template_folder(template_folder_id)
@@ -650,12 +561,6 @@ def get_template_path(self, template):
650561
template,
651562
]
652563

653-
def get_template_folders_and_templates(self, template_type, template_folder_id):
654-
return (
655-
self.get_templates(template_type, template_folder_id)
656-
+ self.get_template_folders(template_type, template_folder_id)
657-
)
658-
659564
@property
660565
def count_of_templates_and_folders(self):
661566
return len(self.all_templates + self.all_template_folders)

0 commit comments

Comments
 (0)