コード例 #1
0
        public Task SaveOrUpdate(Task task, IEnumerable <int> attachedFileIds, bool notifyResponsible, bool isImport = false)
        {
            if (task == null)
            {
                throw new ArgumentNullException("task");
            }
            if (task.Project == null)
            {
                throw new Exception("task.Project");
            }

            // check guests responsibles
            foreach (var responsible in task.Responsibles)
            {
                if (ProjectSecurity.IsVisitor(responsible))
                {
                    ProjectSecurity.CreateGuestSecurityException();
                }

                if (!ProjectSecurity.IsInTeam(task.Project, responsible))
                {
                    ProjectSecurity.CreateSecurityException();
                }
            }

            var milestone            = task.Milestone != 0 ? DaoFactory.MilestoneDao.GetById(task.Milestone) : null;
            var milestoneResponsible = milestone != null ? milestone.Responsible : Guid.Empty;

            var removeResponsibles   = new List <Guid>();
            var inviteToResponsibles = new List <Guid>();

            task.Responsibles.RemoveAll(r => r.Equals(Guid.Empty));

            if (task.Deadline.Kind != DateTimeKind.Local && task.Deadline != DateTime.MinValue)
            {
                task.Deadline = TenantUtil.DateTimeFromUtc(task.Deadline);
            }

            if (task.StartDate.Kind != DateTimeKind.Local && task.StartDate != DateTime.MinValue)
            {
                task.StartDate = TenantUtil.DateTimeFromUtc(task.StartDate);
            }

            var isNew = task.ID == default(int); //Task is new

            if (isNew)
            {
                if (task.CreateBy == default(Guid))
                {
                    task.CreateBy = SecurityContext.CurrentAccount.ID;
                }
                if (task.CreateOn == default(DateTime))
                {
                    task.CreateOn = TenantUtil.DateTimeNow();
                }

                ProjectSecurity.DemandCreate <Task>(task.Project);

                task = DaoFactory.TaskDao.Create(task);

                inviteToResponsibles.AddRange(task.Responsibles.Distinct());
            }
            else
            {
                var oldTask = DaoFactory.TaskDao.GetById(new [] { task.ID }).FirstOrDefault();

                if (oldTask == null)
                {
                    throw new ArgumentNullException("task");
                }
                ProjectSecurity.DemandEdit(oldTask);

                var newResponsibles = task.Responsibles.Distinct().ToList();
                var oldResponsibles = oldTask.Responsibles.Distinct().ToList();

                removeResponsibles.AddRange(oldResponsibles.Where(p => !newResponsibles.Contains(p)));
                inviteToResponsibles.AddRange(newResponsibles.Where(participant => !oldResponsibles.Contains(participant)));

                task.LastModifiedBy = SecurityContext.CurrentAccount.ID;
                task.LastModifiedOn = TenantUtil.DateTimeNow();

                task = DaoFactory.TaskDao.Update(task);
            }

            if (attachedFileIds != null && attachedFileIds.Any())
            {
                foreach (var attachedFileId in attachedFileIds)
                {
                    AttachFile(task, attachedFileId);
                }
            }

            var senders = new HashSet <Guid>(task.Responsibles)
            {
                task.Project.Responsible, milestoneResponsible, task.CreateBy
            };

            senders.Remove(Guid.Empty);

            foreach (var subscriber in senders)
            {
                Subscribe(task, subscriber);
            }

            inviteToResponsibles.RemoveAll(r => r.Equals(Guid.Empty));
            removeResponsibles.RemoveAll(r => r.Equals(Guid.Empty));

            NotifyTask(task, inviteToResponsibles, removeResponsibles, isNew, notifyResponsible);

            return(task);
        }
コード例 #2
0
ファイル: TaskEngine.cs プロジェクト: ztcyun/CommunityServer
        public Task ChangeStatus(Task task, CustomTaskStatus newStatus)
        {
            ProjectSecurity.DemandEdit(task);

            if (task == null)
            {
                throw new ArgumentNullException("task");
            }
            if (task.Project == null)
            {
                throw new Exception("Project can't be null.");
            }
            if (task.Project.Status == ProjectStatus.Closed)
            {
                throw new Exception(EngineResource.ProjectClosedError);
            }

            if (task.Status == newStatus.StatusType && task.CustomTaskStatus == newStatus.Id)
            {
                return(task);
            }

            var status       = StatusEngine.Get().FirstOrDefault(r => r.Id == newStatus.Id);
            var cannotChange =
                status != null &&
                status.Available.HasValue && !status.Available.Value &&
                task.CreateBy != SecurityContext.CurrentAccount.ID &&
                task.Project.Responsible != SecurityContext.CurrentAccount.ID &&
                !ProjectSecurity.CurrentUserAdministrator;

            if (cannotChange)
            {
                ProjectSecurity.CreateSecurityException();
            }


            var senders = GetSubscribers(task);

            if (newStatus.StatusType == TaskStatus.Closed && !DisableNotifications && senders.Count != 0)
            {
                NotifyClient.Instance.SendAboutTaskClosing(senders, task);
            }

            if (newStatus.StatusType == TaskStatus.Open && !DisableNotifications && senders.Count != 0)
            {
                NotifyClient.Instance.SendAboutTaskResumed(senders, task);
            }

            task.Status           = newStatus.StatusType;
            task.CustomTaskStatus = newStatus.Id < 0 ? null : (int?)newStatus.Id;
            task.LastModifiedBy   = SecurityContext.CurrentAccount.ID;
            task.LastModifiedOn   = TenantUtil.DateTimeNow();
            task.StatusChangedOn  = TenantUtil.DateTimeNow();

            //subtask
            if (newStatus.StatusType == TaskStatus.Closed)
            {
                if (!task.Responsibles.Any())
                {
                    task.Responsibles.Add(SecurityContext.CurrentAccount.ID);
                }

                DaoFactory.SubtaskDao.CloseAllSubtasks(task);
                foreach (var subTask in task.SubTasks)
                {
                    subTask.Status = TaskStatus.Closed;
                }
            }

            return(DaoFactory.TaskDao.Update(task));
        }