fix uncaucht choice/battle exceptions

This commit is contained in:
Maxime Réaux 2026-03-19 12:03:49 +01:00
parent f5ad45f671
commit 0081e52e9a
5 changed files with 156 additions and 126 deletions

View file

@ -357,12 +357,20 @@ class AppController:
except RequiresConfirmation as e:
reply = QMessageBox.question(
self.view,
"Confirm deletion",
"Confirm update",
str(e),
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
)
if reply == QMessageBox.StandardButton.Yes:
e.action()
try:
e.action()
except DomainError as inner:
QMessageBox.warning(
self.view,
"Update forbidden",
str(inner),
)
return
else:
return
self.is_dirty = True

View file

@ -47,6 +47,7 @@ class RoundController:
self.app = app
def _fill_round_details(self, round_id: str) -> None:
# self.app.view.clear_round_page()
rnd = self.app.model.get_round(round_id)
camp = self.app.model.get_campaign_by_round(round_id)
war = self.app.model.get_war_by_round(round_id)
@ -57,125 +58,144 @@ class RoundController:
for part in participants:
choice = rnd.get_choice(part.id)
if not choice:
choice = self.app.model.create_choice(
round_id=rnd.id, participant_id=part.id
try:
choice = self.app.model.create_choice(
round_id=rnd.id, participant_id=part.id
)
except DomainError as e:
QMessageBox.warning(
self.app.view,
"Create forbidden",
str(e),
)
else:
priority_name = (
camp.get_sector_name(choice.priority_sector_id)
if choice.priority_sector_id is not None
else ""
)
priority_name = (
camp.get_sector_name(choice.priority_sector_id)
if choice.priority_sector_id is not None
else ""
)
secondary_name = (
camp.get_sector_name(choice.secondary_sector_id)
if choice.secondary_sector_id is not None
else ""
)
priority_icon = None
secondary_icon = None
fallback_icon = None
alloc = Pairing.get_round_allocation(
war,
rnd,
part.id,
)
if alloc.priority != ChoiceStatus.NONE:
priority_icon = QIcon(Icons.get_pixmap(IconName[alloc.priority.name]))
if alloc.secondary != ChoiceStatus.NONE:
secondary_icon = QIcon(Icons.get_pixmap(IconName[alloc.secondary.name]))
if alloc.fallback:
fallback_icon = QIcon(Icons.get_pixmap(IconName.FALLBACK))
choices_for_display.append(
ChoiceDTO(
id=choice.participant_id,
participant_name=self.app.model.get_participant_name(
part.war_participant_id
),
priority_sector=priority_name,
secondary_sector=secondary_name,
comment=choice.comment,
priority_icon=priority_icon,
secondary_icon=secondary_icon,
fallback_icon=fallback_icon,
secondary_name = (
camp.get_sector_name(choice.secondary_sector_id)
if choice.secondary_sector_id is not None
else ""
)
priority_icon = None
secondary_icon = None
fallback_icon = None
alloc = Pairing.get_round_allocation(
war,
rnd,
part.id,
)
if alloc.priority != ChoiceStatus.NONE:
priority_icon = QIcon(
Icons.get_pixmap(IconName[alloc.priority.name])
)
if alloc.secondary != ChoiceStatus.NONE:
secondary_icon = QIcon(
Icons.get_pixmap(IconName[alloc.secondary.name])
)
if alloc.fallback:
fallback_icon = QIcon(Icons.get_pixmap(IconName.FALLBACK))
choices_for_display.append(
ChoiceDTO(
id=choice.participant_id,
participant_name=self.app.model.get_participant_name(
part.war_participant_id
),
priority_sector=priority_name,
secondary_sector=secondary_name,
comment=choice.comment,
priority_icon=priority_icon,
secondary_icon=secondary_icon,
fallback_icon=fallback_icon,
)
)
)
self.app.view.display_round_choices(choices_for_display)
battles_for_display: List[BattleDTO] = []
for sect in sectors:
battle = rnd.get_battle(sect.id)
if not battle:
battle = self.app.model.create_battle(
round_id=rnd.id, sector_id=sect.id
)
state_icon = Icons.get(IconName.ONGOING)
if battle.is_finished():
state_icon = Icons.get(IconName.DONE)
if battle.player_1_id:
camp_part = camp.participants[battle.player_1_id]
player_1_name = self.app.model.get_participant_name(
camp_part.war_participant_id
)
p1_id = battle.player_1_id
else:
player_1_name = ""
if battle.player_2_id:
camp_part = camp.participants[battle.player_2_id]
player_2_name = self.app.model.get_participant_name(
camp_part.war_participant_id
)
p2_id = battle.player_2_id
else:
player_2_name = ""
if battle.winner_id:
camp_part = camp.participants[battle.winner_id]
winner_name = self.app.model.get_participant_name(
camp_part.war_participant_id
)
else:
winner_name = ""
p1_icon = None
p2_icon = None
# TODO use uniform draw/tie icon logic with choice, war, campaign...
if battle.is_draw():
p1_icon = Icons.get(IconName.DRAW)
p2_icon = Icons.get(IconName.DRAW)
context = TieContext(
ContextType.BATTLE,
battle.sector_id,
[p1_id, p2_id],
)
if TieResolver.was_tie_broken_by_tokens(war, context):
effective_winner = ResultChecker.get_effective_winner_id(
war, ContextType.BATTLE, battle.sector_id, None
try:
battle = self.app.model.create_battle(
round_id=rnd.id, sector_id=sect.id
)
except DomainError as e:
QMessageBox.warning(
self.app.view,
"Create forbidden",
str(e),
)
else:
state_icon = Icons.get(IconName.ONGOING)
if battle.is_finished():
state_icon = Icons.get(IconName.DONE)
if battle.player_1_id:
camp_part = camp.participants[battle.player_1_id]
player_1_name = self.app.model.get_participant_name(
camp_part.war_participant_id
)
p1_id = battle.player_1_id
else:
player_1_name = ""
if battle.player_2_id:
camp_part = camp.participants[battle.player_2_id]
player_2_name = self.app.model.get_participant_name(
camp_part.war_participant_id
)
p2_id = battle.player_2_id
else:
player_2_name = ""
if battle.winner_id:
camp_part = camp.participants[battle.winner_id]
winner_name = self.app.model.get_participant_name(
camp_part.war_participant_id
)
else:
winner_name = ""
p1_icon = None
p2_icon = None
# TODO use uniform draw/tie icon logic with choice, war, campaign...
if battle.is_draw():
p1_icon = Icons.get(IconName.DRAW)
p2_icon = Icons.get(IconName.DRAW)
context = TieContext(
ContextType.BATTLE,
battle.sector_id,
[p1_id, p2_id],
)
if TieResolver.was_tie_broken_by_tokens(war, context):
effective_winner = ResultChecker.get_effective_winner_id(
war, ContextType.BATTLE, battle.sector_id, None
)
p1_war = None
if battle.player_1_id is not None:
p1_war = camp.campaign_to_war_part_id(battle.player_1_id)
pixmap = Icons.get_pixmap(IconName.TIEBREAK_TOKEN)
if effective_winner == p1_war:
p1_icon = QIcon(pixmap)
else:
p2_icon = QIcon(pixmap)
elif battle.winner_id:
if battle.winner_id == battle.player_1_id:
p1_icon = Icons.get(IconName.WIN)
elif battle.winner_id == battle.player_2_id:
p2_icon = Icons.get(IconName.WIN)
battles_for_display.append(
BattleDTO(
id=battle.sector_id,
sector_name=camp.get_sector_name(battle.sector_id),
player_1=player_1_name,
player_2=player_2_name,
winner=winner_name,
score=battle.score,
victory_condition=battle.victory_condition,
comment=battle.comment,
state_icon=state_icon,
player1_icon=p1_icon,
player2_icon=p2_icon,
)
p1_war = None
if battle.player_1_id is not None:
p1_war = camp.campaign_to_war_part_id(battle.player_1_id)
pixmap = Icons.get_pixmap(IconName.TIEBREAK_TOKEN)
if effective_winner == p1_war:
p1_icon = QIcon(pixmap)
else:
p2_icon = QIcon(pixmap)
elif battle.winner_id:
if battle.winner_id == battle.player_1_id:
p1_icon = Icons.get(IconName.WIN)
elif battle.winner_id == battle.player_2_id:
p2_icon = Icons.get(IconName.WIN)
battles_for_display.append(
BattleDTO(
id=battle.sector_id,
sector_name=camp.get_sector_name(battle.sector_id),
player_1=player_1_name,
player_2=player_2_name,
winner=winner_name,
score=battle.score,
victory_condition=battle.victory_condition,
comment=battle.comment,
state_icon=state_icon,
player1_icon=p1_icon,
player2_icon=p2_icon,
)
)
self.app.view.display_round_battles(battles_for_display)
self.app.view.endRoundBtn.setEnabled(not rnd.is_over)