cr-connect-workflow/crc/scripts/modify_spreadsheet.py

64 lines
2.8 KiB
Python
Raw Normal View History

from crc import session
from crc.api.common import ApiError
from crc.models.file import FileModel
from crc.scripts.script import Script
from io import BytesIO
from openpyxl import load_workbook
from openpyxl.writer.excel import save_virtual_workbook
class ModifySpreadsheet(Script):
@staticmethod
def get_parameters(args, kwargs):
parameters = {}
if len(args) == 3 or ('irb_doc_code' in kwargs and 'cell' in kwargs and 'text' in kwargs):
2022-02-25 13:18:07 +00:00
if 'irb_doc_code' in kwargs and 'cell' in kwargs and 'text' in kwargs:
parameters['irb_doc_code'] = (kwargs['irb_doc_code'])
parameters['cell'] = (kwargs['cell'])
parameters['text'] = (kwargs['text'])
else:
parameters['irb_doc_code'] = (args[0])
parameters['cell'] = (args[1])
parameters['text'] = (args[2])
return parameters
def get_description(self):
return """Script to modify an existing spreadsheet.
It inserts text into a spreadsheet in the cell indicated.
Requires 'irb_doc_code', 'cell', and 'text' parameters.
Example: modify_spreadsheet('Finance_BCA', 'C4', 'This is my inserted text')
Example: modify_spreadsheet(irb_doc_code='Finance_BCA', cell='C4', text='This is my inserted text')
"""
def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs):
parameters = self.get_parameters(args, kwargs)
if len(parameters) == 3:
return True
else:
raise ApiError(code='missing_parameters',
message='The modify_spreadsheet script requires 3 parameters: irb_doc_code, cell, and text')
def do_task(self, task, study_id, workflow_id, *args, **kwargs):
parameters = self.get_parameters(args, kwargs)
if len(parameters) == 3:
spreadsheet = session.query(FileModel). \
filter(FileModel.workflow_id == workflow_id). \
filter(FileModel.irb_doc_code == parameters['irb_doc_code']).\
first()
if spreadsheet:
2022-04-13 12:15:23 +00:00
workbook = load_workbook(BytesIO(spreadsheet.data))
sheet = workbook.active
sheet[parameters['cell']] = parameters['text']
data_string = save_virtual_workbook(workbook)
2022-04-13 12:15:23 +00:00
spreadsheet.data = data_string
session.commit()
else:
raise ApiError(code='missing_spreadsheet',
message=f"The spreadshhet you want to modify does not exist. Workflow ID is {workflow_id}, and IRB Doc Code is {parameters['irb_doc_code']}")
else:
raise ApiError(code='missing_parameters',
message='The modify_spreadsheet script requires 3 parameters: irb_doc_code, cell, and text')