_backwards.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # -*- coding: utf-8 -*-
  2. """
  3. flask_admin._backwards
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Backward compatibility helpers.
  6. """
  7. import sys
  8. import warnings
  9. def get_property(obj, name, old_name, default=None):
  10. """
  11. Check if old property name exists and if it does - show warning message
  12. and return value.
  13. Otherwise, return new property value
  14. :param name:
  15. New property name
  16. :param old_name:
  17. Old property name
  18. :param default:
  19. Default value
  20. """
  21. if hasattr(obj, old_name):
  22. warnings.warn('Property %s is obsolete, please use %s instead' %
  23. (old_name, name), stacklevel=2)
  24. return getattr(obj, old_name)
  25. return getattr(obj, name, default)
  26. class ObsoleteAttr(object):
  27. def __init__(self, new_name, old_name, default):
  28. self.new_name = new_name
  29. self.old_name = old_name
  30. self.cache = '_cache_' + new_name
  31. self.default = default
  32. def __get__(self, obj, objtype=None):
  33. if obj is None:
  34. return self
  35. # Check if we have new cached value
  36. if hasattr(obj, self.cache):
  37. return getattr(obj, self.cache)
  38. # Check if there's old attribute
  39. if hasattr(obj, self.old_name):
  40. warnings.warn('Property %s is obsolete, please use %s instead' %
  41. (self.old_name, self.new_name), stacklevel=2)
  42. return getattr(obj, self.old_name)
  43. # Return default otherwise
  44. return self.default
  45. def __set__(self, obj, value):
  46. setattr(obj, self.cache, value)
  47. class ImportRedirect(object):
  48. def __init__(self, prefix, target):
  49. self.prefix = prefix
  50. self.target = target
  51. def find_module(self, fullname, path=None):
  52. if fullname.startswith(self.prefix):
  53. return self
  54. def load_module(self, fullname):
  55. if fullname in sys.modules:
  56. return sys.modules[fullname]
  57. path = self.target + fullname[len(self.prefix):]
  58. __import__(path)
  59. module = sys.modules[fullname] = sys.modules[path]
  60. return module
  61. def import_redirect(old, new):
  62. sys.meta_path.append(ImportRedirect(old, new))