From b7d6f3c9e991790cda7920ced039a3d8b4ffa8ac Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Thu, 28 Nov 2019 12:52:03 +0100 Subject: [PATCH] refactor(sub-study-fields): reformulate as superStudyField Fixes #531 BREAKING CHANGE: superStudyField --- models/users.model | 2 +- src/Foundation.hs | 28 ++++++++++++++++++++++++++-- src/Handler/Profile.hs | 5 +---- src/Handler/Utils/StudyFeatures.hs | 2 +- src/Model/Migration.hs | 8 ++++++++ 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/models/users.model b/models/users.model index 87c9c6a87..657669910 100644 --- a/models/users.model +++ b/models/users.model @@ -55,7 +55,7 @@ StudyFeatures -- multiple entries possible for students pursuing several degree user UserId degree StudyDegreeId -- Abschluss, i.e. Master, Bachelor, etc. field StudyTermsId -- Fach, i.e. Informatics, Philosophy, etc. - subField StudyTermsId Maybe + superField StudyTermsId Maybe type StudyFieldType -- Major or minor, i.e. Haupt-/Nebenfach semester Int updated UTCTime default=now() -- last update from LDAP diff --git a/src/Foundation.hs b/src/Foundation.hs index 65e368fd0..86ef9e02f 100644 --- a/src/Foundation.hs +++ b/src/Foundation.hs @@ -3461,7 +3461,10 @@ upsertCampusUser ldapData Creds{..} = do if | not $ null knownParents -> do $logDebugS "Campus" [st|Applying subterm “#{tshow subterm}” to #{tshow matchingFeatures}|] - (++) (matchingFeatures & traverse . _studyFeaturesSubField %~ (<|> Just subterm)) <$> assimilateSubTerms subterms (unusedFeats List.\\ matchingFeatures) + let setSuperField sf = sf + & _studyFeaturesSuperField %~ (<|> Just (sf ^. _studyFeaturesField)) + & _studyFeaturesField .~ subterm + (++) (map setSuperField matchingFeatures) <$> assimilateSubTerms subterms (unusedFeats List.\\ matchingFeatures) | otherwise -> do $logDebugS "Campus" [st|Ignoring subterm “#{tshow subterm}”|] assimilateSubTerms subterms unusedFeats @@ -3510,7 +3513,28 @@ upsertCampusUser ldapData Creds{..} = do forM_ fs $ \f@StudyFeatures{..} -> do insertMaybe studyFeaturesDegree $ StudyDegree (unStudyDegreeKey studyFeaturesDegree) Nothing Nothing insertMaybe studyFeaturesField $ StudyTerms (unStudyTermsKey studyFeaturesField) Nothing Nothing Nothing Nothing - void $ upsert f [StudyFeaturesUpdated =. now, StudyFeaturesValid =. True, StudyFeaturesSubField =. studyFeaturesSubField] + oldFs <- selectKeysList + ([ StudyFeaturesUser ==. studyFeaturesUser + , StudyFeaturesDegree ==. studyFeaturesDegree + , StudyFeaturesType ==. studyFeaturesType + , StudyFeaturesSemester ==. studyFeaturesSemester + ] ++ + [ StudyFeaturesField ==. studyFeaturesField + , StudyFeaturesSuperField ==. studyFeaturesSuperField + ] ||. case studyFeaturesSuperField of + Just sField -> + [ StudyFeaturesField ==. sField + , StudyFeaturesSuperField ==. Nothing + ] + Nothing -> [] + ) [] + case oldFs of + [oldF] -> update oldF [ StudyFeaturesUpdated =. now + , StudyFeaturesValid =. True + , StudyFeaturesField =. studyFeaturesField + , StudyFeaturesSuperField =. studyFeaturesSuperField + ] + _other -> insert_ f associateUserSchoolsByTerms userId let diff --git a/src/Handler/Profile.hs b/src/Handler/Profile.hs index 4611c004e..55e2c51f8 100644 --- a/src/Handler/Profile.hs +++ b/src/Handler/Profile.hs @@ -359,12 +359,9 @@ makeProfileData (Entity uid User{..}) = do E.on $ sheet E.^. SheetId E.==. corrector E.^. SheetCorrectorSheet E.where_ $ corrector E.^. SheetCorrectorUser E.==. E.val uid return (course E.^. CourseTerm, course E.^. CourseSchool, course E.^. CourseShorthand) - studies <- E.select $ E.from $ \(studydegree `E.InnerJoin` studyfeat `E.InnerJoin` studyterms) -> - E.distinctOnOrderBy [ E.asc $ studyfeat E.^. StudyFeaturesId ] $ do - E.orderBy [ E.desc $ studyfeat E.^. StudyFeaturesSubField E.==. E.just (studyterms E.^. StudyTermsId) ] + studies <- E.select $ E.from $ \(studydegree `E.InnerJoin` studyfeat `E.InnerJoin` studyterms) -> do E.where_ $ studyfeat E.^. StudyFeaturesUser E.==. E.val uid E.on $ studyfeat E.^. StudyFeaturesField E.==. studyterms E.^. StudyTermsId - E.||. studyfeat E.^. StudyFeaturesSubField E.==. E.just (studyterms E.^. StudyTermsId) E.on $ studyfeat E.^. StudyFeaturesDegree E.==. studydegree E.^. StudyDegreeId return (studyfeat, studydegree, studyterms) --Tables diff --git a/src/Handler/Utils/StudyFeatures.hs b/src/Handler/Utils/StudyFeatures.hs index bbd194617..a138fc69c 100644 --- a/src/Handler/Utils/StudyFeatures.hs +++ b/src/Handler/Utils/StudyFeatures.hs @@ -40,7 +40,7 @@ pStudyFeatures studyFeaturesUser studyFeaturesUpdated = do void $ char '!' studyFeaturesSemester <- decimal let studyFeaturesValid = True - studyFeaturesSubField = Nothing + studyFeaturesSuperField = Nothing return StudyFeatures{..} pStudyFeature `sepBy1` char '#' diff --git a/src/Model/Migration.hs b/src/Model/Migration.hs index dde364c03..0a18babde 100644 --- a/src/Model/Migration.hs +++ b/src/Model/Migration.hs @@ -591,6 +591,14 @@ customMigrations = Map.fromListWith (>>) , whenM (tableExists "exam_part_corrector") $ tableDropEmpty "exam_part_corrector" ) + , ( AppliedMigrationKey [migrationVersion|28.0.0|] [version|29.0.0|] + , whenM (tableExists "study_features") $ + [executeQQ| + ALTER TABLE "study_features" ADD COLUMN "super_field" bigint; + UPDATE "study_features" SET "super_field" = "field", "field" = "sub_field" WHERE NOT ("sub_field" IS NULL); + ALTER TABLE "study_features" DROP COLUMN "sub_field"; + |] + ) ]