set status connection network

modify option login
This commit is contained in:
Wilson Gomez 2023-01-02 22:47:49 -05:00
parent f792521158
commit 2796adc5ca
10 changed files with 177 additions and 71 deletions

View File

@ -4,22 +4,25 @@ import sys
import os import os
import gettext import gettext
import logging import logging
import time
from collections import OrderedDict from collections import OrderedDict
from pathlib import Path from pathlib import Path
from PySide6.QtWidgets import (QMainWindow, QDialog) from PySide6.QtWidgets import (QMainWindow, QDialog)
from PySide6.QtCore import Qt from PySide6.QtCore import Qt, QTimer
from PySide6.QtGui import QPixmap
# from PyQt5.QtWidgets import (QDialogButtonBox, QPushButton, # from PyQt5.QtWidgets import (QDialogButtonBox, QPushButton,
# QLineEdit, QHBoxLayout, QFrame, QLabel, # QLineEdit, QHBoxLayout, QFrame, QLabel,
# QVBoxLayout, QStyle,) # QVBoxLayout, QStyle,)
# from PyQt5.QtGui import QPixmap, QFont
# from PyQt5.QtCore import Qt # from PyQt5.QtCore import Qt
from http.client import HTTPConnection, HTTPSConnection
from app.commons import connection import orjson as json
from app.commons import common from app.threads import VerifyConn
# from app.commons import connection
# from app.commons import common
from app.commons.config import Params from app.commons.config import Params
from app.commons.dialogs import QuickDialog # from app.commons.dialogs import QuickDialog
from app.commons.forms import GridForm # from app.commons.forms import GridForm
from ..version import __version__ # from ..version import __version__
from app.commons.ui_login import Ui_Login from app.commons.ui_login import Ui_Login
# from app.css.flat_button_small import * # from app.css.flat_button_small import *
@ -29,8 +32,14 @@ __all__ = ['Login', 'xconnection']
pkg_dir = str(Path(os.path.dirname(__file__)).parents[0]) pkg_dir = str(Path(os.path.dirname(__file__)).parents[0])
path_logo = os.path.join(pkg_dir, 'share', 'login.png') path_logo = os.path.join(pkg_dir, 'share', 'login.png')
path_circle_red = os.path.join(pkg_dir, 'share', 'circle_red.svg')
path_circle_green = os.path.join(pkg_dir, 'share', 'circle_green.svg')
file_base_css = os.path.join(pkg_dir, 'css', 'base.css') file_base_css = os.path.join(pkg_dir, 'css', 'base.css')
file_tablet_css = os.path.join(pkg_dir, 'css', 'tablet.css') file_tablet_css = os.path.join(pkg_dir, 'css', 'tablet.css')
HEADERS = {
"Content-type": "application/json",
"Accept": "text/plain"
}
class Login(QDialog): class Login(QDialog):
@ -38,8 +47,7 @@ class Login(QDialog):
def __init__(self, parent=None, file_config=''): def __init__(self, parent=None, file_config=''):
super(Login, self).__init__(parent) super(Login, self).__init__(parent)
logging.info(' Start login Neox system X...') logging.info(' Start login Neox system X...')
self.connection = None self.context = {}
self.mode_conn = 'online'
params = Params(file_config) params = Params(file_config)
self.params = params.params self.params = params.params
self.setObjectName('dialog_login') self.setObjectName('dialog_login')
@ -56,7 +64,27 @@ class Login(QDialog):
self.tablet_mode = None self.tablet_mode = None
self.ui = Ui_Login() self.ui = Ui_Login()
self.ui.setupUi(self) self.ui.setupUi(self)
# self.init_UI() self.verify_conn_th = VerifyConn(self)
self.verify_conn_th.sigVerifyConn.connect(self.verify_active)
self.verify_conn_th.start()
def verify_active(self):
conn = HTTPSConnection('google.com', timeout=5)
try:
conn.connect()
conn._validate_host('google.com')
conn.close()
option = u"online"
icon_conn = path_circle_green
except:
icon_conn = path_circle_red
option = u"offline"
self.ui.label_conn.setText(option)
self.ui.label_icon_conn.setPixmap(QPixmap(icon_conn))
self.timer = QTimer()
self.timer.timeout.connect(self.verify_active)
self.timer.start(10)
self.verify_conn_th.exit(0)
def set_style(self, style_files): def set_style(self, style_files):
styles = [] styles = []
@ -187,16 +215,25 @@ class Login(QDialog):
password = self.ui.field_password.text() password = self.ui.field_password.text()
server = self.params.get('server') server = self.params.get('server')
database = self.ui.field_database.text() database = self.ui.field_database.text()
self.connection = xconnection( result = xconnection(
self.params['mode'], user, password, server, database self.params['mode'], user, password, server, database, self.params['port']
) )
if not self.connection: if result['status'] != 200 or result['user'] is None:
self.ui.field_password.setText('') self.ui.field_password.setText('')
self.ui.field_password.setFocus() self.ui.field_password.setFocus()
self.run() self.run()
self.ui.label_error.setText('Error: usuario o contraseña invalida...!') msg = 'Error: usuario o contraseña invalida...!'
if result['status'] == 429:
msg = 'Error: Tiene muchos intentos de sesion, \npara desbloquear contacta con el area administrativa'
elif result['status'] == 408:
msg = 'Error: conexion del servidor'
elif result['status'] == 500:
msg = 'Error: interno del servidor \n' + result['message']
print(msg, 'msg ,,,,', result['status'])
self.ui.label_error.setText(msg)
self.error_message() self.error_message()
else:
self.context = result
self.params['user'] = user self.params['user'] = user
self.params['password'] = password self.params['password'] = password
@ -204,15 +241,54 @@ class Login(QDialog):
self.ui.label_error.show() self.ui.label_error.show()
def xconnection(mode, user, password, host, database): def xconnection(mode, user, password, host, database, port):
# Get user_id and session # Get user_id and session
if mode == 'http':
conn = HTTPConnection(host, port=port, timeout=10)
else:
conn = HTTPSConnection(host, port=port, timeout=10)
print(conn._validate_host(host))
print(conn._validate_method('POST'))
url = '/' + database + '/login'
payload = {
'method': "common.db.login",
'params': [
user,
{'device_cookie': None, 'password': password},
"es",
],
'id': 0,
'context': {},
}
try: try:
url = '%s://%s:%s@%s:%s/%s/' % ( conn.request('POST', url, body=json.dumps(payload), headers=HEADERS)
mode, user, password, host, 8000, database) response = conn.getresponse()
return connection.set_xmlrpc(url) except Exception as e:
status = 408
response = None
print(e, 'error')
# url = '%s://%s:%s@%s:%s/%s/' % (
# mode, user, password, host, 8000, database)
try:
res = json.loads(response.read())
if not res.get('status'):
res['status'] = response.status
except: except:
print('LOG: Data connection invalid!') status = status
return None msg = ''
if response:
status = response.status
msg = response.msg
res = {
'status': status,
'message': msg
}
conn.close()
return res
# return connection.set_xmlrpc(url)
# def safe_reconnect(main): # def safe_reconnect(main):

