Browse Source

Fix issue with moving players

JoostSijm 5 years ago
parent
commit
a6505bfdba
1 changed files with 28 additions and 21 deletions
  1. 28 21
      app/database.py

+ 28 - 21
app/database.py

@@ -14,10 +14,12 @@ def get_state_regions(state_id):
 
 def save_citizens(region_id, citizens):
     """Save citizens to database"""
+    player_ids = []
     for player_dict in citizens:
         player = session.query(Player).get(player_dict['id'])
         if player is None:
             player = save_player(player_dict)
+        player_ids.append(player.id)
         last_region = player.locations.first()
         if not last_region or last_region.id != region_id:
             player_location = PlayerLocation()
@@ -26,20 +28,23 @@ def save_citizens(region_id, citizens):
             player_location.from_date_time = datetime.now()
             session.add(player_location)
             session.commit()
-            if last_region:
-                old_player_location = session.query(PlayerLocation) \
-                    .filter(PlayerLocation.player_id == player.id) \
-                    .filter(PlayerLocation.region_id == last_region.id) \
-                    .order_by(PlayerLocation.from_date_time.desc()).first()
-                old_player_location.until_date_time = datetime.now()
-                session.commit()
+    current_citizens = session.query(PlayerLocation) \
+        .filter(PlayerLocation.region_id == region_id) \
+        .filter(PlayerLocation.until_date_time == None).all()
+    for current_citizen in current_citizens:
+        if current_citizen.player_id not in player_ids:
+            current_citizen.until_date_time = datetime.now()
+    session.commit()
+
 
 def save_residents(region_id, residents):
     """Save residents to database"""
+    player_ids = []
     for player_dict in residents:
         player = session.query(Player).get(player_dict['id'])
         if player is None:
             player = save_player(player_dict)
+        player_ids.append(player.id)
         last_residency = player.residencies.first()
         if not last_residency or last_residency.id != region_id:
             player_location = PlayerResidency()
@@ -48,21 +53,23 @@ def save_residents(region_id, residents):
             player_location.from_date_time = datetime.now()
             session.add(player_location)
             session.commit()
-            if last_residency:
-                old_player_residency = session.query(PlayerResidency) \
-                    .filter(PlayerResidency.player_id == player.id) \
-                    .filter(PlayerResidency.region_id == last_residency.id) \
-                    .order_by(PlayerResidency.from_date_time.desc()).first()
-                old_player_residency.until_date_time = datetime.now()
-                session.commit()
+    current_residents = session.query(PlayerResidency) \
+        .filter(PlayerResidency.region_id == region_id) \
+        .filter(PlayerResidency.until_date_time == None).all()
+    for current_resident in current_residents:
+        if current_resident.player_id not in player_ids:
+            current_resident.until_date_time = datetime.now()
+    session.commit()
 
 
 def save_work_permits(state_id, work_permits):
     """Save residents to database"""
+    player_ids = []
     for player_dict in work_permits:
         player = session.query(Player).get(player_dict['id'])
         if player is None:
             player = save_player(player_dict)
+        player_ids.append(player.id)
         last_work_permit = player.state_work_permits.first()
         if not last_work_permit or last_work_permit.id != state_id:
             state_work_permit = StateWorkPermit()
@@ -71,13 +78,13 @@ def save_work_permits(state_id, work_permits):
             state_work_permit.from_date_time = player_dict['from']
             session.add(state_work_permit)
             session.commit()
-            if last_work_permit:
-                old_state_work_permit = session.query(StateWorkPermit) \
-                    .filter(StateWorkPermit.player_id == player.id) \
-                    .filter(StateWorkPermit.state_id == last_work_permit.id) \
-                    .order_by(StateWorkPermit.from_date_time.desc()).first()
-                old_state_work_permit.until_date_time = datetime.now()
-                session.commit()
+    current_work_permits = session.query(StateWorkPermit) \
+        .filter(StateWorkPermit.state_id == state_id) \
+        .filter(StateWorkPermit.until_date_time == None).all()
+    for current_work_permit in current_work_permits:
+        if current_work_permit.player_id not in player_ids:
+            current_work_permit.until_date_time = datetime.now()
+    session.commit()
 
 def save_player(player_dict):
     """Save player to database"""