@@ -19,22 +19,16 @@ straightforward.
19
19
20
20
module Database.Tables where
21
21
22
- import Control.Applicative ((<|>) )
23
- import Data.Aeson (FromJSON (parseJSON ), ToJSON (toJSON ), Value (.. ), genericToJSON , withObject ,
24
- (.!=) , (.:?) )
25
- import Data.Aeson.KeyMap (elems )
26
- import Data.Aeson.Types (Options (.. ), Parser , defaultOptions )
22
+ import Data.Aeson (FromJSON (parseJSON ), ToJSON (toJSON ), genericToJSON , withObject ,
23
+ (.!=) , (.:?) , (.:) )
24
+ import Data.Aeson.Types (Options (.. ), Parser , Value (Object ), Value , defaultOptions )
27
25
import Data.Char (toLower )
28
- import qualified Data.HashMap.Strict as HM
29
- import Data.Maybe (fromMaybe )
30
26
import qualified Data.Text as T
31
27
import Data.Time.Clock (UTCTime )
32
28
import Database.DataType
33
29
import Database.Persist.Sqlite (Key , SqlPersistM , entityVal , selectFirst , (==.) )
34
30
import Database.Persist.TH
35
31
import GHC.Generics
36
- import Text.Read (readMaybe )
37
- import WebParsing.ReqParser (parseReqs )
38
32
39
33
-- | A two-dimensional point.
40
34
type Point = (Double , Double )
@@ -221,27 +215,6 @@ instance ToJSON Location
221
215
-- not necessary otherwise.
222
216
instance FromJSON SvgJSON
223
217
224
- -- JSON encoding/decoding
225
- instance FromJSON Courses where
226
- parseJSON = withObject " Expected Object for Courses" $ \ o -> do
227
- newCode <- o .:? " code" .!= " CSC???"
228
- newTitle <- o .:? " courseTitle"
229
- newDescription <- o .:? " courseDescription"
230
- newPrereqString <- o .:? " prerequisite"
231
- let newPrereqs = fmap (T. pack . show . parseReqs . T. unpack) newPrereqString
232
- newExclusions <- o .:? " exclusion"
233
- newCoreqs <- o .:? " corequisite"
234
- return $ Courses newCode
235
- newTitle
236
- newDescription
237
- newPrereqs
238
- newExclusions
239
- Nothing -- breadth
240
- Nothing -- distribution
241
- Nothing -- (Just prereqString)
242
- newCoreqs
243
- []
244
-
245
218
instance ToJSON Meeting where
246
219
toJSON = genericToJSON defaultOptions {
247
220
fieldLabelModifier =
@@ -251,23 +224,16 @@ instance ToJSON Meeting where
251
224
252
225
instance FromJSON Meeting where
253
226
parseJSON = withObject " Expected Object for Lecture, Tutorial or Practical" $ \ o -> do
254
- teachingMethod :: T. Text <- o .:? " teachingMethod " .!= " "
227
+ teachingMethod :: T. Text <- o .:? " teachMethod " .!= " "
255
228
sectionNumber :: T. Text <- o .:? " sectionNumber" .!= " "
256
229
let sectionId = T. concat [teachingMethod, sectionNumber]
257
230
258
- capStr <- o .:? " enrollmentCapacity" .!= " -1"
259
- enrolStr <- o .:? " actualEnrolment" .!= " 0"
260
- waitStr <- o .:? " actualWaitlist" .!= " 0"
261
- let cap = fromMaybe (- 1 ) $ readMaybe capStr
262
- enrol = fromMaybe 0 $ readMaybe enrolStr
263
- wait = fromMaybe 0 $ readMaybe waitStr
264
- instrMap2 :: Value <- o .:? " instructors" .!= Null
265
- let instrList =
266
- case instrMap2 of
267
- Object obj -> elems obj
268
- _ -> []
269
-
231
+ cap <- o .:? " maxEnrolment" .!= (- 1 )
232
+ enrol <- o .:? " currentEnrolment" .!= 0
233
+ wait <- o .:? " currentWaitlist" .!= 0
234
+ instrList <- o .:? " instructors" .!= []
270
235
instrs <- mapM parseInstr instrList
236
+
271
237
let extra = 0
272
238
let instructor = T. intercalate " ; " $ filter (not . T. null ) instrs
273
239
if teachingMethod == " LEC" || teachingMethod == " TUT" || teachingMethod == " PRA"
@@ -278,19 +244,26 @@ instance FromJSON Meeting where
278
244
279
245
instance FromJSON Time' where
280
246
parseJSON = withObject " Expected Object for Times" $ \ o -> do
281
- meetingDayStr <- o .:? " meetingDay"
282
- meetingStartTimeStr <- o .:? " meetingStartTime"
283
- meetingEndTimeStr <- o .:? " meetingEndTime"
284
- meetingRoom1 <- o .:? " assignedRoom1" .!= Nothing
247
+ startObject <- o .: " start"
248
+ endObject <- o .: " end"
249
+ meetingDay :: Maybe Int <- startObject .:? " day" .!= Nothing
250
+ meetingStartTime :: Maybe Int <- startObject .:? " millisofday" .!= Nothing
251
+ meetingEndTime :: Maybe Int <- endObject .:? " millisofday" .!= Nothing
252
+
253
+ building <- o .: " building"
254
+ buildingCode <- building .: " buildingCode"
255
+ buildingRoomNumber <- building .: " buildingRoomNumber"
256
+ let meetingRoom1 = Just (T. concat [buildingCode, buildingRoomNumber])
285
257
meetingRoom2 <- o .:? " assignedRoom2" .!= Nothing
286
- let (meetingDay, meetingStartTime, meetingEndTime) = getTimeVals meetingDayStr meetingStartTimeStr meetingEndTimeStr
287
- return $ Time' meetingDay meetingStartTime meetingEndTime meetingRoom1 meetingRoom2
258
+
259
+ let (adjustedDay, adjustedStartTime, adjustedEndTime) = convertTimeVals meetingDay meetingStartTime meetingEndTime
260
+ return $ Time' adjustedDay adjustedStartTime adjustedEndTime meetingRoom1 meetingRoom2
288
261
289
262
instance FromJSON MeetTime where
290
263
parseJSON (Object o) = do
291
264
meeting <- parseJSON (Object o)
292
- timeMap :: HM. HashMap T. Text Time' <- o .:? " schedule " .!= HM. empty <|> return HM. empty
293
- return $ MeetTime meeting ( HM. elems timeMap)
265
+ timesList :: [ Time' ] <- o .:? " meetingTimes " .!= []
266
+ return $ MeetTime meeting timesList
294
267
parseJSON _ = fail " Invalid meeting"
295
268
296
269
-- | Helpers for parsing JSON
@@ -301,30 +274,36 @@ parseInstr (Object io) = do
301
274
return (T. concat [firstName, " . " , lastName])
302
275
parseInstr _ = return " "
303
276
304
- -- | Converts 24-hour time into a double
277
+ -- | Converts the miliseconds time into hourly time
305
278
-- | Assumes times are rounded to the nearest hour
306
- getHourVal :: String -> Double
307
- getHourVal time = (read $ take 2 time :: Double ) + (/) (read $ drop 3 time :: Double ) 60
308
-
309
- -- | Converts a weekday into a double
310
- -- | Monday to Friday becomes 0.0 to 4.0
311
- getDayVal :: String -> Double
312
- getDayVal " MO" = 0.0
313
- getDayVal " TU" = 1.0
314
- getDayVal " WE" = 2.0
315
- getDayVal " TH" = 3.0
316
- getDayVal " FR" = 4.0
317
- getDayVal _ = 4.0
279
+ getHourVal :: Int -> Double
280
+ getHourVal millis =
281
+ let
282
+ seconds = fromIntegral millis / 1000.0
283
+ minutes = seconds / 60
284
+ hours = minutes / 60
285
+ in
286
+ hours
287
+
288
+ -- | Converts a the given day into a double representation for the database
289
+ -- | Monday (1) to Friday (5) becomes 0.0 to 4.0
290
+ getDayVal :: Int -> Double
291
+ getDayVal 1 = 0.0
292
+ getDayVal 2 = 1.0
293
+ getDayVal 3 = 2.0
294
+ getDayVal 4 = 3.0
295
+ getDayVal 5 = 4.0
296
+ getDayVal _ = 4.0
318
297
319
298
-- | Convert the given day, start time and end time to a tuple of Doubles. If nothing is given,
320
299
-- the place holder is 5 and 25, indicating the day and times are invalid.
321
- getTimeVals :: Maybe String -> Maybe String -> Maybe String -> (Double , Double , Double )
322
- getTimeVals (Just day) (Just start) (Just end) = do
300
+ convertTimeVals :: Maybe Int -> Maybe Int -> Maybe Int -> (Double , Double , Double )
301
+ convertTimeVals (Just day) (Just start) (Just end) =
323
302
let dayDbl = getDayVal day
324
303
startDbl = getHourVal start
325
304
endDbl = getHourVal end
326
- (dayDbl, startDbl, endDbl)
327
- getTimeVals _ _ _ = (5.0 , 25.0 , 25.0 )
305
+ in (dayDbl, startDbl, endDbl)
306
+ convertTimeVals _ _ _ = (5.0 , 25.0 , 25.0 )
328
307
329
308
-- | Convert Times into Time
330
309
buildTime :: Times -> SqlPersistM Time
0 commit comments