예제 #1
0
    def execute(self, p_request: ExportRequest = None):
        """ Executes the export operation """
        self._prepare_before_execute(p_request)

        try:
            self._status = ExportStatus.BUSY
            log = Log()
            log.append_text("Starting data export")
            self.request.dispatcher.export_data_begin()
            source_db = self.request.dispatcher.get_client_database(
                self.request.client)
            package = Exporter._pull(source_db)
            Exporter._push(package, self.request.target_db)
        except Exception as error:  # pylint: disable=W0703
            error_entry = LogEntry(str(error), p_type=MessageType.error)
            log.append_entry(error_entry)
        finally:
            self.request.dispatcher.export_data_end()
            log.append_text("Data export finished")
            try:
                self.request.target_db.insert_log(log)
            except Exception:  # pylint: disable=W0703
                pass
            self._status = ExportStatus.IDLE
            print("Export complete")
예제 #2
0
 def delete_log_file_before(self, p_client_id: str, p_before: datetime,
                            p_log: Log):
     """ Deletes log files before the given date """
     log_root_path = self.get_root_path(p_client_id)
     all_log_files = self.get_log_file_list(p_client_id)
     for log_file in all_log_files:
         split1 = log_file.split("T")
         split2 = split1[0].split("-")
         log_file_date = datetime(year=int(split2[0]),
                                  month=int(split2[1]),
                                  day=int(split2[2]))
         if log_file_date < p_before:
             full_log_file_path = path.join(log_root_path, log_file)
             p_log.append_text(f"Deleting {full_log_file_path}")
             remove(full_log_file_path)
예제 #3
0
def test116(action: int):
    """ Runs the test for issue 116 """
    log = Log()
    exchange = Exchange116(p_log=log)
    passengers = exchange.pull()

    if passengers is None or len(passengers) <= 0:
        return

    for passenger in passengers:
        if action == 1:
            exchange.delete_seated_passengers_from_inbox([passenger])
            continue
        if action == 2:
            exchange.forward_seated_passengers([passenger],
                                               ["*****@*****.**"])
            continue
        if action == 3:
            exchange.trash_seated_passengers([passenger])
            continue
        if action == 4:
            folder = ExchangeFolder(ExchangeFolderParent.INBOX, "kktest1")
            exchange.move_seated_passengers([passenger], folder)
            continue
        if action == 5:
            folder = ExchangeFolder(ExchangeFolderParent.ROOT, "kktest2")
            exchange.move_seated_passengers([passenger], folder)
            continue
예제 #4
0
    def all_clients(self) -> List[Client]:
        """ Returns a list of clients from the database within the ticket """
        dummy_db = self.ticket.database_factory.create_database(
            p_log=Log(),
            p_module=self.ticket.database_module,
            p_client_id=None,
            p_passenger_factory=self.ticket.passenger_factory,
            p_arguments=self.ticket.database_arguments)

        return dummy_db.get_clients()
예제 #5
0
 def pull_passengers_from_module(
         self,
         p_puller_module: str,
         p_log: Log = None) -> List[AbstractPassenger]:
     """ Pulls new passengers from the given puller module """
     if p_log is None:
         log = Log()
     else:
         log = p_log
     puller_obj = self.puller_factory.create_puller(p_puller_module, log)
     return puller_obj.pull()
예제 #6
0
    def get_client_database(self,
                            p_client_id: str,
                            p_log: Log = None) -> AbstractDatabase:
        """ Returns a database instance for the given client """
        if p_log is None:
            log = Log()
        else:
            log = p_log

        return self.ticket.database_factory.create_database(  # pylint: disable=C0103
            p_passenger_factory=self.ticket.passenger_factory,
            p_client_id=p_client_id,
            p_module=self.ticket.database_module,
            p_log=log,
            p_arguments=self.ticket.database_arguments)
