annotate gcalendarwatch.py @ 43:b5d3d9a8c83d

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