diff options
| author | stuppie | 2026-10-16 12:33:23 -0700 |
|---|---|---|
| committer | stuppie | 2026-10-16 12:33:23 -0700 |
| commit | 2bf3341db9a815a4e697bea333478406ee4c32f8 (patch) | |
| tree | d12bfb53abd261787d24cf9ccc95439dd7323761 | |
| parent | af1bdc63baffa818e7831877f7f3f66cfdbcbd7c (diff) | |
| download | generalresearch-2bf3341db9a815a4e697bea333478406ee4c32f8.tar.gz generalresearch-2bf3341db9a815a4e697bea333478406ee4c32f8.zip | |
MembershipManager: update and delete membership. Membership model remove use_enum_values; it confuses the type checker. On db write explicitly pass the int value
| -rw-r--r-- | generalresearch/managers/gr/team.py | 45 | ||||
| -rw-r--r-- | generalresearch/models/gr/team.py | 2 |
2 files changed, 46 insertions, 1 deletions
diff --git a/generalresearch/managers/gr/team.py b/generalresearch/managers/gr/team.py index 405435e..d673dfc 100644 --- a/generalresearch/managers/gr/team.py +++ b/generalresearch/managers/gr/team.py @@ -49,6 +49,7 @@ class MembershipManager(PostgresManager): data = membership.model_dump(by_alias=True) data["team_id"] = team.id data["user_id"] = gr_user.id + data["privilege"] = membership.privilege.value # 'user_id' = {int} 5774 # 'team_id' = {int} 20736 @@ -95,11 +96,18 @@ class MembershipManager(PostgresManager): def get_by_gr_user_id(self, gr_user_id: PositiveInt) -> list[Membership]: return self.filter(gr_user_id=gr_user_id) + def get_by_uuid(self, membership_uuid: UUIDStr) -> Membership | None: + memberships = self.filter(membership_uuid=membership_uuid) + if len(memberships) > 1: + raise ValueError("Multiple memberships have the same UUID") + return memberships[0] if memberships else None + def filter( self, *, gr_user_id: PositiveInt | None = None, team_id: PositiveInt | None = None, + membership_uuid: UUIDStr | None = None, ) -> list[Membership]: """Return memberships matching all the supplied identifiers.""" conditions = [] @@ -111,6 +119,9 @@ class MembershipManager(PostgresManager): if team_id is not None: conditions.append("m.team_id = %(team_id)s") params["team_id"] = team_id + if membership_uuid is not None: + conditions.append("m.uuid = %(membership_uuid)s") + params["membership_uuid"] = membership_uuid filter_str = " AND ".join(conditions) filter_str = "WHERE " + filter_str if filter_str else "" @@ -134,6 +145,40 @@ class MembershipManager(PostgresManager): return [Membership.model_validate(item) for item in res] + def update_privilege( + self, + membership_id: PositiveInt, + privilege: MembershipPrivilege, + ) -> Membership: + with self.pg_config.make_connection() as conn, conn.cursor() as cursor: + cursor.execute( + query=""" + UPDATE common_membership + SET privilege = %s + WHERE id = %s + RETURNING uuid + """, + params=(privilege.value, membership_id), + ) + row = cursor.fetchone() + if row is None: + raise LookupError(f"Membership {membership_id} does not exist") + conn.commit() + + membership = self.get_by_uuid(membership_uuid=row["uuid"]) + assert membership is not None + return membership + + def delete(self, membership_id: PositiveInt) -> None: + with self.pg_config.make_connection() as conn, conn.cursor() as cursor: + cursor.execute( + query="DELETE FROM common_membership WHERE id = %s", + params=(membership_id,), + ) + if cursor.rowcount != 1: + raise LookupError(f"Membership {membership_id} does not exist") + conn.commit() + class TeamManager(PostgresManagerWithRedis): def get_or_create( diff --git a/generalresearch/models/gr/team.py b/generalresearch/models/gr/team.py index d340c68..c96a68e 100644 --- a/generalresearch/models/gr/team.py +++ b/generalresearch/models/gr/team.py @@ -71,7 +71,7 @@ class Membership(BaseModel): a Team can have various levels of permissions and rights. """ - model_config = ConfigDict(use_enum_values=True) + model_config = ConfigDict() id: SkipJsonSchema[PositiveInt | None] = Field( default=None, |
