helpers.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import logging
  4. from typing import TYPE_CHECKING
  5. from apps.web.core.models import DriverAdapter, DriverEventer
  6. logger = logging.getLogger(__name__)
  7. if TYPE_CHECKING:
  8. from apps.web.device.models import DeviceDict
  9. from apps.web.core.adapter.base import SmartBox
  10. from apps.web.eventer import EventBuilder
  11. def arguments():
  12. """Returns tuple containing dictionary of calling function's
  13. named arguments and a list of calling function's unnamed
  14. positional arguments.
  15. """
  16. from inspect import getargvalues, stack
  17. positional_name, keyword_name, args = getargvalues(stack()[1][0])[-3:]
  18. positional_args = args.pop(positional_name, [])
  19. args.update(args.pop(keyword_name, []))
  20. return args, positional_args
  21. def named_arguments():
  22. from inspect import getargvalues, stack
  23. positional_name, keyword_name, args = getargvalues(stack()[1][0])[-3:]
  24. args.pop(positional_name, [])
  25. args.update(args.pop(keyword_name, []))
  26. return args
  27. class ActionDeviceBuilder(object):
  28. @staticmethod
  29. def create_action_device(dev, typeCode = None):
  30. from apps.web.device.define import DeviceChannelType
  31. assert dev.channelType != DeviceChannelType.Channel_BT, u'蓝牙设备不能调用该接口'
  32. if not typeCode:
  33. devType = dev.get('devType', None)
  34. if not devType:
  35. return None
  36. typeCode = devType.get('code', None)
  37. if typeCode is None:
  38. return None
  39. is_online = devType.get('online', True)
  40. else:
  41. is_online = True
  42. return DriverAdapter.get_driver_adapter(typeCode, dev, is_online)
  43. @staticmethod
  44. def create_eventer(dev, typeCode = None):
  45. from apps.web.device.define import DeviceChannelType
  46. assert dev.channelType != DeviceChannelType.Channel_BT, u'蓝牙设备不能调用该接口'
  47. adapter = ActionDeviceBuilder.create_action_device(dev, typeCode)
  48. if not typeCode:
  49. devType = dev.get('devType', None)
  50. if not devType:
  51. return None
  52. typeCode = devType.get('code', None)
  53. if typeCode is None:
  54. return None
  55. is_online = devType.get('online', True)
  56. else:
  57. is_online = True
  58. return DriverEventer.get_driver_eventer(typeCode, adapter, is_online)
  59. @staticmethod
  60. def create_eventer_by_adapter(adapter):
  61. # type: (SmartBox)->EventBuilder
  62. dev = adapter.device # type: DeviceDict
  63. devType = dev.get('devType', None)
  64. if not devType:
  65. return None
  66. typeCode = devType.get('code', None)
  67. if typeCode is None:
  68. return None
  69. is_online = devType.get('online', True)
  70. return DriverEventer.get_driver_eventer(typeCode, adapter, is_online)