View File

@ -5,7 +5,7 @@ from PySide6.QtGui import (QBrush, QColor, QFont, QGradient, QIcon,
QLinearGradient, QPalette, QPixmap) QLinearGradient, QPalette, QPixmap)
from PySide6.QtWidgets import (QGridLayout, QGroupBox, QLabel, from PySide6.QtWidgets import (QGridLayout, QGroupBox, QLabel,
QLayout, QPushButton, QLineEdit, QVBoxLayout, QWidget, QLineEdit, QLayout, QPushButton, QLineEdit, QVBoxLayout, QWidget, QLineEdit,
QDialogButtonBox, QSizePolicy) QDialogButtonBox, QSizePolicy, QHBoxLayout)
from ..version import __version__ from ..version import __version__
pkg_dir = str(Path(os.path.dirname(__file__)).parents[0]) pkg_dir = str(Path(os.path.dirname(__file__)).parents[0])
@ -170,7 +170,7 @@ class Ui_Login(object):
self.gridLayout.addWidget(self.label_title, 0, 0, 2, 1) self.gridLayout.addWidget(self.label_title, 0, 0, 2, 1)
self.vLayout_footer = QVBoxLayout() self.vLayout_footer = QVBoxLayout()
self.vLayout_footer.setSpacing(10) self.vLayout_footer.setSpacing(0)
self.vLayout_footer.setObjectName(u"vLayout_footer") self.vLayout_footer.setObjectName(u"vLayout_footer")
self.vLayout_footer.setContentsMargins(0, 0, 0, 0) self.vLayout_footer.setContentsMargins(0, 0, 0, 0)
self.label_page = QLabel(self.gridGroupBoxMain) self.label_page = QLabel(self.gridGroupBoxMain)
@ -193,6 +193,21 @@ class Ui_Login(object):
self.label_version.setAlignment(Qt.AlignCenter) self.label_version.setAlignment(Qt.AlignCenter)
self.vLayout_footer.addWidget(self.label_version) self.vLayout_footer.addWidget(self.label_version)
self.hLayout_conn = QHBoxLayout()
self.label_icon_conn = QLabel(self.gridGroupBoxMain)
self.label_icon_conn.setAlignment(Qt.AlignRight)
self.label_icon_conn.setObjectName(u"label_icon_conn")
self.hLayout_conn.addWidget(self.label_icon_conn)
self.label_conn = QLabel(self.gridGroupBoxMain)
self.label_conn.setObjectName(u"label_conn")
self.label_conn.setFont(font4)
self.label_conn.setStyleSheet(u"color: rgb(119, 118, 123);")
self.label_conn.setAlignment(Qt.AlignLeft)
self.hLayout_conn.addWidget(self.label_conn)
self.vLayout_footer.addLayout(self.hLayout_conn)
self.gridLayout.addLayout(self.vLayout_footer, 11, 0, 1, 1) self.gridLayout.addLayout(self.vLayout_footer, 11, 0, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 1, 1, 1, 1) self.gridLayout_2.addLayout(self.gridLayout, 1, 1, 1, 1)

