jsonAndRequest.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. import json
  2. import requests
  3. import config
  4. import ast
  5. import logging
  6. import loggingConfig
  7. import pprint # Форматирование текста в human readable формате
  8. import sys
  9. #Тестовый класс User и Address (ВАЖНО!!!) поля классов должны называться также как и поля json объекта
  10. '''
  11. #Full json order example
  12. https://wiki.sharix-app.org/doku.php/open/tech/dev/sharix_open_-_primery_json
  13. {
  14. "ticket": 123,
  15. "status": 111,
  16. "priority": 1, (фишка для сортировки)
  17. "title": "123",
  18. "note": "123", (чтото похожее на json для техподдержки)
  19. "due_date": 2023-05-15T17:16:22.955601Z, (для очистка старых заявок, чтобы система не переполнялась)
  20. "id_metaservice": 1,
  21. "is_global": false,
  22. "is_visible": false,
  23. "service": 1,
  24. "service_type": 1,
  25. "status_changed_date": "2023-05-15T17:16:22.955601Z", (для техподдержки когда было изменено)
  26. "time_placed": "2023-05-15T16:40:32.179777Z",
  27. "time_start": "2023-05-15T16:40:32.179777Z", (когда долже наначаться по заявке)
  28. "time_start_predicted": "2023-05-15T16:40:32.179777Z",
  29. "time_finish_predicted": "2023-05-15T16:40:32.179777Z",
  30. "time_start_real": "2023-05-15T16:40:32.179777Z", ()
  31. "time_finish_real": "2023-05-15T16:40:32.179777Z",
  32. "order_place_type": "address",
  33. "order_place_start": "р-н Беговой",
  34. "order_place_start_gps": "55.751941, 37.607513",
  35. "order_place_start_sector": 4,
  36. "order_place_start_real": "р-н Беговой",
  37. "order_place_start_real_gps": "55.751941, 37.607513",
  38. "order_place_finish_predicted": "р-н Мещанский",
  39. "order_place_finish_predicted_gps": "55.751941, 37.607513",
  40. "order_place_finish_sector": 4,
  41. "order_place_finish_real": "р-н Мещанский",
  42. "order_place_finish_real_gps": "55.751941, 37.607513",
  43. "predicted_price": 1000,
  44. "real_price": 1001,
  45. "payment_transaction_id": 1, (локальное, для оплаты)
  46. "rating_id": 1,
  47. "provider": 1, (приёмник, тот, кто приезжает)
  48. "provider_screen_name": "Vasya Ispolnitelev",
  49. "receiver": 1,
  50. "receiver_screen_name": "Marfa Clientovna",
  51. "client_id": 1, (инициатор - клиент - источник)
  52. "client_screen_name": "Fedor Client",
  53. "resource_id": 1, (машина привязанная к заказу, в друге - помещение (то, что предоставляют компании партнёры))
  54. "attempts": null (клиенту не хочется бесконечно ждать. Кол-во попыток для какойто операции)
  55. }
  56. '''
  57. #надо адаптировать класс к новому формату JSON
  58. class Order(object):
  59. def __init__(self, ticket, state, id_metaservice, is_global, is_visible, service, service_type, time_placed, time_start=None, time_start_predicted=None, time_finish_predicted=None, time_start_real=None, time_finish_real=None, order_place_start=None, order_place_start_gps=None, order_place_start_real=None, order_place_start_real_gps=None, order_place_finish_predicted=None, order_place_finish_predicted_gps=None, order_place_finish_real=None, order_place_finish_real_gps=None, predicted_price=None, real_price=None, payment_transaction_id=None, rating_id=None, provider=None, provider_screen_name=None, receiver=None, receiver_screen_name=None, client_id=None, resource_id=None):
  60. self.ticket = ticket
  61. self.state = state
  62. self.id_metaservice = id_metaservice
  63. self.is_global = is_global
  64. self.is_visible = is_visible
  65. self.service = service
  66. self.service_type = service_type
  67. self.time_placed = time_placed
  68. self.time_start = time_start
  69. self.time_start_predicted = time_start_predicted
  70. self.time_finish_predicted = time_finish_predicted
  71. self.time_start_real = time_start_real
  72. self.time_finish_real = time_finish_real
  73. self.order_place_start = order_place_start
  74. self.order_place_start_gps = order_place_start_gps
  75. self.order_place_start_real = order_place_start_real
  76. self.order_place_start_real_gps = order_place_start_real_gps
  77. self.order_place_finish_predicted = order_place_finish_predicted
  78. self.order_place_finish_predicted_gps = order_place_finish_predicted_gps
  79. self.order_place_finish_real = order_place_finish_real
  80. self.order_place_finish_real_gps = order_place_finish_real_gps
  81. self.predicted_price = predicted_price
  82. self.real_price = real_price
  83. self.payment_transaction_id = payment_transaction_id
  84. self.rating_id = rating_id
  85. self.provider = provider
  86. self.provider_screen_name = provider_screen_name
  87. self.receiver = receiver
  88. self.receiver_screen_name = receiver_screen_name
  89. self.client_id = client_id
  90. self.resource_id = resource_id
  91. #доделать до конца по аналогии с закоммиченным json
  92. def __str__(self):
  93. return "{0}, {1}, {2}, {3}, {4}, {5}, {6},\n{7}, {8}, {9}, {10}, {11}, {12},\n{13}, {14}, {15}, {16}, {17}, {18}, {19}, {20},\n{21}, {22}, {23}, {24},\n{25}, {26}, {27}, {28}, {29}, {30}".format(self.ticket, self.state, self.id_metaservice, self.is_global, self.is_visible, self.service, self.service_type, self.time_placed, self.time_start, self.time_start_predicted, self.time_finish_predicted, self.time_start_real, self.time_finish_real, self.order_place_start, self.order_place_start_gps, self.order_place_start_real, self.order_place_start_real_gps, self.order_place_finish_predicted, self.order_place_finish_predicted_gps, self.order_place_finish_real, self.order_place_finish_real_gps, self.predicted_price, self.real_price, self.payment_transaction_id, self.rating_id, self.provider, self.provider_screen_name, self.receiver, self.receiver_screen_name, self.client_id, self.resource_id)
  94. #\n добавляете в местах с пустой строкой в шаблоне
  95. #ticket json example
  96. '''
  97. {
  98. "id": 2,
  99. "status": 111,
  100. "created_date": "2023-05-15",
  101. "status_changed_date": "2023-05-15T17:16:22.955601Z",
  102. "priority": 0,
  103. "title": "Test",
  104. "note": "{\n \n \"ticket\": 1,\n \"state\": 1,\n \"id_metaservice\": 1,\n \"is_global\": false,\n \"is_visible\": false,\n \"service\": 1,\n \"service_type\": 1,\n\n \"time_placed\": 1}"
  105. "due_date": "2023-05-15",
  106. "task_list": 10,
  107. "created_by": 1,
  108. "type": 1,
  109. "assigned_to": 1
  110. }
  111. '''
  112. #ticket minimal example
  113. '''
  114. {
  115. "id": 2,
  116. "status": 111,
  117. "created_date": "2023-05-15",
  118. "status_changed_date": "2023-05-15T17:16:22.955601Z",
  119. "priority": 0,
  120. "title": null,
  121. "note": null,
  122. "due_date": null,
  123. "task_list": 10,
  124. "created_by": 1,
  125. "type": 1,
  126. "assigned_to": null
  127. }
  128. '''
  129. orderJson = {
  130. "ticket": 123,
  131. "status": 111,
  132. "priority": 1,
  133. "title": "123",
  134. "note": "123",
  135. "due_date": "2000-01-01",
  136. "id_metaservice": 1,
  137. "is_global": False,
  138. "is_visible": False,
  139. "service": 1,
  140. "service_type": 1,
  141. "status_changed_date": "2023-05-15T17:16:22.955601Z",
  142. "time_placed": "2023-05-15T16:40:32.179777Z",
  143. "time_start": "2023-05-15T16:40:32.179777Z",
  144. "time_start_predicted": "2023-05-15T16:40:32.179777Z",
  145. "time_finish_predicted": "2023-05-15T16:40:32.179777Z",
  146. "time_start_real": "2023-05-15T16:40:32.179777Z",
  147. "time_finish_real": "2023-05-15T16:40:32.179777Z",
  148. "order_place_type": "address",
  149. "order_place_start": "р-н Беговой",
  150. "order_place_start_gps": "55.751941, 37.607513",
  151. "order_place_start_sector": 4,
  152. "order_place_start_real": "р-н Беговой",
  153. "order_place_start_real_gps": "55.751941, 37.607513",
  154. "order_place_finish_predicted": "р-н Мещанский",
  155. "order_place_finish_predicted_gps": "55.751941, 37.607513",
  156. "order_place_finish_sector": 4,
  157. "order_place_finish_real": "р-н Мещанский",
  158. "order_place_finish_real_gps": "55.751941, 37.607513",
  159. "predicted_price": 1000,
  160. "real_price": 1001,
  161. "payment_transaction_id": 1,
  162. "rating_id": 1,
  163. "provider": 1,
  164. "provider_screen_name": "Vasya Ispolnitelev",
  165. "receiver": 1,
  166. "receiver_screen_name": "Marfa Clientovna",
  167. "client_id": 1,
  168. "client_screen_name": "Fedor Client",
  169. "resource_id": None,
  170. "attempts": None,
  171. "state": "ok"
  172. }
  173. class OrderTicket(object):
  174. def __init__(self, id, status, created_date, status_changed_date, priority, title=None, note=None, due_date=None, task_list=None, created_by=None, type=None, assigned_to=None):
  175. self.id = id
  176. self.status = status
  177. self.created_date = created_date
  178. self.status_changed_date = status_changed_date
  179. self.priority = priority
  180. self.title = title
  181. self.note = note
  182. self.due_date = due_date
  183. self.task_list = task_list
  184. self.created_by = created_by
  185. self.type = type
  186. self.assigned_to = assigned_to
  187. def __str__(self):
  188. return "{0}, {1}, {2}, {3}, {4}, {5}, {6},\n{7}, {8}, {9}, {10}, {11}\n".format(self.id, self.status, self.created_date, self.status_changed_date, self.priority, self.title, self.note, self.due_date, self.task_list, self.created_by, self.type, self.assigned_to)
  189. #Функция преобразования json в объект класса Order
  190. def jsonToOrder(jsonstring) -> Order:
  191. jsonObj = json.loads(jsonstring)
  192. # print(jsonObj)
  193. logging.debug(jsonObj)
  194. u = Order(**jsonObj)
  195. return u
  196. #Функция преобразования json в объект класса OrderTicket
  197. def jsonToOrderTicket(jsonstring) -> OrderTicket:
  198. # print (jsonstring)
  199. logging.debug(jsonstring)
  200. jsonObj = json.loads(jsonstring)
  201. # print(jsonObj)
  202. logging.debug(jsonObj)
  203. u = OrderTicket(**jsonObj)
  204. return u
  205. #Функция обращения к апи и получение токена
  206. def requestGetToken(login, password, url) -> str:
  207. #login = "79876543210"
  208. #password = "admin12345@"
  209. #url = "https://user.sharix-app.org/auth/token/login/"
  210. data = {
  211. "password": password,
  212. "phone_number": login
  213. }
  214. response = requests.post(url, json=data)
  215. result = response.json()
  216. return result['auth_token']
  217. #Функция обращения к апи и получение токена
  218. def createUser(username, phone, password, url) -> str:
  219. data = {
  220. "username": username,
  221. "phone_number": phone,
  222. "password": password
  223. }
  224. response = requests.post(url, json=data)
  225. result = response.json()
  226. return result
  227. #Функция обращения к апи и получение списка пользователей
  228. def requestGetListUser():
  229. auth_token=requestGetToken()
  230. # print(auth_token)
  231. logging.debug(f"Auth token: {auth_token}")
  232. headers = {'Authorization': f'Token {auth_token}'}
  233. url = 'https://user.sharix-app.org/platform/api/sharix-users/'
  234. response = requests.get(url, headers=headers)
  235. # print(response)
  236. logging.debug(response)
  237. # print(response.json())
  238. logging.debug(f"Auth token: {response.json()}")
  239. def requestGetList(auth_token, url):
  240. #auth_token=requestGetToken(login, password, url)
  241. #print(auth_token)
  242. headers = {'Authorization': f'Token {auth_token}'}
  243. #url = 'https://user.sharix-app.org/platform/api/sharix-users/'
  244. response = requests.get(config.API_URL+"/tickets/api/tickets/?list_id=10", headers=headers)
  245. #response = requests.get(config.API_URL+"/metaservicesynced/api/orders/", headers=headers)
  246. #print(response)
  247. #return response.json()
  248. #print(response.json())
  249. logging.debug(pprint.pformat(response.json()))
  250. ordertext=response.json()
  251. startlist = []
  252. if not ordertext:
  253. # print("Empty array")
  254. logging.info("Empty array")
  255. else:
  256. for i in ordertext:
  257. # print (i, "PROCESSING")
  258. logging.debug(f"\"PROCESSING\"\n{pprint.pformat(i)}")
  259. try:
  260. orderticket = OrderTicket(**i)
  261. # print(i, "ORDER ", orderticket)
  262. # logging.debug(f"{pprint.pformat(i)}, \"ORDER\" {orderticket}")
  263. startlist.append(orderticket)
  264. logging.debug(f"\"ORDER\"\n{orderticket}")
  265. except Exception as ex:
  266. # print(ex)
  267. logging.error("Exception occurred", exc_info=True)
  268. # print (startlist)
  269. logging.debug("Startlist: " + pprint.pformat(startlist))
  270. #if ordertext is not None:
  271. # for order in ordertext:
  272. # print (order)
  273. # strorder = str(order).replace("'", '"')
  274. # strorder = strorder.replace("None", 'null')
  275. # #parsed_json = ast.literal_eval(order)
  276. # #print (parsed_json)
  277. # orderObj = jsonToOrderTicket(strorder)
  278. # print (orderObj)
  279. # startlist.append(orderObj)
  280. # #bot.bot_log(str(datetime.now())+"Заказ успешно добавлен в очередь обработки\n")
  281. #print (orderticket)
  282. return startlist
  283. def update_partially(url, field, value, headers):
  284. """
  285. Изменить конкретное поле
  286. """
  287. return
  288. def create(url, json, headers) -> str:
  289. """
  290. Создать элемент с помощью POST
  291. Возвращает: json строку с данными созданного элемента или ошибки
  292. Статус выполнения: проверена работа на локальном сервере
  293. """
  294. response = requests.post(url, json=json, headers=headers)
  295. if response.status_code != 201:
  296. logging.error(response.json())
  297. return
  298. return response.json()
  299. def createOrder(url, order, headers):
  300. """
  301. Создать заказ
  302. Возвращает: json строку с данными созданного заказа или ошибки
  303. Статус выполнения: проверена работа на локальном сервере
  304. """
  305. # Конвертировать объект в json
  306. try:
  307. json = vars(order)
  308. except Exception as e:
  309. logging.error("Ошибка конвертации в json", exc_info=True)
  310. return
  311. logging.info("Успешная конвертация в json")
  312. logging.debug(pprint.pformat(json))
  313. # Создать заказ
  314. # none - ошибка создания, json строка - успешное создание
  315. created_json = create(url, json, headers)
  316. # Проверить успешность создания
  317. if created_json:
  318. logging.info("Заказ успешно создан.")
  319. return created_json
  320. logging.info("Ошибка создания заказа.")
  321. return
  322. def testCreateOrder():
  323. """
  324. Код для тестирования создания заказа
  325. """
  326. test_token = "4a9333794bb8296083aaa898954affe6a74e6a20"
  327. test_headers = {'Authorization': f'Token {test_token}'}
  328. try:
  329. order1 = Order(
  330. ticket=1,
  331. state=1,
  332. id_metaservice=1,
  333. is_global=1,
  334. is_visible=1,
  335. service=1,
  336. service_type=1,
  337. time_placed="2000-01-01",
  338. order_place_finish_predicted_gps="55.751941, 37.607513"
  339. )
  340. except Exception as e:
  341. logging.error("order wasn't created", exc_info=True)
  342. sys.exit()
  343. else:
  344. logging.info("order created successfully")
  345. createOrder("http://127.0.0.1:8000/openlocal/api/orderslocal/", order1, test_headers)
  346. '''
  347. https://testbase.sharix-app.org/openlocal/api/orderslocal/
  348. уже есть:
  349. чтение
  350. создать заказ
  351. редактировать заказ целиком
  352. редактировать отдельное поле
  353. под каждую операцию отдельный запрос (универсальная ф-ция: передаётся название поля и значение)
  354. функционал: подобрать,
  355. отправлять vs создать
  356. вложенные json убрать (сделать одноуровневым)
  357. вернуть attempts в json
  358. xmpppy как отправлять сообшение в группу?
  359. '''