Skip to content
Snippets Groups Projects
Commit 09230032 authored by srosse's avatar srosse
Browse files

OO-3479: delete the binders and medias during user deletion process

parent b83f6e48
No related branches found
No related tags found
No related merge requests found
......@@ -349,8 +349,8 @@ public class BinderDAO {
sb.append("select binder from pfbinder as binder")
.append(" inner join fetch binder.baseGroup as baseGroup")
.append(" inner join baseGroup.members as membership")
.append(" where membership.identity.key=:identityKey and membership.role=:role")
.append(" and (binder.status is null or binder.status='").append(BinderStatus.open.name()).append("')");
.append(" left join fetch binder.olatResource as resource")
.append(" where membership.identity.key=:identityKey and membership.role=:role");
return dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), Binder.class)
......
......@@ -142,6 +142,14 @@ public class MediaDAO {
return query.getResultList();
}
public List<Media> load(IdentityRef author) {
String query = "select media from pfmedia as media where media.author.key=:authorKey";
return dbInstance.getCurrentEntityManager()
.createQuery(query, Media.class)
.setParameter("authorKey", author.getKey())
.getResultList();
}
public List<BinderPageUsage> usedInBinders(MediaLight media) {
StringBuilder sb = new StringBuilder();
sb.append("select binder.key, binder.title, page.key, page.title, page.status")
......@@ -166,7 +174,23 @@ public class MediaDAO {
usage.add(new BinderPageUsage(binderKey, binderTitle, pageKey, pageTitle, pageStatus));
}
return usage;
}
public boolean isUsed(MediaLight media) {
StringBuilder sb = new StringBuilder();
sb.append("select page.key")
.append(" from pfpage as page")
.append(" inner join page.body as pageBody")
.append(" inner join pageBody.parts as bodyPart")
.append(" where bodyPart.media.key=:mediaKey");
List<Long> pageKey = dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), Long.class)
.setParameter("mediaKey", media.getKey())
.setFirstResult(0)
.setMaxResults(1)
.getResultList();
return pageKey != null && !pageKey.isEmpty() && pageKey.get(0) != null;
}
public void deleteMedia(Media media) {
......
......@@ -122,6 +122,7 @@ import org.olat.repository.RepositoryEntryRef;
import org.olat.repository.RepositoryService;
import org.olat.resource.OLATResource;
import org.olat.resource.OLATResourceManager;
import org.olat.user.UserDataDeletable;
import org.olat.util.logging.activity.LoggingResourceable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -135,7 +136,7 @@ import com.thoughtworks.xstream.XStream;
*
*/
@Service
public class PortfolioServiceImpl implements PortfolioService, DeletableGroupData {
public class PortfolioServiceImpl implements PortfolioService, DeletableGroupData, UserDataDeletable {
private static final OLog log = Tracing.createLoggerFor(PortfolioServiceImpl.class);
......@@ -285,6 +286,37 @@ public class PortfolioServiceImpl implements PortfolioService, DeletableGroupDat
return false;
}
@Override
public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {
List<Binder> ownedBinders = binderDao.getOwnedBinders(identity);
for(Binder ownedBinder:ownedBinders) {
OLATResource resource = ((BinderImpl)ownedBinder).getOlatResource();
if(resource != null) {
continue;// this is a template
}
List<Identity> owners = binderDao.getMembers(ownedBinder, PortfolioRoles.owner.name());
if(owners.size() == 1 && owners.get(0).getKey().equals(identity.getKey())) {
try {
deleteBinder(ownedBinder);
dbInstance.commit();
} catch (Exception e) {
log.error("Cannot delete binder: " + ownedBinder.getKey());
dbInstance.rollbackAndCloseSession();
}
}
}
List<Media> medias = mediaDao.load(identity);
for(Media media:medias) {
if(mediaDao.isUsed(media)) {
log.audit("Cannot delete media because used: " + media.getKey());
} else {
deleteMedia(media);
}
}
}
@Override
public boolean detachCourseFromBinders(RepositoryEntry entry) {
int deletedRows = binderDao.detachBinderFromRepositoryEntry(entry);
......
......@@ -255,7 +255,7 @@ public class MediaCenterController extends FormBasicController
String searchString = tableEl.getQuickSearchString();
List<String> tagNames = getSelectedTagNames();
Map<Long,MediaRow> currentMap = model.getObjects()
.stream().collect(Collectors.toMap(r -> r.getKey(), r -> r));
.stream().collect(Collectors.toMap(MediaRow::getKey, r -> r));
List<MediaLight> medias = portfolioService.searchOwnedMedias(getIdentity(), searchString, tagNames);
List<MediaRow> rows = new ArrayList<>(medias.size());
......
......@@ -26,6 +26,7 @@ import java.util.Locale;
import org.junit.Assert;
import org.junit.Test;
import org.olat.admin.user.delete.service.UserDeletionManager;
import org.olat.core.commons.persistence.DB;
import org.olat.core.commons.services.commentAndRating.manager.UserCommentsDAO;
import org.olat.core.id.Identity;
......@@ -34,13 +35,17 @@ import org.olat.core.util.resource.OresHelper;
import org.olat.modules.portfolio.Assignment;
import org.olat.modules.portfolio.AssignmentType;
import org.olat.modules.portfolio.Binder;
import org.olat.modules.portfolio.Media;
import org.olat.modules.portfolio.Page;
import org.olat.modules.portfolio.PageBody;
import org.olat.modules.portfolio.PortfolioRoles;
import org.olat.modules.portfolio.PortfolioService;
import org.olat.modules.portfolio.Section;
import org.olat.modules.portfolio.SectionRef;
import org.olat.modules.portfolio.handler.TextHandler;
import org.olat.modules.portfolio.model.AccessRights;
import org.olat.modules.portfolio.model.BinderStatistics;
import org.olat.modules.portfolio.model.MediaPart;
import org.olat.modules.portfolio.model.PageImpl;
import org.olat.modules.portfolio.model.SectionImpl;
import org.olat.modules.portfolio.model.SynchedBinder;
......@@ -65,6 +70,8 @@ public class PortfolioServiceTest extends OlatTestCase {
@Autowired
private PageDAO pageDao;
@Autowired
private MediaDAO mediaDao;
@Autowired
private BinderDAO binderDao;
@Autowired
private AssignmentDAO assignmentDao;
......@@ -74,6 +81,8 @@ public class PortfolioServiceTest extends OlatTestCase {
private PortfolioService portfolioService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private UserDeletionManager userDeletionManager;
@Test
public void createNewOwnedPorfolio() {
......@@ -1131,5 +1140,67 @@ public class PortfolioServiceTest extends OlatTestCase {
Assert.assertTrue(deletedPages.isEmpty());
}
/**
* Check if the delete user method do its job.
*
*/
@Test
public void deleteUser() {
Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("port-u-21");
RepositoryEntry templateEntry = createTemplate(owner, "Template", "TE");
dbInstance.commitAndCloseSession();
// the user make a template
Binder templateBinder = portfolioService.getBinderByResource(templateEntry.getOlatResource());
SectionRef templateSectionRef = portfolioService.appendNewSection("1. section ", "Section 1", null, null, templateBinder);
dbInstance.commit();
Section templateSection = portfolioService.getSection(templateSectionRef);
Assignment assignment = portfolioService.addAssignment("1 Assignment", "", "", AssignmentType.essay, templateSection, false, false, false, null);
Assert.assertNotNull(assignment);
dbInstance.commit();
// the user use the template
Binder binder = portfolioService.assignBinder(owner, templateBinder, templateEntry, null, null);
SynchedBinder synchedBinder = portfolioService.loadAndSyncBinder(binder);
binder = synchedBinder.getBinder();
dbInstance.commitAndCloseSession();
// add a media to a page
Section reloadedSection = portfolioService.getSections(binder).get(0);
Page page = pageDao.createAndPersist("Page 1", "A page with content.", null, null, true, reloadedSection, null);
Media media = mediaDao.createMedia("To delete", "Binder", "A media to delete promptly", TextHandler.TEXT_MEDIA, "[Media:0]", null, 10, owner);
dbInstance.commitAndCloseSession();
MediaPart mediaPart = new MediaPart();
mediaPart.setMedia(media);
PageBody reloadedBody = pageDao.loadPageBodyByKey(page.getBody().getKey());
pageDao.persistPart(reloadedBody, mediaPart);
dbInstance.commitAndCloseSession();
// add some markers
Identity permanentUser = JunitTestHelper.createAndPersistIdentityAsRndUser("port-u-22");
Media permanentMedia = mediaDao.createMedia("Permanent", "Binder", "A media to stay", TextHandler.TEXT_MEDIA, "[Media:0]", null, 10, permanentUser);
Binder permanentBinder = portfolioService.assignBinder(permanentUser, templateBinder, templateEntry, null, null);
dbInstance.commitAndCloseSession();
// delete the user
userDeletionManager.deleteIdentity(owner);
// the template is a learn ressource and will not be deleted
Binder reloadedtemplateBinder = portfolioService.getBinderByKey(templateBinder.getKey());
Assert.assertNotNull(reloadedtemplateBinder);
// the binder
Binder deletedBinder = portfolioService.getBinderByKey(binder.getKey());
Assert.assertNull(deletedBinder);
// the media
Media deletedMedia = portfolioService.getMediaByKey(media.getKey());
Assert.assertNull(deletedMedia);
// check that the method doesn't delete stuff of other users
Binder reloadedPermanentBinder = portfolioService.getBinderByKey(permanentBinder.getKey());
Assert.assertNotNull(reloadedPermanentBinder);
// the media
Media reloadedPermanentMedia = portfolioService.getMediaByKey(permanentMedia.getKey());
Assert.assertNotNull(reloadedPermanentMedia);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment