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): ...@@ -924,23 +924,45 @@ class Migration_014_AddExtractionAndGameConfigTables(DatabaseMigration):
# Insert default extraction associations # Insert default extraction associations
default_associations = [ default_associations = [
('WIN1', 'WIN1', True), # DKO associations
('X1', 'WIN1', True), ('DRAW', 'DKO', True),
('K01', 'WIN1', True), ('X1', 'DKO', True),
('KO1', 'WIN1', True), ('X2', 'DKO', True),
('RET1', 'WIN1', True), ('DKO', 'DKO', True),
('PTS1', 'WIN1', True), # DRAW associations
('DRAW', 'X', True), ('DRAW', 'DRAW', True),
('12', 'X', True), ('X1', 'DRAW', True),
('X1', 'X', True), ('X2', 'DRAW', True),
('X2', 'X', True), # KO1 associations
('DKO', 'X', True), ('KO1', 'KO1', True),
('WIN2', 'WIN2', True), ('WIN1', 'KO1', True),
('X2', 'WIN2', True), ('X1', 'KO1', True),
('K02', 'WIN2', True), ('12', 'KO1', True),
('KO2', 'WIN2', True), # KO2 associations
('RET2', 'WIN2', True), ('KO2', 'KO2', True),
('PTS2', 'WIN2', 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: for outcome_name, extraction_result, is_default in default_associations:
...@@ -1845,14 +1867,12 @@ class Migration_024_AddResultOptionsTable(DatabaseMigration): ...@@ -1845,14 +1867,12 @@ class Migration_024_AddResultOptionsTable(DatabaseMigration):
default_results = [ default_results = [
('DRAW', 'Draw result', 1), ('DRAW', 'Draw result', 1),
('DKO', 'Double Knockout result', 2), ('DKO', 'Double Knockout result', 2),
('WIN1', 'Fighter 1 wins result', 3), ('RET1', 'Fighter 1 retires result', 3),
('WIN2', 'Fighter 2 wins result', 4), ('RET2', 'Fighter 2 retires result', 4),
('RET1', 'Fighter 1 retires result', 5), ('PTS1', 'Fighter 1 wins by points result', 5),
('RET2', 'Fighter 2 retires result', 6), ('PTS2', 'Fighter 2 wins by points result', 6),
('PTS1', 'Fighter 1 wins by points result', 7), ('KO1', 'Fighter 1 wins by KO result', 7),
('PTS2', 'Fighter 2 wins by points result', 8), ('KO2', 'Fighter 2 wins by KO result', 8),
('KO1', 'Fighter 1 wins by KO result', 9),
('KO2', 'Fighter 2 wins by KO result', 10),
] ]
for result_name, description, sort_order in default_results: for result_name, description, sort_order in default_results:
......
...@@ -2740,47 +2740,6 @@ def get_extraction_associations(): ...@@ -2740,47 +2740,6 @@ def get_extraction_associations():
associations = session.query(ExtractionAssociationModel).all() associations = session.query(ExtractionAssociationModel).all()
associations_data = [assoc.to_dict() for assoc in associations] 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({ return jsonify({
"success": True, "success": True,
"associations": associations_data, "associations": associations_data,
...@@ -3495,9 +3454,9 @@ def add_available_bet(): ...@@ -3495,9 +3454,9 @@ def add_available_bet():
@api_bp.route('/extraction/available-bets/delete', methods=['POST']) @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 @api_bp.auth_manager.require_auth if hasattr(api_bp, 'auth_manager') and api_bp.auth_manager else login_required
def delete_available_bet(): def delete_available_bet():
"""Delete an available bet""" """Delete an available bet and all associated associations"""
try: try:
from ..database.models import AvailableBetModel from ..database.models import AvailableBetModel, ExtractionAssociationModel
data = request.get_json() or {} data = request.get_json() or {}
bet_name = data.get('bet_name', '').strip().upper() bet_name = data.get('bet_name', '').strip().upper()
...@@ -3512,15 +3471,21 @@ def delete_available_bet(): ...@@ -3512,15 +3471,21 @@ def delete_available_bet():
if not bet: if not bet:
return jsonify({"error": f"Bet '{bet_name}' not found"}), 404 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 # Delete the bet
session.delete(bet) session.delete(bet)
session.commit() 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({ return jsonify({
"success": True, "success": True,
"message": f"Bet '{bet_name}' deleted successfully" "message": f"Bet '{bet_name}' deleted successfully",
"associations_removed": associations_deleted
}) })
finally: finally:
...@@ -3615,9 +3580,9 @@ def add_result_option(): ...@@ -3615,9 +3580,9 @@ def add_result_option():
@api_bp.route('/extraction/result-options/delete', methods=['POST']) @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 @api_bp.auth_manager.require_auth if hasattr(api_bp, 'auth_manager') and api_bp.auth_manager else login_required
def delete_result_option(): def delete_result_option():
"""Delete a result option""" """Delete a result option and all associated associations"""
try: try:
from ..database.models import ResultOptionModel from ..database.models import ResultOptionModel, ExtractionAssociationModel
data = request.get_json() or {} data = request.get_json() or {}
result_name = data.get('result_name', '').strip().upper() result_name = data.get('result_name', '').strip().upper()
...@@ -3632,15 +3597,21 @@ def delete_result_option(): ...@@ -3632,15 +3597,21 @@ def delete_result_option():
if not option: if not option:
return jsonify({"error": f"Result option '{result_name}' not found"}), 404 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 # Delete the result option
session.delete(option) session.delete(option)
session.commit() 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({ return jsonify({
"success": True, "success": True,
"message": f"Result option '{result_name}' deleted successfully" "message": f"Result option '{result_name}' deleted successfully",
"associations_removed": associations_deleted
}) })
finally: 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