Code Monkey home page Code Monkey logo

invenio-userprofiles's Introduction

Invenio-UserProfiles

User profiles module for Invenio.

Features:

  • Editing and managing user profiles (username, full name).
  • Extends the user registration form provided by Invenio-Accounts.
  • Resending user verification emails.
  • Administration interface for user profiles.

Further documentation available on https://invenio-userprofiles.readthedocs.io/

invenio-userprofiles's People

Contributors

alejandromumo avatar alizeepace avatar anikachurilova avatar baldemir avatar damnoblivious avatar dinosk avatar eamonnmag avatar fenekku avatar github-actions[bot] avatar inveniobot avatar jennur avatar jirikuncar avatar konstantinastoikou avatar kpsherva avatar lnielsen avatar max-moser avatar mb-wali avatar mvidalgarcia avatar ntarocco avatar omelkonian avatar ptamarit avatar rekt-hard avatar samihiltunen avatar slint avatar switowski avatar tiborsimko avatar tlgino avatar topless avatar utnapischtim avatar zzacharo avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

invenio-userprofiles's Issues

Read-only profile should not disable preferences section

Package version (if known): 2.0.2

USERPROFILES_READ_ONLY is very useful for InvenioRDM instances that use a third-party login: it allows them to disable these profile values that are managed by the third-party login system.

The preferences section on the Profile page is not managed by the third-party login system though. It is purely an InvenioRDM thing. Using USERPROFILES_READ_ONLY for the reason above, disables updating the preferences section as a drive-by side-effect. It shouldn't.

tests: `test_profile_name_exists` fails.

assert 'Username already exists.' in '\n<!DOCTYPE html>\n<html lang="en">\n  <head>\n    <meta charset="utf-8" />\n  </head>\n  <body>\n<form method="POST"...file" class="btn btn-primary"><i class="fa fa-check"></i> Update profile</button>\n<
/div>\n</form>\n  </body>\n</html>'                            
E            +  where '\n<!DOCTYPE html>\n<html lang="en">\n  <head>\n    <meta charset="utf-8" />\n  </head>\n  <body>\n<form method="POST"...file" class="btn btn-primary"><i class="fa fa-check"></i> Update profile</button>\n</div>\n</form>\n  </body>\n
</html>' = <bound method BaseResponse.get_data of <<class 'pytest_flask.plugin.JSONResponse'> 1447 bytes [200 OK]>>(as_text=True)
E            +    where <bound method BaseResponse.get_data of <<class 'pytest_flask.plugin.JSONResponse'> 1447 bytes [200 OK]>> = <<class 'pytest_flask.plugin.JSONResponse'> 1447 bytes [200 OK]>.get_data

tests/test_views.py:174: AssertionError

Error with jinja2 3.1.0, due to autoescape attribute

Describe the bug

I've got the following error when runnig python setup.py extract_messages AttributeError: module 'jinja2.ext' has no attribute 'autoescape'
Seems that autoescape attribute had been deprecated

After updating the profile, changing the current language produce a 404

Package version (if known): 1.2.1

Describe the bug

After updating the profile, changing the current language produce a 404 (page not found).

Steps to Reproduce

  1. Create a new account.
  2. Update the profile.
  3. Change the current language.
  4. A page not found is displayed.

Expected behavior

Stay on the profile page with the content translated on the new language.

Screenshots (if applicable)

image

api: stabilise and document

  • check existing API functionality
  • add missing important API functionality
  • check API function signatures and parameters
  • enhance API docstrings (param, returns, raises, versionadded)
  • plug API functions to existing docs

tests: `sphinx-build -qnNW docs docs/_build/html` fails

Due to intersphinx invenio-accounts 403 Forbidden:

Warning, treated as error:
WARNING: intersphinx inventory 'https://invenio-accounts.readthedocs.io/en/latest/objects.inv' not fetchable due to <class 'urllib.error.HTTPError'>: HTTP Error 403: Forbidden

