diff --git a/app/__init__.py b/app/__init__.py index f515b9b2f..c16390e78 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -20,6 +20,7 @@ content_loader = ContentLoader('app/content') content_loader.load_manifest('g-cloud-6', 'edit_service_as_admin', 'services') +content_loader.load_manifest('g-cloud-7', 'declaration', 'declaration') from app.main.helpers.service import parse_document_upload_time diff --git a/app/assets/scss/application.scss b/app/assets/scss/application.scss index c78e8be67..8cfa4c7b7 100644 --- a/app/assets/scss/application.scss +++ b/app/assets/scss/application.scss @@ -37,6 +37,7 @@ $path: "/admin/static/images/"; @import "views/view_audits"; @import "_diff.scss"; @import "views/statistics"; +@import "views/view_declaration"; // Graphs @import "_c3"; diff --git a/app/assets/scss/views/_view_declaration.scss b/app/assets/scss/views/_view_declaration.scss new file mode 100644 index 000000000..4c0b62704 --- /dev/null +++ b/app/assets/scss/views/_view_declaration.scss @@ -0,0 +1,3 @@ +.my-special-page thead .summary-item-field-heading-first { + width: 60%; +} diff --git a/app/main/views/suppliers.py b/app/main/views/suppliers.py index 48f184e99..fb6725bed 100644 --- a/app/main/views/suppliers.py +++ b/app/main/views/suppliers.py @@ -3,18 +3,17 @@ from .. import main from . import get_template_data -from ... import data_api_client +from ... import data_api_client, content_loader from ..forms import EmailAddressForm from ..auth import role_required -from dmutils.apiclient.errors import HTTPError +from dmutils.apiclient.errors import HTTPError, APIError from dmutils.audit import AuditTypes -from dmutils.email import send_email, \ - generate_token, MandrillException +from dmutils.email import send_email, generate_token, MandrillException @main.route('/suppliers', methods=['GET']) @login_required -@role_required('admin', 'admin-ccs-category') +@role_required('admin', 'admin-ccs-category', 'admin-ccs-sourcing') def find_suppliers(): suppliers = data_api_client.find_suppliers(prefix=request.args.get("supplier_name_prefix")) @@ -39,6 +38,75 @@ def edit_supplier_name(supplier_id): ) +@main.route('/suppliers//edit/declarations/', methods=['GET']) +@login_required +@role_required('admin-ccs-sourcing') +def view_supplier_declaration(supplier_id, framework_slug): + supplier = data_api_client.get_supplier(supplier_id)['suppliers'] + framework = data_api_client.get_framework(framework_slug)['frameworks'] + declaration = data_api_client.get_supplier_declaration(supplier_id, framework_slug)['declaration'] + + content = content_loader.get_builder(framework_slug, 'declaration').filter(declaration) + + return render_template( + "suppliers/view_declaration.html", + supplier=supplier, + framework=framework, + declaration=declaration, + content=content, + **get_template_data()) + + +@main.route( + '/suppliers//edit/declarations//', + methods=['GET']) +@login_required +@role_required('admin-ccs-sourcing') +def edit_supplier_declaration_section(supplier_id, framework_slug, section_id): + supplier = data_api_client.get_supplier(supplier_id)['suppliers'] + framework = data_api_client.get_framework(framework_slug)['frameworks'] + declaration = data_api_client.get_supplier_declaration(supplier_id, framework_slug)['declaration'] + + content = declaration_content.get_builder().filter(declaration) + + return render_template( + "suppliers/edit_declaration.html", + supplier=supplier, + framework=framework, + declaration=declaration, + section=content.get_section(section_id), + **get_template_data()) + + +@main.route( + '/suppliers//edit/declarations//', + methods=['POST']) +def update_supplier_declaration_section(supplier_id, framework_slug, section_id): + supplier = data_api_client.get_supplier(supplier_id)['suppliers'] + framework = data_api_client.get_framework(framework_slug)['frameworks'] + declaration = data_api_client.get_supplier_declaration(supplier_id, framework_slug)['declaration'] + + content = declaration_content.get_builder().filter(declaration) + section = content.get_section(section_id) + + posted_data = section.get_data(request.form) + + if section.has_changes_to_save(declaration, posted_data): + declaration.update(posted_data) + data_api_client.set_supplier_declaration( + supplier_id, framework_slug, declaration, + current_user.email_address) + + next_section = content.get_next_editable_section_id(section_id) + if next_section: + return redirect(url_for('.edit_supplier_declaration_section', + supplier_id=supplier_id, framework_slug=framework_slug, + section_id=next_section)) + else: + return redirect(url_for('.view_supplier_declaration', + supplier_id=supplier_id, framework_slug=framework_slug)) + + @main.route('/suppliers//edit/name', methods=['POST']) @login_required @role_required('admin') diff --git a/app/templates/index.html b/app/templates/index.html index d1e3af32a..b14cb7e3e 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -32,7 +32,7 @@ {% include "toolkit/page-heading.html" %} {% endwith %} - {% if current_user.has_role('admin') or current_user.has_role('admin-ccs-category') %} + {% if current_user.has_any_role('admin', 'admin-ccs-category', 'admin-ccs-sourcing') %}
diff --git a/app/templates/suppliers/edit_declaration.html b/app/templates/suppliers/edit_declaration.html new file mode 100644 index 000000000..adbc99e0c --- /dev/null +++ b/app/templates/suppliers/edit_declaration.html @@ -0,0 +1,46 @@ +{% import 'macros/toolkit_forms.html' as forms %} + +{% extends "_base_page.html" %} + +{% block page_title %} + Change {{ framework.name }} declaration +{% endblock %} + +{% block content %} +
+
+
+ {% + with + context = supplier.name, + heading = section.name, + smaller = True + %} + {% include "toolkit/page-heading.html" %} + {% endwith %} +
+
+ + +
+
+
+ {% for question in section.questions %} + {{ forms[question.type](question, declaration, {}) }} + {% endfor %} + {% + with + type = "save", + label = "Save and return to summary" + %} + {% include "toolkit/button.html" %} + {% endwith %} +

