Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Document Reviewer Web- New batch download, stitch logic implementation for Redline download #4680 #628

Merged
merged 80 commits into from
Nov 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
8e93652
Merge pull request #459 from bcgov/dev
Aman-Hundal Sep 8, 2023
443fa4b
Merge pull request #469 from bcgov/dev
Aman-Hundal Sep 12, 2023
2639c6d
Added sonarcloud properties file
aparna-aot Sep 29, 2023
1cb47b6
Removed commented code
aparna-aot Sep 29, 2023
78ef119
Merge pull request #501 from bcgov/main-AS-sonarcloud
aparna-aot Sep 29, 2023
48ea73c
Adjusted url to link to main help articles page
Aman-Hundal Oct 3, 2023
9436435
Merge pull request #508 from bcgov/dev-AH-4515
Aman-Hundal Oct 24, 2023
584f5bf
revert msg inline changes so rest of 8.4.5 can go to main
nkan-aot Oct 25, 2023
a7e36f4
Merge pull request #567 from bcgov/dev-NK-4339-revert
nkan-aot Oct 25, 2023
bc4a8ac
Merge pull request #566 from bcgov/dev
Aman-Hundal Oct 26, 2023
50dcf4d
fix issue with special characters in href
nkan-aot Oct 26, 2023
595c630
Merge pull request #576 from bcgov/dev-NK-4339-2
nkan-aot Oct 26, 2023
4e6a604
Add .jpeg file type to stich service
milosdes Oct 26, 2023
a6e9dd0
Merge pull request #577 from bcgov/dev-MD-4633
milosdes Oct 26, 2023
5e41d24
Revert "fix issue with special characters in href"
nkan-aot Oct 27, 2023
5aa3bae
Merge pull request #581 from bcgov/revert-576-dev-NK-4339-2
nkan-aot Oct 27, 2023
9b8b9e5
Merge pull request #588 from bcgov/dev
Aman-Hundal Oct 30, 2023
278ca9a
change hex code for left panel selected items
nkan-aot2 Nov 1, 2023
cb6c2c8
Multi KeyWord Search added for test-marshal
Aman-Hundal Nov 1, 2023
e96edbb
Fix for 4652
Nov 1, 2023
34f0f91
Merge pull request #594 from bcgov/test-marshal-NK-4672
sumathi-thirumani Nov 1, 2023
34759a6
Merge pull request #595 from bcgov/test-marshal-ST-4652
sumathi-thirumani Nov 1, 2023
1e950de
Merge pull request #593 from bcgov/test-marshal-AH-4614
nkan-aot Nov 1, 2023
43f5314
Merge branch 'test-marshal' into dev-NK-4583
nkan-aot2 Nov 1, 2023
e951d5a
Merge pull request #596 from bcgov/dev-NK-4583
nkan-aot Nov 1, 2023
40334b1
PDFTRN 10.5 upgrade
abin-aot Nov 1, 2023
76fe75b
Merge pull request #598 from bcgov/dev-AA-4640-marshal
abin-aot Nov 1, 2023
4d31c15
revert unwanted changes, add syncfusion upgrade
nkan-aot2 Nov 2, 2023
23cd61e
Merge pull request #599 from bcgov/dev-NK-4583
nkan-aot Nov 2, 2023
a692110
revert upgrade to 7.0.0
nkan-aot Nov 2, 2023
3e3aa1b
Changes to resolve stitch issue for all pages ineligible for download…
Nov 2, 2023
6f0a127
Changes to resolve stitch issue for all pages ineligible for download…
Nov 2, 2023
46d0c48
Changes to resolve stitch issue for all pages ineligible for download…
Nov 3, 2023
8f2c136
Merge pull request #601 from bcgov/test-marshal-ST-4652
divyav-aot Nov 3, 2023
5324d19
make all redaction tool fill white
nkan-aot2 Nov 3, 2023
eb9ef37
Bug fixes for 4652.
Nov 3, 2023
64f5a5d
Merge pull request #604 from bcgov/test-marshal-ST-4652-v1
sumathi-thirumani Nov 3, 2023
9185bb2
Merge pull request #605 from bcgov/test-marshal
abin-aot Nov 3, 2023
04df8dc
Merge pull request #606 from bcgov/dev
abin-aot Nov 3, 2023
80f1de0
Merge pull request #603 from bcgov/dev-NK-4583
nkan-aot Nov 6, 2023
72f6cb5
fix warning message for get pdftron license failed
richard-aot Nov 6, 2023
6c6b9e8
Merge branch 'dev' of github.com:bcgov/foi-docreviewer into dev-RQ-4655
richard-aot Nov 6, 2023
6d8483a
Bug fix for #4698
richard-aot Nov 6, 2023
ca291a2
Merge pull request #608 from bcgov/dev-RQ-4698
richard-aot Nov 6, 2023
156a52f
Merge pull request #609 from bcgov/dev
richard-aot Nov 6, 2023
79212af
Fix for 4699.
Nov 7, 2023
457cd83
Changes to resolve apply annotations of stitch by division.
Nov 7, 2023
9f7b850
Changes to resolve apply annotations of stitch by division.
Nov 7, 2023
61984b8
page number fix for single package.
Nov 7, 2023
28d3139
Changes to handle duplicate in single package duplicate.
Nov 7, 2023
d718293
toast changes.
Nov 7, 2023
8b0ff06
Merge pull request #610 from bcgov/dev-ST-4699
sumathi-thirumani Nov 7, 2023
36619ac
Merge pull request #611 from bcgov/dev
sumathi-thirumani Nov 8, 2023
b4ea3f6
revert license api call changes
nkan-aot Nov 8, 2023
c7a2bb2
Merge pull request #612 from bcgov/dev-NK-revert-license
nkan-aot Nov 8, 2023
29f7b88
Merge pull request #613 from bcgov/dev
nkan-aot Nov 8, 2023
e9080cb
Removed duplicate api call of pageflag
aparna-aot Nov 10, 2023
30f6ab9
mark annotations of replaced documents as inactive
nkan-aot2 Nov 10, 2023
59d50ca
filter out annotations for replaced attachments
richard-aot Nov 10, 2023
4a567f7
Merge branch 'dev-NK-4704' of github.com:bcgov/foi-docreviewer into d…
richard-aot Nov 10, 2023
f36e892
bug fix: redline save replaced images
richard-aot Nov 10, 2023
d2b256a
Merge pull request #616 from bcgov/dev-RQ-4704
richard-aot Nov 14, 2023
7f8618d
added comment to explain logic
richard-aot Nov 14, 2023
9632004
add condition replaced pdfs
nkan-aot2 Nov 15, 2023
397d442
Merge pull request #617 from bcgov/dev-NK-4704
nkan-aot Nov 15, 2023
ae6f239
update query:
richard-aot Nov 16, 2023
b4b5559
Merge branch 'dev' of github.com:bcgov/foi-docreviewer into dev-RQ-4704
richard-aot Nov 16, 2023
0b7a1dc
Merge pull request #618 from bcgov/dev-RQ-4704
richard-aot Nov 16, 2023
b1eec1d
add timestamp for debugging
richard-aot Nov 16, 2023
59fd849
Merge pull request #619 from bcgov/dev-RQ-4704
nkan-aot Nov 16, 2023
6c82950
#4701 fix for DOCX conversion out of memory issue
abin-aot Nov 16, 2023
a814505
Merge pull request #620 from bcgov/dev-AA-4701-hotfix
abin-aot Nov 16, 2023
50f3d4a
Revert "add timestamp for debugging"
richard-aot Nov 16, 2023
34fa5c9
Merge pull request #621 from bcgov/revert-619-dev-RQ-4704
nkan-aot Nov 16, 2023
bd8d147
Merge pull request #622 from bcgov/dev
richard-aot Nov 17, 2023
d32f2e8
Slicer- Redline - Initial commit
aparna-aot Nov 20, 2023
111d806
updated code with slicer
aparna-aot Nov 22, 2023
95e8996
Merge branch main
aparna-aot Nov 22, 2023
3d74fc3
Updated merged code
aparna-aot Nov 22, 2023
365fc96
Updated and Removed comments
aparna-aot Nov 23, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
38 changes: 30 additions & 8 deletions MCS.FOI.S3FileConversion/MCS.FOI.DocToPDF/DocFileProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,38 @@ public DocFileProcessor(Stream SourceStream)
wordDocument.RevisionOptions.CommentDisplayMode = CommentDisplayMode.ShowInBalloons;
wordDocument.RevisionOptions.CommentColor = RevisionColor.Blue;

