diff --git a/tendril/dox/production.py b/tendril/dox/production.py index 9ada410..0f446cd 100644 --- a/tendril/dox/production.py +++ b/tendril/dox/production.py @@ -36,10 +36,14 @@ import os import yaml +from fs.utils import copyfile + from tendril.boms import electronics as boms_electronics from tendril.entityhub import projects from tendril.entityhub import serialnos from tendril.gedaif.conffile import ConfigsFile +from tendril.utils.fsutils import temp_fs +from tendril.utils.fsutils import get_tempname from tendril.utils.pdf import merge_pdf import render @@ -294,3 +298,24 @@ def get_production_order_data(serialno=None): snomap_data = yaml.load(f) return order_yaml_data, snomap_data + + +def get_production_order_manifest_set(serialno): + workspace = temp_fs.makeopendir(get_tempname()) + children = serialnos.get_child_serialnos(sno=serialno) + manifests = [] + for child in children: + am = docstore.get_docs_list_for_sno_doctype(child, 'ASSEMBLY MANIFEST') + if len(am) == 1: + am = am[0] + copyfile(am.fs, am.path, workspace, am.filename, overwrite=True) + manifests.append(workspace.getsyspath(am.filename)) + if len(manifests): + output = merge_pdf(manifests, + os.path.join( + workspace.getsyspath('/'), + serialno + '.pdf' + ), + remove_sources=True) + return output + return None diff --git a/tendril/entityhub/serialnos.py b/tendril/entityhub/serialnos.py index 9fd95ed..bbb3e99 100644 --- a/tendril/entityhub/serialnos.py +++ b/tendril/entityhub/serialnos.py @@ -85,7 +85,7 @@ def get_parent_serialnos(sno=None, session=None): def get_child_serialnos(sno=None, session=None): if sno is None: raise AttributeError("child cannot be None") - return controller.get_serialno_object(sno=sno, session=session).children + return controller.get_child_snos(serialno=sno, session=session) @with_db diff --git a/tendril/frontend/blueprints/production/templates/production_order_detail.html b/tendril/frontend/blueprints/production/templates/production_order_detail.html index 803db46..0b48faa 100644 --- a/tendril/frontend/blueprints/production/templates/production_order_detail.html +++ b/tendril/frontend/blueprints/production/templates/production_order_detail.html @@ -25,7 +25,7 @@

{{ stage.order_yaml.title }}

- +
Modules for Production
@@ -53,15 +53,15 @@
Modules for Production
var table = $('#order_table').DataTable({ /* Disable initial sort */ "aaSorting": [], - {% include 'parts/datatable_defaults.html' %} + {% include 'parts/datatable_defaults.html' %} }); table.buttons().container() .appendTo( '#order_table_wrapper .small-12.medium-6.columns:eq(0)' ); });
- - + +
Related Documentation
@@ -73,9 +73,14 @@
Related Documentation
{{ stage.order_indentsno }}
+ +
+
Collated Assembly Manifests
+
+
- +
@@ -105,7 +110,7 @@
Serial Number Map
{% endfor %}
  • -
    + diff --git a/tendril/frontend/blueprints/production/views.py b/tendril/frontend/blueprints/production/views.py index ef64e43..887bcd6 100644 --- a/tendril/frontend/blueprints/production/views.py +++ b/tendril/frontend/blueprints/production/views.py @@ -24,6 +24,8 @@ from flask import render_template from flask_user import login_required +from flask import abort +from flask import send_file from . import production as blueprint @@ -31,6 +33,15 @@ from tendril.utils.fsutils import Crumb +@blueprint.route('/manifests/') +def manifests(order_sno=None): + if not order_sno: + abort(404) + rfile = dxproduction.get_production_order_manifest_set(order_sno) + # TODO figure out how to delete this file later on. + return send_file(rfile, as_attachment=True) + + @blueprint.route('/order/') @blueprint.route('/order/') @login_required