0

I have a test case using Django MigratorTestCase. Previously the test case was working fine but then I had to add a column called updated and I made migrations to the project but ever since then the unit test case has been failing and I am not sure why.

When debugging the code I have realized that the error is from the line assign_perm("delete_dataset", self.user1, self.d1) in Unit Test Case

The column well exists since I am able to perform SQL actions on the column

I apologize if I posted a bunch of unnecessary info. Thanks in advance guys.

Unit Test Case:

class DatasetPermissiontestCase(MigratorTestCase):
migrate_from = [
    ("guardian", "0002_generic_permissions_index"),
    ("project", "0037_dataset_public"),
]
migrate_to = ("project", "0038_update_dataset_permission")

def prepare(self):
    Dataset = self.old_state.apps.get_model("project", "Dataset")
    ctype = get_content_type(Dataset)
    ctype.save()
    Permission.objects.bulk_create(
        [
            Permission(codename="change_dataset", content_type=ctype),
            Permission(codename="delete_dataset", content_type=ctype),
            Permission(codename="view_dataset", content_type=ctype),
        ]
    )

    self.user1 = User.objects.create_user(username="a")
    self.d1 = Dataset.objects.create(name="d1")
    assign_perm("delete_dataset", self.user1, self.d1)

def test_permission_updated(self):
    self.assertSetEqual(
        set(["delete_dataset"]),
        set(get_perms(self.user1, self.d1)),
        "permission should get updated after migration",
    )

Exception Stack Trace:

E
======================================================================
ERROR: test_permission_updated (project.tests.DatasetPermissiontestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 573, in get_or_create
    return self.get(**kwargs), False
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 431, in get
    self.model._meta.object_name
guardian.models.models.UserObjectPermission.DoesNotExist: UserObjectPermission matching query does not exist.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such column: project_dataset.updated

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django_test_migrations\contrib\unittest_case.py", line 40, in setUp
    self.prepare()
  File "C:\Users\admin\Desktop\project\project\tests.py", line 1865, in prepare
    assign_perm("delete_dataset", self.user1, self.d1)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\guardian\shortcuts.py", line 123, in assign_perm
    return model.objects.assign_perm(perm, user, obj)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\guardian\managers.py", line 49, in assign_perm
    obj_perm, _ = self.get_or_create(**kwargs)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 576, in get_or_create
    return self._create_object_from_params(kwargs, params)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 610, in _create_object_from_params
    obj = self.create(**params)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 447, in create
    obj.save(force_insert=True, using=self.db)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\guardian\models\models.py", line 29, in save
    content_type = get_content_type(self.content_object)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\contrib\contenttypes\fields.py", line 242, in __get__
    rel_obj = ct.get_object_for_this_type(pk=pk_val)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\contrib\contenttypes\models.py", line 175, in get_object_for_this_type
    return self.model_class()._base_manager.using(self._state.db).get(**kwargs)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 425, in get
    num = len(clone)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 269, in __len__
    self._fetch_all()
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 1308, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\models\sql\compiler.py", line 1156, in execute_sql
    cursor.execute(sql, params)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\admin\Anaconda3\envs\project\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such column: project_dataset.updated

0038_update_dataset_permission.py

# Generated by Django 3.0.2 on 2020-12-03 01:52

from django.contrib.auth.models import User
from django.db import migrations
from guardian.shortcuts import assign_perm, get_objects_for_user


def forwards_func(apps, schema_editor):
    Dataset = apps.get_model('project', 'Dataset')
    for user in User.objects.all():
        datasets = get_objects_for_user(user, 'delete_dataset', Dataset)
        for dataset in datasets:
            assign_perm('change_dataset', user, dataset)
            assign_perm('view_dataset', user, dataset)


class Migration(migrations.Migration):
    dependencies = [
        ('project', '0037_dataset_public'),
    ]

    operations = [
        migrations.RunPython(forwards_func),
    ]
Blacky_99
  • 155
  • 4
  • 20

0 Answers0