Skip to content

Commit

Permalink
Merge pull request #233 from bmihelac/django-1.8-fixes
Browse files Browse the repository at this point in the history
Django 1.8 fixes
  • Loading branch information
bmihelac committed Apr 15, 2015
2 parents 7fd35d8 + d7bc2f1 commit 8a7d97e
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 16 deletions.
4 changes: 3 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@ language: python
python:
- "2.7"
- "3.3"
- "3.4"
env:
- DJANGO=1.4.10
- DJANGO=1.5.5
- DJANGO=1.6.1
- DJANGO=1.7.0
- DJANGO=1.8
install:
- pip install -q Django==$DJANGO --use-mirrors
- pip install -e git+https://github.com/kennethreitz/tablib.git#egg=tablib
- pip install -r requirements/base.txt --use-mirrors
script:
- if [[ $TRAVIS_PYTHON_VERSION != '3.3' || $DJANGO != "1.4.10" ]]; then python tests/manage.py test core --settings=settings; fi
- if [[ ($TRAVIS_PYTHON_VERSION != '3.3' && $TRAVIS_PYTHON_VERSION != '3.4') || $DJANGO != "1.4.10" ]]; then python tests/manage.py test core --settings=settings; fi
2 changes: 2 additions & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ Changelog for django-import-export
0.2.7 (unreleased)
------------------

- Django 1.8 compatibility

- Call before_import before creating the instance_loader - fixes #193


Expand Down
23 changes: 23 additions & 0 deletions import_export/django_compat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from __future__ import unicode_literals

from django.db import transaction

# transaction management for Django < 1.6

def atomic(*args, **kw):
def noop_decorator(func):
return func # pass through

return noop_decorator

def savepoint(*args, **kwargs):
transaction.enter_transaction_management()
transaction.managed(True)

def savepoint_rollback(*args, **kwargs):
transaction.rollback()
transaction.leave_transaction_management()

def savepoint_commit(*args, **kwargs):
transaction.commit()
transaction.leave_transaction_management()
40 changes: 26 additions & 14 deletions import_export/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@
import tablib
from diff_match_patch import diff_match_patch

from django import VERSION
from django.utils.safestring import mark_safe
from django.utils import six
from django.db import transaction
from django.db.models.fields import FieldDoesNotExist
from django.db.models.query import QuerySet
from django.db.models.related import RelatedObject
from django.conf import settings

from .results import Error, Result, RowResult
Expand All @@ -23,6 +22,18 @@
ModelInstanceLoader,
)

try:
from django.db.transaction import atomic, savepoint, savepoint_rollback, savepoint_commit # noqa
except ImportError:
from .django_compat import atomic, savepoint, savepoint_rollback, savepoint_commit # noqa


if VERSION < (1, 8):
from django.db.models.related import RelatedObject
ForeignObjectRel = RelatedObject
else:
from django.db.models.fields.related import ForeignObjectRel
RelatedObject = None

try:
from django.utils.encoding import force_text
Expand Down Expand Up @@ -279,6 +290,7 @@ def before_import(self, dataset, dry_run):
"""
pass

@atomic()
def import_data(self, dataset, dry_run=False, raise_errors=False,
use_transactions=None):
"""
Expand All @@ -299,8 +311,7 @@ def import_data(self, dataset, dry_run=False, raise_errors=False,
# when transactions are used we want to create/update/delete object
# as transaction will be rolled back if dry_run is set
real_dry_run = False
transaction.enter_transaction_management()
transaction.managed(True)
sp1 = savepoint()
else:
real_dry_run = dry_run

Expand All @@ -311,8 +322,7 @@ def import_data(self, dataset, dry_run=False, raise_errors=False,
result.base_errors.append(Error(repr(e), tb_info))
if raise_errors:
if use_transactions:
transaction.rollback()
transaction.leave_transaction_management()
savepoint_rollback(sp1)
raise

instance_loader = self._meta.instance_loader_class(self, dataset)
Expand Down Expand Up @@ -354,19 +364,17 @@ def import_data(self, dataset, dry_run=False, raise_errors=False,
row_result.errors.append(Error(e, tb_info))
if raise_errors:
if use_transactions:
transaction.rollback()
transaction.leave_transaction_management()
savepoint_rollback(sp1)
six.reraise(*sys.exc_info())
if (row_result.import_type != RowResult.IMPORT_TYPE_SKIP or
self._meta.report_skipped):
result.rows.append(row_result)

if use_transactions:
if dry_run or result.has_errors():
transaction.rollback()
savepoint_rollback(sp1)
else:
transaction.commit()
transaction.leave_transaction_management()
savepoint_commit(sp1)

return result

Expand Down Expand Up @@ -462,14 +470,18 @@ def __new__(cls, name, bases, attrs):
# We're not at the last attribute yet, so check that
# we're looking at a relation, and move on to the
# next model.
if isinstance(f, RelatedObject):
model = f.model
if isinstance(f, ForeignObjectRel):
if RelatedObject is None:
model = f.related_model
else:
# Django < 1.8
model = f.model
else:
if f.rel is None:
raise KeyError('%s is not a relation' % verbose_path)
model = f.rel.to

if isinstance(f, RelatedObject):
if isinstance(f, ForeignObjectRel):
f = f.field

field = new_class.field_from_django_field(field_name, f,
Expand Down
25 changes: 24 additions & 1 deletion tox.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[tox]
envlist = py26-1.4, py27-1.4, py27-tablib-dev-1.4, py27-mysql-innodb-1.4, py27-1.5, py27-1.6, py33-1.6, py27-1.7, py33-1.7
envlist = py26-1.4, py27-1.4, py27-tablib-dev-1.4, py27-mysql-innodb-1.4, py27-1.5, py27-1.6, py33-1.6, py27-1.7, py33-1.7, py34-1.7, py27-1.8, py33-1.8, py34-1.8

[testenv]
commands=python {toxinidir}/tests/manage.py test core
Expand Down Expand Up @@ -54,3 +54,26 @@ basepython = python3.3
deps =
django==1.7.0
-egit+https://github.com/kennethreitz/tablib.git#egg=tablib

[testenv:py34-1.7]
basepython = python3.4
deps =
django==1.7.0
-egit+https://github.com/kennethreitz/tablib.git#egg=tablib

[testenv:py27-1.8]
basepython = python2.7
deps =
django==1.8

[testenv:py33-1.8]
basepython = python3.3
deps =
django==1.8
-egit+https://github.com/kennethreitz/tablib.git#egg=tablib

[testenv:py34-1.8]
basepython = python3.4
deps =
django==1.8
-egit+https://github.com/kennethreitz/tablib.git#egg=tablib

0 comments on commit 8a7d97e

Please sign in to comment.