Mercurial > code > home > repos > gcalendarwatch
annotate gcalendarwatch.py @ 36:cb990883e52f
deployment; dep updates
author | drewp@bigasterisk.com |
---|---|
date | Sun, 12 Nov 2023 23:19:23 -0800 |
parents | 32fd3bd77ff2 |
children | 2da773e48a57 |
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 | 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 |
28
e2209226b001
rewrite with starlette and background_loop
drewp@bigasterisk.com
parents:
23
diff
changeset
|
41 logging.basicConfig(level=logging.INFO) |
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 | 194 |
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 | 216 s, e = dayRange(60) |
217 sync.updateGraphs(read.getEvents(s, e)) | |
1 | 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 |
28
e2209226b001
rewrite with starlette and background_loop
drewp@bigasterisk.com
parents:
23
diff
changeset
|
236 app.add_middleware(PrometheusMiddleware, app_name='gcalendarwatch') |
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() |