Favourites working now (without PageActions).

This commit is contained in:
SJost 2018-04-10 10:38:21 +02:00
parent 951af369c8
commit 380c57c578
10 changed files with 73 additions and 24 deletions

1
.gitignore vendored
View File

@ -25,6 +25,7 @@ uniworx.nix
.gup/ .gup/
.dbsettings.yml .dbsettings.yml
*.kate-swp *.kate-swp
.kateproject
src/Handler/Assist.bak src/Handler/Assist.bak
src/Handler/Course.SnapCustom.hs src/Handler/Course.SnapCustom.hs
*.orig *.orig

View File

@ -1,4 +0,0 @@
{
"name": "ReWorX"
, "files": [ { "git": 1, "filters": ["*.hs", "*.hamlet", "*.lucius", "*.cassius", "*.julius"], "recursive": 1 } ]
}

View File

@ -12,6 +12,7 @@ import Data.Time
main :: IO () main :: IO ()
main = db $ do main = db $ do
defaultFavourites <- getsYesod $ appDefaultFavourites . appSettings
now <- liftIO getCurrentTime now <- liftIO getCurrentTime
let let
summer2017 = TermIdentifier 2017 Summer summer2017 = TermIdentifier 2017 Summer
@ -23,6 +24,7 @@ main = db $ do
, userMatrikelnummer = Nothing , userMatrikelnummer = Nothing
, userEmail = "G.Kleen@campus.lmu.de" , userEmail = "G.Kleen@campus.lmu.de"
, userDisplayName = "Gregor Kleen" , userDisplayName = "Gregor Kleen"
, userMaxFavourites = 6
} }
fhamann <- insert User fhamann <- insert User
{ userPlugin = "LDAP" { userPlugin = "LDAP"
@ -30,6 +32,7 @@ main = db $ do
, userMatrikelnummer = Nothing , userMatrikelnummer = Nothing
, userEmail = "felix.hamann@campus.lmu.de" , userEmail = "felix.hamann@campus.lmu.de"
, userDisplayName = "Felix Hamann" , userDisplayName = "Felix Hamann"
, userMaxFavourites = defaultFavourites
} }
jost <- insert User jost <- insert User
{ userPlugin = "LDAP" { userPlugin = "LDAP"
@ -37,6 +40,7 @@ main = db $ do
, userMatrikelnummer = Nothing , userMatrikelnummer = Nothing
, userEmail = "jost@tcs.ifi.lmu.de" , userEmail = "jost@tcs.ifi.lmu.de"
, userDisplayName = "Steffen Jost" , userDisplayName = "Steffen Jost"
, userMaxFavourites = 14
} }
void . insert $ Term void . insert $ Term
{ termName = summer2017 { termName = summer2017
@ -91,6 +95,9 @@ main = db $ do
, courseHasRegistration = True , courseHasRegistration = True
, courseRegisterFrom = Just now , courseRegisterFrom = Just now
, courseRegisterTo = Just ((3600 * 24 * 60) `addUTCTime` now ) , courseRegisterTo = Just ((3600 * 24 * 60) `addUTCTime` now )
, courseDeregisterUntil = Nothing
, courseRegisterSecret = Nothing
, courseMaterialFree = True
} }
insert_ $ CourseEdit jost now ffp insert_ $ CourseEdit jost now ffp
void . insert $ DegreeCourse ffp sdBsc sdInf void . insert $ DegreeCourse ffp sdBsc sdInf
@ -112,6 +119,9 @@ main = db $ do
, courseHasRegistration = False , courseHasRegistration = False
, courseRegisterFrom = Nothing , courseRegisterFrom = Nothing
, courseRegisterTo = Nothing , courseRegisterTo = Nothing
, courseDeregisterUntil = Nothing
, courseRegisterSecret = Nothing
, courseMaterialFree = True
} }
insert_ $ CourseEdit fhamann now eip insert_ $ CourseEdit fhamann now eip
void . insert $ DegreeCourse eip sdBsc sdInf void . insert $ DegreeCourse eip sdBsc sdInf
@ -128,6 +138,9 @@ main = db $ do
, courseHasRegistration = True , courseHasRegistration = True
, courseRegisterFrom = Just now , courseRegisterFrom = Just now
, courseRegisterTo = Just ((3600 * 24 * 60) `addUTCTime` now ) , courseRegisterTo = Just ((3600 * 24 * 60) `addUTCTime` now )
, courseDeregisterUntil = Nothing
, courseRegisterSecret = Nothing
, courseMaterialFree = True
} }
insert_ $ CourseEdit fhamann now ixd insert_ $ CourseEdit fhamann now ixd
void . insert $ DegreeCourse ixd sdBsc sdInf void . insert $ DegreeCourse ixd sdBsc sdInf
@ -144,6 +157,9 @@ main = db $ do
, courseHasRegistration = False , courseHasRegistration = False
, courseRegisterFrom = Nothing , courseRegisterFrom = Nothing
, courseRegisterTo = Nothing , courseRegisterTo = Nothing
, courseDeregisterUntil = Nothing
, courseRegisterSecret = Nothing
, courseMaterialFree = True
} }
insert_ $ CourseEdit fhamann now ux3 insert_ $ CourseEdit fhamann now ux3
void . insert $ DegreeCourse ux3 sdBsc sdInf void . insert $ DegreeCourse ux3 sdBsc sdInf
@ -160,6 +176,9 @@ main = db $ do
, courseHasRegistration = False , courseHasRegistration = False
, courseRegisterFrom = Nothing , courseRegisterFrom = Nothing
, courseRegisterTo = Nothing , courseRegisterTo = Nothing
, courseDeregisterUntil = Nothing
, courseRegisterSecret = Nothing
, courseMaterialFree = True
} }
insert_ $ CourseEdit jost now pmo insert_ $ CourseEdit jost now pmo
void . insert $ DegreeCourse pmo sdBsc sdInf void . insert $ DegreeCourse pmo sdBsc sdInf
@ -176,6 +195,9 @@ main = db $ do
, courseHasRegistration = False , courseHasRegistration = False
, courseRegisterFrom = Nothing , courseRegisterFrom = Nothing
, courseRegisterTo = Nothing , courseRegisterTo = Nothing
, courseDeregisterUntil = Nothing
, courseRegisterSecret = Nothing
, courseMaterialFree = True
} }
insert_ $ CourseEdit gkleen now dbs insert_ $ CourseEdit gkleen now dbs
void . insert $ DegreeCourse dbs sdBsc sdInf void . insert $ DegreeCourse dbs sdBsc sdInf

