Introduced art description

Added art description and corresponding tests. Each art entry can have their own description now and the models and tests have been altered to cover them too.
master
Peery 2 years ago
parent 9fe017a6e3
commit 2e233f994f

@ -12,10 +12,8 @@ SQLALCHEMY_DATABASE_URL = "postgresql://artnet_editor:G606Rm9sFEXe6wfTLxVu@[::1]
engine = sqlalchemy.create_engine(SQLALCHEMY_DATABASE_URL, echo=True) engine = sqlalchemy.create_engine(SQLALCHEMY_DATABASE_URL, echo=True)
SessionLocal = sqlalchemy.orm.sessionmaker(autocommit=False, autoflush=False, bind=engine) SessionLocal = sqlalchemy.orm.sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = sqlalchemy.orm.declarative_base() Base = sqlalchemy.orm.declarative_base()
art_to_tag_table = Table('art_to_tag', Base.metadata, art_to_tag_table = Table('art_to_tag', Base.metadata,
Column('art_id', Integer, ForeignKey('art.id')), Column('art_id', Integer, ForeignKey('art.id')),
Column('tag_id', Integer, ForeignKey('tag.tag_id'))) Column('tag_id', Integer, ForeignKey('tag.tag_id')))
@ -51,6 +49,7 @@ class DBArt(Base):
path = Column(String, nullable=False, unique=True) path = Column(String, nullable=False, unique=True)
title = Column(String, nullable=True) title = Column(String, nullable=True)
link = Column(String, nullable=True) link = Column(String, nullable=True)
description = Column(String, nullable=True)
tags = relationship("DBTag", secondary=art_to_tag_table, back_populates="art", viewonly=True) tags = relationship("DBTag", secondary=art_to_tag_table, back_populates="art", viewonly=True)
collections = relationship("DBCollection", secondary=art_to_art_collection, back_populates="art") collections = relationship("DBCollection", secondary=art_to_art_collection, back_populates="art")
@ -129,7 +128,6 @@ Base.metadata.create_all(bind=engine)
class Database: class Database:
__db: sqlalchemy.orm.Session = None __db: sqlalchemy.orm.Session = None
def __get_db(self) -> sqlalchemy.orm.Session: def __get_db(self) -> sqlalchemy.orm.Session:
@ -144,7 +142,7 @@ class Database:
Database.__db.close() Database.__db.close()
Database.__db = None Database.__db = None
# Art # Art
def get_art_list(self) -> List[DBArt]: def get_art_list(self) -> List[DBArt]:
return self.__get_db().query(DBArt).all() # TODO FIX StackOverflow return self.__get_db().query(DBArt).all() # TODO FIX StackOverflow
@ -159,7 +157,7 @@ class Database:
if not (isinstance(art.path, str) and len(art.path) > 0): if not (isinstance(art.path, str) and len(art.path) > 0):
raise ValueError("New Art must contain a path!") raise ValueError("New Art must contain a path!")
db_art = DBArt(title=art.title, md5_hash=art.hash, path=art.path, link=art.link) db_art = DBArt(title=art.title, md5_hash=art.hash, path=art.path, link=art.link, description=art.description)
if self.get_art_by_hash(art.hash) is not None: if self.get_art_by_hash(art.hash) is not None:
raise ValueError("New Art must not contain already known hashes! Is this really new?") raise ValueError("New Art must not contain already known hashes! Is this really new?")
@ -193,6 +191,7 @@ class Database:
db_art.link = art.link if art.link is not None else db_art.link db_art.link = art.link if art.link is not None else db_art.link
db_art.md5_hash = art.hash if art.hash is not None else db_art.md5_hash db_art.md5_hash = art.hash if art.hash is not None else db_art.md5_hash
db_art.path = art.path if art.path is not None else db_art.path db_art.path = art.path if art.path is not None else db_art.path
db_art.description = art.description if art.description is not None else db_art.description
self.__get_db().commit() self.__get_db().commit()
@ -216,7 +215,8 @@ class Database:
return result return result
@DeprecationWarning # is this actually needed? superceeded by updating the art.presence field on art @DeprecationWarning # is this actually needed? superceeded by updating the art.presence field on art
def update_art_presences_by_id(self, art_id: int, presences: List[Presence]): # presences = [("name", "domain"),(...)] def update_art_presences_by_id(self, art_id: int,
presences: List[Presence]): # presences = [("name", "domain"),(...)]
""" """
Creates an art-presence relation for every presence listed Creates an art-presence relation for every presence listed
:param art_id: :param art_id:
@ -263,7 +263,7 @@ class Database:
return self.__get_db().query(DBPresence).all() # TODO fix StackOverflow return self.__get_db().query(DBPresence).all() # TODO fix StackOverflow
def get_presence(self, name: str, domain: str) -> DBPresence: def get_presence(self, name: str, domain: str) -> DBPresence:
result = self.__get_db().query(DBPresence)\ result = self.__get_db().query(DBPresence) \
.filter(func.lower(DBPresence.name) == name.lower() and .filter(func.lower(DBPresence.name) == name.lower() and
func.lower(DBPresence.domain) == domain.lower()).first() func.lower(DBPresence.domain) == domain.lower()).first()
return result return result
@ -337,8 +337,8 @@ class Database:
self.__get_db().delete(db_artist) self.__get_db().delete(db_artist)
self.__get_db().commit() # TODO FIX sqlalchemy.exc.IntegrityError: (psycopg2.errors.ForeignKeyViolation) self.__get_db().commit() # TODO FIX sqlalchemy.exc.IntegrityError: (psycopg2.errors.ForeignKeyViolation)
# TODO update or delete on table "artist" violates foreign key constraint "presence_artist_id_fkey" on table "presence" # TODO update or delete on table "artist" violates foreign key constraint "presence_artist_id_fkey" on table "presence"
# TODO DETAIL: Key (id)=(83) is still referenced from table "presence". # TODO DETAIL: Key (id)=(83) is still referenced from table "presence".
# Topic # Topic

