helper.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. # -*- coding:utf-8 -*-
  2. import re
  3. import subprocess
  4. import uuid
  5. from datetime import datetime
  6. from hashlib import sha256
  7. from zoneinfo import available_timezones
  8. import random
  9. import string
  10. from flask_restful import fields
  11. def run(script):
  12. return subprocess.getstatusoutput('source /root/.bashrc && ' + script)
  13. class TimestampField(fields.Raw):
  14. def format(self, value):
  15. return int(value.timestamp())
  16. def email(email):
  17. # Define a regex pattern for email addresses
  18. pattern = r"^[\w\.-]+@([\w-]+\.)+[\w-]{2,}$"
  19. # Check if the email matches the pattern
  20. if re.match(pattern, email) is not None:
  21. return email
  22. error = ('{email} is not a valid email.'
  23. .format(email=email))
  24. raise ValueError(error)
  25. def uuid_value(value):
  26. if value == '':
  27. return str(value)
  28. try:
  29. uuid_obj = uuid.UUID(value)
  30. return str(uuid_obj)
  31. except ValueError:
  32. error = ('{value} is not a valid uuid.'
  33. .format(value=value))
  34. raise ValueError(error)
  35. def timestamp_value(timestamp):
  36. try:
  37. int_timestamp = int(timestamp)
  38. if int_timestamp < 0:
  39. raise ValueError
  40. return int_timestamp
  41. except ValueError:
  42. error = ('{timestamp} is not a valid timestamp.'
  43. .format(timestamp=timestamp))
  44. raise ValueError(error)
  45. class str_len(object):
  46. """ Restrict input to an integer in a range (inclusive) """
  47. def __init__(self, max_length, argument='argument'):
  48. self.max_length = max_length
  49. self.argument = argument
  50. def __call__(self, value):
  51. length = len(value)
  52. if length > self.max_length:
  53. error = ('Invalid {arg}: {val}. {arg} cannot exceed length {length}'
  54. .format(arg=self.argument, val=value, length=self.max_length))
  55. raise ValueError(error)
  56. return value
  57. class float_range(object):
  58. """ Restrict input to an float in a range (inclusive) """
  59. def __init__(self, low, high, argument='argument'):
  60. self.low = low
  61. self.high = high
  62. self.argument = argument
  63. def __call__(self, value):
  64. value = _get_float(value)
  65. if value < self.low or value > self.high:
  66. error = ('Invalid {arg}: {val}. {arg} must be within the range {lo} - {hi}'
  67. .format(arg=self.argument, val=value, lo=self.low, hi=self.high))
  68. raise ValueError(error)
  69. return value
  70. class datetime_string(object):
  71. def __init__(self, format, argument='argument'):
  72. self.format = format
  73. self.argument = argument
  74. def __call__(self, value):
  75. try:
  76. datetime.strptime(value, self.format)
  77. except ValueError:
  78. error = ('Invalid {arg}: {val}. {arg} must be conform to the format {format}'
  79. .format(arg=self.argument, val=value, lo=self.format))
  80. raise ValueError(error)
  81. return value
  82. def _get_float(value):
  83. try:
  84. return float(value)
  85. except (TypeError, ValueError):
  86. raise ValueError('{0} is not a valid float'.format(value))
  87. def supported_language(lang):
  88. if lang in ['en-US', 'zh-Hans']:
  89. return lang
  90. error = ('{lang} is not a valid language.'
  91. .format(lang=lang))
  92. raise ValueError(error)
  93. def timezone(timezone_string):
  94. if timezone_string and timezone_string in available_timezones():
  95. return timezone_string
  96. error = ('{timezone_string} is not a valid timezone.'
  97. .format(timezone_string=timezone_string))
  98. raise ValueError(error)
  99. def generate_string(n):
  100. letters_digits = string.ascii_letters + string.digits
  101. result = ""
  102. for i in range(n):
  103. result += random.choice(letters_digits)
  104. return result
  105. def get_remote_ip(request):
  106. if request.headers.get('CF-Connecting-IP'):
  107. return request.headers.get('Cf-Connecting-Ip')
  108. elif request.headers.getlist("X-Forwarded-For"):
  109. return request.headers.getlist("X-Forwarded-For")[0]
  110. else:
  111. return request.remote_addr
  112. def generate_text_hash(text: str) -> str:
  113. hash_text = str(text) + 'None'
  114. return sha256(hash_text.encode()).hexdigest()
  115. def get_current_datetime(type: str) -> str:
  116. # get current time
  117. current_time = datetime.utcnow()
  118. return current_time.strftime("%Y-%m-%d %H:%M:%S UTC+0000 %A")