11
models
View File

@ -58,10 +58,13 @@ Course
termId TermId termId TermId
schoolId SchoolId schoolId SchoolId
capacity Int Maybe capacity Int Maybe
hasRegistration Bool -- canRegisterNow = hasRegistration && maybe False (<= currentTime) registerFrom && maybe True (>= currentTime) registerTo hasRegistration Bool -- canRegisterNow = hasRegistration && maybe False (<= currentTime) registerFrom && maybe True (>= currentTime) registerTo
registerFrom UTCTime Maybe registerFrom UTCTime Maybe
registerTo UTCTime Maybe registerTo UTCTime Maybe
CourseTermShort termId shorthand deregisterUntil UTCTime Maybe
registerSecret Text Maybe -- Falls ein Passwort erforderlich ist
materialFree Bool default=true
CourseTermShort termId shorthand
CourseEdit CourseEdit
user UserId user UserId
time UTCTime time UTCTime

1
run.sh Symbolic link
View File

@ -0,0 +1 @@
start.sh

View File

@ -47,6 +47,8 @@ import qualified Data.Text.Encoding as Text
import Data.Conduit (($$)) import Data.Conduit (($$))
import Data.Conduit.List (sourceList) import Data.Conduit.List (sourceList)
import qualified Database.Esqueleto as E
import Control.Monad.Except (MonadError(..), runExceptT) import Control.Monad.Except (MonadError(..), runExceptT)
import Control.Monad.Trans.Maybe (MaybeT(..)) import Control.Monad.Trans.Maybe (MaybeT(..))
@ -153,16 +155,17 @@ instance Yesod UniWorX where
case route of case route of
CourseR tid csh _ | "updateFavourite" `elem` attrs -> do CourseR tid csh _ | "updateFavourite" `elem` attrs -> do
uid <- MaybeT maybeAuthId uid <- MaybeT maybeAuthId
$(logDebug) "Favourites save"
now <- liftIO $ getCurrentTime now <- liftIO $ getCurrentTime
void . lift . runDB . runMaybeT $ do void . lift . runDB . runMaybeT $ do
cid <- MaybeT . getKeyBy $ CourseTermShort tid csh cid <- MaybeT . getKeyBy $ CourseTermShort tid csh
user <- MaybeT $ get uid user <- MaybeT $ get uid
-- update Favorites -- update Favourites
lift $ upsertBy lift $ upsertBy
(UniqueCourseFavourite uid cid) (UniqueCourseFavourite uid cid)
(CourseFavourite uid now cid) (CourseFavourite uid now cid)
[CourseFavouriteTime =. now] [CourseFavouriteTime =. now]
-- prune Favorites to user-defined size -- prune Favourites to user-defined size
oldFavs <- lift $ selectKeysList oldFavs <- lift $ selectKeysList
[ CourseFavouriteUser ==. uid] [ CourseFavouriteUser ==. uid]
[ Desc CourseFavouriteTime [ Desc CourseFavouriteTime
@ -340,7 +343,7 @@ instance YesodBreadcrumbs UniWorX where
breadcrumb SubmissionListR = return ("Abgaben", Just HomeR) breadcrumb SubmissionListR = return ("Abgaben", Just HomeR)
breadcrumb (SubmissionR _) = return ("Abgabe", Just SubmissionListR) breadcrumb (SubmissionR _) = return ("Abgabe", Just SubmissionListR)
breadcrumb HomeR = return ("ReWorX", Nothing) breadcrumb HomeR = return ("UniworkY", Nothing)
breadcrumb (AuthR _) = return ("Login", Just HomeR) breadcrumb (AuthR _) = return ("Login", Just HomeR)
breadcrumb ProfileR = return ("Profile", Just HomeR) breadcrumb ProfileR = return ("Profile", Just HomeR)
breadcrumb _ = return ("home", Nothing) breadcrumb _ = return ("home", Nothing)
@ -404,7 +407,7 @@ defaultLinkLayout = defaultMenuLayout . (defaultLinks ++)
defaultMenuLayout :: [MenuTypes] -> Widget -> Handler Html defaultMenuLayout :: [MenuTypes] -> Widget -> Handler Html
defaultMenuLayout menu widget = do defaultMenuLayout menu widget = do
master <- getYesod master <- getYesod
mmsgs <- getMessages mmsgs <- getMessages
mcurrentRoute <- getCurrentRoute mcurrentRoute <- getCurrentRoute
@ -413,6 +416,17 @@ defaultMenuLayout menu widget = do
menuTypes <- filterM (menuItemAccessCallback . menuItem) menu menuTypes <- filterM (menuItemAccessCallback . menuItem) menu
-- Lookup Favourites if possible
favourites <- do
muid <- maybeAuthId
case muid of
Nothing -> return []
(Just uid) -> runDB . E.select . E.from $ \(course `E.InnerJoin` courseFavourite) -> do
E.on (course E.^. CourseId E.==. courseFavourite E.^. CourseFavouriteCourse)
E.where_ (courseFavourite E.^. CourseFavouriteUser E.==. E.val uid)
E.orderBy [ E.asc $ course E.^. CourseShorthand ]
return course
-- We break up the default layout into two components: -- We break up the default layout into two components:
-- default-layout is the contents of the body tag, and -- default-layout is the contents of the body tag, and
-- default-layout-wrapper is the entire page. Since the final -- default-layout-wrapper is the entire page. Since the final

View File

@ -189,6 +189,9 @@ courseEditHandler course = do
, courseHasRegistration = cfHasReg res , courseHasRegistration = cfHasReg res
, courseRegisterFrom = cfRegFrom res , courseRegisterFrom = cfRegFrom res
, courseRegisterTo = cfRegTo res , courseRegisterTo = cfRegTo res
, courseDeregisterUntil = Nothing -- TODO
, courseRegisterSecret = Nothing -- TODO
, courseMaterialFree = True -- TODO
} }
case insertOkay of case insertOkay of
(Just cid) -> do (Just cid) -> do
@ -232,16 +235,19 @@ courseEditHandler course = do
-- , CourseChanged =. now -- , CourseChanged =. now
-- ] -- ]
_updOkay <- replace cid ( -- TODO replaceUnique requires Eq?! _updOkay <- replace cid ( -- TODO replaceUnique requires Eq?!
Course { courseName = cfName res Course { courseName = cfName res
, courseDescription = cfDesc res , courseDescription = cfDesc res
, courseLinkExternal = cfLink res , courseLinkExternal = cfLink res
, courseShorthand = cfShort res , courseShorthand = cfShort res
, courseTermId = cfTerm res , courseTermId = cfTerm res
, courseSchoolId = cfSchool res , courseSchoolId = cfSchool res
, courseCapacity = cfCapacity res , courseCapacity = cfCapacity res
, courseHasRegistration = cfHasReg res , courseHasRegistration = cfHasReg res
, courseRegisterFrom = cfRegFrom res , courseRegisterFrom = cfRegFrom res
, courseRegisterTo = cfRegTo res , courseRegisterTo = cfRegTo res
, courseDeregisterUntil = Nothing -- TODO
, courseRegisterSecret = Nothing -- TODO
, courseMaterialFree = True -- TODO
} }
) )
insert_ $ CourseEdit aid now cid insert_ $ CourseEdit aid now cid

