Browse Source

cp files from webservice_running

ShariX Developer 1 tháng trước cách đây
mục cha
commit
cd6cafd065

+ 10 - 0
handlers/classes/Answer.py

@@ -0,0 +1,10 @@
+class Answer(object):
+    def __init__(
+            self,
+            order_id,
+            provider,
+            answer
+    ):
+        self.order_id = order_id
+        self.provider = provider
+        self.answer = answer

+ 248 - 0
handlers/classes/Order.py

@@ -0,0 +1,248 @@
+class Order(object):
+    def __init__(
+            self,
+            id,
+            ticket,
+            status,
+            title,
+            note,
+            id_metaservice,
+            is_global,
+            is_visible,
+            service,
+            service_category,
+            time_created,
+            time_placed,
+            time_start=None,
+            time_start_predicted=None,
+            time_finish_predicted=None,
+            time_start_real=None,
+            time_finish_real=None,
+            order_place_type=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=None,
+            resource=None,
+            attempts=None,
+            asap=None,
+            money_limit=None,
+            tasks=None,
+            proceed_before_arrival=False,
+            confirmation=False
+    ):
+        self.id = id
+        self.ticket = ticket
+        self.status = status
+        self.title = title
+        self.note = note
+        self.id_metaservice = id_metaservice
+        self.is_global = is_global
+        self.is_visible = is_visible
+        self.service = service
+        self.service_category = service_category
+        self.time_created = time_created
+        self.time_placed = time_placed
+        self.time_start = time_start
+        self.time_start_predicted = time_start_predicted
+        self.time_finish_predicted = time_finish_predicted
+        self.time_start_real = time_start_real
+        self.time_finish_real = time_finish_real
+        self.order_place_type = order_place_type
+        self.order_place_start = order_place_start
+        self.order_place_start_gps = order_place_start_gps
+        self.order_place_start_real = order_place_start_real
+        self.order_place_start_real_gps = order_place_start_real_gps
+        self.order_place_finish_predicted = order_place_finish_predicted
+        self.order_place_finish_predicted_gps = order_place_finish_predicted_gps
+        self.order_place_finish_real = order_place_finish_real
+        self.order_place_finish_real_gps = order_place_finish_real_gps
+        self.predicted_price = predicted_price
+        self.real_price = real_price
+        self.payment_transaction_id = payment_transaction_id
+        self.rating_id = rating_id
+        self.provider = provider
+        self.provider_screen_name = provider_screen_name
+        self.receiver = receiver
+        self.receiver_screen_name = receiver_screen_name
+        self.client = client
+        self.resource = resource
+        self.attempts = attempts
+        self.asap = asap
+        self.money_limit = money_limit
+        self.tasks = tasks
+        self.proceed_before_arrival = proceed_before_arrival
+        self.confirmation = confirmation
+
+    def __str__(self):
+        return "{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32}, {33}, {34}, {35}, {36}, {37}, {38}".format(
+            self.id,
+            self.ticket,
+            self.status,
+            self.title,
+            self.note,
+            self.id_metaservice,
+            self.is_global,
+            self.is_visible,
+            self.service,
+            self.service_category,
+            self.time_created,
+            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_type,
+            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,
+            self.resource,
+            self.attempts,
+            self.asap,
+            self.money_limit,
+            self.tasks,
+            self.proceed_before_arrival,
+            self.confirmation
+        )
+
+
+# Тестовый класс User и Address (ВАЖНО!!!) поля классов должны называться также как и поля json объекта
+'''
+#Full json order example
+https://wiki.sharix-app.org/doku.php/open/tech/dev/sharix_open_-_primery_json
+
+{
+
+"ticket": 123,
+"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_category": 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",
+"time_finish_predicted": "2023-05-15T16:40:32.179777Z",
+"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",
+
+"predicted_price": 1000,
+"real_price": 1001,
+"payment_transaction_id": 1,
+"rating_id": 1,
+
+"provider": 1,
+"provider_screen_name": "Vasya Ispolnitelev",
+"receiver": 1,
+"receiver_screen_name": "Marfa Clientovna",
+"client": 1,
+"client_screen_name": "Fedor Client",
+"resource": 1,
+"attempts": null
+}
+'''
+# надо адаптировать класс к новому формату JSON
+# class Order(object):
+#     def __init__(self, id,order_synced, ticket, status, title, note, due_date, id_metaservice, is_global, is_visible, service, service_category, status_changed_date,time_created, time_placed, time_start=None, time_start_predicted=None, time_finish_predicted=None, time_start_real=None, time_finish_real=None, order_place_type=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=None, resource=None, attempts=None, asap=None):
+#         self.order_synced = order_synced
+#         self.id = id
+#         self.ticket = ticket
+#         self.status = status
+
+#         self.title = title
+#         self.note = note
+#         self.due_date = due_date
+
+#         self.id_metaservice = id_metaservice
+#         self.is_global = is_global
+#         self.is_visible = is_visible
+#         self.service = service
+#         self.service_category = service_category
+
+#         self.status_changed_date = status_changed_date
+#         self.time_created = time_created
+#         self.time_placed = time_placed
+#         self.time_start = time_start
+#         self.time_start_predicted = time_start_predicted
+#         self.time_finish_predicted = time_finish_predicted
+#         self.time_start_real = time_start_real
+#         self.time_finish_real = time_finish_real
+
+#         self.order_place_type =order_place_type
+#         self.order_place_start = order_place_start
+#         self.order_place_start_gps = order_place_start_gps
+#         self.order_place_start_real = order_place_start_real
+#         self.order_place_start_real_gps = order_place_start_real_gps
+#         self.order_place_finish_predicted = order_place_finish_predicted
+#         self.order_place_finish_predicted_gps = order_place_finish_predicted_gps
+#         self.order_place_finish_real = order_place_finish_real
+#         self.order_place_finish_real_gps = order_place_finish_real_gps
+
+#         self.predicted_price = predicted_price
+#         self.real_price = real_price
+
+#         self.payment_transaction_id = payment_transaction_id
+#         self.rating_id = rating_id
+
+#         self.provider = provider
+#         self.provider_screen_name = provider_screen_name
+#         self.receiver = receiver
+#         self.receiver_screen_name = receiver_screen_name
+#         self.client = client
+#         self.resource = resource
+#         self.attempts = attempts
+#         self.asap = asap
+#         #доделать до конца по аналогии с закоммиченным json
+#     def __str__(self):
+#         return "{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18}, {19}, {20}, {21}, {22}, {23}, {24}, {25}, {26}, {27}, {28}, {29}, {30}, {31}, {32} , {33} ,{34}".format(self.order_synced, self.id, self.ticket, self.status, self.title, self.note, self.due_date, self.id_metaservice, self.is_global, self.is_visible, self.service, self.service_category, self.status_changed_date, self.time_created,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_type, 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, self.resource, self.attempts, self.asap)
+
+# \n добавляете в местах с пустой строкой в шаблоне

