mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-18 21:49:37 -04:00
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:
@@ -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 (
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user