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

Default toc length config #2042

Merged
merged 18 commits into from
Sep 4, 2024
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions dev/config/pyramid_oereb.yml.mako
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,16 @@ pyramid_oereb:
# more time to generate the PDF. If set to false, it will assume that only one TOC page exists, and this can
# lead to wrong numbering in the TOC.
compute_toc_pages: true
# To avoid the potentially time consuming second computing of the PDF extract and skip the the computation
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe the in the comment, you could point out, that if the compute_toc_pages is set to true, it will always overwrite the default_toc_length.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe:

In order to skip the computation of the estimated number of TOC pages which might return an erroneous result for your setting, you can specify a default for the number of TOC pages. For most of the cantons the number of TOC pages is pretty constant unless a real estate is concerned by none or a huge number of restrictions.
In both cases (computing an estimate or setting a default for the number of TOC pages) the exact number of TOC pages is extracted from the created PDF and if it differs from the expected value the PDF is created a second time with the correct page numbers.
Note that if "compute_toc_pages" is set true the "default_toc_length" is not taken into account.

# of the estimated TOC length, you can specify a default length for the number of TOC pages.
# For most of the cantons the length of the TOC is pretty consistent unless a real estate is concerned by none
# or a huge number of restrictions.
# An additional page break might also occur if the number of published topics is close to a threshold number
# where the TOC fits just about on one or two pages. - for those case estimate the TOC length ist preferable.
# In both cases (computing an estimated length or setting a default length) the exact number of TOC pages is
# extracted from the created PDF and if it is different from the expected value the PDF extract is called a
# second time with the correct page numbers.
default_toc_length: 2
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the name of the variable could be more precise. E.g. "most_frequent_toc_length"

# Specify any additional URL parameters that the print shall use for WMS calls
wms_url_params:
TRANSPARENT: 'true'
Expand Down
7 changes: 7 additions & 0 deletions doc/source/changes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ Changes/Hints for migration
This chapter will give you hints on how to handle version migration, in particular regarding what you may need
to adapt in your project configuration, database etc. when upgrading to a new version.

Version 2.6.0
-------------
* New parameter 'default_toc_length' allows to define a default table of content pages number avoiding a second
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would omit the statemtents about the 95% and the default setting. I guess default is to not set this parameter.

call for the pdf extract in most cases. This value should be set if >95% of the PDF have the same number of TOC
pages.
Default setting: 2
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That is omitted now.

A change in this pull request is that the pdf is built a second time whenever the numbers of toc pages disagree between extract_as_dict['nbTocPages'] (computed/expected/1, depending on the setting) and the one in the returned pdf.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the current version it is only rebuild if 'compute_toc_pages' is true.


Version 2.5.3
-------------
Feature and maintenance release:
Expand Down
39 changes: 36 additions & 3 deletions pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,17 +73,20 @@
extract_as_dict = self._render(extract_record, value[1])
feature_geometry = mapping(extract_record.real_estate.limit)

print_config = Config.get('print', {})
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the variable 'print_config' is defined, it should thoroughly be used in subsequent parts of the code.


if Config.get('print', {}).get('compute_toc_pages', False):
extract_as_dict['nbTocPages'] = TocPages(extract_as_dict).getNbPages()
else:
extract_as_dict['nbTocPages'] = 1
if Config.get('print', {}).get('default_toc_length', False):
extract_as_dict['nbTocPages'] = print_config.get('default_toc_length', 2)

Check warning on line 82 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L81-L82

Added lines #L81 - L82 were not covered by tests
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would not specify a default, but test if it is a positive number.

else:
extract_as_dict['nbTocPages'] = 1

Check warning on line 84 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L84

Added line #L84 was not covered by tests

# set the global_datetime variable so that it can be used later for the archive
self.set_global_datetime(extract_as_dict['CreationDate'])
self.convert_to_printable_extract(extract_as_dict, feature_geometry)

print_config = Config.get('print', {})

