series management tuning and import archive extraction troubleshooting
This commit is contained in:
+86
-6
@@ -1357,6 +1357,42 @@ def reapply_artist_tags_from_paths():
|
||||
return jsonify({'ok': False, 'error': str(e)}), 500
|
||||
|
||||
|
||||
@main.route('/api/cleanup-orphaned-tags', methods=['POST'])
|
||||
def cleanup_orphaned_tags():
|
||||
"""
|
||||
Delete tags that aren't attached to any images.
|
||||
Returns the count and names of deleted tags.
|
||||
"""
|
||||
from sqlalchemy import func
|
||||
|
||||
try:
|
||||
# Find tags with no associated images
|
||||
# A tag is orphaned if it has no entries in the image_tags junction table
|
||||
orphaned = (
|
||||
Tag.query
|
||||
.outerjoin(image_tags)
|
||||
.group_by(Tag.id)
|
||||
.having(func.count(image_tags.c.image_id) == 0)
|
||||
.all()
|
||||
)
|
||||
|
||||
deleted_tags = []
|
||||
for tag in orphaned:
|
||||
deleted_tags.append({'name': tag.name, 'kind': tag.kind})
|
||||
db.session.delete(tag)
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'ok': True,
|
||||
'deleted_count': len(deleted_tags),
|
||||
'deleted_tags': deleted_tags
|
||||
})
|
||||
except Exception as e:
|
||||
db.session.rollback()
|
||||
return jsonify({'ok': False, 'error': str(e)}), 500
|
||||
|
||||
|
||||
@main.route('/api/celery/status')
|
||||
def celery_cluster_status():
|
||||
"""
|
||||
@@ -1941,7 +1977,13 @@ def get_image_series_info(image_id):
|
||||
|
||||
@main.post('/api/image/<int:image_id>/add-to-series')
|
||||
def add_image_to_series(image_id):
|
||||
"""Add a single image to a series with a specific page number."""
|
||||
"""Add or update an image in a series with a specific page number.
|
||||
|
||||
Handles three cases:
|
||||
1. Image not in any series -> create new SeriesPage
|
||||
2. Image already in this series -> update page number
|
||||
3. Image in a different series -> move to new series
|
||||
"""
|
||||
from app.models import SeriesPage, Tag
|
||||
|
||||
data = request.get_json() or {}
|
||||
@@ -1961,14 +2003,48 @@ def add_image_to_series(image_id):
|
||||
return jsonify(ok=False, error="Tag is not a series"), 400
|
||||
|
||||
# Check if image is already in this series
|
||||
existing = SeriesPage.query.filter_by(
|
||||
existing_in_target = SeriesPage.query.filter_by(
|
||||
series_tag_id=series_tag_id,
|
||||
image_id=image_id
|
||||
).first()
|
||||
if existing:
|
||||
return jsonify(ok=False, error="Image already in this series"), 409
|
||||
|
||||
# Check if page number is taken
|
||||
# Check if image is in any other series
|
||||
existing_in_other = SeriesPage.query.filter(
|
||||
SeriesPage.image_id == image_id,
|
||||
SeriesPage.series_tag_id != series_tag_id
|
||||
).first()
|
||||
|
||||
if existing_in_target:
|
||||
# Case 2: Already in this series - update page number
|
||||
if existing_in_target.page_number == page_number:
|
||||
# No change needed
|
||||
return jsonify(ok=True, series_page={
|
||||
'id': existing_in_target.id,
|
||||
'page_number': existing_in_target.page_number,
|
||||
'series_tag_id': existing_in_target.series_tag_id,
|
||||
'series_name': series_tag.name
|
||||
})
|
||||
|
||||
# Check if new page number is taken by another image
|
||||
page_taken = SeriesPage.query.filter(
|
||||
SeriesPage.series_tag_id == series_tag_id,
|
||||
SeriesPage.page_number == page_number,
|
||||
SeriesPage.image_id != image_id
|
||||
).first()
|
||||
if page_taken:
|
||||
return jsonify(ok=False, error=f"Page {page_number} already exists in this series"), 409
|
||||
|
||||
existing_in_target.page_number = page_number
|
||||
db.session.commit()
|
||||
|
||||
return jsonify(ok=True, series_page={
|
||||
'id': existing_in_target.id,
|
||||
'page_number': existing_in_target.page_number,
|
||||
'series_tag_id': existing_in_target.series_tag_id,
|
||||
'series_name': series_tag.name
|
||||
})
|
||||
|
||||
# Check if page number is taken in target series
|
||||
page_taken = SeriesPage.query.filter_by(
|
||||
series_tag_id=series_tag_id,
|
||||
page_number=page_number
|
||||
@@ -1976,7 +2052,11 @@ def add_image_to_series(image_id):
|
||||
if page_taken:
|
||||
return jsonify(ok=False, error=f"Page {page_number} already exists in this series"), 409
|
||||
|
||||
# Create the series page
|
||||
if existing_in_other:
|
||||
# Case 3: In a different series - move to new series
|
||||
db.session.delete(existing_in_other)
|
||||
|
||||
# Case 1 & 3: Create new series page
|
||||
sp = SeriesPage(
|
||||
series_tag_id=series_tag_id,
|
||||
image_id=image_id,
|
||||
|
||||
Reference in New Issue
Block a user