This commit is contained in:
53
utils.py
53
utils.py
@@ -1,7 +1,8 @@
|
||||
import json
|
||||
import logging
|
||||
from jinja2 import Template
|
||||
from datetime import datetime
|
||||
from datetime import datetime, date, timedelta
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
# Настройка логирования
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -138,4 +139,52 @@ def get_dates(start_date, end_date):
|
||||
logger.error(f"Дата начала '{start_date}' не может быть позже даты окончания '{end_date}'.")
|
||||
raise ValueError("Дата начала не может быть позже даты окончания.")
|
||||
|
||||
return start_date, end_date
|
||||
return start_date, end_date
|
||||
|
||||
def calculate_period_dates(period_key):
|
||||
"""
|
||||
Вычисляет начальную и конечную даты на основе строкового ключа.
|
||||
Возвращает кортеж (start_date_str, end_date_str) в формате YYYY-MM-DD.
|
||||
"""
|
||||
if not period_key:
|
||||
raise ValueError("Period key cannot be empty.")
|
||||
|
||||
today = date.today()
|
||||
yesterday = today - timedelta(days=1)
|
||||
date_format = "%Y-%m-%d"
|
||||
|
||||
# За прошлую неделю (с пн по вс)
|
||||
if period_key == 'previous_week':
|
||||
start_of_last_week = today - timedelta(days=today.weekday() + 7)
|
||||
end_of_last_week = start_of_last_week + timedelta(days=6)
|
||||
return start_of_last_week.strftime(date_format), end_of_last_week.strftime(date_format)
|
||||
|
||||
# За последние 7 дней (не включая сегодня)
|
||||
if period_key == 'last_7_days':
|
||||
start_date = today - timedelta(days=7)
|
||||
return start_date.strftime(date_format), yesterday.strftime(date_format)
|
||||
|
||||
# За прошлый месяц
|
||||
if period_key == 'previous_month':
|
||||
last_month = today - relativedelta(months=1)
|
||||
start_date = last_month.replace(day=1)
|
||||
end_date = start_date + relativedelta(months=1) - timedelta(days=1)
|
||||
return start_date.strftime(date_format), end_date.strftime(date_format)
|
||||
|
||||
# За текущий месяц (до вчера)
|
||||
if period_key == 'current_month':
|
||||
start_date = today.replace(day=1)
|
||||
return start_date.strftime(date_format), yesterday.strftime(date_format)
|
||||
|
||||
# Динамический ключ "За последние N дней"
|
||||
if period_key.startswith('last_') and period_key.endswith('_days'):
|
||||
try:
|
||||
days = int(period_key.split('_')[1])
|
||||
if days <= 0:
|
||||
raise ValueError("Number of days must be positive.")
|
||||
start_date = today - timedelta(days=days)
|
||||
return start_date.strftime(date_format), yesterday.strftime(date_format)
|
||||
except (ValueError, IndexError):
|
||||
raise ValueError(f"Invalid dynamic period key: {period_key}")
|
||||
|
||||
raise ValueError(f"Unknown period key: {period_key}")
|
||||
Reference in New Issue
Block a user