The following has evaluated to null or missing: ==> FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale ) [in template "252001#252047#252845" at line 128, column 37] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: dMTJsonObject = FrontendService.media... [in template "252001#252047#252845" at line 128, column 21] ----
1<#-- used @ Veranstaltung-Detailseite Intro
2 used @ Publikation-Detailseite Intro
3-->
4
5<#--
6Web content templates to display teaser on thema detail page
7
8Generic template for detail pages Intro / Teaser element
9-->
10<#--
11Display the current page title
12-->
13<#include "${fullTemplatesPath}/functions/relatedContentUtil.ftl" />
14<#include "${fullTemplatesPath}/macros/debugging.ftl" />
15
16<#include "${fullTemplatesPath}/macros/page-modules/PMIntro.ftl" />
17<#include "${fullTemplatesPath}/macros/atomic-modules/AMPublicationCarousel.ftl" />
18<#include "${fullTemplatesPath}/macros/atomic-modules/AMMetadata.ftl" />
19<#include "${fullTemplatesPath}/macros/atomic-modules/AMDatetime.ftl" />
20
21
22<#--
23 renders the Intro for nearly all Pages
24 TODO: remove Share? (was in the designs, but not anymore?)
25 TODO: check if languageSelect/filter are working (js)
26
27 - portletId
28 - data = {
29 "media": string (src from image),
30 "category": string,
31 "title": string,
32 "author": string,
33 "subheadline": string,
34 "copy": string,
35 "filter": {
36 "id": string,
37 "name": string,
38 "entries": Array<Object> ({key:value}),
39 },
40 "languageSelect": {
41 "id": string,
42 "name": string,
43 "entries": Array<Object> ({key:value}),
44 },
45 "meta": {
46 "pos"; string (top/bottom)
47 "date": string,
48 "hash": string,
49 "info": string, (url)
50 },
51 "share" : {
52 "login": string,
53 "print": string,
54 "mail": string,
55 "multishare": string?? (tbd)
56 }
57 - AMMetadata: macro
58 - position: String ("top") -> defines wether the meta-data should be rendered above or below the intro-content
59 }
60-->
61
62<#assign
63 JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
64
65 ServiceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
66 DLAPP = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")
67
68 themeDisplay = ServiceContext.getThemeDisplay()
69 editmode = FrontendService.user.isPrivilegedUser(themeDisplay)
70
71 languageId = themeDisplay.getLocale()
72 groupId = themeDisplay.getScopeGroupId()
73 currentUrl = themeDisplay.getURLCurrent()
74
75 layout = themeDisplay.getLayout()
76 layouttpl = layout.getTypeSettingsProperties().getProperty("layout-template-id")
77/>
78
79<#setting locale="${languageId}">
80
81<#-- get article from url -->
82
83<#assign entry = FrontendService.article.getArticleToUrl(currentUrl, groupId?number)! >
84
85
86<#if entry?has_content>
87
88 <#if entry.resourcePrimKey??>
89 <#assign primaryKey = entry.resourcePrimKey?number >
90 <#elseif entry.classPK??>
91 <#assign primaryKey = entry.classPK?number >
92 </#if>
93
94 <#assign
95 jsonString = FrontendService.article.getWebcontent(primaryKey)
96 json = FrontendService.json.parseAsJson(jsonString)
97 availablelanguages = FrontendService.article.getAssetEntryToUrl(primaryKey).getAvailableLanguageIds()
98
99 title = entry.getTitle(languageId)
100 data = {
101 "title": title
102 }
103 />
104 <@debugJsonString jsonString "ADT_KASDE_DYNAMIC_INTRO" />
105
106 <#if hasContent('untertitel', languageId, json)>
107 <#assign data = data + { "subheadline": getValueForLanguage('untertitel', languageId, json, "first") } >
108 </#if>
109
110 <#if hasContent('beschreibung', languageId, json)>
111 <#assign data = data + { "copy": getValueForLanguage('beschreibung', languageId, json, "first") } >
112 </#if>
113
114 <#-- fill meta data -->
115 <#assign meta = {} />
116
117 <#-- PUBLIKATIONEN DETAIL -->
118 <#if layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL")>
119
120 <#if hasContent('coverDMTKASDEMEDIUM', languageId, json)>
121 <#assign
122 coverBildString = getValueForLanguage('coverDMTKASDEMEDIUM', languageId, json, "first")
123 />
124
125 <#if coverBildString?has_content>
126 <#assign
127 coverBild = FrontendService.json.parseAsJson(coverBildString)
128 dMTJsonObject = FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale )
129 linkToDMT = FrontendService.media.getImageURLForAMConfiguration('hd-resolution',coverBild.groupId?number, coverBild.uuid )
130 data = data + { "media": linkToDMT, "meta" : dMTJsonObject }
131 />
132 <#if dMTJsonObject.altText?? >
133 <#assign data = data + {"alt" : dMTJsonObject.altText} />
134 </#if>
135 <#if dMTJsonObject.quelle??>
136 <#assign meta = meta + { "quelle": dMTJsonObject.quelle } />
137 </#if>
138 </#if>
139 <#-- uncomment to display pdf cover as Intro Image
140 <#elseif hasContent('document_pdfDMTBASICDOCUMENT', languageId, json)>
141 <#assign
142 pdfDocument = getValueForLanguage('document_pdfDMTBASICDOCUMENT', languageId, json, "first")
143 fileEntry = FrontendService.media.getFileEntry(pdfDocument.uuid, groupId?number)!/>
144 <#if fileEntry?has_content>
145 <#assign
146 linkToThumbnail = FrontendService.link.getThumbnailSrc(fileEntry , themeDisplay)
147 data = data + { "media": linkToThumbnail }
148 />
149 </#if>
150 -->
151 </#if>
152
153 <#assign
154 meta = meta + { "orderInfo": "true" }
155 verbundJournalArticle = FrontendService.publication.getVerbundToPublikation( entry )!""
156 />
157
158
159
160 <#if hasContent('erscheinungsdatum', languageId, json)>
161 <#assign
162 erscheinungsdatum = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
163 />
164 <#if erscheinungsdatum?has_content >
165 <#assign
166 erscheinungsdatumFormatted = FrontendService.date.getDateFormatLong( erscheinungsdatum, languageId )
167 meta = meta + { "date": erscheinungsdatumFormatted }
168 />
169 </#if>
170 </#if>
171
172 <#if verbundJournalArticle?has_content>
173 <#assign
174 verbundJsonString = FrontendService.article.getWebcontent(verbundJournalArticle.resourcePrimKey)
175 verbundJson = FrontendService.json.parseAsJson(verbundJsonString)
176 laufendenummer = getValueForLanguage('laufendenummer', languageId, verbundJson, "first")
177 coverImg = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, verbundJson, "first")
178 />
179 <@debugJsonString verbundJsonString "ADT_KASDE_DYNAMIC_INTRO-verbundJournalArticle" />
180 <#assign meta = meta + { "laufendenummer": laufendenummer } >
181
182 <#if coverImg?has_content && coverImg.url?has_content >
183 <#assign meta = meta + { "coverImg": coverImg.url } >
184 </#if>
185 </#if>
186
187
188 <#if meta?has_content>
189 <#assign data = data + {"meta": meta } >
190 </#if>
191
192 </#if>
193 <#-- PUBLIKATIONEN DETAIL END -->
194
195
196 <#-- VERANSTALTUNGEN DETAIL -->
197 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
198 <#assign
199 friendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, languageId, groupId)!""
200 links = []
201 />
202 <#if availablelanguages?has_content && friendlyUrl?has_content>
203 <#if (availablelanguages?size > 1) >
204 <#list availablelanguages as language>
205 <#assign
206 defaultLanguage = "de_DE"
207 defaultLocale = FrontendService.language.getLocaleByKey(defaultLanguage)
208 linkLocale = (FrontendService.language.getLocaleByKey(language))!defaultLocale
209 langFriendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, linkLocale, groupId)
210
211 link = {
212 "key": language!defaultLanguage,
213 "value": linkLocale.getDisplayLanguage(languageId),
214 "url": "/c/portal/update_language?p_l_id=" +
215 layout.plid + "&redirect=" + langFriendlyUrl +
216 "&languageId=" + language
217 }
218 />
219 <#if language == languageId>
220 <#assign link = link + { "selected": "true" } >
221 </#if>
222 <#assign links = links + [link]>
223 </#list>
224 <#assign
225 data = data + {
226 "languageSelect": {
227 "id": "languageSelectRedirect",
228 "name": "languageselectRedirect",
229 "entries": links,
230 "label": languageUtil.get(languageId, "diese.veranstaltung.ist.in.weiteren.sprachen.verfuegbar")
231 }
232 }
233 />
234 </#if>
235 </#if>
236 </#if>
237
238 <#if hasContent('erscheinungsdatum', languageId, json)>
239 <#assign
240 startdate = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
241 meta = meta + { "start": startdate?date.iso, "end": "" }
242 />
243 </#if>
244
245 <#if hasContent('startdatum', languageId, json)>
246 <#assign
247 startdate = getValueForLanguage('startdatum', languageId, json, "first")
248 meta = meta + { "start": startdate?date.iso, "end": "" }
249 />
250 </#if>
251
252 <#if hasValue('einfuehrungText', locale, json)>
253 <#assign data = data + { "einfuehrungText" : getValueForLanguage('einfuehrungText', locale, json, "first") } >
254 <#elseif hasValue(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first")>
255 <#assign data = data + { "einfuehrungText" : getValueForLanguage(FrontendService.article.getFieldNameByReferenceName(primaryKey, 'einfuehrungText'), locale, json, "first") } >
256 </#if>
257
258 <#if hasContent('endedatum', languageId, json)>
259 <#assign
260 enddate = getValueForLanguage('endedatum', languageId, json, "first")
261 meta = meta + { "end": enddate?date.iso }
262 />
263 </#if>
264
265 <#if hasContent('startzeit', languageId, json)>
266 <#assign
267 startzeit = getValueForLanguage('startzeit', languageId, json, "first")
268 />
269 <#if startzeit?has_content >
270 <#assign meta = meta + { "startzeit": startzeit } />
271 </#if>
272 </#if>
273
274 <#if hasContent('endezeit', languageId, json)>
275 <#assign
276 endezeit = getValueForLanguage('endezeit', languageId, json, "first")
277 meta = meta + { "endezeit": endezeit }
278 />
279 </#if>
280
281 <#if hasContent('ortWCSKASDEORT', languageId, json)>
282 <#assign
283 ortWCSKASDEORT = FrontendService.json.parseAsJson(getValueForLanguage('ortWCSKASDEORT', languageId, json, "first"))
284 ortWCSKASDEORTPrimaryKey = ortWCSKASDEORT.classPK?number
285 ortWCSKASDEORTWebContent = FrontendService.article.getWebcontentByPk(ortWCSKASDEORTPrimaryKey)!""
286 />
287 <#if ortWCSKASDEORTWebContent?has_content >
288 <#assign
289 ortWCSKASDEORTTitle = ortWCSKASDEORTWebContent.getTitle(languageId)!""
290 />
291 <#if ortWCSKASDEORTTitle?has_content >
292 <#assign
293 meta = meta + { "ortWCSKASDEORT": ortWCSKASDEORTTitle }
294 />
295 </#if>
296 </#if>
297 </#if>
298
299
300 <#if hasContent('veranstaltungsnummer', languageId, json)>
301 <#assign
302 verauuid = getValueForLanguage('veranstaltungsnummer', languageId, json, "first")
303 meta = meta + { "verauuid": verauuid }
304 />
305 </#if>
306
307
308 <#if (data.meta)?has_content >
309 <#assign meta = data.meta />
310 </#if>
311
312 <#if !(data.media)?has_content && hasContent('mediumDMTKASDEMEDIUM', languageId, json)>
313 <#assign
314 medium = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, json, "first")
315 mediaData = getRelatedMediaObject(medium, themeDisplay, languageId, FrontendService, "hd-resolution")
316 />
317 <#assign data = data + { "media": mediaData.url , "meta" : mediaData.meta} >
318
319
320 <#if mediaData.meta?? && mediaData.meta.quelle??>
321 <#assign meta = meta + data.meta + { "quelle": mediaData.meta.quelle } />
322 </#if>
323 </#if>
324
325
326 <#if meta?has_content>
327 <#assign data = data + {"meta": meta } >
328 </#if>
329
330 <#-- END fill meta data -->
331
332 <#if hasContentForSequence('autorenWCSKASDEPERSON', languageId, json)>
333 <#assign
334 journalArticles = getValueForLanguageAnsprechpartner('autorenWCSKASDEPERSON', languageId, json)
335 authors = []
336 />
337 <#list journalArticles as articleString>
338 <#assign article = FrontendService.json.parseAsJson(articleString) />
339 <#if article?has_content && article?is_hash && article.classPK??>
340 <#assign articleDereferenced = FrontendService.person.resolveContactInstanceToPerson(article, languageId)!"" />
341 <#if articleDereferenced?has_content >
342 <#assign
343 author = ""
344 articlePrimaryKey = articleDereferenced.classPK?number
345 articleJsonString = FrontendService.article.getWebcontent(articlePrimaryKey)
346 articleJson = FrontendService.json.parseAsJson(articleJsonString)
347 />
348 <@debugJsonString articleJsonString "ADT_KASDE_DYNAMIC_INTRO-autorenWCSKASDEPERSON" />
349 <#if hasValue('anredetitel', languageId, articleJson)>
350 <#assign author = author + getValueForLanguage('anredetitel', languageId, articleJson, " ") + " ">
351 </#if>
352 <#if hasValue('vorname', languageId, articleJson)>
353 <#assign author = author + getValueForLanguage('vorname', languageId, articleJson, " ") + " ">
354 </#if>
355 <#if hasValue('nachname', languageId, articleJson)>
356 <#assign author = author + getValueForLanguage('nachname', languageId, articleJson, " ") + " ">
357 </#if>
358
359 <#attempt>
360 <#assign href = FrontendService.article.getFriendlyUrl(articlePrimaryKey, languageId, groupId)!"#" >
361 <#recover>
362 <#assign href = "#" >
363 </#attempt>
364 <#if href?has_content && href != "#" && href != "/_404">
365 <#assign author = '<a href="' + href + '">' + author?trim + '</a>'>
366 </#if>
367
368 <#assign authors = authors + [author?trim]>
369 </#if>
370 </#if>
371 </#list>
372 <#if authors?has_content>
373 <#assign data = data + { "author": authors?join(", ") } >
374 </#if>
375 </#if>
376
377 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL") >
378 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "VERANSTALTUNGSTYP")! >
379 <#if categories?has_content && categories[0]?has_content >
380 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
381 </#if>
382
383 <#if hasContent('ausgebucht', languageId, json)>
384 <#assign data = data + { "ausgebucht" : getValueForLanguage('ausgebucht', languageId, json, "first") }>
385 </#if>
386
387 <#if hasContent('storniert', languageId, json)>
388 <#assign data = data + { "storniert" : getValueForLanguage('storniert', languageId, json, "first") }>
389 </#if>
390
391 <#elseif layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL") >
392 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "PUBLIKATIONSREIHE")! >
393 <#if categories?has_content && categories[0]?has_content >
394 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
395 </#if>
396 <#else>
397 <#assign categories = FrontendService.category.getCategoriesToArticle(primaryKey, "THEMA")! >
398 <#if categories?has_content && categories[0]?has_content >
399 <#assign data = data + { "category": categories[0].getTitle(languageId,true)! } >
400 </#if>
401 </#if>
402
403
404 <#assign
405 languages = []
406 />
407
408 <#attempt>
409 <#if json["document_pdfDMTBASICDOCUMENT"]?? >
410 <#if availablelanguages?has_content>
411 <#list availablelanguages as pdf_language>
412 <#assign
413 docRefJson = getValueForLanguage('document_pdfDMTBASICDOCUMENT', pdf_language, json, "first")
414 docRef = FrontendService.json.parseAsJson(docRefJson)
415 />
416 <#if docRef?is_hash && pdf_language != languageId >
417 <#assign
418 lang = FrontendService.language.getLocaleByKey(pdf_language)!""
419 docGroupId = docRef["groupId"]?number
420 docUuid = docRef["uuid"]
421 dMTJsonObject = FrontendService.media.getDMTJsonObject( docGroupId, docUuid, locale )
422 dMTLink = FrontendService.media.getLinkToDMT( dMTJsonObject )
423 />
424 <#if lang?has_content>
425 <#assign
426 languages = languages + [
427 {
428 "key": pdf_language,
429 "value": FrontendService.language.getLocaleByKey(pdf_language).getDisplayLanguage(),
430 "url": dMTLink
431 }]
432 />
433 </#if>
434 </#if>
435 </#list>
436 </#if>
437 </#if>
438 <#recover>
439 </#attempt>
440
441 <#if (languages?size > 0)>
442 <#attempt>
443 <#assign
444 data = data + { "languageSelect": {
445 "id": "languageSelect",
446 "name": "languageselect",
447 "entries": languages,
448 "documents": "",
449 "button": "true"
450 }}
451 />
452 <#recover>
453 </#attempt>
454 </#if>
455
456 <@PMIntro "ADT_KASDE_DYNAMIC_INTRO" data AMMetadata AMDatetime "bottom" />
457 ${FrontendService.article.getEditArticleHtml(primaryKey, themeDisplay)}
458
459 <#if data.meta?has_content>
460 <#if data.meta.laufendenummer?has_content !isACColorScheme() && !isVLCColorScheme() && !isDPMColorScheme()>
461 <div>
462 <div id="publicationVerbundPagination">
463 <@AMPublicationCarousel data.meta.laufendenummer data.meta.date data.meta.coverImg />
464 </div>
465 </div>
466 </#if>
467 </#if>
468
469<#elseif (editmode?? && editmode)>
470 <@errorMessage languageUtil.get(locale, "kein.journalArticle.gefunden") "ADT_KASDE_DYNAMIC_INTRO" layouttpl currentUrl />
471</#if>
Am Sonntag, den 30. Januar, fanden in Portugal die Wahl zur Assembleia da República statt, dem aus nur einer Kammer bestehenden nationalen Parlament. Die Sozialistische Partei (Partido Socialista, PS) des bisherigen Ministerpräsidenten António Costa gewann eine deutliche Mehrheit der Mandate. Staatspräsident Marcelo Rebelo de Sousa hat deshalb António Costa wiederum mit der Bildung und Führung der Regierung betraut. In Portugal wird der Premierminister nicht vom Parlament gewählt, sondern vom Staatspräsidenten ernannt. Seit der Einführung der Demokratie infolge der „Nelkenrevolution von 1974 und der Verabschiedung der aktuellen Verfassung von 1976 wird stets der Vorsitzende der Partei mit dem höchsten Anteil an Stimmen und Mandaten mit der Regierungsbildung beauftragt. Costa ist nun nicht mehr auf die Unterstützung einer oder mehrerer anderer Parteien angewiesen und wird voraussichtlich über die volle Wahlperiode von vier Jahren im Amt bleiben.
Die Wahl war Folge einer politischen Krise, die sich im Oktober 2021 ereignete, als der von der Regierung vorgelegte Staatshaushalt für das Jahr 2022 keine Mehrheit im Parlament fand. Nicht nur die Oppositionsparteien aus der Mitte und der Rechten des politischen Spektrums lehnten den Haushaltsentwurf ab. Entscheidend war, dass auch die linken Parteien - die Kommunistische Partei (die unter dem Namen Coligação Democrática Unitária, CDU, agiert) und der Linksblock (Bloco de Esquerda, BE) - dem Ministerpräsidenten die Zustimmung zu seinem Haushaltsentwurf verweigerten. Seit 2015 hatten sie Costa trotz mancher Meinungsverschiedenheiten gestützt, ohne dass es eine formale Koalition gab. Doch dieses Mal wollte Costa die Forderungen der Linksparteien u.a. im Hinblick auf die Ausgaben für das Gesundheitswesen und die Ausweitung von Arbeitnehmerrechten nicht erfüllen – nicht zuletzt, um die Bereitstellung der EU-Mittel aus dem Aufbauplan NextGenerationEU zur Eindämmung der Folgen der Corona-Pandemie nicht zu gefährden. Bei der entscheidenden Abstimmung im Parlament fehlten Costa dann die Stimmen zur Verabschiedung seines Haushaltsplans. Weil für Staatspräsident Rebelo de Sousa ein vom Parlament gebilligter Staatshaushalt die Voraussetzung für die wirtschaftliche Erholung des Landes nach der Pandemie ist, löste er am 4. November das Parlament auf und setzte Neuwahlen für den 30. Januar 2022 an. Damit wurde in Portugal eine Situation wie in Spanien vermieden, wo Ministerpräsident Sánchez zwei Jahre lang, 2018 und 2019, ohne einen vom Parlament verabschiedeten Haushalt regierte
Innerhalb von nur zwei Monaten mussten sich die Parteien auf die Wahl vorbereiten. Die PS führte zu Beginn des Wahlkampfs in den Meinungsumfragen mit einem Vorsprung von fast zehn Punkten. Die wichtigste Oppositionsparte Partido Social Democrata (PSD), die zwar Sozialdemokratische Partei heißt, aber ein wirtschaftsliberales Programm vertritt, war in ihrer Vorbereitung auf die Wahl dadurch gehandicapt, dass sie zunächst noch die reguläre Wahl ihres Vorsitzenden durchzuführen hatte, die Ende November 2021 stattfand. Da es zwei Kandidaten für dieses Amt gab, den bisherigen Vorsitzenden Rui Rio und den Europaparlamentarier Paulo Rangel, konnte die Partei erst als Riu als Vorsitzender bestätigt war mit der Vorbereitung der Parlamentswahlen beginnen.
Trotz der günstigeren Ausgangslage für die PS schienen sich während des Wahlkampfs die Atmosphäre und die allgemeine Stimmung zu ändern und die PSD in der Wählergunst an Bedeutung zu gewinnen. In der Woche vor der Wahl erwarteten Meinungsforscher und andere Beobachter sogar einen technischen Gleichstand zwischen PS und PSD.
Am Wahlabend aber hätte das Ergebnis nicht deutlicher sein können. Die Sozialistische Partei erreichte einen eindeutigen Sieg, der ihre Position nicht nur im Parlament, sondern im gesamten politischen System deutlich stärkte. Mit 41,7% der Stimmen gewann die PS eine Mehrheit von 117 der 230 Mandate der Assembleia da República. Die meisten portugiesischen Wähler wollten António Costa weiterhin als Premierminister haben. Am Ende der neuen Legislaturperiode im Jahr 2026 wird die Sozialistische Partei dann zehn Jahre ununterbrochen an der Regierung gewesen sein und mit Blick auf die letzten drei Jahrzehnte fast 80% der Zeit in verschiedenen Konstellationen regiert haben.
Sitzverteilung in der portugiesischen Assembleia da República ab 2022
Die Gesamtzahl der Abgeordneten beträgt 230. In dieser Infografik fehlen noch die vier Abgeordneten, die von den portugiesischen Wählern im Ausland gewählt wurden und die noch zu bestimmen sind. Quelle: Sic Notícias (https://sicnoticias.pt/eleicoes-legislativas/o-novo-parlamento-quem-ganha-e-quem-perde-assentos/)
Für die PSD endete die Wahl mit einer großen Enttäuschung. Anstatt der erhofften Regierungsführung verlor die Partei drei Mandate. Deutliche Zugewinne dagegen verzeichneten die rechtspopulistische Partei Chega! (CH) und die liberale Partei Iniciativa Liberal (IL), die beide erst vor wenigen Jahren gegründet worden waren. Sie sind nun die dritt- bzw. viertstärkste politische Kraft in Portugal.
Bevor wir die Ergebnisse der einzelnen Parteien etwas aufmerksamer betrachten, hier noch einige Punkte, die im Hinblick auf das Wahlergebnis erwähnenswert sind:
- Im Gegensatz zu den meisten anderen europäischen Ländern wird die portugiesische Politik immer noch von den beiden großen traditionellen Parteien dominiert. PS und PSD erhielten zusammen 71% der Stimmen, was einen Anstieg von 7 Prozentpunkten im Vergleich zu den letzten Parlamentswahlen von 2019 bedeutet. Die im Vorfeld der Wahl befürchtete größere Fragmentierung des Parteiensystems ist nicht eingetreten, weil einige Kleinparteien keine Mandate im Parlament gewannen.
- Linke Parteien verloren insgesamt rund 100.000 Stimmen, während rechte Parteien rund 550.000 Stimmen hinzugewannen. Diese Stimmenverschiebung ist Folge einer Stimmenverschiebung zwischen den linken Parteien (von den Extremen zur PS) und einem Zuwachs der rechten Parteien, die Stimmen aus der Linken, aber auch von vielen bisherigen Nicht-Wählern erhielten. Paradoxerweise ist Portugal mit einer Mehrheit der Sozialistischen Partei heute ein „rechteres“ Land als zuvor. Eine liberale und eine rechtsradikale Partei haben hinzugewonnen, während der Einfluss der marxistischen Parteien kleiner wurde.
- Das Parteiensystem, das sich nach der Revolution ab 1975 etablierte und bisher bestand, existiert damit nun nicht mehr. Die konservative Christlich-Demokratischen Partei CDS erhielt keinen Sitz mehr im Parlament und auch die von der Kommunistischen Partei geführten Gruppe von Linksparteien (CDU) erlitt deutliche Einbußen; die dieser Koalition angehörende Grünen Partei erhielt ebenfalls kein Mandat mehr. Demgegenüber erzielten nun die beiden neuen Parteien Chega! und Iniciativa Liberal ein beachtliches Ergebnis.
Zum Abschneiden einzelner Parteien
PS - Sozialistische Partei
Die Strategie der Sozialisten war erfolgreich. Die wichtigste Botschaft von António Costa, um linke Wähler zu mobilisieren, war die die Angst vor der rechtsradikalen Partei Chega! und vor der Rolle, die sie in einer von der PSD geführten Regierung spielen könnte. Dies wird bei einem Blick auf die Stimmenverschiebung von den Extremen zur Mitte deutlich. Die PS verzeichnete einen Zuwachs von 346.000 Stimmen, während BE und CDU zusammen rund 356.000 Stimmen verloren, d.h. der Zugewinn der PS ist im Wesentlichen auf die Verluste der Linksparteien BE und CDU zurückzuführen. Ein bisher beispielloser Erfolg für die Sozialistische Partei ist es, dass sie alle nationalen Bezirke (mit Ausnahme von Madeira) gewann, was seit 1975 noch nie der Fall gewesen war.
PSD - Sozialdemokraten
Der Wahlabend wurde zu einer dunklen Nacht für die PSD. Trotz eines Zuwachses von insgesamt etwa 150.000 Stimmen in den meisten Gemeinden verloren die Sozialdemokraten mit einem Stimmenanteil von 27,8% aufgrund der Besonderheiten des portugiesischen Wahlsystems drei Sitze im Parlament, wo sie nur noch mit 76 statt bisher 79 Abgeordneten vertreten sind. Die Weigerung, vor den Wahlen eine Koalitionsvereinbarung mit der christdemokratischen CDS zu treffen, wurde im Nachhinein von Wahlkommentatoren als falsch bezeichnet, denn in mindestens fünf Bezirken hätten die "verschwendeten" Stimmen für die CDS zusammen mit den verbleibenden Stimmen für die PSD ausgereicht, um der PS einen Abgeordneten zu entziehen und so die sozialistische Mehrheit im Parlament zu verhindern.
Das Verhalten des PSD-Vorsitzenden Rui Rio in der Wahlnacht wurde ebenfalls von vielen Kommentatoren stark kritisiert. Mitten in der Pressekonferenz begann er auf Deutsch zu sprechen und ärgerte sich über die Journalisten, weil sie immer wieder dieselbe Frage nach seinem Verbleib als Parteivorsitzender stellten – diese Medienvertreter wurden dabei von anwesenden Parteimitgliedern auch laufend ausgebuht. Rio gestand ein, dass er sich für die Partei nicht mehr nützlich fühle und öffnete damit die Tür für einen erneuten innerparteilichen Kampf um den Parteivorsitz. Seitdem er im Januar 2018 erstmals zum Vorsitzenden der PSD gewählt worden war, musste er sich permanenter Kritik eines wichtigen Teils der Partei erwehren, die einen Mangel an Strategie und Konsistenz in der Parteiführung und Opposition kritisierten. Bei seiner Wiederwahl im Dezember erhielt er nur 52% der Stimmen. Das reichte nicht aus, um nach der nun verlorenen Wahl weiter den Anspruch zu verteidigen, die Partei in die Zukunft zu führen.
Chega!
Die rechtsradikale Partei Chega! (wörtlich "Es reicht!") ist einer der Wahlsieger. Mit 7,15% der Stimmen wurde sie die drittstärkste politische Kraft und erhielt 12 Abgeordnete in der Assembleia. Dies ist deshalb ein beeindruckendes Ergebnis, weil die Partei erst vor zwei Jahren gegründet wurde und bisher nur ein Mandat im Parlament hatte. Chega! ist die einzige kleine Partei, die Abgeordnetenmandate in sehr unterschiedlichen Bezirken gewann, und zwar nicht nur in den größten, sondern auch in kleineren Bezirken, in denen es für kleine Parteien normalerweise schwierig ist, die Schwelle der mindestens notwendigen Stimmen zu überwinden. Im Süden Portugals hat Chega! die besten Ergebnisse erzielt (mit besonderem Schwerpunkt in den Gebieten, in denen die Gemeinschaften der Sinti und Roma stärker vertreten sind - eine Gruppe, die der Parteivorsitzende André Ventura immer wieder zum Ziel seiner Tiraden machte. In jenen südlichen Wahlbezirken gelang es Chega! auch, die jahrzehntelangen Hochburgen der Kommunistischen Partei zu schleifen.
Mit einer Gruppe von Abgeordneten, die wenig Erfahrung in der Politik hat und mit einem Wahlprogramm, das eher eine Reihe von systemfeindlichen Ideen als einen verbindlichen ideologischen Vorschlag darstellt, bleibt abzuwarten, wie sich Chega! in den nächsten vier Jahren verhält. Für den populistischen Parteiführer André Ventura können die vier Jahre mit einer sozialistischen Mehrheit eine Chance sein, Chega! noch stärker als Protestpartei zu profilieren.
Iniciativa Liberal
Die liberale Partei Iniciativa Liberal (IL) ist ein weiterer Gewinner der Wahl. Nachdem sie 2019 zum ersten Mal bei einer Wahl angetreten war, erreichte sie nun 5% der Stimmen und ist künftig mit acht Abgeordneten die viertstärkste politische Kraft im Parlament. Die Stimmen für IL konzentrierten sich stark auf die städtischen und entwickelten Gebiete des Landes (Lissabon, Porto, Braga, Setúbal). Der Vorsitzende der Partei, João Cotrim de Figueiredo, hat erfolgreich gegen die Vorstellung angekämpft, dass eine liberale Partei in Portugal nie mehr als ein Hobby der Eliten sein würde. IL hat nun nach dem faktischen Verschwinden der CDS die Chance, sich als einzige nicht radikale politische Kraft auf der rechten Seite des Parlaments zu etablieren.
Bloco de Esquerda
Für die linksextreme Partei Bloco de Esquerda (BE, „Linksblock“) begann am Wahlabend eine dunkle Nacht, die lange andauern kann. Mit einem Verlust von ca. 250.000 Stimmen verkleinerte sich die Fraktion der Partei von 19 auf nur noch 5 Abgeordnete. Selbst in den größten Städten war ihr Ergebnis katastrophal. Die wichtigste Ursache dafür ist der Wechsel vieler ihrer traditionellen Wähler zur Sozialistischen Partei, um dadurch eine rechtsgerichtete Regierung zu vermeiden, auf die Chega! Einfluss nehmen könnte. Die Parteivorsitzende des BE, Catarina Martins, versicherte, dass die Wahlergebnisse nie die Richtung der Partei bestimmt hätten und dass sie nicht aufgeben werde.
CDU/Kommunistische Partei
Auch für die CDU, die Koalition der Kommunistischen mit der Grünen Partei, war es ein enttäuschender Wahlabend. Sie wurde ebenfalls Opfer der Absicht vieler ihrer traditionellen Wähler, eine rechte Regierung zu verhindern. Die CDU verlor nicht nur 90.000 Stimmen, was die Reduzierung ihrer Fraktion von 12 auf 6 Mitglieder bedeutet, sondern es wurde auch kein einziges Mitglied der Grünen Partei (PEV) gewählt. Das kann weitreichende Folgen haben. Jahrzehntelang nutzte die Kommunistische Partei die Grüne Partei als Mittel, um ihre Präsenz im Parlament zu verdoppeln und Zugang zu Entscheidungspositionen in der parlamentarischen Arbeit zu erhalten. Der Stimmenverlust der CDU war in einigen Regionen, in denen die Kommunisten seit 1975 einen starken Einfluss hatten, besonders groß: Das weist darauf hin, dass die Partei landesweit deutlich an Boden verliert. Jerónimo de Sousa, der Generalsekretär der Kommunistischen Partei, war wegen einer Herzoperation die meiste Zeit des Wahlkampfes abwesend, erschien aber in den letzten Tagen vor dem Urnengang und versicherte in der Wahlnacht, dass er als Generalsekretär weitermachen werde, weil die Partei ihn "brauche".
CDS
Die konservative CDS (Partido do Centro Democrático Social) ist eindeutig der Hauptverlierer der Wahl. Seit dem Verlust der Regierungsbeteiligung 2015 und dem Rücktritt ihres langjährigen Vorsitzenden Paulo Portas erlebte die CDS zahlreiche innerparteilichen Konflikte. Bei den letzten Parlamentswahlen im Jahr 2019 hatte sie bereits viele Stimmen verloren und war auf eine Fraktion mit fünf Mitgliedern geschrumpft. Nun ist die CDS, die 1974-75 ein Gründungsmitglied der portugiesischen Demokratie und an vielen Regierungen beteiligt war (auch solchen unter Führung der Sozialisten) aus dem Parlament verschwunden, obwohl sie insgesamt mehr Stimmen erhielt als andere Parteien, die aufgrund der Methodik des Wahlsystems einen Abgeordneten stellen. Es überrascht nicht, dass der Parteivorsitzende, Francisco Rodrigues dos Santos, in der Wahlnacht seinen Rücktritt bekannt gab.
PAN
Nachdem die Tierschutzpartei „Pessoas-Animais-Natureza“ ("Menschen-Tiere-Natur") 2019 vier Abgeordnetenmandate erhielt, verlor sie fast 50% der Stimmen und erhielt nunmehr einen Abgeordneten, was ihrem Ergebnis von 2015 entspricht. Die meisten ihrer Wähler kommen aus eher städtischen Bezirken.
Livre
Livre ("Freie") erhielt erstmals 2019 ein Abgeordnetenmandat, das sie bereits nach vier Monaten wieder verlor, als die einzige Abgeordnete die Partei verließ und als Unabhängige im Parlament verblieb. Nun gewann der Vorsitzende von Livre, Rui Tavares, ein Mandat. In den Debatten des Wahlkampfes erhielt er viel Aufmerksamkeit. Livre war die einzige linke Partei, die keine Wähler an die PS verlor, um eine rechtsgerichtete Regierung zu verhindern. Ihr Vorsitzender Rui Tavares stimmte am Wahlabend "Die Internationale" an, die Hymne der bolschewistischen Partei der UdSSR in der ersten Hälfte des 20. Jahrhunderts.
Stimmenthaltung
Trotz der Befürchtungen aufgrund der Pandemie sank die Zahl der Wahlbeteiligung im Vergleich zu den Parlamentswahlen 2019 nur um 3 Prozentpunkte. Unter den insgesamt 10.820.337 Wählern lag die Wahlbeteiligung bei 58%. Die Region mit der niedrigsten Wahlbeteiligung war Madeira mit 46%, die höchste Wahlbeteiligung verzeichnete Braga mit 64%. In den städtischen Zentren lag die Wahlbeteiligung über dem nationalen Durchschnitt, sowohl in Lissabon als auch in Porto betrug sie 62%.
Perspektiven für die Zukunft
- Ministerpräsident António Costa hat nun die Möglichkeit, seine politische Strategie ohne Druck und Forderungen linksextremer Parteien zu verfolgen. Er hat aber nun auch keine Ausreden mehr, um bei Problemen auf Blockaden der Linksparteien zu verweisen. Schwerpunkt seiner Regierungsarbeit in den nächsten vier Jahren soll die Ankurbelung eines starken Wirtschaftswachstums sein. Mit Hilfe der Aufbau- und Resilienz-Fazilität, des NextGenerationEU-Fonds und anderer Gemeinschaftsprogramme für Portugal soll ein Wachstum erzielt werden, das deutlich über dem europäischen Durchschnitt liegt.
- Die nächste Regierung wird voraussichtlich kleiner ausfallen. Obwohl ihre Zusammensetzung erst Ende Februar bekannt gegeben werden soll, gibt es bereits einige Gerüchte darüber. Augusto Santos Silva (bisher Außenminister) wird als nächster Parlamentspräsident gehandelt; Francisca Van Dunam (bisher Justizministerin) soll bereits um ihren Rücktritt gebeten haben; Marta Temido (bisher Gesundheitsministerin) und Ana Mendes Godinho (bisher Ministerin für Arbeit, Solidarität und soziale Sicherheit) hatten sich hingegen bereiterklärt, weiterhin in Costas Regierung zu arbeiten. Medienberichten zufolge werden Fernando Medina (ehemaliger Bürgermeister von Lissabon) und Duarte Carneiro (Costas Wahlkampfleiter für diese Wahlen) die neue Regierung wahrscheinlich ergänzen.
- Sowohl in der PSD als auch in der CDS wurden bereits die Namen derjenigen bekannt, die für die Nachfolge der unterlegenen Parteiführer kandidieren könnten. Bei den Sozialdemokraten gelten Luís Montenegro, Miguel Pinto Luz und Paulo Rangel als die wahrscheinlichsten Kandidaten. Bei der CDS scheint Nuno Melo, derzeit Abgeordneter des Europäischen Parlaments, der Einzige zu sein, der die Voraussetzungen für einen Wiederbelebungsversuch der Partei erfüllt.
- Die allgemeine Atmosphäre des sozialen Friedens, die Portugal in den letzten sechs Jahren erlebte, wird ebenfalls zu Ende sein – Streiks und Demonstrationen werden höchstwahrscheinlich zurückkehren. Ohne Einfluss und Einbindung in die Regierung und mit einer geschwächten Position im Parlament hat der Vorsitzende der Kommunistischen Partei, Jerónimo de Sousa, bereits die Gewerkschaften mobilisiert, um für die Rechte der Arbeitnehmer einzutreten und zum "Massenkampf" aufgerufen.
- Der Präsident der Republik, Marcelo Rebelo de Sousa, kann nun stärker als zuvor in das politische Tagesgeschäft eingreifen, denn er muss mit der neuen Parlamentsmehrheit keine destabilisierende Wirkung möglicherweise kritischer Erklärungen seinerseits befürchten, was er es während seiner vorangegangenen Mandate oft gesagt hatte. Obwohl seine Befugnisse erheblich eingeschränkt sind, da sein Vetorecht im Parlament leicht überwunden werden kann, gehen einige politische Kommentatoren davon aus, dass der Präsident auch die Opposition gegen die Regierung anführen wird, zumindest bis die PSD einen neuen Vorsitzenden gefunden hat.