Skip to content

Commit c97cad2

Browse files
committed
fix sessions
1 parent fbe17ba commit c97cad2

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

telemetry/management/commands/maintenance.py

+41
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import logging
33

44
from django.core.management.base import BaseCommand
5+
from django.db.models import Prefetch, Q
56

67
from telemetry.influx import Influx
78
from telemetry.models import FastLap, Lap, Session
@@ -71,6 +72,12 @@ def add_arguments(self, parser):
7172
action="store_true",
7273
)
7374

75+
parser.add_argument(
76+
"--fix-session-car-track",
77+
help="fix sessions missing car or track by using data from first lap",
78+
action="store_true",
79+
)
80+
7481
def handle(self, *args, **options):
7582
if options["delete_influx"]:
7683
self.influx = Influx()
@@ -87,6 +94,8 @@ def handle(self, *args, **options):
8794
self.dump_session()
8895
elif options["fix_cars"]:
8996
self.fix_cars()
97+
elif options["fix_session_car_track"]:
98+
self.fix_session_car_track()
9099

91100
def fix_cars(self):
92101
from django.db.models import Count
@@ -133,6 +142,38 @@ def fix_cars(self):
133142
# else:
134143
# print("\nNo cars without associated sessions found.")
135144

145+
def fix_session_car_track(self):
146+
"""
147+
Find sessions missing car or track and set them from the first lap's data.
148+
Process in batches to handle large numbers of sessions efficiently.
149+
"""
150+
151+
batch_size = 1000
152+
sessions = Session.objects.filter(Q(car__isnull=True) | Q(track__isnull=True)).prefetch_related(Prefetch("laps", queryset=Lap.objects.order_by("number")))
153+
154+
total = sessions.count()
155+
print(f"Found {total} sessions with missing car or track")
156+
157+
processed = 0
158+
for session in sessions.iterator(chunk_size=batch_size):
159+
first_lap = session.laps.first()
160+
if first_lap:
161+
updated = False
162+
if not session.car and first_lap.car:
163+
session.car = first_lap.car
164+
updated = True
165+
if not session.track and first_lap.track:
166+
session.track = first_lap.track
167+
updated = True
168+
169+
if updated:
170+
session.save()
171+
processed += 1
172+
if processed % 100 == 0:
173+
print(f"Processed {processed}/{total} sessions")
174+
175+
print(f"Updated {processed} sessions with car/track data from their laps")
176+
136177
def dump_session(self):
137178
# TODO: Revisit this method. The Telemetry model is not defined.
138179
# Uncomment and fix the code below once the Telemetry model is available.

telemetry/pitcrew/session_saver.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ def save_sessions(self):
8585
session_id=session.session_id,
8686
session_type=session.session_type,
8787
game=session.game,
88+
car=session.car,
89+
track=session.track,
8890
defaults={"start": session.start, "end": session.end},
8991
)
9092
logging.debug(f"{session.session_id}: Saving session {session_id}")
@@ -113,9 +115,7 @@ def save_sessions(self):
113115
# continue
114116

115117
try:
116-
lap_record, created = session.record.laps.get_or_create(
117-
number=lap.number, car=session.car, track=track
118-
)
118+
lap_record, created = session.record.laps.get_or_create(number=lap.number, car=session.car, track=track)
119119
if created:
120120
logging.info(f"{session.session_id}: Created lap {lap_record}")
121121
else:
@@ -143,10 +143,7 @@ def save_sessions(self):
143143
if lap_length > track.length:
144144
track.refresh_from_db()
145145
if lap_length > track.length:
146-
logging.info(
147-
f"{session.session_id}: updating {track.name} "
148-
+ f"length from {track.length} to {lap_length}"
149-
)
146+
logging.info(f"{session.session_id}: updating {track.name} " + f"length from {track.length} to {lap_length}")
150147
track.length = lap_length
151148
track.save()
152149

0 commit comments

Comments
 (0)