#26401: Allow auth machinery to be used without installing auth app
------------------------------+------------------------------------
Reporter: satchamo | Owner: andkon
Type: Bug | Status: closed
Component: contrib.auth | Version: 1.9
Severity: Normal | Resolution: wontfix
Keywords: auth | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 1 | Patch needs improvement: 0
Easy pickings: 1 | UI/UX: 0
------------------------------+------------------------------------
Comment (by jdufresne):
I found the above to be insufficient. Adding `MIGRATION_MODULES` as the
only change to avoid the auth tables fails during migrations with the
following trace:
{{{
Traceback (most recent call last):
File ".../manage.py", line 9, in <module>
execute_from_command_line(sys.argv)
File ".../venv/lib64/python3.5/site-
packages/django/core/management/__init__.py", line 367, in
execute_from_command_line
utility.execute()
File ".../venv/lib64/python3.5/site-
packages/django/core/management/__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File ".../venv/lib64/python3.5/site-
packages/django/core/management/base.py", line 305, in run_from_argv
self.execute(*args, **cmd_options)
File ".../venv/lib64/python3.5/site-
packages/django/core/management/base.py", line 356, in execute
output = self.handle(*args, **options)
File ".../venv/lib64/python3.5/site-
packages/django/core/management/commands/migrate.py", line 222, in handle
self.verbosity, self.interactive, connection.alias,
apps=post_migrate_apps, plan=plan,
File ".../venv/lib64/python3.5/site-
packages/django/core/management/sql.py", line 53, in
emit_post_migrate_signal
**kwargs
File ".../venv/lib64/python3.5/site-
packages/django/dispatch/dispatcher.py", line 191, in send
response = receiver(signal=self, sender=sender, **named)
File ".../venv/lib64/python3.5/site-
packages/django/contrib/auth/management/__init__.py", line 75, in
create_permissions
"content_type", "codename"
File ".../venv/lib64/python3.5/site-packages/django/db/models/query.py",
line 256, in __iter__
self._fetch_all()
File ".../venv/lib64/python3.5/site-packages/django/db/models/query.py",
line 1085, in _fetch_all
self._result_cache = list(self.iterator())
File ".../venv/lib64/python3.5/site-packages/django/db/models/query.py",
line 125, in __iter__
for row in compiler.results_iter():
File ".../venv/lib64/python3.5/site-
packages/django/db/models/sql/compiler.py", line 789, in results_iter
results = self.execute_sql(MULTI)
File ".../venv/lib64/python3.5/site-
packages/django/db/models/sql/compiler.py", line 835, in execute_sql
cursor.execute(sql, params)
File ".../venv/lib64/python3.5/site-
packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File ".../venv/lib64/python3.5/site-
packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File ".../venv/lib64/python3.5/site-packages/django/db/utils.py", line
94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File ".../venv/lib64/python3.5/site-packages/django/utils/six.py", line
685, in reraise
raise value.with_traceback(tb)
File ".../venv/lib64/python3.5/site-
packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "auth_permission" does not
exist
LINE 1: ...ntent_type_id", "auth_permission"."codename" FROM "auth_perm...
}}}
This fails becuase the auth's `AppConfig`
[https://github.com/django/django/blob/38cf9ef390eb0cd0703d99893f826153865f6ba6/django/contrib/auth/apps.py#L15-L18
adds a post_migrate callback] that requires the `auth_permission` table to
exist. A project could avoid this by overriding the auth's `AppConfig`. I
think this could be easier for projects if the auth's `AppConfig` was
split into two classes, one base version that can be used without the auth
tables and one that matches the current implementation. This would be a
backwards compatible change that would allow the `MIGRATION_MODULES`
change noted above. For example:
{{{
class BaseAuthConfig(AppConfig):
name = 'django.contrib.auth'
verbose_name = _("Authentication and Authorization")
def ready(self):
checks.register(check_user_model, checks.Tags.models)
class AuthConfig(BaseAuthConfig):
def ready(self):
post_migrate.connect(
create_permissions,
dispatch_uid="django.contrib.auth.management.create_permissions"
)
checks.register(check_models_permissions, checks.Tags.models)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/26401#comment:12>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/066.be9368284635b7a77203dd3163811efa%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.