diff --git a/mayan/apps/common/__init__.py b/mayan/apps/common/__init__.py index de85ce4b66..88d46d4663 100644 --- a/mayan/apps/common/__init__.py +++ b/mayan/apps/common/__init__.py @@ -2,23 +2,23 @@ from __future__ import absolute_import import tempfile -from south.signals import post_migrate - -from django.utils.translation import ugettext_lazy as _ from django.contrib.auth import models as auth_models -from django.contrib.auth.models import User from django.contrib.auth.management import create_superuser -from django.dispatch import receiver -from django.db.models.signals import post_save +from django.contrib.auth.models import User from django.db import transaction, DatabaseError +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.utils.translation import ugettext_lazy as _ + +from south.signals import post_migrate from navigation.api import register_links, register_top_menu +from .conf import settings as common_settings from .conf.settings import (AUTO_CREATE_ADMIN, AUTO_ADMIN_USERNAME, AUTO_ADMIN_PASSWORD, TEMPORARY_DIRECTORY) -from .conf import settings as common_settings -from .utils import validate_path from .models import AutoAdminSingleton +from .utils import validate_path def has_usable_password(context): @@ -72,14 +72,14 @@ def create_superuser(sender, **kwargs): @receiver(post_save, dispatch_uid='auto_admin_account_passwd_change', sender=User) def auto_admin_account_passwd_change(sender, instance, **kwargs): - with transaction.commit_on_success(): - try: + try: + with transaction.atomic(): auto_admin_properties = AutoAdminSingleton.objects.get() if instance == auto_admin_properties.account and instance.password != auto_admin_properties.password_hash: # Only delete the auto admin properties when the password has been changed auto_admin_properties.delete(force=True) - except DatabaseError: - transaction.rollback() + except DatabaseError: + pass if (validate_path(TEMPORARY_DIRECTORY) == False) or (not TEMPORARY_DIRECTORY): diff --git a/mayan/apps/history/api.py b/mayan/apps/history/api.py index 1a8a8e613a..8f9108e3cf 100644 --- a/mayan/apps/history/api.py +++ b/mayan/apps/history/api.py @@ -1,30 +1,28 @@ from __future__ import absolute_import -import pickle import json +import pickle -from django.db import transaction +from django.db import models, transaction +from django.db.utils import DatabaseError from django.core import serializers from django.shortcuts import get_object_or_404 -from django.db import models -from django.db.utils import DatabaseError from .models import HistoryType, History from .runtime_data import history_types_dict -@transaction.commit_on_success def register_history_type(history_type_dict): namespace = history_type_dict['namespace'] name = history_type_dict['name'] try: - history_type_obj, created = HistoryType.objects.get_or_create( - namespace=namespace, name=name) - history_type_obj.save() + with transaction.atomic(): + history_type_obj, created = HistoryType.objects.get_or_create( + namespace=namespace, name=name) + history_type_obj.save() except DatabaseError: - # Special case for syncdb - transaction.rollback() + pass # Runtime history_types_dict.setdefault(namespace, {}) diff --git a/mayan/apps/installation/__init__.py b/mayan/apps/installation/__init__.py index ea484cf99a..1e2fb1f209 100644 --- a/mayan/apps/installation/__init__.py +++ b/mayan/apps/installation/__init__.py @@ -25,13 +25,13 @@ def trigger_first_time(sender, **kwargs): details.save() -@transaction.commit_on_success def check_first_run(): try: - details = Installation.objects.get() + with transaction.atomic(): + details = Installation.objects.get() except DatabaseError: # Avoid database errors when the app tables haven't been created yet - transaction.rollback() + pass else: if details.is_first_run: details.submit() diff --git a/mayan/apps/lock_manager/managers.py b/mayan/apps/lock_manager/managers.py index 99145e8c5a..afb7a55fab 100644 --- a/mayan/apps/lock_manager/managers.py +++ b/mayan/apps/lock_manager/managers.py @@ -1,11 +1,10 @@ from __future__ import absolute_import -import logging import datetime +import logging +from django.db import models, transaction from django.db.utils import IntegrityError -from django.db import transaction -from django.db import models from .exceptions import LockError @@ -13,16 +12,16 @@ logger = logging.getLogger(__name__) class LockManager(models.Manager): - @transaction.commit_on_success def acquire_lock(self, name, timeout=None): logger.debug('trying to acquire lock: %s' % name) lock = self.model(name=name, timeout=timeout) + try: - lock.save(force_insert=True) - logger.debug('acquired lock: %s' % name) - return lock + with transaction.atomic(): + lock.save(force_insert=True) + logger.debug('acquired lock: %s' % name) + return lock except IntegrityError, msg: - transaction.rollback() logger.debug('IntegrityError: %s', msg) # There is already an existing lock # Check it's expiration date and if expired, reset it diff --git a/mayan/apps/ocr/__init__.py b/mayan/apps/ocr/__init__.py index 2b8d6d69ef..e49fcf8301 100644 --- a/mayan/apps/ocr/__init__.py +++ b/mayan/apps/ocr/__init__.py @@ -43,18 +43,6 @@ register_links(['document_queue_disable', 'document_queue_enable', 'queue_docume register_maintenance_links([all_document_ocr_cleanup], namespace='ocr', title=_(u'OCR')) -@transaction.commit_on_success -def create_default_queue(): - try: - default_queue, created = DocumentQueue.objects.get_or_create(name='default') - except DatabaseError: - transaction.rollback() - else: - if created: - default_queue.label = ugettext(u'Default') - default_queue.save() - - @receiver(post_save, dispatch_uid='document_post_save', sender=DocumentVersion) def document_post_save(sender, instance, **kwargs): logger.debug('received post save signal') @@ -69,7 +57,8 @@ def document_post_save(sender, instance, **kwargs): @receiver(post_syncdb, dispatch_uid='create_default_queue', sender=ocr_models) def create_default_queue_signal_handler(sender, **kwargs): - create_default_queue() + default_queue, created = DocumentQueue.objects.get_or_create(name='default') + register_interval_job('task_process_document_queues', _(u'Checks the OCR queue for pending documents.'), task_process_document_queues, seconds=QUEUE_PROCESSING_INTERVAL) diff --git a/mayan/apps/registration/__init__.py b/mayan/apps/registration/__init__.py index d275de67ea..536ac8ac40 100644 --- a/mayan/apps/registration/__init__.py +++ b/mayan/apps/registration/__init__.py @@ -18,8 +18,8 @@ form_view = {'text': _('Registration'), 'view': 'form_view', 'famfam': 'telephon register_links(['form_view'], [about_view, license_view], menu_name='secondary_menu') register_links(['form_view', 'about_view', 'license_view'], [form_view], menu_name='secondary_menu') -with transaction.commit_on_success(): - try: +try: + with transaction.atomic(): RegistrationSingleton.objects.get() - except DatabaseError: - transaction.rollback() +except DatabaseError: + pass diff --git a/mayan/apps/sources/models.py b/mayan/apps/sources/models.py index 24e9f47cc2..9a9de8c78a 100644 --- a/mayan/apps/sources/models.py +++ b/mayan/apps/sources/models.py @@ -3,30 +3,29 @@ from __future__ import absolute_import from ast import literal_eval import logging -from django.db import models -from django.utils.translation import ugettext_lazy as _ -from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError -from django.db import transaction +from django.db import models, transaction +from django.utils.translation import ugettext_lazy as _ +from acls.utils import apply_default_acls from common.compressed_files import CompressedFile, NotACompressedFile from converter.api import get_available_transformations_choices from converter.literals import DIMENSION_SEPARATOR -from documents.models import Document -from documents.events import HISTORY_DOCUMENT_CREATED from document_indexing.api import update_indexes +from documents.events import HISTORY_DOCUMENT_CREATED +from documents.models import Document from history.api import create_history from metadata.api import save_metadata_list from scheduler.api import register_interval_job, remove_job -from acls.utils import apply_default_acls -from .managers import SourceTransformationManager from .literals import (SOURCE_CHOICES, SOURCE_CHOICES_PLURAL, SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES, SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING, SOURCE_ICON_DISK, SOURCE_ICON_DRIVE, SOURCE_ICON_CHOICES, SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICES, SOURCE_UNCOMPRESS_CHOICE_Y) +from .managers import SourceTransformationManager logger = logging.getLogger(__name__) @@ -85,7 +84,7 @@ class BaseModel(models.Model): file_object.close() return {'is_compressed': is_compressed} - @transaction.commit_on_success + @transaction.atomic def upload_single_file(self, file_object, filename=None, use_file_name=False, document_type=None, metadata_dict_list=None, user=None, document=None, new_version_data=None): new_document = not document diff --git a/mayan/settings.py b/mayan/settings.py index 91773b4000..035bbf991c 100644 --- a/mayan/settings.py +++ b/mayan/settings.py @@ -106,14 +106,14 @@ TEMPLATE_LOADERS = ( ) MIDDLEWARE_CLASSES = ( - 'common.middleware.strip_spaces_widdleware.SpacelessMiddleware', - 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.transaction.TransactionMiddleware', - 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.locale.LocaleMiddleware', + 'common.middleware.strip_spaces_widdleware.SpacelessMiddleware', 'common.middleware.login_required_middleware.LoginRequiredMiddleware', 'permissions.middleware.permission_denied_middleware.PermissionDeniedMiddleware', 'pagination.middleware.PaginationMiddleware',