diff --git a/dbapp/mainapp/views/points_averaging.py b/dbapp/mainapp/views/points_averaging.py index e9266f9..bfea7a3 100644 --- a/dbapp/mainapp/views/points_averaging.py +++ b/dbapp/mainapp/views/points_averaging.py @@ -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)"