|
|
|
from secrets import token_hex
|
|
|
|
from json import JSONEncoder
|
|
|
|
from sqlalchemy.ext.associationproxy import association_proxy
|
|
|
|
|
|
|
|
from app import db
|
|
|
|
from .player_found_objective import PlayerFoundObjective
|
|
|
|
from .role import 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', 'game_player',
|
|
|
|
creator=lambda game_player: PlayerFoundObjective(game_player=game_player))
|
|
|
|
|
|
|
|
def set_hash(self):
|
|
|
|
self.hash = token_hex(16)
|
|
|
|
|
|
|
|
def owned_by(self, user):
|
|
|
|
'''given user is an owner of a game object is part of'''
|
|
|
|
return user in [gameplayer.user 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
|
|
|
|
}
|