From 87670329c2b22a7394617399db372937fddf8a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20R=C3=A9aux?= Date: Tue, 3 Feb 2026 09:01:17 +0100 Subject: [PATCH] fix unique participant in war & campaign --- src/warchron/model/campaign.py | 9 +++++++-- src/warchron/model/model.py | 5 +---- src/warchron/model/war.py | 11 +++++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/warchron/model/campaign.py b/src/warchron/model/campaign.py index 58068fb..df6ae94 100644 --- a/src/warchron/model/campaign.py +++ b/src/warchron/model/campaign.py @@ -54,11 +54,16 @@ class Campaign: def has_participant(self, participant_id: str) -> bool: return participant_id in self.participants + def has_war_participant(self, war_participant_id: str) -> bool: + return any( + part.war_participant_id == war_participant_id + for part in self.participants.values() + ) + def add_campaign_participant( self, war_participant_id: str, leader: str, theme: str ) -> CampaignParticipant: - ## TODO change lookup id target - if war_participant_id in self.participants: + if self.has_war_participant(war_participant_id): raise ValueError("Player already registered in this campaign") participant = CampaignParticipant( war_participant_id=war_participant_id, leader=leader, theme=theme diff --git a/src/warchron/model/model.py b/src/warchron/model/model.py index ae86d9c..d4f017b 100644 --- a/src/warchron/model/model.py +++ b/src/warchron/model/model.py @@ -123,7 +123,6 @@ class Model: return war raise KeyError(f"Objective {objective_id} not found in any War") - # TODO don't use this method as participant with same ID (player) can be in several wars! def get_war_by_war_participant(self, participant_id: str) -> War: for war in self.wars.values(): if war.has_participant(participant_id): @@ -174,9 +173,7 @@ class Model: def get_available_players(self, war_id: str) -> list[Player]: war = self.get_war(war_id) return [ - player - for player in self.players.values() - if not war.has_participant(player.id) + player for player in self.players.values() if not war.has_player(player.id) ] def add_war_participant( diff --git a/src/warchron/model/war.py b/src/warchron/model/war.py index e5673d5..8cb9464 100644 --- a/src/warchron/model/war.py +++ b/src/warchron/model/war.py @@ -81,11 +81,14 @@ class War: def get_all_war_participants_ids(self) -> set[str]: return set(self.participants.keys()) - def has_participant(self, player_id: str) -> bool: - return player_id in self.participants + def has_participant(self, participant_id: str) -> bool: + return participant_id in self.participants + + def has_player(self, player_id: str) -> bool: + return any(part.player_id == player_id for part in self.participants.values()) def add_war_participant(self, player_id: str, faction: str) -> WarParticipant: - if player_id in self.participants: + if self.has_player(player_id): raise ValueError("Player already registered in this war") participant = WarParticipant(player_id=player_id, faction=faction) self.participants[participant.id] = participant @@ -207,7 +210,7 @@ class War: return [ part for part in self.participants.values() - if not camp.has_participant(part.id) + if not camp.has_war_participant(part.id) ] def add_campaign_participant(