def readMovieNode(self, element): def getText(node): child = node.firstChild() text = "" while not child.isNull(): if child.nodeType() == QtXml.QDomNode.TextNode: text += child.toText().data() child = child.nextSibling() return text.strip() year = int(element.attribute("YEAR")) minutes = int(element.attribute("MINUTES")) ymd = element.attribute("ACQUIRED").split("-") if len(ymd) != 3: raise ValueError("invalid acquired date {}".format( element.attribute("ACQUIRED"))) acquired = QtCore.QDate(int(ymd[0]), int(ymd[1]), int(ymd[2])) title = notes = None node = element.firstChild() while title is None or notes is None: if node.isNull(): raise ValueError("missing title or notes") if node.toElement().tagName() == "TITLE": title = getText(node) elif node.toElement().tagName() == "NOTES": notes = getText(node) node = node.nextSibling() if not title: raise ValueError("missing title") self.add(Movie(title, year, minutes, acquired, decodedNewlines(notes)))
def startElement(self, namespaceURI, localName, qName, attributes): if qName == "MOVIE": self.clear() self.year = int(attributes.value("YEAR")) self.minutes = int(attributes.value("MINUTES")) ymd = attributes.value("ACQUIRED").split("-") if len(ymd) != 3: raise ValueError("invalid acquired date {}".format( attributes.value("ACQUIRED"))) self.acquired = QtCore.QDate(int(ymd[0]), int(ymd[1]), int(ymd[2])) elif qName in ("TITLE", "NOTES"): self.text = "" return True
def _date_to_qdate(task_date: Optional[date]) -> QtCore.QDate: if task_date is None: return QtCore.QDate() if isinstance(task_date, QtCore.QDate): return task_date return QtCore.QDate(task_date.year, task_date.month, task_date.day)
def argument_widget_factory(component: str, title: str = None, optional: bool = True) -> QtWidgets.QWidget: """ Factory function for generating various subclasses of instance `PySide6.QtWidgets.QWidgets` pre-configured for user-input. Parameters ---------- 1. **components** : ``str`` Allowable values: `date`, `decimal`, `currency`, `integer`, `select`, `flag`, `symbols`, `symbol`. If `components=None`, a `PySide6.QtWidgets.QWidget` will be returned. """ widget = atomic_widget_factory(None, None) widget.setObjectName('input-container') if optional: toggle_widget = QtWidgets.QCheckBox() toggle_widget.setObjectName('input-toggle') toggle_widget.setSizePolicy(QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)) label_widget = QtWidgets.QLabel(title) label_widget.setAlignment(QtCore.Qt.AlignBottom) label_widget.setObjectName('input-label') if component == 'date': main_widget = QtWidgets.QDateEdit() main_widget.setDate(QtCore.QDate.currentDate()) main_widget.setMaximumDate(QtCore.QDate.currentDate()) main_widget.setMinimumDate(QtCore.QDate( constants.constants['PRICE_YEAR_CUTOFF'], 1, 1)) main_widget.setObjectName(component) main_widget.setEnabled(False) elif component == 'decimal': main_widget = QtWidgets.QLineEdit() main_widget.setObjectName(component) main_widget.setValidator( QtGui.QDoubleValidator(-100, 100, 5, main_widget)) main_widget.setEnabled(False) main_widget.setSizePolicy(QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)) elif component == 'currency': main_widget = QtWidgets.QLineEdit() main_widget.setObjectName(component) # https://stackoverflow.com/questions/354044/what-is-the-best-u-s-currency-regex main_widget.setValidator(QtGui.QRegularExpressionValidator( r"[+-]?[0-9]{1,3}(?:,?[0-9]{3})*(?:\.[0-9]{2})", main_widget)) main_widget.setEnabled(False) main_widget.setSizePolicy(QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)) elif component == 'integer': main_widget = QtWidgets.QLineEdit() main_widget.setObjectName(component) main_widget.setValidator(QtGui.QIntValidator(0, 100, main_widget)) main_widget.setEnabled(False) main_widget.setSizePolicy(QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)) elif component == 'select': return None elif component == 'flag': main_widget = QtWidgets.QRadioButton(title) main_widget.setObjectName(component) main_widget.setSizePolicy(QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)) elif component == 'symbols': main_widget = QtWidgets.QLineEdit() main_widget.setObjectName(component) main_widget.setMaxLength(100) main_widget.setSizePolicy(QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)) elif component == 'symbol': main_widget = QtWidgets.QLineEdit() main_widget.setObjectName(component) main_widget.setMaxLength(100) main_widget.setSizePolicy(QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)) main_widget.setValidator( QtGui.QRegularExpressionValidator(r"[A-Za-z]+", main_widget)) else: main_widget = QtWidgets.QWidget() widget.layout().addWidget(label_widget) widget.layout().addWidget(main_widget) if optional: toggle_widget.stateChanged.connect( lambda: main_widget.setEnabled((not main_widget.isEnabled()))) widget.layout().addWidget(toggle_widget) return widget
def test_sanitize_sub_task() -> None: # noinspection PyTypeChecker sub_task = SubTask("Name", QtCore.QDate(2001, 12, 24)) assert sanitize_sub_task(sub_task, Importance.Important, None) \ == Task("Name", importance=Importance.Important, due=date(2001, 12, 24))
def loadText(self): error = None fh = None try: fh = open(self.__fname, "rU", encoding=CODEC) self.clear(False) lino = 0 while True: title = year = minutes = acquired = notes = None line = fh.readline() if not line: break lino += 1 if not line.startswith("{{MOVIE}}"): raise ValueError("no movie record found") else: title = line[len("{{MOVIE}}"):].strip() line = fh.readline() if not line: raise ValueError("premature end of file") lino += 1 parts = line.split(" ") if len(parts) != 3: raise ValueError("invalid numeric data") year = int(parts[0]) minutes = int(parts[1]) ymd = parts[2].split("-") if len(ymd) != 3: raise ValueError("invalid acquired date") acquired = QtCore.QDate(int(ymd[0]), int(ymd[1]), int(ymd[2])) line = fh.readline() if not line: raise ValueError("premature end of file") lino += 1 if line != "{NOTES}\n": raise ValueError("notes expected") notes = "" while True: line = fh.readline() if not line: raise ValueError("missing endmovie marker") lino += 1 if line == "{{ENDMOVIE}}\n": if (title is None or year is None or minutes is None or acquired is None or notes is None): raise ValueError("incomplete record") self.add( Movie(title, year, minutes, acquired, notes.strip())) break else: notes += line except (IOError, OSError, ValueError) as e: error = "Failed to load: {} on line {}".format(e, lino) finally: if fh is not None: fh.close() if error is not None: return False, error self.__dirty = False return ( True, "Loaded {} movie records from {}".format( len(self.__movies), QtCore.QFileInfo(self.__fname).fileName()), )