+ 97 - 0
handlers/classes/OrderTicket.py

@@ -0,0 +1,97 @@
+class OrderTicket(object):
+    def __init__(
+            self,
+            service_category,
+            driverSearchEngine,
+            comment,
+            arrivalTime,
+            additionalServices,
+            tasks,
+            spendingLimit,
+            isWithPaymentDocument,
+            id,
+            isProceedBeforeArrival
+    ):
+        self.service_category = service_category
+        self.driverSearchEngine = driverSearchEngine
+        self.comment = comment
+        self.arrivalTime = arrivalTime
+        self.additionalServices = additionalServices
+        self.tasks = tasks
+        self.spendingLimit = spendingLimit
+        self.isWithPaymentDocument = isWithPaymentDocument
+        self.id = id
+        self.isProceedBeforeArrival = isProceedBeforeArrival
+
+
+# ticket json example
+'''
+{
+        "id": 2,
+        "status": 111,
+        "created_date": "2023-05-15",
+        "status_changed_date": "2023-05-15T17:16:22.955601Z",
+        "priority": 0,
+        "title": "Test",
+        "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_category\": 1,\n\n    \"time_placed\": 1}"
+        "due_date": "2023-05-15",
+        "task_list": 10,
+        "created_by": 1,
+        "type": 1,
+        "assigned_to": 1
+}
+'''
+
+# ticket minimal example
+'''
+{
+        "id": 2,
+        "status": 111,
+        "created_date": "2023-05-15",
+        "status_changed_date": "2023-05-15T17:16:22.955601Z",
+        "priority": 0,
+        "title": null,
+        "note": null,
+        "due_date": null,
+        "task_list": 10,
+        "created_by": 1,
+        "type": 1,
+        "assigned_to": null
+}
+{
+  "service_category": 2,
+  "driverSearchEngine": 0,
+  "comment": "Yyyy",
+  "arrivalTime": "2023-12-07T14:39:54Z",
+  "additionalServices": [],
+  "tasks": [
+    {
+      "text": "Eeee",
+      "address": "Jjjj"
+    }
+  ],
+  "spendingLimit": 6668,
+  "isWithPaymentDocument": true,
+  "id": 294830,
+  "isProceedBeforeArrival": true
+}
+
+'''
+
+# class OrderTicketOLD(object):
+#     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):
+#         self.id = id
+#         self.status = status
+#         self.created_date = created_date
+#         self.status_changed_date = status_changed_date
+#         self.priority = priority
+#         self.title = title
+#         self.note = note
+#         self.due_date = due_date
+#         self.task_list = task_list
+#         self.created_by = created_by
+#         self.type = type
+#         self.assigned_to = assigned_to
+
+#     def  __str__(self):
+#         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)

