aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorrr-2016-04-17 12:53:23 +0200
committerrr-2016-04-17 12:54:31 +0200
commit9ac70dbed45bbbe76ef55717c2aa53aab0b3be24 (patch)
tree0f84d4f9cb4160caf0f49f22f7fce770389e879f /server
parent888e8e1aa717f6faa7f4aed84a484874b344cf28 (diff)
server/tags: simplify relations model
Diffstat (limited to 'server')
-rw-r--r--server/szurubooru/api/tag_api.py4
-rw-r--r--server/szurubooru/db/tag.py51
-rw-r--r--server/szurubooru/tests/api/test_tag_creating.py2
-rw-r--r--server/szurubooru/tests/api/test_tag_updating.py2
-rw-r--r--server/szurubooru/tests/db/test_tag.py20
-rw-r--r--server/szurubooru/tests/search/test_tag_search_config.py12
-rw-r--r--server/szurubooru/util/tags.py12
7 files changed, 48 insertions, 55 deletions
diff --git a/server/szurubooru/api/tag_api.py b/server/szurubooru/api/tag_api.py
index 680cd44..a9ebb96 100644
--- a/server/szurubooru/api/tag_api.py
+++ b/server/szurubooru/api/tag_api.py
@@ -8,9 +8,9 @@ def _serialize_tag(tag):
'names': [tag_name.name for tag_name in tag.names],
'category': tag.category,
'suggestions': [
- relation.child_tag.names[0].name for relation in tag.suggestions],
+ relation.names[0].name for relation in tag.suggestions],
'implications': [
- relation.child_tag.names[0].name for relation in tag.implications],
+ relation.names[0].name for relation in tag.implications],
'creationTime': tag.creation_time,
'lastEditTime': tag.last_edit_time,
}
diff --git a/server/szurubooru/db/tag.py b/server/szurubooru/db/tag.py
index f11cfed..dbdfed9 100644
--- a/server/szurubooru/db/tag.py
+++ b/server/szurubooru/db/tag.py
@@ -4,56 +4,53 @@ from szurubooru.db.base import Base
class TagSuggestion(Base):
__tablename__ = 'tag_suggestion'
+
parent_id = Column('parent_id', Integer, ForeignKey('tag.id'), primary_key=True)
child_id = Column('child_id', Integer, ForeignKey('tag.id'), primary_key=True)
+
def __init__(self, parent_id, child_id):
self.parent_id = parent_id
self.child_id = child_id
class TagImplication(Base):
__tablename__ = 'tag_implication'
+
parent_id = Column('parent_id', Integer, ForeignKey('tag.id'), primary_key=True)
child_id = Column('child_id', Integer, ForeignKey('tag.id'), primary_key=True)
+
def __init__(self, parent_id, child_id):
self.parent_id = parent_id
self.child_id = child_id
+class TagName(Base):
+ __tablename__ = 'tag_name'
+
+ tag_name_id = Column('tag_name_id', Integer, primary_key=True)
+ tag_id = Column('tag_id', Integer, ForeignKey('tag.id'))
+ name = Column('name', String(64), nullable=False, unique=True)
+
+ def __init__(self, name):
+ self.name = name
+
class Tag(Base):
__tablename__ = 'tag'
+
tag_id = Column('id', Integer, primary_key=True)
category = Column('category', String(32), nullable=False)
creation_time = Column('creation_time', DateTime, nullable=False)
last_edit_time = Column('last_edit_time', DateTime)
- post_count = Column('auto_post_count', Integer, nullable=False, default=0)
- names = relationship('TagName', cascade='all, delete-orphan')
+ names = relationship('TagName', cascade='all, delete-orphan')
suggestions = relationship(
- TagSuggestion,
- backref='parent_tag',
+ 'Tag',
+ secondary='tag_suggestion',
primaryjoin=tag_id == TagSuggestion.parent_id,
- cascade='all, delete-orphan')
- suggested_by = relationship(
- TagSuggestion,
- backref='child_tag',
- primaryjoin=tag_id == TagSuggestion.child_id,
- cascade='all, delete-orphan')
-
+ secondaryjoin=tag_id == TagSuggestion.child_id)
implications = relationship(
- TagImplication,
- backref='parent_tag',
+ 'Tag',
+ secondary='tag_implication',
primaryjoin=tag_id == TagImplication.parent_id,
- cascade='all, delete-orphan')
- implied_by = relationship(
- TagImplication,
- backref='child_tag',
- primaryjoin=tag_id == TagImplication.child_id,
- cascade='all, delete-orphan')
-
-class TagName(Base):
- __tablename__ = 'tag_name'
- tag_name_id = Column('tag_name_id', Integer, primary_key=True)
- tag_id = Column('tag_id', Integer, ForeignKey('tag.id'))
- name = Column('name', String(64), nullable=False, unique=True)
+ secondaryjoin=tag_id == TagImplication.child_id)
- def __init__(self, name):
- self.name = name
+ # TODO: wire this
+ post_count = Column('auto_post_count', Integer, nullable=False, default=0)
diff --git a/server/szurubooru/tests/api/test_tag_creating.py b/server/szurubooru/tests/api/test_tag_creating.py
index 2faf212..d8c72db 100644
--- a/server/szurubooru/tests/api/test_tag_creating.py
+++ b/server/szurubooru/tests/api/test_tag_creating.py
@@ -11,7 +11,7 @@ def get_tag(session, name):
.first()
def assert_relations(relations, expected_tag_names):
- actual_names = [rel.child_tag.names[0].name for rel in relations]
+ actual_names = [rel.names[0].name for rel in relations]
assert actual_names == expected_tag_names
@pytest.fixture
diff --git a/server/szurubooru/tests/api/test_tag_updating.py b/server/szurubooru/tests/api/test_tag_updating.py
index f70b61c..c68b853 100644
--- a/server/szurubooru/tests/api/test_tag_updating.py
+++ b/server/szurubooru/tests/api/test_tag_updating.py
@@ -11,7 +11,7 @@ def get_tag(session, name):
.first()
def assert_relations(relations, expected_tag_names):
- actual_names = [rel.child_tag.names[0].name for rel in relations]
+ actual_names = [rel.names[0].name for rel in relations]
assert actual_names == expected_tag_names
@pytest.fixture
diff --git a/server/szurubooru/tests/db/test_tag.py b/server/szurubooru/tests/db/test_tag.py
index 83423a0..3c40b88 100644
--- a/server/szurubooru/tests/db/test_tag.py
+++ b/server/szurubooru/tests/db/test_tag.py
@@ -23,10 +23,10 @@ def test_saving_tag(session, tag_factory):
assert suggested_tag2.tag_id is not None
assert implied_tag1.tag_id is not None
assert implied_tag2.tag_id is not None
- tag.suggestions.append(db.TagSuggestion(tag.tag_id, suggested_tag1.tag_id))
- tag.suggestions.append(db.TagSuggestion(tag.tag_id, suggested_tag2.tag_id))
- tag.implications.append(db.TagImplication(tag.tag_id, implied_tag1.tag_id))
- tag.implications.append(db.TagImplication(tag.tag_id, implied_tag2.tag_id))
+ tag.suggestions.append(suggested_tag1)
+ tag.suggestions.append(suggested_tag2)
+ tag.implications.append(implied_tag1)
+ tag.implications.append(implied_tag2)
session.commit()
tag = session.query(db.Tag) \
@@ -38,9 +38,9 @@ def test_saving_tag(session, tag_factory):
assert tag.creation_time == datetime(1997, 1, 1)
assert tag.last_edit_time == datetime(1998, 1, 1)
assert tag.post_count == 1
- assert [relation.child_tag.names[0].name for relation in tag.suggestions] \
+ assert [relation.names[0].name for relation in tag.suggestions] \
== ['suggested1', 'suggested2']
- assert [relation.child_tag.names[0].name for relation in tag.implications] \
+ assert [relation.names[0].name for relation in tag.implications] \
== ['implied1', 'implied2']
def test_cascade_deletions(session, tag_factory):
@@ -65,10 +65,10 @@ def test_cascade_deletions(session, tag_factory):
assert suggested_tag2.tag_id is not None
assert implied_tag1.tag_id is not None
assert implied_tag2.tag_id is not None
- tag.suggestions.append(db.TagSuggestion(tag.tag_id, suggested_tag1.tag_id))
- tag.suggestions.append(db.TagSuggestion(tag.tag_id, suggested_tag2.tag_id))
- tag.implications.append(db.TagImplication(tag.tag_id, implied_tag1.tag_id))
- tag.implications.append(db.TagImplication(tag.tag_id, implied_tag2.tag_id))
+ tag.suggestions.append(suggested_tag1)
+ tag.suggestions.append(suggested_tag2)
+ tag.implications.append(implied_tag1)
+ tag.implications.append(implied_tag2)
session.commit()
session.delete(tag)
diff --git a/server/szurubooru/tests/search/test_tag_search_config.py b/server/szurubooru/tests/search/test_tag_search_config.py
index c620962..e9fbdac 100644
--- a/server/szurubooru/tests/search/test_tag_search_config.py
+++ b/server/szurubooru/tests/search/test_tag_search_config.py
@@ -133,9 +133,9 @@ def test_order_by_suggestion_count(
tag2 = tag_factory(names=['t2'])
session.add_all([sug1, sug3, tag2, sug2, tag1])
session.commit()
- tag1.suggestions.append(db.TagSuggestion(tag1.tag_id, sug1.tag_id))
- tag1.suggestions.append(db.TagSuggestion(tag1.tag_id, sug2.tag_id))
- tag2.suggestions.append(db.TagSuggestion(tag2.tag_id, sug3.tag_id))
+ tag1.suggestions.append(sug1)
+ tag1.suggestions.append(sug2)
+ tag2.suggestions.append(sug3)
verify_unpaged(input, expected_tag_names)
@pytest.mark.parametrize('input,expected_tag_names', [
@@ -150,9 +150,9 @@ def test_order_by_implication_count(
tag2 = tag_factory(names=['t2'])
session.add_all([sug1, sug3, tag2, sug2, tag1])
session.commit()
- tag1.implications.append(db.TagImplication(tag1.tag_id, sug1.tag_id))
- tag1.implications.append(db.TagImplication(tag1.tag_id, sug2.tag_id))
- tag2.implications.append(db.TagImplication(tag2.tag_id, sug3.tag_id))
+ tag1.implications.append(sug1)
+ tag1.implications.append(sug2)
+ tag2.implications.append(sug3)
verify_unpaged(input, expected_tag_names)
def test_filter_by_relation_count(session, verify_unpaged, tag_factory):
diff --git a/server/szurubooru/util/tags.py b/server/szurubooru/util/tags.py
index c07726a..593282b 100644
--- a/server/szurubooru/util/tags.py
+++ b/server/szurubooru/util/tags.py
@@ -36,10 +36,10 @@ def export_to_json(session):
}
if len(tag.suggestions):
item['suggestions'] = \
- [rel.child_tag.names[0].name for rel in tag.suggestions]
+ [rel.names[0].name for rel in tag.suggestions]
if len(tag.implications):
item['implications'] = \
- [rel.child_tag.names[0].name for rel in tag.implications]
+ [rel.names[0].name for rel in tag.implications]
output.append(item)
export_path = os.path.join(config.config['data_dir'], 'tags.json')
with open(export_path, 'w') as handle:
@@ -131,15 +131,11 @@ def update_implications(session, tag, relations):
raise RelationError('Tag cannot imply itself.')
related_tags, new_tags = get_or_create_by_names(session, relations)
session.flush()
- tag.implications = [
- db.TagImplication(tag.tag_id, other_tag.tag_id) \
- for other_tag in related_tags + new_tags]
+ tag.implications = related_tags + new_tags
def update_suggestions(session, tag, relations):
if _check_name_intersection(_get_plain_names(tag), relations):
raise RelationError('Tag cannot suggest itself.')
related_tags, new_tags = get_or_create_by_names(session, relations)
session.flush()
- tag.suggestions = [
- db.TagSuggestion(tag.tag_id, other_tag.tag_id) \
- for other_tag in related_tags + new_tags]
+ tag.suggestions = related_tags + new_tags

© 2015 - 2026 Jakob L. Kreuze