diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java index 39435210174dcaa76363ad6c2183c443685b2c19..7fe5fb3333327114603e36d6e3da2611bb723101 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/config/GFApplicationBinder.java @@ -11,6 +11,7 @@ import unipotsdam.gf.interfaces.IGroupFinding; import unipotsdam.gf.interfaces.IJournal; import unipotsdam.gf.interfaces.IPeerAssessment; import unipotsdam.gf.interfaces.IPhases; +import unipotsdam.gf.interfaces.IReflectionService; import unipotsdam.gf.modules.annotation.controller.AnnotationController; import unipotsdam.gf.modules.annotation.controller.FeedbackImpl; import unipotsdam.gf.modules.assessment.controller.service.AssessmentDBCommunication; @@ -38,6 +39,7 @@ import unipotsdam.gf.modules.project.Management; import unipotsdam.gf.modules.project.ManagementImpl; import unipotsdam.gf.modules.project.ProjectConfigurationDAO; import unipotsdam.gf.modules.project.ProjectDAO; +import unipotsdam.gf.modules.reflection.service.ReflectionService; import unipotsdam.gf.modules.researchreport.DummyResearchReportManagement; import unipotsdam.gf.modules.researchreport.ResearchReportManagement; import unipotsdam.gf.modules.submission.controller.SubmissionController; @@ -117,5 +119,6 @@ public class GFApplicationBinder extends AbstractBinder { bind(UnirestService.class).to(UnirestService.class); bind(ContributionFeedbackService.class).to(IContributionFeedback.class); bind(ContributionFeedbackDAO.class).to(ContributionFeedbackDAO.class); + bind(ReflectionService.class).to(IReflectionService.class); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IReflectionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IReflectionService.java new file mode 100644 index 0000000000000000000000000000000000000000..26918a20310908abacd7c08128ed94a3ae4b798c --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IReflectionService.java @@ -0,0 +1,12 @@ +package unipotsdam.gf.interfaces; + +import unipotsdam.gf.modules.group.Group; +import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.process.phases.Phase; + +public interface IReflectionService { + + void startOptionalPortfolioTask(Project project, Group group, Phase phase); + + void finishOptionalPortfolioTask(Project project, Group group, Phase phase); +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java index f2d568593286eb5c8392ba9f2f7c6a63937e8203..622b4bb7a4fdc12c27f9f4ed8e8d590a3773a707 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/communication/service/CommunicationService.java @@ -11,7 +11,6 @@ import unipotsdam.gf.exceptions.RocketChatDownException; import unipotsdam.gf.exceptions.UserDoesNotExistInRocketChatException; import unipotsdam.gf.exceptions.UserExistsInRocketChatException; import unipotsdam.gf.interfaces.ICommunication; -import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier; import unipotsdam.gf.modules.communication.model.EMailMessage; import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.communication.model.chat.ChatMessage; @@ -24,35 +23,15 @@ import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.modules.user.UserDAO; -import unipotsdam.gf.process.constraints.ConstraintsMessages; import javax.annotation.ManagedBean; import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; -import javax.mail.Authenticator; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; import javax.ws.rs.core.Response; -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; +import java.util.*; import java.util.stream.Collectors; -import static unipotsdam.gf.config.GFMailConfig.SMTP_HOST; -import static unipotsdam.gf.config.GFMailConfig.SMTP_PASSWORD; -import static unipotsdam.gf.config.GFMailConfig.SMTP_PORT; -import static unipotsdam.gf.config.GFMailConfig.SMTP_USERNAME; -import static unipotsdam.gf.config.GFRocketChatConfig.ADMIN_USER; import static unipotsdam.gf.config.GFRocketChatConfig.ROCKET_CHAT_API_LINK; import static unipotsdam.gf.config.GFRocketChatConfig.ROCKET_CHAT_ROOM_LINK; @@ -118,10 +97,9 @@ public class CommunicationService implements ICommunication { //loginUser(ADMIN_USER); Map<String, String> headerMap = new RocketChatHeaderMapBuilder().withRocketChatAdminAuth(this).build(); - List<String> usernameList = member.stream().map(User::getRocketChatUsername).collect(Collectors.toList()); HashMap<String, Object> bodyMap = new HashMap<>(); - bodyMap.put("name", name); + bodyMap.put("name", specialFreeName(name)); bodyMap.put("readOnly", readOnly); bodyMap.put("members", usernameList); @@ -362,8 +340,7 @@ public class CommunicationService implements ICommunication { throws RocketChatDownException, UserDoesNotExistInRocketChatException { //loginUser(ADMIN_USER); - - String chatRoomId = groupDAO.getGroupChatRoomId(new User(userEmail), new Project(projectName)); + String chatRoomId = groupDAO.getGroupChatRoomId(new User(userEmail), specialFreeName(projectName)); if (chatRoomId.isEmpty()) { return Strings.EMPTY; } @@ -378,7 +355,7 @@ public class CommunicationService implements ICommunication { @Override public String getProjectChatRoomLink(String projectName) { - return ROCKET_CHAT_ROOM_LINK + projectName + "?layout=embedded"; + return ROCKET_CHAT_ROOM_LINK + specialFreeName(projectName) + "?layout=embedded"; } @@ -485,7 +462,9 @@ public class CommunicationService implements ICommunication { // wenn der Nutzer nicht existiert, brauchen wir ihn auch nicht löschen } } + } - + private String specialFreeName(String name) { + return String.valueOf(name.hashCode()); } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java index 7d26a9a38a1b8052d808a46cab45f72a08994286..689c5241375e3845b3e314939647e86de8adda70 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileManagementService.java @@ -20,6 +20,7 @@ import org.htmlcleaner.TagNode; import org.jsoup.Jsoup; import org.jsoup.select.Elements; import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest; import unipotsdam.gf.modules.user.User; import javax.imageio.ImageIO; @@ -78,15 +79,25 @@ public class FileManagementService { fileManagementDAO.writeFileMetaToDB(user, project, fileName, fileRole, fileDetail.getFileName()); } - public void saveStringAsPDF(User user, Project project, String fileContent, FormDataContentDisposition fileDetail, - FileRole fileRole, FileType fileType) throws IOException, DocumentException { - fileContent = cleanHTML(fileContent); - //fileContent = manipulateIndentation(fileContent); + private void saveStringAsPDF(User user, Project project, String fileContent, FormDataContentDisposition fileDetail, + FileRole fileRole, FileType fileType) throws IOException, DocumentException { + if (fileType.equals(FileType.HTML)) { + fileContent = cleanHTML(fileContent); + //fileContent = manipulateIndentation(fileContent); + } InputStream inputStream = IOUtils.toInputStream(fileContent); saveFileAsPDF(user, project, inputStream, fileDetail, fileRole, fileType); } + public void saveStringAsPDF(User user, Project project, FullSubmissionPostRequest fullSubmissionPostRequest) throws IOException, DocumentException { + String fileName = fullSubmissionPostRequest.getContributionCategory() + "_" + user.getEmail() + ".pdf"; + String categoryString = fullSubmissionPostRequest.getContributionCategory().toString(); + FormDataContentDisposition.FormDataContentDispositionBuilder builder = FormDataContentDisposition.name(categoryString).fileName(fileName); + // TODO: merge FileRole with ContributionCategory? + saveStringAsPDF(user, project, fullSubmissionPostRequest.getHtml(), builder.build(), FileRole.DOSSIER, FileType.HTML); + } + private String saveHTMLAsPDF(InputStream inputStream, String filenameWithoutExtension) throws IOException, DocumentException { String fileName = filenameWithoutExtension + ".pdf"; String path = getFullPath(fileName); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java index 247a339993e9a27251d9213955c788b577e4eee4..1969b189f75e66bb38cc1d6fd34f0321644c2b32 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/fileManagement/FileRole.java @@ -1,5 +1,5 @@ package unipotsdam.gf.modules.fileManagement; public enum FileRole { - DOSSIER, LEARNINGGOALS, EXTRA, PRESENTATION + DOSSIER, LEARNINGGOALS, EXTRA, PRESENTATION, PORTFOLIO } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java index 2519b55139432cdfe772dd983fefb58ed1bc6859..b217d775ef68c2301da5265e655445e2a1bf8342 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/Group.java @@ -80,7 +80,7 @@ public class Group { @Override public boolean equals(Object o) { - if (Object.class.equals(Group.class)){ + if (o instanceof Group) { Group group = (Group) o; return this.getId() == group.getId(); }else{ diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java index b0622aafae480b095e1cdaa5687db17149908c62..71e0913fdf74dcdb2754438c4dc4c459b158a11b 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/group/GroupDAO.java @@ -125,6 +125,30 @@ public class GroupDAO { return uniqueGroups; } + public Group getGroupByGroupId(Integer groupId) { + connect.connect(); + String mysqlRequest = "SELECT * FROM groups g " + + "JOIN groupuser gu ON g.id=gu.groupId " + + "JOIN users u ON " + + "gu.userEmail=u.email " + + "where g.id= ?"; + VereinfachtesResultSet vereinfachtesResultSet = connect.issueSelectStatement(mysqlRequest, groupId); + List<User> members = new ArrayList<>(); + String projectName = ""; + String rocketChatId = ""; + String groupName = ""; + while (vereinfachtesResultSet.next()) { + members.add(userDAO.getUserByEmail(vereinfachtesResultSet.getString("userEmail"))); + projectName = vereinfachtesResultSet.getString("projectName"); + rocketChatId = vereinfachtesResultSet.getString("chatRoomId"); + groupName = vereinfachtesResultSet.getString("name"); + } + Group group = new Group(groupId, members, projectName, rocketChatId); + group.setName(groupName); + connect.close(); + return group; + } + public List<Group> getOriginalGroupsByProjectName(String projectName) { connect.connect(); String mysqlRequest = "SELECT * FROM originalgroups where projectName = ?"; @@ -161,6 +185,10 @@ public class GroupDAO { return groupId; } + public Group getMyGroup(User user, Project project) { + int groupId = getMyGroupId(user, project); + return getGroupByGroupId(groupId); + } private void fillGroupFromResultSet(ArrayList<Group> groups, VereinfachtesResultSet vereinfachtesResultSet, Boolean withRocketChatId) { @@ -190,14 +218,14 @@ public class GroupDAO { return groupFormationMechanism; } - public String getGroupChatRoomId(User user, Project project) { + public String getGroupChatRoomId(User user, String projectName) { connect.connect(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("SELECT g.chatRoomId FROM groups g "); stringBuilder.append("join groupuser gu on g.id=gu.groupId "); stringBuilder.append("where g.projectName=? and gu.userEmail=?"); - VereinfachtesResultSet resultSet = connect.issueSelectStatement(stringBuilder.toString(), project.getName(), + VereinfachtesResultSet resultSet = connect.issueSelectStatement(stringBuilder.toString(), projectName, user.getEmail()); if (Objects.isNull(resultSet)) { connect.close(); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/reflection/service/ReflectionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/reflection/service/ReflectionService.java new file mode 100644 index 0000000000000000000000000000000000000000..8329a231ca6a121db9b9937aaa01a5cd1b256419 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/reflection/service/ReflectionService.java @@ -0,0 +1,42 @@ +package unipotsdam.gf.modules.reflection.service; + +import unipotsdam.gf.interfaces.IReflectionService; +import unipotsdam.gf.modules.group.Group; +import unipotsdam.gf.modules.project.Project; +import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.process.phases.Phase; +import unipotsdam.gf.process.tasks.Importance; +import unipotsdam.gf.process.tasks.Progress; +import unipotsdam.gf.process.tasks.Task; +import unipotsdam.gf.process.tasks.TaskDAO; +import unipotsdam.gf.process.tasks.TaskName; + +import javax.annotation.ManagedBean; +import javax.annotation.Resource; +import javax.inject.Inject; + +@ManagedBean +@Resource +public class ReflectionService implements IReflectionService { + + @Inject + private TaskDAO taskDAO; + + public void startOptionalPortfolioTask(Project project, Group group, Phase phase) { + group.getMembers().forEach(target -> { + persistOptionalEntryTask(project, target, Progress.JUSTSTARTED, phase); + }); + + } + + public void finishOptionalPortfolioTask(Project project, Group group, Phase phase) { + group.getMembers().forEach(target -> { + persistOptionalEntryTask(project, target, Progress.FINISHED, phase); + }); + } + + private void persistOptionalEntryTask(Project project, User target, Progress progress, Phase phase) { + Task task = taskDAO.createUserDefaultWithoutDeadline(project, target, TaskName.OPTIONAL_PORTFOLIO_ENTRY, phase, Importance.LOW, progress); + taskDAO.persist(task); + } +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java index c51c49286901ac4d47fb49b580aa6d32f73af972..3e202baddc1ced7a4d586e7b4b1a0d60ab410861 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java @@ -5,14 +5,20 @@ import org.slf4j.LoggerFactory; import unipotsdam.gf.interfaces.ISubmission; import unipotsdam.gf.modules.annotation.model.Category; import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory; +import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.project.ProjectDAO; -import unipotsdam.gf.modules.submission.model.*; +import unipotsdam.gf.modules.submission.model.FullSubmission; +import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest; +import unipotsdam.gf.modules.submission.model.SubmissionPart; +import unipotsdam.gf.modules.submission.model.SubmissionPartBodyElement; +import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest; +import unipotsdam.gf.modules.submission.model.SubmissionProjectRepresentation; +import unipotsdam.gf.modules.submission.model.Visibility; import unipotsdam.gf.modules.submission.view.SubmissionRenderData; import unipotsdam.gf.modules.user.User; -import unipotsdam.gf.modules.user.UserDAO; import unipotsdam.gf.mysql.MysqlConnect; import unipotsdam.gf.mysql.VereinfachtesResultSet; import unipotsdam.gf.process.progress.HasProgress; @@ -25,6 +31,7 @@ import unipotsdam.gf.process.tasks.TaskName; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; /** @@ -34,12 +41,13 @@ import java.util.UUID; public class SubmissionController implements ISubmission, HasProgress { private static final org.slf4j.Logger log = LoggerFactory.getLogger(SubmissionController.class); + @Inject private MysqlConnect connection; - @Inject - private UserDAO userDAO; + @Inject private GroupDAO groupDAO; + @Inject private ProjectDAO projectDAO; @@ -52,19 +60,30 @@ public class SubmissionController implements ISubmission, HasProgress { while (existsFullSubmissionId(uuid)) { uuid = UUID.randomUUID().toString(); } + String requestCommand = "INSERT INTO"; + if (!(fullSubmissionPostRequest.getContributionCategory() == ContributionCategory.PORTFOLIO)) { + Project project = new Project(fullSubmissionPostRequest.getProjectName()); + FullSubmission fullSubmission = getFullSubmissionBy(fullSubmissionPostRequest.getGroupId(), project, + fullSubmissionPostRequest.getContributionCategory()); + if (fullSubmission != null) { + uuid = fullSubmission.getId(); + } + requestCommand = "REPLACE INTO"; + } + + String request = String.join(" ", requestCommand.trim(), + "fullsubmissions (`id`, `groupId`, `text`, `projectName`, `contributionCategory`, `userEmail`, `visibility`) VALUES (?,?,?,?,?,?,?);"); // build and execute request - String request = "REPLACE INTO fullsubmissions (`id`, `groupId`, `text`, `projectName`, `contributionCategory`) VALUES (?,?,?,?,?);"; connection.issueInsertOrDeleteStatement(request, uuid, fullSubmissionPostRequest.getGroupId(), - fullSubmissionPostRequest.getText(), fullSubmissionPostRequest.getProjectName(), fullSubmissionPostRequest.getContributionCategory()); + fullSubmissionPostRequest.getText(), fullSubmissionPostRequest.getProjectName(), + fullSubmissionPostRequest.getContributionCategory(), fullSubmissionPostRequest.getUserEMail(), fullSubmissionPostRequest.getVisibility()); // close connection connection.close(); // get the new submission from database - FullSubmission fullSubmission = getFullSubmission(uuid); - - return fullSubmission; + return getFullSubmission(uuid); } @@ -91,20 +110,27 @@ public class SubmissionController implements ISubmission, HasProgress { return fullSubmission; } - public String getFullSubmissionId(Integer groupId, Project project) { - // establish connection - String fullSubmissionId = null; + public FullSubmission getFullSubmissionBy(int groupId, Project project, ContributionCategory contributionCategory) { + + FullSubmission fullSubmission = null; connection.connect(); - // build and execute request - String request = "SELECT * FROM fullsubmissions WHERE groupId = ? AND projectName= ?;"; - VereinfachtesResultSet rs = connection.issueSelectStatement(request, groupId, project.getName()); + String request = "SELECT * FROM fullsubmissions WHERE groupId = ? AND projectName= ? AND contributionCategory = ?;"; + VereinfachtesResultSet rs = connection.issueSelectStatement(request, groupId, project.getName(), contributionCategory); if (rs.next()) { - // save submission - fullSubmissionId = rs.getString("id"); + fullSubmission = getFullSubmissionFromResultSet(rs); } connection.close(); + return fullSubmission; + } + + public String getFullSubmissionId(Integer groupId, Project project, ContributionCategory contributionCategory) { + FullSubmission fullSubmission = getFullSubmissionBy(groupId, project, contributionCategory); + String fullSubmissionId = null; + if (!Objects.isNull(fullSubmission)) { + fullSubmissionId = fullSubmission.getId(); + } return fullSubmissionId; } @@ -217,10 +243,9 @@ public class SubmissionController implements ISubmission, HasProgress { connection.close(); // get the new submission from database - SubmissionPart submissionPart = getSubmissionPart(submissionPartPostRequest.getFullSubmissionId(), - submissionPartPostRequest.getCategory()); - return submissionPart; + return getSubmissionPart(submissionPartPostRequest.getFullSubmissionId(), + submissionPartPostRequest.getCategory()); } @@ -345,13 +370,9 @@ public class SubmissionController implements ISubmission, HasProgress { int count = rs.getInt("exists"); // return true if we found the id - if (count < 1) { - return false; - } else { - return true; - } + return count >= 1; } - return null; + return false; } /** @@ -365,11 +386,13 @@ public class SubmissionController implements ISubmission, HasProgress { String id = rs.getString("id"); long timestamp = rs.getTimestamp("timestamp").getTime(); Integer groupId = rs.getInt("groupId"); + String userEmail = rs.getString("userEmail"); String text = rs.getString("text"); String projectName = rs.getString("projectName"); ContributionCategory contributionCategory = ContributionCategory.valueOf(rs.getString("contributionCategory")); + Visibility visibility = Visibility.valueOf(rs.getString("visibility")); - return new FullSubmission(id, timestamp, groupId, text, contributionCategory, projectName); + return new FullSubmission(id, timestamp, groupId, userEmail, text, contributionCategory, projectName, visibility); } @@ -674,8 +697,8 @@ public class SubmissionController implements ISubmission, HasProgress { // the number of dossiers needed relative to the group or user count progressData.setNumberNeeded(dossiersNeeded(project)); - List<User> strugglersWithSubmission = getStrugglersWithSubmission(project); - progressData.setUsersMissing(strugglersWithSubmission); + List<Group> strugglersWithSubmission = getStrugglersWithSubmission(project); + progressData.setGroupsMissing(strugglersWithSubmission); progressData .setAlmostComplete((progressData.getNumberOfCompletion() / progressData.getNumberNeeded()) <= (1 / 10)); return progressData; @@ -706,55 +729,48 @@ public class SubmissionController implements ISubmission, HasProgress { } - public List<User> getStrugglersWithSubmission(Project project) { - ArrayList<User> struggles = new ArrayList<>(); - GroupFormationMechanism groupFormationMechanism = groupDAO.getGroupFormationMechanism(project); - switch (groupFormationMechanism) { - case SingleUser: - List<User> usersInProject = userDAO.getUsersByProjectName(project.getName()); - List<User> usersHaveGivenFeedback = getAllUsersWithDossierUploaded(project); - for (User user : usersInProject) { - if (!usersHaveGivenFeedback.contains(user)) { - struggles.add(user); - } - } - break; - case LearningGoalStrategy: - case Manual: - case UserProfilStrategy: + public List<Group> getStrugglersWithSubmission(Project project) { + ArrayList<Group> struggles = new ArrayList<>(); + List<Group> groupsInProject = groupDAO.getGroupsByProjectName(project.getName()); + List<Group> groupsHaveGivenFeedback = getAllGroupsWithDossierUploaded(project); + for (Group group : groupsInProject) { + if (!groupsHaveGivenFeedback.contains(group)) { + struggles.add(group); + } } return struggles; } - public List<User> getAllUsersWithDossierUploaded(Project project) { - List<User> result = new ArrayList<>(); + public List<Group> getAllGroupsWithDossierUploaded(Project project) { + List<Group> result = new ArrayList<>(); connection.connect(); String query = "select * from fullsubmissions where projectName = ?"; VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query, project.getName()); while (vereinfachtesResultSet.next()) { - result.add(userDAO.getUserByEmail(vereinfachtesResultSet.getString("feedbackUser"))); + result.add(groupDAO.getGroupByGroupId(vereinfachtesResultSet.getInt("feedbackGroup"))); } connection.close(); return result; } - public List<User> getAllUsersWithFinalizedFeedback(Project project) { - List<User> result = new ArrayList<>(); + public List<Group> getAllGroupsWithFinalizedFeedback(Project project) { + List<Group> result = new ArrayList<>(); connection.connect(); String query = "select * from tasks where projectName = ? and taskName = ? and progress=?"; VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query, project.getName(), TaskName.GIVE_FEEDBACK, Progress.FINISHED); while (vereinfachtesResultSet.next()) { - result.add(userDAO.getUserByEmail(vereinfachtesResultSet.getString("userEmail"))); + Integer groupId = vereinfachtesResultSet.getInt("groupTask"); + result.add(groupDAO.getGroupByGroupId(groupId)); } connection.close(); return result; } public int getFeedbackedgroup(Project project, Integer groupId) { - int feedbackedGroup =0; + int feedbackedGroup = 0; connection.connect(); String query = "select groupId from fullsubmissions where projectName = ? AND feedbackGroup=?"; VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query, diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java index 6ebfb2f225cb5289aa3c87c8f0ed43ff3ea6ed2d..033416f65819abdd07d75693161813dabc483017 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmission.java @@ -12,17 +12,25 @@ public class FullSubmission { private String id; private long timestamp; private Integer groupId; + private String userEmail; private String text; private ContributionCategory contributionCategory; private String projectName; + private Visibility visibility; - public FullSubmission(String id, long timestamp, Integer groupId, String text, ContributionCategory contributionCategory, String projectName) { + public FullSubmission(String id, long timestamp, Integer groupId, String text, ContributionCategory contributionCategory, String projectName, Visibility visibility) { + this(id, timestamp, groupId, null, text, contributionCategory, projectName, visibility); + } + + public FullSubmission(String id, long timestamp, Integer groupId, String userEmail, String text, ContributionCategory contributionCategory, String projectName, Visibility visibility) { this.id = id; this.timestamp = timestamp; this.groupId = groupId; + this.userEmail = userEmail; this.text = text; this.contributionCategory = contributionCategory; this.projectName = projectName; + this.visibility = visibility; } public FullSubmission(String submissionId) { @@ -78,6 +86,21 @@ public class FullSubmission { this.projectName = projectName; } + public String getUserEmail() { + return userEmail; + } + + public void setUserEmail(String userEmail) { + this.userEmail = userEmail; + } + + public Visibility getVisibility() { + return visibility; + } + + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } @Override public String toString() { @@ -85,9 +108,11 @@ public class FullSubmission { "id='" + id + '\'' + ", timestamp=" + timestamp + ", groupId=" + groupId + + ", userEmail='" + userEmail + '\'' + ", text='" + text + '\'' + ", contributionCategory=" + contributionCategory + ", projectName='" + projectName + '\'' + + ", visibility=" + visibility + '}'; } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java index d3a6d3cd1e9b59a81581bda8579b4f421dd4097e..ee7df00c6f95ee2871004f4659ae729b5a8618c5 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/FullSubmissionPostRequest.java @@ -1,20 +1,27 @@ package unipotsdam.gf.modules.submission.model; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory; /** * @author Sven Kästle * skaestle@uni-potsdam.de */ +@JsonIgnoreProperties(ignoreUnknown = true) public class FullSubmissionPostRequest { // variables private Integer groupId; + private boolean personal; private String text; private String html; private String projectName; private ContributionCategory contributionCategory; + // have to be set in backend + private String userEMail; + private Visibility visibility; + public FullSubmissionPostRequest() { } @@ -23,7 +30,7 @@ public class FullSubmissionPostRequest { return groupId; } - public void setUser(Integer groupId) { + public void setGroupId(Integer groupId) { this.groupId = groupId; } @@ -59,15 +66,39 @@ public class FullSubmissionPostRequest { this.contributionCategory = contributionCategory; } + public boolean isPersonal() { + return personal; + } + + public void setPersonal(boolean personal) { + this.personal = personal; + } + + public String getUserEMail() { + return userEMail; + } + + public void setUserEMail(String userEMail) { + this.userEMail = userEMail; + } + + public Visibility getVisibility() { + return visibility; + } + + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } + @Override public String toString() { return "FullSubmissionPostRequest{" + "groupId=" + groupId + + ", personal=" + personal + ", text='" + text + '\'' + ", html='" + html + '\'' + ", projectName='" + projectName + '\'' + - ", contributionCategory='" + contributionCategory + '\'' + + ", contributionCategory=" + contributionCategory + '}'; } - } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java new file mode 100644 index 0000000000000000000000000000000000000000..56a9e9554528bffbe6ab4841d929da8a45b089f9 --- /dev/null +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/Visibility.java @@ -0,0 +1,9 @@ +package unipotsdam.gf.modules.submission.model; + +public enum Visibility { + + PUBLIC, + DOCENT, + GROUP, + PERSONAL +} diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java index e7e7996a746934989427667cdf2796643e6ba7c0..620453335c37d16530bf0b33321c9914b4bb2a29 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java @@ -3,9 +3,17 @@ package unipotsdam.gf.modules.submission.view; import com.itextpdf.text.DocumentException; import unipotsdam.gf.modules.annotation.model.Category; import unipotsdam.gf.modules.assessment.controller.model.Categories; +import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory; +import unipotsdam.gf.modules.fileManagement.FileManagementService; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.submission.controller.SubmissionController; -import unipotsdam.gf.modules.submission.model.*; +import unipotsdam.gf.modules.submission.model.FullSubmission; +import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest; +import unipotsdam.gf.modules.submission.model.SubmissionPart; +import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest; +import unipotsdam.gf.modules.submission.model.SubmissionProjectRepresentation; +import unipotsdam.gf.modules.submission.model.SubmissionResponse; +import unipotsdam.gf.modules.submission.model.Visibility; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.modules.user.UserDAO; import unipotsdam.gf.process.DossierCreationProcess; @@ -13,13 +21,19 @@ import unipotsdam.gf.session.GFContexts; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * @author Sven Kästle @@ -43,6 +57,9 @@ public class SubmissionService { @Inject private GFContexts gfContexts; + @Inject + private FileManagementService fileManagementService; + @POST @Path("/full") @@ -50,15 +67,32 @@ public class SubmissionService { FullSubmissionPostRequest fullSubmissionPostRequest) { // save full submission request in database and return the new full submission - final FullSubmission fullSubmission; String userEmail = (String) req.getSession().getAttribute(GFContexts.USEREMAIL); User user = userDAO.getUserByEmail(userEmail); - try { - fullSubmission = dossierCreationProcess.addSubmission(fullSubmissionPostRequest, user, - new Project(fullSubmissionPostRequest.getProjectName())); - } catch (DocumentException | IOException e) { - e.printStackTrace(); - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + Project project = new Project(fullSubmissionPostRequest.getProjectName()); + + + if (fullSubmissionPostRequest.isPersonal()) { + fullSubmissionPostRequest.setUserEMail(userEmail); + fullSubmissionPostRequest.setVisibility(Visibility.PERSONAL); + } else { + fullSubmissionPostRequest.setVisibility(Visibility.GROUP); + } + + final FullSubmission fullSubmission = submissionController.addFullSubmission(fullSubmissionPostRequest); + + switch (fullSubmission.getContributionCategory()) { + case DOSSIER: + try { + fileManagementService.saveStringAsPDF(user, project, fullSubmissionPostRequest); + } catch (DocumentException | IOException e) { + e.printStackTrace(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Error while converting to pdf").build(); + } + dossierCreationProcess.notifyAboutSubmission(user, project); + break; + case PORTFOLIO: + break; } return Response.ok(fullSubmission).build(); } @@ -76,23 +110,25 @@ public class SubmissionService { } else { // declare response SubmissionResponse response = new SubmissionResponse(); - response.setMessage("Submission with the id '" + fullSubmissionId + "' can't be found"); + String message = String.format("Submission with the id '%s' can't be found", fullSubmissionId); + response.setMessage(message); return Response.status(Response.Status.NOT_FOUND).entity(response).build(); } - } @GET - @Path("/full/groupId/{groupId}/project/{projectName}") + @Path("/full/groupId/{groupId}/project/{projectName}/contributionCategory/{contributionCategory}") public Response getFullSubmission(@PathParam("projectName") String projectName, - @PathParam("groupId") Integer groupId - ) throws IOException { + @PathParam("groupId") Integer groupId, + @PathParam("contributionCategory") ContributionCategory contributionCategory) { Project project = new Project(projectName); - String fullSubmissionId = submissionController.getFullSubmissionId(groupId, project); + FullSubmission fullSubmission = submissionController.getFullSubmissionBy(groupId, project, contributionCategory); - // get full submission from database based by id - return getFullSubmission(fullSubmissionId); + if (Objects.isNull(fullSubmission)) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + return Response.ok(fullSubmission).build(); } @POST @@ -160,8 +196,14 @@ public class SubmissionService { public void finalize(@PathParam("submissionId") String submissionId, @PathParam("projectId") String projectId, @Context HttpServletRequest req) { String userEmail = (String) req.getSession().getAttribute(GFContexts.USEREMAIL); - dossierCreationProcess.finalizeDossier(new FullSubmission(submissionId), new User(userEmail), - new Project(projectId)); + FullSubmission fullSubmission = submissionController.getFullSubmission(submissionId); + switch (fullSubmission.getContributionCategory()) { + case DOSSIER: + dossierCreationProcess.finalizeDossier(fullSubmission, new User(userEmail), new Project(projectId)); + break; + case PORTFOLIO: + break; + } } @GET diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java index 361fee79bce80917697bb63d35fafdad053389cd..35945bb5444ea8c860da482225c15897bd791e94 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/DossierCreationProcess.java @@ -1,28 +1,24 @@ package unipotsdam.gf.process; -import com.itextpdf.text.DocumentException; -import org.glassfish.jersey.media.multipart.FormDataContentDisposition; -import org.glassfish.jersey.media.multipart.FormDataContentDisposition.FormDataContentDispositionBuilder; import unipotsdam.gf.interfaces.Feedback; -import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory; -import unipotsdam.gf.modules.fileManagement.FileManagementService; -import unipotsdam.gf.modules.fileManagement.FileRole; -import unipotsdam.gf.modules.fileManagement.FileType; +import unipotsdam.gf.interfaces.IReflectionService; import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.submission.controller.SubmissionController; import unipotsdam.gf.modules.submission.model.FullSubmission; -import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.modules.user.UserDAO; import unipotsdam.gf.process.constraints.ConstraintsImpl; import unipotsdam.gf.process.phases.Phase; -import unipotsdam.gf.process.tasks.*; +import unipotsdam.gf.process.tasks.Progress; +import unipotsdam.gf.process.tasks.Task; +import unipotsdam.gf.process.tasks.TaskDAO; +import unipotsdam.gf.process.tasks.TaskName; +import unipotsdam.gf.process.tasks.TaskType; import javax.inject.Inject; import javax.inject.Singleton; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -46,10 +42,10 @@ public class DossierCreationProcess { private Feedback feedback; @Inject - private FileManagementService fileManagementService; + private GroupDAO groupDAO; @Inject - private GroupDAO groupDAO; + private IReflectionService reflectionService; /** @@ -69,34 +65,26 @@ public class DossierCreationProcess { } /** - * @param fullSubmissionPostRequest Elements needed to build the fullSubmission-class - * @param user User who uploaded the Submission for his / her group - * @param project the project the submission was written for + * @param user User who uploaded the Submission for his / her group + * @param project the project the submission was written for * @return the fullSubmission with correct ID */ - public FullSubmission addSubmission( - FullSubmissionPostRequest fullSubmissionPostRequest, User user, Project project) throws DocumentException, IOException { - - FormDataContentDispositionBuilder builder = FormDataContentDisposition.name("dossierUpload").fileName(fullSubmissionPostRequest.getContributionCategory() + "_" + user.getEmail() + ".pdf"); - fileManagementService.saveStringAsPDF(user, project, fullSubmissionPostRequest.getHtml(), builder.build(), - FileRole.DOSSIER, FileType.HTML); + public void notifyAboutSubmission(User user, Project project) { + // this completes the upload task + Task task = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(), Progress.INPROGRESS); + taskDAO.updateForGroup(task); - FullSubmission fullSubmission = submissionController.addFullSubmission(fullSubmissionPostRequest); + // this triggers the annotate task + taskDAO.persistTaskGroup(project, user, TaskName.ANNOTATE_DOSSIER, Phase.DossierFeedback); - // this completes the upload task - if (fullSubmission.getContributionCategory() == ContributionCategory.DOSSIER) { - Task task = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(), Progress.INPROGRESS); - taskDAO.updateForGroup(task); + Group group = groupDAO.getMyGroup(user, project); + reflectionService.startOptionalPortfolioTask(project, group, Phase.DossierFeedback); - // this triggers the annotate task - taskDAO.persistTaskGroup(project, user, TaskName.ANNOTATE_DOSSIER, Phase.DossierFeedback); - } - return fullSubmission; } /** * @param fullSubmission created in a groupTask, identified by projectName and groupId. Holds Text - * @param user User who finalized the Dossier for whole Group. + * @param user User who finalized the Dossier for whole Group. */ public void finalizeDossier(FullSubmission fullSubmission, User user, Project project) { // mark as final in db @@ -104,20 +92,20 @@ public class DossierCreationProcess { // mark annotate task as finished in db //todo: for iterative work, these two tasks need to be seperated - Task task = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(), + Task taskUpload = new Task(TaskName.UPLOAD_DOSSIER, user.getEmail(), project.getName(), Progress.FINISHED); - taskDAO.updateForGroup(task); - Task task1 = new Task(TaskName.ANNOTATE_DOSSIER, user.getEmail(), project.getName(), + taskDAO.updateForGroup(taskUpload); + Task taskAnnotate = new Task(TaskName.ANNOTATE_DOSSIER, user.getEmail(), project.getName(), Progress.FINISHED); - taskDAO.updateForGroup(task1); + taskDAO.updateForGroup(taskAnnotate); taskDAO.persistTaskGroup(project, user, TaskName.GIVE_FEEDBACK, Phase.DossierFeedback); if (constraints.checkIfFeedbackCanBeDistributed(project)) { // create Task to give Feedback - List<Group> groupsInProjekt = groupDAO.getGroupsByProjectName(project.getName()); + List<Group> groupsInProject = groupDAO.getGroupsByProjectName(project.getName()); List<Task> allFeedbackTasks = new ArrayList<>(); - for (Group group : groupsInProjekt) { + for (Group group : groupsInProject) { Task giveFeedbackTask1 = taskDAO.getTasksWithTaskName(group.getId(), project, TaskName.GIVE_FEEDBACK).get(0); if (!allFeedbackTasks.contains(giveFeedbackTask1)) allFeedbackTasks.add(giveFeedbackTask1); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java index f8c5b0cd6863e49156557ca4499f445aea445d6c..3eb1e8d124cd290cfa3d05c2641ee2390af68a28 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/GroupFormationProcess.java @@ -116,6 +116,7 @@ public class GroupFormationProcess { List<Group> groups = groupfinding.getGroupFormationAlgorithm(project).calculateGroups(project); groupfinding.persistGroups(groups, project); groupfinding.persistOriginalGroups(groups, project, groupdao.getGroupFormationMechanism(project)); + taskDAO.persistTeacherTask(project, TaskName.CLOSE_GROUP_FINDING_PHASE, Phase.GroupFormation); return new GroupData(groups); } else { return new GroupData(groups1); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java index 006e76984375572133bfe4a8026d19e87d2f8dfd..c1642728fd4dc2eaba95239f5a4fc41aeb9f1742 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/ProjectCreationProcess.java @@ -7,16 +7,12 @@ import unipotsdam.gf.exceptions.UserExistsInRocketChatException; import unipotsdam.gf.interfaces.ICommunication; import unipotsdam.gf.modules.communication.model.RocketChatUser; import unipotsdam.gf.modules.group.GroupDAO; -import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.group.preferences.database.ProfileDAO; import unipotsdam.gf.modules.project.Management; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.user.User; import unipotsdam.gf.process.constraints.ConstraintsImpl; -import unipotsdam.gf.process.phases.Phase; -import unipotsdam.gf.process.tasks.Task; import unipotsdam.gf.process.tasks.TaskDAO; -import unipotsdam.gf.process.tasks.TaskName; import unipotsdam.gf.session.GFContexts; import javax.inject.Inject; @@ -24,8 +20,6 @@ import javax.inject.Singleton; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.WebApplicationException; -import static unipotsdam.gf.modules.group.GroupFormationMechanism.SingleUser; - @Singleton public class ProjectCreationProcess { @@ -158,23 +152,8 @@ public class ProjectCreationProcess { */ public void updateProjCreaProcTasks(Project project, User user) throws RocketChatDownException, UserDoesNotExistInRocketChatException { // create info for student - Task task = taskDao.createWaitingForGroupFormationTask(project, user); - - // ev. notifity teacher for new student - // ev. send email that he is now part of project and will be notified if something happens + taskDao.createWaitingForGroupFormationTask(project, user); - Boolean groupsCanBeFormed = constraintsImpl.checkIfGroupsCanBeFormed(project); - if (groupsCanBeFormed) { - GroupFormationMechanism groupFormationMechanism = groupDAO.getGroupFormationMechanism(project); - if (!groupFormationMechanism.equals(SingleUser) && !groupFormationMechanism - .equals(GroupFormationMechanism.Manual)) { - taskDao.persistTeacherTask(project, TaskName.EDIT_FORMED_GROUPS, Phase.GroupFormation); - } - taskDao.persistTeacherTask(project, TaskName.CLOSE_GROUP_FINDING_PHASE, Phase.GroupFormation); - taskDao.updateForAll(task); - //phases.endPhase(Phase.GroupFormation, project); - - } iCommunication.addUserToChatRoom(user, project.getName()); } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java index f92022a506466a782bec2caac4a22684858d1adf..e4ad935ec311345c593e1c8b521670ca1da2e1f9 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/constraints/ConstraintsImpl.java @@ -1,12 +1,12 @@ package unipotsdam.gf.process.constraints; import unipotsdam.gf.interfaces.IGroupFinding; +import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.group.GroupFormationMechanism; import unipotsdam.gf.modules.project.Project; import unipotsdam.gf.modules.project.ProjectDAO; import unipotsdam.gf.modules.submission.controller.SubmissionController; -import unipotsdam.gf.modules.user.User; import unipotsdam.gf.modules.user.UserDAO; import unipotsdam.gf.process.tasks.ProjectStatus; @@ -70,13 +70,13 @@ public class ConstraintsImpl { return result; } - public List<String> checkWhichFeedbacksAreMissing(Project project){ - List<User> participants = userDAO.getUsersByProjectName(project.getName()); - List<User> doneParticipants = submissionController.getAllUsersWithFinalizedFeedback(project); - List<String> missingFeedbacksFrom = new ArrayList<>(); - for(User participant: participants){ - if (!doneParticipants.contains(participant)){ - missingFeedbacksFrom.add(participant.getName()); + public List<Group> checkWhichFeedbacksAreMissing(Project project) { + List<Group> groupsInProject = groupDAO.getGroupsByProjectName(project.getName()); + List<Group> doneGroups = submissionController.getAllGroupsWithFinalizedFeedback(project); + List<Group> missingFeedbacksFrom = new ArrayList<>(); + for (Group group : groupsInProject) { + if (!doneGroups.contains(group)) { + missingFeedbacksFrom.add(group); } } return missingFeedbacksFrom; diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java index b3f7ba36641b62f6469359b0ecfa6839d36cbb31..a5cb9b8328088391740c04f47c2165ee40f174df 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/progress/ProgressData.java @@ -1,6 +1,6 @@ package unipotsdam.gf.process.progress; -import unipotsdam.gf.modules.user.User; +import unipotsdam.gf.modules.group.Group; import java.util.List; @@ -8,17 +8,17 @@ public class ProgressData { private Boolean isAlmostComplete; private int numberOfCompletion; private int numberNeeded; - private java.util.List<User> usersMissing; + private java.util.List<Group> groupsMissing; public ProgressData() { } public ProgressData( - Boolean isAlmostComplete, int numberOfCompletion, int numberNeeded, List<User> usersMissing) { + Boolean isAlmostComplete, int numberOfCompletion, int numberNeeded, List<Group> groupsMissing) { this.isAlmostComplete = isAlmostComplete; this.numberOfCompletion = numberOfCompletion; this.numberNeeded = numberNeeded; - this.usersMissing = usersMissing; + this.groupsMissing = groupsMissing; } public Boolean getAlmostComplete() { @@ -45,11 +45,11 @@ public class ProgressData { this.numberNeeded = numberNeeded; } - public List<User> getUsersMissing() { - return usersMissing; + public List<Group> getGroupsMissing() { + return groupsMissing; } - public void setUsersMissing(List<User> usersMissing) { - this.usersMissing = usersMissing; + public void setGroupsMissing(List<Group> groupsMissing) { + this.groupsMissing = groupsMissing; } } diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java index 5a317db9cbabfef51365d98cb82e39a0d24c74e9..247a7958bea38ce0ccd4ae20d83651b11da23cea 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskDAO.java @@ -1,6 +1,7 @@ package unipotsdam.gf.process.tasks; import unipotsdam.gf.interfaces.IGroupFinding; +import unipotsdam.gf.modules.assessment.controller.model.ContributionCategory; import unipotsdam.gf.modules.group.Group; import unipotsdam.gf.modules.group.GroupDAO; import unipotsdam.gf.modules.group.GroupFormationMechanism; @@ -21,6 +22,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import static unipotsdam.gf.process.tasks.TaskName.WAITING_FOR_GROUP; import static unipotsdam.gf.process.tasks.TaskName.WAIT_FOR_PARTICPANTS; @@ -65,7 +67,7 @@ public class TaskDAO { } try { task.setDeadline(vereinfachtesResultSet.getTimestamp("due").getTime()); - } catch (Exception ignored) { + } catch (Throwable ignored) { } task.setPhase(Phase.valueOf(vereinfachtesResultSet.getString("phase"))); task.setTaskName(TaskName.valueOf(vereinfachtesResultSet.getString("taskName"))); @@ -115,14 +117,22 @@ public class TaskDAO { } public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase) { + return createUserDefault(project, target, taskName, phase, Importance.MEDIUM); + } + + public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase, Importance importance) { + return createUserDefault(project, target, taskName, phase, importance, Progress.JUSTSTARTED); + } + + public Task createUserDefault(Project project, User target, TaskName taskName, Phase phase, Importance importance, Progress progress) { Task task = new Task(); task.setTaskName(taskName); task.setEventCreated(System.currentTimeMillis()); - task.setDeadline(System.currentTimeMillis() + 7000 * 60 * 60 * 24); + task.setDeadline(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(7)); task.setProjectName(project.getName()); task.setUserEmail(target.getEmail()); - task.setImportance(Importance.MEDIUM); - task.setProgress(Progress.JUSTSTARTED); + task.setImportance(importance); + task.setProgress(progress); task.setGroupTask(0); task.setTaskName(taskName); task.setPhase(phase); @@ -130,6 +140,12 @@ public class TaskDAO { return task; } + public Task createUserDefaultWithoutDeadline(Project project, User target, TaskName taskName, Phase phase, Importance importance, Progress progress) { + Task task = createUserDefault(project, target, taskName, phase, importance, progress); + task.setDeadline(0L); + return task; + } + private Task createGroupDefault(Project project, Integer groupId, TaskName taskName, Phase phase) { Task task = new Task(); task.setTaskName(taskName); @@ -243,7 +259,7 @@ public class TaskDAO { Task task = getGeneralTask(vereinfachtesResultSet); task.setTaskType(TaskType.LINKED); Map<String, String> taskData = new HashMap<>(); - taskData.put("fullSubmissionId", submissionController.getFullSubmissionId(groupId, project)); + taskData.put("fullSubmissionId", submissionController.getFullSubmissionId(groupId, project, ContributionCategory.DOSSIER)); taskData.put("category", "TITEL"); task.setTaskData(taskData); result = task; @@ -282,7 +298,7 @@ public class TaskDAO { case CLOSE_DOSSIER_FEEDBACK_PHASE: { Task task = getGeneralTask(vereinfachtesResultSet); task.setHasRenderModel(true); - List<String> missingFeedbacks = constraints.checkWhichFeedbacksAreMissing(project); + List<Group> missingFeedbacks = constraints.checkWhichFeedbacksAreMissing(project); task.setTaskData(missingFeedbacks); //frontendCheck if missingFeedbacks.size ==0 result = task; Task waitingForDossiers = new Task(); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java index 98a0750ae15b0c4a7b281ba29752c53bc526a0f9..0e13d29acdd43ee8b1aa5cda96209f8990b8d386 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskName.java @@ -3,7 +3,7 @@ package unipotsdam.gf.process.tasks; public enum TaskName { // Teacher Tasks WAIT_FOR_PARTICPANTS, CLOSE_GROUP_FINDING_PHASE, WAITING_FOR_GROUP, - CLOSE_DOSSIER_FEEDBACK_PHASE,WAIT_FOR_REFLECTION, FORM_GROUPS_MANUALLY, + CLOSE_DOSSIER_FEEDBACK_PHASE, WAIT_FOR_REFLECTION, FORM_GROUPS_MANUALLY, CLOSE_EXECUTION_PHASE, WAIT_FOR_PEER_ASSESSMENTS, FINALIZE_ASSESSMENT, CLOSE_ASSESSMENT_PHASE, @@ -12,6 +12,9 @@ public enum TaskName { FINALIZE_EJOURNAL, EDIT_FORMED_GROUPS, CONTACT_GROUP_MEMBERS, ASSESSMENT, WAITING_FOR_STUDENT_DOSSIERS, EDIT_FEEDBACK, + // Student ePortfolio Tasks + OPTIONAL_PORTFOLIO_ENTRY, REFLECT_DOSSIER_CREATION, ANSWER_REFLECTION_QUESTIONS, COLLECT_RESULTS_FOR_ASSESSMENT, + // assessment tasks UPLOAD_PRESENTATION, UPLOAD_FINAL_REPORT, GIVE_ASSESSMENT, SEE_ASSESSMENT, diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java index 62803eb8f63e9e0a7d16d65b67bbfe44279835d9..4d71166c52134bd97ac2c8b80387edbe9e76486c 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/process/tasks/TaskOrder.java @@ -3,7 +3,6 @@ package unipotsdam.gf.process.tasks; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Map; public class TaskOrder { private List<TaskName> orderedTasks; @@ -16,12 +15,17 @@ public class TaskOrder { result.add(TaskName.CONTACT_GROUP_MEMBERS); result.add(TaskName.WAITING_FOR_STUDENT_DOSSIERS); result.add(TaskName.UPLOAD_DOSSIER); + result.add(TaskName.OPTIONAL_PORTFOLIO_ENTRY); result.add(TaskName.ANNOTATE_DOSSIER); result.add(TaskName.GIVE_FEEDBACK); result.add(TaskName.SEE_FEEDBACK); result.add(TaskName.CLOSE_DOSSIER_FEEDBACK_PHASE); - //todo Martins tasks + result.add(TaskName.REFLECT_DOSSIER_CREATION); + //end of execution phase + result.add(TaskName.ANSWER_REFLECTION_QUESTIONS); + result.add(TaskName.WAIT_FOR_REFLECTION); result.add(TaskName.CLOSE_EXECUTION_PHASE); + result.add(TaskName.COLLECT_RESULTS_FOR_ASSESSMENT); result.add(TaskName.WAIT_FOR_PEER_ASSESSMENTS); result.add(TaskName.GIVE_ASSESSMENT); result.add(TaskName.SEE_ASSESSMENT); diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java index 73132b57850776c5f1bb72a2609603c47ea4910f..46307596101b12bf740471fb6964d1c8009ef4d7 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/ChatWindow.java @@ -32,11 +32,12 @@ public class ChatWindow extends SimpleTagSupport { final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); locator.inject(this); + TagUtilities tu = new TagUtilities(); PageContext pageContext = (PageContext) getJspContext(); HttpServletRequest request = (HttpServletRequest) pageContext.getRequest(); /*String token = request.getParameter("token"); */ - String projectName = request.getParameter("projectName"); + String projectName = tu.getParamterFromQuery("projectName", request); Object userEmail = request.getSession().getAttribute(GFContexts.USEREMAIL); if (userEmail != null && !(request.getSession().getAttribute(GFContexts.ROCKETCHATAUTHTOKEN) == null)) { diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java index f069ee1c5d5c6d6a6a801244d750142914b4c99b..613ef5f9aceb66241c046ebd120c9534d18e7c0e 100644 --- a/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java +++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/taglibs/TagUtilities.java @@ -16,9 +16,11 @@ import static java.net.URLDecoder.decode; public class TagUtilities { private static final Logger log = LoggerFactory.getLogger(TagUtilities.class); + @Inject private ProjectDAO projectDAO; + public TagUtilities() { final ServiceLocator locator = ServiceLocatorUtilities.bind(new GFApplicationBinder()); locator.inject(this); diff --git a/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp b/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp index e9c17485ec2f23c430340be0d031624336039493..0fb1a61af38ffc51773fc1d5e98aa296c3dc52ff 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp +++ b/gemeinsamforschen/src/main/webapp/annotation/create-unstructured-annotation.jsp @@ -83,6 +83,7 @@ <div id="{{>nameLower}}" class="category-card not-added"> <p>{{>name}}</p> </div> + <a onClick="deleteCategory('{{>nameLower}}');"><i class="fa fa-trash" aria-hidden="true"></i></a> </li> {{/for}} </script> diff --git a/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp b/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp index 07eed6272dd8d3fde2f25607ce664cca7e9f5483..208c352c2130b854ef07acebfe881c4628b29878 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp +++ b/gemeinsamforschen/src/main/webapp/annotation/give-feedback.jsp @@ -60,7 +60,6 @@ <main id="seeFeedback" class=""> <h3>Feedback geben </h3> - <p>Gib der Gruppe <span id="feedBackTarget"></span> eine Rückmeldung für das Dossier.</p> <br> <div class="three_rows"> diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js b/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js index 9cb68086026f8b811bc460f518bb4ba589e229ff..90c6480c322cc45aeedd531f028988132ffe4b3e 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js +++ b/gemeinsamforschen/src/main/webapp/annotation/js/annotationScript.js @@ -5,28 +5,6 @@ let userColorsDark = new Map(); // declare document text, start and end character let startCharacter, endCharacter; -/* - TODO - ---- - create feedback page: - - remove quillJsTemp and show content in quillJS - - move colors from annotation class to utility class - - color text like category - - show feedback page (could be this page): - - color feedback in user color - - color on mouseover - - - - not one page!: - - you need to hide half of the page, just to have one page: einzige gemeinsamkeit -> editor und das reicht nicht - - - - Websocket fixen (vllt) - - bearbeiten druecken laesst die karte nicht verschwinden (was wollte ich damit sagen?) - */ - - /** * This function will fire when the DOM is ready */ @@ -63,8 +41,8 @@ $(document).ready(function () { btnBack.hide(); btnWholeCategory.hide(); } - $('#backToTasks').on('click',function(){ - location.href="../project/tasks-student.jsp?projectName="+$('#projectName').html().trim(); + $('#backToTasks').on('click', function () { + location.href = "../project/tasks-student.jsp?projectName=" + $('#projectName').html().trim(); }); // fetch full submission from database diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js index b32af477e88371cb62c1a6e2cb32cff5a2c42c9b..edafbf261fa240ec968898436869a34190fb576e 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js +++ b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedback.js @@ -20,9 +20,8 @@ $(document).ready(function () { let fullSubmissionId = getQueryVariable("fullSubmissionId"); let category = getQueryVariable("category"); $('#categoryHeadline').html("Kategorie: " + category); - getFeedbackedGroup(function (response) { - $('#feedBackTarget').html(response.id); - }); + /*getFeedbackedGroup(function (response) { + });*/ prepareFeedbackMenu(category); let btnBack = $('#btnBack'); btnBack.click(handleBackButtonClick); diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js index 7e0814dac2f2a525a380b500be4da33c6ff5948e..21f1759203cbfc8740e0613f948c9b3821db6448 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js +++ b/gemeinsamforschen/src/main/webapp/annotation/js/giveFeedbackRest.js @@ -87,8 +87,10 @@ function getContributionFeedback(fullSubmissionId, fullSubmissionPartCategory, g type: "GET", dataType: "json", success: function (response) { - response.text = JSON.parse(response.text); - responseHandler(response); + if (response) { + response.text = JSON.parse(response.text); + responseHandler(response); + } } }); } diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js index 44fa1797156a19ee146b1bd6db2eb1146be95d52..84a772b968f4b70d6aca49a12482fd1b5fdebfbe 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js +++ b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredAnnotation.js @@ -20,6 +20,7 @@ $(document).ready(function () { saveButtonHandler(); }); + /** * Context menu handler */ @@ -243,4 +244,19 @@ function buildAnnotationList(categories) { let tmpl = $.templates("#annotationTemplate"); let html = tmpl.render(data); $("#annotations").html(html); +} + +function deleteCategory(category) { + let categoryLI = $('#' + category); + let textArrays = categoryLI.data('array'); + for (let i = 0; i < textArrays.length; i++) { + quill.formatText(textArrays[i].start, textArrays[i].end - textArrays[i].start, 'background', '#FFF'); + } + categoryLI.data('array', []); + + $('.added-' + category).each(function () { + $(this).toggleClass('added-' + category + ' not-added'); + }); + + let test = category; } \ No newline at end of file diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js index fbc355183318de2fcbc1a7bcdc4f943d7ea72b6a..52092a4f3e5f57979cf53f0e7d12ef7a66f74f77 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js +++ b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredRest.js @@ -23,6 +23,7 @@ function createFullSubmission(fullSubmissionPostRequest, responseHandler) { * GET: Get a specific full submission for a given id * * @param id The id of the full submission + * @param contributionCategory * @param responseHandler The response handler * @param errorHandler The error handler */ diff --git a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js index b1f26a464883b8c785cd4ed9a4b89bd719ee9e2c..5a555a2fd827295b97579ad6942fe2d3903ab13a 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js +++ b/gemeinsamforschen/src/main/webapp/annotation/js/unstructuredUpload.js @@ -5,39 +5,43 @@ let groupId = 0; let contributionCategory; let hierarchyLevel; let fullSubmissionId = ""; +let personal; $(document).ready(function () { - getMyGroupId(getFullSubmissionOfGroup); contributionCategory = $('#contributionCategory').html().trim(); + setPersonal(); + if (!personal) { + getMyGroupId(getFullSubmissionOfGroup); + } hierarchyLevel = $('#hierarchyLevel').html().trim(); populateTextFields(); $('#btnSave').click(function () { - if (quill.getText().length > 1) { - let user = getUserEmail(); - let content = quill.getContents(); - let html = quill.root.innerHTML; + getMyGroupId(function (groupId) { + if (quill.getText().length > 1) { + let content = quill.getContents(); + let html = quill.root.innerHTML; - // build request - let fullSubmissionPostRequest = { - groupId: groupId, - text: JSON.stringify(content), - html: html, - projectName: $('#projectName').text().trim(), - contributionCategory: contributionCategory.toUpperCase() - }; + // build request + let fullSubmissionPostRequest = { + groupId: groupId, + text: JSON.stringify(content), + html: html, + projectName: $('#projectName').text().trim(), + personal: personal, + contributionCategory: contributionCategory.toUpperCase() + }; - // save request in database - createFullSubmission(fullSubmissionPostRequest, function () { - - // back to main page - location.href = hierarchyLevel + "project/tasks-student.jsp?projectName=" + $('#projectName').text().trim(); - }); - } else { - alert("Ein Text wird benötigt"); - } - // fetch user and text + // save request in database + createFullSubmission(fullSubmissionPostRequest, function () { + // back to main page + location.href = hierarchyLevel + "project/tasks-student.jsp?projectName=" + $('#projectName').text().trim(); + }); + } else { + alert("Ein Text wird benötigt"); + } + }); }); $('#backToTasks').click(function () { @@ -66,9 +70,14 @@ $(document).ready(function () { }); +function setPersonal() { + let personalString = $("#personal").html().trim(); + personal = personalString.toUpperCase() === 'TRUE'; +} + function populateTextFields() { let data = {}; - data.header = contributionCategory; + data.header = contributionCategory === "Portfolio" ? "Portfolio-Eintrag" : contributionCategory; let tmpl = $.templates("#headerTemplate"); //tmpl.link("#result"); let html = tmpl.render(data); diff --git a/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp b/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp index facd15198ec8abc35bdee8bceddfbd3df5629150..d53ce038e7c96a88df54f26b1599e2e2b2ed2026 100644 --- a/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp +++ b/gemeinsamforschen/src/main/webapp/annotation/upload-unstructured-dossier.jsp @@ -1,3 +1,4 @@ +<%@ page import="com.google.common.base.Strings" %> <%@ page import="unipotsdam.gf.taglibs.TagUtilities" %> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> @@ -8,6 +9,10 @@ if (contributionCategory == null) { contributionCategory = "Unbekannt"; } + String personalString = tu.getParamterFromQuery("personal", request); + if (Strings.isNullOrEmpty(personalString)) { + personalString = "false"; + } %> <!DOCTYPE html> @@ -54,7 +59,6 @@ <div id="result"></div> <script id="headerTemplate" type="text/x-jsrender"> <h2>{{:header}} anlegen</h2> - </script> <div class="upload-text" id="documentText"> <label for="editor">Texteingabe</label> @@ -92,7 +96,8 @@ <jsp:param name="readOnly" value="false"/> </jsp:include> - <p id="contributionCategory" hidden><%= tu.printMe(contributionCategory)%> + <p id="contributionCategory" hidden><%= tu.printMe(contributionCategory)%> + <p id="personal" hidden><%= tu.printMe(personalString)%> </body> </html> diff --git a/gemeinsamforschen/src/main/webapp/project/create-project.jsp b/gemeinsamforschen/src/main/webapp/project/create-project.jsp index 5b379f2c327da7eef4ea5631620c3be8098d512d..54d4141694029f2e3b5f3c7f9c0a157b3e0ac9a4 100644 --- a/gemeinsamforschen/src/main/webapp/project/create-project.jsp +++ b/gemeinsamforschen/src/main/webapp/project/create-project.jsp @@ -45,7 +45,7 @@ Es müssen genau 5 Tags eingegeben werden. </div> <div class="alert alert-danger" role="alert" style="width:475px" id="specialChars"> - Der Projektname darf keine Sonderzeichen enthalten. + Der Projektname darf keine Sonderzeichen oder Umlaute enthalten. </div> <div class="alert alert-danger" role="alert" style="width:475px" id="projectDescriptionMissing"> Geben Sie eine Beschreibung für Ihr Projekt an. diff --git a/gemeinsamforschen/src/main/webapp/project/js/tasks.js b/gemeinsamforschen/src/main/webapp/project/js/tasks.js index 9abccf0cf564049db42238883d6d33e3b1d10489..521f2350c084093111e1916bc8ece46990478dc5 100644 --- a/gemeinsamforschen/src/main/webapp/project/js/tasks.js +++ b/gemeinsamforschen/src/main/webapp/project/js/tasks.js @@ -58,7 +58,7 @@ function fitObjectInTmpl(object) { }; if (object.taskType !== "INFO") { - if (object.groupTask === true) { + if (object.groupTask !== 0) { result.taskType = "grouptask" } else { result.taskType = "usertask" @@ -83,7 +83,7 @@ function fitObjectInTmpl(object) { case "Execution": groupViewLink.show(); result.phase = "card-execution"; - result.headLine = "Reflexionsphase"; + result.headLine = "Durchführung"; break; case "Assessment": groupViewLink.show(); @@ -144,15 +144,23 @@ function fitObjectInTmpl(object) { result.infoText = "Sie erhielten Feedback zu Ihrem Dossier."; break; case "WAITING_FOR_STUDENT_DOSSIERS": - result.infoText = "[TEACHER] Warten Sie darauf, dass jeder Student ein Dossier" + - "hochlädt und ein Feedback für jemanden gab."; + result.infoText = "Studierende legen nun ein Dossier an und" + + " geben sich gegenseitig Feedback."; break; case "CLOSE_DOSSIER_FEEDBACK_PHASE": let count = object.taskData.length; if (count <= 3) { - result.infoText = "Warten sie noch auf die / den Studenten "; + result.infoText = "Es fehlen noch die Feedbacks der Gruppe/n "; for (let i = 0; i < object.taskData.length; i++) { - result.infoText += object.taskData[i] + " "; + for (let j = 0; j < object.taskData[i].members.length; j++) { + result.infoText += object.taskData[i].members[j].name; + if (j < object.taskData[i].members.length - 1) { + result.infoText += ", " + } + } + if (i < object.taskData.length - 1) { + result.infoText += " und " + } } } else { result.infoText = "Noch haben nicht alle Studenten ihren Peers ein Feedback gegeben."; @@ -168,6 +176,9 @@ function fitObjectInTmpl(object) { case "CONTACT_GROUP_MEMBERS": result.infoText = "Sagen sie hallo zu ihren Gruppenmitgliedern über den Chat."; break; + case "OPTIONAL_PORTFOLIO_ENTRY": + result.infoText = "E-Portfolio"; + break; default: result.infoText = ""; } @@ -206,7 +217,11 @@ function fitObjectInTmpl(object) { break; case "ANNOTATE_DOSSIER": result.solveTaskWith = "Annotiere das Dossier"; - result.solveTaskWithLink = "redirect(\'../annotation/create-unstructured-annotation.jsp?projectName=" + object.projectName + "&submissionId=" + object.taskData.fullSubmissionId + "\')"; + result.solveTaskWithLink = "redirect(\'../annotation/create-unstructured-annotation.jsp?" + $.param({ + projectName: object.projectName, + submissionId: object.taskData.fullSubmissionId, + contributionCategory: "Dossier" + }) + "\')"; break; case "FINALIZE_DOSSIER": result.solveTaskWith = "Finalisiere das Dossier"; @@ -251,6 +266,15 @@ function fitObjectInTmpl(object) { "&contribution=DOSSIER\')"; } break; + + case "OPTIONAL_PORTFOLIO_ENTRY": + result.solveTaskWith = "Erstelle einen Portfolio-Eintrag (optional)"; + result.solveTaskWithLink = "redirect(\'../annotation/upload-unstructured-dossier.jsp?" + $.param({ + projectName: object.projectName, + contributionCategory: "Portfolio", + personal: "true" + }) + "\')"; + break; default: result.solveTaskWith = null; diff --git a/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp b/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp index c0516901f9dcfee03bef381c8a822f5d412a45a9..9f51cc6e3cff400629682be8656acf354e86a5ba 100644 --- a/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp +++ b/gemeinsamforschen/src/main/webapp/project/tasks-student.jsp @@ -93,8 +93,10 @@ </div> <div class="col span_chat right"> <chat:chatWindow orientation="right" scope="project"/> - <chat:chatWindow orientation="right" scope="group"/> - <a id="groupView" style="cursor:pointer;">Gruppenansicht</a> + <div id="groupView"> + <chat:chatWindow orientation="right" scope="group"/> + <a style="cursor:pointer;">Gruppenansicht</a> + </div> </div> </div> <!-- end row --> </main> diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js b/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js index 199ed4db42d573f37b4a32b8fbfe884dc4231561..0eca7cf07dfea2bda6ee141be21d4394f1a736b0 100644 --- a/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js +++ b/gemeinsamforschen/src/main/webapp/taglibs/js/fileStorage.js @@ -21,6 +21,9 @@ function listFilesOfGroup(projectName){ }); count++; } + if (count === 1) { + $('#fileManagementHeader').hide(); + } $('#listOfFilesTemplate').tmpl(tmplObject).appendTo('#listOfFiles'); prepareDeletion(); }, diff --git a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js index 75a8407b368600f50d25a07517c1dc47a8eab32d..6fae36b2a55c8ed5cec0d96d5190ee164b72379b 100644 --- a/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js +++ b/gemeinsamforschen/src/main/webapp/taglibs/js/utility.js @@ -246,8 +246,9 @@ function getMyGroupId(callback) { function getFullSubmissionOfGroup(groupId) { let projectName = $('#projectName').html().trim(); + let contributionCategory = $('#contributionCategory').html().trim(); $.ajax({ - url: '../rest/submissions/full/groupId/' + groupId + '/project/' + projectName, + url: '../rest/submissions/full/groupId/' + groupId + '/project/' + projectName + '/contributionCategory/' + contributionCategory.toUpperCase(), type: 'GET', headers: { "Cache-Control": "no-cache" diff --git a/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp b/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp index abe3ebde94a900fbfd5725973df2fa352d2ee4e3..4a5c25b43caa5a8f29c67afdc4f7f37da206b364 100644 --- a/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp +++ b/gemeinsamforschen/src/main/webapp/taglibs/timeLine.jsp @@ -16,35 +16,35 @@ <li class="icon phase1">Projektinitialisierung</li> <li class="icon inactive phase2 ">Entwurfsphase</li> - <li class="icon inactive phase4">Reflextionsphase</li> + <li class="icon inactive phase4">Durchführung</li> <li class="icon inactive phase5">Assessment</li> <li class="icon inactive phase6">Noten</li> <%} else if (phase == Phase.DossierFeedback) {%> <li class="icon closed phase1">Projektinitialisierung</li> <li class="icon phase2">Entwurfsphase</li> - <li class="icon inactive phase4">Reflextionsphase</li> + <li class="icon inactive phase4">Durchführung</li> <li class="icon inactive phase5">Assessment</li> <li class="icon inactive phase6">Noten</li> <%} else if (phase == Phase.Execution) {%> <li class="neutral icon closed phase1">Projektinitialisierung</li> <li class="draft icon closed phase2">Entwurfsphase</li> - <li class="icon phase4">Reflextionsphase</li> + <li class="icon phase4">Durchführung</li> <li class="icon inactive phase5">Assessment</li> <li class="icon inactive phase6">Noten</li> <%} else if (phase == Phase.Assessment) {%> <li class="neutral icon closed phase1">Projektinitialisierung</li> <li class="draft icon closed phase2">Entwurfsphase</li> - <li class="icon closed phase4">Reflextionsphase</li> + <li class="icon closed phase4">Durchführung</li> <li class="icon phase5">Assessment</li> <li class="icon inactive phase6">Noten</li> <%} else if (phase == Phase.Projectfinished) {%> <li class="icon closed phase1">Projektinitialisierung</li> <li class="icon closed phase2">Entwurfsphase</li> - <li class="icon closed phase4">Reflextionsphase</li> + <li class="icon closed phase4">Durchführung</li> <li class="icon closed phase5">Assessment</li> <li class="icon phase6">Noten</li> <%}%> @@ -55,7 +55,7 @@ <!--begin data deletion and download--> <script src="../taglibs/js/fileStorage.js"></script> <div style="margin-top:50px;"></div> - <h4>Ergebnisse</h4> + <h4 id="fileManagementHeader">Ergebnisse</h4> <ul id="listOfFiles"> <script id="listOfFilesTemplate" type="text/x-jQuery-tmpl"> <li> diff --git a/gemeinsamforschen/src/test/resources/database/fltrail.sql b/gemeinsamforschen/src/test/resources/database/fltrail.sql index 9f6a414ab57acc7956e192915da3d5a4830d5be6..fa16c8f751cb0899145fa3a1ab8168d75163b65a 100644 --- a/gemeinsamforschen/src/test/resources/database/fltrail.sql +++ b/gemeinsamforschen/src/test/resources/database/fltrail.sql @@ -3,7 +3,7 @@ -- https://www.phpmyadmin.net/ -- -- Host: 127.0.0.1 --- Erstellungszeit: 24. Mai 2019 um 11:08 +-- Erstellungszeit: 10. Jun 2019 um 10:43 -- Server-Version: 10.1.32-MariaDB -- PHP-Version: 7.2.5 @@ -131,7 +131,9 @@ CREATE TABLE `fullsubmissions` `projectName` varchar(200) NOT NULL, `feedbackGroup` int(11) DEFAULT NULL, `finalized` tinyint(1) DEFAULT NULL, - `contributionCategory` varchar(200) NOT NULL + `contributionCategory` varchar(200) NOT NULL, + `userEmail` varchar(255) DEFAULT NULL, + `visibility` varchar(200) NOT NULL ) ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT ='This holds the aggregated text of the dossier students should upload'; @@ -580,8 +582,10 @@ ALTER TABLE `contributionrating` -- ALTER TABLE `fullsubmissions` ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `fullsubmissions_user_projectName_uindex` (`groupId`, `projectName`), - ADD KEY `fullsubmissions_projects_name_fk` (`projectName`); + ADD UNIQUE KEY `fullsubmissions_id_uindex` (`id`), + ADD KEY `fullsubmissions_projects_name_fk` (`projectName`), + ADD KEY `fullsubmissions_users_email_fk` (`userEmail`), + ADD KEY `fullsubmissions_groups_id_fk` (`groupId`); -- -- Indizes für die Tabelle `grades` @@ -812,7 +816,9 @@ ALTER TABLE `contributionrating` -- Constraints der Tabelle `fullsubmissions` -- ALTER TABLE `fullsubmissions` - ADD CONSTRAINT `fullsubmissions_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE; + ADD CONSTRAINT `fullsubmissions_groups_id_fk` FOREIGN KEY (`groupId`) REFERENCES `groups` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `fullsubmissions_projects_name_fk` FOREIGN KEY (`projectName`) REFERENCES `projects` (`name`) ON DELETE CASCADE ON UPDATE CASCADE, + ADD CONSTRAINT `fullsubmissions_users_email_fk` FOREIGN KEY (`userEmail`) REFERENCES `users` (`email`) ON DELETE CASCADE ON UPDATE CASCADE; -- -- Constraints der Tabelle `grades` diff --git a/gemeinsamforschen/visio/activities.vsdx b/gemeinsamforschen/visio/activities.vsdx index 4232ab83d1f65d46d56daf4ae5f83a16ee61ee84..ebac91130c16d7675006b5d47af437267b0fa2c0 100644 Binary files a/gemeinsamforschen/visio/activities.vsdx and b/gemeinsamforschen/visio/activities.vsdx differ