Exemple #1
0
        public ActionResult NewCourseRep(ElectionForm form)
        {
            ModelFieldsAccessibility fieldsInfo = NewDefaultFieldsInfo;

            // Ignore stuff that isn't supposed to be in new election
            fieldsInfo.ReplaceUneditableWithOldValues(form, new ElectionForm());
            this.RemoveIgnoredErrors(fieldsInfo);

            if (ModelState.IsValid)
            {
                Election election = Mapper.Map <Election>(form);
                election.Type = ElectionType.CourseRepresentative;
                election.PositionGenerationInProcess = true;

                ElectionStateChange createChangeInfo = new ElectionStateChange
                {
                    Election           = election,
                    PreviousState      = null,
                    TargetState        = election.State,
                    IsCausedByUser     = true,
                    InstigatorUsername = User.Identity.GetUserId(),
                    CompletedAt        = DateTime.Now
                };

                db.Elections.Add(election);
                db.ElectionStateChanges.Add(createChangeInfo);

                using (DbContextTransaction transaction = db.Database.BeginTransaction())
                {
                    db.SaveChanges();

                    // This needs to be after the first big transaction - otherwise EF gets confused about order of actions
                    election.PopulateAutomaticStateTransitions();
                    db.SaveChanges();

                    transaction.Commit();
                }

                AuditLogManager.RecordNewElection(createChangeInfo);

                // Schedule the job to loop over the DB to generate the positions
                BackgroundJob.Enqueue(() => GeneratePositions.Execute(election.Id, JobCancellationToken.Null));

                return(RedirectToAction("Details", new { id = election.Id }));
            }

            ViewData[FormConstants.FieldsInfoKey] = fieldsInfo;

            return(View(form));
        }
Exemple #2
0
        public static ModelFieldsAccessibility GetWhatCanBeEditedCouncil(Election election)
        {
            if (!CanEdit(election))
            {
                throw new Exception(
                          $"Cannot call {nameof(GetWhatCanBeEditedCouncil)} when the election isn't editable"
                          );
            }

            bool isCouncil = election.Type == ElectionType.StudentCouncil;

            // Mark everything editable by default
            ModelFieldsAccessibility fieldsInfo = isCouncil
                ? CouncilElectionForm.DefaultCouncilFieldsInfo(ModelFieldsAccessibility.Kind.Editable)
                : ElectionForm.DefaultFieldsInfo(ModelFieldsAccessibility.Kind.Editable);

            if (!ShowResultsAdmin(election))
            {
                fieldsInfo.MarkNotShown(nameof(ElectionForm.ResultsText));
            }

            if (election.State == ElectionState.Disabled)
            {
                // Everything (expect ResultsText) can be edited
                return(fieldsInfo);
            }

            if (election.State == ElectionState.PreNominations || IsAfter(election, ElectionState.PreNominations))
            {
                if (isCouncil)
                {
                    fieldsInfo.MarkNotEditable(nameof(CouncilElectionForm.Roles));
                }

                fieldsInfo
                .GetSubFieldInfo(nameof(ElectionForm.Nominations))
                .MarkNotEditable(nameof(ElectionPhaseForm.BeginsAt));

                if (election.State == ElectionState.PreNominations)
                {
                    return(fieldsInfo);
                }
            }

            if (election.State == ElectionState.Nominations || IsAfter(election, ElectionState.Nominations))
            {
                fieldsInfo.MarkNotShown(nameof(ElectionForm.NominationsStartedEmail));

                // Eligibility is not refreshed automatically after nominations have started
                fieldsInfo.MarkNotShown(nameof(ElectionForm.DisableAutomaticEligibility));

                if (election.State == ElectionState.Nominations)
                {
                    return(fieldsInfo);
                }
            }

            if (election.State == ElectionState.PreVoting || IsAfter(election, ElectionState.PreVoting))
            {
                fieldsInfo.MarkNotShown(nameof(ElectionForm.Nominations));
                if (isCouncil)
                {
                    fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.NominationsAlmostOverEmail));
                }
                fieldsInfo.MarkNotShown(nameof(ElectionForm.PostNominationsEmail));

                if (election.State == ElectionState.PreVoting)
                {
                    return(fieldsInfo);
                }
            }

            if (election.State == ElectionState.Voting || IsAfter(election, ElectionState.Voting))
            {
                if (isCouncil)
                {
                    fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.VotingStartedEmail));
                }

                fieldsInfo
                .GetSubFieldInfo(nameof(ElectionForm.Voting))
                .MarkNotEditable(nameof(ElectionPhaseForm.BeginsAt));

                if (election.State == ElectionState.Voting)
                {
                    return(fieldsInfo);
                }
            }

            if (election.State == ElectionState.Closed || IsAfter(election, ElectionState.Closed))
            {
                if (isCouncil)
                {
                    fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.Roles));
                }
                fieldsInfo.MarkNotShown(nameof(ElectionForm.Voting));
                if (isCouncil)
                {
                    fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.VotingAlmostOverEmail));
                }
                fieldsInfo.MarkNotShown(nameof(ElectionForm.PostVotingEmail));

                if (election.State == ElectionState.Closed)
                {
                    return(fieldsInfo);
                }
            }

            return(fieldsInfo);
        }