Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion model_clone/mixins/clone.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,6 @@ def make_clone(self, attrs=None, sub_clone=False):
for name, value in attrs.items():
setattr(duplicate, name, value)

duplicate.full_clean()
duplicate.save()

duplicate = self.__duplicate_o2o_fields(duplicate)
Expand Down
36 changes: 27 additions & 9 deletions model_clone/tests/test_clone_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from django.db.transaction import TransactionManagementError
from django.test import TestCase, TransactionTestCase
from django.utils.text import slugify
from django.db.utils import IntegrityError
from django.utils.timezone import make_naive
from mock import patch, PropertyMock

Expand All @@ -19,7 +20,7 @@
Room,
Furniture,
Cover,
BackCover,
BackCover, Tag,
)

User = get_user_model()
Expand All @@ -34,7 +35,7 @@ def setUpTestData(cls):
def test_cloning_a_transient_instance_with_pk_is_invalid(self):
instance = Library()

with self.assertRaises(ValidationError):
with self.assertRaises(IntegrityError):
instance.make_clone()

def test_cloning_a_transient_instance_is_invalid(self):
Expand Down Expand Up @@ -201,16 +202,33 @@ def test_cloning_with_explicit_clone_m2m_fields(
)
_clone_m2m_fields_mock.return_value = ["authors"]

book = Book.objects.create(
name="New Book", created_by=self.user1, slug=slugify("New Book")
book_1 = Book.objects.create(
name="New Book 1", created_by=self.user1, slug=slugify("New Book 1")
)
book.authors.set([author_1, author_2])
book_1.authors.set([author_1, author_2])

book_clone = book.make_clone()
book_clone_1 = book_1.make_clone()

self.assertEqual(
list(book.authors.values_list("first_name", "last_name")),
list(book_clone.authors.values_list("first_name", "last_name")),
list(book_1.authors.values_list("first_name", "last_name")),
list(book_clone_1.authors.values_list("first_name", "last_name")),
)

tag_1 = Tag.objects.create(name='test-tag-1')
tag_2 = Tag.objects.create(name='test-tag-2')

_clone_m2m_fields_mock.return_value = ["tags"]

book_2 = Book.objects.create(
name="New Book 2", created_by=self.user1, slug=slugify("New Book 2")
)
book_2.tags.set([tag_1, tag_2])

book_clone_2 = book_2.make_clone()

self.assertEqual(
list(book_2.tags.values_list("name")),
list(book_clone_2.tags.values_list("name")),
)

@patch("sample.models.Author._clone_excluded_fields", new_callable=PropertyMock)
Expand Down Expand Up @@ -289,7 +307,7 @@ def test_cloning_unique_field_with_use_unique_duplicate_suffix_set_to_False(
sex="F",
created_by=self.user1,
)
with self.assertRaises(ValidationError):
with self.assertRaises(IntegrityError):
author.make_clone()

use_unique_duplicate_suffix_mock.assert_called()
Expand Down
92 changes: 92 additions & 0 deletions sample/migrations/0014_auto_20210422_1449.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Generated by Django 3.2 on 2021-04-22 14:49

from django.db import migrations, models
import django.db.models.deletion
import model_clone.mixins.clone


class Migration(migrations.Migration):

dependencies = [
('sample', '0013_edition'),
]

operations = [
migrations.CreateModel(
name='Tag',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
options={
'abstract': False,
},
bases=(model_clone.mixins.clone.CloneMixin, models.Model),
),
migrations.AlterField(
model_name='assignment',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='author',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='backcover',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='book',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='cover',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='edition',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='furniture',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='house',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='page',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='room',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.CreateModel(
name='BookTag',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('book', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sample.book')),
('tag', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='sample.tag')),
],
options={
'unique_together': {('book', 'tag')},
},
),
migrations.AddField(
model_name='book',
name='tags',
field=models.ManyToManyField(through='sample.BookTag', to='sample.Tag'),
),
]
18 changes: 18 additions & 0 deletions sample/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ class Meta:
unique_together = (("first_name", "last_name", "sex"),)


class Tag(CloneModel):
name = models.CharField(max_length=255)

def __str__(self):
return _(self.name)


class Book(CloneModel):
name = models.CharField(max_length=2000)
slug = models.SlugField(unique=True)
Expand All @@ -44,11 +51,22 @@ class Book(CloneModel):
on_delete=models.PROTECT,
)
created_at = models.DateTimeField(auto_now_add=True)
tags = models.ManyToManyField(Tag, through='BookTag')

def __str__(self):
return _(self.name)


class BookTag(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
tag = models.ForeignKey(Tag, on_delete=models.PROTECT)

class Meta:
unique_together = [
('book', 'tag'),
]


class Page(CloneModel):
content = models.CharField(max_length=20000)
book = models.ForeignKey(Book, on_delete=models.CASCADE)
Expand Down
18 changes: 18 additions & 0 deletions sample_assignment/migrations/0002_alter_contract_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2 on 2021-04-22 14:49

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('sample_assignment', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='contract',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]
18 changes: 18 additions & 0 deletions sample_company/migrations/0002_alter_companydepot_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2 on 2021-04-22 14:49

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('sample_company', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='companydepot',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]
18 changes: 18 additions & 0 deletions sample_driver/migrations/0002_alter_driver_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.2 on 2021-04-22 14:49

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('sample_driver', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='driver',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]