Добавио интервал выходных
This commit is contained in:
@@ -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)"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user