summaryrefslogtreecommitdiffstats
path: root/webapp/django/middleware/transaction.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/django/middleware/transaction.py')
-rw-r--r--webapp/django/middleware/transaction.py27
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