Browse Source

Finish residency and saving to database

JoostSijm 6 years ago
parent
commit
8dc56ee77d
4 changed files with 91 additions and 58 deletions
  1. 24 9
      app/__main__.py
  2. 1 1
      app/api.py
  3. 52 46
      app/database.py
  4. 14 2
      app/models.py

+ 24 - 9
app/__main__.py

@@ -4,7 +4,7 @@ import time
 
 from app import scheduler, session
 from app.api import get_citizens, get_residents
-from app.database import get_state_regions # , save_citizens, save_residents
+from app.database import get_state_regions, save_citizens, save_residents
 
 
 def print_players(players):
@@ -21,7 +21,7 @@ def job_update_citizens(state_id):
     for region in regions:
         citizens = get_citizens(region.id)
         print_players(citizens)
-        # save_citizens(citizens)
+        save_citizens(region.id, citizens)
 
 def job_update_residents(state_id):
     """Update residents"""
@@ -29,10 +29,10 @@ def job_update_residents(state_id):
     for region in regions:
         residents = get_residents(region.id)
         print_players(residents)
-        # save_citizens(citizens)
+        save_residents(region.id, residents)
 
 
-def add_update_department(state_id):
+def add_update_citizens(state_id):
     """Add jobs"""
     scheduler.add_job(
         job_update_citizens,
@@ -40,20 +40,35 @@ def add_update_department(state_id):
         args=[state_id],
         id='citizens_{}'.format(state_id),
         replace_existing=True,
-        minute='0'
+        hour='1,7,13,19'
     )
 
+def add_update_residents(state_id):
+    """Add jobs"""
+    scheduler.add_job(
+        job_update_residents,
+        'cron',
+        args=[state_id],
+        id='citizens_{}'.format(state_id),
+        replace_existing=True,
+        hour='1,7,13,19'
+    )
+
+
 if __name__ == '__main__':
     # jobs
     # job_update_citizens(2788)
-    job_update_residents(2788)
+    # job_update_residents(2788)
 
     # Verenigde Nederlanden
-    add_update_department(2788)
+    add_update_citizens(2788)
+    add_update_residents(2788)
     # Belgium
-    add_update_department(2604)
+    add_update_citizens(2604)
+    add_update_residents(2604)
     # De Provincien
-    add_update_department(2620)
+    add_update_citizens(2620)
+    add_update_residents(2620)
 
     try:
         while True:

+ 1 - 1
app/api.py

@@ -13,7 +13,7 @@ def get_residents(region_id):
 
 def get_citizens(region_id):
     """Get citizens from region"""
-    return download_players(region_id, 'state')
+    return download_players(region_id, 'region')
 
 def download_players(region_id, player_type):
     """Download the players"""

+ 52 - 46
app/database.py

@@ -1,7 +1,9 @@
 """Database module"""
 
+from datetime import datetime
+
 from app import session
-from app.models import State, Region, Player, StateRegion
+from app.models import State, Region, Player, StateRegion, PlayerLocation, PlayerResidency
 
 
 def get_state_regions(state_id):
@@ -10,48 +12,52 @@ def get_state_regions(state_id):
     regions = state.regions.filter(StateRegion.until_date_time == None).all()
     return regions
 
-# def get_latest_professor(state_id, department_type):
-#     """Get latest professor from database"""
-#     department = get_department(state_id, department_type)
-#     professor = department.department_stats.order_by(DepartmentStat.date_time.desc()).first()
-#     return professor
-#
-# def get_player(player_id, player_name):
-#     """Get player from database"""
-#     player = session.query(Player).get(player_id)
-#     if player is None:
-#         player = Player()
-#         player.id = player_id
-#         player.name = player_name
-#         session.add(player)
-#         session.commit()
-#     return player
-#
-# def get_department(state_id, department_type):
-#     """Get department from database"""
-#     department = session.query(Department).filter(
-#         Department.state_id == state_id
-#     ).filter(
-#         Department.department_type == department_type
-#     ).first()
-#     if department is None:
-#         department = Department()
-#         department.state_id = state_id
-#         department.department_type = department_type
-#         session.add(department)
-#         session.commit()
-#     return department
-#
-# def save_professors(state_id, department_type, professors):
-#     """Save professors to database"""
-#     department = get_department(state_id, department_type)
-#
-#     for professor in professors:
-#         player = get_player(professor['id'], professor['name'])
-#         department_stat = DepartmentStat()
-#         department_stat.department_id = department.id
-#         department_stat.date_time = professor['date_time']
-#         department_stat.points = professor['points']
-#         department_stat.player_id = player.id
-#         session.add(department_stat)
-#     session.commit()
+def save_citizens(region_id, citizens):
+    """Save citizens to database"""
+    for player_dict in citizens:
+        player = session.query(Player).get(player_dict['id'])
+        if player is None:
+            player = Player()
+            player.id = player_dict['id']
+            player.name = player_dict['name']
+            session.add(player)
+            session.commit()
+        last_region = player.locations.first()
+        if not last_region or last_region.id != region_id:
+            player_location = PlayerLocation()
+            player_location.player_id = player.id
+            player_location.region_id = region_id
+            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).first()
+                old_player_location.until_date_time = datetime.now()
+                session.commit()
+
+def save_residents(region_id, residents):
+    """Save residents to database"""
+    for player_dict in residents:
+        player = session.query(Player).get(player_dict['id'])
+        if player is None:
+            player = Player()
+            player.id = player_dict['id']
+            player.name = player_dict['name']
+            session.add(player)
+            session.commit()
+        last_residency = player.residencies.first()
+        if not last_residency or last_residency.id != region_id:
+            player_location = PlayerResidency()
+            player_location.player_id = player.id
+            player_location.region_id = region_id
+            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).first()
+                old_player_residency.until_date_time = datetime.now()
+                session.commit()

+ 14 - 2
app/models.py

@@ -66,5 +66,17 @@ class Player(Base):
     id = Column(BigInteger, primary_key=True)
     name = Column(String)
     nation = Column(String)
-    residencies = relationship('Region', secondary='player_residency')
-    locations = relationship('Region', secondary='player_location')
+    residencies = relationship(
+        'Region',
+        secondary='player_residency',
+        backref=backref('residents', lazy='dynamic'),
+        lazy='dynamic',
+        order_by='desc(PlayerResidency.from_date_time)'
+    )
+    locations = relationship(
+        'Region',
+        secondary='player_location',
+        backref=backref('citizens', lazy='dynamic'),
+        lazy='dynamic',
+        order_by='desc(PlayerLocation.from_date_time)'
+    )