View File

@ -38,7 +38,7 @@ _DEFAULT_TIMEOUT = 60000 # on ms (100 minutes)
class FrontWindow(QMainWindow): class FrontWindow(QMainWindow):
def __init__(self, connection, params, title=None, show_mode=None): def __init__(self, context, params, title=None, show_mode=None):
super(FrontWindow, self).__init__() super(FrontWindow, self).__init__()
if not title: if not title:
title = 'APLICACION' title = 'APLICACION'
@ -47,9 +47,9 @@ class FrontWindow(QMainWindow):
self._keyStates = {} self._keyStates = {}
self.window().setWindowTitle(title) self.window().setWindowTitle(title)
self.setObjectName('WinMain') self.setObjectName('WinMain')
self.conn = connection # self.conn = connection
self.version = __version__ self.version = __version__
self._context = connection.context self._context = context
self.set_params(params) self.set_params(params)
self.logger = logging.getLogger('app_logger') self.logger = logging.getLogger('app_logger')
@ -109,23 +109,23 @@ class FrontWindow(QMainWindow):
styles.append(infile.read()) styles.append(infile.read())
self.setStyleSheet(''.join(styles)) self.setStyleSheet(''.join(styles))
def set_timeout(self): # def set_timeout(self):
if self.active_timeout != 'True': # if self.active_timeout != 'True':
return # return
self.timeout = eval(self.timeout) # self.timeout = eval(self.timeout)
if not self.timeout: # if not self.timeout:
self.timeout = _DEFAULT_TIMEOUT # self.timeout = _DEFAULT_TIMEOUT
timer = QTimer(self) # timer = QTimer(self)
timer.timeout.connect(self.count_time) # timer.timeout.connect(self.count_time)
timer.start(1000) # timer.start(1000)
def count_time(self): # def count_time(self):
self.global_timer += 1 # self.global_timer += 1
if self.global_timer > self.timeout: # if self.global_timer > self.timeout:
self.global_timer = 0 # self.global_timer = 0
print('error esta linea no debia ejecutarse') # print('error esta linea no debia ejecutarse')
# safe_reconnect() # # safe_reconnect()
def close(self): def close(self):
dialog = self.dialog('confirm_exit', response=True) dialog = self.dialog('confirm_exit', response=True)
@ -151,14 +151,14 @@ class FrontWindow(QMainWindow):
v = eval(v) v = eval(v)
setattr(self, k, v) setattr(self, k, v)
def action_block(self): # def action_block(self):
safe_reconnect(self) # safe_reconnect(self)
def dialog_password_accept(self): # def dialog_password_accept(self):
self.connection() # self.connection()
def dialog_password_rejected(self): # def dialog_password_rejected(self):
self.connection() # self.connection()
def keyReleaseEvent(self, event): def keyReleaseEvent(self, event):
self._keyStates[event.key()] = False self._keyStates[event.key()] = False
@ -285,7 +285,6 @@ class FrontWindow(QMainWindow):
self.PartyConsumer = Model('party.consumer', self.ctx) self.PartyConsumer = Model('party.consumer', self.ctx)
if self._config['delivery_product.']: if self._config['delivery_product.']:
self._delivery_product = 0 self._delivery_product = 0
self.User = Model('res.user', self.ctx) self.User = Model('res.user', self.ctx)
self._user, = self.User.find([('login', '=', self.user)]) self._user, = self.User.find([('login', '=', self.user)])
self.Company = Model('company.company', self.ctx) self.Company = Model('company.company', self.ctx)
@ -348,7 +347,7 @@ class FrontWindow(QMainWindow):
self._payment_terms = self.PaymentTerm.find([ self._payment_terms = self.PaymentTerm.find([
('active', '=', True) ('active', '=', True)
], order=[('name', 'ASC')]) ], order=[('name', 'ASC')])
self.type_pos_user = self._context.get('type_pos_user') self.type_pos_user = self._user.get('type_pos_user')
if not self.type_pos_user: if not self.type_pos_user:
return 'user_without_permission' return 'user_without_permission'

