diff --git a/app/config.py b/app/config.py index a0c50fe..8ff067a 100644 --- a/app/config.py +++ b/app/config.py @@ -10,4 +10,4 @@ class Config: SECRET_KEY = os.getenv('SECRET_KEY', 'your-secret-key-for-sessions') DEBUG = os.getenv('DEBUG', 'False').lower() == 'true' HOST = os.getenv('HOST', '0.0.0.0') - PORT = int(os.getenv('PORT', 5000)) + PORT = int(os.getenv('PORT', 5001)) diff --git a/app/models.py b/app/models.py index 0d570f0..1640b76 100644 --- a/app/models.py +++ b/app/models.py @@ -131,7 +131,8 @@ class Tournament: 'name': player['name'], 'targets': targets, 'total_score': 0, - 'completed': False + 'completed': False, + 'joker_selected': False # Track if joker was selected in calculator } return results diff --git a/data/camera_settings.json b/data/camera_settings.json index af4f44b..81fd99c 100644 --- a/data/camera_settings.json +++ b/data/camera_settings.json @@ -9,7 +9,7 @@ }, "display_options": { "show_titles": true, - "title_size": 1.2, - "target_number_size": 1.4 + "title_size": 1.4, + "target_number_size": 1.7 } } \ No newline at end of file diff --git a/data/league_archives/league_20251115_093906.json b/data/league_archives/league_20251115_093906.json new file mode 100644 index 0000000..abdd081 --- /dev/null +++ b/data/league_archives/league_20251115_093906.json @@ -0,0 +1,134 @@ +{ + "league": { + "league_id": "league_20251115_093831", + "created_at": "2025-11-15T09:38:31.193555", + "tournament_type": "20_targets", + "total_tournaments": 5, + "current_tournament": 0, + "participants": { + "1": { + "name": "Domen Pleterski", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "5": { + "name": "Jože Verhnjak", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "7": { + "name": "Branko Pokeržnik", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "9": { + "name": "Janez Božič", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "10": { + "name": "Mitja Čeh", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "11": { + "name": "Rado Kefer", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "14": { + "name": "Karli Proje", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "15": { + "name": "Jan Pleterski", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "16": { + "name": "Silvo Poročnik", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "17": { + "name": "Dušan Onuk", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "18": { + "name": "Matjaž Pleterski", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "22": { + "name": "Doris Fesel", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "24": { + "name": "Jože Verdinek", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "50": { + "name": "Vid Ravnjak", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "51": { + "name": "Robi Ovčar", + "joker_used": false, + "tournament_results": [], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + } + }, + "completed_tournaments": [], + "league_finished": false + }, + "archived_at": "2025-11-15T09:39:06.974580" +} \ No newline at end of file diff --git a/data/league_state.json b/data/league_state.json new file mode 100644 index 0000000..61ca278 --- /dev/null +++ b/data/league_state.json @@ -0,0 +1,457 @@ +{ + "league_id": "league_20251115_094741", + "created_at": "2025-11-15T09:47:41.711914", + "tournament_type": "20_targets", + "total_tournaments": 5, + "current_tournament": 3, + "participants": { + "1": { + "name": "Domen Pleterski", + "joker_used": true, + "tournament_results": [ + { + "tournament": 1, + "score": 320, + "tens_count": 3, + "participated": true + }, + { + "tournament": 2, + "score": 0, + "tens_count": 0, + "participated": false, + "joker": true + }, + { + "tournament": 3, + "score": 320, + "tens_count": 2, + "participated": true + } + ], + "total_score": 640, + "final_score": 0, + "tournaments_participated": 0 + }, + "5": { + "name": "Jože Verhnjak", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 295, + "tens_count": 2, + "participated": true + }, + { + "tournament": 2, + "score": 293, + "tens_count": 3, + "participated": true + }, + { + "tournament": 3, + "score": 293, + "tens_count": 2, + "participated": true + } + ], + "total_score": 881, + "final_score": 0, + "tournaments_participated": 0 + }, + "7": { + "name": "Branko Pokeržnik", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 316, + "tens_count": 1, + "participated": true + }, + { + "tournament": 2, + "score": 332, + "tens_count": 3, + "participated": true + }, + { + "tournament": 3, + "score": 318, + "tens_count": 1, + "participated": true + } + ], + "total_score": 966, + "final_score": 0, + "tournaments_participated": 0 + }, + "9": { + "name": "Janez Božič", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 264, + "tens_count": 2, + "participated": true + }, + { + "tournament": 2, + "score": 276, + "tens_count": 0, + "participated": true + }, + { + "tournament": 3, + "score": 261, + "tens_count": 1, + "participated": true + } + ], + "total_score": 801, + "final_score": 0, + "tournaments_participated": 0 + }, + "10": { + "name": "Mitja Čeh", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 329, + "tens_count": 1, + "participated": true + }, + { + "tournament": 2, + "score": 312, + "tens_count": 4, + "participated": true + }, + { + "tournament": 3, + "score": 307, + "tens_count": 2, + "participated": true + } + ], + "total_score": 948, + "final_score": 0, + "tournaments_participated": 0 + }, + "11": { + "name": "Rado Kefer", + "joker_used": true, + "tournament_results": [ + { + "tournament": 1, + "score": 275, + "tens_count": 0, + "participated": true + }, + { + "tournament": 2, + "score": 0, + "tens_count": 0, + "participated": false, + "joker": true + }, + { + "tournament": 3, + "score": 314, + "tens_count": 3, + "participated": true + } + ], + "total_score": 589, + "final_score": 0, + "tournaments_participated": 0 + }, + "14": { + "name": "Karli Proje", + "joker_used": true, + "tournament_results": [ + { + "tournament": 1, + "score": 0, + "tens_count": 0, + "participated": false, + "joker": true + }, + { + "tournament": 2, + "score": 0, + "tens_count": 0, + "participated": true + }, + { + "tournament": 3, + "score": 0, + "tens_count": 0, + "participated": true + } + ], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "15": { + "name": "Jan Pleterski", + "joker_used": true, + "tournament_results": [ + { + "tournament": 1, + "score": 269, + "tens_count": 1, + "participated": true + }, + { + "tournament": 2, + "score": 0, + "tens_count": 0, + "participated": false, + "joker": true + }, + { + "tournament": 3, + "score": 267, + "tens_count": 1, + "participated": true + } + ], + "total_score": 536, + "final_score": 0, + "tournaments_participated": 0 + }, + "16": { + "name": "Silvo Poročnik", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 293, + "tens_count": 3, + "participated": true + }, + { + "tournament": 2, + "score": 278, + "tens_count": 3, + "participated": true + }, + { + "tournament": 3, + "score": 282, + "tens_count": 3, + "participated": true + } + ], + "total_score": 853, + "final_score": 0, + "tournaments_participated": 0 + }, + "17": { + "name": "Dušan Onuk", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 313, + "tens_count": 4, + "participated": true + }, + { + "tournament": 2, + "score": 325, + "tens_count": 2, + "participated": true + }, + { + "tournament": 3, + "score": 192, + "tens_count": 3, + "participated": true + } + ], + "total_score": 830, + "final_score": 0, + "tournaments_participated": 0 + }, + "18": { + "name": "Matjaž Pleterski", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 280, + "tens_count": 2, + "participated": true + }, + { + "tournament": 2, + "score": 276, + "tens_count": 4, + "participated": true + }, + { + "tournament": 3, + "score": 307, + "tens_count": 0, + "participated": true + } + ], + "total_score": 863, + "final_score": 0, + "tournaments_participated": 0 + }, + "22": { + "name": "Doris Fesel", + "joker_used": true, + "tournament_results": [ + { + "tournament": 1, + "score": 0, + "tens_count": 0, + "participated": false, + "joker": true + }, + { + "tournament": 2, + "score": 0, + "tens_count": 0, + "participated": true + }, + { + "tournament": 3, + "score": 0, + "tens_count": 0, + "participated": true + } + ], + "total_score": 0, + "final_score": 0, + "tournaments_participated": 0 + }, + "24": { + "name": "Jože Verdinek", + "joker_used": false, + "tournament_results": [ + { + "tournament": 1, + "score": 311, + "tens_count": 5, + "participated": true + }, + { + "tournament": 2, + "score": 315, + "tens_count": 5, + "participated": true + }, + { + "tournament": 3, + "score": 312, + "tens_count": 2, + "participated": true + } + ], + "total_score": 938, + "final_score": 0, + "tournaments_participated": 0 + }, + "50": { + "name": "Vid Ravnjak", + "joker_used": true, + "tournament_results": [ + { + "tournament": 1, + "score": 302, + "tens_count": 6, + "participated": true + }, + { + "tournament": 2, + "score": 309, + "tens_count": 4, + "participated": true + }, + { + "tournament": 3, + "score": 0, + "tens_count": 0, + "participated": false, + "joker": true + } + ], + "total_score": 611, + "final_score": 0, + "tournaments_participated": 0 + }, + "51": { + "name": "Robi Ovčar", + "joker_used": true, + "tournament_results": [ + { + "tournament": 1, + "score": 269, + "tens_count": 1, + "participated": true + }, + { + "tournament": 2, + "score": 0, + "tens_count": 0, + "participated": false, + "joker": true + }, + { + "tournament": 3, + "score": 265, + "tens_count": 1, + "participated": true + } + ], + "total_score": 534, + "final_score": 0, + "tournaments_participated": 0 + } + }, + "completed_tournaments": [ + { + "tournament_number": 1, + "tournament_type": "20_targets", + "finished_at": "2025-11-15T11:50:43.358782", + "results_summary": { + "participants": 15, + "shots_per_participant": 40, + "total_shots": 600, + "format_description": "20 Targets (2 shots each)" + } + }, + { + "tournament_number": 2, + "tournament_type": "20_targets", + "finished_at": "2025-12-13T12:13:29.550924", + "results_summary": { + "participants": 12, + "shots_per_participant": 40, + "total_shots": 480, + "format_description": "20 Targets (2 shots each)" + } + }, + { + "tournament_number": 3, + "tournament_type": "20_targets", + "finished_at": "2026-01-10T11:34:15.800129", + "results_summary": { + "participants": 14, + "shots_per_participant": 40, + "total_shots": 560, + "format_description": "20 Targets (2 shots each)" + } + } + ], + "league_finished": false +} \ No newline at end of file diff --git a/data/players.json b/data/players.json index 682bd6f..2e5e5a9 100644 --- a/data/players.json +++ b/data/players.json @@ -8,17 +8,17 @@ { "id": 2, "name": "Nik Pleterski", - "enabled": true + "enabled": false }, { "id": 3, "name": "Ivan Tandler", - "enabled": true + "enabled": false }, { "id": 4, "name": "Mateja Pleterski", - "enabled": true + "enabled": false }, { "id": 5, @@ -28,7 +28,7 @@ { "id": 6, "name": "Mateja Senica", - "enabled": true + "enabled": false }, { "id": 7, @@ -38,7 +38,7 @@ { "id": 8, "name": "Franc Žigart", - "enabled": true + "enabled": false }, { "id": 9, @@ -58,12 +58,12 @@ { "id": 12, "name": "Matej Kvasnik", - "enabled": true + "enabled": false }, { "id": 13, "name": "Angelca Mrak", - "enabled": true + "enabled": false }, { "id": 14, @@ -93,17 +93,17 @@ { "id": 19, "name": "Franc Rizmal", - "enabled": true + "enabled": false }, { "id": 20, "name": "Jože Preglav", - "enabled": true + "enabled": false }, { "id": 21, "name": "Marko Blimen", - "enabled": true + "enabled": false }, { "id": 22, @@ -113,7 +113,7 @@ { "id": 23, "name": "Robi Krautberger", - "enabled": true + "enabled": false }, { "id": 24, @@ -123,126 +123,136 @@ { "id": 25, "name": "Andrej Herman", - "enabled": true + "enabled": false }, { "id": 26, "name": "Jakob Herman", - "enabled": true + "enabled": false }, { "id": 27, "name": "Janez Mrak", - "enabled": true + "enabled": false }, { "id": 28, "name": "Anže Kolar", - "enabled": true + "enabled": false }, { "id": 29, "name": "Alen Kolar", - "enabled": true + "enabled": false }, { "id": 30, "name": "Maja Hirtl", - "enabled": true + "enabled": false }, { "id": 31, "name": "Dejan Kučnik", - "enabled": true + "enabled": false }, { "id": 32, "name": "David Strniša", - "enabled": true + "enabled": false }, { "id": 33, "name": "Namir Uzunović", - "enabled": true + "enabled": false }, { "id": 34, "name": "Jože Planinšec", - "enabled": true + "enabled": false }, { "id": 35, "name": "Vanja Kolar", - "enabled": true + "enabled": false }, { "id": 36, "name": "Klara Wankmuller", - "enabled": true + "enabled": false }, { "id": 37, "name": "Milan Stramec", - "enabled": true + "enabled": false }, { "id": 38, "name": "Bojan Sudar", - "enabled": true + "enabled": false }, { "id": 39, "name": "Tia Sudar", - "enabled": true + "enabled": false }, { "id": 40, "name": "Jaka Cvar", - "enabled": true + "enabled": false }, { "id": 41, "name": "Tadej Štruc", - "enabled": true + "enabled": false }, { "id": 42, "name": "Jure Glaser", - "enabled": true + "enabled": false }, { "id": 43, "name": "Marko Pokržnik", - "enabled": true + "enabled": false }, { "id": 44, "name": "Anka Kačnik", - "enabled": true + "enabled": false }, { "id": 45, "name": "Lidija Blimen", - "enabled": true + "enabled": false }, { "id": 46, "name": "Tijana Štumpfl", - "enabled": true + "enabled": false }, { "id": 47, "name": "Ljuba Mršak", - "enabled": true + "enabled": false }, { "id": 48, "name": "Janja Salcman", - "enabled": true + "enabled": false }, { "id": 49, "name": "Jolanda Verhnjak", + "enabled": false + }, + { + "id": 50, + "name": "Vid Ravnjak", + "enabled": true + }, + { + "id": 51, + "name": "Robi Ovčar", "enabled": true } ] diff --git a/data/tournament_results.json b/data/tournament_results.json new file mode 100644 index 0000000..8a9718f --- /dev/null +++ b/data/tournament_results.json @@ -0,0 +1,1242 @@ +{ + "tournament_id": "2026-01-10T09:59:15.945867", + "tournament_type": "20_targets", + "participants": { + "1": { + "name": "Domen Pleterski", + "targets": { + "1": { + "shot1": 6, + "shot2": 5 + }, + "2": { + "shot1": 8, + "shot2": 8 + }, + "3": { + "shot1": 9, + "shot2": 6 + }, + "4": { + "shot1": 9, + "shot2": 7 + }, + "5": { + "shot1": 9, + "shot2": 9 + }, + "6": { + "shot1": 10, + "shot2": 8 + }, + "7": { + "shot1": 9, + "shot2": 8 + }, + "8": { + "shot1": 8, + "shot2": 8 + }, + "9": { + "shot1": 9, + "shot2": 8 + }, + "10": { + "shot1": 9, + "shot2": 8 + }, + "11": { + "shot1": 8, + "shot2": 7 + }, + "12": { + "shot1": 10, + "shot2": 9 + }, + "13": { + "shot1": 9, + "shot2": 9 + }, + "14": { + "shot1": 8, + "shot2": 7 + }, + "15": { + "shot1": 8, + "shot2": 8 + }, + "16": { + "shot1": 9, + "shot2": 6 + }, + "17": { + "shot1": 8, + "shot2": 6 + }, + "18": { + "shot1": 7, + "shot2": 8 + }, + "19": { + "shot1": 9, + "shot2": 7 + }, + "20": { + "shot1": 9, + "shot2": 7 + } + }, + "total_score": 320, + "completed": true, + "joker_selected": false + }, + "10": { + "name": "Mitja Čeh", + "targets": { + "1": { + "shot1": 9, + "shot2": 8 + }, + "2": { + "shot1": 9, + "shot2": 7 + }, + "3": { + "shot1": 10, + "shot2": 9 + }, + "4": { + "shot1": 9, + "shot2": 7 + }, + "5": { + "shot1": 8, + "shot2": 8 + }, + "6": { + "shot1": 7, + "shot2": 5 + }, + "7": { + "shot1": 8, + "shot2": 7 + }, + "8": { + "shot1": 8, + "shot2": 5 + }, + "9": { + "shot1": 8, + "shot2": 7 + }, + "10": { + "shot1": 9, + "shot2": 8 + }, + "11": { + "shot1": 10, + "shot2": 8 + }, + "12": { + "shot1": 8, + "shot2": 0 + }, + "13": { + "shot1": 9, + "shot2": 9 + }, + "14": { + "shot1": 8, + "shot2": 8 + }, + "15": { + "shot1": 9, + "shot2": 8 + }, + "16": { + "shot1": 9, + "shot2": 7 + }, + "17": { + "shot1": 7, + "shot2": 5 + }, + "18": { + "shot1": 9, + "shot2": 7 + }, + "19": { + "shot1": 7, + "shot2": 7 + }, + "20": { + "shot1": 9, + "shot2": 7 + } + }, + "total_score": 307, + "completed": true, + "joker_selected": false + }, + "22": { + "name": "Doris Fesel", + "targets": { + "1": { + "shot1": 0, + "shot2": 0 + }, + "2": { + "shot1": 0, + "shot2": 0 + }, + "3": { + "shot1": 0, + "shot2": 0 + }, + "4": { + "shot1": 0, + "shot2": 0 + }, + "5": { + "shot1": 0, + "shot2": 0 + }, + "6": { + "shot1": 0, + "shot2": 0 + }, + "7": { + "shot1": 0, + "shot2": 0 + }, + "8": { + "shot1": 0, + "shot2": 0 + }, + "9": { + "shot1": 0, + "shot2": 0 + }, + "10": { + "shot1": 0, + "shot2": 0 + }, + "11": { + "shot1": 0, + "shot2": 0 + }, + "12": { + "shot1": 0, + "shot2": 0 + }, + "13": { + "shot1": 0, + "shot2": 0 + }, + "14": { + "shot1": 0, + "shot2": 0 + }, + "15": { + "shot1": 0, + "shot2": 0 + }, + "16": { + "shot1": 0, + "shot2": 0 + }, + "17": { + "shot1": 0, + "shot2": 0 + }, + "18": { + "shot1": 0, + "shot2": 0 + }, + "19": { + "shot1": 0, + "shot2": 0 + }, + "20": { + "shot1": 0, + "shot2": 0 + } + }, + "total_score": 0, + "completed": true, + "joker_selected": false + }, + "18": { + "name": "Matjaž Pleterski", + "targets": { + "1": { + "shot1": 9, + "shot2": 7 + }, + "2": { + "shot1": 9, + "shot2": 8 + }, + "3": { + "shot1": 8, + "shot2": 8 + }, + "4": { + "shot1": 9, + "shot2": 9 + }, + "5": { + "shot1": 8, + "shot2": 6 + }, + "6": { + "shot1": 8, + "shot2": 7 + }, + "7": { + "shot1": 9, + "shot2": 8 + }, + "8": { + "shot1": 8, + "shot2": 4 + }, + "9": { + "shot1": 9, + "shot2": 5 + }, + "10": { + "shot1": 8, + "shot2": 4 + }, + "11": { + "shot1": 9, + "shot2": 7 + }, + "12": { + "shot1": 8, + "shot2": 8 + }, + "13": { + "shot1": 8, + "shot2": 7 + }, + "14": { + "shot1": 8, + "shot2": 8 + }, + "15": { + "shot1": 9, + "shot2": 7 + }, + "16": { + "shot1": 8, + "shot2": 8 + }, + "17": { + "shot1": 9, + "shot2": 9 + }, + "18": { + "shot1": 7, + "shot2": 5 + }, + "19": { + "shot1": 8, + "shot2": 7 + }, + "20": { + "shot1": 9, + "shot2": 7 + } + }, + "total_score": 307, + "completed": true, + "joker_selected": false + }, + "17": { + "name": "Dušan Onuk", + "targets": { + "1": { + "shot1": 8, + "shot2": 8 + }, + "2": { + "shot1": 10, + "shot2": 7 + }, + "3": { + "shot1": 9, + "shot2": 8 + }, + "4": { + "shot1": 8, + "shot2": 6 + }, + "5": { + "shot1": 6, + "shot2": 7 + }, + "6": { + "shot1": 9, + "shot2": 8 + }, + "7": { + "shot1": 7, + "shot2": 7 + }, + "8": { + "shot1": 10, + "shot2": 8 + }, + "9": { + "shot1": 9, + "shot2": 7 + }, + "10": { + "shot1": 10, + "shot2": 4 + }, + "11": { + "shot1": 7, + "shot2": 7 + }, + "12": { + "shot1": 9, + "shot2": 1 + }, + "13": { + "shot1": 8, + "shot2": 4 + }, + "14": { + "shot1": 0, + "shot2": 0 + }, + "15": { + "shot1": 0, + "shot2": 0 + }, + "16": { + "shot1": 0, + "shot2": 0 + }, + "17": { + "shot1": 0, + "shot2": 0 + }, + "18": { + "shot1": 0, + "shot2": 0 + }, + "19": { + "shot1": 0, + "shot2": 0 + }, + "20": { + "shot1": 0, + "shot2": 0 + } + }, + "total_score": 192, + "completed": true, + "joker_selected": false + }, + "15": { + "name": "Jan Pleterski", + "targets": { + "1": { + "shot1": 9, + "shot2": 8 + }, + "2": { + "shot1": 7, + "shot2": 5 + }, + "3": { + "shot1": 7, + "shot2": 6 + }, + "4": { + "shot1": 8, + "shot2": 2 + }, + "5": { + "shot1": 7, + "shot2": 4 + }, + "6": { + "shot1": 7, + "shot2": 3 + }, + "7": { + "shot1": 6, + "shot2": 6 + }, + "8": { + "shot1": 8, + "shot2": 6 + }, + "9": { + "shot1": 8, + "shot2": 1 + }, + "10": { + "shot1": 9, + "shot2": 9 + }, + "11": { + "shot1": 8, + "shot2": 6 + }, + "12": { + "shot1": 9, + "shot2": 7 + }, + "13": { + "shot1": 9, + "shot2": 3 + }, + "14": { + "shot1": 9, + "shot2": 3 + }, + "15": { + "shot1": 8, + "shot2": 7 + }, + "16": { + "shot1": 7, + "shot2": 4 + }, + "17": { + "shot1": 10, + "shot2": 6 + }, + "18": { + "shot1": 8, + "shot2": 7 + }, + "19": { + "shot1": 8, + "shot2": 8 + }, + "20": { + "shot1": 9, + "shot2": 5 + } + }, + "total_score": 267, + "completed": true, + "joker_selected": false + }, + "51": { + "name": "Robi Ovčar", + "targets": { + "1": { + "shot1": 9, + "shot2": 7 + }, + "2": { + "shot1": 9, + "shot2": 4 + }, + "3": { + "shot1": 4, + "shot2": 1 + }, + "4": { + "shot1": 7, + "shot2": 6 + }, + "5": { + "shot1": 7, + "shot2": 6 + }, + "6": { + "shot1": 6, + "shot2": 2 + }, + "7": { + "shot1": 9, + "shot2": 5 + }, + "8": { + "shot1": 9, + "shot2": 8 + }, + "9": { + "shot1": 4, + "shot2": 4 + }, + "10": { + "shot1": 9, + "shot2": 9 + }, + "11": { + "shot1": 8, + "shot2": 6 + }, + "12": { + "shot1": 8, + "shot2": 8 + }, + "13": { + "shot1": 8, + "shot2": 4 + }, + "14": { + "shot1": 10, + "shot2": 8 + }, + "15": { + "shot1": 4, + "shot2": 2 + }, + "16": { + "shot1": 9, + "shot2": 7 + }, + "17": { + "shot1": 9, + "shot2": 6 + }, + "18": { + "shot1": 7, + "shot2": 7 + }, + "19": { + "shot1": 7, + "shot2": 7 + }, + "20": { + "shot1": 8, + "shot2": 7 + } + }, + "total_score": 265, + "completed": true, + "joker_selected": false + }, + "16": { + "name": "Silvo Poročnik", + "targets": { + "1": { + "shot1": 8, + "shot2": 1 + }, + "2": { + "shot1": 7, + "shot2": 7 + }, + "3": { + "shot1": 8, + "shot2": 8 + }, + "4": { + "shot1": 8, + "shot2": 7 + }, + "5": { + "shot1": 9, + "shot2": 6 + }, + "6": { + "shot1": 9, + "shot2": 5 + }, + "7": { + "shot1": 10, + "shot2": 8 + }, + "8": { + "shot1": 10, + "shot2": 7 + }, + "9": { + "shot1": 7, + "shot2": 6 + }, + "10": { + "shot1": 8, + "shot2": 7 + }, + "11": { + "shot1": 8, + "shot2": 4 + }, + "12": { + "shot1": 7, + "shot2": 4 + }, + "13": { + "shot1": 8, + "shot2": 5 + }, + "14": { + "shot1": 8, + "shot2": 8 + }, + "15": { + "shot1": 8, + "shot2": 6 + }, + "16": { + "shot1": 7, + "shot2": 2 + }, + "17": { + "shot1": 8, + "shot2": 6 + }, + "18": { + "shot1": 7, + "shot2": 7 + }, + "19": { + "shot1": 10, + "shot2": 9 + }, + "20": { + "shot1": 8, + "shot2": 6 + } + }, + "total_score": 282, + "completed": true, + "joker_selected": false + }, + "7": { + "name": "Branko Pokeržnik", + "targets": { + "1": { + "shot1": 9, + "shot2": 8 + }, + "2": { + "shot1": 8, + "shot2": 6 + }, + "3": { + "shot1": 9, + "shot2": 7 + }, + "4": { + "shot1": 9, + "shot2": 7 + }, + "5": { + "shot1": 9, + "shot2": 7 + }, + "6": { + "shot1": 8, + "shot2": 7 + }, + "7": { + "shot1": 7, + "shot2": 6 + }, + "8": { + "shot1": 9, + "shot2": 8 + }, + "9": { + "shot1": 8, + "shot2": 8 + }, + "10": { + "shot1": 8, + "shot2": 8 + }, + "11": { + "shot1": 8, + "shot2": 6 + }, + "12": { + "shot1": 7, + "shot2": 6 + }, + "13": { + "shot1": 10, + "shot2": 8 + }, + "14": { + "shot1": 9, + "shot2": 9 + }, + "15": { + "shot1": 8, + "shot2": 8 + }, + "16": { + "shot1": 9, + "shot2": 8 + }, + "17": { + "shot1": 9, + "shot2": 8 + }, + "18": { + "shot1": 9, + "shot2": 7 + }, + "19": { + "shot1": 9, + "shot2": 8 + }, + "20": { + "shot1": 8, + "shot2": 8 + } + }, + "total_score": 318, + "completed": true, + "joker_selected": false + }, + "9": { + "name": "Janez Božič", + "targets": { + "1": { + "shot1": 8, + "shot2": 6 + }, + "2": { + "shot1": 8, + "shot2": 4 + }, + "3": { + "shot1": 9, + "shot2": 6 + }, + "4": { + "shot1": 8, + "shot2": 8 + }, + "5": { + "shot1": 10, + "shot2": 8 + }, + "6": { + "shot1": 9, + "shot2": 7 + }, + "7": { + "shot1": 9, + "shot2": 8 + }, + "8": { + "shot1": 9, + "shot2": 8 + }, + "9": { + "shot1": 5, + "shot2": 5 + }, + "10": { + "shot1": 7, + "shot2": 5 + }, + "11": { + "shot1": 7, + "shot2": 6 + }, + "12": { + "shot1": 9, + "shot2": 6 + }, + "13": { + "shot1": 7, + "shot2": 6 + }, + "14": { + "shot1": 6, + "shot2": 2 + }, + "15": { + "shot1": 7, + "shot2": 4 + }, + "16": { + "shot1": 7, + "shot2": 3 + }, + "17": { + "shot1": 7, + "shot2": 5 + }, + "18": { + "shot1": 5, + "shot2": 3 + }, + "19": { + "shot1": 2, + "shot2": 4 + }, + "20": { + "shot1": 9, + "shot2": 9 + } + }, + "total_score": 261, + "completed": true, + "joker_selected": false + }, + "5": { + "name": "Jože Verhnjak", + "targets": { + "1": { + "shot1": 9, + "shot2": 8 + }, + "2": { + "shot1": 8, + "shot2": 2 + }, + "3": { + "shot1": 7, + "shot2": 8 + }, + "4": { + "shot1": 9, + "shot2": 6 + }, + "5": { + "shot1": 7, + "shot2": 6 + }, + "6": { + "shot1": 8, + "shot2": 7 + }, + "7": { + "shot1": 9, + "shot2": 7 + }, + "8": { + "shot1": 8, + "shot2": 7 + }, + "9": { + "shot1": 9, + "shot2": 6 + }, + "10": { + "shot1": 8, + "shot2": 2 + }, + "11": { + "shot1": 9, + "shot2": 6 + }, + "12": { + "shot1": 8, + "shot2": 8 + }, + "13": { + "shot1": 8, + "shot2": 4 + }, + "14": { + "shot1": 8, + "shot2": 6 + }, + "15": { + "shot1": 9, + "shot2": 7 + }, + "16": { + "shot1": 10, + "shot2": 8 + }, + "17": { + "shot1": 10, + "shot2": 7 + }, + "18": { + "shot1": 8, + "shot2": 8 + }, + "19": { + "shot1": 9, + "shot2": 8 + }, + "20": { + "shot1": 6, + "shot2": 5 + } + }, + "total_score": 293, + "completed": true, + "joker_selected": false + }, + "24": { + "name": "Jože Verdinek", + "targets": { + "1": { + "shot1": 9, + "shot2": 8 + }, + "2": { + "shot1": 9, + "shot2": 6 + }, + "3": { + "shot1": 9, + "shot2": 9 + }, + "4": { + "shot1": 8, + "shot2": 6 + }, + "5": { + "shot1": 8, + "shot2": 7 + }, + "6": { + "shot1": 8, + "shot2": 7 + }, + "7": { + "shot1": 8, + "shot2": 8 + }, + "8": { + "shot1": 9, + "shot2": 8 + }, + "9": { + "shot1": 9, + "shot2": 8 + }, + "10": { + "shot1": 8, + "shot2": 6 + }, + "11": { + "shot1": 9, + "shot2": 6 + }, + "12": { + "shot1": 8, + "shot2": 5 + }, + "13": { + "shot1": 9, + "shot2": 8 + }, + "14": { + "shot1": 9, + "shot2": 7 + }, + "15": { + "shot1": 6, + "shot2": 5 + }, + "16": { + "shot1": 9, + "shot2": 7 + }, + "17": { + "shot1": 10, + "shot2": 8 + }, + "18": { + "shot1": 10, + "shot2": 7 + }, + "19": { + "shot1": 9, + "shot2": 7 + }, + "20": { + "shot1": 9, + "shot2": 6 + } + }, + "total_score": 312, + "completed": true, + "joker_selected": false + }, + "14": { + "name": "Karli Proje", + "targets": { + "1": { + "shot1": 0, + "shot2": 0 + }, + "2": { + "shot1": 0, + "shot2": 0 + }, + "3": { + "shot1": 0, + "shot2": 0 + }, + "4": { + "shot1": 0, + "shot2": 0 + }, + "5": { + "shot1": 0, + "shot2": 0 + }, + "6": { + "shot1": 0, + "shot2": 0 + }, + "7": { + "shot1": 0, + "shot2": 0 + }, + "8": { + "shot1": 0, + "shot2": 0 + }, + "9": { + "shot1": 0, + "shot2": 0 + }, + "10": { + "shot1": 0, + "shot2": 0 + }, + "11": { + "shot1": 0, + "shot2": 0 + }, + "12": { + "shot1": 0, + "shot2": 0 + }, + "13": { + "shot1": 0, + "shot2": 0 + }, + "14": { + "shot1": 0, + "shot2": 0 + }, + "15": { + "shot1": 0, + "shot2": 0 + }, + "16": { + "shot1": 0, + "shot2": 0 + }, + "17": { + "shot1": 0, + "shot2": 0 + }, + "18": { + "shot1": 0, + "shot2": 0 + }, + "19": { + "shot1": 0, + "shot2": 0 + }, + "20": { + "shot1": 0, + "shot2": 0 + } + }, + "total_score": 0, + "completed": true, + "joker_selected": false + }, + "11": { + "name": "Rado Kefer", + "targets": { + "1": { + "shot1": 8, + "shot2": 7 + }, + "2": { + "shot1": 9, + "shot2": 6 + }, + "3": { + "shot1": 9, + "shot2": 7 + }, + "4": { + "shot1": 8, + "shot2": 8 + }, + "5": { + "shot1": 10, + "shot2": 8 + }, + "6": { + "shot1": 8, + "shot2": 8 + }, + "7": { + "shot1": 9, + "shot2": 7 + }, + "8": { + "shot1": 10, + "shot2": 8 + }, + "9": { + "shot1": 7, + "shot2": 6 + }, + "10": { + "shot1": 8, + "shot2": 7 + }, + "11": { + "shot1": 8, + "shot2": 6 + }, + "12": { + "shot1": 7, + "shot2": 4 + }, + "13": { + "shot1": 9, + "shot2": 9 + }, + "14": { + "shot1": 9, + "shot2": 8 + }, + "15": { + "shot1": 10, + "shot2": 8 + }, + "16": { + "shot1": 9, + "shot2": 7 + }, + "17": { + "shot1": 8, + "shot2": 8 + }, + "18": { + "shot1": 7, + "shot2": 8 + }, + "19": { + "shot1": 8, + "shot2": 8 + }, + "20": { + "shot1": 8, + "shot2": 7 + } + }, + "total_score": 314, + "completed": true, + "joker_selected": false + } + }, + "tournament_finished": true, + "created_at": "2026-01-10T09:59:15.947146", + "league_tournament_number": 3, + "finished_at": "2026-01-10T11:34:15.800055" +} \ No newline at end of file diff --git a/locales/en.json b/locales/en.json index bdf509e..cb35a60 100644 --- a/locales/en.json +++ b/locales/en.json @@ -23,6 +23,7 @@ "enable_selected": "Enable Selected", "disable_selected": "Disable Selected", "print": "Print", + "export": "Export JSON", "visible": "Visible", "date": "Date", "view": "View", @@ -96,7 +97,8 @@ "created": "Created", "tournaments": "Tournaments", "league_tournament": "League Tournament", - "finished": "Finished" + "finished": "Finished", + "view_current_results": "View Current Standings" }, "tournament_types": { "4_targets": "4 Targets", @@ -142,6 +144,33 @@ "highest_score": "Highest Score", "average_final": "Average Final", "5_tournament_league": "5 Tournament League - Best 4 Count", + "combine_leagues": "Combine Leagues", + "combine_mode": "Combine Leagues", + "convert_mode": "Convert Tournaments to League", + "upload_league_files": "Upload League JSON Files", + "upload_tournament_files": "Upload Tournament JSON Files", + "combine_leagues_desc": "Upload multiple league JSON files to combine them into a single results table.", + "convert_tournaments_desc": "Upload 1-5 tournament JSON files to create a league. You can upload partial leagues as tournaments complete. Final scoring uses best 4 results when all 5 are uploaded.", + "click_browse": "Click to browse", + "drag_drop_files": "or drag and drop league JSON files here", + "supports_multiple": "Supports multiple file selection", + "clear_all": "Clear All", + "combine_preview": "Combine & Preview", + "convert_to_league": "Convert to League", + "valid_league": "Valid League", + "valid_tournament": "Valid Tournament", + "participants": "participants", + "tournaments": "tournaments", + "invalid_format": "Invalid file format", + "select_mode": "Select Mode", + "start_over": "Start Over", + "export_combined_results": "Export Combined Results", + "combined_league_info": "Combined League Information", + "uploaded_files": "Uploaded Files", + "remove": "Remove", + "type": "Type", + "failed_parse_json": "Failed to parse JSON", + "invalid_tournament_format": "Invalid tournament file format", "joker_used_badge": "Joker Used", "search_players_placeholder": "Search players by name...", "no_players_found": "No players found matching your search criteria.", @@ -169,7 +198,8 @@ "camera": "Camera", "tournaments": "Tournaments", "results.most_tens": "Most 10s", - "progress": "Progress" + "progress": "Progress", + "combine_leagues": "Combine Leagues" }, "results": { "results": "Results", diff --git a/locales/sl.json b/locales/sl.json index 07be277..dd23b53 100644 --- a/locales/sl.json +++ b/locales/sl.json @@ -23,6 +23,7 @@ "enable_selected": "Omogoči Izbrane", "disable_selected": "Onemogoči Izbrane", "print": "Natisni", + "export": "Izvozi JSON", "visible": "Vidni", "date": "Datum", "view": "Oglej", @@ -97,7 +98,8 @@ "league_completed": "Liga Zaključena", "section_title": "Sekcija", "finished": "Zaključeno", - "targets": "Število Tarč" + "targets": "Število Tarč", + "view_current_results": "Oglej Trenutne Rezultate" }, "tournament_types": { "4_targets": "4 Tarče", @@ -174,7 +176,25 @@ "camera": "Kamera", "tournaments": "Turnirji", "results.most_tens": "Največ Desetk", - "progress": "Stanje" + "progress": "Stanje", + "combine_leagues": "Združi Lige", + "combine_mode": "Združi Lige", + "convert_mode": "Pretvori Turnirje v Ligo", + "upload_league_files": "Naloži Datoteke Lig", + "upload_tournament_files": "Naloži Datoteke Turnirjev", + "combine_leagues_desc": "Naloži več datotek lig JSON, da jih združiš v eno tabelo rezultatov.", + "convert_tournaments_desc": "Naloži 1-5 datotek turnirjev JSON za ustvarjanje lige. Lahko naložiš delne lige ko turnirji napredujejo. Končno točkovanje uporablja najboljše 4 rezultate, ko so vseh 5 naloženih.", + "click_browse": "Klikni za brskanje", + "drag_drop_files": "ali povleci in spusti datoteke JSON lig tukaj", + "supports_multiple": "Podpira izbiro več datotek", + "combine_preview": "Združi in Predoglej", + "convert_to_league": "Pretvori v Ligo", + "valid_league": "Veljavna Liga", + "valid_tournament": "Veljaven Turnir", + "participants": "udeleženci", + "invalid_format": "Neveljavna oblika datoteke", + "select_mode": "Izberi Način", + "start_over": "Začni Znova" }, "results": { "results": "Rezultati", diff --git a/static/js/i18n.js b/static/js/i18n.js index dfe1e98..15a755f 100644 --- a/static/js/i18n.js +++ b/static/js/i18n.js @@ -274,4 +274,11 @@ document.addEventListener('DOMContentLoaded', initI18n); // Export functions for global use window.t = t; window.changeLanguage = changeLanguage; -window.createLanguageSelector = createLanguageSelector; \ No newline at end of file +window.createLanguageSelector = createLanguageSelector; + +// Export i18n object with useful functions +window.i18n = { + t: t, + updatePageTranslations: translatePage, + changeLanguage: changeLanguage +}; \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index f8022d7..d03bae0 100644 --- a/templates/index.html +++ b/templates/index.html @@ -693,6 +693,7 @@
diff --git a/templates/league_combine.html b/templates/league_combine.html new file mode 100644 index 0000000..99e09d0 --- /dev/null +++ b/templates/league_combine.html @@ -0,0 +1,771 @@ + + + + + ++ Upload multiple league JSON files to combine them into a single results table. +
+Click to browse or drag and drop league JSON files here
+Supports multiple file selection
+ +