2 次代码提交 a7df4f8489 ... b08f8347dd

作者 SHA1 备注 提交日期
  Dev Server b08f8347dd JSON template updated 1 年之前
  Dev Server ce0dc7ca41 proceeding improved for less code before call 1 年之前
共有 3 个文件被更改,包括 30 次插入83 次删除
  1. 8 15
      BotClass.py
  2. 18 46
      jsonAndRequest.py
  3. 4 22
      open_template_bot.py

+ 8 - 15
BotClass.py

@@ -1,6 +1,7 @@
 import sys, xmpp
 from xmpp import cli
 from datetime import datetime
+import json
 
 import jsonAndRequest as jsreq
 
@@ -10,14 +11,12 @@ class JabberBot:
         self.jidd = jid
         jid = xmpp.JID(jid)
         self.user, self.server, self.password, self.port = jid.getNode(), jid.getDomain(), password, port
-        #self.user, self.server, self.password = jid.getNode(), jid.getDomain(), password
         self.connect()
         self.auth()
 
     #Метод проверки подключения к серверу xmpp
     def connect(self): 
         self.conn = xmpp.Client(self.server, self.port,debug = [])
-        #self.conn = xmpp.Client(self.server,debug = [])
         conn_result = self.conn.connect()
         if not conn_result:
             print("Can't connect to server!\n")
@@ -40,29 +39,23 @@ class JabberBot:
         except KeyboardInterrupt: return 0
         return 1
 
-    def fake_api_call(self, message):        
-        #HTTP запрос
-        #jsreq.requestGetListUser()
-        #cli.send_message(self.user, self.password, "test@ej.sharix-app.org", message)
-        print('fake_api_call: ', message)
-
     def bot_log(self, message):
         #надо строчку лога сделать более информативной
         logfile = open(datetime.now().strftime('%Y-%m-%d') + "-" + self.user + ".log", "a")
         logfile.write(message)
         logfile.close()
         print (message)
-        #cli.send_message(self.user, self.password, "test@ej.sharix-app.org", message)
+
+    def send_notification(self, recipient, message):
+        self.conn.send(xmpp.Message(recipient, message))
+        self.bot_log("Message sent successfully"+" "+recipient+" "+message)
 
     # recipient - это конкретный jid следующего обработчика заявки, ticket - json с заявкой.
     def proceed_status(self, recipient, ticket):
         #тут могут быть различные проверки дополнительные, а так вообще эта функция нужна для передачи заявки на обработку следующему
-        #TODO - почему-то тут валится, пока заменено на затычку
-        #cli.send_message(self.user, self.password, recipient, ticket)
-        #jsonTicket = json.dumps(ticket.__dict__)
-        self.conn.send(xmpp.Message(recipient, ticket))
-        self.bot_log("Message sent successfully"+" "+recipient+" "+ticket)
-        #print ("Message sent successfully", recipient, ticket)
+        jsonTicket = json.dumps(ticket.__dict__)
+        self.conn.send(xmpp.Message(recipient, jsonTicket))
+        self.bot_log("Message sent successfully"+" "+recipient+" "+jsonTicket)
 
     #сюда можно как параметры передавать переменную для значения Process в вызываемой функции, а также передавать информацию о том, какой из обработчиков ввызывать в бесконечном цикле
     def start(self, handler, *args):

+ 18 - 46
jsonAndRequest.py

@@ -4,19 +4,27 @@ import config
 import ast
 
 #Тестовый класс User и Address (ВАЖНО!!!) поля классов должны называться также как и поля json объекта
-
-#Full json order example
 '''
+#Full json order example
+https://wiki.sharix-app.org/doku.php/open/tech/dev/sharix_open_-_primery_json
+
 {
 
 "ticket": 123,
-"state": 111,
+"status": 111,
+
+"priority": 1, 
+"title": "123",
+"note": "123",
+"due_date": 2023-05-15T17:16:22.955601Z,
+
 "id_metaservice": 1,
 "is_global": false,
 "is_visible": false,
 "service": 1,
 "service_type": 1,
 
+"status_changed_date": "2023-05-15T17:16:22.955601Z",
 "time_placed": "2023-05-15T16:40:32.179777Z",
 "time_start": "2023-05-15T16:40:32.179777Z",
 "time_start_predicted": "2023-05-15T16:40:32.179777Z",
@@ -24,12 +32,15 @@ import ast
 "time_start_real": "2023-05-15T16:40:32.179777Z",
 "time_finish_real": "2023-05-15T16:40:32.179777Z",
 
+"order_place_type": "address",
 "order_place_start": "р-н Беговой",
 "order_place_start_gps": "55.751941, 37.607513",
+"order_place_start_sector": 4,
 "order_place_start_real": "р-н Беговой",
 "order_place_start_real_gps": "55.751941, 37.607513",
 "order_place_finish_predicted": "р-н Мещанский",
 "order_place_finish_predicted_gps": "55.751941, 37.607513",
+"order_place_finish_sector": 4,
 "order_place_finish_real": "р-н Мещанский",
 "order_place_finish_real_gps": "55.751941, 37.607513",
 
@@ -43,52 +54,13 @@ import ast
 "receiver": 1,
 "receiver_screen_name": "Marfa Clientovna",
 "client_id": 1,
-"resource_id": 1
-}
-'''
-
-#minimal acceptable as order json example
-
-'''
-{
-"ticket": 123,
-"state": 111,
-"id_metaservice": 1,
-"is_global": false,
-"is_visible": false,
-"service": 1,
-"service_type": 1,
-
-"time_placed": "2023-05-15T16:40:32.179777Z",
-"time_start": null,
-"time_start_predicted": null,
-"time_finish_predicted": null,
-"time_start_real": null,
-"time_finish_real": null,
-
-"order_place_start": null,
-"order_place_start_gps": null,
-"order_place_start_real": null,
-"order_place_start_real_gps": null,
-"order_place_finish_predicted": null,
-"order_place_finish_predicted_gps": null,
-"order_place_finish_real": null,
-"order_place_finish_real_gps": null,
-
-"predicted_price": null,
-"real_price": null,
-"payment_transaction_id": null,
-"rating_id": null,
-
-"provider": null,
-"provider_screen_name": null,
-"receiver": null,
-"receiver_screen_name": null,
-"client_id": null,
-"resource_id": null
+"client_screen_name": "Fedor Client",
+"resource_id": 1,
+"attempts": null
 }
 '''
 
