chore(terms): fix add term help message and allow alternative TermId Format

This commit is contained in:
Steffen Jost 2021-11-26 15:57:15 +01:00
parent 4846547f48
commit 1c5dc74edf
4 changed files with 40 additions and 15 deletions

View File

@ -12,7 +12,7 @@ TermEdited tid@TermId: Semester #{tid} erfolgreich editiert.
TermNewTitle: Semester editieren/anlegen. TermNewTitle: Semester editieren/anlegen.
InvalidInput: Eingaben bitte korrigieren. InvalidInput: Eingaben bitte korrigieren.
Term !ident-ok: Semester Term !ident-ok: Semester
TermPlaceholder: W/S + vierstellige Jahreszahl TermPlaceholder: JJJJ-MM-TT (Erster Tag einer Schulung)
TermStartDay: Erster Tag TermStartDay: Erster Tag
TermStartDayTooltip: Üblicherweise immer 1. April oder 1. Oktober TermStartDayTooltip: Üblicherweise immer 1. April oder 1. Oktober
TermEndDay: Letzter Tag TermEndDay: Letzter Tag

View File

@ -12,7 +12,7 @@ TermEdited tid: Successfully edited semester #{tid}
TermNewTitle: Edit/create semester TermNewTitle: Edit/create semester
InvalidInput: Invalid input InvalidInput: Invalid input
Term: Semester Term: Semester
TermPlaceholder: (W|S)<four digit year> TermPlaceholder: YYYY-MM-DD (First day of courses)
TermStartDay: Starting day TermStartDay: Starting day
TermStartDayTooltip: Usually 1st of April or 1st of October TermStartDayTooltip: Usually 1st of April or 1st of October
TermEndDay: Last day TermEndDay: Last day

View File

@ -12,11 +12,14 @@ module Model.Types.DateTime
import Import.NoModel import Import.NoModel
import qualified Data.Text as Text import qualified Data.Text as Text
import Data.Either.Combinators (maybeToRight) import Data.Either.Combinators (maybeToRight, mapLeft)
import Data.Time.Calendar.WeekDate import Data.Time.Calendar.WeekDate
import Data.Time.Format.ISO8601 import Data.Time.Format.ISO8601
import qualified Text.Parsec as Parse (choice, parse, string, try)
import qualified Text.ParserCombinators.Parsec.Number as ParseNum (nat)
import Database.Persist.Sql import Database.Persist.Sql
import Web.HttpApiData import Web.HttpApiData
@ -61,29 +64,51 @@ shortened = iso shorten expand
, year < $currentYear + 50 = year `mod` 100 , year < $currentYear + 50 = year `mod` 100
| otherwise = year | otherwise = year
-- Option 1: date in iso8601 -- Also see
-- Handler.Utils.Widget.tidFromText
-- MsgTermPlaceHolder
termToText :: TermIdentifier -> Text termToText :: TermIdentifier -> Text
termToText = Text.pack . iso8601Show termToText = termToText1
-- also see Hander.Utils.tidFromText
termFromText :: Text -> Either Text TermIdentifier termFromText :: Text -> Either Text TermIdentifier
termFromText t = maybeToRight errm $ iso8601ParseM $ Text.unpack t termFromText t = termFromText1 t <> termFromText2 t
-- Option 1: date in iso8601, i.e. YYYY-MM-DD
termToText1 :: TermIdentifier -> Text
termToText1 = Text.pack . iso8601Show
termFromText1 :: Text -> Either Text TermIdentifier
termFromText1 t = maybeToRight errm $ iso8601ParseM $ Text.unpack t
where where
errm = "Invalid TermIdentifier: “" <> t <> "" errm = "Invalid TermIdentifier: “" <> t <> ""
-- Option 2: show as WeekNr-DayOfWeek-Year, e.g. 22Mon2021? -- Option 2: show as WeekNr-DayOfWeek-Year, e.g. 22Mon2021?
termToText' :: TermIdentifier -> Text termToText2 :: TermIdentifier -> Text
termToText' TermIdentifier{..} = Text.pack $ show weeknr ++ wd ++ show year termToText2 TermIdentifier{..} = Text.pack $ show weeknr ++ wd ++ show year
where where
wd = take 3 $ show $ dayOfWeek getTermDay wd = take 3 $ show $ dayOfWeek getTermDay
(year,weeknr,_wd_) = toWeekDate getTermDay (year,weeknr,_wd_) = toWeekDate getTermDay
{- TODO termFromText2 :: Text -> Either Text TermIdentifier
termFromText' :: Text -> Either Text TermIdentifier termFromText2 t = mapLeft (const errm) parseTerm
termFromText' t = error "not implemented"
where where
errm = "Invalid TermIdentifier: “" <> t <> "" parseTerm = Parse.parse pWeekDate "termFromText2" $ Text.unpack t
-}
-- pWeekDate :: Parse.Parsec String () TermIdentifier
pWeekDate = do
wknr <- ParseNum.nat
dowk <- Parse.choice $ pDayOfWeek <$> (universe :: [DayOfWeek])
year <- ParseNum.nat
case fromWeekDateValid year wknr (fromEnum dowk) of
(Just d) -> return $ TermIdentifier d
Nothing -> fail "invalid weekdate"
-- pDayOfWeek :: DayOfWeek -> Parse.Parsec String () DayOfWeek
pDayOfWeek wd = do
void $ Parse.try $ Parse.string $ take 3 $ show wd
return wd
errm = "Invalid TermIdentifier: “" <> t <> ""
daysPerYear :: Rational daysPerYear :: Rational
daysPerYear = 365 + (97 % 400) daysPerYear = 365 + (97 % 400)

View File

@ -601,7 +601,7 @@ fillDb = do
secondDay = utctDay $ termTime tid TermDayLectureStart 1 Nothing toMidnight secondDay = utctDay $ termTime tid TermDayLectureStart 1 Nothing toMidnight
-- thirdDay = utctDay $ termTime tid TermDayLectureStart 2 Nothing toMidnight -- thirdDay = utctDay $ termTime tid TermDayLectureStart 2 Nothing toMidnight
capacity = Just 8 capacity = Just 8
mkName = CI.mk . (<> termToText' tid) . (<> "_") mkName = CI.mk . (<> termToText2 tid) . (<> "_")
if weekDay `elem` [Friday, Saturday, Sunday] if weekDay `elem` [Friday, Saturday, Sunday]
then return () then return ()
else do else do