fix(course): fix #28 by allowing course deletion with inactive participants only

This commit is contained in:
Steffen Jost 2023-06-20 14:39:55 +00:00
parent 1e5e505a0c
commit 9dfd91b2f8
9 changed files with 35 additions and 16 deletions

View File

@ -12,4 +12,6 @@ ParticipantsCsvSheetName tid@TermId ssh@SchoolId: #{foldCase (termToText (unTerm
CourseParticipants n@Int: Derzeit #{n} angemeldete Kursartteilnehmer:innen CourseParticipants n@Int: Derzeit #{n} angemeldete Kursartteilnehmer:innen
ParticipantsIntersectNotOne: Schnitt ParticipantsIntersectNotOne: Schnitt
AllUsersUnion: Vereinigung aller Teilnehmer:innen AllUsersUnion: Vereinigung aller Teilnehmer:innen
AllUsersIntersection: Schnitt aller Teilneher:innen AllUsersIntersection: Schnitt aller Teilneher:innen
CourseDeleteActiveParticipants: Diese Kursart hat noch aktive Kursteilnehmer und kann deshalb nicht gelöscht werden. Bitte zuerst alle aktiven Kursteilnehmer entfernen.
CourseDeleteExistExams: Diese Kursart kann nicht gelöscht werden, so lange Prüfungen damit assoziiert werden.

View File

@ -12,4 +12,6 @@ ParticipantsCsvSheetName tid ssh: #{foldCase (termToText (unTermKey tid))}-#{fol
CourseParticipants n: Currently #{n} course type #{pluralEN n "participant" "participants"} CourseParticipants n: Currently #{n} course type #{pluralEN n "participant" "participants"}
ParticipantsIntersectNotOne: Intersection ParticipantsIntersectNotOne: Intersection
AllUsersUnion: Union of all participants AllUsersUnion: Union of all participants
AllUsersIntersection: Intersection of all participants AllUsersIntersection: Intersection of all participants
CourseDeleteActiveParticipants: This course type still has active participants. Remove all active participants first if you really want to delete this course.
CourseDeleteExistExams: This course type cannot be deleted, for as long as associated exams exist.

View File

@ -27,7 +27,8 @@ MenuHelp: Hilfe
MenuProfile: Anpassen MenuProfile: Anpassen
MenuLogin !ident-ok: Login MenuLogin !ident-ok: Login
MenuLogout !ident-ok: Logout MenuLogout !ident-ok: Logout
MenuCourseList: Kurse MenuCourseList: Kursarten
MenuCourseIcon: Kurse
MenuCourseMembers: Kursartteilnehmer:innen MenuCourseMembers: Kursartteilnehmer:innen
MenuCourseAddMembers: Kursartteilnehmer:innen hinzufügen MenuCourseAddMembers: Kursartteilnehmer:innen hinzufügen
MenuTutorialAddMembers: Kursteilnehmer:innen hinzufügen MenuTutorialAddMembers: Kursteilnehmer:innen hinzufügen

View File

@ -27,7 +27,8 @@ MenuHelp: Support
MenuProfile: Settings MenuProfile: Settings
MenuLogin: Login MenuLogin: Login
MenuLogout: Logout MenuLogout: Logout
MenuCourseList: Courses MenuCourseList: Course types
MenuCourseIcon: Courses
MenuCourseMembers: Participants MenuCourseMembers: Participants
MenuCourseAddMembers: Add course type participants MenuCourseAddMembers: Add course type participants
MenuTutorialAddMembers: Add course participants MenuTutorialAddMembers: Add course participants

View File

