Esempio n. 1
0
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()
Esempio n. 2
0
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()
Esempio n. 3
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 8
0
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
Esempio n. 11
0
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()
Esempio n. 13
0
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
Esempio n. 14
0
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
Esempio n. 15
0
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