series management tuning and import archive extraction troubleshooting

This commit is contained in:
Bryan Van Deusen
2026-01-23 23:05:25 -05:00
parent d3e73b9533
commit 9ebeeed133
7 changed files with 373 additions and 77 deletions
+86 -6
View File
@@ -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,