@ -57,7 +57,7 @@ Lecturer -- course ownership
UniqueLecturer user course -- note: multiple lecturers per course are allowed, but no duplicated rows in this table UniqueLecturer user course -- note: multiple lecturers per course are allowed, but no duplicated rows in this table
deriving Generic deriving Generic
CourseParticipant -- course enrolement CourseParticipant -- course enrolement
course CourseId course CourseId OnDeleteCascade OnUpdateCascade
user UserId user UserId
registration UTCTime -- time of last enrolement for this course registration UTCTime -- time of last enrolement for this course
field StudyFeaturesId Maybe MigrationOnly field StudyFeaturesId Maybe MigrationOnly
@ -73,7 +73,7 @@ CourseParticipant -- course enrolement
-- editor UserId -- who edited this note last -- editor UserId -- who edited this note last
-- UniqueCourseUserNote user course -- UniqueCourseUserNote user course
CourseUserNote -- lecturers of a specific course may share a text note on each enrolled student CourseUserNote -- lecturers of a specific course may share a text note on each enrolled student
course CourseId course CourseId OnDeleteCascade OnUpdateCascade
user UserId user UserId
note StoredMarkup -- arbitrary user-defined text; visible only to lecturer of this course note StoredMarkup -- arbitrary user-defined text; visible only to lecturer of this course
UniqueCourseUserNote user course UniqueCourseUserNote user course
@ -85,14 +85,14 @@ CourseUserNoteEdit -- who edited a participants course note when
deriving Generic deriving Generic
CourseUserExamOfficeOptOut CourseUserExamOfficeOptOut
course CourseId course CourseId OnDeleteCascade OnUpdateCascade
user UserId user UserId
school SchoolId school SchoolId
UniqueCourseUserExamOfficeOptOut course user school UniqueCourseUserExamOfficeOptOut course user school
deriving Generic deriving Generic
CourseQualification CourseQualification
course CourseId course CourseId OnDeleteCascade OnUpdateCascade
qualification QualificationId qualification QualificationId
sortOrder Int default=0 --TODO: not yet used in Handler.Course.Users.makeCourseUserTable sortOrder Int default=0 --TODO: not yet used in Handler.Course.Users.makeCourseUserTable
UniqueCourseQualification course qualification UniqueCourseQualification course qualification

View File

@ -3,7 +3,7 @@
-- SPDX-License-Identifier: AGPL-3.0-or-later -- SPDX-License-Identifier: AGPL-3.0-or-later
Exam Exam
course CourseId course CourseId OnDeleteCascade OnUpdateCascade
name ExamName name ExamName
gradingRule ExamGradingRule Maybe gradingRule ExamGradingRule Maybe
bonusRule ExamBonusRule Maybe bonusRule ExamBonusRule Maybe

View File

@ -679,7 +679,7 @@ defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the
{ navHeaderRole = NavHeaderPrimary { navHeaderRole = NavHeaderPrimary
, navIcon = IconMenuCourseList , navIcon = IconMenuCourseList
, navLink = NavLink , navLink = NavLink
{ navLabel = MsgMenuCourseList { navLabel = MsgMenuCourseIcon
, navRoute = CourseListR , navRoute = CourseListR
, navAccess' = NavAccessTrue , navAccess' = NavAccessTrue
, navType = NavTypeLink { navModal = False } , navType = NavTypeLink { navModal = False }

View File

@ -17,8 +17,20 @@ import qualified Data.Set as Set
getCDeleteR, postCDeleteR :: TermId -> SchoolId -> CourseShorthand -> Handler Html getCDeleteR, postCDeleteR :: TermId -> SchoolId -> CourseShorthand -> Handler Html
getCDeleteR = postCDeleteR getCDeleteR = postCDeleteR
postCDeleteR tid ssh csh = do postCDeleteR tid ssh csh = do
Entity cId _ <- runDB . getBy404 $ TermSchoolCourseShort tid ssh csh (cId, activeParticipants, existExams) <- runDB $ do
deleteR $ (courseDeleteRoute $ Set.singleton cId) Entity cId _ <- getBy404 $ TermSchoolCourseShort tid ssh csh
{ drAbort = SomeRoute $ CourseR tid ssh csh CShowR activeParticipants <- exists [CourseParticipantState ==. CourseParticipantActive, CourseParticipantCourse ==. cId]
, drSuccess = SomeRoute $ TermSchoolCourseListR tid ssh existExams <- exists [ExamCourse ==. cId]
} return (cId, activeParticipants, existExams)
if
| activeParticipants -> do
addMessageI Error MsgCourseDeleteActiveParticipants
redirect $ CourseR tid ssh csh CUsersR
| existExams -> do
addMessageI Error MsgCourseDeleteExistExams
redirect $ CourseR tid ssh csh CExamListR
| otherwise ->
deleteR $ (courseDeleteRoute $ Set.singleton cId)
{ drAbort = SomeRoute $ CourseR tid ssh csh CShowR
, drSuccess = SomeRoute $ TermSchoolCourseListR tid ssh
}

View File

@ -1104,7 +1104,8 @@ fillDb = do
, tutorialTutorControlled = True , tutorialTutorControlled = True
, tutorialFirstDay = Just $ succ $ succ $ firstDay , tutorialFirstDay = Just $ succ $ succ $ firstDay
} }
void . insert' $ Exam when (odd tyear) $
void . insert' $ Exam
{ examCourse = c { examCourse = c
, examName = mkName "Theorieprüfung" , examName = mkName "Theorieprüfung"
, examGradingRule = Nothing , examGradingRule = Nothing