|
| 1 | +"""Clean up double install. |
| 2 | +
|
| 3 | +This is specifically for RIOT and will no-op for everyone else. |
| 4 | +
|
| 5 | +https://stacklet.atlassian.net/browse/ENG-2706 |
| 6 | +
|
| 7 | +Revision ID: 4afa4a1dd310 |
| 8 | +Revises: fa68605eb530 |
| 9 | +Create Date: 2023-10-12 14:50:00.000000 |
| 10 | +
|
| 11 | +""" |
| 12 | +from alembic import op |
| 13 | +import sqlalchemy as sa |
| 14 | +from sqlalchemy.dialects import postgresql |
| 15 | + |
| 16 | +from redash import models |
| 17 | + |
| 18 | +# revision identifiers, used by Alembic. |
| 19 | +revision = "4afa4a1dd310" |
| 20 | +down_revision = "fa68605eb530" |
| 21 | +branch_labels = None |
| 22 | +depends_on = None |
| 23 | + |
| 24 | + |
| 25 | +def get_groups(org, group_name): |
| 26 | + groups = ( |
| 27 | + org.groups.filter( |
| 28 | + models.Group.name == group_name, |
| 29 | + models.Group.type == models.Group.BUILTIN_GROUP, |
| 30 | + ) |
| 31 | + .order_by(models.Group.id.desc()) |
| 32 | + .all() |
| 33 | + ) |
| 34 | + |
| 35 | + assert len(groups) == 2 |
| 36 | + assert groups[0].id > groups[1].id |
| 37 | + return groups |
| 38 | + |
| 39 | + |
| 40 | +def upgrade(): |
| 41 | + # if this user doesn't exist, then we're not in RIOT and should no-op |
| 42 | + user = models.User.find_by_email("deleteme@riotgames.com").first() |
| 43 | + if not user: |
| 44 | + return |
| 45 | + |
| 46 | + org = models.Organization.query.filter(models.Organization.slug == "default").one() |
| 47 | + |
| 48 | + dupe_admin_group = get_groups(org, "admin")[0] |
| 49 | + dupe_default_group = get_groups(org, "default")[0] |
| 50 | + |
| 51 | + # remove members from the dupe groups |
| 52 | + for group in (dupe_admin_group, dupe_default_group): |
| 53 | + for member in group.members(group.id): |
| 54 | + member.group_ids.remove(group.id) |
| 55 | + models.db.session.add(member) |
| 56 | + |
| 57 | + # ensure dupe groups have no members |
| 58 | + models.db.session.flush() |
| 59 | + assert dupe_admin_group.members(dupe_admin_group.id).count() == 0 |
| 60 | + assert dupe_default_group.members(dupe_default_group.id).count() == 0 |
| 61 | + |
| 62 | + # delete the dupe objects |
| 63 | + models.db.session.delete(dupe_admin_group) |
| 64 | + models.db.session.delete(dupe_default_group) |
| 65 | + models.db.session.delete(user) |
| 66 | + models.db.session.commit() |
| 67 | + |
| 68 | + |
| 69 | +def downgrade(): |
| 70 | + pass |
0 commit comments