+ 89 - 0
handlers/classes/Ticket.py

@@ -0,0 +1,89 @@
+from datetime import datetime
+from config import DEFAULT_INTERVAL_ATTEMPTS, DEFAULT_ASSIGNED_TO_ATTEMPTS
+
+class Ticket(object):
+    def __init__(
+            self,
+            id,
+            status,
+            ticket_list,
+            ticket_type,
+            title,
+            created_at,
+            updated_at,
+            due_date,
+            priority,
+            created_by,
+            assigned_to=None,
+            note=None,
+            json=None,
+            available_statuses=None,
+
+            interval_attempts: int = DEFAULT_INTERVAL_ATTEMPTS,
+            assigned_to_attempts: int = DEFAULT_ASSIGNED_TO_ATTEMPTS
+    ):
+        self.id = id
+        self.status = status
+        self.ticket_list = ticket_list
+        self.ticket_type = ticket_type
+        self.title = title
+        self.created_at = created_at
+        self.updated_at = updated_at
+        self.due_date = due_date
+        self.priority = priority
+        self.created_by = created_by
+        self.assigned_to = assigned_to
+        self.note = note
+        self.json = json
+        self.available_statuses = available_statuses
+
+        self.interval_attempts = interval_attempts
+        self.assigned_to_attempts = assigned_to_attempts
+
+    def __str__(self):
+        return "{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}".format(
+            self.id,
+            self.status,
+            self.ticket_list,
+            self.ticket_type,
+            self.title,
+            self.created_at,
+            self.updated_at,
+            self.due_date,
+            self.priority,
+            self.created_by,
+            self.assigned_to,
+            self.note,
+            self.json,
+            self.available_statuses
+        )
+
+    def to_dict(self):
+        """ Method to convert the object to a dictionary, if needed for JSON responses or serialization """
+        return {
+            "id": self.id,
+            "status": self.status,
+            "ticket_list": self.ticket_list,
+            "ticket_type": self.ticket_type,
+            "title": self.title,
+            "created_at": self.created_at,
+            "updated_at": self.updated_at,
+            "due_date": self.due_date,
+            "priority": self.priority,
+            "created_by": self.created_by,
+            "assigned_to": self.assigned_to,
+            "note": self.note,
+            "json": self.json,
+            "available_statuses": self.available_statuses
+        }
+
+    def update_status(self, new_status):
+        self.status = new_status
+        self.updated_at = datetime.now().isoformat()
+
+    def assign_to(self, user_id):
+        self.assigned_to = user_id
+
+    def get_summary(self):
+        return f"Ticket '{self.title}' (ID: {self.id}) - Status: {self.status}, Priority: {self.priority}"
+

+ 30 - 0
handlers/core/JabberBot.py

