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
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 |
|
} |