Skip to content

Commit e8d43a2

Browse files
ondrej-111scanny
authored andcommitted
sect: add Section.header
1 parent d3b8eb7 commit e8d43a2

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

docx/section.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@ def gutter(self):
9696
def gutter(self, value):
9797
self._sectPr.gutter = value
9898

99+
@lazyproperty
100+
def header(self):
101+
"""|_Header| object representing default page header for this section.
102+
103+
The default header is used for odd-numbered pages when separate odd/even headers
104+
are enabled. It is used for both odd and even-numbered pages otherwise.
105+
"""
106+
return _Header(self._sectPr, self._document_part)
107+
99108
@property
100109
def header_distance(self):
101110
"""
@@ -207,3 +216,11 @@ class _Footer(BlockItemContainer):
207216
def __init__(self, sectPr, document_part):
208217
self._sectPr = sectPr
209218
self._document_part = document_part
219+
220+
221+
class _Header(BlockItemContainer):
222+
"""Page header."""
223+
224+
def __init__(self, sectPr, document_part):
225+
self._sectPr = sectPr
226+
self._document_part = document_part

features/sct-section.feature

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ Feature: Access and change section properties
99
Then section.footer is a _Footer object
1010

1111

12-
@wip
1312
Scenario: Section.header
1413
Given a Section object as section
1514
Then section.header is a _Header object

tests/test_section.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from docx.enum.section import WD_ORIENT, WD_SECTION
1010
from docx.parts.document import DocumentPart
11-
from docx.section import _Footer, Section, Sections
11+
from docx.section import _Footer, _Header, Section, Sections
1212
from docx.shared import Inches
1313

1414
from .unitutil.cxml import element, xml
@@ -103,6 +103,18 @@ def it_provides_access_to_its_default_footer(
103103
_Footer_.assert_called_once_with(sectPr, document_part_)
104104
assert footer is footer_
105105

106+
def it_provides_access_to_its_default_header(
107+
self, document_part_, _Header_, header_
108+
):
109+
sectPr = element('w:sectPr')
110+
_Header_.return_value = header_
111+
section = Section(sectPr, document_part_)
112+
113+
header = section.header
114+
115+
_Header_.assert_called_once_with(sectPr, document_part_)
116+
assert header is header_
117+
106118
def it_knows_its_start_type(self, start_type_get_fixture):
107119
sectPr, expected_start_type = start_type_get_fixture
108120
section = Section(sectPr, None)
@@ -335,3 +347,11 @@ def _Footer_(self, request):
335347
@pytest.fixture
336348
def footer_(self, request):
337349
return instance_mock(request, _Footer)
350+
351+
@pytest.fixture
352+
def _Header_(self, request):
353+
return class_mock(request, "docx.section._Header")
354+
355+
@pytest.fixture
356+
def header_(self, request):
357+
return instance_mock(request, _Header)

0 commit comments

Comments
 (0)