blob: 75e26c2b5659a9b4bc8a0f04919ddbcf7b9b8769 [file]
import marshmallow as ma
from app.utility.base_object import BaseObject
class GoalSchema(ma.Schema):
target = ma.fields.String()
value = ma.fields.String()
count = ma.fields.Integer()
operator = ma.fields.String()
achieved = ma.fields.Boolean(dump_only=True)
@ma.pre_load
def remove_properties(self, data, **_):
data.pop('achieved', None)
return data
@ma.post_load
def build_goal(self, data, **_):
return Goal(**data)
class Goal(BaseObject):
schema = GoalSchema()
MAX_GOAL_COUNT = 2**20
@staticmethod
def parse_operator(operator):
if operator == '<':
return lambda x, y: x < y
if operator == '>':
return lambda x, y: x > y
if operator == '<=':
return lambda x, y: x <= y
if operator == '>=':
return lambda x, y: x >= y
if operator == 'in':
return lambda x, y: x in y
if operator == '*':
return lambda x, y: True
return lambda x, y: x == y
def satisfied(self, all_facts=None):
temp_count = 0
for fact in (all_facts or []):
if self.target == fact.trait and self.parse_operator(self.operator)(self.value, fact.value):
temp_count += 1
if temp_count >= self.count:
self.achieved = True
return self.achieved
def __init__(self, target='exhaustion', value='complete', count=None, operator='=='):
super().__init__()
self.target = target
self.value = value
self.count = count if count is not None else self.MAX_GOAL_COUNT
self.achieved = False
self.operator = operator