urltools.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import logging
  2. import re
  3. from flask import request
  4. log = logging.getLogger(__name__)
  5. class Stack(object):
  6. """
  7. Stack data structure will not insert
  8. equal sequential data
  9. """
  10. def __init__(self, list=None, size=5):
  11. self.size = size
  12. self.data = list or []
  13. def push(self, item):
  14. if self.data:
  15. if item != self.data[len(self.data) - 1]:
  16. self.data.append(item)
  17. else:
  18. self.data.append(item)
  19. if len(self.data) > self.size:
  20. self.data.pop(0)
  21. def pop(self):
  22. if len(self.data) == 0:
  23. return None
  24. return self.data.pop(len(self.data) - 1)
  25. def to_json(self):
  26. return self.data
  27. def get_group_by_args():
  28. """
  29. Get page arguments for group by
  30. """
  31. group_by = request.args.get("group_by")
  32. if not group_by:
  33. group_by = ""
  34. return group_by
  35. def get_page_args():
  36. """
  37. Get page arguments, returns a dictionary
  38. { <VIEW_NAME>: PAGE_NUMBER }
  39. Arguments are passed: page_<VIEW_NAME>=<PAGE_NUMBER>
  40. """
  41. pages = {}
  42. for arg in request.args:
  43. re_match = re.findall("page_(.*)", arg)
  44. if re_match:
  45. pages[re_match[0]] = int(request.args.get(arg))
  46. return pages
  47. def get_page_size_args():
  48. """
  49. Get page size arguments, returns an int
  50. { <VIEW_NAME>: PAGE_NUMBER }
  51. Arguments are passed: psize_<VIEW_NAME>=<PAGE_SIZE>
  52. """
  53. page_sizes = {}
  54. for arg in request.args:
  55. re_match = re.findall("psize_(.*)", arg)
  56. if re_match:
  57. page_sizes[re_match[0]] = int(request.args.get(arg))
  58. return page_sizes
  59. def get_order_args():
  60. """
  61. Get order arguments, return a dictionary
  62. { <VIEW_NAME>: (ORDER_COL, ORDER_DIRECTION) }
  63. Arguments are passed like: _oc_<VIEW_NAME>=<COL_NAME>&_od_<VIEW_NAME>='asc'|'desc'
  64. """
  65. orders = {}
  66. for arg in request.args:
  67. re_match = re.findall("_oc_(.*)", arg)
  68. if re_match:
  69. order_direction = request.args.get("_od_" + re_match[0])
  70. if order_direction in ("asc", "desc"):
  71. orders[re_match[0]] = (request.args.get(arg), order_direction)
  72. return orders
  73. def get_filter_args(filters, disallow_if_not_in_search=True):
  74. """
  75. Sets filters with the given current request args
  76. Request arg filters are of the form "_flt_<DECIMAL>_<VIEW_NAME>_<COL_NAME>"
  77. :param filters: Filter instance to apply the request filters on
  78. :param disallow_if_not_in_search: If True, disallow filters that are not in the search
  79. :return:
  80. """
  81. filters.clear_filters()
  82. request_args = set(request.args)
  83. for arg in request_args:
  84. re_match = re.findall(r"_flt_(\d)_(.*)", arg)
  85. if not re_match:
  86. continue
  87. filter_index = int(re_match[0][0])
  88. filter_column = re_match[0][1]
  89. if (
  90. filter_column not in filters.get_search_filters().keys()
  91. and disallow_if_not_in_search
  92. ):
  93. log.warning("Filter column not allowed")
  94. continue
  95. filters.add_filter_index(filter_column, filter_index, request.args.getlist(arg))