"""Logic for max available date.""" import datetime from analytics.constants.parameters import ALL_TIME from analytics.utils import data_availability from analytics.utils.data_availability import get_available_feeds HIGHWATERMARK_DATE = "HIGHWATERMARK" def _get_max_available_date(downloads, videos): available_feeds = get_available_feeds() if downloads: return data_availability.get_downloads_max_available_date(available_feeds) if videos: return data_availability.get_videos_max_available_date(available_feeds) return data_availability.get_max_available_date(available_feeds) def get_date_range(start_date, days, downloads=False, videos=False): """Return date range based on start date, highwatermark and days. Args: start_date (string): Start date or highwatermark key word days (int): number of days downloads (bool): get max available date for downloads videos (bool): get max available date for video views Returns: start_date (datetime.date): Start date end_date (datetime.date): End date """ is_highwater_mark = start_date == HIGHWATERMARK_DATE is_all_time = is_highwater_mark and days == 0 abs_start_date = datetime.datetime.strptime( _get_max_available_date(downloads, videos) if is_highwater_mark else start_date, "%Y-%m-%d", ).date() if is_all_time: abs_end_date = abs_start_date abs_start_date = ALL_TIME elif days < 0: abs_end_date = abs_start_date abs_start_date += datetime.timedelta(days=days + 1) elif is_highwater_mark: abs_end_date = abs_start_date abs_start_date -= datetime.timedelta(days=days - 1) else: abs_end_date = abs_start_date + datetime.timedelta(days=days - 1) return abs_start_date, abs_end_date def get_max_available_date(): """Return max available date for all stores. Returns: max_available_date (datetime.date): Max available date """ return datetime.datetime.strptime( _get_max_available_date(False, False), "%Y-%m-%d" ).date() def get_downloads_max_available_date(): """Return max available date for all download stores. Returns: max_available_date (datetime.date): Max available date """ return datetime.datetime.strptime( _get_max_available_date(True, False), "%Y-%m-%d" ).date() def get_videos_max_available_date(): """Return max available date for all video streaming stores. Returns: max_available_date (datetime.date): Max available date """ return datetime.datetime.strptime( _get_max_available_date(False, True), "%Y-%m-%d" ).date()