Coverage for functions \ flipdare \ generated \ model \ group_model.py: 91%

113 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-05-08 12:22 +1000

1#!/usr/bin/env python 

2# 

3# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved. 

4# 

5# This file is part of Flipdare's proprietary software and contains 

6# confidential and copyrighted material. Unauthorised copying, 

7# modification, distribution, or use of this file is strictly 

8# prohibited without prior written permission from Flipdare Pty Ltd. 

9# 

10# This software includes third-party components licensed under MIT, 

11# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details. 

12# 

13# NOTE: THIS FILE IS AUTO GENERATED. DO NOT EDIT. 

14# 

15# Generated by codegen_models.py 

16# 

17# Modify 'codegen_models.py' 

18# and re-run the script above to update. 

19# 

20from __future__ import annotations 

21from datetime import datetime 

22from google.cloud.firestore_v1.transforms import Sentinel 

23from flipdare.core.firestore_field import FirestoreField 

24from flipdare.util.time_util import FirestoreTime 

25from typing import Any, TypedDict, cast, Unpack 

26from enum import StrEnum 

27from pydantic import Field, ConfigDict, TypeAdapter 

28from flipdare.firestore.core.app_base_model import AppBaseModel 

29from flipdare.generated.shared.model.app_visibility import AppVisibility 

30from flipdare.generated.model.internal.image_model import ImageModel, ImageDict 

31from flipdare.generated.model.internal.dare_stats_model import DareStatsModel, DareStatsDict 

32from flipdare.generated.model.internal.view_stats_model import ViewStatsModel, ViewStatsDict 

33from flipdare.app_globals import string_has_alpha 

34from typing import override 

35 

36 

37class GroupKeys(StrEnum): 

38 ID = "id" 

39 CREATED_AT = "created_at" 

40 UPDATED_AT = "updated_at" 

41 VISIBILITY = "visibility" 

42 UID = "uid" 

43 NAME = "name" 

44 DESCRIPTION = "description" 

45 AVATAR = "avatar" 

46 SLUG_CODE = "slug_code" 

47 FLAG_ID = "flag_id" 

48 MEMBER_CT = "member_ct" 

49 INVITE_CT = "invite_ct" 

50 DARE_STATS = "dare_stats" 

51 VIEW_STATS = "view_stats" 

52 VERSION = "version" 

53 PROCESSED = "processed" 

54 ERROR_COUNT = "error_count" 

55 HASH_GENERATED = "hash_generated" 

56 MEMBER_CREATED = "member_created" 

57 SEARCH_INDEXED = "search_indexed" 

58 

59 

60# !! IMPORTANT !! 

61# !! 

62# !! this should only be used in the database to query. 

63# !! 

64class GroupInternalKeys(StrEnum): 

65 CREATED_AT = "created_at" 

66 UPDATED_AT = "updated_at" 

67 VERSION = "VERSION" 

68 PROCESSED = "INT_P" 

69 ERROR_COUNT = "INT_E" 

70 HASH_GENERATED = "INT_G_H" 

71 MEMBER_CREATED = "INT_G_M" 

72 SEARCH_INDEXED = "INT_G_I" 

73 

74 

75class GroupModel(AppBaseModel): 

76 """Represents a user-created group within the app, which can be used for organizing dares, events, or communities.""" 

77 

78 model_config = ConfigDict(populate_by_name=True, arbitrary_types_allowed=True) 

79 

80 id: str | None = Field(None, alias="id") 

81 created_at: FirestoreField = Field( 

82 default_factory=cast("Any", lambda: FirestoreTime.server_timestamp()) 

83 ) 

84 updated_at: FirestoreField = Field( 

85 default_factory=cast("Any", lambda: FirestoreTime.server_timestamp()) 

86 ) 

87 visibility: AppVisibility = Field(default=AppVisibility.PUBLIC) 

88 uid: str 

89 name: str 

90 description: str 

91 avatar: ImageModel | None = None 

92 slug_code: str 

93 flag_id: str | None = None 

94 member_ct: int = Field(default=0) 

95 invite_ct: int = Field(default=0) 

96 dare_stats: DareStatsModel 

97 view_stats: ViewStatsModel 

98 # Version (base internal field) 

99 version: int = Field(default=1, alias="VERSION") 

100 # Processed (base internal field) 

101 processed: bool = Field(default=False, alias="INT_P") 

102 # Error Count (base internal field) 

103 error_count: int = Field(default=0, alias="INT_E") 

104 # Hash Generated (internal field) 

105 hash_generated: bool = Field(default=False, alias="INT_G_H") 

106 # Member Created (internal field) 

107 member_created: bool = Field(default=False, alias="INT_G_M") 

108 # Search Indexed (internal field) 

109 search_indexed: bool = Field(default=False, alias="INT_G_I") 

110 

111 @classmethod 

112 def validate_partial(cls, **data: Unpack[GroupDict]) -> dict[str, Any]: 

113 """ 

114 Uses Unpack to give you autocomplete and static warnings 

115 if you pass an invalid key or type in your code. 

116 

117 Returns a dict with Firestore field names (aliases) for use with batch.update(). 

118 """ 

119 result: dict[str, Any] = {} 

120 for k, v in data.items(): 

121 if k in cls.__pydantic_fields__: 

122 field_info = cls.__pydantic_fields__[k] 

123 validated_value = cast( 

124 "Any", 

125 TypeAdapter(field_info.annotation).validate_python(v), 

126 ) 

127 # Use alias if defined, otherwise use field name 

128 output_key = field_info.alias or k 

129 result[output_key] = validated_value 

130 return result 

131 

132 # ---- Convenience predicates ----------------------------------------- 

133 @property 

134 def can_share(self) -> bool: 

135 return self.visibility == AppVisibility.PUBLIC and self.flag_id is None 

136 

137 @property 

138 @override 

139 def searchable_values(self) -> list[str]: 

140 values = [] 

141 if string_has_alpha(self.name): 

142 values.append(self.name) 

143 if string_has_alpha(self.description): 

144 values.append(self.description) 

145 return values 

146 

147 def reindex(self) -> None: 

148 self.search_indexed = False 

149 

150 

151GROUP_FIELD_NAMES: list[str] = list(GroupModel.model_fields.keys()) 

152 

153 

154class GroupDict(TypedDict, total=False): 

155 id: str | None 

156 created_at: Sentinel | datetime | str 

157 updated_at: Sentinel | datetime | str 

158 visibility: AppVisibility | None 

159 uid: str 

160 name: str 

161 description: str 

162 avatar: ImageDict | None 

163 slug_code: str 

164 flag_id: str | None 

165 member_ct: int | None 

166 invite_ct: int | None 

167 dare_stats: DareStatsDict 

168 view_stats: ViewStatsDict 

169 VERSION: int | None 

170 INT_P: bool | None 

171 INT_E: int | None 

172 INT_G_H: bool | None 

173 INT_G_M: bool | None 

174 INT_G_I: bool | None