View File

@ -50,20 +50,19 @@ _SALE_HISTORIC = [
class AppWindow(FrontWindow): class AppWindow(FrontWindow):
def __init__(self, connection, params, mode_conn): def __init__(self, context, params):
title = "PRESIK | SMART POS (○ " + mode_conn + ")" title = "PRESIK | SMART POS"
global CONNECTION # global CONNECTION
CONNECTION = connection # CONNECTION = connection
self.data_expenses = None self.data_expenses = None
self.mode_conn = mode_conn super(AppWindow, self).__init__(context, params, title)
super(AppWindow, self).__init__(connection, params, title)
self.payment_ctx = {} self.payment_ctx = {}
self.set_keys() self.set_keys()
time1 = time.time() time1 = time.time()
StackMessages(self) StackMessages(self)
self.stock_context = None self.stock_context = None
self._sale = {} self._sale = {}
self.ctx = self._context self.ctx = context
self.ctx['params'] = params self.ctx['params'] = params
response = self.load_modules() response = self.load_modules()
if response is not True: if response is not True:

View File

@ -15,7 +15,7 @@ MODELS = {
}, },
'res.user': { 'res.user': {
'rec_name': 'name', 'rec_name': 'name',
'fields': ['name', 'sale_device'] 'fields': ['name', 'sale_device', 'type_pos_user']
}, },
'product.category': { 'product.category': {
'rec_name': 'name', 'rec_name': 'name',
@ -80,7 +80,7 @@ MODELS = {
'rec_name': 'name', 'rec_name': 'name',
'fields': [ 'fields': [
'id', 'name', 'party', 'party.invoice_address', 'id', 'name', 'party', 'party.invoice_address',
'party.shipment_address' 'party.shipment_address'
] ]
}, },
'party.consumer': { 'party.consumer': {

View File

@ -0,0 +1,3 @@
<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg">
<circle cx="10" cy="10" r="5" stroke="green" stroke-width="3" fill="green" />
</svg>

After

Width:  |  Height:  |  Size: 150 B

3
app/share/circle_red.svg Normal file
View File

@ -0,0 +1,3 @@
<svg height="20" width="20" xmlns="http://www.w3.org/2000/svg">
<circle cx="10" cy="10" r="5" stroke="red" stroke-width="3" fill="red" />
</svg>

After

Width:  |  Height:  |  Size: 146 B

View File

@ -14,3 +14,16 @@ class DoInvoice(QThread):
def run(self): def run(self):
self.sigDoInvoice.emit() self.sigDoInvoice.emit()
class VerifyConn(QThread):
"""
Verfify connection network using a thread
"""
sigVerifyConn = Signal()
def __init__(self, parent):
QThread.__init__(self)
def run(self):
self.sigVerifyConn.emit()

View File

@ -1,11 +1,8 @@
[General] [General]
#Valid protocols: xml, json, local
protocol=xml
server=127.0.0.1 server=127.0.0.1
api_url=localhost:5070 port=8000
# options http or https # options http or https
mode=http mode=http
port=8000
database=DEMO database=DEMO
user=admin user=admin

17
pospro
View File

@ -27,23 +27,24 @@ class Client(object):
self.app = QApplication(sys.argv) self.app = QApplication(sys.argv)
def init_login(self): def init_login(self):
_file_config = 'config_pos_v2.ini' _file_config = 'config_pos.ini'
if args.o: if args.o:
_file_config = args.o _file_config = args.o
login = Login(file_config=_file_config) login = Login(file_config=_file_config)
while not login.connection: while not login.context:
login.run() login.run()
login.exec() login.exec()
return login.connection, login.params, login.mode_conn login.timer.stop()
return login.context, login.params
def main(self, conn, params, mode_conn): def main(self, context, params):
_ = main.AppWindow(conn, params, mode_conn) _ = main.AppWindow(context, params)
self.app.exec() self.app.exec()
client = Client() client = Client()
conn, params, mode_conn = client.init_login() context, params = client.init_login()
if conn: if context:
client.main(conn, params, mode_conn) client.main(context, params)
sys.exit() sys.exit()