Search the FirstSpirit Knowledge Base
Hallo, ich suche nach einer Möglichkeit, FirstSpirit Benutzer rekursiv zu entfernen. Sprich: Erst sollte der angegebene Benutzer erst aus allen Gruppen eines Projekts entfernt werden, danach aus dem Projekt selbst, bevor der User entgültig gelöscht wird. Am besten würde sich ein Skript hierfür eignen, aber mir fehlen Ideen wie man da anfängt. Und nein, wenn man Benutzer direkt löscht, verbleiben diese in den Projekten und Gruppen, was ein unschönes Verhalten ist.
Hallo dhelmstetter,
in meinen Augen ist es nicht korrekt, dass für diesen Anwendungsfall ein Skript geschrieben werden muss. Insofern habe ich unter der internen ID CORE-17037 einen entsprechenden Bugverdacht aufgenommen.
Hier wäre es hilfreich, wenn Du dieses Verhalten als Fehler an den Customer Support melden würdest, gerne mit Hinweis auf die interne ID CORE-17037.
Der Vollständigkeit halber hier ein entsprechendes Beanshell-Skriptbeispiel:
import de.espirit.firstspirit.access.AdminService;
import de.espirit.firstspirit.access.ServicesBroker;
broker = context.getConnection().getBroker();
adminService = context.requireSpecialist(ServicesBroker.TYPE).getService(AdminService.class);
userStorage = adminService.getUserStorage();
user = userStorage.getUserByLogin("deleteme");
projects = adminService.getProjectStorage().getProjects();
for (project:projects) {
if (project.isActive() && project.isMember(user)) {
groups = project.getGroups(user);
context.logInfo("Gruppen:" + groups.toString());
project.lock();
for (group:groups) {
group.removeUser(user);
}
project.removeUser(user);
project.save();
project.unlock();
context.logInfo("User " + user.getName() + " removed from project " + project.getName());
}
}
userStorage.removeUser(user);
Dazu einige Hinweise:
Es werden natürlich Server-Admin Rechte benötigt, um dieses Skript ausführen zu können.
Ich fange beim Versuch auf das jeweilige Projekt einen Lock zu setzen bewusst die möglichen Exceptions nicht ab, so dass das Skript abbrechen sollte, wenn ein Projekt zeitgleich bearbeitet wird. Nur so kann sichergestellt werden, dass der User aus allen Projekten entfernt wird, bevor er gelöscht wird.
Ich berücksichtige nicht die Einstellung "Alle Benutzer zulassen". Wenn diese bei einem Projekt gesetzt ist, wird auch in diesem versucht, den User zu löschen.
Viele Grüße
Holger
Hallo Holger. Vielen Dank für deine Rückmeldung. Dein Skript hat in unserem Test sehr gut geholfen. Gäbe es nun eine Möglichkeit einer Warnung in Form einer Dialogbox vorher zu erzeugen oder wird das nicht gehen weil die Skripte Headless laufen?
Hallo dhelmstetter,
man kann beispielsweise folgendermaßen eine Abfrage im Skript definieren:
import de.espirit.firstspirit.agency.OperationAgent;
import de.espirit.firstspirit.ui.operations.RequestOperation;
operationAgent = context.requireSpecialist(OperationAgent.TYPE);
requestOperation = operationAgent.getOperation(RequestOperation.TYPE);
requestOperation.setKind(RequestOperation.Kind.WARN);
requestOperation.setTitle("Titel");
answerYes = requestOperation.addYes();
answerUncertain = requestOperation.addAnswer("Weiß nicht");
answerNo = requestOperation.addNo();
answer = requestOperation.perform("Dies ist eine Warnung.\nTrozdem fortfahren?");
if (answer.equals(answerYes)) ...
Die würde dann dort angezeigt werden, wo das Skript gestartet wird - sofern die entsprechende Stelle diese Anzeige unterstützt...
Viele Grüße
Holger