﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
16206	DB router example causes bug in django admin delete	Cal Leeming	nobody	"Caused by auth models not having an _meta.

Example based off the code in:
https://docs.djangoproject.com/en/dev/topics/db/multi-db/#an-example

Cal

{{{
class DBRouter(object):
    """"""A router to control all database operations on models in
    the myapp application""""""

    def db_for_read(self, model, **hints):
        ""Point all operations on myapp models to 'other'""
        if model._meta.app_label == 'carma':
            return 'carma_ro'
        elif model._meta.app_label == 'nats':
            return 'nats_ro'
        elif model._meta.app_label == 'ddcms':
            return 'nats_rw'
        else:
            return 'default'
        return None

    def db_for_write(self, model, **hints):
        ""Point all operations on myapp models to 'other'""
        if model._meta.app_label == 'carma':
            return 'carma_ro'
        elif model._meta.app_label == 'nats':
            return 'nats_ro'
        elif model._meta.app_label == 'ddcms':
            return 'nats_rw'
        else:
            return 'default'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        ""Allow any relation if a model in myapp is involved""
        if obj1._meta.app_label == 'carma' or obj2._meta.app_label == 'carma':
            # Allow DDCMS to have a relation with CARMA and NATS.
            if obj1._meta.app_label in ('carma', 'nats', 'ddcms') and obj2._meta.app_label in ('carma', 'nats', 'ddcms'):
                return True
            
            else:
                return False
        else:
            return True

    def allow_syncdb(self, db, model):
        if model._meta.app_label == 'carma':
            return False
        elif model._meta.app_label == 'nats':
            return False
        elif model._meta.app_label == 'ddcms' and db == 'default':
            return False
        else:
            return True
}}}

{{{

Environment:
Request Method: GET
Request URL: http://dev.cp.dukedollars.com/admin/auth/user/2/delete/
Django Version: 1.2.4
Python Version: 2.6.6
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'django.contrib.admindocs',
'debug_toolbar',
'webapp.nats',
'webapp.carma',
'webapp.ddcms',
'webapp.sites.ma',
'webapp.sites.cp',
'webapp.accounts']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'webapp.strip_whitespace.StripWhitespaceMiddleware',
'webapp.multihost.MultiHostMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'webapp.djerror.DJErrorMiddleware')
Traceback:
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/core/handlers/base.py"" in get_response
100.                     response = callback(request, *callback_args, **callback_kwargs)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/contrib/admin/options.py"" in wrapper
265.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/utils/decorators.py"" in _wrapped_view
76.                     response = view_func(request, *args, **kwargs)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/views/decorators/cache.py"" in _wrapped_view_func
78.         response = view_func(request, *args, **kwargs)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/contrib/admin/sites.py"" in inner
190.             return view(request, *args, **kwargs)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/utils/decorators.py"" in _wrapper
21.             return decorator(bound_func)(*args, **kwargs)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/utils/decorators.py"" in _wrapped_view
76.                     response = view_func(request, *args, **kwargs)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/utils/decorators.py"" in bound_func
17.                 return func(self, *args2, **kwargs2)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/contrib/admin/options.py"" in delete_view
1135.         (deleted_objects, perms_needed) = get_deleted_objects((obj,), opts, request.user, self.admin_site)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/contrib/admin/util.py"" in get_deleted_objects
111.         obj._collect_sub_objects(collector)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/db/models/base.py"" in _collect_sub_objects
625.                 db = router.db_for_write(f.rel.through.__class__, instance=self)
File ""/usr/local/lib/python2.6/site-packages/Django-1.2.4-py2.6.egg/django/db/utils.py"" in _route_db
134.                     chosen_db = method(model, **hints)
File ""/ddcms/dev/webapp/db_router.py"" in db_for_write
19.         if model._meta.app_label == 'carma':
Exception Type: AttributeError at /admin/auth/user/2/delete/
Exception Value: type object 'ModelBase' has no attribute '_meta'
}}}"	Bug	closed	Uncategorized	1.3	Normal	invalid			Unreviewed	0	0	0	0	0	0
