AttributeError: 'mappingproxy' object has no attribute 'iteritems'
quater opened this issue · 7 comments
As of writing this here, the Django Shop documentation http://django-shop.readthedocs.org/en/latest/tutorial/intro.html does not specify any Python version requirements. Since Django CMS supports Python 3.4 I thought that I can use Python 3.4 for Django Shop as well.
However it appears that parts of Django Shop are not yet compatible with Python 3.x.
While dealing with issue #48 I was using Python 3.4 and encountered the below error:
(shoptutorial) vagrant@vagrant:~/django-shop/example$ ./manage.py migrate
/home/vagrant/django-shop/shop/models/order.py:95: RemovedInDjango19Warning: import_by_path() has been deprecated. Use import_string() instead.
bases = tuple(import_by_path(mc) for mc in shop_settings.ORDER_WORKFLOWS) + bases
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/__init__.py", line 328, in execute
django.setup()
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/apps/config.py", line 198, in import_models
self.models_module = import_module(models_module_name)
File "/home/vagrant/shoptutorial/lib/python3.4/importlib/__init__.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
File "<frozen importlib._bootstrap>", line 1129, in _exec
File "<frozen importlib._bootstrap>", line 1471, in exec_module
File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
File "/home/vagrant/django-shop/example/myshop/models/__init__.py", line 9, in <module>
from shop.models.defaults.order import Order
File "/home/vagrant/django-shop/shop/models/defaults/order.py", line 9, in <module>
class Order(order.BaseOrder):
File "/home/vagrant/django-shop/shop/models/order.py", line 105, in __new__
attrs['_auto_transitions'].update(cls.add_to_auto_transitions(b))
File "/home/vagrant/django-shop/shop/models/order.py", line 112, in add_to_auto_transitions
for name, method in base.__dict__.iteritems():
AttributeError: 'mappingproxy' object has no attribute 'iteritems'
As of the Python documentation this error is due to iteritems
having been deprecated with the introduction of Python 3.x.
https://wiki.python.org/moin/Python3.0
Remove dict.iteritems(), dict.iterkeys(), and dict.itervalues().
Instead: use dict.items(), dict.keys(), and dict.values() respectively.
This problem is not observed while Python 2.7.6 is used.
Thanks for reporting. The syntax has been adopted to be Python 3 compatible.
Thanks for the quick turnaround. Based on your feedback I went on to checkout your latest commit 08454d1.
While running manage.py migrate
I still encountered an error, indicating that there is at least one more place (i.e. django-shop/shop/apps.py
), where the code would need to be re-factored.
(shoptutorial) vagrant@vagrant:~/django-shop/example$ ./manage.py migrate
/home/vagrant/shoptutorial/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: django.utils.importlib will be removed in Django 1.9.
return f(*args, **kwds)
/home/vagrant/shoptutorial/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: The django.forms.util module has been renamed. Use django.forms.utils instead.
return f(*args, **kwds)
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/__init__.py", line 328, in execute
django.setup()
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/apps/registry.py", line 115, in populate
app_config.ready()
File "/home/vagrant/django-shop/shop/apps.py", line 22, in ready
if get_version() < (1, 8):
TypeError: unorderable types: str() < tuple()
should be fixed now
That moved us to the next error...
(shoptutorial) vagrant@vagrant:~/django-shop/example$ ./manage.py migrate
/home/vagrant/shoptutorial/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: django.utils.importlib will be removed in Django 1.9.
return f(*args, **kwds)
/home/vagrant/shoptutorial/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: The django.forms.util module has been renamed. Use django.forms.utils instead.
return f(*args, **kwds)
Traceback (most recent call last):
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/db/models/fields/related.py", line 2138, in __init__
to._meta
AttributeError: 'bytes' object has no attribute '_meta'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/__init__.py", line 346, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/base.py", line 394, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/base.py", line 445, in execute
output = self.handle(*args, **options)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 93, in handle
executor = MigrationExecutor(connection, self.migration_progress_callback)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/db/migrations/executor.py", line 19, in __init__
self.loader = MigrationLoader(self.connection)
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/db/migrations/loader.py", line 47, in __init__
self.build_graph()
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/db/migrations/loader.py", line 185, in build_graph
self.load_disk()
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/db/migrations/loader.py", line 103, in load_disk
migration_module = import_module("%s.%s" % (module_name, migration_name))
File "/home/vagrant/shoptutorial/lib/python3.4/importlib/__init__.py", line 109, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
File "<frozen importlib._bootstrap>", line 1129, in _exec
File "<frozen importlib._bootstrap>", line 1471, in exec_module
File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
File "/home/vagrant/django-shop/email_auth/migrations/0001_initial.py", line 11, in <module>
class Migration(migrations.Migration):
File "/home/vagrant/django-shop/email_auth/migrations/0001_initial.py", line 32, in Migration
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to=b'auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of his/her group.', verbose_name='groups')),
File "/home/vagrant/shoptutorial/lib/python3.4/site-packages/django/db/models/fields/related.py", line 2143, in __init__
(self.__class__.__name__, to, RECURSIVE_RELATIONSHIP_CONSTANT)
AssertionError: ManyToManyField(b'auth.Group') is invalid. First parameter to ManyToManyField must be either a model, a model name, or the string 'self'
This error was also discovered by our unit tests, check here: https://travis-ci.org/jrief/django-shop/jobs/106527945
we still allow to fail for Py-3
for the moment, it probably is better to proceed with Python-2.7.10. This is the version used for development.
the last error is weird.
Its ./manage.py makemigrations
which produced that code.
You you please try to create the migration files using Py-3.4 and apply them yourself.
This issue was moved to awesto#316