예제 #7
0
    def __init__(self,
                 p_client_passenger: ClientPassenger = None,
                 p_log: Log = None,
                 p_database: AbstractDatabase = None):

        if p_client_passenger is None:
            self.client_passenger = ClientPassenger()
        else:
            self.client_passenger = p_client_passenger

        if p_log is None:
            self.log = Log()
        else:
            self.log = p_log

        self.database = p_database
예제 #8
0
    def get_log_content(self, p_log_id: str) -> str:
        """ Returns the contents of the given log
        p_log_id is whatever you have returned in get_log_list.
        """
        output = ""
        log_id = p_log_id.split(SqlDatabase._LOG_ID_SEPARATOR)[1]
        cond = "log_id = '" + log_id + "'"
        log_entries = self._query_helper.select_all("log_item", cond)

        for log_entry in log_entries:
            if output != "":
                output += "\r\n"

            line = Log.build_entry_field_string(
                p_date=str(log_entry["message_on"]),
                p_source=log_entry["module"],
                p_type=SqlToDatabus.message_type(
                    log_entry["message_type"]).name,
                p_message=log_entry["message"])
            output += line

        return output
예제 #9
0
    def execute(self):
        """ Executes an export request """
        try:
            self._authenticate(must_be_admin=True)
        except AuthenticationError as authentication_error:
            return authentication_error.output

        exporter = ExporterFactory.get_singleton()
        if exporter.status == ExportStatus.BUSY:
            return render_template("export_busy.html",
                                   alias=self.dispatcher.ticket.system_alias)

        client = request.form["client"]
        db_module = request.form["db_module"]
        db_args = json.loads(request.form["args"])
        mode = request.form["mode"]

        if self.authenticated_client_id != Client.ROOT:
            if client != self.authenticated_client_id:
                return redirect(url_for("_login"), code=302)

        target_db = self.dispatcher.ticket.database_factory.create_database(
            db_module, client, Log(), self.dispatcher.ticket.passenger_factory,
            db_args)

        export_request = ExportRequest(self.dispatcher, target_db, db_args,
                                       client, self.authenticated_client_id)

        if mode == "async":
            exporter.execute_async(export_request)
        else:
            exporter.execute(export_request)

        return render_template("export_started.html",
                               mode=mode,
                               alias=self.dispatcher.ticket.system_alias)
예제 #10
0
    def _drive_passenger(self, p_client: Client,
                         p_client_passenger: ClientPassenger):
        if self.paused or self._status.shutting_down:
            return
        log = Log()
        db = None  # pylint: disable=C0103
        driver = None
        try:
            log.append_text("Dispatching client " + p_client.id +
                            " passenger " + p_client_passenger.name)

            log.append_text(f"Creating database {self.ticket.database_module}")
            db = self.get_client_database(p_client.id, log)  # pylint: disable=C0103
            log.append_text("Checking schema")
            db.ensure_schema_existence()
            log.append_text(f"Creating driver {self.ticket.driver_module}")
            driver = self.get_driver()
            log.append_text("Creating ticket")

            ticket = BusTicket(p_client_passenger=p_client_passenger,
                               p_log=log,
                               p_database=db)

            log.append_text("Driving")
            driver.drive(ticket)

        except Exception as drive_error:  # pylint: disable=W0703
            if log is not None:
                log.append_entry(
                    LogEntry(p_message=str(drive_error),
                             p_type=MessageType.error))
        finally:
            self._tick_count.reset_tick(p_client.id, p_client_passenger.name)
            if self.ticket.dispatcher_observer is not None and log is not None:
                self.ticket.dispatcher_observer.drive_passenger_complete(
                    p_client, p_client_passenger, log)
            if db is not None:
                db.insert_log(log)
                db.delete_old_logs(p_client.log_expiry_date)
            if driver is not None:
                driver.queue.delete_completed_passengers(
                    p_client_passenger.name,
                    p_client_passenger.queue_expiry_date)