Skip to content

Commit

Permalink
rework label feature restrictor
Browse files Browse the repository at this point in the history
The initial implementation for page label support uses the
macro-restrictor feature to disable its use; however, this feature is
not a macro. At the same time, label capabilities could be disabled by
an administrator as well. Therefore, it would still be ideal if a
publisher had the ability to prevent an attempt to adjust labels on a
page.

The first part of this change tweaks the advanced configuration item
`confluence_adv_restricted_macros` which will be renamed to
`confluence_adv_restricted` to be more generic. Since this is an
advanced/undocumented feature, there is less concern for configuration
changes between revisions of this extension (however, it may be ideal to
note the change in the changelog when a new release is made).

With the restriction feature being more generic, we can use the simple
tag/quirk list to help disable the label interaction. The original tag
created was named `confluence_metadata`; however, this will be changed
to `labels` to be more specific on what is being restricted.

The final change will deal with where the restrictions take place. The
original implementation would only disable accepting the new label
content at the page-level. This would still result in the publish
attempt to query for labels and attempt to re-set labels (which is not
really required and may cause an API failure if labels are restricted).
Instead, the translator will also accept new label information when
processing a document, but the restriction flag will be used to prevent
a publishing event from query and attempting to set label information.

Signed-off-by: James Knight <james.d.knight@live.com>
  • Loading branch information
jdknight committed Jul 25, 2020
1 parent 7dd5962 commit 282d0c6
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 25 deletions.
4 changes: 2 additions & 2 deletions sphinxcontrib/confluencebuilder/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@ def builderInitedHook(app):
app.add_config_value('confluence_adv_ignore_nodes', [], False)
"""Unknown node handler dictionary for advanced integrations."""
app.add_config_value('confluence_adv_node_handler', None, '')
"""List of extension-provided macros restricted for use."""
app.add_config_value('confluence_adv_restricted_macros', [], False)
"""List of optional features/macros/etc. restricted for use."""
app.add_config_value('confluence_adv_restricted', [], False)
"""Enablement of tracing processed data."""
app.add_config_value('confluence_adv_trace_data', False, False)
"""Do not cap sections to a maximum of six (6) levels."""
Expand Down
33 changes: 21 additions & 12 deletions sphinxcontrib/confluencebuilder/publisher.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,11 +370,14 @@ def storePage(self, page_name, data, parent_id=None):
self._dryrun('updating existing page', page['id'], misc)
return page['id']

_, page = self.getPage(page_name, expand='version,metadata.labels')
can_labels = not 'labels' in self.config.confluence_adv_restricted
expand = 'version'
if can_labels:
expand += ',metadata.labels'

_, page = self.getPage(page_name, expand=expand)
try:
if not page:
labels = [v for v in self.config.confluence_metadata['labels']]
metadata_labels = [{'name': v} for v in set(labels)]
newPage = {
'type': 'page',
'title': page_name,
Expand All @@ -387,10 +390,14 @@ def storePage(self, page_name, data, parent_id=None):
'space': {
'key': self.space_name
},
'metadata': {
}

if can_labels:
labels = [v for v in self.config.confluence_metadata['labels']]
metadata_labels = [{'name': v} for v in set(labels)]
newPage['metadata'] = {
'labels': metadata_labels
}
}

if parent_id:
newPage['ancestors'] = [{'id': parent_id}]
Expand All @@ -411,11 +418,6 @@ def storePage(self, page_name, data, parent_id=None):
uploaded_page_id = rsp['id']
else:
last_version = int(page['version']['number'])
labels = [l.get('name')
for l in page.get('metadata', {}).get('labels', {}).get('results', {})
]
labels.extend([v for v in self.config.confluence_metadata['labels']])
metadata_labels = [{'name': v} for v in set(labels)]
updatePage = {
'id': page['id'],
'type': 'page',
Expand All @@ -432,10 +434,17 @@ def storePage(self, page_name, data, parent_id=None):
'version': {
'number': last_version + 1
},
'metadata': {
}

if can_labels:
labels = [l.get('name')
for l in page.get('metadata', {}).get('labels', {}).get('results', {})
]
labels.extend([v for v in self.config.confluence_metadata['labels']])
metadata_labels = [{'name': v} for v in set(labels)]
updatePage['metadata'] = {
'labels': metadata_labels
}
}

if not self.notify:
updatePage['version']['minorEdit'] = True
Expand Down
19 changes: 8 additions & 11 deletions sphinxcontrib/confluencebuilder/translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,14 @@ def __init__(self, document, builder):
self._highlight = DEFAULT_HIGHLIGHT_STYLE
self._linenothreshold = sys.maxsize

# helpers for dealing with disabled/unsupported macros
restricted_macros = config.confluence_adv_restricted_macros
self.can_admonition = not 'info' in restricted_macros
self.can_anchor = not 'anchor' in restricted_macros
self.can_children = not 'children' in restricted_macros
self.can_code = not 'code' in restricted_macros
self.can_viewfile = not 'viewfile' in restricted_macros
self.can_jira = not 'jira' in restricted_macros
self.can_metadata = not 'confluence_metadata' in restricted_macros
# helpers for dealing with disabled/unsupported features
restricted = config.confluence_adv_restricted
self.can_admonition = not 'info' in restricted
self.can_anchor = not 'anchor' in restricted
self.can_children = not 'children' in restricted
self.can_code = not 'code' in restricted
self.can_jira = not 'jira' in restricted
self.can_viewfile = not 'viewfile' in restricted

if (config.confluence_page_hierarchy
and config.confluence_adv_hierarchy_child_macro
Expand Down Expand Up @@ -1686,8 +1685,6 @@ def _visit_jira_node(self, node):
visit_jira_issue = _visit_jira_node

def _visit_confluence_metadata_node(self, node):
if not self.can_metadata:
raise nodes.SkipNode
self.builder.config.confluence_metadata = node.params

raise nodes.SkipNode
Expand Down

0 comments on commit 282d0c6

Please sign in to comment.