예제 #1
0
    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)
예제 #2
0
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