extract_as_dict['Display_RealEstate_SubunitOfLandRegister'] = print_config.get(
'display_real_estate_subunit_of_land_register', True
)
Expand Down Expand Up @@ -116,6 +119,7 @@
data=json.dumps(spec)
)
try:
log.debug('Validation of the TOC length with compute_toc_pages set to {} and default_toc_length set to {}'.format(print_config.get('compute_toc_pages'), print_config.get('default_toc_length'))) # noqa
if Config.get('print', {}).get('compute_toc_pages', False):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can leave the if statement away.
The check if the toc pages from the actual pdf fits the extract_as_dict['nbTocPages'] we've set above should be done anyways and will be the same for all three cases.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree.

with io.BytesIO() as pdf:
pdf.write(print_result.content)
Expand All @@ -131,14 +135,43 @@
except ValueError:
true_nb_of_toc = 1

log.debug('True number of TOC pages is {}'.format(true_nb_of_toc))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe the expected number can also be written to the log (in case it is computed).

if true_nb_of_toc != extract_as_dict['nbTocPages']:
log.warning('nbTocPages in result pdf: {} are not equal to the one predicted : {}, request new pdf'.format(true_nb_of_toc,extract_as_dict['nbTocPages'])) # noqa
log.debug('Secondary PDF extract call STARTED')
extract_as_dict['nbTocPages'] = true_nb_of_toc
print_result = requests.post(

Check warning on line 143 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L140-L143

Added lines #L140 - L143 were not covered by tests
pdf_url,
headers=pdf_headers,
data=json.dumps(spec)
)
log.debug('Secondary PDF extract call to fix TOC pages number FINISHED')
elif Config.get('print', {}).get('default_toc_length', 2):
with io.BytesIO() as pdf:
pdf.write(print_result.content)
pdf_reader = PdfReader(pdf)
x = []
for i in range(len(pdf_reader.outline)):
if isinstance(pdf_reader.outline[i], list):
x.append(pdf_reader.outline[i][0]['/Page']['/StructParents'])

Check warning on line 156 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L148-L156

Added lines #L148 - L156 were not covered by tests
else:
x.append(pdf_reader.outline[i]['/Page']['/StructParents'])
try:
true_nb_of_toc = min(x)-1
except ValueError:
true_nb_of_toc = 1

Check warning on line 162 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L158-L162

Added lines #L158 - L162 were not covered by tests

log.debug('True number of TOC pages is {}'.format(true_nb_of_toc))

Check warning on line 164 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L164

Added line #L164 was not covered by tests
if true_nb_of_toc != extract_as_dict['nbTocPages']:
log.warning('nbTocPages in result pdf: {} are not equal to the one predicted : {}, request new pdf'.format(true_nb_of_toc,extract_as_dict['nbTocPages'])) # noqa
extract_as_dict['nbTocPages'] = true_nb_of_toc
log.debug('Secondary PDF extract call STARTED')

Check warning on line 168 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L168

Added line #L168 was not covered by tests
print_result = requests.post(
pdf_url,
headers=pdf_headers,
data=json.dumps(spec)
)
log.debug('Secondary PDF extract call FINISHED')

Check warning on line 174 in pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py

View check run for this annotation

Codecov / codecov/patch

pyramid_oereb/contrib/print_proxy/mapfish_print/mapfish_print.py#L174

Added line #L174 was not covered by tests
except PdfReadError as e:
err_msg = 'a problem occurred while generating the pdf file'
log.error(err_msg + ': ' + str(e))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ pyramid_oereb:
wms_url_params:
TRANSPARENT: 'true'
OTHERCUSTOM: 'myvalue'
compute_toc_pages: false
default_toc_length: 2

theme:
source:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,14 @@ def test_default_wms_url_param_config(DummyRenderInfo):
config = renderer.get_wms_url_params()
# Do the check for this test. Value should be the default setting.
assert config == {'TRANSPARENT': 'true'}


def test_toc_pages_default_config():
Config._config = None
Config.init('./tests/contrib.print_proxy.mapfish_print/resources/test_config.yml', 'pyramid_oereb')
compute_toc_pages = Config.get('print', {}).get('compute_toc_pages')
default_toc_length = Config.get('print', {}).get('default_toc_length')

assert isinstance(compute_toc_pages, bool)
assert bool(compute_toc_pages) is False
assert default_toc_length == 2
Loading