aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstuppie2026-10-16 15:19:11 -0700
committerstuppie2026-10-16 15:19:11 -0700
commit6329677471c4c393fc3f182924a23e3884542342 (patch)
treed27d1d395019d92b069f9dcc81aa8701f8c239df
parent2f833952ac09610e31465db979aa515127727b17 (diff)
downloadgeneralresearch-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.py11
-rw-r--r--generalresearch/models/gr/__init__.py4
-rw-r--r--generalresearch/models/gr/authentication.py15
-rw-r--r--generalresearch/models/gr/team.py8
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)