From 32cf21550509986ce63476e44295784d32b17b3e Mon Sep 17 00:00:00 2001 From: Sean Flanigan Date: Thu, 5 Feb 2015 13:45:33 +1000 Subject: [PATCH 01/22] Fix activation of functional-test profile in zanata-test-war --- zanata-test-war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zanata-test-war/pom.xml b/zanata-test-war/pom.xml index 9f803371ed..509760db97 100644 --- a/zanata-test-war/pom.xml +++ b/zanata-test-war/pom.xml @@ -134,7 +134,7 @@ run-functional-test - functional-test + !skipFuncTests From f374e740fe602175e5557460527271ed54b2fc3e Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Fri, 6 Feb 2015 11:06:56 +1000 Subject: [PATCH 02/22] Implement myTrans options when upload translation https://bugzilla.redhat.com/show_bug.cgi?id=1184299 Squashed commit of the following: commit 573fc4182e8113a9d98923fe0b64d7e1ad8697f3 Author: Alex Eng Date: Fri Feb 6 07:12:00 2015 +1000 Fix unit test commit 31a614edb0eda39858bf3094592b26c8c994adc1 Author: Alex Eng Date: Thu Feb 5 15:17:04 2015 +1000 Update zanata-api version to 3.7.0-SNAPSHOT commit 5e6d63127c3dea1ef379c72dba88ca664783a61c Author: Alex Eng Date: Thu Feb 5 14:07:42 2015 +1000 Fix test for pushing translations commit 15bdc2efbdc65a9e06e54fdd5f6bae72f99e81b4 Merge: ebd1d43 b4b3c38 Author: Alex Eng Date: Thu Feb 5 11:30:43 2015 +1000 Merge branch 'integration/master' into rhbz1184299 Conflicts: zanata-war/src/main/webapp/WEB-INF/layout/language/language_view.xhtml commit ebd1d43ede7ca44611c1110cc31c6f1d801c233d Author: Alex Eng Date: Mon Feb 2 12:55:41 2015 +1000 Fix unit test commit dffc9aefc4f0aae823effb76e2ac15ed19f1fb41 Merge: 5abeaad cc96b2f Author: Alex Eng Date: Fri Jan 30 12:12:20 2015 +1000 Merge branch 'integration/master' into rhbz1184299 commit 5abeaad65f116fccb19423a7a6eeb1df9f6eeaaa Author: Alex Eng Date: Wed Jan 28 15:56:13 2015 +1000 Implement myTrans options when upload translation https://bugzilla.redhat.com/show_bug.cgi?id=1184299 --- .../zanata/feature/rest/CopyTransTest.java | 10 +- .../org/zanata/util/ZanataRestCaller.java | 5 +- pom.xml | 2 +- .../action/ProjectIterationZipFileAction.java | 17 ++- .../org/zanata/action/VersionHomeAction.java | 23 +-- .../file/TranslationDocumentUpload.java | 6 +- .../AsynchronousProcessResourceService.java | 6 +- .../org/zanata/rest/service/FileService.java | 6 +- .../service/TranslatedDocResourceService.java | 5 +- .../zanata/service/TranslationService.java | 14 +- .../service/impl/CopyVersionServiceImpl.java | 2 +- .../service/impl/TranslationServiceImpl.java | 29 ++-- .../org/zanata/servlet/FileUploadServlet.java | 5 +- .../webtrans/client/ui/FileUploadDialog.java | 9 ++ .../src/main/resources/messages.properties | 13 +- .../layout/version/documents-tab.xhtml | 21 +-- .../layout/version/languages-tab.xhtml | 134 +++--------------- .../WEB-INF/layout/version/settings-tab.xhtml | 2 +- .../version/upload_translation_modal.xhtml | 128 +++++++++++++++++ .../version/zip_download_progress_modal.xhtml | 108 ++++++++++++++ .../src/main/webapp/iteration/view.xhtml | 98 ------------- .../resources/zanata/multi-file-upload.xhtml | 19 +-- .../file/TranslationDocumentUploadTest.java | 2 +- .../TranslationsCompatibilityITCase.java | 7 +- .../TranslationsRawCompatibilityITCase.java | 6 - .../zanata/rest/service/FileServiceTest.java | 4 +- .../service/TranslationResourceRestTest.java | 10 -- ...TranslationsResourceTestObjectFactory.java | 3 - .../impl/TranslationServiceImplJpaTest.java | 2 +- 29 files changed, 386 insertions(+), 310 deletions(-) create mode 100644 zanata-war/src/main/webapp/WEB-INF/layout/version/upload_translation_modal.xhtml create mode 100644 zanata-war/src/main/webapp/WEB-INF/layout/version/zip_download_progress_modal.xhtml diff --git a/functional-test/src/test/java/org/zanata/feature/rest/CopyTransTest.java b/functional-test/src/test/java/org/zanata/feature/rest/CopyTransTest.java index 000e62cd86..d5a937fd6b 100644 --- a/functional-test/src/test/java/org/zanata/feature/rest/CopyTransTest.java +++ b/functional-test/src/test/java/org/zanata/feature/rest/CopyTransTest.java @@ -71,7 +71,7 @@ public void testPushTranslationAndCopyTrans() { } restCaller.asyncPushSource(projectSlug, iterationSlug, sourceResource, false); restCaller.asyncPushTarget(projectSlug, iterationSlug, docId, - new LocaleId("pl"), transResource, "import"); + new LocaleId("pl"), transResource, "import", false); assertThat(true, Matchers.is(true)); @@ -79,7 +79,7 @@ public void testPushTranslationAndCopyTrans() { restCaller.createProjectAndVersion(projectSlug, "2", projectType); restCaller.asyncPushSource(projectSlug, "2", sourceResource, false); restCaller.asyncPushTarget(projectSlug, "2", docId, new LocaleId("pl"), - transResource, "import"); + transResource, "import", false); // push to old version again restCaller.asyncPushSource(projectSlug, iterationSlug, sourceResource, @@ -114,7 +114,7 @@ void testPushTranslationRepeatedly() { false); LocaleId localeId = new LocaleId("pl"); restCaller.asyncPushTarget(projectSlug, iterationSlug, docId, - localeId, transResource, "auto"); + localeId, transResource, "auto", false); restCaller.runCopyTrans(projectSlug, iterationSlug, docId); assertThat(true, Matchers.is(true)); @@ -131,10 +131,10 @@ void testPushTranslationRepeatedly() { // push updated source (same resId different content) restCaller.asyncPushSource(projectSlug, iterationSlug, updatedSource, false); - restCaller.asyncPushTarget(projectSlug, iterationSlug, docId, localeId, updatedTransResource, "auto"); + restCaller.asyncPushTarget(projectSlug, iterationSlug, docId, localeId, updatedTransResource, "auto", false); // push again restCaller.asyncPushSource(projectSlug, iterationSlug, updatedSource, false); - restCaller.asyncPushTarget(projectSlug, iterationSlug, docId, localeId, updatedTransResource, "auto"); + restCaller.asyncPushTarget(projectSlug, iterationSlug, docId, localeId, updatedTransResource, "auto", false); } } diff --git a/functional-test/src/test/java/org/zanata/util/ZanataRestCaller.java b/functional-test/src/test/java/org/zanata/util/ZanataRestCaller.java index 7e82fac9ad..f8cd8d6159 100644 --- a/functional-test/src/test/java/org/zanata/util/ZanataRestCaller.java +++ b/functional-test/src/test/java/org/zanata/util/ZanataRestCaller.java @@ -285,13 +285,14 @@ private ProcessStatus waitUntilFinished( public void asyncPushTarget(String projectSlug, String iterationSlug, String docId, LocaleId localeId, TranslationsResource transResource, - String mergeType) { + String mergeType, boolean assignCreditToUploader) { IAsynchronousProcessResource resource = zanataProxyFactory.getAsynchronousProcessResource(); ProcessStatus processStatus = resource.startTranslatedDocCreationOrUpdate(docId, projectSlug, iterationSlug, localeId, transResource, - Collections.emptySet(), mergeType); + Collections.emptySet(), mergeType, + assignCreditToUploader); processStatus = waitUntilFinished(resource, processStatus); log.info("finished async translation({}-{}) push: {}", projectSlug, iterationSlug, processStatus.getStatusCode()); diff --git a/pom.xml b/pom.xml index 67b8685c0b..d625905128 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ 1.2.1 0.22 - 3.6.0-SNAPSHOT + 3.7.0-SNAPSHOT 3.3.1 3.3.1 diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectIterationZipFileAction.java b/zanata-war/src/main/java/org/zanata/action/ProjectIterationZipFileAction.java index 55beae2fdf..93597de293 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectIterationZipFileAction.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectIterationZipFileAction.java @@ -1,6 +1,7 @@ package org.zanata.action; import java.io.Serializable; +import java.text.DecimalFormat; import lombok.Getter; @@ -64,6 +65,20 @@ public void prepareIterationZipFile(boolean isPoProject, @End public void cancelFileDownload() { - zipFilePrepHandle.cancel(true); + if(zipFilePrepHandle != null) { + zipFilePrepHandle.cancel(true); + } + } + final DecimalFormat PERCENT_FORMAT = new DecimalFormat("###.##"); + + public String getCompletedPercentage() { + if(zipFilePrepHandle != null) { + double completedPercent = + (double) zipFilePrepHandle.getCurrentProgress() / (double) zipFilePrepHandle + .getMaxProgress() * 100; + + return PERCENT_FORMAT.format(completedPercent) + "%"; + } + return "0%"; } } diff --git a/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java b/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java index 124751f146..b6b5b66d8f 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java @@ -930,16 +930,17 @@ public void uploadTranslationFile(HLocale hLocale) { extensions = Collections. emptySet(); } List warnings = - translationServiceImpl - .translateAllInDoc( - projectSlug, - versionSlug, - translationFileUpload.getDocId(), - hLocale.getLocaleId(), - transRes, - extensions, - translationFileUpload.isMergeTranslations() ? MergeType.AUTO - : MergeType.IMPORT); + translationServiceImpl.translateAllInDoc( + projectSlug, + versionSlug, + translationFileUpload.getDocId(), + hLocale.getLocaleId(), + transRes, + extensions, + translationFileUpload.isMergeTranslations() ? + MergeType.AUTO + : MergeType.IMPORT, + translationFileUpload.isAssignCreditToUploader()); StringBuilder infoMsg = new StringBuilder("File ").append( @@ -1146,5 +1147,7 @@ public static class TranslationFileUploadHelper implements Serializable { private String fileName; private boolean mergeTranslations = true; // Merge by default + + private boolean assignCreditToUploader = false; } } diff --git a/zanata-war/src/main/java/org/zanata/file/TranslationDocumentUpload.java b/zanata-war/src/main/java/org/zanata/file/TranslationDocumentUpload.java index d6845458d1..e66b0eb31b 100644 --- a/zanata-war/src/main/java/org/zanata/file/TranslationDocumentUpload.java +++ b/zanata-war/src/main/java/org/zanata/file/TranslationDocumentUpload.java @@ -82,7 +82,8 @@ public class TranslationDocumentUpload { public Response tryUploadTranslationFile(GlobalDocumentId id, String localeId, - String mergeType, DocumentFileUploadForm uploadForm) { + String mergeType, boolean assignCreditToUploader, + DocumentFileUploadForm uploadForm) { try { failIfTranslationUploadNotValid(id, localeId, uploadForm); @@ -151,7 +152,8 @@ public class TranslationDocumentUpload { translationServiceImpl.translateAllInDoc( id.getProjectSlug(), id.getVersionSlug(), id.getDocId(), locale.getLocaleId(), transRes, - extensions, mergeTypeFromString(mergeType)); + extensions, mergeTypeFromString(mergeType), + assignCreditToUploader); return transUploadResponse(totalChunks, warnings); } catch (FileNotFoundException e) { diff --git a/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java b/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java index 86e4af89ab..f444dbdf9d 100644 --- a/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java +++ b/zanata-war/src/main/java/org/zanata/rest/service/AsynchronousProcessResourceService.java @@ -161,7 +161,8 @@ public ProcessStatus startTranslatedDocCreationOrUpdate( final String idNoSlash, final String projectSlug, final String iterationSlug, final LocaleId locale, final TranslationsResource translatedDoc, - final Set extensions, final String merge) { + final Set extensions, final String merge, + final boolean assignCreditToUploader) { // check security (cannot be on @Restrict as it refers to method // parameters) identity.checkPermission("modify-translation", this.localeServiceImpl @@ -182,12 +183,11 @@ public ProcessStatus startTranslatedDocCreationOrUpdate( final String id = URIHelper.convertFromDocumentURIId(idNoSlash); final MergeType finalMergeType = mergeType; - String name = "TranslatedDocCreationOrUpdate: "+projectSlug+"-"+iterationSlug+"-"+idNoSlash+"-"+locale; AsyncTaskHandle handle = new AsyncTaskHandle(); Serializable taskId = asyncTaskHandleManager.registerTaskHandle(handle); translationServiceImpl.translateAllInDocAsync(projectSlug, iterationSlug, id, locale, translatedDoc, extensions, - finalMergeType, true, handle); + finalMergeType, assignCreditToUploader, true, handle); return this.getProcessStatus(taskId.toString()); } diff --git a/zanata-war/src/main/java/org/zanata/rest/service/FileService.java b/zanata-war/src/main/java/org/zanata/rest/service/FileService.java index d2b464f725..02ffe2fcc1 100644 --- a/zanata-war/src/main/java/org/zanata/rest/service/FileService.java +++ b/zanata-war/src/main/java/org/zanata/rest/service/FileService.java @@ -120,10 +120,14 @@ public Response uploadSourceFile(String projectSlug, String iterationSlug, public Response uploadTranslationFile(String projectSlug, String iterationSlug, String localeId, String docId, String merge, DocumentFileUploadForm uploadForm) { + + //assignCreditToUploader is not supported from here + boolean assignCreditToUploader = false; + GlobalDocumentId id = new GlobalDocumentId(projectSlug, iterationSlug, docId); return translationUploader.tryUploadTranslationFile(id, localeId, - merge, uploadForm); + merge, assignCreditToUploader , uploadForm); } @Override diff --git a/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java b/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java index 6e3896895d..6812554912 100644 --- a/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java +++ b/zanata-war/src/main/java/org/zanata/rest/service/TranslatedDocResourceService.java @@ -264,11 +264,14 @@ public Response putTranslations(String idNoSlash, LocaleId locale, return response.build(); } + //assignCreditToUploader is not supported from here + boolean assignCreditToUploader = false; + // Translate List warnings = this.translationServiceImpl.translateAllInDoc(projectSlug, iterationSlug, id, locale, messageBody, extensions, - mergeType); + mergeType, assignCreditToUploader); // Regenerate etag in case it has changed etag = diff --git a/zanata-war/src/main/java/org/zanata/service/TranslationService.java b/zanata-war/src/main/java/org/zanata/service/TranslationService.java index 0243a9a971..736984c8cb 100644 --- a/zanata-war/src/main/java/org/zanata/service/TranslationService.java +++ b/zanata-war/src/main/java/org/zanata/service/TranslationService.java @@ -91,6 +91,9 @@ List revertTranslations(LocaleId localeId, * Indicates how to handle the translations. AUTO will merge the * new translations with the provided ones. IMPORT will overwrite * all existing translations with the new ones. + * @param assignCreditToUploader + * The translator field for all uploaded translations will be + * set to the user who performs the upload. * @param lock * If true, no other caller will be allowed to translate All for * the same project, iteration, document and locale. @@ -102,7 +105,7 @@ List revertTranslations(LocaleId localeId, public Future> translateAllInDocAsync(String projectSlug, String iterationSlug, String docId, LocaleId locale, TranslationsResource translations, Set extensions, - MergeType mergeType, boolean lock, + MergeType mergeType, boolean assignCreditToUploader, boolean lock, AsyncTaskHandle handle); /** @@ -124,17 +127,22 @@ public Future> translateAllInDocAsync(String projectSlug, * Indicates how to handle the translations. AUTO will merge the * new translations with the provided ones. IMPORT will overwrite * all existing translations with the new ones. + * @param assignCreditToUploader + * The translator field for all uploaded translations will be + * set to the user who performs the upload. * @return A list of warnings about text flow targets that (a) could not be * matched to any text flows in the source document or (b) whose * states don't match their contents. */ List translateAllInDoc(String projectSlug, String iterationSlug, String docId, LocaleId locale, TranslationsResource translations, - Set extensions, MergeType mergeType, AsyncTaskHandle handle); + Set extensions, MergeType mergeType, + boolean assignCreditToUploader, AsyncTaskHandle handle); List translateAllInDoc(String projectSlug, String iterationSlug, String docId, LocaleId locale, TranslationsResource translations, - Set extensions, MergeType mergeType); + Set extensions, MergeType mergeType, + boolean assignCreditToUploader); public interface TranslationResult { boolean isTranslationSuccessful(); diff --git a/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java index 03a42f234d..7327c836a2 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java @@ -362,7 +362,7 @@ JPACopier. copyBean(tft, "textFlow", for (HTextFlowTargetHistory history : tft.getHistory().values()) { HTextFlowTargetHistory newHistory = JPACopier. copyBean(history, - "textFlowTarget"); + "textFlowTarget", "content"); newHistory.setTextFlowTarget(copy); copy.getHistory().put(newHistory.getVersionNum(), newHistory); } diff --git a/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java index 18598352ab..7ffe9a8425 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/TranslationServiceImpl.java @@ -78,7 +78,6 @@ import org.zanata.rest.dto.resource.TranslationsResource; import org.zanata.rest.service.ResourceUtils; import org.zanata.security.ZanataIdentity; -import org.zanata.service.ActivityService; import org.zanata.service.LocaleService; import org.zanata.service.LockManagerService; import org.zanata.service.TranslationMergeService; @@ -502,7 +501,7 @@ private static boolean ensureContentsSize(HTextFlowTarget target, Future> translateAllInDocAsync(String projectSlug, String iterationSlug, String docId, LocaleId locale, TranslationsResource translations, Set extensions, - MergeType mergeType, boolean lock, + MergeType mergeType, boolean assignCreditToUploader, boolean lock, AsyncTaskHandle handle) { // Lock this document for push Lock transLock = null; @@ -516,7 +515,8 @@ Future> translateAllInDocAsync(String projectSlug, try { messages = this.translateAllInDoc(projectSlug, iterationSlug, docId, - locale, translations, extensions, mergeType, handle); + locale, translations, extensions, mergeType, + assignCreditToUploader, handle); } finally { if (lock) { lockManagerServiceImpl.release(transLock); @@ -564,9 +564,11 @@ private String validateTranslations(ContentState newState, public List translateAllInDoc(final String projectSlug, final String iterationSlug, final String docId, final LocaleId locale, final TranslationsResource translations, - final Set extensions, final MergeType mergeType) { + final Set extensions, final MergeType mergeType, + final boolean assignCreditToUploader) { return translateAllInDoc(projectSlug, iterationSlug, docId, locale, - translations, extensions, mergeType, null); + translations, extensions, mergeType, assignCreditToUploader, + null); } @Override @@ -574,7 +576,7 @@ public List translateAllInDoc(final String projectSlug, final String iterationSlug, final String docId, final LocaleId locale, final TranslationsResource translations, final Set extensions, final MergeType mergeType, - AsyncTaskHandle handle) { + final boolean assignCreditToUploader, AsyncTaskHandle handle) { final HProjectIteration hProjectIteration = projectIterationDAO.getBySlug(projectSlug, iterationSlug); @@ -661,6 +663,7 @@ protected Boolean work() throws Exception { work.setHandleOp(handleOp); work.setProjectIterationId(hProjectIteration.getId()); work.setBatch(batch); + work.setAssignCreditToUploader(assignCreditToUploader); changed |= work.workInTransaction(); } catch (Exception e) { throw new ZanataServiceException("Error during translation.", @@ -729,6 +732,7 @@ private final class SaveBatchWork extends Work { private Optional handleOp; private Long projectIterationId; private List batch; + private boolean assignCreditToUploader; @Override protected Boolean work() throws Exception { @@ -825,17 +829,8 @@ public String apply(TextFlowTarget input) { changed = true; Long actorId; - if (incomingTarget.getTranslator() != null) { - String email = - incomingTarget.getTranslator().getEmail(); - HPerson hPerson = personDAO.findByEmail(email); - if (hPerson == null) { - hPerson = new HPerson(); - hPerson.setEmail(email); - hPerson.setName(incomingTarget.getTranslator() - .getName()); - personDAO.makePersistent(hPerson); - } + if(assignCreditToUploader){ + HPerson hPerson = authenticatedAccount.getPerson(); hTarget.setTranslator(hPerson); hTarget.setLastModifiedBy(hPerson); actorId = hPerson.getId(); diff --git a/zanata-war/src/main/java/org/zanata/servlet/FileUploadServlet.java b/zanata-war/src/main/java/org/zanata/servlet/FileUploadServlet.java index 86acd79f12..cea0366071 100644 --- a/zanata-war/src/main/java/org/zanata/servlet/FileUploadServlet.java +++ b/zanata-war/src/main/java/org/zanata/servlet/FileUploadServlet.java @@ -149,12 +149,15 @@ private void doWork(HttpServletRequest req, HttpServletResponse resp) MergeType mergeType = Boolean.parseBoolean(params.get("merge").getString()) ? MergeType.AUTO : MergeType.IMPORT; + + boolean assignCreditToUploader = Boolean.parseBoolean( + params.get("assignCreditToUploader").getString()); List warnings = translationServiceImpl.translateAllInDoc(projectSlug, versionSlug, docId, new LocaleId(params.get("targetLocale") .getString()), transRes, extensions, - mergeType); + mergeType, assignCreditToUploader); StringBuilder response = new StringBuilder(); response.append("Status code: "); diff --git a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/FileUploadDialog.java b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/FileUploadDialog.java index b65859e115..1b5f97e39a 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/client/ui/FileUploadDialog.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/client/ui/FileUploadDialog.java @@ -25,6 +25,7 @@ public class FileUploadDialog extends DialogBox { private final FileUpload upload; private final CheckBox merge; + private final CheckBox myTranslations; private final Button cancelButton; private final Button uploadButton; private final Image loadingIcon; @@ -36,6 +37,7 @@ public class FileUploadDialog extends DialogBox { private final Hidden fileName; private final Hidden targetLocale; private final Hidden mergeTranslation; + private final Hidden assignCreditToUploader; public FileUploadDialog(Resources resources) { setText("File upload"); @@ -55,6 +57,9 @@ public FileUploadDialog(Resources resources) { merge = new CheckBox("Merge?"); merge.setValue(true); + myTranslations = new CheckBox("My translations?"); + myTranslations.setValue(false); + cancelButton = new Button("Cancel"); uploadButton = new Button("Upload"); @@ -66,6 +71,7 @@ public FileUploadDialog(Resources resources) { panel.add(new ListItemWidget(upload)); panel.add(new ListItemWidget(merge)); + panel.add(new ListItemWidget(myTranslations)); panel.add(new ListItemWidget(buttonPanel)); projectSlug = new Hidden("projectSlug"); @@ -74,6 +80,7 @@ public FileUploadDialog(Resources resources) { fileName = new Hidden("fileName"); targetLocale = new Hidden("targetLocale"); mergeTranslation = new Hidden("merge"); + assignCreditToUploader = new Hidden("assignCreditToUploader"); panel.add(projectSlug); panel.add(versionSlug); @@ -81,6 +88,7 @@ public FileUploadDialog(Resources resources) { panel.add(fileName); panel.add(targetLocale); panel.add(mergeTranslation); + panel.add(assignCreditToUploader); // Because we're going to add a FileUpload widget, we'll need to set // the @@ -122,6 +130,7 @@ public void onSubmitComplete(SubmitCompleteEvent event) { public void submitForm() { fileName.setValue(getUploadFileName()); mergeTranslation.setValue(merge.getValue().toString()); + assignCreditToUploader.setValue(myTranslations.getValue().toString()); loadingIcon.setVisible(true); form.submit(); } diff --git a/zanata-war/src/main/resources/messages.properties b/zanata-war/src/main/resources/messages.properties index b8161d559a..e852e77536 100644 --- a/zanata-war/src/main/resources/messages.properties +++ b/zanata-war/src/main/resources/messages.properties @@ -516,7 +516,9 @@ jsf.iteration.files.Filter.title=Filter by document name jsf.Upload.Label=Upload translation jsf.iteration.files.Merge=Merge jsf.iteration.files.Merge.title=When checked, current data will merge with uploaded document. Otherwise data will be overridden by uploaded document. -jsf.iteration.files.MergeCheckbox.Title=When checked, updated translations will be written, leaving all others unchanged. + +jsf.iteration.files.AssignCreditToUploader=My translations +jsf.iteration.files.AssignCreditToUploader.title=Indicates if all uploaded translations were translated by you. jsf.iteration.files.Download=Download jsf.iteration.files.dotpot=.pot @@ -530,14 +532,14 @@ jsf.iteration.files.dotofflinepo.purpose=This format is required by Zanata when jsf.iteration.files.ConfirmDocDeletion=Are you sure you want to remove this source file? jsf.iteration.files.DocumentDeleted=Document successfully deleted. -jsf.iteration.files.ProcessDlgTitle=Processing project files... +jsf.iteration.files.UpdateTranslationDocument.header=Update translations +jsf.iteration.files.UpdateTranslationDocument=Update {0} in {1} jsf.iteration.files.UpdateDocument=Update this document jsf.iteration.files.DeleteDocument=Delete this document jsf.iteration.files.DownloadDocument=Download this document [{0}] jsf.iteration.files.UploadNewSourceDocument=Upload new source document jsf.iteration.files.FilenameWithSemicolonNotSupported=Zanata does not support filenames that contain a semicolon. -jsf.SupportedUploadFormats=Supported types: .pot .dtd .txt .html .htm .odt .odp .ods .odg .idml .srt .vtt .sub .sbt jsf.SourceLanguage=Source Language jsf.iteration.files.DocumentPath=Document Path jsf.iteration.files.CustomParams=Custom Parsing Parameters @@ -550,14 +552,15 @@ jsf.iteration.files.UploadFailed=Upload Failed! Caused by: jsf.ConfigFileForOfflineTranslation=Offline Translation Config File jsf.ConfigFileDisabledProjectNotSet=Disabled because maintainer has not set project type for this project. +jsf.iteration.files.DownloadAllHeader=Download translation files (zip) jsf.iteration.files.DownloadTranslated=Download translated [{0}] jsf.iteration.files.DownloadAll=Download All (zip) jsf.iteration.files.DownloadAllOfflinePo=Download All for Offline Translation jsf.iteration.files.DownloadAllFiles.ProjectTypeNotAllowed=The project type must be set to "Gettext" or "Podir". Contact the project maintainer. jsf.iteration.files.DownloadAllFiles.ProjectTypeNotSet=The project type for this iteration has not been set. Contact the project maintainer. -jsf.iteration.files.ConfirmDownloadAllFiles=Your download will be prepared and may take a few minutes to complete. Is this ok? +jsf.iteration.files.DownloadAllMsg=Download {0} translation files. This may take a few minutes to complete. ! {0} represents the number of documents that have been processed, {1} represents the total number of documents -jsf.generatezip.ProgressLabel={0} of {1} +jsf.generatezip.ProgressLabel=Processing {0} of {1} jsf.iteration.files.WhyCantITranslate=Why can't I translate? jsf.iteration.files.translateDenied.NotLoggedIn=You are not logged In. diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/version/documents-tab.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/version/documents-tab.xhtml index ff1e20b78e..ccf730657d 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/version/documents-tab.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/version/documents-tab.xhtml @@ -30,13 +30,15 @@ aria-labelledby="dropdownContent">
  • - + #{msgs['jsf.iteration.files.UploadNewSourceDocument']} - +
  • @@ -44,7 +46,7 @@ rendered="#{s:hasPermission(versionHomeAction.version, 'update')}">
  • + onclick="changeBrowserUrl(this.href, true);return false;" class="i__item--right"> #{msgs['jsf.ManageDocuments']} @@ -78,9 +80,8 @@

    - + #{msgs['jsf.iteration.files.UploadNewSourceDocument']}

    @@ -255,7 +256,7 @@ aria-labelledby="dropdownContent">
  • + onclick="changeBrowserUrl(this.href, true);return false;" class="i__item--right"> #{msgs['jsf.ManageLanguage']} diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/version/languages-tab.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/version/languages-tab.xhtml index 2b4bd7e1f6..e29121bca7 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/version/languages-tab.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/version/languages-tab.xhtml @@ -8,38 +8,21 @@ xmlns:rich="http://richfaces.org/rich"> + +
    @@ -63,7 +46,7 @@ aria-labelledby="dropdownContent">
  • + onclick="changeBrowserUrl(this.href, true);return false;" class="i__item--right"> #{msgs['jsf.ManageLanguage']} @@ -198,11 +181,11 @@
  • - + #{msgs['jsf.iteration.files.DownloadAll']} @@ -212,7 +195,7 @@ #{msgs['jsf.iteration.files.DownloadAllOfflinePo']} - +
  • @@ -383,11 +366,11 @@
  • - - #{msgs['jsf.Upload.Label']} + + #{msgs['jsf.Upload.Label']} +
  • @@ -461,81 +444,10 @@ id="languageTabDocumentSearchBottom" bottomPanel="true" actionBean="#{versionHomeAction.languageTabDocumentFilter}"/> - - - - - - - - - - - - - -
    - - - -
    -
    -
    - - - - - - - - - -
    - - - - -
    - - -
    -
    -
    + + 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 40e63e9953..d393892b41 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 @@ -174,7 +174,7 @@
    -
    diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/version/zip_download_progress_modal.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/version/zip_download_progress_modal.xhtml new file mode 100644 index 0000000000..e7d0049970 --- /dev/null +++ b/zanata-war/src/main/webapp/WEB-INF/layout/version/zip_download_progress_modal.xhtml @@ -0,0 +1,108 @@ + diff --git a/zanata-war/src/main/webapp/iteration/view.xhtml b/zanata-war/src/main/webapp/iteration/view.xhtml index a619777014..3584d1483b 100644 --- a/zanata-war/src/main/webapp/iteration/view.xhtml +++ b/zanata-war/src/main/webapp/iteration/view.xhtml @@ -63,14 +63,6 @@ }) //]]> - - function openUploadSourceDocPanel() { - #{rich:component('uploadSourceDocPanel')} - . - show(); - checkIfGeneralFileSelected() - } - function openUploadSourcePanel(docId) { #{rich:element('uploadSourcePanelHeader')} . @@ -92,29 +84,6 @@ return false; } - function hideSourceDocUploadPanel() { - #{rich:component('uploadSourceDocPanel')} - . - hide(); - return false; - } - - function checkIfGeneralFileSelected() { - var fileInput = #{rich:element('generalDocFileUpload')}; - var submitButton = #{rich:element('generalDocSubmitUploadButton')}; - var errorMessage = document.getElementById('invalidFilenameError'); - checkIfFileSelected(fileInput, submitButton); - var fileName = fileInput.value; - var hasSemicolon = fileName !== undefined && - fileName.lastIndexOf(';') !== -1; - if (hasSemicolon) { - errorMessage.style.display = ''; - submitButton.disabled = true; - } else { - errorMessage.style.display = 'none'; - } - } - function checkIfSpecificFileSelected() { checkIfFileSelected(#{rich:element('specificDocFileInput')}, #{rich:element('specificDocSubmitUploadButton')}); @@ -545,73 +514,6 @@ - - - - - - - - - -
    - - - -
    -
    - - - - -
    - - -
    - -
    - - #{msgs['jsf.iteration.files.CustomParams.linkText']} - -
    - -
    - - -
    -
    -
    diff --git a/zanata-war/src/main/webapp/resources/zanata/multi-file-upload.xhtml b/zanata-war/src/main/webapp/resources/zanata/multi-file-upload.xhtml index 6f931e3e75..60e7bcec52 100644 --- a/zanata-war/src/main/webapp/resources/zanata/multi-file-upload.xhtml +++ b/zanata-war/src/main/webapp/resources/zanata/multi-file-upload.xhtml @@ -24,7 +24,8 @@ site: http://www.fsf.org. + xmlns:f="http://java.sun.com/jsf/core" + xmlns:s="http://jboss.org/schema/seam/taglib"> + - + + + diff --git a/zanata-war/src/main/webapp/language/language.xhtml b/zanata-war/src/main/webapp/language/language.xhtml index af7ec9f4b7..89856f136e 100644 --- a/zanata-war/src/main/webapp/language/language.xhtml +++ b/zanata-war/src/main/webapp/language/language.xhtml @@ -1,23 +1,133 @@ #{msgs.format('jsf.LanguageTeamTitle', - languageTeamAction.locale.retrieveDisplayName())} + languageAction.locale.retrieveDisplayName())} -
    -
    + + + + + + +
    +

    - + +

    + #{languageAction.locale.retrieveDisplayName()} +

    +

    + #{languageAction.locale.localeId}#{languageAction.locale.retrieveNativeName()} +

    + + + #{msgs['jsf.Disabled']} + + + #{msgs['jsf.language.disableByDefault']} + + + +
    +
    + +
    diff --git a/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsJpaTest.java b/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsJpaTest.java index 0e40417452..0429e270e1 100644 --- a/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsJpaTest.java +++ b/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsJpaTest.java @@ -39,7 +39,9 @@ public class ResourceUtilsJpaTest extends ZanataJpaTest { public void setUp() { deleteAllTables(); resourceUtils = - seam.reset().use("entityManager", getEm()) + seam.reset() + .use("session", getSession()) + .use("entityManager", getEm()) .autowire(ResourceUtils.class); } diff --git a/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsTest.java b/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsTest.java index 12ff9aad0e..32aa3fcddb 100644 --- a/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsTest.java +++ b/zanata-war/src/test/java/org/zanata/rest/service/ResourceUtilsTest.java @@ -1,8 +1,5 @@ package org.zanata.rest.service; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -11,19 +8,21 @@ import java.util.List; import java.util.Map; import java.util.Properties; - import javax.persistence.EntityManager; import org.junit.BeforeClass; -import org.mockito.Mockito; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.zanata.common.ContentState; import org.zanata.common.LocaleId; import org.zanata.common.MergeType; +import org.zanata.dao.LocaleDAO; import org.zanata.model.HDocument; import org.zanata.model.HLocale; import org.zanata.model.HPerson; @@ -35,6 +34,12 @@ import org.zanata.rest.dto.resource.TextFlow; import org.zanata.seam.SeamAutowire; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + @Test(groups = { "unit-tests" }) public class ResourceUtilsTest { private static final Logger log = LoggerFactory @@ -42,6 +47,12 @@ public class ResourceUtilsTest { private static ResourceUtils resourceUtils; + @Mock + private EntityManager mockEm; + + @Mock + private LocaleDAO mockLocaleDAO; + @BeforeClass public static void logMemoryForTests() { // FIXME why is this here? @@ -50,14 +61,14 @@ public static void logMemoryForTests() { log.info("unit tests free memory :" + runtime.freeMemory()); } - @BeforeTest + @BeforeMethod public void initializeResourceUtils() { - // Assume persistence - EntityManager mockEm = Mockito.mock(EntityManager.class); - + MockitoAnnotations.initMocks(this); resourceUtils = - SeamAutowire.instance().reset().use("entityManager", mockEm) - .autowire(ResourceUtils.class); + SeamAutowire.instance().reset() + .use("entityManager", mockEm) + .use("localeDAO", mockLocaleDAO) + .autowire(ResourceUtils.class); } @Test @@ -330,25 +341,24 @@ public void encodeDocIds(String encoded, String decoded) { */ @Test public void readPluralForms() { - ResourceUtils resourceUtils = new ResourceUtils(); - resourceUtils.create(); Properties properties = ResourceUtils.getPluralForms(); for (Object key : properties.keySet()) { String propKey = (String) key; LocaleId localeId = LocaleId.fromJavaName(propKey); - resourceUtils.getPluralForms(localeId, false); + resourceUtils.getPluralForms(localeId, true, false); + verify(mockLocaleDAO).findByLocaleId(localeId); resourceUtils.getNPluralForms(null, localeId); } } @Test public void pluralFormsAlternateSeparators() { - ResourceUtils resourceUtils = new ResourceUtils(); - resourceUtils.create(); - // Plural forms for "es" - String esPluralForm = resourceUtils.getPluralForms(new LocaleId("es")); + String esPluralForm = resourceUtils.getPluralForms(LocaleId.ES); + + verify(mockLocaleDAO).findByLocaleId(LocaleId.ES); + assertThat(esPluralForm, notNullValue()); // Alternate forms that should match the "es" plurals @@ -366,4 +376,59 @@ public void pluralFormsAlternateSeparators() { is(esPluralForm)); } + @Test + public void pluralFormsTest() { + + //given mock data + String testPluralForms = "testPluralForms"; + HLocale mockHLocale = new HLocale(LocaleId.ES); + mockHLocale.setPluralForms(testPluralForms); + when(mockLocaleDAO.findByLocaleId(LocaleId.ES)).thenReturn(mockHLocale); + + //execute + String pluralForms = resourceUtils.getPluralForms(LocaleId.ES); + + //verify and assert + verify(mockLocaleDAO).findByLocaleId(LocaleId.ES); + assertThat(pluralForms, is(testPluralForms)); + } + + @Test + public void pluralFormsTestUseDBEntryTest() { + + //given mock data + HLocale mockHLocale = new HLocale(LocaleId.ES); + when(mockLocaleDAO.findByLocaleId(LocaleId.ES)).thenReturn(mockHLocale); + + //execute + String pluralForms = resourceUtils.getPluralForms(LocaleId.ES); + + //verify and assert + verify(mockLocaleDAO).findByLocaleId(LocaleId.ES); + assertThat(pluralForms, notNullValue()); + } + + @Test + public void isValidPluralFormsTest() { + String invalidPluralForms = "testPluralForms"; + assertThat(resourceUtils.isValidPluralForms(invalidPluralForms), is(false)); + + invalidPluralForms = "nplurals=notinteger"; + assertThat(resourceUtils.isValidPluralForms(invalidPluralForms), is(false)); + + invalidPluralForms = "nplurals=-1"; + assertThat(resourceUtils.isValidPluralForms(invalidPluralForms), is(false)); + + invalidPluralForms = "nplurals=" + resourceUtils.MAX_TARGET_CONTENTS + 1; + assertThat(resourceUtils.isValidPluralForms(invalidPluralForms), is(false)); + + invalidPluralForms = "nplurals=0"; + assertThat(resourceUtils.isValidPluralForms(invalidPluralForms), is(false)); + + invalidPluralForms = "nplurals=1"; + assertThat(resourceUtils.isValidPluralForms(invalidPluralForms), is(true)); + + invalidPluralForms = "nplurals=" + resourceUtils.MAX_TARGET_CONTENTS; + assertThat(resourceUtils.isValidPluralForms(invalidPluralForms), is(true)); + } } From c695cdb8a1f0c92ee83cc0f67dfddcb691982f8c Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Thu, 12 Feb 2015 09:26:31 +1000 Subject: [PATCH 05/22] Update inactive account, password reset page. Remove captcha from password reset page. https://bugzilla.redhat.com/show_bug.cgi?id=1191321 Squashed commit of the following: commit 94837356020e34784e0ed8e67b89daa3709a5aa1 Author: Alex Eng Date: Tue Feb 10 16:08:18 2015 +1000 Update inactive account, password reset page. Remove captcha from password reset page. https://bugzilla.redhat.com/show_bug.cgi?id=1191321 --- .../src/main/resources/messages.properties | 8 +- .../src/main/webapp/account/activate.xhtml | 7 +- .../webapp/account/inactive_account.xhtml | 112 +++++++----------- .../main/webapp/account/password_reset.xhtml | 77 ++++++------ .../account/password_reset_request.xhtml | 67 ++++++----- .../main/webapp/account/validate_email.xhtml | 7 +- 6 files changed, 121 insertions(+), 157 deletions(-) diff --git a/zanata-war/src/main/resources/messages.properties b/zanata-war/src/main/resources/messages.properties index ad739930b9..a80457caf2 100644 --- a/zanata-war/src/main/resources/messages.properties +++ b/zanata-war/src/main/resources/messages.properties @@ -776,7 +776,6 @@ jsf.register.LogIn.label=Log In jsf.ForgotYourPassword=Forgot your password? jsf.ResetPassword=Reset Password jsf.SubmitRequest=Submit Request -jsf.ResetYourPassword=Reset Your Password jsf.NewPassword=New Password jsf.OldPassword=Old Password jsf.ChangePassword=Change Password @@ -791,12 +790,11 @@ jsf.ActivateAccount=Activate Account jsf.ValidateEmail=Validate Email jsf.InactiveAccount=Inactive account -jsf.inactiveaccount.PleaseSelectOne=Your account has not yet been activated. Please select one of the following options: -jsf.ResendActivationEmail=Re-send activation email +jsf.InactiveAccount.PleaseSelectOne=Your account has not yet been activated. +jsf.ResendActivationEmail=Request to resend activation email ! placed between two activities to show that only one is necessary. This is on its own, not part of a sentence. jsf.or=OR -jsf.inactiveaccount.UpdateAndResend=Update email address and re-send activation email: -jsf.UpdateEmail=Update email address +jsf.UpdateEmail=Update email jsf.InvalidActivationKey=Invalid activation key jsf.ActivationLinkExpired=Activation link expired. Please sign in and click "Re-send activation email". diff --git a/zanata-war/src/main/webapp/account/activate.xhtml b/zanata-war/src/main/webapp/account/activate.xhtml index 6e856dad92..dd72a44895 100644 --- a/zanata-war/src/main/webapp/account/activate.xhtml +++ b/zanata-war/src/main/webapp/account/activate.xhtml @@ -1,13 +1,8 @@ + template="../WEB-INF/template/template.xhtml"> #{msgs['jsf.ActivateAccount']} diff --git a/zanata-war/src/main/webapp/account/inactive_account.xhtml b/zanata-war/src/main/webapp/account/inactive_account.xhtml index ed7e0168b8..2db3c7b38c 100644 --- a/zanata-war/src/main/webapp/account/inactive_account.xhtml +++ b/zanata-war/src/main/webapp/account/inactive_account.xhtml @@ -1,84 +1,54 @@ + xmlns:zanata="http://java.sun.com/jsf/composite/zanata" + template="../WEB-INF/template/template.xhtml"> #{msgs['jsf.InactiveAccount']} - - - - - - - - - - - - - - - - - - #{msgs['jsf.Email']} - - - - - - #{msgs['jsf.email.placeholder']} - - - - -
    - - -