Skip to content

Commit dcf9d46

Browse files
committed
Merge branch 'master' of github.com:hatnote/montage
2 parents 2806de3 + f65fb00 commit dcf9d46

File tree

6 files changed

+28
-17
lines changed

6 files changed

+28
-17
lines changed

montage/admin_endpoints.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
get_threshold_map,
1414
InvalidAction,
1515
DoesNotExist,
16+
NotImplementedResponse,
1617
js_isoparse)
1718

1819
from rdb import (CoordinatorDAO,
@@ -355,7 +356,7 @@ def import_entries(user_dao, round_id, request_dict):
355356
entries = coord_dao.add_entries_by_name(round_id, file_names)
356357
params = {'file_names': file_names}
357358
else:
358-
raise NotImplementedError()
359+
raise NotImplementedResponse()
359360

360361
new_entry_stats = coord_dao.add_round_entries(round_id, entries,
361362
method=import_method,
@@ -537,7 +538,7 @@ def get_round_results_preview(user_dao, round_id):
537538
data['rankings'] = [r.to_dict() for r in rankings]
538539

539540
else:
540-
raise NotImplementedError()
541+
raise NotImplementedResponse()
541542

542543
return {'data': data}
543544

@@ -562,7 +563,7 @@ def advance_round(user_dao, round_id, request_dict):
562563
rnd = coord_dao.get_round(round_id)
563564

564565
if rnd.vote_method not in ('rating', 'yesno'):
565-
raise NotImplementedError() # see docstring above
566+
raise NotImplementedResponse() # see docstring above
566567
threshold = float(request_dict['threshold'])
567568
_next_round_params = request_dict['next_round']
568569
nrp = _prepare_round_params(coord_dao, _next_round_params)

montage/mw.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from boltons.tbutils import ExceptionInfo
1111

1212
from rdb import User, UserDAO
13+
from utils import MontageError
1314

1415

1516
def public(endpoint_func):
@@ -31,9 +32,10 @@ class MessageMiddleware(Middleware):
3132
"""
3233
provides = ('response_dict', 'request_dict')
3334

34-
def __init__(self, raise_errors=True, use_ashes=False):
35+
def __init__(self, raise_errors=True, use_ashes=False, debug_errors=False):
3536
self.raise_errors = raise_errors
3637
self.use_ashes = use_ashes
38+
self.debug_errors = debug_errors
3739

3840
def request(self, next, request):
3941
response_dict = {'errors': [], 'status': 'success'}
@@ -55,7 +57,9 @@ def endpoint(self, next, response_dict, request, _route):
5557
# TODO: autoswitch resp status code
5658
try:
5759
ret = next()
58-
except Exception:
60+
except Exception as e:
61+
if self.debug_errors and not isinstance(e, MontageError):
62+
import pdb; pdb.post_mortem()
5963
if self.raise_errors:
6064
raise
6165
ret = None

montage/rdb.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -298,16 +298,15 @@ class Round(Base):
298298

299299
@property
300300
def show_stats(self):
301-
if self.flags is None:
301+
if self.config is None:
302302
return None
303-
304-
return self.flags.get('show_stats')
303+
return self.config.get('show_stats')
305304

306305
@show_stats.setter
307306
def show_stats(self, value):
308-
if self.flags is None:
309-
self.flags = {}
310-
self.flags['show_stats'] = value
307+
if self.config is None:
308+
self.config = {}
309+
self.config['show_stats'] = value
311310

312311
def check_closability(self):
313312
task_count = self._get_task_count()

montage/server.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,12 @@ def get_engine():
168168
'root_path': root_path,
169169
'ashes_renderer': renderer}
170170

171+
debug_errors = bool(os.getenv('MONTAGE_PDB', False))
171172
api_app = Application(api_routes, resources,
172-
middlewares=[MessageMiddleware()] + middlewares,
173+
middlewares=[MessageMiddleware(debug_errors=debug_errors)] + middlewares,
173174
render_factory=render_basic)
174175
ui_app = Application(ui_routes, resources,
175-
middlewares=[MessageMiddleware(use_ashes=True)] + middlewares,
176+
middlewares=[MessageMiddleware(debug_errors=debug_errors, use_ashes=True)] + middlewares,
176177
render_factory=renderer)
177178

178179
static_app = StaticApplication(STATIC_PATH)

montage/utils.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,23 @@
2828
DEFAULT_ENV_NAME = 'dev'
2929

3030

31-
class PermissionDenied(Forbidden):
31+
class MontageError(Exception):
32+
"A base type for expected errors."
33+
34+
35+
class PermissionDenied(MontageError, Forbidden):
3236
"Raised when users perform actions on the wrong resources"
3337

3438

35-
class DoesNotExist(NotFound):
39+
class DoesNotExist(MontageError, NotFound):
3640
"Raised when users perform actions on nonexistent resources"
3741

3842

39-
class InvalidAction(BadRequest):
43+
class InvalidAction(MontageError, BadRequest):
4044
"Raised when some user behavior would cause some other assumption to fail"
4145

4246

43-
class NotImplementedResponse(BadRequest, NotImplementedError):
47+
class NotImplementedResponse(MontageError, BadRequest, NotImplementedError):
4448
"Raised when a feature hasn't yet been implemented"
4549

4650

run_server_test.py

+2
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,8 @@ def full_run(base_url, remote):
403403
resp = fetch('juror: get votes stats',
404404
'/juror/round/%s/votes-stats' % round_id,
405405
as_user='Slaporte')
406+
assert 'yes' in resp['stats']
407+
assert 'no' in resp['stats']
406408

407409
resp = fetch('maintainer: view audit logs', '/logs/audit')
408410

0 commit comments

Comments
 (0)