feat(gui): replace AI studio with product suite

This commit is contained in:
chengma
2026-07-14 09:53:13 +08:00
parent fb873aae90
commit bc115ba0d7
27 changed files with 3453 additions and 81 deletions
+143
View File
@@ -246,6 +246,149 @@ class ImageStudioImageTests(TempDirMixin, unittest.TestCase):
self.assert_removed(temp_dir)
def test_import_original_files_copies_valid_images_deduplicates_and_limits(self):
with self.make_temp_dir() as temp_dir:
db_path = os.path.join(temp_dir, "cmshopee.db")
db.init_db(db_path)
project = image_studio.create_or_get_project(
account_alias="alias",
account_slug="alias_slug",
item_id="51100639510",
path=db_path,
)
source = os.path.join(temp_dir, "商品图.png")
with open(source, "wb") as fh:
fh.write(self._png_bytes())
config = {
"data_dir": temp_dir,
"db_path": db_path,
"image_dir": os.path.join(temp_dir, "images"),
}
first = image_studio_images.import_original_files(
project.id,
[source],
path=db_path,
config=config,
)
duplicate = image_studio_images.import_original_files(
project.id,
[source],
path=db_path,
config=config,
)
self.assertEqual([], first["errors"])
self.assertEqual(first["assets"][0].id, duplicate["assets"][0].id)
self.assertNotEqual(os.path.abspath(source), first["assets"][0].local_path)
self.assertTrue(os.path.isfile(first["assets"][0].local_path))
with self.assertRaisesRegex(image_studio_images.ImageStudioImageError, "最多"):
image_studio_images.import_original_bytes(
project.id,
self._png_bytes(color=(10, 20, 30, 255)),
filename_hint="second.png",
path=db_path,
config=config,
max_assets=1,
)
self.assert_removed(temp_dir)
def test_import_original_ignores_missing_history_when_enforcing_limit(self):
with self.make_temp_dir() as temp_dir:
db_path = os.path.join(temp_dir, "cmshopee.db")
db.init_db(db_path)
project = image_studio.create_or_get_project(
account_alias="alias",
account_slug="alias_slug",
item_id="51100639510",
path=db_path,
)
config = {
"data_dir": temp_dir,
"db_path": db_path,
"image_dir": os.path.join(temp_dir, "images"),
}
first = image_studio_images.import_original_bytes(
project.id,
self._png_bytes(),
filename_hint="first.png",
path=db_path,
config=config,
max_assets=1,
)
image_studio.mark_asset_status(
first.id,
image_studio.ASSET_STATUS_MISSING,
path=db_path,
)
second = image_studio_images.import_original_bytes(
project.id,
self._png_bytes(color=(10, 20, 30, 255)),
filename_hint="second.png",
path=db_path,
config=config,
max_assets=1,
)
self.assertNotEqual(first.id, second.id)
self.assertEqual(image_studio.ASSET_STATUS_AVAILABLE, second.status)
self.assert_removed(temp_dir)
def test_generated_asset_trash_and_restore_keep_database_history(self):
with self.make_temp_dir() as temp_dir:
db_path = os.path.join(temp_dir, "cmshopee.db")
db.init_db(db_path)
project = image_studio.create_or_get_project(
account_alias="alias",
account_slug="alias_slug",
item_id="51100639510",
path=db_path,
)
config = {
"data_dir": temp_dir,
"db_path": db_path,
"image_dir": os.path.join(temp_dir, "images"),
}
generated_dir = image_studio.default_project_image_dirs(project, config=config)[
"generated"
]
os.makedirs(generated_dir, exist_ok=True)
generated_path = os.path.join(generated_dir, "result.png")
with open(generated_path, "wb") as fh:
fh.write(self._png_bytes())
asset = image_studio.add_asset(
project.id,
"generated_main",
local_path=generated_path,
path=db_path,
)
record = image_studio_images.trash_generated_asset(
asset.id,
path=db_path,
config=config,
)
trashed = image_studio.get_asset(asset.id, path=db_path)
self.assertEqual(image_studio.ASSET_STATUS_MISSING, trashed.status)
self.assertTrue(os.path.isfile(record["trash_path"]))
self.assertFalse(os.path.exists(generated_path))
restored = image_studio_images.restore_trashed_asset(
record,
path=db_path,
config=config,
)
self.assertEqual(asset.id, restored.id)
self.assertEqual(image_studio.ASSET_STATUS_AVAILABLE, restored.status)
self.assertTrue(os.path.isfile(restored.local_path))
self.assert_removed(temp_dir)
if __name__ == "__main__":
unittest.main()