--- /dev/null
+package com.pentila.entSavoie.cdt.util;
+
+import java.io.IOException;
+import java.net.ConnectException;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.liferay.contacts.util.GroupFilter;
+import com.liferay.contacts.util.OrganizationFilter;
+import com.liferay.counter.service.CounterLocalServiceUtil;
+import com.liferay.portal.kernel.exception.PortalException;
+import com.liferay.portal.kernel.exception.SystemException;
+import com.liferay.portal.kernel.json.JSONArray;
+import com.liferay.portal.kernel.json.JSONFactoryUtil;
+import com.liferay.portal.kernel.json.JSONObject;
+import com.liferay.portal.kernel.log.Log;
+import com.liferay.portal.kernel.log.LogFactoryUtil;
+import com.liferay.portal.kernel.repository.model.FileEntry;
+import com.liferay.portal.kernel.repository.model.Folder;
+import com.liferay.portal.model.Group;
+import com.liferay.portal.model.Organization;
+import com.liferay.portal.model.Role;
+import com.liferay.portal.model.User;
+import com.liferay.portal.service.GroupLocalServiceUtil;
+import com.liferay.portal.service.OrganizationLocalServiceUtil;
+import com.liferay.portal.service.RoleLocalServiceUtil;
+import com.liferay.portal.service.UserLocalServiceUtil;
+import com.liferay.portal.theme.ThemeDisplay;
+import com.liferay.portal.util.comparator.UserLastNameComparator;
+import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
+import com.pentila.entSavoie.ENTDisplayUtil;
+import com.pentila.entSavoie.ENTRolesConstants;
+import com.pentila.entSavoie.ENTRolesUtil;
+import com.pentila.entSavoie.UserProfile;
+import com.pentila.entSavoie.cartable.service.CasierEntryLocalServiceUtil;
+import com.pentila.entSavoie.cdt.EdxWorkAssignmentUtil;
+import com.pentila.entSavoie.cdt.JSPPortlet;
+import com.pentila.entSavoie.cdt.model.CDTSession;
+import com.pentila.entSavoie.cdt.model.Homework;
+import com.pentila.entSavoie.cdt.model.HomeworkDone;
+import com.pentila.entSavoie.cdt.model.HomeworkDropboxFolder;
+import com.pentila.entSavoie.cdt.model.SessionTeacher;
+import com.pentila.entSavoie.cdt.model.StudentHomework;
+import com.pentila.entSavoie.edx.model.EdxWorkAssignment;
+import com.pentila.entSavoie.cdt.service.CDTSessionLocalServiceUtil;
+import com.pentila.entSavoie.cdt.service.HomeworkDoneLocalServiceUtil;
+import com.pentila.entSavoie.cdt.service.HomeworkDropboxFolderLocalServiceUtil;
+import com.pentila.entSavoie.cdt.service.HomeworkLocalServiceUtil;
+import com.pentila.entSavoie.cdt.service.SessionStudentLocalServiceUtil;
+import com.pentila.entSavoie.cdt.service.SessionTeacherLocalServiceUtil;
+import com.pentila.entSavoie.cdt.service.StudentHomeworkLocalServiceUtil;
+import com.pentila.entSavoie.edx.service.EdxWorkAssignmentLocalServiceUtil;
+import com.pentila.entSavoie.cdt.util.bean.AttachFile;
+import com.pentila.entSavoie.cdt.util.bean.HomeworkToAdd;
+import com.pentila.entSavoie.userManagement.service.UsersUtilsLocalServiceUtil;
+import com.pentila.entSavoie.utils.DLAppUtil;
+import com.pentila.entSavoie.utils.DLEntryUtil;
+import com.pentila.entSavoie.utils.ENTUserListUtil;
+import com.pentila.entSavoie.utils.FoldersUtil;
+
+import edu.emory.mathcs.backport.java.util.Arrays;
+
+public class HomeworkUtil {
+
+ private static Log logger = LogFactoryUtil.getLog(HomeworkUtil.class);
+
+ public static String FOLDER_PREFIX_RENAMED = "SUPPRIME - ";
+
+ /**
+ * Method to search and classify the homework (to do for a session or given from a session)
+ * @param sessions list of sessions to search homeworks
+ * @param homeworkToDoForSession return parameter, give empty map. Will map a session ID with the list of homework to do for the session
+ * @param homeworkGivenFromSession return parameter, give empty map. Will map a session ID with the list of homework given at the session
+ */
+ public static void getHomeworksForSessionList(List<CDTSession> sessions,
+ Map<Long,List<Homework>> homeworkToDoForSession, Map<Long,List<Homework>> homeworkGivenFromSession){
+ List<Homework> homeworkList = new ArrayList<Homework>();
+
+ try {
+ homeworkList = HomeworkLocalServiceUtil.getHomeworksAttachToSessions(sessions);
+ } catch (SystemException e) {
+ logger.error(e);
+ }
+
+ for(Homework anHomework : homeworkList){
+
+ // homework given at this sessions
+ if(anHomework.getSourceSessionId() != 0){
+ List<Homework> homeworkGivenList = homeworkGivenFromSession.get(anHomework.getSourceSessionId());
+ if(homeworkGivenList != null){
+ homeworkGivenList.add(anHomework);
+ }
+ else{
+ List<Homework> newHomeworkGivenList = new ArrayList<Homework>();
+ newHomeworkGivenList.add(anHomework);
+ homeworkGivenFromSession.put(anHomework.getSourceSessionId(), newHomeworkGivenList);
+ }
+ }
+
+ // homework to do for sessions
+ if(anHomework.getTargetSessionId() != 0){
+ List<Homework> homeworkToDoList = homeworkToDoForSession.get(anHomework.getSourceSessionId());
+ if(homeworkToDoList != null){
+ homeworkToDoList.add(anHomework);
+ }
+ else{
+ List<Homework> newHomeworkToDoList = new ArrayList<Homework>();
+ newHomeworkToDoList.add(anHomework);
+ homeworkToDoForSession.put(anHomework.getTargetSessionId(), newHomeworkToDoList);
+ }
+ }
+ }
+ }
+
+ /**
+ * Method to search and classify the homework (to do for a session or given from a session)
+ * @param homeworksLinkedToSession all homework linked to session
+ * @param session the session concern
+ * @param homeworkToDoForSession list of homework to do for the session, this is a return parameter
+ * @param homeworkGivenFromSession list of homework given at the session, this is a return parameter
+ */
+ public static void getHomeworksForASession(List<Homework> homeworksLinkedToSession, CDTSession session,
+ List<Homework> homeworkToDoForSession, List<Homework> homeworkGivenFromSession){
+
+ for(Homework anHomework : homeworksLinkedToSession){
+ if(anHomework.getSourceSessionId() == session.getSessionId()){
+ homeworkGivenFromSession.add(anHomework);
+ }
+ else if(anHomework.getTargetSessionId() == session.getSessionId()){
+ homeworkToDoForSession.add(anHomework);
+ }
+ }
+ }
+
+
+ /**
+ * Method to verify if a list of session has homework
+ * @param sessions list of sessions to search homeworks
+ * @return Map with session ID as parameter and a boolean as value. True if the session as at least and homework
+ * @throws ConnectException
+ */
+ public static Map<Long,Boolean> hasSessionListHomeworks(List<CDTSession> sessionsList) throws ConnectException{
+
+ Map<Long,Boolean> mapSessionHasHomework = new HashMap<Long,Boolean>();
+
+ if (sessionsList != null && sessionsList.size() > 0) {
+
+ try {
+ List<Homework> homeworkList = HomeworkLocalServiceUtil.getHomeworksAttachToSessions(sessionsList);
+
+ mapSessionHasHomework = initializeSessionHasHomeworkMap(sessionsList);
+
+ for(Homework anHomework : homeworkList){
+ if(anHomework.getSourceSessionId() != 0){
+ mapSessionHasHomework.put(anHomework.getSourceSessionId(), true);
+ }
+
+ if(anHomework.getTargetSessionId() != 0){
+ mapSessionHasHomework.put(anHomework.getTargetSessionId(), true);
+ }
+ }
+ } catch (SystemException e) {
+
+ logger.error(e);
+ throw new ConnectException();
+ }
+ }
+ return mapSessionHasHomework;
+ }
+
+ /**
+ * initialize the map with false value for all sessionId key
+ * @param sessions the sessions use to initilize th map
+ * @return
+ */
+ private static Map<Long,Boolean> initializeSessionHasHomeworkMap(List<CDTSession> sessionsList){
+ Map<Long,Boolean> mapSessionHasHomework = new HashMap<Long,Boolean>();
+
+ for(CDTSession aSession : sessionsList){
+ mapSessionHasHomework.put(aSession.getSessionId(), false);
+ }
+
+ return mapSessionHasHomework;
+ }
+
+ /**
+ * Returns the list of student homeworks to be done between the given date range
+ * @param minDate
+ * @param maxDate
+ * @return
+ */
+ public static JSONArray getStudentHomeworksForDateRange(ThemeDisplay themeDisplay, User student, Date minDate, Date maxDate) {
+
+ JSONArray homeworkArray = JSONFactoryUtil.createJSONArray();
+
+ if (minDate == null || maxDate == null) {
+ logger.error("Error while retrieving homework list : minDate and maxDate should not be null");
+ return homeworkArray;
+ }
+
+ List<Homework> homeworkList = HomeworkLocalServiceUtil.getHomeworksForStudentInDateRange(student, minDate, maxDate);
+ if (homeworkList != null && homeworkList.size() > 0) {
+
+ // Are the homework done ?
+ List<HomeworkDone> homeworkDoneList = new ArrayList<HomeworkDone>();
+ try {
+ homeworkDoneList = HomeworkDoneLocalServiceUtil.getHomeworkDoneFromHomeworkList(homeworkList);
+ } catch (Exception e) {
+ logger.error("Error when retrieving the homework done list for homework list", e);
+ return homeworkArray;
+ }
+
+ for (Homework homework : homeworkList) {
+
+ // Skip the homework if destinated to a student list and the current user does not belong to it
+ if (homework.getIsCustomStudentList()) {
+ boolean hasStudentHomework = StudentHomeworkLocalServiceUtil.hasStudentHomework(student.getUserId(), homework.getHomeworkId());
+ if (!hasStudentHomework) {
+ logger.info("Skipping homework "+homework.getHomeworkId()+" for student "+student.getUserId());
+ continue;
+ }
+ }
+
+ List<AttachFile> attachFileList = new ArrayList<AttachFile>();
+ if (homework.getHasAttachFile()){
+ // Get the homework's associated attach files
+ attachFileList = AttachFileUtil.getAttachFilesNames(themeDisplay, student.getCompanyId(), 0, homework.getHomeworkId());
+ logger.info("Adding "+attachFileList.size()+" attach files to homeworkId "+homework.getHomeworkId());
+ }
+
+ // Get HomeworkDone for given student and homework
+ List<HomeworkDone> studentHomeworkDoneList = new ArrayList<HomeworkDone>();
+
+ for (HomeworkDone homeworkDone : homeworkDoneList) {
+ if (homeworkDone.getStudentId() == student.getUserId()) {
+ studentHomeworkDoneList.add(homeworkDone);
+ }
+ }
+ JSONObject homeworkJson = JSONProxy.anHomeworkAsJson(homework, attachFileList, student, UserProfile.STUDENT.getId(), new ArrayList<User>(), studentHomeworkDoneList, new ArrayList<User>());
+ homeworkArray.put(homeworkJson);
+
+ }
+ }
+
+ return homeworkArray;
+ }
+
+ /**
+ * Returns the list of teacher given homeworks to do between the given date range
+ * @param minDate
+ * @param maxDate
+ * @return
+ */
+ public static JSONArray getTeacherHomeworksForDateRange(ThemeDisplay themeDisplay, User teacher, Date minDate, Date maxDate, long groupId) {
+
+ JSONArray homeworkArray = JSONFactoryUtil.createJSONArray();
+
+ if (minDate == null || maxDate == null) {
+ logger.error("Error while retrieving homework list : minDate and maxDate should not be null");
+ return homeworkArray;
+ }
+
+ List<Homework> homeworkList = HomeworkLocalServiceUtil.getHomeworksForTeacherInDateRange(teacher, minDate, maxDate, groupId);
+ if (homeworkList != null && homeworkList.size() > 0) {
+
+ // Are the homework done ?
+ List<HomeworkDone> homeworkDoneList = new ArrayList<HomeworkDone>();
+ try {
+ homeworkDoneList = HomeworkDoneLocalServiceUtil.getHomeworkDoneFromHomeworkList(homeworkList);
+ } catch (Exception e) {
+ logger.error("Error when retrieving the homework done list for homework list", e);
+ return homeworkArray;
+ }
+
+ Role studentRole = null;
+ try {
+ studentRole = RoleLocalServiceUtil.getRole(teacher.getCompanyId(), ENTRolesConstants.NATIONAL_1);
+
+ // Get the groups which have homework
+ List<Long> homeworkGroupIds = new ArrayList<Long>();
+ for (Homework homework : homeworkList) {
+ if (!homeworkGroupIds.contains(homework.getGroupId())) {
+ homeworkGroupIds.add(homework.getGroupId());
+ }
+ }
+
+ List<Group> homeworkGroups = GroupFilter.getGroupsFromGroupIds(homeworkGroupIds);
+ Map<Long, Group> mapGroupIdGroup = new HashMap<Long, Group>();
+
+ for (Group homeworkGroup : homeworkGroups) {
+ mapGroupIdGroup.put(homeworkGroup.getGroupId(), homeworkGroup);
+ }
+
+ for (Homework homework : homeworkList) {
+
+ List<AttachFile> attachFileList = new ArrayList<AttachFile>();
+ if (homework.getHasAttachFile()){
+ // Get the homework's associated attach files
+ attachFileList = AttachFileUtil.getAttachFilesNames(themeDisplay, teacher.getCompanyId(), 0, homework.getHomeworkId());
+ logger.info("Adding "+attachFileList.size()+" attach files to homeworkId "+homework.getHomeworkId());
+ }
+
+ // Get the students who have to do the homework
+ // Will change when integrate the homeworkgiven to specific user
+ List<User> sessionStudent = new ArrayList<User>();
+ String className = "";
+ if (homework.getGroupId() == 0) {
+ // SubClass
+ CDTSession sourceSession = CDTSessionLocalServiceUtil.getCDTSession(homework.getSourceSessionId());
+ sessionStudent = SessionStudentLocalServiceUtil.getStudentsBySession(sourceSession.getSessionId());
+ className = sourceSession.getParentClassName();
+ } else {
+ Group sessionGroup = mapGroupIdGroup.get(homework.getGroupId());
+ sessionStudent = ENTUserListUtil.getUserWithSpecificRoleForOrganization(
+ teacher.getCompanyId(),
+ studentRole,
+ sessionGroup.getClassPK(),
+ new UserLastNameComparator());
+ className = ENTDisplayUtil.formatSCONETName(teacher, sessionGroup.getName(), false);
+ }
+
+
+ // Get the list of students having this homework
+ List<User> assignedStudents = StudentHomeworkLocalServiceUtil.getHomeworkStudents(homework.getHomeworkId());
+
+ JSONObject homeworkJson = JSONProxy.anHomeworkAsJson(homework, attachFileList, teacher, UserProfile.TEACHER.getId(), sessionStudent, homeworkDoneList, className, assignedStudents);
+ homeworkArray.put(homeworkJson);
+
+ }
+ } catch (Exception e) {
+ logger.error(e);
+ }
+ }
+ return homeworkArray;
+ }
+
+ /**
+ * Get and order the homeworkdone per homework
+ * @param homeworksList
+ * @return Map<HomeworkId,List<HomeworkDone>>
+ */
+ public static Map<Long,List<HomeworkDone>> getHomeworkDoneForListHomeworks(List<Homework> homeworksList){
+ Map<Long,List<HomeworkDone>> mapHomeworkIdHomeworkDone = new HashMap<Long,List<HomeworkDone>>();
+ try {
+ List<HomeworkDone> homeworksDone = HomeworkDoneLocalServiceUtil.getHomeworkDoneFromHomeworkList(homeworksList);
+ for(HomeworkDone anHomeworkDone : homeworksDone){
+ List<HomeworkDone> homeworksDoneForHomework = mapHomeworkIdHomeworkDone.get(anHomeworkDone.getHomeworkId());
+ if(homeworksDoneForHomework == null || homeworksDoneForHomework.isEmpty()){
+ homeworksDoneForHomework = new ArrayList<HomeworkDone>();
+ homeworksDoneForHomework.add(anHomeworkDone);
+ mapHomeworkIdHomeworkDone.put(anHomeworkDone.getHomeworkId(), homeworksDoneForHomework);
+ }
+ else{
+ homeworksDoneForHomework.add(anHomeworkDone);
+ }
+ }
+ } catch (SystemException e) {
+ logger.error(e);
+ }
+ return mapHomeworkIdHomeworkDone;
+ }
+
+ /**
+ * Verify if current student has done the current homework from the list of homework done
+ * @param studentUser the student used to verify the homework is done
+ * @param listHomeworkDone
+ * @param isToBeSent if a file need to be sent, the user must have sent the file demanded
+ * @return true if user as done the homework
+ */
+ public static boolean isHomeworkDone(User studentUser, long homeworkId,
+ List<HomeworkDone> listHomeworkDone, boolean isToBeSent) {
+
+ if(listHomeworkDone == null || listHomeworkDone.isEmpty()){
+ return false;
+ }
+
+ for(HomeworkDone anHomeworkDone : listHomeworkDone){
+ if(homeworkId == anHomeworkDone.getHomeworkId() && anHomeworkDone.getStudentId() == studentUser.getUserId()){
+ if(isToBeSent){
+ return anHomeworkDone.getIsSent();
+ }
+ else{
+ return anHomeworkDone.getIsDone();
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ *
+ * @param listHomeworkDone
+ * @param theHomeworkToDo
+ * @return
+ */
+ public static List<User> getUserWhichDoneHomework(List<HomeworkDone> listHomeworkDone, Homework theHomeworkToDo){
+ List<Long> userIdHasHomeworkDone = new ArrayList<Long>();
+ // get the list of use which has done the homework
+
+ if(listHomeworkDone == null || listHomeworkDone.isEmpty()){
+ return new ArrayList<User>();
+ }
+
+ for(HomeworkDone anHomeworkDone : listHomeworkDone){
+ if( anHomeworkDone.getHomeworkId() == theHomeworkToDo.getHomeworkId() &&
+ ((theHomeworkToDo.isIsToBeSent() && anHomeworkDone.getIsSent()) ||
+ (!theHomeworkToDo.isIsToBeSent() && anHomeworkDone.getIsDone()))){
+ userIdHasHomeworkDone.add(anHomeworkDone.getStudentId());
+ }
+ }
+ return UsersUtilsLocalServiceUtil.getUserListFromUserIdList(userIdHasHomeworkDone);
+ }
+
+ /**
+ * Remove an homework from it's ID
+ * @param anHomeworkIdToRemove the id of homework to remove
+ * @param currentUser the user which delete the homework
+ */
+ public static void deleteAnHomeworkAndDependancies(long anHomeworkIdToRemove, User currentUser) {
+ try{
+ Homework anHomeworkToRemove = HomeworkLocalServiceUtil.getHomework(anHomeworkIdToRemove);
+ HomeworkUtil.deleteAnHomeworkAndDependancies(anHomeworkToRemove, currentUser);
+ }
+ catch(SystemException e){
+ logger.error(e);
+ }
+ catch (PortalException e) {
+ logger.error(e);
+ }
+ }
+
+ /**
+ * Remove an homework
+ * @param anHomeworkToRemove the id of homework to remove
+ * @param currentUser the user which delete the homework
+ */
+ public static void deleteAnHomeworkAndDependancies(Homework anHomeworkToRemove, User currentUser) {
+ try {
+ // Remove Homework done
+ HomeworkDoneLocalServiceUtil.removeHomeworkDoneFromHomework(anHomeworkToRemove);
+
+ // Remove student homework
+ StudentHomeworkLocalServiceUtil.removeStudentHomeworkFromHomework(anHomeworkToRemove);
+
+ // remove attach file
+ AttachFileUtil.deleteAllHomeworkAttachment(currentUser, anHomeworkToRemove);
+
+ // do not remove the sent file & rename folder
+ if(anHomeworkToRemove.isIsToBeSent()){
+ tagDropboxsFoldersAsDeleted(anHomeworkToRemove);
+ }
+
+ // remove the homework
+ HomeworkLocalServiceUtil.deleteHomework(anHomeworkToRemove);
+
+ } catch (SystemException e) {
+ logger.error("Error during homework removal : " + anHomeworkToRemove.getHomeworkId() , e);
+ } catch (PortalException e) {
+ logger.error("Error during homework removal : " + anHomeworkToRemove.getHomeworkId() , e);
+ }
+
+ }
+
+ private static void tagDropboxsFoldersAsDeleted(Homework anHomeworkToRemove) {
+
+ List<HomeworkDropboxFolder> homeworkDropboxs =
+ HomeworkDropboxFolderLocalServiceUtil.getDropboxFolderForHomework(anHomeworkToRemove.getHomeworkId());
+ for(HomeworkDropboxFolder anHomeworkDropbox : homeworkDropboxs){
+ Folder folder;
+ try {
+ folder = DLAppLocalServiceUtil.getFolder(anHomeworkDropbox.getFolderId());
+ DLAppUtil.updateFolder(folder, HomeworkUtil.FOLDER_PREFIX_RENAMED + folder.getName());
+ } catch (PortalException e) {
+ logger.warn("Homework return folder in dropbox seems to be deleted by user " +
+ anHomeworkDropbox.getTeacherId() + " for homework " + anHomeworkDropbox.getHomeworkId());
+ } catch (SystemException e) {
+ logger.warn("Homework return folder in dropbox seems to be deleted by user " +
+ anHomeworkDropbox.getTeacherId() + " for homework " + anHomeworkDropbox.getHomeworkId());
+ }
+
+ }
+
+ }
+
+ /**
+ * Create the dropbox folder
+ * @param anHomework
+ * @param currentUser
+ * @return
+ * @throws PortalException
+ * @throws SystemException
+ */
+ private static List<Folder> createDropboxsFolders(Homework anHomework, User homeworkCreator) throws PortalException, SystemException {
+ CDTSession sourceSession = CDTSessionLocalServiceUtil.getCDTSession(anHomework.getSourceSessionId());
+
+ List<SessionTeacher> teachers = SessionTeacherLocalServiceUtil.getSessionTeacherForASession(sourceSession);
+ String targetDate = JSPPortlet.frenchDateFormatFile.format(anHomework.getTargetDate());
+ List<Folder> folders = new ArrayList<Folder>();
+ String groupName = "";
+ if (anHomework.getGroupId() == 0) {
+ groupName = sourceSession.getParentClassName();
+ } else {
+
+ Group homeworkGroup = GroupLocalServiceUtil.getGroup(anHomework.getGroupId());
+ Organization homeworkOrg = OrganizationLocalServiceUtil.getOrganization(homeworkGroup.getClassPK());
+
+ if (homeworkOrg != null) {
+ groupName = ENTDisplayUtil.formatSCONETName(homeworkCreator, homeworkOrg.getName(), false);
+ }
+ else {
+ // It's a personnal group not an org
+ groupName = homeworkGroup.getName();
+ }
+ }
+
+ for(SessionTeacher aSessionTeacher : teachers){
+ Folder teacherDropBox = FoldersUtil.getDropBox(aSessionTeacher.getTeacherId());
+ folders.add(DLAppUtil.addFolder(aSessionTeacher.getTeacherId(),
+ teacherDropBox.getGroupId(),
+ teacherDropBox.getFolderId(),
+ "Devoir de " + groupName + " pour le " + targetDate));
+ }
+
+ return folders;
+ }
+
+ /**
+ * rename the dropbox folder for homework
+ * @param anHomework
+ * @param currentUser
+ * @return
+ * @throws PortalException
+ * @throws SystemException
+ */
+ private static void renameDropboxsFolders(Homework anHomework, User homeworkCreator) throws SystemException, PortalException {
+
+ String groupName = "";
+ if (anHomework.getGroupId() == 0) {
+ CDTSession sourceSession = CDTSessionLocalServiceUtil.getCDTSession(anHomework.getSourceSessionId());
+ groupName = sourceSession.getParentClassName();
+ } else {
+ Organization homeworkOrg = OrganizationLocalServiceUtil.getOrganization(GroupLocalServiceUtil.getGroup(anHomework.getGroupId()).getClassPK());
+ groupName = ENTDisplayUtil.formatSCONETName(homeworkCreator, homeworkOrg.getName(), false);
+ }
+
+
+ List<HomeworkDropboxFolder> homeworkDropboxs =
+ HomeworkDropboxFolderLocalServiceUtil.getDropboxFolderForHomework(anHomework.getHomeworkId());
+ for(HomeworkDropboxFolder anHomeworkDropbox : homeworkDropboxs){
+ try {
+ Folder folderToRename = DLAppLocalServiceUtil.getFolder(anHomeworkDropbox.getHomeworkDropboxFolderId());
+ String targetDate = JSPPortlet.frenchDateFormatFile.format(anHomework.getTargetDate());
+
+ DLAppUtil.updateFolder(folderToRename,"Devoir de " + groupName + " pour le " + targetDate);
+ }
+ catch (PortalException e) {
+ logger.warn("Homework return folder in dropbox seems to be deleted by user " +
+ anHomeworkDropbox.getTeacherId() + " for homework " + anHomeworkDropbox.getHomeworkId());
+ } catch (SystemException e) {
+ logger.warn("Homework return folder in dropbox seems to be deleted by user " +
+ anHomeworkDropbox.getTeacherId() + " for homework " + anHomeworkDropbox.getHomeworkId());
+ }
+ }
+
+ }
+
+ /**
+ * MEthod to add new homework
+ * @param homeworkToAddAsJSON
+ * @param userWhichAddHomework
+ * @return the homework as JSON
+ */
+ public static JSONObject addHomework(JSONObject homeworkToAddAsJSON,User userWhichAddHomework){
+ try {
+ HomeworkToAdd anHomeworkToAdd = new HomeworkToAdd(homeworkToAddAsJSON);
+ Homework newHomework = createHomework(anHomeworkToAdd,userWhichAddHomework);
+
+ List<User> sessionStudent = new ArrayList<User>();
+
+ if (anHomeworkToAdd.getSourceSession().getGroupId() == 0) {
+ // SubClass
+ sessionStudent = SessionStudentLocalServiceUtil.getStudentsBySession(anHomeworkToAdd.getSourceSession().getSessionId());
+ } else {
+
+ Group sessionGroup = GroupLocalServiceUtil.getGroup(anHomeworkToAdd.getSourceSession().getGroupId());
+ // Will change when integrate the homeworkgiven to specific user
+ sessionStudent = ENTUserListUtil.getUserWithSpecificRoleForOrganization(
+ userWhichAddHomework.getCompanyId(),
+ RoleLocalServiceUtil.getRole(userWhichAddHomework.getCompanyId(), ENTRolesConstants.NATIONAL_1),
+ sessionGroup.getClassPK(),
+ new UserLastNameComparator());
+ }
+
+
+ return JSONProxy.anHomeworkAsJson(newHomework,
+ new ArrayList<AttachFile>(),
+ null,
+ ENTRolesUtil.getUserProfile(userWhichAddHomework),
+ sessionStudent,
+ new ArrayList<HomeworkDone>(),
+ new ArrayList<User>());
+
+ } catch (ParseException e) {
+ logger.error("Can't homework to add from JSON",e);
+ return null;
+ } catch (SystemException e) {
+ logger.error("Can't homework to add from JSON",e);
+ return null;
+ } catch (PortalException e) {
+ logger.error("Can't homework to add from JSON",e);
+ return null;
+ }
+ }
+
+ /**
+ * Update homework. Don't need to manage attach files and users done and
+ * @param homeworkToAddAsJSON
+ * @param userWhichAddHomework
+ * @return the homework as JSON
+ * @throws SystemException
+ * @throws PortalException
+ * @throws ParseException
+ */
+ public static void updateHomework(JSONObject homeworkToUpdateAsJSON) throws PortalException, SystemException, ParseException{
+
+ Homework homeworkToUpdate = HomeworkLocalServiceUtil.getHomework(
+ homeworkToUpdateAsJSON.getLong("homeworkId"));
+ User homeworkCreator = UserLocalServiceUtil.getUser(homeworkToUpdate.getTeacherId());
+
+ // Disable homeworks to sent to teacher
+ boolean disableHomeworkDropboxFolder = homeworkToUpdate.getIsToBeSent() && !homeworkToUpdateAsJSON.getBoolean("toSentBack");
+ // enable homework to sent to teacher
+ boolean enableHomeworkDropboxFolder = !homeworkToUpdate.getIsToBeSent() && homeworkToUpdateAsJSON.getBoolean("toSentBack");
+ // have to rename the folder if is to be sent stay activated and target date change
+ boolean renamedNeededForDropboxFolder = homeworkToUpdate.getIsToBeSent() && homeworkToUpdateAsJSON.getBoolean("toSentBack") &&
+ !homeworkToUpdate.getTargetDate().equals(
+ JSPPortlet.FRONT_BACK_EXCHANGE_FORMAT.parse(homeworkToUpdateAsJSON.getString("toDate")));
+
+ // Type, source session , from date, attache file can't be changed when homework has update, they are define at creation and can't be change
+ Date toDate = JSPPortlet.FRONT_BACK_EXCHANGE_FORMAT.parse(homeworkToUpdateAsJSON.getString("toDate"));
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(toDate);
+ int weekId = cal.get(Calendar.WEEK_OF_YEAR);
+
+ homeworkToUpdate.setDescription(homeworkToUpdateAsJSON.getString("description"));
+ homeworkToUpdate.setEstimatedTime(homeworkToUpdateAsJSON.getLong("estimatedTime"));
+ homeworkToUpdate.setTargetDate(toDate);
+ homeworkToUpdate.setTargetSessionId(homeworkToUpdateAsJSON.getLong("targetSessionId"));
+ homeworkToUpdate.setTargetWeekId(weekId);
+ homeworkToUpdate.setIsToBeSent(homeworkToUpdateAsJSON.getBoolean("toSentBack"));
+
+ if(enableHomeworkDropboxFolder){
+ List<Folder> renderFolders = createDropboxsFolders(homeworkToUpdate, homeworkCreator);
+ HomeworkDropboxFolderLocalServiceUtil.createHomeworkDropboxFolderForHormework(renderFolders, homeworkToUpdate);
+ }
+
+ // Now handle homeworks and edx assignments
+ JSONArray selectedEdxWorkAssignments = homeworkToUpdateAsJSON.getJSONArray("edxWorkAssignments");
+ JSONArray selectedStudents = homeworkToUpdateAsJSON.getJSONArray("selectedStudents");
+ JSONArray groupStudents = homeworkToUpdateAsJSON.getJSONArray("groupStudents");
+
+ // Build the list of selected student ids
+ List<Long> selectedStudentIds = new ArrayList<Long>();
+ for (int i = 0 ; i < selectedStudents.length() ; i++) {
+ try {
+ long selectedStudentId = Long.parseLong(selectedStudents.getJSONObject(i).getString("userId"));
+ selectedStudentIds.add(selectedStudentId);
+ } catch (Exception e) {
+ logger.error("Error when getting student id", e);
+ continue;
+ }
+ }
+
+
+ // The are 4 CASES:
+ // 1. group -> student list
+ // 2. group -> group
+ // 3. student list -> group
+ // 4. student list -> student list
+
+ // Case 1 : was assigned to group, now is assigned to a student list
+ if (!homeworkToUpdate.isIsCustomStudentList()
+ && selectedStudents.length() > 0
+ && selectedStudents.length() < groupStudents.length()) {
+ logger.info("Homework update - Case 1 : group -> student list");
+ homeworkToUpdate.setIsCustomStudentList(true);
+
+ // Assign homework to each selected student
+ for (Long selectedStudentId : selectedStudentIds) {
+ logger.info("Enrolling student "+selectedStudentId+" to homework "+homeworkToUpdate.getHomeworkId());
+ StudentHomeworkLocalServiceUtil.addStudentHomework(selectedStudentId, homeworkToUpdate.getHomeworkId());
+ }
+
+ // Remove edx assignments to the whole group
+ EdxWorkAssignmentLocalServiceUtil.removeGroupAssignments(homeworkToUpdate.getHomeworkId());
+
+ // Add selected edx work to selected students
+ for (int i = 0 ; i < selectedEdxWorkAssignments.length() ; i++) {
+ JSONObject edxWorkAssignment = selectedEdxWorkAssignments.getJSONObject(i);
+ EdxWorkAssignmentLocalServiceUtil.assignEdxWorkToStudentList(
+ selectedStudentIds,
+ edxWorkAssignment.getString("courseId"),
+ edxWorkAssignment.getString("edxId"),
+ edxWorkAssignment.getString("fullTitle"),
+ Integer.parseInt(edxWorkAssignment.getString("type")),
+ homeworkToUpdate.getTeacherId(),
+ homeworkToUpdate.getTargetDate(),
+ homeworkToUpdate.getHomeworkId(),
+ true);
+ }
+
+ // Case 2 : was and is still assigned to the whole group
+ } else if (!homeworkToUpdate.isIsCustomStudentList()
+ && (selectedStudents.length() == 0
+ || selectedStudents.length() == groupStudents.length())) {
+
+ logger.info("Homework update - Case 3 : group -> group");
+
+ // Nothing to do for homeworks
+
+ // Remove for group all edx assignments
+ EdxWorkAssignmentLocalServiceUtil.removeGroupAssignments(homeworkToUpdate.getHomeworkId());
+
+ // Add for group all selected edx assignments
+ for (int i = 0 ; i < selectedEdxWorkAssignments.length() ; i++) {
+ JSONObject edxWorkAssignment = selectedEdxWorkAssignments.getJSONObject(i);
+ EdxWorkAssignmentLocalServiceUtil.assignEdxWorkToGroup(
+ homeworkToUpdate.getGroupId(),
+ edxWorkAssignment.getString("courseId"),
+ edxWorkAssignment.getString("edxId"),
+ edxWorkAssignment.getString("fullTitle"),
+ Integer.parseInt(edxWorkAssignment.getString("type")),
+ homeworkToUpdate.getTeacherId(),
+ homeworkToUpdate.getTargetDate(),
+ homeworkToUpdate.getHomeworkId(),
+ true);
+ }
+
+ // Case 3 : was assigned to a student list, now is assigned to the whole group
+ } else if (homeworkToUpdate.isIsCustomStudentList()
+ && (selectedStudents.length() == 0
+ || selectedStudents.length() == groupStudents.length())) {
+ logger.info("Homework update - Case 2 : student list -> group");
+
+ // Remove homework assignments from students
+ StudentHomeworkLocalServiceUtil.removeStudentHomeworkFromHomework(homeworkToUpdate);
+
+ // Assign homework and edx to the whole group
+ homeworkToUpdate.setIsCustomStudentList(false);
+
+ // Remove edx assignments from students
+ EdxWorkAssignmentLocalServiceUtil.removeStudentAssignments(homeworkToUpdate.getHomeworkId());
+
+ // Add edx ssignments for the whole group
+ for (int i = 0 ; i < selectedEdxWorkAssignments.length() ; i++) {
+ JSONObject edxWorkAssignment = selectedEdxWorkAssignments.getJSONObject(i);
+ EdxWorkAssignmentLocalServiceUtil.assignEdxWorkToGroup(
+ homeworkToUpdate.getGroupId(),
+ edxWorkAssignment.getString("courseId"),
+ edxWorkAssignment.getString("edxId"),
+ edxWorkAssignment.getString("fullTitle"),
+ Integer.parseInt(edxWorkAssignment.getString("type")),
+ homeworkToUpdate.getTeacherId(),
+ homeworkToUpdate.getTargetDate(),
+ homeworkToUpdate.getHomeworkId(),
+ true);
+ }
+
+ // Case 4 : was and is still assigned to a subset of students
+ } else {
+
+ logger.info("Homework update - Case 4 : student list -> student list");
+
+ // Unassign homework to all students
+ StudentHomeworkLocalServiceUtil.removeStudentHomeworkFromHomework(homeworkToUpdate);
+
+ // Assign homework to new students
+ for (Long selectedStudentId : selectedStudentIds) {
+ logger.info("Enrolling student "+selectedStudentId+" to homework "+homeworkToUpdate.getHomeworkId());
+ StudentHomeworkLocalServiceUtil.addStudentHomework(selectedStudentId, homeworkToUpdate.getHomeworkId());
+ }
+
+ // Remove all edx assignments in this homework for all students
+ EdxWorkAssignmentLocalServiceUtil.removeStudentAssignments(homeworkToUpdate.getHomeworkId());
+
+ // Add selected edx work to students to enroll
+ for (int i = 0 ; i < selectedEdxWorkAssignments.length() ; i++) {
+ JSONObject edxWorkAssignment = selectedEdxWorkAssignments.getJSONObject(i);
+ EdxWorkAssignmentLocalServiceUtil.assignEdxWorkToStudentList(
+ selectedStudentIds,
+ edxWorkAssignment.getString("courseId"),
+ edxWorkAssignment.getString("edxId"),
+ edxWorkAssignment.getString("fullTitle"),
+ Integer.parseInt(edxWorkAssignment.getString("type")),
+ homeworkToUpdate.getTeacherId(),
+ homeworkToUpdate.getTargetDate(),
+ homeworkToUpdate.getHomeworkId(),
+ true);
+ }
+
+ }
+
+
+ HomeworkLocalServiceUtil.updateHomework(homeworkToUpdate);
+
+ if(disableHomeworkDropboxFolder){
+ tagDropboxsFoldersAsDeleted(homeworkToUpdate);
+ }
+ else if(renamedNeededForDropboxFolder){
+ renameDropboxsFolders(homeworkToUpdate, homeworkCreator);
+ }
+ }
+
+ /**
+ * MEthod which create homework from HomeworkTOAdd Object
+ * @param homeworkToAdd
+ * @param userWhichAddHomework
+ * @return
+ * @throws SystemException
+ */
+ public static Homework createHomework(HomeworkToAdd homeworkToAdd, User userWhichAddHomework) throws SystemException{
+ long homeworkId = CounterLocalServiceUtil.increment();
+ Homework homework = HomeworkLocalServiceUtil.createHomework(homeworkId);
+ // get target week
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(homeworkToAdd.getToDate());
+ int weekId = cal.get(Calendar.WEEK_OF_YEAR);
+
+ homework.setSourceSessionId(homeworkToAdd.getSourceSessionId());
+ homework.setTargetSessionId(homeworkToAdd.getTargetSessionId());
+ homework.setTargetWeekId(weekId);
+ homework.setTargetDate(homeworkToAdd.getToDate());
+ homework.setGroupId(homeworkToAdd.getSourceSession().getGroupId());
+ homework.setTeacherId(userWhichAddHomework.getUserId());
+ homework.setEstimatedTime(30); // default value
+ homework.setFromDate(homeworkToAdd.getFromDate());
+ homework.setHasAttachFile(false);
+ homework.setIsToBeSent(false);
+ homework.setIsCustomStudentList(false);
+ homework.setType(homeworkToAdd.getType());
+
+ HomeworkLocalServiceUtil.updateHomework(homework);
+
+ return homework;
+ }
+
+ /**
+ * Manage student file as homework return. Copy the file into the homework return folder in teacher dropbox.
+ * Set homework done for student
+ * @param fileId file ID to copy
+ * @param homeworkId the homework concern
+ * @param student student which sent the file
+ * @throws PortalException
+ * @throws SystemException
+ * @throws IOException
+ */
+ public static void sendHomeworkToDropbox(Long fileId, Long homeworkId, User student)
+ throws PortalException, SystemException, IOException {
+ Homework homework = HomeworkLocalServiceUtil.getHomework(homeworkId);
+ String studentName = student.getFullName();
+
+ List<HomeworkDropboxFolder> homeworkDropboxs =
+ HomeworkDropboxFolderLocalServiceUtil.getDropboxFolderForHomework(homework.getHomeworkId());
+ FileEntry file = null;
+ for(HomeworkDropboxFolder anhomeworkDropbox : homeworkDropboxs){
+ // verify drop exist or recreateIt
+ Folder dropboxFolder = HomeworkUtil.verifyDropboxExistsOrCreateIt(anhomeworkDropbox, homework);
+ file = DLEntryUtil.copyFileEntry(anhomeworkDropbox.getTeacherId(), fileId, dropboxFolder.getFolderId());
+ String title = "Devoir rendu le "+ JSPPortlet.frenchDateFormatFile.format(new Date()) + " par " + studentName;
+ CasierEntryLocalServiceUtil.addCasierEntry(student.getCompanyId(), dropboxFolder.getGroupId(), file.getFileEntryId(), student.getUserId(), title, true);
+ DLAppUtil.updateFileEntry(file, title);
+ }
+ // set homework done for student
+ HomeworkDone studentHomeworkDone = HomeworkDoneLocalServiceUtil.
+ getOrCreateHomeworkDoneForStudentOnHomework(homeworkId, student.getUserId());
+ studentHomeworkDone.setGroupId(homework.getGroupId());
+ studentHomeworkDone.setIsSent(true);
+ studentHomeworkDone.setSentFileId(file.getFileEntryId());
+ HomeworkDoneLocalServiceUtil.updateHomeworkDone(studentHomeworkDone);
+ }
+
+
+ private static Folder verifyDropboxExistsOrCreateIt(HomeworkDropboxFolder anHomeworkDropbox, Homework homework) throws SystemException, PortalException {
+ Folder dropboxFromId = null;
+ try {
+ dropboxFromId = DLAppLocalServiceUtil.getFolder(anHomeworkDropbox.getFolderId());
+ if(dropboxFromId == null){
+ dropboxFromId = createHomeworkDropboxFolderAndUpdate(anHomeworkDropbox, homework);
+ }
+ } catch (PortalException e) {
+ dropboxFromId = createHomeworkDropboxFolderAndUpdate(anHomeworkDropbox, homework);
+
+ } catch (SystemException e) {
+ dropboxFromId = createHomeworkDropboxFolderAndUpdate(anHomeworkDropbox, homework);
+
+ }
+ return dropboxFromId;
+ }
+
+ /**
+ * Create a specific Homework dropbox folder for a user and a homework
+ * and update the HomeworkDropboxFolder object
+ * @param anHomeworkDropbox
+ * @param homework
+ * @throws SystemException
+ * @throws PortalException
+ */
+ private static Folder createHomeworkDropboxFolderAndUpdate(HomeworkDropboxFolder anHomeworkDropbox, Homework homework)
+ throws SystemException, PortalException {
+ Folder dropboxFromId = createAnHomeworkDropboxFolder(anHomeworkDropbox.getTeacherId(), homework);
+ anHomeworkDropbox.setFolderId(dropboxFromId.getFolderId());
+ HomeworkDropboxFolderLocalServiceUtil.updateHomeworkDropboxFolder(anHomeworkDropbox);
+ return dropboxFromId;
+ }
+
+ /**
+ * Create a specific Homework dropbox folder for a user and a homework
+ * @param teacherId
+ * @param homework
+ * @return
+ * @throws SystemException
+ * @throws PortalException
+ */
+ private static Folder createAnHomeworkDropboxFolder(long teacherId, Homework homework)
+ throws SystemException, PortalException {
+
+ String targetDate = JSPPortlet.frenchDateFormatFile.format(homework.getTargetDate());
+
+ String groupName = "";
+ if (homework.getGroupId() == 0) {
+ CDTSession sourceSession = CDTSessionLocalServiceUtil.getCDTSession(homework.getSourceSessionId());
+ groupName = sourceSession.getParentClassName();
+ } else {
+ Organization homeworkOrg = OrganizationLocalServiceUtil.getOrganization(GroupLocalServiceUtil.getGroup(homework.getGroupId()).getClassPK());
+ groupName = ENTDisplayUtil.formatSCONETName(homeworkOrg.getCompanyId(), homeworkOrg.getName(), false);
+ }
+
+ Folder teacherDropBox = FoldersUtil.getDropBox(teacherId);
+ return DLAppUtil.addFolder(teacherId,
+ teacherDropBox.getGroupId(),
+ teacherDropBox.getFolderId(),
+ "Devoir de " + groupName + " pour le " + targetDate);
+ }
+
+ /**
+ * Set homework done for a student and an homework
+ * @param done
+ * @param homeworkId
+ * @param student
+ * @throws PortalException
+ * @throws SystemException
+ */
+ public static void setHomeworkDone(boolean done, long homeworkId, User student)
+ throws PortalException, SystemException {
+ Homework homework = HomeworkLocalServiceUtil.getHomework(homeworkId);
+ HomeworkDone homeworkDone = HomeworkDoneLocalServiceUtil.
+ getOrCreateHomeworkDoneForStudentOnHomework(homeworkId, student.getUserId());
+ homeworkDone.setIsDone(done);
+ homeworkDone.setGroupId(homework.getGroupId());
+ HomeworkDoneLocalServiceUtil.updateHomeworkDone(homeworkDone);
+ }
+
+ /**
+ * This method copy all homework in JSON to targetSession
+ * @param homeworksAsJSON
+ * @param targetSession
+ * @throws PortalException
+ * @throws SystemException
+ * @throws ParseException
+ */
+ public static void copyHomeworksFromSessionToAnother(long companyId, JSONArray homeworksAsJSON, CDTSession targetSession)
+ throws PortalException, SystemException, ParseException {
+ for(int i = 0; i < homeworksAsJSON.length() ; i++){
+ JSONObject homeworkAsJSON= homeworksAsJSON.getJSONObject(i);
+ long homeworkSourceId = homeworkAsJSON.getLong("homeworkId");
+ Homework homeworkToCopy = HomeworkLocalServiceUtil.getHomework(homeworkSourceId);
+ Date copiedHomeworkToDate = JSPPortlet.FRONT_BACK_EXCHANGE_FORMAT.parse(homeworkAsJSON.getString("toDate"));
+ // get target week
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(copiedHomeworkToDate);
+ int weekId = cal.get(Calendar.WEEK_OF_YEAR);
+
+ long homeworkTargetId = CounterLocalServiceUtil.increment();
+ Homework copiedHomework = HomeworkLocalServiceUtil.createHomework(homeworkTargetId);
+ copiedHomework.setDescription(homeworkToCopy.getDescription());
+ copiedHomework.setType(homeworkToCopy.getType());
+ copiedHomework.setEstimatedTime(homeworkToCopy.getEstimatedTime());
+ copiedHomework.setFromDate(targetSession.getSessionStart());
+ copiedHomework.setSourceSessionId(targetSession.getSessionId());
+ copiedHomework.setTargetDate(copiedHomeworkToDate);
+ copiedHomework.setTargetWeekId(weekId);
+ copiedHomework.setTargetSessionId(homeworkAsJSON.getLong("targetSessionId",0));
+ copiedHomework.setIsToBeSent(homeworkToCopy.getIsToBeSent());
+ copiedHomework.setGroupId(targetSession.getGroupId());
+
+ int numberOfFileCopy =0;
+ if(homeworkToCopy.getHasAttachFile()){
+ numberOfFileCopy = AttachFileUtil.copyAttachFileFromHomeworkToAnother(companyId, homeworkSourceId, homeworkTargetId);
+ }
+ if(numberOfFileCopy > 0){
+ copiedHomework.setHasAttachFile(true);
+ }
+ else{
+ copiedHomework.setHasAttachFile(false);
+ }
+
+ HomeworkLocalServiceUtil.updateHomework(copiedHomework);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public static List<Long> parseDropboxFoldersId(String dropboxFoldersIds){
+ return (List<Long>) Arrays.asList(
+ DataUtil.stringIdsArrayToLongArray(dropboxFoldersIds));
+ }
+
+ public static String buildDropboxFoldersId(List<Folder> dropboxFolderLisgt){
+ StringBuilder folderIdsAsString = new StringBuilder();
+ for(Folder aDropbox : dropboxFolderLisgt){
+ folderIdsAsString.append(aDropbox.getFolderId());
+ }
+ return folderIdsAsString.toString();
+ }
+
+}