def test_get_achievements_by_location_and_date(self): user = create_user() achievement1 = create_achievement( achievement_name="invite_users_achievement") achievement2 = create_achievement( achievement_name="participate_achievement") create_goals(achievement1) create_goals(achievement2) achievement_today = Achievement.get_achievements_by_user_for_today( user) print("achievement_today") print(achievement_today) self.assertEqual(achievement_today[0]["name"], "invite_users_achievement") self.assertEqual(len(achievement_today), 2)
def _get_progress(achievements_for_user, requesting_user): achievements = Achievement.get_achievements_by_user_for_today( achievements_for_user) def ea(achievement, achievement_date, execute_triggers): try: return Achievement.evaluate(achievements_for_user, achievement["id"], achievement_date, execute_triggers=execute_triggers) except FormularEvaluationException as e: return { "error": "Cannot evaluate formular: " + e.message, "id": achievement["id"] } except Exception as e: tb = traceback.format_exc() return {"error": tb, "id": achievement["id"]} check = lambda x: x != None and not "error" in x and (x["hidden"] == False or x["level"] > 0) def may_view(achievement, requesting_user): if not asbool(get_settings().get("enable_user_authentication", False)): return True if achievement["view_permission"] == "everyone": return True if achievement["view_permission"] == "own" and achievements_for_user[ "id"] == requesting_user["id"]: return True return False evaluatelist = [] now = datetime.datetime.now( pytz.timezone(achievements_for_user["timezone"])) for achievement in achievements: if may_view(achievement, requesting_user): achievement_dates = set() d = max( achievement["created_at"], achievements_for_user["created_at"]).replace(tzinfo=pytz.utc) dr = Achievement.get_datetime_for_evaluation_type( achievement["evaluation_timezone"], achievement["evaluation"], dt=d) achievement_dates.add(dr) if dr != None: while d <= now: if achievement["evaluation"] == "yearly": d += datetime.timedelta(days=364) elif achievement["evaluation"] == "monthly": d += datetime.timedelta(days=28) elif achievement["evaluation"] == "weekly": d += datetime.timedelta(days=6) elif achievement["evaluation"] == "daily": d += datetime.timedelta(hours=23) else: break # should not happen dr = Achievement.get_datetime_for_evaluation_type( achievement["evaluation_timezone"], achievement["evaluation"], dt=d) if dr <= now: achievement_dates.add(dr) i = 0 for achievement_date in reversed(sorted(achievement_dates)): # We execute the goal triggers only for the newest and previous period, not for any periods longer ago # (To not send messages for very old things....) evaluatelist.append( ea(achievement, achievement_date, execute_triggers=(i == 0 or i == 1 or achievement_date == None))) i += 1 ret = { "achievements": [x for x in evaluatelist if check(x)], "achievement_errors": [x for x in evaluatelist if x != None and "error" in x] } return ret