/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.course.certificate.ui; import java.util.ArrayList; import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.id.Identity; import org.olat.core.util.Formatter; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.certificate.Certificate; import org.olat.course.certificate.CertificateEvent; import org.olat.course.certificate.CertificateTemplate; import org.olat.course.certificate.CertificatesManager; import org.olat.course.certificate.model.CertificateInfos; import org.olat.course.config.CourseConfig; import org.olat.course.nodes.CourseNode; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.repository.RepositoryEntry; import org.olat.resource.OLATResource; import org.springframework.beans.factory.annotation.Autowired; /** * * Initial date: 21.10.2014<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class AssessedIdentityCertificatesController extends BasicController implements GenericEventListener { private Link generateLink; private final VelocityContainer mainVC; private DialogBoxController confirmDeleteCtrl; private DialogBoxController confirmCertificateCtrl; private final OLATResource resource; private final UserCourseEnvironment assessedUserCourseEnv; private final boolean canDelete; private final Formatter formatter; @Autowired private CertificatesManager certificatesManager; public AssessedIdentityCertificatesController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment assessedUserCourseEnv) { super(ureq, wControl); this.assessedUserCourseEnv = assessedUserCourseEnv; resource = assessedUserCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseResource(); CourseConfig courseConfig = assessedUserCourseEnv.getCourseEnvironment().getCourseConfig(); canDelete = courseConfig.isManualCertificationEnabled(); mainVC = createVelocityContainer("certificate_overview"); formatter = Formatter.getInstance(getLocale()); if(courseConfig.isManualCertificationEnabled()) { generateLink = LinkFactory.createLink("generate.certificate", "generate", getTranslator(), mainVC, this, Link.BUTTON); generateLink.setElementCssClass("o_sel_certificate_generate"); } loadList(); putInitialPanel(mainVC); CoordinatorManager.getInstance().getCoordinator().getEventBus() .registerFor(this, getIdentity(), CertificatesManager.ORES_CERTIFICATE_EVENT); } @Override protected void doDispose() { CoordinatorManager.getInstance().getCoordinator().getEventBus() .deregisterFor(this, CertificatesManager.ORES_CERTIFICATE_EVENT); } @Override public void event(Event event) { if(event instanceof CertificateEvent) { CertificateEvent ce = (CertificateEvent)event; if(ce.getOwnerKey().equals(assessedUserCourseEnv.getIdentityEnvironment().getIdentity().getKey()) && resource.getKey().equals(ce.getResourceKey())) { loadList(); } } } private void loadList() { Identity assessedIdentity = assessedUserCourseEnv.getIdentityEnvironment().getIdentity(); List<Certificate> certificates = certificatesManager.getCertificates(assessedIdentity, resource); List<Links> certificatesLink = new ArrayList<>(certificates.size()); int count = 0; for(Certificate certificate:certificates) { String displayName = formatter.formatDateAndTime(certificate.getCreationDate()); String url = DownloadCertificateCellRenderer.getUrl(certificate); Links links = new Links(url, displayName, certificate.getStatus().name()); certificatesLink.add(links); if(canDelete) { Link deleteLink = LinkFactory.createLink("delete." + count++, "delete", getTranslator(), mainVC, this, Link.NONTRANSLATED); deleteLink.setCustomDisplayText(" "); deleteLink.setElementCssClass("o_sel_certificate_delete"); deleteLink.setIconLeftCSS("o_icon o_icon-lg o_icon_delete"); deleteLink.setUserObject(certificate); links.setDelete(deleteLink); } } mainVC.contextPut("certificates", certificatesLink); } @Override protected void event(UserRequest ureq, Component source, Event event) { if(generateLink == source) { doConfirmGenerateCertificate(ureq) ; } else if(source instanceof Link) { Link link = (Link)source; String cmd = link.getCommand(); if("delete".equals(cmd)) { Certificate certificate = (Certificate)link.getUserObject(); doConfirmDelete(ureq, certificate); } } } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(confirmCertificateCtrl == source) { if(DialogBoxUIFactory.isYesEvent(event)) { doGenerateCertificate(ureq); } } else if(confirmDeleteCtrl == source) { if(DialogBoxUIFactory.isYesEvent(event)) { Certificate certificate = (Certificate)confirmDeleteCtrl.getUserObject(); doDelete(certificate); } } super.event(ureq, source, event); } private void doConfirmDelete(UserRequest ureq, Certificate certificate) { String title = translate("confirm.delete.certificate.title"); String text = translate("confirm.delete.certificate.text"); confirmDeleteCtrl = activateYesNoDialog(ureq, title, text, confirmDeleteCtrl); confirmDeleteCtrl.setUserObject(certificate); } private void doDelete(Certificate certificate) { certificatesManager.deleteCertificate(certificate); loadList(); String displayName = formatter.formatDateAndTime(certificate.getCreationDate()); showInfo("confirm.certificate.deleted", displayName); } private void doConfirmGenerateCertificate(UserRequest ureq) { ICourse course = CourseFactory.loadCourse(resource); Identity assessedIdentity = assessedUserCourseEnv.getIdentityEnvironment().getIdentity(); RepositoryEntry courseEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); if(certificatesManager.isCertificationAllowed(assessedIdentity, courseEntry)) { //don't need to confirm doGenerateCertificate(ureq); } else { String title = translate("confirm.certificate.title"); String text = translate("confirm.certificate.text"); confirmCertificateCtrl = activateYesNoDialog(ureq, title, text, confirmCertificateCtrl); } } private void doGenerateCertificate(UserRequest ureq) { ICourse course = CourseFactory.loadCourse(resource); CourseNode rootNode = course.getRunStructure().getRootNode(); Identity assessedIdentity = assessedUserCourseEnv.getIdentityEnvironment().getIdentity(); ScoreEvaluation scoreEval = assessedUserCourseEnv.getScoreAccounting().getScoreEvaluation(rootNode); RepositoryEntry courseEntry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); CertificateTemplate template = null; Long templateKey = course.getCourseConfig().getCertificateTemplate(); if(templateKey != null) { template = certificatesManager.getTemplateById(templateKey); } Float score = scoreEval == null ? null : scoreEval.getScore(); Boolean passed = scoreEval == null ? null : scoreEval.getPassed(); CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed); certificatesManager.generateCertificate(certificateInfos, courseEntry, template, true); loadList(); showInfo("msg.certificate.pending"); fireEvent(ureq, Event.CHANGED_EVENT); } public static class Links { private String url; private String name; private String status; private Link delete; public Links(String url, String name, String status) { this.url = url; this.name = name; this.status = status; } public String getUrl() { return url; } public String getName() { return name; } public String getStatus() { return status; } public String getDeleteName() { return delete == null ? null : delete.getComponentName(); } public void setDelete(Link delete) { this.delete = delete; } } }