From 582cdbea4fe8a87b18e53554b8e4d965be970aff Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 25 Jan 2024 09:47:37 -0800 Subject: [PATCH 01/63] Integration with document services to generate redaction summary. --- .../external/zipperproducerservice.py | 8 +++- api/reviewer_api/services/radactionservice.py | 9 ++-- docker-compose.yml | 41 +++++++++++++++++++ 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/api/reviewer_api/services/external/zipperproducerservice.py b/api/reviewer_api/services/external/zipperproducerservice.py index b007caebb..11f699911 100644 --- a/api/reviewer_api/services/external/zipperproducerservice.py +++ b/api/reviewer_api/services/external/zipperproducerservice.py @@ -2,6 +2,7 @@ from walrus import Database from reviewer_api.models.default_method_result import DefaultMethodResult import logging +from os import getenv class zipperproducerservice: @@ -13,12 +14,15 @@ class zipperproducerservice: db = Database(host=host, port=port, db=0, password=password) - def add(self, streamkey, payload): + def add(self, payload): try: - stream = self.db.Stream(streamkey) + stream = self.db.Stream(self.__streamkey()) msgid = stream.add(payload, id="*") return DefaultMethodResult(True, "Added to stream", msgid.decode("utf-8")) except Exception as err: logging.error("Error in contacting Redis Stream") logging.error(err) return DefaultMethodResult(False, err, -1) + + def __streamkey(self): + return getenv("ZIPPER_STREAM_KEY") \ No newline at end of file diff --git a/api/reviewer_api/services/radactionservice.py b/api/reviewer_api/services/radactionservice.py index b4bb21ccd..14ec6a434 100644 --- a/api/reviewer_api/services/radactionservice.py +++ b/api/reviewer_api/services/radactionservice.py @@ -8,7 +8,7 @@ from reviewer_api.services.annotationservice import annotationservice from reviewer_api.services.documentpageflagservice import documentpageflagservice from reviewer_api.services.jobrecordservice import jobrecordservice -from reviewer_api.services.external.zipperproducerservice import zipperproducerservice +from reviewer_api.services.external.documentserviceproducerservice import documentserviceproducerservice from reviewer_api.utils.util import to_json from datetime import datetime @@ -17,7 +17,6 @@ class redactionservice: """FOI Document management service""" - zipperstreamkey = getenv("ZIPPER_STREAM_KEY") def getannotationsbyrequest( @@ -193,13 +192,13 @@ def triggerdownloadredlinefinalpackage(self, finalpackageschema, userinfo): _jobmessage, userinfo["userid"] ) if job.success: - _message = self.__preparemessageforzipservice( + _message = self.__preparemessageforsummaryservice( finalpackageschema, userinfo, job ) - return zipperproducerservice().add(self.zipperstreamkey, _message) + return documentserviceproducerservice().add(_message) # redline/final package download: prepare message for zipping service - def __preparemessageforzipservice(self, messageschema, userinfo, job): + def __preparemessageforsummaryservice(self, messageschema, userinfo, job): _message = { "jobid": job.identifier, "requestid": -1, diff --git a/docker-compose.yml b/docker-compose.yml index 675d4b166..743c28a21 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -74,6 +74,10 @@ services: - ZIPPER_REDIS_PASSWORD=${DEDUPE_REDIS_PASSWORD} - ZIPPER_REDIS_PORT=${DEDUPE_REDIS_PORT} - ZIPPER_STREAM_KEY=${ZIPPER_STREAM_KEY} + - DOCUMENTSERVICE_REDIS_HOST=${DEDUPE_REDIS_HOST} + - DOCUMENTSERVICE_REDIS_PASSWORD=${DEDUPE_REDIS_PASSWORD} + - DOCUMENTSERVICE_REDIS_PORT=${DEDUPE_REDIS_PORT} + - DOCUMENTSERVICE_STREAM_KEY=${DOCUMENTSERVICE_STREAM_KEY} - BATCH_CONFIG=${BATCH_CONFIG} - REDLINE_SINGLE_PKG_MINISTRIES=${REDLINE_SINGLE_PKG_MINISTRIES} @@ -232,6 +236,43 @@ services: - ZIPPER_REDIS_PASSWORD=${DEDUPE_REDIS_PASSWORD} - ZIPPER_REDIS_PORT=${DEDUPE_REDIS_PORT} - ZIPPER_STREAM_KEY=${ZIPPER_STREAM_KEY} + + foi-docreviewer-documentservice: + container_name: foi-docreviewer-documentservice + depends_on: + - foi-docreviewer-db + - foi-docreviewer-redis + build: + context: ./computingservices/DocumentServices + dockerfile: Dockerfile.local + image: docreviewerdocumentserviceimage + stdin_open: true + tty: true + networks: + services-network: + aliases: + - docreviewerdocumentservice + environment: + - REDIS_HOST=${DOCUMENTSERVICE_REDIS_HOST} + - REDIS_PASSWORD=${DOCUMENTSERVICE_REDIS_PASSWORD} + - REDIS_PORT=${DOCUMENTSERVICE_REDIS_PORT} + - DOCUMENTSERVICE_STREAM_KEY=${DOCUMENTSERVICE_STREAM_KEY} + - ZIPPER_REDIS_HOST=${ZIPPER_REDIS_HOST} + - ZIPPER_REDIS_PASSWORD=${ZIPPER_REDIS_PASSWORD} + - ZIPPER_REDIS_PORT=${ZIPPER_REDIS_PORT} + - ZIPPER_STREAM_KEY=${ZIPPER_STREAM_KEY} + - DOCUMENTSERVICE_DB_HOST=${DOCUMENTSERVICE_DB_HOST} + - DOCUMENTSERVICE_DB_NAME=${DOCUMENTSERVICE_DB_NAME} + - DOCUMENTSERVICE_DB_PORT=${DOCUMENTSERVICE_DB_PORT} + - DOCUMENTSERVICE_DB_USER=${DOCUMENTSERVICE_DB_USER} + - DOCUMENTSERVICE_DB_PASSWORD=${DOCUMENTSERVICE_DB_PASSWORD} + - DOCUMENTSERVICE_S3_HOST=${DOCUMENTSERVICE_S3_HOST} + - DOCUMENTSERVICE_S3_REGION=${DOCUMENTSERVICE_S3_REGION} + - DOCUMENTSERVICE_S3_SERVICE=${DOCUMENTSERVICE_S3_SERVICE} + - DOCUMENTSERVICE_S3_ENV=${DOCUMENTSERVICE_S3_ENV} + + + volumes: dbdata: From d0618ff88b769a7bc29e2fdf6fb666a68c4354df Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 25 Jan 2024 10:21:25 -0800 Subject: [PATCH 02/63] Draft commit. --- computingservices/DocumentServices/.sampleenv | 23 +++++++ .../DocumentServices/DockerFile.bcgov | 18 ++++++ .../DocumentServices/Dockerfile.local | 18 ++++++ .../DocumentServices/__init__.py | 0 .../DocumentServices/__main__.py | 6 ++ .../DocumentServices/entrypoint.sh | 2 + .../DocumentServices/models/__init__.py | 2 + .../models/redactionsummary.py | 13 ++++ .../DocumentServices/models/s3credentials.py | 4 ++ .../DocumentServices/requirements.txt | Bin 0 -> 794 bytes .../DocumentServices/rstreamio/__init__.py | 0 .../rstreamio/message/__init__.py | 0 .../rstreamio/message/schemas/__init__.py | 16 +++++ .../rstreamio/message/schemas/baseinfo.py | 9 +++ .../message/schemas/redactionsummary.py | 42 +++++++++++++ .../reader/documentservicestreamreader.py | 57 ++++++++++++++++++ .../rstreamio/writer/__init__.py | 0 .../rstreamio/writer/zipperstreamwriter.py | 32 ++++++++++ .../DocumentServices/services/__init__.py | 0 .../DocumentServices/services/dal/__init__.py | 1 + .../services/dal/pdfstitchjobactivity.py | 40 ++++++++++++ .../services/redactionsummaryservice.py | 15 +++++ .../DocumentServices/unittests/__init__.py | 0 .../unittests/files/sample.pdf | Bin 0 -> 116447 bytes .../unittests/testredactionsummary.py | 27 +++++++++ .../DocumentServices/utils/__init__.py | 3 + .../DocumentServices/utils/dbconnection.py | 10 +++ .../utils/foidocumentserviceconfig.py | 31 ++++++++++ .../utils/foiredisstreamdb.py | 5 ++ 29 files changed, 374 insertions(+) create mode 100644 computingservices/DocumentServices/.sampleenv create mode 100644 computingservices/DocumentServices/DockerFile.bcgov create mode 100644 computingservices/DocumentServices/Dockerfile.local create mode 100644 computingservices/DocumentServices/__init__.py create mode 100644 computingservices/DocumentServices/__main__.py create mode 100644 computingservices/DocumentServices/entrypoint.sh create mode 100644 computingservices/DocumentServices/models/__init__.py create mode 100644 computingservices/DocumentServices/models/redactionsummary.py create mode 100644 computingservices/DocumentServices/models/s3credentials.py create mode 100644 computingservices/DocumentServices/requirements.txt create mode 100644 computingservices/DocumentServices/rstreamio/__init__.py create mode 100644 computingservices/DocumentServices/rstreamio/message/__init__.py create mode 100644 computingservices/DocumentServices/rstreamio/message/schemas/__init__.py create mode 100644 computingservices/DocumentServices/rstreamio/message/schemas/baseinfo.py create mode 100644 computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py create mode 100644 computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py create mode 100644 computingservices/DocumentServices/rstreamio/writer/__init__.py create mode 100644 computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py create mode 100644 computingservices/DocumentServices/services/__init__.py create mode 100644 computingservices/DocumentServices/services/dal/__init__.py create mode 100644 computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py create mode 100644 computingservices/DocumentServices/services/redactionsummaryservice.py create mode 100644 computingservices/DocumentServices/unittests/__init__.py create mode 100644 computingservices/DocumentServices/unittests/files/sample.pdf create mode 100644 computingservices/DocumentServices/unittests/testredactionsummary.py create mode 100644 computingservices/DocumentServices/utils/__init__.py create mode 100644 computingservices/DocumentServices/utils/dbconnection.py create mode 100644 computingservices/DocumentServices/utils/foidocumentserviceconfig.py create mode 100644 computingservices/DocumentServices/utils/foiredisstreamdb.py diff --git a/computingservices/DocumentServices/.sampleenv b/computingservices/DocumentServices/.sampleenv new file mode 100644 index 000000000..57bec87b2 --- /dev/null +++ b/computingservices/DocumentServices/.sampleenv @@ -0,0 +1,23 @@ + +#Properties of Document Service - Begin +DOCUMENTSERVICE_REDIS_HOST= +DOCUMENTSERVICE_REDIS_PORT= +DOCUMENTSERVICE_REDIS_PASSWORD= +DOCUMENTSERVICE_STREAM_KEY=DOCUMENTSERVICE + +ZIPPER_REDIS_HOST= +ZIPPER_REDIS_PORT= +ZIPPER_REDIS_PASSWORD= +ZIPPER_STREAM_KEY=ZIPPER_STREAM + +DOCUMENTSERVICE_DB_HOST= +DOCUMENTSERVICE_DB_NAME= +DOCUMENTSERVICE_DB_PORT= +DOCUMENTSERVICE_DB_USER= +DOCUMENTSERVICE_DB_PASSWORD= + +DOCUMENTSERVICE_S3_HOST= +DOCUMENTSERVICE_S3_REGION= +DOCUMENTSERVICE_S3_SERVICE= +DOCUMENTSERVICE_S3_ENV= +#Properties of Document Service - End diff --git a/computingservices/DocumentServices/DockerFile.bcgov b/computingservices/DocumentServices/DockerFile.bcgov new file mode 100644 index 000000000..427e6e598 --- /dev/null +++ b/computingservices/DocumentServices/DockerFile.bcgov @@ -0,0 +1,18 @@ +FROM artifacts.developer.gov.bc.ca/docker-remote/python:3.10.8-buster + +# Keeps Python from generating .pyc files in the container +ENV PYTHONDONTWRITEBYTECODE=1 + +# Turns off buffering for easier container logging +ENV PYTHONUNBUFFERED=1 + +RUN useradd --create-home --shell /bin/bash app_user +WORKDIR /home/app_user +COPY requirements.txt ./ +RUN apt-get update \ + && apt-get -y install libpq-dev gcc \ + && pip install psycopg2 +RUN pip install --no-cache-dir -r requirements.txt +USER app_user +COPY . . +ENTRYPOINT ["/bin/sh", "./entrypoint.sh"] diff --git a/computingservices/DocumentServices/Dockerfile.local b/computingservices/DocumentServices/Dockerfile.local new file mode 100644 index 000000000..179ae3680 --- /dev/null +++ b/computingservices/DocumentServices/Dockerfile.local @@ -0,0 +1,18 @@ +FROM python:3.10.8 + +# Keeps Python from generating .pyc files in the container +ENV PYTHONDONTWRITEBYTECODE=1 + +# Turns off buffering for easier container logging +ENV PYTHONUNBUFFERED=1 + +RUN useradd --create-home --shell /bin/bash app_user +WORKDIR /home/app_user +COPY requirements.txt ./ +RUN apt-get update \ + && apt-get -y install libpq-dev gcc \ + && pip install psycopg2 +RUN pip install --no-cache-dir -r requirements.txt +USER app_user +COPY . . +ENTRYPOINT ["/bin/sh", "./entrypoint.sh"] diff --git a/computingservices/DocumentServices/__init__.py b/computingservices/DocumentServices/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/computingservices/DocumentServices/__main__.py b/computingservices/DocumentServices/__main__.py new file mode 100644 index 000000000..0a285b7ae --- /dev/null +++ b/computingservices/DocumentServices/__main__.py @@ -0,0 +1,6 @@ +from rstreamio.reader import documentservicestreamreader + + + +if __name__ == '__main__': + documentservicestreamreader.app() \ No newline at end of file diff --git a/computingservices/DocumentServices/entrypoint.sh b/computingservices/DocumentServices/entrypoint.sh new file mode 100644 index 000000000..bfa3d8512 --- /dev/null +++ b/computingservices/DocumentServices/entrypoint.sh @@ -0,0 +1,2 @@ +#!/bin/bash +python __main__.py $ \ No newline at end of file diff --git a/computingservices/DocumentServices/models/__init__.py b/computingservices/DocumentServices/models/__init__.py new file mode 100644 index 000000000..b87e20fea --- /dev/null +++ b/computingservices/DocumentServices/models/__init__.py @@ -0,0 +1,2 @@ +from .redactionsummary import redactionsummary +from .s3credentials import s3credentials \ No newline at end of file diff --git a/computingservices/DocumentServices/models/redactionsummary.py b/computingservices/DocumentServices/models/redactionsummary.py new file mode 100644 index 000000000..35a194ef1 --- /dev/null +++ b/computingservices/DocumentServices/models/redactionsummary.py @@ -0,0 +1,13 @@ +class redactionsummary(object): + + def __init__(self,jobid,requestid,category,requestnumber,bcgovcode,createdby,ministryrequestid,filestozip,finaloutput,attributes) -> None: + self.jobid = jobid + self.requestid = requestid + self.category=category + self.requestnumber = requestnumber + self.bcgovcode = bcgovcode + self.createdby = createdby + self.ministryrequestid = ministryrequestid + self.filestozip = filestozip + self.finaloutput = finaloutput + self.attributes = attributes diff --git a/computingservices/DocumentServices/models/s3credentials.py b/computingservices/DocumentServices/models/s3credentials.py new file mode 100644 index 000000000..97746abbb --- /dev/null +++ b/computingservices/DocumentServices/models/s3credentials.py @@ -0,0 +1,4 @@ +class s3credentials(object): + def __init__(self,s3accesskey,s3secretkey) -> None: + self.s3accesskey = s3accesskey + self.s3secretkey=s3secretkey diff --git a/computingservices/DocumentServices/requirements.txt b/computingservices/DocumentServices/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..ca7e1b33cdcfb97590fa2882d3308273c2446589 GIT binary patch literal 794 zcmZuvT~EU>5c4wVJ&U*U$|lHYl~Ax69>)cp+AphJrW zFIK;^N}iz3&bn*7qBcaofbclQ&e_MvBE&np)55fjS&9 zPu!&7el6aJ?|Con6|vHnCjZB0gmzmU84u>1BTGSDNuS(oxmCuCu{w*FyIb~t7*odtGw?|Iyh#QXTr0lfkXv#bl<`+@gt4jRJxo6+r64xZhw<+Y(^hsmSoNg!2Jbl4yUE&wbk#i*g literal 0 HcmV?d00001 diff --git a/computingservices/DocumentServices/rstreamio/__init__.py b/computingservices/DocumentServices/rstreamio/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/computingservices/DocumentServices/rstreamio/message/__init__.py b/computingservices/DocumentServices/rstreamio/message/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/__init__.py b/computingservices/DocumentServices/rstreamio/message/schemas/__init__.py new file mode 100644 index 000000000..a444092a5 --- /dev/null +++ b/computingservices/DocumentServices/rstreamio/message/schemas/__init__.py @@ -0,0 +1,16 @@ +# Copyright © 2021 Province of British Columbia +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Schema package.""" + + diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/baseinfo.py b/computingservices/DocumentServices/rstreamio/message/schemas/baseinfo.py new file mode 100644 index 000000000..0aad9ac37 --- /dev/null +++ b/computingservices/DocumentServices/rstreamio/message/schemas/baseinfo.py @@ -0,0 +1,9 @@ +import json + +class baseobj(object): + def __init__(self, dict_): + self.__dict__.update(dict_) + + +def dict2obj(d): + return json.loads(json.dumps(d), object_hook=baseobj) \ No newline at end of file diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py new file mode 100644 index 000000000..85a3e7e74 --- /dev/null +++ b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py @@ -0,0 +1,42 @@ + +from marshmallow import EXCLUDE, fields, Schema +import json +from rstreamio.message.schemas.baseinfo import baseobj, dict2obj +from models.redactionsummary import redactionsummary +""" +This class consolidates schemas of RedactionSummary Service. + +__author__ = "sumathi.thirumani@aot-technologies.com" + +""" +class RedactionSummaryIncomingSchema(Schema): + jobid = fields.Int(data_key="jobid",allow_none=False) + requestid = fields.Int(data_key="requestid",allow_none=False) + ministryrequestid = fields.Int(data_key="ministryrequestid",allow_none=False) + category = fields.Str(data_key="category",allow_none=False) + requestnumber = fields.Str(data_key="requestnumber",allow_none=False) + bcgovcode = fields.Str(data_key="bcgovcode",allow_none=False) + createdby = fields.Str(data_key="createdby",allow_none=False) + filestozip = fields.Str(data_key="filestozip",allow_none=False) + finaloutput = fields.Str(data_key="finaloutput",allow_none=False) + attributes = fields.Str(data_key="attributes",allow_none=False) + +def get_in_redactionsummary_msg(producer_json): + print("inside get_in_redactionsummary_msg") + print(producer_json) + print('----------------1--------------') + print(__formatmsg(producer_json)) + print('----------------2--------------') + messageobject = RedactionSummaryIncomingSchema().load(__formatmsg(producer_json)) + print(messageobject) + return dict2obj(messageobject) + +def getzipperproducermessage(producer_json): + j = json.loads(producer_json) + messageobject = redactionsummary(**j) + return messageobject + + +def __formatmsg(producer_json): + j = json.loads(producer_json) + return j \ No newline at end of file diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py new file mode 100644 index 000000000..17aa30c4c --- /dev/null +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -0,0 +1,57 @@ +import json +import typer +import random +import time +import logging +from enum import Enum +from utils import redisstreamdb +from utils.foidocumentserviceconfig import documentservice_stream_key +from rstreamio.message.schemas.redactionsummary import get_in_redactionsummary_msg +from services.redactionsummaryservice import redactionsummaryservice + +LAST_ID_KEY = "{consumer_id}:lastid" +BLOCK_TIME = 5000 +STREAM_KEY = documentservice_stream_key + +app = typer.Typer() + +class StartFrom(str, Enum): + beginning = "0" + latest = "$" + +@app.command() +def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): + rdb = redisstreamdb + stream = rdb.Stream(STREAM_KEY) + last_id = rdb.get(LAST_ID_KEY.format(consumer_id=consumer_id)) + if last_id: + print(f"Resume from ID: {last_id}") + else: + last_id = start_from.value + print(f"Starting from {start_from.name}") + + while True: + print("Reading stream...") + messages = stream.read(last_id=last_id, block=BLOCK_TIME) + print("*********** Messages ***********") + print(messages) + if messages: + for _messages in messages: + # message_id is the random id created to identify the message + # message is the actual data passed to the stream + message_id, message = _messages + print(f"processing {message_id}::{message}") + if message is not None: + _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) + _message = _message.replace("b'","'").replace("'",'') + try: + redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) + except(Exception) as error: + logging.exception(error) + # simulate processing + time.sleep(random.randint(1, 3)) #TODO : todo: remove! + last_id = message_id + rdb.set(LAST_ID_KEY.format(consumer_id=consumer_id), last_id) + print(f"finished processing {message_id}") + else: + print(f"No new messages after ID: {last_id}") \ No newline at end of file diff --git a/computingservices/DocumentServices/rstreamio/writer/__init__.py b/computingservices/DocumentServices/rstreamio/writer/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py b/computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py new file mode 100644 index 000000000..f428cebba --- /dev/null +++ b/computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py @@ -0,0 +1,32 @@ +import logging +from utils import redisstreamdb, zipper_stream_key +from rstreamio.message.schemas.zipper import ZipperPublishSchema +from models import dedupeproducermessage + +import json + +class zipperstreamwriter: + + rdb = redisstreamdb + zipperstream = rdb.Stream(zipper_stream_key) + + def sendmessage(self, message, error=False): + try: + zipper_msg = ZipperPublishSchema() + zipper_msg.serviceid = "documentservice" + zipper_msg.errorflag = self.__booltostr(error) + zipper_msg.ministryrequestid = message.ministryrequestid + zipper_msg.createdby = message.createdby + zipper_msg.batch = message.batch + #Additional execution parameters : Begin + + #Additional execution parameters : End + msgid = self.zipperstream.add(zipper_msg.__dict__, id="*") + logging.info("Notification message for msgid = %s ", msgid) + except RuntimeError as error: + print("Exception while sending notification, func sendnotification(p4), Error : {0} ".format(error)) + logging.error("Unable to write to notification stream for batch %s | ministryrequestid=%i", message.batch, message.ministryrequestid) + logging.error(error) + + def __booltostr(self, value): + return "YES" if value == True else "NO" diff --git a/computingservices/DocumentServices/services/__init__.py b/computingservices/DocumentServices/services/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/computingservices/DocumentServices/services/dal/__init__.py b/computingservices/DocumentServices/services/dal/__init__.py new file mode 100644 index 000000000..eeeba930d --- /dev/null +++ b/computingservices/DocumentServices/services/dal/__init__.py @@ -0,0 +1 @@ +from utils import getdbconnection \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py b/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py new file mode 100644 index 000000000..8bb0b616b --- /dev/null +++ b/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py @@ -0,0 +1,40 @@ +from utils import getdbconnection +import logging +import json + +class pdfstitchjobactivity: + + @classmethod + def recordjobstatus(cls,message,version,status,error=None,errormessage=None): + category = message.category.lower() + "-summary" + conn = getdbconnection() + print("Inside %s recordjobstatus", category) + try: + cursor = conn.cursor() + status = "error" if error else status + + cursor.execute( + """INSERT INTO public."PDFStitchJob" + (pdfstitchjobid,version, ministryrequestid, category, inputfiles, status, message, createdby) + VALUES (%s::integer,%s::integer, %s::integer, %s, %s, %s, %s, %s) on conflict (pdfstitchjobid,version) do nothing returning pdfstitchjobid;""", + ( + message.jobid, + version, + message.ministryrequestid, + category, + json.dumps(message.attributes), + status, + errormessage if error else None, + message.createdby, + ), + ) + + conn.commit() + cursor.close() + except Exception as error: + logging.error("Error in recordjobend") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() \ No newline at end of file diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py new file mode 100644 index 000000000..707d0d3b8 --- /dev/null +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -0,0 +1,15 @@ + +import traceback +import json +from services.dal.pdfstitchjobactivity import pdfstitchjobactivity +class redactionsummaryservice(): + + def processmessage(self,message): + try: + pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") + print(message) + except (Exception) as error: + print('error occured in redaction summary service: ', error) + + + diff --git a/computingservices/DocumentServices/unittests/__init__.py b/computingservices/DocumentServices/unittests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/computingservices/DocumentServices/unittests/files/sample.pdf b/computingservices/DocumentServices/unittests/files/sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..af2949c439accd18424debaaf04dee42939373ab GIT binary patch literal 116447 zcmc$`1ytM1wlJQyI4$n3#R|dQ3ADJo6$w&EumAxHw765CxE3v5+@S^(FJ1^zf)#hS ze|p}%=bZ1Y`|kJNTi;s$Ur5$uX4}l{y=P|c39MQmC2l?*K^)fct&JrdJ_cR}7wZ=| zl9E6Lcd!-A#hrm&-No0@+1Uyx#KX&A#%|~cwRQ3KV9?NG;N#`tm0&oW*sNmr40s#a0cu`b; zzZi6_?5x}!|AEAT1JrVNvGue8qxkDOIa&cxVlqHb(5RL_1aowOf~;U*26m7*KQBK& zA1|*UFQ1^WpePqFFB|F)1*h&}`|m-drE$Qh&Y-$0@K?8OtQh!kfb!}LKn)jnh?VnS zKtg{3>G`;V8GuHb)-S*|FdU$+r#0-48fA!;Js1aQ=x7UbU=ZQw#Q{D8JK8(I7{r7G zP=dQSySVGRTG^m*L0~UO8?eq(c@!^4n1>eFUBLz7>H-BrVGN=;KqW_K7^?3;kb)iv zY~x~!BKilmp1T#)!ww}F1B$j97;2B=!^g`f#wRE(&ENq;O&J8|?#JB{fI<=OXa@i& zD{}&{0DnDq+Wj;2r=CRV@Ml+$}vQcYwiM#eqPm2agqMJit6QE)XEx$`#1R z!wUpR%D_=FJAq*g)?j-_s1(y)TNe|9qpcK^p^!SSx~l@%!SR`|J6P9OL(j(7$wthU zNk*DM5-tvhxI(}%D+V~k8R{Vpmty*ZxHzi(yBf&E@COLYNs3ACH&+HDbu9)37k4m& z5RWjo4WFPWgNPUppRgdWfbbIrepD}kyrMup0d8JCab96@ArXduJWMEV?zVQ~Iw&3a z4_>HmQcVBol()AxkGBAii@QCLPfQF&gCEGx&y9lM_V9titl->G59WVT0D(Ph+#OwE zDD7hSP0`BQ#Sx&U!iSO1gnzZ@+H}UQAv=iH}!KSXe|+L{3yxQB00kh>u^9S5!b$K#o_CkLe#cwtwsH z{}l&_Vs2|A4s(P#ga4sVa?Y@Sl$;%Z&#Abx71SOza@@9HJ1b9T7?ZRd%*BMk*$RfT zRc@G-jU&`v68KwhoE=e!f0X`%2Jml`|ET_(qWu#RrMqv2p|6O z5aJOK5)u;Nk&=>=lakW^ewhD!?qOkJ;XT5mCL*GyqadN6`?KM{Te$lOAjEpma{v2- zdxU`dg!dj0-n;t>7(;oh2Y?6n?)}k~KR(dVG44OWyoZIVyN_!4TgwCV`)C;VFtG># z_Z~dB{{RJujfsWo688Oj56}RF=tLNd#F%_?OeEU;V{gf<+?YxA4PMLZAO(_G^a>N+ zSto+ouxdWJ2jwe_laJQw2GOXHxsUFf+qOSN_eN^`{YIjU62PcG)DM03E$wc zfm3Al-@WALMjo!!mGkI=c2RWU}p}xj8H|g z9s^jvrLKVTD!=a5_peS<7+ny2Tz;EYtqgL`0SG!*OjmFq6;S-mmYKV7GPtIR7$vQc)^b7Rk?YzQjrVi7}k$=ay{<*SSt`>tDkmmzm6@ zw3@L7q}!;Aicz7YtgK3ejW-Ig-T};#*77<+aUP5FfHn{% z?B5RBe>u@8EXt0WD``vjwg4d7xWT{P}qX^bx>_9j5<}u;>&Mi(2A$wGp8>Te*V0JVF$C^ou7QoGKbUdv099jJMmt!` z@w1{I{5}U0(0Qu1n9(^d?k9d%{NeV>bq|bQXusvCsX-Q^rDf_`U(X)-WrD==i(JWH z+FU$WSI9^Bo&Z-vfd#1)qdbe%Zti`%%~MZCaZXs{n*N#qR{Jq8%DcKSbyXi(Pvr3L z2IpTJh+OxyiB*BmGTE%NUY6@58c3U`tgM}oD45e+@iS*aPqeg|tiD1v9Y+>y{F9+2 z9(_=-LTum1K?Usd=^l{1l;MN%g^=iOQYl;2;@@ye0|!_YlBE7`o)DMQE)&cPSP%rrFS z-1&16lM=7)kwovaVty0bmR4cX4Ckwh(O_oZ;0al)OrSp4Fjp-V)iTn0$uCPJ)S8!H zmd{kSf6Sz%RoB4_T<&bZG(YTgWHdMS(2;I5=OmlRt|veK`>+Lz(4U%L@fH3QIH>44 zdh4xRbO!)`&1?4c66TSY6v@I^S64VhmRh?}fpkG!-i%%r!D7t{C|!SPy`HQJFrWy^ zqNF@)_9?u!)jN@>mXq;S^qFJSh)7M3a^)vX8q=QEj>qqJ(faN-*POSIsc-Yi72WOu zKU2H+SeD{f{jsQar46|wxTx0YEOLn_^$=}}A2@tj;B+0kX@dK!CL^3QE#`5Gk+X@j z|9z|=j_XJ{#GfuvF1P0naOD3*;7PlU&FFLaW3DV5)yQ*a@(Xss|GC^l`?zx+83nnJBA(Gv37pj$5=^xUm4z__EJ?Yr2kuPwReoYv6*Q)KrIccAW=J6 zN^(kD8RK(1`E@ICW$g*$J<&)gn3{A}Xs@kGL8as2=%~%1k8ew^a@Ce? zUhAORk!b;|^L4XPclX0n(saqji!3xPAPi)Iz$Z1q(kcP-^EZxx>jW4?Wausi-CAf8 z^lanbu19|kc^>TE@JsZIh=);yV7l=LTShdGwbkPRTI(zBUsF}-k8=}O5i>nOl7mU< zF+7rM1#T)lNUTG!9IKtgY{IjZ{MaP(vCBIEzCT99YE%3I5kp)08_`lxdAD%76cwz^ z43R;HZ}nSaIIV3izBpzY?g39}8~Bpk51F54d89ImT57+HOk#4(f0_IY&VGxonHa=k z9E$m(bLC-DrRV~ZQ5SMTP12ZL+~4CVdd!sZo1X#LA<>naOtrp4vqAB0T~Q0B!MOOiQZxw^c2p|y?-Rmd z4`M_?k;Su!HTT#q?zF?@OItmUUi*$ zZEFheq}{5pQE9O0Ee_tcv{1VezpzxpWFMM>Oux_pW%VVfte*IP;eBQELesv=58LE+ zkB~m5r{*lVPpZN6yxm#8T_>2+)Z4dFy`GrQBlPVkJ+n9;$`c!i)AtLk3mphh23UJn^9 zH@M&I%_tHp%GZypSlV3n{V=4e+zr=QwCuZ@Tk(SP44eSrs`n6^hlM3YPtRgPFE2>+ zA%(&d*X8^|W@)P)B{?eHpBWR}#n;5K82(<=cu?3tCqZ_1G&605RkxxnKs73;Y(su} zv7{~()62!4&fazTFfPmHHFl@YN1wRoZ#b*EdgMAfENIw)EK9sc%uPgkSR+rtPX-=; zC%7LdtN%nMC^!+xr})sV8%O*z9W$v3x+AIRK6ExPBRKkpnqZu!3_a!Ila%<%H#{c3 z_cxX_GlE}3wy}FCz%dauAs6|dKP-f}!8ta@A*vgBNK+?h=8I9}yK>u?pV6(_IBs={ za~1??tA6fR_d%V0oDZuwqEo+2N9U6}aaKv)Kl5eBd%j<-rWW0N-Yck&&631W^+Kb2 zs?@KjSxe*h!c1!1enp`ZHTpDxU+oJ+JQaInt69wy*qT9|DZAZ4+S>b}T7{3xp=E@t zx@j`qGlo{2S8?VbtaJ8i9Gug$LCQzbA8J~ZAykYHVm`acCiszJ)fc^&KrFxoLV0Yy z9$UX+_h9NAZDOov9gC_gGl!qWjs=%`7vOehNn4FxzY9XLc1@4VIYkaG*SYm8Nlo%O zCpXE4yzUv2ko`D{We|iHC=?cPB)Z{-&mq{ET;caHCS031TnJS0DhpDo&n|6!ra`Bc z&_fMHuBHCU8*&;*FS!GR&!XR!YAM)z_xkh}*?bVAWKvQm>7lS!ZBH~fr)rIQ9~JHN z-QPPvAtF(_re`F?ZMmWlvWAd%t9PZcut+7_D*d{X7tQ77TpE|z(rzUpCy$f&T$Pad{P=qz@0M?P=X zU>J}CL)`b!7G$Btwn{0iVJw4=wws9F>j#Nz*R zU>x}|A^O{AjXTD*adSlgCE&2Ka6lqIx z2T;}t-eq(DIG`-bj@Vysr1>1mmk*vNZ+xfNoM_pu@4zJ0{7mN;Gr>LtwSwg(K*TvFCI`UfduW>_l3CP(;5k&p@EJUqJtn9SV)l5sI| zU#+#ujPyeS?^j}k{pBeCT$TUVh37|!wfy{IbDbPbbb*fu+NqBAti%EK1q|AZmyYCsL;e|h$vSrmH=F?N1<2ml$uC`}7S%%v!us z&8K&Yy&OUva`k13ABl~RM-ev`s|d1EOh<|EgKL=oNz_O*{r^9 zN^E7y)P8=MmQsH+ykgj`RA-uG&6UE;!Zv~QgMl0%jei@xV-g6(4Vc9;vO9XRO9S)Y z6D-8VaSDaYstD|f3KOk|Rykm`f_iR4^XhtR>>y^R)L6sH7e*TpbxWT8#t4?Fa6)Za zZD=8~Y~Dej?x6OtjbCHu+X{UW2gMtNGm&uYtBY*T$U?0)D#e|=?B*E5_svt?+GZkd zYm5td99+gszC;_o_!U)IN5&H;s_tD6Rma$<`^&ETtzO`5$C+}I!~5a}&u~wFJgkXg zA#(h2Xky`;htT@f<*L6BEy6D2R4jtoWPK013@O! zd84+*9BrcpW~qt7Ow`5{qo&%jY@XsX9A^54;qM$cYwX1std>D<65RdXS$wlSOi^?- zfe>~>D!o-V1PQO-c3{eOa4`+D^k^%;S#SqQ+C4iiuaZ~FA{OEU$*Y#Q_$LMjtEPJs z#v#sW-Yj{Xzk0la%o(GzP3(^o28BEh1+(mENJ8WSYgA2J*xchpO=G{H_X!_8>kED^ zPDwzhL+TP#Mo^h@OpSvxw`R`ACnQX>QC-dX(Do!7-l2B~P?S*iOAOw{C2P)dRdT(k zRg2tk37nNiZn}1*2EBZXGJ^l&IR3vl+XauLe}>vk#Qh9+Fprc7PLq@ryU@-GD9i?05Pv zsy3TJBq`T#08Y<%)y|4yF=lYIIGfHmYo?M}hp@rAX!c6K7(^9bv5>&Ouj-ziny5{lOzDvkTR%%k`mJs1Tcn&*%aoql8ZOTu zhk#M!+Nb>ptmVjIXOJXk!9q?3UONWihTkLJbh2TtT9ZT!Jk}Vos%F`;oVOFva+IYP zjdEeR2sUQd9;bo2giF$x#{DBA`9zA>zWw5;Zk@5cPL7<3d1|ZSe9mu_gRJLN+UjGZ zgTK-So_D(>21l2O@Fg0b(@=ll#|z?Jb9p=~Tv4Bj9CT-8;^IyUdfCp-yi0T6CU2>R zTj)(@7&*OJo$IcPw4LNfk$O}8d1TieAPViwd}x=(Y&$>%h@mOe$R>HD^wlE-2TBcP zB8r-e?hIa9#-~T`Xv_L2l@T3WlYogu~ zkyNT?|4~l4&22K~paGR^zuB7R~E8jW2`6`3dk}jXObZOdUyaN!uKC#%m z^6zrPKYxo~c4mm!xrzwH@&z%{@=tZ{@07;e;pnC zU$~?HSj8#**E0rfK0kR#%%ZbKl;8Qfk_w~;+EJuVtoFz7wNUkjJS>*tuj^%`ax_AK zx~!w99(9wF3Y|l)-_j-hw>v^F6u-)L_}%}nkkJ23V5M&>*4FRZPzMCWBUB`?!LV6T zViM)J@k1j;eAgd%*dh#Sv~hl%Z=LsZ!7P&r;fZI}c>VZt|1Ex72~3ho8fqnSVbqFj zw61SZi-KN6MMUy8XmA7nu{E=?Pp4lc{8>B+Z4>3(#4uABR^DgeHv?S>U>@XfGL8=6 z=hlP{4OmyXZugJL>Of3BIW6zE$EEyQTmLaHgRSV1Ph37KjFt?JZ$wsybv77SY$eW> zXzCOjEcA^)RHd39t2qC zh;HiZaqZ&wj-4Uzw4^LItg+_jW~$>o>H?MN8*%m>zmXWkJ%{06O2Ot$HCDpcZEk3!drP5$e9mJARSBD{L|?q z-v0XfuY*sq?9ZU%9x#^Y$^(SWmy@QeM`#h1){P&KDYw2SQI(b9Ip7*__Bco5CjwbC zGdU6stcZv^09qbG5Dg)Vreez!QQT4XKBa3ZZ}tDKy%_dBdlfwWVey)*zBcbW4RBv% z^^!_VAKt$y>=}(4_q))hcqdA>#3jJ#9jd{k#WyKN5;t z-mAi8+tsppK-laMbj@o*>b%4()P%$^od0kC+1h`wUo;yJs(wA_qEPKFY zN=sp5?;DPzH#*`sqFyi(AUk^H!MU zD~^MPo!*s;O*Laz+j@hP$n@i?E1*l?^mK|iY?Z#8gS7WuZOl^`0wP+5&B;`DT88Ls zt?={JsUgHe)<^ZcxzrSQ^5AE^&^IWK`pSY~P}hv+oyeC~?KB@1ylVazni^q@&}j}70vt%RDj;ZgMWhLJr#bN*g# z{|}>S0q-|P^!B9`A_}NaCEJ*NjC!$2MrC%WcxZZVP0b}nMJ;3Jx2uET2i2LBVaWQ0 z|1+8=hs&MT^E^)?X`m15!;ETXN#MtzNKYn<6;SJR5+BXXa<9{Hax6IH^|Vy7%;RC9 z`!-lt5#LpP8oNXEO|gjz3avRiHf5yBM2C!1cCMf%(-!#8O7&OKr2}D0jR<)kk&3NI zFB{>E1({=o(ZkBbk}pl2%I8+qxt?m;2P$3o6H*OnZ}@Rn<0$MgEtkBz)S1bJ{P=9^c^B9ULua()vBGB47+f z!J*$_XN&7)9X%35>tR)Ab$ebXvs2>b#??~xJ0q7;7$DkjZ3dF;I-%_!1-~~Rc)!ng zqBY==n%=9Nsl3fekReX#&4k>{Eu2h~)qR<{0|d9RQoEDQW9_pvroY7)o!*XMQHI)O z7A4*RL=Fv`qK{p3Bf}OS&x!~*O$DUX75dTht3zGFO`T|toHAu0v|gWsKq+hNPU?~Y zdPT?^8fnyhfa)^=k;qH&;e_q!uYGiD_Rz);_ezc&9u@R`QAx$K4kAk^xlkGQnHVsBO$@{HL2kg%Z@-3?Y#h*zC}|B^ZM1s96E0EsWskd zOUjk~Ujokua{S_9wwcMv{+^v)6sw%P=W6Yi=pRWIoE&-j@l3~KQl3|@%akOITEUv^6db8V71_rd*5`#-uK{`V z+mr4?r!J~qwmr#>OC-7$y=k!TN&8f3fpv1rQt}(H%4TJb+NVfy6XO)-l3u671w3K> zW$@nZi_RUXGoIN|(-8w85NOzz_|kZ-{X(*RJf(~Wu4m96{kcE+SQYAKkl<&+RJSZp z_+*P1YG(f8O8Fe6kb}A38cDL*p7_s>)UrxK_(y`*)9eqs(q8~kd6J#Q>)f5L+bPSL z)x%T9J_6mT*?HUsDO{t#i;mcx{gvv)FNlJt(qEov)EK`E77w8FqjXkXCwr;;l)}HE zhLPSnNf8gvY3>umo5q()mcbN}r0cKd#c1mF zUBAkPt9q$kI;Sqpm`n|c@0(lgByUU|^#rn3$u-}=5WFLlLVQUz)eA6ko}Y}O;+}9= zSy6%>?z&2U;7W*o`pkl7thJ9y(tC6EPdn-nVl=*)E$l9Wb&u0Y=P?aazjGF5v_DO)OnTb?9r zrCe^ou3iO_e$ZF}{Y)OyNl-cNW#dX>tu=u_-J59w1jCa!MO*v#B`!~oBTwHMrc7(l z^lu<1AcGU_BtNdac@O(ubIV-ts7*(ez`P9)lMVut*51$kjQ+Y%Q`kF1U$$l6nlY#| zUZFW4Q{bsT;H_5r=4aDz#+BP_M@u|KqsT>{HW%j<`eJm6Xh9CcZu758RLBgtx z)THRwA+=*)9=zY_Hf%wc*0;cxTdNhXeru>~Eg$!A@nf75e^Ypv2WvQ@vQdaRzraREdmc9w*{|pzx!tu+WloQ@=b4vPIZ!-*n4}D5WQ3 zPd`B{)XgBggq_?!^)NU>j@mY(-nSQznz<4BC4-!khtCE;7WMJmW=)59^Yyd#m99D* zQsN^rl*c3QF2ThaR(V!$P#Ih;YG-W%km8e|i0p_+JrxmgbadgpSTc(r{Q`W%Z)>u+ zs@gU?mC(l!^`aAVua%Wl@SqF1Dfb7f;}=;I6hs ze}{;OF;eQ1hyMI?+b-LMNi_;R=6;BZ~K$ZREwslU`7Rm+!Qs)7q~e)T#II!Amw8 zeckbl@AL5Zmp?w{6j3E8o0oZ{pgzSO5!nz(>=`$nGERsb+}pkq+uqW$k_Il<n|lSjGlg=!Tp8_p6qEED=3C!VP&SKqJbScAxyPj51Kl z{+M5L$WF!}p}#7!_NS&pdO~!B{ImBVmBsH`O^{}!WOY^86rBFLsZX$L2%oXyjYJSj3HqZ(8a|891p12C z>~Cq>L-yvgZ;S&+WiLAecdG*`x_;&TbSo6PREm)qBh@_o?y1Gjz3-O^Y?_yUb$F-` zb&LNx8dyHp#p#xJa#PpJ05vLG3CvHNZ#jsBDg+!`_RyyUud$J*zE1Ab__mUwCdLM@ z=`$E&N*9(5U*Swyo!$7A+Px(Q3&} zS$^~~x8^}MLhf*rR{sN;$xFG^j5j~pKSjr8n5mIs=}RlB@@N_)H~qIF3JxOXt|LQ}-@P`A?bbVBx`i-dP8t+0mb*ZI{e; zm)XqMEN!>1IA(Vo;{qT;xn>8qab=-)TI^hNs+4T+3`*iuoD+(QX-EmRwf)E&YpwXo ze{_B6+%l?LN2R#@NkWX%CRjn2vYN%tev{9h1U^nao=lm3+)kqzFmpU&26xRh3_d1> zwj};t$%gl0I_XK9R`I~~iGv^5m+(&6-j2=cjzTAS_HrgG+vW@(2{rx9M285+hz(p6wjcQsM{1!*Z<8c>C$IO{b z{TjK;hFVQ!>Zq>%!UjXy5n%Kqwjn%kjmGO5ou2Zv4UVr^STVrE$g=7~B7@WE)&*{2 z;-W6>t6~a^)}EADt6azJI4-8^(`lGw1xA;dus!Pj*JHQJ4oSOB340*`K zCENJUNlVqnEHe2r?bedwQ2Co}!LrFy3q^j`I_LNbr(c>+N6Z7_{LIOkJL;I(f3BY; z7QdnH?x_wfHoey4y94ar0Zd0t$cIY4#2-L)$+}2UMmkruN;b<7r9j5)2=;NNAr8my zQ%NG5VvcPdplOT8T6(A#yB_8|A)B3Oh^$0Ezg{cwo!fBKFlhnJ|1egHO$w!%4q{#| zlBtNw&kc2aM`>;7@E(=9gjsY~6R|7nXAecWN?GOfmn^v&)C^E9HJHr>zkN(0iM7PWKBd(X(D3km*Y`ebAdgT2k^U(2~ocL9u_6*%r|+3B#AS2%6;v z--0Z^Y||3FVce4S=;z6wY%?d2MQ7MjKl7K6yckumRNx)mGrh4lmU zED3JWuSw`^-hLhVqRMVereE?j$}-~3trod;5$2qdfdM(guoBZuPin*&MRf)GA*Ys~ zur4*O?@ya3>E$Of1Bo+DV2kekL?EOgkXtd8#6r-;>*l1fMI6ZlckG7Tvtcoqi8_=< z+>bdT_&&9hj~|hA&>@r!8xJ;>F*F-0P;R2Qv{5YM_klSoehx7 zMRa^@BrD;g_eRRQ){CQepLM~((UeIrHgrF%ej)eL?*M7(_aN(6SAWLWp^w(f<( z`HPq2WBTSO&%rn7)04Blqs8Zn{!x#CMV?5bTM-#;2+SOm{{FYfIh|^vzqiG;Una75 zX=LETBCzU;g>8)H9@deqX-MG<--;@!@xTPuh$dDvE#XitF9$wtBB6t{s14eyTv{QTPJTcp|95NP2F`dXhKn%?#D=yQiL(LXVQsd>y z{S6@1vm>SKR%iq=kTrT=A2o|}vnZ$4dlI5+v`pNuf5nDo{6KvsqxQ6dOm*TO{aIP` zFVl@%OGW<_kwsHdyROz6fwObb+#Ts0RnLH#Y^jaRaA`c@t>Tx>e50zXT;63bJNiu9 zUeXe7IN1+PZdzH(CAFGg4se1fj#&>sbVEvs!}3uHPoT?Sa(U-2y^1f#5qu;mYw--b z;&?i@rZAT1iR@~(Efu~j4(rZF6GUsJ&uO?ZThF`CNuy4@b=~IqimAaGKacs7a2Hg* zC*Qo(*lNy_X3Kaq<;irf_>^9=p{+H4NmCJ3^Cz4Z^v^rv-FkruBBFEk=!ob+7`5>T5G++am4w(O)h*t>xVYTrv&9TnK&UF&&oaJ?W4|a7$*8R z;2oGv&h$6TaTnQlfFAKjw132+?LoPhRTZJj7ydq!ZSpH;s)@o%6usf zSKV?}n_;U90gMdOJAlU4b+pTop?%HLS!XH2M&)vfs4zqcdwKWd=~(%X#tc=3WR4ej>dx6yJdfOLV%ZvS2^L4gaB)MU1$m5aJGO5mz^*g}2 zOdogifP}NhzCnQ4QGLLozJF(NPIJ?66kbkF(c#76u{g(d@s9oc`t1{o>M?q~TUvVb zu5r!Djxus*Eq2Kx_%`3znl8qCrF#GYo41c(59LW=bJ>F!p4I@_f59l&o;%pJ0K z!l#k6x&#!_Yk)z|n!Kr?2PcLhy`qO)lR@p%+KHF?FW@W1ed4p=o(}8H#8lf(RZaug z+Vosced@MFt}Q-C&Axz{xdsgx`sd@!=dp>mq*Sdab)y$p&@B-v80V(7oBF$Pv(}p$ z6V^U#_N9AswL=~47uCEF!h;k2Np;*3xGR#e7Omz~oOG_Ts6i!q98KE3ADq*(8}S;C zKy3|aWc#K7&|2(*rl-SCM*JyH8E)>kXM6`>numCk7pn;zm`L+b`8FIMT{(oKLyXdr zSE{mhN+o)vFAe6MxM@k1sRfnHc}(hg#Bn%VLkzSn_PS$KKrk zW&Mq*&z8w>!Xv!(w-Zv;NuIl3p3jgRCzTG+uX9E>8Q9rOP2{F$egcoqzl#g{JflrZ zeg~LkB+Vc<`5jsM-s4ze8g!Vxi2eMo-2HDgVMbI69gK6@l zdfd3_t=Rm~rK7+~7vux@gJb;|fSrNkM?|Ep%5tS+`jk&|UwZnKSvh$qh6lIxyyz>J zZ2=qMqd8icdzT3y( z4sgZ4BzJKdJSL1*N-)FN#dTa z)8k7QE!HB^gP}>uDX-?1zpX@S<-dQ&Q^##0Kj1=msqCbYUejG{V-6mJwn0zN%j1qT zOX7Pc*Ei!8MopO?f6b!BcpoJjT{f_gy4T>M@U|YLiKn5z_4z+-IZ#2Y-!P2Q0i$7jyfpOAY^kYf{-SLmQmFr2zI+3?eJ-9%lfxW1O^q3u3xvEi0J zKMK!oHT%H2w|lYmuEGhJXS1NoL(!+a#7-(9oA>kVSNxhufBUH21>3}p>8QKzMhdoS z!@c9{2dopChx)_xiS)v|fj8Zqd$uA%Tz?Ps!*^GLc1P#N20PgVCvf#XUH6 z8B>w5T#UHgG7A&un{8Fi`acZ@h4e#r2 zRk(fqrGBhWQzJF@fRygxl|P;-_o~BVWR@k3z24`WpJt)~gk4M31$O|-Ij6WE*Cm#{ zI~Of7s|bs%hCZ5N!E2eqTV>N$i2>}G5LnwAI`YaJk{!#Bja3;=WRVr;&6VBa<-Cod ze31vHsWc73NOLLn4rCXnA!90O&8!pDb-C6i!^BB){)9--r>?+e`E9Avs~>j&&T7{v z@3M*J8dKI*CmJ1_UMGagk-b~i1yFfz{Aubi=?h$^^LH1PeYd`wr{~P1Om8+%GvVFp z)H#XE*z1SXv7>s#Hz}Oe@S@1>TPw}gO1kybWa+b~v%E*`mpR$`xV8VuP)IT}v1LT) zBt)-YFZY#bf8m`(s+u0?8HT^m6RR022>DgBgBXN!3-~IY#1i;ML}jYzaL#L`Bmae$ z==#%3(D_WLBM7Z>Fljc$kIEvsKbl4WDldGK4w7|aG1I>LdG&t1F>SQ@aBkekuGxu} zd)g84zU#Z3V!@AWHX|JfZA^3f@m$EqONzK8_zI8so92S9S1Nsni=!q+!t)~Oxp*3x zt=_riO_f}d5Gus{`K|g1v?b_2_3R%mfSp}rML)gvXtbM0^}ZaA?=xy$(5-fHngKreTWaPBb0k$dI@seda)Jz5|uoGIg_rg*Hu(I5>dUJ z9hfbZXrd8a-|454$jk-Au9Dt+j0Ov|9%=hCLrWCgXL3ygZn;a5Ok|(xz>fc=s($UNm(9V@>Gp^Y z41OJ$v_D1p!DfKULdem6W}How*t*Klp5>^HM_vvi zM9h^DQ6_`D$XG9anU&U;DJt{bQEAI6O0m}xCN^;d@#)`0SWlO5Bffz0(UAG?8*v(S z^hor#cR|~wK1!t*!|~3uRX-mPQq#XqnMh$44nDSx^4?+Q+aYB#tsHCV_-a{YcThM` zK07QOQORZ$Iw?Ezw>iT>M-PC^)rlTGVP?2qWhDF54I)uACFK6*N4%Q%^?Avz;-W&# z@Svf3@sN5-|6qRRv!6c{(Mh#&N98K!ekflwAI$Ww;M1v#$5Dn=6PYYV<+n@dyc>#x z(6A}SLl61odWhMh!MYMo9NAGAKhSaJ*9UgRD<9-KwwBP#ak-# zwWs5)8f@iLoO<~B9qJ(Gq>rw*Gud1#TdDR<9Fkgb|NW2ZZ~3!0+~|rJy;cyWAr+d! z3C;2XdVu9w6+SK5_1kNgmAun`TKoTb%i)iejn<`hE`=s;)4WMGQ}8&FHKikRbXy~- z{Gj4j71E;5+VVz_Z7A4c;5}8N<%v^CufN;YDe{tMQP31^5WXQ3tr$K{L<2^zVPFh2 z{o1u!{np#>#(YXS_dqRxM&{|qJHQ*eOT>1a%rYviHNJlv3o?fEvN@{$iF zw*D%=!?z0fmbc++q5xE87y^0zshV64SrpFTtXR2q2IgG%q=+Ul|ZyX zsF|(LX{KFKf7ZfOkGyG$>}`nb{@nc`J`Kg=%N(9t zf9$OO(m)we&v5(`yTinNhG<;`)QF*|qA;rocv${Q@!TnQQMcsDCA#dhCG*P zB_-Ked#=0wy2aAk%WKKuUKUh-ZMuA))xb9ilPBg*^{~YiWNzQQrR=T9e0fSj)Ohdd zRp*{f#H|7%KkzckZ6C3AteLyGym3;!Rqh@!#>V@Zds>?fS#mMeF}gA!1LR<1I8+Rg zoHne%oS;uOygqrW6eBcQh2Y&6jj)|NB{OTGzbMJN=PD(Rj_t2^(L9yoYg@mc&Daz+ zQQ;Pn+L$xlCz{Axi%%{^w$uEHz^Logw)FOMk>Uyem|(r9{IlM;@k;w*^MfXXm06$& zu{UN;4<&<0GU|Uq1Poi7#xJQ}l9b`@xUI&z?KdTPkX=3I7-yrp=)e$6JF;owZZ_=|foX|1}RJIQUZbcYuY#_?wKt{daOD|5NMc|83nv zlYX~vUw~olCP6k7G4;ivzdqPXj#{e5*4uG`Yk!22N;pU)L3h!&yVWf30Mp(xc`KPt zZYTvED-L+~6&1n#?yg?hf;um4xOeF}-oC)^!h!0k-Wal-faQn`n7Ocp)Iu3wUzbqv zYOb>6h08g;nlt8Z;~JEcXf#-V3LI^Y+|bl~=OERFpAwnbTbB@K2$?v*x%{ZSb?;@V z9P5U*4SQjDrlZC$tR;rcru?m*_Dqn6y_!MO0I@iu{UNbibFb}kKF!Qa^c2}==c&s? z=+i1*(-joyEzoyMc|tkgBtI$f)4E31$fL>VKO#U&+Nb>`@}uulQm^7S!25?OuP4xv z1*JgLZvr|0^?oA2X{&f%Qe#)GPQH|!e^w%ZY`yL|T$?!FE@*i{-=%JdUQ>DBleWZz zILz8!BiBBtGNkTNNgldPMyF+Sw!2B-ko5G|vy{ytpQHLK^Py%46}4@?@{dw2HBe9D zR9fU(Lu|71HoqkLh4N7h z>Q|c=w9Ik!lL&O^xQSM#@pcivsVJkI&0r2@2}xOA99MKUzG{PeCQpb*`#iHHNjRlcVtY<*@w&EMyj=OepV zUn2ZlM<)3MO3H(+5BLO#hnhfgAVSo;mdOrL5x%Uaq4|n^-LWVKisnmfbU~vg}JZ+W_Lo za7F?MFWyWr)x6F<@wGV#r(bB3+$q_#IsbsT>5RN#+g+=%xhD>eXJourwA}9$Rpv|T zCo^E!p@NsZ@{I3!Q-9R#{Q&-3zQDqclb8Yakf?(VIY(U1kQv#29Oa-*2SLG!_tCeg zFypz()IifTvKp7IH}mtH)tQ6z?vHuA9U@Qj9!>PrDE$KmQx1Z~@9)vCBRWn>+Nvjd zPh?=O$zfkumivzH0L};D1^Onx{+`R=2zQoy^wlq!#&4Kn!(dmk++61h>-nvh_C^(5ycS|H?X+_>~$T?<&FJuy#mA1&Dl)JvA|tI0na~K zZf*QoLg0B&7TImiEIw^I9thh-{w)>#^9dUIWGQ-9jOyZ?%i~rAMy9lRWKtEo9u<>(kllgtz=*Pxu(o zZ8uq2VD334bbJYy!oLq(<|UvQY<Lz)hD@_nWZbJ0@6$AW;NhTpBrWJcyquCgq3lIXbor|3)L zoM;wvtR!vGzI=Yi7`obumcpX_|FQShQE|1&`Y0hdK^k{y+=B!Q5SlbD!3iETxCPhX z(6~Ek+%7dOFAdE-)ou$htsHS^?qc=0lt6a4 zQ?%9(1m#wSd#mMxYhfqLtxyrAER_)|BL+@~$-k#a&DU8d@L$z$+ z?=o91ebGZrhduFV>p1@WduB7@mifWH&N`>YjC?8eb=`XuOB~_oPq~~1=HmO3a-R4R z?Knu2KCR5SE7^XbjnVG2?BzW^@ys54A02QR*|bjYbM)MD)T73MXie6+QqDxyx>+lb zc2WdefHvl47N*Lm#2**KAozw*>(kh!FY;k!V4eM`7QLpZ=e4KydVAcH)ZK#SE`~-o zbka&L#>^7MV@U%vLxCR%u)*2ci>0w8I!8+4)%a(NyXV)iWvXbkc2_oArpipm7q>q6 z+o$hZyq`=?t!KeKIkrlE;_z$(Z9_+0k3e5UM_d6qoYs9zrdhdGqv!Sxed5ISz?Oed z<|OhBjc!GCHe-x31JkTPanRMGyqlb0ie=leK72W{{)^Ee4SuXl9k#>|)a zOH6(0TPlIV%Uu|tJIrfxEn86k1EI7ykz|GkgJR|s=KpwG@SPwY@pZB2vcpKK zi}1|$JmG0f_1bBTwAAoK(jA?RdTUXQ@KrIJ@qNl3#-}fvuiM-kH2C;{axKy|><#;e zEfr<-ibEteCOPj>SS`)oO3h2IH4q#bD*lH9MBJA(8|Y3pgxVf+urS%_JodzIkic;B z)$bTTuTXcRe5dXry$s)uC`KAEj(xjba-qE3Xo%)-C9Z!u=7ae&j?ZG~+ko+9G0eYw z%q-0KWF&IkXE)_VmSBNw^qdX@Bf0Y&gGWQbb-BEjZiawq$JB-2ta=6Ip;%_Z&f3k9 z@q&+jh4qON?WvZgBCM^$kyVb#_sFx=4%_{P=mIlgR5_k{1{*1>My%}{Rc zMZcYm!OYU5GO1qm5c&qp6rQI8QN^jpssv9x1&ds~zxd2o$?pK3*`sTl_lya{21U}* zGdk=fUT3P!d2W}|bkgN_Fa%t}+g+#f6qBu$vUsW5(TtyXB=0P$x>5LpCC%|!TSK^9 zH1?-m54cYKIF1^;1iPqQlfKy=zyn+P-gKv6T4vb?sNtZk9|#~?QKLozJb28pQ6}PH z{vMwSQ*mUx8R-7z_{^gEY1ArLSuM-?>TcC$QNGsu_dgJ7Kiq%*x#&or9r{guH)J|$ z3z^r>OkKa{;yV6;@S?7+lZQ9l*%5z(6Z7uEFE4$n-xQ|Ay6vaU)}@ZFeZ}rhsu6qb zfRZ6!8h;FK^U536<$QM_J4WsH=C!nxgp5TLp;`n7M^n;wHFbI2di+L6Maj4M;*L%O z`K878>E3SFMJYLLrBgM(&#N-C2=L?i+KIS2UO$8-DCLD1m31dKt`%2dPZqy1$&f}L zGnsEpJ=QTlkJuxly+9}AkL=cH$$j4g564;I;kahtyr<6(gnW3B#JAHd2z{zx`C=U;>MA5DW$vhnx4i}f&=XC`uxtHFYOyzTz1#hmo74;hQ_>073 z3Gsk|(aU~)n@a(DWQpk+@Fs1}68lc)DmRzC9-@=7=6ja*2`2FU)!q6smaY1SQ@9@v zj34akX)HPY0Ley?o;JL}-z+&kIEZ(5GV+cyu+GYuXieUapZ0U*SE->h360SW7s)El z&&tKzIpEx5D62SFtYjnm%w>PBcIftoxAP#1Z=NHN{cXd9@!NUhFd&e{6aZcc3)e@I zf_!EDJNNWcGpN}v)P)LmaqJBY$mJhnB8flY;i?7TeIs)tUNMx@I=u8#TdNvA(6(t@ zezDR)=0$}Gdp;E00mHotD_|JK$o1lO2P;CE!hdPPQH6!o06CgLOe}aZ5%<9SlDG|C0 z(!3)e)HTQ0a6=JesARl~D>{GJ>$eXX^}^ojf9+V_D?)*kY4@~XRkt$k2ZDy`m%DbF#@rH++D#S+AbLfNa)94X=74Iux*% zWo68P&&5(LZlr9OI{qd!{MoWzaOcV~m{*%Q+E*<2oEqore(9}I9qU0utGl3*qB!0< z*&CBmlGsu%r1iV0Lrx#w0X3WVx8ShyvCWX>4W>^ zl#6a8dGzjQ=Px4KU}=_|djaS>3~%nEU4Ssix_I&S&w8t^c6mgvE_$ z?BiiFpuAPxu~YsDy$BBK4P(|aa8XPylz%CWZY`u2YeYfqc(DI03v+-6e28M=GRl!eo~K8<<5op7qiU&JwaDtdrh0tcQC&a9 zZXIli`^90*>v{pegwI8?yAHEbx20z9dEG`>?zfp%v-?u5rb|+eXPns$q_@+8Rp@tu zZQra9w&xAe$+1Y1y3GjnJX8nl$aZ-e-3V8*Asw9|+~aK6(vI0qOSWvDX%GIm9N;LC z=z{3G)@>?EX3HiB~n;8fS&5G`*bwbM$Y9RR#hJE-em|Uddh{w=G`PoR{!KjmxR#9?l?sP zIqUEO72^9oFZ%8B}COM>q%)Q(53)?^k6 zni;rRpPB>_9g%LRPZq2;`W)>U?EFBO$1?x^rfQ&OP_fRo>`B_q+(}I1LTgD<&)=mW z;eh+QDh*ly4?`T`*Yg5mg0MinZkKW4~eH{b!W+tBB|dnN|`%ksJWwlR_+NlUXtG)*zy`Kl6e&!iti%$-O}=jd(-vTG8qGf3E3oGYeD|{ z??C6^aAiqCS$7~4p@t4t!}QL=LU_>7Xy!|JePkzNivBfwtGKW4vrXu-S!!Iur%aAA zq0}QjiJ1(kbP)MP`s7jpa$~=W>GagqYe?5?zRqMOQAX<`j%Q-RR`mf3Ax1DOlj8GO z8|1HX>>(D+L7LZ^`Q-}IMA_DwU((7gwbRB$a+VG9{=HZJgM$Cx2*`o;L0)KigEo|JH0cuv{aql(=%#tM|eC;FbW7bSGraB2Lk? zHGGb74ajwYL=@P8eB4F)^@K#wCL(rL)mP3v3P%-(U7;RtKDzP=p;PyKp$Pf4D={p9 zXFgQ@I7a$ivoPn1tL9qDTW0KrN!N?~9*uGRtm&1Ave1Z@)=GW*Cu7O_k!rSji;ldO z*SC zCF-V6kMJThT!oqKBzRsazD=gqc$pQNkZmWV z*W_+~V*UMRi_8!uLA2;A7mVO9-I;2&fpim;+s%4Lumw{77)I4TI{uxv!mq?Jm}$~o z+!HIhHlQh!S#u=bbSEc5jM_tVQ5dx-NLLRy`kgtZ1icf9z0@2fM%IjQhmDn_2WmH_ z)4A19(eMqRgiTk)90kLnF=nQpV<*k=16ocZUPau;u`(bjxUPTPT-0<-BRS2YVx6}` zr%dQjJhDRPJ$=mWcsDKe+%a|1f7m%zTEzj}GWz^o^W`C@1Q=e^E$yR1oCqIy8P*1o zUGz&1;M`nvAL0b6$7Yd_T&sHGBW+u`sB0yP6E|a2T1{yJid?4KaC5Tp>0q(w!)332YlP!`;&^T&ZNn0hnoW6`oq05KF(j!d0$aiLi=sZ`4}=z* zZ|>#^mgQ&g&c^R^Z6fG0NQvqiDumz)=WC*Y5=~BF6Iq|UPw+?hSGe!)HH*~~wQKJ9 zz2*^221(`824O^LVdg{o)WsvnV7Z)F3`gb{YU_o=aG!q5+H)t8W&29>sHl_xP zq{xtYeNiLA@T3uM;H`kvl&Ba3+j4tA+xB=%PMdjW0?q8l)u`u*b2kI@6*)K-yN=2! zsznc0L0&04*a)jEuRN-q6bg$!zflOvq++R3EiL#?XYD$wd~P|5v+?cWX&>Zyz-+tZ z9$SzdOX*!BG-jgX2ZGz}&u@M|5JH5p?4|wAE#UcIF28RU0?vN`Z_t_$>1`n86nl46 zJ+AqP%6NHdToH$^waQDGr|enhLyQq_p_1@f9p!!K>2Ip~N zXS~xF+|F!Rl;>iHcM$u2H`VDtMqSGMfv|V5_>=O7k4_QBY_I%*uwC-(*8JIC0qS!v zE%YXSPN1f$aLb*@%S1P%Ap+lEjKKoc9p@wH$a#d-tJ9{l;m^^PBcZ}$!wRF)$yiOq z57Y^32(LyJcc-U5N%hFUy{&S;C~c0*B=5LR6YI9dgiB*?p!CG|lECgY$Ll7QNv4sv zpZYu$2JSwhVtA%*o2l+I3S~qMSTqW>24%kV&p#_3NDIKv0C#M61WjP9nmN`%tuWR{d4raCa*NWv} z5>mOTO|If*>~namGv!%(ApHrSsD@L)M|LY|B$?UKOl&|S+l@nc}F!+0VNoXMm9 zMh!1y1dRp$K)A#&adLRQ(z8{rV*gP^Q9bRxWY;R-sBE?#W?R!!-BGuxCl#wUy@?z? z=)ITkhlP@0VT5mQ+b38rFFfy=?_Jr{vT!e<%YZ!f_p!_$Y~w#(5`lfy*9xvoWkNeb zLL5D>(j5S>a0Kz z=NV68Xy29=#74o8x;Ccr2~x&9(VDyye1w)gEJzbIYns)zY8U|OVD-K8R1=!@;awqBl+-Z30OYGc2sqT>!Bb z9RqsxPoTT=*Jv3pO46=o8{y!G=+aC7bj5y$;;Vp@0UCt9#7|Bq@T+EHHXUu$>xbd- z3-1LacQ|WhY{LRL3yCB08F3t){Ho)u+9CW<0t$DkcaQt+M_1c83Go@k_flvcp?GU@5pw$?aB<6{^ z*hQRoB_ntDa(H8tu$kLL!M(C<$($1p(eGJ5Xue|(@Xj8j*z}*lUd&)Q)uf+Qj3RM zuei#F?7HQ*PsC*JOO?G8|BL4A4@w?9|7y8)ioNkw@=5&nq;XUQ+$4O(^W3>hrCqe4 z^CDB8HNk4dL09zF-I!G{J#-4>k4Z{GyFO#b=WwB8p)AQY*PwI(jY|J$^zD&)cq)WP zM{*LQ5ufnfACiN!qVwnuJK3fWPgS{#X-HoA;UVB{)eQx1$8;O=G?R_-82@`O(1r`M(l~Z9-Haf0G z_5=hu0G|R_@Zvb8G&BQx|LDkgNwc#K^bSEo*%B=5MRjKil#eA;z;MvhHRuNcvJ-7W zGM~R>-0UD&a*;mH#Z$I=Wdb$MdnDrQx-N}bTsI1h`cm)iS~UpLZo2eEb&l}Ul~#30 zRJXkB2X#u`>C4W&1CD~CCVYzUiP;DyB{jEzm`8CeA}tzd&Q0wV;Q*U(D=Z2Um6Phc z^)>9&lMEsqLfujX#>AE?dnD-K)A8Z-OOO*PZk)_TqLD*f5`*qdc<-0Pwqm}slhIlS z{oWB%gRtXm$AT3|)^vS^-JY`Ys}{Eg{{8cQ@mB-Ni(~?sYMZgyV*tYPQTn&#j-?NpRs+K@+9 z=4Td%AMP#`$32e5%!Ag&lPm&Me9hFM)kYzCj~C3PH}b{KC9KgbPIOxwZPLVPS`tkE~^^b`bUc0){M!xVY21d8%xF^VDC@Zut%S z@$6mNF6Lz(*243f?);7?#iH1MRPi4`?7!(F6l$jNJA>B_A2J7q;%JM|(P>#{Q~;ui zz6~*P9H0iv!dV+qQ+OY{vN$q(05BO0R@#umR{uAh$A7~!s&2J&eQi8Gnrb(c9>2c# zZF4i!O6XE-<0I@?3cW-_=**lSE_h%4QCf5CpxdNXHJySsl?T>0G7 zB&viA-+Vq~MoPCO#ig5o4}3^})E2mYJ5dog6MwpYRamnw<*jS0$Kx_f<|1tiSfU>( z*y3_cy5^*eyukF1mQs4kOHLffSWu5he$BsGJ-LI!8lB2kqOnS-L?3R)+_(-ZyFY(c z{VWpd=Se+7-K+ep4QC%`otgSyNW%a7w%;p1Qt^NKi)@W3x}~Y?;LI{*Zja~D0eL70 z@TnpYu>bk1Qh|mFc~}imK&)G+&Y*rnB&aU6CSy_x@|;Fy!N+DtyMaB-ddD!k^CD|; z8m9M(*rLmpDuFhDjt6X8h$Kt>tnfl#Lmla;aoAyn{BuR&AZO)g2xLQ`P;f3Thu^lz zHpuKliJKniIap~;>2^l!S)1@IWjGh-XNWZw-|L=+sV*k{xFU7eG0HWCT?6B9mWJ`G zGoO_k`!-D1-*eZv^H}LB({?1->0&9xo)+%}v?Lh-)YoK^*CKrR$U6R+P5etq{3{Xu zX-t1xR{v6je;U)jvmXC6CNtz@;BY8neZNMJdICn6tmU|i~Ko~1i`c+5= zWTTceeCI=%{^8bw3BJw8<(YBU4gs6i&Gnn8bSB&K@5LFaSId~BGX|`15$Gzvz9gR& zG~%^3o$C`!HI~ZVs;!KO*%%Fr`tnhAZ_p+jNkhY()$JJiW%RdnDbIJgh_4M|#=uWW zam3mnW@S@)=>ZEM*}IXLRPvbAiMc3*@$9TqT+oC8v?&ntp)BeGhjRl z3cC#~cfkN&T@4zpNU)|^GYTh*NFQk7 ze3l>q6fk@sU&T>N575w9DOvs$X!xr_#i4^2tX$bM*I^MDnqYl1q#RIe9JPZ>bdL1E z8l4@Jvu@P*;4H``$dcsK`Yg#FfE?0Cukj|cf~J9GVC!BidRYH^9eyzZ1{$f22zwWh zN5|H*rg&wLKf|T3s`Mp2_b@)lff&M3%zKNqpZPegzSh>1LV=r3<&CzMB<$1zEVZ}7 z;9C473NZ2h}EA*pYHtmH^4})FQOcp$jpOBcZgjx$$YH`w(UNQaBR`` zV&<%lq9f7sqN6mXbJRwHRK7{dC+ZQ>TZWCzmUT1)xWJ1&9&&^Rrv}WCIx>rOCTl7ZeY;EX^mDJD* zDDuO=`iFCPNZWJ7Z$7^^UHPumd}x8_qZ;2D^Hd(HXS$1pNHpE*o~zp)u#EjVrCU6@ zCWM%kmv-ahb-+k0coXwor2p>j5j5kcA|5xBMD^~DkkeA}3sGf6$5H9^P9?Xf|H|TZna4`@wE^NWBe6<#^ZW6cC zv;){2ihCUI!MC`8V$`XHtAQJbwjj=hHNI|-YX{fz-%R??7ylp7_%Dn0(Px!h?x$v( z#{JzgpZV5}yus4wDeu&s(ZG7h5(JW9VEq;F_$Qh?mFWdOd`R4vr;>&gTxLj%1P~IQ zm>%1O=RM7SZqqxB=|3$j%J*%o`l#`6E=F8f%AsWGW#B6u+OqYcEwen(Bj=az(I9RQ z^!goK3|)}X;Wrp)vS)%L&y@IyyTJ}=9v9N$L6RTUX~F6eY=!|`$otTiuDVELn#bJU zkSCAf%^>eWM5#wi=y-nuXFYb=gA8%25Sk z8-ktQ+ox0MN(;Oz5%T_E^`+{)V$)IpJH-+?^D1xDJ1X6`!eOM&6!heCy8)#QZHTV+ zSP>4|{V!qwU6c|y!dUT92hI}ex&{GSX)&93%X}gY(e}?&ovvM{stnCD9NSO?d`ulO zLe0$`N746JGZ3Rqs%yo~1zA_H<7ic@Iqnkzu70{uY=Cge#2r0<4Zf4DN&Y$tJ*nU~ znMJ3kBaP%Ax}thJ-EVDXKf`EULN{@OyWevs22b!QAD?;?xRM5Mp3g-amBECg~pg!TUi3zKxU74>_Sb5K0G7w9vTNK)g9O23X$)#BQ zbe70}a^u5?8K;J^X_th>V>;pje@ja2A&}h*qGs@1EbqhbeVTSw6#U#P#f2K9+ag{Zpt(>mXM6CwuJbVj9Ox) z-1yrC+`a@z{5NIUz>F?43P#8G>w^xcDi1jWg95$ul{GZKK$V79YwR$ESWeaiO^QKZ zLA5Gvm0@!56KLelxbHeLwnCG~hQIDA8FJ3m@9j_62|y!I1wsY{71m$Fl2@>EQS?#K zQ7&7cr4?1;|0}Hv#iVrh5u2_6Thsu4Rc10WJ|%{XWa?EyfUqu|p^6`Mz=8`yN^M|> zKnXc2ImC*tnLo!zCzeJg5^R6%w#nCSz|#tp*wM~~bFQVOn$S4v((l4av`sZ(^a{y{PqA!vI*DmaffRkFEMJdSByT;c65rGw9hvb~pVR*|jV`0nF z>c>lgds$jLd+e>ZX$`?mCnS9$EmTdg#Js*Il*E(XozZC>}0dA=u7BZ(Z5C3 zmBi^zL)-rEP~x9R|0mM_iS+*mAbsk5RO^gLe?(Lhv$%0_u7s?!y840SFPuUE{g4tH z(0EJYk%ts|zT%~S5BQ*#1wIlxuJ3iiX0u7(#Nei-A{mFRuos6N5i|w|0D+MT#RO8Z zq+8M%L2Wgj+LWSYGUIcTl!r&8p>c1LFvbbYp%UUZ^c6;Y3XrDFev!NxL-&F!sesR- zzHVo~zDXyLy8UvCX=P~0f&?+uiIivng++oQ4Sk4E>iSdos}{X0u8@1eedv4Gfnv)g zKgP)XafUaEi5gDbWC|(&JV0ElPeUQ&!eu!MId=6i6k*0BH;liqB7kR(rmUo3k)7G$>+Lrt7i8ZzMh8R7$=+)MRCc0+Wt?8CO||)ijBf_OYD(* zp=Ewlh=0BML2WV60jkh#T+7I5N&`!Ll@4CEpiozu2c~mjpi_i+i0LMaM2WO(CXVG! zPZZTouUerUpOBP0CZt|*ucZ~n^OK=WsWl8h!$0}+0w8^<&9Q-0Dgl=GK2Uh?ybZ*n zm6_g&bmQ9YY#E?al&w%cunwg%UQ1Y&w)nwD4j;?ktK>P&*^xy8q-N9Uui z(U@phbPu8+9CQqX+Hzvn+MyoF z-91uMuz$##L9Y)K!`#Ui-aaZ=oYf%7XFz}_^yt*P zk==vL!@GhdPqL!ug;~X?Nx?s`?X$|HR=x zarl294vRmiCYmQeKms8U)B@pC@W6+^I~EGgrGf2*YI#mtgBIR#=TOr|y2Y^^AxjdJ5=dBhT~GAHW)XqqtLD&nY4z#@S(YS&@EYgZ-{)n902FgR?|+e z+#h*3g%3pbd8mn5J}IbEQW1jbgqr`2RUn?CG3K1{a`3o(JmDzEL@l@v$Uawb?kU0( z#A8AK;EWlwdJeTZnONWCK5=p+NEYeUjU7lWCJL2&7G73ONMhKE}x?&O`P5a0(u3MZcqF ziHS%E%dgquSqM?@5w8S6Un!r8V(zIiuAgTK%d*PI~oZhVYi65e&xeV*6Mt9t>CSfDajDSoxH(Q$cmgZ z_MB2&CWy^!Uk9D<*ZerCZ@$!71|1i9pJM+R8Q_!z=7E=e13G>f7GZSPj=9fU+Z1#H2=Ucqdl7#34om>nb^-cPe6WM0{$CcGv1G`-@@e5>+3Q5$Q$JlE%p# zB{%AVZSj*=^<79V@s=BY5!m1b(0RyrV4x57K`0F}TGutxw8Qz5ypRSm!J6m0#8yIx z4`F3hHZTUZp%S7HgkukSinyk`szk(_`e|%_c2Rc8de4B0R;n} z*Dl3S7G@;@7rx3oK+1$y%bS)sU0eKx9rQH4; zfbEx;M|!fmgYKT&a zISXJ~m}Q(cLJtIxDp=G-g(K@o!4K?ih|lF zbr}DYf+!tHRRBv_5`ec`TDA>_o;4j7sWlP_aFaG-ny>aVt?`@`;LGxRDM9gHfNAkJ z>%?s}>%rvBV*Zd+q;^>qeWW_C+{;Vqb9<0u2!I0o z01%59mj*_U@L&!@|0J>KoAiu2#ujM~&SD21y(i7}eI76&4v|_dMau>1YiRhOB~rOj zPVTy{^={Geui7jK(ceiK@a0-Eezu%MwA>B?dN+h&PAeT^8mmLkJ%4q9$SBsuR^v7c z?}VHd>QP1~5K{VC*`UcW&IU_e_fgxNk3Z3cy#?|hsPZ!VbK5fj9tg_lR*e^}pZtOY z4nCJAd@uSObSwZe3r|1jKkhh4CA6f+XOa_S~S=g3~+T{B2Jq{K0#%y1bwHgaj0&@o+Z)bD&n>wY3RHctDHdH6LprXnH>c}OuZEZjvy;~c2$ zvEZgwG9N*n8aW^Q-eDu*gw%aJJU>IUNEy8-7dQNLj)qJ7X%k1dYT(%RuL>d{XfFI_ z**!E%V0rkc#oCIgpBN$x~3|$x3v=f zcJiKf9P^4(?#eEqN-dR-VAktegeKi_gcMruRC!}pn`$YVDvKUajAOKyVp!HcSju$K z?lm+MD9afMr@~Ebzb_n%Vtw(zvO{Q*iua64P?H#w?|6Cy|SQV@Pinv|8S_u`D|A z{6Nq*JLRq&*Ue57G~x$$ne%q-VzLLkwIFARjq}0_H0Y+vm9#MFeS_2xCva28RltvSkWr5stS5rMNPv|A33BOK8ZV1}3hjOx&e3a%3s45Le zw-t9QqSSOunN{4~ev>O5#K_fAQfDHU@KMKp#7#Q#yB*u2xIyA!GpS!??KR1)CC6ul z%*Po(qxYn%7s$yVaXzg0KAE;~P?a%`3b2lQT`15jR{o)4-4$9=PHjpX1SIf zZoa&@shlrw(e2CBEEMGn%JPzj9EV}jGZSqz7OpMUEoud$zI5IzT^Vw1f8wYqA`4LI z@wlK9!X}TP9fa&U0ETJGcADjvCyyqYz| z`#51MhRAY?Hj5Yd?mq>G0fQJz2dE4BANNt|wr}V|IK%f^JO|e1;O#sA)egGf;-KHT z+dpnv{#JGLTWIj-mEYolzeR5U;gy16JJ6^0dCZ8uku8*VQl^iFXjJ@e2rmx$Lb4W4YA||` zq^JA|prK0@8lA@k5RA`d8U!h2dCzPPjZcfmHKs;dad#(Vv7n{eZGXk%LsSQ!b3ABo zw{erLwk`L^|J+PiCQUef2BhD{8Fw5FVQuSohOTA#&E(H3<#}N1?hA3`o~|1kB`_|y zh$T!uw+XpV)Oi3e_b?8$Yq2#&B8i@C3^&QOFqX=eO^FFleV6iF##ihaEGf~Y9322KsYiJye1d+ zjsscP<;*07S6&-YYRQ1|hoDVemke4Ylimrk`T8DCTU9-s8*-(r0LTp2`fWyJP`6z6bZJ%Q5!<`)f){FgHhoj3K@=*H!oDMYRPX@ERer^hhVkr z)W_l)KUG~~hz`#QC-Y!55F@(|EShkJHUv(2b1H#TQ}@j^)l)r1=Gl9Rv9gU>L-{0o zlqbU)+K`t2e~`;R5i!~2`kzzk0X9KE6}@+VCTzl zwB9g>DLT1FSZ^MMtk8IDc*tS2Bb_({_=UtM`Q8@HIRj;`4?G1uhB2x?O?T&GxSNIWA6qMp7PI7`(^?%-?6fBMBuoykv$Stu!qT3OkT@ zPZnkjp|{*fbHB3Q!hWYX9x#Waaoj9~XKYfFrmbqUeP;8XM33JitdwGmnDDtOaPA!6 z_y4Q8{1dVK6U(DBZOMu3`sBut)U`z`VFWOUzXRJ=PZrY^_jfDN7l)sYsudaX3%%j1 zkEOTWq9coRr2i@>!ARaB)E$M81Q5j(x39{e9Je92rU9QFN?MKexU}|#3qL&1bf$$= zIq5SC78zc$@J|#kJx{*HmbYkann^Y7Z=`&Ye}Ows+fhLDR^M+1I$xQg{Q!loo@4Fh zb~;I1QM}puYE`PRkANJeg{ao2jSboG=w353+0eY<+94x{*)3r48?c@RmJGZUO7UNz z%RjE7e@`rb0@d$<3S<_%5SZ@Mi%%REIEdxlKXy%{r@|L*#g;-ffLZ#h>wHwCmSr0i zp6WQOOpC}zU2jHmrb4dafGaaIzE#^%oQ?^zhg0U-tFP8gjk!-XnkLYv^JKLHDafR= zh(f`Mc1y^OWlJod0^HXfKf>qs`7;hJ*u+&!;=7%PhzJ7idA^N0P)N}uBfNs)NZQ)APj=0_ zU+d9nW;}nwmh6A>GPxU)NM`lx8zZBrm5em>b`J^e7vuVq;mp-WdK5>MHlfkmSiaFV zoK!?!Zw&TgWT#n1{nU~<~bDw8vGy@uWdnWIy}U;k4?hpBq@=}kd$OObFHQ?2;GY>m8rVc==s-Q ze2m<)i+Ht7P9tGFzL-O=zUF_`xPJ)!{JMdN(K7l4!PxrgBYB0qD3c+Y5Gh?P{y>^_ z+c-fC>mDtLzGh&DnceF*HB|m7zNB_GI(Z&5?iakqyp@15#hmn{LGi0{d1FaAtS7&P zMS(1nUv*84%_&^f(Zr)r545F3CZ(qIkns5Vn#-$p83Rt{KeZ(ixxW;gC5iM-vg7;Y zQarBt3WgH*RWfIcfxOY*cJ~{^0h%qi;DAd4ekJ=}fSle20ABn~8-tDH7uj}BfeHwJ zAWp*F4akiSh(ctdPf>Yd?FngB_hQB|I>94%ELxFrX_TyX#)_rowzM0KXLS_6)4g<4 ze*JzP6Q2*p1hF`|Mqwya>8;tqeNM+wmH~=&Z0O5GezI29!&wGeu5ILPo{143?0D43 z&!N(~FXEY2L;3}6s&I5zZWHRQ$xs6GG#u=kh^) z&}}TPjPl44$s!M$Cm!CCyeCep$e#OwCE8Qs1 zQ5VN>gu4Ax9I8SaDVI-AEbDkxn=Pmb!);_rK!tzDVj#j|!#>IVMN*`y{cumgGLa=xXeH@R)L+FQ3EnG%5M~{M2 zIi*a;wFL&4VlxQ0$}}l4d>b+x_W#=PG%}zdt)8=<7Q0=O5pY`+6%k|e@@s7i#AYaX zG%Qg%na*sj#7m!({5N9qCxe7%(mgArwP~jNiH9SAN^!g0U3+pH=U&^#g+ZTgTcg7T zPKJzmVa2$cvUfW1GRF6}tB3^6R6WtD-d4M)n-4YnnJe}Og}AC33m4!}424QYE)Xw@ z*ywo~!$gxN)yz#fgTT2WHRN1`@^d>53%^TG!^xclD#reS4mQ>$K%5QkslDXcr;#FY zzth3J64o7RiHh4|&g06685^%IT64^}G`?iT)9?+(9*@$gP>FXHg$qxaf8k+?iH`<1!>4|{JJ6?c~H{YP+jg1ftG2<{NvB{&2McS#y|DO?kR z2d984oZy89cS3L{NJ6lrpC6r`>CAu4JZtV<)6c!@znWL)RTXv4KC<`z?$6HQqw%C= zz}<>k@GUo+Q;FFAAEe& zU_GGRZ2w7g$hGo0eA8BqaaaE8I+!?bSXP$eMPqB(kIEa5VMZVALVnKeOh8|gGbTtk z+}*KJI*jXjV;Y1ws`xm%+kjR)nE3!vgD+4tjTYFi(JRQI^{b5)1>p|e7BHXxKgsnbi7vuW&6^4Sd?UW zjK(!yQ?0O%W~jHHE@y-uC|35J5q*#CJsmLVId8~z09cR@2QH4+_3ZJFG#}4<_N*24 zxbfC(OHMvg7vcFtF0`A3*X(jVM_!+a1*k6=bFQ7qNPoJxJzkD5lRaT!=fiwP2<>|T z3rbDKFzu4NCj0{bCZ)og@_*@Y@7TEya^A@S9}p*j528R;SU*H2z&; z14(2nMeOZFHnE4QT)&mt4jJy&nz`H5R#a0^bw|i{5oPbxOSK-WpLW=o%T@S8yDf$Y zi^>Pk`I^~JkYuUYCgx7*j%KPd78~PoLqdCwljFk6Os=9D@dRLlIfuEtF2nU(ZjhCl zJ1}nfkq8?QhuC?E@<|^%L^X{#v~5_5x3L|I2G$W{H_nZlOoz^AyX-YN0SSUXe)8Q7 zKH^2OWo2!%qLf6<${W4ITSa$D)*SQPtr%a1QvzYqOw3mwsO`nr?~MHAdXOXrurC`Z zd2N8UecJ?fpUfAqSlOM0leDk4B0D26<318GtQ^cW5hI78h9`xtv2Y5$mWP9}ijQD+ zmgUH11B(N&^emd;rv-Ej^+&Yab;b@|M8CYY2*Dr<`8o;+Hwq z_-3uXf0uAXa`8FtS_(!(kjK(<v5HGy>`HKEwY>GLvBfZQqhRbP&aKW9L;RMzJ3%UE z<)+sAqjWHCXj=A2R$ouuuxq9viUeNrhQnv4XqU&@A%ln)Q+ZP~zC0_pSaT}NsK=dw=-v1b9%%3YbN?bjEF6iqn!vd^|` z>lxi#58am;iKMZ^ikcRK$Y^CnGoUMZF=Z41RF0IZv0QXuT(z!TFUIY`Qd6%)?zbS^ zt6o`-5Lbd<@9{E(YW`&N|EsNz#lzUi<0S#WC|75Uk>8UB3XVnF`P%2`>>B#BLQ6JdX#Sqo!@>9 z`Z8qw?5szD6C**9n9x*KRC#Lv8ZtceqG!`@?0am=w!k-`iqfo++m4%Sd+wZ`2Om}z zng@%U@(>Kx*_b3c4P@;0q`auoG!H{AU`Z$r0erjeV-sV-^8GR79ps%<$TYSX=mg8C*P z{Ts{(B}tSHO8wx0bv;+C>t>e)MRunw9z6al+14)xgK93z?R%1N&nM3}aY7F;+H4aD zoZR?(XCw_KG&COcBOlnyac&t`HI4hUPBqW-zOWq|9(uMVe!JZ36Hob)c84j0A~^HQ zZEehIZ%BLRgfdn_)>G{)Hta08x`&Tc0%A^|_)T&_pZ>5hGd8pPV4sU}b&A;x%yM3! zxe6*$x)kJ|^+>#SVmOp88L>}a6Dzsd?I<5|_PX|p(xbBgP%OPv+uz&vc*523JsWMA zbBUboSRzX`?)aJg));u~{(5Ygg5rFW_c-7G@UpVGwmP}iG+o>9@-+t+W{4^XBgb&Q zp`f!|Tap|F)s0Fl9i+m$wjvTtNXU~oSzDq!(}oj4i29mcO?hI&yvOqVL`yN4=_<^N zLr$6~$i}}!DLZGZ8|Zp10Wum53x64Cai10Yu_H&y^}Bp)Gv6(IkfQLLx8Yk3(nPmD zlDa3~(NMWO^+Ccn?qq}8S%Sr#N$Mu+8;sJ_Ddi>fEn#vvx)y$`?mbU`kse5;W#Z~gdEr3- z$ed%nkd&QedxM9yrjN5AHKQ}Xm+LL0BPMRqvH+@H@tnS#zJqP4&WYIfKe^BTn+uYW z`YjTEp7)KIX~gl`MgJ*Z)>Y8g&*OS)-t)j!|9QyT&f}p1r)PpIHi4EH~KT9kFZ9r{`|5 z@amQZKt+fZ^_Xo*#7R-bg9)5&C_P|po{NWB?bli&KtobZ=Mu+ zC$8y*vPVXYwTR>hN^rPXH7SwDX6JYR2;U5L)18(nsx}F*XKyP#lu*e1v029K$pW`8r=6d!@IWV#SesrE%z2mRUA=GVYj+)k@+(K1`&(Fs!c}{^la7nfLt`Y^|F4!6(U};OK=_qP zwM5>Bo8Ns$ap&Ht+%#R0lZlu;$-ll8%lCza@Jsz{P2v3^OKwt-K^rndwHTUv2d=oN zYLmArXw|K*W^&g4Lb;PmYB-hM5xuag})mR+}3J9%H1B z!UjzIzP2$()!>RMmCrVUwL>)I9N#SIHk}oUfJelqo1CmhOmc#73p0f=VMR#r@AL>IB zoMJeS`g;*Z`xC0E()A}ab5wQo24_IBX|fr80p1)TpZ=5E?7z7l(1f`RixPpH+9GsL)79xy*o{;uwA-5B|>--@67y2_K=gvv*UcZ?bw$wk&DqQ zziZQ5qGPkGtYCty?1$+J$aJsCaEa`t5~;_!Ml$7JQQJGe9jMbK?yit(z>^`M(b1uA zVRe&}%fI=%dmxpy&kqTOKqe!c$lami-xpFG%wtxT37R2M{(~;h)Y#TxfTX#(M;yX^ zLeCzYUfpj!s||QoUJtnVjc;`%rhmA74?+p2RZV6bDVpnmCN20N zx|{#>p^TUM5t4&tAO<++1*_|CE(&}!eyGr^ z3oN%Q430))V#OH1UGSa$Ub$=>D>z@R2P1B26e(G`+o7)9N%=SkA*l~Vmk^aRCRbC_ zUgD3ih^>D-d;Vc%!Q0qngb(jw#r&9qX#CRTG`Le1Dpdz`xXO9y{MW?o@ zsLK*a1^l@c$=FfgO-G2`_`}--wC7&r6KBBFi zUtq6tg<90+?+eV!EX_;+KH_>%v+SmKybZ6Yk(VN_Uwk4Ns&|1u^N*<1Yn=yVIq3ZO z>jT-{5Y{?|;WG?j>5oZt$zF|baKJ>1Q~DJz_=&}y^K>s|W;zc%rvtAk*sl*TxTU9( z;_5B(>T2C@4A=E7M$G%$k|6>cs$?U8jT5BU-^XvmLB~rDr|}?|-eu0l`!4OkMfnO4 zDSJhEne}%0zIN6Wp(r#|O-RqvLNK$k>hCr!dlmDW;yILQ=3c~h_b9?;-F9tdOr?_h zZ73E_6Ftgi9>`vnUJlwYvk#P+jxENyLbn;o>K3CmeKi+_>jq71ijl%}p>b(Czkn=s z%~+)Dezt3trVm5IIa)k*Y9uO(Bayr)CVc{;XpCW#6JEsmeLUoUf!F*1?OHv50Okznw<@kmNj-%Gpo8BH#sUBKzFvZXr(Ai z;6W2pAQEAVYsepuflefsCt+5yR`fBm|DizTdn_kJwqWS-Twai+ki~%{X^x5&zd*af}^N4ee!Q6!1NC}n}ENO*% zIS!Eox*Zm*t5*}gtQ!7!w7{Pse%)P&@pn@vS-A}}R-h05qV^e?q6_G{jW>oI^Yp>T zyuzN@Mnoue)G4>>m{^hKqLw?=cY`!3aaHecq~DnarFif5vfuGhrdX>--`=+PTH7?Q z9bF5}`xxiYB=9@NMTJj4b$Zl*f8b{wBREDm2qg&UhQI3h0AC98!$@=I%!`fW`3sIDDk?R^f6D z?ut}8tCDWZRNr{mKl&D(aH1}XKX%kGwnRz9M;O^?k)tSPqWSgSR7r>^-`m+J~ExpS>dFvTs5j~RT#R!Qfl1m}4ziPZD>%F%m6tkO-QlQh`#8#0S z@2Aeef7&P{(eGIGm7~-9e#r&M&QPEfNo-nFDMpkDUTZf(Q46RHbP3N(C1n5fszSlO zP@rCt%wboxSAITF(lQE9O#oBLrUi``bv~p0s8@`1A6ZX#+iyuoMULm#AKm3G1}^R< zb=75?LWQOgJpJVQVO2-I*UJuvt%qSI+y&bF^eL-rBlKj`Ohrn7ga~4;m8C2 z!LtMw-_^$ugJ=fMuCu{KrFe;1T53M>3Vr!5Z+(5679NJh_spnPD<+$WWLENdG-3q4 z5YJ7aeZY`bYAwF*p8G__%B>UeV=5_TeQIn&?Z~q_F}o*QbZ^U24$n;(TnDGLc*UyV zvmr|x(Nx|ZW{0m<9{y<~M9TB!Eb-X|0Hj!N^FH-5gpZgFSDgf>iNPlfRmpQnW9bwu z#>{HC`dBYvLf+B#7s09Vtf=_f%U}9%=(C@bCJ%cOSmW1m1uR8*3ru5GR*alOozr8i zmOm4%YCQrp%2LLszKMDTjbM(o&&b9>lKa2jV-#(!SIFC^uFFi%WPWbY$lDX$LFBk1vCUNVF0G*OL0~K#k_HkTdtmLZJ$*CIz8I>%uJj(=3 z-{iq#V7v4D(dDh52%{{53Y$9IuXjuMMSB0n3-m5#elj~2Vh4-NE=%vRmqQBLnoJAZ zP0DL2B}LXg#^5SM*Z`iy;dcAN;}+yUZG`rCrcJ8?@dUI`tj?RTKqrv!nMwrEmCf$t+Iq$51QrPYW=l?=r)gEX}^ca1I^I zC=B(pcAQo?2nL#WIXa5CWfhV_VC$!pRdSBB#yz`O(Cgrt@2XxNwuxdxiXw{f9iclS z5nyANUOf=mcuB<~4ElUEXF|CD(1s+R?FTp3}=SchxAAbiKT!^XMVhZyfRcx5ObD_JU(toRd8~A-zXH zx0KX`l7gr8qpoQ^OlpeoV;G$gx=R9m(86c{B)}8gymz-gH@1Dji!_=cp}meW zVp1t5Y%TpU?E?-2!xTuyrC;_i|E*o%7b7t_lB(=`OHZY3X$5=M9}-9=JCr?F;TYFU zQtxg5s{G-msk2k|+GY{8;U>9vvevXUzflr~|=R!Ym z1n6K#U#u>k1Z~wk4?dMxx-r9UYdq4BU|M?V*!4BNy&Sps#^uOY;%u%_@~@BlYcBsX zqJP{ycotiAhWL!9=Y;@nNESmBzzx~V+}96BXaP=2DI{-v02OLBD0znprFG#4P@$i! zwd4RAD_6Ie{-M3Z@m#&+rNZ-X@yIKS7xq*rN9J|;H?3x)57#IvF8HZ@92bB(ReU?p zS3z4Hi;v_lq@m;`u2l`a8}zP(h^0E%%3K@OX}{Ic<2>_JvFyZri&r;k0A`ujE>>_? zZj#*8n?d3s^@e$v+P{LF9s_7@f3m4rQ;X?{s|vg#HCdrijpZa}B9C~uv6LF>%GruD zg~fQnt5A%(ts+())Lo9`4n@7BHBp!H;_5HUI?`qb3{4EkgA~Yn2dA3@kIoFvd90+h z9ll6|%F0=D+Z7e*x5KtMnod7gA($kp_JD>11YoxfneH}1Y=Zr!HG<%})A6Wy^O#AaHVL{s(__VbXmkzIaxB|gE6;ebbFRJVjad+ zJ(Z%kQ{xut;tk>QG>;J>`h#ebJ$@mcxk0HyY0GY} z43a2QYb2D@&UlN8kUO5+2cwio%Z~-`WrCVrY@t9TAO%acWXpDbxN&<@P(l=!Ot|Ec z1N(EdLd%x4$oR`Lhl}kew#QENs)uSFBlhPA@lcx{htdgzR89-a#?LFlfKvSS&z#~v zRxMOuS}hN@ypW|C`HR~X8qkou8#;v_2Y#nRl&A5Sxig{V2fIQlc!DG5R_J z)IvRtVvu$1A=p^wQLn?|%BWX?|L{OFJ08id%Tq(ING-DMN@cJB&Z>ZnyJWuMm=FyJ zk)O$D*sIAaQd-m>gLfc3sjQbNAF6ysV=3F_ntmld804Acfp& z&}yVF9#yS$1{GRRR_^|VhB_r1KNGq!Fxi0X{+JIF#&I~idNye>n7UlKMB?4HC_gYD zO=m~YgUJvtrQ@WpReRb=h$*o=aJVuW7M&LjTZpH828NC_f%vbflfy^Y^*VA&0U7_3 z|GW|ZF~dLY3)`0Hdgx6KA1n6>))N|IENx-EMN7A2VYHB`a^zy-(>di!0U&9G!Y#^B zXC5&fZLr6#n0m-ES=h{ALha7>JoHh#m~nG;!&5`wuM8nFk1_WSIBWN10%xMN7z@a@ z%bXPn&_((;Ir2-wj<1|yShc$fPo*LZ&L#;Tg?%O(G^b}%bj=f*(VFu=W~JfsN?yhb z-AoAm{N?h@D$bAHFSG6qOT+aW!D(GWb+aORJP&CPqGjJ}y%0`?5)0^7d-l?IBUKUJ zoU|M(&bb`L`O95dr}a#WqPjBH_?Ue?N}=^PrAwLLa++(we0731JcT28f(sd#C9h@i zG@8R>=B7M17NqR{Q^&+Vo#8)D9*j9nLGM)$TN`=G`vaS77DIMuORDO;3imaPyd*yt zd>7sOLGeIBmW8sNEP~l67^3m=!bNp_=qtjoAKT1Q zD7s|VvC2*ZQ;s?KAlOcLIlO^jJa3g_c5RjdWp9^zn9@kP5a(6M0^4S|0~UVCb-B?e z(>_^-V~BBxMj&|n#j8$ARkuWjL_Q*Z2Eo@ljEgY^Z-=MDLe%ZmEte9hl*i@ZpGO3j zVfDr@hm|53wcYETY!=TQ$fzh#;&Zhz_|pXtHS0{3d-`v6_-{O@>U{+97`+)+ZTbB| z|PjINz?f!d4j|BZt<4H*^Spg*;GrT}ozlLd_c4*FL}SpiV%C;Io` zWGLUXs#9*q$k2wR8Zlx2i-gESHyNXT}KE^#8LVO(gdw| z7v#1*nw2s0D*{&srX24&e%z_q(rc?8p`3xaw<3%SuREz*X?lG*lTR`x%eHK6lm?f)Gqs)z|hUgSw8*wrtPLN zuLw_*pD?%no~Pi#Tf9;P6@R=?x4$Pg02S#Md@?4kdfuk_B&xwqnp&XrMWfqmwTMth z33&|{Vp6jxq<)Q_%ZEse{eY)#OD%H*s_B<|tQBg{x(f6c29e(E zx9Mbz9F_NcfXzaF8$>kqH!4++wH1u3;*k$YY_!*<@W3*dVQ$pD61tvZ8K;0JB|jaH zs~R3;DGT%chvI}+1(GHuBSVs^D$RYq_wfmO6PaDgMG;G1#fWNv%G#OJH~fKhr_{%N zAe63Xk~sp~9KR|X`$cMt?sa0pqSxOrT~2Y{TVJfOHhA1PJCPsVB-6KCRqLiNYdL8~ ztt&Dwf(uxZYAO}eKVgpk;nM^AO%XkHAxjZ8+DEwN9<602cncHgO3`pWp`eV}NL-8u zAn`pStcKR9<xiF;EXoH%8h0z+)fAcSLecxksR=J6VjcblaGOn^jNcYo|PL3uIv z>$*s{%%%+U(72#MJk!8A)?sHBLFQgJdIFH*1OZ%smR`l@pOhuQvT zqpsLB&q~C6kl!uLSF&Ax$2)m`R|&LDSglS)`94E9w`n9Y&Go8eHoZ?oeuqMqBIXBl z427g}8UyL^VY=iDnZ1%!zM6WQC9C}u=0#3eNQ<0s6_TAr*J}wqnLt}I8>&%<>oPPH z**s$MT;oKB-sv^GavD6Aa#LYf2sP+#_x^4eB+kWhO08r-|DgA94@2BDgTgIU?_=!X z`Z@#s(_4m*Gk0}aBWxzQ5|3YVx{0^}guS(MwJM+?RQ#A|lo-K}$-&_>EPI3zu)rQ% zE;ybXDw&<<+p9BCLUtsCis%{RW`r@;6Dko{8F4uxIP@fY>Wc;ePP8beh%k&&CHieQ zgN`)4woZ%dnziKOA4yhb-WBDT6mLOG+Md@*+Yq|VI)$Okqh+dxc9yj@8<#3w6+o37 zai(6gaA1Ih$-4UnFQsnJc8-xT!4_Gr7mhc}kIh1DTd%?W=qtqVp$_N`15&Vn=xNm3 zLRFzfXFRk$g7pTHyhxN>%{Wuv*QPMO~z-n51J>lSojz8Tk!(ObcYV!+G zu~;u;vf+uzeN?PgFxNoLyqNCJ#5FFY8lZ&K%))4M?ey@E!%UXa-n_WB=iB5|&`_rAPl6~3vYPF|R?<$B&W#{Vp%Sw>h zQ%u3n&^`01aURe;lK^9` z@Al$5#Wier_uBl)`?>0a{WD(&SV_q6#V5M&2M1XCpPR*xp3F{EoGgZ7wibR;3V0$! zCWOQE5Zw1D5=P-KzGJc-8B7s`ia^L!-Ca>~heo8e6dhZV{y;_-9e!VrI5m>n#9vl% z1onAibnT&n2}3Qoyz0np${+P`z2#jr`RdrZUo@xoSB$5dwy+L1 zR)h3ejaX#DIZTu+@?%`oCU-g1vSTVitFQ|4+*Z&Y=#9=(?807#fbl@MrT{*@jCJMd_7fE5J)KVL^c1bX`N@%yNbsdUeZKdYlu@U2}L(UWS(PQP!=w0+{x^$)YY>Y6zQ(@00#SN=(p5o9t z{t_=QzZ|qXK|-cvquSe?Na`R*%X?_d{2@f9X$*#bltR)*7EeF0>S>a&`(mUlq}O_q zzC~+Dwx!WD$VN8**b#r0KAwc)y=A(J@0AQqU>&m<*lo(7&l7iYSdEzpp{1Oox8@x! zEcyVfkdAFvn}6M7k?AZ%J~S!Y^O~WT5zHx74UaClI4MR{KkW5Fj5~DN)}mx`wK_eg zS05PlCAZ<8$hyzZ3o0b0;+33vXJRVT4Y*(9(6J57xyE(7I&TGAd3_S%cR3V3)Y8=J z_6v_#6N~Ic{u4XtzrF%Q<}g31ujU5soyCJY4&R~ifHz9mWFC8U94Pn2C1c{Vnat}N z)2Z1V*C`jdhXTO*c1FIqTi=ZL=fL`2x4j|-?d3zhwZebB*K*yH_KowY*wZf!&u;|* zwfC+0dyjRliolMQIiVi7t1%zQy6v8^RXCSj)S6b$`dNyHm+LdNhc5BUx9 z932YLpn!{nBA~;eLS*FrhHsrSr#2a?&gmc)*(m-n5gB{As>OgVxxN|Sxaf?22x~z> z&Apw3ey=LqT0@f$1Qtc5=1DvoEw+`+hM7H;GTq^Q`g%2cTsFwYO&v`SaUuj=P&P(; z0`2feghMt5%-jsQC0#;6yjA%ZrkY+fW})r33I^%);KU{#2bO2DwloB~5H$*PL6z7y zL5@@$IG(2}F~(6^s(qg_uP#N}zs2`ElRKfRkH!j;kUi0Y3|rdn^Ghcv(oVcZR;qsU z@og8g09c4Jz-xor4*K-B9p6h{Cb672`H05eLGPWBxX@Al)b~H>VEtcZ4n5AhHp`5W8o;`i*HqMCiC;(he0$$`4x zu68IEjgR)=bVQ9I20I&U;WW@|)KJ{8_<_KTAE(}+YK1h=zIB+GIRw?$iUwOW{tNfx|EgvDm%EyzCid#+R_wP!qvIuTXw1!Qo=mx@A=+uuSu=Xxun}0PWF>iX zqxJO)SGH}mgse|wM3c=Noakz_80v*SiR}4OM8`YTEG~d)3xjB6zt63S0H=Bw(yvF>+4+EC*8x1i&T;vA+!$dZ7fpStvnP`R$^o#sgcpkk8T48@$1gbkV#beZ6(z(a_svC zMv??viHS8%fZ*|Gj{2q^uOr{ALsReqIIUmqgmJ(WjuR!EEeNy)-y_BH{c{i2f4Kw= zFJ98r2o#RkQ~GdT3oP{&>Qe|Ew*RcywkkXAHya$57v_UVA4sD=Bzis#1Dg|O&%Xs5kaIqv)Lt<9iAIxL3O8w+ zg4!2Ejg(RtwvBO}`F&Mkm2yf!jh+4- zVm_Aq!ry+!#SXc9{2ic8D)em3Kia`Dii6Vw94*jY=T^QJ;H9qnd;d}KRbRQtI=;ba z#rIu(-Ps4AWGjC24*|H|+M>+oX zO*i}F=vV3m@-MJB3FeGlyw%f_tq1+mdyV5M@i`7~waks+c~NanZ>9GB@a@omn%j-I z_LTHES3B$Q*)Sp`_L;XXv`sAem|S

yLMbVoP@e_~h~eNu-ykkQbG(XPfM<+i%=) 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∓TTg4c{vxr-8eu!`{|did@fYGwS`?t=s1l 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 piN=+Tg9Y?&-O;Zt Date: Thu, 25 Jan 2024 10:21:39 -0800 Subject: [PATCH 03/63] Draft commit. --- computingservices/DocumentServices/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 computingservices/DocumentServices/.gitignore diff --git a/computingservices/DocumentServices/.gitignore b/computingservices/DocumentServices/.gitignore new file mode 100644 index 000000000..0fd8a721b --- /dev/null +++ b/computingservices/DocumentServices/.gitignore @@ -0,0 +1,2 @@ +__pycache__/* +*.pyc \ No newline at end of file From 3bfca966162966d9e055a819f18131a51d958853 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 25 Jan 2024 12:00:37 -0800 Subject: [PATCH 04/63] Draft commit. --- .../documentserviceproducerservice.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 api/reviewer_api/services/external/documentserviceproducerservice.py diff --git a/api/reviewer_api/services/external/documentserviceproducerservice.py b/api/reviewer_api/services/external/documentserviceproducerservice.py new file mode 100644 index 000000000..7611c5d35 --- /dev/null +++ b/api/reviewer_api/services/external/documentserviceproducerservice.py @@ -0,0 +1,27 @@ +import os +from walrus import Database +from reviewer_api.models.default_method_result import DefaultMethodResult +import logging +from os import getenv + +class documentserviceproducerservice: + """This class is reserved for integration with event queue (currently redis streams).""" + + host = os.getenv("DOCUMENTSERVICE_REDIS_HOST") + port = os.getenv("DOCUMENTSERVICE_REDIS_PORT") + password = os.getenv("DOCUMENTSERVICE_REDIS_PASSWORD") + + db = Database(host=host, port=port, db=0, password=password) + + def add(self, payload): + try: + stream = self.db.Stream(self.__streamkey()) + msgid = stream.add(payload, id="*") + return DefaultMethodResult(True, "Added to stream", msgid.decode("utf-8")) + except Exception as err: + logging.error("Error in contacting Redis Stream") + logging.error(err) + return DefaultMethodResult(False, err, -1) + + def __streamkey(self): + return getenv("DOCUMENTSERVICE_STREAM_KEY") From b3b9cdb98b3d8940930a5a6236cf72a80c700b16 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Wed, 31 Jan 2024 09:17:38 -0800 Subject: [PATCH 05/63] redaction summary changes --- .../resources/foiflowmasterdata.py | 2 +- api/reviewer_api/schemas/redline.py | 4 +- api/reviewer_api/services/radactionservice.py | 4 +- .../message/schemas/redactionsummary.py | 8 +- .../services/dal/documentpageflag.py | 129 ++++++++++++++++++ .../services/dts/redactionsummary.py | 101 ++++++++++++++ .../services/redactionsummaryservice.py | 8 ++ web/src/components/FOI/Home/Redlining.js | 29 +++- 8 files changed, 270 insertions(+), 15 deletions(-) create mode 100644 computingservices/DocumentServices/services/dal/documentpageflag.py create mode 100644 computingservices/DocumentServices/services/dts/redactionsummary.py diff --git a/api/reviewer_api/resources/foiflowmasterdata.py b/api/reviewer_api/resources/foiflowmasterdata.py index 2b553984e..9038a6874 100644 --- a/api/reviewer_api/resources/foiflowmasterdata.py +++ b/api/reviewer_api/resources/foiflowmasterdata.py @@ -272,7 +272,7 @@ def post(ministryrequestid, redactionlayer="redline", layertype="redline"): ) singlepkgpath = s3path_save data["s3path_save"] = s3path_save - + if is_single_redline_package(_bcgovcode, packagetype): for div in data["divdocumentList"]: if len(div["documentlist"]) > 0: diff --git a/api/reviewer_api/schemas/redline.py b/api/reviewer_api/schemas/redline.py index b92504f7f..0afc888cf 100644 --- a/api/reviewer_api/schemas/redline.py +++ b/api/reviewer_api/schemas/redline.py @@ -19,4 +19,6 @@ class RedlineSchema(Schema): bcgovcode = fields.Str(data_key="bcgovcode", allow_none=False) attributes = fields.Nested( AttributeSchema, many=True, required=True, allow_none=False - ) \ No newline at end of file + ) + summarydocuments = fields.List(fields.Int()) + redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) \ No newline at end of file diff --git a/api/reviewer_api/services/radactionservice.py b/api/reviewer_api/services/radactionservice.py index 14ec6a434..e7bb6ea61 100644 --- a/api/reviewer_api/services/radactionservice.py +++ b/api/reviewer_api/services/radactionservice.py @@ -12,7 +12,7 @@ from reviewer_api.utils.util import to_json from datetime import datetime - +import json class redactionservice: """FOI Document management service""" @@ -212,6 +212,8 @@ def __preparemessageforsummaryservice(self, messageschema, userinfo, job): ), "finaloutput": to_json({}), "attributes": to_json(messageschema["attributes"]), + "summarydocuments": json.dumps(messageschema["summarydocuments"]), + "redactionlayerid": json.dumps(messageschema["redactionlayerid"]) } return _message diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py index 85a3e7e74..c30769571 100644 --- a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py +++ b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py @@ -20,15 +20,11 @@ class RedactionSummaryIncomingSchema(Schema): filestozip = fields.Str(data_key="filestozip",allow_none=False) finaloutput = fields.Str(data_key="finaloutput",allow_none=False) attributes = fields.Str(data_key="attributes",allow_none=False) + summarydocuments = fields.Str(data_key="summarydocuments",allow_none=False) + redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) def get_in_redactionsummary_msg(producer_json): - print("inside get_in_redactionsummary_msg") - print(producer_json) - print('----------------1--------------') - print(__formatmsg(producer_json)) - print('----------------2--------------') messageobject = RedactionSummaryIncomingSchema().load(__formatmsg(producer_json)) - print(messageobject) return dict2obj(messageobject) def getzipperproducermessage(producer_json): diff --git a/computingservices/DocumentServices/services/dal/documentpageflag.py b/computingservices/DocumentServices/services/dal/documentpageflag.py new file mode 100644 index 000000000..2ec3433a8 --- /dev/null +++ b/computingservices/DocumentServices/services/dal/documentpageflag.py @@ -0,0 +1,129 @@ +from utils import getdbconnection +import logging +import json + +class documentpageflag: + + @classmethod + def get_all_pageflags(cls): + conn = getdbconnection() + pageflags = [] + try: + cursor = conn.cursor() + cursor.execute( + """select pageflagid, name, description from "Pageflags" + where isactive = true order by sortorder + """ + ) + + result = cursor.fetchall() + cursor.close() + if result is not None: + for entry in result: + pageflags.append({"pageflagid": entry[0], "name": entry[1], "description": entry[2]}) + return pageflags + return None + + except Exception as error: + logging.error("Error in getting page flags") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() + + + @classmethod + def get_documentpageflag(cls, ministryrequestid, redactionlayerid, documentids): + conn = getdbconnection() + documentpageflags = {} + try: + cursor = conn.cursor() + cursor.execute( + """select documentid, documentversion, pageflag, attributes + from "DocumentPageflags" dp where + foiministryrequestid = %s::integer and redactionlayerid = %s::integer and documentid in %s + order by documentid ;""", + (ministryrequestid, redactionlayerid, tuple(documentids)), + ) + + result = cursor.fetchall() + cursor.close() + if result is not None: + for entry in result: + documentpageflags[entry[0]] = {"pageflag": entry[2], "attributes": entry[3]} + return documentpageflags + return None + + except Exception as error: + logging.error("Error in getting document page flags") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() + + @classmethod + def getpagecount_by_documentid(cls, ministryrequestid, documentids): + conn = getdbconnection() + docpgs = {} + try: + cursor = conn.cursor() + cursor.execute( + """select documentid, pagecount from "Documents" d + where foiministryrequestid = %s::integer + and documentid in %s;""", + (ministryrequestid, tuple(documentids)), + ) + + result = cursor.fetchall() + cursor.close() + if result is not None: + for entry in result: + docpgs[entry[0]] = {"pagecount": entry[1]} + return docpgs + return None + + except Exception as error: + logging.error("Error in getting pagecount for requestid") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() + + @classmethod + def getsections_by_documentid_pageno(cls, ministryrequestid, redactionlayerid, documentid, pagenos): + conn = getdbconnection() + sections = [] + try: + cursor = conn.cursor() + cursor.execute( + """select a.pagenumber, as2."section" from "AnnotationSections" as2, + "Annotations" a + where as2.foiministryrequestid = %s::integer + and as2.isactive = true + and as2.annotationname = a.annotationname + and as2.redactionlayerid = a.redactionlayerid + and a.redactionlayerid = %s::integer + and a.documentid = %s::integer + and a.pagenumber in %s + order by a.pagenumber;""", + (ministryrequestid, redactionlayerid, documentid, tuple(pagenos)), + ) + + result = cursor.fetchall() + cursor.close() + if result is not None: + for entry in result: + sections.append({"pageno": entry[0], "section": entry[1]}) + return sections + return None + + except Exception as error: + logging.error("Error in getting sections for requestid") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py new file mode 100644 index 000000000..162aa3e8a --- /dev/null +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -0,0 +1,101 @@ +from services.dal.documentpageflag import documentpageflag +import json + +class redactionsummary(): + + def prepareredactionsummary(self, message): + try: + documentids = json.loads(message.summarydocuments) + redactionlayerid = message.redactionlayerid + docpagedata = documentpageflag().getpagecount_by_documentid(message.ministryrequestid, documentids) + totalpagecount = self.__calculate_totalpages(docpagedata) + #Get all page flags + if totalpagecount <=0: + return + pageflags = documentpageflag().get_all_pageflags() + # Get document page flags + + docpageflags = documentpageflag().get_documentpageflag(message.ministryrequestid, redactionlayerid, documentids) + summarydata = [] + for pageflag in pageflags: + pagecount = 0 + pageredactions = [] + _data = {} + _data["flagname"] = pageflag["description"].upper() + for docid in documentids: + docpageflag = docpageflags[docid] + filteredpages = self.__get_pages_by_flagid(docpageflag["pageflag"], pagecount, pageflag["pageflagid"]) + if len(filteredpages) > 0: + orginalpagenos = [pg['orginalpageno']for pg in filteredpages] + docpagesections = documentpageflag().getsections_by_documentid_pageno(message.ministryrequestid, redactionlayerid, docid, orginalpagenos) + pageredactions.extend(self.__get_pagesection_mapping(filteredpages, docpagesections)) + pagecount = pagecount+docpagedata[docid]["pagecount"] + if len(pageredactions) >0: + _data["pagecount"] = len(pageredactions) + _data["sections"] = self.__format_redaction_summary(pageflag["description"], pageredactions) + summarydata.append(_data) + print(summarydata) + except (Exception) as error: + print('error occured in redaction summary service: ', error) + + def __format_redaction_summary(self, pageflag, pageredactions): + totalpages = len(pageredactions) + _sortedpageumbers = sorted(pageredactions, key=lambda x: x["stitchedpageno"]) + #prepare ranges: Begin + formatted = [] + range_start = 0 + range_end = 0 + range_sections = [] + for pgindex, pgentry in enumerate(_sortedpageumbers): + currentpg = _sortedpageumbers[pgindex] + nextindex = pgindex+1 if pgindex < totalpages-1 else pgindex + nextpg = _sortedpageumbers[nextindex] + range_sections = currentpg["sections"] if range_start == 0 else range_sections + range_start = currentpg["stitchedpageno"] if range_start == 0 else range_start + if currentpg["stitchedpageno"]+1 == nextpg["stitchedpageno"]: + range_sections.extend(nextpg["sections"]) + range_end = nextpg["stitchedpageno"] + else: + rangepg = range_start if range_end == 0 else str(range_start)+"-"+str(range_end) + formatted.append({"range": rangepg, "section": self.__formatsections(pageflag, range_sections)}) + range_start = 0 + range_end = 0 + range_sections = [] + #prepare ranges: End + return formatted + + def __formatsections(self, pageflag, sections): + if pageflag in ("Duplicate", "Not Responsive"): + return pageflag + distinct_sections = list(set(sections)) + return pageflag+" under "+",".join(distinct_sections) + + + + def __get_pagesection_mapping(self, docpages, docpagesections): + for entry in docpages: + entry["sections"] = self.__get_sections(docpagesections, entry['orginalpageno']) + return docpages + + def __get_sections(self, docpagesections, pageno): + sections = [] + filtered = [x for x in docpagesections if x['pageno'] == pageno] + for dta in filtered: + _section = json.loads(dta['section']) + for sec in _section['ids']: + sections.append(sec["section"]) + return sections + + def __get_pages_by_flagid(self, _docpageflags, totalpages, flagid): + pagenos = [] + for x in _docpageflags: + if x["flagid"] == flagid: + pagenos.append({'orginalpageno':x["page"]-1, 'stitchedpageno':x["page"]+totalpages}) + return pagenos + + def __calculate_totalpages(self, data): + totalpages = 0 + for entry in data: + totalpages=totalpages+data[entry]['pagecount'] + return totalpages + diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 707d0d3b8..b832b90a5 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -2,11 +2,19 @@ import traceback import json from services.dal.pdfstitchjobactivity import pdfstitchjobactivity +from services.dts.redactionsummary import redactionsummary class redactionsummaryservice(): def processmessage(self,message): try: pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") + #Get Data ; Begin + formattedsummary = redactionsummary().prepareredactionsummary(message) + #Get Data : End + #Get Template + #Document + #Upload to S3 + #Invoke ZIP print(message) except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index 96caa344e..d684917a0 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -2073,9 +2073,12 @@ const Redlining = React.forwardRef( const zipDocObj = { divisionid: null, divisionname: null, - files: [], + files: [], }; if (stitchedDocPath) { + console.log(redlineStitchInfo); + console.log(redlineStitchInfo["documentids"]); + const stitchedDocPathArray = stitchedDocPath?.split("/"); let fileName = stitchedDocPathArray[stitchedDocPathArray.length - 1].split("?")[0]; @@ -2098,12 +2101,18 @@ const Redlining = React.forwardRef( zipDocObj.divisionname = divObj["divisionname"]; } zipServiceMessage.attributes.push(zipDocObj); + console.log(redlineStitchInfo); + console.log(redlineStitchInfo[divObj["divisionid"]]); + console.log(redlineStitchInfo[divObj["divisionid"]]["documentids"]); + zipServiceMessage.summarydocuments = redlineStitchInfo[divObj["divisionid"]]["documentids"]; if (divisionCountForToast === zipServiceMessage.attributes.length) { + console.log(zipServiceMessage); triggerDownloadRedlines(zipServiceMessage, (error) => { console.log(error); - window.location.reload(); + //window.location.reload(); }); } + console.log(zipServiceMessage) return zipServiceMessage; }; @@ -2748,6 +2757,8 @@ const Redlining = React.forwardRef( attributes: [], requestnumber: res.requestnumber, bcgovcode: res.bcgovcode, + summarydocuments: [], + redactionlayerid: currentLayer.redactionlayerid }); let stitchDocuments = {}; let documentsObjArr = []; @@ -2844,7 +2855,7 @@ const Redlining = React.forwardRef( divisionDocuments, stitchDocuments, res.issingleredlinepackage, - incompatableList + IncompatableList ); } }, @@ -3108,7 +3119,12 @@ const Redlining = React.forwardRef( let divisionid = key; let stitchObject = redlineStitchObject[key]; + console.log('-----------------------'); + console.log(key); + console.log(redlineStitchObject[key]); + console.log('-----------------------') if (stitchObject == null) { + console.log('if') triggerRedlineZipper( redlineIncompatabileMappings[divisionid], redlineStitchInfo[divisionid]["s3path"], @@ -3116,7 +3132,8 @@ const Redlining = React.forwardRef( redlineSinglePackage ); } else { - let formattedAnnotationXML = formatAnnotationsForRedline( + console.log('else'); + let formattedAnnotationXML = formatAnnotationsForRedline( redlineDocumentAnnotations, redlinepageMappings["divpagemappings"][divisionid], redlineStitchInfo[divisionid]["documentids"] @@ -3300,7 +3317,7 @@ const Redlining = React.forwardRef( }); }; - const triggerRedlineZipper = ( + const triggerRedlineZipper = ( divObj, stitchedDocPath, divisionCountForToast, @@ -3451,7 +3468,7 @@ const Redlining = React.forwardRef( zipServiceMessage ); setTimeout(() => { - window.location.reload(true); + //window.location.reload(true); }, 3000); }, (_err) => { From 9563781a5aef75bd574b54d157f9245431c89c2a Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Wed, 31 Jan 2024 09:31:19 -0800 Subject: [PATCH 06/63] redaction summary changes --- .../services/dts/redactionsummary.py | 2 +- .../services/redactionsummaryservice.py | 1 + web/src/components/FOI/Home/Redlining.js | 18 ++---------------- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 162aa3e8a..5f452154b 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -34,7 +34,7 @@ def prepareredactionsummary(self, message): _data["pagecount"] = len(pageredactions) _data["sections"] = self.__format_redaction_summary(pageflag["description"], pageredactions) summarydata.append(_data) - print(summarydata) + return {"requestnumber": message.requestnumber, "data": summarydata} except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index b832b90a5..d9f895086 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -16,6 +16,7 @@ def processmessage(self,message): #Upload to S3 #Invoke ZIP print(message) + print(formattedsummary) except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index d684917a0..f322fa9e8 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -2076,9 +2076,6 @@ const Redlining = React.forwardRef( files: [], }; if (stitchedDocPath) { - console.log(redlineStitchInfo); - console.log(redlineStitchInfo["documentids"]); - const stitchedDocPathArray = stitchedDocPath?.split("/"); let fileName = stitchedDocPathArray[stitchedDocPathArray.length - 1].split("?")[0]; @@ -2101,18 +2098,13 @@ const Redlining = React.forwardRef( zipDocObj.divisionname = divObj["divisionname"]; } zipServiceMessage.attributes.push(zipDocObj); - console.log(redlineStitchInfo); - console.log(redlineStitchInfo[divObj["divisionid"]]); - console.log(redlineStitchInfo[divObj["divisionid"]]["documentids"]); zipServiceMessage.summarydocuments = redlineStitchInfo[divObj["divisionid"]]["documentids"]; if (divisionCountForToast === zipServiceMessage.attributes.length) { - console.log(zipServiceMessage); triggerDownloadRedlines(zipServiceMessage, (error) => { console.log(error); - //window.location.reload(); + window.location.reload(); }); } - console.log(zipServiceMessage) return zipServiceMessage; }; @@ -3119,12 +3111,7 @@ const Redlining = React.forwardRef( let divisionid = key; let stitchObject = redlineStitchObject[key]; - console.log('-----------------------'); - console.log(key); - console.log(redlineStitchObject[key]); - console.log('-----------------------') if (stitchObject == null) { - console.log('if') triggerRedlineZipper( redlineIncompatabileMappings[divisionid], redlineStitchInfo[divisionid]["s3path"], @@ -3132,7 +3119,6 @@ const Redlining = React.forwardRef( redlineSinglePackage ); } else { - console.log('else'); let formattedAnnotationXML = formatAnnotationsForRedline( redlineDocumentAnnotations, redlinepageMappings["divpagemappings"][divisionid], @@ -3468,7 +3454,7 @@ const Redlining = React.forwardRef( zipServiceMessage ); setTimeout(() => { - //window.location.reload(true); + window.location.reload(true); }, 3000); }, (_err) => { From 7fb9716520ac4fa31495f6dd4713434a5a1d3534 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Wed, 31 Jan 2024 10:45:41 -0800 Subject: [PATCH 07/63] redaction summary changes --- .../DocumentServices/services/dts/redactionsummary.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 5f452154b..824827c42 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -56,7 +56,7 @@ def __format_redaction_summary(self, pageflag, pageredactions): range_sections.extend(nextpg["sections"]) range_end = nextpg["stitchedpageno"] else: - rangepg = range_start if range_end == 0 else str(range_start)+"-"+str(range_end) + rangepg = range_start if range_end == 0 else str(range_start)+" - "+str(range_end) formatted.append({"range": rangepg, "section": self.__formatsections(pageflag, range_sections)}) range_start = 0 range_end = 0 @@ -68,7 +68,7 @@ def __formatsections(self, pageflag, sections): if pageflag in ("Duplicate", "Not Responsive"): return pageflag distinct_sections = list(set(sections)) - return pageflag+" under "+",".join(distinct_sections) + return pageflag+" under "+", ".join(distinct_sections) From 2da9350db66d7ab2ccd91c1371abd8afa07649d7 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 31 Jan 2024 13:09:55 -0800 Subject: [PATCH 08/63] Integration with microservice --- .../services/cdogsapiservice.py | 123 ++++++++++++++++++ .../services/documentgenerationservice.py | 59 +++++++++ .../services/redactionsummaryservice.py | 57 ++++++++ .../services/s3documentservice.py | 108 +++++++++++++++ .../templates/redline_redaction_summary.docx | Bin 0 -> 43669 bytes .../responsepackage_redaction_summary.docx | Bin 0 -> 43335 bytes .../utils/foidocumentserviceconfig.py | 2 + .../utils/jsonmessageparser.py | 7 + 8 files changed, 356 insertions(+) create mode 100644 computingservices/DocumentServices/services/cdogsapiservice.py create mode 100644 computingservices/DocumentServices/services/documentgenerationservice.py create mode 100644 computingservices/DocumentServices/services/s3documentservice.py create mode 100644 computingservices/DocumentServices/templates/redline_redaction_summary.docx create mode 100644 computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx create mode 100644 computingservices/DocumentServices/utils/jsonmessageparser.py diff --git a/computingservices/DocumentServices/services/cdogsapiservice.py b/computingservices/DocumentServices/services/cdogsapiservice.py new file mode 100644 index 000000000..dc13486e8 --- /dev/null +++ b/computingservices/DocumentServices/services/cdogsapiservice.py @@ -0,0 +1,123 @@ +"""Service for pdf generation.""" +import base64 +import json +import os +import re + +import requests +#from reviewer_api.exceptions import BusinessException, Error + + +class cdogsapiservice: + """cdogs api Service class.""" + + # def __init__(self): + # self.access_token = self._get_access_token() + + def demomethod(self): + print("demomethod!!!") + + def generate_pdf(self, template_hash_code, data, access_token): + #access_token= self._get_access_token() + print('\n\ntemplate_hash_code:',template_hash_code) + request_body = { + "options": { + "cachereport": False, + "convertTo": "pdf", + "overwrite": True, + "reportName": "Summary" + }, + "data": data + } + json_request_body = json.dumps(request_body) + print("\njson_request_body:",json_request_body) + headers = { + 'Content-Type': 'application/json', + 'Authorization': f'Bearer {access_token}' + } + #url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}/render" + url = f"https://cdogs-dev.api.gov.bc.ca/api/v2/template/{template_hash_code}/render" + return self._post_generate_pdf(json_request_body, headers, url) + + def _post_generate_pdf(self, json_request_body, headers, url): + return requests.post(url, data= json_request_body, headers= headers) + + def upload_template(self, receipt_template_path, access_token): + print('\nreceipt_template_path:',receipt_template_path) + #access_token= self._get_access_token() + file_dir = os.path.dirname(os.path.realpath('__file__')) + #print("file_dir:",file_dir) + template_file_path = os.path.join(file_dir, receipt_template_path) + #print("template_file_path:",template_file_path) + headers = { + "Authorization": f'Bearer {access_token}' + } + + #url = f"{current_app.config['CDOGS_BASE_URL']}/api/v2/template" + url = "https://cdogs-dev.api.gov.bc.ca/api/v2/template" + + if os.path.exists(receipt_template_path): + print("@@@Exists!!") + template = {'template':('template', open(receipt_template_path, 'rb'), "multipart/form-data")} + print("\n\n1)url:",url) + print('\n\n2)Uploading template %s', template) + print("\n\n3)headers:",headers) + response = self._post_upload_template(headers, url, template) + print("\n\nRESPONSE from UPLOAD ->",response) + if response.status_code == 200: + # if response.headers.get("X-Template-Hash") is None: + # raise BusinessException(Error.DATA_NOT_FOUND) + + print('Returning new hash %s', response.headers['X-Template-Hash']) + return response.headers['X-Template-Hash']; + + response_json = json.loads(response.content) + + if response.status_code == 405 and response_json['detail'] is not None: + match = re.findall(r"Hash '(.*?)'", response_json['detail']); + if match: + print('Template already hashed with code %s', match[0]) + print('Template already hashed with code %s', match[0]) + return match[0] + + #raise BusinessException(Error.DATA_NOT_FOUND) + + def _post_upload_template(self, headers, url, template): + response = requests.post(url, headers= headers, files= template) + return response + + def check_template_cached(self, template_hash_code, access_token): + + headers = { + "Authorization": f'Bearer {access_token}' + } + + #url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}" + url = f"https://cdogs-dev.api.gov.bc.ca/api/v2/template/{template_hash_code}" + + response = requests.get(url, headers= headers) + return response.status_code == 200 + + + def _get_access_token(self): + print("\n\n*********") + #print("\n\nCDOGS_TOKEN_URL:",os.getenv['CDOGS_TOKEN_URL']) + token_url = "https://dev.loginproxy.gov.bc.ca/auth/realms/comsvcauth/protocol/openid-connect/token" #os.getenv['CDOGS_TOKEN_URL'] + service_client = "906B4222-00D7D1A3339" #os.getenv['CDOGS_SERVICE_CLIENT'] + service_client_secret = "c7c94a59-bed6-4fc3-85ed-acc43161753e" #os.getenv['CDOGS_SERVICE_CLIENT_SECRET'] + print("token_url:",token_url) + basic_auth_encoded = base64.b64encode( + bytes(service_client + ':' + service_client_secret, 'utf-8')).decode('utf-8') + data = 'grant_type=client_credentials' + print("basic_auth_encoded:",basic_auth_encoded) + response = requests.post( + token_url, + data=data, + headers={ + 'Authorization': f'Basic {basic_auth_encoded}', + 'Content-Type': 'application/x-www-form-urlencoded' + } + ) + + response_json = response.json() + return response_json['access_token'] \ No newline at end of file diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py new file mode 100644 index 000000000..6ee591a25 --- /dev/null +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -0,0 +1,59 @@ +#from reviewer_api.services.cdogs_api_service import cdogsapiservice +from .cdogsapiservice import cdogsapiservice +import json +import logging +from aws_requests_auth.aws_auth import AWSRequestsAuth +import os +import boto3 +from botocore.exceptions import ClientError +from botocore.config import Config +import requests +import mimetypes + + + +s3host = os.getenv("OSS_S3_HOST") +s3region = os.getenv("OSS_S3_REGION") + +class documentgenerationservice: + """document generation Service class.""" + + # def __init__(self,documenttypename='redaction_summary'): + # self.cdgos_api_service = cdogsapiservice() + # self.documenttypename = documenttypename + # receipt_document_type : DocumentType = DocumentType.get_document_type_by_name(self.documenttypename) + # if receipt_document_type is None: + # raise BusinessException(Error.DATA_NOT_FOUND) + + # self.receipt_template : DocumentTemplate = DocumentTemplate \ + # .get_template_by_type(document_type_id = receipt_document_type.document_type_id) + # if self.receipt_template is None: + # raise BusinessException(Error.DATA_NOT_FOUND) + + + def generate_pdf(self, receipt_template, data, receipt_template_path='reviewer_api/templates/redline_redaction_summary.docx'): + access_token= cdogsapiservice()._get_access_token() + template_cached = False + print("\nreceipt_template:",receipt_template) + if receipt_template["cdogs_hash_code"]: + print('Checking if template %s is cached', receipt_template["cdogs_hash_code"]) + template_cached = cdogsapiservice().check_template_cached(receipt_template["cdogs_hash_code"], access_token) + + if receipt_template["cdogs_hash_code"] is None or not template_cached: + receipt_template["cdogs_hash_code"] = cdogsapiservice().upload_template(receipt_template_path, access_token) + print('Uploading new template--->',receipt_template) + # receipt_template.flush() + # receipt_template.commit() + print('Generating redaction summary') + return cdogsapiservice().generate_pdf(receipt_template["cdogs_hash_code"], data,access_token) + + # def upload_receipt(self, filename, filebytes, ministryrequestid, ministrycode, filenumber): + # try: + # logging.info("Upload summary for ministry request id"+ str(ministryrequestid)) + # _response = self.__uploadbytes(filename, filebytes, ministrycode, filenumber) + # logging.info("Upload status for payload"+ json.dumps(_response)) + # if _response["success"] == True: + # _documentschema = {"documents": [{"filename": _response["filename"], "documentpath": _response["documentpath"]}]} + # return _response + # except Exception as ex: + # logging.exception(ex) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index d9f895086..4baf46a7e 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -3,10 +3,14 @@ import json from services.dal.pdfstitchjobactivity import pdfstitchjobactivity from services.dts.redactionsummary import redactionsummary +from .documentgenerationservice import documentgenerationservice +from .s3documentservice import uploadbytes + class redactionsummaryservice(): def processmessage(self,message): try: + print("\n\nBEFORE CALL TO pdfstitchjobactivity!!") pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") #Get Data ; Begin formattedsummary = redactionsummary().prepareredactionsummary(message) @@ -17,6 +21,59 @@ def processmessage(self,message): #Invoke ZIP print(message) print(formattedsummary) + print("\n\nmessage:",message) + #Get Data + #Get Template + receipt_template={ + "extension":"docx", + "cdogs_hash_code":"58G94G" + } + # pdfgenerationdata={ + # "requestid":"ABC-123-545", + # "data":[{ + # "flagname":"DISCLOSED IN FULL", + # "pagecount": 20, + # "sections": [{"range":"1 - 2", "section":"disclosed in full"},{"range":"3", "section":"disclosed in full"}, {"range":"5 - 19", "section":"disclosed in full"}] + # }, + # { + # "flagname":"DISCLOSED IN PART", + # "pagecount": 5, + # "sections": [{"range":"4", "section":"partial disclosure under S.1"}, + # {"range":"13 - 16", "section":"partial disclosure under S.4"}] + # }, + # { + # "flagname":"WITHHELD IN FULL", + # "pagecount": 2, + # "sections": [{"range":"17 - 18", "section":"withheld in full under S.18"}] + # } + # ]} + pdfgenerationdata={'requestnumber': 'EDU-20240125-1', + 'data': [{'flagname': 'PARTIAL DISCLOSURE', 'pagecount': 4, + 'sections': [{'range': 1, 'section': 'Partial Disclosure under s. 15'}, {'range': '5-7','section': 'Partial Disclosure under s. 15,s. 16,s. 13,s. 17,s. 12'}]}, {'flagname': 'WITHHELD IN FULL', 'pagecount': 1, + 'sections': [{'range': 3, 'section': 'Withheld in Full under s. 15,s. 13,s. 12'}]}, {'flagname': 'DUPLICATE', 'pagecount': 2, + 'sections': [{'range': 2, 'section': 'Duplicate'}, {'range': 4, 'section': 'Duplicate'}]}]} + print("\nBefore calling generate_pdf:", json.dumps(message.attributes) ) + receipt_template_path= r'templates/redline_redaction_summary.docx' + redline_redaction_summary= documentgenerationservice().generate_pdf(receipt_template,pdfgenerationdata,receipt_template_path) + print("Finished generate_pdf!!") + #Method for calling the pdf generation method ends + #Document + #Upload to S3 starts + messagejson=json.loads(message.attributes) + s3uri = messagejson[0]['files'][0]['s3uripath'] + # Find the last occurrence of '/' + last_slash_index = s3uri.rfind('/') + # Remove the filename and everything after it + s3uri = s3uri[:last_slash_index + 1] + divisionname = messagejson[0]['divisionname'] + category = "redline" #get it from message + requestnumber=pdfgenerationdata["requestnumber"] + filename = f"{requestnumber} - {category} - {divisionname} - summary" + #filename = "Summary.pdf" + print("\nBefore calling uploadbytes", s3uri ) + uploadbytes(filename,redline_redaction_summary.content, s3uri) + #Upload to S3 ends + #Invoke ZIP except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/computingservices/DocumentServices/services/s3documentservice.py b/computingservices/DocumentServices/services/s3documentservice.py new file mode 100644 index 000000000..9d68ba517 --- /dev/null +++ b/computingservices/DocumentServices/services/s3documentservice.py @@ -0,0 +1,108 @@ +from utils.dbconnection import getdbconnection +from psycopg2 import sql +from os import path +import psycopg2 +import requests +from aws_requests_auth.aws_auth import AWSRequestsAuth +from utils.jsonmessageparser import gets3credentialsobject +from utils.foidocumentserviceconfig import docservice_db_user,docservice_db_port,docservice_s3_host,docservice_db_name,docservice_s3_region,docservice_s3_service,docservice_failureattempt +import logging + +def getcredentialsbybucketname(bucketname): + _conn = getdbconnection() + s3cred = None + #bucket = '{0}-{1}-e'.format(bcgovcode.lower(),pdfstitch_s3_env.lower()) + try: + cur = _conn.cursor() + _sql = sql.SQL("SELECT attributes FROM {0} WHERE bucket='{1}'and category='Records'".format('public."DocumentPathMapper"',bucketname)) + cur.execute(_sql) + attributes = cur.fetchone() + if attributes is not None: + s3cred = gets3credentialsobject(str(attributes[0])) + cur.close() + except (Exception, psycopg2.DatabaseError) as error: + logging.error(error) + finally: + if _conn is not None: + _conn.close() + + return s3cred + + +# def gets3documentbytearray(producermessage, s3credentials): +# retry = 0 +# filepath = producermessage.s3uripath +# while True: +# try: +# s3_access_key_id= s3credentials.s3accesskey +# s3_secret_access_key= s3credentials.s3secretkey + +# auth = AWSRequestsAuth(aws_access_key=s3_access_key_id, +# aws_secret_access_key=s3_secret_access_key, +# aws_host=pdfstitch_s3_host, +# aws_region=pdfstitch_s3_region, +# aws_service=pdfstitch_s3_service) +# response= requests.get(filepath, auth=auth,stream=True) +# return response.content +# except Exception as ex: +# if retry > int(pdfstitch_failureattempt): +# logging.error("Error in connecting S3.") +# logging.error(ex) +# raise +# retry += 1 +# continue + + +def uploadbytes(filename, filebytes, s3uri): + bucketname= s3uri.split("/")[3] + print("\n**bucketname:",bucketname) + s3credentials= getcredentialsbybucketname(bucketname) + s3_access_key_id= s3credentials.s3accesskey + s3_secret_access_key= s3credentials.s3secretkey + print("\n\ns3_secret_access_key:",s3_secret_access_key) + #formsbucket = bcgovcode.lower()+'-'+pdfstitch_s3_env.lower()+'-e' + retry = 0 + while True: + try: + auth = AWSRequestsAuth(aws_access_key=s3_access_key_id, + aws_secret_access_key=s3_secret_access_key, + aws_host=docservice_s3_host, + aws_region=docservice_s3_region, + aws_service=docservice_s3_service) + print("\n*****s3_access_key_id:",s3_access_key_id) + print("\n*****s3_secret_access_key:",s3_secret_access_key) + print("\n*****docservice_db_host:",docservice_s3_host) + print("\n*****docservice_s3_region:",docservice_s3_region) + print("\n*****docservice_s3_service:",docservice_s3_service) + #s3uri = 'https://{0}/{1}/{2}/{3}'.format(pdfstitch_s3_host,formsbucket, requestnumber, filename) + s3uri= s3uri+filename+".pdf" + print("\n\ns3uri before frst PUT:",s3uri) + response = requests.put(s3uri, data=None, auth=auth) + print("\n***response for header:",response.request.headers) + header = { + 'X-Amz-Date': response.request.headers['x-amz-date'], + 'Authorization': response.request.headers['Authorization'], + 'Content-Type': 'application/octet-stream' #mimetypes.MimeTypes().guess_type(filename)[0] + } + + #upload to S3 + print("\n\ns3uriNOW after:",s3uri) + response1= requests.put(s3uri, data=filebytes, headers=header) + print("\n**response1--->",response1) + attachmentobj = {"success": True, "filename": filename, "documentpath": s3uri} + #print("\n\nattachmentobjNOW:",attachmentobj) + return attachmentobj + except Exception as ex: + if retry > int(docservice_failureattempt): + logging.error("Error in uploading document to S3") + logging.error(ex) + attachmentobj = {"success": False, "filename": filename, "documentpath": None} + raise ValueError(attachmentobj, ex) + logging.info(f"uploadbytes s3retry = {retry}") + + retry += 1 + continue + finally: + if filebytes: + filebytes = None + del filebytes \ No newline at end of file diff --git a/computingservices/DocumentServices/templates/redline_redaction_summary.docx b/computingservices/DocumentServices/templates/redline_redaction_summary.docx new file mode 100644 index 0000000000000000000000000000000000000000..d465bb1f329568992776b22c26374e3caecdaab8 GIT binary patch literal 43669 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̒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

~387=1$4 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 literal 0 HcmV?d00001 diff --git a/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx b/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx new file mode 100644 index 0000000000000000000000000000000000000000..67952090286241a76b0c523d9d43e92508201dfe GIT binary patch literal 43335 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 Q3Wz=_=od97WB9Ls0Cml(s{jB1 literal 0 HcmV?d00001 diff --git a/computingservices/DocumentServices/utils/foidocumentserviceconfig.py b/computingservices/DocumentServices/utils/foidocumentserviceconfig.py index 560578a0d..b4b5fb041 100644 --- a/computingservices/DocumentServices/utils/foidocumentserviceconfig.py +++ b/computingservices/DocumentServices/utils/foidocumentserviceconfig.py @@ -23,6 +23,8 @@ docservice_s3_service = os.getenv("DOCUMENTSERVICE_S3_SERVICE") docservice_s3_env = os.getenv("DOCUMENTSERVICE_S3_ENV") +docservice_failureattempt = os.getenv('DOCUMENTSERVICE_FAILUREATTEMPT', 3) + # Zipper stream config zipperredishost = os.getenv("ZIPPER_REDIS_HOST") diff --git a/computingservices/DocumentServices/utils/jsonmessageparser.py b/computingservices/DocumentServices/utils/jsonmessageparser.py new file mode 100644 index 000000000..a66d80ad4 --- /dev/null +++ b/computingservices/DocumentServices/utils/jsonmessageparser.py @@ -0,0 +1,7 @@ +import json +from models import s3credentials + +def gets3credentialsobject(s3cred_json): + j = json.loads(s3cred_json) + messageobject = s3credentials(**j) + return messageobject From 9dd36ce8888effcbdb999ea5cd2c1a61a21945a2 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 31 Jan 2024 13:40:35 -0800 Subject: [PATCH 09/63] Merged --- .../services/redactionsummaryservice.py | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 4baf46a7e..19a84dba6 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -6,6 +6,7 @@ from .documentgenerationservice import documentgenerationservice from .s3documentservice import uploadbytes +from services.dts.redactionsummary import redactionsummary class redactionsummaryservice(): def processmessage(self,message): @@ -28,33 +29,16 @@ def processmessage(self,message): "extension":"docx", "cdogs_hash_code":"58G94G" } - # pdfgenerationdata={ - # "requestid":"ABC-123-545", - # "data":[{ - # "flagname":"DISCLOSED IN FULL", - # "pagecount": 20, - # "sections": [{"range":"1 - 2", "section":"disclosed in full"},{"range":"3", "section":"disclosed in full"}, {"range":"5 - 19", "section":"disclosed in full"}] - # }, - # { - # "flagname":"DISCLOSED IN PART", - # "pagecount": 5, - # "sections": [{"range":"4", "section":"partial disclosure under S.1"}, - # {"range":"13 - 16", "section":"partial disclosure under S.4"}] - # }, - # { - # "flagname":"WITHHELD IN FULL", - # "pagecount": 2, - # "sections": [{"range":"17 - 18", "section":"withheld in full under S.18"}] - # } - # ]} - pdfgenerationdata={'requestnumber': 'EDU-20240125-1', - 'data': [{'flagname': 'PARTIAL DISCLOSURE', 'pagecount': 4, - 'sections': [{'range': 1, 'section': 'Partial Disclosure under s. 15'}, {'range': '5-7','section': 'Partial Disclosure under s. 15,s. 16,s. 13,s. 17,s. 12'}]}, {'flagname': 'WITHHELD IN FULL', 'pagecount': 1, - 'sections': [{'range': 3, 'section': 'Withheld in Full under s. 15,s. 13,s. 12'}]}, {'flagname': 'DUPLICATE', 'pagecount': 2, - 'sections': [{'range': 2, 'section': 'Duplicate'}, {'range': 4, 'section': 'Duplicate'}]}]} + formattedsummary = redactionsummary().prepareredactionsummary(message) + print(formattedsummary) + # formattedsummary={'requestnumber': 'EDU-20240125-1', + # 'data': [{'flagname': 'PARTIAL DISCLOSURE', 'pagecount': 4, + # 'sections': [{'range': 1, 'section': 'Partial Disclosure under s. 15'}, {'range': '5-7','section': 'Partial Disclosure under s. 15,s. 16,s. 13,s. 17,s. 12'}]}, {'flagname': 'WITHHELD IN FULL', 'pagecount': 1, + # 'sections': [{'range': 3, 'section': 'Withheld in Full under s. 15,s. 13,s. 12'}]}, {'flagname': 'DUPLICATE', 'pagecount': 2, + # 'sections': [{'range': 2, 'section': 'Duplicate'}, {'range': 4, 'section': 'Duplicate'}]}]} print("\nBefore calling generate_pdf:", json.dumps(message.attributes) ) receipt_template_path= r'templates/redline_redaction_summary.docx' - redline_redaction_summary= documentgenerationservice().generate_pdf(receipt_template,pdfgenerationdata,receipt_template_path) + redline_redaction_summary= documentgenerationservice().generate_pdf(receipt_template,formattedsummary,receipt_template_path) print("Finished generate_pdf!!") #Method for calling the pdf generation method ends #Document @@ -67,7 +51,7 @@ def processmessage(self,message): s3uri = s3uri[:last_slash_index + 1] divisionname = messagejson[0]['divisionname'] category = "redline" #get it from message - requestnumber=pdfgenerationdata["requestnumber"] + requestnumber=formattedsummary["requestnumber"] filename = f"{requestnumber} - {category} - {divisionname} - summary" #filename = "Summary.pdf" print("\nBefore calling uploadbytes", s3uri ) From 163ce09b510c6e31642606361cde1cd0b672709f Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 1 Feb 2024 11:09:48 -0800 Subject: [PATCH 10/63] updated template with integration --- .../services/redactionsummaryservice.py | 10 +++++----- .../templates/redline_redaction_summary.docx | Bin 43669 -> 44180 bytes .../responsepackage_redaction_summary.docx | Bin 43335 -> 43666 bytes 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 19a84dba6..71a00d7f7 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -43,17 +43,17 @@ def processmessage(self,message): #Method for calling the pdf generation method ends #Document #Upload to S3 starts - messagejson=json.loads(message.attributes) - s3uri = messagejson[0]['files'][0]['s3uripath'] + messagejson=json.loads(message) + messageattributes= messagejson.attributes + s3uri = messageattributes[0]['files'][0]['s3uripath'] # Find the last occurrence of '/' last_slash_index = s3uri.rfind('/') # Remove the filename and everything after it s3uri = s3uri[:last_slash_index + 1] - divisionname = messagejson[0]['divisionname'] - category = "redline" #get it from message + divisionname = messageattributes[0]['divisionname'] + category = messagejson.category #"redline" #get it from message requestnumber=formattedsummary["requestnumber"] filename = f"{requestnumber} - {category} - {divisionname} - summary" - #filename = "Summary.pdf" print("\nBefore calling uploadbytes", s3uri ) uploadbytes(filename,redline_redaction_summary.content, s3uri) #Upload to S3 ends diff --git a/computingservices/DocumentServices/templates/redline_redaction_summary.docx b/computingservices/DocumentServices/templates/redline_redaction_summary.docx index d465bb1f329568992776b22c26374e3caecdaab8..51e64b5a865f38348bd7dfd44cd5b6011f478ff7 100644 GIT binary patch delta 17726 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 JUlxM=1^~;T!~y^S delta 17218 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 I=YxU>0M@eVQ~&?~ diff --git a/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx b/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx index 67952090286241a76b0c523d9d43e92508201dfe..e6c96588685d8ce2c8e071f143e6fffca79f086b 100644 GIT binary patch delta 13590 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 delta 13202 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 From 41a27fffaa0a06623ce756b1fdd5ff434fc75243 Mon Sep 17 00:00:00 2001 From: Aparna Date: Mon, 5 Feb 2024 15:34:27 -0800 Subject: [PATCH 11/63] Updates with document template model and saving job status after upload --- computingservices/DocumentServices/.sampleenv | 6 +++ .../services/dal/documenttemplateservice.py | 49 ++++++++++++++++++ .../services/dal/documenttypeservice.py | 30 +++++++++++ .../services/documentgenerationservice.py | 20 +++++-- .../services/redactionsummaryservice.py | 43 ++++++++------- .../responsepackage_redaction_summary.docx | Bin 43666 -> 43510 bytes .../DocumentServices/utils/dbconnection.py | 12 ++++- .../utils/foidocumentserviceconfig.py | 6 +++ 8 files changed, 141 insertions(+), 25 deletions(-) create mode 100644 computingservices/DocumentServices/services/dal/documenttemplateservice.py create mode 100644 computingservices/DocumentServices/services/dal/documenttypeservice.py diff --git a/computingservices/DocumentServices/.sampleenv b/computingservices/DocumentServices/.sampleenv index 57bec87b2..426268c39 100644 --- a/computingservices/DocumentServices/.sampleenv +++ b/computingservices/DocumentServices/.sampleenv @@ -20,4 +20,10 @@ DOCUMENTSERVICE_S3_HOST= DOCUMENTSERVICE_S3_REGION= DOCUMENTSERVICE_S3_SERVICE= DOCUMENTSERVICE_S3_ENV= + +FOI_DB_USER= +FOI_DB_PASSWORD= +FOI_DB_NAME= +FOI_DB_HOST= +FOI_DB_PORT= #Properties of Document Service - End diff --git a/computingservices/DocumentServices/services/dal/documenttemplateservice.py b/computingservices/DocumentServices/services/dal/documenttemplateservice.py new file mode 100644 index 000000000..e0d420df8 --- /dev/null +++ b/computingservices/DocumentServices/services/dal/documenttemplateservice.py @@ -0,0 +1,49 @@ +from utils import getfoidbconnection +import logging +import json + + +class documenttemplateservice: + + @classmethod + def gettemplatebytype(cls, documenttypeid, extension= "docx"): + conn = getfoidbconnection() + try: + cursor = conn.cursor() + query = ''' + SELECT * + FROM public."DocumentTemplates" + WHERE document_type_id = %s::integer + ORDER BY version DESC LIMIT 1; + ''' + parameters = (documenttypeid) + cursor.execute(query, parameters) + documenttemplate = cursor.fetchone()[0] + return documenttemplate + except Exception as error: + logging.error("Error in gettemplatebytype") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() + + @classmethod + def updatecdogshashcode(cls, documenttypeid, cdogshashcode): + conn = getfoidbconnection() + try: + cursor = conn.cursor() + query = ''' + UPDATE public."DocumentTemplates" SET cdogs_hash_code = %s::str + WHERE document_type_id = %s::integer; + ''' + parameters = (cdogshashcode, documenttypeid,) + cursor.execute(query, parameters) + conn.commit() + cursor.close() + except(Exception) as error: + print("Exception while executing func updatecdogshashcode, Error : {0} ".format(error)) + raise + finally: + if conn is not None: + conn.close() \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dal/documenttypeservice.py b/computingservices/DocumentServices/services/dal/documenttypeservice.py new file mode 100644 index 000000000..989653ba9 --- /dev/null +++ b/computingservices/DocumentServices/services/dal/documenttypeservice.py @@ -0,0 +1,30 @@ +from utils import getfoidbconnection +import logging +import json + + +class documenttypeservice: + + @classmethod + def getdocumenttypebyname(cls, document_type_name, extension= "docx"): + conn = getfoidbconnection() + try: + cursor = conn.cursor() + query = ''' + SELECT * + FROM public."DocumentTypes" + WHERE document_type_name = %s::integer + ORDER BY version DESC LIMIT 1; + ''' + parameters = (document_type_name) + cursor.execute(query, parameters) + documenttemplate = cursor.fetchone()[0] + return documenttemplate + except Exception as error: + logging.error("Error in getdocumenttypebyname") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() + \ No newline at end of file diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index 6ee591a25..de811d53b 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -1,4 +1,6 @@ #from reviewer_api.services.cdogs_api_service import cdogsapiservice +from services.dal.documenttemplateservice import documenttemplateservice +from services.dal.documenttypeservice import documenttypeservice from .cdogsapiservice import cdogsapiservice import json import logging @@ -31,21 +33,33 @@ class documentgenerationservice: # raise BusinessException(Error.DATA_NOT_FOUND) - def generate_pdf(self, receipt_template, data, receipt_template_path='reviewer_api/templates/redline_redaction_summary.docx'): + def generate_pdf(self, documenttypename, data, receipt_template_path='templates/redline_redaction_summary.docx'): access_token= cdogsapiservice()._get_access_token() template_cached = False + receipt_template= self.__gettemplate(documenttypename) print("\nreceipt_template:",receipt_template) - if receipt_template["cdogs_hash_code"]: + if receipt_template is not None and receipt_template["cdogs_hash_code"]: print('Checking if template %s is cached', receipt_template["cdogs_hash_code"]) template_cached = cdogsapiservice().check_template_cached(receipt_template["cdogs_hash_code"], access_token) - if receipt_template["cdogs_hash_code"] is None or not template_cached: + if receipt_template is None or receipt_template["cdogs_hash_code"] is None or not template_cached: receipt_template["cdogs_hash_code"] = cdogsapiservice().upload_template(receipt_template_path, access_token) print('Uploading new template--->',receipt_template) + documenttemplateservice().updatecdogshashcode(receipt_template["document_type_id"], receipt_template["cdogs_hash_code"]) # receipt_template.flush() # receipt_template.commit() print('Generating redaction summary') return cdogsapiservice().generate_pdf(receipt_template["cdogs_hash_code"], data,access_token) + + def __gettemplate(self,documenttypename='receipt'): + try: + receipt_document_type =documenttypeservice().getdocumenttypebyname(documenttypename) + receipt_template=None + if receipt_document_type is not None: + receipt_template=documenttemplateservice().gettemplatebytype(receipt_document_type.document_type_id) + return receipt_template + except (Exception) as error: + print('error occured in pagecount calculation service: ', error) # def upload_receipt(self, filename, filebytes, ministryrequestid, ministrycode, filenumber): # try: diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 71a00d7f7..94ce0bbfe 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -5,7 +5,6 @@ from services.dts.redactionsummary import redactionsummary from .documentgenerationservice import documentgenerationservice from .s3documentservice import uploadbytes - from services.dts.redactionsummary import redactionsummary class redactionsummaryservice(): @@ -24,39 +23,43 @@ def processmessage(self,message): print(formattedsummary) print("\n\nmessage:",message) #Get Data - #Get Template - receipt_template={ - "extension":"docx", - "cdogs_hash_code":"58G94G" - } + formattedsummary = redactionsummary().prepareredactionsummary(message) - print(formattedsummary) - # formattedsummary={'requestnumber': 'EDU-20240125-1', - # 'data': [{'flagname': 'PARTIAL DISCLOSURE', 'pagecount': 4, - # 'sections': [{'range': 1, 'section': 'Partial Disclosure under s. 15'}, {'range': '5-7','section': 'Partial Disclosure under s. 15,s. 16,s. 13,s. 17,s. 12'}]}, {'flagname': 'WITHHELD IN FULL', 'pagecount': 1, - # 'sections': [{'range': 3, 'section': 'Withheld in Full under s. 15,s. 13,s. 12'}]}, {'flagname': 'DUPLICATE', 'pagecount': 2, - # 'sections': [{'range': 2, 'section': 'Duplicate'}, {'range': 4, 'section': 'Duplicate'}]}]} - print("\nBefore calling generate_pdf:", json.dumps(message.attributes) ) - receipt_template_path= r'templates/redline_redaction_summary.docx' - redline_redaction_summary= documentgenerationservice().generate_pdf(receipt_template,formattedsummary,receipt_template_path) + + #TODO : For each division generate the pdf & upload to respective folders!! + print("\n**Formattedsummary:",formattedsummary) + print("\nBefore calling generate_pdf:", json.dumps(message.attributes)) + messagejson=json.loads(message) + messageattributes= messagejson.attributes + category = messagejson.category + documenttypename= category+"_redaction_summary" + #receipt_template_path= r'templates/redline_redaction_summary.docx' + #Get Template + redline_redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,receipt_template_path) print("Finished generate_pdf!!") #Method for calling the pdf generation method ends #Document - #Upload to S3 starts - messagejson=json.loads(message) - messageattributes= messagejson.attributes + #Upload to S3 starts s3uri = messageattributes[0]['files'][0]['s3uripath'] # Find the last occurrence of '/' last_slash_index = s3uri.rfind('/') # Remove the filename and everything after it s3uri = s3uri[:last_slash_index + 1] divisionname = messageattributes[0]['divisionname'] - category = messagejson.category #"redline" #get it from message + #"redline" #get it from message requestnumber=formattedsummary["requestnumber"] filename = f"{requestnumber} - {category} - {divisionname} - summary" print("\nBefore calling uploadbytes", s3uri ) - uploadbytes(filename,redline_redaction_summary.content, s3uri) + uploadresponse= uploadbytes(filename,redline_redaction_summary.content, s3uri) #Upload to S3 ends + if uploadresponse.status_code == 200: + summaryuploaderror= False + summaryuploaderrormsg="" + else: + print("\n!!!ERROORR!!!",uploadresponse.text) + summaryuploaderror= True + summaryuploaderrormsg = uploadresponse.text + pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) #Invoke ZIP except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx b/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx index e6c96588685d8ce2c8e071f143e6fffca79f086b..4f58253de1a08b298b387cfc2239a09231e1dd2c 100644 GIT binary patch delta 10040 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 ZV7>}ED1LE%#r;{TFY#7+3%R delta 10229 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 diff --git a/computingservices/DocumentServices/utils/dbconnection.py b/computingservices/DocumentServices/utils/dbconnection.py index 419d9bb3c..7dd1f67fb 100644 --- a/computingservices/DocumentServices/utils/dbconnection.py +++ b/computingservices/DocumentServices/utils/dbconnection.py @@ -1,5 +1,5 @@ import psycopg2 -from . import docservice_db_user,docservice_db_port,docservice_db_host,docservice_db_name,docservice_db_password +from . import docservice_db_user,docservice_db_port,docservice_db_host,docservice_db_name,docservice_db_password,foi_db_user,foi_db_port,foi_db_host,foi_db_name,foi_db_password def getdbconnection(): conn = psycopg2.connect( @@ -7,4 +7,12 @@ def getdbconnection(): database=docservice_db_name, user=docservice_db_user, password=docservice_db_password,port=docservice_db_port) - return conn \ No newline at end of file + return conn + +def getfoidbconnection(): + conn = psycopg2.connect( + host=foi_db_host, + database=foi_db_name, + user=foi_db_user, + password=foi_db_password,port=foi_db_port) + return conn \ No newline at end of file diff --git a/computingservices/DocumentServices/utils/foidocumentserviceconfig.py b/computingservices/DocumentServices/utils/foidocumentserviceconfig.py index b4b5fb041..34775322e 100644 --- a/computingservices/DocumentServices/utils/foidocumentserviceconfig.py +++ b/computingservices/DocumentServices/utils/foidocumentserviceconfig.py @@ -18,6 +18,12 @@ docservice_db_user = os.getenv("DOCUMENTSERVICE_DB_USER") docservice_db_password = os.getenv("DOCUMENTSERVICE_DB_PASSWORD") +foi_db_host = os.getenv("FOI_DB_HOST") +foi_db_name = os.getenv("FOI_DB_NAME") +foi_db_port = os.getenv("FOI_DB_PORT") +foi_db_user = os.getenv("FOI_DB_USER") +foi_db_password = os.getenv("FOI_DB_PASSWORD") + docservice_s3_host = os.getenv("DOCUMENTSERVICE_S3_HOST") docservice_s3_region = os.getenv("DOCUMENTSERVICE_S3_REGION") docservice_s3_service = os.getenv("DOCUMENTSERVICE_S3_SERVICE") From 6a5721f1282cb6b98daa99ca5a5b1e5a1b6afd1a Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Tue, 6 Feb 2024 09:09:44 -0800 Subject: [PATCH 12/63] Changes to stitch division wise. --- api/reviewer_api/schemas/redline.py | 7 ++- .../services/dal/documentpageflag.py | 34 ++++++++++++ .../services/dts/redactionsummary.py | 52 ++++++++++++------- .../services/redactionsummaryservice.py | 12 ++++- web/src/components/FOI/Home/Redlining.js | 48 ++++++++++++----- 5 files changed, 120 insertions(+), 33 deletions(-) diff --git a/api/reviewer_api/schemas/redline.py b/api/reviewer_api/schemas/redline.py index 0afc888cf..43df72bc8 100644 --- a/api/reviewer_api/schemas/redline.py +++ b/api/reviewer_api/schemas/redline.py @@ -11,6 +11,9 @@ class AttributeSchema(Schema): divisionname = fields.Str(data_key="divisionname", allow_none=True) divisionid = fields.Int(data_key="divisionid", allow_none=True) +class SummarySchema(Schema): + divisionid = fields.Int(data_key="divisionid", allow_none=True) + documentids = fields.List(fields.Int()) class RedlineSchema(Schema): ministryrequestid = fields.Str(data_key="ministryrequestid", allow_none=False) @@ -20,5 +23,7 @@ class RedlineSchema(Schema): attributes = fields.Nested( AttributeSchema, many=True, required=True, allow_none=False ) - summarydocuments = fields.List(fields.Int()) + summarydocuments = fields.Nested( + SummarySchema, many=True, required=True, allow_none=False + ) redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dal/documentpageflag.py b/computingservices/DocumentServices/services/dal/documentpageflag.py index 2ec3433a8..43e071b49 100644 --- a/computingservices/DocumentServices/services/dal/documentpageflag.py +++ b/computingservices/DocumentServices/services/dal/documentpageflag.py @@ -63,6 +63,40 @@ def get_documentpageflag(cls, ministryrequestid, redactionlayerid, documentids): if conn is not None: conn.close() + @classmethod + def get_documents_lastmodified(cls, ministryrequestid, documentids): + conn = getdbconnection() + docids = [] + try: + cursor = conn.cursor() + cursor.execute( + """select d.documentid from "Documents" d, + "DocumentAttributes" da + where d.documentmasterid = da.documentmasterid + and da.isactive = true + and d.foiministryrequestid = %s::integer + and d.documentid in %s + order by da."attributes" ->> \'lastmodified\';""", + (ministryrequestid, tuple(documentids)), + ) + + result = cursor.fetchall() + cursor.close() + if result is not None: + for entry in result: + docids.append(entry[0]) + return docids + return None + + except Exception as error: + logging.error("Error in getting documentids for requestid") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() + + @classmethod def getpagecount_by_documentid(cls, ministryrequestid, documentids): conn = getdbconnection() diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 824827c42..039b0bebb 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -3,41 +3,57 @@ class redactionsummary(): - def prepareredactionsummary(self, message): + def prepareredactionsummary(self, message, documentids): try: - documentids = json.loads(message.summarydocuments) redactionlayerid = message.redactionlayerid - docpagedata = documentpageflag().getpagecount_by_documentid(message.ministryrequestid, documentids) - totalpagecount = self.__calculate_totalpages(docpagedata) + ordereddocids = documentpageflag().get_documents_lastmodified(message.ministryrequestid, self.__get_documentids(message)) + stitchedpagedata = documentpageflag().getpagecount_by_documentid(message.ministryrequestid, ordereddocids) + totalpagecount = self.__calculate_totalpages(stitchedpagedata) #Get all page flags if totalpagecount <=0: return pageflags = documentpageflag().get_all_pageflags() # Get document page flags - - docpageflags = documentpageflag().get_documentpageflag(message.ministryrequestid, redactionlayerid, documentids) + #docsummary = [] summarydata = [] - for pageflag in pageflags: - pagecount = 0 + docpageflags = documentpageflag().get_documentpageflag(message.ministryrequestid, redactionlayerid, ordereddocids) + + for pageflag in pageflags: + pagecount = 0 pageredactions = [] _data = {} _data["flagname"] = pageflag["description"].upper() - for docid in documentids: - docpageflag = docpageflags[docid] - filteredpages = self.__get_pages_by_flagid(docpageflag["pageflag"], pagecount, pageflag["pageflagid"]) - if len(filteredpages) > 0: - orginalpagenos = [pg['orginalpageno']for pg in filteredpages] - docpagesections = documentpageflag().getsections_by_documentid_pageno(message.ministryrequestid, redactionlayerid, docid, orginalpagenos) - pageredactions.extend(self.__get_pagesection_mapping(filteredpages, docpagesections)) - pagecount = pagecount+docpagedata[docid]["pagecount"] - if len(pageredactions) >0: + for docid in ordereddocids: + + #print(pagecount) + #print('pagecount', pagecount) + if docid in documentids: + #print('match') + docpageflag = docpageflags[docid] + filteredpages = self.__get_pages_by_flagid(docpageflag["pageflag"], pagecount, pageflag["pageflagid"]) + + if len(filteredpages) > 0: + orginalpagenos = [pg['orginalpageno']for pg in filteredpages] + docpagesections = documentpageflag().getsections_by_documentid_pageno(message.ministryrequestid, redactionlayerid, docid, orginalpagenos) + pageredactions.extend(self.__get_pagesection_mapping(filteredpages, docpagesections)) + pagecount = pagecount+stitchedpagedata[docid]["pagecount"] + if len(pageredactions) > 0: _data["pagecount"] = len(pageredactions) _data["sections"] = self.__format_redaction_summary(pageflag["description"], pageredactions) summarydata.append(_data) - return {"requestnumber": message.requestnumber, "data": summarydata} + #docsummary.append({"docid": docid, "summary": summarydata}) + + return summarydata except (Exception) as error: print('error occured in redaction summary service: ', error) + def __get_documentids(self, message): + summarydocuments = json.loads(message.summarydocuments) + docids = [] + for entry in summarydocuments: + docids = docids + entry['documentids'] + return docids + def __format_redaction_summary(self, pageflag, pageredactions): totalpages = len(pageredactions) _sortedpageumbers = sorted(pageredactions, key=lambda x: x["stitchedpageno"]) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 94ce0bbfe..f859d6528 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -13,7 +13,11 @@ def processmessage(self,message): print("\n\nBEFORE CALL TO pdfstitchjobactivity!!") pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") #Get Data ; Begin - formattedsummary = redactionsummary().prepareredactionsummary(message) + divisiondocuments = json.loads(message.summarydocuments) + for entry in divisiondocuments: + divisionid = entry['divisionid'] + documentids = entry['documentids'] + formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) #Get Data : End #Get Template #Document @@ -61,8 +65,12 @@ def processmessage(self,message): summaryuploaderrormsg = uploadresponse.text pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) #Invoke ZIP + + #print(message) + print(formattedsummary) except (Exception) as error: print('error occured in redaction summary service: ', error) - + + diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index f322fa9e8..9ea96b5f7 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -2098,11 +2098,11 @@ const Redlining = React.forwardRef( zipDocObj.divisionname = divObj["divisionname"]; } zipServiceMessage.attributes.push(zipDocObj); - zipServiceMessage.summarydocuments = redlineStitchInfo[divObj["divisionid"]]["documentids"]; + //zipServiceMessage.summarydocuments = redlineStitchInfo[divObj["divisionid"]]["documentids"]; if (divisionCountForToast === zipServiceMessage.attributes.length) { triggerDownloadRedlines(zipServiceMessage, (error) => { console.log(error); - window.location.reload(); + //window.location.reload(); }); } return zipServiceMessage; @@ -2743,15 +2743,7 @@ const Redlining = React.forwardRef( let IncompatableList = prepareRedlineIncompatibleMapping(res); setIncompatableList(IncompatableList); fetchDocumentRedlineAnnotations(requestid, documentids, currentLayer.name.toLowerCase()); - setRedlineZipperMessage({ - ministryrequestid: requestid, - category: getzipredlinecategory(layertype), - attributes: [], - requestnumber: res.requestnumber, - bcgovcode: res.bcgovcode, - summarydocuments: [], - redactionlayerid: currentLayer.redactionlayerid - }); + let stitchDocuments = {}; let documentsObjArr = []; let divisionstitchpages = []; @@ -2833,6 +2825,20 @@ const Redlining = React.forwardRef( setRedlineStitchInfo(stitchDoc); setIssingleredlinepackage(res.issingleredlinepackage); + console.log("-----------"); + console.log(divisionDocuments); + console.log(stitchDocuments); + console.log(); + console.log("-------------") + setRedlineZipperMessage({ + ministryrequestid: requestid, + category: getzipredlinecategory(layertype), + attributes: [], + requestnumber: res.requestnumber, + bcgovcode: res.bcgovcode, + summarydocuments: preparesummarylist(stitchDocuments), + redactionlayerid: currentLayer.redactionlayerid + }); if(res.issingleredlinepackage == 'Y' || divisions.length == 1){ stitchSingleDivisionRedlineExport( _instance, @@ -2859,6 +2865,24 @@ const Redlining = React.forwardRef( ); }; + const preparesummarylist = (stitchDocuments) => { + let summarylist = [] + for (const [key, value] of Object.entries(stitchDocuments)) { + let summary_division = {}; + summary_division["divisionid"] = key + let documentlist = stitchDocuments[key]; + if(documentlist.length > 0) { + let summary_divdocuments = [] + for (let doc of documentlist) { + summary_divdocuments.push(doc.documentid); + } + summary_division["documentids"] = summary_divdocuments; + } + summarylist.push(summary_division); + } + return summarylist + } + const stitchForRedlineExport = async ( _instance, divisionDocuments, @@ -3454,7 +3478,7 @@ const Redlining = React.forwardRef( zipServiceMessage ); setTimeout(() => { - window.location.reload(true); + //window.location.reload(true); }, 3000); }, (_err) => { From e1b06ccc13f0df92bd7bbe8ca2dd73be2914dbb7 Mon Sep 17 00:00:00 2001 From: Aparna Date: Tue, 6 Feb 2024 11:21:11 -0800 Subject: [PATCH 13/63] Merge branch 'dev-rook-ST-4975' into dev-rook-AS-4975 --- .../DocumentServices/services/redactionsummaryservice.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index f859d6528..07387d8f3 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -38,6 +38,13 @@ def processmessage(self,message): category = messagejson.category documenttypename= category+"_redaction_summary" #receipt_template_path= r'templates/redline_redaction_summary.docx' + #Get Data ; Begin + divisiondocuments = json.loads(message.summarydocuments) + for entry in divisiondocuments: + divisionid = entry['divisionid'] + documentids = entry['documentids'] + formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) + #Get Data : End #Get Template redline_redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,receipt_template_path) print("Finished generate_pdf!!") From 5951df38a6090a435bf2641256809d63f3a81163 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Tue, 6 Feb 2024 12:52:01 -0800 Subject: [PATCH 14/63] Include request number --- .../DocumentServices/services/dts/redactionsummary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 039b0bebb..b939e570a 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -43,7 +43,7 @@ def prepareredactionsummary(self, message, documentids): summarydata.append(_data) #docsummary.append({"docid": docid, "summary": summarydata}) - return summarydata + return {"requestnumber": message.requestnumber, "data": summarydata} except (Exception) as error: print('error occured in redaction summary service: ', error) From 3aedd9ef1da7e8e7a5b4ee148e32f6c5b99bdcdc Mon Sep 17 00:00:00 2001 From: Aparna Date: Tue, 6 Feb 2024 13:50:37 -0800 Subject: [PATCH 15/63] Merge branch 'dev-rook-ST-4975' into dev-rook-AS-4975 From a12a2bd0351f112f6992d12377ed796009acf970 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Tue, 6 Feb 2024 15:56:37 -0800 Subject: [PATCH 16/63] integration with zipper service, --- .../message/schemas/redactionsummary.py | 6 ----- .../reader/documentservicestreamreader.py | 2 ++ .../rstreamio/writer/zipperstreamwriter.py | 25 +++++-------------- .../services/dts/redactionsummary.py | 10 -------- .../services/redactionsummaryservice.py | 4 ++- .../models/zipperproducermessage.py | 4 ++- 6 files changed, 14 insertions(+), 37 deletions(-) diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py index c30769571..a00b2ca2b 100644 --- a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py +++ b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py @@ -27,12 +27,6 @@ def get_in_redactionsummary_msg(producer_json): messageobject = RedactionSummaryIncomingSchema().load(__formatmsg(producer_json)) return dict2obj(messageobject) -def getzipperproducermessage(producer_json): - j = json.loads(producer_json) - messageobject = redactionsummary(**j) - return messageobject - - def __formatmsg(producer_json): j = json.loads(producer_json) return j \ No newline at end of file diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py index 17aa30c4c..1fb459502 100644 --- a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -8,6 +8,7 @@ from utils.foidocumentserviceconfig import documentservice_stream_key from rstreamio.message.schemas.redactionsummary import get_in_redactionsummary_msg from services.redactionsummaryservice import redactionsummaryservice +from rstreamio.writer.zipperstreamwriter import zipperstreamwriter LAST_ID_KEY = "{consumer_id}:lastid" BLOCK_TIME = 5000 @@ -46,6 +47,7 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): _message = _message.replace("b'","'").replace("'",'') try: redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) + zipperstreamwriter().sendmessage(message) except(Exception) as error: logging.exception(error) # simulate processing diff --git a/computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py b/computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py index f428cebba..8de678519 100644 --- a/computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py +++ b/computingservices/DocumentServices/rstreamio/writer/zipperstreamwriter.py @@ -1,32 +1,19 @@ import logging from utils import redisstreamdb, zipper_stream_key -from rstreamio.message.schemas.zipper import ZipperPublishSchema -from models import dedupeproducermessage -import json class zipperstreamwriter: rdb = redisstreamdb zipperstream = rdb.Stream(zipper_stream_key) - def sendmessage(self, message, error=False): + def sendmessage(self, message): try: - zipper_msg = ZipperPublishSchema() - zipper_msg.serviceid = "documentservice" - zipper_msg.errorflag = self.__booltostr(error) - zipper_msg.ministryrequestid = message.ministryrequestid - zipper_msg.createdby = message.createdby - zipper_msg.batch = message.batch - #Additional execution parameters : Begin - - #Additional execution parameters : End - msgid = self.zipperstream.add(zipper_msg.__dict__, id="*") - logging.info("Notification message for msgid = %s ", msgid) + msgid = self.zipperstream.add(message, id="*") + logging.info("zipper message for msgid = %s ", msgid) except RuntimeError as error: - print("Exception while sending notification, func sendnotification(p4), Error : {0} ".format(error)) - logging.error("Unable to write to notification stream for batch %s | ministryrequestid=%i", message.batch, message.ministryrequestid) + print("Exception while sending message for zipping , Error : {0} ".format(error)) + logging.error("Unable to write to message stream for zipper %s | ministryrequestid=%i", message.ministryrequestid, message.ministryrequestid) logging.error(error) - def __booltostr(self, value): - return "YES" if value == True else "NO" + \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index b939e570a..101587d42 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -9,12 +9,9 @@ def prepareredactionsummary(self, message, documentids): ordereddocids = documentpageflag().get_documents_lastmodified(message.ministryrequestid, self.__get_documentids(message)) stitchedpagedata = documentpageflag().getpagecount_by_documentid(message.ministryrequestid, ordereddocids) totalpagecount = self.__calculate_totalpages(stitchedpagedata) - #Get all page flags if totalpagecount <=0: return pageflags = documentpageflag().get_all_pageflags() - # Get document page flags - #docsummary = [] summarydata = [] docpageflags = documentpageflag().get_documentpageflag(message.ministryrequestid, redactionlayerid, ordereddocids) @@ -24,14 +21,9 @@ def prepareredactionsummary(self, message, documentids): _data = {} _data["flagname"] = pageflag["description"].upper() for docid in ordereddocids: - - #print(pagecount) - #print('pagecount', pagecount) if docid in documentids: - #print('match') docpageflag = docpageflags[docid] filteredpages = self.__get_pages_by_flagid(docpageflag["pageflag"], pagecount, pageflag["pageflagid"]) - if len(filteredpages) > 0: orginalpagenos = [pg['orginalpageno']for pg in filteredpages] docpagesections = documentpageflag().getsections_by_documentid_pageno(message.ministryrequestid, redactionlayerid, docid, orginalpagenos) @@ -41,8 +33,6 @@ def prepareredactionsummary(self, message, documentids): _data["pagecount"] = len(pageredactions) _data["sections"] = self.__format_redaction_summary(pageflag["description"], pageredactions) summarydata.append(_data) - #docsummary.append({"docid": docid, "summary": summarydata}) - return {"requestnumber": message.requestnumber, "data": summarydata} except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 07387d8f3..4e1b2d0f1 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -18,6 +18,7 @@ def processmessage(self,message): divisionid = entry['divisionid'] documentids = entry['documentids'] formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) + print(formattedsummary) #Get Data : End #Get Template #Document @@ -73,8 +74,9 @@ def processmessage(self,message): pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) #Invoke ZIP + #print(message) - print(formattedsummary) + except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/computingservices/ZippingServices/models/zipperproducermessage.py b/computingservices/ZippingServices/models/zipperproducermessage.py index 55f7aac2a..e57d1d49d 100644 --- a/computingservices/ZippingServices/models/zipperproducermessage.py +++ b/computingservices/ZippingServices/models/zipperproducermessage.py @@ -1,5 +1,5 @@ class zipperproducermessage(object): - def __init__(self,jobid,requestid,category,requestnumber,bcgovcode,createdby,ministryrequestid,filestozip,finaloutput,attributes) -> None: + def __init__(self,jobid,requestid,category,requestnumber,bcgovcode,createdby,ministryrequestid,filestozip,finaloutput,attributes,summarydocuments,redactionlayerid) -> None: self.jobid = jobid self.requestid = requestid self.category=category @@ -10,3 +10,5 @@ def __init__(self,jobid,requestid,category,requestnumber,bcgovcode,createdby,min self.filestozip = filestozip self.finaloutput = finaloutput self.attributes = attributes + self.summarydocuments = summarydocuments + self.redactionlayerid = redactionlayerid From 8333b573e98beab2122f33dab5207ff0317d7fc6 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Tue, 6 Feb 2024 15:59:58 -0800 Subject: [PATCH 17/63] uncomment auo reload. --- web/src/components/FOI/Home/Redlining.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index 9ea96b5f7..1c9c52013 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -2102,7 +2102,7 @@ const Redlining = React.forwardRef( if (divisionCountForToast === zipServiceMessage.attributes.length) { triggerDownloadRedlines(zipServiceMessage, (error) => { console.log(error); - //window.location.reload(); + window.location.reload(); }); } return zipServiceMessage; @@ -3478,7 +3478,7 @@ const Redlining = React.forwardRef( zipServiceMessage ); setTimeout(() => { - //window.location.reload(true); + window.location.reload(true); }, 3000); }, (_err) => { From a229d91fef7352cf1dfc3b8c729135e60060dd31 Mon Sep 17 00:00:00 2001 From: Aparna Date: Tue, 6 Feb 2024 16:23:51 -0800 Subject: [PATCH 18/63] Integrated code --- .../services/documentgenerationservice.py | 26 ++++--- .../services/redactionsummaryservice.py | 73 ++++++++++--------- .../services/s3documentservice.py | 6 +- .../DocumentServices/utils/__init__.py | 2 +- 4 files changed, 58 insertions(+), 49 deletions(-) diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index de811d53b..b859926a2 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -36,22 +36,24 @@ class documentgenerationservice: def generate_pdf(self, documenttypename, data, receipt_template_path='templates/redline_redaction_summary.docx'): access_token= cdogsapiservice()._get_access_token() template_cached = False - receipt_template= self.__gettemplate(documenttypename) - print("\nreceipt_template:",receipt_template) - if receipt_template is not None and receipt_template["cdogs_hash_code"]: - print('Checking if template %s is cached', receipt_template["cdogs_hash_code"]) - template_cached = cdogsapiservice().check_template_cached(receipt_template["cdogs_hash_code"], access_token) + templatefromdb= self.__gettemplate(documenttypename) + print("\n***templatefromdb:",templatefromdb) + if templatefromdb is not None and templatefromdb["cdogs_hash_code"]: + print('Checking if template %s is cached', templatefromdb["cdogs_hash_code"]) + template_cached = cdogsapiservice().check_template_cached(templatefromdb["cdogs_hash_code"], access_token) + templatecdogshashcode = templatefromdb["cdogs_hash_code"] - if receipt_template is None or receipt_template["cdogs_hash_code"] is None or not template_cached: - receipt_template["cdogs_hash_code"] = cdogsapiservice().upload_template(receipt_template_path, access_token) - print('Uploading new template--->',receipt_template) - documenttemplateservice().updatecdogshashcode(receipt_template["document_type_id"], receipt_template["cdogs_hash_code"]) + if templatefromdb is None or templatefromdb["cdogs_hash_code"] is None or not template_cached: + templatecdogshashcode = cdogsapiservice().upload_template(receipt_template_path, access_token) + print('Uploading new template--->',templatecdogshashcode) + if templatefromdb is not None: + documenttemplateservice().updatecdogshashcode(templatefromdb["document_type_id"], templatefromdb["cdogs_hash_code"]) # receipt_template.flush() # receipt_template.commit() print('Generating redaction summary') - return cdogsapiservice().generate_pdf(receipt_template["cdogs_hash_code"], data,access_token) + return cdogsapiservice().generate_pdf(templatecdogshashcode, data,access_token) - def __gettemplate(self,documenttypename='receipt'): + def __gettemplate(self,documenttypename='redline_redaction_summary'): try: receipt_document_type =documenttypeservice().getdocumenttypebyname(documenttypename) receipt_template=None @@ -59,7 +61,7 @@ def __gettemplate(self,documenttypename='receipt'): receipt_template=documenttemplateservice().gettemplatebytype(receipt_document_type.document_type_id) return receipt_template except (Exception) as error: - print('error occured in pagecount calculation service: ', error) + print('error occured in document generation service - gettemplate method: ', error) # def upload_receipt(self, filename, filebytes, ministryrequestid, ministrycode, filenumber): # try: diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 4e1b2d0f1..8733825ab 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -10,7 +10,7 @@ class redactionsummaryservice(): def processmessage(self,message): try: - print("\n\nBEFORE CALL TO pdfstitchjobactivity!!") + print("***BEFORE CALL TO pdfstitchjobactivity!!") pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") #Get Data ; Begin divisiondocuments = json.loads(message.summarydocuments) @@ -31,47 +31,54 @@ def processmessage(self,message): formattedsummary = redactionsummary().prepareredactionsummary(message) + print("***message:",message) #TODO : For each division generate the pdf & upload to respective folders!! - print("\n**Formattedsummary:",formattedsummary) - print("\nBefore calling generate_pdf:", json.dumps(message.attributes)) - messagejson=json.loads(message) - messageattributes= messagejson.attributes - category = messagejson.category + print("***Before calling generate_pdf -messageattributes:", json.dumps(message.attributes)) + category = message.category documenttypename= category+"_redaction_summary" + print("***documenttypename:",documenttypename) + print("#######1",json.loads(message.attributes)[0]) #receipt_template_path= r'templates/redline_redaction_summary.docx' #Get Data ; Begin divisiondocuments = json.loads(message.summarydocuments) + print("***divisiondocuments:",divisiondocuments) + upload_responses=[] for entry in divisiondocuments: divisionid = entry['divisionid'] documentids = entry['documentids'] formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) - #Get Data : End - #Get Template - redline_redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,receipt_template_path) - print("Finished generate_pdf!!") - #Method for calling the pdf generation method ends - #Document - #Upload to S3 starts - s3uri = messageattributes[0]['files'][0]['s3uripath'] - # Find the last occurrence of '/' - last_slash_index = s3uri.rfind('/') - # Remove the filename and everything after it - s3uri = s3uri[:last_slash_index + 1] - divisionname = messageattributes[0]['divisionname'] - #"redline" #get it from message - requestnumber=formattedsummary["requestnumber"] - filename = f"{requestnumber} - {category} - {divisionname} - summary" - print("\nBefore calling uploadbytes", s3uri ) - uploadresponse= uploadbytes(filename,redline_redaction_summary.content, s3uri) - #Upload to S3 ends - if uploadresponse.status_code == 200: - summaryuploaderror= False - summaryuploaderrormsg="" - else: - print("\n!!!ERROORR!!!",uploadresponse.text) - summaryuploaderror= True - summaryuploaderrormsg = uploadresponse.text - pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) + print("\n***Formattedsummary - {} : {}",divisionid,formattedsummary) + #Get Data : End + #Get Template + redline_redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary) + print("\nFinished generate_pdf!!") + #Method for calling the pdf generation method ends + #Document + #Upload to S3 starts + messageattributes= json.loads(message.attributes) + s3uri = messageattributes[0]['files'][0]['s3uripath'] + # Find the last occurrence of '/' + last_slash_index = s3uri.rfind('/') + print("***Updated last_slash_index",last_slash_index) + # Remove the filename and everything after it + s3uri = s3uri[:last_slash_index + 1] + print("***Updated URI",s3uri) + divisionname = messageattributes[0]['divisionname'] + #"redline" #get it from message + requestnumber=formattedsummary["requestnumber"] + filename = f"{requestnumber} - {category} - {divisionname} - summary" + print("\nBefore calling uploadbytes", s3uri ) + uploadresponse= uploadbytes(filename,redline_redaction_summary.content, s3uri) + upload_responses.append(uploadresponse) + #Upload to S3 ends + if uploadresponse.status_code == 200: + summaryuploaderror= False + summaryuploaderrormsg="" + else: + print("\n!!!ERROORR!!!",uploadresponse.text) + summaryuploaderror= True + summaryuploaderrormsg = uploadresponse.text + pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) #Invoke ZIP diff --git a/computingservices/DocumentServices/services/s3documentservice.py b/computingservices/DocumentServices/services/s3documentservice.py index 9d68ba517..5c10c1591 100644 --- a/computingservices/DocumentServices/services/s3documentservice.py +++ b/computingservices/DocumentServices/services/s3documentservice.py @@ -87,11 +87,11 @@ def uploadbytes(filename, filebytes, s3uri): #upload to S3 print("\n\ns3uriNOW after:",s3uri) - response1= requests.put(s3uri, data=filebytes, headers=header) - print("\n**response1--->",response1) + uploadresponse= requests.put(s3uri, data=filebytes, headers=header) + print("***uploadresponse--->",uploadresponse) attachmentobj = {"success": True, "filename": filename, "documentpath": s3uri} #print("\n\nattachmentobjNOW:",attachmentobj) - return attachmentobj + return uploadresponse except Exception as ex: if retry > int(docservice_failureattempt): logging.error("Error in uploading document to S3") diff --git a/computingservices/DocumentServices/utils/__init__.py b/computingservices/DocumentServices/utils/__init__.py index 3cf5da79d..59dc1f2f3 100644 --- a/computingservices/DocumentServices/utils/__init__.py +++ b/computingservices/DocumentServices/utils/__init__.py @@ -1,3 +1,3 @@ from .foiredisstreamdb import redisstreamdb from .foidocumentserviceconfig import * -from .dbconnection import getdbconnection +from .dbconnection import getdbconnection, getfoidbconnection From f101e99a45450c9ec9c1805d3408f1be36a56cb5 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Tue, 6 Feb 2024 18:41:03 -0800 Subject: [PATCH 19/63] redaction summary for final package --- api/reviewer_api/schemas/finalpackage.py | 7 +++++ .../services/dts/redactionsummary.py | 11 ++++++++ web/src/components/FOI/Home/Redlining.js | 26 +++++++++++++------ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/api/reviewer_api/schemas/finalpackage.py b/api/reviewer_api/schemas/finalpackage.py index 8c5992065..010c0fd24 100644 --- a/api/reviewer_api/schemas/finalpackage.py +++ b/api/reviewer_api/schemas/finalpackage.py @@ -9,6 +9,9 @@ class FileSchema(Schema): class AttributeSchema(Schema): files = fields.Nested(FileSchema, many=True, required=True, allow_none=False) +class SummarySchema(Schema): + divisionid = fields.Int(data_key="divisionid", allow_none=True) + documentids = fields.List(fields.Int()) class FinalPackageSchema(Schema): ministryrequestid = fields.Str(data_key="ministryrequestid", allow_none=False) @@ -18,3 +21,7 @@ class FinalPackageSchema(Schema): attributes = fields.Nested( AttributeSchema, many=True, required=True, allow_none=False ) + summarydocuments = fields.Nested( + SummarySchema, many=True, required=True, allow_none=False + ) + redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 101587d42..929122aa8 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -4,6 +4,17 @@ class redactionsummary(): def prepareredactionsummary(self, message, documentids): + redactionsummary = self.prepare_pkg_redactionsummary(message,documentids) + if message.category == "responsepackage": + consolidated_redactions = [] + for entry in redactionsummary['data']: + consolidated_redactions += entry['sections'] + sortedredactions = sorted(consolidated_redactions, key=lambda x: int(str(x["range"]).split('-')[0])) + return {"requestnumber": message.requestnumber, "data": sortedredactions} + return redactionsummary + + + def prepare_pkg_redactionsummary(self, message, documentids): try: redactionlayerid = message.redactionlayerid ordereddocids = documentpageflag().get_documents_lastmodified(message.ministryrequestid, self.__get_documentids(message)) diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index 1c9c52013..21724c4a9 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -2825,18 +2825,13 @@ const Redlining = React.forwardRef( setRedlineStitchInfo(stitchDoc); setIssingleredlinepackage(res.issingleredlinepackage); - console.log("-----------"); - console.log(divisionDocuments); - console.log(stitchDocuments); - console.log(); - console.log("-------------") setRedlineZipperMessage({ ministryrequestid: requestid, category: getzipredlinecategory(layertype), attributes: [], requestnumber: res.requestnumber, bcgovcode: res.bcgovcode, - summarydocuments: preparesummarylist(stitchDocuments), + summarydocuments: prepareredlinesummarylist(stitchDocuments), redactionlayerid: currentLayer.redactionlayerid }); if(res.issingleredlinepackage == 'Y' || divisions.length == 1){ @@ -2865,7 +2860,7 @@ const Redlining = React.forwardRef( ); }; - const preparesummarylist = (stitchDocuments) => { + const prepareredlinesummarylist = (stitchDocuments) => { let summarylist = [] for (const [key, value] of Object.entries(stitchDocuments)) { let summary_division = {}; @@ -2883,6 +2878,7 @@ const Redlining = React.forwardRef( return summarylist } + const stitchForRedlineExport = async ( _instance, divisionDocuments, @@ -3350,13 +3346,14 @@ const Redlining = React.forwardRef( _instance ) => { const downloadType = "pdf"; - let zipServiceMessage = { ministryrequestid: requestid, category: "responsepackage", attributes: [], requestnumber: "", bcgovcode: "", + summarydocuments : prepareresponseredlinesummarylist(documentList), + redactionlayerid: currentLayer.redactionlayerid }; getResponsePackagePreSignedUrl( @@ -3506,6 +3503,19 @@ const Redlining = React.forwardRef( ); }; + const prepareresponseredlinesummarylist = (documentlist) => { + let summarylist = [] + let summary_division = {}; + let summary_divdocuments = []; + summary_division["divisionid"] = '0'; + for (let doc of documentlist) { + summary_divdocuments.push(doc.documentid); + } + summary_division["documentids"] = summary_divdocuments; + summarylist.push(summary_division); + return summarylist + } + const compareValues = (a, b) => { if (modalSortNumbered) { if (modalSortAsc) { From 9cc51d5b5bdf1a626c18556dec2ecbb85fd84258 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 7 Feb 2024 16:51:00 -0800 Subject: [PATCH 20/63] Zipper fixed with summary --- .../reader/documentservicestreamreader.py | 40 ++++++++++++++++- .../services/redactionsummaryservice.py | 45 +++++++++++++++---- .../services/s3documentservice.py | 8 ++-- 3 files changed, 79 insertions(+), 14 deletions(-) diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py index 1fb459502..6c2d35c5d 100644 --- a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -46,8 +46,44 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) _message = _message.replace("b'","'").replace("'",'') try: - redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) - zipperstreamwriter().sendmessage(message) + + filestozip= redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) + # print("\n$$Before zipping- after summary- updatedmessage:", filestozip) + # print("\n$$Before zipping- after summary- message:", message) + #message_dict = {key.decode('utf-8'): value.decode('utf-8') for key, value in message.items()} + #print("\n\n@@@@message_dict: ",message_dict) + # Update the 'filestozip' field + #################################### + msgjson= json.loads(_message) + filestozip_list = msgjson['filestozip'] + #filestozip_list= str(filestozip) # Add a new file + filestozip_list = json.loads(filestozip_list) + print("####TYPE of filestozip : ####",type(filestozip_list)) + filestozip_list=filestozip + # Convert the updated dictionary back to bytes + #updated_message_bytes = {key.encode('utf-8'): value.encode('utf-8') for key, value in message_dict.items()} + json_string = json.dumps(filestozip_list) + bytes_data = json_string.encode('utf-8') + msgjson['filestozip'] =bytes_data + + filesto_list1=json.loads(msgjson['attributes'])[0]['files'] + print("ddd",filesto_list1) + filesto_list=filesto_list1 + filesto_list=filestozip + json_string_attr_files =json.dumps(filesto_list) + bytes_data1 = json_string_attr_files.encode('utf-8') + attributes_list = json.loads(msgjson['attributes']) + attributes_list[0]['files'] = filestozip #bytes_data1 + print("\n\nattributes_list: ",attributes_list) + msgjson['attributes'] = json.dumps(attributes_list) + + # print("bytes_data",bytes_data1) + # print("LLLLLLL:",json.loads(msgjson['attributes'])[0]['files']) + # print("LLdsf:",msgjson['attributes']) + #json.loads(msgjson['attributes'])[0]['files']=bytes_data1 + print("updated_message_bytes:",msgjson) + ############################################ + zipperstreamwriter().sendmessage(msgjson) except(Exception) as error: logging.exception(error) # simulate processing diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 8733825ab..431e42423 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -10,6 +10,7 @@ class redactionsummaryservice(): def processmessage(self,message): try: + filestozip=[] print("***BEFORE CALL TO pdfstitchjobactivity!!") pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") #Get Data ; Begin @@ -59,31 +60,59 @@ def processmessage(self,message): s3uri = messageattributes[0]['files'][0]['s3uripath'] # Find the last occurrence of '/' last_slash_index = s3uri.rfind('/') - print("***Updated last_slash_index",last_slash_index) # Remove the filename and everything after it s3uri = s3uri[:last_slash_index + 1] - print("***Updated URI",s3uri) + #print("***Updated URI",s3uri) divisionname = messageattributes[0]['divisionname'] #"redline" #get it from message requestnumber=formattedsummary["requestnumber"] filename = f"{requestnumber} - {category} - {divisionname} - summary" - print("\nBefore calling uploadbytes", s3uri ) - uploadresponse= uploadbytes(filename,redline_redaction_summary.content, s3uri) - upload_responses.append(uploadresponse) + uploadobj= uploadbytes(filename,redline_redaction_summary.content, s3uri) + upload_responses.append(uploadobj) #Upload to S3 ends - if uploadresponse.status_code == 200: + if uploadobj["uploadresponse"].status_code == 200: summaryuploaderror= False summaryuploaderrormsg="" else: - print("\n!!!ERROORR!!!",uploadresponse.text) + print("\n!!!ERROORR!!!",uploadobj["uploadresponse"].text) summaryuploaderror= True - summaryuploaderrormsg = uploadresponse.text + summaryuploaderrormsg = uploadobj.uploadresponse.text pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) #Invoke ZIP #print(message) + + filestozip= json.loads(message.filestozip) + filestozip.append({"filename": uploadobj["filename"], "s3uripath":uploadobj["documentpath"]}) + # msgattributesjson= json.loads(message.attributes) + # print("!!!!",msgattributesjson) + # print("!!!!type: ",type(msgattributesjson)) + + + # filtered_list = [item for item in msgattributesjson if item.get('divisionid') == divisionid] + # filtered_list[0]['files']=filestozip + # print("filtered_list:",filtered_list) + # print("####TYPE of filtered_list : ####",type(filtered_list)) + # print("msgattributesjson:",msgattributesjson) + + # # msgjson= json.loads(message) + # # print("1updated_message_bytes:",msgjson) + # print("$$$$$",type(message.filestozip)) + # filestozip_list = json.loads(message.filestozip) + # print("####TYPE of filestozip : ####",type(filestozip_list)) + # filestozip_list=filestozip + # print("$$$$$filestozip_list",filestozip_list) + + # # # Convert the updated dictionary back to bytes + # # #updated_message_bytes = {key.encode('utf-8'): value.encode('utf-8') for key, value in message_dict.items()} + # json_string = json.dumps(filestozip_list) + # print("$$$$$json_string",json_string) + # bytes_data = json_string.encode('utf-8') + # message.filestozip =bytes_data + # print("updated_message_bytes:",message) + return filestozip except (Exception) as error: print('error occured in redaction summary service: ', error) diff --git a/computingservices/DocumentServices/services/s3documentservice.py b/computingservices/DocumentServices/services/s3documentservice.py index 5c10c1591..3cefaeb92 100644 --- a/computingservices/DocumentServices/services/s3documentservice.py +++ b/computingservices/DocumentServices/services/s3documentservice.py @@ -89,15 +89,15 @@ def uploadbytes(filename, filebytes, s3uri): print("\n\ns3uriNOW after:",s3uri) uploadresponse= requests.put(s3uri, data=filebytes, headers=header) print("***uploadresponse--->",uploadresponse) - attachmentobj = {"success": True, "filename": filename, "documentpath": s3uri} + uploadobj = {"uploadresponse": uploadresponse, "filename": filename, "documentpath": s3uri} #print("\n\nattachmentobjNOW:",attachmentobj) - return uploadresponse + return uploadobj except Exception as ex: if retry > int(docservice_failureattempt): logging.error("Error in uploading document to S3") logging.error(ex) - attachmentobj = {"success": False, "filename": filename, "documentpath": None} - raise ValueError(attachmentobj, ex) + uploadobj = {"success": False, "filename": filename, "documentpath": None} + raise ValueError(uploadobj, ex) logging.info(f"uploadbytes s3retry = {retry}") retry += 1 From 827c13d27d87fe22c645a962ebd0f59d3e4b93ed Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 8 Feb 2024 08:35:24 -0800 Subject: [PATCH 21/63] Removed hard coded values --- .../services/cdogsapiservice.py | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/computingservices/DocumentServices/services/cdogsapiservice.py b/computingservices/DocumentServices/services/cdogsapiservice.py index dc13486e8..c8dab907f 100644 --- a/computingservices/DocumentServices/services/cdogsapiservice.py +++ b/computingservices/DocumentServices/services/cdogsapiservice.py @@ -35,8 +35,7 @@ def generate_pdf(self, template_hash_code, data, access_token): 'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}' } - #url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}/render" - url = f"https://cdogs-dev.api.gov.bc.ca/api/v2/template/{template_hash_code}/render" + url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}/render" return self._post_generate_pdf(json_request_body, headers, url) def _post_generate_pdf(self, json_request_body, headers, url): @@ -53,9 +52,8 @@ def upload_template(self, receipt_template_path, access_token): "Authorization": f'Bearer {access_token}' } - #url = f"{current_app.config['CDOGS_BASE_URL']}/api/v2/template" - url = "https://cdogs-dev.api.gov.bc.ca/api/v2/template" - + url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template" + if os.path.exists(receipt_template_path): print("@@@Exists!!") template = {'template':('template', open(receipt_template_path, 'rb'), "multipart/form-data")} @@ -91,21 +89,16 @@ def check_template_cached(self, template_hash_code, access_token): headers = { "Authorization": f'Bearer {access_token}' } - - #url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}" - url = f"https://cdogs-dev.api.gov.bc.ca/api/v2/template/{template_hash_code}" - + url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}" response = requests.get(url, headers= headers) return response.status_code == 200 def _get_access_token(self): - print("\n\n*********") #print("\n\nCDOGS_TOKEN_URL:",os.getenv['CDOGS_TOKEN_URL']) - token_url = "https://dev.loginproxy.gov.bc.ca/auth/realms/comsvcauth/protocol/openid-connect/token" #os.getenv['CDOGS_TOKEN_URL'] - service_client = "906B4222-00D7D1A3339" #os.getenv['CDOGS_SERVICE_CLIENT'] - service_client_secret = "c7c94a59-bed6-4fc3-85ed-acc43161753e" #os.getenv['CDOGS_SERVICE_CLIENT_SECRET'] - print("token_url:",token_url) + token_url = os.getenv['CDOGS_TOKEN_URL'] + service_client = os.getenv['CDOGS_SERVICE_CLIENT'] + service_client_secret = os.getenv['CDOGS_SERVICE_CLIENT_SECRET'] basic_auth_encoded = base64.b64encode( bytes(service_client + ':' + service_client_secret, 'utf-8')).decode('utf-8') data = 'grant_type=client_credentials' From a2a5bb08c9a717a09c69eaf7aff04ff115087cc8 Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 8 Feb 2024 08:38:42 -0800 Subject: [PATCH 22/63] Merge branch 'dev-rook-ST-4975' into dev-rook-AS-4975 From 9ab34551c78a186bfe804ad59ad9865beeb1a751 Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 8 Feb 2024 08:59:58 -0800 Subject: [PATCH 23/63] Removing commented code after merge -1 --- .../reader/documentservicestreamreader.py | 15 ++------- .../services/redactionsummaryservice.py | 32 ------------------- 2 files changed, 2 insertions(+), 45 deletions(-) diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py index 6c2d35c5d..192bce5d6 100644 --- a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -48,20 +48,11 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): try: filestozip= redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) - # print("\n$$Before zipping- after summary- updatedmessage:", filestozip) - # print("\n$$Before zipping- after summary- message:", message) - #message_dict = {key.decode('utf-8'): value.decode('utf-8') for key, value in message.items()} - #print("\n\n@@@@message_dict: ",message_dict) - # Update the 'filestozip' field - #################################### msgjson= json.loads(_message) filestozip_list = msgjson['filestozip'] - #filestozip_list= str(filestozip) # Add a new file filestozip_list = json.loads(filestozip_list) print("####TYPE of filestozip : ####",type(filestozip_list)) filestozip_list=filestozip - # Convert the updated dictionary back to bytes - #updated_message_bytes = {key.encode('utf-8'): value.encode('utf-8') for key, value in message_dict.items()} json_string = json.dumps(filestozip_list) bytes_data = json_string.encode('utf-8') msgjson['filestozip'] =bytes_data @@ -70,19 +61,17 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): print("ddd",filesto_list1) filesto_list=filesto_list1 filesto_list=filestozip - json_string_attr_files =json.dumps(filesto_list) - bytes_data1 = json_string_attr_files.encode('utf-8') + #json_string_attr_files =json.dumps(filesto_list) + #bytes_data1 = json_string_attr_files.encode('utf-8') attributes_list = json.loads(msgjson['attributes']) attributes_list[0]['files'] = filestozip #bytes_data1 print("\n\nattributes_list: ",attributes_list) msgjson['attributes'] = json.dumps(attributes_list) - # print("bytes_data",bytes_data1) # print("LLLLLLL:",json.loads(msgjson['attributes'])[0]['files']) # print("LLdsf:",msgjson['attributes']) #json.loads(msgjson['attributes'])[0]['files']=bytes_data1 print("updated_message_bytes:",msgjson) - ############################################ zipperstreamwriter().sendmessage(msgjson) except(Exception) as error: logging.exception(error) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 431e42423..dfe88745c 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -78,40 +78,8 @@ def processmessage(self,message): summaryuploaderror= True summaryuploaderrormsg = uploadobj.uploadresponse.text pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) - #Invoke ZIP - - - #print(message) - - filestozip= json.loads(message.filestozip) filestozip.append({"filename": uploadobj["filename"], "s3uripath":uploadobj["documentpath"]}) - # msgattributesjson= json.loads(message.attributes) - # print("!!!!",msgattributesjson) - # print("!!!!type: ",type(msgattributesjson)) - - - # filtered_list = [item for item in msgattributesjson if item.get('divisionid') == divisionid] - # filtered_list[0]['files']=filestozip - # print("filtered_list:",filtered_list) - # print("####TYPE of filtered_list : ####",type(filtered_list)) - # print("msgattributesjson:",msgattributesjson) - - # # msgjson= json.loads(message) - # # print("1updated_message_bytes:",msgjson) - # print("$$$$$",type(message.filestozip)) - # filestozip_list = json.loads(message.filestozip) - # print("####TYPE of filestozip : ####",type(filestozip_list)) - # filestozip_list=filestozip - # print("$$$$$filestozip_list",filestozip_list) - - # # # Convert the updated dictionary back to bytes - # # #updated_message_bytes = {key.encode('utf-8'): value.encode('utf-8') for key, value in message_dict.items()} - # json_string = json.dumps(filestozip_list) - # print("$$$$$json_string",json_string) - # bytes_data = json_string.encode('utf-8') - # message.filestozip =bytes_data - # print("updated_message_bytes:",message) return filestozip except (Exception) as error: print('error occured in redaction summary service: ', error) From c19a427fb5aea2b4fb36e30922e13d2bdff50c53 Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 8 Feb 2024 13:36:08 -0800 Subject: [PATCH 24/63] Fixed all issues with new merge --- .../reader/documentservicestreamreader.py | 26 +------- .../services/cdogsapiservice.py | 16 ++--- .../services/redactionsummaryservice.py | 60 +++++++------------ .../services/s3documentservice.py | 2 +- .../utils/foidocumentserviceconfig.py | 6 ++ .../ZippingServices/services/zipperservice.py | 5 +- docker-compose.yml | 4 ++ 7 files changed, 45 insertions(+), 74 deletions(-) diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py index 192bce5d6..51185bc06 100644 --- a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -46,32 +46,8 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) _message = _message.replace("b'","'").replace("'",'') try: - filestozip= redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) - msgjson= json.loads(_message) - filestozip_list = msgjson['filestozip'] - filestozip_list = json.loads(filestozip_list) - print("####TYPE of filestozip : ####",type(filestozip_list)) - filestozip_list=filestozip - json_string = json.dumps(filestozip_list) - bytes_data = json_string.encode('utf-8') - msgjson['filestozip'] =bytes_data - - filesto_list1=json.loads(msgjson['attributes'])[0]['files'] - print("ddd",filesto_list1) - filesto_list=filesto_list1 - filesto_list=filestozip - #json_string_attr_files =json.dumps(filesto_list) - #bytes_data1 = json_string_attr_files.encode('utf-8') - attributes_list = json.loads(msgjson['attributes']) - attributes_list[0]['files'] = filestozip #bytes_data1 - print("\n\nattributes_list: ",attributes_list) - msgjson['attributes'] = json.dumps(attributes_list) - # print("bytes_data",bytes_data1) - # print("LLLLLLL:",json.loads(msgjson['attributes'])[0]['files']) - # print("LLdsf:",msgjson['attributes']) - #json.loads(msgjson['attributes'])[0]['files']=bytes_data1 - print("updated_message_bytes:",msgjson) + msgjson= redactionsummaryservice().updatefilestozip(filestozip, _message) zipperstreamwriter().sendmessage(msgjson) except(Exception) as error: logging.exception(error) diff --git a/computingservices/DocumentServices/services/cdogsapiservice.py b/computingservices/DocumentServices/services/cdogsapiservice.py index c8dab907f..fc1c3dc7e 100644 --- a/computingservices/DocumentServices/services/cdogsapiservice.py +++ b/computingservices/DocumentServices/services/cdogsapiservice.py @@ -5,7 +5,7 @@ import re import requests -#from reviewer_api.exceptions import BusinessException, Error +from utils.foidocumentserviceconfig import cdogs_base_url,cdogs_token_url,cdogs_service_client,cdogs_service_client_secret class cdogsapiservice: @@ -35,7 +35,7 @@ def generate_pdf(self, template_hash_code, data, access_token): 'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}' } - url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}/render" + url = f"{cdogs_base_url}/api/v2/template/{template_hash_code}/render" return self._post_generate_pdf(json_request_body, headers, url) def _post_generate_pdf(self, json_request_body, headers, url): @@ -52,7 +52,7 @@ def upload_template(self, receipt_template_path, access_token): "Authorization": f'Bearer {access_token}' } - url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template" + url = f"{cdogs_base_url}/api/v2/template" if os.path.exists(receipt_template_path): print("@@@Exists!!") @@ -89,16 +89,16 @@ def check_template_cached(self, template_hash_code, access_token): headers = { "Authorization": f'Bearer {access_token}' } - url = f"{os.getenv['CDOGS_BASE_URL']}/api/v2/template/{template_hash_code}" + url = f"{cdogs_base_url}/api/v2/template/{template_hash_code}" response = requests.get(url, headers= headers) return response.status_code == 200 def _get_access_token(self): - #print("\n\nCDOGS_TOKEN_URL:",os.getenv['CDOGS_TOKEN_URL']) - token_url = os.getenv['CDOGS_TOKEN_URL'] - service_client = os.getenv['CDOGS_SERVICE_CLIENT'] - service_client_secret = os.getenv['CDOGS_SERVICE_CLIENT_SECRET'] + print("Inside _get_access_token!!") + token_url = cdogs_token_url + service_client = cdogs_service_client + service_client_secret = cdogs_service_client_secret basic_auth_encoded = base64.b64encode( bytes(service_client + ':' + service_client_secret, 'utf-8')).decode('utf-8') data = 'grant_type=client_credentials' diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index dfe88745c..e09af81f2 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -13,63 +13,32 @@ def processmessage(self,message): filestozip=[] print("***BEFORE CALL TO pdfstitchjobactivity!!") pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") - #Get Data ; Begin divisiondocuments = json.loads(message.summarydocuments) - for entry in divisiondocuments: - divisionid = entry['divisionid'] - documentids = entry['documentids'] - formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) - print(formattedsummary) - #Get Data : End - #Get Template - #Document - #Upload to S3 - #Invoke ZIP - print(message) - print(formattedsummary) - print("\n\nmessage:",message) - #Get Data - - formattedsummary = redactionsummary().prepareredactionsummary(message) - - print("***message:",message) - #TODO : For each division generate the pdf & upload to respective folders!! - print("***Before calling generate_pdf -messageattributes:", json.dumps(message.attributes)) + print("***divisiondocuments:",divisiondocuments) category = message.category documenttypename= category+"_redaction_summary" - print("***documenttypename:",documenttypename) - print("#######1",json.loads(message.attributes)[0]) - #receipt_template_path= r'templates/redline_redaction_summary.docx' - #Get Data ; Begin - divisiondocuments = json.loads(message.summarydocuments) - print("***divisiondocuments:",divisiondocuments) upload_responses=[] for entry in divisiondocuments: divisionid = entry['divisionid'] documentids = entry['documentids'] formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) - print("\n***Formattedsummary - {} : {}",divisionid,formattedsummary) - #Get Data : End - #Get Template + print("\n***Formattedsummary : ",divisionid) redline_redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary) print("\nFinished generate_pdf!!") - #Method for calling the pdf generation method ends - #Document - #Upload to S3 starts messageattributes= json.loads(message.attributes) s3uri = messageattributes[0]['files'][0]['s3uripath'] # Find the last occurrence of '/' last_slash_index = s3uri.rfind('/') # Remove the filename and everything after it s3uri = s3uri[:last_slash_index + 1] - #print("***Updated URI",s3uri) - divisionname = messageattributes[0]['divisionname'] - #"redline" #get it from message + s3uri = s3uri[:last_slash_index + 1] + print("-->NEW S3",s3uri) + divisionname= (next(item for item in messageattributes if item['divisionid'] == divisionid))['divisionname'] + print("-->divisionname",divisionname) requestnumber=formattedsummary["requestnumber"] - filename = f"{requestnumber} - {category} - {divisionname} - summary" + filename = f"{divisionname}/{requestnumber} - {category} - {divisionname} - summary.pdf" uploadobj= uploadbytes(filename,redline_redaction_summary.content, s3uri) upload_responses.append(uploadobj) - #Upload to S3 ends if uploadobj["uploadresponse"].status_code == 200: summaryuploaderror= False summaryuploaderrormsg="" @@ -83,6 +52,21 @@ def processmessage(self,message): return filestozip except (Exception) as error: print('error occured in redaction summary service: ', error) + + def updatefilestozip(self,updatedfilestozip, _message): + try: + msgjson= json.loads(_message) + filestozip_list = msgjson['filestozip'] + filestozip_list = json.loads(filestozip_list) + #print("####TYPE of filestozip : ####",type(filestozip_list)) + filestozip_list=updatedfilestozip + json_string = json.dumps(filestozip_list) + bytes_data = json_string.encode('utf-8') + msgjson['filestozip'] =bytes_data + print("updated_message_bytes:",msgjson) + return msgjson + except (Exception) as error: + print('error occured in redaction summary service: ', error) diff --git a/computingservices/DocumentServices/services/s3documentservice.py b/computingservices/DocumentServices/services/s3documentservice.py index 3cefaeb92..83675c92c 100644 --- a/computingservices/DocumentServices/services/s3documentservice.py +++ b/computingservices/DocumentServices/services/s3documentservice.py @@ -75,7 +75,7 @@ def uploadbytes(filename, filebytes, s3uri): print("\n*****docservice_s3_region:",docservice_s3_region) print("\n*****docservice_s3_service:",docservice_s3_service) #s3uri = 'https://{0}/{1}/{2}/{3}'.format(pdfstitch_s3_host,formsbucket, requestnumber, filename) - s3uri= s3uri+filename+".pdf" + s3uri= s3uri+filename print("\n\ns3uri before frst PUT:",s3uri) response = requests.put(s3uri, data=None, auth=auth) print("\n***response for header:",response.request.headers) diff --git a/computingservices/DocumentServices/utils/foidocumentserviceconfig.py b/computingservices/DocumentServices/utils/foidocumentserviceconfig.py index 34775322e..6c4cce8f4 100644 --- a/computingservices/DocumentServices/utils/foidocumentserviceconfig.py +++ b/computingservices/DocumentServices/utils/foidocumentserviceconfig.py @@ -37,3 +37,9 @@ zipperredisport = os.getenv("ZIPPER_REDIS_PORT") zipperredispassword = os.getenv("ZIPPER_REDIS_PASSWORD") zipper_stream_key = os.getenv("ZIPPER_STREAM_KEY") + + +cdogs_base_url = os.getenv("CDOGS_BASE_URL") +cdogs_token_url = os.getenv("CDOGS_TOKEN_URL") +cdogs_service_client = os.getenv("CDOGS_SERVICE_CLIENT") +cdogs_service_client_secret = os.getenv("CDOGS_SERVICE_CLIENT_SECRET") diff --git a/computingservices/ZippingServices/services/zipperservice.py b/computingservices/ZippingServices/services/zipperservice.py index dda549e79..8f7a2f3d7 100644 --- a/computingservices/ZippingServices/services/zipperservice.py +++ b/computingservices/ZippingServices/services/zipperservice.py @@ -106,9 +106,10 @@ def __zipfilesandupload(_message, s3credentials): tp, "w", zipfile.ZIP_DEFLATED, compresslevel=9, allowZip64=True ) as zip: _jsonfiles = json.loads(_message.filestozip) + print("\n_jsonfiles:",_jsonfiles) for fileobj in _jsonfiles: filename = fileobj["filename"] - + print("\nfilename:",filename) zip.writestr( filename, __getdocumentbytearray(fileobj, s3credentials) ) @@ -116,7 +117,7 @@ def __zipfilesandupload(_message, s3credentials): tp.seek(0) zipped_bytes = tp.read() filepath = __getzipfilepath(_message.category, _message.requestnumber) - logging.info("zipfilename = %s", filepath) + print("zipfilename = %s", filepath) docobj = uploadbytes( filepath, zipped_bytes, diff --git a/docker-compose.yml b/docker-compose.yml index 743c28a21..86c12966b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -78,6 +78,10 @@ services: - DOCUMENTSERVICE_REDIS_PASSWORD=${DEDUPE_REDIS_PASSWORD} - DOCUMENTSERVICE_REDIS_PORT=${DEDUPE_REDIS_PORT} - DOCUMENTSERVICE_STREAM_KEY=${DOCUMENTSERVICE_STREAM_KEY} + - CDOGS_BASE_URL=${CDOGS_BASE_URL} + - CDOGS_TOKEN_URL=${CDOGS_TOKEN_URL} + - CDOGS_SERVICE_CLIENT=${CDOGS_SERVICE_CLIENT} + - CDOGS_SERVICE_CLIENT_SECRET=${CDOGS_SERVICE_CLIENT_SECRET} - BATCH_CONFIG=${BATCH_CONFIG} - REDLINE_SINGLE_PKG_MINISTRIES=${REDLINE_SINGLE_PKG_MINISTRIES} From c0645bced410529098d0af1628fd9c4df6011a2a Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 8 Feb 2024 17:32:40 -0800 Subject: [PATCH 25/63] Fixed issues with db connection and template --- .../services/cdogsapiservice.py | 36 +++---------------- .../services/dal/documenttemplateservice.py | 14 ++++---- .../services/dal/documenttypeservice.py | 8 ++--- .../services/documentgenerationservice.py | 33 +++++++---------- .../services/redactionsummaryservice.py | 15 +++----- 5 files changed, 31 insertions(+), 75 deletions(-) diff --git a/computingservices/DocumentServices/services/cdogsapiservice.py b/computingservices/DocumentServices/services/cdogsapiservice.py index fc1c3dc7e..d634c1483 100644 --- a/computingservices/DocumentServices/services/cdogsapiservice.py +++ b/computingservices/DocumentServices/services/cdogsapiservice.py @@ -11,15 +11,8 @@ class cdogsapiservice: """cdogs api Service class.""" - # def __init__(self): - # self.access_token = self._get_access_token() - - def demomethod(self): - print("demomethod!!!") def generate_pdf(self, template_hash_code, data, access_token): - #access_token= self._get_access_token() - print('\n\ntemplate_hash_code:',template_hash_code) request_body = { "options": { "cachereport": False, @@ -30,7 +23,6 @@ def generate_pdf(self, template_hash_code, data, access_token): "data": data } json_request_body = json.dumps(request_body) - print("\njson_request_body:",json_request_body) headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}' @@ -41,44 +33,26 @@ def generate_pdf(self, template_hash_code, data, access_token): def _post_generate_pdf(self, json_request_body, headers, url): return requests.post(url, data= json_request_body, headers= headers) - def upload_template(self, receipt_template_path, access_token): - print('\nreceipt_template_path:',receipt_template_path) - #access_token= self._get_access_token() - file_dir = os.path.dirname(os.path.realpath('__file__')) - #print("file_dir:",file_dir) - template_file_path = os.path.join(file_dir, receipt_template_path) - #print("template_file_path:",template_file_path) + def upload_template(self, template_path, access_token): headers = { "Authorization": f'Bearer {access_token}' } - url = f"{cdogs_base_url}/api/v2/template" - - if os.path.exists(receipt_template_path): - print("@@@Exists!!") - template = {'template':('template', open(receipt_template_path, 'rb'), "multipart/form-data")} - print("\n\n1)url:",url) - print('\n\n2)Uploading template %s', template) - print("\n\n3)headers:",headers) + if os.path.exists(template_path): + print("Exists!!") + template = {'template':('template', open(template_path, 'rb'), "multipart/form-data")} response = self._post_upload_template(headers, url, template) - print("\n\nRESPONSE from UPLOAD ->",response) if response.status_code == 200: - # if response.headers.get("X-Template-Hash") is None: - # raise BusinessException(Error.DATA_NOT_FOUND) - print('Returning new hash %s', response.headers['X-Template-Hash']) return response.headers['X-Template-Hash']; response_json = json.loads(response.content) - if response.status_code == 405 and response_json['detail'] is not None: match = re.findall(r"Hash '(.*?)'", response_json['detail']); if match: - print('Template already hashed with code %s', match[0]) print('Template already hashed with code %s', match[0]) return match[0] - #raise BusinessException(Error.DATA_NOT_FOUND) def _post_upload_template(self, headers, url, template): response = requests.post(url, headers= headers, files= template) @@ -95,14 +69,12 @@ def check_template_cached(self, template_hash_code, access_token): def _get_access_token(self): - print("Inside _get_access_token!!") token_url = cdogs_token_url service_client = cdogs_service_client service_client_secret = cdogs_service_client_secret basic_auth_encoded = base64.b64encode( bytes(service_client + ':' + service_client_secret, 'utf-8')).decode('utf-8') data = 'grant_type=client_credentials' - print("basic_auth_encoded:",basic_auth_encoded) response = requests.post( token_url, data=data, diff --git a/computingservices/DocumentServices/services/dal/documenttemplateservice.py b/computingservices/DocumentServices/services/dal/documenttemplateservice.py index e0d420df8..6cd182874 100644 --- a/computingservices/DocumentServices/services/dal/documenttemplateservice.py +++ b/computingservices/DocumentServices/services/dal/documenttemplateservice.py @@ -11,12 +11,11 @@ def gettemplatebytype(cls, documenttypeid, extension= "docx"): try: cursor = conn.cursor() query = ''' - SELECT * + SELECT cdogs_hash_code FROM public."DocumentTemplates" - WHERE document_type_id = %s::integer - ORDER BY version DESC LIMIT 1; + WHERE document_type_id = %s and extension = %s; ''' - parameters = (documenttypeid) + parameters = (documenttypeid,extension,) cursor.execute(query, parameters) documenttemplate = cursor.fetchone()[0] return documenttemplate @@ -25,6 +24,7 @@ def gettemplatebytype(cls, documenttypeid, extension= "docx"): logging.error(error) raise finally: + cursor.close() if conn is not None: conn.close() @@ -34,16 +34,16 @@ def updatecdogshashcode(cls, documenttypeid, cdogshashcode): try: cursor = conn.cursor() query = ''' - UPDATE public."DocumentTemplates" SET cdogs_hash_code = %s::str - WHERE document_type_id = %s::integer; + UPDATE public."DocumentTemplates" SET cdogs_hash_code = %s + WHERE document_type_id = %s; ''' parameters = (cdogshashcode, documenttypeid,) cursor.execute(query, parameters) conn.commit() - cursor.close() except(Exception) as error: print("Exception while executing func updatecdogshashcode, Error : {0} ".format(error)) raise finally: + cursor.close() if conn is not None: conn.close() \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dal/documenttypeservice.py b/computingservices/DocumentServices/services/dal/documenttypeservice.py index 989653ba9..d42da3875 100644 --- a/computingservices/DocumentServices/services/dal/documenttypeservice.py +++ b/computingservices/DocumentServices/services/dal/documenttypeservice.py @@ -6,17 +6,16 @@ class documenttypeservice: @classmethod - def getdocumenttypebyname(cls, document_type_name, extension= "docx"): + def getdocumenttypebyname(cls, document_type_name): conn = getfoidbconnection() try: cursor = conn.cursor() query = ''' SELECT * FROM public."DocumentTypes" - WHERE document_type_name = %s::integer - ORDER BY version DESC LIMIT 1; + WHERE document_type_name = %s; ''' - parameters = (document_type_name) + parameters = (document_type_name,) cursor.execute(query, parameters) documenttemplate = cursor.fetchone()[0] return documenttemplate @@ -25,6 +24,7 @@ def getdocumenttypebyname(cls, document_type_name, extension= "docx"): logging.error(error) raise finally: + cursor.close() if conn is not None: conn.close() \ No newline at end of file diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index b859926a2..053439663 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -33,43 +33,34 @@ class documentgenerationservice: # raise BusinessException(Error.DATA_NOT_FOUND) - def generate_pdf(self, documenttypename, data, receipt_template_path='templates/redline_redaction_summary.docx'): + def generate_pdf(self, documenttypename, data, template_path='templates/redline_redaction_summary.docx'): access_token= cdogsapiservice()._get_access_token() template_cached = False templatefromdb= self.__gettemplate(documenttypename) print("\n***templatefromdb:",templatefromdb) - if templatefromdb is not None and templatefromdb["cdogs_hash_code"]: + if templatefromdb is not None and templatefromdb["cdogs_hash_code"] is not None: print('Checking if template %s is cached', templatefromdb["cdogs_hash_code"]) template_cached = cdogsapiservice().check_template_cached(templatefromdb["cdogs_hash_code"], access_token) templatecdogshashcode = templatefromdb["cdogs_hash_code"] if templatefromdb is None or templatefromdb["cdogs_hash_code"] is None or not template_cached: - templatecdogshashcode = cdogsapiservice().upload_template(receipt_template_path, access_token) + templatecdogshashcode = cdogsapiservice().upload_template(template_path, access_token) + templatefromdb["cdogs_hash_code"] = templatecdogshashcode print('Uploading new template--->',templatecdogshashcode) - if templatefromdb is not None: + if templatefromdb is not None and templatefromdb["document_type_id"] is not None: documenttemplateservice().updatecdogshashcode(templatefromdb["document_type_id"], templatefromdb["cdogs_hash_code"]) - # receipt_template.flush() - # receipt_template.commit() print('Generating redaction summary') return cdogsapiservice().generate_pdf(templatecdogshashcode, data,access_token) def __gettemplate(self,documenttypename='redline_redaction_summary'): try: - receipt_document_type =documenttypeservice().getdocumenttypebyname(documenttypename) - receipt_template=None - if receipt_document_type is not None: - receipt_template=documenttemplateservice().gettemplatebytype(receipt_document_type.document_type_id) - return receipt_template + templatefromdb=None + summary_cdogs_hash_code=None + summary_document_type_id =documenttypeservice().getdocumenttypebyname(documenttypename) + if summary_document_type_id is not None: + summary_cdogs_hash_code=documenttemplateservice().gettemplatebytype(summary_document_type_id) + templatefromdb = {"document_type_id": summary_document_type_id, "cdogs_hash_code":summary_cdogs_hash_code} + return templatefromdb except (Exception) as error: print('error occured in document generation service - gettemplate method: ', error) - # def upload_receipt(self, filename, filebytes, ministryrequestid, ministrycode, filenumber): - # try: - # logging.info("Upload summary for ministry request id"+ str(ministryrequestid)) - # _response = self.__uploadbytes(filename, filebytes, ministrycode, filenumber) - # logging.info("Upload status for payload"+ json.dumps(_response)) - # if _response["success"] == True: - # _documentschema = {"documents": [{"filename": _response["filename"], "documentpath": _response["documentpath"]}]} - # return _response - # except Exception as ex: - # logging.exception(ex) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index e09af81f2..dfefde98e 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -11,10 +11,8 @@ class redactionsummaryservice(): def processmessage(self,message): try: filestozip=[] - print("***BEFORE CALL TO pdfstitchjobactivity!!") pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") divisiondocuments = json.loads(message.summarydocuments) - print("***divisiondocuments:",divisiondocuments) category = message.category documenttypename= category+"_redaction_summary" upload_responses=[] @@ -22,19 +20,17 @@ def processmessage(self,message): divisionid = entry['divisionid'] documentids = entry['documentids'] formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) - print("\n***Formattedsummary : ",divisionid) redline_redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary) - print("\nFinished generate_pdf!!") messageattributes= json.loads(message.attributes) - s3uri = messageattributes[0]['files'][0]['s3uripath'] + s3uri = (next(item for item in messageattributes if item['divisionid'] == divisionid))['files'][0]['s3uripath'] + #messageattributes[0]['files'][0]['s3uripath'] # Find the last occurrence of '/' last_slash_index = s3uri.rfind('/') # Remove the filename and everything after it + s3uri = s3uri[:last_slash_index] + last_slash_index = s3uri.rfind('/') s3uri = s3uri[:last_slash_index + 1] - s3uri = s3uri[:last_slash_index + 1] - print("-->NEW S3",s3uri) divisionname= (next(item for item in messageattributes if item['divisionid'] == divisionid))['divisionname'] - print("-->divisionname",divisionname) requestnumber=formattedsummary["requestnumber"] filename = f"{divisionname}/{requestnumber} - {category} - {divisionname} - summary.pdf" uploadobj= uploadbytes(filename,redline_redaction_summary.content, s3uri) @@ -43,7 +39,6 @@ def processmessage(self,message): summaryuploaderror= False summaryuploaderrormsg="" else: - print("\n!!!ERROORR!!!",uploadobj["uploadresponse"].text) summaryuploaderror= True summaryuploaderrormsg = uploadobj.uploadresponse.text pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) @@ -58,12 +53,10 @@ def updatefilestozip(self,updatedfilestozip, _message): msgjson= json.loads(_message) filestozip_list = msgjson['filestozip'] filestozip_list = json.loads(filestozip_list) - #print("####TYPE of filestozip : ####",type(filestozip_list)) filestozip_list=updatedfilestozip json_string = json.dumps(filestozip_list) bytes_data = json_string.encode('utf-8') msgjson['filestozip'] =bytes_data - print("updated_message_bytes:",msgjson) return msgjson except (Exception) as error: print('error occured in redaction summary service: ', error) From 75a71e88ce03b9e41cc8ffb2ee3a6d28382682c3 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 8 Feb 2024 16:23:23 -0800 Subject: [PATCH 26/63] changes to handle consult. --- .../services/dal/documentpageflag.py | 50 ++++++++++---- .../services/dts/redactionsummary.py | 68 ++++++++++++------- 2 files changed, 81 insertions(+), 37 deletions(-) diff --git a/computingservices/DocumentServices/services/dal/documentpageflag.py b/computingservices/DocumentServices/services/dal/documentpageflag.py index 43e071b49..0a8ab7f49 100644 --- a/computingservices/DocumentServices/services/dal/documentpageflag.py +++ b/computingservices/DocumentServices/services/dal/documentpageflag.py @@ -12,7 +12,7 @@ def get_all_pageflags(cls): cursor = conn.cursor() cursor.execute( """select pageflagid, name, description from "Pageflags" - where isactive = true order by sortorder + where isactive = true and name not in ('Consult') order by sortorder """ ) @@ -32,6 +32,33 @@ def get_all_pageflags(cls): if conn is not None: conn.close() + @classmethod + def get_all_programareas(cls): + conn = getdbconnection() + programareas = {} + try: + cursor = conn.cursor() + cursor.execute( + """select programareaid, bcgovcode, iaocode from "ProgramAreas" + where isactive = true order by programareaid + """ + ) + + result = cursor.fetchall() + cursor.close() + if result is not None: + for entry in result: + programareas[entry[0]] = {"bcgovcode": entry[1], "iaocode": entry[2]} + return programareas + return None + + except Exception as error: + logging.error("Error in getting program areas") + logging.error(error) + raise + finally: + if conn is not None: + conn.close() @classmethod def get_documentpageflag(cls, ministryrequestid, redactionlayerid, documentids): @@ -127,23 +154,20 @@ def getpagecount_by_documentid(cls, ministryrequestid, documentids): conn.close() @classmethod - def getsections_by_documentid_pageno(cls, ministryrequestid, redactionlayerid, documentid, pagenos): + def getsections_by_documentid_pageno(cls, redactionlayerid, documentid, pagenos): conn = getdbconnection() sections = [] try: cursor = conn.cursor() cursor.execute( - """select a.pagenumber, as2."section" from "AnnotationSections" as2, - "Annotations" a - where as2.foiministryrequestid = %s::integer - and as2.isactive = true - and as2.annotationname = a.annotationname - and as2.redactionlayerid = a.redactionlayerid - and a.redactionlayerid = %s::integer - and a.documentid = %s::integer - and a.pagenumber in %s - order by a.pagenumber;""", - (ministryrequestid, redactionlayerid, documentid, tuple(pagenos)), + """select pagenumber , unnest(xpath('//contents/text()', annotation::xml))::text as sections + from "Annotations" a + where annotation like '%%freetext%%' and isactive = true + and redactionlayerid = %s::integer + and documentid = %s::integer + and pagenumber in %s + order by pagenumber;""", + (redactionlayerid, documentid, tuple(pagenos)), ) result = cursor.fetchall() diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 929122aa8..fef42f62c 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -9,11 +9,15 @@ def prepareredactionsummary(self, message, documentids): consolidated_redactions = [] for entry in redactionsummary['data']: consolidated_redactions += entry['sections'] - sortedredactions = sorted(consolidated_redactions, key=lambda x: int(str(x["range"]).split('-')[0])) + sortedredactions = sorted(consolidated_redactions, key=lambda x: self.__getrangenumber(x["range"])) return {"requestnumber": message.requestnumber, "data": sortedredactions} return redactionsummary - + def __getrangenumber(self, rangeval): + rangestart = str(rangeval).split('-')[0] + rangestart = str(rangestart).split('(')[0] + return int(rangestart) + def prepare_pkg_redactionsummary(self, message, documentids): try: redactionlayerid = message.redactionlayerid @@ -23,6 +27,7 @@ def prepare_pkg_redactionsummary(self, message, documentids): if totalpagecount <=0: return pageflags = documentpageflag().get_all_pageflags() + programareas = documentpageflag().get_all_programareas() summarydata = [] docpageflags = documentpageflag().get_documentpageflag(message.ministryrequestid, redactionlayerid, ordereddocids) @@ -36,9 +41,10 @@ def prepare_pkg_redactionsummary(self, message, documentids): docpageflag = docpageflags[docid] filteredpages = self.__get_pages_by_flagid(docpageflag["pageflag"], pagecount, pageflag["pageflagid"]) if len(filteredpages) > 0: - orginalpagenos = [pg['orginalpageno']for pg in filteredpages] - docpagesections = documentpageflag().getsections_by_documentid_pageno(message.ministryrequestid, redactionlayerid, docid, orginalpagenos) - pageredactions.extend(self.__get_pagesection_mapping(filteredpages, docpagesections)) + originalpagenos = [pg['originalpageno']for pg in filteredpages] + docpagesections = documentpageflag().getsections_by_documentid_pageno(redactionlayerid, docid, originalpagenos) + docpageconsults = self.__get_consults_by_pageno(programareas, docpageflag["pageflag"], filteredpages) + pageredactions.extend(self.__get_pagesection_mapping(filteredpages, docpagesections, docpageconsults)) pagecount = pagecount+stitchedpagedata[docid]["pagecount"] if len(pageredactions) > 0: _data["pagecount"] = len(pageredactions) @@ -48,6 +54,20 @@ def prepare_pkg_redactionsummary(self, message, documentids): except (Exception) as error: print('error occured in redaction summary service: ', error) + def __get_consults_by_pageno(self, programareas, docpageflag, pagenos): + consults = {} + for entry in docpageflag: + for pg in pagenos: + if entry['flagid'] == 4 and entry['page']-1 == pg['originalpageno']: + consults[pg['originalpageno']] = self.__format_consults(programareas,entry['programareaid']) + return consults + + def __format_consults(self, programareas, consultids): + formatted = [] + for cid in consultids: + formatted.append(programareas[cid]['iaocode']) + return ",".join(formatted) + def __get_documentids(self, message): summarydocuments = json.loads(message.summarydocuments) docids = [] @@ -57,29 +77,32 @@ def __get_documentids(self, message): def __format_redaction_summary(self, pageflag, pageredactions): totalpages = len(pageredactions) - _sortedpageumbers = sorted(pageredactions, key=lambda x: x["stitchedpageno"]) + _sorted_pageredactions = sorted(pageredactions, key=lambda x: x["stitchedpageno"]) #prepare ranges: Begin formatted = [] - range_start = 0 - range_end = 0 + range_start, range_end = 0, 0 range_sections = [] - for pgindex, pgentry in enumerate(_sortedpageumbers): - currentpg = _sortedpageumbers[pgindex] + range_consults = None + for pgindex, pgentry in enumerate(_sorted_pageredactions): + currentpg = _sorted_pageredactions[pgindex] nextindex = pgindex+1 if pgindex < totalpages-1 else pgindex - nextpg = _sortedpageumbers[nextindex] + nextpg = _sorted_pageredactions[nextindex] range_sections = currentpg["sections"] if range_start == 0 else range_sections - range_start = currentpg["stitchedpageno"] if range_start == 0 else range_start - if currentpg["stitchedpageno"]+1 == nextpg["stitchedpageno"]: + range_start = currentpg["stitchedpageno"] if range_start == 0 else range_start + range_consults = currentpg["consults"] + if currentpg["stitchedpageno"]+1 == nextpg["stitchedpageno"] and currentpg["consults"] == nextpg["consults"]: range_sections.extend(nextpg["sections"]) range_end = nextpg["stitchedpageno"] else: - rangepg = range_start if range_end == 0 else str(range_start)+" - "+str(range_end) + rangepg = str(range_start) if range_end == 0 else str(range_start)+" - "+str(range_end) + rangepg = rangepg if range_consults is None else rangepg+" ("+range_consults+")" formatted.append({"range": rangepg, "section": self.__formatsections(pageflag, range_sections)}) - range_start = 0 - range_end = 0 + range_start, range_end = 0, 0, + range_consults = None range_sections = [] #prepare ranges: End return formatted + def __formatsections(self, pageflag, sections): if pageflag in ("Duplicate", "Not Responsive"): @@ -87,27 +110,24 @@ def __formatsections(self, pageflag, sections): distinct_sections = list(set(sections)) return pageflag+" under "+", ".join(distinct_sections) - - - def __get_pagesection_mapping(self, docpages, docpagesections): + def __get_pagesection_mapping(self, docpages, docpagesections, docpageconsults): for entry in docpages: - entry["sections"] = self.__get_sections(docpagesections, entry['orginalpageno']) + entry["sections"] = self.__get_sections(docpagesections, entry['originalpageno']) + entry["consults"] = docpageconsults[entry['originalpageno']] if entry['originalpageno'] in docpageconsults else None return docpages def __get_sections(self, docpagesections, pageno): sections = [] filtered = [x for x in docpagesections if x['pageno'] == pageno] for dta in filtered: - _section = json.loads(dta['section']) - for sec in _section['ids']: - sections.append(sec["section"]) + sections +=dta['section'].split(",") return sections def __get_pages_by_flagid(self, _docpageflags, totalpages, flagid): pagenos = [] for x in _docpageflags: if x["flagid"] == flagid: - pagenos.append({'orginalpageno':x["page"]-1, 'stitchedpageno':x["page"]+totalpages}) + pagenos.append({'originalpageno':x["page"]-1, 'stitchedpageno':x["page"]+totalpages}) return pagenos def __calculate_totalpages(self, data): From cca24d027495b8aa339f0cfad32ba1fc2d170eca Mon Sep 17 00:00:00 2001 From: Aparna Date: Fri, 9 Feb 2024 10:53:28 -0800 Subject: [PATCH 27/63] change in naming convention --- .../DocumentServices/services/redactionsummaryservice.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index dfefde98e..d70f6900f 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -20,20 +20,18 @@ def processmessage(self,message): divisionid = entry['divisionid'] documentids = entry['documentids'] formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) - redline_redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary) + template_path='templates/'+documenttypename+'.docx' + redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,template_path) messageattributes= json.loads(message.attributes) s3uri = (next(item for item in messageattributes if item['divisionid'] == divisionid))['files'][0]['s3uripath'] - #messageattributes[0]['files'][0]['s3uripath'] - # Find the last occurrence of '/' last_slash_index = s3uri.rfind('/') - # Remove the filename and everything after it s3uri = s3uri[:last_slash_index] last_slash_index = s3uri.rfind('/') s3uri = s3uri[:last_slash_index + 1] divisionname= (next(item for item in messageattributes if item['divisionid'] == divisionid))['divisionname'] requestnumber=formattedsummary["requestnumber"] filename = f"{divisionname}/{requestnumber} - {category} - {divisionname} - summary.pdf" - uploadobj= uploadbytes(filename,redline_redaction_summary.content, s3uri) + uploadobj= uploadbytes(filename,redaction_summary.content, s3uri) upload_responses.append(uploadobj) if uploadobj["uploadresponse"].status_code == 200: summaryuploaderror= False From cdd5c3255d917c88691a897992964fd360556d7e Mon Sep 17 00:00:00 2001 From: Aparna Date: Fri, 9 Feb 2024 13:58:06 -0800 Subject: [PATCH 28/63] Update docker-compose --- docker-compose.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 86c12966b..c6e616c93 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -78,10 +78,6 @@ services: - DOCUMENTSERVICE_REDIS_PASSWORD=${DEDUPE_REDIS_PASSWORD} - DOCUMENTSERVICE_REDIS_PORT=${DEDUPE_REDIS_PORT} - DOCUMENTSERVICE_STREAM_KEY=${DOCUMENTSERVICE_STREAM_KEY} - - CDOGS_BASE_URL=${CDOGS_BASE_URL} - - CDOGS_TOKEN_URL=${CDOGS_TOKEN_URL} - - CDOGS_SERVICE_CLIENT=${CDOGS_SERVICE_CLIENT} - - CDOGS_SERVICE_CLIENT_SECRET=${CDOGS_SERVICE_CLIENT_SECRET} - BATCH_CONFIG=${BATCH_CONFIG} - REDLINE_SINGLE_PKG_MINISTRIES=${REDLINE_SINGLE_PKG_MINISTRIES} @@ -274,7 +270,10 @@ services: - DOCUMENTSERVICE_S3_REGION=${DOCUMENTSERVICE_S3_REGION} - DOCUMENTSERVICE_S3_SERVICE=${DOCUMENTSERVICE_S3_SERVICE} - DOCUMENTSERVICE_S3_ENV=${DOCUMENTSERVICE_S3_ENV} - + - CDOGS_BASE_URL=${CDOGS_BASE_URL} + - CDOGS_TOKEN_URL=${CDOGS_TOKEN_URL} + - CDOGS_SERVICE_CLIENT=${CDOGS_SERVICE_CLIENT} + - CDOGS_SERVICE_CLIENT_SECRET=${CDOGS_SERVICE_CLIENT_SECRET} From 706be1e63fb85fae0ebc2949f5a4bbf356481658 Mon Sep 17 00:00:00 2001 From: Aparna Date: Fri, 9 Feb 2024 14:13:48 -0800 Subject: [PATCH 29/63] Debug code and docker update --- .../DocumentServices/services/redactionsummaryservice.py | 1 + docker-compose.yml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index d70f6900f..f1fa355d6 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -21,6 +21,7 @@ def processmessage(self,message): documentids = entry['documentids'] formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) template_path='templates/'+documenttypename+'.docx' + print("template_path:",template_path) redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,template_path) messageattributes= json.loads(message.attributes) s3uri = (next(item for item in messageattributes if item['divisionid'] == divisionid))['files'][0]['s3uripath'] diff --git a/docker-compose.yml b/docker-compose.yml index c6e616c93..e5324a0be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -274,6 +274,11 @@ services: - CDOGS_TOKEN_URL=${CDOGS_TOKEN_URL} - CDOGS_SERVICE_CLIENT=${CDOGS_SERVICE_CLIENT} - CDOGS_SERVICE_CLIENT_SECRET=${CDOGS_SERVICE_CLIENT_SECRET} + - FOI_DB_HOST=${FOI_DB_HOST} + - FOI_DB_NAME=${FOI_DB_NAME} + - FOI_DB_PORT=${FOI_DB_PORT} + - FOI_DB_USER=${FOI_DB_USER} + - FOI_DB_PASSWORD=${FOI_DB_PASSWORD} From 2fca85c86bedeb4b0ca7514a4a172bfca6d7d07e Mon Sep 17 00:00:00 2001 From: Aparna Date: Fri, 9 Feb 2024 14:38:30 -0800 Subject: [PATCH 30/63] Debug codes --- .../DocumentServices/services/cdogsapiservice.py | 2 ++ .../DocumentServices/services/documentgenerationservice.py | 1 + .../DocumentServices/services/redactionsummaryservice.py | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/computingservices/DocumentServices/services/cdogsapiservice.py b/computingservices/DocumentServices/services/cdogsapiservice.py index d634c1483..78a042c98 100644 --- a/computingservices/DocumentServices/services/cdogsapiservice.py +++ b/computingservices/DocumentServices/services/cdogsapiservice.py @@ -23,11 +23,13 @@ def generate_pdf(self, template_hash_code, data, access_token): "data": data } json_request_body = json.dumps(request_body) + print("json_request_body:",json_request_body) headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}' } url = f"{cdogs_base_url}/api/v2/template/{template_hash_code}/render" + print("url:",url) return self._post_generate_pdf(json_request_body, headers, url) def _post_generate_pdf(self, json_request_body, headers, url): diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index 053439663..49903e02e 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -35,6 +35,7 @@ class documentgenerationservice: def generate_pdf(self, documenttypename, data, template_path='templates/redline_redaction_summary.docx'): access_token= cdogsapiservice()._get_access_token() + print("created access token") template_cached = False templatefromdb= self.__gettemplate(documenttypename) print("\n***templatefromdb:",templatefromdb) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index f1fa355d6..922b3e67e 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -20,18 +20,22 @@ def processmessage(self,message): divisionid = entry['divisionid'] documentids = entry['documentids'] formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) + print("formattedsummary:",formattedsummary) template_path='templates/'+documenttypename+'.docx' print("template_path:",template_path) redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,template_path) + print("redaction_summary:",redaction_summary) messageattributes= json.loads(message.attributes) s3uri = (next(item for item in messageattributes if item['divisionid'] == divisionid))['files'][0]['s3uripath'] last_slash_index = s3uri.rfind('/') s3uri = s3uri[:last_slash_index] last_slash_index = s3uri.rfind('/') s3uri = s3uri[:last_slash_index + 1] + print("s3uri:",s3uri) divisionname= (next(item for item in messageattributes if item['divisionid'] == divisionid))['divisionname'] requestnumber=formattedsummary["requestnumber"] filename = f"{divisionname}/{requestnumber} - {category} - {divisionname} - summary.pdf" + print("filename:",filename) uploadobj= uploadbytes(filename,redaction_summary.content, s3uri) upload_responses.append(uploadobj) if uploadobj["uploadresponse"].status_code == 200: From 890d105ad2d5657a0332e363f94a696b840d4bbe Mon Sep 17 00:00:00 2001 From: Aparna Date: Fri, 9 Feb 2024 15:25:59 -0800 Subject: [PATCH 31/63] More debug codes --- .../DocumentServices/services/redactionsummaryservice.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 922b3e67e..44203335a 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -25,9 +25,14 @@ def processmessage(self,message): print("template_path:",template_path) redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,template_path) print("redaction_summary:",redaction_summary) - messageattributes= json.loads(message.attributes) + messageattributes= json.loads(message.attributes) + print("messageattributes:",messageattributes) + print("divisionwise:",(next(item for item in messageattributes if item['divisionid'] == divisionid))) + print("divisionwise-files:",(next(item for item in messageattributes if item['divisionid'] == divisionid))['files']) s3uri = (next(item for item in messageattributes if item['divisionid'] == divisionid))['files'][0]['s3uripath'] + print("s3uri1:",s3uri) last_slash_index = s3uri.rfind('/') + print("last_slash_index:",last_slash_index) s3uri = s3uri[:last_slash_index] last_slash_index = s3uri.rfind('/') s3uri = s3uri[:last_slash_index + 1] From a0f30069bdaa0c74803f315f8737e23b692546fa Mon Sep 17 00:00:00 2001 From: Aparna Date: Fri, 9 Feb 2024 16:16:19 -0800 Subject: [PATCH 32/63] debug code for attribute check --- .../DocumentServices/services/redactionsummaryservice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 44203335a..8486fe55d 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -25,6 +25,8 @@ def processmessage(self,message): print("template_path:",template_path) redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,template_path) print("redaction_summary:",redaction_summary) + print("attr:",message.attributes) + print("attr-type:",type(message.attributes)) messageattributes= json.loads(message.attributes) print("messageattributes:",messageattributes) print("divisionwise:",(next(item for item in messageattributes if item['divisionid'] == divisionid))) From 3f53179bac835beb8c57f0a65ac1dbaff37bd12f Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Fri, 9 Feb 2024 16:34:27 -0800 Subject: [PATCH 33/63] Changes for converted documents --- .../services/dal/documentpageflag.py | 13 ++++++------- .../services/dts/redactionsummary.py | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/computingservices/DocumentServices/services/dal/documentpageflag.py b/computingservices/DocumentServices/services/dal/documentpageflag.py index 0a8ab7f49..934a93a86 100644 --- a/computingservices/DocumentServices/services/dal/documentpageflag.py +++ b/computingservices/DocumentServices/services/dal/documentpageflag.py @@ -97,14 +97,13 @@ def get_documents_lastmodified(cls, ministryrequestid, documentids): try: cursor = conn.cursor() cursor.execute( - """select d.documentid from "Documents" d, - "DocumentAttributes" da - where d.documentmasterid = da.documentmasterid - and da.isactive = true + """select d.documentid from "Documents" d join "DocumentMaster" dm on d.foiministryrequestid = dm.ministryrequestid and d.documentmasterid = dm.documentmasterid + join "DocumentAttributes" da on (da.documentmasterid = d.documentmasterid or da.documentmasterid = dm.processingparentid) + where documentid in %s and d.foiministryrequestid = %s::integer - and d.documentid in %s - order by da."attributes" ->> \'lastmodified\';""", - (ministryrequestid, tuple(documentids)), + group by d.documentid, da."attributes" ->> 'lastmodified' ::text + order by da."attributes" ->> 'lastmodified'""", + (tuple(documentids),ministryrequestid), ) result = cursor.fetchall() diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index fef42f62c..845b879ea 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -108,7 +108,7 @@ def __formatsections(self, pageflag, sections): if pageflag in ("Duplicate", "Not Responsive"): return pageflag distinct_sections = list(set(sections)) - return pageflag+" under "+", ".join(distinct_sections) + return pageflag+" under "+", ".join(distinct_sections) if len(distinct_sections) > 0 else pageflag def __get_pagesection_mapping(self, docpages, docpagesections, docpageconsults): for entry in docpages: @@ -120,7 +120,7 @@ def __get_sections(self, docpagesections, pageno): sections = [] filtered = [x for x in docpagesections if x['pageno'] == pageno] for dta in filtered: - sections +=dta['section'].split(",") + sections += [x.strip() for x in dta['section'].split(",")] return sections def __get_pages_by_flagid(self, _docpageflags, totalpages, flagid): From 5349dfe8ad602dd2bdfd315062927d83ae389bc7 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Fri, 9 Feb 2024 16:34:27 -0800 Subject: [PATCH 34/63] Changes for converted documents --- .../services/dal/documentpageflag.py | 13 ++++++------- .../services/dts/redactionsummary.py | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/computingservices/DocumentServices/services/dal/documentpageflag.py b/computingservices/DocumentServices/services/dal/documentpageflag.py index 0a8ab7f49..934a93a86 100644 --- a/computingservices/DocumentServices/services/dal/documentpageflag.py +++ b/computingservices/DocumentServices/services/dal/documentpageflag.py @@ -97,14 +97,13 @@ def get_documents_lastmodified(cls, ministryrequestid, documentids): try: cursor = conn.cursor() cursor.execute( - """select d.documentid from "Documents" d, - "DocumentAttributes" da - where d.documentmasterid = da.documentmasterid - and da.isactive = true + """select d.documentid from "Documents" d join "DocumentMaster" dm on d.foiministryrequestid = dm.ministryrequestid and d.documentmasterid = dm.documentmasterid + join "DocumentAttributes" da on (da.documentmasterid = d.documentmasterid or da.documentmasterid = dm.processingparentid) + where documentid in %s and d.foiministryrequestid = %s::integer - and d.documentid in %s - order by da."attributes" ->> \'lastmodified\';""", - (ministryrequestid, tuple(documentids)), + group by d.documentid, da."attributes" ->> 'lastmodified' ::text + order by da."attributes" ->> 'lastmodified'""", + (tuple(documentids),ministryrequestid), ) result = cursor.fetchall() diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index fef42f62c..845b879ea 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -108,7 +108,7 @@ def __formatsections(self, pageflag, sections): if pageflag in ("Duplicate", "Not Responsive"): return pageflag distinct_sections = list(set(sections)) - return pageflag+" under "+", ".join(distinct_sections) + return pageflag+" under "+", ".join(distinct_sections) if len(distinct_sections) > 0 else pageflag def __get_pagesection_mapping(self, docpages, docpagesections, docpageconsults): for entry in docpages: @@ -120,7 +120,7 @@ def __get_sections(self, docpagesections, pageno): sections = [] filtered = [x for x in docpagesections if x['pageno'] == pageno] for dta in filtered: - sections +=dta['section'].split(",") + sections += [x.strip() for x in dta['section'].split(",")] return sections def __get_pages_by_flagid(self, _docpageflags, totalpages, flagid): From b40f58180d844ad8044a49e57f2caf0fe8ea801b Mon Sep 17 00:00:00 2001 From: Aparna Date: Mon, 12 Feb 2024 10:13:52 -0800 Subject: [PATCH 35/63] Fix for division name --- .../rstreamio/reader/documentservicestreamreader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py index 51185bc06..a4a609bfc 100644 --- a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -44,7 +44,7 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): print(f"processing {message_id}::{message}") if message is not None: _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) - _message = _message.replace("b'","'").replace("'",'') + _message = _message.replace("b'","'") try: filestozip= redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) msgjson= redactionsummaryservice().updatefilestozip(filestozip, _message) From c7d00e476d3752324ec5e7f9d0e50c315c2f36af Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Mon, 12 Feb 2024 15:46:14 -0800 Subject: [PATCH 36/63] json message structural changes. --- .../message/schemas/redactionsummary.py | 40 ++++++++++-- .../reader/documentservicestreamreader.py | 15 +++-- ...templateservice.py => documenttemplate.py} | 25 +++++++- .../services/dal/documenttypeservice.py | 30 --------- .../services/dal/pdfstitchjobactivity.py | 15 +++-- .../services/documentgenerationservice.py | 14 ++-- .../services/dts/redactionsummary.py | 5 +- .../services/redactionsummaryservice.py | 64 +++++++------------ .../services/s3documentservice.py | 39 ----------- .../services/zippingservice.py | 25 ++++++++ 10 files changed, 129 insertions(+), 143 deletions(-) rename computingservices/DocumentServices/services/dal/{documenttemplateservice.py => documenttemplate.py} (67%) delete mode 100644 computingservices/DocumentServices/services/dal/documenttypeservice.py create mode 100644 computingservices/DocumentServices/services/zippingservice.py diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py index a00b2ca2b..a3516df9d 100644 --- a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py +++ b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py @@ -9,7 +9,28 @@ __author__ = "sumathi.thirumani@aot-technologies.com" """ + + +class FileSchema(Schema): + class Meta: + unknown = EXCLUDE + filename = fields.Str(data_key="filename",allow_none=False) + s3uripath = fields.Str(data_key="s3uripath",allow_none=False) + +class SummarySchema(Schema): + divisionid = fields.Int(data_key="divisionid", allow_none=True) + documentids = fields.List(fields.Int()) + +class AttributeSchema(Schema): + class Meta: + unknown = EXCLUDE + divisionid = fields.Int(data_key="divisionid",allow_none=True) + files = fields.List(fields.Nested(FileSchema, allow_none=True)) + divisionname = fields.Str(data_key="divisionname",allow_none=True) + class RedactionSummaryIncomingSchema(Schema): + class Meta: + unknown = EXCLUDE jobid = fields.Int(data_key="jobid",allow_none=False) requestid = fields.Int(data_key="requestid",allow_none=False) ministryrequestid = fields.Int(data_key="ministryrequestid",allow_none=False) @@ -17,16 +38,23 @@ class RedactionSummaryIncomingSchema(Schema): requestnumber = fields.Str(data_key="requestnumber",allow_none=False) bcgovcode = fields.Str(data_key="bcgovcode",allow_none=False) createdby = fields.Str(data_key="createdby",allow_none=False) - filestozip = fields.Str(data_key="filestozip",allow_none=False) + filestozip = fields.List(fields.Nested(FileSchema, allow_none=True)) finaloutput = fields.Str(data_key="finaloutput",allow_none=False) - attributes = fields.Str(data_key="attributes",allow_none=False) - summarydocuments = fields.Str(data_key="summarydocuments",allow_none=False) + attributes = fields.List(fields.Nested(AttributeSchema, allow_none=True)) + summarydocuments = fields.List(fields.Nested(SummarySchema, allow_none=True)) redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) -def get_in_redactionsummary_msg(producer_json): - messageobject = RedactionSummaryIncomingSchema().load(__formatmsg(producer_json)) + +def get_in_redactionsummary_msg(producer_json): + messageobject = RedactionSummaryIncomingSchema().load(__formatmsg(producer_json), unknown=EXCLUDE) return dict2obj(messageobject) def __formatmsg(producer_json): j = json.loads(producer_json) - return j \ No newline at end of file + return j + +def decodesummarymsg(_message): + _message = _message.encode().decode('unicode-escape') + _message = _message.replace("b'","'").replace('"\'','"').replace('\'"','"') + _message = _message.replace('"[','[').replace(']"',"]").replace("\\","") + return _message \ No newline at end of file diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py index 51185bc06..c41258477 100644 --- a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -6,9 +6,10 @@ from enum import Enum from utils import redisstreamdb from utils.foidocumentserviceconfig import documentservice_stream_key -from rstreamio.message.schemas.redactionsummary import get_in_redactionsummary_msg +from rstreamio.message.schemas.redactionsummary import get_in_redactionsummary_msg, decodesummarymsg from services.redactionsummaryservice import redactionsummaryservice -from rstreamio.writer.zipperstreamwriter import zipperstreamwriter +from services.zippingservice import zippingservice + LAST_ID_KEY = "{consumer_id}:lastid" BLOCK_TIME = 5000 @@ -44,15 +45,15 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): print(f"processing {message_id}::{message}") if message is not None: _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) - _message = _message.replace("b'","'").replace("'",'') + _message = decodesummarymsg(_message) try: - filestozip= redactionsummaryservice().processmessage(get_in_redactionsummary_msg(_message)) - msgjson= redactionsummaryservice().updatefilestozip(filestozip, _message) - zipperstreamwriter().sendmessage(msgjson) + redactionsummary_message = get_in_redactionsummary_msg(_message) + summaryfiles = redactionsummaryservice().processmessage(redactionsummary_message) + zippingservice().sendtozipper(summaryfiles, _message) except(Exception) as error: logging.exception(error) # simulate processing - time.sleep(random.randint(1, 3)) #TODO : todo: remove! + time.sleep(random.randint(1, 3)) last_id = message_id rdb.set(LAST_ID_KEY.format(consumer_id=consumer_id), last_id) print(f"finished processing {message_id}") diff --git a/computingservices/DocumentServices/services/dal/documenttemplateservice.py b/computingservices/DocumentServices/services/dal/documenttemplate.py similarity index 67% rename from computingservices/DocumentServices/services/dal/documenttemplateservice.py rename to computingservices/DocumentServices/services/dal/documenttemplate.py index 6cd182874..c3ba41ad3 100644 --- a/computingservices/DocumentServices/services/dal/documenttemplateservice.py +++ b/computingservices/DocumentServices/services/dal/documenttemplate.py @@ -3,7 +3,7 @@ import json -class documenttemplateservice: +class documenttemplate: @classmethod def gettemplatebytype(cls, documenttypeid, extension= "docx"): @@ -43,6 +43,29 @@ def updatecdogshashcode(cls, documenttypeid, cdogshashcode): except(Exception) as error: print("Exception while executing func updatecdogshashcode, Error : {0} ".format(error)) raise + finally: + cursor.close() + if conn is not None: + conn.close() + + @classmethod + def getdocumenttypebyname(cls, document_type_name): + conn = getfoidbconnection() + try: + cursor = conn.cursor() + query = ''' + SELECT * + FROM public."DocumentTypes" + WHERE document_type_name = %s; + ''' + parameters = (document_type_name,) + cursor.execute(query, parameters) + documenttemplate = cursor.fetchone()[0] + return documenttemplate + except Exception as error: + logging.error("Error in getdocumenttypebyname") + logging.error(error) + raise finally: cursor.close() if conn is not None: diff --git a/computingservices/DocumentServices/services/dal/documenttypeservice.py b/computingservices/DocumentServices/services/dal/documenttypeservice.py deleted file mode 100644 index d42da3875..000000000 --- a/computingservices/DocumentServices/services/dal/documenttypeservice.py +++ /dev/null @@ -1,30 +0,0 @@ -from utils import getfoidbconnection -import logging -import json - - -class documenttypeservice: - - @classmethod - def getdocumenttypebyname(cls, document_type_name): - conn = getfoidbconnection() - try: - cursor = conn.cursor() - query = ''' - SELECT * - FROM public."DocumentTypes" - WHERE document_type_name = %s; - ''' - parameters = (document_type_name,) - cursor.execute(query, parameters) - documenttemplate = cursor.fetchone()[0] - return documenttemplate - except Exception as error: - logging.error("Error in getdocumenttypebyname") - logging.error(error) - raise - finally: - cursor.close() - if conn is not None: - conn.close() - \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py b/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py index 8bb0b616b..eae1279a8 100644 --- a/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py +++ b/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py @@ -2,17 +2,18 @@ import logging import json +def to_json(obj): + return json.dumps(obj, default=lambda obj: obj.__dict__) class pdfstitchjobactivity: - + @classmethod def recordjobstatus(cls,message,version,status,error=None,errormessage=None): category = message.category.lower() + "-summary" conn = getdbconnection() - print("Inside %s recordjobstatus", category) try: cursor = conn.cursor() status = "error" if error else status - + cursor.execute( """INSERT INTO public."PDFStitchJob" (pdfstitchjobid,version, ministryrequestid, category, inputfiles, status, message, createdby) @@ -22,7 +23,8 @@ def recordjobstatus(cls,message,version,status,error=None,errormessage=None): version, message.ministryrequestid, category, - json.dumps(message.attributes), + to_json(message.attributes), + #json.dumps(message.attributes, default=obj_dict), status, errormessage if error else None, message.createdby, @@ -32,9 +34,10 @@ def recordjobstatus(cls,message,version,status,error=None,errormessage=None): conn.commit() cursor.close() except Exception as error: - logging.error("Error in recordjobend") + logging.error("Error in recordjobstatus") logging.error(error) raise finally: if conn is not None: - conn.close() \ No newline at end of file + conn.close() + diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index 49903e02e..ed9b9a39e 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -1,6 +1,5 @@ #from reviewer_api.services.cdogs_api_service import cdogsapiservice -from services.dal.documenttemplateservice import documenttemplateservice -from services.dal.documenttypeservice import documenttypeservice +from services.dal.documenttemplate import documenttemplate from .cdogsapiservice import cdogsapiservice import json import logging @@ -35,31 +34,26 @@ class documentgenerationservice: def generate_pdf(self, documenttypename, data, template_path='templates/redline_redaction_summary.docx'): access_token= cdogsapiservice()._get_access_token() - print("created access token") template_cached = False templatefromdb= self.__gettemplate(documenttypename) - print("\n***templatefromdb:",templatefromdb) if templatefromdb is not None and templatefromdb["cdogs_hash_code"] is not None: - print('Checking if template %s is cached', templatefromdb["cdogs_hash_code"]) template_cached = cdogsapiservice().check_template_cached(templatefromdb["cdogs_hash_code"], access_token) templatecdogshashcode = templatefromdb["cdogs_hash_code"] if templatefromdb is None or templatefromdb["cdogs_hash_code"] is None or not template_cached: templatecdogshashcode = cdogsapiservice().upload_template(template_path, access_token) templatefromdb["cdogs_hash_code"] = templatecdogshashcode - print('Uploading new template--->',templatecdogshashcode) if templatefromdb is not None and templatefromdb["document_type_id"] is not None: - documenttemplateservice().updatecdogshashcode(templatefromdb["document_type_id"], templatefromdb["cdogs_hash_code"]) - print('Generating redaction summary') + documenttemplate().updatecdogshashcode(templatefromdb["document_type_id"], templatefromdb["cdogs_hash_code"]) return cdogsapiservice().generate_pdf(templatecdogshashcode, data,access_token) def __gettemplate(self,documenttypename='redline_redaction_summary'): try: templatefromdb=None summary_cdogs_hash_code=None - summary_document_type_id =documenttypeservice().getdocumenttypebyname(documenttypename) + summary_document_type_id =documenttemplate().getdocumenttypebyname(documenttypename) if summary_document_type_id is not None: - summary_cdogs_hash_code=documenttemplateservice().gettemplatebytype(summary_document_type_id) + summary_cdogs_hash_code=documenttemplate().gettemplatebytype(summary_document_type_id) templatefromdb = {"document_type_id": summary_document_type_id, "cdogs_hash_code":summary_cdogs_hash_code} return templatefromdb except (Exception) as error: diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 845b879ea..688a532f0 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -1,5 +1,4 @@ from services.dal.documentpageflag import documentpageflag -import json class redactionsummary(): @@ -69,10 +68,10 @@ def __format_consults(self, programareas, consultids): return ",".join(formatted) def __get_documentids(self, message): - summarydocuments = json.loads(message.summarydocuments) + summarydocuments = message.summarydocuments docids = [] for entry in summarydocuments: - docids = docids + entry['documentids'] + docids = docids + entry.documentids return docids def __format_redaction_summary(self, pageflag, pageredactions): diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 8486fe55d..523c0b818 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -10,39 +10,33 @@ class redactionsummaryservice(): def processmessage(self,message): try: - filestozip=[] + summaryfilestozip = [] pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") - divisiondocuments = json.loads(message.summarydocuments) + divisiondocuments = message.summarydocuments category = message.category - documenttypename= category+"_redaction_summary" + documenttypename= category+"_redaction_summary" if category == 'responsepackage' else "redline_redaction_summary" + print('documenttypename', documenttypename) upload_responses=[] for entry in divisiondocuments: - divisionid = entry['divisionid'] - documentids = entry['documentids'] + divisionid = entry.divisionid + documentids = entry.documentids formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) - print("formattedsummary:",formattedsummary) + print('formattedsummary', formattedsummary) template_path='templates/'+documenttypename+'.docx' - print("template_path:",template_path) redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,template_path) - print("redaction_summary:",redaction_summary) - print("attr:",message.attributes) - print("attr-type:",type(message.attributes)) - messageattributes= json.loads(message.attributes) - print("messageattributes:",messageattributes) - print("divisionwise:",(next(item for item in messageattributes if item['divisionid'] == divisionid))) - print("divisionwise-files:",(next(item for item in messageattributes if item['divisionid'] == divisionid))['files']) - s3uri = (next(item for item in messageattributes if item['divisionid'] == divisionid))['files'][0]['s3uripath'] - print("s3uri1:",s3uri) - last_slash_index = s3uri.rfind('/') - print("last_slash_index:",last_slash_index) - s3uri = s3uri[:last_slash_index] - last_slash_index = s3uri.rfind('/') - s3uri = s3uri[:last_slash_index + 1] - print("s3uri:",s3uri) - divisionname= (next(item for item in messageattributes if item['divisionid'] == divisionid))['divisionname'] - requestnumber=formattedsummary["requestnumber"] - filename = f"{divisionname}/{requestnumber} - {category} - {divisionname} - summary.pdf" - print("filename:",filename) + messageattributes= message.attributes + if category == 'redline' : + filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] + else: + filesobj= messageattributes[0].files[0] + + stitcheddocs3uri = filesobj.s3uripath + stitcheddocfilename = filesobj.filename + last_slash_index = stitcheddocs3uri.rfind('/') + stitcheddocs3uri = stitcheddocs3uri[:last_slash_index] + last_slash_index = stitcheddocs3uri.rfind('/') + s3uri = stitcheddocs3uri[:last_slash_index + 1] + filename = stitcheddocfilename.replace(".pdf","- summary.pdf") uploadobj= uploadbytes(filename,redaction_summary.content, s3uri) upload_responses.append(uploadobj) if uploadobj["uploadresponse"].status_code == 200: @@ -52,24 +46,12 @@ def processmessage(self,message): summaryuploaderror= True summaryuploaderrormsg = uploadobj.uploadresponse.text pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryuploaded",summaryuploaderror,summaryuploaderrormsg) - filestozip= json.loads(message.filestozip) - filestozip.append({"filename": uploadobj["filename"], "s3uripath":uploadobj["documentpath"]}) - return filestozip + summaryfilestozip.append({"filename": uploadobj["filename"], "s3uripath":uploadobj["documentpath"]}) + return summaryfilestozip except (Exception) as error: print('error occured in redaction summary service: ', error) - def updatefilestozip(self,updatedfilestozip, _message): - try: - msgjson= json.loads(_message) - filestozip_list = msgjson['filestozip'] - filestozip_list = json.loads(filestozip_list) - filestozip_list=updatedfilestozip - json_string = json.dumps(filestozip_list) - bytes_data = json_string.encode('utf-8') - msgjson['filestozip'] =bytes_data - return msgjson - except (Exception) as error: - print('error occured in redaction summary service: ', error) + diff --git a/computingservices/DocumentServices/services/s3documentservice.py b/computingservices/DocumentServices/services/s3documentservice.py index 83675c92c..bf5c5f8b7 100644 --- a/computingservices/DocumentServices/services/s3documentservice.py +++ b/computingservices/DocumentServices/services/s3documentservice.py @@ -28,39 +28,11 @@ def getcredentialsbybucketname(bucketname): return s3cred - -# def gets3documentbytearray(producermessage, s3credentials): -# retry = 0 -# filepath = producermessage.s3uripath -# while True: -# try: -# s3_access_key_id= s3credentials.s3accesskey -# s3_secret_access_key= s3credentials.s3secretkey - -# auth = AWSRequestsAuth(aws_access_key=s3_access_key_id, -# aws_secret_access_key=s3_secret_access_key, -# aws_host=pdfstitch_s3_host, -# aws_region=pdfstitch_s3_region, -# aws_service=pdfstitch_s3_service) -# response= requests.get(filepath, auth=auth,stream=True) -# return response.content -# except Exception as ex: -# if retry > int(pdfstitch_failureattempt): -# logging.error("Error in connecting S3.") -# logging.error(ex) -# raise -# retry += 1 -# continue - - def uploadbytes(filename, filebytes, s3uri): bucketname= s3uri.split("/")[3] - print("\n**bucketname:",bucketname) s3credentials= getcredentialsbybucketname(bucketname) s3_access_key_id= s3credentials.s3accesskey s3_secret_access_key= s3credentials.s3secretkey - print("\n\ns3_secret_access_key:",s3_secret_access_key) - #formsbucket = bcgovcode.lower()+'-'+pdfstitch_s3_env.lower()+'-e' retry = 0 while True: try: @@ -69,16 +41,8 @@ def uploadbytes(filename, filebytes, s3uri): aws_host=docservice_s3_host, aws_region=docservice_s3_region, aws_service=docservice_s3_service) - print("\n*****s3_access_key_id:",s3_access_key_id) - print("\n*****s3_secret_access_key:",s3_secret_access_key) - print("\n*****docservice_db_host:",docservice_s3_host) - print("\n*****docservice_s3_region:",docservice_s3_region) - print("\n*****docservice_s3_service:",docservice_s3_service) - #s3uri = 'https://{0}/{1}/{2}/{3}'.format(pdfstitch_s3_host,formsbucket, requestnumber, filename) s3uri= s3uri+filename - print("\n\ns3uri before frst PUT:",s3uri) response = requests.put(s3uri, data=None, auth=auth) - print("\n***response for header:",response.request.headers) header = { 'X-Amz-Date': response.request.headers['x-amz-date'], 'Authorization': response.request.headers['Authorization'], @@ -86,11 +50,8 @@ def uploadbytes(filename, filebytes, s3uri): } #upload to S3 - print("\n\ns3uriNOW after:",s3uri) uploadresponse= requests.put(s3uri, data=filebytes, headers=header) - print("***uploadresponse--->",uploadresponse) uploadobj = {"uploadresponse": uploadresponse, "filename": filename, "documentpath": s3uri} - #print("\n\nattachmentobjNOW:",attachmentobj) return uploadobj except Exception as ex: if retry > int(docservice_failureattempt): diff --git a/computingservices/DocumentServices/services/zippingservice.py b/computingservices/DocumentServices/services/zippingservice.py new file mode 100644 index 000000000..7bbb38982 --- /dev/null +++ b/computingservices/DocumentServices/services/zippingservice.py @@ -0,0 +1,25 @@ + +import json +from rstreamio.writer.zipperstreamwriter import zipperstreamwriter + +class zippingservice(): + + def sendtozipper(self, summaryfiles, message): + updatedmessage = zippingservice().preparemessageforzipperservice(summaryfiles, message) + print('updatedmessage',updatedmessage) + zipperstreamwriter().sendmessage(updatedmessage) + + def preparemessageforzipperservice(self,updatedfilestozip, message): + try: + msgjson= json.loads(message) + filestozip_list = msgjson['filestozip']+updatedfilestozip + msgjson['filestozip'] = self.to_json(filestozip_list) + msgjson['attributes'] = self.to_json(msgjson['attributes']) + msgjson['summarydocuments'] = self.to_json(msgjson['summarydocuments']) + return msgjson + except (Exception) as error: + print('error occured in redaction summary service: ', error) + + def to_json(self, obj): + return json.dumps(obj, default=lambda obj: obj.__dict__) + From 4085f0106828087d58952e6c8c565e3607ec9ec8 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Mon, 12 Feb 2024 15:51:55 -0800 Subject: [PATCH 37/63] template changes - review comments --- .../templates/redline_redaction_summary.docx | Bin 44180 -> 143824 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/computingservices/DocumentServices/templates/redline_redaction_summary.docx b/computingservices/DocumentServices/templates/redline_redaction_summary.docx index 51e64b5a865f38348bd7dfd44cd5b6011f478ff7..27e6d3115b5729bf5855812d1600318f60329857 100644 GIT binary patch literal 143824 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 M3m1?BUP(az4^*bKumAu6 delta 22786 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 boNW&M121V2ABHdx2tl7n=s&-ab6ER7yuNs@ From a61ba179a3c870f070b1fb3a54438c515099bec2 Mon Sep 17 00:00:00 2001 From: Aparna Date: Mon, 12 Feb 2024 20:42:59 -0800 Subject: [PATCH 38/63] Updated summary templates --- .../responsepackage_redaction_summary.docx | Bin 43510 -> 140643 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx b/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx index 4f58253de1a08b298b387cfc2239a09231e1dd2c..f7d69416340190f8d60516788ead09bd23f11169 100644 GIT binary patch literal 140643 zcmeFZ1y>y1wl0hYmtesy5Zn?7?hZk_ad&qMF2M;B+}#>?cXxMpmjn$E;A`G<_uk~( zGsgD=&Yfd)RYR|yvuaIQ&wN&ayficn7Q`C}cnAmxG6;72)8D<25D-L&5D=IU@K74U zHr9?t){Z(rS6d?oEyk}_mZaG*P}G?aP~h?ZPyQFrz(~B7#WFKi;5pI*nppjN<)sJ( zsZ{Ng?JByGZ)-(UcI5d?xiK|&x7<~j0Co1Uc(PYuEH#Iw z#RHUmVzkZb3m3|l&ts63DX?S_wuyk2&>>o*{HY_>?2w9r<_WZQBFG7;RE;oniigk~ zOCZl0s6#f!ujm)`su27sviuH*M1I`}#%P~2JOk8Aka5b_9Yq$JnOka_0%sbEYsWrWP#7G8`Ut7@#GHTe}{ zW3iKO)m8v|Nj!j>u8mc>^ta1bsbllC@e_yD8o}B^QjYa=v8xf-OQ*jdICf~W>Rsk+ z!*y-4(GIUnQ^!~z1VvC*6ZoSxPl%XP+o1#Ho>Q{!m@uu8bL*e!G}br23Q%<7LTKy@ z`olFmbK>`6UJ6DnxjPc~H-wM5p+lwOhv@C|1XsXhkrJ;bYopin!L4>v-)q{2Qr3_kis7yd{fY(L3Ph-)S-+swL!$6T=xe* z3D2dp63x=}vwl_StfCgIoL)mNE8b{yRbBCu5*nL0AX2g2fJwQ((0}ZCFKI3Hh#ozJ zl|XwS+C`*4#j7C|fOc{rbDTpt*uS7h`Y1%ST|{rg{A4V^t5;MCBDEgHF5E-^ja6r} zEO^;E&pj*~!QziUOKwZ-!eTHdj)W86uUT}iS_k6 zB$1b67CUuGsEa7=x-BH6>OLhtw<)dih^ob7*?g!n>)=UVB`I#_Y6^|L+LpWZUDt@A zxX%9BGM-`gNQ|&*x)%_3`7~aCBXE2>HG*IgK@zaj@+>g*Bxm#VR8Ml=S3RHwOEKaG z@iu?Ed4czwshXY`EeO<1;Tw|LX9hS*|;CQsTDgC2-WX!MJ-F7kV~^N z?$}iubK}5q>&0KAwzbl!3lkf7HYNGdUPtdI+_!=5NqGxs1aXK?WY{(oN@Cd_FK@@dAYPO@)_poYEctR!N-|Z`4aNwnW2-Dl3$WZwO z;bTB`nV)`cgyu6y1N(hDAR{sgUMvpYmxCKukm$|i_upG30wH4$#T115+i<&Iu{=lm z_M7cte%&@RtXQ*B+$Loh_bwQcoGsYWq0z_I>Ir#lupmz7y-S!R-=NGO19k0PgJ~Nw-WBh15ToycRxiI0e z;nB2^`=BCj*L$a~75X$> za-)q1CLFz34gd)S)a`+9z-{3hTckigZa0ZDGw!3NAeQ{+H&sPutnMA2pRX@hm7+;j z4AJ;}zR#ojZ)&u3F2kHyC+b9$V>BGZxEfO_*dlGd!{9=}Xll0GVu(LgmU#Hc>zMGi zXKz6b-SS%ulPE!nA<~s&;L~|ZVh7ZL5H+Rb2|55TmFt=+p&D82TNQ0y?cfAQoQ>YA- zLH)tPquD{soY+uRDD|boxH{V$TZHAKa6Fk#x>oliNBB0frx0gfelZMzYZ5>d3E$O> zkUPY|H#@1yYO!uWove7ELTU6F(MN-e56;MCSX6H9El^)@H8=)oGL)Ec8ONlN_F$#X zw2Q67jqJRDNoN((ZL)AIiy2;0rpf1A@BiSF$|Wh{%b$&`SuL^IqnO2<KHGxr!KEFaoaBudI*d$=Z=IWg z-H!AR%Tg(?sQ8i0*So?d{#h#dO$12GJjVyJWO!!PC3JFnC0zdy~(@W2lr& zD@krj?g$l(X=BHgzHIP=m$;c^&NU`Y0Ir77K6n+I- zNvKT1iIciB_<+uPKl`hvvJ>A%vmoRj6m7WA+)RxOLNLg-Fy~zPJZk2vdG)~G3r{#k z5Fqq*#Bw^2+8r5YMp8Is+G8qhQG~O*Udj=opteX&3J|V`whC!H%%RjG#t)bJ@1oAI z77EBTiiPH-RP~?%g=gWSO+%nZ<;9^DYOxepStTo7X;qrEzi+M!AlhebTm=vP*_&S0 zta=kO^3?%hF+G~YuqJ25EIw*PYm1E0YhL%t@{6l)QTY^ZdY&VsUEl2`MF($i&09!3 zBJQoh3Vb4A=j-^6>FzT*w9Sm0!bZ7ALSZ;l{_D0Vi!GZs z+dQo!+`ZN}VeG^4Hl`gV>^u9gQkagPaOwpXxs=35HIgebR8#e&(Y1tzYcUf5b+-F7 z2*Vi*&YzaMVt=t#GaQsXtdZ0ASBiM65Pv92g{|#5Sm5~*!)ZlMk`|O#x$PI28FQ|8 zM^%W(fVQ#Y7BKrRjW%t`d-bL!LZ&9)(jxyM*J(&3Rxh-Fo#9bYg0bS{jrtctZHr5dNy(}}rQG`KNZPuJbNx#dq(+(<<+h?(iO%PH<8vI157cKB(n7zF!oG^B0ZP)_%353{% z7)u=&BY5%50?7xJDHIecW53d34W@RODFGOcSj#604eX=z7q1IrH~~0)X=ZvGxUF`; z?`+ZZ#YSf7E~QYju>w;;SyI`Nw5gmuHiJ}{{*nFf<%tqNwsD$fo${*s=g0m3o4*&Y?Q~l)HiLBXpiZ=GCXwQRmfZ%QO z-QA=6EB3#~<73UT$d@o((~xbh>bn0P~#3??1_VPGFlP5JypE zw`s^@1@690>;Xgs36#*6GsrK<9W_6O^D+aeS{SPK`y+XoV?`^Y z^lzbsxxyK8y^pbOHY|Z`M#ArqbMs{r4JD(=fW8HtF1!Lsbwi*l(6zCTxpM&|txdKf zAyH<81`h%8$RvLe6SYdnpuI<`hjmy`u5qozOs+9S(R=Nc){W^x2N@i?j5vZ(c%^1} zBt_BVvH?e1=erNusYL0$X;9s{hM$3jG?^0#laL2&+{ej*Fmebg>Rm ziVAV|O&QmO^4BE)l+rUrjiK~&kyfs``X_Zejdr4Vo_HK_a4;KC0!&!!R=7VEjC^%& z32qH=G1-g7V-Gd~tlOWBq<+L~z_f^`m`qFhWNg`w1jXO@$zf=OqQXQF%f!Wa%&{+{ zPvPiceSBnmCi9eanEV)D(yqYw-60p(`_0nbH*{o|em&Z%>vCQ0w*#f0wj1iW(-_X0 z+`P7bJI8-jxK}W4^JLfRMYg2WU}x@^bo=QAe_(pIJ>&Oe8Q}53h%$kVi{*)XcD%uo zW@q0r68U`>nrXem81;6!$}t~_Twt>H&aXE@3jr7&t5fm^J0szN2EKPlpVO72q@ide zf(K|Y8Txfm=Pbh@K}db|@)*j{*8!Qnc|x!oiTc#c_ppWxc@W_$La;5(=mJWROKgkW z3voCmB@&IOz%znf{lQIVhBz1DkQL@jIi27V+AouAECtu3@A!2}K|>G$j7gk@iw{N@ zzXQu`sP&F=kJz5OdAG{^GZx}K*6p@Uo$uwj9sbNzMT~gMeiXayMw5Fpan&{`6zN#} z`O$`+ae}xp!fo%F1b;$NNb2IUi*qZd39n;}X6jk{`(E|6o>pZ%d4&lBI_`7cQV+3! ze{ekfY_`49a4xAU6`qhqU{S z@DWW|9}7@_;=BeMR{j{N0xN$ZG7lk&ad&Kv$fg!fl$!*)ai_#|M-W4ahJ;NqrC1%W zL)Ext$UFB`#-Uk@3YDW>b%rU^WY}r?GgT0?NFx8Xkdl4cwu+)cdC8j%G6lrZgaPM! zbi}@$IJyi(d<25)6`6j!S1_aUt`ISS;h|xX4>zLMnu|r=Q zQ8pTCbC=0%UmIgY_Yo8QDBWVCD10x}lwyHK>WefNre-;R%^CcV$+wYDq^;w5dQE!Z z;b;Lz{3ovUfEUTkK8v%l1pmV4912+U4g# z`oQP@uTV+oLR9Q&U#9td$dO7yoNy&|zdlIuO(hzCH)}+{8G1Nek8?h4et?#4nzVW?nM5&L`s|kwEYMtp56Jlb)3*lzXY$>z%1e(-{}-9$paU{ z^3hLz+n+ht2Dewrw33Bgm6`f8K`6qAf2iI8oR=46T!)B7^Tzuv_guk{?jY+L)vOUN z?hW`Y7#d+zl=ls|9|P-c=iUVH3ViNjHq8lqm-Ar)WbP~0DxjYrt(5 z=JR)^4`0YIStNt(MBh480C;F0;cDAsh_Rn`bxsARtcRC&t;skOfhj{OPJ>#TZ5Uts z;n`j1GRZ-sIU8JARcELrOrx?NunnKppl;|((}xWwDrcVNmXv!xvvx3E47VDXW&Lr` z-*8!w2`c1mlKAZ~Duqx@)u7g(VlEp^;AqK*O==1GA<@x84ftJc(5C@p-JeA?T(pJN zyv0!?X*p2|=Y{0}HBlK76Gp8Ur*h!&Ll9x=TF^zrKB>?yoVzN9aPZVA;HOMTnx*L# z*OJ3D#;02+d&pw?!fEpP`4Cr`sG79s%>&or03jQYlHqW7HPy z6J@u#C8pi$`v5{6On_Qz zk`6Z6icqGiv?z~n z1ZH4ip#?s4b)08^P|4ZrC_3`V|0W=&6vRp()`Y&|flG4`-KCc+nSh1z-YEj}l-QP$ z`BRJrBhAcS`3fZB?t}JsWK{u~H3_k+LFQK1a9{scG4?-HgP@(1 zbi<}ByhJQvnqdwo;yj2CF2`iEu%&W~e_z>LiryyO_KqQZMa4OTut5sUvEH{mD4r_e919DDxUy{HS5gjnu0*1sw%mRp@IBkdASRpMg$?vGc#niVw>;=&gbdK7^eIzhDZB>5)!-oGGewa3PdJTi) z{|^=f1p2?Kxv7z!p^-hyKP-Hrn$7lSbf0ykD}H!4mqLxIim|TB?av*2FftF&xFK~j zaU#CCLvIpAo156=syn{ju2l?qF;Uc+k=3k~iwt4uod zer!yJY3hSz)K8uC8@YPFc|ZT4<9%0!7L#a}srA!VN9+^t+ic{wTM9za`mxis z4PmAc2X1L%FsC$OKa3Is-DvT`;rDgTeZz?M+`_|9yG>cT-R0v2;6xFO{Rm}|FO7r4 z@~IELmAoZY%`&=CxEZBJlPq^5HNk>!Ir_0;m&=Z`AO2p=Gnzlb@K&;uL$N&d!pnC$ z8jHChpS~YTd-2U~qUU-%CPad2Zn;@}=zC_A^3IK#-+W!~C(IEViPpdTRFE}@UbGX= z`s6trS}~VVb3b)mF;#9;`eraN3DyB1f=a%fJ!vGYuL5E+s~MFf1J0no$Lsll!y`HD z>@v_lrORwa+Drngn_x29;%SCzS!IRB`ecx8hCGljQiCt7d9Y;3 zGnnNk7bqUEN8hm5FWdLaVfWKT{hpXhcOvENlp)ID9?6X22o0y zvc^(U+sBgGW(fvZ&_Z7z29Vnv{UD6h+*6Nn|L%oG0;C*B zt>{7K7i4imvbg(gy3iEerACoElXg$HT(wV%vYEs1WROn~$Wm`*s|u49{zW9@!1#DT6$mwMI}3M=>;F5bW5=M}`$ds1KXPr7{d9(41!cpMUPhDqOpXA=x`iWIV z&5aor-oVz{l`@iy@=JUxd5B8j@H>eAZrkN7(mr4I1U#elQy+FcO_JvSSyFeCzNohN z=zq;E>-`vaV)>}5UpzZt2_inYN@aJ(BZu9Z4!ewcf{O*+BF6?)6@~iXB;RKJ`habHE z$HZ5L&sHZufPgSnf0g(zFz#Q8uQ_PH-GsebK>OS=MXRHY-dU|=F(`k z6o`#nSK~iVYAvo%c9Qli8*f^F$j(6UMN3j|oj zSvW|4`T~&>th2}%AvHMv9tz~k#@W*#iuu;~p@cF7?;91-d2TYzu3z9-!5beW2z4KV zH(~hQh0Hy=ADcO47i`sMIr5Y^WH}V*O%I^=1CpQynq2GKu@OtIX)o%i#XV!gL&o0z zauxy^G}M2U5WJir#U0g-!<&yK}MRUEtgu?it>q<^sSyO9*TXJZx3v) z>=m5b`)?jAMofg8XAJ;2@ktZl0PZGnd9UG20=z``{?pK~Q9VGlMMFsYNKoRWo8Vd~ zc^A!46@et{uzD+7I9o9Fi&h4W#DL9bY2AJko#X0CWCJJfY`p|;Ph;^w1u0bQ%!KYF znmI}bNg8CTQ?hSGT`V(; z$`d1wFD9!M<7akSfaQFeR4sRyyQkRFQ#{Rv?-^z>GAX>jsL=wPw6OOD@7no_6KSCv zzJojnBWa|}m%H3Zl^z_$^haUy4gF9s#!(yS?d{M|vORtcJpvUb^=8ivo^UqRX)~e- zrxo@2bQb8h{1F?!L5dABI$tnvToOdeN2#zfbr#A+^BBa*=_*BzL!8%FF^80!3|g8KNn>IX=%`+KUw0ac?y9)cTFu zr{qLIZHqUg4-rPk8~TAL#?*flvz~X?D(IV-G*cOiiws7aBvzfX7!RK!7^5|2k67Zu zMH$6EmLSpXw+;lIrdqrW*%MT*f@?}PqkXfI&YPF*leJ{8calaOmm{0>B~!LE-lwz| zw|v1&N_8l2pdvI5;1n9Gr`bCZYnNK~(+h_zEEg27Xn&`phZN7GU+|@{Awrt&va5hu zZ|MR_u6e*jd&@Ry&NelTk!=tGEgbS^NwcgtAoSB09lPTjheUrh*>#vH%v5Hy_HBxX z_4X$Qo~mK`+cAGXXi9nBhkd+q+^TI0e3zCK-1CoTi(&?S=821PckqR?C~sGF(|>TG@2S-Z@Cj2l`h`MnkPJ_NGKY~nO%z@ zr%hEK={jXPqpfIlnNEl1?=GbsAh*M|&W8{~DCt5`K3KQVo1)dS_*U%?8?wESaLr^K zF90hefvP&~`APiulHrQU&aid3jo%%&=|+wtDPBi?vY}>zR{L$cJS$e4ck{Z?+xz5l z&N5zU1ca}sz#V;}CXEF}25P$e{@W=FsqbN9(HLn4V>h=oWPdON8$QmsvS>KhB~Y3H zmNuH0DHmh<40+=Hyh^03ADLX{(SBz@r|vEmb!PNSJl}lLF6Zua@|nZKD?%@dVXiYj za3AFRQ6yYE9m#p!wkeCV*O2JpAa+>oBa&3?`PMXrpG*9_DRZV*jA3-e{He4L^yf-a zq0Y_Nl7mn?a*!^a-d%2)vHK>IQ9{Cx;Fr5KoG!vBS_PXUpX0g0_hyO@t+w_q#Xs8W zRD;tZ>x_wfId(s)Fs^3iNL_fOd*$XWKdfjY#+1qP&fJMBsFl0(7=Guyr~{a3mHA%Z zLTuuoT|(&6l)c%Dzpg57YSZKyt@*@`zk1Sa`L<1Ns1(`i))NP2`S{(Jx}2|bhL7IL z+dA!^3nJ^j7?-_@p&V>^K`*R?IF9QPP_3oYvR^Bu`A`NN#6Cc~1LZ5hB z30clNd#)zCzk}wgvPzlKmZM@?9N|*ZCz(b#72J#&5cg!g|M@_$-`cN-KV*3iaKqQG zx=$O=6VtgFqk_mcOc@GXy#cuI18S9euaj4VRLcut%egfkzqMdiNe?j#Pt6+h_7DhE zm1(3Ko$8*3>7nWO2=k=%Yu11uQ{2bD;r}YhAmPt_Ti=96<=RxXFtj4=(w}Hgl{Jek z*btiFG?`3lNh2R0-dOs8iPqJ$e^@tt5cF=2&fJ%ydX`D>H!qBy?r>A-A^~;F$kMxR z;-26j_^!~Br2Hb1mEZ(YkME=<)cKI~7S_{OxPY@*KW6^ec2bT42Dwj0i$Hu+i|uj= z8IbX;oESs!fx`c1%CeP%|`PE zw?Aa0aUE~)z}byr0C9_ir%&RDv2gV#X^iI6WdihGKe)GhAN}v125VBLv1WfLqIMCL zI6{Xmgd&}Ae_iEYUHdlFTk%ODk&6QmDC6xp+a}MNhq}u$qNWt!0B1mR39VoEUgm>E zQpoWzsoBT8y1{MBlg_VQPSY!T_htg#dPQl+q^B#0GfzCzI+l2Wx@L4Yp5%<}A{(lC zSkNT2=FtTgqm0AZt%TPpvvV7xO?NsdAp?UH!W-kG=B!=;ykW)9UwN>lEXj4(w|cQ3 zUOy5Ee){6sX@Fxpz1gviT^qafnHd<#WV zLPQY)0-*;20?G>h4fr=0CYzh!6QqNpxDZ6y7~vuK2N)AU89@k$%1ER?da&T15o{&Y z93UX*TVGy~6zH_^U^nGSiU>5qV z?8@xxbD>KL^92T>vlC4W6N<%o00A1falGcL*sIp;K5k|Wb=bST9+ejm*Zbb zD&7XHdQ6PESOPju9U4yIv+Asl_8e}T#vz*?HVCsg{~Am!vS9VjN!S$pq~j|ggk8tV zCjaR?(1bMN`8K}#@zk03)yEJJC*$u{*F1iPPb@cDOsL8B2SlK`H2gK9Dk)? zM6SuxaN6?bGJ8aswE!xFA#fS`kC>i1{0@(>nZe)X9$NgBFJ9i%{lfD6M~2Y7hKqHc z(4J=H+Mn2;eiy9&UiQA24r+fW;7fRNIk*N~Tkt=hOxrxR@;~%GD5-lLT$_|OZ%0KD z{znM}gb$4gayyOX4IIhSlh)(r`O}ov<0Q$Sn*yD?VsHB2_aMb6h8?PNZ^oCmxQrs3 z4HL%(d8a>@ck1oN?45z^%1qY-+CuiPb#@F=L)@M?tbg6Y{FDri=srLAEe>b{Y9CSAGmxhYk+jVVTWe8bF5-3|& zwrf)b*lD5ijG{FtyCdp%iucqD({aQE9*th5KB;3=F6MuI*>u#!r4}b! z_9ic*<+*VKY?l`O7VIVI&Uv{wKK5Kz^a4~DvZLU4ZoJr~2{ueB<11$1rvv^YneofR z*D>`8;!I~ywnxU;s6XXlu@#pVt-yN3y?-u)^(d7JtN;r*oqCX3(}(DtBC9VW&+PuA z0Ro}}xtq}zW@9N<$ig5`unr_%9?!Uc>wSIR;Nk_kQYZj)azWW)A3u5Iy8jg&=s9Nq zM_-Nd85Bl}t0mA81G{rjbS!Z^OnQO#j)V8l(W@D>}-8;#Y;R)z*;ZguX_Jk676fd zqVv9vgw-LT4cO0*g*g@y{7i$=6F_YV)>JFB>J+&>S@im5Iii};S9Xu^B85(iz4l3- zIN#wtOqDk`un3YoAs{c-csqTujaOYYp%7@uq== z1inA3{Ma6zg>HyFplYpPuFU{#IV)BF?bjA3xJmo~3jyew&v_df!G88x^Fg#Y!GQj{ z33s9E7ayHz>Chtd9M+P-Y;iGl{pFg203qA@gkviIjT@DhL~aQC?g^q0z(MK(8E72v zW+f|P1V4ngKT@qWx8;g=2WrbX{Wt3sb>n0WD)USTou~ErTt$yNkK?d9{7L|Gm@TPz zmf2rrJ8vt1;-VaXRWb$|nA<1&YZS5ugIHoS{0ngYd;Poyuu;}GYm_oN99h209<$4u z2RzVdxvY7+UoU8dzP@80*BO+v)7{B1mxN>XtW3n(^<>2Cm%`!vj}mrtcI=UuXn|C& z<$#09iWfa}T0xGyQ{Y{)?7#Fhj7N&JYPRPStW?syB-)ZHwc1d20I4od;HqMRfWmDXIK1W9*593LYds3gbG*{$ zgE{qHVOGhkR6M)ry=Jh`NAP4E&&(Kz&Gs@~-OJ0sZrR_K@>xh(lggH-V7T$t%Dy2kyKn$QN>Qqp&=<20kP&m1_j*IuXr)Cky{|nX903)6ASbF8yZPmfxk){;U4k z@aI3{sT%b@&rS)X-aN;y2&~L}ypmX$I0oJ1J(4KeTe1~5ACpG{UNGRlFvI32m#a$ZOO9lO7B zKTQ$+pRin3nP=ag5Dy3EGh_k({kL`J%J>W2ur3)gb>n|-2$3eL z%S+?2z-;NuvNv+-%QWihUmBlh;eTT^%uMv(F4d>0lV)J@qO$M^2PeBsGi$zIO0XE6 zIHgGj?9G`~y8q+W=4u%ymzarTVK%4l&cD8nVa@^fJ2@eHe^oi6Os?-bqopb^t^bo+ z`hQJnV0@$~QGyUX8D$oY4q&z8Yt8Oww%NhrT#I!eDdTNrF&mT}48uba=rIcdd^3Q& ziRGCb6^$UG_130)-+mBy>+|2jxMh6Kn&mr=+8fE&c6xTao$kJ4^BDy@Bv(> z%xPJb@H?{ORp<@XmS(MrzGc;TcpOzYwo>B0jyd@sXkDvqO>KBVY;#4Rj>*(9Yryb* zZH70F2k&edIA38?gwFBif$SAvZv)}FqN6DKf&6TVKfHnD6Ke@l?XObJMq#4OnS zIpxRm7zfJmzOj>Sh)~xCWaX?pa)B-60ENp*68xgb8vDCv-g5;AtTbUa%f_CCslwN@ z&JQssaQi;Fe zyFE5IddMNPrkkrEDg^EjBXuWpG44A?Uky)Hs^f2r(rDG&fK$;i;WdEraj?Ml2go=X z#7zBM1TKh5C9q-p4WZ~MT$|HQ4GI-|3gsI_6$7PEK?v>AikVd1-rC zJtXbCKT=jR!UJkM}^asQt|C75)P+nSvTOmk5&6?E8Ov0WPJ%J!M z`QGEv^Wd6yKD|2=&?y1SC=5m%3pq&^PRY}ipkw_5UIwXo&s(;CM;-W0g|`JSKAST5 zVnOD-e%HZitv9&A8u!1KKnBu6?Ds;iK!l%D}|6+5}k`Mk2hOg@QQCCXU z)0(A!U#hc=V8aVKGl$)r;gurG;LO5nb&)bNsRxN$N=XJ4zvugWJ@56T_Ve7mOm)5; zT*k1GdUhQ*lMxkn-(=>mwbu)z_L-OWKhCfKmqKLb>uB=G>OdW(mRw^uo`uF_WPa9g%u&a6CAMk%v^ z0%At^@ON@_HAAJ(PP}i!RObGi(voCpK{8?n$Xy3qLD*^uwQ{7o>j3?thg^44PAcc6 z*lwOKjb6gcua^zS^Bem|5y2pN2z^-@URitDga(kffs`4p39V&zJ6fw(QGOTDL6}Y> z!H>iJ7~>rh#~z_cDU@Af=Qxc!QsOBmI(sdev|lNkuw|viYU-uK3Z&fpuDY+Z-)lsa zDeWTI07iiRP-xQTM|QD|tJQtAtR6ekf(bN~X{mjJnB`XrVZ5_zelqy`G@Q#A;MpWZ zYP;N29b>^mx;(YwKe6)k>?L+k-&QBhGx&r}k?y`aQ;C~x0B$xo^K@4pY|4q7%fZ{` z{}vxB>W-h_Ix>2?dn8P~Q&AHi7zei5vO`y=jrc2I4YO#${^n*tTF2dElYX?vQL-&7grC^y}f%=JdPxndS^?yjiP(?M#T=|0^~=PzJwRf6Y# zsni^{1cZ>05)!FoRvdJbVJKi#otFj`FQs>>7J(+@WU1|ngcJWPjq@Y5^{bpLC|A&2 zrR(()uM)UA_nC>Rw}tP*tIrmw!7Z0<`kS2zx?_B zzeG3brCVzQgGp3a?71RUQ%l(d4%k2;sc-bPO`|fUaTEiYGFRm;PhBy3jXV6We}0`&ojt)|pT+(n1?5~D{|Wm$jjN?T zQyvS=VN|_SZC`S9skPqhZ&8aMyJ@1kPRq9{_hqba}2ZxnjY7+}K)o#kQk%)GFlPGw0NNcacSECL0nL-vytK|b+JG*p@%d7^x^{sDz z<0y+7;CuyXq&8(Wl?(jKJ>at~Rz`CdEEKeRsVZ(RMaNqtVH#u%H@QN6$h?&aIZLgV z(%{rghu2DSn#YyZQb*TDQs)-cvZ7`5a>)II}_Y$Zikl2 zNitg=DTL-lg5lqv#CRBoI(puwPa>Ud6UUytP<9~CItui6Nd9MfBaaQc={l`5Qz`CN z2VJfH!$7`@>V$q5S=cSb2X9GIYso^IIV1Y3`!#c${-7h3rz4VPjs2*VOYnZ%ZQgMQ zkhz?-2WL5d<$6(LlHt|r>_fz5{$jw-GEZwuA2Mg9LYkg1?ud1duI@Xp)AYr1WrBS8 zjod)AfTnpyKNn_xpOv{Mb}V9RTm8jxdjYCpC9}qv^B34f3KzU4)Gvdl!2M(T{}c89 zuu>|oi{C+9(@Q_#b(b^v46RZME={_C!5rj-H`@AS?Nb%Q@p)EptuQtEn>DH?d`=uG zRTSt2{h+|LZHprgI!@(!TJP@#U4gB$Q!M39;Ymlv)RaWG`u%4L&E2p^yZ=yebgvia ztDQ1BFr_1`+x0x5^hrQD$9+0FDyCd@K7Zoay=2oX1a`;`wBR*uKq-8#&?_VgiUQD& zBylO{=L&u0jYSJQC2QF)?#mH1c;I%yljg#RuqYbd*aRC3wSEmf9RD$M?_?VNOplF} z+|%`CTM^zYl<)mjx?L}n8yIjeynl-wjL=%pe*xJYU8ba=bYhoSdA&}KzTbQvutQv+ z5l?c=TT)!UP)oM|d(KI4-&;Zw!iu)%17##I0`^#ThUhHJ?FCrXzsBaD^UFS)oFKB7 zslu1$S}0m_MiZ!qI3*7wl=jRS$dQqgtSt(6e83U<9x2C<=NW=3IMlCs+o-SF-Df{7QBwD@U2Wh$DkDI2fjRw*9{CoCf!OT-JDf% zuC%5lXJcm>e%c^(k6tY{&+?Jmxh)p|F|`U6yQI&4;PC zf?X_+o`Y<@XSPXs=V}jaPCDQ%qkl{0XQu#n@5cKN9CmW6N+sVECE00V5At{3MCh-! z>l5{R&?J5|V$w>z!SV_XcPZ&!#qn*(gDhpRz>Qv!{%wAwIfhb=QtwKCTUl9Y6zix< zm>y%`-dI+mb-(7M)BSHV5D=O1F9^d6>^{uok^(RF$}vkf7_*l(!f8V)Ak|}5wQr3i zg$p_9nz$~6h#RpiU@a#U_K@O=Sf_Hsh<*VF$?Jxg=ZdVOm9U$Ov8IfSQ;@aQ`-mq# z^-;+HkCwsYC~^Ap8D(aJ=;6cd-o>o&Z5;9|^YLFF9%)-Qy4(TrtbDY zDMw@SEj}0kf(+!Rdd-WIF^~ZHPTVj&&6WkOo~HO~ z;M3crsfTSIgU%d~uEr5Zl3RwkH5ddH>oJHuy*HD<1u6Z_PLM&-ZPbpfhr>6JhBE#4c+7(^ zr=%HG|FutL3oJ?Qe22JcT*i*bXPaD87KaZ@o}RC5SH1+(T+V_}%o)&i_5h;*9r#5y z$`BWxU>Kpdhl~4kvl7%TFE5E}7ZytN2>@9OB(QqwVANF zT^#24aRNs-&oEBp} zod$holKYtj@3kwKI1}8BYwKTC;d&LV`+4HIYv2`vGhMad2uLpkxJ!+f_0+Ia4_tYJ#l*zE0DdwL5+!R z4URX+R{w#fZjA*1rmE8Q!3k37G;*lgpagPHo4?Ef7f(M!5OZ?GU7lXu!v21QjwSEa z?F(coG|Ce%T+?iGJ7_z4l_DHL^$Eo$JmgMkMU#|_I1=mOGwtS580P2m95AUBdNw1`-HKRb;`bs8H^=O42BUgmI=RG@8@~n=jRXn;q#gM zKHu{_*E!d@&awM4_K|VQ#iW&w2oWnu;Jt{Y7KKuQ7x90B|JF4UfL`I>uSoLnWuwje z)q_7FqXiE3va$L`vpfK^nginL?FquqnWz^~BH!MCSMg~xM+1p1`99^ukAmc+vC9xA z5RkAy<^6>bW5L*U?EQ!=41K!vAC|?0WXK zK-Y;n_z5zK&4?Q^!8rYldF&v1;Q{k+hrAhgj&7o&2%fszRgdkYubKS1Ux1b4ex9Qw z`k|vC%(!8mJsmmrSjG3wb zoF$X@ng1;vIp^?7=}W&dMy`5#Mt;jAi1Hw`V`Chm>L(3n%;eZ98}-c?@;?lz4WUuQ z9v}6dxG^qGX;g1fjzb~*k4rgqQGzfF=5|Sd|LS4sPi|OD(u1=LWF+UJ9gQLk0&Cf{ zQ|{L=m;!bFwKMSZOY`6M)70aqE~yBsQit4X-(yzfM+1iaHyx-Pr>)WRan-?vKKBbL zn@KE9wsPF6sS{DPV=`Hs8CDHdf{rR>sPe(xV6=Kp|Ipa}x5Zwb)8tMel5)uyJdWl~ zBK*y`3IF-P$i2Fdf0lrjIGM%AE$1b3_hV3`YzZ<&C6_;Xy}CyFO}Qbl7_m0}!C@AQ z?zh5h=`z1E%KcK%B_42QL$M%aVhcELBjXf_+y;X%WWAx=PW~29oSzXy`Nxx*rw{4i z|L<4>D0?;LDKj=@GcjWA=oL5DOvTs-4znneNB62f^;j?aBtr6`x9d!e)SEVWd?O*9_Y#XcKBg|RBzy2 z^Iy=~SOI_}M(Y#ZQm($^`cwJ4_H~0Han(QfFq;EA%cY>I>AI8%>jsCE5|j9r!4LBQ6LQyt6?5vzn4&G6#Mlxx~ zU0x&8g@>P1PHa1nmAOGLRi0Eo5s@MsDZ%x-=fe<7Swu~6(4@;ULO*t~svH+Jl#k%B zm+Z~tFZ?Jk*%0Af!}*_2^;iY6h4#Z%TJ?6ASLra^0ILvq7nY{8%U}f$#qI8+1vm*Oc#P1#m1?QFHHy|q@fk{anyqR#P|DEd?Qbkf zU4&ekw{mgM=*cPbTIhehiSYNB<$?qe_=5U!pwP+i4>ImlRU2Id^L$yvP_sd@wkiQt zIh={voGvfnAJPDi!s&XYTpIltuNlnd(Ju&%?Q_VTGh$o~Xndd_`HJR^lbEurg|hv} znuIkvgG$MN;Nhm0zEqXL`r*@b-qKh)E51_*d@;l;#fE5N+$zkB(kP!P0t!|%lbz%% zlUqQj)u8i)W-mP2lO9p z<{WVScuI%TQ0LJ%P?KwonSS~}Moq6PhcKqim;J7C`{ILyl*Ja<10(CLTLNnSgDXt< zzzcBzlg6%Zl~=;mu^{7bYK4Ae33~h{IAY1?h0akpCfTeh_M?fh<0w?C0k6s?xaH3L zV?ICz+8}!`zrq0kS7g>(2=A3QK<%>_DM z8_xk=^#-ooyi+Jb2|n4e;jgN%(q&AsTG)gVC*Rvk-WSJ6XYRw6LSNw_C1hFbwAKPU z3U-BqvgEsYXG@fpas2;IH`2-T2GKzFq9EeayTV(#KO{;xSWm8$8XYM#sj0Te6nmg@ zUY5u01@lsYhE^);516TOO5ifs`r>I&ECH@x3#Pv_e6CM?ll86)VtfZl7!^CWZZLni>JE7aqrZir#ll9+3PLp_%8id%#}kbGHwBpC>buI6=ht)*Z$(DoP^ z;JOQ3h5uFkWBbO-{_!J$J?D-R!Ak(2{kGxmf9>CU2txVa7A#zk zM)3MC$S@f-7zqy24RsniI_u>gfCM->Pn&f`hpL>oiE4{5&c~DjJ*TTs<{w-fFE6%) z7rzu7z~E9mO)+~Mr!$cBx-QWT)zMUHEQsfaP8eNCn;HQOcbn||`h)nM*S1SD`wx*B zS@kzIhQarIZy(78F`LENE3Pisc;eqKotllkYV*S=A8Ud`)d|jXA>O81QNSQ zA@-9-%3fmZ$H#wyO(p#=0Qq;9)W&WphyW?A@l36k$LZQMR13-gj9M2x3}}!=oDLg! zdguav9;^AyCa#P>KJWJ+5?q0Y!5aI2uD~R{B6S8R<^;1tlhco$Hx^~y3-bbYQ6ibz zr=LXtsT|1V{Av7yW!~qpxsQt+P26(1htD*56~Bx{2D6%W(Vea>znR#|_co9`ev#F% ztNtbOXr{ZFq`(*n?oG?;QmT4T!fCtouozA49cpNI&D$7zQ1Jvfvi>v(ks4TD7Vceh zgDEn%vOM}^nUIxAz-GtN;(Pqf?QvX+a316H!JdZG!CqgXE&CGueYk~1yAzul^|#VC z+z$yS(hG&^`wn%Mf4@rm*xGlpg9Scqa9OxM%>Hf;aHTCPXd{3KvQGmjJTL&5=^6Z- z{LmSvYgg!Rp(Y-QMmE)ilCe60i3{#P8zXOMq)wsQMg@-f&3$?`R_Vy@%asN^{1PF| z&>{a0I1uy{9I^^rs@0Y3(GL#93mQI56$Sw;!Y9U68OEl;LpqmqsUkEhYX6&^Pom0ejL zYwe~$P$J4vN(|c!;8+a4r@o7R_Zr6q>h_iVm6u7H*KYGrB?&qlay;}!Fo(ctY-gJj z=Fx|avIz9|$IDGhz?w!~Pzfo-b#JSg4L!V{I}yLjV733kKQ&MbSedAT=TXK4s)&?5vcz@KMg5N}bl&EOfu7)-~aYEYe&-yf%R3Q?*7Z#%G$ekON7~ zwhpUFVNbk7dsU9#Gq(BCg$o3#0@nJDm^MdD*rbk#6b}#8NieLF0539zE(s*TTXmQx zj086va9J4*6!)@dhlza^FU=w&M$1H4)YJgS%VUvP)$l)0$x<^5iKiu0{Tlww;3NI& z0p15K821~=vVT3BOKsh8mTNML_02NUC>O!yd8)}EomHz-!wx-QO8GpsUN9dA`=cT&?L|4*-fryT{z_> zd;xVCdXz=TgaLAmo4nF@QP$OdYFNBKqERTF~cqzftR4lnT+Q$P&ysaHks>emk# zvE5C!o6m|pl^4hBT@TLvuZ~2Z-G*06+EPG5&qAWN;)?$()|QRIbH#UeR?NOgY^;V9 z0ZRYD5s|m3;u3*dD%|JjSI?O$j;MlF$k;bZ%G_W@8>DaVN!plhHZ^0g- zz3s1k`m~aeI{+}q&6kaEA(9q3R>Y>bZ?a~ri*CB8F4!v4?{)y2B_rej5W$@elsL{* z*egXnTLQ#!O#SJXVU1^BUB41=fxYs8mQk8lUvM2yA6tqdmAHAlW#s^wpen4*r#3yp zPIdi@&GePMxuu-JD?TN7=57NQoKo?sp{Vn~t%i-8e*w0rQ7?%&Q}c!KLJgzP^e`Hy z0*{UVMCGQT;c7ngf91KmfrpxJApN&X7LPOLW_>To*4ZiKiuTrA#sr0cg~KQOo?afk z>gm>k)HrvO`%gB1K|+|VWL4#p9mh-eD0T}?08%EJ@LBMC85I2{K0WA4ZWU^K!k3bT zB=%>^Q3M{qW=smf)p?HORMy#*YGp*%KQkv)RJ!V(Ebj6s+g45KG@p(qW<#Ph04N$f z*^nq9u(iJbviXH)^H~oYyrsd^hWuIF^-mPDf2)?rZ~!Gc+r)Lm*BnK2grdRV?)U~e zU*vt}T8I1$lPpirSjKKITHg#akP|$>gM`0$%PLlCiD9B{Tf+pOCop>ipUUafcybet zD7QiPhvq-Z(I}R|Py?2EQ!NU?bQ=sY5<{@W756TBW8<}B&D~>X8`r9@qE2-lQCC|w z5&~q_>aDl7)}}C{4X1Har3?2Kc>dK`EljT@N+Uqro|fmAhaW$cy#1LtXaRI1S2xcE zp&yY<;tT6qO^{Q6|B(FaY@CPRN&MZorf_b0nL>ia&0C#KcKVh*u;#EMr3_}fuMn3@=29@(^H@$ zO!7}MePh3v{RV=AP3TD%l_^kpzbfO|9_AbQ@xOlhygv70-0yVO%izUF>8!5=WF)1R zpUZ7NA9^Rj?ExLW>Q>Zl0OGpE9rKb|3U{Zt6vXpu9ZM5QXVqY9*F{Dt&dB+6KUM3b zFQ&RbOwvwD+c@8m2)D`M!;Ovg;C-_BGRNw8p#v7L$|&oUueL-r(|TJ2X2Rnor99)^ z{zNeJ2pQt2eT|)I7vsB4eajf5jn}JUG2`n)pADvp{)NYiCQ_`uq8(afB=x%$X!%pb z*(R@nIZZ>L=Qn`d6TDSD5NH2|gIQ2x)wolGdtqU<@J64^EkeMB_0MoKY5kO&Ho0LmzZ$-OAJ&6{HRA0z z2Q6bhQFTDx3fx&^?$@vUfK83M>9Y~luJCN=z~5#sy-#ONj*aF)tM?Idi6&^8(qlz#nzrDKF;OkadD*8;Nqi%FFeC(A zT7Doj3itM+<`v;pb4X2k>8$OGGoUH)M*kW^rbxEZv8%KfjIUD|c*;S+L*<6WqJMo< zQABSkSuE&+x!Y%G#%*?K?r@9Y9VCwLL}Ty*A5c6-PT(=GSalZ_0i3sw&oXq;#d-7+ z1UpU86>n?i*7B@yvumWA94MLRmgl=|tU|_8ngL#Ga0m7K8qd8{^on+vv#t%p2-hjp zP|VgIrE>hTdq(o>F`w$6%GRq1%;@T6G}%SJDFnXxtRejRDR(df$pXhd6eB ziDzpz+}Ny|>hmuLw2X&6lSY(hA#ar|>(eZ^QC*^KzOv_2Y_hajqkpTan zS%b$&k6wj6g`F7+;t#ePkP}EiuTA)M9vz;r^E>7a!D;kKBW@h#$xZ2i8jkTO6ZTBQ z$6dvNo_u;%C7}4<<5v%+-Q$T;|8HzsM?rFv98EZS@*SB&$GkC^? zf`zQ=sC@RJia3DY|AYlCqX<4@rNy!wnG%lV7Ode<>SBm<3lkE2OjP_Otz7sviMG<{1NC`UonaBEQLz+wY+) zH1@QqZsrrb)^PGz4J*?i!p2W%qMB022!Cqdc^UCPVW9uVU$FY*nV=0%OsxY9{K&CK z$`I_PIIE_hSYe8cHe!wF4a$p&cJrGyKR-Y5!590WpvyN&yOb>bJWDA8*E(SG)u%SX zs5PfF`W}R+xtQOBJo>`eKhf3htX}#n1-fCjfO-7{SM!O>)&8L! zbmHX7sA{rc@#ij!L*QDuw((tR2Q0WWlqdg0t#-vKHf-8`Yv}Od1Gu93Ll*WgiaXZcQ5c_P0A8*_6W> z_dBgmN13Pk41mAs*vEA$1n>0-uY8tL_e8AtMze{x8}PxnCvnr6tTr(2PwU*ugm~L7R6yyCj6&ACcK?w`EDoIL%aXzTu}@ZOgg> zyjD6BmZtP`a?;B-WLNU=R7@5ooqTKNw8$XgPWq&JdVl;NgIH)G;#q48KIVgd-|JoHZrZ=L0GpbU zlnX~vlKN+6sQ`iAsAn@{v`Py8qpgkW{Dl~j7oKBib1QqnRZcNq^#j3G3Vm8WZ01xV z4x2wTV82ww`3wFoi?62oJQ`#n4SXbnfhnzHztsE)-9@u)Mmkk<__t zXtc2Mf(9?Kwc2~M*;Ul7QUs=Sfd|x<%v0hB2N>;>wudiy*yQ~^_-Vz&bsebGF#f3! zxfd!5jTx-OWw0Vou@CR#rH3C?GU%|xqo?u>e*!OCgkLL&5N@`mqMY=`cNMjnS>xwp zblgoqRTR5SC1;#yk;#2`-sk)$61xi8EK4Q0`S>Sx5y{Mka#*0eq3d0HpP@v&BFm26 zTAY~=jrTAmV@|_6NbZY>#JBv?`oOkdAdwlA$pak*vofo+q;v7P9#yb}nK$O2_I|2j zPh+*if9%%n)re)NWgal>$7kG2LU;P5+V!QHa}sVa`?=x0-!^yUQHjph?eK7(i87yY zYBO)bot?Su0erB_-c!6ty*=(@GUGu&Vhcu1s3DVl#UqaztOhUtg>O3Z)dAP5_@{u{ zUEm?emDO;%$8xa&@%~WG5b1Y~tsQNYHs+`4-fRU2ID>+&SyWR-*AoGY@exORivNod zd4SEoh2}`rI7{C8lsr%x{iMjmxg@{NJ`I^Z(Xu}Y2yeO=1y?xC`4+4`8d23`YuwF} zv~zEfe;ZRYwHJ2ZC}p6cVd$;cGT|n|c7qx2{sKHi(k3N7|FevZxW=lEY5(50RQC=1 zIt!5J&6s69zrFG42P;_t-?{ZsENN=@{dxY8v!2#rPm>4FnNgBkt^}6&wuC>zMufR6 zo?Q8TO6b9hYs&ZhB~_{&7x|0bY-R}W-E+A`|0+0fpT3QedPd_1|A7@5<%{Sk-C(gt z*5B`AEB&M)4h^&|G9?ebq-!m}Rm?z>1sr#;4Zh<1B+#P8eOl|=cGi7ni5k{yw037KjLzMF3$Skr)C&Yk>okQgHR5M*G0`x-OpC8>pnr&t zi`&AU3Hu@60^JPcrm-?B3<%>ocN|nH4m~$eUtn9dqlP&0h&dbKpGh@i4^tu1r@Wqo zV9Pxxah_dfnz?-y=U4pnx=0bA!j7hgkx2+ZDIFsp=_af6R9iB8?j<_mB;8i9Cj{bbny1!N{tTKj2%!#;gmWv+ z%BQ3SvXc_dwz@I`IU{>!v5N_~GAkILL(KpYGM6F~(TM&dvoKIP{M-F0d*VRaB%hS# z=10G8`=p5Q{-BL#q~&&u%pl}ebKbWJFFJ+d1D6x{Js5r+J^NWTB2JZW~#f!$1`^ zbBdYAfB1*TWenB(9y6UVmmzN&=|U4^RMtZaNSL!nKE*UVuJPS=uS>G` zdHy&`uVHPB;_h&UALFQ(`&0H@w@PYdn_NlYXc>!A^W@E_E6TRhwVJ5s4RN^{ume8@ zu6V~BR9Q4Duy5b$vn5fN--~&p|C1YU;{~iRx4&9~CQTE#kyB3(Rz}H4Ao~Vu`k-I< zz2$s4;#+NNyx|2sq3>pT?Q!K5j*2Hp4d?R{T4?fBu7GZq%Smby+^oa9XYE?dTvc>D z&h7WERAg4##q|Jvb7V%t-Cx(Z&kGE%aa(oqnJNW9j`R%%A(rSDSaaPVXzH#R#mP14 zSy+hGmW3;S)vCjMsMg}7{tDyjOc?sNaSyTXT(Fnf_+A#RXA;cE^gfDPY=~WW5(Bd? zbDW!zt62t4bdA!EvLr&ufxho8|@W+N~3|l&iy@nPdq?4xm|pz6D#moUrUNP z%7N=CYm=83H> zHMIIh>BfEWgRG+2k415Ep~vy_X+u`x495}nX!pvMs~lTvWCc$}9?aarYiIQrmV%gN z3uU;t24IcbQiJk$iFPXTnBA?sJ_x zgeaUA#yaG{vFekv^us$MH3A@Sb6ZTz*6@iKM`ZvM&Iq!&t zmd!w!{4yK#YO0}#H1`Moa%efy&++yXrLwIG8d^Iy(68)m{u&?je2lJO!tQe2mR##4 zu9HlCp^ayUs{CK7BVf+E3Ky2fcQNQ2G;_xp*(eVr4(1jjdv50o?8hZ6BHnB%> zbF?UJV^^0!=4w?W=^yn;SLzt|{h_e^C8cjk-xW78uKWTvu~>bAln4@>^|+|IT@ab0 zQJ2t?uo+&AvU-=^{LEZ=dgHApFpx4YPyd45;>aHsC6yRY4UDPYHbLnEm&&F#XlL`; z|MYjqv`2l{6;bYk2q`5r`@N7w5LdC`FE4%bCNPNG>I_V4NkxerxBBq=6(@l=FPSSe z@-Sw|qn8}>4efihnZNu|?PGb#MpUVu0yKSw_lup71ZNL@@4|b?=tQ!gOtsB~9r=AG z-Puho?r4HmZL+(hM($C~sb6$6w3H_+BqMI$x6Rv6`H`EA+1d8JDo_8GdCw^(ru0w% zL1SSQH%?2aUTyMtkxLHu{yOr-GOBDN!l*DILF{A5;-oK*aF-Kjg)?21m~?j29 zSJle(XBSSagqcWx%+U`6kJGQ;{&DO|;8fajd9eTvTcVjFn4JX=!))#NVT)Je%slwv z{o%CRZV}a_JXhG1u)8u%-a|}5i0|Z-c*#wkT>*wJ^Uv(?1Gk1rt+H;_-CvY9u*?J6 z2*&Sg9@v9KOMY0~zM@GgnB7aDi?;j%xa$fry|QWBGP{#vw#DXd=Pl>;e^Fw7Xg4Uk z{!k`t-Y2ks#Y@2)uQgW3uMF3t5;a*Mt1PkNI?6rB`fiw9GnyRaq5sPN0g|4w%0vK$ zlIri33aV?z)^*Ltg=Uz6zRR=cB884AEA$qTowwiNw=@=1RLmBF&+~n3G6nrq6t^fK zqRNPT0}zJI>bUfoK=a)>=0L^?rox|>qiWqIj~n>y3T(Y@a4cTcw9nC{k5fQbutB`7 zgxUPk1TobdwfSDy@9RokY_2(_?<}SS{XqPu^<)DXE|Ah3sFqD;b@NizCs-k&Rk{N# ze9d&T{==N*&ZA9flPS1jM{Z@X2Wr)qzJoBW>m#Yaaz>Y_s3vprr?qi^-Hjcr(5`KX zKAEgq03><)7kJ_*c+ggn-&p;1MZVjalVZ6qv83)*wH4*09#D&kOnfQn!j`m|(mZ=0 z80fi<<;nq-tySC)-}>w6!1rhcuy_mcTGF>HvCa6X54P^W01-mHeOo18hL1lv^Qf5& znQ6)@o%K=@>|FheHHH{BB5gM4?GGShVVcOM#9$wipbjfcAInpHM#3LlJbBNr>k@tu z3~yY`SGHaV(R0KEC{_lz<`LKtR7IWG*?E72@uCWvY|U^=VnhKQH} zjp-xDe|SJgT99T@Vu(pCS~l#ZkSlhgqeN_BQY*02Y~^h!iH{R;V^ZtgyQJ8NPb>3x z_@O8DM5sz7FAns?66JUTB`R;$tbk@zdNRfEVb=vPpQ;k)8RM#swY2=rEaUJqRn|$b zixSjPgib-#;))a#=g;$k&Au+e7K;r!GduBTgU00DmYpNaNg<;T%X%=M;qE>wq|UJN zQWUM#>cB`hwe(s4VuKd3!Bq1Ef4N>nYe(e(anlg@nh-w-EUZya0fwJj1PrRWiez== zO#!?GXN0|x(!{XFp4te^C(=#$w%+)ti;BOxrAqKqb>_XN-DHdF_10CKyK8{d5A`S9MQ5(Faf}w?n}6Btg(5Xd@~QeuDmSMU&}*c2I27l-5IR=G z`3Pvu^k~;SWZdMgP}bn3`Pq~Ok}jTP3jPhiiyXGJSVewR;K{IStm7}ww*LKv;9ieC zE+rQw2&{*4;q*NZU3r#gFX-`mn4m3HXv$Kn3A8}$8~0D6ik?8m&_P|TB~G|BKFrf} zLY3iI>7EcquVsw59Z|1gEv`&4e-BUNc-}?aSJd;yVc~QO62qTuFlc6P?aBm`-gWD;vYIDJTU3@C@LH0#lo1BqS*r#1IHSDec`TmD*QvJh&?T4z1BC{-LG8` ztl@(ec^xgAzqNua(1>6?5@S1KjBL9}R!;_@5(c*cC+d!`4&CG`TTkbdZ$g*Vxv_S8x(z7P~VYzB2MM_ zj!`-w2`vSW-)oZRwiuC-rDW$+E?e2x4m&kAS+7OBJF3ns%+g^xC$>%S&QeE|cni=9 zl(S3S|0tZl@EJqsP{_47;c0|DDTGZCCW!$#dFggpeQn>ed|`J-<1`aT0Tj`mU>~JjdOd9XbP=Ii@5vbt&*J zbwxfO!jQB{)Ay4qZS68{?UH-e)}Yh^kUsj0hjU(*Ej5VDE zELVSGvG&He0{ECaI8#Mx%GuQt$;brq8p$od@k~8az1ZSU%gVj`N*eWXp%%Z`A*7Ay zK4BkwT0)q8NVM6)ZvC<{|%l=o$hC+`{tJ z>zAEp!VEx6<9$hwV-KDT1=&X|W8L2*uQ0%Ganmh5xCv5Gxv#2g=RsUIQMskS=DRnO0;BOl;rftWo{v^Cutx8s!#fi+`4bytA60gae~{(VEp_f1nu} z$7S-RjX~aAtkLO>S~#7=E_m&-97x<+7E2E3OOQ^eOa#5KInnIVl<67B-nPwVT8q^hUvH?72OLWM%i$R246wcDxVXu& zbj~Y79bpSiS4TlyD3+Cp{91$z`W)9}Q323SHzXLl+5xzG4vqWXt@!9oa7r=?NCc16 zS0B?2Ic0_H8ng2=`XhJQIcGB)Pv!c|SLWQ4&H7JgVoH-7h`Yk%{nr+G$^?Y{=%Q8j z&2R&^Tv>gU_-=mzH$hFhKrJB)RThsVW!47{D)zIrS1;UDmI~{~%X3XZ$HQ`ItCOWd zOz#J^j{2C6)6GspuLzXs6an^Pw+TpGt*=ahMGHL}U4GbzT^63yY8`u8MSC@3%BxO^ zhn7n!@sz%6s98-WOu@PxuqA!M{Pi)gXeEul6<%VWPvawg-&`@p#-D#GwwA1Xv)(7d zdVsv7Zl4`<(A`v+1u}<_dw+DPWtg>v(?apT-H0p z?PfPqs{^zMAv>yf0=c5SqGKbWxtd#qQ2&i!vhSBMkvL=SyZ;#92WZ-Mz@|)Dvp@<{ zxg`YY-Xd&0X?|lmVB&pl#FU-9U=__JIWRwo5oymXDT0()IArSxOsh><+k*;TDis{G`#=yeV6e@?1{0Bv9_jDem6^J-`j!y~Jl4F)0ocQBSb-5h+%fv6f+zGLj9($(y z2e}h1{yp;hdxY_ogJY}Gzy?G+z! zd@EC;K8H#Dh~DG+9&ZWf(;aeDDLLP--;F+!*9>Rxzy|i7jG|cF8RU(W_Rl^p=gVYl zY|g@z)ACOS>Iz&sBaT%${^OEwa+sh3ZEmUp?gqc%_x0D#t0bG?^A6F;%nY)3iZ&Yt z))#&T*%UyWEx(HE;DU+??wNmb9ApdA`!ftgF7*_*xY@XLP7D4(#`RLfK-R6b+*|p! z=Uy{I*Iusyq7oX`vX60>G<9qaT+iy+^L-H{6?VlM0 zl>n7-_d+F}_21gf{F@W_b$|BEI3ePxcGui0VaJV&SIMu709wD@z?w-Ne3*ebks8cI zXwpa0MM-5P$)>UF3Qp-f|YKiAvf* zL?zTzAyi|&9~MRsT*UJ(m!wVIq)dWlxz5Th;Va$a=Bypa=x9JwsL2rtP)KomJ8zAZZWvJ-RLlKKd^JLLw~+R= zCSzuKLqB(Y>r_pdjxo)<$t=ogh?FI12CRKvxx|s#ibao-D;kXte4}6yo8-Z=Y8&{O z&zlcUv~TQvw+-iokaBx6;9n!-VdkD6SNf&vT9G={~69%^daHkr4ez>2-|2p za{*8p`%~uUh-asP8IR-QTKpzO30b`?C2Yl}*QDegg0Du!;Me19(&$Fng((-~ErYMe zUN-8=&*l=YSWow}-hKZ}RpN<0s=Y4VDl==1x2nj*@UCb&Fyw-FE<5L<2Q%)i?Xd!q zgoE|j+bgIyYjW~%!O?KOxI81=@9oVd6VNN9V?J(E-xTBx{cKa0Up?%1E3huuW?>J4 z+$!jI&ef8zHuv^n7K8_~`W^&)wUZq332RC38UM_F@ziI%gn;+UJ`J$yqQJhYmD|gK zr7+tKzE_KbDQUS5q+EE(q7`}ivodxUTtE13{ptA2WHkkv>DYRGh>1KvK)SjP1Dg=` zl%z!`s(i&VGxh&qSv!%@f~h2KowPq_mR}HREgad^OoVl_be~E2mKvD@LZzj*Sp=6R zC-Igh*m+XBEmwiae#AE}&ia?3HEQ6Yb^Ig4C-AV_u(NGdT!`{^-23bk+j>>hr;Z5JHY?;DSEa-9o} zYgX`k7Nv8zFq5Xl%cO3gdj5H_HYucKd}T~EWJQ(c?Pl;D5}zAW4bwSbl1W=h7zsFr z=_?oVs9swZ`{!|S+EV0JThoTOo2_H;1gd%*s}~0gnewa&9vur1l4o+rsi{&%wE3g< zI&bA3+q!(NnnW!uRgS97tz0V$j(GZ$DhgPN*4Sbl#+iM_<|CKxeZ5~davyu1d)dPx zcHdJ`l$++%*1s(u$f3E!Xd|H>z&yjiGsQ79s0g*|hkU*!bK@2E%J zOjv#1*E(#5?XAOz&2OBSFBR-A46I8`VOK_796;Tb{wZiP~9@zOII)k25KuDu)DD`k|2XtX_1P zW%l2y6x0Ih7`b>@ygi35hoG3ZRhD<5@}03F^c#%`Kn!5tl#gVP_`j;H3>tKLU#(X@e)lZuydceQ|2A z$&XuG!>7ISU~j0b(a$qQ?F40x)~`M(~-EZ(SlvcRof0-k3s8 zP|_ej9cx3J$TrFxfnzj00B;R{=X*oyb~&<{rat)A|M?m4lEqa2n&)KDHPh_Df!F*d z_e;sCFSfwiX?sX}3@|~EcJs`K>$0zJ-VX3f=5P69qJE!D$s~RD?Yi;=KsRO`E)e?S zbDfo~Vd?`{@RWEdalpJkcnLA+ZVV6^$$#8UCs5bhMSS|@ur<_&`tdiDpbJevPgs#V z6~Fej@`i85Rpi!LAUX0)-Wukx+x*Pv0A^CwBHE6Ac`hb5HCLZr3GCz(`Y4wpc5O;a zFcl^oRjYvw0}H|A{l}Q*xk&RojuUsCwV)~A9{4IBunR|)1SJh^PJ`**9>2u~j*w`; zoTq7n)5JRaMW&&EIz8(j8!aAB967?O=+h~}&;tceV>ifDQ%8nJW8UQ15W#@k0(1tT z4SsaN(>8qX`{68WikPZG8G=LG6PIN;7xzQ^=sC31LtEOXAW+4KJp??x%1L){;vm1f7V4Y2=}{1?&ego63X48*NS2T z_)`{j`~JlfE&iShw_gke&6j6dg)eP3!Q)5jQDxkpYiQn()(!+Uwo9BFls3#bAy|oa zynCRk02C>6p~OHuH@$00^(Ye}<@k@HBH5waiwm4a*s$Y2o>cgdG3fNVzH)Sey7dn} z`1UKEzkoJKbgX%+=0KWq7b$a#q!coU*y64&<|(3{hvdpkfS`0)nCiu&J`$hT#5e%8 znKxIUeJwD3`X$EsLOSO^R_A|?fw(f2gWhqjFUY9#0Hb?au3PU2$h}t|9KW@wQfm1E zcE7RQ+99Hj3cJTXHNrV*Q^OGT0WJb?TE~LL=x5)f%7@w;VK7Mi6xT>Fz-$sm;?sT0 z_Sz#2`>FAid;O~5I$BNHWJRVeXK+M$dOh7$?dS1UUmU7N8bQ0@dvvHNRsbj@mF7OS zFg@x9Dvr@HY=O{Si}rl+eAu5;9esoAx3Nxn>oS&}zl(=3D?CjXp-JD|-|X%2Z++Gr z3HQ!v%mPyvj?6t8!|lIQpVS|JG8&wCDVLbk&#WM%_JKUqn^J2LnfyWH(*_e|wGW$2|YxT)9*rdK> z6_R*-xb7-f&Cck;SU|#bVrd*O#+IM&Omm7i`_1RrqZBM6#ru2_-f$U5m(-eU!CKy+ z)p*LZ>2-C9(p_e40#SKN2Nx7K_T0TZ8d*93B1xbX5J*%GUU5!AvQY3HnEf!%=OE{s zHc<(w-~5?%jjH+~J-sYri*or}bPI?*C`r%Y4ik{O*h|ZBV^i&4T|zay?z-%(Lg1}I ztmwD`j0ixtmE+|X3z0&z=IfhkXWPcvm5-VzK(Hv)6xQIA^adnjo^zNX;T z@gHL1a}p4n?N(TzToa-N3u5hTYP2g3p|@~{D&DoopO?EwUf>D2j}2>O9Ahw~8tzR5 zpL?z|*zA{6!xg0{?msy`gXW}^X?9`Rj{gYg?P>@RDeLKf55(N~0Kc83*~49CF42|5 z;SRr|)318j;^uUVGW8>gXC~&37X(v_d(%_=5dq`BP4ej{zby!y_D|PuaQu7+gqI4louPg3mVOap~NI}uvYh{F8x76F*JP+Sr-k6@&7LBzoZCARQ&YATK zcTfM3CN9S=pdW+Mw}ptlC$xS=_}m}DOoF!a=YWNH->OQ0ImPaZkCuJiLDnwGW`LtO ztH68b5x3fZnd^V~8raff8UHTYsV;xyokl2H8$b^DdH*zszRL;o1#A?sP6$~>F9e*8eiwVJ@ro^>{e9mvH!_c zR5@zIv1&yD->T*Wfo;`bk@n5yZ4Y72=Oh_^ucL>{enK|?j`x1+RWZ}IP`{G_xf3;! zuUM)HGPw)^cxP$+r1bZR^jrPY2o8;e;bvWC{!lHT(#%M{9FaJGJRsCuuIWYryy6n& zTsg!_wdj`IJ%}$oFxl)#CtvG7u7dA%ZOZrLB*bqo6HOxu=xe|JXoDM2k1X}S1C^#v zjU321$F~d`tk)ktz(Uw@I~TKsTwO+NPW6N%KvQ=0P(3C^K|SwUonQ&)#s1NsK4|Qu zr?3Gr8g}FGb|{Y=IQQsc?es7F@uAqtDPgBRVDhtxS-0L@P^sLzBO=u%zxZu00~}a| zX-yed72~LJl%GES19)xv!r|;cu*peSgY#`jDMI?W2D_ga1`w(HM$19$v4}@eN3Q`f z(u6O~nvZJR27=&n&pQ4T&}!$n-!Jn)#L%q{EUZ=3&9XW-7!Z?T_t8l7jX)g*rd|BS zG6|kW0BS@a2^+4Kb=uw@LHsr>A9D9gHb0ms)giwMS?*^GE4P8Uxr*Q@!U`#F2z0!h-djSvsn3v)eVK zK-fr6j{2N5ISd4sIEd#+!T>SlkyaF@H8vLNozQvb|9|KCe{10wG3hN^$eojViUUDc z9?|{@qJ8#L;(Gw>51>4Z3dwpru((0l9Nv)pYv`|EByQ4-@dcp$j2p7*-? zs5XIi81M=<7ma-f#@`I?f=dxhmSuzM0FfT-hR`|csf6{TC!F0yCNt-js~qp~Edy(Y z)OJx2nvmA!$@kx-9|=f=+4cZ8e63`Kj$07@JDi+DBXBb5YjO(EhNrvp+kt3*R#qmo z1q~nf9T-bbP@mMD=x6km4$ylRg=A*FH-^viB(aS)b|KdIrf%7wCd<%m8G%*m)+e)}C&^AlSqO2V{W zKo}Kw=VAmyGe02qe%cj#|MT)FAB0R;KNkw2zAZK_6sN4^T(1*F@CqlF*g$ZP{$6YV z0nVheM!TwQ|1#{yGNfMoKeDbo9P0LaBNal5B)iHIS;|f%+U&A7V=RpR)bBI(zHhzX-`_6RHRtm@&pG!w=RWt*oE;e6 z3XC5Vm}AXqaAavIA5_EiwxZr#Ukgs3JZ3`~k>yOQUu}(^bpTlW$huBPrheAg`q$O| zOG=j5jmr7P^7Cfu!5)*Q;&7?S-u<*pa1Qk-i(mJlIEo$vNCK$xN{VNWzsK|%o z32M4ulBiBBe%fwiQ*j1@HlGfU*gdD>8C=zsrIf>ar$FRkH`hlDi)n_5xliSH2=6AE zMzh2;XOsNk*9C{H?{@5uuM)G0LFWzoU!v3F*S7?Z1(1@l?6JsS4)$bzv+iRp)Xc(c(3B64(Q5f zRkPMD90Xql>Pza_Fe^M1=QYrYZ4U{S*N&er&M%3UY%WB3#abd;0vo(S@kl%^ehSL`_VSbCJSuG*dVkCgE%;4bsiV6oZ(j z-u0UW)<{2WS86ac0=0d{m9WeDfxm2nywQ-NA^-@0i4+9KYm$Qpl>dIwpr}{1B_hv6 ze*DBXnR)=-_l+n+F0~n0A(FXqa(=*=x2Nz*)dLn@O!6RO1R<`+&dgcQQY64X@_NI5 z8KXTCI#J&OzU8s-=&q*l_I{#Y?KU0oM>wX1p6)$`Gmw{ONx+Cy>-*owo~eUJjovbx zchvT;daaf>I{=U{5qo7e7D|d%@#vd)JZdH1$o)^Zk_~A}*NRA#%T+S5O=Y zR&amObW@|~@_YdC*owql8gJcTjojm>t@~U3Y3{JUKvCs)=A&%<@oW$0qWmpkr%%wX zB>+*JqkH6&0HFSx@EL`8m*`@4#Y8N-`}*1_Lwb>D(YUku_ zYDpR2utS?}ipYF66T?!nA{-&p1wP0fJ|=iFMD+klPNM*7J@Bt!8d&l3(<79(zQZ z$BcS8fZ)A4F{zm=pF-w-i7}1xF>xCM4!UBd%cbQiL7t;^BwKv=WU|!8a~Tyiejx1~ z44l3N=gqH|u7CoG4m04M$12#`kZoaUw$N_v8{#EzUrr-&=a4~@Cn|Q0#Ni!(r!JeT zj8XWX{O-27V{+>KFNo38=WQ4sdVV45ktOf8CiAmF!ykBT6*$SeK}R#IAVAnd$Eqr# zO6&;X-BZM!YQdaAKzx##Yi_1q{)}YdV?ynBTT_*{TgEF^`;RIws@6$)1Z(LAgy${Y zo-qij(WLuPkO?;MkEi*$u_BH`pZpuGjGB%jh*s!^Y=b52v#G?D#^I?KEN>(jmv{%P zc@c0|FGB>(lHb_^!wqjd&XGP22c+teK8cCvXRU=_UCf`{1_9Ro$7x9pi=Hs=MvC3L zUl#VK!7D%GF{2@?aVq#j7gzhUK%=5#53#C#Ih8n_fXf+0ni5j+ovD*A`+Aoj<`G{x zN`JrINtH<(EZSoqUp8jZ8*FK*$vp5(aMHeB+nOqV1FP@|D6eiQxP$MootB<^HNSjk z_$z(nd)gtbv#)F%^&ty4Je+jNz^zp3IBPu z&z0Z&=K-@5uJ=R^p$>N3peO5*62@=y#sQ;fOC!G&H?FSiC|peC)$6|)w6trLBJ{9( zdG+OkZPXiUS%Ig#CNfjKs$ORA-6_;gcFK~fW}^Pc_mQ(l2CoiyS#{((IZ}&6;;;?b zT31qw4(Vc##SN)>qF_ZLV^)BtPRK#|Tq}?Xs>jRMF5d8HAQq6!f}r3MM3H~p)Yq~b zOS?s+^+6OcOuGQ91GefEii1!uqlU3~tjn#A5|1;@ey{mPD4m6x2eNxxF zKp(V%c>V)IbQqcdv)2kYx~KwH6XO^+83pyzPgi`O4K-h;h=i<SNBR* z0h4n_bT^+0HC{cXnT?Q>zHME!9ijlNeXv7h`m>~9j6{z-2Wz_YqRO`}5K+(`r)n!= z-!Q)N<}w1&ODvZsYT8T?jXTcKKuJTF&e8HKRn}aD9fSEMa z{;su>971o%xfO(5T?@{H9DW{TlZ7!L8CN&pb&!CKYT2wGxC?+Zd=Ujct>w%xao=P~ z5lxNx8|e;HAd2U=hi<41wO*OuG4*9h+IgXJEsHLIPs+X8V}a6Dk0qSg3{N2_OY`+J zRCT=IJcTFUTh#mOi)fkoYhgWSJfGK2eYb?2Pp}?2j0K%X0F-u^-tyrfPqQG+fib{$6a&Es2kph5 zbQdv)Fx0r5kkutjz5+lN>9iNO>ULvz)F#U+do=qrVcs+8`!n`1fc({5slwK53I}Qr=(d0uMi&)SLt=8bH0_XH3?+wJB5de(r?o_1fm7 zB*V`n3y0pk+PZV!-J_;O)E)66;WwrU9K>qmmw6Blnfs!Tr-vnI^9vF1KxYpABb7r znfjR^w|I-x;pvWAbdRMfQ91v>brZ8UQkUrpRgQ?FOH9}FbMSe9(b8Av6Mvw>3cP}Q zHSsq2cv6||)kMfSWLOV-N=Kx3EreL*WJUaJ3)t>+`nnX-3D6t97%TScYUBH((gc%8U*%dqEcIjZr}%bLK>egYc(pzEm$4`aDecQ_zsm%UjLvJp6^m#o;lkHl>`I1av4T#u7fOHzEPQ{~ScU(n^!Aq#oYB3g zTK{&!CC@BI&n8jGM&mS1;A-Ji^Hs{Ie$UolI!D2U!H)BR_|w;v%NFI-Jy0*6T!SxJ zmYVK;L0GAJ_1P6(fW#urYDZ@wHqNo4f)ic5KBYFv51hek2W?qr`F+WDlR#B@B*J(2?9>PIPD0L~ z!TFcD!9L*z8hVQ;y8UV#Rs9b@!T{IA=FZDS1+a730S>ALezo0$6#aF(WrQVxMkMw3>M>R3!z3jWsfE+(d=)2$`0hWo- zzYApk$QzH=d}}9_Fdaapoq5XsiK6pXc>uvG#Ex=A+#F z4USkzDD6GqFZIN7_L}-@>k(e; z@`FkT2mMI;R6SJ5OVuTIrM|h`^LE%eVN3 zKzh&OZxJ-I6Kq4~n(8ro??Q%vc=XVtE3CKpZhV8eM0Kof1}V6xV*b>}1%q3PxM}+l z?y{51%2TixEJEfie$n1^N75}f9fFwI`Hk`SAuSEizoXONE{u8d;*>eAz1=FYAYxTl zG^=v=(r@#nEf$qI4pFm?l%on4x{8KR$ynfgzkgZ1; zAiN8`C2I{xrsbx7-W8yK@8l}Ol#Bz$*V2s_kGs?uy?trLEF1-7OvEyh^l{<0K6l3;^bU2zs`kw z5pP1V;-XCsqh}_s{Aua0mWiw-QqKL8lfU*s;4tT7%wFmHX;NM&T`=eUVXSRF!eO6c z-K&+xDvU@(3s8yub-g&!R?f?Is8uz0+sIM?(O(G0x_##qtL^>XOcdfuhkq|#i6#ia z29Oq52{%G0+-V5vfU4SN)>C>`3a|6f*JsKE&2CH2DgS!KQH``hUxs<1K&_jGycg|# zTJ>1z-9fb2z<5%;1jE+?6sy;;px6`d$-|=HR-KNtBfu?|VNf!RTxuj#wh@QKk z@KM$ewyuBIIONXBBBw0vPhNqm=K%De(~oTr*Q9gU&ar+cust=kffpRVOcnzLV!I%V zB%+7Y=#$BDrF{SUFA>9Rxx*ZuJvPu{#2#(LFlU=Q7cOMNy_UI%PhL7u9tYVe#w=b0 zHXZnjN@}V0?$nd|y;ts(ip0oi_QD*M3-uV*Xfv$A-|JF&zSN#}*Fj21k;U(Mz@1tu zwk0*6Nq~1WK`1fff75{;=ggujw`NGUwsux4N8}SIPn#H?s=@bfW(PHVfU&z1ZWNnogV*9#LkF#@knQc7OyyI)Cf23yl z;Lc)<(_+CPtxcN~!i8aul_wl~sNIDmN~nqX)NDY5iAcl_t#Cb^L@|&}zpl-hzlEzk z2MhjrJg)$QM((wH7f1M#d&oA@V_$gUx-CLc-oYFZ8wJD6>QbtQzAWkWAUgi7$@I8p zf>qBc$HrGj`jNztEsR+5Z&@b#7boDjB~?y67hRSV2}9rHlv7tZGlJ|$liEUfSe~zP ztVP#l*O7MOe{e|{5gcDl?L=K{nSyrl}(r(K?Z=t--C@iK`AC@&)OHAU! znd3_C7gF4*MTf$1hgfhxr&|+UZn0DrD4=i!ep_DMA)lPz4$Un5HW*e?KM%Ok0ll34n}=eA3N_og@6~V*|C6>dtl1087BU_S z@ff_vy()yDqow}nqNwQ@J-mW}gC%DxQQYSx(KTavci_&KDMvUK=NiwuXO7D3bxR$z zFFy9Hu)Nn1_x>7gcU%k59GiS*YxV_`g1MJLvKVmCWPX7vI<#*nyyzHHvES-kYHz+^ z$M_)AP2AwtnZ;}QXeF?rfZ5Fba$qP%$-%J0uEke~FVSponH3}ION_;32F#TgwYNv= zIYjw9YVjQr^>Ob$&Z*uUZ)*C#E|I^&r$i(&!<2k0;^XJ7%YwoO{&-J5zaqT>Y@~~t zenQjbF$uu!%KXn{*tw#lz9L3X;JJZ`@B}Z8b5W^NFZjL`j7XZ%i`pxyQ2lkOw(vKu zC4wTA{*gMk)9j8b4YkC~TG-wbUaYjL#~^0CtP{rVjd=m4xbhrWR?o>hicx>IuMa!XLwcdjGu)q5v3>?@t)}F3w|j&nF}Zt)WTzKK2l3 zXZ?PG{Gurn?kQ2?n|1wXWAK48W-d`1p?FhGbSjE^{Ur?8D3dE!^=$&Pfy4LW>ncWW zpL{Qf#$je(3EsnKrtZ7yg*1M&JTK6X&mScR03}L%9%z0xZ#M`w97We>rsI73|l2^PQX^_Va zmupklubB$2Wgfx6SUX^>w19KOiD}>r=l8v_teR4dd|+%$Y(|Cg2+okofxbpm9Uf&Z zpb!+gnSqZSunzy}EE%~oe$X;#RtPMOd>&dvtzKzJCLO4rh;^q&>Y<<%oSy#3=b_a6 zH*C$joQ&L(kwX6sLw9WB<=2Oqd4wWkxk~QajD;*W#(TjG)Y|`u+=A0#v?WiEq$ev_ zqq^}t(Fb-X`10>Qiqz25zwnaOZ!7z_?DEJ;&8rQE6Hi`*S$So71?UU~#*S9z1qhe8 zbbcR~<*7dTuKIGng?7$3GWp1hL%;_)i(k#;vvAN5;&1YE!2Zk7pJF|4cA;=fcM* z??ZsyRXn~76*VB9pSKx2B{LFVocEbHT#*V;JG6B%Ea5n;o5$4)8U60VB^eN)urGGX z`2O9HAAg(uSg_+xJi>xDBM8 z4tIdcRh+?z#7%CIDYW)>?e#N8&uc^hb}H*n8X-zJuTI{yc+n_Y4F>cdwZF%;sFP`n ztSeRDaIM0%%}v6_fc{-7ix9r$ylQHtie4V|`u%Oh(q}}GEnE38snrdlp z#_F2@-SnsJoB*2GwKZJKwYGnCS*B#pFO|I2$u)nPU3R1ZIA2$ITwxx8!z21M7xRk7 z^==ZAF%^1}NGclwQNUyp?oe0p5gwl@k&=_XDF#G4dF9RPUMcOTCHXF5Hz0Orv(ZR_ z)YKIE7^DGC@yqX80aBXSwYfdcKN!dB2GTUS!e+Wq>ob9psw2Tfj9#8u+ZL!ohB|Mx z5b8sCdcP-kB+KXey%rmQ{V#k|eRamKbx0L#ZfeBy82l#QMV0WnHAr(Ux_vx82-q7t z^#S1FpMb@s{6u5k8#ADq$q#o>5ggt8! z!0YR&o~AylO0B(@pXBUeY6U5`v{4Q?QmMju-QUO4Cw|SBBXFb&8B{}ZUc0RmdZ5)a z%)c}rB-Y|fmzz3TKk3S}lmw(pcBXQ%p%;_luODsJ03XyjzG{Ka=Z9i%*1ZjCwl$Qf zk=CLW7n#~mRD}DIuke&aX3*Ouc!VTQ~7-*{HlH}&s!ojaK(VERh zI0}edtMaZW*IE(e6yaZbzqTr|`djZ`T=-?W`?p5Y$LG^R6PI@(I3-l$q<`O0!2FWx zG&w0f=74Tf6MR689%?Lb`B0jT*cFvnTq`<~NYDYsP%{&s;@Xv1?QlYqFT(NsRU6s8pdd$7BlFDV{AXvRJ zTg^ik?ga?IOtrwKWX1*+36(=NX@jm`2jNy%ijoX}*fU{)%Y3r`jN|3Cz^b)ke!x3^ z0PVM}T6L@gGK|Z(S`kEvq98?HrkEF$W4|m6>eg7b1~mvbff7>}VTMbx#8e>VDAlQZ z#ob}E=(wgU)@x5t*|Jf6kmM$3TGEIN`HAi{slq zx~IHze%uFVO;!4Mjs!16)8k&PBKYovdSLEmgjbp;8iYY@kS&&U(sw|?jNBnu*wDxM zC)|Y`#g@+>VlwO(sGVKO#$ijA9b%QoZ{zsm41WB4w;DeIqT!pY6e)*A)(Z(B$;9zT zrr(KdZ&OY~YYrZ{@s1sJ>Nd}TZT#slxX;8wzxzlLV7q5i^r&JrEcOs|VISB(QW@XF zo;?>64NDI}-892%%q+l;1rF*Khpl=9qsztwQ-rPxIdvnN_MGI88G?oY&Mv?4ARa|p z9~txSwH8#4H}Gg$En3wbpE|oo&(1deuX6wos?v{C1x86JOckwW_*|*HQa)aB#AN7` zw1MmPEsm{M)D*^iT~)k*v4N#d9Hdp8}9 z)0PQ}FK%Z%gZo@5bvbHZ*SwlXZ4xsVLr~7-i{jilehkL55@WNOipJM!vgLl%RN(PK z2gyYK$I;qGEIwA<&xIZiHU2eF2ev8(MLkFjG=G%RUYMo;wvy;Vb#c`W=iW8;5V6G2 zaJbE#e6mZ=mc!vV%Di8pe5pDJ{-|t`aS!ghw(>l0m!M4)?H5vFf_QcF;}esi)PSRwUR_w(9QD_NRdCW7+vZdPRK zib@CB!fy2aZSlJU%#)=6An9TxIPqh?$PIz7hu3bSAJJKb#8~{kJZ2ExH5wQq<+m9- zo={&VgHJshsR-@MHkz$)D9<&D2j)%EvR%@0Nk09bVsol(@hc$w$RQwUYJy^9|IJD`$O7{7AYC2td*nFi&miUrYg3vm6|cx^k<=WxSAr2_IR|eA8^ug zLfmgE=gCa98pObRksq#N!txQ{?xNoSb5fj4QvgGP&Ha7-a3TsR- zj!zynUd$V{>UcIf=_CXeskd6#r-Sd+>92v!#E$xTdWzx8PDa(_1;FR-&^Svc1t*h~ z9As`|pqR@7C9axUi(rwXp{F3=D#gT*84TSm=l~ZJgz-THVevZ?EueE{F^`~%kt@sID5iFP$A28LWY2JRJg0wCmUw>0TLH#dj zj^=Dl&U_zY_)ySybVu`ACi2HB9K-C4VEDC5IMgS<0m2l=TbnFY-_4x*$%H(@TK<8y z_%q96`zH_niKrR;5M*17Z&2bjRYlTDPBvBh-+PRwrD1PHCWq~pHywlxHrSMTC}JM0 zBq>b{-v)w|zRSgElK=gEt#A`b$_%ifrx=8s5KOqxGk6wpAJBHa4P53T0$ZC)Z6T9o z(de4%(ZLmmzqk^6$}a)&*lX)c=&Lyt_g*&7}B-GL9)rQNCaIi$9VQJJ3T+ku1V^?{UM ztbkNOCN&I@45bWrdG7JMFe;m@?$EVz$(}M@ng~%p&^BJ7D)Hm5mGTh-yMqp2 ze^8A}ujwE$w1%>quLGg=9PzP2g2lzn;Zgt^$+Ch+oOb({(x&BRuru5quti5}dg~x} z&u{HwQmu=+gmoF4!3XZJ!KRZMJRAY11d_c3 z9(IT2)QxhUzZDM~e{0mu9k!4(s0qB?8qIqTZ4=Wkf;k4Gw%v>Q94A0PKLX?kCw6NR z*u3Y%t2qsP07**!(i!*0*nSO9F%Qm7cPiqBG=8#UoLPgP;d@`%n(3fr)b<^mnp-JS zdA@AxqVAoQ$@)Qsf4gH3?aZU`3cid`w{8g8&zH4Ot^Ymh=6MFM>GERJ-_2AK_mXfG zXgAw~8;1o`hsu3!9geG4RFlLsD$H>jCt};hMewZOtxEy;OJT~>uLNB*;M{xS6-G%0_iGB)&-`5vSFr8v3mu)rT^rCD5VM+U1=C zgwkA~Op!%{moMFA5PP&OKRb9EcBFvkt;(q-f`FCF+9~VJN5(YdeC>}g(4?;xgP07^ ze1IvLF>R>l4WjvroZuVPd7qP{S`3&UVbC>6dTk$fch-fyf(&6I(}g1K{kl_i#;D%6 z{dI4P=4vjS=W~-^KAcY;a>7;*zR-4n7X+2yOG9g$t7h$2>eYj0Vj3f2X2_?2S-gqs z6`Z(w$McTu1IFaF`WDagsIN!abnFXK#vU^;wY41U2h>FJBh6LippmD;qt!dC zUqMi3F$}keyy}6i*^bp337#Om{{$L$@ANJEuc}%&g&UMF?cc|ypi60GK;bQpdA>n%vJ zsR<86R1aK>@5Dh#if?-;YkcKQwU!g{TuF%HlwCd8n`sPav#crfQ+eVL-ltVICg-kQ zX0K=eF!rU2tqnIi^;Wm!x{O&z0$rf^4bbNP&FHyE45{`iDg)5s^#@!u!7SUOl*y?pn{^g(Hvw+I zj5&wQT#?A}M>Z4%zlr_$)?>A^Ew+4S$4Zl1j&f8ijlI*+EjQP458!;fM;+IP;mbOz zYM>{1p{#avl{>$@lRCP5KU#7|UGT>Sz9g>_<#?2%)$_5xC%u=Sb!dBM-8J52X~zT- zF}RDbAK7)k06$9bw@9&dF&ZR|=DJEG=70;X$R zN~3>K07e@L;=K&GlvU{x0V6lQRpfRpM{1kO^b+ua;t4s>p_(wca{Ay+;{48UBX2N_e7Z0Bv1Z_zL!Qtfz`&i8*Ej%*jXCS_I z_ZM~LS96ebVd)%x<*a}^1^LhdkbR?uj_ijI*x!o}8gc6VS*S511JfMY`=mDt#8RZD zV`m>J2R<5Vi!hXtAAV3Ux0~TD7R$96RC~u>QvJP!_C*%#}X1}ZlQ^m=W)QK zMApKF9McYi72OGs{@5EA-`Pq>Ur(eiLRi(kbpQnTmsFzkEv4soI#RKnx1~~r5M&45 zKT{jV$=xpuZUjoI$S;6pfEdR=Z3?CRQ?p&Lb1o%@TNxse+m@0d0s81-Nwmf;4QT4G zxx;?!^uexk94$t>c^E+1-#g;GB0PD#6vCWvN1O-8=Awq~6j&tc^l*`4TD*;0eaUY^ zA5TZTS`VX&g(Y%!*pVAX%d2RNRkvh#Ewi%?0BzE!wrp*C$7-4a$dw%G!IQhLdALOv z7QgM1{hexkafLVS^Ub>-i;L)bztPxsl?$Mh}VB5N$i&l*u@=r|H#I$rYGo_9Q!^X;{^^RpSLCT_eoGMgmUr_H7_bHPJ-mt8S(R}dAA#dAwGX{vm$Rr_2PP!MasW8ZDtQK0 zKF_d22q0GfmuPSHCa{NhQr)z!wAY35X#zKa_NXUGjp~cT|M3Dwj1{B7zJm#}Mg4P4 z-)ZAo@16aK1CS#kUE!1ca@L`bKSih?>ymguG*?}d-%$|RU!@vIUiX5z4M=jo z>H0O$!V~vs%=s)0O+e;OV^`l@})(cD`C z2qB^!X;yUKTKBS<}?X862e8Syp-~I z(sHM`U+Wn^L)d$~J0=5DVR%x``7 zfBR#c?bn^z1n$hGVx{j+{cYvI@Alj!6^#x9{`8&?82gdDFd1}_(8SgzV(|}KpV7$B zJ~av1Nq}sf*@SL?Rfi+Fn+dVMU+}vNK{W(Su7Qk99{aA#T}lDw!B&zlQNx>Xk}qvC z>uOaZ-}`PZr000+Rx!j2z;uEV=j+;LAE)j^8J9jaUe+4lxt3GQe7@l_)Jm#Z`VJ;%gCwTbC(;F>O&X%>ih3#P{tg;a*WbJ_DXG zkfh)`hUh?;q{nov+MoO%bh9?+U9CgdC5%I@69Y`kd?bEP*7)~}l!SS*gvpMLXxWb# zrv$ve_TEKfqwyr4onVy=`wRTqrrqJ;0(5(M&9>Ga@F4IPaSSchLCDKvH|wQW5Fpe$ ze5oX_J`>PNR`*y1jNtp$1u@s$f$DEHXd+K%OR&}WooU|Ze1!38w}BIo9MdfjdHp<( z-HcWaso2u?1~4gox&~QPMBA;q!qxjXpT7L2U(@u@5gFf(K&Rx6XYN`T^`;Uc{$ZZeJf>YavuBE|CdJNj6M!L8zQFX)(}NZyUlA`NzX&l^G!|T} zT$X}aG&an|?t=({!xKANW}rK|>7PBkerOuE`0hCDLbw~&-p%w08dD$j-xdy=43({G zW46B!JX^^|;MuYh4%&wPl@?}8Oxy&1Jy6FQ#jLQ-vn_%y1)lyJK11sNN!dR>r?!~Z zy&ZQKJ)T=a_06>YH6Z(wTzj?l=Qg=hM~htcA2mhAI2z2`oc2~-dmPv%yS(pYE02L; znQ07KBi=_L%nUxJfA3x@-TP63SF2y9l_ZpFHKlh~5>jc@;*4La;|HaIQYNWp#JHq& zmU#RR1^dG>pJz)QT4|!?0l*F)N6I>QUt^!;UfO<>3T6*8;1->o;gHB;6?*ATGZ@LH z0^2B{^{$klB|Vf%x@#jqYSmh;QP;8~^#d;Q@1o4wh&F@XA>8O(zj1*|K0XAk=BU3( z{)39u_WH;6il14KhN-xhTN8Zd~>h*CUr$9f9rPbZKEfgnxU(rOCF zdja-n%`EPdP?^Ti*~a9u=!nJx)oiWunxzQYpv)>!E0Iq9%{rG{+}xo`<7sSI=SIzvWT=Ux%iv}#1tj^yN-3hgFXEjz%gNd9+TQ-`TCgX0PRzr9pu?Pegxfv zYj#+6eY=#g@~i&?p@bu=6sO=2VDZ9QeVeBcX<_(}sBi;F+Di?1{mBoJe$R#W<*rE^ zLz~er6LFEpYVWZfi(v(#oRKcDzKXU5lKyEC0EpL;^rG5pPI|Kl8+LAi7L7WQ1^ih# z=&izQwapNp>d}|3^xc}35EWo5-5K0TYrod&tDAR3C}KCX6Q8qFp$|RBxpk#`t$Rvd zi%F%t;1{9C2)o|6U?<ZR5=>r>rT8&#lXj;@m1wSSbgQc#52SCVuYOFf^^=Lo! zBrd-76pJ6hEadTI&+f{|+dM$EA>n^ZMG{?s6!Jdewm2OH`Eet2bjHU>{tqHV*RQg| zhjyC@oB4OMxKyBC#21~QzdjY}dARmuz$@Yo)Eh3N;Ql(+sD)2A>RLTv>9BMw&xf+A z8MYQ?mpZffJsw)_1g*rasdEl#Ae#!)y3}V5ir<2=b)j$pvxwC2SGu=q;zJc9a0%=p zrPkrg*~gKhuCZLphxg}709A!;LQ_`yN)X%y=jF{2g&luDPb7Yx%}YL(0oQ-&5?> zr{2GpUMB)mQi3Jmp23h?mmpc+LcaK3GJMCXAt!cNkqbHUiZb;v#PTHwZUwYVwE|Ne z^6#kEy|iA#gJ#enJ|4%cUk5nO@7uwP>36dofqY=9`Z>G^1M;SrBipSO)%3RZS(SSl zBe6SePl~jPG#|awA5RU zyJsMxD0$~2T7_>>%x6N@_0@y*3FbZWx3FuLFV19!2n*k>A@!Ra;CL2Ya>^LH8Iom8 z!BVn{TuA{wgF%tg`Rnf-LS_ac7iuraQ(GryY}{qyZy8!x(PS=N2nL+9$3?~n;xG^t zIptPkC0P8j%8;QUO%F}aA;s<=`~TsPd))iz`P!Kw>e!j8$(&jI8eAC$gv8^2&)7l{ zb*<4wt`*nsFg@tPl5(35?TO`pquE<$GwAqCqB}8u>ILAZ9v)%*R5dfjwOFqs zQ{g#d8@G#qKA2jQALV+AJgq&9)vavf#Q(%_?n~b4)tnfLz|MPJSdjPBA9K*$XV4D3s>BzuN24^Pwe7^Vn$eEZA^S$r) z$0s&mO#d|-R!3tVEF~E(o!D0cvgu@PiadBF1Ky^w?a#NVp-QzpJ4nsT6G;SW(uP>}U~q{(#6-XEeS69OE9AyaZqp`JcgoH&5zJqohbMo8=S3DrZ9TnC!5!T*0T5j(~bau_|}a;?dK}>U?%P zjR5ufl$I!y_$6Xxzp5*Ic_LZpwJh4}b;(mit8X1m=4*C;jj#mYs}0#@cv0y66W%mI zjGyf8&4VI#6VmAU9tGga6qqm|-_I)}m`|UD^@X{nt=>L&6966?&AUaT)x^#(xbd1p zzbbdVxW=Cm;JSB^dj0-NvPW8?V)fP^qtvf~++2s-jG$UD$Ze}y?cT|HIMEG`_ZqP9{Yw*LFCM)*h);>h*`@QjDfmTMq>nmHKGk*% z5rG7M#^#Z;m+)Hr2Hi#1>LP-wKQWc1195mB3&5pg-YAf++ULq?X*Zu;GoZoLzIa^3 z?Z7w?rT$xiNFxO4DHe#KyDtB3(rOmF})goJzZeLGA_wCoB{Bh=)JcS(Pg73 zg%IHXooqdyI6|@X#|zBHj1PR3frdtZy-8q8bhxkBxFon~Xx|5KolG49jIQaKRZR?e6Q03+{nhi^bxmrK`Mm&4l83!9;f& zmegiNJM+%DR~abY!rspD0@{Zhy^5XV$%;O(9>>YR3hj)Pt_;h3QY^W`sI znY3xHQsgPNd_>-y{owAK(T=3G#VMQ)(_a9~HptT}y2P4sn*;X=t%O7XK6^(Gg}c@5 zdlFr2@-OoLm){rr*1O5>Acj&$=5G=r^#0*HeooXq!25Z=Fdt>h^-OBm^h*ROitZj! zFkS6Mhm|d!k>|pCeyVq6ark!f_5oG>2e`U1<}qmq85Xc_=xo3))^tX@u0y7lpMnRa zCDB&DW?z``!7#%IzN~68jnxI1c-=A5=9G1|C!>liOj?-j84lzyk#WB>P9w=9Afn64 zWpWu72ss)m!QPqjb`pv#TgOQDBNzWg`fvaK=tJQ_v3ja?Yc+4zV{m{_#Xl9eUMgc4 z(!ahnUb>OU)_&?QE3M^v8jl?oG}vhZ3DWN-87vFPvK#(|h5|xON|z}RXi}J&FUy-V zBP-l?f}lRMS4ztzNuqZHp~^TzH$R!l>Y8WPR@k{%!t>CV%d%X@R%(W7hd*fyR^T1S zY0iP?&C@iPjPdDTgd|v#nzvhx)g61r++X{N5#<5il3)Ai*V)}7Vm`DdjPtlR>Q@%e zxoGLch(oP62o!LD=M+>47^3;7__k;}Ap$p|yctGyM0#dzYs^kn@Ns9-Z)-P{BAF^| zPOpMnckk@|l*Yl`bBBPUF&lmWBPeE6Ct3p@LzNCtpDOBgqD;}FX#o^1a zW?`QMv+xz5a)L=z?m^GXv)`GYfLesFk*_uAz&{IO^fKFDMK#Xg&+B(%uT7X+q5D_q zO!cKf)nA#E9%U-|Jm9&yZ}K1j-a#QBbW6Z$+^ipj!R!3VpMtzm5x!#g+0`!pi5Kfi zY9Ut9^0(BPc|;z;@l9{eXeGvjM?%knMH5XVd8%c9;jZ_uVaV7611F)_{%2C0#@c?K z{(hxXJs_Lqiyzac#X#_NjNyDLpM%Gt*Wi$EE4xg+#xwVgo6^ANB0=3=VG#bkD+ZIp zUY^Bij}OpvW(Rfh)|`wIpbfSi=2&NRZ#N3rr4s>YcBeb(9Qe@I%X^-Ju!vX zKXz8`mOWy^CmgNrQl*~dk&f@{%U^@?j6if6oVx6#$|Jy~1&!WLxd1gxqMD zn6Vq+kA(L8u1TPVAVD>DM0K)ZRpDUX3X0n*<1e2PQ-kEUnC24=+3X*3Y~wqosq(J5 zAi;em19^du61s>k{IL`nuu8fcUNqp)gHrgi%# z{A(lP`oGkmi~jD5cwYyo1UKm9zwXs^`Vh~oJI0ty(BNNS;}E7P#+3iRF9g`Y(`;CE z(K8ZhR&bej8Yh*v7`3HRSgHr{2zJK`ibQM+s0>3pL4)ZEBE&QDw>tf>VXW^_sSfA) z*kA*1ae;5(CX=tzoYULwXR(+WA;BRX-O<-Jo(_v7>6J$Oh=wd%{(Rb+SA(=V>Iz^E zBFtMjZYU~)E@M*W65@9rWQzPzV_i;;)+5E?epJ$X3e3q=-F+w2)NJPG)R$F@GV?E(}H8y{bFfVR0rYX_vRiq4|$6m)!8ADW)DYbNs#s~+ycxU}? z_Bnox;c~-3uzEf?o`Cf1XL<9zXL$wq{%#b?(~^|XueyUZIA#2_xgEPb*Syx~PE7~eK7VW9y!rZ?zBVw_ zKR1rDRDzok1x&50+1fpi+e=hiW~`nMRWgI-8xjRoveA7@<*T54~oDDWVhUaBWn7SX zqCCl8x5Zy3f!)sXf;M&2okf)4ynp0X@9+Goq_`U!@dhFyJqC}T!x%2qHrMoj0w`kl zK_C-_Y8eqlgqA4Wup`I=9HXi(&hh>WU%%nrf^9*8H64LhK)=!_zI^2D_V&9^wyKNM z=H&d)l!=bVsrgqb`)aHE&lLNx%U74BKigxm3Z?4_C$2m!lYs5iSev#@h}A!js@js| zQEzTvh@Z^nUlLV$;gu$oDI4Hje+g>vvl+bB0E9ipyFf7=Z913I*; zZTTv!@B^}tJ3Q$sSWBQ)`=WDpLIkpKZX%^~zE0#GU)@;iZP=#}v;ArEZ`+ZH66cvH zgS08@kC$gUR9V1YgJBo@Tr|Xzid0KL32O-b9OSFPn$&%qTcD}Z(Z+RDrGn#Iand3q z}w{`}Sx5{sEp#6lJ)PMYJ0^n!gW^b3`;Ag+x zm;|^ICTb4mYgc?Ug=mm{4+37-m=;9m?EPmJ3)TG-iLh5r;7ecY){3-IV_Lj%kIFVY#|Qk>6GtKU<5mB~ zqe?4r)Wjl)icfGTN1INK6Xj%huUr!5D8^1hV3-nwC37Oez)(z>;; zl(@zSnm(~UyOmNGQJ|B}VR4F+f9JLGGXjMEy6Qj?&_0~8gZ=1bZ&}`ozwb)}+D^Ij z2--^~rjx4aA31_Q=yLB-+qS76XI+Jpd`uW3H-xzu(TC$>pKp_y)ldHv2W*e|?VK17 zqXufhH4yMbD_kuCszM=+0v}wGKt`Rf0EDm%GHYQ zj^T+q-ZcGa!j#*$UrHB-+XE$#6C3I3=P^bd3@gY3%v^)LTIsurp(Fhe+kUQ;D zN_KzCnl%ZpNu8j+d?%N1ucP5DpwG<^VZ4jDO`Cd|-)vZM4L5?kc(0-sD5J<0-8c29 zMZnfhNU4?|15H20+AQWyxO8M-I&U%Qo!`tF04qUg<~yR9yjA7{I!2{gA3

t_V?0 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%0AE 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 delta 25696 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 ZSJ(ejS>&taZ3IT}69C=;>Pc6<{|6~?4lV!y From f021f7ff7a75fd7e305fa19f79d4f5a23207ea22 Mon Sep 17 00:00:00 2001 From: Aparna Date: Mon, 12 Feb 2024 21:34:40 -0800 Subject: [PATCH 39/63] Response package update --- .../responsepackage_redaction_summary.docx | Bin 140643 -> 140608 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx b/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx index f7d69416340190f8d60516788ead09bd23f11169..d74ed074ca22b2316e7af814bdd34e1cb26d312c 100644 GIT binary patch delta 11705 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 F{{a*#`RD)u delta 11721 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 From 5739f8c6080d274406063c72a70ea1307a1cc3dd Mon Sep 17 00:00:00 2001 From: Aparna Date: Mon, 12 Feb 2024 22:18:45 -0800 Subject: [PATCH 40/63] response package --- .../responsepackage_redaction_summary.docx | Bin 140608 -> 140424 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx b/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx index d74ed074ca22b2316e7af814bdd34e1cb26d312c..c8f7be0db5642afa4476c79d153928d7b17e2cc2 100644 GIT binary patch delta 9762 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 From 4106dd90b93498565b747a2e3aa7a62d34217d7e Mon Sep 17 00:00:00 2001 From: Aparna Date: Tue, 13 Feb 2024 14:04:09 -0800 Subject: [PATCH 41/63] Updated templates as per meeting Added Page numbers and added logo header on all pages --- .../services/documentgenerationservice.py | 2 +- .../templates/redline_redaction_summary.docx | Bin 143824 -> 141477 bytes .../responsepackage_redaction_summary.docx | Bin 140424 -> 141261 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index ed9b9a39e..af256cc3f 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -42,8 +42,8 @@ def generate_pdf(self, documenttypename, data, template_path='templates/redline_ if templatefromdb is None or templatefromdb["cdogs_hash_code"] is None or not template_cached: templatecdogshashcode = cdogsapiservice().upload_template(template_path, access_token) - templatefromdb["cdogs_hash_code"] = templatecdogshashcode if templatefromdb is not None and templatefromdb["document_type_id"] is not None: + templatefromdb["cdogs_hash_code"] = templatecdogshashcode documenttemplate().updatecdogshashcode(templatefromdb["document_type_id"], templatefromdb["cdogs_hash_code"]) return cdogsapiservice().generate_pdf(templatecdogshashcode, data,access_token) diff --git a/computingservices/DocumentServices/templates/redline_redaction_summary.docx b/computingservices/DocumentServices/templates/redline_redaction_summary.docx index 27e6d3115b5729bf5855812d1600318f60329857..e08da9f009f4842352a9d085487205f97d599091 100644 GIT binary patch delta 13172 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 delta 15432 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 diff --git a/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx b/computingservices/DocumentServices/templates/responsepackage_redaction_summary.docx index c8f7be0db5642afa4476c79d153928d7b17e2cc2..86a3730ab88d2bdd6fc1eb422287a3b9a3d6246d 100644 GIT binary patch delta 11962 zcmZ8{WmsKJvMy}g-Q5Xp8wl>fU4vVKyW0kWyKmgx-3e~N-Q68R@Bo)@=AJuuPOm>* z^7K=ydUdVpw<>HDeqsu~mLCozd#wzK3=aX(&jta30RaKwZtrBqYG!ZhYHM!i!s20T zv#+IVzs8O2M^^hzek`~+QEyJANU^mFVM#=N5@Ngz#XQrjEQ>Auy!iS=qMFa7WJ$~K ztIaK(I=l0ktlK%+<<%|+(=?Jm$%30BE5??PH_{^0tRnvDz|s#V6&4RfABmAiK$-?O zKH<(I{O;04G{m)9$cqIlV&>C2RuJEYOG)+>H+GR%vNMquqac$-k}khY5|{Hvsr9)4Xiu?&oA-Jb^#X;Q?KHrTzYE20PrU3r>WQ)r?;Ru@{_e+&} zJEf`;yRIhVFQUIQb%LZArXz%WM~Sg=f^U~UhPDQL8D38Gbc-sX>Fyw5aLhQ$SV+;U zhB<2)8q$kX855hOI}|qOCz&2R!5)DS5#aaV5Bj?v5){{NaqP8nU$L{a;_3> zW`!}zz^rN+%Sx%b@0#Ieo^^n>5$_(?mqk2erQ&mow2=+_m5&lU#|cctW_a|tmdq=I zS+e}>!{xsQaV*(-&@W~RO%sAc(xJOc&AcYNhpiLOJIY?GI7aa3&H;oVjr8!vji}hO zlF_A}CcG)1rlAB0#U>f{lFWXM`n_;QxFcAQ@i#1`6ZPVr7t{Us!9H?jecq|Uq~VuC z$7rY2BulPNee@miHgzSpdu)ZGpSEy{7)#MRA&+gIk~cws@*Ctj|h+Ib(~ei$F2M zz+&1hr7$=s28--e`SSAh067i0pWi5eVo^F23 z3*~N5dSm|;beban*b+{yoTx)1SmC5E284Rj{Oj+tF5vg{$nNtv@hHI4*TKJM%#A{) z)RH4CSnh(;9y}}y68%-wXc+g!kz9LEc(l)NDj|W><{eS@nv1|gP`8~H^)t3#=a=L@ zTU6Wc#~YE}@%R?#WcT3-5CTnxx?j_=FS9ZO!7E$HRm$ll zcz1Hf^{caTI~A)|EkH_i@eEE>^jZSB=#rG8v8eQy1aA1==QkVWKjoK3--S@Vo3aXA zZ2LXUy*?C1*a$TrRhLA_A9K~C@#<6s$0S^NrUx&EMSy&@iY41_LQ>YKSS=q>Hd

}PCDqIHrIP^~7u^wb1AjG(Wg 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 VP!Wm1h`_L+!N9ceKgS>J{{Yp4_tyXb From 51d552505a9411288d61b699f1613a0ee62ad3cd Mon Sep 17 00:00:00 2001 From: Aparna Date: Tue, 13 Feb 2024 16:19:49 -0800 Subject: [PATCH 42/63] Fix for response package url --- .../services/documentgenerationservice.py | 2 +- .../services/redactionsummaryservice.py | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index af256cc3f..c7abc7ceb 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -32,7 +32,7 @@ class documentgenerationservice: # raise BusinessException(Error.DATA_NOT_FOUND) - def generate_pdf(self, documenttypename, data, template_path='templates/redline_redaction_summary.docx'): + def generate_pdf(self, data, documenttypename='redline_redaction_summary', template_path='templates/redline_redaction_summary.docx'): access_token= cdogsapiservice()._get_access_token() template_cached = False templatefromdb= self.__gettemplate(documenttypename) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 523c0b818..8fe01bb14 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -13,8 +13,9 @@ def processmessage(self,message): summaryfilestozip = [] pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") divisiondocuments = message.summarydocuments - category = message.category - documenttypename= category+"_redaction_summary" if category == 'responsepackage' else "redline_redaction_summary" + #Condition for handling oipcredline category + category = message.category if message.category == 'responsepackage' else "redline" + documenttypename= category+"_redaction_summary" print('documenttypename', documenttypename) upload_responses=[] for entry in divisiondocuments: @@ -23,20 +24,17 @@ def processmessage(self,message): formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) print('formattedsummary', formattedsummary) template_path='templates/'+documenttypename+'.docx' - redaction_summary= documentgenerationservice().generate_pdf(documenttypename,formattedsummary,template_path) + redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) messageattributes= message.attributes if category == 'redline' : filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] - stitcheddocs3uri = filesobj.s3uripath stitcheddocfilename = filesobj.filename - last_slash_index = stitcheddocs3uri.rfind('/') - stitcheddocs3uri = stitcheddocs3uri[:last_slash_index] - last_slash_index = stitcheddocs3uri.rfind('/') - s3uri = stitcheddocs3uri[:last_slash_index + 1] + s3uri = stitcheddocs3uri.split(category+"/")[0] + category+"/" filename = stitcheddocfilename.replace(".pdf","- summary.pdf") + print('s3uri:', s3uri) uploadobj= uploadbytes(filename,redaction_summary.content, s3uri) upload_responses.append(uploadobj) if uploadobj["uploadresponse"].status_code == 200: From 823f626419363e24284dc54069f8729870477304 Mon Sep 17 00:00:00 2001 From: Aparna Date: Tue, 13 Feb 2024 16:19:49 -0800 Subject: [PATCH 43/63] Changes to handle page number issue. --- api/reviewer_api/schemas/finalpackage.py | 11 ++-- api/reviewer_api/schemas/redline.py | 10 ++-- api/reviewer_api/services/radactionservice.py | 2 +- .../message/schemas/redactionsummary.py | 12 +++- .../services/dts/redactionsummary.py | 56 +++++++++---------- .../services/zippingservice.py | 1 - web/src/components/FOI/Home/Redlining.js | 22 +++++++- 7 files changed, 71 insertions(+), 43 deletions(-) diff --git a/api/reviewer_api/schemas/finalpackage.py b/api/reviewer_api/schemas/finalpackage.py index 010c0fd24..702aeb858 100644 --- a/api/reviewer_api/schemas/finalpackage.py +++ b/api/reviewer_api/schemas/finalpackage.py @@ -9,10 +9,15 @@ class FileSchema(Schema): class AttributeSchema(Schema): files = fields.Nested(FileSchema, many=True, required=True, allow_none=False) -class SummarySchema(Schema): + +class SummaryPkgSchema(Schema): divisionid = fields.Int(data_key="divisionid", allow_none=True) documentids = fields.List(fields.Int()) +class SummarySchema(Schema): + pkgdocuments = fields.List(fields.Nested(SummaryPkgSchema, allow_none=True)) + sorteddocuments = fields.List(fields.Int()) + class FinalPackageSchema(Schema): ministryrequestid = fields.Str(data_key="ministryrequestid", allow_none=False) category = fields.Str(data_key="category", allow_none=False) @@ -21,7 +26,5 @@ class FinalPackageSchema(Schema): attributes = fields.Nested( AttributeSchema, many=True, required=True, allow_none=False ) - summarydocuments = fields.Nested( - SummarySchema, many=True, required=True, allow_none=False - ) + summarydocuments = fields.Nested(SummarySchema, allow_none=True) redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) \ No newline at end of file diff --git a/api/reviewer_api/schemas/redline.py b/api/reviewer_api/schemas/redline.py index 43df72bc8..80d7b1139 100644 --- a/api/reviewer_api/schemas/redline.py +++ b/api/reviewer_api/schemas/redline.py @@ -11,10 +11,14 @@ class AttributeSchema(Schema): divisionname = fields.Str(data_key="divisionname", allow_none=True) divisionid = fields.Int(data_key="divisionid", allow_none=True) -class SummarySchema(Schema): +class SummaryPkgSchema(Schema): divisionid = fields.Int(data_key="divisionid", allow_none=True) documentids = fields.List(fields.Int()) +class SummarySchema(Schema): + pkgdocuments = fields.List(fields.Nested(SummaryPkgSchema, allow_none=True)) + sorteddocuments = fields.List(fields.Int()) + class RedlineSchema(Schema): ministryrequestid = fields.Str(data_key="ministryrequestid", allow_none=False) category = fields.Str(data_key="category", allow_none=False) @@ -23,7 +27,5 @@ class RedlineSchema(Schema): attributes = fields.Nested( AttributeSchema, many=True, required=True, allow_none=False ) - summarydocuments = fields.Nested( - SummarySchema, many=True, required=True, allow_none=False - ) + summarydocuments = fields.Nested(SummarySchema, allow_none=True) redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) \ No newline at end of file diff --git a/api/reviewer_api/services/radactionservice.py b/api/reviewer_api/services/radactionservice.py index e7bb6ea61..36a87d55e 100644 --- a/api/reviewer_api/services/radactionservice.py +++ b/api/reviewer_api/services/radactionservice.py @@ -210,7 +210,7 @@ def __preparemessageforsummaryservice(self, messageschema, userinfo, job): "filestozip": to_json( self.__preparefilestozip(messageschema["attributes"]) ), - "finaloutput": to_json({}), + "finaloutput": to_json(""), "attributes": to_json(messageschema["attributes"]), "summarydocuments": json.dumps(messageschema["summarydocuments"]), "redactionlayerid": json.dumps(messageschema["redactionlayerid"]) diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py index a3516df9d..835f75c29 100644 --- a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py +++ b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py @@ -17,9 +17,15 @@ class Meta: filename = fields.Str(data_key="filename",allow_none=False) s3uripath = fields.Str(data_key="s3uripath",allow_none=False) -class SummarySchema(Schema): +class SummaryPkgSchema(Schema): divisionid = fields.Int(data_key="divisionid", allow_none=True) documentids = fields.List(fields.Int()) + +class SummarySchema(Schema): + class Meta: + unknown = EXCLUDE + sorteddocuments = fields.List(fields.Int()) + pkgdocuments = fields.List(fields.Nested(SummaryPkgSchema, allow_none=True)) class AttributeSchema(Schema): class Meta: @@ -41,7 +47,7 @@ class Meta: filestozip = fields.List(fields.Nested(FileSchema, allow_none=True)) finaloutput = fields.Str(data_key="finaloutput",allow_none=False) attributes = fields.List(fields.Nested(AttributeSchema, allow_none=True)) - summarydocuments = fields.List(fields.Nested(SummarySchema, allow_none=True)) + summarydocuments = fields.Nested(SummarySchema, allow_none=True) redactionlayerid = fields.Int(data_key="redactionlayerid", allow_none=False) @@ -57,4 +63,6 @@ def decodesummarymsg(_message): _message = _message.encode().decode('unicode-escape') _message = _message.replace("b'","'").replace('"\'','"').replace('\'"','"') _message = _message.replace('"[','[').replace(']"',"]").replace("\\","") + _message = _message.replace('"{','{').replace('}"',"}") + _message = _message.replace('""','"') return _message \ No newline at end of file diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 688a532f0..b26fac15b 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -2,8 +2,8 @@ class redactionsummary(): - def prepareredactionsummary(self, message, documentids): - redactionsummary = self.prepare_pkg_redactionsummary(message,documentids) + def prepareredactionsummary(self, message, documentids, pageflags, programareas): + redactionsummary = self.prepare_pkg_redactionsummary(message, documentids, pageflags, programareas) if message.category == "responsepackage": consolidated_redactions = [] for entry in redactionsummary['data']: @@ -17,42 +17,49 @@ def __getrangenumber(self, rangeval): rangestart = str(rangestart).split('(')[0] return int(rangestart) - def prepare_pkg_redactionsummary(self, message, documentids): + def prepare_pkg_redactionsummary(self, message, documentids, pageflags, programareas): try: redactionlayerid = message.redactionlayerid - ordereddocids = documentpageflag().get_documents_lastmodified(message.ministryrequestid, self.__get_documentids(message)) + summarymsg = message.summarydocuments + ordereddocids = summarymsg.sorteddocuments stitchedpagedata = documentpageflag().getpagecount_by_documentid(message.ministryrequestid, ordereddocids) totalpagecount = self.__calculate_totalpages(stitchedpagedata) if totalpagecount <=0: return - pageflags = documentpageflag().get_all_pageflags() - programareas = documentpageflag().get_all_programareas() + _pageflags = self.__transformpageflags(pageflags) + summarydata = [] docpageflags = documentpageflag().get_documentpageflag(message.ministryrequestid, redactionlayerid, ordereddocids) - - for pageflag in pageflags: - pagecount = 0 - pageredactions = [] - _data = {} - _data["flagname"] = pageflag["description"].upper() - for docid in ordereddocids: - if docid in documentids: - docpageflag = docpageflags[docid] + + pagecount = 0 + for docid in ordereddocids: + if docid in documentids: + docpageflag = docpageflags[docid] + for pageflag in _pageflags: filteredpages = self.__get_pages_by_flagid(docpageflag["pageflag"], pagecount, pageflag["pageflagid"]) if len(filteredpages) > 0: - originalpagenos = [pg['originalpageno']for pg in filteredpages] + originalpagenos = [pg['originalpageno'] for pg in filteredpages] docpagesections = documentpageflag().getsections_by_documentid_pageno(redactionlayerid, docid, originalpagenos) docpageconsults = self.__get_consults_by_pageno(programareas, docpageflag["pageflag"], filteredpages) - pageredactions.extend(self.__get_pagesection_mapping(filteredpages, docpagesections, docpageconsults)) - pagecount = pagecount+stitchedpagedata[docid]["pagecount"] - if len(pageredactions) > 0: - _data["pagecount"] = len(pageredactions) - _data["sections"] = self.__format_redaction_summary(pageflag["description"], pageredactions) + pageflag['docpageflags'] = pageflag['docpageflags'] + self.__get_pagesection_mapping(filteredpages, docpagesections, docpageconsults) + pagecount = pagecount+stitchedpagedata[docid]["pagecount"] + + for pageflag in _pageflags: + _data = {} + if len(pageflag['docpageflags']) > 0: + _data = {} + _data["flagname"] = pageflag["description"].upper() + _data["pagecount"] = len(pageflag['docpageflags']) + _data["sections"] = self.__format_redaction_summary(pageflag["description"], pageflag['docpageflags']) summarydata.append(_data) return {"requestnumber": message.requestnumber, "data": summarydata} except (Exception) as error: print('error occured in redaction summary service: ', error) + def __transformpageflags(self, pageflags): + for entry in pageflags: + entry['docpageflags']= [] + return pageflags def __get_consults_by_pageno(self, programareas, docpageflag, pagenos): consults = {} for entry in docpageflag: @@ -66,13 +73,6 @@ def __format_consults(self, programareas, consultids): for cid in consultids: formatted.append(programareas[cid]['iaocode']) return ",".join(formatted) - - def __get_documentids(self, message): - summarydocuments = message.summarydocuments - docids = [] - for entry in summarydocuments: - docids = docids + entry.documentids - return docids def __format_redaction_summary(self, pageflag, pageredactions): totalpages = len(pageredactions) diff --git a/computingservices/DocumentServices/services/zippingservice.py b/computingservices/DocumentServices/services/zippingservice.py index 7bbb38982..1eda1d64b 100644 --- a/computingservices/DocumentServices/services/zippingservice.py +++ b/computingservices/DocumentServices/services/zippingservice.py @@ -6,7 +6,6 @@ class zippingservice(): def sendtozipper(self, summaryfiles, message): updatedmessage = zippingservice().preparemessageforzipperservice(summaryfiles, message) - print('updatedmessage',updatedmessage) zipperstreamwriter().sendmessage(updatedmessage) def preparemessageforzipperservice(self,updatedfilestozip, message): diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index c34e55805..b28db9714 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -2862,6 +2862,7 @@ const Redlining = React.forwardRef( const prepareredlinesummarylist = (stitchDocuments) => { let summarylist = [] + let alldocuments = [] for (const [key, value] of Object.entries(stitchDocuments)) { let summary_division = {}; summary_division["divisionid"] = key @@ -2870,12 +2871,19 @@ const Redlining = React.forwardRef( let summary_divdocuments = [] for (let doc of documentlist) { summary_divdocuments.push(doc.documentid); + alldocuments.push(doc); } summary_division["documentids"] = summary_divdocuments; } summarylist.push(summary_division); } - return summarylist + let sorteddocids = [] + let sorteddocs = sortByLastModified(alldocuments) + for (const sorteddoc of sorteddocs) { + sorteddocids.push(sorteddoc['documentid']); + } + + return {"sorteddocuments": sorteddocids, "pkgdocuments": summarylist} } @@ -3508,13 +3516,21 @@ const Redlining = React.forwardRef( let summarylist = [] let summary_division = {}; let summary_divdocuments = []; + let alldocuments = []; summary_division["divisionid"] = '0'; for (let doc of documentlist) { summary_divdocuments.push(doc.documentid); + alldocuments.push(doc); } summary_division["documentids"] = summary_divdocuments; - summarylist.push(summary_division); - return summarylist + summarylist.push(summary_division); + + let sorteddocids = [] + let sorteddocs = sortByLastModified(alldocuments) + for (const sorteddoc of sorteddocs) { + sorteddocids.push(sorteddoc['documentid']); + } + return {"sorteddocuments": sorteddocids, "pkgdocuments": summarylist} } const compareValues = (a, b) => { From f455523034bf966ac589a9ed8d81edbe86a563df Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 14 Feb 2024 09:47:48 -0800 Subject: [PATCH 44/63] Workflow updates and minor fixes --- .github/workflows/documentservice-cd.yml | 111 ++++++++++++++++++ .github/workflows/documentservice-ci.yml | 54 +++++++++ .../services/redactionsummaryservice.py | 8 +- 3 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/documentservice-cd.yml create mode 100644 .github/workflows/documentservice-ci.yml diff --git a/.github/workflows/documentservice-cd.yml b/.github/workflows/documentservice-cd.yml new file mode 100644 index 000000000..799a456f0 --- /dev/null +++ b/.github/workflows/documentservice-cd.yml @@ -0,0 +1,111 @@ +name: Document Services CD + + +on: + push: + branches: + - dev + - main + - dev-marshal + - test-marshal + - dev-rook + - test-rook + paths: + - "computingservices/DocumentServices/**" + - ".github/workflows/DocumentServices-cd.yml" + +defaults: + run: + shell: bash + working-directory: ./computingservices/DocumentServices + +env: + APP_NAME: "reviewer-DocumentServices" + TOOLS_NAME: "${{secrets.OPENSHIFT4_REPOSITORY}}" + +jobs: + documentServices-cd-by-push: + runs-on: ubuntu-20.04 + + if: github.event_name == 'push' && github.repository == 'bcgov/foi-docreviewer' + steps: + - uses: actions/checkout@v2 + - name: Set ENV variables for dev branch + if: ${{ github.ref_name == 'dev' }} + shell: bash + run: | + echo "For ${{ github.ref_name }} branch" + echo "TAG_NAME=dev" >> $GITHUB_ENV + echo "BRANCH_NAME=dev" >> $GITHUB_ENV + echo "ENV_NAME=dev" >> $GITHUB_ENV + + - name: Set ENV variables for main branch + if: ${{ github.ref_name == 'main' }} + shell: bash + run: | + echo "For ${{ github.ref_name }} branch" + echo "TAG_NAME=test" >> $GITHUB_ENV + echo "BRANCH_NAME=main" >> $GITHUB_ENV + echo "ENV_NAME=test" >> $GITHUB_ENV + + - name: Set ENV variables for dev-marshal branch + if: ${{ github.ref_name == 'dev-marshal' }} + run: | + echo "For ${{ github.ref_name }} branch" + echo "TAG_NAME=dev-marshal" >> $GITHUB_ENV + echo "BRANCH_NAME=dev-marshal" >> $GITHUB_ENV + echo "ENV_NAME=dev" >> $GITHUB_ENV + + - name: Set ENV variables for test-marshal branch + if: ${{ github.ref_name == 'test-marshal' }} + run: | + echo "For ${{ github.ref_name }} branch" + echo "TAG_NAME=test-marshal" >> $GITHUB_ENV + echo "BRANCH_NAME=test-marshal" >> $GITHUB_ENV + echo "ENV_NAME=test" >> $GITHUB_ENV + + - name: Set ENV variables for dev-rook branch + if: ${{ github.ref_name == 'dev-rook' }} + run: | + echo "For ${{ github.ref_name }} branch" + echo "TAG_NAME=dev-rook" >> $GITHUB_ENV + echo "BRANCH_NAME=dev-rook" >> $GITHUB_ENV + echo "ENV_NAME=dev" >> $GITHUB_ENV + + - name: Set ENV variables for test-rook branch + if: ${{ github.ref_name == 'test-rook' }} + run: | + echo "For ${{ github.ref_name }} branch" + echo "TAG_NAME=test-rook" >> $GITHUB_ENV + echo "BRANCH_NAME=test-rook" >> $GITHUB_ENV + echo "ENV_NAME=test" >> $GITHUB_ENV + + - name: Login Openshift + shell: bash + run: | + oc login --server=${{secrets.OPENSHIFT4_LOGIN_REGISTRY}} --token=${{secrets.OPENSHIFT4_SA_TOKEN}} + + - name: Tools project + shell: bash + run: | + oc project ${{ env.TOOLS_NAME }}-tools + + - name: Build from ${{ env.BRANCH_NAME }} branch + shell: bash + run: | + oc patch bc/${{ env.APP_NAME }}-build -p '{"spec":{"source":{"contextDir":"/computingservices/DocumentServices","git":{"ref":"${{ env.BRANCH_NAME }}"}}}}' + + - name: Start Build Openshift + shell: bash + run: | + oc start-build ${{ env.APP_NAME }}-build --wait + + - name: Tag+Deploy for ${{ env.TAG_NAME }} + shell: bash + run: | + oc tag ${{ env.APP_NAME }}:latest ${{ env.APP_NAME }}:${{ env.TAG_NAME }} + + - name: Watch new rollout (trigger by image change in Openshift) + shell: bash + run: | + oc rollout status dc/${{ env.APP_NAME }} -n ${{ env.TOOLS_NAME }}-${{ env.ENV_NAME }} -w diff --git a/.github/workflows/documentservice-ci.yml b/.github/workflows/documentservice-ci.yml new file mode 100644 index 000000000..f683c169e --- /dev/null +++ b/.github/workflows/documentservice-ci.yml @@ -0,0 +1,54 @@ +name: Document Services CI + + +on: + pull_request: + branches: + - main + - dev + - dev-marshal + - test-marshal + - dev-rook + - test-rook + paths: + - "computingservices/DocumentServices/**" + +defaults: + run: + shell: bash + working-directory: ./computingservices/DocumentServices + +jobs: + docker-build-check: + runs-on: ubuntu-20.04 + name: Build dockerfile to ensure it works + + steps: + - uses: actions/checkout@v2 + - name: docker build to check strictness + id: docker-build + run: | + docker build -f Dockerfile.local . + + python-build-check: + runs-on: ubuntu-20.04 + name: Build python to ensure it works + + strategy: + matrix: + # python-version: [3.6, 3.7, 3.8, 3.9] + python-version: [3.9] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install flake8 pytest + if [ -f requirements.txt ]; then pip install -r requirements.txt; fi + + diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 8fe01bb14..d4b15dae1 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -6,6 +6,8 @@ from .documentgenerationservice import documentgenerationservice from .s3documentservice import uploadbytes from services.dts.redactionsummary import redactionsummary +from services.dal.documentpageflag import documentpageflag + class redactionsummaryservice(): def processmessage(self,message): @@ -18,10 +20,14 @@ def processmessage(self,message): documenttypename= category+"_redaction_summary" print('documenttypename', documenttypename) upload_responses=[] + pageflags = documentpageflag().get_all_pageflags() + programareas = documentpageflag().get_all_programareas() + summarymsg = message.summarydocuments + divisiondocuments = summarymsg.pkgdocuments for entry in divisiondocuments: divisionid = entry.divisionid documentids = entry.documentids - formattedsummary = redactionsummary().prepareredactionsummary(message, documentids) + formattedsummary = redactionsummary().prepareredactionsummary(message, documentids, pageflags, programareas) print('formattedsummary', formattedsummary) template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) From 88808e3624e6b1a04b19ce2a285eb5880725dc88 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 14 Feb 2024 09:58:24 -0800 Subject: [PATCH 45/63] Fixing the folder name --- .github/workflows/documentservice-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentservice-cd.yml b/.github/workflows/documentservice-cd.yml index 799a456f0..b4a1bb8ad 100644 --- a/.github/workflows/documentservice-cd.yml +++ b/.github/workflows/documentservice-cd.yml @@ -12,7 +12,7 @@ on: - test-rook paths: - "computingservices/DocumentServices/**" - - ".github/workflows/DocumentServices-cd.yml" + - ".github/workflows/documentservice-cd.yml" defaults: run: From 13bccc657f2e52b6af2c86fcbd6f3845c96f3e20 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 14 Feb 2024 10:35:43 -0800 Subject: [PATCH 46/63] app name update --- .github/workflows/documentservice-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentservice-cd.yml b/.github/workflows/documentservice-cd.yml index b4a1bb8ad..59eae4feb 100644 --- a/.github/workflows/documentservice-cd.yml +++ b/.github/workflows/documentservice-cd.yml @@ -20,7 +20,7 @@ defaults: working-directory: ./computingservices/DocumentServices env: - APP_NAME: "reviewer-DocumentServices" + APP_NAME: "reviewer-documentservice-build" TOOLS_NAME: "${{secrets.OPENSHIFT4_REPOSITORY}}" jobs: From 76f452c4280b3d6026ef981813d021e0d3f1bc1d Mon Sep 17 00:00:00 2001 From: sumathi-thirumani-aot <57740789+sumathi-thirumani-aot@users.noreply.github.com> Date: Wed, 14 Feb 2024 10:38:59 -0800 Subject: [PATCH 47/63] Update documentservice-cd.yml --- .github/workflows/documentservice-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentservice-cd.yml b/.github/workflows/documentservice-cd.yml index 59eae4feb..9651a097d 100644 --- a/.github/workflows/documentservice-cd.yml +++ b/.github/workflows/documentservice-cd.yml @@ -20,7 +20,7 @@ defaults: working-directory: ./computingservices/DocumentServices env: - APP_NAME: "reviewer-documentservice-build" + APP_NAME: "reviewer-documentservice" TOOLS_NAME: "${{secrets.OPENSHIFT4_REPOSITORY}}" jobs: From 9e97aa679d3de9b1465ace9a5030fac004241b97 Mon Sep 17 00:00:00 2001 From: sumathi-thirumani-aot <57740789+sumathi-thirumani-aot@users.noreply.github.com> Date: Wed, 14 Feb 2024 10:55:04 -0800 Subject: [PATCH 48/63] Update documentservice-cd.yml --- .github/workflows/documentservice-cd.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/documentservice-cd.yml b/.github/workflows/documentservice-cd.yml index 9651a097d..4f91d0dd1 100644 --- a/.github/workflows/documentservice-cd.yml +++ b/.github/workflows/documentservice-cd.yml @@ -104,8 +104,3 @@ jobs: shell: bash run: | oc tag ${{ env.APP_NAME }}:latest ${{ env.APP_NAME }}:${{ env.TAG_NAME }} - - - name: Watch new rollout (trigger by image change in Openshift) - shell: bash - run: | - oc rollout status dc/${{ env.APP_NAME }} -n ${{ env.TOOLS_NAME }}-${{ env.ENV_NAME }} -w From 7f02babac3406af7dc3fa749551fb32fcc9a7751 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 14 Feb 2024 13:20:45 -0800 Subject: [PATCH 49/63] Minor fix for oipcredline --- .../DocumentServices/services/redactionsummaryservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index d4b15dae1..bdfeef640 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -32,7 +32,7 @@ def processmessage(self,message): template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) messageattributes= message.attributes - if category == 'redline' : + if message.category == 'redline' : filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] From 10b2bf66ff20ff143808d3c445d70bb20cb79314 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 14 Feb 2024 15:00:48 -0800 Subject: [PATCH 50/63] oipc review folder fix --- .../DocumentServices/services/redactionsummaryservice.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index bdfeef640..4e9d0b8f9 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -16,8 +16,8 @@ def processmessage(self,message): pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") divisiondocuments = message.summarydocuments #Condition for handling oipcredline category - category = message.category if message.category == 'responsepackage' else "redline" - documenttypename= category+"_redaction_summary" + category = message.category + documenttypename= category+"_redaction_summary" if category == 'responsepackage' else "redline" print('documenttypename', documenttypename) upload_responses=[] pageflags = documentpageflag().get_all_pageflags() @@ -32,7 +32,7 @@ def processmessage(self,message): template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) messageattributes= message.attributes - if message.category == 'redline' : + if category == 'redline' : filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] From 305b86448af706cdc5995b49bc28aeb41c68f12e Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 14 Feb 2024 15:42:40 -0800 Subject: [PATCH 51/63] missed commit --- .../DocumentServices/services/redactionsummaryservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 4e9d0b8f9..df72be11f 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -17,7 +17,7 @@ def processmessage(self,message): divisiondocuments = message.summarydocuments #Condition for handling oipcredline category category = message.category - documenttypename= category+"_redaction_summary" if category == 'responsepackage' else "redline" + documenttypename= category+"_redaction_summary" if category == 'responsepackage' else "redline_redaction_summary" print('documenttypename', documenttypename) upload_responses=[] pageflags = documentpageflag().get_all_pageflags() From e764cfb1df54c421fb015c0c6d5c2736bf4e8494 Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 14 Feb 2024 16:49:39 -0800 Subject: [PATCH 52/63] oipc fixes --- .../DocumentServices/services/redactionsummaryservice.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index df72be11f..a96130456 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -32,13 +32,14 @@ def processmessage(self,message): template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) messageattributes= message.attributes - if category == 'redline' : + if category == 'redline': filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] stitcheddocs3uri = filesobj.s3uripath stitcheddocfilename = filesobj.filename - s3uri = stitcheddocs3uri.split(category+"/")[0] + category+"/" + s3uricategoryfolder= "oipcreview" if category == 'oipcreviewredline' else category + s3uri = stitcheddocs3uri.split(s3uricategoryfolder+"/")[0] + s3uricategoryfolder+"/" filename = stitcheddocfilename.replace(".pdf","- summary.pdf") print('s3uri:', s3uri) uploadobj= uploadbytes(filename,redaction_summary.content, s3uri) From 8aac1f8fcb81b488a9e0c4fb88afa039a46599dd Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 15 Feb 2024 12:34:34 -0800 Subject: [PATCH 53/63] changes to filter blank code + skip on exceptions (excluding incoming message structure). --- .../message/schemas/redactionsummary.py | 2 ++ .../reader/documentservicestreamreader.py | 18 +++++++-------- .../services/cdogsapiservice.py | 4 ++-- .../services/dal/pdfstitchjobactivity.py | 1 - .../services/dts/redactionsummary.py | 2 +- .../services/redactionsummaryservice.py | 22 +++++++++---------- .../services/zippingservice.py | 7 ++++-- 7 files changed, 30 insertions(+), 26 deletions(-) diff --git a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py index 835f75c29..e79f10427 100644 --- a/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py +++ b/computingservices/DocumentServices/rstreamio/message/schemas/redactionsummary.py @@ -18,6 +18,8 @@ class Meta: s3uripath = fields.Str(data_key="s3uripath",allow_none=False) class SummaryPkgSchema(Schema): + class Meta: + unknown = EXCLUDE divisionid = fields.Int(data_key="divisionid", allow_none=True) documentids = fields.List(fields.Int()) diff --git a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py index c41258477..74b9edebe 100644 --- a/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py +++ b/computingservices/DocumentServices/rstreamio/reader/documentservicestreamreader.py @@ -6,7 +6,7 @@ from enum import Enum from utils import redisstreamdb from utils.foidocumentserviceconfig import documentservice_stream_key -from rstreamio.message.schemas.redactionsummary import get_in_redactionsummary_msg, decodesummarymsg +from rstreamio.message.schemas.redactionsummary import decodesummarymsg from services.redactionsummaryservice import redactionsummaryservice from services.zippingservice import zippingservice @@ -38,20 +38,20 @@ def start(consumer_id: str, start_from: StartFrom = StartFrom.latest): print("*********** Messages ***********") print(messages) if messages: - for _messages in messages: + for _message in messages: # message_id is the random id created to identify the message # message is the actual data passed to the stream - message_id, message = _messages + message_id, message = _message print(f"processing {message_id}::{message}") if message is not None: - _message = json.dumps({str(key): str(value) for (key, value) in message.items()}) - _message = decodesummarymsg(_message) + message = json.dumps({str(key): str(value) for (key, value) in message.items()}) + message = decodesummarymsg(message) + summaryfiles = [] try: - redactionsummary_message = get_in_redactionsummary_msg(_message) - summaryfiles = redactionsummaryservice().processmessage(redactionsummary_message) - zippingservice().sendtozipper(summaryfiles, _message) + summaryfiles = redactionsummaryservice().processmessage(message) except(Exception) as error: - logging.exception(error) + logging.exception(error) + zippingservice().sendtozipper(summaryfiles, message) # simulate processing time.sleep(random.randint(1, 3)) last_id = message_id diff --git a/computingservices/DocumentServices/services/cdogsapiservice.py b/computingservices/DocumentServices/services/cdogsapiservice.py index 78a042c98..3b1bb4859 100644 --- a/computingservices/DocumentServices/services/cdogsapiservice.py +++ b/computingservices/DocumentServices/services/cdogsapiservice.py @@ -23,13 +23,13 @@ def generate_pdf(self, template_hash_code, data, access_token): "data": data } json_request_body = json.dumps(request_body) - print("json_request_body:",json_request_body) + #print("json_request_body:",json_request_body) headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}' } url = f"{cdogs_base_url}/api/v2/template/{template_hash_code}/render" - print("url:",url) + #print("url:",url) return self._post_generate_pdf(json_request_body, headers, url) def _post_generate_pdf(self, json_request_body, headers, url): diff --git a/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py b/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py index eae1279a8..14cc66514 100644 --- a/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py +++ b/computingservices/DocumentServices/services/dal/pdfstitchjobactivity.py @@ -24,7 +24,6 @@ def recordjobstatus(cls,message,version,status,error=None,errormessage=None): message.ministryrequestid, category, to_json(message.attributes), - #json.dumps(message.attributes, default=obj_dict), status, errormessage if error else None, message.createdby, diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index b26fac15b..788e87d06 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -120,7 +120,7 @@ def __get_sections(self, docpagesections, pageno): filtered = [x for x in docpagesections if x['pageno'] == pageno] for dta in filtered: sections += [x.strip() for x in dta['section'].split(",")] - return sections + return list(filter(None, sections)) def __get_pages_by_flagid(self, _docpageflags, totalpages, flagid): pagenos = [] diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index a96130456..db60add28 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -7,28 +7,28 @@ from .s3documentservice import uploadbytes from services.dts.redactionsummary import redactionsummary from services.dal.documentpageflag import documentpageflag - +from rstreamio.message.schemas.redactionsummary import get_in_redactionsummary_msg class redactionsummaryservice(): - def processmessage(self,message): + def processmessage(self,incomingmessage): + summaryfilestozip = [] + message = get_in_redactionsummary_msg(incomingmessage) try: - summaryfilestozip = [] - pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") - divisiondocuments = message.summarydocuments + pdfstitchjobactivity().recordjobstatus(message,3,"redactionsummarystarted") + summarymsg = message.summarydocuments #Condition for handling oipcredline category category = message.category documenttypename= category+"_redaction_summary" if category == 'responsepackage' else "redline_redaction_summary" - print('documenttypename', documenttypename) + #print('documenttypename', documenttypename) upload_responses=[] pageflags = documentpageflag().get_all_pageflags() programareas = documentpageflag().get_all_programareas() - summarymsg = message.summarydocuments divisiondocuments = summarymsg.pkgdocuments for entry in divisiondocuments: divisionid = entry.divisionid documentids = entry.documentids formattedsummary = redactionsummary().prepareredactionsummary(message, documentids, pageflags, programareas) - print('formattedsummary', formattedsummary) + #print('formattedsummary', formattedsummary) template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) messageattributes= message.attributes @@ -41,7 +41,7 @@ def processmessage(self,message): s3uricategoryfolder= "oipcreview" if category == 'oipcreviewredline' else category s3uri = stitcheddocs3uri.split(s3uricategoryfolder+"/")[0] + s3uricategoryfolder+"/" filename = stitcheddocfilename.replace(".pdf","- summary.pdf") - print('s3uri:', s3uri) + #print('s3uri:', s3uri) uploadobj= uploadbytes(filename,redaction_summary.content, s3uri) upload_responses.append(uploadobj) if uploadobj["uploadresponse"].status_code == 200: @@ -55,8 +55,8 @@ def processmessage(self,message): return summaryfilestozip except (Exception) as error: print('error occured in redaction summary service: ', error) - - + pdfstitchjobactivity().recordjobstatus(message,4,"redactionsummaryfailed",str(error),"summary generation failed") + return summaryfilestozip diff --git a/computingservices/DocumentServices/services/zippingservice.py b/computingservices/DocumentServices/services/zippingservice.py index 1eda1d64b..fed5c4bc1 100644 --- a/computingservices/DocumentServices/services/zippingservice.py +++ b/computingservices/DocumentServices/services/zippingservice.py @@ -8,10 +8,13 @@ def sendtozipper(self, summaryfiles, message): updatedmessage = zippingservice().preparemessageforzipperservice(summaryfiles, message) zipperstreamwriter().sendmessage(updatedmessage) - def preparemessageforzipperservice(self,updatedfilestozip, message): + def preparemessageforzipperservice(self,summaryfiles, message): try: msgjson= json.loads(message) - filestozip_list = msgjson['filestozip']+updatedfilestozip + if summaryfiles and len(summaryfiles) > 0: + filestozip_list = msgjson['filestozip']+summaryfiles + else: + filestozip_list = msgjson['filestozip'] msgjson['filestozip'] = self.to_json(filestozip_list) msgjson['attributes'] = self.to_json(msgjson['attributes']) msgjson['summarydocuments'] = self.to_json(msgjson['summarydocuments']) From d5ac405442ef526258ed189d2b5c88f57639101e Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 15 Feb 2024 12:49:30 -0800 Subject: [PATCH 54/63] openshift templates --- .../documentservice-build.yaml | 62 ++++ .../documentservice-deploy.yaml | 272 ++++++++++++++++++ .../documentservice_deploy_param.yaml | 7 + .../documentservice_secrets.yaml | 91 ++++++ .../documentservice_secrets_param.yaml | 22 ++ 5 files changed, 454 insertions(+) create mode 100644 openshift/templates/documentservice/documentservice-build.yaml create mode 100644 openshift/templates/documentservice/documentservice-deploy.yaml create mode 100644 openshift/templates/documentservice/documentservice_deploy_param.yaml create mode 100644 openshift/templates/documentservice/documentservice_secrets.yaml create mode 100644 openshift/templates/documentservice/documentservice_secrets_param.yaml diff --git a/openshift/templates/documentservice/documentservice-build.yaml b/openshift/templates/documentservice/documentservice-build.yaml new file mode 100644 index 000000000..11edaecb6 --- /dev/null +++ b/openshift/templates/documentservice/documentservice-build.yaml @@ -0,0 +1,62 @@ +--- +kind: Template +apiVersion: template.openshift.io/v1 +metadata: + name: "${APP_NAME}-build-template" + creationTimestamp: +objects: +- kind: ImageStream + apiVersion: v1 + metadata: + name: "${APP_NAME}" +- kind: BuildConfig + apiVersion: v1 + metadata: + name: "${APP_NAME}-build" + labels: + app: "${APP_NAME}-build" + spec: + runPolicy: Serial + source: + type: Git + git: + uri: "${GIT_REPO_URL}" + ref: "${GIT_REF}" + contextDir: "${SOURCE_CONTEXT_DIR}" + strategy: + type: Docker + dockerStrategy: + dockerfilePath: "${DOCKER_FILE_PATH}" + pullSecret: + name: artifacts-pull-default-jmhvkc + output: + to: + kind: ImageStreamTag + name: "${APP_NAME}:latest" +parameters: +- name: APP_NAME + displayName: Name + description: The name assigned to all of the resources defined in this template. + required: true + value: reviewer-documentservice +- name: GIT_REPO_URL + displayName: Git Repo URL + description: The URL to your GIT repo. + required: true + value: https://github.com/bcgov/foi-docreviewer +- name: GIT_REF + displayName: Git Reference + description: The git reference or branch. + required: true + value: dev-marshal +- name: SOURCE_CONTEXT_DIR + displayName: Source Context Directory + description: The source context directory. + required: false + value: computingservices/DocumentServices +- name: DOCKER_FILE_PATH + displayName: Docker File Path + description: The path to the docker file defining the build. + required: false + value: "DockerFile.bcgov" + diff --git a/openshift/templates/documentservice/documentservice-deploy.yaml b/openshift/templates/documentservice/documentservice-deploy.yaml new file mode 100644 index 000000000..5109de3ef --- /dev/null +++ b/openshift/templates/documentservice/documentservice-deploy.yaml @@ -0,0 +1,272 @@ +--- +kind: Template +apiVersion: template.openshift.io/v1 +metadata: + annotations: + description: Deployment template for a reviewer-documentservice. + tags: "${APP_NAME}" + name: "${APP_NAME}-deploy" +objects: +- kind: DeploymentConfig + apiVersion: v1 + metadata: + name: "${APP_NAME}" + labels: + app: "${APP_NAME}" + app-group: "${APP_GROUP}" + template: "${APP_NAME}-deploy" + spec: + strategy: + type: Rolling + rollingParams: + updatePeriodSeconds: 1 + intervalSeconds: 1 + timeoutSeconds: 600 + maxUnavailable: 25% + maxSurge: 25% + triggers: + - type: ImageChange + imageChangeParams: + automatic: true + containerNames: + - "${APP_NAME}" + from: + kind: ImageStreamTag + namespace: "${IMAGE_NAMESPACE}" + name: "${IMAGE_APP_NAME}:${TAG_NAME}" + - type: ConfigChange + replicas: 1 + test: false + selector: + app: "${APP_NAME}" + deploymentconfig: "${APP_NAME}" + template: + metadata: + labels: + app: "${APP_NAME}" + app-group: "${APP_GROUP}" + deploymentconfig: "${APP_NAME}" + template: "${APP_NAME}-deploy" + spec: + containers: + - name: "${APP_NAME}" + image: "${APP_NAME}" + imagePullPolicy: Always + env: + - name: REDIS_HOST + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_REDIS_HOST + - name: REDIS_PORT + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_REDIS_PORT + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: "${REDIS_SECRETS}" + key: database-password + - name: DOCUMENTSERVICE_STREAM_KEY + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_STREAM_KEY + - name: ZIPPER_REDIS_HOST + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: ZIPPER_REDIS_HOST + - name: ZIPPER_REDIS_PORT + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: ZIPPER_REDIS_PORT + - name: ZIPPER_REDIS_PASSWORD + valueFrom: + secretKeyRef: + name: "${REDIS_SECRETS}" + key: database-password + - name: ZIPPER_STREAM_KEY + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: ZIPPER_STREAM_KEY + - name: DOCUMENTSERVICE_DB_HOST + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_DB_HOST + - name: DOCUMENTSERVICE_DB_NAME + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_DB_NAME + - name: DOCUMENTSERVICE_DB_USER + valueFrom: + secretKeyRef: + name: "${DB_SECRETS}" + key: app-db-username + - name: DOCUMENTSERVICE_DB_PASSWORD + valueFrom: + secretKeyRef: + name: "${DB_SECRETS}" + key: app-db-password + - name: DOCUMENTSERVICE_S3_HOST + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_S3_HOST + - name: DOCUMENTSERVICE_S3_REGION + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_S3_REGION + - name: DOCUMENTSERVICE_S3_SERVICE + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_S3_SERVICE + - name: DOCUMENTSERVICE_S3_ENV + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: DOCUMENTSERVICE_S3_ENV + - name: CDOGS_BASE_URL + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: CDOGS_BASE_URL + - name: CDOGS_TOKEN_URL + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: CDOGS_TOKEN_URL + - name: CDOGS_SERVICE_CLIENT + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: CDOGS_SERVICE_CLIENT + - name: CDOGS_SERVICE_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: CDOGS_SERVICE_CLIENT_SECRET + - name: FOI_DB_HOST + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: FOI_DB_HOST + - name: FOI_DB_PORT + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: FOI_DB_PORT + - name: FOI_DB_NAME + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: FOI_DB_NAME + - name: FOI_DB_USER + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: FOI_DB_USER + - name: FOI_DB_PASSWORD + valueFrom: + secretKeyRef: + name: "${SECRETS}" + key: FOI_DB_PASSWORD + resources: + requests: + cpu: "50m" + memory: "250Mi" + limits: + cpu: "150m" + memory: "500Mi" + terminationMessagePath: "/dev/termination-log" + terminationMessagePolicy: File + imagePullPolicy: Always + restartPolicy: Always + terminationGracePeriodSeconds: 30 + dnsPolicy: ClusterFirst + securityContext: {} + schedulerName: default-scheduler +- kind: Service + apiVersion: v1 + metadata: + name: "${APP_NAME}" + creationTimestamp: + labels: + app: "${APP_NAME}" + app-group: "${APP_GROUP}" + template: "${APP_NAME}-deploy" + spec: + ports: + - name: 5000-tcp + protocol: TCP + port: 5000 + targetPort: 5000 + selector: + deploymentconfig: "${APP_NAME}" + type: ClusterIP + sessionAffinity: None + # status: + # loadBalancer: {} +- kind: Route + apiVersion: v1 + metadata: + name: "${APP_NAME}" + labels: + app: "${APP_NAME}" + app-group: "${APP_GROUP}" + template: "${APP_NAME}-deploy" + spec: + to: + kind: Service + name: "${APP_NAME}" + weight: 100 + port: + targetPort: 5000-tcp + tls: + termination: edge + wildcardPolicy: None + host: "${APP_NAME}-${TAG_NAME}.apps.silver.devops.gov.bc.ca" +parameters: +- name: APP_NAME + displayName: Name + description: The name assigned to all of the OpenShift resources associated to the + server instance. + required: true +- name: IMAGE_APP_NAME + displayName: Name + description: The name assigned to all of the OpenShift resources associated to the + server instance. + required: true +- name: APP_GROUP + displayName: App Group + description: The name assigned to all of the deployments in this project. + required: true + value: foi-docreviewer +- name: IMAGE_NAMESPACE + displayName: Image Namespace + required: true + description: The namespace of the OpenShift project containing the imagestream for + the application. +- name: TAG_NAME + displayName: Environment TAG name + description: The TAG name for this environment, e.g., dev, test, prod + required: true +- name: DB_SECRETS + displayName: Patroni DB Secrets + description: Name of secrets for all db values + required: true +- name: SECRETS + displayName: Documentservice Secrets + description: Name of secrets for all documentservice values + required: true +- name: REDIS_SECRETS + displayName: Redis Secrets + description: Name of secrets for redis + required: true \ No newline at end of file diff --git a/openshift/templates/documentservice/documentservice_deploy_param.yaml b/openshift/templates/documentservice/documentservice_deploy_param.yaml new file mode 100644 index 000000000..b84cbc87e --- /dev/null +++ b/openshift/templates/documentservice/documentservice_deploy_param.yaml @@ -0,0 +1,7 @@ +IMAGE_NAMESPACE= +IMAGE_APP_NAME=reviewer-documentservice +TAG_NAME= +DB_SECRETS= +APP_NAME=reviewer-documentservice +SECRETS= +REDIS_SECRETS= \ No newline at end of file diff --git a/openshift/templates/documentservice/documentservice_secrets.yaml b/openshift/templates/documentservice/documentservice_secrets.yaml new file mode 100644 index 000000000..0818edff5 --- /dev/null +++ b/openshift/templates/documentservice/documentservice_secrets.yaml @@ -0,0 +1,91 @@ +apiVersion: template.openshift.io/v1 +kind: Template +metadata: + name: ${NAME} + labels: + app: ${NAME} + name: ${NAME} +objects: + - apiVersion: v1 + kind: Secret + metadata: + name: ${NAME} + stringData: + DOCUMENTSERVICE_REDIS_HOST: "${DOCUMENTSERVICE_REDIS_HOST}" + DOCUMENTSERVICE_REDIS_PORT: "${DOCUMENTSERVICE_REDIS_PORT}" + DOCUMENTSERVICE_STREAM_KEY: '${DOCUMENTSERVICE_STREAM_KEY}' + ZIPPER_REDIS_HOST: '${ZIPPER_REDIS_HOST}' + ZIPPER_REDIS_PORT: '${ZIPPER_REDIS_PORT}' + ZIPPER_STREAM_KEY: '${ZIPPER_STREAM_KEY}' + DOCUMENTSERVICE_DB_HOST: '${DOCUMENTSERVICE_DB_HOST}' + DOCUMENTSERVICE_DB_NAME: '${DOCUMENTSERVICE_DB_NAME}' + DOCUMENTSERVICE_S3_HOST: '${DOCUMENTSERVICE_S3_HOST}' + DOCUMENTSERVICE_S3_REGION: '${DOCUMENTSERVICE_S3_REGION}' + DOCUMENTSERVICE_S3_SERVICE: '${DOCUMENTSERVICE_S3_SERVICE}' + DOCUMENTSERVICE_S3_ENV: '${DOCUMENTSERVICE_S3_ENV}' + CDOGS_BASE_URL: '${CDOGS_BASE_URL}' + CDOGS_TOKEN_URL: '${CDOGS_TOKEN_URL}' + CDOGS_SERVICE_CLIENT: '${CDOGS_SERVICE_CLIENT}' + CDOGS_SERVICE_CLIENT_SECRET: '${CDOGS_SERVICE_CLIENT_SECRET}' + FOI_DB_HOST: '${FOI_DB_HOST}' + FOI_DB_PORT: '${FOI_DB_PORT}' + FOI_DB_NAME: '${FOI_DB_NAME}' + FOI_DB_USER: '${FOI_DB_USER}' + FOI_DB_PASSWORD: '${FOI_DB_PASSWORD}' + type: Opaque + +parameters: + - name: NAME + description: The name for all created objects. + required: true + - name: DOCUMENTSERVICE_REDIS_HOST + description: DOCUMENTSERVICE_REDIS_HOST + required: true + - name: DOCUMENTSERVICE_REDIS_PORT + description: DOCUMENTSERVICE_REDIS_PORT + required: true + - name: DOCUMENTSERVICE_STREAM_KEY + description: DOCUMENTSERVICE_STREAM_KEY + required: true + - name: ZIPPER_REDIS_HOST + description: ZIPPER_REDIS_HOST + required: true + - name: ZIPPER_REDIS_PORT + description: ZIPPER_REDIS_PORT + required: true + - name: ZIPPER_STREAM_KEY + description: ZIPPER_STREAM_KEY + required: true + - name: DOCUMENTSERVICE_DB_HOST + description: DOCUMENTSERVICE_DB_HOST + required: true + - name: DOCUMENTSERVICE_DB_NAME + description: DOCUMENTSERVICE_DB_NAME + required: true + - name: DOCUMENTSERVICE_S3_HOST + description: DOCUMENTSERVICE_S3_HOST + required: true + - name: DOCUMENTSERVICE_S3_REGION + description: DOCUMENTSERVICE_S3_REGION + required: true + - name: DOCUMENTSERVICE_S3_SERVICE + description: DOCUMENTSERVICE_S3_SERVICE + required: true + - name: DOCUMENTSERVICE_S3_ENV + description: DOCUMENTSERVICE_S3_ENV + required: true + - name: FOI_DB_HOST + description: FOI_DB_HOST + required: true + - name: FOI_DB_PORT + description: FOI_DB_PORT + required: true + - name: FOI_DB_NAME + description: FOI_DB_NAME + required: true + - name: FOI_DB_USER + description: FOI_DB_USER + required: true + - name: FOI_DB_PASSWORD + description: FOI_DB_PASSWORD + required: true \ No newline at end of file diff --git a/openshift/templates/documentservice/documentservice_secrets_param.yaml b/openshift/templates/documentservice/documentservice_secrets_param.yaml new file mode 100644 index 000000000..92ba7d1fe --- /dev/null +++ b/openshift/templates/documentservice/documentservice_secrets_param.yaml @@ -0,0 +1,22 @@ +NAME=documentservice-secrets +DOCUMENTSERVICE_REDIS_HOST= +DOCUMENTSERVICE_REDIS_PORT= +DOCUMENTSERVICE_STREAM_KEY= +ZIPPER_REDIS_HOST= +ZIPPER_REDIS_PORT= +ZIPPER_STREAM_KEY=ZIPPERSERVICE +DOCUMENTSERVICE_DB_HOST= +DOCUMENTSERVICE_DB_NAME= +DOCUMENTSERVICE_S3_HOST= +DOCUMENTSERVICE_S3_REGION= +DOCUMENTSERVICE_S3_SERVICE= +DOCUMENTSERVICE_S3_ENV= +CDOGS_BASE_URL= +CDOGS_SERVICE_CLIENT= +CDOGS_SERVICE_CLIENT_SECRET= +CDOGS_TOKEN_URL= +FOI_DB_HOST= +FOI_DB_PORT= +FOI_DB_NAME= +FOI_DB_USER= +FOI_DB_PASSWORD= \ No newline at end of file From c8df55e8e2c6baeccdcbd4e879ca70ee40ed99fa Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Thu, 15 Feb 2024 15:00:58 -0800 Subject: [PATCH 55/63] Changes to handle other consults. --- .../DocumentServices/services/dts/redactionsummary.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/computingservices/DocumentServices/services/dts/redactionsummary.py b/computingservices/DocumentServices/services/dts/redactionsummary.py index 788e87d06..bae052f39 100644 --- a/computingservices/DocumentServices/services/dts/redactionsummary.py +++ b/computingservices/DocumentServices/services/dts/redactionsummary.py @@ -65,13 +65,16 @@ def __get_consults_by_pageno(self, programareas, docpageflag, pagenos): for entry in docpageflag: for pg in pagenos: if entry['flagid'] == 4 and entry['page']-1 == pg['originalpageno']: - consults[pg['originalpageno']] = self.__format_consults(programareas,entry['programareaid']) + additional_consults = entry["other"] if "other" in entry else [] + consults[pg['originalpageno']] = self.__format_consults(programareas,entry['programareaid'], additional_consults) return consults - def __format_consults(self, programareas, consultids): + def __format_consults(self, programareas, consultids, others): formatted = [] for cid in consultids: formatted.append(programareas[cid]['iaocode']) + if len(others) > 0: + formatted = formatted+others return ",".join(formatted) def __format_redaction_summary(self, pageflag, pageredactions): From 4ba74a43277b580708629ebb6bd063447e7b4aea Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 15 Feb 2024 15:07:48 -0800 Subject: [PATCH 56/63] Single package fix --- .../DocumentServices/services/redactionsummaryservice.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index db60add28..41da9c284 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -32,7 +32,8 @@ def processmessage(self,incomingmessage): template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) messageattributes= message.attributes - if category == 'redline': + print("attributes length:",len(messageattributes)) + if len(messageattributes)>0: filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] From 05774ee93582ba4859c4b95aecaeb803b97da64b Mon Sep 17 00:00:00 2001 From: Aparna Date: Thu, 15 Feb 2024 15:55:21 -0800 Subject: [PATCH 57/63] Missed commit --- .../DocumentServices/services/redactionsummaryservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 41da9c284..626b82553 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -33,7 +33,7 @@ def processmessage(self,incomingmessage): redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) messageattributes= message.attributes print("attributes length:",len(messageattributes)) - if len(messageattributes)>0: + if len(messageattributes)>1: filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] From 2ce208b2f7c41bf34a2574001cdf9d020beb713a Mon Sep 17 00:00:00 2001 From: Aparna Date: Mon, 26 Feb 2024 17:39:38 -0800 Subject: [PATCH 58/63] Debug Code -print statements --- .../DocumentServices/services/cdogsapiservice.py | 4 ++-- .../DocumentServices/services/dal/documenttemplate.py | 1 + .../DocumentServices/services/documentgenerationservice.py | 4 ++++ .../DocumentServices/services/redactionsummaryservice.py | 6 ++++-- .../DocumentServices/services/zippingservice.py | 1 + 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/computingservices/DocumentServices/services/cdogsapiservice.py b/computingservices/DocumentServices/services/cdogsapiservice.py index 3b1bb4859..78a042c98 100644 --- a/computingservices/DocumentServices/services/cdogsapiservice.py +++ b/computingservices/DocumentServices/services/cdogsapiservice.py @@ -23,13 +23,13 @@ def generate_pdf(self, template_hash_code, data, access_token): "data": data } json_request_body = json.dumps(request_body) - #print("json_request_body:",json_request_body) + print("json_request_body:",json_request_body) headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {access_token}' } url = f"{cdogs_base_url}/api/v2/template/{template_hash_code}/render" - #print("url:",url) + print("url:",url) return self._post_generate_pdf(json_request_body, headers, url) def _post_generate_pdf(self, json_request_body, headers, url): diff --git a/computingservices/DocumentServices/services/dal/documenttemplate.py b/computingservices/DocumentServices/services/dal/documenttemplate.py index c3ba41ad3..ee6cdca51 100644 --- a/computingservices/DocumentServices/services/dal/documenttemplate.py +++ b/computingservices/DocumentServices/services/dal/documenttemplate.py @@ -39,6 +39,7 @@ def updatecdogshashcode(cls, documenttypeid, cdogshashcode): ''' parameters = (cdogshashcode, documenttypeid,) cursor.execute(query, parameters) + print("DB updated") conn.commit() except(Exception) as error: print("Exception while executing func updatecdogshashcode, Error : {0} ".format(error)) diff --git a/computingservices/DocumentServices/services/documentgenerationservice.py b/computingservices/DocumentServices/services/documentgenerationservice.py index c7abc7ceb..c88f2116a 100644 --- a/computingservices/DocumentServices/services/documentgenerationservice.py +++ b/computingservices/DocumentServices/services/documentgenerationservice.py @@ -39,9 +39,11 @@ def generate_pdf(self, data, documenttypename='redline_redaction_summary', templ if templatefromdb is not None and templatefromdb["cdogs_hash_code"] is not None: template_cached = cdogsapiservice().check_template_cached(templatefromdb["cdogs_hash_code"], access_token) templatecdogshashcode = templatefromdb["cdogs_hash_code"] + print("template_cached:",template_cached) if templatefromdb is None or templatefromdb["cdogs_hash_code"] is None or not template_cached: templatecdogshashcode = cdogsapiservice().upload_template(template_path, access_token) + print("templatecdogshashcode:",templatecdogshashcode) if templatefromdb is not None and templatefromdb["document_type_id"] is not None: templatefromdb["cdogs_hash_code"] = templatecdogshashcode documenttemplate().updatecdogshashcode(templatefromdb["document_type_id"], templatefromdb["cdogs_hash_code"]) @@ -52,9 +54,11 @@ def __gettemplate(self,documenttypename='redline_redaction_summary'): templatefromdb=None summary_cdogs_hash_code=None summary_document_type_id =documenttemplate().getdocumenttypebyname(documenttypename) + print("summary_document_type_id:",summary_document_type_id) if summary_document_type_id is not None: summary_cdogs_hash_code=documenttemplate().gettemplatebytype(summary_document_type_id) templatefromdb = {"document_type_id": summary_document_type_id, "cdogs_hash_code":summary_cdogs_hash_code} + print("templatefromdb:",templatefromdb) return templatefromdb except (Exception) as error: print('error occured in document generation service - gettemplate method: ', error) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 626b82553..667c7c281 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -28,21 +28,23 @@ def processmessage(self,incomingmessage): divisionid = entry.divisionid documentids = entry.documentids formattedsummary = redactionsummary().prepareredactionsummary(message, documentids, pageflags, programareas) - #print('formattedsummary', formattedsummary) + print('formattedsummary', formattedsummary) template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) + print("redaction_summary: ", redaction_summary.content) messageattributes= message.attributes print("attributes length:",len(messageattributes)) if len(messageattributes)>1: filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] + print("filesobj: ", filesobj.content) stitcheddocs3uri = filesobj.s3uripath stitcheddocfilename = filesobj.filename s3uricategoryfolder= "oipcreview" if category == 'oipcreviewredline' else category s3uri = stitcheddocs3uri.split(s3uricategoryfolder+"/")[0] + s3uricategoryfolder+"/" filename = stitcheddocfilename.replace(".pdf","- summary.pdf") - #print('s3uri:', s3uri) + print('s3uri:', s3uri) uploadobj= uploadbytes(filename,redaction_summary.content, s3uri) upload_responses.append(uploadobj) if uploadobj["uploadresponse"].status_code == 200: diff --git a/computingservices/DocumentServices/services/zippingservice.py b/computingservices/DocumentServices/services/zippingservice.py index fed5c4bc1..2a9489513 100644 --- a/computingservices/DocumentServices/services/zippingservice.py +++ b/computingservices/DocumentServices/services/zippingservice.py @@ -15,6 +15,7 @@ def preparemessageforzipperservice(self,summaryfiles, message): filestozip_list = msgjson['filestozip']+summaryfiles else: filestozip_list = msgjson['filestozip'] + print('filestozip_list: ', filestozip_list) msgjson['filestozip'] = self.to_json(filestozip_list) msgjson['attributes'] = self.to_json(msgjson['attributes']) msgjson['summarydocuments'] = self.to_json(msgjson['summarydocuments']) From 6bf4a2f35f1e3f77aaaa527342db5f34b93f214f Mon Sep 17 00:00:00 2001 From: Aparna Date: Mon, 26 Feb 2024 20:53:35 -0800 Subject: [PATCH 59/63] Removed unwanted print statement1 --- .../DocumentServices/services/redactionsummaryservice.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/computingservices/DocumentServices/services/redactionsummaryservice.py b/computingservices/DocumentServices/services/redactionsummaryservice.py index 667c7c281..2861e94d2 100644 --- a/computingservices/DocumentServices/services/redactionsummaryservice.py +++ b/computingservices/DocumentServices/services/redactionsummaryservice.py @@ -31,14 +31,12 @@ def processmessage(self,incomingmessage): print('formattedsummary', formattedsummary) template_path='templates/'+documenttypename+'.docx' redaction_summary= documentgenerationservice().generate_pdf(formattedsummary, documenttypename,template_path) - print("redaction_summary: ", redaction_summary.content) messageattributes= message.attributes print("attributes length:",len(messageattributes)) if len(messageattributes)>1: filesobj=(next(item for item in messageattributes if item.divisionid == divisionid)).files[0] else: filesobj= messageattributes[0].files[0] - print("filesobj: ", filesobj.content) stitcheddocs3uri = filesobj.s3uripath stitcheddocfilename = filesobj.filename s3uricategoryfolder= "oipcreview" if category == 'oipcreviewredline' else category From 9e28a44e5c7c5b57574400feaf981c94bc59c0c6 Mon Sep 17 00:00:00 2001 From: "sumathi.thirumani" Date: Tue, 27 Feb 2024 10:48:39 -0800 Subject: [PATCH 60/63] Changes to fix the exception on harms flow. --- .../ZippingServices/models/zipperproducermessage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/computingservices/ZippingServices/models/zipperproducermessage.py b/computingservices/ZippingServices/models/zipperproducermessage.py index e57d1d49d..068642334 100644 --- a/computingservices/ZippingServices/models/zipperproducermessage.py +++ b/computingservices/ZippingServices/models/zipperproducermessage.py @@ -1,5 +1,5 @@ class zipperproducermessage(object): - def __init__(self,jobid,requestid,category,requestnumber,bcgovcode,createdby,ministryrequestid,filestozip,finaloutput,attributes,summarydocuments,redactionlayerid) -> None: + def __init__(self,jobid,requestid,category,requestnumber,bcgovcode,createdby,ministryrequestid,filestozip,finaloutput,attributes,summarydocuments=None,redactionlayerid=None) -> None: self.jobid = jobid self.requestid = requestid self.category=category From 5eaf46f4da7fb3c4d68d9c7cb1f6b8aa6219ac74 Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Tue, 27 Feb 2024 14:15:20 -0800 Subject: [PATCH 61/63] Fix jpeg stitching issue #2941 --- web/src/components/FOI/Home/Redlining.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index 9ac2d1d5d..88fa2f1c3 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -690,7 +690,7 @@ const Redlining = React.forwardRef( ) => { slicedsetofdoclist.forEach(async (filerow) => { await createDocument(filerow.s3url, - { useDownloader: false } // Added to fix BLANK page issue + { useDownloader: false, loadAsPDF: true } // Added to fix BLANK page issue - added loadAsPDF to fix jpeg stitiching issue #2941 ).then(async (newDoc) => { setpdftronDocObjects((_arr) => [ ..._arr, From 49faa81afc0a406289b3af4fd24ca3cab81c051f Mon Sep 17 00:00:00 2001 From: Aparna Date: Wed, 28 Feb 2024 09:24:49 -0800 Subject: [PATCH 62/63] Document service openshift template updates --- .../documentservice/documentservice-deploy.yaml | 2 +- .../documentservice/documentservice_secrets.yaml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/openshift/templates/documentservice/documentservice-deploy.yaml b/openshift/templates/documentservice/documentservice-deploy.yaml index 5109de3ef..1bce18441 100644 --- a/openshift/templates/documentservice/documentservice-deploy.yaml +++ b/openshift/templates/documentservice/documentservice-deploy.yaml @@ -173,7 +173,7 @@ objects: secretKeyRef: name: "${SECRETS}" key: FOI_DB_USER - - name: FOI_DB_PASSWORD + - name: FOI_DB_PASSWORD valueFrom: secretKeyRef: name: "${SECRETS}" diff --git a/openshift/templates/documentservice/documentservice_secrets.yaml b/openshift/templates/documentservice/documentservice_secrets.yaml index 0818edff5..2ca23a592 100644 --- a/openshift/templates/documentservice/documentservice_secrets.yaml +++ b/openshift/templates/documentservice/documentservice_secrets.yaml @@ -88,4 +88,16 @@ parameters: required: true - name: FOI_DB_PASSWORD description: FOI_DB_PASSWORD + required: true + - name: CDOGS_SERVICE_CLIENT_SECRET + description: CDOGS_SERVICE_CLIENT_SECRET + required: true + - name: CDOGS_SERVICE_CLIENT + description: CDOGS_SERVICE_CLIENT + required: true + - name: CDOGS_TOKEN_URL + description: CDOGS_TOKEN_URL + required: true + - name: CDOGS_BASE_URL + description: CDOGS_BASE_URL required: true \ No newline at end of file From 7092efd0ee393f2cb168a252ff0ae792642c0efb Mon Sep 17 00:00:00 2001 From: Richard Qi Date: Wed, 28 Feb 2024 09:29:35 -0800 Subject: [PATCH 63/63] code format --- web/src/components/FOI/Home/Redlining.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web/src/components/FOI/Home/Redlining.js b/web/src/components/FOI/Home/Redlining.js index bd0dd15e0..8787e330c 100644 --- a/web/src/components/FOI/Home/Redlining.js +++ b/web/src/components/FOI/Home/Redlining.js @@ -689,9 +689,10 @@ const Redlining = React.forwardRef( set ) => { slicedsetofdoclist.forEach(async (filerow) => { - await createDocument(filerow.s3url, - { useDownloader: false, loadAsPDF: true } // Added to fix BLANK page issue - added loadAsPDF to fix jpeg stitiching issue #2941 - ).then(async (newDoc) => { + await createDocument(filerow.s3url, { + useDownloader: false, // Added to fix BLANK page issue + loadAsPDF: true, // Added to fix jpeg/pdf stitiching issue #2941 + }).then(async (newDoc) => { setpdftronDocObjects((_arr) => [ ..._arr, {