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>
Hintergrund
Eines der Wahlversprechen von Präsident López Obrador im Jahr 2018 war, eine revocación de mandato (Widerruf des Mandats) zur Halbzeit seiner Amtszeit zu initiieren. Seinem Narrativ entsprechend solle das kluge Volk (el pueblo sabio) – wie er die mexikanischen Wähler gerne nennt – darüber abstimmen können, ob er seine komplette Amtszeit von sechs Jahren erfüllen oder frühzeitig beenden soll. Volksbefragungen als Element der direkten Demokratie hatte AMLO in seiner Amtszeit bereits mehrfach und mit äußerst niedriger Beteiligung eingesetzt - zuletzt im August 2021 mit der Frage, ob die Expräsidenten für ihre Handlungen in der Vergangenheit rechtlich belangt werden können. Bei rund 7,5% Wahlbeteiligung hatte diese eine äußerst begrenzte Wirkung und verfehlte die erforderliche Mindestbeteiligung zur Verbindlichkeit bei Weitem.
Hinsichtlich einer Volksbefragung zur Amtsenthebung von Regierungen besteht dieses Instrument in Mexiko bereits seit vielen Jahren in einigen mexikanischen Bundesstaaten1, dort auf die Funktion des Gouverneurs bezogen, ohne dass dies jemals zu einer Amtsenthebung geführt hätte.
Was auf nationaler Ebene und auf die Person des Staatspräsidenten bezogen zunächst lediglich ein Wahlslogan war, wurde nun eine gesetzliche Bestimmung mit Gültigkeit für das höchste Amt und alle 32 Gouverneure. Bereits 2019 wurde die entsprechende Verfassungsreform im Senat und der Abgeordnetenkammer verabschiedet und am 20. Dezember desselben Jahres veröffentlicht. Um die notwendigen Stimmen der Oppositionsparteien für die Verfassungsreform zu gewinnen, wurde seinerzeit zwischen Regierung und Opposition vereinbart, dass der Widerrufsgrund der "Vertrauensverlust" des Präsidenten sein muss. Die Änderungen der erforderlichen Gesetze wurden schlussendlich am 14. September 2021, fast genau zur Mitte seiner Amtszeit, verabschiedet.
Die Volksbefragung zum Widerruf seines Mandats fand dementsprechend am 10. April 2022 statt und wurde vom Nationalen Wahlinstitut (Instituto Nacional Electoral, INE) organisiert, welches sich lange und vehement außer Stande erklärt hatte, diese zusätzliche Aufgabe nach den erfolgten drastischen Budgetkürzungen ordnungsgemäß durchführen zu können. Dieser Streit zwischen Regierung und INE eskalierte bis zum Obersten Gerichtshof, der letztlich das INE verpflichtete dieser Aufgabe nachzukommen. Es war so eine neue Stufe in der sich seit Monaten zuspitzenden Auseinandersetzung zwischen Regierung und INE erreicht, die gleichzeitig auch die Grundlage für eventuelle Schuldzuweisungen nach dem Referendum für eventuelle Kontroversen im Falle eines aus Regierungssicht negativen Ergebnisses legte.
Ein polarisierendes Ergebnis
Bei einer Beteiligung von rund 16 Millionen Mexikanern (17,5 % der nominellen Wählerliste) stimmten 91,1 % für den Verbleib des Präsidenten im Amt, während sich nur 7,5 % dagegen aussprachen. Präsident Andrés Manuel López Obrador versicherte dennoch bereits nach den vorläufigen Ergebnissen in der Nacht zum Montag, dass es “ohne Zweifel eine transzendente Nacht (sei), denn zum ersten Mal wird ein Verfahren zum Widerruf des Mandats durchgeführt, eine Konsultation, um die Bürger zu fragen, ob sie die Fortsetzung des Präsidenten der Republik wollen oder nicht, es ist etwas noch nie Dagewesenes und ein Schritt vorwärts, um unsere Demokratie zu behaupten“2.
Blickt man auf die regionalen Unterschiede, so waren die Bundesstaaten des mexikanischen Südostens diejenigen, die am 10. April die höchste Beteiligung verzeichneten. Die Bürgerbeteiligung in Tabasco, dem Heimatstaat des mexikanischen Präsidenten, war (wenig überraschend) mit 35,9 Prozent der Staat, mit der höchsten Beteiligung im Land. Andererseits waren die Bundesstaaten des Centro-Bajío und des Nordens des Landes diejenigen, die sich am wenigsten an dem Referendum von López Obrador beteiligten3. Ein Gefälle, das sich auch in der sozioökonomischen Realität und den politischen Präferenzen widerspiegelt.
Klare Haltung der Opposition
So euphorisch AMLO und die ihn unterstützenden MORENA-Gefolgsleute die 91,1% Zustimmung feierten, so deutlich kritisierten die diversen Oppositionsparteien mit Verweis auf die bescheidene Wahlbeteiligung von 17,5% das gesamte Verfahren. Die Oppositionsparteien des Bündnisses „Va por México“ von PAN, PRI und der PRD warfen AMLO vor, dass das Referendum "Versagen" und eine Übung zur "Befriedigung des Egos des Präsidenten"4 gewesen seien und forderten die Annullierung des Verfahrens. Die PAN stellte zudem den Geldbetrag in Frage, der in die Beratung und Logistik zum Widerruf des Mandats investiert wurde und hob hervor, dass wertvolle Ressourcen, die man anderweitig hätte nutzen können, zu diesem Selbstzweck verschwendet wurden5. Auch der Vorsitzende der „Movimiento Ciudadano“ (die nicht dem offiziellen Oppositionsbündnis angehört), Dante Delgado, äußerte sich mit den Worten: „Der Widerruf des Mandats muss ein Instrument im Dienste der Bürger sein, kein Instrument im Dienste der Eitelkeit des Präsidenten“6.
Wahlkampagne und die Rolle des Nationalen Wahlinstituts
Das Argument der Illegalität und der Verfassungswidrigkeit von Entscheidungen und Handlungen mexikanischer Regierungen wird, historisch gesehen, intensiv bis exzessiv verwendet. Bei mehr als einer Gelegenheit wurde so je nach Interessenslage oder politischer Konfiguration versucht, eine Verfassungswidrigkeit in jeder einzelnen politischen Handlung zu finden. Doch selten wurde die normative Ordnung so eindeutig und offen konterkariert, wie es während dieses Wahlprozesses der Fall war.
Die Unregelmäßigkeiten begannen bereits im Prozess der Unterschriftensammlung. Nach Angaben des INE wiesen von den 3.451.843 gesammelten Unterschriften (das entspricht 3,75 % der auf der nominellen Liste eingetragenen Personen)7 1.027.822 dieser Unterschriften Irregularitäten auf, ohne dass dies zur Annullierung des gesamten Prozesses führte8. Somit war aber schon die Genese und damit die Zulassung dieser Volksbefragung fragwürdig.
Zudem kam es im Laufe der Wahlkampagne häufig zu verbalen Attacken bzw. Auseinandersetzungen zwischen dem INE und Regierungsmitgliedern bzw. Vertretern der Regierungsparteien und zu etlichen Verstößen gegen das bestehende Wahlrecht. Tatsächlich hat die Comisión de quejas y denuncias (Beschwerde- und Anzeigekommission) des INE seit Februar 2022 mehr als 180 vorsorgliche Maßnahmen wegen Verstößen gegen die Verfassung durch Beamte verschiedener Ebenen erlassen9: Abgeordnete, Gouverneure, die Regierungschefin der Stadt Mexiko, die Kommunikationsbeauftragte der Präsidentschaft und sogar den Präsidenten der Republik höchstpersönlich, ohne dass dies unmittelbare rechtliche Konsequenzen zur Folge gehabt hätte.
Diese Maßnahmen verdeutlichen das in höchstem Masse angespannte Verhältnis zwischen Bundesregierung und Regierungspartei einerseits und der Wahlbehörde andererseits. AMLO selbst hat angekündigt, dass er unmittelbar nach dem Referendum dem Kongress eine Initiative zur Wahlreform vorlegen wird, die neben dem Vorschlag, dass Wahlräte und Magistrate durch direkte Wahl gewählt werden, auch eine erhebliche Senkung des Budgets für den Betrieb des Nationalen Wahlinstituts und dessen föderalen Charakter beinhalten wird. Dies, nachdem er dem INE, das er als "teuersten Apparat zur Organisation von Wahlen, den teuersten der Welt"10 bezeichnet, wiederholt vorgeworfen hatte, für "politische Zwecke zu handeln“ und dass dessen Ermittlungen und Pochen auf die Einhaltung der Wahlgesetze als "Angriffe auf die Demokratie" zu deuten sind.
Diese Auseinandersetzungen lösten aber auch eine politische Kampagne zur Verteidigung des Nationalen Wahlinstituts INE mit dem Ziel aus, diese Institution, die in Umfragen eine ähnlich hohe Zustimmung wie der Staatspräsident selbst erfährt und damit weit über allen anderen politischen Institutionen des Landes liegt, zu verteidigen. So wies auch Lorenzo Córdova, Vorsitzender der Wahlbehörde darauf hin, dass „derjenige, der gegen die Regeln verstößt, nicht nur schummelt, nicht nur Betrug begeht, sondern auch die Grundlagen des demokratischen Zusammenlebens untergräbt“11. Ohne den Staatspräsidenten jemals direkt zu zitieren, bekundete Córdova (in Interviews in den Medien und in offiziellen Erklärungen), dass „wir heute in einer Polarisierung leben, die Freunde und Feinde scharf, intolerant und vereinfachend voneinander trennt“12 was, historisch gesehen, der Nährboden für Autoritarismus ist.
Eine tief gespaltene mexikanische Gesellschaft
Die Ergebnisse des Widerrufs des Mandats spiegeln die tiefe Polarisierung wider, die im mexikanischen politischen System bzw. in der mexikanischen Gesellschaft vorherrscht. Die ernüchternde Wahlbeteiligung von knappen 18% und eine große Zahl an Nichtwählern einerseits sind auch Ausdruck eines Desinteresses bis hin zu einer deutlichen Absage an die Regierung (das war auch erklärtes Ziel der Opposition mit der mehrheitlichen Aufforderung dem Referendum als Protestaktion fernzubleiben). Auf der anderen Seite sind 91 % bzw. 15 Mio. Stimmen Zustimmung auch Ausdruck einer treu zu AMLO und seiner Politik stehenden Bevölkerung (auch wenn es zahlreiche Hinweise dafür gab, dass diese Stimmen in bewährter mexikanischer Manier zum Urnengang gekarrt wurden).
Für Präsident López Obrador und seine politische Bewegung MORENA war das Ergebnis aber der erhoffte Rückenwind, zumindest lässt es sich so darstellen. "Es war ein Erfolg. Liebe wird mit Liebe zurückgezahlt“ – bekräftigte der Präsident in der Nacht des Referendums, während er - und dies nicht zum ersten Mal - betonte, dass er sich 2024 nicht wiederwählen lassen wird, eine Aussage, die allein schon deshalb auffällig ist, weil eine solche Wiederwahl zumindest in der derzeitigen Verfassung explizit ausgeschlossen ist.
Ausblick
Die MORENA-Partei wird sich jetzt auf die Ergebnisse dieses Referendums stützen und geht nicht nur im Hinblick auf die Wahlen am 5. Juni 202213 gestärkt in den Wahlkampf, sondern schafft sich somit auch eine starke Position für 2024. Ob dann aber die auf die Person López Obrador konzentrierte Zustimmung auch von einem seiner potentiellen Nachfolger kapitalisiert werden kann, ist noch völlig offen, auch bei MORENA sind die Nachfolgekämpfe bereits in vollem Gange.
Für die Oppositionsparteien, insbesondere die PAN, liegt die Herausforderung darin sich eben nicht nur als Opposition gegen MORENA oder gar AMLO zu positionieren, sondern sich wieder zu einer glaubwürdigen Regierungsalternative zu entwickeln und so einen genuinen demokratischen Wettstreit zu betreiben, bei dem dann in letzter Instanz die mexikanischen Wählerinnen und Wähler das letzte Wort haben.
----
[1] Chihuahua 1997, Zacatecas 1998, Aguascalientes und Guerrero 2014, Nuevo Leon und Jalisco 2016 und Ciudad de Mexico 2018.
[2] https://notiammex.com/consulta-popular-2022/revocacion-de-mandato-2022/es-una-noche-trascendente-porque-por-primera-vez-se-realiza-una-revocacion-de-mandato-amlo/
[3] Jalisco, Aguascalientes, Durango und Guanajuato zwischen 9 und 9,5%
[4] https://twitter.com/alitomorenoc/status/1513304200058392587?s=20&t=rYZIjzzYYwDroC510zPkYg
[5] https://twitter.com/MarkoCortes/status/1513380380400930817?s=20&t=zidvjRlQaMAX85LJSUUMQQ
[6] https://twitter.com/DanteDelgado/status/1513218945557401603?s=20
[7] Erforderlich waren 3% der Liste, also 2.758.227 Unterschriften, die Mindestzahl wurde also nicht allzu deutlich übertroffen.
[8] Zu den Unregelmäßigkeiten gehörten 17.833 Unterschriften von Toten; 1.265 Unterschriften von Inhaftierten; 132 Aufzeichnungen mit unregelmäßigen Daten, die eine fiktive Persönlichkeit schaffen; 22 Simulationen, bei denen Vorlagen des Berechtigungsnachweises zur Abstimmung verwendet wurden, und 5 Usurpationen, bei denen die Persönlichkeit eines Dritten angezeigt wird
[9] https://www.animalpolitico.com/2022/04/ine-283-quejas-relacionadas-con-revocacion-de-mandato/
[10] https://elpais.com/mexico/2021-07-23/lopez-obrador-redobla-los-ataques-al-ine-en-visperas-de-la-consulta-sobre-los-expresidentes.html
[11]https://www.reforma.com/aplicacioneslibre/preacceso/articulo/default.aspx?__rval=1&urlredirect=https://www.reforma.com/diez-anomalias-electorales-que-no-deben-repetirse-2022-04-11/op224540?referer=--7d616165662f3a3a6262623b727a7a7279703b767a783a--
[12] Idem.
[13] Gouverneurswahlen in 6 Bundesstaaten, die allesamt bis dato nicht von MORENA regiert werden (Aguascalientes, Durango, Hidalgo, Oaxaca, Quintana Roo, und Tamaulipas) und bei denen die Regierungspartei von der begründeten Hoffnung ausgeht, ihre Territorialmacht weiter auszubauen.