config: SECURITY_REGISTER_USER_TEMPLATE not overridable

The SECURITY_REGISTER_USER_TEMPLATE is being set here but can not be overridden by the user.

Output from my running application.

current_app.config['SECURITY_REGISTER_USER_TEMPLATE']
'invenio_userprofiles/register_user.html'

The variable is set in my config but is not being used.

SECURITY_REGISTER_USER_TEMPLATE = \
    "hepdata_theme/security/register_user.html"

in https://github.com/inveniosoftware/invenio-userprofiles/blob/master/invenio_userprofiles/ext.py#L82

We should have this:

app.config.setdefault('SECURITY_REGISTER_USER_TEMPLATE', app.config.get('SECURITY_REGISTER_USER_TEMPLATE',
            'invenio_userprofiles/register_user.html'))

forms: user sign-up fails due when profile form is enabled.

Traceback (most recent call last):
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/werkzeug/wsgi.py", line 659, in __call__
    return app(environ, start_response)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask_debugtoolbar/__init__.py", line 125, in dispatch_request
    return view_func(**req.view_args)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask_security/decorators.py", line 225, in wrapper
    return f(*args, **kwargs)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask_security/views.py", line 117, in register
    user = register_user(**form.to_dict())
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask_security/registerable.py", line 29, in register_user
    user = _datastore.create_user(**kwargs)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/flask_security/datastore.py", line 167, in create_user
    user = self.user_model(**kwargs)
  File "<string>", line 4, in __init__

  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/orm/state.py", line 306, in _initialize_instance
    manager.dispatch.init_failure(self, args, kwargs)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 183, in reraise
    raise value
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/orm/state.py", line 303, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/ext/declarative/base.py", line 649, in _declarative_constructor
    setattr(self, k, kwargs[k])
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/orm/attributes.py", line 224, in __set__
    instance_dict(instance), value, None)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/orm/attributes.py", line 807, in set
    value = self.fire_replace_event(state, dict_, value, old, initiator)
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/orm/attributes.py", line 829, in fire_replace_event
    self._replace_token or self._init_append_or_replace_token())
  File "/Users/lnielsen/envs/zenodo3/lib/python3.5/site-packages/sqlalchemy/orm/attributes.py", line 1156, in emit_backref_from_scalar_set_event
    child_state, child_dict = instance_state(child),\
AttributeError: 'dict' object has no attribute '_sa_instance_state'

Setting SECURITY_CHANGEABLE to False leads to internal error

To reproduce in the example app:

  1. Add SECURITY_CHANGEABLE=False to app.config.update()
  2. Run server and you will get this error
