diff --git a/openslides/users/db.py b/openslides/users/db.py new file mode 100644 index 000000000..20b619a27 --- /dev/null +++ b/openslides/users/db.py @@ -0,0 +1,17 @@ +from django.db import connection + + +def postgres_restart_auth_group_id_sequence(*args, **kwargs): + """ + This function resets the id sequence from the auth_group table (the current auto + increment value for the id field) to the max_id+1. This is needed, when inserting + groups by id, because Postgresql does not update the id sequence. + """ + if connection.vendor == "postgresql": + with connection.cursor() as cursor: + cursor.execute("SELECT max(id) + 1 as max FROM auth_group;") + max_id = cursor.fetchone()[0] + if max_id is not None: + cursor.execute( + f"ALTER SEQUENCE auth_group_id_seq RESTART WITH {max_id};" + ) diff --git a/openslides/users/migrations/0007_superadmin.py b/openslides/users/migrations/0007_superadmin.py index d9206f002..031521b43 100644 --- a/openslides/users/migrations/0007_superadmin.py +++ b/openslides/users/migrations/0007_superadmin.py @@ -14,6 +14,9 @@ def create_superadmin_group(apps, schema_editor): - If a group with the name 'Admin' (probably with pk = 4) exists, move all users from it to the new superadmin group and delete it. If not, check for the staff group and assign all users to the superadmin group. + + In 0011_postgres_auth_group_id_sequence, the id sequence for this migration is + restarted when using postgresql. """ Group = apps.get_model("users", "Group") diff --git a/openslides/users/migrations/0011_postgresql_auth_group_id_sequence.py b/openslides/users/migrations/0011_postgresql_auth_group_id_sequence.py new file mode 100644 index 000000000..c1df11d5b --- /dev/null +++ b/openslides/users/migrations/0011_postgresql_auth_group_id_sequence.py @@ -0,0 +1,19 @@ +# Generated by Finn Stutzenstein on 2019-07-23 13:37 + +from django.db import migrations + +from openslides.users.db import postgres_restart_auth_group_id_sequence + + +class Migration(migrations.Migration): + """ + When migrating old databases (especially after 0007_superadmin) the id sequence + in postgres needs to be restarted. + + This is a additional migration to 0007_superadmin. If a later migration does + something with changing groups in the database, this method needs to run again. + """ + + dependencies = [("users", "0010_auto_20190119_1447")] + + operations = [migrations.RunPython(postgres_restart_auth_group_id_sequence)] diff --git a/openslides/users/signals.py b/openslides/users/signals.py index adb94e344..1ee85ca92 100644 --- a/openslides/users/signals.py +++ b/openslides/users/signals.py @@ -1,9 +1,9 @@ from django.apps import apps from django.contrib.auth.models import Permission -from django.db import connection from django.db.models import Q from ..utils.auth import GROUP_ADMIN_PK, GROUP_DEFAULT_PK +from .db import postgres_restart_auth_group_id_sequence from .models import Group, User @@ -185,11 +185,5 @@ def create_builtin_groups_and_admin(**kwargs): # added to the group. But we do not have to update the cache by calling # inform_changed_data() because the cache is updated on server start. - # For postgres, the id sequence (the current auto increment value for the id field) - # needs to be refreshed after inserting the groups per id, because postgres does not - # increment the sequence then. - if connection.vendor == "postgresql": - with connection.cursor() as cursor: - cursor.execute("SELECT max(id) + 1 as max FROM auth_group;") - max_id = cursor.fetchone()[0] - cursor.execute(f"ALTER SEQUENCE auth_group_id_seq RESTART WITH {max_id};") + # For postgres: After inserting the gorups by id, the id sequence needs to be restarted. + postgres_restart_auth_group_id_sequence()