From e8e22f1e1acf639dcb1e091a8a31b0d826c042bb Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 1 Jun 2018 10:53:42 +0200
Subject: [PATCH] OO-3489: translations, write more data in efficiency
 statements export...

---
 .../user/_i18n/LocalStrings_en.properties     |  4 +-
 .../user/_i18n/LocalStrings_fr.properties     |  4 +-
 .../manager/NotificationsManagerImpl.java     |  6 +--
 .../manager/EfficiencyStatementArchiver.java  |  4 ++
 .../ui/_i18n/LocalStrings_fr.properties       |  3 +-
 .../login/_i18n/LocalStrings_fr.properties    |  3 +-
 .../manager/RepositoryEntryRelationDAO.java   |  9 +++-
 .../ui/data/UserDataExportController.java     | 50 ++++++++++++++++---
 .../ui/data/_i18n/LocalStrings_de.properties  |  2 +-
 .../ui/data/_i18n/LocalStrings_en.properties  | 11 +++-
 .../ui/data/_i18n/LocalStrings_fr.properties  | 34 +++++++++++++
 11 files changed, 111 insertions(+), 19 deletions(-)
 create mode 100644 src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties

diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
index 1790059465e..f7961169211 100644
--- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_en.properties
@@ -1,4 +1,4 @@
-#Fri May 25 16:23:39 CEST 2018
+#Fri Jun 01 10:17:04 CEST 2018
 action.bulkedit=Edit these users' attributes
 action.choose=Choose
 action.choose.finish=Choose and finish
@@ -142,10 +142,10 @@ table.header.action=Action
 table.header.vcard=Visiting card
 table.identity.action=Action
 table.identity.creationdate=Created
+table.identity.deleted.name=Del_User name
 table.identity.deletedby=Deleted by
 table.identity.deleteddate=Deleted
 table.identity.deletedroles=Roles
-table.identity.deleted.name=Del_User name
 table.identity.lastlogin=Last login
 table.identity.name=User name
 table.identity.vcard=<i class\='o_icon o_icon-lg o_icon_home'> </i>
diff --git a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties
index 0d84993c0ce..9ceb61c7755 100644
--- a/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/user/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Thu May 31 16:28:04 CEST 2018
+#Fri Jun 01 10:39:47 CEST 2018
 action.bulkedit=Changer les attributs de cet utilisateur
 action.choose=S\u00E9lectionner
 action.choose.finish=S\u00E9lectionner et terminer
@@ -44,6 +44,8 @@ error.search.form.no.wildcard.dublicates=Les termes de recherche incluant `**` n
 error.search.form.notempty=Veuillez remplir au minimum un champ du formulaire SVP. 
 error.search.form.to.short=Terme de recherche trop court.
 error.search.maxResults=Trop de r\u00E9sultats ont \u00E9t\u00E9 trouv\u00E9s. Seul les {0} premiers seront affich\u00E9s.
+export.user.data=Exporter les donn\u00E9es
+export.user.data.title=Exporter les donn\u00E9es utilisateurs de "{0}"
 form.password.new1=Nouveau mot de passe
 form.password.new2=Confirmer mot de passe 
 form.please.enter.new=Veuillez ins\u00E9rer le nouveaux mot de passe pour cet utilisateur s.v.p. 
