Mercurial > personal > weather-server
comparison weather_server/server.py @ 39:b77c8e7d2742
Use zoneinfo rather than pytz.
| author | Paul Fisher <paul@pfish.zone> |
|---|---|
| date | Tue, 01 Apr 2025 15:54:21 -0400 |
| parents | 7def5611895b |
| children | 1a69004d8e5a |
comparison
equal
deleted
inserted
replaced
| 38:d5a18ecebf47 | 39:b77c8e7d2742 |
|---|---|
| 3 import pathlib | 3 import pathlib |
| 4 import sys | 4 import sys |
| 5 | 5 |
| 6 import bson | 6 import bson |
| 7 import flask | 7 import flask |
| 8 import pytz | |
| 9 | 8 |
| 10 from . import common | 9 from . import common |
| 11 from . import locations | 10 from . import locations |
| 12 | 11 |
| 13 | 12 |
| 41 if not hmac.compare_digest(password, loc.password): | 40 if not hmac.compare_digest(password, loc.password): |
| 42 flask.abort(400) | 41 flask.abort(400) |
| 43 entries = tuple(reader) | 42 entries = tuple(reader) |
| 44 except (KeyError, bson.InvalidBSON): | 43 except (KeyError, bson.InvalidBSON): |
| 45 flask.abort(400) | 44 flask.abort(400) |
| 46 now = datetime.datetime.now(tz=pytz.UTC) | 45 now = datetime.datetime.now(tz=datetime.UTC) |
| 47 loc.record(entries, now) | 46 loc.record(entries, now) |
| 48 return flask.jsonify({'status': 'OK'}) | 47 return flask.jsonify({'status': 'OK'}) |
| 49 | 48 |
| 50 @app.route('/<location>') | 49 @app.route('/<location>') |
| 51 def show(location: str): | 50 def show(location: str): |
| 57 if last_reading: | 56 if last_reading: |
| 58 tz = loc.timezone() | 57 tz = loc.timezone() |
| 59 date = tz.normalize(last_reading.sample_time.astimezone(tz)) | 58 date = tz.normalize(last_reading.sample_time.astimezone(tz)) |
| 60 else: | 59 else: |
| 61 date = None | 60 date = None |
| 62 now = datetime.datetime.now(tz=pytz.UTC) | 61 now = datetime.datetime.now(tz=datetime.UTC) |
| 63 diff = (now - date) if date else None | 62 diff = (now - date) if date else None |
| 64 is_recent = diff and diff < datetime.timedelta(hours=12) | 63 is_recent = diff and diff < datetime.timedelta(hours=12) |
| 65 return flask.render_template( | 64 return flask.render_template( |
| 66 'location.html', | 65 'location.html', |
| 67 location=loc, | 66 location=loc, |
| 68 last_reading=last_reading, | 67 last_reading=last_reading, |
| 69 date=date, | 68 date=date, |
| 70 date_format=f'%H:%M' if is_recent else '%Y-%m-%d %H:%M') | 69 date_format='%H:%M' if is_recent else '%Y-%m-%d %H:%M') |
| 71 | 70 |
| 72 @app.route('/<location>/recent') | 71 @app.route('/<location>/recent') |
| 73 def recent(location: str): | 72 def recent(location: str): |
| 74 try: | 73 try: |
| 75 loc = locs.get(location) | 74 loc = locs.get(location) |
