User deletion implemented, but not tested
This commit is contained in:
parent
f07ad82c1d
commit
832c007027
@ -163,17 +163,44 @@ postProfileDataR = do
|
|||||||
case btnResult of
|
case btnResult of
|
||||||
(FormSuccess BtnDelete) -> do
|
(FormSuccess BtnDelete) -> do
|
||||||
(uid, User{..}) <- requireAuthPair
|
(uid, User{..}) <- requireAuthPair
|
||||||
addMessage Warning "Delete-Knopf gedrückt"
|
(deletedSubmissions,groupSubmissions) <- runDB $ deleteUser uid
|
||||||
addMessage Error "Löschen der Daten wurde noch nicht implementiert."
|
-- addMessageI Success $ MsgDeleteUser deletedSubmissions
|
||||||
-- first determine all submission that solely depend on this user:
|
-- when (groupSubmissions > 0) $ addMessageI Info $ MsgDeleteUserGroupSubmissions groupSubmissions
|
||||||
-- SubmissionGroup / SubmissionGroupUser
|
--TODO: LogOut user
|
||||||
-- Submission / SubmissionUser
|
defaultLayout $ do
|
||||||
-- runDB $ deleteCascade uid
|
$(widgetFile "deletedUser")
|
||||||
|
|
||||||
(FormSuccess BtnAbort ) -> do
|
(FormSuccess BtnAbort ) -> do
|
||||||
addMessageI Info MsgAborted
|
addMessageI Info MsgAborted
|
||||||
redirect ProfileDataR
|
redirect ProfileDataR
|
||||||
_other -> return ()
|
_other -> getProfileDataR
|
||||||
getProfileDataR
|
|
||||||
|
|
||||||
|
|
||||||
|
deleteUser :: UserId -> DB (Int,Int) -- TODO: Restrict deletions for lecturers, tutors and students in course that won't allow deregistration
|
||||||
|
deleteUser duid = do
|
||||||
|
-- E.deleteCount for submissions is not cascading, hence we first select and then delete manually
|
||||||
|
-- Submissions / SubmissionUser
|
||||||
|
-- TODO: SubmissionGroup / SubmissionGroupUser
|
||||||
|
-- TODO: SheetPseudonym ???
|
||||||
|
groupSubmissions <- selectSubmissionsWhere (\numBuddies -> numBuddies E.>. E.val (0::Int64))
|
||||||
|
singleSubmissions <- selectSubmissionsWhere (\numBuddies -> numBuddies E.==. E.val (0::Int64))
|
||||||
|
deleteCascade duid
|
||||||
|
forM_ singleSubmissions $ \(E.Value submissionId) -> deleteCascade submissionId
|
||||||
|
return (length singleSubmissions, length groupSubmissions)
|
||||||
|
where
|
||||||
|
selectSubmissionsWhere :: (E.SqlExpr (E.Value Int64) -> E.SqlExpr (E.Value Bool))
|
||||||
|
-> ReaderT SqlBackend (HandlerT UniWorX IO) [E.Value (Key Submission)]
|
||||||
|
selectSubmissionsWhere whereBuddies =
|
||||||
|
E.select $ E.from $ \(submission `E.InnerJoin` suser) -> do
|
||||||
|
E.on $ submission E.^. SubmissionId E.==. suser E.^. SubmissionUserSubmission
|
||||||
|
let numBuddies = E.sub_select $ E.from $ \subUsers -> do
|
||||||
|
E.where_ $ subUsers E.^. SubmissionUserSubmission E.==. submission E.^. SubmissionId
|
||||||
|
E.&&. subUsers E.^. SubmissionUserUser E.!=. E.val duid
|
||||||
|
return E.countRows
|
||||||
|
E.where_ $ suser E.^. SubmissionUserUser E.==. E.val duid
|
||||||
|
E.&&. (whereBuddies numBuddies)
|
||||||
|
return $ submission E.^. SubmissionId
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import qualified Data.Set as Set
|
|||||||
import qualified Database.Esqueleto as E
|
import qualified Database.Esqueleto as E
|
||||||
-- import Database.Persist -- currently not needed here
|
-- import Database.Persist -- currently not needed here
|
||||||
|
|
||||||
|
-- ezero = E.val (0 :: Int64)
|
||||||
|
|
||||||
emptyOrIn :: PersistField typ =>
|
emptyOrIn :: PersistField typ =>
|
||||||
E.SqlExpr (E.Value typ) -> Set typ -> E.SqlExpr (E.Value Bool)
|
E.SqlExpr (E.Value typ) -> Set typ -> E.SqlExpr (E.Value Bool)
|
||||||
|
|||||||
11
templates/deletedUser.hamlet
Normal file
11
templates/deletedUser.hamlet
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<div .container>
|
||||||
|
<h1>
|
||||||
|
Account für ^{nameWidget userDisplayName userSurname} wurde gelöscht
|
||||||
|
<div .container>
|
||||||
|
#{display deletedSubmissions} Abgaben wurden unwiederruflich gelöscht.
|
||||||
|
<div .container>
|
||||||
|
#{display groupSubmissions} Gruppenabgaben verbleiben in der Datenbank,
|
||||||
|
aber die Zuordnung zum Benutzer wurden gelöscht.
|
||||||
|
Gruppenabgaben können dadurch zu Einzelabgaben werden,
|
||||||
|
welche dann vom letzten Benutzer gelöscht werden können.
|
||||||
|
|
||||||
Reference in New Issue
Block a user