Hi there you all. I seem to have a problem regarding tgext.crud and Sprox when creating or updating objects:
If, due to, e.g. an unique Index over multiple columns or other advanced stuff, the flush in the Sprox SAORMProvider create() and update() methods throws an IntegrityError, the catch_errors decorator on CrudRestController catches that exception and flashes its message. So far, so good, BUT, and this is were I'm not sure if it's a bug or if I'm just doing something very stupid without knowing: I get an InvalidRequestError (see traceback attached) while rendering the previous form page again. Apparently, this is because I use objects (e.g. an instance of Event in that case) from the session to dynamically generate a menu on the page. These objects aren't accessible due to the transactions failed state. If I follow the instructions from the traceback Exception and wrap the code for provider.create with try..except and issue a provider.session.rollback(), I can get it to work. Sadly, I can't hook the post and put methods because before_render never gets called due to the exception... Now the final question is: - Am I doing anything stupid with my session-bound objects? - Should CrudRestController or even Sprox directly perform the rollback when the session.flush() fails? Hoping for some insight ;) Best wishes, Moritz -- Moritz Schlarb -- You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/turbogears?hl=en.
URL: http://localhost:8080/events/demo/admin/assignments/ File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/WebError-0.10.3-py2.7.egg/weberror/evalexception.py', line 431 in respond app_iter = self.application(environ, detect_start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/configuration.py', line 877 in remover return app(environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/repoze.tm2-1.0-py2.7.egg/repoze/tm/__init__.py', line 24 in __call__ result = self.application(environ, save_status_and_headers) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/repoze.who-1.0.19-py2.7.egg/repoze/who/middleware.py', line 107 in __call__ app_iter = app(environ, wrapper.wrap_start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/tw2.core-2.1.1-py2.7.egg/tw2/core/middleware.py', line 195 in __call__ resp = req.get_response(self.app, catch_exc_info=True) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/WebOb-1.0.8-py2.7.egg/webob/request.py', line 1049 in get_response application, catch_exc_info=True) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/WebOb-1.0.8-py2.7.egg/webob/request.py', line 1022 in call_application app_iter = application(self.environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/ToscaWidgets-0.9.12-py2.7.egg/tw/core/middleware.py', line 46 in __call__ return self.wsgi_app(environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/ToscaWidgets-0.9.12-py2.7.egg/tw/core/middleware.py', line 72 in wsgi_app resp = req.get_response(self.application) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/WebOb-1.0.8-py2.7.egg/webob/request.py', line 1053 in get_response application, catch_exc_info=False) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/WebOb-1.0.8-py2.7.egg/webob/request.py', line 1022 in call_application app_iter = application(self.environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/ToscaWidgets-0.9.12-py2.7.egg/tw/core/resource_injector.py', line 70 in _injector resp = req.get_response(app) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/WebOb-1.0.8-py2.7.egg/webob/request.py', line 1053 in get_response application, catch_exc_info=False) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/WebOb-1.0.8-py2.7.egg/webob/request.py', line 1022 in call_application app_iter = application(self.environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Beaker-1.5.4-py2.7.egg/beaker/middleware.py', line 73 in __call__ return self.app(environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Beaker-1.5.4-py2.7.egg/beaker/middleware.py', line 152 in __call__ return self.wrap_app(environ, session_start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Routes-1.12.3-py2.7.egg/routes/middleware.py', line 131 in __call__ response = self.app(environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Pylons-1.0-py2.7.egg/pylons/wsgiapp.py', line 107 in __call__ response = self.dispatch(controller, environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Pylons-1.0-py2.7.egg/pylons/wsgiapp.py', line 312 in dispatch return controller(environ, start_response) File '/home/moschlar/workspace/SAUCE/sauce/lib/base.py', line 90 in __call__ return super(BaseController, self).__call__(environ, start_response) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Pylons-1.0-py2.7.egg/pylons/controllers/core.py', line 211 in __call__ response = self._dispatch_call() File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Pylons-1.0-py2.7.egg/pylons/controllers/core.py', line 162 in _dispatch_call response = self._inspect_call(func) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Pylons-1.0-py2.7.egg/pylons/controllers/core.py', line 105 in _inspect_call result = self._perform_call(func, args) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/controllers/dispatcher.py', line 258 in _perform_call r = self._call(func, params, remainder=remainder) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/controllers/decoratedcontroller.py', line 120 in _call output = controller_callable(*remainder, **dict(params)) File '<string>', line 2 in post File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/tgext.crud-0.5.3-py2.7.egg/tgext/crud/decorators.py', line 98 in wrapper return self._call(func, params=kwargs, remainder=remainder) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/controllers/decoratedcontroller.py', line 142 in _call response = self._render_response(controller, output) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/controllers/decoratedcontroller.py', line 331 in _render_response **render_params) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/render.py', line 188 in render kwargs['result'] = render_function(template_name, tg_vars, **kwargs) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/render.py', line 428 in render_mako cache_type=cache_type, cache_expire=cache_expire) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/render.py', line 253 in cached_template return render_func() File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/TurboGears2-2.1.5-py2.7.egg/tg/render.py', line 425 in render_template return literal(template.render_unicode(**globs)) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Mako-0.7.0-py2.7.egg/mako/template.py', line 406 in render_unicode as_unicode=True) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Mako-0.7.0-py2.7.egg/mako/runtime.py', line 764 in _render **_kwargs_for_callable(callable_, data)) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Mako-0.7.0-py2.7.egg/mako/runtime.py', line 796 in _render_context _exec_template(inherit, lclcontext, args=args, kwargs=kwargs) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/Mako-0.7.0-py2.7.egg/mako/runtime.py', line 822 in _exec_template callable_(context, *args, **kwargs) File '/home/moschlar/workspace/SAUCE/data/templates/home/moschlar/workspace/SAUCE/sauce/templates/master.mak.py', line 73 in render_body __M_writer(escape(self.main_menu())) File '/home/moschlar/workspace/SAUCE/data/templates/home/moschlar/workspace/SAUCE/sauce/templates/master.mak.py', line 332 in render_main_menu __M_writer(escape(event.url)) File '/home/moschlar/workspace/SAUCE/sauce/model/event.py', line 74 in url return '/events/%s' % self._url File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/attributes.py', line 168 in __get__ return self.impl.get(instance_state(instance),dict_) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/attributes.py', line 451 in get value = callable_(passive) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/state.py', line 285 in __call__ self.manager.deferred_scalar_loader(self, toload) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/mapper.py', line 1714 in _load_scalar_attributes only_load_props=attribute_names) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/query.py', line 2512 in _load_on_ident return q.one() File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/query.py', line 2184 in one ret = list(self) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/query.py', line 2227 in __iter__ return self._execute_and_instances(context) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/query.py', line 2240 in _execute_and_instances close_with_result=True) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/query.py', line 2231 in _connection_from_session **kw) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/session.py', line 777 in connection close_with_result=close_with_result) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/session.py', line 781 in _connection_for_bind return self.transaction._connection_for_bind(engine) File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/session.py', line 289 in _connection_for_bind self._assert_is_active() File '/home/moschlar/src/virtualenv/sauce/lib/python2.7/site-packages/SQLAlchemy-0.7.9-py2.7-linux-i686.egg/sqlalchemy/orm/session.py', line 213 in _assert_is_active % self._rollback_exception InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (IntegrityError) columns sheet_id, assignment_id are not unique u'INSERT INTO assignments (assignment_id, url, name, description, event_id, start_time, end_time, timeout, show_compiler_msg, teacher_id, sheet_id, public) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' (1, None, u'asd', u'', None, None, None, None, 0, None, 1, 0)

