@@ -215,33 +215,55 @@ def _migrate_old_default_profile(self):
215215 if self .exists ("_default" ):
216216 return
217217
218+ if not isinstance (default_overrides , dict ):
219+ self ._logger .warn ("Existing default profile from settings is not a valid profile, refusing to migrate: {!r}" .format (default_overrides ))
220+ return
221+
218222 default_overrides ["id" ] = "_default"
219223 self .save (default_overrides )
220224
221225 settings ().set (["printerProfiles" , "defaultProfile" ], None )
222226 settings ().save ()
223227
228+ self ._logger .info ("Migrated default printer profile from settings to _default.profile: {!r}" .format (default_overrides ))
229+
224230 def _verify_default_available (self ):
225231 default_id = settings ().get (["printerProfile" , "default" ])
226232 if default_id is None :
227233 default_id = "_default"
228234
229235 if not self .exists (default_id ):
230236 if not self .exists ("_default" ):
231- self ._logger .error ("Selected default profile {} and _default do not exist, creating _default again and setting it as default" .format (default_id ))
237+ if default_id == "_default" :
238+ self ._logger .error ("Profile _default does not exist, creating _default again and setting it as default" )
239+ else :
240+ self ._logger .error ("Selected default profile {} and _default do not exist, creating _default again and setting it as default" .format (default_id ))
232241 self .save (self .__class__ .default , allow_overwrite = True , make_default = True )
233242 else :
234243 self ._logger .error ("Selected default profile {} does not exists, resetting to _default" .format (default_id ))
235244 settings ().set (["printerProfiles" , "default" ], "_default" )
236245 settings ().save ()
246+ default_id = "_default"
247+
248+ profile = self .get (default_id )
249+ if profile is None :
250+ self ._logger .error ("Selected default profile {} is invalid, resetting to default values" .format (default_id ))
251+ profile = copy .deepcopy (self .__class__ .default )
252+ profile ["id" ] = default_id
253+ self .save (self .__class__ .default , allow_overwrite = True , make_default = True )
237254
238255 def select (self , identifier ):
239256 if identifier is None or not self .exists (identifier ):
240257 self ._current = self .get_default ()
241258 return False
242259 else :
243260 self ._current = self .get (identifier )
244- return True
261+ if self ._current is None :
262+ self ._logger .error ("Profile {} is invalid, cannot select, falling back to default" .format (identifier ))
263+ self ._current = self .get_default ()
264+ return False
265+ else :
266+ return True
245267
246268 def deselect (self ):
247269 self ._current = None
@@ -310,6 +332,8 @@ def get_default(self):
310332 profile = self .get (default )
311333 if profile is not None :
312334 return profile
335+ else :
336+ self ._logger .warn ("Default profile {} is invalid, falling back to built-in defaults" .format (default ))
313337
314338 return copy .deepcopy (self .__class__ .default )
315339
@@ -344,6 +368,7 @@ def _load_all(self):
344368 try :
345369 profile = self ._load_from_path (path )
346370 except InvalidProfileError :
371+ self ._logger .warn ("Profile {} is invalid, skipping" .format (identifier ))
347372 continue
348373
349374 if profile is None :
@@ -373,6 +398,9 @@ def _load_from_path(self, path):
373398 with open (path ) as f :
374399 profile = yaml .safe_load (f )
375400
401+ if profile is None or not isinstance (profile , dict ):
402+ raise InvalidProfileError ("Profile is None or not a dictionary" )
403+
376404 if self ._migrate_profile (profile ):
377405 try :
378406 self ._save_to_path (path , profile , allow_overwrite = True )
0 commit comments