feat: add signature date info

This commit is contained in:
2026-06-14 14:46:46 +02:00
parent eaf43b2c47
commit 66343cf724
2 changed files with 42 additions and 21 deletions
+35 -2
View File
@@ -5,8 +5,41 @@ from datetime import datetime
from datetime import datetime from datetime import datetime
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
def getSignatureInfo(start_date_str, lang="fr"):
MONTHS = {
"fr": ["janvier","février","mars","avril","mai","juin",
"juillet","août","septembre","octobre","novembre","décembre"],
"de": ["Januar","Februar","März","April","Mai","Juni",
"Juli","August","September","Oktober","November","Dezember"],
"it": ["gennaio","febbraio","marzo","aprile","maggio","giugno",
"luglio","agosto","settembre","ottobre","novembre","dicembre"]
}
texts = {
"fr": ("La collecte des signatures a commencé le", "et se terminera vers"),
"de": ("Die Unterschriftensammlung begann am", "und endet ungefähr im"),
"it": ("La raccolta delle firme è iniziata il", "e terminerà circa nel"),
}
start_date = datetime.strptime(start_date_str, "%Y-%m-%d")
end_date = start_date + relativedelta(months=18)
def format_full(d):
if lang == "de":
return f"{d.day}. {MONTHS[lang][d.month - 1]} {d.year}"
return f"{d.day} {MONTHS[lang][d.month - 1]} {d.year}"
def format_month_year(d):
return f"{MONTHS[lang][d.month - 1]} {d.year}"
start = format_full(start_date)
end = format_month_year(end_date)
return f"""
<p>
{texts[lang][0]} {start} {texts[lang][1]} {end}.
</p>
""".strip()
def getValue(row, key): def getValue(row, key):
return row.get(key, {}).get("value") or None return row.get(key, {}).get("value") or None
def generateFeed(title, description, fileName, language, standards, entries): def generateFeed(title, description, fileName, language, standards, entries):
@@ -30,7 +63,7 @@ def generateFeed(title, description, fileName, language, standards, entries):
fe.guid(f"initiative-{item['id']}", permalink=False) fe.guid(f"initiative-{item['id']}", permalink=False)
fe.updated(time) fe.updated(time)
fe.source({'url': item["url"], 'title': item["source"]}) fe.source({'url': item["url"], 'title': item["source"]})
fe.content(f'<p><a href="{item["url"]}">Official page</a></p>{item["text"]}', type="html") fe.content(item["text"], type="html")
if "rss" in standards: if "rss" in standards:
fg.rss_file("./feed/rss/" + language + "/" + fileName + ".xml", pretty=True) fg.rss_file("./feed/rss/" + language + "/" + fileName + ".xml", pretty=True)
if "atom" in standards: if "atom" in standards:
@@ -70,11 +103,11 @@ def generateFederalFeed():
"id": getValue(entry, "id"), "id": getValue(entry, "id"),
"date": getValue(entry, "date"), "date": getValue(entry, "date"),
"title": getValue(entry, "title_" + lang), "title": getValue(entry, "title_" + lang),
"article": getValue(entry, "artikel_" + lang),
"text": getValue(entry, "text_" + lang), "text": getValue(entry, "text_" + lang),
"url": BASE_URLS.get(lang, BASE_URLS["de"]) + str(getValue(entry, "id")), "url": BASE_URLS.get(lang, BASE_URLS["de"]) + str(getValue(entry, "id")),
"source": BASE_SOURCE[lang] "source": BASE_SOURCE[lang]
} }
item["text"] = "<p><a href=\""+item["url"]+"\">Official page</a></p>" + getSignatureInfo(item["date"], lang) + item["text"]
feeds[lang].append(item) feeds[lang].append(item)
generateFeed( generateFeed(
"Initiatives populaires fédérales", "Initiatives populaires fédérales",
@@ -4,21 +4,13 @@ SELECT
?id ?id
?date ?date
(GROUP_CONCAT(DISTINCT IF(LANG(?title)="fr", STR(?title), ""); separator=" || ") AS ?title_fr) (GROUP_CONCAT(DISTINCT IF(LANG(?title)="fr", STR(?title), ""); separator=" ") AS ?title_fr)
(GROUP_CONCAT(DISTINCT IF(LANG(?title)="de", STR(?title), ""); separator=" || ") AS ?title_de) (GROUP_CONCAT(DISTINCT IF(LANG(?title)="de", STR(?title), ""); separator=" ") AS ?title_de)
(GROUP_CONCAT(DISTINCT IF(LANG(?title)="it", STR(?title), ""); separator=" || ") AS ?title_it) (GROUP_CONCAT(DISTINCT IF(LANG(?title)="it", STR(?title), ""); separator=" ") AS ?title_it)
(GROUP_CONCAT(DISTINCT IF(LANG(?status)="fr", STR(?status), ""); separator=" || ") AS ?status_fr) (GROUP_CONCAT(DISTINCT IF(LANG(?initiativtext)="fr", STR(?initiativtext), ""); separator=" ") AS ?text_fr)
(GROUP_CONCAT(DISTINCT IF(LANG(?status)="de", STR(?status), ""); separator=" || ") AS ?status_de) (GROUP_CONCAT(DISTINCT IF(LANG(?initiativtext)="de", STR(?initiativtext), ""); separator=" ") AS ?text_de)
(GROUP_CONCAT(DISTINCT IF(LANG(?status)="it", STR(?status), ""); separator=" || ") AS ?status_it) (GROUP_CONCAT(DISTINCT IF(LANG(?initiativtext)="it", STR(?initiativtext), ""); separator=" ") AS ?text_it)
(GROUP_CONCAT(DISTINCT IF(LANG(?initiativtext)="fr", STR(?initiativtext), ""); separator=" || ") AS ?text_fr)
(GROUP_CONCAT(DISTINCT IF(LANG(?initiativtext)="de", STR(?initiativtext), ""); separator=" || ") AS ?text_de)
(GROUP_CONCAT(DISTINCT IF(LANG(?initiativtext)="it", STR(?initiativtext), ""); separator=" || ") AS ?text_it)
(GROUP_CONCAT(DISTINCT IF(LANG(?artikel)="fr", STR(?artikel), ""); separator=" || ") AS ?artikel_fr)
(GROUP_CONCAT(DISTINCT IF(LANG(?artikel)="de", STR(?artikel), ""); separator=" || ") AS ?artikel_de)
(GROUP_CONCAT(DISTINCT IF(LANG(?artikel)="it", STR(?artikel), ""); separator=" || ") AS ?artikel_it)
WHERE { WHERE {
<https://politics.ld.admin.ch/political-rights/popular-initiative/1> <https://politics.ld.admin.ch/political-rights/popular-initiative/1>
@@ -30,15 +22,11 @@ WHERE {
<https://politics.ld.admin.ch/political-rights/popular-initiative/id> ?id ; <https://politics.ld.admin.ch/political-rights/popular-initiative/id> ?id ;
<https://politics.ld.admin.ch/political-rights/popular-initiative/sammelbeginn> ?date ; <https://politics.ld.admin.ch/political-rights/popular-initiative/sammelbeginn> ?date ;
<https://politics.ld.admin.ch/political-rights/popular-initiative/titel> ?titleUri ; <https://politics.ld.admin.ch/political-rights/popular-initiative/titel> ?titleUri ;
<https://politics.ld.admin.ch/political-rights/popular-initiative/status> ?statusUri ; <https://politics.ld.admin.ch/political-rights/popular-initiative/initiativtext> ?textUri .
<https://politics.ld.admin.ch/political-rights/popular-initiative/initiativtext> ?textUri ;
<https://politics.ld.admin.ch/political-rights/popular-initiative/artikelBv> ?articleUri .
?titleUri schema:name ?title . ?titleUri schema:name ?title .
?statusUri schema:name ?status .
OPTIONAL { ?textUri schema:name ?initiativtext . } OPTIONAL { ?textUri schema:name ?initiativtext . }
OPTIONAL { ?articleUri schema:name ?artikel . }
} }
GROUP BY ?id ?date GROUP BY ?id ?date
ORDER BY DESC(?date) ORDER BY DESC(?date)