View File

@ -43,7 +43,7 @@ getHomeR :: Handler Html
getHomeR = do getHomeR = do
(btnWdgt, btnEnctype) <- generateFormPost (buttonForm :: Form CreateButton) (btnWdgt, btnEnctype) <- generateFormPost (buttonForm :: Form CreateButton)
defaultLayout $ do defaultLayout $ do
setTitle "Willkommen zum ReWorX Test!" setTitle "Willkommen zum UniworkY Test!"
$(widgetFile "home") $(widgetFile "home")

View File

@ -1,5 +1,5 @@
<div .container> <div .container>
<h1>ReWorX - Demo <h1>UniworkY - Demo
<h3> <h3>
Testumgebung für die Re-Implementierung von <a href="https://uniworx.ifi.lmu.de/">UniWorX</a> Testumgebung für die Re-Implementierung von <a href="https://uniworx.ifi.lmu.de/">UniWorX</a>
<p> <p>

View File

@ -17,6 +17,12 @@ $newline never
<h3 .asidenav__box-title> <h3 .asidenav__box-title>
WiSe 17/18 WiSe 17/18
<ul .asidenav__list> <ul .asidenav__list>
$forall (Entity _ Course{..}) <- favourites
<li .asidenav__list-item>
<a .asidenav__link-wrapper href=@{CourseR courseTermId courseShorthand CourseShowR}>
<div .asidenav__link-triple>#{courseShorthand}
<div .asidenav__link-label>#{courseName}
<li .asidenav__list-item> <li .asidenav__list-item>
<a .asidenav__link-wrapper href="/course/S2018/ixd/show"> <a .asidenav__link-wrapper href="/course/S2018/ixd/show">
<div .asidenav__link-triple>IXD <div .asidenav__link-triple>IXD