diff options
| author | stuppie | 2026-10-16 15:19:11 -0700 |
|---|---|---|
| committer | stuppie | 2026-10-16 15:19:11 -0700 |
| commit | 6329677471c4c393fc3f182924a23e3884542342 (patch) | |
| tree | d27d1d395019d92b069f9dcc81aa8701f8c239df | |
| parent | 2f833952ac09610e31465db979aa515127727b17 (diff) | |
| download | generalresearch-6329677471c4c393fc3f182924a23e3884542342.tar.gz generalresearch-6329677471c4c393fc3f182924a23e3884542342.zip | |
create GRUserRef and add to Membership so a user's email comes back within the membership obj
| -rw-r--r-- | generalresearch/managers/gr/team.py | 11 | ||||
| -rw-r--r-- | generalresearch/models/gr/__init__.py | 4 | ||||
| -rw-r--r-- | generalresearch/models/gr/authentication.py | 15 | ||||
| -rw-r--r-- | generalresearch/models/gr/team.py | 8 |
4 files changed, 32 insertions, 6 deletions
diff --git a/generalresearch/managers/gr/team.py b/generalresearch/managers/gr/team.py index d673dfc..89a3a19 100644 --- a/generalresearch/managers/gr/team.py +++ b/generalresearch/managers/gr/team.py @@ -43,6 +43,7 @@ class MembershipManager(PostgresManager): privilege=privilege, team_id=team.id, user_id=gr_user.id, + user=gr_user.to_user_ref(), created=datetime.now(tz=UTC), ) @@ -133,8 +134,12 @@ class MembershipManager(PostgresManager): m.privilege, m.created, m.user_id, + u.email AS user_email, + u.date_joined AS user_date_joined, m.team_id FROM common_membership AS m + JOIN gr_user AS u + ON u.id = m.user_id {filter_str} LIMIT 250 """ @@ -143,6 +148,12 @@ class MembershipManager(PostgresManager): c.execute(query=query, params=params) res = c.fetchall() + for item in res: + item["user"] = { + "email": item.pop("user_email"), + "date_joined": item.pop("user_date_joined"), + } + return [Membership.model_validate(item) for item in res] def update_privilege( diff --git a/generalresearch/models/gr/__init__.py b/generalresearch/models/gr/__init__.py index c6d9b2a..fb27718 100644 --- a/generalresearch/models/gr/__init__.py +++ b/generalresearch/models/gr/__init__.py @@ -1,4 +1,4 @@ -from generalresearch.models.gr.authentication import GRToken, GRUser +from generalresearch.models.gr.authentication import GRToken, GRUser, GRUserRef from generalresearch.models.gr.business import Business, BusinessCreate from generalresearch.models.gr.team import Team, TeamCreate from generalresearch.models.thl.finance import BusinessBalances @@ -6,7 +6,7 @@ from generalresearch.models.thl.payout import BrokerageProductPayoutEvent from generalresearch.models.thl.product import Product # To prevent type checkers from removing these imports from this file -_ = Product, BrokerageProductPayoutEvent, BusinessBalances +_ = Product, BrokerageProductPayoutEvent, BusinessBalances, GRUserRef GRUser.model_rebuild() GRToken.model_rebuild() diff --git a/generalresearch/models/gr/authentication.py b/generalresearch/models/gr/authentication.py index 123e1dc..5366db8 100644 --- a/generalresearch/models/gr/authentication.py +++ b/generalresearch/models/gr/authentication.py @@ -10,11 +10,11 @@ from pydantic import ( AnyHttpUrl, BaseModel, ConfigDict, + EmailStr, Field, NonNegativeInt, PositiveInt, field_validator, - EmailStr, ) from generalresearch.models.custom_types import AwareDatetimeISO, UUIDStr @@ -98,6 +98,13 @@ class Claims(BaseModel): return self.sub +class GRUserRef(BaseModel): + email: EmailStr | None = Field(default=None) + date_joined: AwareDatetimeISO = Field( + description="When the GR User account signed up." + ) + + class GRUser(BaseModel): model_config = ConfigDict( # extra="forbid", @@ -121,6 +128,12 @@ class GRUser(BaseModel): token: GRToken | None = Field(default=None) claims: Claims | None = Field(default=None) + def to_user_ref(self) -> GRUserRef: + return GRUserRef( + email=self.email, + date_joined=self.date_joined, + ) + def prefetch_claims( self, token: str, key: dict[str, Any], audience: str, issuer: AnyHttpUrl ) -> None: diff --git a/generalresearch/models/gr/team.py b/generalresearch/models/gr/team.py index c96a68e..ee379eb 100644 --- a/generalresearch/models/gr/team.py +++ b/generalresearch/models/gr/team.py @@ -29,6 +29,7 @@ from generalresearch.models.custom_types import ( UUIDStr, UUIDStrCoerce, ) +from generalresearch.models.gr.authentication import GRUserRef from generalresearch.utils.enum import ReprEnumMeta if TYPE_CHECKING: @@ -73,7 +74,7 @@ class Membership(BaseModel): model_config = ConfigDict() - id: SkipJsonSchema[PositiveInt | None] = Field( + id: PositiveInt | None = Field( default=None, ) uuid: UUIDStrCoerce = Field(examples=[uuid4().hex]) @@ -90,9 +91,10 @@ class Membership(BaseModel): "account was created." ) - user_id: SkipJsonSchema[PositiveInt] = Field() + user_id: PositiveInt = Field() + user: GRUserRef = Field() - team_id: SkipJsonSchema[PositiveInt] = Field() + team_id: PositiveInt = Field() # prefetch attributes team: SkipJsonSchema[Team | None] = Field(default=None) |
