def createReference(self):
        sections = self.reference.allSections()
        progressDlg = Gui.ProgressDialog(self.tr("Updating reference"),
                            self.tr("Cancel"), len(sections), self.parent())

        for columnName in sections:
            progressDlg.step()
            if progressDlg.wasCanceled():
                break

            refSection = self.reference.section(columnName)
            if isinstance(refSection, CrossReferenceSection):
                rel = refSection.model.relationModel(1)
                for i in range(rel.rowCount()):
                    data = rel.data(rel.index(i, rel.fieldIndex('value')))
                    parentId = rel.data(rel.index(i, rel.fieldIndex('id')))
                    query = QSqlQuery(self.db)
                    sql = "SELECT DISTINCT %s FROM coins WHERE %s<>'' AND %s IS NOT NULL AND %s=?" % (columnName, columnName, columnName, refSection.parentName)
                    query.prepare(sql)
                    query.addBindValue(data)
                    query.exec_()
                    refSection.fillFromQuery(parentId, query)
            else:
                sql = "SELECT DISTINCT %s FROM coins WHERE %s<>'' AND %s IS NOT NULL" % (columnName, columnName, columnName)
                query = QSqlQuery(sql, self.db)
                refSection.fillFromQuery(query)

        progressDlg.reset()
 def getImage(self, img_id):
     query = QSqlQuery(self.database())
     query.prepare("SELECT image FROM images WHERE id=?")
     query.addBindValue(img_id)
     query.exec_()
     if query.first():
         return query.record().value(0)
    def insertRecord(self, row, record):
        self._updateRecord(record)
        record.setNull('id')  # remove ID value from record
        record.setValue('createdat', record.value('updatedat'))

        record.remove(record.indexOf('image_id'))
        image = record.value('image')
        if image:
            query = QSqlQuery(self.database())
            query.prepare("INSERT INTO images (image) VALUES (?)")
            query.addBindValue(image)
            query.exec_()

            img_id = query.lastInsertId()
            record.setValue('image', img_id)
        else:
            record.setNull('image')

        for i in range(4):
            field = "photo%d" % (i + 1)
            photo = record.value(field)
            if not photo.isNull():
                if photo.changed:
                    photo.save()
                photo.image = QtGui.QImage()  # free image
                record.setValue(field, photo.id_)
            else:
                record.setNull(field)

        return super(CollectionModel, self).insertRecord(row, record)
예제 #4
0
    def _load(self):
        self.clear()
        count = 0

        query = QSqlQuery(self.db)
        query.prepare("SELECT COUNT(DISTINCT position) "
                      "FROM treeparam WHERE pageid=?")
        query.addBindValue(self.pageId)
        query.exec_()
        if query.first():
            count = query.record().value(0)

        if count:
            for _ in range(count):
                self._params.append([])

            query = QSqlQuery(self.db)
            query.prepare("SELECT * FROM treeparam WHERE pageid=?")
            query.addBindValue(self.pageId)
            query.exec_()

            while query.next():
                record = query.record()
                position = record.value('position')
                fieldId = record.value('fieldid')
                self._params[position].append(self.fields.field(fieldId))
예제 #5
0
파일: ActModel.py 프로젝트: WalterCM/aktor
    def updateEquipment(self, equipmentLayout):
        if not self.db.open():
            return -1

        self.devicesInfo = []
        for serie in equipmentLayout.getSelectedSeries():
            query = QSqlQuery()
            query.prepare("SELECT d.description, " +
                                 "d.brand, " +
                                 "d.model, " +
                                 "i.serie, " +
                                 "i.id " +
                           "FROM Devices AS d " +
                           "INNER JOIN Items AS i " +
                           "ON d.id = i.device_id " +
                           "WHERE i.serie = ?")
            query.addBindValue(serie)
            query.exec_()
            while query.next():
                device = {}
                self.devicesInfo.append(device)
                device["name"] = str(query.value(0))
                device["brand"] = str(query.value(1))
                device["model"] = str(query.value(2))
                device["serie"] = str(query.value(3))
                device["id"] = str(query.value(4))

        self.db.close()
예제 #6
0
 def setValue(self, Id, Newvalue, field):
     query = QSqlQuery()
     queryText = 'update vgenesdb set ' + field + ' = ? where ID = ?'
     query.prepare(queryText)
     query.addBindValue(Newvalue)
     query.addBindValue(Id)
     return query.exec_()
예제 #7
0
 def removeRow(self, row):
     record = super().record(row)
     
     ids = []
     for field in ['obverseimg', 'reverseimg', 'edgeimg',
                   'photo1', 'photo2', 'photo3', 'photo4']:
         value = record.value(field)
         if value:
             ids.append(value)
             
     if ids:
         ids_sql = '(' + ','.join('?' * len(ids)) + ')'
         
         query = QSqlQuery(self.database())
         query.prepare("DELETE FROM photos WHERE id IN " + ids_sql)
         for id_ in ids:
             query.addBindValue(id_)
         query.exec_()
         
     value = record.value('image')
     if value:
         query = QSqlQuery(self.database())
         query.prepare("DELETE FROM images WHERE id=?")
         query.addBindValue(value)
         query.exec_()
         
     return super().removeRow(row)
예제 #8
0
 def savePositions(self, pages):
     for position, page in enumerate(pages):
         query = QSqlQuery(self.db)
         query.prepare("UPDATE pages SET position=? WHERE id=?")
         query.addBindValue(position)
         query.addBindValue(page.id)
         query.exec_()
예제 #9
0
    def removePage(self, page):
        page.listParam.remove()
        page.treeParam.remove()

        query = QSqlQuery(self.db)
        query.prepare("DELETE FROM pages WHERE id=?")
        query.addBindValue(page.id)
        query.exec_()
예제 #10
0
 def setState(self, item_id, state):
     if not self.db.open():
         return -1
     query = QSqlQuery()
     query.prepare("UPDATE Items SET state = ? WHERE id = ?")
     query.addBindValue(state)
     query.addBindValue(item_id)
     self.db.close
     return query.exec_()
    def remove(self):
        query = QSqlQuery(self.db)
        query.prepare("DELETE FROM lists WHERE pageid=?")
        query.addBindValue(self.page.id)
        query.exec_()

        query = QSqlQuery(self.db)
        query.prepare("DELETE FROM filters WHERE pageid=?")
        query.addBindValue(self.page.id)
        query.exec_()
 def fillFromQuery(self, query):
     while query.next():
         value = query.record().value(0)
         fillQuery = QSqlQuery(self.db)
         fillQuery.prepare("INSERT INTO %s (value) "
                       "SELECT ? "
                       "WHERE NOT EXISTS (SELECT 1 FROM %s WHERE value=?)" %
                                                     (self.name, self.name))
         fillQuery.addBindValue(value)
         fillQuery.addBindValue(value)
         fillQuery.exec_()
    def saveSort(self, sort):
        if self.sort != sort:
            self.sort = sort

            query = QSqlQuery(self.db)
            query.prepare("UPDATE sections SET sort=? WHERE name=?")
            query.addBindValue(int(sort))
            query.addBindValue(self.name)
            query.exec_()

        self.setSort()
    def save(self):
        self.db.transaction()

        for key, value in self.items():
            # TODO: Insert value if currently not present
            query = QSqlQuery(self.db)
            query.prepare("UPDATE settings SET value=? WHERE title=?")
            query.addBindValue(str(value))
            query.addBindValue(key)
            query.exec_()

        self.db.commit()
예제 #15
0
    def update(self):
        self._begin()

        self.db.transaction()

        sql = "ALTER TABLE lists ADD COLUMN sortorder INTEGER"
        QSqlQuery(sql, self.db)

        sql = "ALTER TABLE filters ADD COLUMN revert INTEGER"
        QSqlQuery(sql, self.db)

        query = QSqlQuery(self.db)
        query.prepare("""INSERT INTO settings (title, value) VALUES (?, ?)""")
        query.addBindValue('Type')
        query.addBindValue(self.collection.settings['Type'])
        query.exec_()

        sql = """ALTER TABLE images RENAME TO photos"""
        QSqlQuery(sql, self.db)

        sql = """CREATE TABLE images (
                    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                    image BLOB)"""
        QSqlQuery(sql, self.db)

        query = QSqlQuery("SELECT id, image FROM coins", self.db)
        while query.next():
            self._updateRecord()

            record = query.record()

            if not record.isNull('image'):
                insert_query = QSqlQuery(self.db)
                insert_query.prepare("INSERT INTO images (image) VALUES (?)")
                insert_query.addBindValue(record.value('image'))
                insert_query.exec_()
                img_id = insert_query.lastInsertId()
            else:
                img_id = None

            update_query = QSqlQuery(self.db)
            update_query.prepare("UPDATE coins SET image=? WHERE id=?")
            update_query.addBindValue(img_id)
            update_query.addBindValue(record.value('id'))
            update_query.exec_()

        self.collection.settings['Version'] = 3
        self.collection.settings.save()

        self.db.commit()

        self._finish()
    def save(self):
        if self.cleared or self.isNull():
            self.remove()
        else:
            if not self.file:
                self.file = str(uuid.uuid1()) + '.jpg'

                if self.id_:
                    query = QSqlQuery(self.db)
                    query.prepare("UPDATE photos SET file=?, url=? WHERE id=?")
                    query.addBindValue(self.file)
                    query.addBindValue(self.url)
                    query.addBindValue(self.id_)
                    query.exec_()
                else:
                    query = QSqlQuery(self.db)
                    query.prepare("INSERT INTO photos (file, url) VALUES (?, ?)")
                    query.addBindValue(self.file)
                    query.addBindValue(self.url)
                    query.exec_()

                    self.id_ = query.lastInsertId()

            if not self.image.isNull():
                file_name = self._generateFileName(self.file, True)
                self.image.save(file_name)
    def getSort(self):
        query = QSqlQuery(self.db)
        query.prepare("SELECT sort FROM sections WHERE name=?")
        query.addBindValue(self.name)
        query.exec_()
        if query.first():
            data = query.record().value(0)
            if data:
                self.sort = bool(data)
            else:
                self.sort = False
        query.clear()

        return self.sort
예제 #18
0
    def _load(self):
        query = QSqlQuery(self.db)
        query.prepare("SELECT * FROM statistics WHERE pageid=?")
        query.addBindValue(self.pageId)
        query.exec_()
        if query.first():
            record = query.record()
            self.__setitem__('showed', bool(record.value('showed')))
            self.__setitem__('chart', record.value('chart'))
            self.__setitem__('fieldid', record.value('fieldid'))
            self.__setitem__('subfieldid', record.value('subfieldid'))
            self.__setitem__('items', record.value('items'))
            self.__setitem__('period', record.value('period'))
            self.__setitem__('color', bool(record.value('color')))

        self.setAutoSave(True)
    def remove(self):
        if self.file:
            file_name = self._generateFileName(self.file)
            try:
                os.remove(file_name)
            except FileNotFoundError:
                pass
            self.file = None

        if self.id_:
            query = QSqlQuery(self.db)
            query.prepare("DELETE FROM photos WHERE id=?")
            query.addBindValue(self.id_)
            query.exec_()

        self.id_ = None
예제 #20
0
    def save(self):
        self.db.transaction()

        self.remove()

        for position, param in enumerate(self.params()):
            for field in param:
                query = QSqlQuery(self.db)
                query.prepare("INSERT INTO treeparam (pageid, fieldid,"
                              " position) VALUES (?, ?, ?)")
                query.addBindValue(self.pageId)
                query.addBindValue(field.id)
                query.addBindValue(position)
                query.exec_()

        self.db.commit()
    def create(self, db=QSqlDatabase()):
        db.transaction()

        sql = "CREATE TABLE %s (\
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\
            value TEXT, icon BLOB)" % self.name
        QSqlQuery(sql, db)

        query = QSqlQuery(db)
        query.prepare("INSERT INTO sections (name, letter)\
            VALUES (?, ?)")
        query.addBindValue(self.name)
        query.addBindValue(self.letter)
        query.exec_()

        db.commit()
    def removeRow(self, row):
        record = self.record(row)

        img_id = record.value('image')
        if img_id:
            query = QSqlQuery(self.database())
            query.prepare("DELETE FROM images WHERE id=?")
            query.addBindValue(img_id)
            query.exec_()

        for i in range(4):
            field = "photo%d" % (i + 1)
            photo = record.value(field)
            if photo:
                photo.remove()

        return super(CollectionModel, self).removeRow(row)
    def create(db=QSqlDatabase()):
        db.transaction()

        sql = """CREATE TABLE settings (
            title CHAR NOT NULL UNIQUE,
            value CHAR)"""
        QSqlQuery(sql, db)

        for key, value in CollectionSettings.Default.items():
            query = QSqlQuery(db)
            query.prepare("""INSERT INTO settings (title, value)
                    VALUES (?, ?)""")
            query.addBindValue(key)
            query.addBindValue(str(value))
            query.exec_()

        db.commit()
예제 #24
0
 def getImage(self, img_id):
     """Read the image data/fileName from the DB."""
     query = QSqlQuery(self.database())
     query.prepare("SELECT image FROM photos WHERE id=?")
     query.addBindValue(img_id)
     query.exec_()
     if query.first():
         imageOrFile = query.record().value(0)
         if imageOrFile[:7] == 'file://':
             try:
                 imageFile = open(imageOrFile[7:], "rb")
             except IOError:
                 imageFile = open(self.badFileNameImage, "rb")
             image = QtCore.QByteArray(imageFile.read())
             imageFile.close()
             return image, imageOrFile
         else:
             return imageOrFile, None
    def create(self, collection):
        self.db.transaction()

        sql = """CREATE TABLE description (
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            title TEXT,
            description TEXT,
            author TEXT)"""
        QSqlQuery(sql, self.db)

        query = QSqlQuery(self.db)
        query.prepare("""INSERT INTO description (title, description, author)
                VALUES (?, ?, ?)""")
        query.addBindValue(collection.getCollectionName())
        query.addBindValue('')
        query.addBindValue('')
        query.exec_()

        self.db.commit()
    def __init__(self, id_, model):
        QtCore.QObject.__init__(self, model)
        self.model = model
        self.db = model.database()

        self.id_ = id_
        self.file = None
        self.url = None
        self.workingDir = model.workingDir
        self.collectionName = model.collectionName
        self.changed = False
        self.cleared = False
        self.image = QtGui.QImage()

        query = QSqlQuery(self.db)
        query.prepare("SELECT * FROM photos WHERE id=?")
        query.addBindValue(self.id_)
        query.exec_()
        if query.first():
            self.file = query.record().value('file')
            self.url = query.record().value('url')
예제 #27
0
    def update(self):
        self._begin()

        self.db.transaction()

        fields = ['ruler', 'region']
        for field in fields:
            self._updateRecord()

            fieldDesc = getattr(self.collection.fields, field)
            fieldDesc.enabled = False
            query = QSqlQuery(self.db)
            query.prepare("INSERT INTO fields (id, title, enabled)"
                          " VALUES (?, ?, ?)")
            query.addBindValue(fieldDesc.id)
            query.addBindValue(fieldDesc.title)
            query.addBindValue(int(fieldDesc.enabled))
            query.exec_()

            sql = "ALTER TABLE coins ADD COLUMN %s TEXT" % field
            QSqlQuery(sql, self.db)

            self.collection.fields.userFields.append(fieldDesc)

        self.progressDlg.setLabelText(self.tr("Saving..."))

        sql = "UPDATE photos SET title=NULL"
        QSqlQuery(sql, self.db)

        self.collection.settings['Version'] = 4
        self.collection.settings.save()

        self.db.commit()

        self._finish()
예제 #28
0
    def update(self):
        self._begin()

        self.db.transaction()

        fields = ('category', 'sort_id')
        for field in fields:
            self._updateRecord()

            fieldDesc = getattr(self.collection.fields, field)
            fieldDesc.enabled = False
            query = QSqlQuery(self.db)
            query.prepare("INSERT INTO fields (id, title, enabled)"
                          " VALUES (?, ?, ?)")
            query.addBindValue(fieldDesc.id)
            query.addBindValue(fieldDesc.title)
            query.addBindValue(int(False))
            query.exec_()

            sql = "ALTER TABLE coins ADD COLUMN %s %s" % (field, Type.toSql(fieldDesc.type))
            QSqlQuery(sql, self.db)

            self.collection.fields.userFields.append(fieldDesc)

        self._updateRecord()

        sql = "UPDATE coins SET sort_id = id"
        QSqlQuery(sql, self.db)

        self.collection.settings['Version'] = 6
        self.collection.settings.save()

        self.db.commit()

        self._finish()
예제 #29
0
    def update(self):
        self._begin()

        self.db.transaction()

        fields = ('emitent', 'signaturetype', 'signature', 'signatureimg',
                  'address', 'latitude', 'longitude')
        for field in fields:
            self._updateRecord()

            fieldDesc = getattr(self.collection.fields, field)
            fieldDesc.enabled = False
            query = QSqlQuery(self.db)
            query.prepare("INSERT INTO fields (id, title, enabled)"
                          " VALUES (?, ?, ?)")
            query.addBindValue(fieldDesc.id)
            query.addBindValue(fieldDesc.title)
            query.addBindValue(int(False))
            query.exec_()

            sql = "ALTER TABLE coins ADD COLUMN %s %s" % (field, Type.toSql(fieldDesc.type))
            QSqlQuery(sql, self.db)

            self.collection.fields.userFields.append(fieldDesc)

        self._updateRecord()

        self.collection.settings['Version'] = 7
        self.collection.settings.save()

        self.db.commit()

        self._finish()
예제 #30
0
 def fillFromQuery(self, parentId, query):
     while query.next():
         value = query.record().value(0)
         fillQuery = QSqlQuery(self.db)
         fillQuery.prepare("INSERT INTO %s (value, parentid) "
                     "SELECT ?, ? "
                     "WHERE NOT EXISTS "
                     "(SELECT 1 FROM %s WHERE value=? AND parentid=?)" %
                                         (self.table_name, self.table_name))
         fillQuery.addBindValue(value)
         fillQuery.addBindValue(parentId)
         fillQuery.addBindValue(value)
         fillQuery.addBindValue(parentId)
         fillQuery.exec_()
예제 #31
0
    def create(self, db=QSqlDatabase()):
        db.transaction()

        sql = "CREATE TABLE %s (\
            id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\
            parentid INTEGER NOT NULL,\
            value TEXT, icon BLOB)" % self.name
        QSqlQuery(sql, db)

        query = QSqlQuery(db)
        query.prepare("INSERT INTO sections (name, letter, parent)\
            VALUES (?, ?, ?)")
        query.addBindValue(self.name)
        query.addBindValue(self.letter)
        query.addBindValue(self.parentName)
        query.exec_()

        db.commit()
예제 #32
0
def main():
    db = QSqlDatabase.addDatabase("QSQLITE")

    db.setDatabaseName("foo.sqlite")
    if not db.open():
        sys.exit(-1)

    lib = CDLL(os.path.join(CURRENT_DIR, "libqsqlite.so"))
    lib.enable_extension(c_void_p(sip.unwrapinstance(db.driver()).__int__()),
                         True)
    load_spatialite()

    query = QSqlQuery()

    query.exec_("CREATE TABLE my_line(id INTEGER PRIMARY KEY)")
    query.exec_(
        """SELECT AddGeometryColumn("my_line","geom" , 4326, "LINESTRING", 2)"""
    )

    polygon_wkt = "POLYGON ((11 50,11 51,12 51,12 50,11 50))"

    XA = 11
    YA = 52
    XB = 12
    YB = 49

    line_wkt = "LINESTRING({0} {1}, {2} {3})".format(XA, YA, XB, YB)

    query.prepare("""INSERT INTO my_line VALUES (?,GeomFromText(?, 4326))""")

    query.addBindValue(1)
    query.addBindValue(line_wkt)
    query.exec_()

    query.prepare(
        """SELECT astext(st_intersection(geom, GeomFromText(?, 4326))) from my_line WHERE st_intersects(geom, GeomFromText(?, 4326))"""
    )
    query.addBindValue(polygon_wkt)
    query.addBindValue(polygon_wkt)
    query.exec_()

    while query.next():
        for i in range(query.record().count()):
            print(query.value(i))
예제 #33
0
    def insertRecord(self, row, record):
        self._updateRecord(record)
        record.setNull('id')  # remove ID value from record
        record.setValue('createdat', record.value('updatedat'))

        for field in [
                'obverseimg', 'reverseimg', 'edgeimg', 'photo1', 'photo2',
                'photo3', 'photo4'
        ]:
            value = record.value(field)
            if value:
                query = QSqlQuery(self.database())
                query.prepare(
                    "INSERT INTO photos (title, image) VALUES (?, ?)")
                query.addBindValue(record.value(field + '_title'))
                query.addBindValue(value)
                query.exec_()

                img_id = query.lastInsertId()
            else:
                img_id = None

            record.setValue(field, img_id)
            record.remove(record.indexOf(field + '_id'))
            record.remove(record.indexOf(field + '_title'))

        value = record.value('image')
        if value:
            query = QSqlQuery(self.database())
            query.prepare("INSERT INTO images (image) VALUES (?)")
            query.addBindValue(value)
            query.exec_()

            img_id = query.lastInsertId()
        else:
            img_id = None
        record.setValue('image', img_id)
        record.remove(record.indexOf('image_id'))

        return super(CollectionModel, self).insertRecord(row, record)
예제 #34
0
    def db_pip_update_insert(self):
        from PyQt5 import QtSql
        from PyQt5.QtSql import QSqlQuery

        database = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        database.setDatabaseName('patata.db')

        if database.open():
            print("OK")
        else:
            print("连接数据库失败!")

        insert_sql = 'insert into pip_install_info values (?,?,?)'
        query = QSqlQuery()
        query.prepare(insert_sql)
        query.addBindValue(4)
        query.addBindValue('test3')
        query.addBindValue(1)
        if not query.exec_():
            print(query.lastError())
        else:
            print('inserted')
    def create(db=QSqlDatabase()):
        db.transaction()

        sql = """CREATE TABLE fields (
            id INTEGER NOT NULL PRIMARY KEY,
            title TEXT,
            enabled INTEGER)"""
        QSqlQuery(sql, db)

        fields = CollectionFieldsBase()

        for field in fields:
            query = QSqlQuery(db)
            query.prepare("""INSERT INTO fields (id, title, enabled)
                VALUES (?, ?, ?)""")
            query.addBindValue(field.id)
            query.addBindValue(field.title)
            enabled = field in fields.userFields
            query.addBindValue(int(enabled))
            query.exec_()

        db.commit()
예제 #36
0
    def update(self):
        self._begin()

        self.db.transaction()

        fields = ('category', 'sort_id')
        for field in fields:
            self._updateRecord()

            fieldDesc = getattr(self.collection.fields, field)
            fieldDesc.enabled = False
            query = QSqlQuery(self.db)
            query.prepare("INSERT INTO fields (id, title, enabled)"
                          " VALUES (?, ?, ?)")
            query.addBindValue(fieldDesc.id)
            query.addBindValue(fieldDesc.title)
            query.addBindValue(int(False))
            query.exec_()

            sql = "ALTER TABLE coins ADD COLUMN %s %s" % (
                field, Type.toSql(fieldDesc.type))
            QSqlQuery(sql, self.db)

            self.collection.fields.userFields.append(fieldDesc)

        self._updateRecord()

        sql = "UPDATE coins SET sort_id = id"
        QSqlQuery(sql, self.db)

        self.collection.settings['Version'] = 6
        self.collection.settings.save()

        self.db.commit()

        self._finish()
예제 #37
0
    def update(self):
        self._begin()

        self.db.transaction()

        fields = ['quantity', 'url', 'barcode']
        for field in fields:
            fieldDesc = getattr(self.collection.fields, field)
            fieldDesc.enabled = True
            query = QSqlQuery(self.db)
            query.prepare("""INSERT INTO fields (id, title, enabled)
                VALUES (?, ?, ?)""")
            query.addBindValue(fieldDesc.id)
            query.addBindValue(fieldDesc.title)
            query.addBindValue(int(fieldDesc.enabled))
            query.exec_()

            self.collection.fields.userFields.append(fieldDesc)

        sql = """ALTER TABLE coins RENAME TO tmp_coins"""
        QSqlQuery(sql, self.db)

        self.collection.createCoinsTable()

        query = QSqlQuery("SELECT * FROM tmp_coins", self.db)
        while query.next():
            self._updateRecord()

            record = query.record()

            imgIds = {}
            fields = [
                'obverseimg', 'reverseimg', 'edgeimg', 'photo1', 'photo2',
                'photo3', 'photo4'
            ]
            for field in fields:
                if not record.isNull(field):
                    image_query = QSqlQuery(self.db)
                    image_query.prepare("""INSERT INTO images (title, image)
                            VALUES (?, ?)""")
                    fieldDesc = getattr(self.collection.fields, field)
                    image_query.addBindValue(fieldDesc.title)
                    image_query.addBindValue(record.value(field))
                    image_query.exec_()
                    imgIds[field] = image_query.lastInsertId()
                else:
                    imgIds[field] = None

            coin_query = QSqlQuery(self.db)
            coin_query.prepare("""INSERT INTO coins (title, value, unit,
                        country, year, period, mint, mintmark, issuedate, type,
                        series, subjectshort, status, material, fineness,
                        shape, diameter, thickness, weight, grade, edge,
                        edgelabel, obvrev, quality, mintage, dateemis,
                        catalognum1, catalognum2, catalognum3, catalognum4,
                        rarity, price1, price2, price3, price4, variety,
                        obversevar, reversevar, edgevar, paydate, payprice,
                        totalpayprice, saller, payplace, payinfo, saledate,
                        saleprice, totalsaleprice, buyer, saleplace, saleinfo,
                        note, image, obverseimg, obversedesign,
                        obversedesigner, reverseimg, reversedesign,
                        reversedesigner, edgeimg, subject, photo1, photo2,
                        photo3, photo4, defect, storage, features, createdat,
                        updatedat)
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
                        ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
                        ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
                        ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""")
            coin_query.addBindValue(record.value('title'))
            coin_query.addBindValue(record.value('value'))
            coin_query.addBindValue(record.value('unit'))
            coin_query.addBindValue(record.value('country'))
            coin_query.addBindValue(record.value('year'))
            coin_query.addBindValue(record.value('period'))
            coin_query.addBindValue(record.value('mint'))
            coin_query.addBindValue(record.value('mintmark'))
            coin_query.addBindValue(record.value('issuedate'))
            coin_query.addBindValue(record.value('type'))
            coin_query.addBindValue(record.value('series'))
            coin_query.addBindValue(record.value('subjectshort'))
            coin_query.addBindValue(record.value('status'))
            coin_query.addBindValue(record.value('metal'))
            coin_query.addBindValue(record.value('fineness'))
            coin_query.addBindValue(record.value('form'))
            coin_query.addBindValue(record.value('diameter'))
            coin_query.addBindValue(record.value('thick'))
            coin_query.addBindValue(record.value('mass'))
            coin_query.addBindValue(record.value('grade'))
            coin_query.addBindValue(record.value('edge'))
            coin_query.addBindValue(record.value('edgelabel'))
            coin_query.addBindValue(record.value('obvrev'))
            coin_query.addBindValue(record.value('quality'))
            coin_query.addBindValue(record.value('mintage'))
            coin_query.addBindValue(record.value('dateemis'))
            coin_query.addBindValue(record.value('catalognum1'))
            coin_query.addBindValue(record.value('catalognum2'))
            coin_query.addBindValue(record.value('catalognum3'))
            coin_query.addBindValue(record.value('catalognum4'))
            coin_query.addBindValue(record.value('rarity'))
            coin_query.addBindValue(record.value('price1'))
            coin_query.addBindValue(record.value('price2'))
            coin_query.addBindValue(record.value('price3'))
            coin_query.addBindValue(record.value('price4'))
            coin_query.addBindValue(record.value('variety'))
            coin_query.addBindValue(record.value('obversevar'))
            coin_query.addBindValue(record.value('reversevar'))
            coin_query.addBindValue(record.value('edgevar'))
            coin_query.addBindValue(record.value('paydate'))
            coin_query.addBindValue(record.value('payprice'))
            coin_query.addBindValue(record.value('totalpayprice'))
            coin_query.addBindValue(record.value('saller'))
            coin_query.addBindValue(record.value('payplace'))
            coin_query.addBindValue(record.value('payinfo'))
            coin_query.addBindValue(record.value('saledate'))
            coin_query.addBindValue(record.value('saleprice'))
            coin_query.addBindValue(record.value('totalsaleprice'))
            coin_query.addBindValue(record.value('buyer'))
            coin_query.addBindValue(record.value('saleplace'))
            coin_query.addBindValue(record.value('saleinfo'))
            coin_query.addBindValue(record.value('note'))
            coin_query.addBindValue(record.value('image'))
            coin_query.addBindValue(imgIds['obverseimg'])
            coin_query.addBindValue(record.value('obversedesign'))
            coin_query.addBindValue(record.value('obversedesigner'))
            coin_query.addBindValue(imgIds['reverseimg'])
            coin_query.addBindValue(record.value('reversedesign'))
            coin_query.addBindValue(record.value('reversedesigner'))
            coin_query.addBindValue(imgIds['edgeimg'])
            coin_query.addBindValue(record.value('subject'))
            coin_query.addBindValue(imgIds['photo1'])
            coin_query.addBindValue(imgIds['photo2'])
            coin_query.addBindValue(imgIds['photo3'])
            coin_query.addBindValue(imgIds['photo4'])
            coin_query.addBindValue(record.value('defect'))
            coin_query.addBindValue(record.value('storage'))
            coin_query.addBindValue(record.value('features'))
            coin_query.addBindValue(record.value('createdat'))
            coin_query.addBindValue(record.value('updatedat'))
            if not coin_query.exec_():
                print(coin_query.lastError().text())

        self.progressDlg.setLabelText(self.tr("Saving..."))

        sql = """DROP TABLE tmp_coins"""
        QSqlQuery(sql, self.db)

        self.collection.settings['Version'] = 2
        self.collection.settings.save()

        query = QSqlQuery(self.db)
        query.prepare("""INSERT INTO settings (title, value) VALUES (?, ?)""")
        query.addBindValue('Password')
        query.addBindValue(self.collection.settings['Password'])
        query.exec_()

        self.db.commit()

        self.progressDlg.setLabelText(self.tr("Vacuum..."))

        self.collection.vacuum()

        self._finish()
예제 #38
0
 def renamePage(self, page, title):
     query = QSqlQuery(self.db)
     query.prepare("UPDATE pages SET title=? WHERE id=?")
     query.addBindValue(title)
     query.addBindValue(page.id)
     query.exec_()
예제 #39
0
 def setFirstName(self, personId, firstName):
     query = QSqlQuery()
     query.prepare('update person set firstname = ? where id = ?')
     query.addBindValue(firstName)
     query.addBindValue(personId)
     return query.exec_()
예제 #40
0
class MimaBox:

    secretbox = None

    def __init__(self,
                 nonce='',
                 title='',
                 username='',
                 website='',
                 password='',
                 notes='',
                 favorite=0,
                 deleted=''):

        self.encrypted = None
        self.COLUMNS = MIMA_COLUMNS
        self.SELECT_FROM_TEMP = SELECT_FROM_MIMATEMP
        self.INSERT_INTO_TEMP = INSERT_INTO_MIMATEMP
        self.INSERT_INTO_DATABASE = INSERT_INTO_MIMA
        self.UPDATE_DATABASE = UPDATE_MIMA

        self.query = QSqlQuery()
        # self.query.setForwardOnly(True)

        if nonce:
            self.nonce = nonce
        else:
            self.nonce = self.new_nonce()

        self.title = title
        self.username = username
        self.website = website
        self.password = password
        self.notes = notes
        self.favorite = favorite

        if deleted:
            self.deleted = deleted
        else:
            self.deleted = EPOCH

    def new_nonce(self):
        while True:
            nonce = nacl.utils.random(nacl.secret.SecretBox.NONCE_SIZE)
            nonce = base64.b64encode(nonce).decode()

            self.query.prepare(FIND_NONCE_IN_MIMATEMP)
            self.query.addBindValue(nonce)
            self.query_exec()
            result_1 = self.query.first()

            self.query.prepare(FIND_NONCE_IN_HISTORYTEMP)
            self.query.addBindValue(nonce)
            self.query.exec_()
            result_2 = self.query.first()

            if result_1 is False and result_2 is False:
                return nonce

    def is_unique(self):
        self.query.prepare(CHECK_UNIQUENESS)
        for value in [self.title, self.username, self.deleted]:
            self.query.addBindValue(value)
        self.query_exec()
        return not self.query.first()

    def is_unique_except_itself(self):
        self.query.prepare(CHECK_UNIQUENESS_EXCEPT_ITSELF)
        for value in [self.title, self.username, self.deleted, self.nonce]:
            self.query.addBindValue(value)
        self.query_exec()
        return not self.query.first()

    def to_dict(self):
        return dict(title=self.title,
                    username=self.username,
                    website=self.website,
                    password=self.password,
                    notes=self.notes,
                    favorite=self.favorite,
                    deleted=self.deleted)

    # def to_list(self):
    #     return [self.title,
    #             self.username,
    #             self.website,
    #             self.password,
    #             self.notes,
    #             self.favorite,
    #             self.deleted]

    def insert_into_temp(self, sql=None):  # also use as update_mimatemp
        if not sql:
            sql = self.INSERT_INTO_TEMP

        self.query.prepare(sql)
        self.query.bindValue(':nonce', self.nonce)

        if sql == INSERT_INTO_HISTORYTEMP:
            self.query.bindValue(':mimanonce', self.mimanonce)

        for k, v in self.to_dict().items():
            self.query.bindValue(':' + k, v)

        self.query_exec()

    def update_temp(self):
        self.insert_into_temp(UPDATE_MIMATEMP)

    def encrypt(self):
        message = json.dumps(self.to_dict()).encode()
        encrypted = self.secretbox.encrypt(
            message, base64.b64decode(self.nonce.encode()))
        self.encrypted = QByteArray(encrypted)

    def insert_into_database(self):
        self.encrypt()
        self.query.prepare(self.INSERT_INTO_DATABASE)
        self.query.bindValue(':nonce', self.nonce)
        self.query.bindValue(':encrypted', self.encrypted)

        if self.INSERT_INTO_DATABASE == INSERT_INTO_HISTORY:
            self.query.bindValue(':mimanonce', self.mimanonce)

        self.query_exec()

    def insert_into_database_and_temp(self):
        self.insert_into_temp()
        self.insert_into_database()

        # self.query.exec_('select * from mimatemp')
        # print('SIZE: ', self.query.size())
        # record = self.query.record()
        # self.query.next()
        # for i in range(record.count()):
        #     print(record.fieldName(i), self.query.value(i))

        # if self.query.lastError().type():
        #     raise RuntimeError(self.query.lastError().text())

        # errorType = self.query.lastError().type()
        # if errorType:
        #     print(self.query.lastError().text())
        # else:
        #     print('No Error.', errorType)

        # print('ACTIVE: ', self.query.isActive())
        # print('VALID: ', self.query.isValid())
        # print('AFFECTED: ', self.query.numRowsAffected())
        # print('COMMIT: ', QSqlDatabase.database().commit())

    def restore_by_nonce(self, nonce='', sql=None):

        COLUMNS = self.COLUMNS
        if sql == SELECT_FROM_MIMATEMP:
            COLUMNS = MIMA_COLUMNS

        if not sql:
            sql = self.SELECT_FROM_TEMP

        self.query.prepare(sql)

        if not nonce:
            nonce = self.nonce

        self.query.addBindValue(nonce)
        self.query_exec()
        self.query.next()

        self.title = self.query.value(COLUMNS['title'])
        self.username = self.query.value(COLUMNS['username'])
        self.website = self.query.value(COLUMNS['website'])
        self.password = self.query.value(COLUMNS['password'])
        self.notes = self.query.value(COLUMNS['notes'])
        self.favorite = self.query.value(COLUMNS['favorite'])
        self.deleted = self.query.value(COLUMNS['deleted'])

        if self.SELECT_FROM_TEMP == SELECT_FROM_HISTORYTEMP \
                and sql == SELECT_FROM_HISTORYTEMP:
            self.mimanonce = self.query.value(HISTORY_COLUMNS['mimanonce'])

    def update_database(self):
        self.encrypt()
        self.query.prepare(self.UPDATE_DATABASE)
        self.query.bindValue(':encrypted', self.encrypted)
        self.query.bindValue(':nonce', self.nonce)
        self.query_exec()

    def toggle_favorite(self):
        self.favorite = not self.favorite
        self.query.prepare(UPDATE_FAVORITE)
        self.query.bindValue(':favorite', self.favorite)
        self.query.bindValue(':nonce', self.nonce)
        self.query_exec()
        self.update_database()

    def move_to_trash(self):
        self.favorite = 0
        self.deleted = datetime.datetime.now().isoformat(sep=' ')
        self.query.prepare(UPDATE_DELETED)
        self.query.bindValue(':deleted', self.deleted)
        self.query.bindValue(':nonce', self.nonce)
        self.query_exec()
        self.update_database()

    def recover(self):
        self.deleted = EPOCH
        self.query.prepare(RECOVER)
        self.query.bindValue(':title', self.title)
        self.query.bindValue(':nonce', self.nonce)
        self.query_exec()
        self.update_database()

    def delete_forever(self, table='mima', temptable='mimatemp'):
        self.query.prepare(f"DELETE FROM {temptable} WHERE nonce=?")
        self.query.addBindValue(self.nonce)
        self.query_exec()

        self.query.prepare(f"DELETE FROM {table} WHERE nonce=?")
        self.query.addBindValue(self.nonce)
        self.query_exec()

    def query_exec(self):
        success = self.query.exec_()
        if not success:
            raise RuntimeError(self.query.lastError().text())
예제 #41
0
    def videoTableUpdate(self, filters=[]):
        '''
        Generate SQL query from filters (filterName, categoryIndex)
        '''
        tableSorts = [
            "publish_date", "save_date", "video_title", "C.channel_title"
        ]
        sortDirs = ["ASC", "DESC"]

        self.lastUsedFilters = filters
        queries = []
        search = self.tableSearchBar.text()
        tokens = split(search)
        query = QSqlQuery()

        if len(filters) == 0 and len(search) == 0:
            queryTemplate = """SELECT video_id, video_title, publish_date, save_date, C.channel_title
                               FROM videos V INNER JOIN channels C
                               ON V.channel_id = C.channel_id
                               ORDER BY """ + f"{tableSorts[self.tableSortDropDown.currentIndex()]} {sortDirs[self.tableSortDirDropDown.currentIndex()]}"
            query.prepare(queryTemplate)

        else:
            if len(filters) > 0:
                filterTables = [
                    "videos_playlists_link", "videos", "videos_tags_link",
                    "videos_yt_tags_link"
                ]
                filterColumns = [
                    "playlist_id", "channel_id", "tag_name", "tag_name"
                ]
                # queryTemplates = ["SELECT video_id FROM videos_playlists_link WHERE playlist_id = (?)",
                #                   "SELECT video_id FROM videos WHERE channel_id = (?)",
                #                   "SELECT video_id FROM videos_tags_link WHERE tag_name = (?)",
                # "SELECT video_id FROM videos_yt_tags_link WHERE tag_name = (?)"]
                selections = []
                for filterName, categoryIndex in filters:
                    selections.append(
                        f"SELECT video_id FROM {filterTables[categoryIndex]} WHERE {filterColumns[categoryIndex]} = (?)"
                    )
                    # selections.append(queryTemplates[categoryIndex])
                queryTemplate = "\nINTERSECT\n".join(selections)
                queryTemplate = """SELECT video_id, video_title, publish_date, save_date, C.channel_title
                                   FROM videos V INNER JOIN channels C
                                   ON V.channel_id = C.channel_id
                                   WHERE video_id IN (\n""" + queryTemplate + "\n)"
                queries.append(queryTemplate)

            if len(tokens) > 0:
                posQuery = """
                SELECT video_id FROM videos WHERE channel_id IN (
                    SELECT channel_id FROM channels WHERE channel_title LIKE (?)
                )
                UNION
                SELECT video_id FROM videos_playlists_link WHERE playlist_id IN (
                   SELECT playlist_id FROM playlists WHERE playlist_title LIKE (?)
                )
                UNION
                SELECT video_id FROM videos WHERE video_id LIKE (?) OR video_title LIKE (?) OR description LIKE (?) OR notes LIKE (?)
                UNION
                SELECT video_id FROM videos_tags_link WHERE tag_name LIKE (?)
                UNION
                SELECT video_id FROM videos_yt_tags_link WHERE tag_name LIKE (?)
                """

                posQuery = """

                SELECT video_id, video_title, publish_date, save_date, C.channel_title
                FROM videos V INNER JOIN channels C
                ON V.channel_id =C.channel_id
                WHERE video_id IN (\n""" + posQuery + "\n)\n"

                negQuery = """
                SELECT video_id FROM videos WHERE channel_id IN (
                    SELECT channel_id FROM channels WHERE channel_title NOT LIKE (?)
                )
                INTERSECT
                SELECT video_id FROM videos_playlists_link WHERE playlist_id IN (
                   SELECT playlist_id FROM playlists WHERE playlist_title NOT LIKE (?)
                )
                INTERSECT
                SELECT video_id FROM videos WHERE video_id NOT LIKE (?) AND video_title NOT LIKE (?)
                INTERSECT
                SELECT video_id FROM videos_tags_link WHERE tag_name NOT LIKE (?)
                """

                negQuery = """
                SELECT video_id, video_title, publish_date, save_date, C.channel_title
                FROM videos V INNER JOIN channels C
                ON V.channel_id =C.channel_id
                WHERE video_id IN (\n""" + negQuery + "\n)\n"

                searchQuery = ""
                for i, t in enumerate(tokens):
                    if i != 0:
                        searchQuery += "\nINTERSECT\n"
                    subquery = posQuery if t[0] != '-' else negQuery
                    searchQuery += subquery
                queries.append(searchQuery)

            # if len(search) > 0:
            # searchQuery = """SELECT video_id FROM videos WHERE channel_id IN (
            #                     SELECT channel_id FROM channels WHERE channel_title LIKE (?)
            #                  )
            #                  UNION
            #                  SELECT video_id FROM videos_playlists_link WHERE playlist_id IN (
            #                      SELECT playlist_id FROM playlists WHERE playlist_title LIKE (?)
            #                  )
            #                  UNION
            #                  SELECT video_id FROM videos WHERE video_id LIKE (?) OR video_title LIKE (?) OR description LIKE (?) OR notes LIKE (?)
            #                  UNION
            #                  SELECT video_id FROM videos_tags_link WHERE tag_name LIKE (?)
            #                  UNION
            #                  SELECT video_id FROM videos_yt_tags_link WHERE tag_name LIKE (?)"""
            # searchQuery = """SELECT video_id, video_title, publish_date, save_date, C.channel_title
            #                  FROM videos V INNER JOIN channels C
            #                  ON V.channel_id =C.channel_id
            #                  WHERE video_id IN (\n""" + searchQuery + "\n)"
            # queries.append(searchQuery)

            preQuery = "\nINTERSECT\n".join(
                queries
            ) + f"\nORDER BY {tableSorts[self.tableSortDropDown.currentIndex()]} {sortDirs[self.tableSortDirDropDown.currentIndex()]}"
            query.prepare(preQuery)

            if len(filters) > 0:
                for filterName, categoryIndex in filters:
                    query.addBindValue(filterName)

            if len(tokens) > 0:
                for t in tokens:
                    if t[0] != '-':
                        for _ in range(posQuery.count("(?)")):
                            query.addBindValue(f"%{t}%")
                    else:
                        for _ in range(negQuery.count("(?)")):
                            query.addBindValue(f"%{t[1:]}%")

            # if len(search) > 0:
            # for _ in range(8):
            #     query.addBindValue(f"%{search}%")

        query.exec()
        self.videoTableQuery(query)
예제 #42
0
def exportToMobile(model, params):
    IMAGE_FORMAT = 'jpg'
    IMAGE_COMPRESS = 50
    USED_FIELDS = ('title', 'unit', 'country', 'year', 'mint', 'mintmark',
                   'issuedate', 'type', 'series', 'subjectshort', 'material',
                   'fineness', 'diameter', 'thickness', 'weight', 'mintage',
                   'rarity', 'obverseimg', 'reverseimg', 'subject', 'price1',
                   'price2', 'price3', 'price4')

    if os.path.isfile(params['file']):
        os.remove(params['file'])

    db = QSqlDatabase.addDatabase('QSQLITE', 'mobile')
    db.setDatabaseName(params['file'])
    if not db.open():
        print(db.lastError().text())
        QMessageBox.critical(None, "Create mobile collection",
                             "Can't open collection")
        return

    sql = """CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')"""
    QSqlQuery(sql, db)
    sql = """INSERT INTO "android_metadata" VALUES ('en_US')"""
    QSqlQuery(sql, db)

    mobile_settings = {
        'Version': 1,
        'Type': 'MobilePro',
        'Filter': params['filter']
    }

    sql = """CREATE TABLE settings (
        title CHAR NOT NULL UNIQUE,
        value CHAR)"""
    QSqlQuery(sql, db)
    for key, value in mobile_settings.items():
        query = QSqlQuery(db)
        query.prepare("""INSERT INTO settings (title, value)
                VALUES (?, ?)""")
        query.addBindValue(key)
        query.addBindValue(str(value))
        query.exec_()

    sql = """CREATE TABLE updates (
        title CHAR NOT NULL UNIQUE,
        value CHAR)"""
    QSqlQuery(sql, db)

    sql = """INSERT INTO updates (title, value)
                VALUES ('160203', '2016-02-03T10:19:00')"""
    QSqlQuery(sql, db)

    sql = """CREATE TABLE photos (
        id INTEGER PRIMARY KEY,
        image BLOB)"""
    QSqlQuery(sql, db)

    sql = """CREATE TABLE coins (
        id INTEGER PRIMARY KEY,
        description_id INTEGER,
        grade INTEGER,
        createdat STRING)"""
    QSqlQuery(sql, db)

    sql = """CREATE INDEX coins_descriptions ON coins(description_id)"""
    QSqlQuery(sql, db)

    sqlFields = []
    fields = CollectionFieldsBase()
    for field in fields:
        if field.name == 'id':
            sqlFields.append('id INTEGER PRIMARY KEY')
        elif field.name == 'image':
            sqlFields.append('image INTEGER')
        elif field.name in USED_FIELDS:
            sqlFields.append("%s %s" % (field.name, Type.toSql(field.type)))

    sql = "CREATE TABLE descriptions (" + ", ".join(sqlFields) + ")"
    QSqlQuery(sql, db)

    while model.canFetchMore():
        model.fetchMore()

    dest_model = QSqlTableModel(None, db)
    dest_model.setEditStrategy(QSqlTableModel.OnManualSubmit)
    dest_model.setTable('descriptions')
    dest_model.select()

    height = 64
    if params['density'] == 'HDPI':
        height *= 1.5
    elif params['density'] == 'XHDPI':
        height *= 2
    elif params['density'] == 'XXHDPI':
        height *= 3
    elif params['density'] == 'XXXHDPI':
        height *= 4
    maxHeight = height * 4

    is_obverse_enabled = params['image'] in (ExportDialog.IMAGE_OBVERSE,
                                             ExportDialog.IMAGE_BOTH)
    is_reverse_enabled = params['image'] in (ExportDialog.IMAGE_REVERSE,
                                             ExportDialog.IMAGE_BOTH)

    fields = CollectionFieldsBase()
    count = model.rowCount()
    progressDlg = Gui.ProgressDialog("Exporting records", "Cancel", count,
                                     None)

    for i in range(count):
        progressDlg.step()
        if progressDlg.wasCanceled():
            break

        coin = model.record(i)
        if coin.value('status') in ('pass', 'sold'):
            continue

        dest_record = dest_model.record()

        for field in fields:
            if field.name in ('id', 'image', 'obverseimg', 'reverseimg'):
                continue
            if field.name in USED_FIELDS:
                val = coin.value(field.name)
                if val is None or val == '':
                    continue

                dest_record.setValue(field.name, val)

        # Process images
        is_obverse_present = not coin.isNull('obverseimg')
        is_reverse_present = not coin.isNull('reverseimg')
        if is_obverse_present or is_reverse_present:
            obverseImage = QImage()
            reverseImage = QImage()

            if is_obverse_present:
                ba = QtCore.QByteArray()
                buffer = QtCore.QBuffer(ba)
                buffer.open(QtCore.QIODevice.WriteOnly)

                obverseImage.loadFromData(coin.value('obverseimg'))
                if not obverseImage.isNull() and not params[
                        'fullimage'] and obverseImage.height() > maxHeight:
                    scaledImage = obverseImage.scaled(maxHeight, maxHeight,
                                                      Qt.KeepAspectRatio,
                                                      Qt.SmoothTransformation)
                    scaledImage.save(buffer, IMAGE_FORMAT, IMAGE_COMPRESS)
                    save_data = ba
                else:
                    if not obverseImage.isNull():
                        obverseImage.save(buffer, IMAGE_FORMAT, IMAGE_COMPRESS)
                        save_data = ba
                    else:
                        save_data = coin.value('obverseimg')

                query = QSqlQuery(db)
                query.prepare("""INSERT INTO photos (image)
                        VALUES (?)""")
                query.addBindValue(save_data)
                query.exec_()
                img_id = query.lastInsertId()
                dest_record.setValue('obverseimg', img_id)
            if not obverseImage.isNull():
                obverseImage = obverseImage.scaledToHeight(
                    height, Qt.SmoothTransformation)

            if is_reverse_present:
                ba = QtCore.QByteArray()
                buffer = QtCore.QBuffer(ba)
                buffer.open(QtCore.QIODevice.WriteOnly)

                reverseImage.loadFromData(coin.value('reverseimg'))
                if not reverseImage.isNull() and not params[
                        'fullimage'] and reverseImage.height() > maxHeight:
                    scaledImage = reverseImage.scaled(maxHeight, maxHeight,
                                                      Qt.KeepAspectRatio,
                                                      Qt.SmoothTransformation)
                    scaledImage.save(buffer, IMAGE_FORMAT, IMAGE_COMPRESS)
                    save_data = ba
                else:
                    if not reverseImage.isNull():
                        reverseImage.save(buffer, IMAGE_FORMAT, IMAGE_COMPRESS)
                        save_data = ba
                    else:
                        save_data = coin.value('reverseimg')

                query = QSqlQuery(db)
                query.prepare("""INSERT INTO photos (image)
                        VALUES (?)""")
                query.addBindValue(save_data)
                query.exec_()
                img_id = query.lastInsertId()
                dest_record.setValue('reverseimg', img_id)
            if not reverseImage.isNull():
                reverseImage = reverseImage.scaledToHeight(
                    height, Qt.SmoothTransformation)

            if not is_obverse_enabled:
                obverseImage = QImage()
            if not is_reverse_enabled:
                reverseImage = QImage()

            image = QImage(obverseImage.width() + reverseImage.width(), height,
                           QImage.Format_RGB32)
            image.fill(QColor(Qt.white).rgb())

            paint = QPainter(image)
            if is_obverse_present and is_obverse_enabled:
                paint.drawImage(
                    QtCore.QRectF(0, 0, obverseImage.width(), height),
                    obverseImage,
                    QtCore.QRectF(0, 0, obverseImage.width(), height))
            if is_reverse_present and is_reverse_enabled:
                paint.drawImage(
                    QtCore.QRectF(obverseImage.width(), 0,
                                  reverseImage.width(), height), reverseImage,
                    QtCore.QRectF(0, 0, reverseImage.width(), height))
            paint.end()

            ba = QtCore.QByteArray()
            buffer = QtCore.QBuffer(ba)
            buffer.open(QtCore.QIODevice.WriteOnly)
            image.save(buffer, IMAGE_FORMAT, 75)

            query = QSqlQuery(db)
            query.prepare("""INSERT INTO photos (image)
                    VALUES (?)""")
            query.addBindValue(ba)
            query.exec_()
            img_id = query.lastInsertId()
            dest_record.setValue('image', img_id)

        dest_model.insertRecord(-1, dest_record)

    progressDlg.setLabelText("Saving...")
    dest_model.submitAll()

    progressDlg.setLabelText("Compact...")
    QSqlQuery(
        """UPDATE descriptions
SET
reverseimg = (select t2.id from descriptions t3 join (select id, image from photos group by image having count(*) > 1) t2 on t1.image = t2.image join photos t1 on t3.reverseimg = t1.id where t1.id <> t2.id and t3.id = descriptions.id)
WHERE descriptions.id in (select t3.id from descriptions t3 join (select id, image from photos group by image having count(*) > 1) t2 on t1.image = t2.image join photos t1 on t3.reverseimg = t1.id where t1.id <> t2.id)
""", db)
    QSqlQuery(
        """UPDATE descriptions
SET
obverseimg = (select t2.id from descriptions t3 join (select id, image from photos group by image having count(*) > 1) t2 on t1.image = t2.image join photos t1 on t3.obverseimg = t1.id where t1.id <> t2.id and t3.id = descriptions.id)
WHERE descriptions.id in (select t3.id from descriptions t3 join (select id, image from photos group by image having count(*) > 1) t2 on t1.image = t2.image join photos t1 on t3.obverseimg = t1.id where t1.id <> t2.id)
""", db)
    QSqlQuery(
        """UPDATE descriptions
SET
image = (select t2.id from descriptions t3 join (select id, image from photos group by image having count(*) > 1) t2 on t1.image = t2.image join photos t1 on t3.image = t1.id where t1.id <> t2.id and t3.id = descriptions.id)
WHERE descriptions.id in (select t3.id from descriptions t3 join (select id, image from photos group by image having count(*) > 1) t2 on t1.image = t2.image join photos t1 on t3.image = t1.id where t1.id <> t2.id)
""", db)

    QSqlQuery(
        """DELETE FROM photos
        WHERE id NOT IN (SELECT id FROM photos GROUP BY image)""", db)

    db.close()

    progressDlg.setLabelText("Vacuum...")
    db = QSqlDatabase.addDatabase('QSQLITE', 'mobile')
    db.setDatabaseName(params['file'])
    if not db.open():
        print(db.lastError().text())
        QMessageBox.critical(None, "Create mobile collection",
                             "Can't open collection")
        return
    QSqlQuery("VACUUM", db)
    db.close()

    progressDlg.reset()
예제 #43
0
    def CadastrarAluguel(aluguel):
        conn = ConexaoSQL
        db = conn.getConexao()
        db.open()

        query = QSqlQuery()

        query.prepare(
            "UPDATE Veiculo SET Alugado = 'Sim' WHERE CodigoVeic = " +
            aluguel.CodigoVeic)
        query.exec_()
        db.commit()

        query.prepare(
            "INSERT INTO Aluguel(DataAluguel, DataPrazo, DataDevolucao, ValorAluguel, "
            "ValorMulta, KmEntrada, KmSaida, CodigoCli, CodigoVeic) "
            "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)")
        query.addBindValue(aluguel.DataAluguel)
        query.addBindValue(aluguel.DataPrazo)
        query.addBindValue(aluguel.DataDevolucao)
        query.addBindValue(aluguel.ValorAluguel)
        query.addBindValue(aluguel.ValorMulta)
        query.addBindValue(aluguel.KmEntrada)
        query.addBindValue(aluguel.KmSaida)
        query.addBindValue(aluguel.CodigoCli)
        query.addBindValue(aluguel.CodigoVeic)
        query.exec_()
        db.commit()
예제 #44
0
 def on_db_save_clicked(self):
     """
     保存数据到数据库
     :param: 无
     :return: 无
     """
     self.__DB = QSqlDatabase.addDatabase('QSQLITE')
     self.__DB.setDatabaseName('Library_Management.db')
     self.__DB.open()
     query = QSqlQuery()
     # 先清空所有记录
     #truncate_statement = 'TRUNCATE TABLE book_baseinfo'
     #query.exec_(truncate_statement)
     now = self.__book_list.head()
     flag = True
     while now != None and now.next != None and flag == True:
         insert_statement = 'insert into book_baseinfo values(?,?,?,?,?,?,?,?,?,?)'
         query.prepare(insert_statement)
         query.addBindValue(str(now.get_data().get_ID()))
         query.addBindValue(str(now.get_data().get_name()))
         query.addBindValue(str(now.get_data().get_ISBN()))
         query.addBindValue(str(now.get_data().get_author()))
         query.addBindValue(str(now.get_data().get_pageCnt()))
         query.addBindValue(str(now.get_data().get_publishedDate()))
         query.addBindValue(str(now.get_data().get_entryDate()))
         query.addBindValue(str(now.get_data().get_price()))
         query.addBindValue(str(now.get_data().get_catelog()))
         query.addBindValue(str(now.get_data().get_balance()))
         # 上面是书籍基本数据,现在要把所有的借还书记录搞出来
         if not query.exec_():
             print(query.lastError())
         if now == self.__book_list.tail():
             flag = False
             break
         now = now.next
     insert_statement = 'insert into book_BRinfo values(?,?,?,?,?,?,?,?,?,?)'
     cur_row_cnt = self.__ui.main_BRLog_table.rowCount()
     cur_col_cnt = self.__ui.main_BRLog_table.columnCount()
     if cur_row_cnt == 0:
         return
     for i in range(cur_row_cnt):
         query.prepare(insert_statement)
         for j in range(cur_col_cnt):
             text = self.__ui.main_BRLog_table.item(i, j)
             query.addBindValue(text)
         try:
             if not query.exec_():
                 raise ValueError(query.lastError())
         except ValueError as v:
             print('Error:', repr(v))
예제 #45
0
    def save_lists(self, only_if_changed=False):
        if not only_if_changed or self.__lists_changed:
            self.db.transaction()

            # Remove old values
            self.__remove_lists()

            for position, param in enumerate(self.columns):
                query = QSqlQuery(self.db)
                query.prepare("INSERT INTO lists (pageid, fieldid, position,"
                              " enabled, width, sortorder)"
                              " VALUES (?, ?, ?, ?, ?, ?)")
                query.addBindValue(self.page.id)
                query.addBindValue(param.fieldid)
                query.addBindValue(position)
                query.addBindValue(int(param.enabled))
                if not param.enabled:
                    param.width = None
                query.addBindValue(param.width)
                query.addBindValue(param.sortorder)
                query.exec_()

            self.db.commit()

            self.__lists_changed = False
예제 #46
0
    def CadastrarVeiculo(veiculo):
        conn = ConexaoSQL
        db = conn.getConexao()
        db.open()

        query = QSqlQuery()
        query.prepare("INSERT INTO Veiculo(Modelo, Marca, AnoModelo, Placa, "
                      "Alugado, Batido, KmAtual, ValorDiaria, Descricao, TipoVeiculo) "
                      "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
        query.addBindValue(veiculo.Modelo)
        query.addBindValue(veiculo.Marca)
        query.addBindValue(veiculo.AnoModelo)
        query.addBindValue(veiculo.Placa)
        query.addBindValue(veiculo.Alugado)
        query.addBindValue(veiculo.Batido)
        query.addBindValue(veiculo.KmAtual)
        query.addBindValue(veiculo.ValorDiaria)
        query.addBindValue(veiculo.Descricao)
        query.addBindValue(veiculo.TipoVeiculo)

        query.exec_()
        db.commit()
예제 #47
0
 def closedPages(self):
     query = QSqlQuery(self.db)
     query.prepare("SELECT * FROM pages WHERE isopen=? ORDER BY title")
     query.addBindValue(int(False))
     query.exec_()
     return self.__queryToParam(query)
예제 #48
0
 def openPage(self, page):
     query = QSqlQuery(self.db)
     query.prepare("UPDATE pages SET isopen=? WHERE id=?")
     query.addBindValue(int(True))
     query.addBindValue(page.id)
     query.exec_()
예제 #49
0
    def _fetch_data(self, sql: str, bind_values: list, sel_count: int) -> list:
        """It runs the given sql select query and returns the fetched data

        The sql query placeholder should be "?". The values in the bind_values
        parameter will replace "?".

        :param sql: The sql query to run.
        :type sql: str.        
        :param bind_values: The values to bind to the query placeholders.
        :type bind_values: list.
        :param sel_count: The number of fields in select query.
        :type sel_count: int.
        :return: The required data.
        :rtype: list.
        """

        # Try to open the connection and handle possible errors
        if not self.con.open():
            # The error is shown in message box
            self._display_error("")

        # The query object is created
        query = QSqlQuery()

        # If the sql query contains placeholders
        if len(bind_values) > 0:
            # Prepared query is used
            query.prepare(sql)
            # Each given bind value is added
            for val in bind_values:
                # The bind value is added
                query.addBindValue(val)
            # The query is run
            if not query.exec():
                self._display_error(sql)
        else:
            # The query is run
            if not query.exec(sql):
                self._display_error(sql)

        # All rows
        rows = []
        # All rows are fetched
        while query.next():
            # The row of data
            row = []
            # All selected field values are fetched
            for i in range(sel_count):
                # The query value
                qval = query.value(i)
                # The query value is appended to the row
                row.append(qval)
            # The row in appended to the list of rows
            rows.append(row)

        # The resources associated with the query object are freed
        query.finish()
        # The connection is closed
        #self.con.close()
        # The data is returned
        return rows
예제 #50
0
 def remove(self):
     query = QSqlQuery(self.db)
     query.prepare("DELETE FROM statistics WHERE pageid=?")
     query.addBindValue(self.pageId)
     query.exec_()
class Database():
    '''
    数据库操作,包含查询密码,用户信息,和修改table,默认数据库为Sqlite
    数据库名为test.db,包含两个表 user_info(用户信息)和sign_record(考勤记录)
    不提供新建功能,只可清除表的内容
    '''

    def __init__(self):
        '''
        数据库初始化,数据库类型为Sqlite
        '''
        self.database = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        self.database.setDatabaseName('test.db')
        self.database.open()
        self.query = QSqlQuery()

    def get_passwd(self,id):
        '''
        获取用户密码
        :param id: 用户名ID  type :int
        :return: 用户密码
        :type : str
        '''
        if self.query.exec('select passwd from user_info where id = %d'%id):
            while self.query.next():
                passwd = self.query.value(0)
                return passwd

    def get_user_info(self,id):
        '''
        获取用户信息
        :param id: 用户ID   type : int
        :return: 用户所有信息
        :type : dict
        '''
        if self.query.exec('select * from user_info where id = %d' % id):
            while self.query.next():
                ID = self.query.value(self.query.record().indexOf('id'))
                username = self.query.value(self.query.record().indexOf('name'))
                age = self.query.value(self.query.record().indexOf('age'))
                sex = self.query.value(self.query.record().indexOf('sex'))
                address = self.query.value(self.query.record().indexOf('address'))
                tel = self.query.value(self.query.record().indexOf('tel'))
                job = self.query.value(self.query.record().indexOf('job'))
                finger_id = self.query.value(self.query.record().indexOf('finger_id'))
                info = {'id':ID,'name':username,'age':age,'sex':sex,'address':address,'tel':tel,'job':job,'finger_id':finger_id}
                return info
                
    def change_user_info(self, new_info):
        '''
        更新用户信息
        :param info:新的用户信息 type : dict
        :return: None
        '''
        self.query.prepare('update user_info set name = ?, age = ?, job = ?, tel = ?, sex = ?, address = ? where id = %d'%(new_info['id']))
        self.query.addBindValue(new_info['name'])
        self.query.addBindValue(new_info['age'])
        self.query.addBindValue(new_info['job'])
        self.query.addBindValue(new_info['tel'])
        self.query.addBindValue(new_info['sex'])
        self.query.addBindValue(new_info['address'])
        self.query.exec_()
    
    def get_record(self):
        '''
        获取前100条签到数据
        :return: data
        :type:dict
        '''
        data = []
        buff = dict()
        if self.query.exec('select * from sign_record limit 100 '):
            while self.query.next():
                buff['time'] = self.query.value("time")
                buff['id'] = self.query.value("id")
                buff['name'] = self.query.value("name")
                buff['operation'] = self.query.value("operation")
                buff['illegal'] = self.query.value("illegal")
                data.append(buff)
                buff = dict()
            return data
            
    def get_record_by_id(self, id):
        '''
        通过id获取当前用户签到数据最多100条
        :param id:用户id type : int
        :return: data
        :type:dict
        '''
        data = []
        buff = dict()
        if self.query.exec('select * from sign_record where id = %d limit 100' % id):
            while self.query.next():
                buff['time'] = self.query.value("time")
                buff['id'] = self.query.value("id")
                buff['name'] = self.query.value("name")
                buff['operation'] = self.query.value("operation")
                buff['illegal'] = self.query.value("illegal")
                data.append(buff)
                buff = dict()
            return data
            
            
    def new_record(self, id, operation):
        '''
        添加新的考勤记录
        :param id:用户ID type:int
        :param operation : 操作代号 type:int
        :return: None
        '''
        current_time = datetime.now().strftime("%H:%M")  #获取当前时间(时:分)
        flag = judge_time_section(current_time)
        if operation == 1:
            operation ="签到"
            if flag == 1:
                illegal = "否"
            else:
                 illegal = "是"
        else:
            operation = "离开"
            if flag == 3:
                 illegal = "否"
            else:
                 illegal = "是"
        name = self.get_user_info(id)['name'] #获取对应ID的用户名
        self.query.exec('INSERT INTO sign_record([id],[name],[operation],[illegal]) VALUES(%d,\'%s\',\'%s\',\'%s\'); ' %(id,name,operation,illegal))
예제 #52
0
    def save(self):
        self.db.transaction()

        # Remove old values
        self.remove()

        # Save new all
        for position, param in enumerate(self.columns):
            query = QSqlQuery(self.db)
            query.prepare("INSERT INTO lists (pageid, fieldid, position,"
                          " enabled, width, sortorder)"
                          " VALUES (?, ?, ?, ?, ?, ?)")
            query.addBindValue(self.page.id)
            query.addBindValue(param.fieldid)
            query.addBindValue(position)
            query.addBindValue(int(param.enabled))
            if not param.enabled:
                param.width = None
            query.addBindValue(param.width)
            query.addBindValue(param.sortorder)
            query.exec_()

        for fieldId, columnFilters in self.filters.items():
            for filter_ in columnFilters.filters():
                query = QSqlQuery(self.db)
                query.prepare(
                    "INSERT INTO filters (pageid, fieldid, value,"
                    " blank, data, revert) VALUES (?, ?, ?, ?, ?, ?)")
                query.addBindValue(self.page.id)
                query.addBindValue(fieldId)
                query.addBindValue(filter_.value)
                if filter_.isBlank():
                    blank = int(True)
                else:
                    blank = None
                query.addBindValue(blank)
                if filter_.isData():
                    data = int(True)
                else:
                    data = None
                query.addBindValue(data)
                if filter_.isRevert():
                    revert = int(True)
                else:
                    revert = None
                query.addBindValue(revert)
                query.exec_()

        self.db.commit()
예제 #53
0
 def addVideoToPlaylist(self, video_id, playlist_id):
     query = QSqlQuery()
     query.prepare("""INSERT INTO videos_playlists_link VALUES (?,?)""")
     query.addBindValue(video_id)
     query.addBindValue(playlist_id)
     query.exec()
예제 #54
0
    def __init__(self, page):
        super(ListPageParam, self).__init__(page)

        self.page = page
        self.db = page.db

        if 'lists' not in self.db.tables():
            sql = """CREATE TABLE lists (
                id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                pageid INTEGER,
                fieldid INTEGER,
                position INTEGER,
                enabled INTEGER,
                width INTEGER,
                sortorder INTEGER)"""
            QSqlQuery(sql, self.db)

        query = QSqlQuery(self.db)
        query.prepare("SELECT * FROM lists WHERE pageid=? ORDER BY position")
        query.addBindValue(self.page.id)
        query.exec_()
        self.columns = []
        while query.next():
            param = ColumnListParam(query.record())
            self.columns.append(param)

        self.fields = page.fields

        # Create default parameters
        if not self.columns:
            for field in self.fields.userFields:
                enabled = False
                if field.name in [
                        'image', 'title', 'value', 'unit', 'country', 'year',
                        'status'
                ]:
                    enabled = True
                param = ColumnListParam(field.id, enabled)
                self.columns.append(param)

        if 'filters' not in self.db.tables():
            sql = """CREATE TABLE filters (
                id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                pageid INTEGER,
                fieldid INTEGER,
                value INTEGER,
                blank INTEGER,
                data INTEGER,
                revert INTEGER)"""
            QSqlQuery(sql, self.db)

        query = QSqlQuery(self.db)
        query.prepare("SELECT * FROM filters WHERE pageid=?")
        query.addBindValue(self.page.id)
        query.exec_()
        self.filters = {}
        while query.next():
            fieldId = query.record().value('fieldid')
            column_name = self.fields.field(fieldId).name
            if not query.record().isNull('value'):
                value = str(query.record().value('value'))
                filter_ = ValueFilter(column_name, value)
            if not query.record().isNull('data'):
                if query.record().value('data'):
                    filter_ = DataFilter(column_name)
            if not query.record().isNull('blank'):
                if query.record().value('blank'):
                    filter_ = BlankFilter(column_name)
            if not query.record().isNull('revert'):
                if query.record().value('revert'):
                    filter_.revert = True

            if fieldId not in self.filters.keys():
                self.filters[fieldId] = ColumnFilters(column_name)
            self.filters[fieldId].addFilter(filter_)
예제 #55
0
# 2. 新建表
# 新建一个名为student的表,包含id, name, age 三个属性, 其中ID为主键

query.prepare('create table student (id int primary key, name varchar(30), age int)')
if not query.exec_():
    query.lastError()
else:
    print('create a table')


# 3. 插入数据
# addBindValue()将值添加到列表中,调用顺序决定添加的顺序

insert_sql = 'insert into student values (?, ?, ?)'
query.prepare(insert_sql)
query.addBindValue(4)
query.addBindValue('test3')
query.addBindValue(1)
if not query.exec_():
    print(query.lastError())
else:
    print('inserted')


# 4. 查询
# 查询返回数据使用value(int)函数,例如select id, name, age from student value(0) 等于返回id属性的值, value(2) 等于age熟悉
# exec_() 查询成功返回true查询 否则返回false

query.prepare('select id, name, age from student')
if not query.exec_():
    query.lastError()
예제 #56
0
    def save(self):
        self.db.transaction()

        self.remove()

        query = QSqlQuery(self.db)
        query.prepare(
            "INSERT INTO statistics (pageid, showed, chart, fieldid, subfieldid, items, period, color)"
            " VALUES (?, ?, ?, ?, ?, ?, ?, ?)")
        query.addBindValue(self.pageId)
        query.addBindValue(int(self.__getitem__('showed')))
        query.addBindValue(self.__getitem__('chart'))
        query.addBindValue(self.__getitem__('fieldid'))
        query.addBindValue(self.__getitem__('subfieldid'))
        query.addBindValue(self.__getitem__('items'))
        query.addBindValue(self.__getitem__('period'))
        query.addBindValue(int(self.__getitem__('color')))
        query.exec_()

        self.db.commit()
예제 #57
0
    def save_filters(self):
        self.db.transaction()

        # Remove old values
        self.__remove_filters()

        for fieldId, columnFilters in self.filters.items():
            for filter_ in columnFilters.filters():
                query = QSqlQuery(self.db)
                query.prepare("INSERT INTO filters (pageid, fieldid, value,"
                              " blank, data, revert) VALUES (?, ?, ?, ?, ?, ?)")
                query.addBindValue(self.page.id)
                query.addBindValue(fieldId)
                query.addBindValue(filter_.value)
                if filter_.isBlank():
                    blank = int(True)
                else:
                    blank = None
                query.addBindValue(blank)
                if filter_.isData():
                    data = int(True)
                else:
                    data = None
                query.addBindValue(data)
                if filter_.isRevert():
                    revert = int(True)
                else:
                    revert = None
                query.addBindValue(revert)
                query.exec_()

        self.db.commit()
예제 #58
0
def new_reservation(ui, window, db, discount, thrd, mainui, model):
    db.open()
    query = QSqlQuery(db)
    #Retrieve room price from DB
    price_query = QSqlQuery(db)
    price_query.prepare('SELECT Price FROM Room WHERE Number = ?')
    price_query.addBindValue(ui.comboBox_2.currentText())
    price_query.exec_()
    price_query.next()
    price = price_query.value(0)
    #Prepare a query and add all values then execute and commit to DB
    db.transaction()
    query.prepare('INSERT INTO CurrentReservation VALUES (?,?,?,?,?,?,?,?)')
    query.addBindValue(ui.lineEdit.text())
    query.addBindValue(ui.treeView.currentIndex().siblingAtColumn(1).data())
    query.addBindValue(ui.comboBox_2.currentText())
    query.addBindValue(ui.dateEdit.date().toString("yyyy-MM-dd"))
    query.addBindValue(ui.dateEdit_2.date().toString("yyyy-MM-dd"))
    #Check if discount is applied
    if discount:
        query.addBindValue(ui.spinBox.value())
        query.addBindValue(0)
        query.addBindValue(price - (price * (ui.spinBox.value() / 100)))
    else:
        query.addBindValue(ui.spinBox.value())
        query.addBindValue(0)
        query.addBindValue(price)
    query.exec_()
    db.commit()
    db.close()
    if query.lastError().text() == '':
        QtWidgets.QMessageBox.information(
            window, 'New Reservation',
            'New Reservation has been successfully created',
            QtWidgets.QMessageBox.Ok)
    else:
        QtWidgets.QMessageBox.information(window, 'New Reservation',
                                          query.lastError().text(),
                                          QtWidgets.QMessageBox.Ok)
    ui.lineEdit.clear()
    ui.checkBox.setCheckState(QtCore.Qt.Unchecked)
    hlist = [
        'Reserv. ID', 'Customer ID', 'Room #', 'From', 'To', 'Discount',
        'Extension', 'Net Total'
    ]
    worker = TableWorker(
        update_table("CurrentReservation", hlist, mainui.current_res, db,
                     model))
    thrd.tryStart(worker)
예제 #59
0
class pyMailArchiver(QMainWindow):
    def __init__(self, parent=None):
        # Set up the user interface from Designer.
        super(pyMailArchiver, self).__init__()
        uic.loadUi("pyMailArchiverInterface.ui", self)
        self.show()

        self.read_config()

        self.m_typingTimer = QTimer()
        self.m_typingTimer.setSingleShot(True)

        self.m_typingTimer.timeout.connect(self.filterEntries)
        self.line_filter_all.textChanged.connect(self.onTextEdited)
        self.line_filter_subject.textChanged.connect(self.onTextEdited)
        self.line_filter_from.textChanged.connect(self.onTextEdited)
        self.line_filter_to.textChanged.connect(self.onTextEdited)
        self.line_filter_timestamp.textChanged.connect(self.onTextEdited)
        self.line_filter_attachments.textChanged.connect(self.onTextEdited)
        self.line_filter_message.textChanged.connect(self.onTextEdited)

        int_validator = QRegExpValidator(QRegExp("^[0-9]*$"))
        self.line_add_port.setValidator(int_validator)
        self.pBar_progress_import.setMinimum(0)
        self.pBar_progress_import.setValue(0)

        self.lastFilterCall = time.time()

        self.threadDump = []

        ##### Database Setup with QtSQL
        db_exist = os.path.isfile(self.db_path)

        self.database = QSqlDatabase.addDatabase("QSQLITE")

        self.database.setDatabaseName(self.db_path)
        self.database.open()
        self.dbquery = QSqlQuery()

        if db_exist == False:
            # Create new database if none is there
            self.dbquery.prepare(
                '''CREATE TABLE `mails` (`MailID`	INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,	`MailHash`	TEXT, `Subject` TEXT, `Sender` TEXT, `Recipient` TEXT, `CC_recp` TEXT, `BCC_recp` TEXT, `receive_time` TIMESTAMP, `attachments` TEXT, `account` TEXT, `folder` TEXT, `Message` TEXT)'''
            )
            self.dbquery.exec_()
            self.database.commit()

        # Setup TableModel to populate tables in UI directly from database
        self.model_mails = QSqlQueryModel(self)
        #self.model_mails.setTable("mails")
        self.model_mails.setQuery(
            "SELECT * from mails ORDER BY receive_time DESC")

        #self.model_mails.select()

        class dummy:
            def text(self):
                return ""

        self.proxy = CustomSortFilterProxyModel()
        self.proxy.setFilterTextBoxDict({
            "all": self.line_filter_all,
            "subject": self.line_filter_subject,
            "from": self.line_filter_from,
            "to": self.line_filter_to,
            "cc": self.cBox_filter_cc,
            "bcc": self.cBox_filter_bcc,
            "receive_time": self.line_filter_timestamp,
            "attachments_yes": self.cBox_filter_attachment_yes,
            "attachments_no": self.cBox_filter_attachment_no,
            "attachments_name": self.line_filter_attachments,
            "account": self.cBox_filter_account,
            "folder": self.cBox_filter_folder,
            "message": self.line_filter_message
        })
        self.proxy.setSourceModel(self.model_mails)

        #self.tableView_mails.setModel(self.proxy)
        self.tableView_mails.setModel(self.model_mails)
        self.tableView_mails.setColumnHidden(0, True)
        self.tableView_mails.setColumnHidden(1, True)
        self.tableView_mails.setColumnHidden(5, True)
        self.tableView_mails.setColumnHidden(6, True)
        self.tableView_mails.setColumnHidden(8, True)
        self.tableView_mails.setColumnHidden(9, True)
        self.tableView_mails.setColumnHidden(10, True)
        self.tableView_mails.setColumnHidden(11, True)
        self.tableView_mails.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.tableView_mails.verticalHeader().setVisible(False)
        self.tableView_mails.setSortingEnabled(True)
        #self.tableView_mails.sortByColumn(7,QtCore.Qt.DescendingOrder)
        self.tableView_mails.update()

        # populate Account Name combobox
        self.cBox_account.addItem("-- Account --")
        for filename in os.listdir("."):
            if filename.endswith(".account"):
                self.cBox_account.addItem(filename.rsplit(".", 1)[0])

        self.dbquery.prepare("SELECT DISTINCT account FROM mails")
        self.dbquery.exec_()
        while self.dbquery.next():
            self.cBox_filter_account.addItem(self.dbquery.value(0))

        self.dbquery.prepare("SELECT DISTINCT folder FROM mails")
        self.dbquery.exec_()
        while self.dbquery.next():
            self.cBox_filter_folder.addItem(self.dbquery.value(0))

        return

    def read_config(self, filename="pyMailArchiverConfig.ini"):
        config = ConfigParser()
        config.read(filename)

        #### Global
        try:
            self.db_path = config["Global"]["DatabaseFile"]
            print(self.db_path)
        except:
            QMessageBox.warning(
                self, 'Invalid config value',
                'DatabaseFile value for Global in config file invalid',
                QMessageBox.Ok)

        try:
            self.archiveBasePath = config["Global"]["archiveBasePath"]
            self.archiveBasePath = self.archiveBasePath.replace("\\\\",
                                                                "/").replace(
                                                                    "\\", "/")
            if self.archiveBasePath[-1] != "/":
                self.archiveBasePath += "/"
            print(self.archiveBasePath)
        except:
            QMessageBox.warning(
                self, 'Invalid config value',
                'archiveBasePath value for Global in config file invalid',
                QMessageBox.Ok)

    def filterEntries(self):
        queryString = "SELECT * FROM mails"

        # variables for query. store them in list b/c QSqlQuery.addBindValue can only be called after QSqlQuery.prepare
        bindValueList = []

        # build query string based on actually used filter fields.
        filterString = self.line_filter_subject.text()
        if filterString != "":
            queryString += " WHERE (Subject LIKE ?"
            bindValueList.append("%" + filterString + "%")

        filterString = self.line_filter_message.text()
        if filterString != "":
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            queryString += "Message LIKE ?"
            bindValueList.append("%" + filterString + "%")

        filterString = self.line_filter_timestamp.text()
        if filterString != "":
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            queryString += "receive_time LIKE ?"
            bindValueList.append("%" + filterString + "%")

        filterString = self.line_filter_from.text()
        if filterString != "":
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            queryString += "Sender LIKE ?"
            bindValueList.append("%" + filterString + "%")

        filterString = self.line_filter_to.text()
        if filterString != "":
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            if self.cBox_filter_cc.isChecked(
            ) or self.cBox_filter_bcc.isChecked():
                queryString += "(Recipient LIKE ?"
                bindValueList.append("%" + filterString + "%")
                if self.cBox_filter_cc.isChecked():
                    queryString += " OR CC_recp LIKE ?"
                    bindValueList.append("%" + filterString + "%")
                if self.cBox_filter_bcc.isChecked():
                    queryString += " OR BCC_recp LIKE ?"
                    bindValueList.append("%" + filterString + "%")
                queryString += ")"
            else:
                queryString += "Recipient LIKE ?"
                bindValueList.append("%" + filterString + "%")

        filterString = self.line_filter_attachments.text()
        if filterString != "":
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            queryString += "attachments LIKE ?"
            bindValueList.append("%" + filterString + "%")
        elif self.cBox_filter_attachment_yes.isChecked(
        ) != self.cBox_filter_attachment_no.isChecked():
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            if self.cBox_filter_attachment_yes.isChecked():
                queryString += "attachments != ?"
            else:
                queryString += "attachments = ?"
            bindValueList.append("None")

        if self.cBox_filter_account.currentIndex() != 0:
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            queryString += "account = ?"
            bindValueList.append(self.cBox_filter_account.currentText())

        if self.cBox_filter_folder.currentIndex() != 0:
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE ("
            queryString += "folder = ?"
            bindValueList.append(self.cBox_filter_folder.currentText())

        if len(bindValueList) > 0:
            queryString += ")"

        # add filtering of all fields if filter line "all" is used
        filterString = self.line_filter_all.text()
        if filterString != "":
            if len(bindValueList) > 0:
                queryString += " AND "
            else:
                queryString += " WHERE "

            queryString += "(Subject LIKE ? OR Message LIKE ? OR receive_time LIKE ? OR Sender LIKE ? OR Recipient LIKE ? OR CC_recp LIKE ? OR BCC_recp LIKE ? OR attachments LIKE ? OR account LIKE ? OR folder LIKE ?)"

            for i in range(10):
                bindValueList.append("%" + filterString + "%")

        queryString += " ORDER BY receive_time DESC"

        # prepare query and add bind values
        self.dbquery.prepare(queryString)
        for value in bindValueList:
            self.dbquery.addBindValue(value)

        self.dbquery.exec_()

        self.model_mails.setQuery(self.dbquery)
        print("filtering")

    def onTextEdited(self):
        self.m_typingTimer.start(200)

    @pyqtSlot(int)
    def on_cBox_filter_cc_stateChanged(self, state):
        print(5)
        self.filterEntries()

    @pyqtSlot(int)
    def on_cBox_filter_bcc_stateChanged(self, state):
        print(6)
        self.filterEntries()

    @pyqtSlot(int)
    def on_cBox_filter_attachment_yes_stateChanged(self, state):
        print(8)
        self.filterEntries()

    @pyqtSlot(int)
    def on_cBox_filter_attachment_no_stateChanged(self, state):
        print(9)
        self.filterEntries()

    @pyqtSlot(int)
    def on_cBox_filter_account_currentIndexChanged(self, state):
        print(11)
        self.filterEntries()

    @pyqtSlot(int)
    def on_cBox_filter_folder_currentIndexChanged(self, state):
        print(12)
        self.filterEntries()

    @pyqtSlot(int)
    def on_cBox_password_dont_save_stateChanged(self, state):
        self.line_add_password.setEnabled(not state)

    @pyqtSlot(QModelIndex)
    def on_tableView_mails_doubleClicked(self, index):
        row = index.row()

        mailID = self.tableView_mails.model().data(
            self.tableView_mails.model().index(row, 0))
        filepath = self.constructFilePath(mailID)

        print("opening ", filepath)
        #os.startfile(filepath)
        if sys.platform == "win32":
            os.startfile(filepath)
        else:
            opener = "open" if sys.platform == "darwin" else "xdg-open"
            subprocess.call(["thunderbird", filepath])

    @pyqtSlot()
    def on_btn_add_account_clicked(self):
        server = self.line_add_server.text()
        port = self.line_add_port.text()
        username = self.line_add_username.text()
        if self.cBox_password_dont_save.isChecked():
            password = "******"
        else:
            password = self.line_add_password.text()

        if "" in [server, port, username, password]:
            QMessageBox.warning(self, 'Incomplete form!',
                                'Please fill all fields before continuing.',
                                QMessageBox.Ok)
            return

        if self.cBox_password_dont_save.isChecked():
            text, ok = QtGui.QInputDialog.getText(
                self,
                'Input Dialog',
                'Enter password:'******'Connection failed!',
                'Connecting to server failed. Check server settings and credentials.',
                QMessageBox.Ok)
            return

        accountConfig = ConfigParser()
        accountConfig["server"] = {"name": server, "port": port}
        accountConfig["credentials"] = {"name": username, "pass": password}
        with open(username + ".account", "w") as configfile:
            accountConfig.write(configfile)

        QMessageBox.information(
            self, 'Connection succesfull!',
            'Successfully connected to server! Settings saved!',
            QMessageBox.Ok)
        return

    @pyqtSlot()
    def on_btn_archive_new_clicked(self):
        account = self.cBox_account.currentText()
        if account == "-- Select --":
            return

        # read config data from account file
        accountData = ConfigParser()
        accountData.read(account + ".account")

        serverName = accountData['server']['name']
        serverPort = accountData['server']['port']
        username = accountData['credentials']['name']
        password = accountData['credentials']['pass']
        exclude_patterns = accountData['settings']['excludedFolders']

        # process config data
        if username.lower() == "input":
            text, ok = QtGui.QInputDialog.getText(self, 'Input Dialog',
                                                  'Enter username:'******'Input Dialog',
                'Enter password:'******'Parsing excluded folders failed!',
                'Parsing excluded folders failed! Check config file and make sure excludedFolders is a list of valid regex expressions.',
                QMessageBox.Ok)
            return

        # connect to server
        try:
            server = imaplib.IMAP4_SSL(serverName, int(serverPort))
            server.login(username, password)
        except:
            QMessageBox.warning(
                self, 'Connection failed!',
                'Connecting to server failed. Check server settings and credentials in config file.',
                QMessageBox.Ok)
            return

        # Get list of all folders
        typ, data = server.list()
        serverFolders = []
        localFolders = []
        for folder in data:
            folder_str = folder.decode("utf-8")
            print(folder)
            print(folder_str)
            folder_str = folder_str.split('"/"', 1)[1].strip()
            serverFolders.append(folder_str)
            folder_str = folder_str.replace('"', '') + "/"
            localFolders.append(folder_str)

        new_mails = 0
        for i in range(len(serverFolders)):
            serverFolder = serverFolders[i]
            localFolder = localFolders[i]
            self.label_progress_folder.setText("Processing Folder: " +
                                               localFolder)
            print("----")
            # skip folder if in exclude list
            skip = False
            if exclude_patterns_compiled:
                for pattern in exclude_patterns_compiled:
                    if pattern.match(localFolder):
                        print("skipping", localFolder)
                        skip = True
                        break
            if skip:
                print("now skipping")
                continue

            print(serverFolder)
            server.select(serverFolder)
            typ, data = server.search(None, 'ALL')

            # iterate over mails in folder
            num_emails = len(data[0].split())
            self.pBar_progress_import.setMinimum(0)
            self.pBar_progress_import.setMaximum(num_emails)
            mailCount = 0
            for num in data[0].split():
                mailCount += 1
                self.label_progress_email.setText("E-Mail: %s/%s" %
                                                  (mailCount, num_emails))
                self.pBar_progress_import.setValue(mailCount)
                QCoreApplication.processEvents()
                header = {}
                print("------")
                print(localFolder)
                # get basic data to create hash
                typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (date)])')
                header["date"] = data[0][1].decode("utf-8").split(
                    ":", 1)[1].split("\r")[0][1:].strip()

                typ, data = server.fetch(num,
                                         '(BODY[HEADER.FIELDS (subject)])')
                header["subject"] = data[0][1].decode("utf-8").strip()

                typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (from)])')
                header["from"] = data[0][1].decode("utf-8").strip()

                typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (to)])')
                header["to"] = data[0][1].decode("utf-8").strip()

                typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (cc)])')
                header["cc"] = data[0][1].decode("utf-8").strip()

                typ, data = server.fetch(num, '(BODY[HEADER.FIELDS (bcc)])')
                header["bcc"] = data[0][1].decode("utf-8").strip()

                header = self.parseHeader(header)

                unique_hash = self.createMailHash(header)
                print("header", header)
                print("hash", unique_hash)
                if self.checkMailExist(unique_hash):
                    # message already exists
                    print(
                        "SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL"
                    )
                    continue
                new_mails += 1
                #print("archiving")
                typ, data = server.fetch(num, '(RFC822)')
                message_bytes = data[0][1]
                message = email.message_from_bytes(message_bytes)

                self.saveMailToDatabase(message, account, localFolder)

                # get MailID from database
                self.dbquery.prepare(
                    "SELECT MailID FROM mails WHERE MailHash=?")
                self.dbquery.addBindValue(unique_hash)
                self.dbquery.exec_()
                self.dbquery.next()
                MailID = self.dbquery.value(0)

                # generate savepath and save mail to file
                savename = self.constructFilePath(MailID)
                savepath = savename.rsplit("/", 1)[0]
                if not os.path.exists(savepath):
                    os.makedirs(savepath)
                f = open(savename, 'wb')
                f.write(message_bytes)
                f.close()

        self.tableView_mails.update()
        print("new mails", new_mails)
        self.label_progress_folder.setText("Finished succesfully!")
        self.label_progress_email.setText("%s new Mails" % new_mails)

    def parseHeader(self, header):
        ret_header = {}
        print(header)
        print(header["date"])
        timeString = header["date"]
        try:
            timestamp = dateutil.parser.parse(header["date"].replace(
                "(", "").replace(")", ""))
        except (ValueError):
            timestamp = dateutil.parser.parse(header["date"].replace(
                "(", "").replace(")", "").rsplit(" ", 1)[0])
        """
        # catch variations of empty subjects
            if header["subject"] in ["\r\n", "\n", "\r"] or header["subject"] == None:
                subject = ""
            else:
                subjectList = email.header.decode_header(header["subject"])
                subject = ""
                for subjectPart in subjectList:
                    if type(subjectPart[0]) == bytes:
                        print(subjectPart)
                        print(type(subjectPart))
                        print(type(subjectPart[0]))
                        print(type(subjectPart[1]))
                        if subjectPart[1] == None:
                            subject += subjectPart[0].decode(errors="replace")
                        else:
                            subject += subjectPart[0].decode(subjectPart[1],errors="replace")
                    else:
                        try:
                            subject += str(subjectPart[0])
                        except:
                            pass
                # someteimes there is a "Subject:" in front of the subject
                # get rid of this
                if len(subject) > 7:
                    if subject[0:8] == "Subject:":
                        if len(subject) > 8:
                            subject = subject[8:]
                        else:
                            subject = ""
        """
        def decode_header_field(fieldString):
            # catch variations of empty subjects
            if fieldString in ["\r\n", "\n", "\r"] or fieldString == None:
                returnString = ""
            else:
                fieldList = email.header.decode_header(fieldString)
                returnString = ""
                for fieldPart in fieldList:
                    if type(fieldPart[0]) == bytes:
                        print(fieldPart)
                        print(type(fieldPart))
                        print(type(fieldPart[0]))
                        print(type(fieldPart[1]))
                        if fieldPart[1] == None:
                            returnString += fieldPart[0].decode(
                                errors="replace")
                        else:
                            returnString += fieldPart[0].decode(
                                fieldPart[1], errors="replace")
                    else:
                        try:
                            returnString += str(fieldPart[0])
                        except:
                            pass

            return returnString

        subject = decode_header_field(header["subject"]).replace(
            "Subject:", "").strip()
        sender = decode_header_field(header["from"]).replace("From:",
                                                             "").strip()
        recipient = decode_header_field(header["to"]).replace("To:",
                                                              "").strip()
        cc = decode_header_field(header["cc"]).replace("CC:", "").strip()
        bcc = decode_header_field(header["bcc"]).replace("BCC:", "").strip()

        def parseMailAdressList(AdressList):
            adList = re.findall(r'[\w\.-]+@[\w\.-]+', AdressList)
            adList = getUniqueList(adList)
            return adList

        ret_header["subject"] = subject
        ret_header["date"] = timestamp

        ret_header["from"] = sender
        ret_header["to"] = recipient
        ret_header["cc"] = cc
        ret_header["bcc"] = bcc

        ret_header["from_only_email"] = parseMailAdressList(header["from"])
        ret_header["to_only_email"] = parseMailAdressList(header["to"])
        ret_header["cc_only_email"] = parseMailAdressList(header["cc"])
        ret_header["bcc_only_email"] = parseMailAdressList(header["bcc"])

        return ret_header

    def getMessageHeader(self, message):
        header = {}
        sender = message["from"]
        if sender == None:
            sender = ""
        header["from"] = sender

        recipient = message["to"]
        if recipient == None:
            recipient = ""
        header["to"] = recipient

        cc = message["cc"]
        if cc == None:
            cc = ""
        header["cc"] = cc

        bcc = message["bcc"]
        if bcc == None:
            bcc = ""
        header["bcc"] = bcc

        header["date"] = message["date"]
        header["subject"] = message["subject"]
        header = self.parseHeader(header)

        return header

    def saveMailToDatabase(self, message, account, localFolder):
        if localFolder.endswith("/"):
            localFolder = localFolder[:-1]
        if localFolder.startswith("/"):
            localFolder = localFolder[1:]

        header = self.getMessageHeader(message)
        messageBody, attachments = self.parseMessage(message)

        def jsondump_list(dumplist):
            if len(dumplist) > 1:
                dumplist = json.dumps(dumplist)
            elif type(dumplist) == type([1]) and len(dumplist) == 0:
                dumplist = "None"
            elif type(dumplist) == type([1]):
                dumplist = dumplist[0]
            return dumplist

        sender = header["from"]
        recipient = header["to"]
        cc = header["cc"]
        bcc = header["bcc"]
        subject = header["subject"]
        date_object = header["date"]
        unique_hash = self.createMailHash(header)
        print("header", header)
        print("hash", unique_hash)

        attachments = jsondump_list(attachments)
        if recipient == "":
            recipient = "None"
        if cc == "":
            cc = "None"
        if bcc == "":
            bcc = "None"

        self.dbquery.prepare(
            "INSERT INTO mails (MailHash, Subject, Sender, Recipient, CC_recp, BCC_recp, receive_time, attachments, account, folder, Message) VALUES (?,?,?,?,?,?,?,?,?,?,?)"
        )
        self.dbquery.addBindValue(unique_hash)
        self.dbquery.addBindValue(subject)
        self.dbquery.addBindValue(sender)
        self.dbquery.addBindValue(recipient)
        self.dbquery.addBindValue(cc)
        self.dbquery.addBindValue(bcc)
        self.dbquery.addBindValue(QtCore.QDateTime(date_object))
        self.dbquery.addBindValue(attachments)
        self.dbquery.addBindValue(account)
        self.dbquery.addBindValue(localFolder)
        self.dbquery.addBindValue(messageBody)

        self.dbquery.exec_()
        self.database.commit()
        print("commited")

    def createMailHash(self, header):
        hash_string = str(header["date"]) + header["subject"] + ''.join(
            header["from_only_email"] + header["to_only_email"] +
            header["cc_only_email"] + header["bcc_only_email"])

        unique_hash = hashlib.sha512(hash_string.encode("utf-8")).hexdigest()
        return unique_hash

    def checkMailExist(self, unique_hash):
        self.dbquery.prepare("SELECT MailID FROM mails WHERE MailHash=?")
        self.dbquery.addBindValue(unique_hash)
        self.dbquery.exec_()

        return self.dbquery.next()

    def parseMessage(self, message):
        attachments = []
        try:
            if message.is_multipart():
                payload = message.get_payload()
                for part in payload:
                    if part.get_content_type().find("text") != -1:
                        if part.get_content_charset():
                            messageBody = part.get_payload(decode=True).decode(
                                part.get_content_charset(), "replace")
                        else:
                            messageBody = part.get_payload(decode=False)
                    elif part.get_content_disposition() == "attachment":
                        filename = part.get_filename()
                        attachments.append(filename)
                    elif part.is_multipart():
                        messageBody, attachments = self.parseMessage(part)

            elif message.get_content_type().find("text") != -1:
                if message.get_content_charset():
                    messageBody = message.get_payload(decode=True).decode(
                        message.get_content_charset(), "replace")
                else:
                    messageBody = message.get_payload(decode=False)
            else:
                print(message.get_content_type())
            messageBody = messageBody.replace("\r", "").replace("\n", "")
        except:
            messageBody = "Message cannot be previewed here. Please open in external program."
        return messageBody, attachments

    @pyqtSlot()
    def on_btn_import_folder_clicked(self):
        path = str(QFileDialog.getExistingDirectory(
            self, "Select Directory")).replace("\\", "/")
        if path == "":
            return
        self.line_import_source_folder.setText(path)
        folder = path.rsplit("/", 1)[1]
        self.line_import_save_folder.setText(folder)

        print(path)

    @pyqtSlot()
    def on_btn_file_import_clicked(self):
        path = self.line_import_source_folder.text()
        account = self.line_import_account.text()
        localFolder = self.line_import_save_folder.text()

        if not os.path.isdir(path) or "" in [
                path.strip(),
                account.strip(),
                localFolder.strip()
        ]:
            QMessageBox.warning(
                self, 'Incomplete information',
                'Please fill all fields and make sure the provided path exists.',
                QMessageBox.Ok)
            return

        path = path.replace("\\", "/")
        if not path.endswith("/"):
            path += "/"

        self.label_progress_folder.setText("Processing Folder: " + localFolder)
        mailTotal = 0
        for file in os.listdir(path):
            if file.endswith(".eml"):
                mailTotal += 1
        self.pBar_progress_import.setMinimum(0)
        self.pBar_progress_import.setMaximum(mailTotal)
        self.pBar_progress_import.setValue(0)
        mailCount = 0
        newMailCount = 0
        failedCount = 0

        for file in os.listdir(path):
            if file.endswith(".eml"):
                mailCount += 1
                self.label_progress_email.setText("E-Mail: %s/%s" %
                                                  (mailCount, mailTotal))
                self.pBar_progress_import.setValue(mailCount)
                QCoreApplication.processEvents()
                print("working on file", file)
                try:
                    message = email.message_from_file(open(path + file, "r"))
                except:
                    failedCount += 1
                    continue

                header = self.getMessageHeader(message)
                hash = self.createMailHash(header)
                if self.checkMailExist(hash):
                    print(
                        "SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL SKIPPING MAIL"
                    )
                    continue

                newMailCount += 1
                self.saveMailToDatabase(message, account, localFolder)

                # get MailID from database
                self.dbquery.prepare(
                    "SELECT MailID FROM mails WHERE MailHash=?")
                self.dbquery.addBindValue(hash)
                self.dbquery.exec_()
                self.dbquery.next()
                MailID = self.dbquery.value(0)

                # generate savepath and save mail to file
                savename = self.constructFilePath(MailID)
                savepath = savename.rsplit("/", 1)[0]
                if not os.path.exists(savepath):
                    os.makedirs(savepath)
                shutil.copyfile(path + file, savename)

        self.label_progress_folder.setText("Finished succesfully!")
        self.label_progress_email.setText("%s new Mails, %s failed" %
                                          (newMailCount, failedCount))

    def constructFilePath(self, MailID):
        self.dbquery.prepare(
            "SELECT MailHash, account, folder FROM mails WHERE MailID=?")
        self.dbquery.addBindValue(MailID)
        self.dbquery.exec_()
        self.dbquery.next()

        hash = self.dbquery.value(0)
        account = self.dbquery.value(1)
        folder = self.dbquery.value(2)
        print("acc", account)
        print("folder", folder)
        print("hash", hash)
        return self.archiveBasePath + account + "/" + folder + "/" + hash + ".eml"

    @pyqtSlot()
    def on_btnResetView_clicked(self):
        print("reseting")

        self.line_filter_all.setText("")
        self.line_filter_subject.setText("")
        self.line_filter_from.setText("")
        self.line_filter_to.setText("")
        self.cBox_filter_cc.setChecked(True)
        self.cBox_filter_bcc.setChecked(True)
        self.line_filter_timestamp.setText("")
        self.cBox_filter_attachment_yes.setChecked(True)
        self.cBox_filter_attachment_no.setChecked(True)
        self.line_filter_attachments.setText("")
        self.cBox_filter_account.setCurrentIndex(0)
        self.cBox_filter_folder.setCurrentIndex(0)
        self.line_filter_message.setText("")

        self.model_mails.setQuery(
            "SELECT * from mails ORDER BY receive_time DESC")

    def closeEvent(self, event):
        self.database.commit()
        self.database.close()
        event.accept()
예제 #60
0
 def __remove_filters(self):
     query = QSqlQuery(self.db)
     query.prepare("DELETE FROM filters WHERE pageid=?")
     query.addBindValue(self.page.id)
     query.exec_()