@@ -0,0 +1,30 @@
+import logging
+import slixmpp
+import config
+from datetime import datetime
+
+
+class JabberBot(slixmpp.ClientXMPP):
+    """
+    Класс для работы с Jabber
+    """
+
+    def __init__(self, jid, password):
+        slixmpp.ClientXMPP.__init__(self, jid, password)
+
+        # Register plugins
+        self.register_plugin('xep_0030') # Service Discovery
+        self.register_plugin('xep_0004') # Data Forms
+        self.register_plugin('xep_0060') # PubSub
+        self.register_plugin('xep_0199') # XMPP Ping
+
+    def log(self, message):
+        # надо строчку лога сделать более информативной
+        logfile = open("logs/" + datetime.now().strftime('%Y-%m-%d') + "-" + self.user + ".log", "a")
+        logfile.write(message)
+        logfile.close()
+        print(message)
+
+    def stop(self):
+        self.disconnect()
+

+ 11 - 0
handlers/core/SystemdKiller.py

@@ -0,0 +1,11 @@
+import signal
+import threading
+
+class SystemdKiller:
+    def __init__(self):
+        self.exit_event = threading.Event()
+        signal.signal(signal.SIGINT, self.exit_handler)
+        signal.signal(signal.SIGTERM, self.exit_handler)
+
+    def exit_handler(self, signum, frame):
+        self.exit_event.set()  # Устанавливаем флаг прерывания

+ 25 - 0
handlers/core/data_parsers.py

@@ -0,0 +1,25 @@
+
+import json
+from classes.Order import Order
+from classes.OrderTicket import OrderTicket
+
+
+def jsonToOrder(jsonstring) -> Order:
+    """
+    Функция преобразования json в объект класса Order
+    """
+    jsonObj = json.loads(jsonstring)
+    print(jsonObj)
+    u = Order(**jsonObj)
+    return u
+
+
+def jsonToOrderTicket(jsonstring) -> OrderTicket:
+    """
+    Функция преобразования json в объект класса OrderTicket
+    """
+    print(jsonstring)
+    jsonObj = json.loads(jsonstring)
+    print(jsonObj)
+    u = OrderTicket(**jsonObj)
+    return u

+ 17 - 0
handlers/core/lib.py

@@ -0,0 +1,17 @@
+
+def filter_interval_tickets(tickets):
+    """ Очистка тикетов, у которых закончились попытки """
+    return list(filter(lambda ticket: ticket.interval_attempts > 0, tickets))
+
+def run_process(interval_attempts_unlimited, processing):
+    """Обработка одного тикета с удалением."""
+    def go(ticket):    
+        ticket.interval_attempts -= 1
+        if ticket.interval_attempts <= 0:
+            interval_attempts_unlimited(ticket)
+            return None  # Маркер для удаления
+        else:
+            processing(ticket)
+        return ticket
+
+    return go

+ 40 - 0
handlers/core/requesters.py

@@ -0,0 +1,40 @@
+from classes.Ticket import Ticket
+import config
+import requests
+from typing import List
+from requests.models import Response
+
+class TicketRequester:
+    def __init__(self, token: str):
+        self.token = token
+
+
+    def patch(self, ticket: Ticket, data: dict) -> Response:
+        """ Частичное обновление тикета """
+        url: str = config.API_URL + f"tickets/api/v2/ticket/{ticket.id}"
+        headers = {'Authorization': f'Api-Key {self.token}'}
+        response = requests.patch(url, json=data, headers=headers)
+        return response
+
+
+    def all(self, params: dict = {}) -> List[Ticket]:
+        """ Получение всех тикетов """
+        url: str = config.API_URL + "tickets/api/v2/ticket/"
+        headers = {'Authorization': f'Api-Key {self.token}'}
+        response = requests.get(url, headers=headers, params=params)
+        return list(map(lambda x: Ticket(**x), response.json()))
+
+
+    def put(self, ticket: Ticket, data: dict) -> Ticket:
+        """ Обновление тикета """
+        None
+
+
+    def post(self, ticket: Ticket, data: dict) -> Ticket:
+        """ Создание тикета """
+        None
+
+
+    def delete(self, ticket: Ticket) -> Ticket:
+        """ Удаление тикета """
+        None