Добавио интервал выходных

This commit is contained in:
2025-12-01 17:14:52 +03:00
parent 300927c7ea
commit ad479a2069

View File

@@ -149,12 +149,21 @@ class PointsAveragingAPIView(LoginRequiredMixin, View):
"""
Get interval key for a timestamp.
Day: 08:00 - 19:00 -> "YYYY-MM-DD_day"
Night: 19:00 - 08:00 -> "YYYY-MM-DD_night" (date of the start of night)
Weekend: Friday 19:00 - Monday 08:00 -> "YYYY-MM-DD_weekend" (date of Friday)
Day (weekdays): 08:00 - 19:00 -> "YYYY-MM-DD_day"
Night (weekdays): 19:00 - 08:00 -> "YYYY-MM-DD_night" (date of the start of night)
"""
hour = timestamp.hour
date = timestamp.date()
weekday = date.weekday() # 0=Monday, 4=Friday, 5=Saturday, 6=Sunday
# Check if timestamp falls into weekend interval (Fri 19:00 - Mon 08:00)
if self._is_weekend_interval(date, hour, weekday):
# Find the Friday date for this weekend
friday_date = self._get_friday_for_weekend(date, hour, weekday)
return f"{friday_date.strftime('%Y-%m-%d')}_weekend"
# Weekday intervals
if 8 <= hour < 19:
# Day interval
return f"{date.strftime('%Y-%m-%d')}_day"
@@ -166,6 +175,39 @@ class PointsAveragingAPIView(LoginRequiredMixin, View):
prev_date = date - timedelta(days=1)
return f"{prev_date.strftime('%Y-%m-%d')}_night"
def _is_weekend_interval(self, date, hour, weekday):
"""
Check if the given timestamp falls into weekend interval.
Weekend: Friday 19:00 - Monday 08:00
"""
# Friday after 19:00
if weekday == 4 and hour >= 19:
return True
# Saturday (all day)
if weekday == 5:
return True
# Sunday (all day)
if weekday == 6:
return True
# Monday before 08:00
if weekday == 0 and hour < 8:
return True
return False
def _get_friday_for_weekend(self, date, hour, weekday):
"""
Get the Friday date for the weekend interval that contains this timestamp.
"""
if weekday == 4: # Friday
return date
elif weekday == 5: # Saturday
return date - timedelta(days=1)
elif weekday == 6: # Sunday
return date - timedelta(days=2)
elif weekday == 0 and hour < 8: # Monday before 08:00
return date - timedelta(days=3)
return date
def _process_group(self, group_key, points):
"""
Process a group of points: calculate average and check for outliers.
@@ -184,6 +226,10 @@ class PointsAveragingAPIView(LoginRequiredMixin, View):
if interval_type == 'day':
interval_label = f"{interval_date.strftime('%d.%m.%Y')} День (08:00-19:00)"
elif interval_type == 'weekend':
# Weekend starts Friday 19:00, ends Monday 08:00
monday_date = interval_date + timedelta(days=3)
interval_label = f"{interval_date.strftime('%d.%m.%Y')} Выходные (Пт 19:00 - Пн 08:00, {monday_date.strftime('%d.%m.%Y')})"
else:
interval_label = f"{interval_date.strftime('%d.%m.%Y')} Ночь (19:00-08:00)"