Fixes
```
UniqueViolation: duplicate key value violates unique constraint "ix_role_name"
DETAIL: Key (name)=(email@example.com) already exists.
File "sqlalchemy/engine/base.py", line 1905, in _execute_context
self.dialect.do_execute(
File "sqlalchemy/engine/default.py", line 736, in do_execute
cursor.execute(statement, parameters)
IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "ix_role_name"
DETAIL: Key (name)=(email@example.com) already exists.
[SQL: INSERT INTO role (create_time, update_time, name, description, type, deleted) VALUES (%(create_time)s, %(update_time)s, %(name)s, %(description)s, %(type)s, %(deleted)s) RETURNING role.id]
[parameters: {'create_time': datetime.datetime(2023, 6, 28, 22, 15, 51,
947910), 'update_time': datetime.datetime(2023, 6, 28, 22, 15, 51,
947918), 'name': 'email@example.com', 'description': 'Private Role for
email@example.com', 'type': <types.PRIVATE: 'private'>, 'deleted': False}]
(Background on this error at: https://sqlalche.me/e/14/gkpj)
File "galaxy/web/framework/decorators.py", line 337, in decorator
rval = func(self, trans, *args, **kwargs)
File "galaxy/webapps/galaxy/controllers/user.py", line 142, in login
return self.__validate_login(trans, payload, **kwd)
File "galaxy/webapps/galaxy/controllers/user.py", line 199, in __validate_login
trans.handle_user_login(user)
File "galaxy/webapps/base/webapp.py", line 891, in handle_user_login
self.app.security_agent.create_user_role(user, self.app)
File "galaxy/model/security.py", line 738, in create_user_role
self.get_private_user_role(user, auto_create=True)
File "galaxy/model/security.py", line 765, in get_private_user_role
return self.create_private_user_role(user)
File "galaxy/model/security.py", line 748, in create_private_user_role
user.attempt_create_private_role()
File "galaxy/model/__init__.py", line 1105, in attempt_create_private_role
with transaction(session):
File "contextlib.py", line 113, in __enter__
return next(self.gen)
File "galaxy/model/base.py", line 52, in transaction
with session.begin():
File "<string>", line 2, in begin
File "sqlalchemy/util/deprecations.py", line 375, in warned
return fn(*args, **kwargs)
File "sqlalchemy/orm/session.py", line 1347, in begin
trans = SessionTransaction(self, nested=nested)
File "sqlalchemy/orm/session.py", line 545, in __init__
self._take_snapshot(autobegin=autobegin)
File "sqlalchemy/orm/session.py", line 662, in _take_snapshot
self.session.flush()
File "sqlalchemy/orm/session.py", line 3449, in flush
self._flush(objects)
File "sqlalchemy/orm/session.py", line 3589, in _flush
transaction.rollback(_capture_exception=True)
File "sqlalchemy/util/langhelpers.py", line 70, in __exit__
compat.raise_(
File "sqlalchemy/util/compat.py", line 211, in raise_
raise exception
File "sqlalchemy/orm/session.py", line 3549, in _flush
flush_context.execute()
File "sqlalchemy/orm/unitofwork.py", line 456, in execute
rec.execute(self)
File "sqlalchemy/orm/unitofwork.py", line 630, in execute
util.preloaded.orm_persistence.save_obj(
File "sqlalchemy/orm/persistence.py", line 245, in save_obj
_emit_insert_statements(
File "sqlalchemy/orm/persistence.py", line 1238, in _emit_insert_statements
result = connection._execute_20(
File "sqlalchemy/engine/base.py", line 1710, in _execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
File "sqlalchemy/sql/elements.py", line 334, in _execute_on_connection
return connection._execute_clauseelement(
File "sqlalchemy/engine/base.py", line 1577, in _execute_clauseelement
ret = self._execute_context(
File "sqlalchemy/engine/base.py", line 1948, in _execute_context
self._handle_dbapi_exception(
File "sqlalchemy/engine/base.py", line 2129, in _handle_dbapi_exception
util.raise_(
File "sqlalchemy/util/compat.py", line 211, in raise_
raise exception
File "sqlalchemy/engine/base.py", line 1905, in _execute_context
self.dialect.do_execute(
File "sqlalchemy/engine/default.py", line 736, in do_execute
cursor.execute(statement, parameters)
```
when a user attempts to login after they previously purged their
account.
if trans.user is None the value passed on to the model is None,
and that leads to
```
WouldBlock: null
File "anyio/streams/memory.py", line 98, in receive
return self.receive_nowait()
File "anyio/streams/memory.py", line 93, in receive_nowait
raise WouldBlock
EndOfStream: null
File "starlette/middleware/base.py", line 78, in call_next
message = await recv_stream.receive()
File "anyio/streams/memory.py", line 118, in receive
raise EndOfStream
ValidationError: 1 validation error for FileLibraryFolderItem
can_manage
none is not an allowed value (type=type_error.none.not_allowed)
File "starlette/applications.py", line 122, in __call__
await self.middleware_stack(scope, receive, send)
File "starlette/middleware/errors.py", line 184, in __call__
raise exc
File "starlette/middleware/errors.py", line 162, in __call__
await self.app(scope, receive, _send)
File "starlette_context/middleware/raw_middleware.py", line 93, in __call__
await self.app(scope, receive, send_wrapper)
File "starlette/middleware/base.py", line 108, in __call__
response = await self.dispatch_func(request, call_next)
File "galaxy/webapps/galaxy/fast_app.py", line 103, in add_x_frame_options
response = await call_next(request)
File "starlette/middleware/base.py", line 84, in call_next
raise app_exc
File "starlette/middleware/base.py", line 70, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
File "starlette/middleware/exceptions.py", line 79, in __call__
raise exc
File "starlette/middleware/exceptions.py", line 68, in __call__
await self.app(scope, receive, sender)
File "fastapi/middleware/asyncexitstack.py", line 20, in __call__
raise e
File "fastapi/middleware/asyncexitstack.py", line 17, in __call__
await self.app(scope, receive, send)
File "starlette/routing.py", line 718, in __call__
await route.handle(scope, receive, send)
File "starlette/routing.py", line 276, in handle
await self.app(scope, receive, send)
File "starlette/routing.py", line 66, in app
response = await func(request)
File "fastapi/routing.py", line 241, in app
raw_response = await run_endpoint_function(
File "fastapi/routing.py", line 169, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "starlette/concurrency.py", line 41, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "anyio/to_thread.py", line 33, in run_sync
return await get_asynclib().run_sync_in_worker_thread(
File "anyio/_backends/_asyncio.py", line 877, in run_sync_in_worker_thread
return await future
File "anyio/_backends/_asyncio.py", line 807, in run
result = context.run(func, *args)
File "galaxy/webapps/galaxy/api/folder_contents.py", line 114, in index
return self.service.index(trans, folder_id, payload)
File "galaxy/webapps/galaxy/services/library_folder_contents.py", line 83, in index
self._serialize_library_dataset(trans, current_user_roles, tag_manager, content_item)
File "galaxy/webapps/galaxy/services/library_folder_contents.py", line 168, in _serialize_library_dataset
dataset_item = FileLibraryFolderItem(
File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
raise validation_error
```
as seen in https://sentry.galaxyproject.org/share/issue/3eec9cfa26744415b0c8d9885de9d273/
This is needed so that data bundle imports will work.
The test case covering this will just receive the full integration app
and thus didn't have this problem.
Should fix:
```
[2023-06-13 21:33:38,899: ERROR/main] Task galaxy.import_data_bundle[0853f72f-c8ce-4e59-b6e8-25e208ce79f7] raised unexpected: AttributeError("'GalaxyManagerApplication' object has no attribute 'tool_data_tables'")
Traceback (most recent call last):
File "/cvmfs/main.galaxyproject.org/venv/lib/python3.8/site-packages/celery/app/trace.py", line 451, in trace_task
R = retval = fun(*args, **kwargs)
File "/cvmfs/main.galaxyproject.org/venv/lib/python3.8/site-packages/celery/app/trace.py", line 734, in __protected_call__
return self.run(*args, **kwargs)
File "/cvmfs/main.galaxyproject.org/galaxy/lib/galaxy/celery/__init__.py", line 163, in wrapper
rval = app.magic_partial(func)(*args, **kwds)
File "/cvmfs/main.galaxyproject.org/venv/lib/python3.8/site-packages/lagom/wrapping.py", line 27, in _bound_func
bound_args, bound_kwargs = argument_updater(args, kwargs)
File "lagom/container.py", line 350, in _update_args
File "lagom/container.py", line 425, in _infer_dependencies
File "lagom/container.py", line 265, in resolve
File "lagom/container.py", line 392, in _reflection_build_with_err_handling
File "lagom/container.py", line 408, in _reflection_build
File "/cvmfs/main.galaxyproject.org/galaxy/lib/galaxy/managers/tool_data.py", line 114, in __init__
self.tool_data_tables = app.tool_data_tables
AttributeError: 'GalaxyManagerApplication' object has no attribute 'tool_data_tables'
```