annotate gcalendarwatch.py @ 39:119f0cb719eb

too loud
author drewp@bigasterisk.com
date Sun, 12 Nov 2023 23:31:03 -0800
parents 2da773e48a57
children 7d9609edcf9c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
1 """
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
2 sync google calendar into mongodb, return queries from that as
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
3 JSON-LD.
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
4
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
5 gcalendarwatch.conf looks like this:
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
6 {
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
7 "minutes_between_polls" : 60
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
8 "mongo" : {"host" : "h1", "port" : 27017, "database" : "dbname", "collection" : "pim"},
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
9 }
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
10
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
11 This should be updated to use
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
12 http://googledevelopers.blogspot.com/2013/07/google-calendar-api-push-notifications.html
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
13 and update faster with less polling
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
14 """
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
15 import datetime
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
16 import functools
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
17 import json
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
18 import logging
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
19 import re
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
20 import time
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
21 import traceback
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
22 from typing import Any, Dict, Iterable, Optional, cast
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
23
29
32fd3bd77ff2 use published background_loop upgrade
drewp@bigasterisk.com
parents: 28
diff changeset
24 import background_loop
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
25 from dateutil.tz import tzlocal
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
26 from patchablegraph import PatchableGraph
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
27 from patchablegraph.handler import GraphEvents, StaticGraph
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
28 from pymongo import MongoClient
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
29 from rdflib import RDF, Graph, Namespace, URIRef
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
30 from starlette.applications import Starlette
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
31 from starlette.requests import Request
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
32 from starlette.responses import (HTMLResponse, JSONResponse, PlainTextResponse, Response)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
33 from starlette.routing import Route
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
34 from starlette_exporter import PrometheusMiddleware, handle_metrics
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
35
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
36 from datetimemath import dayRange, parse
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
37 from graphconvert import asGraph
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
38 from ingest import SyncToMongo
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
39 from localtypes import Conf, Record
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
40
39
119f0cb719eb too loud
drewp@bigasterisk.com
parents: 37
diff changeset
41 logging.basicConfig(level=logging.INFO)
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
42 log = logging.getLogger()
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
43
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
44 EV = Namespace("http://bigasterisk.com/event#")
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
45 """
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
46 example:
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
47 {
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
48 'id': 'l640999999999999999999999c',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
49 'summary': 'sec.......',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
50 'start': {'timeZone': 'America/Los_Angeles', 'dateTime': '2014-09-25T16:00:00-07:00'},
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
51 'end': {'timeZone': 'America/Los_Angeles', 'dateTime': '2014-09-25T17:00:00-07:00'},
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
52 'endTimeUnspecified': True,
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
53 'created': '2014-09-08T20:39:00.000Z',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
54 'creator': {'self': True, 'displayName': '...', 'email': '...'},
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
55 'etag': '"2829999999999000"',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
56 'htmlLink': 'https://www.google.com/calendar/event?eid=bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbEBt',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
57 'iCalUID': 'l640998888888888888888888888888888com',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
58 'kind': 'calendar#event',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
59 'organizer': {'self': True, 'displayName': '...', 'email': '...'},
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
60 'reminders': {'useDefault': True},
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
61 'sequence': 0,
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
62 'status': 'confirmed',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
63 'updated': '2014-09-17T04:28:56.997Z',
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
64 }"""
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
65
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
66
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
67 def asJsonLd(events):
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
68 ret = {'@graph': []} # type: Dict[Any, Any]
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
69 for ev in events:
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
70 ev['startTime'] = ev['startTime'].astimezone(tzlocal()).isoformat()
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
71 ev['endTime'] = ev['endTime'].astimezone(tzlocal()).isoformat()
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
72 ev['@id'] = ev.pop('uri')
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
73 ret['@graph'].append(ev)
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
74
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
75 ret['@context'] = {
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
76 "xsd": "http://www.w3.org/2001/XMLSchema#",
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
77 "ev": "http://bigasterisk.com/event#",
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
78 "startTime": {
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
79 "@id": "ev:startTime",
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
80 "@type": "xsd:dateTime"
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
81 },
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
82 "endTime": {
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
83 "@id": "ev:endTime",
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
84 "@type": "xsd:dateTime"
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
85 },
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
86 "startDate": {
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
87 "@id": "ev:startDate",
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
88 "@type": "xsd:date"
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
89 },
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
90 "endDate": {
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
91 "@id": "ev:endDate",
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
92 "@type": "xsd:date"
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
93 },
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
94 "title": "ev:title",
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
95 "feed": {
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
96 "@id": "ev:feed",
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
97 "@type": "@id"
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
98 },
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
99 "htmlLink": {
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
100 "@id": "ev:htmlLink",
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
101 "@type": "@id"
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
102 },
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
103 }
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
104 return ret
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
105
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
106
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
107 def starred(graph: Graph, ev: URIRef) -> Optional[str]:
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
108 title = graph.value(ev, EV['title'])
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
109 m = re.search(r'(.*)\*\s*$', title)
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
110 if m:
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
111 return m.group(1)
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
112 else:
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
113 return None
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
114
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
115
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
116 class ReadMongoEvents(object):
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
117 """read events from mongodb"""
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
118
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
119 def __init__(self, collection):
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
120 self.collection = collection
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
121
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
122 def getEvents(self, t1: datetime.datetime, t2: datetime.datetime) -> Iterable[Record]:
21
9eb6b4806272 timmzone fixes, especially on GET /events
drewp@bigasterisk.com
parents: 20
diff changeset
123 if t1.tzinfo is None or t2.tzinfo is None:
9eb6b4806272 timmzone fixes, especially on GET /events
drewp@bigasterisk.com
parents: 20
diff changeset
124 raise TypeError("tz-naive datetimes")
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
125 for doc in self.collection.find({"startTime": {"$gte": t1, "$lt": t2}}).sort([("startTime", 1)]):
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
126 doc['uri'] = doc.pop('_id')
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
127 if 'feedId' in doc:
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
128 doc['feed'] = URIRef('old_event')
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
129 yield doc
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
130
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
131
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
132 def update(
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
133 # this is incompletely type-checked:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
134 sync: SyncToMongo, # curried by main
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
135 first_run: bool, # passed by background_loop
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
136 cal=None # sometimes passed by us
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
137 ) -> int:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
138 log.info(f"updating {cal or 'all'}")
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
139 try:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
140 n = sync.update(cal=cal)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
141 except Exception:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
142 traceback.print_exc()
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
143 log.error("update failed")
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
144 n = 0
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
145 return n
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
146
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
147
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
148 # who uses this? pimscreen, frontdoor? they should use the GraphEvents version
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
149 def EventsPage(read: ReadMongoEvents, req: Request) -> Response:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
150 t1, t2 = dayRange(int(req.query_params.get('days', default='2')))
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
151 if req.query_params.get('t1', default=None):
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
152 t1 = parse(req.query_params.get('t1', ''), tzinfo=tzlocal())
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
153 if req.query_params.get('t2', default=None):
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
154 t2 = parse(req.query_params.get('t2', ''), tzinfo=tzlocal())
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
155 log.info(f'get /events local t1={t1} t2={t2}')
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
156 return PlainTextResponse(media_type="text/n3", content=asGraph(read.getEvents(t1, t2)).serialize(format='n3'))
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
157
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
158
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
159 def Countdowns(countdownGraph, req: Request) -> Response:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
160 rows = []
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
161 graph = countdownGraph._graph
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
162 for ev in graph.subjects(RDF.type, EV['Event']):
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
163 starLabel = starred(graph, ev)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
164 if starLabel is not None:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
165 rows.append({'@type': 'countdown', 'time': graph.value(ev, EV['start']), 'label': starLabel})
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
166 return JSONResponse(media_type="application/ld+json",
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
167 content={
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
168 "@context": {
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
169 "countdown": "http://bigasterisk.com/countdown#CountdownEvent",
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
170 "label": "http://www.w3.org/2000/01/rdf-schema#label",
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
171 "time": {
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
172 "@id": "http://bigasterisk.com/event#time",
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
173 "@type": "xsd:dateTime"
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
174 },
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
175 "xsd": "http://www.w3.org/2001/XMLSchema#",
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
176 "rdfs": "http://www.w3.org/2000/01/rdf-schema#"
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
177 },
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
178 "@graph": rows,
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
179 })
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
180
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
181
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
182 def statusMsg(conf, loop: background_loop.Loop):
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
183 period = conf['minutes_between_polls'] * 60
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
184 ago = time.time() - loop.lastSuccessRun
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
185 if not loop.everSucceeded:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
186 msg = "no completed updates %d sec after startup" % ago
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
187 if ago > period * 1.1:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
188 raise ValueError(msg)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
189 else:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
190 msg = "last update was %d sec ago" % ago
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
191 if ago > period * 1.1:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
192 raise ValueError(msg)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
193 return msg
1
d77ead665ab2 whitespace
drewp@bigasterisk.com
parents: 0
diff changeset
194
d77ead665ab2 whitespace
drewp@bigasterisk.com
parents: 0
diff changeset
195
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
196 async def PollNow(loop: background_loop.Loop, req: Request) -> PlainTextResponse:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
197 body = await req.body()
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
198 cals = json.loads(body).get('cals', None) if body else [None]
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
199 n = 0
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
200 for cal in cals:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
201 n += await loop.runNow(cal=cal)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
202 msg = f"found {n} new records"
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
203 log.info(msg)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
204 return PlainTextResponse(msg)
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
205
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
206
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
207 def main():
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
208 agendaGraph = PatchableGraph() # next few days
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
209 countdownGraph = PatchableGraph() # next n of starred events
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
210 conf = cast(Conf, json.load(open("gcalendarwatch.conf")))
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
211 m = conf['mongo']
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
212 mongoOut = MongoClient(m['host'], m['port'], tz_aware=True)[m['database']][m['collection']]
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
213 sync = SyncToMongo(conf, mongoOut, agendaGraph, countdownGraph)
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
214 read = ReadMongoEvents(mongoOut)
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
215
4
fb02ad302f2f include more recent-past events
drewp@bigasterisk.com
parents: 3
diff changeset
216 s, e = dayRange(60)
fb02ad302f2f include more recent-past events
drewp@bigasterisk.com
parents: 3
diff changeset
217 sync.updateGraphs(read.getEvents(s, e))
1
d77ead665ab2 whitespace
drewp@bigasterisk.com
parents: 0
diff changeset
218
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
219 loop = background_loop.loop_forever(functools.partial(update, sync=sync), conf['minutes_between_polls'] * 60)
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
220
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
221 def getRoot(request: Request) -> HTMLResponse:
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
222 return HTMLResponse(content=open("index.html").read().replace("MSG", statusMsg(conf, loop)))
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
223
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
224 app = Starlette(debug=True,
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
225 routes=[
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
226 Route('/', getRoot),
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
227 Route('/graph/calendar/upcoming', StaticGraph(agendaGraph)),
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
228 Route('/graph/calendar/upcoming/events', GraphEvents(agendaGraph)),
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
229 Route('/graph/calendar/countdown', StaticGraph(countdownGraph)),
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
230 Route('/graph/calendar/countdown/events', GraphEvents(countdownGraph)),
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
231 Route('/countdowns.json', functools.partial(Countdowns, countdownGraph)),
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
232 Route('/events', functools.partial(EventsPage, read)),
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
233 Route('/pollNow', functools.partial(PollNow, loop), methods=['POST'])
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
234 ])
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
235
37
2da773e48a57 credential code update. needed to rm pickle and relogin
drewp@bigasterisk.com
parents: 29
diff changeset
236 app.add_middleware(PrometheusMiddleware, group_paths=True, filter_unhandled_paths=True, app_name='gcalendarwatch')
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
237 app.add_route("/metrics", handle_metrics)
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
238 return app
0
e40034f22c69 moved from pimscreen, upgrade to py3. Redo google auth.
drewp@bigasterisk.com
parents:
diff changeset
239
16
a87969972d85 lib updates, auth update and cleanup, reformat
drewp@bigasterisk.com
parents: 15
diff changeset
240
28
e2209226b001 rewrite with starlette and background_loop
drewp@bigasterisk.com
parents: 23
diff changeset
241 app = main()