Skip to content
Snippets Groups Projects
Commit faf60f24 authored by Axel's avatar Axel
Browse files

Merge remote-tracking branch 'origin/single-user-project' into single-user-project

parents a9549958 f8fae505
No related branches found
No related tags found
No related merge requests found
Showing
with 268 additions and 116 deletions
package unipotsdam.gf.config;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import unipotsdam.gf.interfaces.*;
import unipotsdam.gf.modules.annotation.controller.AnnotationController;
import unipotsdam.gf.modules.assessment.controller.service.AssessmentDBCommunication;
import unipotsdam.gf.modules.assessment.controller.service.PeerAssessment;
import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
import unipotsdam.gf.modules.group.DummyGroupfinding;
import unipotsdam.gf.modules.group.DummyProjectCreationService;
import unipotsdam.gf.modules.group.GroupDAO;
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.researchreport.DummyResearchReportManagement;
import unipotsdam.gf.modules.researchreport.ResearchReportManagement;
import unipotsdam.gf.modules.submission.controller.SubmissionController;
import unipotsdam.gf.modules.user.UserDAO;
import unipotsdam.gf.mysql.MysqlConnect;
import unipotsdam.gf.mysql.MysqlConnectImpl;
import unipotsdam.gf.process.DossierCreationProcess;
import unipotsdam.gf.process.GroupFormationProcess;
import unipotsdam.gf.process.ProjectCreationProcess;
import unipotsdam.gf.process.constraints.ConstraintsImpl;
import unipotsdam.gf.process.phases.PhasesImpl;
import unipotsdam.gf.process.tasks.TaskDAO;
import unipotsdam.gf.interfaces.*;
import unipotsdam.gf.modules.assessment.controller.service.PeerAssessment;
import unipotsdam.gf.modules.communication.service.CommunicationDummyService;
import unipotsdam.gf.modules.group.DummyGroupfinding;
import unipotsdam.gf.modules.group.GroupfindingImpl;
import unipotsdam.gf.modules.group.DummyProjectCreationService;
import unipotsdam.gf.modules.group.GroupDAO;
import unipotsdam.gf.modules.journal.service.IJournalImpl;
import unipotsdam.gf.modules.feedback.DummyFeedback;
import unipotsdam.gf.modules.researchreport.DummyResearchReportManagement;
import unipotsdam.gf.modules.researchreport.ResearchReportManagement;
import unipotsdam.gf.modules.assessment.controller.service.AssessmentDBCommunication;
import unipotsdam.gf.mysql.MysqlConnect;
import unipotsdam.gf.mysql.MysqlConnectImpl;
import unipotsdam.gf.session.GFContexts;
public class GFApplicationBinder extends AbstractBinder {
/**
* TODO replace DummyImplementation
*/
@Override
protected void configure() {
bind(CommunicationDummyService.class).to(ICommunication.class);
bind(ManagementImpl.class).to(Management.class);
bind(DummyFeedback.class).to(Feedback.class);
bind(PeerAssessment.class).to(IPeerAssessment.class);
bind(PhasesImpl.class).to(IPhases.class);
bind(ManagementImpl.class).to(Management.class);
bind(DummyResearchReportManagement.class).to(ResearchReportManagement.class);
bind(DummyProjectCreationService.class).to(DummyProjectCreationService.class);
bind(UserDAO.class).to(UserDAO.class);
bind(ProjectDAO.class).to(ProjectDAO.class);
bind(GroupDAO.class).to(GroupDAO.class);
bind(GroupfindingImpl.class).to(IGroupFinding.class);
bind(TaskDAO.class).to(TaskDAO.class);
bind(IJournalImpl.class).to(IJournal.class);
bind(DummyGroupfinding.class).to(IGroupFinding.class);
bind(AssessmentDBCommunication.class).to(AssessmentDBCommunication.class);
bind(GFContexts.class).to(GFContexts.class);
bind(ProjectCreationProcess.class).to(ProjectCreationProcess.class);
......@@ -58,8 +48,16 @@ public class GFApplicationBinder extends AbstractBinder {
bind(DossierCreationProcess.class).to(DossierCreationProcess.class);
bind(SubmissionController.class).to(SubmissionController.class);
bind(AnnotationController.class).to(AnnotationController.class);
bind(ProjectConfigurationDAO.class).to(ProjectConfigurationDAO.class);
bind(DummyProjectCreationService.class).to(DummyProjectCreationService.class);
bind(UserDAO.class).to(UserDAO.class);
bind(ProjectDAO.class).to(ProjectDAO.class);
bind(GroupDAO.class).to(GroupDAO.class);
bind(TaskDAO.class).to(TaskDAO.class);
bindMore();
}
protected void bindMore() {
bind(MysqlConnectImpl.class).to(MysqlConnect.class);
}
......
package unipotsdam.gf.interfaces;
import unipotsdam.gf.modules.project.Project;
import unipotsdam.gf.modules.user.User;
import unipotsdam.gf.process.constraints.ConstraintsMessages;
import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
import unipotsdam.gf.modules.feedback.Model.Peer2PeerFeedback;
import unipotsdam.gf.process.progress.HasProgress;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import java.io.File;
import java.util.ArrayList;
import java.util.Map;
/**
PeerFeedback Interface
......
package unipotsdam.gf.modules.feedback;
import uk.co.jemos.podam.api.PodamFactory;
import uk.co.jemos.podam.api.PodamFactoryImpl;
import unipotsdam.gf.assignments.Assignee;
import unipotsdam.gf.assignments.NotImplementedLogger;
import unipotsdam.gf.modules.project.Project;
import unipotsdam.gf.modules.user.User;
import unipotsdam.gf.process.constraints.Constraints;
import unipotsdam.gf.process.constraints.ConstraintsMessages;
import unipotsdam.gf.interfaces.Feedback;
import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
import unipotsdam.gf.modules.feedback.Model.Peer2PeerFeedback;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class DummyFeedback implements Feedback {
/**
* Utility to create dummy data for students
*/
PodamFactory factory = new PodamFactoryImpl();
private static Boolean missingTaskAssigned = false;
private Map<StudentIdentifier, Constraints> openTasks;
public DummyFeedback() {
}
@Override
public void assigningMissingFeedbackTasks(Project project) {
NotImplementedLogger.logAssignment(Assignee.KATHARINA, Feedback.class, "assigningMissingFeedbackTasks",
"assigning feedback tasks ");
missingTaskAssigned = true;
}
@Override
public void assignFeedbackTasks(Project project) {
}
@Override
public ResearchReport getFeedbackTask(User student) {
return factory.manufacturePojo(ResearchReport.class);
}
}
......@@ -3,6 +3,8 @@ package unipotsdam.gf.modules.feedback;
import unipotsdam.gf.interfaces.Feedback;
import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
import unipotsdam.gf.modules.feedback.Model.Peer2PeerFeedback;
import unipotsdam.gf.modules.group.GroupDAO;
import unipotsdam.gf.modules.group.GroupFormationMechanism;
import unipotsdam.gf.modules.project.Project;
import unipotsdam.gf.modules.researchreport.ResearchReport;
import unipotsdam.gf.modules.submission.controller.SubmissionController;
......@@ -22,6 +24,9 @@ public class FeedbackImpl implements Feedback {
@Inject
private UserDAO userDAO;
@Inject
private GroupDAO groupDAO;
@Inject
private SubmissionController submissionController;
......@@ -32,19 +37,33 @@ public class FeedbackImpl implements Feedback {
@Override
public void assignFeedbackTasks(Project project) {
List<User> usersByProjectName = userDAO.getUsersByProjectName(project.getName());
User firstUser = usersByProjectName.get(0);
User lastUser = usersByProjectName.get(usersByProjectName.size());
submissionController.updateFullSubmission(firstUser, lastUser);
for (int i = 0; i<usersByProjectName.size()-1;i++) {
User submissionOwner = usersByProjectName.get(i+1);
User feedbackGiver =usersByProjectName.get(i);
submissionController.updateFullSubmission(submissionOwner, feedbackGiver);
GroupFormationMechanism groupFormationMechanism = groupDAO.getGroupFormationMechanism(project);
switch (groupFormationMechanism) {
case SingleUser:
List<User> usersByProjectName = userDAO.getUsersByProjectName(project.getName());
User firstUser = usersByProjectName.get(0);
User lastUser = usersByProjectName.get(usersByProjectName.size());
submissionController.updateFullSubmission(firstUser, lastUser);
for (int i = 0; i<usersByProjectName.size()-1;i++) {
User submissionOwner = usersByProjectName.get(i+1);
User feedbackGiver =usersByProjectName.get(i);
submissionController.updateFullSubmission(submissionOwner, feedbackGiver);
}
break;
case UserProfilStrategy:
case Manual:
case LearningGoalStrategy:
// TODO implement assigning feedback tasks in case of groups
// consider https://docs.google.com/document/d/1DLuggw7gxLbpbDblDTWVtYC-EI4Tb42y285mdABLC0Q/edit?ts=5bbb1f20#
}
}
@Override
public ResearchReport getFeedbackTask(User student) {
return null;
}
}
......@@ -39,6 +39,9 @@ public class ManagementImpl implements Management {
@Inject
private MysqlConnect connect;
@Inject
private ProjectConfigurationDAO projectConfigurationDAO;
@Override
public void delete(User user) {
......@@ -119,13 +122,12 @@ public class ManagementImpl implements Management {
@Override
public void create(ProjectConfiguration projectConfiguration, Project project) {
ProjectConfigurationDAO projectConfigurationDAO = new ProjectConfigurationDAO();
projectConfigurationDAO.persistProjectConfiguration(projectConfiguration, project);
}
@Override
public ProjectConfiguration getProjectConfiguration(Project project) {
ProjectConfigurationDAO projectConfigurationDAO = new ProjectConfigurationDAO();
return projectConfigurationDAO.loadProjectConfiguration(project);
}
......
......@@ -3,8 +3,10 @@ package unipotsdam.gf.modules.submission.controller;
import com.google.common.base.Strings;
import org.slf4j.LoggerFactory;
import unipotsdam.gf.modules.project.Project;
import unipotsdam.gf.modules.project.ProjectDAO;
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.interfaces.ISubmission;
......@@ -15,21 +17,32 @@ 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.process.constraints.ConstraintsImpl;
import unipotsdam.gf.process.phases.Phase;
import unipotsdam.gf.process.progress.HasProgress;
import unipotsdam.gf.process.progress.ProgressData;
import unipotsdam.gf.process.tasks.FeedbackTaskData;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* @author Sven Kästle
* skaestle@uni-potsdam.de
*/
public class SubmissionController implements ISubmission {
public class SubmissionController implements ISubmission, HasProgress {
@Inject
private MysqlConnect connection;
@Inject
private UserDAO userDAO;
@Inject
private ConstraintsImpl constraints;
private static final org.slf4j.Logger log = LoggerFactory.getLogger(SubmissionController.class);
@Override
......@@ -610,4 +623,32 @@ public class SubmissionController implements ISubmission {
return count;
}
@Override
public ProgressData getProgressData(Project project) {
ProgressData progressData = new ProgressData();
// the number of completed dossiers
progressData.setNumberOfCompletion(getFinalizedDossiersCount(project));
// the number of dossiers needed relativ to the group or user count
progressData.setNumberNeeded(constraints.dossiersNeeded(project));
List<User> strugglersWithSubmission = constraints.getStrugglersWithSubmission(project);
progressData.setUsersMissing(strugglersWithSubmission);
progressData.setAlmostComplete((progressData.getNumberNeeded()/progressData.getNumberOfCompletion()) <= (1/10));
return progressData;
}
public List<User> getAllUsersWithFeedbackGiven(Project project) {
List<User> result = new ArrayList<>();
connection.connect();
String query = "select * feedbackUser from fullsubmissions where projectName = ?";
VereinfachtesResultSet vereinfachtesResultSet = connection.issueSelectStatement(query, project.getName());
while (vereinfachtesResultSet.next()) {
result.add(userDAO.getUserByEmail(vereinfachtesResultSet.getString("feedbackUser")));
}
connection.close();
return result;
}
}
......@@ -27,7 +27,7 @@ public class DossierCreationProcess {
@Inject
private Management management;
@Inject
private UserDAO userDAO;
......@@ -42,17 +42,24 @@ public class DossierCreationProcess {
/**
* start the Dossier Phase
*
* @param project
*/
public void startDossierPhase(Project project) {
Task task = new Task(TaskName.CLOSE_GROUP_FINDING_PHASE, project.getAuthorEmail(), project.getName(),
Progress.FINISHED);
taskDAO.updateForUser(task);
// create a task, telling the docent to wait for students upload of dossiers
taskDAO.persist(project, new User(project.getAuthorEmail()), TaskName.WAITING_FOR_STUDENT_DOSSIERS, Phase
.DossierFeedback, TaskType.INFO);
// TODO create waiting for feedback to complete task
taskDAO.persistMemberTask(project, TaskName.UPLOAD_DOSSIER, Phase.DossierFeedback);
}
/**
*
* @param fullSubmissionPostRequest
* @param user
* @param project
......@@ -73,7 +80,6 @@ public class DossierCreationProcess {
}
/**
*
* @param fullSubmission
* @param user
*/
......@@ -82,7 +88,8 @@ public class DossierCreationProcess {
submissionController.markAsFinal(fullSubmission);
// mark annotate task as finished in db
Task task = new Task(TaskName.ANNOTATE_DOSSIER, user.getEmail(), fullSubmission.getProjectName(), Progress.FINISHED);
Task task = new Task(TaskName.ANNOTATE_DOSSIER, user.getEmail(), fullSubmission.getProjectName(),
Progress.FINISHED);
taskDAO.updateForUser(task);
if (constraints.checkIfFeedbackCanBeDistributed(project)) {
......@@ -90,7 +97,8 @@ public class DossierCreationProcess {
feedback.assignFeedbackTasks(project);
// persist tasks for feedback
taskDAO.persistMemberTask(new Project(fullSubmission.getProjectName()), TaskName.GIVE_FEEDBACK, Phase.DossierFeedback);
taskDAO.persistMemberTask(
new Project(fullSubmission.getProjectName()), TaskName.GIVE_FEEDBACK, Phase.DossierFeedback);
}
}
......@@ -99,5 +107,13 @@ public class DossierCreationProcess {
/*
TODO implement
*/
/** TODO: Move this to the dossierCreationProcess
/* if (tasks.size() > 0) {
iCommunication.informAboutMissingTasks(tasks, project);
} else {
// send a message to the users informing them about the start of the new phase
iCommunication.sendMessageToUsers(project, Messages.NewFeedbackTask(project));
saveState(project, changeToPhase);
}*/
}
}
......@@ -7,10 +7,15 @@ 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.mysql.MysqlConnect;
import unipotsdam.gf.process.phases.Phase;
import unipotsdam.gf.process.tasks.ParticipantsCount;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
public class ConstraintsImpl {
......@@ -23,9 +28,16 @@ public class ConstraintsImpl {
@Inject
GroupDAO groupDAO;
@Inject
UserDAO userDAO;
@Inject
private SubmissionController submissionController;
public ConstraintsImpl() {
}
/**
* groups can be formed if participantCount > numStudentsNeeded
*/
......@@ -44,12 +56,67 @@ public class ConstraintsImpl {
*/
public boolean checkIfFeedbackCanBeDistributed(Project project) {
GroupFormationMechanism groupFormationMechanism = groupDAO.getGroupFormationMechanism(project);
int numberOfFinalizedDossiers = submissionController.getFinalizedDossiersCount(project);
Boolean result = false;
switch (groupFormationMechanism) {
case SingleUser:
ParticipantsCount participantCount = projectDAO.getParticipantCount(project);
result = numberOfFinalizedDossiers == participantCount.getParticipants();
break;
case LearningGoalStrategy:
case UserProfilStrategy:
case Manual:
int groupCount = groupDAO.getGroupsByProjectName(project.getName()).size();
result = numberOfFinalizedDossiers == groupCount;
break;
}
return result;
}
/**
* get how many dossiers are needed
*
* @param project
* @return
*/
public int dossiersNeeded(Project project) {
GroupFormationMechanism groupFormationMechanism = groupDAO.getGroupFormationMechanism(project);
Integer result = 0;
switch (groupFormationMechanism) {
case SingleUser:
ParticipantsCount participantCount = projectDAO.getParticipantCount(project);
int numberOfFinalizedDossiers = submissionController.getFinalizedDossiersCount(project);
return numberOfFinalizedDossiers == participantCount.getParticipants();
result = participantCount.getParticipants();
break;
case LearningGoalStrategy:
case UserProfilStrategy:
case Manual:
int groupCount = groupDAO.getGroupsByProjectName(project.getName()).size();
result = groupCount;
break;
}
return false;
return result;
}
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> usersHavingGivenFeedback = submissionController.getAllUsersWithFeedbackGiven(project);
for (User user : usersInProject) {
if (!usersHavingGivenFeedback.contains(user)) {
struggles.add(user);
}
}
break;
case LearningGoalStrategy:
case Manual:
case UserProfilStrategy:
}
return struggles;
}
}
......@@ -91,16 +91,7 @@ public class PhasesImpl implements IPhases {
break;
case DossierFeedback:
// check if everybody has uploaded a dossier
dossierCreationProcess.finishPhase(project);
/** TODO: Move this to the dossierCreationProcess
/* if (tasks.size() > 0) {
iCommunication.informAboutMissingTasks(tasks, project);
} else {
// send a message to the users informing them about the start of the new phase
iCommunication.sendMessageToUsers(project, Messages.NewFeedbackTask(project));
saveState(project, changeToPhase);
}*/
break;
case Execution:
// check if the portfolios have been prepared for evaluation (relevant entries selected)
......
package unipotsdam.gf.process.progress;
import unipotsdam.gf.modules.project.Project;
import unipotsdam.gf.modules.user.User;
public interface HasProgress {
ProgressData getProgressData(Project project);
}
package unipotsdam.gf.process.progress;
import unipotsdam.gf.modules.user.User;
import java.util.List;
public class ProgressData {
private Boolean isAlmostComplete;
private int numberOfCompletion;
private int numberNeeded;
private java.util.List<User> usersMissing;
public ProgressData() {
}
public ProgressData(
Boolean isAlmostComplete, int numberOfCompletion, int numberNeeded, List<User> usersMissing) {
this.isAlmostComplete = isAlmostComplete;
this.numberOfCompletion = numberOfCompletion;
this.numberNeeded = numberNeeded;
this.usersMissing = usersMissing;
}
public Boolean getAlmostComplete() {
return isAlmostComplete;
}
public void setAlmostComplete(Boolean almostComplete) {
isAlmostComplete = almostComplete;
}
public int getNumberOfCompletion() {
return numberOfCompletion;
}
public void setNumberOfCompletion(int numberOfCompletion) {
this.numberOfCompletion = numberOfCompletion;
}
public int getNumberNeeded() {
return numberNeeded;
}
public void setNumberNeeded(int numberNeeded) {
this.numberNeeded = numberNeeded;
}
public List<User> getUsersMissing() {
return usersMissing;
}
public void setUsersMissing(List<User> usersMissing) {
this.usersMissing = usersMissing;
}
}
......@@ -178,6 +178,12 @@ public class TaskDAO {
result.add(feedbackTask);
break;
}
case WAITING_FOR_STUDENT_DOSSIERS: {
Task task = getGeneralTask(vereinfachtesResultSet);
task.setHasRenderModel(true);
task.setTaskData(submissionController.getProgressData(project));
break;
}
default: {
result.add(getGeneralTask(vereinfachtesResultSet));
}
......
......@@ -7,5 +7,5 @@ public enum TaskName {
// Student Tasks
UPLOAD_DOSSIER, GIVE_FEEDBACK, CREATE_QUIZ, WRITE_EJOURNAL, ANNOTATE_DOSSIER, FINALIZE_DOSSIER,
FINALIZE_EJOURNAL,
FORM_GROUPS_MANUALLY, EDIT_FORMED_GROUPS, CONTACT_GROUP_MEMBERS, ASSESSMENT, EDIT_FEEDBACK
FORM_GROUPS_MANUALLY, EDIT_FORMED_GROUPS, CONTACT_GROUP_MEMBERS, ASSESSMENT, WAITING_FOR_STUDENT_DOSSIERS, EDIT_FEEDBACK
}
......@@ -253,6 +253,7 @@ public class ActivityFlowTest {
public void createCourse() {
// add Titel
Project project = factory.manufacturePojo(Project.class);
project.setAuthorEmail(teacher.getEmail());
management.create(project);
ProjectConfiguration projectConfiguration = factory.manufacturePojo(ProjectConfiguration.class);
......
......@@ -51,7 +51,9 @@ CREATE TABLE `fullsubmissions` (
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user` varchar(120) NOT NULL,
`text` mediumtext NOT NULL,
`projectName` varchar(120) NOT NULL
`projectName` varchar(120) NOT NULL,
`feedbackUser` varchar (255),
`finalized` tinyint(4)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `grades` (
......@@ -159,6 +161,12 @@ CREATE TABLE `workrating` (
`autonomous` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE submissionuser
(
submissionId varchar(400),
userEmail varchar(255)
);
ALTER TABLE `annotations`
ADD PRIMARY KEY (`id`);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment