Skip to content

Commit

Permalink
Merge 5617d76 into ba46cad
Browse files Browse the repository at this point in the history
  • Loading branch information
marazmiki committed Nov 17, 2017
2 parents ba46cad + 5617d76 commit ece4d59
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 47 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -1,5 +1,7 @@
*.pyc
*.txt
/.env
/.idea
/.env3
/.stuff
/.tox
Expand Down
67 changes: 60 additions & 7 deletions .travis.yml
@@ -1,13 +1,64 @@
language: python

python: 2.7
python:
- 2.7
- 3.5
- 3.6

env:
- TOXENV=py27-d9
- TOXENV=py35-d9
- TOXENV=py27-d10
- TOXENV=py35-d10
- TOXENV=cov
- TOXENV=cov

matrix:
include:
- python: 2.7
env: TOXENV=py27-d9
- python: 2.7
env: TOXENV=py27-d10

- python: 3.5
env: TOXENV=py35-d9
- python: 3.5
env: TOXENV=py35-d10
- python: 3.5
env: TOXENV=py35-d11

- python: 3.6
env: TOXENV=py36-d11
- python: 3.6
env: TOXENV=py36-d20

exlcude:
- python: 2.7
env: TOXENV=py35-d9
- python: 2.7
env: TOXENV=py35-d10
- python: 2.7
env: TOXENV=py35-d11
- python: 2.7
env: TOXENV=py36-d11
- python: 2.7
env: TOXENV=py36-d20

- python: 3.5
env: TOXENV=py27-d9
- python: 3.5
env: TOXENV=py27-d10
- python: 3.5
env: TOXENV=py36-d11
- python: 3.5
env: TOXENV=py36-d20

- python: 3.6
env: TOXENV=py27-d9
- python: 3.6
env: TOXENV=py27-d10
- python: 3.6
env: TOXENV=py35-d9
- python: 3.6
env: TOXENV=py35-d10
- python: 3.6
env: TOXENV=py35-d11


branches:
only:
Expand All @@ -16,7 +67,9 @@ branches:

install: pip install --quiet tox

script: tox

script: tox -e ${TOXENV}


after_script:
- if [ $TOXENV == "cov" ]; then
Expand Down
6 changes: 6 additions & 0 deletions Changelog
@@ -1,3 +1,9 @@
2017-11-06 marazmiki

* Added Django 2.0 support for Python 3.6;
* Added Django 1.10 support for Python 3.6;
* Added Django 1.11 support for Python 3.5+.

2016-11-16 horneds

* Basic Marshmallow support
Expand Down
12 changes: 6 additions & 6 deletions README.rst
Expand Up @@ -56,9 +56,9 @@ documentation enhancements and/or fixes are awesome and most welcome.**
Requirements
=============

- python (2.6, 2.7, 3.2, 3.3, 3.4)
- fake-factory >= 0.5.0
- Django (1.6, 1.7, 1.8) for Django ORM support;
- python 2.7 or 3.4+
- Faker >= 0.7.3
- Django (1.8+ ) for Django ORM support;
- SQLAlchemy for SQLAlchemy ORM support;
- Mongoengine for Mongoengine ODM support;
- Flask-SQLALchemy for SQLAlchemy ORM support and integration as Flask application;
Expand Down Expand Up @@ -178,7 +178,7 @@ Mongoengine workflow
Example usage: ::

from mixer.backend.mongoengine import mixer

class User(Document):
created_at = DateTimeField(default=datetime.datetime.now)
email = EmailField(required=True)
Expand Down Expand Up @@ -256,7 +256,7 @@ Or you can temporary switch context use the mixer as context manager: ::
# Will not be save to db
with mixer.ctx(commit=False):
user2 = mixer.blend('auth.user')


.. _custom:

Expand Down Expand Up @@ -375,10 +375,10 @@ Contributors
* Mahdi Yusuf (https://github.com/myusuf3)
* Marek Baczyński (https://github.com/imbaczek)
* Matt Caldwell (https://github.com/mattcaldwell)
* Mikhail Porokhovnichenko (https://github.com/marazmiki)
* Skylar Saveland (https://github.com/skyl)
* Suriya Subramanian (https://github.com/suriya)


License
=======

Expand Down
25 changes: 20 additions & 5 deletions mixer/backend/django.py
Expand Up @@ -189,17 +189,25 @@ def postprocess(self, target, postprocess_values):

# # If the ManyToMany relation has an intermediary model,
# # the add and remove methods do not exist.
if not deffered.scheme.rel.through._meta.auto_created and self.__mixer: # noqa
if VERSION < (2, 0):
through = deffered.scheme.rel.through
else:
through = deffered.scheme.remote_field.through

if not through._meta.auto_created and self.__mixer: # noqa
self.__mixer.blend(
deffered.scheme.rel.through, **{
through, **{
deffered.scheme.m2m_field_name(): target,
deffered.scheme.m2m_reverse_field_name(): value})
continue

if not isinstance(value, (list, tuple)):
value = [value]

setattr(target, name, value)
if VERSION < (2, 0):
setattr(target, name, value)
else:
getattr(target, name).set(value)

return target

Expand Down Expand Up @@ -248,7 +256,10 @@ def gen_select(self, field_name, select):

try:
field = self.__fields[field_name]
return field.name, field.scheme.rel.to.objects.filter(**select.params).order_by('?')[0]
if VERSION < (2, 0):
return field.name, field.scheme.rel.to.objects.filter(**select.params).order_by('?')[0]
else:
return field.name, field.scheme.remote_field.model.objects.filter(**select.params).order_by('?')[0]

except Exception:
raise Exception("Cannot find a value for the field: '{0}'".format(field_name))
Expand Down Expand Up @@ -382,8 +393,12 @@ def reload(self, obj):
return self.__scheme._default_manager.get(pk=obj.pk)

def __load_fields(self):
if VERSION < (2, 0):
private_fields = self.__scheme._meta.virtual_fields
else:
private_fields = self.__scheme._meta.private_fields

for field in self.__scheme._meta.virtual_fields:
for field in private_fields:
yield field.name, t.Field(field, field.name)

for field in self.__scheme._meta.fields:
Expand Down
3 changes: 3 additions & 0 deletions setup.py
Expand Up @@ -56,7 +56,10 @@ def _read(fname):
'Natural Language :: Russian',
'Operating System :: OS Independent',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python',
'Topic :: Software Development :: Libraries :: Python Modules',
'Topic :: Software Development :: Testing',
Expand Down
26 changes: 13 additions & 13 deletions tests/django_app/migrations/0001_initial.py
Expand Up @@ -32,7 +32,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Customer',
fields=[
('user_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
('user_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
('name', models.CharField(max_length=100)),
],
options={
Expand Down Expand Up @@ -79,7 +79,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('content', models.TextField()),
('client', models.ForeignKey(to='django_app.Client')),
('client', models.ForeignKey(to='django_app.Client', on_delete=models.CASCADE)),
],
options={
},
Expand All @@ -97,7 +97,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='ColorNumber',
fields=[
('number_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='django_app.Number')),
('number_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='django_app.Number', on_delete=models.CASCADE)),
('color', models.CharField(max_length=20)),
],
options={
Expand Down Expand Up @@ -148,7 +148,7 @@ class Migration(migrations.Migration):
('object_id', models.PositiveIntegerField()),
('error_code', models.PositiveSmallIntegerField()),
('custom', CustomField(max_length=24)),
('content_type', models.ForeignKey(to='contenttypes.ContentType')),
('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)),
('binary', models.BinaryField()),
],
options={
Expand All @@ -160,7 +160,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('color', models.CharField(max_length=20)),
('hat', models.ForeignKey(to='django_app.Hat')),
('hat', models.ForeignKey(to='django_app.Hat', on_delete=models.CASCADE)),
],
options={
},
Expand All @@ -181,7 +181,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=20)),
('customer', models.ForeignKey(blank=True, to='django_app.Customer', null=True)),
('customer', models.ForeignKey(blank=True, to='django_app.Customer', on_delete=models.CASCADE, null=True)),
('messages', models.ManyToManyField(to='django_app.Message', null=True, blank=True)),
],
options={
Expand All @@ -192,8 +192,8 @@ class Migration(migrations.Migration):
name='Through',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('pointas', models.ForeignKey(to='django_app.PointA')),
('pointbs', models.ForeignKey(to='django_app.PointB')),
('pointas', models.ForeignKey(to='django_app.PointA', on_delete=models.CASCADE)),
('pointbs', models.ForeignKey(to='django_app.PointB', on_delete=models.CASCADE)),
],
options={
},
Expand All @@ -202,7 +202,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='rabbit',
name='one2one',
field=models.OneToOneField(to='django_app.Simple'),
field=models.OneToOneField(to='django_app.Simple', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AddField(
Expand All @@ -226,25 +226,25 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='hole',
name='owner',
field=models.ForeignKey(to='django_app.Rabbit'),
field=models.ForeignKey(to='django_app.Rabbit', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AddField(
model_name='hat',
name='owner',
field=models.ForeignKey(blank=True, to='django_app.Rabbit', null=True),
field=models.ForeignKey(blank=True, to='django_app.Rabbit', on_delete=models.CASCADE, null=True),
preserve_default=True,
),
migrations.AddField(
model_name='door',
name='hole',
field=models.ForeignKey(to='django_app.Hole'),
field=models.ForeignKey(to='django_app.Hole', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AddField(
model_name='door',
name='owner',
field=models.ForeignKey(blank=True, to='django_app.Rabbit', null=True),
field=models.ForeignKey(blank=True, to='django_app.Rabbit', on_delete=models.CASCADE, null=True),
preserve_default=True,
),
]
Expand Down
22 changes: 11 additions & 11 deletions tests/django_app/models.py
Expand Up @@ -43,15 +43,15 @@ class Rabbit(models.Model):
url = models.URLField(null=True, blank=True, default='')

file_path = models.FilePathField()
content_type = models.ForeignKey(ct_models.ContentType)
content_type = models.ForeignKey(ct_models.ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
error_code = models.PositiveSmallIntegerField()
custom = CustomField(max_length=24)
content_object = GenericForeignKey('content_type', 'object_id')

binary = models.BinaryField()

one2one = models.OneToOneField('django_app.Simple')
one2one = models.OneToOneField('django_app.Simple', on_delete=models.CASCADE)

def save(self, **kwargs):
""" Custom save. """
Expand All @@ -66,7 +66,7 @@ def save(self, **kwargs):
class Hole(models.Model):
title = models.CharField(max_length=16)
size = models.SmallIntegerField()
owner = models.ForeignKey(Rabbit)
owner = models.ForeignKey(Rabbit, on_delete=models.CASCADE)

# FIXME compatibility
rabbits = GenericRelation(Rabbit, **({'related_query_name': 'holes'}))
Expand All @@ -79,17 +79,17 @@ class Hat(models.Model):
('BL', 'blue'),
))
brend = models.CharField(max_length=10, default='wood')
owner = models.ForeignKey(Rabbit, null=True, blank=True)
owner = models.ForeignKey(Rabbit, on_delete=models.CASCADE, null=True, blank=True)


class Silk(models.Model):
color = models.CharField(max_length=20)
hat = models.ForeignKey(Hat)
hat = models.ForeignKey(Hat, on_delete=models.CASCADE)


class Door(models.Model):
hole = models.ForeignKey(Hole)
owner = models.ForeignKey(Rabbit, null=True, blank=True)
hole = models.ForeignKey(Hole, on_delete=models.CASCADE)
owner = models.ForeignKey(Rabbit, on_delete=models.CASCADE, null=True, blank=True)
size = models.PositiveIntegerField()


Expand All @@ -113,13 +113,13 @@ class Client(models.Model):

class Message(models.Model):
content = models.TextField()
client = models.ForeignKey(Client)
client = models.ForeignKey(Client, on_delete=models.CASCADE)


class Tag(models.Model):
title = models.CharField(max_length=20)

customer = models.ForeignKey(Customer, blank=True, null=True)
customer = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=True, null=True)
messages = models.ManyToManyField(Message, null=True, blank=True)


Expand All @@ -133,8 +133,8 @@ class PointA(models.Model):


class Through(models.Model):
pointas = models.ForeignKey(PointA)
pointbs = models.ForeignKey(PointB)
pointas = models.ForeignKey(PointA, on_delete=models.CASCADE)
pointbs = models.ForeignKey(PointB, on_delete=models.CASCADE)


class Simple(models.Model):
Expand Down

0 comments on commit ece4d59

Please sign in to comment.