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.7 KiB

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):
'''Returns True if given user is an owner of a game object is part of'''
return user in [gameplayer.user for gameplayer in self.game.players if gameplayer.role == Role.owner]
class ObjectiveEncoder(JSONEncoder):
def default(self, objective):
return {
'name' : objective.name,
'hash' : objective.hash,
'longitude' : objective.longitude,
'latitude' : objective.latitude
}