+#надо адаптировать класс к новому формату JSON
 class Order(object):
     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):
         self.ticket = ticket

+ 4 - 22
open_template_bot.py

@@ -14,7 +14,6 @@ import threading
 import jsonAndRequest as jsreq
 
 global tasklist
-global process_status
 
 #В этом файле содержится только то, что запускает конкретный обработчик
 
@@ -54,7 +53,6 @@ def message_handler(conn, mess):
             orderObj = jsreq.jsonToOrderTicket(text)
             print (orderObj)
             tasklist.append(orderObj)
-            #process_status.append(0)
             bot.bot_log(str(datetime.now())+" Поступивший заказ успешно добавлен в очередь обработки\n")
 
 def open_bot_template_wait(period, i,localtask):
@@ -65,8 +63,7 @@ def open_bot_template_wait(period, i,localtask):
     localtask.title=localtask.title+"1"
 
     #обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
-    jsonTicket = json.dumps(localtask.__dict__)
-    bot.proceed_status(proceed_to[0],jsonTicket)
+    bot.proceed_status(proceed_to[0],localtask)
     bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ подождал и возвращен в очередь\n")
 
 def open_bot_template_process(localtask):
@@ -75,8 +72,7 @@ def open_bot_template_process(localtask):
     #ВАЖНО! Надо через API редактировать заказ, иначе возможна потеря данных
     #localtask.title +=1
 
-    jsonTicket = json.dumps(localtask.__dict__)
-    bot.proceed_status(proceed_to[1],jsonTicket)
+    bot.proceed_status(proceed_to[1],localtask)
     bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ успешно обработан\n")
 
 
@@ -86,13 +82,11 @@ def open_bot_template():
         #проверяем элемент tasklist[i]
         bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " " + str(i) + " " + "Заказ в очереди на обработке\n")
         print ("EACH TASKLIST", tasklist[i])
-        #print ("EACH TASKLIST", tasklist[i], process_status[i])
         localtask=tasklist.pop(i)
         
         #если боту почему-то пришла не его заявка - это явно ошибка движения процессов и отдаем в форсмажор - этот обработчик указывать стоит всегда последним
         if (localtask.status!=operating_status):
-            jsonTicket = json.dumps(localtask.__dict__)
-            bot.proceed_status(proceed_to[-1],jsonTicket)
+            bot.proceed_status(proceed_to[-1],localtask)
             bot.bot_log(botname+" "+str(datetime.now())+" "+str(i)+" "+"Заказ не по адресу, перенаправляем на форсмажор\n")
             continue
 
@@ -105,8 +99,7 @@ def open_bot_template():
             t1.start()
 
         #если никакие обработчики не подошли - отправляем обратно в очередь
-        jsonTicket = json.dumps(localtask.__dict__)
-        bot.proceed_status(proceed_to[0],jsonTicket)
+        bot.proceed_status(proceed_to[0],localtask)
         print("Заказ возвращен в очередь\n")
         print (tasklist)
 
@@ -117,26 +110,15 @@ tasklist = []
 
 #надо инициализировать tasklist при запуске из API
 token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL+"/auth/token/login/")
-#requestGetList(token, API_URL+"/tickets/api/tickets")
 
 #ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
 tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets/?list_id=10")
 #tasklist=jsreq.requestGetList(token, config.API_URL+"/tickets/api/tickets")
-#надо дописать таким образом, чтобы tasklist пополнялся тикетами определенного листа, а не всех
-#print ("TASKLIST ", tasklist)
 print (len(tasklist))
 
-#список статусов обработки заказов
-#process_status = []
-#while len(process_status)<len(tasklist):
-#    process_status.append(0)
-
 
 bot = JabberBot(JID, PASSWORD, PORT)
 
-#загружаем список заказов для обработки из базы (по идее, сюда попадаем в случае первого запуска или перезапуска)
-bot.fake_api_call("Получаем список заказов по названию бота-обработчика")
-
 bot.register_handler('message', message_handler)
 bot.start(open_bot_template)