base.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from flask import request
  4. import json
  5. import jimit as ji
  6. from jimvc.models import Rules
  7. __author__ = 'James Iter'
  8. __date__ = '2017/5/28'
  9. __contact__ = 'james.iter.cn@gmail.com'
  10. __copyright__ = '(c) 2017 by James Iter.'
  11. class Base(object):
  12. def __init__(self, the_class=None, the_blueprint=None, the_blueprints=None):
  13. self.the_class = the_class
  14. self.the_blueprint = the_blueprint
  15. self.the_blueprints = the_blueprints
  16. def get(self, ids=None, ids_rule=None, by_field=None):
  17. the_instance = self.the_class()
  18. args_rules = [
  19. ids_rule
  20. ]
  21. try:
  22. ji.Check.previewing(args_rules, {ids_rule[1]: ids})
  23. ret = dict()
  24. ret['state'] = ji.Common.exchange_state(20000)
  25. if -1 == ids.find(','):
  26. setattr(the_instance, by_field, ids)
  27. the_instance.get_by(by_field)
  28. ret['data'] = the_instance.__dict__
  29. else:
  30. ret['data'], ret['total'] = self.the_class.get_by_filter(
  31. limit=100, order_by=by_field, filter_str=':'.join([by_field, 'in', ids]))
  32. return ret
  33. except ji.PreviewingError, e:
  34. return json.loads(e.message)
  35. def get_by_filter(self):
  36. page = str(request.args.get('page', 1))
  37. page_size = str(request.args.get('page_size', 50))
  38. args_rules = [
  39. Rules.PAGE.value,
  40. Rules.PAGE_SIZE.value
  41. ]
  42. try:
  43. ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
  44. except ji.PreviewingError, e:
  45. return json.loads(e.message)
  46. page = int(page)
  47. page_size = int(page_size)
  48. # 把page和page_size换算成offset和limit
  49. offset = (page - 1) * page_size
  50. # offset, limit将覆盖page及page_size的影响
  51. offset = str(request.args.get('offset', offset))
  52. limit = str(request.args.get('limit', page_size))
  53. order_by = request.args.get('order_by', 'id')
  54. order = request.args.get('order', 'asc')
  55. filter_str = request.args.get('filter', '')
  56. args_rules = [
  57. Rules.OFFSET.value,
  58. Rules.LIMIT.value,
  59. Rules.ORDER_BY.value,
  60. Rules.ORDER.value
  61. ]
  62. try:
  63. ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order})
  64. offset = int(offset)
  65. limit = int(limit)
  66. ret = dict()
  67. ret['state'] = ji.Common.exchange_state(20000)
  68. ret['data'] = list()
  69. ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size,
  70. 'next': '', 'prev': '', 'first': '', 'last': ''}
  71. ret['data'], ret['paging']['total'] = self.the_class.get_by_filter(
  72. offset=offset, limit=limit, order_by=order_by, order=order, filter_str=filter_str)
  73. host_url = request.host_url.rstrip('/')
  74. other_str = '&filter=' + filter_str + '&order=' + order + '&order_by=' + order_by
  75. last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
  76. if page <= 1:
  77. ret['paging']['prev'] = host_url + self.the_blueprints.url_prefix + '?page=1&page_size=' + \
  78. page_size.__str__() + other_str
  79. else:
  80. ret['paging']['prev'] = host_url + self.the_blueprints.url_prefix + '?page=' + str(page - 1) + \
  81. '&page_size=' + page_size.__str__() + other_str
  82. if page >= last_pagination:
  83. ret['paging']['next'] = host_url + self.the_blueprints.url_prefix + '?page=' + \
  84. last_pagination.__str__() + '&page_size=' + page_size.__str__() + other_str
  85. else:
  86. ret['paging']['next'] = host_url + self.the_blueprints.url_prefix + '?page=' + str(page + 1) + \
  87. '&page_size=' + page_size.__str__() + other_str
  88. ret['paging']['first'] = host_url + self.the_blueprints.url_prefix + '?page=1&page_size=' + \
  89. page_size.__str__() + other_str
  90. ret['paging']['last'] = \
  91. host_url + self.the_blueprints.url_prefix + '?page=' + last_pagination.__str__() + '&page_size=' + \
  92. page_size.__str__() + other_str
  93. return ret
  94. except ji.PreviewingError, e:
  95. return json.loads(e.message)
  96. def content_search(self):
  97. page = str(request.args.get('page', 1))
  98. page_size = str(request.args.get('page_size', 50))
  99. args_rules = [
  100. Rules.PAGE.value,
  101. Rules.PAGE_SIZE.value
  102. ]
  103. try:
  104. ji.Check.previewing(args_rules, {'page': page, 'page_size': page_size})
  105. except ji.PreviewingError, e:
  106. return json.loads(e.message)
  107. page = int(page)
  108. page_size = int(page_size)
  109. # 把page和page_size换算成offset和limit
  110. offset = (page - 1) * page_size
  111. # offset, limit将覆盖page及page_size的影响
  112. offset = str(request.args.get('offset', offset))
  113. limit = str(request.args.get('limit', page_size))
  114. order_by = request.args.get('order_by', 'id')
  115. order = request.args.get('order', 'asc')
  116. keyword = request.args.get('keyword', '')
  117. args_rules = [
  118. Rules.OFFSET.value,
  119. Rules.LIMIT.value,
  120. Rules.ORDER_BY.value,
  121. Rules.ORDER.value,
  122. Rules.KEYWORD.value
  123. ]
  124. try:
  125. ji.Check.previewing(args_rules, {'offset': offset, 'limit': limit, 'order_by': order_by, 'order': order,
  126. 'keyword': keyword})
  127. offset = int(offset)
  128. limit = int(limit)
  129. ret = dict()
  130. ret['state'] = ji.Common.exchange_state(20000)
  131. ret['data'] = list()
  132. ret['paging'] = {'total': 0, 'offset': offset, 'limit': limit, 'page': page, 'page_size': page_size}
  133. ret['data'], ret['paging']['total'] = self.the_class.content_search(
  134. offset=offset, limit=limit, order_by=order_by, order=order, keyword=keyword)
  135. host_url = request.host_url.rstrip('/')
  136. other_str = '&keyword=' + keyword + '&order=' + order + '&order_by=' + order_by
  137. last_pagination = (ret['paging']['total'] + page_size - 1) / page_size
  138. if page <= 1:
  139. ret['paging']['prev'] = host_url + self.the_blueprints.url_prefix + '/_search?page=1&page_size=' + \
  140. page_size.__str__() + other_str
  141. else:
  142. ret['paging']['prev'] = host_url + self.the_blueprints.url_prefix + '/_search?page=' + str(page - 1) + \
  143. '&page_size=' + page_size.__str__() + other_str
  144. if page >= last_pagination:
  145. ret['paging'][
  146. 'next'] = host_url + self.the_blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + \
  147. '&page_size=' + page_size.__str__() + other_str
  148. else:
  149. ret['paging']['next'] = host_url + self.the_blueprints.url_prefix + '/_search?page=' + str(page + 1) + \
  150. '&page_size=' + page_size.__str__() + other_str
  151. ret['paging']['first'] = host_url + self.the_blueprints.url_prefix + '/_search?page=1&page_size=' + \
  152. page_size.__str__() + other_str
  153. ret['paging']['last'] = \
  154. host_url + self.the_blueprints.url_prefix + '/_search?page=' + last_pagination.__str__() + \
  155. '&page_size=' + page_size.__str__() + other_str
  156. return ret
  157. except ji.PreviewingError, e:
  158. return json.loads(e.message)
  159. def delete(self, ids=None, ids_rule=None, by_field=None):
  160. the_instance = self.the_class()
  161. args_rules = [
  162. ids_rule
  163. ]
  164. try:
  165. ji.Check.previewing(args_rules, {ids_rule[1]: ids})
  166. ret = dict()
  167. ret['state'] = ji.Common.exchange_state(20000)
  168. the_instance.delete_by_filter(filter_str=':'.join([by_field, 'in', ids]))
  169. return ret
  170. except ji.PreviewingError, e:
  171. return json.loads(e.message)