Allow users to navigate folders when copying

We already have a pattern for navigation folders and searching for
templates – let’s use it for the copy page too. And I reckon we can
represent services as folders if the user has multiple services they
could copy a template from.
This commit is contained in:
Chris Hill-Scott
2019-01-07 14:49:33 +00:00
parent 0b22fff751
commit 206a7806d4
10 changed files with 545 additions and 81 deletions

View File

@@ -61,7 +61,7 @@ class Service():
def _get_by_id(self, things, id):
try:
return next(thing for thing in things if thing['id'] == id)
return next(thing for thing in things if thing['id'] == str(id))
except StopIteration:
abort(404)
@@ -132,6 +132,8 @@ class Service():
def get_templates(self, template_type='all', template_folder_id=None):
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']})
@@ -330,6 +332,10 @@ class Service():
return {folder['id'] for folder in self.all_template_folders}
def get_template_folders(self, template_type='all', parent_folder_id=None):
if parent_folder_id:
parent_folder_id = str(parent_folder_id)
return [
folder for folder in self.all_template_folders
if (

View File

@@ -30,6 +30,7 @@ class TemplateList():
self.template_type, item['id']
),
ancestors=ancestors,
service_id=self.service.id,
)
for sub_item in self.get_templates_and_folders(
template_type, item['id'], ancestors + [item]
@@ -42,6 +43,7 @@ class TemplateList():
yield TemplateListTemplate(
item,
ancestors=ancestors,
service_id=self.service.id,
)
@property
@@ -59,8 +61,47 @@ class TemplateList():
))
class TemplateLists():
def __init__(self, services):
self.services = sorted(
services,
key=lambda service: service.name.lower(),
)
def __iter__(self):
if len(self.services) == 1:
for template_or_folder in TemplateList(self.services[0]):
yield template_or_folder
return
for service in self.services:
template_list_service = TemplateListService(service)
yield template_list_service
for service_templates_and_folders in TemplateList(
service
).get_templates_and_folders(
template_type='all',
template_folder_id=None,
ancestors=[template_list_service],
):
yield service_templates_and_folders
@property
def templates_to_show(self):
return bool(self.services)
class TemplateListItem():
is_service = False
def __init__(
self,
template_or_folder,
@@ -79,8 +120,10 @@ class TemplateListTemplate(TemplateListItem):
self,
template,
ancestors,
service_id,
):
super().__init__(template, ancestors)
self.service_id = service_id
self.hint = {
'email': 'Email template',
'sms': 'Text message template',
@@ -98,8 +141,10 @@ class TemplateListFolder(TemplateListItem):
templates,
folders,
ancestors,
service_id,
):
super().__init__(folder, ancestors)
self.service_id = service_id
self.number_of_templates = len(templates)
self.number_of_folders = len(folders)
@@ -122,3 +167,24 @@ class TemplateListFolder(TemplateListItem):
@property
def hint(self):
return ', '.join(self._hint_parts)
class TemplateListService(TemplateListFolder):
is_service = True
def __init__(
self,
service,
):
super().__init__(
folder=service._dict,
templates=service.get_templates(
template_folder_id=None,
),
folders=service.get_template_folders(
parent_folder_id=None,
),
ancestors=[],
service_id=service.id,
)

View File

@@ -1,6 +1,6 @@
from itertools import chain
from flask import request, session
from flask import abort, request, session
from flask_login import AnonymousUserMixin, UserMixin
from app.utils import is_gov_user
@@ -151,6 +151,10 @@ class User(UserMixin):
def has_permission_for_service(self, service_id, permission):
return permission in self._permissions.get(service_id, [])
def belongs_to_service_or_403(self, service_id):
if str(service_id) not in self.services:
abort(403)
def is_locked(self):
return self.failed_login_count >= self.max_failed_login_count