From fcf3de6e810485cac2eb22fcc54f2a9f1ddb46fa Mon Sep 17 00:00:00 2001 From: Ted Lazaros Date: Mon, 18 Jun 2018 20:24:34 +0300 Subject: [PATCH] minor changes --- sofos/models/field.py | 4 ++ sofos/models/weekdaysfield.py | 2 +- sofos/qt/abstract_form.py | 88 +++++++++++++++++++++++++++++++++++ sofos/qt/fautoform.py | 4 +- sofos/qt/fautoformtable.py | 15 ++++-- sofos/qt/tweekdays.py | 4 +- sofos/qt/widget_selector.py | 34 ++++++++++++++ sofos/tests/test_qt.py | 6 +-- 8 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 sofos/qt/abstract_form.py diff --git a/sofos/models/field.py b/sofos/models/field.py index affd2b7..66e13ef 100644 --- a/sofos/models/field.py +++ b/sofos/models/field.py @@ -1,4 +1,5 @@ """Abstract class Field""" +from .. import qt class Field(): @@ -18,6 +19,9 @@ def __init__(self, label='', null=False, unique=False, default=None, self.max_length = 0 self.validators = [] + def qwl(self, parent): + return qt.widget_selector.wselector(self, parent) + @property def is_foreign_key(self): return self.__class__.__name__ == 'ForeignKey' diff --git a/sofos/models/weekdaysfield.py b/sofos/models/weekdaysfield.py index 8c2406a..a2c35e3 100644 --- a/sofos/models/weekdaysfield.py +++ b/sofos/models/weekdaysfield.py @@ -12,7 +12,7 @@ def __init__(self, label, max_length=30, null=False, unique=False, self.max_length = max_length def validate(self, values): - result = len(eval(values)) == 7 + result = len(eval(values.replace('!', "'"))) == 7 if result: return True, 'ok It is array' return False, 'Error, it is not an array' diff --git a/sofos/qt/abstract_form.py b/sofos/qt/abstract_form.py new file mode 100644 index 0000000..40e300f --- /dev/null +++ b/sofos/qt/abstract_form.py @@ -0,0 +1,88 @@ +import json +import PyQt5.QtWidgets as Qw +import PyQt5.QtCore as Qc +from sofos.qt import widget_selector as ws + + +class AbstractForm(Qw.QDialog): + def __init__(self, model, idv=None, parent=None): + super().__init__(parent) + self.setAttribute(Qc.Qt.WA_DeleteOnClose) + main_layout = Qw.QVBoxLayout(self) + self.fld_layout = Qw.QFormLayout() + main_layout.addLayout(self.fld_layout) + self.button_layout = Qw.QHBoxLayout() + main_layout.addLayout(self.button_layout) + self.add_buttons() + self.model = model + self.idv = idv or '' + self.widgets = {} + self.create_gui() + + def add_buttons(self): + self.bcancel = Qw.QPushButton(u'Cancel', self) + self.bsave = Qw.QPushButton(u'Save', self) + # Make them loose focus + self.bcancel.setFocusPolicy(Qc.Qt.NoFocus) + self.bsave.setFocusPolicy(Qc.Qt.NoFocus) + # Add them to buttonlayout + self.button_layout.addWidget(self.bcancel) + self.button_layout.addWidget(self.bsave) + # Make connections + self.bcancel.clicked.connect(self.close) + self.bsave.clicked.connect(self.save) + + def create_gui(self): + raise NotImplementedError + + def set_data(self): + pass + + def add_widget(self, fld_name, title, widget='str'): + self.widgets[fld_name] = ws.widget_by_name(widget, self) + no = len(self.widgets) + self.fld_layout.insertRow(no, Qw.QLabel(title), self.widgets[fld_name]) + + def get_data(self, typ=None): + data = {'id': self.idv} + for fld in self.widgets: + data[fld] = self.widgets[fld].get() + fdi = {'table': self.model, 'data': data} + if typ == 'json': + return json.dumps(fdi, ensure_ascii=False) + return fdi + + def close(self): + self.accept() + + def save(self): + print(self.get_data()) + + +class Test(AbstractForm): + def __init__(self): + super().__init__('tbl1', None, None) + self.setWindowTitle('This is a test') + + def create_gui(self): + self.add_widget('malakia', 'Μαλακία') + self.add_widget('dokimi', 'Πρόγραμμα', 'week_days') + self.add_widget('dat', 'Δοκιμή', 'date_or_empty') + self.add_widget('rrt', 'sfdsf', 'date') + dff = {'table-master': 'erg', + 'table-detail': 'ergd', + 'key': 'erg', + 'delete-master-id': 13, + 'save-master': {'id': '', 'epo': 'Lazaros'}, + 'save-detail': [{'id': '', 'r1': 'vl1'}, + {'id': '', 'r1': 'vl2'}], + 'delete-detail-ids': [12, 15] + } + + +if __name__ == '__main__': + import sys + app = Qw.QApplication(sys.argv) + mainWin = Test() + mainWin.show() + sys.exit(app.exec_()) diff --git a/sofos/qt/fautoform.py b/sofos/qt/fautoform.py index 86d1a5b..7a68748 100644 --- a/sofos/qt/fautoform.py +++ b/sofos/qt/fautoform.py @@ -54,7 +54,8 @@ def _create_fields(self): self.widgets['id'] = TIntegerKey(parent=self) self.widgets['id'].setVisible(False) for i, fld in enumerate(self.model.field_names()): - self.widgets[fld] = wselector(self.model.field_object(fld), self) + # self.widgets[fld] = wselector(self.model.field_object(fld), self) + self.widgets[fld] = self.model.field_object(fld).qwl(self) self.fld_layout.insertRow( i, Qw.QLabel(lbs[fld]), self.widgets[fld]) @@ -76,7 +77,6 @@ def get_data(self): def lock(self): for widget in self.widgets.values(): widget.setEnabled(False) - self.bsave.setText('Edit') self.locked = True diff --git a/sofos/qt/fautoformtable.py b/sofos/qt/fautoformtable.py index b00fec8..5859648 100644 --- a/sofos/qt/fautoformtable.py +++ b/sofos/qt/fautoformtable.py @@ -10,15 +10,22 @@ class FieldsToView(Qw.QDialog): def __init__(self, fldList, parent=None): super().__init__(parent) self.setWindowTitle('Select Visible Fields') - self.layout = Qw.QVBoxLayout(self) + layout = Qw.QVBoxLayout(self) + scroll = Qw.QScrollArea() + scroll.setWidgetResizable(True) + layout.addWidget(scroll) + scont = Qw.QWidget() + vlay = Qw.QVBoxLayout(scont) + vlay.setAlignment(Qc.Qt.AlignTop) + scroll.setWidget(scont) self.fields = fldList self.fld_widgets = {} for elm in fldList: self.fld_widgets[elm[0]] = Qw.QCheckBox(elm[1]) self.fld_widgets[elm[0]].setChecked(elm[2]) - self.layout.addWidget(self.fld_widgets[elm[0]]) + vlay.addWidget(self.fld_widgets[elm[0]]) btnlay = Qw.QHBoxLayout() - self.layout.addLayout(btnlay) + layout.addLayout(btnlay) btn = Qw.QPushButton('ok') bde = Qw.QPushButton('Set as Default') btnlay.addWidget(bde) @@ -213,7 +220,7 @@ def _strItem(self, strv): return item def _weekdayItem(self, strv): - weekdays_list = eval(strv) + weekdays_list = eval(strv.replace('!', "'")) items = [] for i, wday in enumerate(weekdays_list): if wday != '': diff --git a/sofos/qt/tweekdays.py b/sofos/qt/tweekdays.py index d3c1faf..59b3e16 100644 --- a/sofos/qt/tweekdays.py +++ b/sofos/qt/tweekdays.py @@ -214,7 +214,7 @@ def paintEvent(self, event=None): def get(self, strVal=True): if strVal: - return str(self.grid).replace("'", '"') + return str(self.grid).replace("'", '"').replace('"', '!') else: return self.grid @@ -224,7 +224,7 @@ def set(self, darray=None): if darray is None or darray == '': darr = '["", "", "", "", "", "", ""]' else: - darr = str(darray) + darr = str(darray).replace('!', "'") tmparr = eval(darr) if len(tmparr) == 7: self.grid = tmparr diff --git a/sofos/qt/widget_selector.py b/sofos/qt/widget_selector.py index 3bd4715..c1bcfdf 100644 --- a/sofos/qt/widget_selector.py +++ b/sofos/qt/widget_selector.py @@ -48,3 +48,37 @@ def wselector(field, parent): return TTextLine(parent=parent) else: return TTextLine(parent=parent) + + +def widget_by_name(fld_name, parent, ftable=None): + """Factory to create widgets + + :param field: object field + :param parent: parent object + + :return: A customized qt widget + """ + if fld_name == 'int': + return TInteger(parent=parent) + elif fld_name == 'text_button': + return TTextButton(None, ftable, parent) + elif fld_name == 'combo': + return TComboDB(None, ftable, parent) + elif fld_name == 'check_box': + return TCheckbox(parent=parent) + elif fld_name == 'date': + return TDate(parent=parent) + elif fld_name == 'date_or_empty': + return TDateEmpty(parent=parent) + elif fld_name == 'num': + return TNumeric(parent=parent) + elif fld_name == 'text_num': + return TTextlineNum(parent=parent) + elif fld_name == 'text': + return TText(parent=parent) + elif fld_name == 'week_days': + return TWeekdays(parent=parent) + elif fld_name == 'str': + return TTextLine(parent=parent) + else: + return TTextLine(parent=parent) diff --git a/sofos/tests/test_qt.py b/sofos/tests/test_qt.py index 8e38f4f..9f36c27 100644 --- a/sofos/tests/test_qt.py +++ b/sofos/tests/test_qt.py @@ -115,14 +115,14 @@ def test_TYesNoCombo_01(self): def test_TWeekdays_01(self): twd = qt.TWeekdays(None) - self.assertEqual(twd.get(), '["", "", "", "", "", "", ""]') + self.assertEqual(twd.get(), '[!!, !!, !!, !!, !!, !!, !!]') # twd = qt.TWeekdays() # self.assertEqual(twd.get(), '[1, 1, 1, 1, 1, 0, 0]') # self.assertEqual(twd.get(False), [1, 1, 1, 1, 1, 0, 0]) twd.set([1, 2]) - self.assertEqual(twd.get(), '["", "", "", "", "", "", ""]') + self.assertEqual(twd.get(), '[!!, !!, !!, !!, !!, !!, !!]') twd.set5days() - self.assertEqual(twd.get(), '["08:00-16:00", "08:00-16:00", "08:00-16:00", "08:00-16:00", "08:00-16:00", "", ""]') + self.assertEqual(twd.get(), '[!08:00-16:00!, !08:00-16:00!, !08:00-16:00!, !08:00-16:00!, !08:00-16:00!, !!, !!]') QTest.mouseClick(twd, Qc.Qt.RightButton) # QTest.mouseClick(twd, Qc.Qt.LeftButton)