utils.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import os
  4. import sys
  5. from django_extensions.management.signals import post_command, pre_command
  6. def _make_writeable(filename):
  7. """
  8. Make sure that the file is writable. Useful if our source is
  9. read-only.
  10. """
  11. import stat
  12. if sys.platform.startswith('java'):
  13. # On Jython there is no os.access()
  14. return
  15. if not os.access(filename, os.W_OK):
  16. st = os.stat(filename)
  17. new_permissions = stat.S_IMODE(st.st_mode) | stat.S_IWUSR
  18. os.chmod(filename, new_permissions)
  19. def setup_logger(logger, stream, filename=None, fmt=None):
  20. """
  21. Set up a logger (if no handlers exist) for console output,
  22. and file 'tee' output if desired.
  23. """
  24. if len(logger.handlers) < 1:
  25. console = logging.StreamHandler(stream)
  26. console.setLevel(logging.DEBUG)
  27. console.setFormatter(logging.Formatter(fmt))
  28. logger.addHandler(console)
  29. logger.setLevel(logging.DEBUG)
  30. logger.propagate = False
  31. if filename:
  32. outfile = logging.FileHandler(filename)
  33. outfile.setLevel(logging.INFO)
  34. outfile.setFormatter(logging.Formatter("%(asctime)s " + (fmt if fmt else '%(message)s')))
  35. logger.addHandler(outfile)
  36. class RedirectHandler(logging.Handler):
  37. """Redirect logging sent to one logger (name) to another."""
  38. def __init__(self, name, level=logging.DEBUG):
  39. # Contemplate feasibility of copying a destination (allow original handler) and redirecting.
  40. logging.Handler.__init__(self, level)
  41. self.name = name
  42. self.logger = logging.getLogger(name)
  43. def emit(self, record):
  44. self.logger.handle(record)
  45. def signalcommand(func):
  46. """Python decorator for management command handle defs that sends out a pre/post signal."""
  47. def inner(self, *args, **kwargs):
  48. pre_command.send(self.__class__, args=args, kwargs=kwargs)
  49. ret = func(self, *args, **kwargs)
  50. post_command.send(self.__class__, args=args, kwargs=kwargs, outcome=ret)
  51. return ret
  52. return inner
  53. def has_ipdb():
  54. try:
  55. import ipdb # noqa
  56. import IPython # noqa
  57. return True
  58. except ImportError:
  59. return False