SPACE Project - Auslandsbüro Uganda und Südsudan
The following has evaluated to null or missing: ==> data.meta [in template "252001#252047#252845" at line 459, column 10] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- 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: #if data.meta.laufendenummer?has_cont... [in template "252001#252047#252845" at line 459, column 5] ----
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
98 title = entry.getTitle(languageId)
99 data = {
100 "title": title
101 }
102 />
103 <@debugJsonString jsonString "ADT_KASDE_DYNAMIC_INTRO" />
104
105 <#if hasContent('untertitel', languageId, json)>
106 <#assign data = data + { "subheadline": getValueForLanguage('untertitel', languageId, json, "first") } >
107 </#if>
108
109 <#if hasContent('beschreibung', languageId, json)>
110 <#assign data = data + { "copy": getValueForLanguage('beschreibung', languageId, json, "first") } >
111 </#if>
112
113 <#-- fill meta data -->
114 <#assign meta = {} />
115
116 <#-- PUBLIKATIONEN DETAIL -->
117 <#if layouttpl?contains("LAYOUT_KASDE_PUBLIKATIONEN_DETAIL")>
118
119 <#if hasContent('coverDMTKASDEMEDIUM', languageId, json)>
120 <#assign
121 coverBildString = getValueForLanguage('coverDMTKASDEMEDIUM', languageId, json, "first")
122 />
123
124 <#if coverBildString?has_content>
125 <#assign
126 coverBild = FrontendService.json.parseAsJson(coverBildString)
127 dMTJsonObject = FrontendService.media.getDMTJsonObject( coverBild.groupId?number, coverBild.uuid, locale )
128 linkToDMT = FrontendService.media.getImageURLForAMConfiguration('hd-resolution',coverBild.groupId?number, coverBild.uuid )
129 data = data + { "media": linkToDMT, "meta" : dMTJsonObject }
130 />
131 <#if dMTJsonObject.altText?? >
132 <#assign data = data + {"alt" : dMTJsonObject.altText} />
133 </#if>
134 <#if dMTJsonObject.quelle??>
135 <#assign meta = meta + { "quelle": dMTJsonObject.quelle } />
136 </#if>
137 </#if>
138 <#-- uncomment to display pdf cover as Intro Image
139 <#elseif hasContent('document_pdfDMTBASICDOCUMENT', languageId, json)>
140 <#assign
141 pdfDocument = getValueForLanguage('document_pdfDMTBASICDOCUMENT', languageId, json, "first")
142 fileEntry = FrontendService.media.getFileEntry(pdfDocument.uuid, groupId?number)!/>
143 <#if fileEntry?has_content>
144 <#assign
145 linkToThumbnail = FrontendService.link.getThumbnailSrc(fileEntry , themeDisplay)
146 data = data + { "media": linkToThumbnail }
147 />
148 </#if>
149 -->
150 </#if>
151
152 <#assign
153 meta = meta + { "orderInfo": "true" }
154 verbundJournalArticle = FrontendService.publication.getVerbundToPublikation( entry )!""
155 />
156
157
158
159 <#if hasContent('erscheinungsdatum', languageId, json)>
160 <#assign
161 erscheinungsdatum = getValueForLanguage('erscheinungsdatum', languageId, json, "first")
162 />
163 <#if erscheinungsdatum?has_content >
164 <#assign
165 erscheinungsdatumFormatted = FrontendService.date.getDateFormatLong( erscheinungsdatum, languageId )
166 meta = meta + { "date": erscheinungsdatumFormatted }
167 />
168 </#if>
169 </#if>
170
171 <#if verbundJournalArticle?has_content>
172 <#assign
173 verbundJsonString = FrontendService.article.getWebcontent(verbundJournalArticle.resourcePrimKey)
174 verbundJson = FrontendService.json.parseAsJson(verbundJsonString)
175 laufendenummer = getValueForLanguage('laufendenummer', languageId, verbundJson, "first")
176 coverImg = getValueForLanguage('mediumDMTKASDEMEDIUM', languageId, verbundJson, "first")
177 />
178 <@debugJsonString verbundJsonString "ADT_KASDE_DYNAMIC_INTRO-verbundJournalArticle" />
179 <#assign meta = meta + { "laufendenummer": laufendenummer } >
180
181 <#if coverImg?has_content && coverImg.url?has_content >
182 <#assign meta = meta + { "coverImg": coverImg.url } >
183 </#if>
184 </#if>
185
186
187 <#if meta?has_content>
188 <#assign data = data + {"meta": meta } >
189 </#if>
190
191 </#if>
192 <#-- PUBLIKATIONEN DETAIL END -->
193
194
195 <#-- VERANSTALTUNGEN DETAIL -->
196 <#if layouttpl?contains("LAYOUT_KASDE_VERANSTALTUNGEN_DETAIL")>
197 <#assign
198 friendlyUrl = FrontendService.article.getFriendlyUrl(primaryKey, languageId, groupId)!""
199 languages = entry.getAvailableLanguageIds()
200 links = []
201 />
202 <#if languages?has_content && friendlyUrl?has_content>
203 <#if (languages?size > 1) >
204 <#list languages 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 <#list json["document_pdfDMTBASICDOCUMENT"]?keys as pdf_language>
411 <#if pdf_language?has_content >
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 </#if>
436 </#list>
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.laufendenummer?has_content !isACColorScheme() && !isVLCColorScheme() && !isDPMColorScheme()>
460 <div>
461 <div id="publicationVerbundPagination">
462 <@AMPublicationCarousel data.meta.laufendenummer data.meta.date data.meta.coverImg />
463 </div>
464 </div>
465 </#if>
466
467<#elseif (editmode?? && editmode)>
468 <@errorMessage languageUtil.get(locale, "kein.journalArticle.gefunden") "ADT_KASDE_DYNAMIC_INTRO" layouttpl currentUrl />
469</#if>
SPACE - Strengthening Performane and Accountability through Community Engagement
THE PROJECT
The SPACE-Project aims to contribute to improved downward accountability and performance of local government (LGs) in Northern Uganda. The project will strengthen CSOs, media, local councils and SUCs through promotion of accountable service delivery while on the other hand fostering civil society’s oversight role by strengthening their collaboration with Local Governments to assess performance and monitor service delivery.
The project will work very closely with the district leadership in all the 6 target districts. The project is intended to run for 30 months starting January 2020. For more information check out the FACT SHEET.
SPACE runs under the EU-funded "Development Initiative for Northern Uganda" which is carried out in cooperation with the Government of Uganda.
PROJECT SET-UP
Administrative Management: Bernard Mukhone
Content Management: Verena Kasirye
Programme Officer: Racheal Okuja
Programme Assistant: Samson Okurut
Finance & Admin: Julian Marembo
TARGET DISTRICTS
Amuria
Arua
Gulu
Lira
Napak
Moroto
PROJECT LAUNCH
Friday 13th March 2020 at FAIRWAY HOTEL NAKASERO KAMPALA
The Launch of the DINU KAS EU Project: Strengthening Performance and accountability through community Engagement (SPACE) took place on Friday 13th March 2020 at Fairway Hotel, Kampala. Representatives from the following district were present: Arua, Gulu, Lira, Amura, Napak and Moroto. Further, this launch brought together the permanent secretary OPM, EU Representative, Ministry of finance, Ministry of ICT, ACFODE, DINU coordinator, KAS staff and Regional coordinators/ Local partners such as Lira NGO Forum based in Lira District, MACCO based in Arua district and RiamRiam based in Moroto District.
After welcoming remarks and a brief project overview by KAS Programme Coordinator Ben Mukhone, one of the local partner representatives, namely Ms. Claudia APIO from Lira NGO forum, highlighted the great need to work with the district Administrative wings as a best practice to ensuring coordination among CSOs and other partners in implementing projects that affect the communities. The project also comes at time that different CSOs are leveraging their strength to ensure a more accountable service delivery within the communities in which they operate and to also strengthen their roles as CSOs. She acknowledged the need for capacity building for CSOs to performance their oversight roles better. She also emphasized the need to get continuous support from the district right from the project start to the end.
A further statement and the official launch of the project was set by the permanent secretary office of the Prime Minister. He emphasized the need for districts local governments to Work with local partners as front line teams to ensure they interact with the different constituencies to make the project a reality. The Representative from the Office of the Prime Minister congratulated all the district leaders (Chief Administrative officers-CAOs) on signing the MOUs that brings them together representing a sign of commitment that they will work with KAS through the local partners within their respective districts. The Office of the prime minister is expectant that other MOUs will be presented to these district under DINU "All partners working with DINU will be expected to declare their budgets to these districts as a mark to walking the talk. Transparency begins with us."