91 lines
2.5 KiB
Nim
91 lines
2.5 KiB
Nim
import std/json, std/times
|
|
import notion_utils, timeutils
|
|
|
|
|
|
type
|
|
EventProposal* = object
|
|
name*: string
|
|
description*: string
|
|
purpose*: string
|
|
department*: string
|
|
owner*: string
|
|
location*: string
|
|
date*: DateTime
|
|
budgetInDollars*: int
|
|
|
|
MultiSelectOption = tuple[value: string, color: string]
|
|
|
|
EventProposalConfig* = object
|
|
departmentOptions*: seq[MultiSelectOption]
|
|
|
|
proc getOrFail(n: JsonNode, key: string): JsonNode =
|
|
## convenience method to get a key from a JObject or raise an exception
|
|
if not n.hasKey(key):
|
|
raise newException(ValueError, "missing key '" & key & "'")
|
|
|
|
return n[key]
|
|
|
|
proc parseIso8601(n: JsonNode, key: string): DateTime =
|
|
return parseIso8601(n.getOrFail(key).getStr)
|
|
|
|
proc parseEventProposal*(n: JsonNode): EventProposal {.raises: [JsonParsingError].} =
|
|
|
|
try:
|
|
result = EventProposal(
|
|
name: n.getOrFail("name").getStr,
|
|
description: n.getOrFail("description").getStr,
|
|
purpose: n.getOrFail("purpose").getStr,
|
|
department: n.getOrFail("department").getStr,
|
|
location: n.getOrFail("location").getStr,
|
|
owner: n.getOrFail("owner").getStr,
|
|
date: n.parseIso8601("date"),
|
|
budgetInDollars: n.getOrFail("budgetInDollars").getInt)
|
|
except:
|
|
raise newException(JsonParsingError, "Invalid EventProposal: " & getCurrentExceptionMsg())
|
|
|
|
proc asNotionPage*(ep: EventProposal): JsonNode =
|
|
result = %*{
|
|
"properties": {
|
|
"Event": makeTextProp("title", ep.name),
|
|
"Date": { "date": { "start": formatIso8601(ep.date) } },
|
|
"Department": { "multi_select": [ { "name": ep.department } ] },
|
|
"Location": makeTextProp("rich_text", ep.location),
|
|
"Owner": makeTextProp("rich_text", ep.owner),
|
|
"State": { "select": { "name": "Proposed" } },
|
|
"Visibility": { "select": { "name": "Public" } }
|
|
},
|
|
"children": [
|
|
{
|
|
"object": "block",
|
|
"type": "heading_2",
|
|
"heading_2": makeTextProp("text", "Purpose")
|
|
},
|
|
{
|
|
"object": "block",
|
|
"type": "paragraph",
|
|
"paragraph": makeTextProp("text", ep.purpose)
|
|
},
|
|
{
|
|
"object": "block",
|
|
"type": "heading_2",
|
|
"heading_2": makeTextProp("text", "Description")
|
|
},
|
|
{
|
|
"object": "block",
|
|
"type": "paragraph",
|
|
"paragraph": makeTextProp("text", ep.description)
|
|
}
|
|
]
|
|
}
|
|
|
|
proc `%`(mso: MultiSelectOption): JsonNode =
|
|
%*{
|
|
"value": mso.value,
|
|
"color": mso.color
|
|
}
|
|
|
|
proc `%`*(epc: EventProposalConfig): JsonNode =
|
|
%*{
|
|
"departments": epc.departmentOptions
|
|
}
|