Mercurial > code > home > repos > gcalendarwatch
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 |
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 |
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 | 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 | 195 |
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 | 224 s, e = dayRange(60) |
225 sync.updateGraphs(read.getEvents(s, e)) | |
1 | 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() |