You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.6 KiB
39 lines
1.6 KiB
4 years ago
|
from secrets import token_hex
|
||
|
from json import JSONEncoder
|
||
|
from sqlalchemy.ext.associationproxy import association_proxy
|
||
|
|
||
|
from app import db
|
||
|
from app.models import PlayerFoundObjective, Role
|
||
|
|
||
|
class Objective(db.Model):
|
||
|
""" !Always call set_hash after() creating new instance! """
|
||
|
__tablename__ = 'objective'
|
||
|
id = db.Column(db.Integer, primary_key=True)
|
||
|
name = db.Column(db.String(64))
|
||
|
game_id = db.Column(db.Integer, db.ForeignKey('game.id'), nullable=False)
|
||
|
hash = db.Column(db.String(32), unique=True, nullable=False)
|
||
|
longitude = db.Column(db.Numeric(precision=15, scale=10, asdecimal=False, decimal_return_scale=None)) # maybe check asdecimal and decimal_return_scale later?
|
||
|
latitude = db.Column(db.Numeric(precision=15, scale=10, asdecimal=False, decimal_return_scale=None))
|
||
|
objective_found_by = db.relationship(
|
||
|
'PlayerFoundObjective',
|
||
|
back_populates='objective',
|
||
|
cascade='save-update, merge, delete, delete-orphan')
|
||
|
found_by = association_proxy('objective_found_by', 'player',
|
||
|
creator=lambda player: PlayerFoundObjective(player=player))
|
||
|
|
||
|
def set_hash(self):
|
||
|
self.hash = token_hex(16)
|
||
|
|
||
|
def owned_by(self, player):
|
||
|
'''given player is an owner of a game object is part of'''
|
||
|
return player in [gameplayer.player for gameplayer in self.game.game_players if gameplayer.role == Role.owner]
|
||
|
|
||
|
class ObjectiveMinimalEncoder(JSONEncoder):
|
||
|
def default(self, objective):
|
||
|
return {
|
||
|
'name' : objective.name,
|
||
|
'hash' : objective.hash,
|
||
|
'longitude' : objective.longitude,
|
||
|
'latitude' : objective.latitude
|
||
|
}
|