//Creates an instance of DocIORenderer.
using (DocIORenderer renderer = new DocIORenderer())
foreach(var entity in wordDocument.ChildEntities)
{
using PdfDocument pdfDocument = renderer.ConvertToPDF(wordDocument);
//Save the PDF file
//Close the instance of document objects
pdfDocument.Save(output);
pdfDocument.Close(true);
converted = true;
if(entity.GetType().FullName == "Syncfusion.DocIO.DLS.WSection")
{
Syncfusion.DocIO.DLS.WSection _wsection = (Syncfusion.DocIO.DLS.WSection)entity;

foreach (IWTable table in _wsection.Tables)
{
table.TableFormat.IsAutoResized = false;
table.TableFormat.WrapTextAround = true;
}

}

}

using (Stream wordstream = new MemoryStream())
{
wordDocument.Save(wordstream, wordDocument.ActualFormatType);

//Creates an instance of DocIORenderer.
using (DocIORenderer renderer = new DocIORenderer())
{

using PdfDocument pdfDocument = renderer.ConvertToPDF(wordstream);
//Save the PDF file
//Close the instance of document objects
pdfDocument.Save(output);
pdfDocument.Close(true);
converted = true;

}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
<PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
<PackageReference Include="SkiaSharp" Version="2.88.6" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="2.88.6" />
<PackageReference Include="MsgReader" Version="4.5.0" />
<PackageReference Include="MsgReader" Version="4.2.1" />
<PackageReference Include="Syncfusion.DocIO.Net.Core" Version="23.1.40" />
<PackageReference Include="Syncfusion.DocIORenderer.Net.Core" Version="23.1.40" />
<PackageReference Include="Syncfusion.HtmlToPdfConverter.QtWebKit.Net.Core" Version="20.3.0.56" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
</ItemGroup>

</Project>
</Project>
225 changes: 58 additions & 167 deletions MCS.FOI.S3FileConversion/MCS.FOI.MSGToPDF/MSGFileProcessor.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="2.88.6" />
<PackageReference Include="Syncfusion.PresentationRenderer.Net.Core" Version="23.1.40" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
<PackageReference Include="System.Drawing.Common" Version="5.0.2" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ public S3Handler() { }
catch (Exception exception)
{
Console.WriteLine($"Error encountered on server. Message:'{exception.Message}' getting list of objects.");
throw exception;
throw;
}
finally
{
Expand Down
32 changes: 32 additions & 0 deletions api/reviewer_api/models/Annotations.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,9 @@ def get_request_annotations_pagination(
cls, ministryrequestid, mappedlayerids, page, size
):
_deleted = DocumentMaster.getdeleted(ministryrequestid)
_originalnodonversionfiles = DocumentMaster.filteroriginalnoconversionfiles(ministryrequestid)
_replacednoconversionfiles = DocumentMaster.filterreplacednoconversionfiles(ministryrequestid)
_replacedotherfiles = DocumentMaster.filterreplacedfiles(ministryrequestid)
_session = db.session
_subquery_annotation = (
_session.query(
Expand All @@ -116,6 +119,8 @@ def get_request_annotations_pagination(
and_(
Annotation.documentid == Document.documentid,
Document.documentmasterid.notin_(_deleted),
or_(Document.documentmasterid.in_(_replacedotherfiles), Document.documentmasterid.in_(_originalnodonversionfiles)),
Document.documentmasterid.notin_(_replacednoconversionfiles),
Document.foiministryrequestid == ministryrequestid,
),
)
Expand Down Expand Up @@ -547,6 +552,33 @@ def bulkdeleteannotations(
finally:
db.session.close()

@classmethod
def deletedocumentannotations(
cls, documentids, userinfo
) -> DefaultMethodResult:
try:
sql = """with annotationames as (update "Annotations" a set isactive = false, updatedby = :userinfo, updated_at=now()
where a.documentid in :documentids
and a.isactive = True returning annotationname)
update public."AnnotationSections" as1 set isactive = false, updatedby = :userinfo, updated_at=now()
where annotationname in (select * from annotationames)
and as1.isactive = True"""
db.session.execute(
text(sql),
{
"userinfo": json.dumps(userinfo),
"documentids": tuple(documentids),
},
)
db.session.commit()
return DefaultMethodResult(
True, "Annotations for documentids" + ",".join(str(documentids)) + "are deleted", ",".join(str(documentids))
)
except Exception as ex:
logging.error(ex)
finally:
db.session.close()

@classmethod
def getredactionsbydocumentpages(cls, _documentid, _pages, redactionlayerid):
try:
Expand Down
94 changes: 94 additions & 0 deletions api/reviewer_api/models/DocumentMaster.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,102 @@ def getdeleted(cls, ministryrequestid):
finally:
db.session.close()
return documentmasters


@classmethod
def getprocessingchilddocumentids(cls, documentmasterids):
documentmasters = []
try:
sql = """select d.documentid
from public."DocumentMaster" dm
left join public."Documents" d on d.documentmasterid = dm.documentmasterid
where processingparentid = :documentmasterids or dm.documentmasterid = :documentmasterids"""
rs = db.session.execute(text(sql), {'documentmasterids': documentmasterids})
for row in rs:
documentmasters.append(row["documentid"])
except Exception as ex:
logging.error(ex)
db.session.close()
raise ex
finally:
db.session.close()
return documentmasters


@classmethod
def filterreplacednoconversionfiles(cls, ministryrequestid):
documentmasters = []
try:
# filter out replaced jpg, png & pdf files - files do not need conversion
sql = """select processingparentid
from "DocumentMaster"
where processingparentid is not Null and ministryrequestid =:ministryrequestid"""
rs = db.session.execute(text(sql), {'ministryrequestid': ministryrequestid})
for row in rs:
documentmasters.append(row["processingparentid"])
except Exception as ex:
logging.error(ex)
db.session.close()
raise ex
finally:
db.session.close()
return documentmasters

@classmethod
def filterreplacedfiles(cls, ministryrequestid):
documentmasters = []
try:
# all original/replaced other type of files + all original/replaced (jpg, png & pdf) files
sql = """select MAX(documentmasterid) as documentmasterid
from public."DocumentMaster"
where processingparentid is not null and ministryrequestid =:ministryrequestid
group by processingparentid"""
rs = db.session.execute(text(sql), {'ministryrequestid': ministryrequestid})
for row in rs:
documentmasters.append(row["documentmasterid"])
except Exception as ex:
logging.error(ex)
db.session.close()
raise ex
finally:
db.session.close()
return documentmasters

@classmethod
def filteroriginalnoconversionfiles(cls, ministryrequestid):
documentmasters = []
try:
# all original/replaced other type of files + all original/replaced (jpg, png & pdf) files
sql = """select documentmasterid
from public."DocumentMaster"
where processingparentid is null and ministryrequestid =:ministryrequestid"""
rs = db.session.execute(text(sql), {'ministryrequestid': ministryrequestid})
for row in rs:
documentmasters.append(row["documentmasterid"])
except Exception as ex:
logging.error(ex)
db.session.close()
raise ex
finally:
db.session.close()
return documentmasters


@classmethod
def getfilepathbydocumentid(cls, documentid):
try:
sql = """select dm.filepath
from public."DocumentMaster" dm
join public."Documents" d on d.documentmasterid = dm.documentmasterid
where d.documentid = :documentid"""
rs = db.session.execute(text(sql), {'documentid': documentid}).first()
except Exception as ex:
logging.error(ex)
db.session.close()
raise ex
finally:
db.session.close()
return rs[0]

@classmethod
def getredactionready(cls, ministryrequestid):
Expand Down
6 changes: 2 additions & 4 deletions api/reviewer_api/models/DocumentPageflagHistory.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,10 @@ class DocumentPageflagHistory(db.Model):

@classmethod
def createpageflag(cls, documentpageflaghistory)->DefaultMethodResult:
# no db close or commit because this function is called in a loop
try:
db.session.add(documentpageflaghistory)
db.session.commit()
return DefaultMethodResult(True, 'Page Flag history is saved', documentpageflaghistory.id)
except Exception as ex:
logging.error(ex)
return DefaultMethodResult(True, 'Page Flag history is not saved', documentpageflaghistory.id)
finally:
db.session.close()
return DefaultMethodResult(True, 'Page Flag history is not saved', documentpageflaghistory.id)
65 changes: 61 additions & 4 deletions api/reviewer_api/models/DocumentPageflags.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,61 @@ def savepageflag(
finally:
db.session.close()

@classmethod
def bulkarchivepageflag(
cls,
_foiministryrequestid,
_documentids,
userinfo,
) -> DefaultMethodResult:
try:
dbquery = db.session.query(DocumentPageflag)
pageflags = dbquery.filter(
and_(
DocumentPageflag.foiministryrequestid == _foiministryrequestid,
DocumentPageflag.documentid.in_(_documentids),
)
)
for pageflagobj in pageflags:
DocumentPageflagHistory.createpageflag(
DocumentPageflagHistory(
documentpageflagid=pageflagobj.id,
foiministryrequestid=pageflagobj.foiministryrequestid,
documentid=pageflagobj.documentid,
documentversion=pageflagobj.documentversion,
pageflag=json.dumps(pageflagobj.pageflag),
attributes=json.dumps(pageflagobj.attributes),
createdby=json.dumps(pageflagobj.createdby),
created_at=pageflagobj.created_at,
updatedby=json.dumps(pageflagobj.updatedby),
updated_at=pageflagobj.updated_at,
redactionlayerid=pageflagobj.redactionlayerid,
)
)
DocumentPageflagHistory.createpageflag(
DocumentPageflagHistory(
documentpageflagid=pageflagobj.id,
foiministryrequestid=pageflagobj.foiministryrequestid,
documentid=pageflagobj.documentid,
documentversion=pageflagobj.documentversion,
pageflag=json.dumps(pageflagobj.pageflag),
attributes=json.dumps(pageflagobj.attributes),
createdby=json.dumps(pageflagobj.createdby),
created_at=pageflagobj.created_at,
updatedby=json.dumps(userinfo),
updated_at=pageflagobj.updated_at,
redactionlayerid=pageflagobj.redactionlayerid,
)
)
pageflags.delete(synchronize_session='fetch')
db.session.commit()
return DefaultMethodResult(True, "Page Flag is saved", _documentids)
except Exception as ex:
logging.error(ex)
return DefaultMethodResult(True, "Page Flag is not saved", _documentids)
finally:
db.session.close()

@classmethod
def getpageflag(
cls, _foiministryrequestid, _documentid, _documentversion, _redactionlayerid
Expand Down Expand Up @@ -162,23 +217,25 @@ def getpageflag(
db.session.close()

@classmethod
def getpageflag_by_request(cls, _foiministryrequestid, redactionlayerid):
def getpageflag_by_request(cls, _foiministryrequestid, redactionlayerid, documentids):
pageflags = []
try:
sql = """select distinct on (dp.documentid) dp.documentid, dp.documentversion, dp.pageflag
from "DocumentPageflags" dp
join "Documents" d on dp.documentid = d.documentid and d.foiministryrequestid = :foiministryrequestid
join "DocumentMaster" dm on dm.documentmasterid = d.documentmasterid and dm.ministryrequestid = :foiministryrequestid
left join "DocumentDeleted" dd on dm.filepath ilike dd.filepath || '%' and dd.ministryrequestid = :foiministryrequestid
where dp.foiministryrequestid = :foiministryrequestid and (dd.deleted is false or dd.deleted is null)
--join "DocumentMaster" dm on dm.documentmasterid = d.documentmasterid and dm.ministryrequestid = :foiministryrequestid
--left join "DocumentDeleted" dd on dm.filepath ilike dd.filepath || '%' and dd.ministryrequestid = :foiministryrequestid
where dp.foiministryrequestid = :foiministryrequestid --and (dd.deleted is false or dd.deleted is null)
and redactionlayerid in :redactionlayerid
and dp.documentid in :documentids
order by dp.documentid, dp.documentversion desc, dp.id desc;
"""
rs = db.session.execute(
text(sql),
{
"foiministryrequestid": _foiministryrequestid,
"redactionlayerid": tuple(redactionlayerid),
"documentids": tuple(documentids),
},
)

Expand Down
7 changes: 4 additions & 3 deletions api/reviewer_api/resources/documentpageflag.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def get(requestid, documentid, documentversion, redactionlayerid):


@cors_preflight('GET,OPTIONS')
@API.route('/ministryrequest/<requestid>/pageflag/<redactionlayerid>')
@API.route('/ministryrequest/<requestid>/pageflag/<redactionlayerid>/<documentids>')
class GetDocumentPageflag(Resource):
"""Get document page flag list.
"""
Expand All @@ -84,9 +84,10 @@ class GetDocumentPageflag(Resource):
@cross_origin(origins=allowedorigins())
@auth.require
@auth.ismemberofgroups(getrequiredmemberships())
def get(requestid, redactionlayerid):
def get(requestid, redactionlayerid, documentids):
try:
result = documentpageflagservice().getpageflags(requestid, redactionlayerid)
documentids = documentids.split(",")
result = documentpageflagservice().getpageflags(requestid, redactionlayerid, documentids)
return json.dumps(result), 200
except KeyError as error:
return {'status': False, 'message': CUSTOM_KEYERROR_MESSAGE + str(error)}, 400
Expand Down
Loading