Fix extraction associations display in web interface

- Fixed displayAssociations() and createOutcomeColumns() functions to properly group associations by extraction_result instead of outcome_name
- This ensures all extraction associations are correctly displayed in their respective columns in the extraction management interface
parent bbd677ff
......@@ -924,23 +924,45 @@ class Migration_014_AddExtractionAndGameConfigTables(DatabaseMigration):
# Insert default extraction associations
default_associations = [
('WIN1', 'WIN1', True),
('X1', 'WIN1', True),
('K01', 'WIN1', True),
('KO1', 'WIN1', True),
('RET1', 'WIN1', True),
('PTS1', 'WIN1', True),
('DRAW', 'X', True),
('12', 'X', True),
('X1', 'X', True),
('X2', 'X', True),
('DKO', 'X', True),
('WIN2', 'WIN2', True),
('X2', 'WIN2', True),
('K02', 'WIN2', True),
('KO2', 'WIN2', True),
('RET2', 'WIN2', True),
('PTS2', 'WIN2', True),
# DKO associations
('DRAW', 'DKO', True),
('X1', 'DKO', True),
('X2', 'DKO', True),
('DKO', 'DKO', True),
# DRAW associations
('DRAW', 'DRAW', True),
('X1', 'DRAW', True),
('X2', 'DRAW', True),
# KO1 associations
('KO1', 'KO1', True),
('WIN1', 'KO1', True),
('X1', 'KO1', True),
('12', 'KO1', True),
# KO2 associations
('KO2', 'KO2', True),
('WIN2', 'KO2', True),
('X2', 'KO2', True),
('12', 'KO2', True),
# PTS1 associations
('X1', 'PTS1', True),
('12', 'PTS1', True),
('PTS1', 'PTS1', True),
('WIN1', 'PTS1', True),
# PTS2 associations
('X2', 'PTS2', True),
('12', 'PTS2', True),
('PTS2', 'PTS2', True),
('WIN2', 'PTS2', True),
# RET1 associations
('WIN2', 'RET1', True),
('X2', 'RET1', True),
('12', 'RET1', True),
('RET1', 'RET1', True),
# RET2 associations
('WIN1', 'RET2', True),
('X1', 'RET2', True),
('12', 'RET2', True),
('RET2', 'RET2', True),
]
for outcome_name, extraction_result, is_default in default_associations:
......@@ -1845,14 +1867,12 @@ class Migration_024_AddResultOptionsTable(DatabaseMigration):
default_results = [
('DRAW', 'Draw result', 1),
('DKO', 'Double Knockout result', 2),
('WIN1', 'Fighter 1 wins result', 3),
('WIN2', 'Fighter 2 wins result', 4),
('RET1', 'Fighter 1 retires result', 5),
('RET2', 'Fighter 2 retires result', 6),
('PTS1', 'Fighter 1 wins by points result', 7),
('PTS2', 'Fighter 2 wins by points result', 8),
('KO1', 'Fighter 1 wins by KO result', 9),
('KO2', 'Fighter 2 wins by KO result', 10),
('RET1', 'Fighter 1 retires result', 3),
('RET2', 'Fighter 2 retires result', 4),
('PTS1', 'Fighter 1 wins by points result', 5),
('PTS2', 'Fighter 2 wins by points result', 6),
('KO1', 'Fighter 1 wins by KO result', 7),
('KO2', 'Fighter 2 wins by KO result', 8),
]
for result_name, description, sort_order in default_results:
......
......@@ -2740,47 +2740,6 @@ def get_extraction_associations():
associations = session.query(ExtractionAssociationModel).all()
associations_data = [assoc.to_dict() for assoc in associations]
# Apply default associations if none exist
if not associations_data:
# Get available outcomes from database
available_outcomes_query = session.query(MatchOutcomeModel.column_name).distinct()
available_outcomes = [row[0] for row in available_outcomes_query.all()]
# Define default associations
default_associations = {
'DRAW': ['X1', 'X2'],
'DKO': ['DRAW', 'X1', 'X2'],
'KO1': ['WIN1', 'X1', '12'],
'KO2': ['WIN2', 'X2', '12'],
'PTS1': ['WIN1', 'X1', '12'],
'PTS2': ['WIN2', 'X2', '12'],
'RET1': ['WIN1', 'X1', '12'],
'RET2': ['WIN2', 'X2', '12']
}
# Create default associations for outcomes that exist in database
created_associations = []
for outcome_name, extraction_results in default_associations.items():
if outcome_name in available_outcomes:
for extraction_result in extraction_results:
if extraction_result in available_outcomes:
association = ExtractionAssociationModel(
outcome_name=outcome_name,
extraction_result=extraction_result,
is_default=True
)
session.add(association)
created_associations.append({
'outcome_name': outcome_name,
'extraction_result': extraction_result,
'is_default': True
})
if created_associations:
session.commit()
logger.info(f"Applied {len(created_associations)} default extraction associations")
associations_data = created_associations
return jsonify({
"success": True,
"associations": associations_data,
......@@ -3495,9 +3454,9 @@ def add_available_bet():
@api_bp.route('/extraction/available-bets/delete', methods=['POST'])
@api_bp.auth_manager.require_auth if hasattr(api_bp, 'auth_manager') and api_bp.auth_manager else login_required
def delete_available_bet():
"""Delete an available bet"""
"""Delete an available bet and all associated associations"""
try:
from ..database.models import AvailableBetModel
from ..database.models import AvailableBetModel, ExtractionAssociationModel
data = request.get_json() or {}
bet_name = data.get('bet_name', '').strip().upper()
......@@ -3512,15 +3471,21 @@ def delete_available_bet():
if not bet:
return jsonify({"error": f"Bet '{bet_name}' not found"}), 404
# Delete all associations that use this bet as extraction_result
associations_deleted = session.query(ExtractionAssociationModel).filter_by(
extraction_result=bet_name
).delete()
# Delete the bet
session.delete(bet)
session.commit()
logger.info(f"Deleted available bet: {bet_name}")
logger.info(f"Deleted available bet: {bet_name} and {associations_deleted} associated associations")
return jsonify({
"success": True,
"message": f"Bet '{bet_name}' deleted successfully"
"message": f"Bet '{bet_name}' deleted successfully",
"associations_removed": associations_deleted
})
finally:
......@@ -3615,9 +3580,9 @@ def add_result_option():
@api_bp.route('/extraction/result-options/delete', methods=['POST'])
@api_bp.auth_manager.require_auth if hasattr(api_bp, 'auth_manager') and api_bp.auth_manager else login_required
def delete_result_option():
"""Delete a result option"""
"""Delete a result option and all associated associations"""
try:
from ..database.models import ResultOptionModel
from ..database.models import ResultOptionModel, ExtractionAssociationModel
data = request.get_json() or {}
result_name = data.get('result_name', '').strip().upper()
......@@ -3632,15 +3597,21 @@ def delete_result_option():
if not option:
return jsonify({"error": f"Result option '{result_name}' not found"}), 404
# Delete all associations that use this result option
associations_deleted = session.query(ExtractionAssociationModel).filter_by(
extraction_result=result_name
).delete()
# Delete the result option
session.delete(option)
session.commit()
logger.info(f"Deleted result option: {result_name}")
logger.info(f"Deleted result option: {result_name} and {associations_deleted} associated associations")
return jsonify({
"success": True,
"message": f"Result option '{result_name}' deleted successfully"
"message": f"Result option '{result_name}' deleted successfully",
"associations_removed": associations_deleted
})
finally:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment