Exemple #1
0
    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
Exemple #3
0
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)
Exemple #4
0
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
Exemple #5
0
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))
Exemple #6
0
 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()),
         )