Advertisement
Guest User

Untitled

a guest
May 25th, 2018
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.89 KB | None | 0 0
  1. from simplejson import dumps, loads, load
  2. from requests import get, put
  3. from bs4 import BeautifulSoup
  4. from html_table_parser import parser_functions as p
  5. from jinja2 import Template
  6. from base64 import b64decode
  7.  
  8. class Dich:
  9.  
  10.  
  11. global template_body = {
  12. "id":"{}".format(str(page_id)), "type":"page",
  13. "title":"{}".format(title),
  14. "space":{"key":"{}".format(space)},
  15. "body":
  16. {"storage":
  17. {"value":"<table class=\"wrapped\"><colgroup><col /></colgroup><colgroup><col /></colgroup><colgroup><col /></colgroup><colgroup><col /></colgroup><colgroup><col /></colgroup><colgroup><col /></colgroup><tbody><tr><th>123</th><th>323</th><th>Severity</th><th>Credibility</th><th>Relevance</th><th>444</th></tr><tr><td>KillChain</td><td>DIB - 2-level chain</td><td>8</td><td>8</td><td>10</td><td>11</td></tr><tr><td>KillChain</td><td>DIB - 3-level chain</td><td>9</td><td>9</td><td>10</td><td>4</td></tr><tr><td>KillChain</td><td>DIB - 4-level chain</td><td>10</td><td>10</td><td>10</td><td>4</td></tr><tr><td>KillChain</td><td>DIB - 5-level chain</td><td>10</td><td>10</td><td>10</td><td>5</td></tr><tr><td>KillChain</td><td>DIB - 6-level chain</td><td>10</td><td>10</td><td>10</td><td>5</td></tr><tr><td>KillChain</td><td>DIB - 2-level chain by User</td><td>8</td><td>8</td><td>10</td><td>2</td></tr><tr><td>KillChain</td><td>DIB - 3-level chain by User</td><td>9</td><td>9</td><td>10</td><td>3</td></tr><tr><td>KillChain</td><td>DIB - 4-level chain by User</td><td>10</td><td>10</td><td>10</td><td>3</td></tr><tr><td>KillChain</td><td>DIB - 5-level chain by User</td><td>10</td><td>10</td><td>10</td><td>3</td></tr></tbody></table>",
  18. "representation":"storage"
  19. }
  20. },
  21. "version":{"number":""}}
  22.  
  23. def read_config(config):
  24. with open(config) as params:
  25. data = load(params)
  26. page_id = data["page"]["page_id"]
  27. space = data["page"]["space"]
  28. title = data["page"]["title"]
  29. user = data["auth"]["username"]
  30. password = (b64decode(data["auth"]["password"])).decode("utf-8")
  31. return(page_id,space,title,user,password)
  32.  
  33.  
  34. def get_body(page_id=page_id, user=user, password=password):
  35. body = get('https://virgo.ftc.ru/rest/api/content/{}?expand=body.storage'.format(page_id),\
  36. auth=(user, password))
  37. json_body = loads(body.content)
  38. template = json_body['body']['storage']['value']
  39. soup = BeautifulSoup(template, "lxml")
  40. table_raw = soup.find('table')
  41. table_2d = p.make2d(table_raw)
  42. headers = table_2d[0]
  43. del table_2d[0]
  44. collumns = table_2d
  45. return(headers, collumns)
  46.  
  47. #получение версии модификации
  48. def get_version(page_id=page_id, user=user, password=password):
  49. version = get('https://virgo.ftc.ru/rest/api/content/{}/history'.format(page_id),\
  50. auth=(user, password))
  51. json_version = loads(version.content)
  52. current_version = json_version["lastUpdated"]["number"]
  53. return(current_version)
  54.  
  55. #отправка данных
  56. def put_data(data, page_id=page_id, user=user, password=password):
  57. send = put('https://virgo.ftc.ru/rest/api/content/{}/'.format(page_id),\
  58. headers=({'Content-Type':'application/json'}),\
  59. data=dumps(data), auth=(user, password))
  60. print('answer from server: ' + str(send))
  61.  
  62. #обновление шаблона
  63. def update_html_template(headers, collumns):
  64. html = open('app/template.html').read()
  65. template = Template(html)
  66.  
  67. count_headers = len(headers)
  68. data = { 'colgroup': count_headers, 'results': headers, 'collumns':collumns}
  69.  
  70. new_html = template.render(data)
  71. new_html = new_html.replace('\n\n', '').replace('\n', '')
  72. return(new_html)
  73.  
  74. def get_contest():
  75. headers = get_body()[0]
  76. collumns = get_body()[1]
  77. result = []
  78. for i in collumns:
  79. tmp = dict(zip(headers, i))
  80. result.append(tmp)
  81. print(result)
  82.  
  83. def new_header(new):
  84. headers = get_body()[0]
  85. collumns = get_body()[1]
  86. version = int(get_version()) + 1
  87.  
  88. headers.append(new)
  89.  
  90. new_html = update_html_template(headers, collumns)
  91. new_data = template_body
  92. new_data["body"]["storage"]["value"] = new_html
  93. new_data["version"]["number"] = version
  94.  
  95. put_data(new_data)
  96.  
  97. def rm_header(old):
  98.  
  99. headers = get_body()[0]
  100. collumns = get_body()[1]
  101. version = get_version()) + 1
  102.  
  103. headers.remove(old)
  104.  
  105. new_html = update_html_template(headers, collumns)
  106. new_data = template_body
  107. new_data["body"]["storage"]["value"] = new_html
  108. new_data["version"]["number"] = version
  109.  
  110. put_data(new_data)
  111.  
  112. def update_header(old, new):
  113. headers = get_body()[0]
  114. collumns =g et_body()[1]
  115. version = int(get_version()) + 1
  116.  
  117. index = headers.index(old)
  118. headers[index] = new
  119.  
  120. new_html = update_html_template(headers, collumns)
  121. new_data = template_body
  122. new_data["body"]["storage"]["value"] = new_html
  123. new_data["version"]["number"] = version
  124.  
  125. put_data(new_data)
  126.  
  127. def update_rule(old, new):
  128. headers = get_body()[0]
  129. collumns = get_body()[1]
  130. version = int(get_version()) + 1
  131. for collumn in collumns:
  132. if old in collumn:
  133. index = collumn.index(old)
  134. collumn[index] = new
  135. new_html = update_html_template(headers, collumns)
  136. new_data = template_body
  137. new_data["body"]["storage"]["value"] = new_html
  138. new_data["version"]["number"] = version
  139. put_data(new_data)
  140.  
  141. def update_collumn(rule, header, new):
  142. headers = get_body()[0]
  143. collumns = get_body()[1]
  144. version = int(get_version()) + 1
  145. count = 0
  146. for i in headers:
  147. if header != i:
  148. count += 1
  149. else:
  150. break
  151. for collumn in collumns:
  152. if rule in collumn:
  153. collumn[count] = new
  154.  
  155. new_html = update_html_template(headers, collumns)
  156. new_data = template_body
  157. new_data["body"]["storage"]["value"] = new_html
  158. new_data["version"]["number"] = version
  159.  
  160. put_data(new_data)
  161.  
  162. def find(filters):
  163. headers = get_body()[0]
  164. collumns = get_body()[1]
  165. version = int(get_version()) + 1
  166. result = []
  167. for i in collumns:
  168. sl = dict(zip(headers, i))
  169. tmp = dict(filters.items() & sl.items())
  170. if tmp.keys() == filters.keys():
  171. result.append(i)
  172. print(result)
  173.  
  174.  
  175. def set_function(tmp):
  176. key = tmp[0]
  177. position = tmp[1]
  178.  
  179. if key == 'update':
  180. if position == 'header':
  181. update_header(tmp[3], tmp[2])
  182. elif position == 'rule':
  183. update_rule(tmp[3], tmp[2])
  184. elif position == 'collumn':
  185. update_collumn(tmp[5], tmp[4], tmp[2])
  186.  
  187. if key == 'rm':
  188. if position == 'header':
  189. rm_header(tmp[3])
  190.  
  191. if key == 'new':
  192. if position == 'header':
  193. new_header(tmp[2])
  194.  
  195. if key == 'find':
  196. find(tmp[6])
  197.  
  198. if key == 'get_all':
  199. get_contest()
  200.  
  201. def return_param(data):
  202. key = data["key"] #0
  203. position = data.get("params").get("position") #1
  204. new = data.get("params").get("new") #2
  205. old = data.get("params").get("old") #3
  206. header = data.get("params").get("header") #4
  207. rule = data.get("params").get("rule") #5
  208. filter = data.get("params").get("filter") #6
  209. tmp = [key, position, new, old, header, rule, filter]
  210. set_function(tmp)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement