Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
3 changes: 3 additions & 0 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Release type: patch

Fix #31 - Series breaks on draft articles
3 changes: 3 additions & 0 deletions pelican/plugins/series/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,6 @@ def _create_generator(tmp_path):
articles_with_index_over_10 = create_generator(
"test_data/articles_with_index_over_10", lambda x: x.series["index"]
)
articles_with_draft = create_generator(
"test_data/articles_with_draft", attrgetter("date")
)
14 changes: 9 additions & 5 deletions pelican/plugins/series/series.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,15 @@ def aggregate_series(generator):
# and collects the 'series' metadata, if present.
# The 'series_index' metadata is also stored, if specified
translations = defaultdict(dict)
more = []
for article in generator.articles:
for trans in article.translations:
more.append(trans)
for article in generator.articles + more:
all_articles = (
generator.articles
+ generator.translations
+ getattr(generator, "drafts", [])
+ getattr(generator, "drafts_translations", [])
+ getattr(generator, "hidden_articles", [])
+ getattr(generator, "hidden_translations", [])
)
for article in all_articles:
if "series" in article.metadata:
article_entry = {
"index": int(article.metadata.get("series_index", 0)),
Expand Down
46 changes: 46 additions & 0 deletions pelican/plugins/series/test_articles_with_draft.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
def test_draft_article_gets_series_metadata(articles_with_draft):
generator, _ = articles_with_draft

# The draft should be in generator.drafts, not generator.articles
assert len(generator.drafts) == 1
draft = generator.drafts[0]

# The draft's series attribute should be a dict, not a raw string
assert isinstance(draft.series, dict), (
f"Draft article's series is {type(draft.series).__name__}, "
"expected dict with series metadata"
)
assert draft.series["name"] == "test_series"


def test_draft_is_included_in_series_ordering(articles_with_draft):
generator, _ = articles_with_draft
draft = generator.drafts[0]

# The series should contain all 3 articles (2 published + 1 draft)
assert len(draft.series["all"]) == 3


def test_published_articles_see_draft_in_series(articles_with_draft):
_, articles = articles_with_draft

# Published articles should also have all 3 in their series
for article in articles:
assert len(article.series["all"]) == 3


def test_draft_series_navigation(articles_with_draft):
generator, _ = articles_with_draft
draft = generator.drafts[0]

# Draft is article 2 (by date), so it should have previous and next
assert draft.series["index"] == 2
assert draft.series["previous"] is not None
assert draft.series["next"] is not None


def test_draft_not_in_context_series(articles_with_draft):
generator, _ = articles_with_draft

# Context series exists
assert "test_series" in generator.context["series"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Title: Post number 1
Date: 2021-02-01 13:00:00
Category: test
Tags: foo, bar, foobar
Summary: I have a lot to test
Series: test_series

Content 1
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Title: Post number 2
Date: 2021-02-02 13:00:00
Category: test
Tags: foo, bar, foobar
Summary: I have a lot to test
Series: test_series
Status: draft

Content 2
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Title: Post number 3
Date: 2021-02-03 13:00:00
Category: test
Tags: foo, bar, foobar
Summary: I have a lot to test
Series: test_series

Content 3
Loading