11import time
22from datetime import datetime , timedelta
3+ from typing import Any , Dict , Optional
34
45from linode_api4 .objects .serializable import JSONObject
56
@@ -99,6 +100,18 @@ def _expand_vals(self, target, **vals):
99100 def __repr__ (self ):
100101 return "Mapping containing {}" .format (vars (self ).keys ())
101102
103+ @staticmethod
104+ def _flatten_base_subclass (obj : "Base" ) -> Optional [Dict [str , Any ]]:
105+ if obj is None :
106+ return None
107+
108+ # If the object hasn't already been lazy-loaded,
109+ # manually refresh it
110+ if not getattr (obj , "_populated" , False ):
111+ obj ._api_get ()
112+
113+ return obj ._raw_json
114+
102115 @property
103116 def dict (self ):
104117 result = vars (self ).copy ()
@@ -111,13 +124,20 @@ def dict(self):
111124 result [k ] = [
112125 (
113126 item .dict
114- if isinstance (item , cls )
115- else item ._raw_json if isinstance (item , Base ) else item
127+ if isinstance (item , (cls , JSONObject ))
128+ else (
129+ self ._flatten_base_subclass (item )
130+ if isinstance (item , Base )
131+ else item
132+ )
116133 )
117134 for item in v
118135 ]
119136 elif isinstance (v , Base ):
120- result [k ] = v ._raw_json
137+ result [k ] = self ._flatten_base_subclass (v )
138+ elif isinstance (v , JSONObject ):
139+ result [k ] = v .dict
140+
121141 return result
122142
123143
@@ -140,7 +160,10 @@ def __init__(self, client: object, id: object, json: object = {}) -> object:
140160 #: be updated on access.
141161 self ._set ("_raw_json" , None )
142162
143- for k in type (self ).properties :
163+ for k , v in type (self ).properties .items ():
164+ if v .identifier :
165+ continue
166+
144167 self ._set (k , None )
145168
146169 self ._set ("id" , id )
0 commit comments