diff options
Diffstat (limited to 'webapp/django/middleware/transaction.py')
-rw-r--r-- | webapp/django/middleware/transaction.py | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/webapp/django/middleware/transaction.py b/webapp/django/middleware/transaction.py new file mode 100644 index 0000000000..96b1538d9d --- /dev/null +++ b/webapp/django/middleware/transaction.py @@ -0,0 +1,27 @@ +from django.db import transaction + +class TransactionMiddleware(object): + """ + Transaction middleware. If this is enabled, each view function will be run + with commit_on_response activated - that way a save() doesn't do a direct + commit, the commit is done when a successful response is created. If an + exception happens, the database is rolled back. + """ + def process_request(self, request): + """Enters transaction management""" + transaction.enter_transaction_management() + transaction.managed(True) + + def process_exception(self, request, exception): + """Rolls back the database and leaves transaction management""" + if transaction.is_dirty(): + transaction.rollback() + transaction.leave_transaction_management() + + def process_response(self, request, response): + """Commits and leaves transaction management.""" + if transaction.is_managed(): + if transaction.is_dirty(): + transaction.commit() + transaction.leave_transaction_management() + return response |