Example #1
0
    def setup_class(cls):
        if not tests.is_search_supported():
            raise tests.SkipTest("Search not supported")
        tests.setup_test_search_index()

        ctd.CreateTestData.create()

        model.repo.new_revision()
        cls.vocab = model.Vocabulary(TEST_VOCAB_NAME)
        model.Session.add(cls.vocab)
        model.Session.commit()

        vocab_tag_1 = model.Tag('tag1', cls.vocab.id)
        vocab_tag_2 = model.Tag('tag2', cls.vocab.id)
        model.Session.add(vocab_tag_1)
        model.Session.add(vocab_tag_2)

        pkg = model.Package.get('warandpeace')
        pkg_tag1 = model.PackageTag(pkg, vocab_tag_1)
        pkg_tag2 = model.PackageTag(pkg, vocab_tag_2)
        model.Session.add(pkg_tag1)
        model.Session.add(pkg_tag2)

        model.Session.commit()
        model.Session.remove()
Example #2
0
    def test_create_package_with_tags(self):
        model.repo.new_revision()

        pkg = model.Package(name=u'test-package')

        # method 1
        tag1 = model.Tag(name=u'science')
        package_tag1 = model.PackageTag(package=pkg, tag=tag1)
        pkg.package_tag_all[:] = [package_tag1]

        # method 2
        tag2 = model.Tag(name=u'geology')
        package_tag2 = model.PackageTag(package=pkg, tag=tag2)
        pkg.add_tag(tag2)

        # method 3
        pkg.add_tag_by_name(u'energy')

        model.Session.add_all([pkg, package_tag1, package_tag2])
        model.Session.commit()
        model.Session.remove()

        pkg = model.Package.by_name(u'test-package')
        assert_equal(set([tag.name for tag in pkg.get_tags()]),
                     set([u'science', u'geology', u'energy']))
Example #3
0
 def add_tag(self, tag):
     import ckan.model as model
     if tag in self.get_tags(tag.vocabulary):
         return
     else:
         package_tag = model.PackageTag(self, tag)
         meta.Session.add(package_tag)
Example #4
0
    def test_create_package_with_tags(self):
        pkg = model.Package(name=factories.Dataset.stub().name)

        # method 1
        tag1 = model.Tag(name=factories.Tag.stub().name)
        package_tag1 = model.PackageTag(package=pkg, tag=tag1)
        pkg.package_tags[:] = [package_tag1]

        # method 2
        tag2 = model.Tag(name=factories.Tag.stub().name)
        package_tag2 = model.PackageTag(package=pkg, tag=tag2)
        pkg.add_tag(tag2)

        # method 3
        pkg.add_tag_by_name(u"energy")

        model.Session.add_all([pkg, package_tag1, package_tag2])
        model.Session.commit()
        model.Session.remove()

        pkg = model.Package.by_name(pkg.name)
        assert set([tag.name for tag in pkg.get_tags()
                    ]) == set([tag1.name, tag2.name, u"energy"])
Example #5
0
    def test_create_package_with_tags(self):
        pkg = model.Package(name=u"test-package")

        # method 1
        tag1 = model.Tag(name=u"science")
        package_tag1 = model.PackageTag(package=pkg, tag=tag1)
        pkg.package_tag_all[:] = [package_tag1]

        # method 2
        tag2 = model.Tag(name=u"geology")
        package_tag2 = model.PackageTag(package=pkg, tag=tag2)
        pkg.add_tag(tag2)

        # method 3
        pkg.add_tag_by_name(u"energy")

        model.Session.add_all([pkg, package_tag1, package_tag2])
        model.Session.commit()
        model.Session.remove()

        pkg = model.Package.by_name(u"test-package")
        assert set([tag.name for tag in pkg.get_tags()
                    ]) == set([u"science", u"geology", u"energy"])
Example #6
0
    def initial_data(self, clean_db, clean_index):
        if not tests.is_search_supported():
            raise tests.SkipTest("Search not supported")

        ctd.CreateTestData.create()

        self.vocab = model.Vocabulary(TEST_VOCAB_NAME)
        model.Session.add(self.vocab)
        model.Session.commit()

        vocab_tag_1 = model.Tag("tag1", self.vocab.id)
        vocab_tag_2 = model.Tag("tag2", self.vocab.id)
        model.Session.add(vocab_tag_1)
        model.Session.add(vocab_tag_2)

        pkg = model.Package.get("warandpeace")
        pkg_tag1 = model.PackageTag(pkg, vocab_tag_1)
        pkg_tag2 = model.PackageTag(pkg, vocab_tag_2)
        model.Session.add(pkg_tag1)
        model.Session.add(pkg_tag2)

        model.Session.commit()
        model.Session.remove()
Example #7
0
 def setup_class(self):
     model.repo.init_db()
     rev1 = model.repo.new_revision()
     self.tagname = u'testtagm2m'
     self.tagname2 = u'testtagm2m2'
     self.tagname3 = u'testtag3'
     self.pkgname = u'testpkgm2m'
     pkg = model.Package(name=self.pkgname)
     self.tag = model.Tag(name=self.tagname)
     self.tag2 = model.Tag(name=self.tagname2)
     pkg2tag = model.PackageTag(package=pkg, tag=self.tag)
     pkg.tags.append(self.tag2)
     model.Session.add_all([pkg,self.tag,self.tag2,pkg2tag])
     model.Session.commit()
     self.pkg2tag_id = pkg2tag.id
     self.rev = rev1
Example #8
0
def package_tag_list_save(tag_dicts: Optional[list[dict[str, Any]]],
                          package: 'model.Package', context: Context) -> None:
    allow_partial_update = context.get("allow_partial_update", False)
    if tag_dicts is None and allow_partial_update:
        return

    model = context["model"]
    session = context["session"]

    tag_package_tag = dict(
        (package_tag.tag, package_tag) for package_tag in package.package_tags)

    tag_package_tag_inactive = {
        tag: pt
        for tag, pt in tag_package_tag.items() if pt.state in ['deleted']
    }

    tag_name_vocab: set[tuple[str, str]] = set()
    tags: set[model.Tag] = set()
    for tag_dict in tag_dicts or []:
        name_vocab = (tag_dict.get('name'), tag_dict.get('vocabulary_id'))
        if name_vocab not in tag_name_vocab:
            tag_obj = d.table_dict_save(tag_dict, model.Tag, context)
            tags.add(tag_obj)
            tag_name_vocab.add((tag_obj.name, tag_obj.vocabulary_id))

    # 3 cases
    # case 1: currently active but not in new list
    for tag in set(tag_package_tag.keys()) - tags:
        package_tag = tag_package_tag[tag]
        package_tag.state = 'deleted'

    # case 2: in new list but never used before
    for tag in tags - set(tag_package_tag.keys()):
        state = 'active'
        package_tag_obj = model.PackageTag(package, tag, state)
        session.add(package_tag_obj)
        tag_package_tag[tag] = package_tag_obj

    # case 3: in new list and already used but in deleted state
    for tag in tags.intersection(set(tag_package_tag_inactive.keys())):
        state = 'active'
        package_tag = tag_package_tag[tag]
        package_tag.state = state

    package.package_tags[:] = tag_package_tag.values()