feat: partial support for lsf import

Work on #686
This commit is contained in:
Gregor Kleen 2021-04-12 11:54:13 +02:00
parent 3a92a1c1f2
commit 37cdc775b5
5 changed files with 40 additions and 16 deletions

View File

@ -222,7 +222,7 @@ instance ToNamedRecord ExamUserTableCsv where
\pNumber pResult -> pure $ (csvExamPartHeader # pNumber) Csv..= pResult \pNumber pResult -> pure $ (csvExamPartHeader # pNumber) Csv..= pResult
instance FromNamedRecord ExamUserTableCsv where instance FromNamedRecord ExamUserTableCsv where
parseNamedRecord csv parseNamedRecord (lsfHeaderTranslate -> csv)
= ExamUserTableCsv = ExamUserTableCsv
<$> csv .:?? "surname" <$> csv .:?? "surname"
<*> csv .:?? "first-name" <*> csv .:?? "first-name"

View File

@ -88,7 +88,12 @@ decodeCsvPositional :: (MonadHandler m, HandlerSite m ~ UniWorX, MonadThrow m, F
decodeCsvPositional hdr = decodeCsv' $ \opts -> fromCsvStreamError opts hdr (review _haltingCsvParseError) .| throwIncrementalErrors decodeCsvPositional hdr = decodeCsv' $ \opts -> fromCsvStreamError opts hdr (review _haltingCsvParseError) .| throwIncrementalErrors
decodeCsv' :: (MonadHandler m, HandlerSite m ~ UniWorX, MonadThrow m) => (forall m'. Monad m' => DecodeOptions -> ConduitT ByteString (MaybeEmptyRecord csv) (ExceptT CsvParseError m') ()) -> ConduitT ByteString csv m () decodeCsv' :: forall csv m.
( MonadHandler m, HandlerSite m ~ UniWorX
, MonadThrow m
)
=> (forall m'. Monad m' => DecodeOptions -> ConduitT ByteString (MaybeEmptyRecord csv) (ExceptT CsvParseError m') ())
-> ConduitT ByteString csv m ()
decodeCsv' fromCsv' = do decodeCsv' fromCsv' = do
encOpts <- maybe def (userCsvOptions . entityVal) <$> lift maybeAuth encOpts <- maybe def (userCsvOptions . entityVal) <$> lift maybeAuth
recodeCsv encOpts False decodeCsv'' .| C.mapMaybe unMaybeEmptyRecord recodeCsv encOpts False decodeCsv'' .| C.mapMaybe unMaybeEmptyRecord

View File

@ -96,7 +96,7 @@ instance DefaultOrdered ExternalExamUserTableCsv where
headerOrder = Csv.genericHeaderOrder externalExamUserTableCsvOptions headerOrder = Csv.genericHeaderOrder externalExamUserTableCsvOptions
instance FromNamedRecord ExternalExamUserTableCsv where instance FromNamedRecord ExternalExamUserTableCsv where
parseNamedRecord csv parseNamedRecord (lsfHeaderTranslate -> csv)
= ExternalExamUserTableCsv = ExternalExamUserTableCsv
<$> csv .:?? "surname" <$> csv .:?? "surname"
<*> csv .:?? "first-name" <*> csv .:?? "first-name"

View File

@ -294,19 +294,21 @@ numberGrade = prism toNumberGrade fromNumberGrade
Grade13 -> 1.3 Grade13 -> 1.3
Grade10 -> 1.0 Grade10 -> 1.0
fromNumberGrade :: Rational -> Either Rational ExamGrade fromNumberGrade :: Rational -> Either Rational ExamGrade
fromNumberGrade = \case fromNumberGrade n
5.0 -> Right Grade50 | n >= 100 = fromNumberGrade $ n / 100
4.0 -> Right Grade40 | otherwise = case n of
3.7 -> Right Grade37 5.0 -> Right Grade50
3.3 -> Right Grade33 4.0 -> Right Grade40
3.0 -> Right Grade30 3.7 -> Right Grade37
2.7 -> Right Grade27 3.3 -> Right Grade33
2.3 -> Right Grade23 3.0 -> Right Grade30
2.0 -> Right Grade20 2.7 -> Right Grade27
1.7 -> Right Grade17 2.3 -> Right Grade23
1.3 -> Right Grade13 2.0 -> Right Grade20
1.0 -> Right Grade10 1.7 -> Right Grade17
n -> Left n 1.3 -> Right Grade13
1.0 -> Right Grade10
n' -> Left n'
instance PathPiece ExamGrade where instance PathPiece ExamGrade where
toPathPiece = toPathPiece . (fromRational :: Rational -> Deci) . review numberGrade toPathPiece = toPathPiece . (fromRational :: Rational -> Deci) . review numberGrade

View File

@ -5,6 +5,7 @@ module Utils.Csv
, typeXlsx, extensionXlsx , typeXlsx, extensionXlsx
, pathPieceCsv , pathPieceCsv
, (.:??) , (.:??)
, lsfHeaderTranslate
, CsvRendered(..) , CsvRendered(..)
, toCsvRendered , toCsvRendered
, toDefaultOrderedCsvRendered , toDefaultOrderedCsvRendered
@ -34,6 +35,10 @@ import Control.Lens
import Data.Default import Data.Default
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import qualified Data.CaseInsensitive as CI
deriving instance Typeable CsvParseError deriving instance Typeable CsvParseError
instance Exception CsvParseError instance Exception CsvParseError
@ -65,6 +70,18 @@ pathPieceCsv (conT -> t) =
m .:?? name = lookup m name <|> return Nothing m .:?? name = lookup m name <|> return Nothing
lsfHeaderTranslate :: NamedRecord -> NamedRecord
lsfHeaderTranslate = HashMap.fromList . over (traverse . _1) lsfHeaderTranslate' . HashMap.toList
where
lsfHeaderTranslate' k = case CI.mk . Text.strip <$> Text.decodeUtf8' k of
Right k'
| k' == "mtknr" -> "matriculation"
| k' == "nachname" -> "surname"
| k' == "vorname" -> "first-name"
| k' == "bewertung" -> "exam-result"
_other -> k
data CsvRendered = CsvRendered data CsvRendered = CsvRendered
{ csvRenderedHeader :: Header { csvRenderedHeader :: Header
, csvRenderedData :: [NamedRecord] , csvRenderedData :: [NamedRecord]