Beispiel #1
0
        private void CommitTaskDelegation(TaskDelegationDTO taskDelegation)
        {
            var answers = taskDelegation.Tasks.Select(t => t.Answers).SelectMany(t => t);

            var answerDict = CreateTaskDictionary(answers);

            var publication = taskDelegation.Publication;

            foreach (var fieldAnswerList in answerDict)
            {
                var fieldId = fieldAnswerList.Key;

                // TODO : Write framework for conflict handling

                var valueDict = CreateValueDict(fieldAnswerList.Value);

                // Find the value that was submitted the maximum number of times
                var mostPopular = valueDict.Aggregate((max, cur) => cur.Value > max.Value ? cur : max);

                publication.Data.Single(d =>
                {
                    var f = _fieldRepository.ReadAsync(d.FieldId).Result;
                    return(f.Id == fieldId);
                }).Value = mostPopular.Key;
            }
        }
Beispiel #2
0
 public static TaskDelegation ConvertToEntity(this TaskDelegationDTO dto)
 {
     return(new TaskDelegation {
         Id = dto.Id,
         PhaseId = dto.PhaseId,
         Publication = dto.Publication?.ConvertToEntity(),
         PublicationId = dto.Publication?.Id ?? 0,
         Tasks = dto.Tasks?.Select(d => d.ConvertToEntity()).ToList()
     });
 }
Beispiel #3
0
        public async Task <bool> StartPhase(PhaseDTO phase)
        {
            var study = await _studyRepo.ReadAsync(phase.StudyId);

            study.ActivePhase = phase;

            await _studyRepo.UpdateAsync(study);

            var p = study.Users;

            p = p.OrderBy(a => Guid.NewGuid()).ToList();
            var participants = p.ToList();

            study.Publications = study.Publications.OrderBy(a => Guid.NewGuid()).ToList(); // Shuffle list

            /*
             * Gennemgå hver publication
             *  Lav en task delegation for hver publication
             *      Lav antal x tasks (hver til én user)
             *          Få id fra GetNextUser
             **/


            var publications = study.Publications.ToList();

            var numPubs  = study.Publications.Count();
            var numUsers = participants.Count();

            var numOverlap = numPubs * 100.0 / phase.OverlapPercentage;

            var numMinTasks   = numOverlap / numUsers; // Number of minimum tasks for each researcher
            var numExtraTasks = numOverlap % numUsers; // Number of researchers that must get an extra task

            int curUserIdx = 0;

            var taskList = new List <ReviewTaskDTO>();

            foreach (PublicationDTO publication in publications)
            {
                var delegation = new TaskDelegationDTO {
                    PhaseId     = phase.Id,
                    Publication = publication,
                    Tasks       = taskList
                };

                await _taskDelRepo.CreateAsync(delegation);

                var numTasks = numMinTasks + (numExtraTasks-- >= 0 ? 1 : 0); // Min tasks and maybe plus an extra
                for (int n = 0; n < numTasks; n++)
                {
                    var task = new ReviewTaskDTO {
                        TaskDelegationId = delegation.Id,
                        User             = participants[curUserIdx].User
                    };

                    await _taskRepo.CreateAsync(task);

                    taskList.Add(task);

                    curUserIdx = (curUserIdx + 1) % participants.Count();
                }

                await _taskDelRepo.UpdateAsync(delegation);

                return(await Update(phase));
            }

            return(false);
        }