mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-25 08:44:23 -04:00
Add 'Uploads' hub and navigation
The uploads hub is just a page with text for now - there are no actions available on the page. It is linked to from a new 'Uploads' menu item on the left of the page which is only visible if your service has the `letter` and `upload_letters` permissions and if the current user has permissions to send messages.
This commit is contained in:
@@ -33,6 +33,7 @@ from app.main.views import ( # noqa isort:skip
|
|||||||
styleguide,
|
styleguide,
|
||||||
templates,
|
templates,
|
||||||
two_factor,
|
two_factor,
|
||||||
|
uploads,
|
||||||
user_profile,
|
user_profile,
|
||||||
verify,
|
verify,
|
||||||
)
|
)
|
||||||
|
|||||||
10
app/main/views/uploads.py
Normal file
10
app/main/views/uploads.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from flask import render_template
|
||||||
|
|
||||||
|
from app.main import main
|
||||||
|
from app.utils import user_has_permissions
|
||||||
|
|
||||||
|
|
||||||
|
@main.route("/services/<service_id>/uploads")
|
||||||
|
@user_has_permissions('send_messages')
|
||||||
|
def uploads(service_id):
|
||||||
|
return render_template('views/uploads/index.html')
|
||||||
@@ -300,6 +300,7 @@ class HeaderNavigation(Navigation):
|
|||||||
'template_history',
|
'template_history',
|
||||||
'template_usage',
|
'template_usage',
|
||||||
'trial_mode',
|
'trial_mode',
|
||||||
|
'uploads',
|
||||||
'usage',
|
'usage',
|
||||||
'view_job',
|
'view_job',
|
||||||
'view_job_csv',
|
'view_job_csv',
|
||||||
@@ -359,6 +360,9 @@ class MainNavigation(Navigation):
|
|||||||
'view_template_version',
|
'view_template_version',
|
||||||
'view_template_versions',
|
'view_template_versions',
|
||||||
},
|
},
|
||||||
|
'uploads': {
|
||||||
|
'uploads',
|
||||||
|
},
|
||||||
'team-members': {
|
'team-members': {
|
||||||
'confirm_edit_user_email',
|
'confirm_edit_user_email',
|
||||||
'confirm_edit_user_mobile_number',
|
'confirm_edit_user_mobile_number',
|
||||||
@@ -844,6 +848,7 @@ class CaseworkNavigation(Navigation):
|
|||||||
'two_factor_email_sent',
|
'two_factor_email_sent',
|
||||||
'update_email_branding',
|
'update_email_branding',
|
||||||
'update_letter_branding',
|
'update_letter_branding',
|
||||||
|
'uploads',
|
||||||
'usage',
|
'usage',
|
||||||
'user_information',
|
'user_information',
|
||||||
'user_profile',
|
'user_profile',
|
||||||
@@ -1118,6 +1123,7 @@ class OrgNavigation(Navigation):
|
|||||||
'two_factor_email_sent',
|
'two_factor_email_sent',
|
||||||
'update_email_branding',
|
'update_email_branding',
|
||||||
'update_letter_branding',
|
'update_letter_branding',
|
||||||
|
'uploads',
|
||||||
'usage',
|
'usage',
|
||||||
'user_information',
|
'user_information',
|
||||||
'user_profile',
|
'user_profile',
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
<li><a href="{{ url_for('.view_jobs', service_id=current_service.id) }}" {{ casework_navigation.is_selected('uploaded-files') }}>Uploaded files</a></li>
|
<li><a href="{{ url_for('.view_jobs', service_id=current_service.id) }}" {{ casework_navigation.is_selected('uploaded-files') }}>Uploaded files</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% if current_user.has_permissions('send_messages') and current_service.has_permission('letter') and current_service.has_permission('upload_letters') %}
|
||||||
|
<li><a href="{{ url_for('main.uploads', service_id=current_service.id) }}" {{ main_navigation.is_selected('uploads') }}>Uploads</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li><a href="{{ url_for('.manage_users', service_id=current_service.id) }}" {{ main_navigation.is_selected('team-members') }}>Team members</a></li>
|
<li><a href="{{ url_for('.manage_users', service_id=current_service.id) }}" {{ main_navigation.is_selected('team-members') }}>Team members</a></li>
|
||||||
{% if current_user.has_permissions('manage_service', allow_org_user=True) %}
|
{% if current_user.has_permissions('manage_service', allow_org_user=True) %}
|
||||||
|
|||||||
16
app/templates/views/uploads/index.html
Normal file
16
app/templates/views/uploads/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{% extends "withnav_template.html" %}
|
||||||
|
{% from "components/page-header.html" import page_header %}
|
||||||
|
|
||||||
|
{% block service_page_title %}
|
||||||
|
Uploads
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block maincolumn_content %}
|
||||||
|
<div class="grid-row">
|
||||||
|
<div class="column-two-thirds">
|
||||||
|
{{ page_header('Uploads') }}
|
||||||
|
|
||||||
|
<p>Upload a letter and Notify will print, pack and post it for you.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
@@ -960,6 +960,8 @@ def test_menu_send_messages(
|
|||||||
mock_get_inbound_sms_summary,
|
mock_get_inbound_sms_summary,
|
||||||
mock_get_free_sms_fragment_limit,
|
mock_get_free_sms_fragment_limit,
|
||||||
):
|
):
|
||||||
|
service_one['permissions'] = ['email', 'sms', 'letter', 'upload_letters']
|
||||||
|
|
||||||
with app_.test_request_context():
|
with app_.test_request_context():
|
||||||
resp = _test_dashboard_menu(
|
resp = _test_dashboard_menu(
|
||||||
mocker,
|
mocker,
|
||||||
@@ -972,6 +974,7 @@ def test_menu_send_messages(
|
|||||||
'main.choose_template',
|
'main.choose_template',
|
||||||
service_id=service_one['id'],
|
service_id=service_one['id'],
|
||||||
) in page
|
) in page
|
||||||
|
assert url_for('main.uploads', service_id=service_one['id']) in page
|
||||||
assert url_for('main.manage_users', service_id=service_one['id']) in page
|
assert url_for('main.manage_users', service_id=service_one['id']) in page
|
||||||
|
|
||||||
assert url_for('main.service_settings', service_id=service_one['id']) not in page
|
assert url_for('main.service_settings', service_id=service_one['id']) not in page
|
||||||
@@ -979,6 +982,30 @@ def test_menu_send_messages(
|
|||||||
assert url_for('main.view_providers') not in page
|
assert url_for('main.view_providers') not in page
|
||||||
|
|
||||||
|
|
||||||
|
def test_menu_send_messages_when_service_does_not_have_upload_letters_permission(
|
||||||
|
mocker,
|
||||||
|
app_,
|
||||||
|
api_user_active,
|
||||||
|
service_one,
|
||||||
|
mock_get_service_templates,
|
||||||
|
mock_get_jobs,
|
||||||
|
mock_get_template_statistics,
|
||||||
|
mock_get_service_statistics,
|
||||||
|
mock_get_usage,
|
||||||
|
mock_get_inbound_sms_summary,
|
||||||
|
mock_get_free_sms_fragment_limit,
|
||||||
|
):
|
||||||
|
with app_.test_request_context():
|
||||||
|
resp = _test_dashboard_menu(
|
||||||
|
mocker,
|
||||||
|
app_,
|
||||||
|
api_user_active,
|
||||||
|
service_one,
|
||||||
|
['view_activity', 'send_messages'])
|
||||||
|
page = resp.get_data(as_text=True)
|
||||||
|
assert url_for('main.uploads', service_id=service_one['id']) not in page
|
||||||
|
|
||||||
|
|
||||||
def test_menu_manage_service(
|
def test_menu_manage_service(
|
||||||
mocker,
|
mocker,
|
||||||
app_,
|
app_,
|
||||||
|
|||||||
5
tests/app/main/views/test_uploads.py
Normal file
5
tests/app/main/views/test_uploads.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
from tests.conftest import SERVICE_ONE_ID
|
||||||
|
|
||||||
|
|
||||||
|
def test_get_upload_hub_page(client_request):
|
||||||
|
client_request.get('main.uploads', service_id=SERVICE_ONE_ID)
|
||||||
Reference in New Issue
Block a user