Beispiel #1
0
def get_bundle_draft_direct_links_cached(bundle_uuid, draft_name):
    """
    Get the direct links in the specified bundle draft. Cached using BundleCache
    so we get automatic cache invalidation when the draft is updated.
    """
    bundle_cache = BundleCache(bundle_uuid, draft_name)
    cache_key = ('bundle_draft_direct_links', )
    result = bundle_cache.get(cache_key)
    if result is None:
        links = blockstore_api.get_bundle_links(bundle_uuid,
                                                use_draft=draft_name).values()
        result = {link.name: link.direct for link in links}
        bundle_cache.set(cache_key, result)
    return result
Beispiel #2
0
    def test_links(self):
        """
        Test operations involving bundle links.
        """
        coll = api.create_collection("Test Collection")
        # Create two library bundles and a course bundle:
        lib1_bundle = api.create_bundle(coll.uuid,
                                        title="Library 1",
                                        slug="lib1")
        lib1_draft = api.get_or_create_bundle_draft(lib1_bundle.uuid,
                                                    draft_name="test-draft")
        lib2_bundle = api.create_bundle(coll.uuid,
                                        title="Library 1",
                                        slug="lib2")
        lib2_draft = api.get_or_create_bundle_draft(lib2_bundle.uuid,
                                                    draft_name="other-draft")
        course_bundle = api.create_bundle(coll.uuid,
                                          title="Library 1",
                                          slug="course")
        course_draft = api.get_or_create_bundle_draft(course_bundle.uuid,
                                                      draft_name="test-draft")

        # To create links, we need valid BundleVersions, which requires having committed at least one change:
        api.write_draft_file(lib1_draft.uuid, "lib1-data.txt", "hello world")
        api.commit_draft(lib1_draft.uuid)  # Creates version 1
        api.write_draft_file(lib2_draft.uuid, "lib2-data.txt", "hello world")
        api.commit_draft(lib2_draft.uuid)  # Creates version 1

        # Lib2 has no links:
        self.assertFalse(api.get_bundle_links(lib2_bundle.uuid))

        # Create a link from lib2 to lib1
        link1_name = "lib2_to_lib1"
        api.set_draft_link(lib2_draft.uuid,
                           link1_name,
                           lib1_bundle.uuid,
                           version=1)
        # Now confirm the link exists in the draft:
        lib2_draft_links = api.get_bundle_links(lib2_bundle.uuid,
                                                use_draft=lib2_draft.name)
        self.assertIn(link1_name, lib2_draft_links)
        self.assertEqual(lib2_draft_links[link1_name].direct.bundle_uuid,
                         lib1_bundle.uuid)
        self.assertEqual(lib2_draft_links[link1_name].direct.version, 1)
        # Now commit the change to lib2:
        api.commit_draft(lib2_draft.uuid)  # Creates version 2

        # Now create a link from course to lib2
        link2_name = "course_to_lib2"
        api.set_draft_link(course_draft.uuid,
                           link2_name,
                           lib2_bundle.uuid,
                           version=2)
        api.commit_draft(course_draft.uuid)

        # And confirm the link exists in the resulting bundle version:
        course_links = api.get_bundle_links(course_bundle.uuid)
        self.assertIn(link2_name, course_links)
        self.assertEqual(course_links[link2_name].direct.bundle_uuid,
                         lib2_bundle.uuid)
        self.assertEqual(course_links[link2_name].direct.version, 2)
        # And since the links go course->lib2->lib1, course has an indirect link to lib1:
        self.assertEqual(course_links[link2_name].indirect[0].bundle_uuid,
                         lib1_bundle.uuid)
        self.assertEqual(course_links[link2_name].indirect[0].version, 1)

        # Finally, test deleting a link from course's draft:
        api.set_draft_link(course_draft.uuid, link2_name, None, None)
        self.assertFalse(
            api.get_bundle_links(course_bundle.uuid,
                                 use_draft=course_draft.name))