util.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. # -*- coding: utf-8 -*-
  2. import pytz
  3. import datetime
  4. from odoo.exceptions import ValidationError
  5. # @staticmethod
  6. def is_string(s):
  7. return isinstance(s, str)
  8. def is_list(s):
  9. return type(s).__name__ == 'list'
  10. # 以小数形式保存的时间(整数部分为小时;小数部分×60为分钟),计算后,得到字符串的时间。
  11. # 例如:1.33333333333,计算后得到:':01:20'
  12. def get_time_str_from_time(time_float):
  13. hour = int(time_float)
  14. minute = int(round((time_float - hour) * 60))
  15. return '%(hour)02d:%(minute)02d' % {'hour': hour, 'minute': minute}
  16. # 按指定步长划分list(最后一组,还剩几个,就只有几个元素)
  17. def list_split(lst, max_length):
  18. return [lst[i:i + max_length] for i in range(0, len(lst), max_length)]
  19. # def split_list(arr, length):
  20. # return map(lambda b: arr[b:b + length], range(0, len(arr), length))
  21. def get_dic_from_list(lst):
  22. dic = {}
  23. for item in lst:
  24. if not item or len(item) < 2:
  25. continue
  26. dic[item[0]] = item[1]
  27. return dic
  28. def get_hour_diff(self):
  29. """
  30. 获取时区间(标准时间 -- 东八区)的时间差 --> 小时数
  31. :return:
  32. """
  33. tz_context = self._context.get('tz') or self.env.user.tz or 'Asia/Shanghai'
  34. tz = pytz.timezone(tz_context)
  35. hour_diff = int(tz._utcoffset.total_seconds() / 3600)
  36. return hour_diff
  37. def get_local_datetime(self, date_str_or_datetime):
  38. """
  39. 根据日期时间或字符串(标准时间),得到本地日期时间
  40. :param self: BO的self
  41. :param date_str_or_datetime: 日期时间或字符串(标准时间)
  42. :return: 本地日期时间。datetime类型
  43. """
  44. date = get_datetime(date_str_or_datetime)
  45. diff_hour = get_hour_diff(self)
  46. local_date = date + datetime.timedelta(hours=diff_hour)
  47. return local_date
  48. def get_local_datetime_str(self, date_str_or_datetime):
  49. """
  50. 根据日期时间或字符串(标准时间),得到本地日期时间字符串
  51. :param self: BO的self
  52. :param date_str_or_datetime: 日期时间或字符串(标准时间)
  53. :return: 本地日期时间字符串
  54. """
  55. local_date = get_local_datetime(self, date_str_or_datetime)
  56. return local_date.strftime('%Y-%m-%d %H:%M:%S')
  57. def get_datetime(date_str_or_datetime):
  58. """
  59. 根据日期时间或字符串,得到日期时间
  60. :param date_str_or_datetime: 日期时间或字符串(标准时间)
  61. :return: 日期时间。datetime类型
  62. """
  63. if isinstance(date_str_or_datetime, basestring):
  64. if len(date_str_or_datetime) > 19:
  65. _date = date_str_or_datetime[:19]
  66. elif len(date_str_or_datetime) > 16:
  67. _date = date_str_or_datetime[:16] + ':00'
  68. elif len(date_str_or_datetime) > 13:
  69. _date = date_str_or_datetime[:13] + ':00:00'
  70. elif len(date_str_or_datetime) > 10:
  71. _date = date_str_or_datetime[:10] + ' 00:00:00'
  72. else:
  73. raise ValidationError(u'不是合法的日期:' + date_str_or_datetime)
  74. return datetime.datetime.strptime(_date, '%Y-%m-%d %H:%M:%S')
  75. if isinstance(date_str_or_datetime, datetime.datetime):
  76. return date_str_or_datetime
  77. raise ValidationError(u'不是合法的日期:{},类型:{}'.format(date_str_or_datetime, type(date_str_or_datetime).__name__))
  78. def get_amount_result(bill, amount_values):
  79. """
  80. 合计计算时,取要更新的值 -- 如果合计值 与 原来的值一致,那么就不更新
  81. :param bill:
  82. :param amount_values:
  83. :return:
  84. """
  85. result = {}
  86. for key in amount_values:
  87. if getattr(bill, key) != amount_values[key]:
  88. result[key] = amount_values[key]
  89. return result
  90. def get_second_unit_number(goods_id, main_unit_number):
  91. """
  92. 计算 辅数量
  93. :param goods_id:
  94. :param main_unit_number:
  95. :return:
  96. """
  97. if not goods_id or not main_unit_number:
  98. return 0
  99. if not goods_id.need_change():
  100. return 0
  101. if goods_id.second_rate != 0:
  102. return main_unit_number * goods_id.main_rate / goods_id.second_rate
  103. def return_message(msg, time_span=1000):
  104. """
  105. 提示信息。用于单据中,例如点击按钮后的提示、点击“动作”中的操作(对应为model中的方法)后的提示。
  106. 示例:return util.return_message(u'操作成功')
  107. @param msg: 要显示的信息。支持html。例如:u'<font color=#cc9966>没有做任何操作。</font><br>到对应的方法中,取消注销即可测试。<br>一行一个测试'
  108. @param time_span: 信息显示时间
  109. @return: 执行显示提示信息的client。用于return 后面。
  110. """
  111. return {
  112. 'type': 'ir.actions.client',
  113. 'tag': 'show',
  114. 'params': {'info': msg, 'time': time_span}
  115. }
  116. def return_message2(msg_arr, time_span=5000):
  117. """
  118. 提示信息。
  119. 用于单据中,例如点击按钮后的提示、点击“动作”中的操作(对应为model中的方法)后的提示。
  120. 示例:return util.return_message2([u'操作成功'])
  121. @param msg_arr: 要显示的信息。
  122. 数组,每个元素表示一段信息。
  123. 支持html。例如:[u'<font color=#cc9966>没有做任何操作。</font><br>到对应的方法中,取消注销即可测试。<br>一行一个测试']
  124. @param time_span: 信息显示时间
  125. @return: 执行显示提示信息的client。用于return 后面。
  126. """
  127. return {
  128. 'type': 'ir.actions.client',
  129. 'tag': 'show2',
  130. 'params': {'info_array': msg_arr, 'time': time_span}
  131. }