diff --git a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
index dcc0337f344..20045c5fc06 100644
--- a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
+++ b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java
@@ -1311,8 +1311,8 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 
 	@Override
 	public void export(Identity identity, ManifestBuilder manifest, File archiveDirectory, Locale locale) {
-		File noteArchive = new File(archiveDirectory, "Notifications.xlsx");
-		try(OutputStream out = new FileOutputStream(noteArchive);
+		File subscriptionsArchive = new File(archiveDirectory, "Subscriptions.xlsx");
+		try(OutputStream out = new FileOutputStream(subscriptionsArchive);
 			OpenXMLWorkbook workbook = new OpenXMLWorkbook(out, 1)) {
 			OpenXMLWorksheet sheet = workbook.nextWorksheet();
 			sheet.setHeaderRows(1);
@@ -1331,7 +1331,7 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us
 			log.error("Unable to export xlsx", e);
 		}
 
-		manifest.appendFile("Notifications.xlsx");
+		manifest.appendFile(subscriptionsArchive.getName());
 	}
 
 	private void exportSubscriberData(Subscriber subscriber, OpenXMLWorksheet sheet, OpenXMLWorkbook workbook, Locale locale) {
diff --git a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java
index 9bc7e71cc14..bbc54d0d1e1 100644
--- a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java
+++ b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementArchiver.java
@@ -152,6 +152,10 @@ public class EfficiencyStatementArchiver {
 		Object value = nodeData.get(key);
 		if(value instanceof String) {
 			row.addCell(col, (String)value);
+		} else if(value instanceof Number) {
+			row.addCell(col, (Number)value, null);
+		} else if(value instanceof Boolean) {
+			row.addCell(col, ((Boolean)value).toString(), null);
 		}
 	}
 
diff --git a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties
index 0c499492c70..187c5888b76 100644
--- a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,5 @@
-#Wed Mar 08 11:25:33 CET 2017
+#Fri Jun 01 10:18:11 CEST 2018
+chkbx.breadcrumb.onoff=Navigation fil d'Ariane
 chkbx.calendar.onoff=Afficher calendrier via la bo\u00EEte \u00E0 outils
 chkbx.chat.onoff=Utiliser le chat du cours
 chkbx.efficency.onoff=Utiliser l'attestation de performance
diff --git a/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties
index 43ef7cf5953..db0b15681ba 100644
--- a/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/login/_i18n/LocalStrings_fr.properties
@@ -1,4 +1,4 @@
-#Thu May 31 16:21:57 CEST 2018
+#Fri Jun 01 10:19:57 CEST 2018
 about.copyright=Copyright et participations
 about.custom=
 about.custom.title=
@@ -105,6 +105,7 @@ mail.pwd.subject=Mot de passe chang\u00E9
 max.age=Exiger un nouveau mot de passe
 max.age.administrator=... pour les administrateurs
 max.age.author=... pour les auteurs
+max.age.description=Vous pouvez configurer ici la fr\u00E9quence \u00E0 laquelle un utilisateur doit changer son mot de passe et si un mot de passe peut \u00EAtre r\u00E9utilis\u00E9. La dur\u00E9e de vie des mots de passe peut \u00EAtre sp\u00E9cifi\u00E9 pour chaque role s\u00E9par\u00E9ment.
 max.age.groupmanager=... pour gestionnaires de groupes
 max.age.hint=en jours
 max.age.learnresourcemanager=... pour les administrateurs de ressources didactiques
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
index fa081d96152..a00e71ab92c 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryRelationDAO.java
@@ -646,7 +646,7 @@ public class RepositoryEntryRelationDAO {
 	
 	public List<MembershipInfos> getMembership(IdentityRef identity) {
 		StringBuilder sb = new StringBuilder(512);
-		sb.append("select v.key, v.displayname, reMember.role, reMember.creationDate,")
+		sb.append("select v.key, v.displayname, reMember.key, reMember.role, reMember.creationDate,")
 		  .append(" userinfos.initialLaunch, userinfos.recentLaunch, userinfos.visit")
 		  .append(" from repositoryentry as v")
 		  .append(" inner join v.groups as rel")
@@ -659,11 +659,18 @@ public class RepositoryEntryRelationDAO {
 				.setParameter("identityKey", identity.getKey())
 				.getResultList();
 		
+		Set<Long> memberKeys = new HashSet<>();
 		List<MembershipInfos> memberhips = new ArrayList<>(rawObjects.size());
 		for(Object[] rawObject:rawObjects) {
 			int col = 0;
 			Long entryKey = (Long)rawObject[col++];
 			String displayName = (String)rawObject[col++];
+			Long memberKey = (Long)rawObject[col++];
+			if(memberKeys.contains(memberKey)) {
+				continue;//duplicate
+			}
+			memberKeys.add(memberKey);
+			
 			String role = (String)rawObject[col++];
 			Date creationDate = (Date)rawObject[col++];
 			Date initialLaunch = (Date)rawObject[col++];
diff --git a/src/main/java/org/olat/user/ui/data/UserDataExportController.java b/src/main/java/org/olat/user/ui/data/UserDataExportController.java
index 8c2fd6021a9..0d5f5a36d2d 100644
--- a/src/main/java/org/olat/user/ui/data/UserDataExportController.java
+++ b/src/main/java/org/olat/user/ui/data/UserDataExportController.java
@@ -19,7 +19,9 @@
  */
 package org.olat.user.ui.data;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
@@ -75,13 +77,13 @@ public class UserDataExportController extends FormBasicController {
 			((FormLayoutContainer)formLayout).contextPut("dataBusinessPath", url);
 			
 			if(!processing) {
-				List<String> exportIds = exportService.getExporterIds();
-				String[] keys = new String[exportIds.size()];
-				String[] values = new String[exportIds.size()];
-				for(int i=exportIds.size(); i-->0; ) {
-					String exportId = exportIds.get(i);
-					keys[i] = exportId;
-					values[i] = translate(exportId);
+				List<ExportLabel> exports = getAvailableExports();
+				String[] keys = new String[exports.size()];
+				String[] values = new String[exports.size()];
+				for(int i=exports.size(); i-->0; ) {
+					ExportLabel export = exports.get(i);
+					keys[i] = export.getId();
+					values[i] = export.getLabel();
 				}
 				exportEl = uifactory.addCheckboxesVertical("export.options", formLayout, keys, values, 1);
 				exportEl.setMandatory(true);
@@ -119,4 +121,38 @@ public class UserDataExportController extends FormBasicController {
 	protected void formCancelled(UserRequest ureq) {
 		fireEvent(ureq, Event.CANCELLED_EVENT);
 	}
+	
+	private List<ExportLabel> getAvailableExports() {
+		List<String> exportIds = exportService.getExporterIds();
+		List<ExportLabel> labels = new ArrayList<>(exportIds.size());
+		for(String exportId:exportIds) {
+			labels.add(new ExportLabel(exportId, translate(exportId)));
+		}
+		Collections.sort(labels);
+		return labels;
+	}
+	
+	private static final class ExportLabel implements Comparable<ExportLabel> {
+		
+		private final String id;
+		private final String label;
+		
+		public ExportLabel(String id, String label) {
+			this.id = id;
+			this.label = label;
+		}
+
+		public String getId() {
+			return id;
+		}
+
+		public String getLabel() {
+			return label;
+		}
+
+		@Override
+		public int compareTo(ExportLabel o) {
+			return label.compareToIgnoreCase(o.label);
+		}	
+	}
 }
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
index 7065728eccd..18cb2724578 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_de.properties
@@ -13,7 +13,7 @@ efficiency.statements=Leistungnachweise
 export.options=Export Elemente
 export.start=Start export
 export.url=Link zu Daten
-export.user.data.explain=W\u00E4hlen Sie die Elemente, welche f\u00FCr diesen Benutzer exportiert werden sollen. Der Export kann mehrere Stunde in Anspruch nehmen. Sobald der Export beendet ist werden Sie per Email informiert.
+export.user.data.explain=W\u00E4hlen Sie die Elemente, welche f\u00FCr diesen Benutzer exportiert werden sollen. Der Export kann mehrere Stunden in Anspruch nehmen. Sobald der Export beendet ist, werden Sie per Email informiert.
 export.user.data.none=Datenschutz Erkl\u00E4rung
 export.user.data.notReady=Der Benutzer kann den Export mit dem folgenden Link herunterladen.
 export.user.data.processing=Der Export ist gerade bearbeitet.
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
index 9dbe7aa2068..7a5d6ff5a97 100644
--- a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_en.properties
@@ -1,4 +1,4 @@
-#Fri May 25 16:23:30 CEST 2018
+#Fri Jun 01 10:16:59 CEST 2018
 binders=ePortfolio binders
 bookings=Bookings
 calendars=Calendars
@@ -13,6 +13,13 @@ efficiency.statements=Evidences of achievement
 export.options=Export elements
 export.start=Start export
 export.url=Link to the data
+export.user.data.explain=Select the elements to be exported for this user. The export can take several hours. You will receive an email once the export has been completed.
+export.user.data.none=Privacy statement
+export.user.data.notReady=The user can download the export using the following link.
+export.user.data.processing=The export is currently processed
+export.user.data.ready=The user can download the export with the following link. You can ask for a new export too.
+export.user.data.ready.subject=The export for "{0}" is ready
+export.user.data.ready.text=<p>The export for "{0}" is ready. The user can use the following link to download it <a href\="{1}">{1}</a>.</p>
 feeds=Blogs and podcasts
 forums=Forums
 group.memberships=Membership to groups
@@ -23,5 +30,5 @@ notes=Notes
 notifications=Subscriptions
 personal.folders=All documents in private and public folders
 pf=Participant folders
+profile=all profile data, including invisible ones
 repository.memberships=Membership to courses
-
diff --git a/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties
new file mode 100644
index 00000000000..5a33753ab71
--- /dev/null
+++ b/src/main/java/org/olat/user/ui/data/_i18n/LocalStrings_fr.properties
@@ -0,0 +1,34 @@
+#Fri Jun 01 10:34:11 CEST 2018
+binders=Classeurs portfolio
+bookings=R\u00E9servations
+calendars=Calendriers
+certificates=Certificats
+chat=Messages de la messagerie instantan\u00E9e
+comments.ratings=Commentaires et \u00E9valuations
+dialog=Fichiers discut\u00E9s
+disclaimer=Conditions d'utilisation
+display.portrait=Image publi\u00E9e du profil
+download.data=T\u00E9l\u00E9charger les donn\u00E9es
+efficiency.statements=Attestations de performance
+export.options=Elements \u00E0 exporter
+export.start=D\u00E9marrer l'exportation
+export.url=Lien vers les donn\u00E9es
+export.user.data.explain=S\u00E9lectionner les \u00E9l\u00E9ments \u00E0 exporter pour cette utilisateur. L'exportation peut dur\u00E9e plusieurs heures, vous recevrez un courriel lorsqu'il sera termin\u00E9.
+export.user.data.none=D\u00E9claration de protection des donn\u00E9es
+export.user.data.notReady=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es export\u00E9es avec le lien suivant.
+export.user.data.processing=L'exportation est en cours.
+export.user.data.ready=L'utilisateur peut t\u00E9l\u00E9charger les donn\u00E9es avec le lien suivant. Vous pouvez \u00E9galement d\u00E9marrer une nouvelle exportation.
+export.user.data.ready.subject=Les donn\u00E9es pour "{0}" sont pr\u00EAtes.
+export.user.data.ready.text=<p>Les donn\u00E9es pour l'utilisateur "{0}" sont pr\u00EAtes. L'utilisateur peut les t\u00E9l\u00E9charger en suivant le lien <a href\="{1}">{1}</a>.</p>
+feeds=Blogues et podcasts
+forums=Forums
+group.memberships=Participations aux groupes
+gta=Devoirs
+logs=Logs
+mail=Courriels
+notes=Notes personnelles
+notifications=Abonnements
+personal.folders=Tous les documents des dossiers priv\u00E9 et public
+pf=Dossiers participants
+profile=toutes les donn\u00E9es du profil, inclus celles invisibles
+repository.memberships=Participations aux cours
-- 
GitLab