def get_published_measures_by_years_and_months(): all_publications = ( MeasureVersion.published_major_versions() .order_by(MeasureVersion.published_at.desc(), MeasureVersion.title) .all() ) # Dict of years to dicts of months to lists of pages published that month. # dict[year: int] -> dict[published_at_to_month_precision: datetime] -> pages: list published_measures_by_years_and_months = defaultdict(lambda: defaultdict(list)) for publication in all_publications: published_measures_by_years_and_months[publication.published_at.year][ publication.published_at.replace(day=1) ].append(publication) return published_measures_by_years_and_months
def get_published_dashboard_data(): # GET DATA # get measures at their 1.0 publish date original_publications = ( MeasureVersion.published_first_versions() .order_by(MeasureVersion.published_at.desc(), MeasureVersion.title) .all() ) # get measures at their 2.0, 3.0 major update dates major_updates = ( MeasureVersion.published_updates_first_versions() .order_by(MeasureVersion.published_at.desc(), MeasureVersion.title) .all() ) # get first date to start point for data table first_publication = ( MeasureVersion.query.filter(MeasureVersion.published_at.isnot(None)) .order_by(MeasureVersion.published_at.asc()) .first() ) # BUILD CONTEXT # top level data data = { "number_of_publications": len(original_publications), "number_of_major_updates": len(major_updates), "first_publication": first_publication.published_at, } weeks = [] cumulative_number_of_pages = [] cumulative_number_of_major_updates = [] # week by week rows for d in _from_month_to_month(first_publication.published_at, date.today()): c = calendar.Calendar(calendar.MONDAY).monthdatescalendar(d.year, d.month) for week in c: if _in_range(week, first_publication.published_at, d.month): publications = [page for page in original_publications if _page_in_week(page, week)] updates = [updated_page for updated_page in major_updates if _page_in_week(updated_page, week)] weeks.append({"week": week[0], "publications": publications, "major_updates": updates}) if not cumulative_number_of_major_updates: cumulative_number_of_major_updates.append(len(updates)) else: last_total = cumulative_number_of_major_updates[-1] cumulative_number_of_major_updates.append(last_total + len(updates)) if not cumulative_number_of_pages: cumulative_number_of_pages.append(len(publications)) else: last_total = cumulative_number_of_pages[-1] cumulative_number_of_pages.append(last_total + len(publications)) weeks.reverse() data["weeks"] = weeks data["total_page_count_each_week"] = cumulative_number_of_pages data["total_major_updates_count_each_week"] = cumulative_number_of_major_updates return data