database.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. """Database module"""
  2. from datetime import datetime
  3. from app import Session, LOGGER
  4. from app.models import State, Player, StateRegion, \
  5. PlayerLocation, PlayerResidency, StateWorkPermit
  6. def get_state_regions(state_id):
  7. """Get regions from state"""
  8. session = Session()
  9. state = session.query(State).get(state_id)
  10. regions = state.regions.filter(StateRegion.until_date_time == None).all()
  11. session.close()
  12. return regions
  13. def save_citizens(region_id, citizens):
  14. """Save citizens to database"""
  15. session = Session()
  16. player_ids = []
  17. new_citizens = 0
  18. for player_dict in citizens:
  19. player = session.query(Player).get(player_dict['id'])
  20. if player is None:
  21. player = save_player(session, player_dict)
  22. player_ids.append(player.id)
  23. last_region = player.locations.first()
  24. if not last_region or last_region.id != region_id:
  25. new_citizens += 1
  26. player_location = PlayerLocation()
  27. player_location.player_id = player.id
  28. player_location.region_id = region_id
  29. player_location.from_date_time = datetime.now().replace(second=0, minute=0)
  30. session.add(player_location)
  31. LOGGER.info('regio %6s: "%s" new citizens', region_id, new_citizens)
  32. session.commit()
  33. current_citizens = session.query(PlayerLocation) \
  34. .filter(PlayerLocation.region_id == region_id) \
  35. .filter(PlayerLocation.until_date_time == None).all()
  36. left_citizens = 0
  37. for current_citizen in current_citizens:
  38. if current_citizen.player_id not in player_ids:
  39. left_citizens += 1
  40. current_citizen.until_date_time = datetime.now().replace(second=0, minute=0)
  41. LOGGER.info('regio %6s: "%s" citizens left', region_id, left_citizens)
  42. session.commit()
  43. session.close()
  44. def save_residents(region_id, residents):
  45. """Save residents to database"""
  46. session = Session()
  47. player_ids = []
  48. for player_dict in residents:
  49. player = session.query(Player).get(player_dict['id'])
  50. if player is None:
  51. player = save_player(session, player_dict)
  52. player_ids.append(player.id)
  53. last_residency = player.residencies.first()
  54. if not last_residency or last_residency.id != region_id:
  55. player_location = PlayerResidency()
  56. player_location.player_id = player.id
  57. player_location.region_id = region_id
  58. player_location.from_date_time = datetime.now().replace(second=0, minute=0)
  59. session.add(player_location)
  60. session.commit()
  61. current_residents = session.query(PlayerResidency) \
  62. .filter(PlayerResidency.region_id == region_id) \
  63. .filter(PlayerResidency.until_date_time == None).all()
  64. for current_resident in current_residents:
  65. if current_resident.player_id not in player_ids:
  66. current_resident.until_date_time = datetime.now().replace(second=0, minute=0)
  67. session.commit()
  68. session.close()
  69. def save_work_permits(state_id, work_permits):
  70. """Save residents to database"""
  71. session = Session()
  72. player_ids = []
  73. for player_dict in work_permits:
  74. player = session.query(Player).get(player_dict['id'])
  75. if player is None:
  76. player = save_player(session, player_dict)
  77. player_ids.append(player.id)
  78. last_work_permit = player.state_work_permits.first()
  79. if not last_work_permit or last_work_permit.id != state_id:
  80. state_work_permit = StateWorkPermit()
  81. state_work_permit.player_id = player.id
  82. state_work_permit.state_id = state_id
  83. state_work_permit.from_date_time = player_dict['from']
  84. session.add(state_work_permit)
  85. session.commit()
  86. current_work_permits = session.query(StateWorkPermit) \
  87. .filter(StateWorkPermit.state_id == state_id) \
  88. .filter(StateWorkPermit.until_date_time == None).all()
  89. for current_work_permit in current_work_permits:
  90. if current_work_permit.player_id not in player_ids:
  91. current_work_permit.until_date_time = datetime.now().replace(second=0, minute=0)
  92. session.commit()
  93. session.close()
  94. def save_player(session, player_dict):
  95. """Save player to database"""
  96. player = Player()
  97. player.id = player_dict['id']
  98. player.name = player_dict['name']
  99. player.nation = player_dict['nation']
  100. if 'registration_date' in player_dict:
  101. player.registration_date = player_dict['registration_date']
  102. session.add(player)
  103. session.commit()
  104. return player