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