Добавио интервал выходных
This commit is contained in:
@@ -149,12 +149,21 @@ class PointsAveragingAPIView(LoginRequiredMixin, View):
|
|||||||
"""
|
"""
|
||||||
Get interval key for a timestamp.
|
Get interval key for a timestamp.
|
||||||
|
|
||||||
Day: 08:00 - 19:00 -> "YYYY-MM-DD_day"
|
Weekend: Friday 19:00 - Monday 08:00 -> "YYYY-MM-DD_weekend" (date of Friday)
|
||||||
Night: 19:00 - 08:00 -> "YYYY-MM-DD_night" (date of the start of night)
|
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
|
hour = timestamp.hour
|
||||||
date = timestamp.date()
|
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:
|
if 8 <= hour < 19:
|
||||||
# Day interval
|
# Day interval
|
||||||
return f"{date.strftime('%Y-%m-%d')}_day"
|
return f"{date.strftime('%Y-%m-%d')}_day"
|
||||||
@@ -166,6 +175,39 @@ class PointsAveragingAPIView(LoginRequiredMixin, View):
|
|||||||
prev_date = date - timedelta(days=1)
|
prev_date = date - timedelta(days=1)
|
||||||
return f"{prev_date.strftime('%Y-%m-%d')}_night"
|
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):
|
def _process_group(self, group_key, points):
|
||||||
"""
|
"""
|
||||||
Process a group of points: calculate average and check for outliers.
|
Process a group of points: calculate average and check for outliers.
|
||||||
@@ -184,6 +226,10 @@ class PointsAveragingAPIView(LoginRequiredMixin, View):
|
|||||||
|
|
||||||
if interval_type == 'day':
|
if interval_type == 'day':
|
||||||
interval_label = f"{interval_date.strftime('%d.%m.%Y')} День (08:00-19:00)"
|
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:
|
else:
|
||||||
interval_label = f"{interval_date.strftime('%d.%m.%Y')} Ночь (19:00-08:00)"
|
interval_label = f"{interval_date.strftime('%d.%m.%Y')} Ночь (19:00-08:00)"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user