Traceback (most recent call last):
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 2000, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1991, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1567, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask_login.py", line 792, in decorated_view
    return func(*args, **kwargs)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/src/invenio-userprofiles/invenio_userprofiles/views.py", line 98, in profile
    verification_form=verification_form,)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/templating.py", line 134, in render_template
    context, ctx.app)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/templating.py", line 116, in _render
    rv = template.render(context)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/jinja2/environment.py", line 989, in render
    return self.environment.handle_exception(exc_info, True)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/jinja2/environment.py", line 754, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/src/invenio-userprofiles/invenio_userprofiles/templates/invenio_userprofiles/settings/profile.html", line 30, in top-level template code
    {% set panel_icon = "fa fa-user" %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/page_settings.html", line 25, in top-level template code
    {%- extends config.THEME_BASE_TEMPLATE %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/page.html", line 73, in top-level template code
    {%- block body %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/page.html", line 79, in block "body"
    {%- block body_inner %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/page.html", line 80, in block "body_inner"
    {%- block page_header %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/page.html", line 81, in block "page_header"
    {% include "invenio_theme/header.html" %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/header.html", line 25, in top-level template code
    {%- block navbar %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/header.html", line 45, in block "navbar"
    {%- block navbar_inner %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/header.html", line 75, in block "navbar_inner"
    {%- block navbar_right %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/header.html", line 76, in block "navbar_right"
    {%- include "invenio_theme/header_login.html" %}
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/invenio_theme/templates/invenio_theme/header_login.html", line 42, in top-level template code
    <li><a href="{{ item.url }}">{{ item.text|safe }}</a></li>
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/jinja2/environment.py", line 408, in getattr
    return getattr(obj, attribute)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask_menu/__init__.py", line 255, in url
    return url_for(self._endpoint, **args)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/helpers.py", line 332, in url_for
    return appctx.app.handle_url_build_error(error, endpoint, values)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/app.py", line 1811, in handle_url_build_error
    reraise(exc_type, exc_value, tb)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/flask/helpers.py", line 322, in url_for
    force_external=external)
  File "/home/orestis/.virtualenvs/invenio-userprofiles/lib/python2.7/site-packages/werkzeug/routing.py", line 1758, in build
    raise BuildError(endpoint, values, method, self)
BuildError: Could not build url for endpoint 'security.change_password'. Did you mean 'security.reset_password' instead?

tests: simplify doctest execution

The following cookiecutter change:

inveniosoftware/cookiecutter-invenio-module#98

should be propagated to this Invenio module.

Namely, in run-tests.sh, the sphinx for doctests is invoked after pytest run:

$ tail -3 ./\{\{\ cookiecutter.project_shortname\ \}\}/run-tests.sh
sphinx-build -qnNW docs docs/_build/html && python setup.py test && sphinx-build -qnNW -b doctest docs docs/_build/doctest

This sometimes led to problems on Travis CI with the second sphinx-build run due
to "disappearing" dependencies after the example application was tested.

A solution that worked for invenio-marc21 (see
inveniosoftware/invenio-marc21#49 (comment))
and that was integrated in cookiecutter (see
inveniosoftware/cookiecutter-invenio-module#98) was to
run doctest execution in pytest, removing the second sphinx-build invocation.

This both solved Travis CI build failures and simplified test suite execution.

Note that this change may necessitate to amend the code tests etc so that things
would be executed with the Flask application context (see
inveniosoftware/invenio-marc21@09e98fc).

how do we change the form field

Package version (if known):

Describe the bug

A clear and concise description of what the bug is.

Steps to Reproduce

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior

Screenshots (if applicable)

Additional context

Profile update should return 302

Package version (if known): InvenioRDM v9 (this module v2.0.0)

Describe the bug

When changing their profile, instead of being redirected to the profile page, the user is POSTED back the profile page. This means that a refresh pops up the "This action will be performed again" dialog box. We should just redirect back.

Steps to Reproduce

  1. Go to '/account/settings/profile/'
  2. Update your profile and click on 'Update profile'
  3. See page with changes (all good)
  4. Refresh the page
  5. See dialog pop up

Expected behavior

Just a 302 redirect.

Include the option to make UserProfiles read-only

Is your feature request related to a problem? Please describe.

When external authentication services are used as the "source of truth" for user profile details, it shouldn't be possible for the users themselves to change their profile details.

Describe the solution you'd like

A configuration item like USERPROFILES_READ_ONLY that prevents users from accessing the endpoints that'd update the profile details, if set.

migration: make 41157f1933d6_remove_table.py more robust

We just upgraded the HEPData software from invenio-userprofiles v1.2.1 to v2.0.3 and invenio-accounts 1.4.13 to v2.0.0. Running the alembic upgrade command on (a copy of) the production database gave a couple of errors from this SQL query:

query = (
"UPDATE accounts_user SET "
" username = '{username}', "
" displayname = '{displayname}', "
" profile = '{profile_data_string}', "
" preferences = '{preferences}' "
"WHERE accounts_user.id = {user_id};".format(
username=username,
displayname=displayname,
profile_data_string=json.dumps(profile_data),
preferences=json.dumps(preferences),
user_id=user_id,
)
)

  1. Some local accounts have a null username in the existing userprofiles_userprofile table if it has not been explicitly set by the HEPData user, giving an error message:
sqlalchemy.exc.IntegrityError: (psycopg2.errors.UniqueViolation) duplicate key value violates unique constraint "uq_accounts_user_username"
DETAIL:  Key (username)=(None) already exists.
[SQL: UPDATE accounts_user SET  username = 'None',  displayname = 'None',  profile = '{"full_name": "Albert Einstein"}',  preferences = '{"visibility": "restricted", "email_visibility": "restricted"}' WHERE accounts_user.id = 1234;]

I worked around this problem by executing:

update userprofiles_userprofile set username=user_id where username is null;

before running the alembic upgrade command.

  1. Some full_name entries in the existing userprofiles_userprofile table can contain a ' symbol, giving an error message:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "Arc"
LINE 1: ...'jeanne',  profile = '{"full_name": "Jeanne d'Arc"}'...
[SQL: UPDATE accounts_user SET  username = 'jeanne',  displayname = 'jeanne',  profile = '{"full_name": "Jeanne d'Arc"}',  preferences = '{"visibility": "restricted", "email_visibility": "restricted"}' WHERE accounts_user.id = 1234;]

Again, I could work around this problem by removing ' from the full_name in the userprofiles_userprofile table, running alembic upgrade, then restoring the original full_name values for the 4 affected users.

Feel free to close this issue if you think these errors are too specific to be worth fixing, although patching the upgrade command is probably fairly simple.

registration profile error

File "/opt/hepdata/src/invenio-accounts/invenio_accounts/templates/invenio_accounts/register_user.html", line 38, in block "panel"
    {%- block registration_form_fields scoped %}
  File "/opt/hepdata/src/invenio-userprofiles/invenio_userprofiles/templates/invenio_userprofiles/register_user.html", line 32, in block "registration_form_fields"
    {{ render_field(form.profile, icon="glyphicon glyphicon-lock", errormsg=False) }}
  File "/opt/hepdata/src/invenio-accounts/invenio_accounts/templates/invenio_accounts/_macros.html", line 27, in template
    <div class="form-group {{size}}{% if icon %} has-feedback{% endif %}{% if field.errors %} has-error{% endif %}">
  File "/opt/hepdata/lib/python2.7/site-packages/jinja2/environment.py", line 408, in getattr
    return getattr(obj, attribute)
UndefinedError: 'flask_security.forms.ConfirmRegisterForm object' has no attribute 'profile'

migration: investigate alembic upgrade errors

Users reported that the command invenio alembic upgrade produces errors when migrating from v8 to v9:

$ invenio alembic upgrade
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade 17c703ce1eb7 -> 676dd587542d, Create funders vocabulary table.
INFO  [alembic.runtime.migration] Running upgrade 676dd587542d -> e1146238edd3, Create awards table.
INFO  [alembic.runtime.migration] Running upgrade e12419831262 -> 999dcbd19ace, Add versioning information to models.
INFO  [alembic.runtime.migration] Running upgrade 999dcbd19ace -> dfbdf43a3e96, Separate login info from user table.
INFO  [alembic.runtime.migration] Running upgrade dfbdf43a3e96 -> 62efc52773d4, Create UserIdentity table.
INFO  [alembic.runtime.migration] Running upgrade f701a32e6fbe -> fbe746957cfc, Create member tables
INFO  [alembic.runtime.migration] Running upgrade fbe746957cfc -> 5b478fe7ef7f, Create featured communities table
INFO  [alembic.runtime.migration] Running upgrade 5b478fe7ef7f -> a3f5a8635cbb, Remove version table
INFO  [alembic.runtime.migration] Running upgrade c25ef2c50ffa -> 41157f1933d6, Remove table.
Traceback (most recent call last):
  File "/home/linux/project/tug/v9.2/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1819, in _execute_context
    self.dialect.do_execute(
  File "/home/linux/project/tug/v9.2/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 732, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.UndefinedColumn: column "username" of relation "accounts_user" does not exist
LINE 1: UPDATE accounts_user SET  username = 'idp-77aba62cdb768bf1',...

A second user provided its alembic heads and current:

# invenio alembic current
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
71634726ec7e (9848d0149abd) -> c25ef2c50ffa (invenio_userprofiles) (head), Create userprofiles tables.
862037093962 -> 07fb52561c5c (invenio_records) (head), Alter column from json to jsonb.
2da9a03b0833 (2e97565eba72, 862037093962) -> 1ba76da94103 (invenio_records_files, default) (head), Create records files tables.
88d1463de5c0 -> a3957490361d (invenio_rdm_records) (head), Remove PIDRelations tables.
f615cee99600 -> 999c62899c20 (invenio_pidstore) (head), Create pidstore tables.
97bbc733896c -> bff1f190b9bd (invenio_oauthclient, default) (head), Add Timestamp to oauthclient tables.
12a88921ada2 -> 4e57407b8e4a (default, invenio_oauth2server) (head), Add on delete cascade.
759d47cbdba7 -> e655021de0de (invenio_oaiserver) (head), Create oiaserver tables.
9848d0149abd -> e12419831262 (invenio_accounts) (head), Add new columns on SessionActivity.
dbe499bfda43 -> 04480be1593e (invenio_access) (head), Add ActionSystemRoles.
8ed1a438601c, 88d1463de5c0 (de9c14cbb0b2, a14fa442680f) -> 9e0ac518b9df (invenio_rdm_records) (head) (mergepoint), Create records/communities M2M table.
4a9a4fd235f8 -> 17c703ce1eb7 (invenio_vocabularies) (head), Create names table.
de9c14cbb0b2 (9848d0149abd) -> f261e5ee8743 (invenio_communities) (head), Create communities members table.
8ae99b034410 -> a29271fd78f8 (invenio_files_rest) (head), Create files object partial unique index.

# invenio alembic heads
dbdbc1b19cf2 -> 35c1075e6360 (default) (effective head), Force naming convention.
8ae99b034410 -> a29271fd78f8 (invenio_files_rest) (head), Create files object partial unique index.
862037093962 -> 07fb52561c5c (invenio_records) (head), Alter column from json to jsonb.
dbe499bfda43 -> 04480be1593e (invenio_access) (head), Add ActionSystemRoles.
9848d0149abd -> e12419831262 (invenio_accounts) (head), Add new columns on SessionActivity.
71634726ec7e (9848d0149abd) -> c25ef2c50ffa (invenio_userprofiles) (head), Create userprofiles tables.
4a9a4fd235f8 -> 17c703ce1eb7 (invenio_vocabularies) (head), Create names table.
f615cee99600 -> 999c62899c20 (invenio_pidstore) (head), Create pidstore tables.
12a88921ada2 -> 4e57407b8e4a (invenio_oauth2server, default) (head), Add on delete cascade.
8ed1a438601c, 88d1463de5c0 (de9c14cbb0b2, a14fa442680f) -> 9e0ac518b9df (invenio_rdm_records) (head) (mergepoint), Create records/communities M2M table.
88d1463de5c0 -> a3957490361d (invenio_rdm_records) (head), Remove PIDRelations tables.
2da9a03b0833 (2e97565eba72, 862037093962) -> 1ba76da94103 (invenio_records_files, default) (head), Create records files tables.
759d47cbdba7 -> e655021de0de (invenio_oaiserver) (head), Create oiaserver tables.
97bbc733896c -> bff1f190b9bd (default, invenio_oauthclient) (head), Add Timestamp to oauthclient tables.
de9c14cbb0b2 (9848d0149abd) -> f261e5ee8743 (invenio_communities) (head), Create communities members table.
5cd30a3503c9 -> a14fa442680f (invenio_requests) (effective head), Create tables.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.