From 7292bafa714a93c49d6864a147303c08c3ccc4eb Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Thu, 14 May 2015 09:25:54 +1000 Subject: [PATCH 1/8] rhbz1082840 - delete version and project --- docs/release-notes.md | 3 + .../java/org/zanata/model/SlugEntityBase.java | 34 ++++++++++- .../org/zanata/model/SlugEntityBaseTest.java | 26 ++++++++ .../java/org/zanata/action/ProjectAction.java | 4 +- .../java/org/zanata/action/ProjectHome.java | 42 ++++++++++--- .../org/zanata/action/ProjectHomeAction.java | 8 +-- .../java/org/zanata/action/VersionHome.java | 59 +++++++++++++++---- .../zanata/security/SecurityFunctions.java | 8 +-- .../src/main/resources/messages.properties | 14 ++--- .../layout/delete_confirmation_modal.xhtml | 38 ++++++++++++ .../WEB-INF/layout/project/settings-tab.xhtml | 30 ++++------ .../WEB-INF/layout/version/settings-tab.xhtml | 30 +++------- zanata-war/src/main/webapp/project/home.xhtml | 17 ------ 13 files changed, 215 insertions(+), 98 deletions(-) create mode 100644 zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml diff --git a/docs/release-notes.md b/docs/release-notes.md index a060c74267..bea7c20b72 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -47,6 +47,9 @@ Example usage in html file: `pahuang@redhat.com */ public class SlugEntityBaseTest { + + private static final String DELETED_SUFFIX = "_.-1234567890"; + @NoArgsConstructor static class SlugClass extends SlugEntityBase { public SlugClass(String slug) { super(slug); } + + @Override + protected String deletedSlugSuffix() { + return DELETED_SUFFIX; + } } @Test @@ -59,4 +68,21 @@ public void lombokToStringAndEqualsTest() { assertThat(entity.hashCode(), equalTo(other.hashCode())); } + + @Test + public void changeToDeletedSlug() { + SlugEntityBase slugEntityBase = new SlugClass("abc"); + String newSlug = slugEntityBase.changeToDeletedSlug(); + Assertions.assertThat(newSlug).isEqualTo("abc" + DELETED_SUFFIX); + } + + @Test + public void canChangeToDeletedSlugWithSuffixInPlaceIfOldSlugIsTooLong() { + // 36 characters long + SlugEntityBase slugEntityBase = new SlugClass("abcdefghijklmnopqrstuvwxyz1234567890"); + String newSlug = slugEntityBase.changeToDeletedSlug(); + Assertions.assertThat(newSlug) + .isEqualTo("abcdefghijklmnopqrstuvwxyz1" + DELETED_SUFFIX) + .hasSize(40); + } } diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectAction.java b/zanata-war/src/main/java/org/zanata/action/ProjectAction.java index 181870b2a7..df14f2a992 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectAction.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectAction.java @@ -60,12 +60,10 @@ public DataModel getProjectPagedListDataModel() { } public boolean isShowObsolete() { - return showObsolete; + return false; } public void setShowObsolete(boolean showObsolete) { - projectPagedListDataModel.setFilterObsolete(!showObsolete); - this.showObsolete = showObsolete; } public boolean isShowActive() { diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java index 2a88cc0675..21ed1148f1 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java @@ -51,7 +51,9 @@ import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Transactional; import org.jboss.seam.annotations.security.Restrict; +import org.jboss.seam.faces.FacesManager; import org.jboss.seam.security.management.JpaIdentityStore; +import org.zanata.ApplicationConfiguration; import org.zanata.common.EntityStatus; import org.zanata.common.LocaleId; import org.zanata.common.ProjectType; @@ -154,6 +156,9 @@ public class ProjectHome extends SlugHome implements @In private CopyTransOptionsModel copyTransOptionsModel; + @In + private ApplicationConfiguration applicationConfiguration; + // This property is present to keep the filter in place when the region with // the filter box is refreshed. @Getter @@ -626,10 +631,23 @@ protected HProject loadInstance() { if (projectId == null) { HProject project = (HProject) session.byNaturalId(HProject.class) .using("slug", getSlug()).load(); + validateProjectState(project); projectId = project.getId(); return project; } else { - return (HProject) session.byId(HProject.class).load(projectId); + HProject project = + (HProject) session.byId(HProject.class).load(projectId); + validateProjectState(project); + return project; + } + } + + private void validateProjectState(HProject project) { + if (project == null || project.getStatus() == EntityStatus.OBSOLETE) { + log.warn( + "Project [id={}, slug={}], does not exist or is soft deleted: {}", + projectId, slug, project); + throw new EntityNotFoundException(); } } @@ -639,8 +657,7 @@ public void validateSuppliedId() { // when id is invalid and conversation will not // start - if (ip.getStatus().equals(EntityStatus.OBSOLETE) - && !checkViewObsolete()) { + if (ip.getStatus().equals(EntityStatus.OBSOLETE)) { throw new EntityNotFoundException(); } } @@ -717,7 +734,21 @@ public String update() { return null; } getInstance().setSlug(getInputSlugValue()); + + boolean softDeleted = false; + if (getInstance().getStatus() == EntityStatus.OBSOLETE) { + softDeleted = true; + getInstance().setSlug(getInstance().changeToDeletedSlug()); + } + String result = super.update(); + + if (softDeleted) { + String url = applicationConfiguration + .getServerPath() + "/dashboard/"; + FacesManager.instance().redirectToExternalURL(url); + return result; + } if (!slug.equals(getInstance().getSlug())) { slug = getInstance().getSlug(); return "projectSlugUpdated"; @@ -876,10 +907,7 @@ private List fetchVersions() { List results = new ArrayList(); for (HProjectIteration iteration : getInstance().getProjectIterations()) { - if (iteration.getStatus() == EntityStatus.OBSOLETE - && checkViewObsolete()) { - results.add(iteration); - } else if (iteration.getStatus() != EntityStatus.OBSOLETE) { + if (iteration.getStatus() != EntityStatus.OBSOLETE) { results.add(iteration); } } diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectHomeAction.java b/zanata-war/src/main/java/org/zanata/action/ProjectHomeAction.java index 87e5189b71..c7d77b5861 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectHomeAction.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectHomeAction.java @@ -394,12 +394,8 @@ public List getProjectVersions() { ProjectDAO projectDAO = ServiceLocator.instance().getInstance(ProjectDAO.class); if (projectVersions == null) { - if (isUserAllowViewObsolete()) { - projectVersions = projectDAO.getAllIterations(slug); - } else { - projectVersions = projectDAO.getActiveIterations(slug); - projectVersions.addAll(projectDAO.getReadOnlyIterations(slug)); - } + projectVersions = projectDAO.getActiveIterations(slug); + projectVersions.addAll(projectDAO.getReadOnlyIterations(slug)); Collections.sort(projectVersions, ComparatorUtil.VERSION_CREATION_DATE_COMPARATOR); diff --git a/zanata-war/src/main/java/org/zanata/action/VersionHome.java b/zanata-war/src/main/java/org/zanata/action/VersionHome.java index 0be7816ad9..261aa03b99 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionHome.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionHome.java @@ -42,7 +42,8 @@ import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.security.Restrict; -import org.jboss.seam.international.StatusMessage; +import org.jboss.seam.faces.FacesManager; +import org.zanata.ApplicationConfiguration; import org.zanata.common.DocumentType; import org.zanata.common.EntityStatus; import org.zanata.common.LocaleId; @@ -50,7 +51,6 @@ import org.zanata.dao.ProjectDAO; import org.zanata.dao.ProjectIterationDAO; import org.zanata.dao.LocaleDAO; -import org.zanata.events.ProjectIterationUpdate; import org.zanata.i18n.Messages; import org.zanata.model.HLocale; import org.zanata.model.HProject; @@ -61,19 +61,15 @@ import org.zanata.service.SlugEntityService; import org.zanata.service.ValidationService; import org.zanata.service.impl.LocaleServiceImpl; -import org.zanata.transformer.Transformer; import org.zanata.ui.faces.FacesMessages; import org.zanata.util.ComparatorUtil; -import org.zanata.util.Event; import org.zanata.webtrans.shared.model.ValidationAction; import org.zanata.webtrans.shared.model.ValidationId; import org.zanata.webtrans.shared.validation.ValidationFactory; -import javax.annotation.Nullable; import javax.faces.application.FacesMessage; import javax.faces.event.ValueChangeEvent; import javax.persistence.EntityNotFoundException; -import javax.swing.text.Document; import java.io.Serializable; import java.util.Arrays; import java.util.Collection; @@ -138,8 +134,8 @@ public class VersionHome extends SlugHome implements @In private CopyVersionManager copyVersionManager; - @In("event") - private Event projectIterationUpdateEvent; + @In + private ApplicationConfiguration applicationConfiguration; private Map availableValidations = Maps .newHashMap(); @@ -247,11 +243,25 @@ protected HProjectIteration loadInstance() { .byNaturalId(HProjectIteration.class) .using("slug", getSlug()) .using("project", projectDAO.getBySlug(projectSlug)).load(); + validateIterationState(iteration); versionId = iteration.getId(); return iteration; } else { - return (HProjectIteration) session.load(HProjectIteration.class, - versionId); + HProjectIteration iteration = + (HProjectIteration) session.load(HProjectIteration.class, + versionId); + validateIterationState(iteration); + return iteration; + } + } + + private void validateIterationState(HProjectIteration iteration) { + if (iteration == null + || iteration.getStatus() == EntityStatus.OBSOLETE) { + log.warn( + "Project version [id={}, slug={}], does not exist or is soft deleted: {}", + versionId, slug, iteration); + throw new EntityNotFoundException(); } } @@ -457,11 +467,31 @@ public String update() { return null; } getInstance().setSlug(getInputSlugValue()); + + boolean softDeleted = false; + if (getInstance().getStatus() == EntityStatus.OBSOLETE) { + // if we offer delete in REST, we need to move this to hibernate listener + String newSlug = getInstance().changeToDeletedSlug(); + getInstance().setSlug(newSlug); + + softDeleted = true; + } + String state = super.update(); + + if (softDeleted) { + // TODO CDI this url will need to be looked at in CDI migration + String url = applicationConfiguration + .getServerPath() + "/project/project.seam?slug=" + projectSlug; + FacesManager.instance().redirectToExternalURL(url); + return state; + } + if (!slug.equals(getInstance().getSlug())) { slug = getInstance().getSlug(); return "versionSlugUpdated"; } + return state; } @@ -472,11 +502,14 @@ protected void updatedMessage() { @Restrict("#{s:hasPermission(versionHome.instance, 'update')}") public void updateStatus(char initial) { + String message = msgs.format("jsf.iteration.status.updated", + EntityStatus.valueOf(initial)); getInstance().setStatus(EntityStatus.valueOf(initial)); + if (getInstance().getStatus() == EntityStatus.OBSOLETE) { + message = msgs.get("jsf.iteration.deleted"); + } update(); - conversationScopeMessages.setMessage(FacesMessage.SEVERITY_INFO, - msgs.format("jsf.iteration.status.updated", - EntityStatus.valueOf(initial))); + facesMessages.addGlobal(FacesMessage.SEVERITY_INFO, message); } public void updateSelectedProjectType(ValueChangeEvent e) { diff --git a/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java b/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java index 1ed7181b42..853af01ee2 100644 --- a/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java +++ b/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java @@ -304,17 +304,17 @@ public static boolean canViewObsoleteProjectIteration( * Mark Project and Project Iteration obsolete rules **************************************************************************/ - // Only admin can archive projects + // Project maintainer can archive/delete projects @GrantsPermission(actions = "mark-obsolete") public static boolean canArchiveProject(HProject project) { - return getIdentity().hasRole("admin"); + return isProjectMaintainer(project); } - // Only admin can archive project iterations + // Project maintainer can archive/delete project iterations @GrantsPermission(actions = "mark-obsolete") public static boolean canArchiveProjectIteration( HProjectIteration projectIteration) { - return getIdentity().hasRole("admin"); + return isProjectMaintainer(projectIteration.getProject()); } /*************************************************************************** diff --git a/zanata-war/src/main/resources/messages.properties b/zanata-war/src/main/resources/messages.properties index bd70bb7c6a..cffce392a1 100644 --- a/zanata-war/src/main/resources/messages.properties +++ b/zanata-war/src/main/resources/messages.properties @@ -274,11 +274,12 @@ jsf.Off=Off jsf.ValidationStateHelpOff=Validation disabled by default in editor. Translator is able to enable/disable the validation. No restriction on saving translation. jsf.ValidationStateHelpWarning=Validation enabled by default in editor. Translator is able to enable/disable the validation. No restriction on saving translation. jsf.ValidationStateHelpError=Validation enabled and locked in editor. Translations with validation error can only be saved as fuzzy. -jsf.ArchiveThisProject=Archive this project -jsf.UnArchiveThisProject=Unarchive this project +jsf.DeleteThisProject=Delete this project +jsf.DeleteConfirmation=Are you sure you want to delete this? +jsf.DeleteConfirmation.Message=This will be a permanent delete. You will no longer have access to it. jsf.project.readonly=Make this project read only jsf.project.writable=Make this project writable -jsf.ArchiveProject.Message=This will disable this project and remove it from the public projects list. You will still be able to access it and unarchive it later. +jsf.DeleteProject.Message=This will disable this project and remove it from the public projects list. You will still not be able to access it any more. jsf.UnarchiveProject.Message=This will set the project's status to active and make it visible in the public projects list. jsf.project.readonly.Message=Read only prevents translations being entered. Your project will still be viewable by the public but no new translations can be added. jsf.project.writable.Message=Your project will be viewable by the public and new translations can be added. @@ -411,15 +412,14 @@ jsf.iteration.CopyTrans.Help.reject=Skip the translation and do not copy it. jsf.iteration.CopyTrans.Action.downgradeToFuzzy=Continue as Fuzzy jsf.iteration.CopyTrans.Help.downgradeToFuzzy=The translation is still considered for reuse, but it will be reused as fuzzy. Subsequent conditions will be checked. jsf.iteration.VersionSettings=Version Settings -jsf.iteration.ArchiveThisVersion=Archive this version -jsf.iteration.UnArchiveThisVersion=Unarchive this version +jsf.iteration.DeleteThisVersion=Delete this version jsf.iteration.readonly=Make this version read only jsf.iteration.writable=Make this version writable -jsf.iteration.archive.Message=This will disable this version and remove it from the public projects list, you will still be able to access it and unarchive it later. -jsf.iteration.unarchive.Message=This will set the version's status to active and make it visible in the public projects list. +jsf.iteration.delete.Message=This will delete this version and remove it from the public projects list. jsf.iteration.readonly.Message=Read only prevents translations being entered. This version will still be viewable by the public but no new translations can be added. jsf.iteration.writable.Message=This version will be viewable by the public and new translations can be added. jsf.iteration.status.updated=Updated version status "{0}". +jsf.iteration.deleted=Version deleted. jsf.iteration.LanguageRemoved=Language "{0}" has been removed from version. jsf.iteration.LanguageAdded=Language "{0}" has been added to version. jsf.iteration.requireReview.enabled=Enabled translation review diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml new file mode 100644 index 0000000000..f94d1e7e2b --- /dev/null +++ b/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/project/settings-tab.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/project/settings-tab.xhtml index 5a6060e1f8..b1a9429e28 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/project/settings-tab.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/project/settings-tab.xhtml @@ -74,6 +74,8 @@ + +

#{msgs['jsf.project.ProjectSettings']}

@@ -219,27 +221,16 @@ - - - - #{msgs['jsf.UnArchiveThisProject']} - - -

#{msgs['jsf.UnarchiveProject.Message']}

-
- - - #{msgs['jsf.ArchiveThisProject']} - - -

#{msgs['jsf.ArchiveProject.Message']}

+ + #{msgs['jsf.DeleteThisProject']} + + + +

#{msgs['jsf.DeleteProject.Message']}

@@ -509,4 +500,5 @@ + diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/version/settings-tab.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/version/settings-tab.xhtml index 5c745f6e14..47da79103b 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/version/settings-tab.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/version/settings-tab.xhtml @@ -46,6 +46,8 @@ + +

#{msgs['jsf.iteration.VersionSettings']}

@@ -141,30 +143,15 @@ - - - - #{msgs['jsf.iteration.UnArchiveThisVersion']} - - -

#{msgs['jsf.iteration.unarchive.Message']}

-
- - - #{msgs['jsf.iteration.ArchiveThisVersion']} - - + + #{msgs['jsf.iteration.DeleteThisVersion']} + +

#{msgs['jsf.iteration.archive.Message']}

+ class="txt--meta">#{msgs['jsf.iteration.delete.Message']}

@@ -379,4 +366,5 @@ + diff --git a/zanata-war/src/main/webapp/project/home.xhtml b/zanata-war/src/main/webapp/project/home.xhtml index ea863a4a10..3d13e9fe73 100644 --- a/zanata-war/src/main/webapp/project/home.xhtml +++ b/zanata-war/src/main/webapp/project/home.xhtml @@ -91,17 +91,6 @@ - - - - - - - -
@@ -124,12 +113,6 @@ rendered="#{project.status == 'READONLY'}"> - - - #{msgs['jsf.Description']} From df6ce292c7bb59f7cc6c661092f8d4324359110b Mon Sep 17 00:00:00 2001 From: Damian Jansen Date: Thu, 14 May 2015 15:41:29 +1000 Subject: [PATCH 2/8] Update functional tests for project deletion --- .../zanata/page/projects/ProjectsPage.java | 1 + .../projectsettings/ProjectGeneralTab.java | 30 +++++++------- .../project/EditProjectGeneralTest.java | 4 -- .../project/SetProjectVisibilityTest.java | 41 ++----------------- .../feature/search/ProjectSearchTest.java | 7 ++-- .../layout/delete_confirmation_modal.xhtml | 4 +- 6 files changed, 27 insertions(+), 60 deletions(-) diff --git a/functional-test/src/main/java/org/zanata/page/projects/ProjectsPage.java b/functional-test/src/main/java/org/zanata/page/projects/ProjectsPage.java index b81eac805b..94edfab844 100644 --- a/functional-test/src/main/java/org/zanata/page/projects/ProjectsPage.java +++ b/functional-test/src/main/java/org/zanata/page/projects/ProjectsPage.java @@ -126,6 +126,7 @@ public ProjectsPage setReadOnlyFilterEnabled(final boolean enabled) { return new ProjectsPage(getDriver()); } + @Deprecated public ProjectsPage setArchivedFilterEnabled(boolean enabled) { log.info("Click to set Archived filter enabled to {}", enabled); WebElement archivedCheckbox = readyElement(archivedCheckBox); diff --git a/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectGeneralTab.java b/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectGeneralTab.java index ed9135a2b4..d8a163308b 100644 --- a/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectGeneralTab.java +++ b/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectGeneralTab.java @@ -24,6 +24,7 @@ import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.zanata.page.dashboard.DashboardBasePage; import org.zanata.page.projects.ProjectBasePage; import java.util.HashMap; @@ -44,8 +45,9 @@ public class ProjectGeneralTab extends ProjectBasePage { private By projectTypeList = By.id("project-types"); private By homepageField = By.id("settings-general-form:homePageField:homePage"); private By repoField = By.id("settings-general-form:repoField:repo"); - private By archiveButton = By.id("settings-general-form:button-archive-project"); - private By unarchiveButton = By.id("settings-general-form:button-unarchive-project"); + private By deleteButton = By.id("button-archive-project"); + private By confirmDeleteButton = By.id("deleteButton"); + private By cancelDeleteButton = By.id("cancelDelete"); private By lockProjectButton = By.id("settings-general-form:button-lock-project"); private By unlockProjectButton = By.id("settings-general-form:button-unlock-project"); private By updateButton = By.id("settings-general-form:button-update-settings"); @@ -157,28 +159,28 @@ private Map getProjectTypes() { * Only Administrators can use this feature. * @return button available true/false */ - public boolean isArchiveButtonAvailable() { + public boolean isDeleteButtonAvailable() { log.info("Query is Archive button displayed"); - return getDriver().findElements(archiveButton).size() > 0; + return getDriver().findElements(deleteButton).size() > 0; } /** - * Press the "Archive this project" button - * @return new Project General Settings page + * Press the "Delete this project" button + * @return new Dashboard page */ - public ProjectGeneralTab archiveProject() { - log.info("Click Archive this project"); - clickElement(archiveButton); + public ProjectGeneralTab deleteProject() { + log.info("Click Delete this project"); + clickElement(deleteButton); return new ProjectGeneralTab(getDriver()); } /** - * Press the "Unarchive this project" button - * @return new Project General Settings page + * Confirm project delete + * @return new Dashboard page */ - public ProjectGeneralTab unarchiveProject() { - log.info("Click Unarchive this project"); - clickElement(unarchiveButton); + public ProjectGeneralTab confirmDeleteProject() { + log.info("Click confirm Delete"); + clickElement(confirmDeleteButton); return new ProjectGeneralTab(getDriver()); } diff --git a/functional-test/src/test/java/org/zanata/feature/project/EditProjectGeneralTest.java b/functional-test/src/test/java/org/zanata/feature/project/EditProjectGeneralTest.java index c096a44456..2abe50b543 100644 --- a/functional-test/src/test/java/org/zanata/feature/project/EditProjectGeneralTest.java +++ b/functional-test/src/test/java/org/zanata/feature/project/EditProjectGeneralTest.java @@ -71,7 +71,6 @@ public void setAProjectToReadOnly() throws Exception { .goToProjects() .setActiveFilterEnabled(true) .setReadOnlyFilterEnabled(false) - .setArchivedFilterEnabled(false) .expectProjectNotVisible("about fedora"); assertThat(projectsPage.getProjectNamesOnCurrentPage()) @@ -80,7 +79,6 @@ public void setAProjectToReadOnly() throws Exception { projectsPage = projectsPage.setActiveFilterEnabled(false) .setReadOnlyFilterEnabled(true) - .setArchivedFilterEnabled(false) .expectProjectVisible("about fedora"); assertThat(projectsPage.getProjectNamesOnCurrentPage()) @@ -102,7 +100,6 @@ public void setAProjectToWritable() throws Exception { .setActiveFilterEnabled(false) .setReadOnlyFilterEnabled(true) .expectProjectVisible("about fedora") - .setArchivedFilterEnabled(false) .getProjectNamesOnCurrentPage()) .contains("about fedora") .as("The project is locked"); @@ -117,7 +114,6 @@ public void setAProjectToWritable() throws Exception { .goToProjects() .setActiveFilterEnabled(true) .setReadOnlyFilterEnabled(false) - .setArchivedFilterEnabled(false) .expectProjectVisible("about fedora"); assertThat(projectsPage.getProjectNamesOnCurrentPage()) diff --git a/functional-test/src/test/java/org/zanata/feature/project/SetProjectVisibilityTest.java b/functional-test/src/test/java/org/zanata/feature/project/SetProjectVisibilityTest.java index 6ef0a807ea..731ba5701f 100644 --- a/functional-test/src/test/java/org/zanata/feature/project/SetProjectVisibilityTest.java +++ b/functional-test/src/test/java/org/zanata/feature/project/SetProjectVisibilityTest.java @@ -27,14 +27,15 @@ public class SetProjectVisibilityTest extends ZanataTestCase { @Feature(summary = "The administrator can set a project to archived", tcmsTestPlanIds = 5316, tcmsTestCaseIds = 135846) @Test(timeout = ZanataTestCase.MAX_SHORT_TEST_DURATION) - public void setAProjectArchived() throws Exception { + public void deleteAProject() throws Exception { ProjectsPage projectsPage = new LoginWorkFlow() .signIn("admin", "admin") .goToProjects() .goToProject("about fedora") .gotoSettingsTab() .gotoSettingsGeneral() - .archiveProject() + .deleteProject() + .confirmDeleteProject() .goToProjects(); assertThat(projectsPage.getProjectNamesOnCurrentPage()) @@ -42,8 +43,7 @@ public void setAProjectArchived() throws Exception { .as("The project is not displayed"); projectsPage = projectsPage.setActiveFilterEnabled(false) - .setReadOnlyFilterEnabled(false) - .setArchivedFilterEnabled(true); + .setReadOnlyFilterEnabled(false); projectsPage.expectProjectVisible("about fedora"); @@ -61,37 +61,4 @@ public void setAProjectArchived() throws Exception { .as("User cannot navigate to the archived project"); } - @Feature(summary = "The administrator can set an archived project " + - "to active", - tcmsTestPlanIds = 5316, tcmsTestCaseIds = 0) - @Test(timeout = ZanataTestCase.MAX_SHORT_TEST_DURATION) - public void setAnArchivedProjectAsActive() throws Exception { - ProjectGeneralTab projectGeneralTab = new LoginWorkFlow() - .signIn("admin", "admin") - .goToProjects() - .goToProject("about fedora") - .gotoSettingsTab() - .gotoSettingsGeneral() - .archiveProject() - .goToProjects() - .setArchivedFilterEnabled(true) - .goToProject("about fedora") - .gotoSettingsTab() - .gotoSettingsGeneral() - .unarchiveProject(); - - assertThat(projectGeneralTab.isArchiveButtonAvailable()) - .isTrue() - .as("The archive button is now available"); - - projectGeneralTab.logout(); - - assertThat(new LoginWorkFlow() - .signIn("translator", "translator") - .goToProjects() - .goToProject("about fedora") - .getProjectName()) - .isEqualTo("about fedora") - .as("Translator can view the project"); - } } diff --git a/functional-test/src/test/java/org/zanata/feature/search/ProjectSearchTest.java b/functional-test/src/test/java/org/zanata/feature/search/ProjectSearchTest.java index 28937b9dc0..ba03a77e44 100644 --- a/functional-test/src/test/java/org/zanata/feature/search/ProjectSearchTest.java +++ b/functional-test/src/test/java/org/zanata/feature/search/ProjectSearchTest.java @@ -83,16 +83,17 @@ public void unsuccessfulProjectSearch() throws Exception { .as("No projects are displayed"); } - @Feature(summary = "The user cannot search for Archived projects", + @Feature(summary = "The user cannot search for Deleted projects", tcmsTestPlanIds = 5316, tcmsTestCaseIds = 0) @Test(timeout = ZanataTestCase.MAX_SHORT_TEST_DURATION) - public void normalUserCannotSearchArchived() throws Exception { + public void userCannotSearchDeleteProject() throws Exception { new LoginWorkFlow().signIn("admin", "admin") .goToProjects() .goToProject("about fedora") .gotoSettingsTab() .gotoSettingsGeneral() - .archiveProject() + .deleteProject() + .confirmDeleteProject() .logout(); BasePage basePage = new BasicWorkFlow() diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml index f94d1e7e2b..1c2f4ba1b8 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml @@ -24,10 +24,10 @@
- -
From 0d56ed3eaf8a522e84eec2a2b9613245f607b6cf Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Tue, 19 May 2015 13:34:50 +1000 Subject: [PATCH 3/8] rhbz1082840 - fix issues in copy version and search deleted version --- .../src/main/java/org/zanata/action/ProjectSearch.java | 9 ++------- .../zanata/action/QueryProjectPagedListDataModel.java | 5 ++--- .../src/main/java/org/zanata/action/VersionHome.java | 3 ++- .../WEB-INF/layout/delete_confirmation_modal.xhtml | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java b/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java index 346ffc6497..bff634eecc 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectSearch.java @@ -39,9 +39,6 @@ public class ProjectSearch implements Serializable { private final static int DEFAULT_PAGE_SIZE = 30; - @In - private ZanataIdentity identity; - @Getter private ProjectAutocomplete projectAutocomplete = new ProjectAutocomplete(); @@ -52,8 +49,6 @@ public class ProjectSearch implements Serializable { private final static int INITIAL_RESULT_COUNT = 5; public DataModel getProjectPagedListDataModel() { - queryProjectPagedListDataModel.setIncludeObsolete(identity - .hasPermission("HProject", "view-obsolete")); return queryProjectPagedListDataModel; } @@ -94,13 +89,13 @@ public List suggest() { } try { String searchQuery = getQuery().trim(); + boolean includeObsolete = false; List searchResult = projectDAO.searchProjects( searchQuery, INITIAL_RESULT_COUNT, 0, - ZanataIdentity.instance().hasPermission( - "HProject", "view-obsolete")); + includeObsolete); for (HProject project : searchResult) { result.add(new SearchResult(project, null)); diff --git a/zanata-war/src/main/java/org/zanata/action/QueryProjectPagedListDataModel.java b/zanata-war/src/main/java/org/zanata/action/QueryProjectPagedListDataModel.java index 5e9e1ecd8c..2f9b386f32 100644 --- a/zanata-war/src/main/java/org/zanata/action/QueryProjectPagedListDataModel.java +++ b/zanata-war/src/main/java/org/zanata/action/QueryProjectPagedListDataModel.java @@ -39,8 +39,7 @@ public class QueryProjectPagedListDataModel extends PagedListDataModel implements Serializable { private static final long serialVersionUID = 1L; - @Setter - private boolean includeObsolete; + private final boolean includeObsolete = false; @Setter @Getter @@ -63,7 +62,7 @@ public DataPage fetchPage(int startRow, int pageSize) { int projectSize = projectDAO.getQueryProjectSize(query, includeObsolete); - return new DataPage(projectSize, startRow, proj); + return new DataPage<>(projectSize, startRow, proj); } catch (ParseException e) { return null; diff --git a/zanata-war/src/main/java/org/zanata/action/VersionHome.java b/zanata-war/src/main/java/org/zanata/action/VersionHome.java index 261aa03b99..7aa1f2cb05 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionHome.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionHome.java @@ -355,7 +355,7 @@ public boolean isSlugAvailable(String slug) { } public String createVersion() { - if (!validateSlug(getInstance().getSlug(), "slug")) + if (!validateSlug(inputSlugValue, "slug")) return "invalid-slug"; if (copyFromVersion) { @@ -368,6 +368,7 @@ public String createVersion() { public void copyVersion() { getInstance().setStatus(EntityStatus.READONLY); + getInstance().setSlug(inputSlugValue); // create basic version here HProject project = getProject(); diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml index 1c2f4ba1b8..357d01e1a7 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/delete_confirmation_modal.xhtml @@ -24,7 +24,7 @@
- +