-
description: I want to create a wiki for our kindergarten which is organized by the parenst as a non-profit organisation
-
owner name: Ehrenfelder Zipfelmutzen
-
wiki name: Zipfelmuetzen
You can access your new wiki on https://zipfelmuetzen.myxwiki.org.
Enjoy !
Is it possible that an Admin can create a scheduled job with the following groovy script?
import java.util.Calendar
// ----------------------------------------------------
// Parameter: bitte an Deine Umgebung anpassen
// ----------------------------------------------------
// Voll qualifizierter Klassenname Deiner Application
// → “SpaceName.ClassName” genau so, wie im Klassen-Editor angezeigt
final String CLASS_NAME = “DeinSpace.MassnahmenplanClass”
// Wert in staticList2, der bedeutet: “Erinnerung wurde bereits verschickt”
final String REMINDER_SENT_VALUE = “REMINDER_SENT”
// ----------------------------------------------------
// Logger
// ----------------------------------------------------
def log = services.logging.getLogger(“MassnahmenplanReminderJob”)
// ----------------------------------------------------
// 1) Heutigen Tag bestimmen [heute 00:00; morgen 00:00)
// ----------------------------------------------------
Calendar cal = Calendar.getInstance()
cal.set(Calendar.HOUR_OF_DAY, 0)
cal.set(Calendar.MINUTE, 0)
cal.set(Calendar.SECOND, 0)
cal.set(Calendar.MILLISECOND, 0)
Date startOfDay = cal.getTime()
cal.add(Calendar.DATE, 1)
Date endOfDay = cal.getTime()
// ----------------------------------------------------
// 2) Alle Maßnahmen mit Zieltermin = heute,
// bei denen staticList2 NICHT auf “REMINDER_SENT” steht
// ----------------------------------------------------
// ACHTUNG: CLASS_NAME muss hier als Literal eingetragen werden
// Beispiel nach Anpassung: from doc.object(Zipfelmuetzen.MassnahmenplanClass) obj
def query = services.query.xwql(
“from doc.object(” + CLASS_NAME + ") obj " +
"where obj.date1 >= :start and obj.date1 < :end " +
“and (obj.staticList2 is null or obj.staticList2 <> :1)”
)
.bindValue(“start”, startOfDay)
.bindValue(“end”, endOfDay)
.bindValue(“reminderValue”, REMINDER_SENT_VALUE)
List docNames = query.execute()
log.info(“MassnahmenplanReminderJob: found ${docNames.size()} due items for today”)
// ----------------------------------------------------
// 3) Über alle gefundenen Maßnahmen iterieren
// ----------------------------------------------------
docNames.each { docName →
def doc = xwiki.getDocument(docName)
def obj = doc.getObject(CLASS_NAME)
if (obj == null) {
log.warn("No MassnahmenplanClass object on doc ${docName}")
return
}
// 3a) Zieltermin (optional für Logging)
def dueDate = obj.getProperty("date1")?.value
// 3b) Zuständigen User ermitteln (Feld user1)
def userRef = obj.getProperty("user1")?.value // meist ein DocumentReference oder String
if (!userRef) {
log.warn("No user1 set on ${docName}")
return
}
def userDoc = xwiki.getDocument(userRef)
def userObj = userDoc.getObject("XWiki.XWikiUsers")
def to = userObj?.getProperty("email")?.value
if (!to) {
log.warn("User ${userRef} has no email")
return
}
// 3c) Betreff und Nachrichtentext
String subject = "Erinnerung: Maßnahme '${doc.displayTitle}' ist heute fällig"
String body = """\
Guten Tag,
dies ist eine automatische Erinnerung aus dem Maßnahmenplan.
Die Maßnahme “${doc.displayTitle}” hat den Zieltermin ${dueDate} und ist am heutigen Tag fällig.
Direkter Link zur Maßnahme:
${doc.getExternalURL(“view”)}
Beste Grüße
Ihr Maßnahmenplan
“”"
// 3d) Mail über Mail Sender API versenden
def message = services.mail.sender.createMessage(null, to, subject)
message.addPart("text/plain", body)
def result = services.mail.sender.send(message)
if (result?.statusResult?.getAllErrors()?.hasNext()) {
log.error("Error sending reminder mail for ${docName}")
} else {
log.info("Reminder mail sent to ${to} for ${docName}")
N
// 3e) Reminder-Flag setzen, damit nicht mehrfach erinnert wird
obj.set("staticList2", 1)
doc.save("Reminder sent by MassnahmenplanReminderJob")
}
}