feat(legal): add structured attribution fields and publish legal gate

This commit is contained in:
Oliver 2026-02-18 10:02:19 +01:00
parent c52363f1a7
commit 5159a6e3b4
10 changed files with 259 additions and 16 deletions

View file

@ -95,6 +95,14 @@ class TestAdminUi(unittest.TestCase):
summary="Summary A",
content_raw="Volltext A",
content_rewritten=None,
image_urls_json='["https://example.org/img.jpg"]',
press_contact="Kontakt",
source_name_snapshot="Test Source",
source_terms_url_snapshot="https://example.org/terms",
source_license_name_snapshot="cc-by",
legal_checked=False,
legal_checked_at=None,
legal_note=None,
word_count=2,
status="new",
meta_json='{"extraction":{"images":["https://example.org/img.jpg"],"press_contact":"Kontakt"}}',

View file

@ -73,12 +73,22 @@ class TestArticleWorkflow(unittest.TestCase):
self.assertEqual(r1.status_code, 200)
self.assertEqual(r1.json()["to_status"], "approved")
blocked_publish = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"})
self.assertEqual(blocked_publish.status_code, 400)
legal = self.client.post(
f"/api/articles/{article_id}/legal-review",
json={"approved": True, "note": "Rechte geprueft"},
)
self.assertEqual(legal.status_code, 200)
t2 = self.client.post(f"/api/articles/{article_id}/transition", json={"target_status": "published"})
self.assertEqual(t2.status_code, 200)
final = self.client.get(f"/api/articles/{article_id}")
self.assertEqual(final.status_code, 200)
self.assertEqual(final.json()["item"]["status"], "published")
self.assertEqual(final.json()["item"]["legal_checked"], 1)
def test_invalid_transition_rejected(self) -> None:
article_id = self._create_article()

View file

@ -77,6 +77,14 @@ class TestSQLiteRepositories(unittest.TestCase):
summary="Kurzfassung",
content_raw="Originaltext",
content_rewritten="Umschreibung",
image_urls_json='["https://example.org/img.jpg"]',
press_contact="Pressekontakt X",
source_name_snapshot="GovData",
source_terms_url_snapshot="https://www.govdata.de/dl-de/by-2-0",
source_license_name_snapshot="dl-de/by-2-0",
legal_checked=False,
legal_checked_at=None,
legal_note=None,
word_count=120,
status="review",
meta_json='{"lang":"de"}',
@ -98,6 +106,14 @@ class TestSQLiteRepositories(unittest.TestCase):
summary="Kurzfassung 2",
content_raw="Originaltext 2",
content_rewritten="Umschreibung 2",
image_urls_json='["https://example.org/img2.jpg"]',
press_contact="Pressekontakt Y",
source_name_snapshot="GovData",
source_terms_url_snapshot="https://www.govdata.de/dl-de/by-2-0",
source_license_name_snapshot="dl-de/by-2-0",
legal_checked=True,
legal_checked_at="2026-02-18T00:10:00Z",
legal_note="ok",
word_count=140,
status="approved",
meta_json='{"lang":"de","v":2}',