Skip to content

Commit

Permalink
feat: hide private project from activity
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Sep 13, 2017
1 parent 5b3bcba commit 09ca103
Show file tree
Hide file tree
Showing 5 changed files with 156 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@
import org.zanata.dao.DocumentDAO;
import org.zanata.dao.PersonDAO;
import org.zanata.dao.ProjectIterationDAO;
import org.zanata.dao.ProjectMemberDAO;
import org.zanata.dao.TextFlowTargetHistoryDAO;
import org.zanata.model.HDocument;
import org.zanata.model.HLocale;
Expand Down Expand Up @@ -115,8 +114,6 @@ public class StatisticsServiceImpl implements StatisticsResource {
@Inject
private EntityManager entityManager;
@Inject
private ProjectMemberDAO projectMemberDAO;
@Inject
private TranslationStateCache translationStateCacheImpl;
@Inject
private ZanataIdentity identity;
Expand Down
226 changes: 136 additions & 90 deletions server/services/src/main/java/org/zanata/ui/ActivityEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
package org.zanata.ui;

import org.apache.commons.lang.StringEscapeUtils;

import javax.inject.Inject;
import javax.inject.Named;

import org.zanata.common.ActivityType;
import org.zanata.common.EntityStatus;
import org.zanata.dao.DocumentDAO;
Expand All @@ -34,18 +36,20 @@
import org.zanata.model.HTextFlow;
import org.zanata.model.HTextFlowTarget;
import org.zanata.model.type.EntityType;
import org.zanata.security.ZanataIdentity;
import org.zanata.service.ActivityService;
import org.zanata.util.DateUtil;
import org.zanata.util.ShortString;
import org.zanata.util.UrlUtil;

import static org.zanata.common.ActivityType.REVIEWED_TRANSLATION;
import static org.zanata.common.ActivityType.UPDATE_TRANSLATION;
import static org.zanata.common.ActivityType.UPLOAD_SOURCE_DOCUMENT;
import static org.zanata.common.ActivityType.UPLOAD_TRANSLATION_DOCUMENT;

/**
* Provides data and operations needed to display an activity entry.
*
* <p>
* This is used by template activity-entry.xhtml
*
* @author Alex Eng <a href="mailto:aeng@redhat.com">aeng@redhat.com</a>
Expand All @@ -61,104 +65,135 @@ public class ActivityEntry {
private DocumentDAO documentDAO;
@Inject
private Messages msgs;
@Inject
private ZanataIdentity identity;

public String getActivityTypeIconClass(Activity activity) {
return activity.getActivityType() == UPDATE_TRANSLATION ? "i--translate"
: activity.getActivityType() == REVIEWED_TRANSLATION
? "i--review"
: activity.getActivityType() == UPLOAD_SOURCE_DOCUMENT
? "i--document"
: activity
.getActivityType() == UPLOAD_TRANSLATION_DOCUMENT
? "i--translate-up" : "";
? "i--review"
: activity.getActivityType() == UPLOAD_SOURCE_DOCUMENT
? "i--document"
: activity
.getActivityType() == UPLOAD_TRANSLATION_DOCUMENT
? "i--translate-up" : "";
}

public String getActivityTitle(Activity activity) {
return activity.getActivityType() == UPDATE_TRANSLATION
? msgs.get("jsf.Translation")
: activity.getActivityType() == REVIEWED_TRANSLATION
? msgs.get("jsf.Reviewed")
: activity.getActivityType() == UPLOAD_SOURCE_DOCUMENT
? msgs.get("jsf.UploadedSource")
: activity
.getActivityType() == UPLOAD_TRANSLATION_DOCUMENT
? msgs.get(
"jsf.UploadedTranslations")
: "";
? msgs.get("jsf.Reviewed")
: activity.getActivityType() == UPLOAD_SOURCE_DOCUMENT
? msgs.get("jsf.UploadedSource")
: activity
.getActivityType() == UPLOAD_TRANSLATION_DOCUMENT
? msgs.get(
"jsf.UploadedTranslations")
: "";
}

public String getActivityMessage(Activity activity) {
boolean isVersionDeleted = isVersionDeleted(activity);
boolean isProjectDeleted = isProjectDeleted(activity);
switch (activity.getActivityType()) {
case UPDATE_TRANSLATION:
if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.translate.message.projectDeleted",
activity.getWordCount(), getProjectName(activity),
StringEscapeUtils
.escapeHtml(getLastTextFlowContent(activity)));
} else if (isVersionDeleted) {
return msgs.format(
"jsf.dashboard.activity.translate.message.versionDeleted",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity), StringEscapeUtils
.escapeHtml(getLastTextFlowContent(activity)));
} else {
return msgs.format("jsf.dashboard.activity.translate.message",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity), getEditorUrl(activity),
StringEscapeUtils
.escapeHtml(getLastTextFlowContent(activity)));
}

case REVIEWED_TRANSLATION:
if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.review.message.projectDeleted",
activity.getWordCount(), getProjectName(activity),
StringEscapeUtils
.escapeHtml(getLastTextFlowContent(activity)));
} else if (isVersionDeleted) {
return msgs.format(
"jsf.dashboard.activity.review.message.versionDeleted",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity), StringEscapeUtils
.escapeHtml(getLastTextFlowContent(activity)));
} else {
return msgs.format("jsf.dashboard.activity.review.message",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity), getEditorUrl(activity),
StringEscapeUtils
.escapeHtml(getLastTextFlowContent(activity)));
}

case UPLOAD_SOURCE_DOCUMENT:
if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.uploadSource.message.projectDeleted",
activity.getWordCount(), getProjectName(activity));
} else {
return msgs.format(
"jsf.dashboard.activity.uploadSource.message",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity));
}

case UPLOAD_TRANSLATION_DOCUMENT:
if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.uploadTranslation.message.projectDeleted",
activity.getWordCount(), getProjectName(activity));
} else {
return msgs.format(
"jsf.dashboard.activity.uploadTranslation.message",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity));
}
boolean canViewProject = canViewProject(activity);

default:
return "";
switch (activity.getActivityType()) {
case UPDATE_TRANSLATION:
if (!canViewProject) {
return msgs.format(
"jsf.dashboard.activity.translate.message.projectPrivate",
activity.getWordCount(), getProjectName(activity),
StringEscapeUtils
.escapeHtml(
getLastTextFlowContent(activity)));
} else if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.translate.message.projectDeleted",
activity.getWordCount(), getProjectName(activity),
StringEscapeUtils
.escapeHtml(
getLastTextFlowContent(activity)));
} else if (isVersionDeleted) {
return msgs.format(
"jsf.dashboard.activity.translate.message.versionDeleted",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity), StringEscapeUtils
.escapeHtml(
getLastTextFlowContent(activity)));
} else {
return msgs
.format("jsf.dashboard.activity.translate.message",
activity.getWordCount(),
getProjectUrl(activity),
getProjectName(activity),
getEditorUrl(activity),
StringEscapeUtils
.escapeHtml(getLastTextFlowContent(
activity)));
}
case REVIEWED_TRANSLATION:
if (!canViewProject) {
return msgs.format(
"jsf.dashboard.activity.review.message.projectPrivate",
activity.getWordCount(), getProjectName(activity),
StringEscapeUtils
.escapeHtml(
getLastTextFlowContent(activity)));
} else if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.review.message.projectDeleted",
activity.getWordCount(), getProjectName(activity),
StringEscapeUtils
.escapeHtml(
getLastTextFlowContent(activity)));
} else if (isVersionDeleted) {
return msgs.format(
"jsf.dashboard.activity.review.message.versionDeleted",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity), StringEscapeUtils
.escapeHtml(
getLastTextFlowContent(activity)));
} else {
return msgs.format("jsf.dashboard.activity.review.message",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity), getEditorUrl(activity),
StringEscapeUtils
.escapeHtml(
getLastTextFlowContent(activity)));
}
case UPLOAD_SOURCE_DOCUMENT:
if (!canViewProject) {
return msgs.format(
"jsf.dashboard.activity.uploadSource.message.projectPrivate",
activity.getWordCount(), getProjectName(activity));
} else if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.uploadSource.message.projectDeleted",
activity.getWordCount(), getProjectName(activity));
} else {
return msgs.format(
"jsf.dashboard.activity.uploadSource.message",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity));
}
case UPLOAD_TRANSLATION_DOCUMENT:
if (!canViewProject) {
return msgs.format(
"jsf.dashboard.activity.uploadTranslation.message.projectPrivate",
activity.getWordCount(), getProjectName(activity));
} else if (isProjectDeleted) {
return msgs.format(
"jsf.dashboard.activity.uploadTranslation.message.projectDeleted",
activity.getWordCount(), getProjectName(activity));
} else {
return msgs.format(
"jsf.dashboard.activity.uploadTranslation.message",
activity.getWordCount(), getProjectUrl(activity),
getProjectName(activity));
}
default:
return "";

}
}
Expand All @@ -178,9 +213,10 @@ public String getProjectUrl(Activity activity) {
getEntity(activity.getContextType(), activity.getContextId());
if (isTranslationUpdateActivity(activity.getActivityType())
|| activity
.getActivityType() == ActivityType.UPLOAD_SOURCE_DOCUMENT
.getActivityType() == ActivityType.UPLOAD_SOURCE_DOCUMENT
|| activity
.getActivityType() == ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
.getActivityType() ==
ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
HProjectIteration version = (HProjectIteration) context;
return urlUtil.projectUrl(version.getProject().getSlug());
}
Expand Down Expand Up @@ -209,7 +245,8 @@ public String getEditorUrl(Activity activity) {
.getActivityType() == ActivityType.UPLOAD_SOURCE_DOCUMENT) {
// not supported for upload source action
} else if (activity
.getActivityType() == ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
.getActivityType() ==
ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
HProjectIteration version = (HProjectIteration) context;
HDocument document = (HDocument) lastTarget;
HTextFlowTarget tft =
Expand Down Expand Up @@ -314,9 +351,10 @@ public String getProjectName(Activity activity) {
getEntity(activity.getContextType(), activity.getContextId());
if (isTranslationUpdateActivity(activity.getActivityType())
|| activity
.getActivityType() == ActivityType.UPLOAD_SOURCE_DOCUMENT
.getActivityType() == ActivityType.UPLOAD_SOURCE_DOCUMENT
|| activity
.getActivityType() == ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
.getActivityType() ==
ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
HProjectIteration version = (HProjectIteration) context;
return version.getProject().getName();
}
Expand All @@ -337,9 +375,10 @@ public HProjectIteration getVersion(Activity activity) {
getEntity(activity.getContextType(), activity.getContextId());
if (isTranslationUpdateActivity(activity.getActivityType())
|| activity
.getActivityType() == ActivityType.UPLOAD_SOURCE_DOCUMENT
.getActivityType() == ActivityType.UPLOAD_SOURCE_DOCUMENT
|| activity
.getActivityType() == ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
.getActivityType() ==
ActivityType.UPLOAD_TRANSLATION_DOCUMENT) {
return (HProjectIteration) context;
}
return null;
Expand Down Expand Up @@ -427,6 +466,13 @@ public boolean isProjectDeleted(Activity activity) {
return version.getProject().getStatus() == EntityStatus.OBSOLETE;
}

public boolean canViewProject(Activity activity) {
Object context =
getEntity(activity.getContextType(), activity.getContextId());
HProjectIteration version = (HProjectIteration) context;
return identity.hasPermission(version, "read");
}

public ActivityEntry() {
}

Expand Down
6 changes: 6 additions & 0 deletions server/services/src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -152,17 +152,23 @@ jsf.dashboard.activity.translate.message=You translated <strong>{0} words</stron
<a href="{1}">{2}</a>, finishing on &#8220;<a href="{3}">{4}</a>&#8221;
jsf.dashboard.activity.translate.message.versionDeleted=You translated <strong>{0} words</strong> in \
<a href="{1}">{2}</a>, finishing on &#8220;<strong>{3}</strong>&#8221;
jsf.dashboard.activity.translate.message.projectPrivate=You translated <strong>{0} words</strong> in \
<strong>{1}</strong><span class="txt--meta"> (private)</span>, finishing on &#8220;<strong>{2}</strong>&#8221;
jsf.dashboard.activity.translate.message.projectDeleted=You translated <strong>{0} words</strong> in \
<strong>{1}</strong>, finishing on &#8220;<strong>{2}</strong>&#8221;
jsf.dashboard.activity.review.message=You reviewed <strong>{0} words</strong> in \
<a href="{1}">{2}</a>, finishing on &#8220;<a href="{3}">{4}</a>&#8221;
jsf.dashboard.activity.review.message.versionDeleted=You reviewed <strong>{0} words</strong> in \
<a href="{1}">{2}</a>, finishing on &#8220;<strong>{3}</strong>&#8221;
jsf.dashboard.activity.review.message.projectPrivate=You reviewed <strong>{0} words</strong> in \
<strong>{1}</strong><span class="txt--meta"> (private)</span>, finishing on &#8220;<strong>{2}</strong>&#8221;
jsf.dashboard.activity.review.message.projectDeleted=You reviewed <strong>{0} words</strong> in \
<strong>{1}</strong>, finishing on &#8220;<strong>{2}</strong>&#8221;
jsf.dashboard.activity.uploadSource.message=You uploaded source documents of <strong>{0} words</strong> to <a href="{1}">{2}</a>
jsf.dashboard.activity.uploadSource.message.projectPrivate=You uploaded source documents of <strong>{0} words</strong> to <strong>{1}</strong><span class="txt--meta"> (private)</span>
jsf.dashboard.activity.uploadSource.message.projectDeleted=You uploaded source documents of <strong>{0} words</strong> to <strong>{1}</strong>
jsf.dashboard.activity.uploadTranslation.message=You uploaded translations of <strong>{0} words</strong> to <a href="{1}">{2}</a>
jsf.dashboard.activity.uploadTranslation.message.projectPrivate=You uploaded translations of <strong>{0} words</strong> to <strong>{1}</strong><span class="txt--meta"> (private)</span>
jsf.dashboard.activity.uploadTranslation.message.projectDeleted=You uploaded translations of <strong>{0} words</strong> to <strong>{1}</strong>
jsf.dashboard.activity.lastTranslatedBy.message=Last translated by {0}
jsf.dashboard.groups.title=Groups
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.zanata.ZanataDbunitJpaTest;
import org.zanata.cache.InfinispanTestCacheContainer;
Expand All @@ -62,6 +63,7 @@
import org.zanata.rest.dto.stats.contribution.BaseContributionStatistic;
import org.zanata.rest.dto.stats.contribution.ContributionStatistics;
import org.zanata.rest.dto.stats.contribution.LocaleStatistics;
import org.zanata.security.ZanataIdentity;
import org.zanata.security.annotations.Authenticated;
import org.zanata.service.ValidationService;
import org.zanata.service.impl.TranslationStateCacheImpl;
Expand Down Expand Up @@ -100,9 +102,8 @@ public class StatisticsServiceImplTest extends ZanataDbunitJpaTest {
@Produces @Mock ValidationService validationService;
@Produces @Mock @FullText FullTextEntityManager fullTextEntityManager;

@Produces @Authenticated
@Mock
HAccount authenticatedAccount;
@Produces @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ZanataIdentity identity;

@Override
@Produces
Expand Down
Loading

0 comments on commit 09ca103

Please sign in to comment.