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)); }
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); }