Coverage for functions \ flipdare \ generated \ util \ model_util.py: 93%
30 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
1#!/usr/bin/env python
2# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved.
3#
4# This file is part of Flipdare's proprietary software and contains
5# confidential and copyrighted material. Unauthorised copying,
6# modification, distribution, or use of this file is strictly
7# prohibited without prior written permission from Flipdare Pty Ltd.
8#
9# This software includes third-party components licensed under MIT,
10# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details.
11#
14from typing import Any
15from flipdare.app_log import LOG
16from flipdare.generated.shared.model.model_obj_type import ModelObjType
17from flipdare.wrapper._persisted_wrapper import PersistedWrapper
18from flipdare.wrapper.persisted_guard import PersistedGuard
21class ModelUtil[T: PersistedWrapper[Any]]:
23 def __init__(self, wrapper: T) -> None:
24 self.wrapper = wrapper
26 @property
27 def model_name(self) -> str:
28 """Get the model name for logging purposes."""
29 wrapper = self.wrapper
31 model_class = wrapper.MODEL_CLASS
32 return model_class.__name__ if model_class else type(wrapper).__name__
34 def get_uid_if_exists(self) -> str | None:
35 wrapper = self.wrapper
37 if PersistedGuard.is_user(wrapper):
38 # for user wrappers doc_id is uid
39 return wrapper.doc_id
41 # for most wrappers, uid is the field we want
42 uid = getattr(wrapper, "uid", None)
43 if uid is not None:
44 return str(uid)
46 # for dares/payment issues
47 # NOTE: this needs to be before "obj_id"/"obj_type" check because
48 # NOTE: dares/issues also have those fields but they don't represent users.
49 from_uid = getattr(wrapper, "from_uid", None)
50 if from_uid is not None:
51 return str(from_uid)
53 obj_id = getattr(wrapper, "obj_id", None)
54 obj_type = getattr(wrapper, "obj_type", None)
55 if (obj_id is not None and obj_type is not None) and (obj_type == ModelObjType.USER):
56 # for objects with obj_id/obj_type,
57 # if obj_id is a uid, obj_type will be ModelObjType.USER
58 return str(obj_id)
60 # this wrapper doesn't have a uid!
61 msg = f"Wrapper {self.model_name} does not have a uid field. Returning None for uid."
62 LOG().warning(msg)
63 return None