+ Return without saving +

+
+
+
+
+
+{% endblock %} diff --git a/app/templates/suppliers/view_declaration.html b/app/templates/suppliers/view_declaration.html new file mode 100644 index 000000000..698a1771e --- /dev/null +++ b/app/templates/suppliers/view_declaration.html @@ -0,0 +1,44 @@ +{% import "toolkit/summary-table.html" as summary %} + +{% extends "_base_page.html" %} + +{% block page_title %} + Change {{ framework.name }} declaration +{% endblock %} + +{% block content %} +
+
+
+ {% + with + context = supplier.name, + heading = framework.name + " declaration", + smaller = True + %} + {% include "toolkit/page-heading.html" %} + {% endwith %} +
+
+ + {% for section in content %} + {{ summary.heading(section.name) }} + {{ summary.top_link("Edit", url_for('.edit_supplier_declaration_section', supplier_id=supplier.id, framework_slug=framework.slug, section_id=section.id)) }} + {% call(item) summary.list_table( + section.questions, + caption="Declaration", + empty_message="This supplier not made a declaration", + field_headings=[ + 'Declaration question', + 'Declaration answer' + ] + ) %} + {% call summary.row() %} + {{ summary.field_name(item.question) }} + {{ summary[item.type](declaration[item.id]) }} + {% endcall %} + {% endcall %} + {% endfor %} +
+ +{% endblock %} diff --git a/app/templates/view_suppliers.html b/app/templates/view_suppliers.html index 2c2a55e0d..fa3098c35 100644 --- a/app/templates/view_suppliers.html +++ b/app/templates/view_suppliers.html @@ -23,20 +23,31 @@ {% endwith %}
- {% call(item) summary.list_table( - suppliers, - caption="Suppliers", - empty_message="No suppliers were found", - field_headings=[ + {% if current_user.has_role("admin") %} + {% set field_headings = [ "Name", - summary.hidden_field_heading("Edit name"), + summary.hidden_field_heading("Change name"), summary.hidden_field_heading("Users"), summary.hidden_field_heading("Services"), - ] if current_user.has_role('admin') else [ + ] %} + {% elif current_user.has_role("admin-ccs-sourcing") %} + {% set field_headings = [ + "Name", + summary.hidden_field_heading("Change declarations"), + ] %} + {% else %} + {% set field_headings = [ "Name", summary.hidden_field_heading("Users"), summary.hidden_field_heading("Services"), - ], + ] %} + {% endif %} + + {% call(item) summary.list_table( + suppliers, + caption="Suppliers", + empty_message="No suppliers were found", + field_headings=field_headings, field_headings_visible=True) %} {% call summary.row() %} @@ -44,8 +55,13 @@ {% if current_user.has_role('admin') %} {{ summary.edit_link("Change name", url_for(".edit_supplier_name", supplier_id=item.id)) }} {% endif %} - {{ summary.edit_link("Users", url_for(".find_supplier_users", supplier_id=item.id)) }} - {{ summary.edit_link("Services", url_for(".find_supplier_services", supplier_id=item.id)) }} + {% if current_user.has_role('admin-ccs-sourcing') %} + {{ summary.edit_link("G-Cloud 7 declaration", url_for(".view_supplier_declaration", supplier_id=item.id, framework_slug="g-cloud-7")) }} + {% endif %} + {% if current_user.has_any_role('admin', 'admin-ccs-category') %} + {{ summary.edit_link("Users", url_for(".find_supplier_users", supplier_id=item.id)) }} + {{ summary.edit_link("Services", url_for(".find_supplier_services", supplier_id=item.id)) }} + {% endif %} {% endcall %} {% endcall %}