Skip to content

Commit a455856

Browse files
author
Marcel Sander
committed
error tolerance, fix bug in demo data
1 parent c1eaa23 commit a455856

File tree

3 files changed

+40
-23
lines changed

3 files changed

+40
-23
lines changed

gengine/models.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,9 @@ def coords(row):
11351135
safe_dict['or_'] = or_
11361136
safe_dict['abs'] = abs
11371137

1138+
class FormularEvaluationException(Exception):
1139+
pass
1140+
11381141
#TODO: Cache
11391142
def eval_formular(s,params={}):
11401143
"""evaluates the formular.
@@ -1147,19 +1150,22 @@ def eval_formular(s,params={}):
11471150
'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf',
11481151
'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh'
11491152
"""
1150-
if s is None:
1151-
return None
1152-
else:
1153-
p = DictObjectProxy(params)
1154-
1155-
#add any needed builtins back in.
1156-
safe_dict['p'] = p
1157-
1158-
result = eval(s,{"__builtins__":None},safe_dict)
1159-
if type(result)==str or type(result)==unicode:
1160-
return result % params
1153+
try:
1154+
if s is None:
1155+
return None
11611156
else:
1162-
return result
1157+
p = DictObjectProxy(params)
1158+
1159+
#add any needed builtins back in.
1160+
safe_dict['p'] = p
1161+
1162+
result = eval(s,{"__builtins__":None},safe_dict)
1163+
if type(result)==str or type(result)==unicode:
1164+
return result % params
1165+
else:
1166+
return result
1167+
except:
1168+
raise FormularEvaluationException(s)
11631169

11641170
class DictObjectProxy():
11651171
obj = None

gengine/scripts/initializedb.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,23 +149,23 @@ def add_translation(variable,lang,text):
149149

150150
DBSession.add(AchievementProperty(achievement=achievement_invite, property=property_name, value_translation=transvar_invite_name))
151151
DBSession.add(AchievementProperty(achievement=achievement_invite, property=property_xp, value='100 * p.level'))
152-
DBSession.add(AchievementProperty(achievement=achievement_invite, property=property_icon, value='https://www.gamification-software.com/img/running.png'))
152+
DBSession.add(AchievementProperty(achievement=achievement_invite, property=property_icon, value="'https://www.gamification-software.com/img/running.png'"))
153153
DBSession.add(AchievementProperty(achievement=achievement_invite, property=property_description, value_translation=transvar_invite))
154154

155-
DBSession.add(AchievementReward(achievement=achievement_invite, reward=reward_badge, value='https://www.gamification-software.com/img/trophy.png', from_level=5))
156-
DBSession.add(AchievementReward(achievement=achievement_invite, reward=reward_image, value='https://www.gamification-software.com/img/video-controller-336657_1920.jpg', from_level=5))
155+
DBSession.add(AchievementReward(achievement=achievement_invite, reward=reward_badge, value="'https://www.gamification-software.com/img/trophy.png'", from_level=5))
156+
DBSession.add(AchievementReward(achievement=achievement_invite, reward=reward_image, value="'https://www.gamification-software.com/img/video-controller-336657_1920.jpg'", from_level=5))
157157

158158
transvar_fittest_name = add_translation_variable(name="fittest_achievement_name")
159159
add_translation(transvar_fittest_name, lang_en, '"The Fittest!"')
160160
add_translation(transvar_fittest_name, lang_de, '"Der Fitteste!"')
161161

162162
DBSession.add(AchievementProperty(achievement=achievement_fittest, property=property_name, value_translation=transvar_fittest_name))
163163
DBSession.add(AchievementProperty(achievement=achievement_fittest, property=property_xp, value='50 + (200 * p.level)'))
164-
DBSession.add(AchievementProperty(achievement=achievement_fittest, property=property_icon, value='https://www.gamification-software.com/img/colorwheel.png'))
164+
DBSession.add(AchievementProperty(achievement=achievement_fittest, property=property_icon, value="'https://www.gamification-software.com/img/colorwheel.png'"))
165165
DBSession.add(AchievementProperty(achievement=achievement_fittest, property=property_description, value_translation=transvar_fittest))
166166

167-
DBSession.add(AchievementReward(achievement=achievement_fittest, reward=reward_badge, value='https://www.gamification-software.com/img/easel.png', from_level=1))
168-
DBSession.add(AchievementReward(achievement=achievement_fittest, reward=reward_image, value='https://www.gamification-software.com/img/game-characters-622654.jpg', from_level=1))
167+
DBSession.add(AchievementReward(achievement=achievement_fittest, reward=reward_badge, value="'https://www.gamification-software.com/img/easel.png'", from_level=1))
168+
DBSession.add(AchievementReward(achievement=achievement_fittest, reward=reward_image, value="'https://www.gamification-software.com/img/game-characters-622654.jpg'", from_level=1))
169169

170170

171171
user1 = User(id=1,lat=10,lng=50,timezone="Europe/Berlin")

gengine/views.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@
1212
from .flaskadmin import flaskadminapp
1313
from pyramid.wsgi import wsgiapp2, wsgiapp
1414
from _collections import defaultdict
15-
from gengine.models import Variable, valid_timezone, Goal, AchievementReward
15+
from gengine.models import Variable, valid_timezone, Goal, AchievementReward, FormularEvaluationException
1616
from werkzeug.exceptions import BadRequest
1717
from gengine.urlcache import set_value
1818
from pyramid.exceptions import NotFound
1919
from werkzeug import DebuggedApplication
2020
from gengine.wsgiutil import HTTPSProxied
2121

22+
import traceback
23+
2224
@view_config(route_name='add_or_update_user', renderer='string')
2325
def add_or_update_user(request):
2426
"""add a user and set its metadata"""
@@ -71,15 +73,24 @@ def generate():
7173

7274
def ea(achievement):
7375
try:
76+
#print "evaluating "+`achievement["id"]`
7477
return Achievement.evaluate(user, achievement["id"])
75-
except:
76-
return None
78+
except FormularEvaluationException as e:
79+
return { "error": "Cannot evaluate formular: " + e.message, "id" : achievement["id"] }
80+
except Exception as e:
81+
tb = traceback.format_exc()
82+
return { "error": tb, "id" : achievement["id"] }
7783

78-
check = lambda x : x!=None and (x["hidden"]==False or x["level"]>0)
84+
check = lambda x : x!=None and not x.has_key("error") and (x["hidden"]==False or x["level"]>0)
85+
86+
evaluatelist = [ea(achievement) for achievement in achievements]
7987

8088
ret = {
8189
"achievements" : {
82-
x["id"] : x for x in [ea(achievement) for achievement in achievements] if check(x)
90+
x["id"] : x for x in evaluatelist if check(x)
91+
},
92+
"achievement_errors" : {
93+
x["id"] : x for x in evaluatelist if x!=None and x.has_key("error")
8394
}
8495
}
8596

0 commit comments

Comments
 (0)