-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathget_fitness_snapshot.py
More file actions
83 lines (69 loc) · 2.86 KB
/
get_fitness_snapshot.py
File metadata and controls
83 lines (69 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import zoneinfo
import requests
from django.conf import settings
from django.core.management.base import BaseCommand
from django.db.models import Q
from django.utils.dateparse import parse_datetime
from django.utils.timezone import make_aware
from penndata.models import FitnessRoom, FitnessSnapshot
def cap_string(s):
return " ".join([word[0].upper() + word[1:] for word in s.split()])
def get_usages():
try:
resp = requests.get(
"https://goboardapi.azurewebsites.net/api/FacilityCount/GetCountsByAccount",
params={"AccountAPIKey": settings.FITNESS_TOKEN},
)
data = resp.json()
except ConnectionError:
return None
except requests.exceptions.JSONDecodeError:
return None
def location_aware_datetime(time_str):
date = parse_datetime(time_str)
timezone = zoneinfo.ZoneInfo("America/New_York")
return make_aware(date, timezone=timezone)
usages = {
location["LocationName"]: {
"count": location["LastCount"],
"capacity": location["TotalCapacity"],
"last_updated": location_aware_datetime(location["LastUpdatedDateAndTime"]),
}
for location in data
}
return usages
class Command(BaseCommand):
help = "Captures a new Fitness Snapshot for every Fitness room."
def handle(self, *args, **kwargs):
# Don't update locations for which we already have a room with a matching last_updated date.
# Fixed the O(n^2) issue by loading everything into memory. Should be fine since there's
# not many rooms, and 1 snapshot returned per room
all_rooms = FitnessRoom.objects.all()
all_room_names = set(room.name for room in all_rooms)
query = Q()
for room_name, room_usage in get_usages().items():
query |= Q(room__name=room_name, date=room_usage["last_updated"])
existing_snapshots = FitnessSnapshot.objects.filter(query)
existing_room_date_pairs = set(
(snapshot.room.name, snapshot.date) for snapshot in existing_snapshots
)
def exists(record):
(name, usage) = record
if name not in all_room_names:
return False
if (name, usage["last_updated"]) in existing_room_date_pairs:
return False
return True
usage_by_location = filter(exists, get_usages().items())
FitnessSnapshot.objects.bulk_create(
[
FitnessSnapshot(
room=FitnessRoom.objects.get_or_create(name=room_name)[0],
date=room_usage["last_updated"],
count=room_usage["count"],
capacity=room_usage["capacity"],
)
for (room_name, room_usage) in usage_by_location
]
)
self.stdout.write("Captured fitness snapshots!")