Skip to content

Commit e8f3ad3

Browse files
author
Steve Canny
committed
style: add BaseStyle.locked getter
1 parent fa2917d commit e8f3ad3

File tree

5 files changed

+40
-3
lines changed

5 files changed

+40
-3
lines changed

docx/oxml/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ def OxmlElement(nsptag_str, attrs=None, nsdecls=None):
115115

116116
from .styles import CT_Style, CT_Styles
117117
register_element_cls('w:basedOn', CT_String)
118+
register_element_cls('w:locked', CT_OnOff)
118119
register_element_cls('w:name', CT_String)
119120
register_element_cls('w:qFormat', CT_OnOff)
120121
register_element_cls('w:semiHidden', CT_OnOff)

docx/oxml/styles.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class CT_Style(BaseOxmlElement):
4747
semiHidden = ZeroOrOne('w:semiHidden', successors=_tag_seq[9:])
4848
unhideWhenUsed = ZeroOrOne('w:unhideWhenUsed', successors=_tag_seq[10:])
4949
qFormat = ZeroOrOne('w:qFormat', successors=_tag_seq[11:])
50+
locked = ZeroOrOne('w:locked', successors=_tag_seq[12:])
5051
pPr = ZeroOrOne('w:pPr', successors=_tag_seq[17:])
5152
rPr = ZeroOrOne('w:rPr', successors=_tag_seq[18:])
5253
del _tag_seq
@@ -94,6 +95,16 @@ def delete(self):
9495
"""
9596
self.getparent().remove(self)
9697

98+
@property
99+
def locked_val(self):
100+
"""
101+
Value of `w:locked/@w:val` or |False| if not present.
102+
"""
103+
locked = self.locked
104+
if locked is None:
105+
return False
106+
return locked.val
107+
97108
@property
98109
def name_val(self):
99110
"""

docx/styles/style.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ def delete(self):
6262
@property
6363
def hidden(self):
6464
"""
65-
True if display of this style in the style gallery and list of
66-
recommended styles is suppressed. False otherwise. In order to be
65+
|True| if display of this style in the style gallery and list of
66+
recommended styles is suppressed. |False| otherwise. In order to be
6767
shown in the style gallery, this value must be |False| and
6868
:attr:`.quick_style` must be |True|.
6969
"""
@@ -73,6 +73,17 @@ def hidden(self):
7373
def hidden(self, value):
7474
self._element.semiHidden_val = value
7575

76+
@property
77+
def locked(self):
78+
"""
79+
Read/write Boolean. |True| if this style is locked. A locked style
80+
does not appear in the styles panel or the style gallery and cannot
81+
be applied to document content. This behavior is only active when
82+
formatting protection is turned on for the document (via the
83+
Developer menu).
84+
"""
85+
return self._element.locked_val
86+
7687
@property
7788
def name(self):
7889
"""

features/sty-style-props.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ Feature: Get and set style properties
4848
| on | False | False |
4949

5050

51-
@wip
5251
Scenario Outline: Get locked value
5352
Given a style having locked set <setting>
5453
Then style.locked is <value>

tests/styles/test_style.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ def it_can_change_its_quick_style_setting(self, quick_set_fixture):
159159
style.quick_style = new_value
160160
assert style._element.xml == expected_xml
161161

162+
def it_knows_whether_its_locked(self, locked_get_fixture):
163+
style, expected_value = locked_get_fixture
164+
assert style.locked == expected_value
165+
162166
def it_can_delete_itself_from_the_document(self, delete_fixture):
163167
style, styles, expected_xml = delete_fixture
164168
style.delete()
@@ -230,6 +234,17 @@ def id_set_fixture(self, request):
230234
expected_xml = xml(expected_style_cxml)
231235
return style, new_value, expected_xml
232236

237+
@pytest.fixture(params=[
238+
('w:style', False),
239+
('w:style/w:locked', True),
240+
('w:style/w:locked{w:val=0}', False),
241+
('w:style/w:locked{w:val=1}', True),
242+
])
243+
def locked_get_fixture(self, request):
244+
style_cxml, expected_value = request.param
245+
style = BaseStyle(element(style_cxml))
246+
return style, expected_value
247+
233248
@pytest.fixture(params=[
234249
('w:style{w:type=table}', None),
235250
('w:style{w:type=table}/w:name{w:val=Boofar}', 'Boofar'),

0 commit comments

Comments
 (0)