From 521df27243bd3734ce09594e17705b408539862d Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Wed, 3 Jun 2020 08:11:41 +0300 Subject: [PATCH] Fix server import --- server/icons/test.png | Bin 0 -> 33371 bytes server/modules/config_editor_models.py | 14 +++++----- server/modules/copter_table.py | 4 +-- server/modules/server_core.py | 2 +- server/modules/ui/server_gui.py | 2 +- server/modules/visual_land_dialog.py | 2 +- server/server.py | 37 +++++++++++++------------ 7 files changed, 32 insertions(+), 29 deletions(-) create mode 100644 server/icons/test.png diff --git a/server/icons/test.png b/server/icons/test.png new file mode 100644 index 0000000000000000000000000000000000000000..2462496e12eb0c4b48b3e4caf4551d74ce067ddc GIT binary patch literal 33371 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 literal 0 HcmV?d00001 diff --git a/server/modules/config_editor_models.py b/server/modules/config_editor_models.py index c9466f0..9c08941 100644 --- a/server/modules/config_editor_models.py +++ b/server/modules/config_editor_models.py @@ -1,3 +1,5 @@ +import os +import sys import pickle import logging from ast import literal_eval @@ -10,14 +12,12 @@ from PyQt5.QtGui import QCursor, QKeySequence from PyQt5.QtWidgets import QAbstractItemView, QTreeView, QMenu, QAction, QMessageBox, QInputDialog, QFileDialog, \ QShortcut -import config_editor +import modules.ui.config_editor as config_editor -import sys -import os, inspect # Add parent dir to PATH to import messaging_lib - -current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) -parent_dir = os.path.dirname(current_dir) -sys.path.insert(0, parent_dir) +# Add parent dir to PATH to import messaging_lib and config_lib +current_dir = (os.path.dirname(os.path.realpath(__file__))) +lib_dir = os.path.realpath(os.path.join(current_dir, '../../lib')) +sys.path.insert(0, lib_dir) import config diff --git a/server/modules/copter_table.py b/server/modules/copter_table.py index f216432..dcb1cc0 100644 --- a/server/modules/copter_table.py +++ b/server/modules/copter_table.py @@ -8,8 +8,8 @@ from PyQt5.QtGui import QCursor from PyQt5.QtWidgets import QTableView, QMessageBox, QMenu, QAction, QWidgetAction, QListWidget, \ QAbstractItemView, QListWidgetItem, QVBoxLayout, QHBoxLayout, QPushButton, QInputDialog, QLineEdit, QApplication -from config_editor_models import ConfigDialog -import copter_table_models as table +from modules.config_editor_models import ConfigDialog +import modules.copter_table_models as table def save_preset(config, current, header_dict): diff --git a/server/modules/server_core.py b/server/modules/server_core.py index 8eccdc7..7502554 100644 --- a/server/modules/server_core.py +++ b/server/modules/server_core.py @@ -38,7 +38,7 @@ ConfigOption = collections.namedtuple("ConfigOption", ["section", "option", "val class Server(messaging.Singleton): - def __init__(self, server_id=None, config_path="../config/server.ini"): + def __init__(self, config_path="../config/server.ini", server_id=None): self.id = server_id if server_id else str(random.randint(0, 9999)).zfill(4) self.time_started = 0 diff --git a/server/modules/ui/server_gui.py b/server/modules/ui/server_gui.py index 03dc120..a163801 100644 --- a/server/modules/ui/server_gui.py +++ b/server/modules/ui/server_gui.py @@ -381,7 +381,7 @@ class Ui_MainWindow(object): self.reboot_fcu.setText(_translate("MainWindow", "Reboot FCU")) self.calibrate_gyro.setText(_translate("MainWindow", "Calibrate gyro")) self.calibrate_level.setText(_translate("MainWindow", "Calibrate level")) - self.menuOptions.setTitle(_translate("MainWindow", "server")) + self.menuOptions.setTitle(_translate("MainWindow", "Server")) self.menuMusic_2.setTitle(_translate("MainWindow", "Music")) self.menuTable.setTitle(_translate("MainWindow", "Table")) self.menuDrone_2.setTitle(_translate("MainWindow", "Selected drones")) diff --git a/server/modules/visual_land_dialog.py b/server/modules/visual_land_dialog.py index 6466a9e..5c53d5f 100644 --- a/server/modules/visual_land_dialog.py +++ b/server/modules/visual_land_dialog.py @@ -2,7 +2,7 @@ from PyQt5.QtCore import pyqtSlot from PyQt5.QtGui import QKeySequence from PyQt5 import QtWidgets -import visual_land +import modules.ui.visual_land as visual_land import math import logging import sys diff --git a/server/server.py b/server/server.py index 81464ff..2d1504f 100644 --- a/server/server.py +++ b/server/server.py @@ -8,30 +8,33 @@ import asyncio import platform import itertools import subprocess -from functools import partial, wraps +from functools import partial, wraps +from quamash import QEventLoop + +# Import server routines +from modules.server_core import Server, Client, now + +# Import modules from lib, that was added to PATH on the previous step +import messaging +import config as cfg +from lib import b_partial + +# Import PyQt5 related functions from PyQt5 import QtWidgets, QtMultimedia, QtCore from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtCore import Qt, pyqtSlot, QUrl - from PyQt5.QtWidgets import QFileDialog, QMessageBox, QApplication, QInputDialog, QLineEdit, QStatusBar, \ QSplashScreen, QProgressBar -from quamash import QEventLoop -# Importing gui form -from server_gui import Ui_MainWindow +# Import gui form +from modules.ui.server_gui import Ui_MainWindow -from core_server import Server, Client, now - -import messaging_lib as messaging -import config as cfg - -import copter_table_models as table -from copter_table import CopterTableWidget, HeaderEditDialog -from visual_land_dialog import VisualLandDialog -from config_editor_models import ConfigDialog - -from lib import b_partial +# Import gui logic +import modules.copter_table_models as table +from modules.copter_table import CopterTableWidget, HeaderEditDialog +from modules.visual_land_dialog import VisualLandDialog +from modules.config_editor_models import ConfigDialog startup_cwd = os.getcwd() @@ -683,7 +686,7 @@ if __name__ == "__main__": # app.exec_() with loop: - server = ServerQt() + server = ServerQt(config_path="config/server.ini") window = MainWindow(server) Client.on_first_connect = window.new_client_connected