Show economist publication times over the year
This commit is contained in:
		
							parent
							
								
									592710a28c
								
							
						
					
					
						commit
						cb7f7536a9
					
				| 
						 | 
					@ -336,7 +336,7 @@ async def get_data(now: datetime) -> typing.Mapping[str, str | object]:
 | 
				
			||||||
    reply = {
 | 
					    reply = {
 | 
				
			||||||
        "now": now,
 | 
					        "now": now,
 | 
				
			||||||
        "gbpusd": gbpusd,
 | 
					        "gbpusd": gbpusd,
 | 
				
			||||||
        "next_economist": economist.next_pub_date(today),
 | 
					        "economist": economist.publication_dates(last_year, next_year),
 | 
				
			||||||
        "bank_holiday": bank_holiday,
 | 
					        "bank_holiday": bank_holiday,
 | 
				
			||||||
        "us_holiday": get_us_holidays(last_year, next_year),
 | 
					        "us_holiday": get_us_holidays(last_year, next_year),
 | 
				
			||||||
        "next_us_presidential_election": next_us_presidential_election,
 | 
					        "next_us_presidential_election": next_us_presidential_election,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,32 +1,35 @@
 | 
				
			||||||
"""Next publication date of the Economist."""
 | 
					"""Next publication date of the Economist."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from datetime import date, timedelta
 | 
					from datetime import date, datetime, time, timedelta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import pytz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .types import Event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uk_tz = pytz.timezone("Europe/London")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def next_pub_date(input_date: date) -> date:
 | 
					def add_pub_time(pub_date: date) -> datetime:
 | 
				
			||||||
    """Next date that the Economist is published."""
 | 
					    """Publication time is 19:00."""
 | 
				
			||||||
    # Define the publication day (Thursday) and the day of the week of the input date
 | 
					    return uk_tz.localize(datetime.combine(pub_date, time(19, 0)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def publication_dates(start_date: date, end_date: date) -> list[Event]:
 | 
				
			||||||
 | 
					    """List of Economist publication dates."""
 | 
				
			||||||
 | 
					    # Define the publication day (Thursday) and non-publication weeks
 | 
				
			||||||
    publication_day = 3  # Thursday (0 - Monday, 1 - Tuesday, ..., 6 - Sunday)
 | 
					    publication_day = 3  # Thursday (0 - Monday, 1 - Tuesday, ..., 6 - Sunday)
 | 
				
			||||||
    current_day_of_week = input_date.weekday()
 | 
					 | 
				
			||||||
    current_week_number = input_date.isocalendar().week
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Define the list of weeks when The Economist is not published
 | 
					    # Define the list of weeks when The Economist is not published
 | 
				
			||||||
    non_publication_weeks = [26, 56]
 | 
					    non_publication_weeks = [26, 52]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Check if the input date is a publication day (Thursday)
 | 
					    current_date = start_date
 | 
				
			||||||
    if (
 | 
					    publication_dates = []
 | 
				
			||||||
        current_day_of_week == publication_day
 | 
					 | 
				
			||||||
        and current_week_number not in non_publication_weeks
 | 
					 | 
				
			||||||
    ):
 | 
					 | 
				
			||||||
        return input_date
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Calculate the date for the next Thursday after the input date
 | 
					    while current_date <= end_date:
 | 
				
			||||||
    days_until_next_thursday = (publication_day - current_day_of_week + 7) % 7
 | 
					        if (
 | 
				
			||||||
    next_thursday_date = input_date + timedelta(days=days_until_next_thursday)
 | 
					            current_date.weekday() == publication_day
 | 
				
			||||||
 | 
					            and current_date.isocalendar().week not in non_publication_weeks
 | 
				
			||||||
 | 
					        ):
 | 
				
			||||||
 | 
					            publication_dates.append(add_pub_time(current_date))
 | 
				
			||||||
 | 
					        current_date += timedelta(days=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Check if the next Thursday falls in a non-publication week
 | 
					    return [Event(name="economist", date=pub_date) for pub_date in publication_dates]
 | 
				
			||||||
    while next_thursday_date.isocalendar().week in non_publication_weeks:
 | 
					 | 
				
			||||||
        # If it does, add 7 days to find the next Thursday
 | 
					 | 
				
			||||||
        next_thursday_date += timedelta(days=7)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return next_thursday_date
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,7 +55,7 @@
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% set event_labels = {
 | 
					{% set event_labels = {
 | 
				
			||||||
  "next_economist": "The Economist",
 | 
					  "economist": "The Economist",
 | 
				
			||||||
  "mothers_day": "Mothers' day",
 | 
					  "mothers_day": "Mothers' day",
 | 
				
			||||||
  "fathers_day": "Fathers' day",
 | 
					  "fathers_day": "Fathers' day",
 | 
				
			||||||
  "uk_financial_year_end": "End of financial year",
 | 
					  "uk_financial_year_end": "End of financial year",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue