project.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import jimit as ji
  4. import json
  5. from flask import Blueprint
  6. from flask import request
  7. from jimvc.api.base import Base
  8. from jimvc.models import Utils
  9. from jimvc.models import Guest
  10. from jimvc.models import Rules
  11. from jimvc.models import Project
  12. from jimvc.models import Service
  13. __author__ = 'James Iter'
  14. __date__ = '2018/10/7'
  15. __contact__ = 'james.iter.cn@gmail.com'
  16. __copyright__ = '(c) 2018 by James Iter.'
  17. blueprint = Blueprint(
  18. 'api_project',
  19. __name__,
  20. url_prefix='/api/project'
  21. )
  22. blueprints = Blueprint(
  23. 'api_projects',
  24. __name__,
  25. url_prefix='/api/projects'
  26. )
  27. project_base = Base(the_class=Project, the_blueprint=blueprint, the_blueprints=blueprints)
  28. @Utils.dumps2response
  29. def r_create():
  30. args_rules = [
  31. Rules.NAME.value
  32. ]
  33. if 'description' in request.json:
  34. args_rules.append(
  35. Rules.DESCRIPTION.value,
  36. )
  37. try:
  38. ret = dict()
  39. ret['state'] = ji.Common.exchange_state(20000)
  40. ji.Check.previewing(args_rules, request.json)
  41. project = Project()
  42. project.name = request.json.get('name', None)
  43. project.description = request.json.get('description', '')
  44. project.create()
  45. project.get_by('create_time')
  46. ret['data'] = project.__dict__
  47. return ret
  48. except ji.PreviewingError, e:
  49. return json.loads(e.message)
  50. @Utils.dumps2response
  51. def r_update(_id):
  52. project = Project()
  53. args_rules = [
  54. Rules.ID.value
  55. ]
  56. if 'name' in request.json:
  57. args_rules.append(
  58. Rules.NAME.value,
  59. )
  60. if 'description' in request.json:
  61. args_rules.append(
  62. Rules.DESCRIPTION.value,
  63. )
  64. if args_rules.__len__() < 2:
  65. ret = dict()
  66. ret['state'] = ji.Common.exchange_state(20000)
  67. return ret
  68. request.json['id'] = _id
  69. try:
  70. ji.Check.previewing(args_rules, request.json)
  71. project.id = int(request.json.get('id'))
  72. project.get()
  73. project.name = request.json.get('name', project.name)
  74. project.description = request.json.get('description', project.description)
  75. project.update()
  76. project.get()
  77. ret = dict()
  78. ret['state'] = ji.Common.exchange_state(20000)
  79. ret['data'] = project.__dict__
  80. return ret
  81. except ji.PreviewingError, e:
  82. return json.loads(e.message)
  83. @Utils.dumps2response
  84. def r_get(ids):
  85. ret = project_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
  86. project_ids = list()
  87. if -1 == ids.find(','):
  88. project_ids.append(ret['data']['id'])
  89. else:
  90. for project in ret['data']:
  91. project_ids.append(project['id'])
  92. rows, _ = Service.get_by_filter(filter_str=':'.join([
  93. 'project_id', 'in', ','.join(project_id.__str__() for project_id in project_ids)]))
  94. services_mapping_by_project_id = dict()
  95. for row in rows:
  96. if row['project_id'] not in services_mapping_by_project_id:
  97. services_mapping_by_project_id[row['project_id']] = list()
  98. services_mapping_by_project_id[row['project_id']].append(row)
  99. if -1 == ids.find(','):
  100. ret['data']['services'] = list()
  101. if ret['data']['id'] in services_mapping_by_project_id:
  102. ret['data']['services'] = services_mapping_by_project_id[ret['data']['id']]
  103. else:
  104. for i, project in enumerate(ret['data']):
  105. ret['data'][i]['services'] = list()
  106. if project['id'] in services_mapping_by_project_id:
  107. ret['data'][i]['services'] = services_mapping_by_project_id[project['id']]
  108. return ret
  109. @Utils.dumps2response
  110. def r_get_by_filter():
  111. ret = project_base.get_by_filter()
  112. project_ids = list()
  113. for project in ret['data']:
  114. project_ids.append(project['id'])
  115. rows, _ = Service.get_by_filter(filter_str=':'.join([
  116. 'project_id', 'in', ','.join(project_id.__str__() for project_id in project_ids)]))
  117. services_mapping_by_project_id = dict()
  118. for row in rows:
  119. if row['project_id'] not in services_mapping_by_project_id:
  120. services_mapping_by_project_id[row['project_id']] = list()
  121. services_mapping_by_project_id[row['project_id']].append(row)
  122. for i, project in enumerate(ret['data']):
  123. ret['data'][i]['services'] = list()
  124. if project['id'] in services_mapping_by_project_id:
  125. ret['data'][i]['services'] = services_mapping_by_project_id[project['id']]
  126. return ret
  127. @Utils.dumps2response
  128. def r_content_search():
  129. ret = project_base.content_search()
  130. project_ids = list()
  131. for project in ret['data']:
  132. project_ids.append(project['id'])
  133. rows, _ = Service.get_by_filter(filter_str=':'.join([
  134. 'project_id', 'in', ','.join(project_id.__str__() for project_id in project_ids)]))
  135. services_mapping_by_project_id = dict()
  136. for row in rows:
  137. if row['project_id'] not in services_mapping_by_project_id:
  138. services_mapping_by_project_id[row['project_id']] = list()
  139. services_mapping_by_project_id[row['project_id']].append(row)
  140. for i, project in enumerate(ret['data']):
  141. ret['data'][i]['services'] = list()
  142. if project['id'] in services_mapping_by_project_id:
  143. ret['data'][i]['services'] = services_mapping_by_project_id[project['id']]
  144. return ret
  145. @Utils.dumps2response
  146. def r_delete(ids):
  147. args_rules = [
  148. Rules.IDS.value
  149. ]
  150. try:
  151. ji.Check.previewing(args_rules, {'ids': ids})
  152. project = Project()
  153. service = Service()
  154. # 检测所指定的 项目 都存在
  155. for _id in ids.split(','):
  156. project.id = int(_id)
  157. project.get()
  158. # 执行删除操作
  159. for _id in ids.split(','):
  160. if int(_id) == 1:
  161. # 默认项目不允许被删除
  162. continue
  163. services_id = list()
  164. rows, _ = Service.get_by_filter(filter_str=':'.join(['project_id', 'eq', _id]))
  165. for row in rows:
  166. services_id.append(row['id'])
  167. if services_id.__len__() > 0:
  168. Guest.update_by_filter(
  169. {'service_id': 1},
  170. filter_str=':'.join(['service_id', 'in',
  171. ','.join(service_id.__str__() for service_id in services_id)]))
  172. for service_id in services_id:
  173. service.id = service_id
  174. service.get()
  175. service.delete()
  176. project.id = int(_id)
  177. project.get()
  178. project.delete()
  179. ret = dict()
  180. ret['state'] = ji.Common.exchange_state(20000)
  181. return ret
  182. except ji.PreviewingError, e:
  183. return json.loads(e.message)