def test_page_has_minor_update(db, db_session): major_version = Page(guid="test_page", version="1.0") minor_version = Page(guid="test_page", version="1.1") db.session.add(major_version) db.session.add(minor_version) db.session.commit() major_version.has_minor_update()
def test_page_has_major_update(db, db_session): major_version_1 = Page(guid="test_page", version="1.0") major_version_2 = Page(guid="test_page", version="2.0") db.session.add(major_version_1) db.session.add(major_version_2) db.session.commit() major_version_1.has_major_update()
def test_order_measures_in_subtopic_sets_order_on_all_versions( app, db, db_session, test_app_client, mock_rdu_user, stub_subtopic_page): stub_subtopic_page.children.append( Page(guid="0", version="1.0", position=0)) stub_subtopic_page.children.append( Page(guid="0", version="1.1", position=0)) stub_subtopic_page.children.append( Page(guid="0", version="2.0", position=0)) stub_subtopic_page.children.append( Page(guid="1", version="1.0", position=0)) stub_subtopic_page.children.append( Page(guid="1", version="2.0", position=0)) db.session.add(stub_subtopic_page) db.session.commit() assert stub_subtopic_page.children[0].guid == "0" assert stub_subtopic_page.children[1].guid == "0" assert stub_subtopic_page.children[2].guid == "0" assert stub_subtopic_page.children[3].guid == "1" assert stub_subtopic_page.children[4].guid == "1" with test_app_client.session_transaction() as session: session["user_id"] = mock_rdu_user.id updates = [ { "position": 0, "guid": "1", "subtopic": stub_subtopic_page.guid }, { "position": 1, "guid": "0", "subtopic": stub_subtopic_page.guid }, ] resp = test_app_client.post(url_for("cms.set_measure_order"), data=json.dumps({"positions": updates}), content_type="application/json") assert resp.status_code == 200 page_service = PageService() page_service.init_app(app) udpated_page = page_service.get_page(stub_subtopic_page.guid) assert udpated_page.children[0].guid == "1" assert udpated_page.children[1].guid == "1" assert udpated_page.children[2].guid == "0" assert udpated_page.children[3].guid == "0" assert udpated_page.children[4].guid == "0"
def get_published_dashboard_data(): # GET DATA # get measures at their 1.0 publish date original_publications = Page.published_first_versions().order_by(Page.publication_date.desc()).all() # get measures at their 2.0, 3.0 major update dates major_updates = Page.published_updates_first_versions().order_by(Page.publication_date.desc()).all() # get first date to start point for data table first_publication = ( Page.query.filter(Page.publication_date.isnot(None)).order_by(Page.publication_date.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.publication_date, } weeks = [] cumulative_number_of_pages = [] cumulative_number_of_major_updates = [] # week by week rows for d in _from_month_to_month(first_publication.publication_date, date.today()): c = calendar.Calendar(calendar.MONDAY).monthdatescalendar(d.year, d.month) for week in c: if _in_range(week, first_publication.publication_date, 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
def test_reorder_measures_triggers_build(app, db, db_session, test_app_client, mock_rdu_user, stub_subtopic_page): ids = [0, 1] reversed_ids = ids[::-1] for i in ids: stub_subtopic_page.children.append( Page(guid=str(i), version="1.0", position=i)) db.session.add(stub_subtopic_page) db.session.commit() builds = Build.query.all() assert len(builds) == 0 with test_app_client.session_transaction() as session: session["user_id"] = mock_rdu_user.id updates = [] for position, id in enumerate(reversed_ids): updates.append({ "position": position, "guid": str(id), "subtopic": stub_subtopic_page.guid }) resp = test_app_client.post(url_for("cms.set_measure_order"), data=json.dumps({"positions": updates}), content_type="application/json") assert resp.status_code == 200 builds = Build.query.all() assert len(builds) == 1
def test_page_has_correct_number_of_versions(db, db_session): major_version_1 = Page(guid="test_page", version="1.0") minor_version = Page(guid="test_page", version="1.1") major_version_2 = Page(guid="test_page", version="2.0") db.session.add(major_version_1) db.session.add(minor_version) db.session.add(major_version_2) db.session.commit() assert major_version_1.number_of_versions() == 3 assert minor_version.number_of_versions() == 3 assert major_version_2.number_of_versions() == 3
def create_page(self, page_type, parent, data, created_by, version="1.0"): title = data.pop("title", "").strip() guid = str(uuid.uuid4()) uri = slugify(title) # we'll have to check if user selected another subtopic and did not use one passed via url subtopic = data.pop("subtopic", None) if subtopic is not None and subtopic != parent.guid: parent = page_service.get_page(subtopic) cannot_be_created, message = self.page_cannot_be_created( parent.guid, uri) if cannot_be_created: raise PageExistsException(message) self.logger.info(message) page = Page( guid=guid, version=version, uri=uri, title=title, parent_guid=parent.guid, parent_version=parent.version, page_type=page_type, status=publish_status.inv[1], created_by=created_by, position=len([c for c in parent.children if c.latest]), ) self._set_main_fields(data, page) page.internal_edit_summary = "Initial version" page.external_edit_summary = "First published" db.session.add(page) db.session.commit() previous_version = page.get_previous_version() if previous_version is not None: previous_version.latest = False db.session.add(previous_version) db.session.commit() return page
def test_homepage_topics_display_in_rows_with_three_columns( number_of_topics, row_counts, test_app_client, mock_rdu_user, stub_home_page, db_session): with test_app_client.session_transaction() as session: session["user_id"] = mock_rdu_user.id Page.query.filter(Page.page_type == "topic").delete() db_session.session.commit() for i in range(number_of_topics): topic = Page( guid=f"topic_{i}", parent_guid="homepage", page_type="topic", uri=f"topic-{i}", status="DRAFT", title=f"Test topic page #{i}", version="1.0", ) subtopic = Page( guid=f"subtopic_{i}", parent_guid=f"topic_{i}", page_type="subtopic", uri=f"subtopic-{i}", status="DRAFT", title=f"Test subtopic page #{i}", version="1.0", ) measure = Page( guid=f"measure_{i}", parent_guid=f"topic_{i}", page_type="measure", uri=f"measure-{i}", status="APPROVED", published=True, title=f"Test measure page #{i}", version="1.0", ) topic.children = [subtopic] subtopic.children = [measure] db_session.session.add(topic) db_session.session.add(subtopic) db_session.session.add(measure) db_session.session.commit() resp = test_app_client.get(url_for("static_site.index")) assert resp.status_code == 200 page = BeautifulSoup(resp.data.decode("utf-8"), "html.parser") topic_rows = page.select(".topic-row") assert len(topic_rows) == len(row_counts) for i, topic_row in enumerate(topic_rows): assert len(topic_rows[i].select(".topic")) == row_counts[i]
def test_get_latest_publishable_versions_of_measures_for_subtopic( db, db_session, stub_subtopic_page): major_version_1 = Page(guid="test_page", version="1.0", status="APPROVED") minor_version_2 = Page(guid="test_page", version="1.1", status="APPROVED") minor_version_3 = Page(guid="test_page", version="1.2", status="APPROVED") minor_version_4 = Page(guid="test_page", version="1.3", status="DRAFT") stub_subtopic_page.children.append(major_version_1) stub_subtopic_page.children.append(minor_version_2) stub_subtopic_page.children.append(minor_version_3) stub_subtopic_page.children.append(minor_version_4) db.session.add(stub_subtopic_page) db.session.add(minor_version_2) db.session.add(minor_version_3) db.session.add(minor_version_4) db.session.commit() measures = page_service.get_latest_publishable_measures(stub_subtopic_page) assert len(measures) == 1
def get_published_measures_by_years_and_months(): all_publications = Page.published_major_versions().order_by(Page.publication_date.desc()).all() # Dict of years to dicts of months to lists of pages published that month. # dict[year: int] -> dict[publication_date_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.publication_date.year][ publication.publication_date.replace(day=1) ].append(publication) return published_measures_by_years_and_months
def test_order_measures_in_subtopic(app, db, db_session, test_app_client, mock_rdu_user, stub_subtopic_page): ids = [0, 1, 2, 3, 4] reversed_ids = ids[::-1] for i in ids: stub_subtopic_page.children.append( Page(guid=str(i), version="1.0", position=i)) db.session.add(stub_subtopic_page) db.session.commit() assert stub_subtopic_page.children[0].guid == "0" assert stub_subtopic_page.children[1].guid == "1" assert stub_subtopic_page.children[2].guid == "2" assert stub_subtopic_page.children[3].guid == "3" assert stub_subtopic_page.children[4].guid == "4" with test_app_client.session_transaction() as session: session["user_id"] = mock_rdu_user.id updates = [] for position, id in enumerate(reversed_ids): updates.append({ "position": position, "guid": str(id), "subtopic": stub_subtopic_page.guid }) resp = test_app_client.post(url_for("cms.set_measure_order"), data=json.dumps({"positions": updates}), content_type="application/json") assert resp.status_code == 200 page_service = PageService() page_service.init_app(app) udpated_page = page_service.get_page(stub_subtopic_page.guid) assert udpated_page.children[0].guid == "4" assert udpated_page.children[1].guid == "3" assert udpated_page.children[2].guid == "2" assert udpated_page.children[3].guid == "1" assert udpated_page.children[4].guid == "0"
def create_measure_page_versions(db, example_measure_page, required_versions, required_titles=None): if not required_titles: required_titles = [f"Test {version}" for version in required_versions] for page_version, page_title in zip(required_versions, required_titles): page = Page( guid="test", version=page_version, parent_guid=example_measure_page.parent.guid, parent_version=example_measure_page.parent.version, page_type="measure", uri="test-measure-page-2", title=page_title, status="APPROVED", ) db.session.add(page) db.session.commit()
def test_page_sort_by_version(): first_page = Page(guid="test_page", version="1.0") second_page = Page(guid="test_page", version="1.1") third_page = Page(guid="test_page", version="2.0") fourth_page = Page(guid="test_page", version="2.2") fifth_page = Page(guid="test_page", version="2.10") sixth_page = Page(guid="test_page", version="2.20") pages = [ fourth_page, sixth_page, fifth_page, second_page, first_page, third_page ] pages.sort() assert pages[0] == first_page assert pages[1] == second_page assert pages[2] == third_page assert pages[3] == fourth_page assert pages[4] == fifth_page assert pages[5] == sixth_page
def test_is_minor_or_minor_version(): page = Page(guid="test_page", version="1.0") assert page.version == "1.0" assert page.is_major_version() is True assert page.is_minor_version() is False page.version = page.next_minor_version() assert page.version == "1.1" assert page.is_major_version() is False assert page.is_minor_version() is True page.version = page.next_major_version() assert page.version == "2.0" assert page.is_major_version() is True assert page.is_minor_version() is False
def test_page_has_later_published_versions(db, db_session): major_version_1 = Page(guid="test_page", version="1.0", status="APPROVED") minor_version_2 = Page(guid="test_page", version="1.1", status="APPROVED") minor_version_3 = Page(guid="test_page", version="1.2", status="APPROVED") minor_version_4 = Page(guid="test_page", version="1.3", status="DRAFT") db.session.add(major_version_1) db.session.add(minor_version_2) db.session.add(minor_version_3) db.session.add(minor_version_4) db.session.commit() assert major_version_1.has_no_later_published_versions() is False assert minor_version_2.has_no_later_published_versions() is False assert minor_version_3.has_no_later_published_versions() is True assert minor_version_4.has_no_later_published_versions() is True