@ -74,6 +74,7 @@ class ArtnoID(BaseModel):
path: Optional[str] path: Optional[str]
title: Optional[str] = None title: Optional[str] = None
link: Optional[str] = None link: Optional[str] = None
description: Optional[str]
presences: Optional[List[Presence]] presences: Optional[List[Presence]]
tags: Optional[List[Tag]] tags: Optional[List[Tag]]

@ -54,6 +54,7 @@ async def art(art: ArtnoID, id: int = None):
updated_art.link = art.link updated_art.link = art.link
updated_art.title = art.title updated_art.title = art.title
updated_art.path = art.path updated_art.path = art.path
updated_art.description = art.description
if art.presences is not None: if art.presences is not None:
updated_art.presences = art.presences updated_art.presences = art.presences

@ -9,10 +9,13 @@ from tests.createAPI.create_delete_presence import test_presence_entries, list_p
test_art_entries = [ test_art_entries = [
{"hash": "hash1", "path": "artist1/image1", "title": "Image Title 1", "link": "http://localhost/artist1/image1.png", {"hash": "hash1", "path": "artist1/image1", "title": "Image Title 1", "link": "http://localhost/artist1/image1.png",
"description": "description Nr. 1",
"presences": [(test_presence_entries[0]["name"], test_presence_entries[0]["domain"])]}, "presences": [(test_presence_entries[0]["name"], test_presence_entries[0]["domain"])]},
{"hash": "hash2", "path": "artist1/image2", "title": "Image Title 2", "link": "http://localhost/artist1/image2.png", {"hash": "hash2", "path": "artist1/image2", "title": "Image Title 2", "link": "http://localhost/artist1/image2.png",
"description": "description Nr. 2",
"presences": [(test_presence_entries[1]["name"], test_presence_entries[1]["domain"])]}, "presences": [(test_presence_entries[1]["name"], test_presence_entries[1]["domain"])]},
{"hash": "hash3", "path": "artist2/image1", "title": "Image Title 3", "link": "http://localhost/artist2/image3.png", {"hash": "hash3", "path": "artist2/image1", "title": "Image Title 3", "link": "http://localhost/artist2/image3.png",
"description": "description Nr. 3",
"presences": [(test_presence_entries[0]["name"], test_presence_entries[0]["domain"]), "presences": [(test_presence_entries[0]["name"], test_presence_entries[0]["domain"]),
(test_presence_entries[1]["name"], test_presence_entries[1]["domain"])]}, (test_presence_entries[1]["name"], test_presence_entries[1]["domain"])]},
] ]
@ -42,7 +45,7 @@ def create_art_entries(url: str, port: int):
for i in range(len(test_art_entries)): for i in range(len(test_art_entries)):
r = create_art(url, port, md5_hash=test_art_entries[i]["hash"], path=test_art_entries[i]["path"], r = create_art(url, port, md5_hash=test_art_entries[i]["hash"], path=test_art_entries[i]["path"],
title=test_art_entries[i]["title"], link=test_art_entries[i]["link"], title=test_art_entries[i]["title"], link=test_art_entries[i]["link"],
presences=test_art_entries[i]["presences"]) presences=test_art_entries[i]["presences"], description=test_art_entries[i]["description"])
if r.status_code != 200: if r.status_code != 200:
print(f"Create Art Entry Test Nr.{i}: failed with {r.status_code} and reason {r.text}") print(f"Create Art Entry Test Nr.{i}: failed with {r.status_code} and reason {r.text}")
raise Exception("Create Art Entry Test: FAILED") raise Exception("Create Art Entry Test: FAILED")
@ -57,7 +60,8 @@ def update_art_entries(url: str, port: int):
r = update_art(url, port, md5_hash=test_art_entries[i]["hash"]+"moreHash", r = update_art(url, port, md5_hash=test_art_entries[i]["hash"]+"moreHash",
path=test_art_entries[i]["path"]+"evenBetterPath", path=test_art_entries[i]["path"]+"evenBetterPath",
title=test_art_entries[i]["title"]+" updated", title=test_art_entries[i]["title"]+" updated",
presences=test_art_entries[i]["presences"], art_id=test_art_entries[i]["ID"]) presences=test_art_entries[i]["presences"], art_id=test_art_entries[i]["ID"],
description=test_art_entries[i]["description"]+" evenBetterDescription")
if r.status_code != 200: if r.status_code != 200:
print(f"Update Art Entry Test Nr.{i}: failed with {r.status_code} and reason {r.text}") print(f"Update Art Entry Test Nr.{i}: failed with {r.status_code} and reason {r.text}")
@ -65,10 +69,13 @@ def update_art_entries(url: str, port: int):
for i in range(len(test_art_entries)): for i in range(len(test_art_entries)):
r = requests.get(f"http://{url}:{port}/artnet/metadata/art?id={urllib.parse.quote(str(test_art_entries[i]['ID']))}") r = requests.get(f"http://{url}:{port}/artnet/metadata/art?id={urllib.parse.quote(str(test_art_entries[i]['ID']))}")
if json.loads(r.text)["title"].split(" ")[-1] != "updated": response = json.loads(r.text)
if response["title"].split(" ")[-1] != "updated":
raise Exception("Update Art Entry Test: Failed (unexpected or no updated title)") raise Exception("Update Art Entry Test: Failed (unexpected or no updated title)")
if json.loads(r.text)["link"] != test_art_entries[i]["link"]: if response["link"] != test_art_entries[i]["link"]:
raise Exception("Update Art Entry Test: Failed (unexpected link)") raise Exception("Update Art Entry Test: Failed (unexpected link)")
if response["description"].split(" ")[-1] != "evenBetterDescription":
raise Exception("Update Art Entry Test: Failed (unexpected description)")
print("Updated art entries: SUCCESS") print("Updated art entries: SUCCESS")
@ -88,16 +95,18 @@ def delete_art_entries(url: str, port: int):
print("Deleted art entries: SUCCESS") print("Deleted art entries: SUCCESS")
def create_art(url: str, port: int, md5_hash: str, path: str, title: str, link: str, presences: List[Tuple[str, str]]): def create_art(url: str, port: int, md5_hash: str, path: str, title: str, link: str, description: str,
presences: List[Tuple[str, str]]):
r = requests.post(f"http://{url}:{port}/artnet/metadata/art", r = requests.post(f"http://{url}:{port}/artnet/metadata/art",
json={"hash": md5_hash, "path": path, "title": title, "link": link, json={"hash": md5_hash, "path": path, "title": title, "link": link,
"presences": [{"name": presence[0], "domain": presence[1]} for presence in presences]}) "presences": [{"name": presence[0], "domain": presence[1]} for presence in presences],
"description": description})
return r return r
def update_art(url: str, port: int, art_id: int, md5_hash: str = None, path: str = None, title: str = None, def update_art(url: str, port: int, art_id: int, md5_hash: str = None, path: str = None, title: str = None,
link: str = None, presences: List[Tuple[str, str]] = None): link: str = None, description: str = None, presences: List[Tuple[str, str]] = None):
body = {} body = {}
if md5_hash is not None: if md5_hash is not None:
body["hash"] = md5_hash body["hash"] = md5_hash
@ -109,6 +118,8 @@ def update_art(url: str, port: int, art_id: int, md5_hash: str = None, path: str
body["link"] = link body["link"] = link
if presences is not None: if presences is not None:
body["presences"] = [{"name": presence[0], "domain": presence[1]} for presence in presences] body["presences"] = [{"name": presence[0], "domain": presence[1]} for presence in presences]
if description is not None:
body["description"] = description
r = requests.post(f"http://{url}:{port}/artnet/metadata/art?id={urllib.parse.quote(str(art_id))}", r = requests.post(f"http://{url}:{port}/artnet/metadata/art?id={urllib.parse.quote(str(art_id))}",
json=body) json=body)
@ -138,7 +149,7 @@ def run_art_test(url: str, port: int):
print() print()
print("----------------") print("----------------")
print(f"Starting presence test with " print(f"Starting art test with "
f"({len(list_artists(url, port))}) artists, ({len(list_presences(url, port))}) presences, " f"({len(list_artists(url, port))}) artists, ({len(list_presences(url, port))}) presences, "
f"({len(list_art(url, port))}) art!") f"({len(list_art(url, port))}) art!")
print("Setting up artist and presences for the art test ...") print("Setting up artist and presences for the art test ...")

Loading…
Cancel
Save