Example #1
0
class Model():
    def __init__(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')

    def __del__(self):
        self.crud.closeConnection()

#    получает текст стишка по заданному ID

    def getVerseContent(self, idVal):

        self.crud.sql = '''SELECT verse_content FROM `verses_list` WHERE `id`={0}'''.format(
            idVal)
        verseContent = self.crud.readAct()

        return verseContent[0]


#    меняет содержание стишка в БД

    def changeVerseContent(self, idVal, verseContent):

        self.crud.sql = '''UPDATE verses_list SET verse_content='{1}' 
        WHERE id={0}'''.format(idVal, verseContent)
        self.crud.updateAct()
Example #2
0
    def getWholeVerseData(self, verse_id):
        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        crud.sql = 'SELECT * FROM verses_list WHERE id=\'{0}\''.format(
            verse_id)
        verse_data = crud.readAct()
        crud.closeConnection()

        return verse_data
Example #3
0
    def __init__(self):

        #Удаляем queue
        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        crud.sql = 'DROP TABLE queue;'
        crud.deleteAct()
        print('Drop\'нули таблицу queue')
        crud.closeConnection()
Example #4
0
    def queueBlocker(self):

        exec_time = self.curTime + 72000
        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        crud.sql="INSERT INTO queue (name, email, exec_time, verse_id)" \
                 "VALUES (\'{0}\',\'{1}\',\'{2}\',\'{3}\')".format(
                'blocker_queue','none',exec_time,1234567)
        crud.createAct()
        crud.closeConnection()
Example #5
0
    def addRowIntoQueue(self, name, email, exec_time, verse_id):

        # print(' Имя - {0},\n Email - {1},\n exec_time - {2},\n '
        #       'verse_id - {3}\n'.format(name,email,exec_time,verse_id))
        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        crud.sql="INSERT INTO queue (name, email, exec_time, verse_id) " \
                 "VALUES (\'{0}\',\'{1}\',\'{2}\',\'{3}\')".format(name,
                 email,exec_time,verse_id)
        crud.createAct()
        crud.closeConnection()
Example #6
0
    def canSend(self, id):

        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        crud.sql = 'SELECT exec_time FROM queue WHERE id=\'{0}\''.format(id)
        exec_time = (crud.readAct())[0][0]
        curTime = round(time.time())
        crud.closeConnection()

        if curTime >= exec_time:
            print(curTime - exec_time)
            return True
        else:
            print(curTime - exec_time)
            return False
Example #7
0
    def getRandVerseID(self, authors):

        # получить случайного автора
        authors = authors.split(',')
        rand_author = (random.choice(authors)).strip()
        print('random author ------ > {0}'.format(rand_author))
        #получить случайный verse_id
        crud = Crud('localhost', 'andrew', 'andrew', 'verses')

        crud.sql = '''SELECT * FROM verses_list WHERE author_id={0}
                    ORDER BY RAND() LIMIT 1'''.format(rand_author)
        #Возвращает кортеж, поэтому прийдеться извлечь ключ
        verse_id = (crud.readAct())[0][0]
        crud.closeConnection()

        return verse_id
Example #8
0
class ProxyAct:
    def __init__(self, ip_address, port):

        self.ip_address = ip_address
        self.port = port
        self.crud = Crud('localhost', 'andrew', 'andrew', 'proxy')

    # проверяет прокси на доступность. Если прокси не рабочий он игнорируеться.
    def checkProxy(self):

        timeout = 10
        result = call(
            'curl -s --connect-timeout {0} -x {1}:{2} http://google.com'.
            format(timeout, self.ip_address, self.port),
            stdout=PIPE,
            shell=True)

        if result == 0:
            print('Всё путем! IP: {0:16} - хороший'.format(self.ip_address))

            return True
        else:
            print('Плохо, не подошел')

            return False

    # добавляет прокси в БД
    def addProxy(self):

        if (self.checkProxy()) == True:

            self.crud.sql = ('''INSERT INTO proxies (ip_address, port, time)
                             VALUES ('{0}', '{1}', '{2}')'''.format(
                self.ip_address, self.port, round(time.time())))
            self.crud.createAct()

    # удатяет прокси из БД. Используеться в основном в случаях если ранее
    # добавленный прокси устарел.
    def deleteProxy(self):

        self.crud.sql = ('DELETE FROM proxies WHERE ip_address=\'{0}\''.format(
            self.ip_address))
        self.crud.deleteAct()

    def __del__(self):

        self.crud.closeConnection()
Example #9
0
    def __init__(self):

        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        #получить количество элементов queue
        crud.sql = 'SELECT * FROM queue'
        queue = crud.readAct()
        if (len(queue)) >= 1:

            # По-тихоньку отправляем письма из очереди
            for x in queue:

                if self.canSend(x[0]) == True:
                    self.sender(x)
                    # Если не одного элемента не осталось - завершаем цикл
                else:
                    'Прийдеться подождать с отправкой сообщений...'
        else:
            print('Очередь на данный момент пустая!')

        crud.closeConnection()
Example #10
0
class AuthorTable():
    def __init__(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        self.existTable()

    def __del__(self):

        self.crud.closeConnection()

    def createPoetsTable(self):

        self.crud.sql = '''CREATE TABLE poets (
                            id INT NOT NULL AUTO_INCREMENT,
                            PRIMARY KEY(id),
                            name VARCHAR(40) NOT NULL,
                            patronymic VARCHAR(40) NOT NULL,
                            lastname VARCHAR(40) NOT NULL,
                            followers INT NOT NULL,
                            rating float NOT NULL
                            );'''

        self.crud.createAct()

    def checkPoetsTable(self):

        self.crud.sql = 'SHOW TABLE STATUS LIKE \'poets\''
        authors = self.crud.readAct()
        if len(authors) == 0:
            print('Нету таблицы с авторами!')
            return False

        else:
            print('Есть такая таблица')
            return True

    def existTable(self):

        if self.checkPoetsTable() == False:
            self.createPoetsTable()
Example #11
0
class Add(QtGui.QWidget, add_view.Ui_Form):
    def __init__(self, parent=None):

        super().__init__(parent=None)
        self.setupUi(self)
        self.connect(self.pushButton, QtCore.SIGNAL('clicked()'),
                     self.printInput)

        self.connect(self.pushButton_2, QtCore.SIGNAL('clicked()'),
                     self.uncheckAll)

        self.addToList()

    # Выборка списка авторов из verses_list. Вывод выборки в listWidget
    # в окне добавления.
    def addToList(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        self.results = self.getRow()
        self.crud.closeConnection()

        self.listWidget.setSelectionMode(
            QtGui.QAbstractItemView.MultiSelection)
        for x in self.results[0]:
            self.listWidget.addItems(x)

    def uncheckAll(self):

        for row in range(0, self.listWidget.count()):

            item = self.listWidget.item(row)
            self.listWidget.setItemSelected(item, False)

    def printInput(self):

        print(self.lineEdit.text())
        print(self.lineEdit_2.text())
        print(self.lineEdit_3.text())
        print(self.lineEdit_4.text())
        items = self.listWidget.selectedItems()

        # Получим индексы выбранных авторов. Запишем их в indexes
        indexes = []
        for item in items:
            index = self.listWidget.row(item)
            indexes.append(index)

        authors_id = []
        for index in indexes:
            authors_id.append(str(self.results[1][index][0]))

        # Добавление в таблцу с контактами
        self.model = Model()
        self.model.addIntoContacts(self.lineEdit_2.text(),
                                   self.lineEdit.text(),
                                   self.lineEdit_4.text(),
                                   self.lineEdit_3.text(), authors_id)

    def getRow(self):

        self.crud.sql = ('SELECT lastname, name, patronymic '
                         'FROM poets ORDER BY lastname')
        raw_authors = self.crud.readAct()
        authors_name = []
        for elem in raw_authors:
            authors_name.append([' '.join(elem)])

        self.crud.sql = ('SELECT id FROM poets ORDER BY lastname')
        authors_id = self.crud.readAct()

        return authors_name, authors_id
Example #12
0
class Model():
    def __init__(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        self.existTable()

    def __del__(self):
        self.crud.closeConnection()

    def checkContactTable(self):

        self.crud.sql = 'SHOW TABLE STATUS LIKE \'contacts\''
        contacts = self.crud.readAct()
        if len(contacts) == 0:
            print('Нету таблицы с контактами!')
            return False

        else:
            print('Есть такая таблица')
            return True

    def createContactTable(self):

        self.crud.sql = '''CREATE TABLE contacts (
                            id INT NOT NULL AUTO_INCREMENT,
                            PRIMARY KEY(id),
                            name VARCHAR(40) NOT NULL,
                            email VARCHAR(40) NOT NULL,
                            quantity_per_day INT NOT NULL,
                            intervals INT NOT NULL,
                            authors TEXT NOT NULL
                            );'''

        self.crud.createAct()

    def existTable(self):

        if self.checkContactTable() == False:
            self.createContactTable()

    def addIntoContacts(self, name, email, quantity_per_day, intervals,
                        authors):

        authors = ','.join(authors)

        self.crud.sql = '''INSERT INTO contacts (name, email, quantity_per_day,
                         intervals, authors) VALUES (\'{0}\',\'{1}\', {2}, {3},
                         \'{4}\')'''.format(name, email, quantity_per_day,
                                            intervals, authors)

        self.crud.createAct()

    def editContacts(self, id, name, qpd, authors):

        authors = ','.join(authors)
        self.crud.sql = '''UPDATE contacts SET name='{0}',quantity_per_day='{1}',
                         authors='{2}' WHERE id=\'{3}\''''.format(
            name, qpd, authors, id)

        self.crud.updateAct()

    def removeFromContacts(self, id):

        id = int(id)
        self.crud.sql = 'DELETE FROM contacts WHERE id={0}'.format(id)
        self.crud.deleteAct()

    def zeroizeQpd(self, id):

        id = int(id)
        self.crud.sql = ("UPDATE contacts SET quantity_per_day=0 "
                         "WHERE id={0}".format(id))
        self.crud.updateAct()
Example #13
0
class Remove(QtGui.QWidget, remove_view.Ui_Form):
    def __init__(self, parent=None):

        super().__init__(parent=None)
        self.setupUi(self)
        self.center()
        self.showIntoTable()

        # Подключили кнопку deactivate
        self.connect(self.pushButton_5, QtCore.SIGNAL('clicked()'),
                     self.deactivateContact)
        # Подключили кнопку remove
        self.connect(self.pushButton_4, QtCore.SIGNAL('clicked()'),
                     self.deleteRowData)
        # Подключили кнопку quit
        self.connect(self.pushButton_3, QtCore.SIGNAL('clicked()'), self.close)
        # Подключили кнопку refresh
        self.connect(self.pushButton_6, QtCore.SIGNAL('clicked()'),
                     self.refreshTable)

    # Центрирование окна
    def center(self):

        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    # Делает refresh таблицы. А то без него как то скучно.
    def refreshTable(self):

        self.tableWidget.clear()
        self.showIntoTable()

    # Делает выборку контактов из таблицы
    def fetchAllFromContacts(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        self.crud.sql = 'SELECT * FROM contacts ORDER BY name'
        self.contacts = self.crud.readAct()
        self.crud.closeConnection()

    def paintZeroQpd(self):

        color = QtGui.QColor(255, 204, 230)

        for row in range(0, self.tableWidget.rowCount()):
            qpd_col = self.tableWidget.item(row, 3)
            qpd = int(qpd_col.text())
            if qpd == 0:

                for column in range(0, 6):
                    cell = self.tableWidget.item(row, column)
                    cell.setBackgroundColor(color)

    # Выводит содержимое из БД в таблицу
    def showIntoTable(self):

        self.fetchAllFromContacts()
        rows = len(self.contacts)
        # Рисуем header и делаем разметку
        self.tableWidget.setRowCount(rows)
        self.tableWidget.setColumnCount(6)
        self.tableWidget.setHorizontalHeaderLabels([
            'id', 'name', 'email', 'quantity_per_day', 'intervals', 'authors'
        ])
        # Выставим ширину столбцов
        self.tableWidget.setColumnWidth(1, 160)
        self.tableWidget.setColumnWidth(2, 160)
        self.tableWidget.setColumnWidth(5, 798)
        # Растянем ширину столбца до контента хедера
        self.tableWidget.resizeColumnToContents(0)
        self.tableWidget.resizeColumnToContents(3)

        try:

            # Заполнение таблицы содержимым
            rownumb = 0  #Номер текущего ряда
            for row in self.contacts:
                colnumb = 0  #Номер текущего столбца
                for column in row:

                    if (colnumb == 3) or (colnumb == 4):
                        item = QtGui.QTableWidgetItem(str(column))
                        item.setTextAlignment(QtCore.Qt.AlignCenter)
                        self.tableWidget.setItem(rownumb, colnumb, item)

                    else:
                        self.tableWidget.setItem(
                            rownumb, colnumb,
                            QtGui.QTableWidgetItem(str(column)))

                    colnumb = colnumb + 1
                rownumb = rownumb + 1

            self.paintZeroQpd()
            # Таблица уже заполнена содержимым
        except TypeError:

            print('В таблице осталось мало записей!')

    # Удаляет выбранную строку из БД
    def deleteRowData(self):

        currentRow = self.tableWidget.currentRow()
        id_value = self.tableWidget.item(currentRow, 0).text()
        print('Текущее значени выбранного элемента {0}'.format(id_value))
        crud = Model()
        crud.removeFromContacts(id_value)
        self.tableWidget.clear()
        self.showIntoTable()

    # Деактивирует выбранный контакт. Устанавливает значение qpd=0.
    # В результате контакт отписывается от рассылки.
    def deactivateContact(self):

        currentRow = self.tableWidget.currentRow()
        id_value = self.tableWidget.item(currentRow, 0).text()
        name = self.tableWidget.item(currentRow, 1).text()
        qpd = self.tableWidget.item(currentRow, 3).text()
        print('Текущее значени выбранного элемента {0}'.format(id_value))
        crud = Model()
        self.window4 = None
        if int(qpd) != 0:
            crud.zeroizeQpd(id_value)

        else:

            if self.window4 is None:
                id_value = str(id_value)
                print(id_value)
                self.window4 = Edit(self)
                self.window4.selectPreviousAuthors(id_value)
                self.window4.showPreviousName(name)

            self.window4.show()

        self.tableWidget.clear()
        self.showIntoTable()
class Rating():
    def __init__(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        self.getFollowers()
        self.updateFollowers()

    # Подсчитывает количество подписчиков приходящегося на каждого автора.
    def getFollowers(self):

        # Получить всех подписчиков
        self.crud.sql = "SELECT authors FROM contacts"
        authors = self.crud.readAct()
        temp_list = []

        # Создадим глобальный список в где один элемен - один автор.
        for author_group in authors:
            temp_list.append(author_group[0])

        all_authors = ','.join(temp_list)
        all_authors = all_authors.split(',')

        # Теперь в authors_list - словарь.
        # Ключи - это имена авторов, значения- подпсичики
        self.authors_list = collections.Counter(all_authors)
        self.followersInAll()

    # Обновляет таблицу poets. Пишет актуальное количество подписчиков в
    # поле followers, и рейтинг, который высчитываеться исходя из числа
    # подписчиков.
    def updateFollowers(self):

        self.authors_list = dict(self.authors_list)
        for key in self.authors_list:
            try:
                rating = self.calculateRating(self.authors_list[key])
                self.crud.sql = '''UPDATE poets SET followers={0}
                                 WHERE id={1}'''.format(
                    self.authors_list[key], key)
                self.crud.updateAct()

                self.crud.sql = '''UPDATE poets SET rating={0}
                                 WHERE id={1}'''.format(rating, key)
                self.crud.updateAct()

            except Exception:
                print('Блеать!')

    # Подсчитывает сколько подписчиков всего, с учетом задействованных авторов
    def followersInAll(self):

        followers_in_all = 0
        for key in self.authors_list:
            try:
                followers_in_all = followers_in_all + int(
                    self.authors_list[key])
            except TypeError:
                print('Блеать!')

        self.followers_in_all = followers_in_all

    # Получает число подписчиков и вычисляет рейтинг по несложной формуле.
    # Возвращает рейтинг в %
    def calculateRating(self, followers):

        rating = (followers / self.followers_in_all) * 100
        rating = round(rating, 2)

        return rating

    def __del__(self):

        self.crud.closeConnection()
Example #15
0
    def deleteFromQueue(self, id):

        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        crud.sql = 'DELETE FROM queue WHERE id=\'{0}\''.format(id)
        verse_data = crud.deleteAct()
        crud.closeConnection()
Example #16
0
class UpdateProxies():

    logfile = '/var/log/andrew/proxies.log'

    def __init__(self):

        self.working_proxies = []
        self.not_working_proxies = []
        # получаем список всех прокси
        self.crud = Crud('localhost', 'andrew', 'andrew', 'proxy')
        self.crud.sql = ('SELECT * FROM proxies')

        # Вывод строки следующего формата '1, '79.188.42.46', 8080, 1473365169'
        # ////                             id, ip_address,    port,  gmt_time
        proxies = self.crud.readAct()

        # проверим прокси на работоспособность. Попутно подведем статитику
        # какие рабочие а какие нет.
        for elem in proxies:

            proxy = ProxyAct(elem[1], elem[2])
            if (proxy.checkProxy() == True):

                elapsed_hours = round((time.time() - elem[3]) / 3600)
                print('ip {0:18} рабочий! Уже аж {1:3} часов \n'.format(
                    elem[1], elapsed_hours))
                self.working_proxies.append(elem[1])

            else:

                print('ip {0:18} не рабочий! \n'.format(elem[1]))
                self.not_working_proxies.append(elem[1])
                proxy.deleteProxy()

        print('Рабочих ip - {0}'.format(len(self.working_proxies)))
        print('Не рабочих ip - {0}'.format(len(self.not_working_proxies)))

        # проверим старый ли лог. Возьмем его размер

        cur_log_size = os.path.getsize(self.logfile)
        # лимит файл 10К
        logfile_size_limit = 10000
        if (cur_log_size) >= logfile_size_limit:

            os.remove(self.logfile)
            f = open(self.logfile, 'w')

            f.write('{0:#>100}\n{1:#^100}\n{2:#>100}'.format(
                '', ' This is log file with proxies ', '\n' * 2))
            f.close()

        try:

            # Пишем инфу в лог
            # получим самый старый и самый молодой возраст прокси
            self.crud.sql = 'SELECT MIN(time), MAX(time) FROM proxies'
            res = self.crud.readAct()
            # Переведи мне все это в часы
            older_proxy = round((time.time() - res[0]) / 3600)
            younger_proxy = round((time.time() - res[1]) / 3600)

            # Запишем инфу в лог
            saulog.WriteLog(
                self.logfile,
                'Рабочих ip - {0}'.format(len(self.working_proxies)))
            saulog.WriteLog(
                self.logfile,
                'Не рабочих ip - {0}'.format(len(self.not_working_proxies)))
            saulog.WriteLog(
                self.logfile,
                'Возраст самого старого прокси - {0} часов'.format(
                    older_proxy))
            saulog.WriteLog(
                self.logfile,
                'Возраст самого недавнего прокси - {0} часов\n\n'.format(
                    younger_proxy))
            # Лог записали
        except TypeError:

            print('не получилось...')

        self.crud.closeConnection()
Example #17
0
    def __init__(self):

        # Время для начала отсчета
        st_time = self.curTime
        #задержка межу отправками сообщения получателям
        delay = -10

        #Проверить существует ли таблица queue
        crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        crud.sql = 'SHOW TABLE STATUS LIKE \'queue\''
        result = crud.readAct()
        # Таблицы нету, его прийдеться создать
        if len(result) == 0:
            print('Нету таблицы queue!')
            #Cоздадим таблицу queue
            crud.sql = '''CREATE TABLE queue(
                            id INT NOT NULL AUTO_INCREMENT,
                            name VARCHAR(40) NOT NULL,
                            email VARCHAR(40) NOT NULL,
                            exec_time INT NOT NULL,
                            verse_id INT NOT NULL,
                            PRIMARY KEY (id)
                            );'''
            result = crud.createAct()

        #В противном случае можно завязывать с этапом создания queue
        else:
            print('queue?! Походу есть такая таблица!')

        # Сделать выборку из таблицы с контактами
        crud.sql = 'SELECT * FROM contacts'
        list = crud.readAct()
        #print(list)

        for row in list:
            exec_time = self.curTime
            name = str(row[1])
            email = str(row[2])
            interval = 2
            # author_id. Атовра представлены в виде id
            authors = str(row[5])
            # quantity_per_day - желаемое количество стишков в день
            qpd = int(row[3])

            if qpd == 0:
                print('Этот человек уже отписался от рассылки!')
                continue

            elif qpd == 1:
                # каждый раз генериуем новый verse_id для следущего абонента
                # в таблице queue
                verse_id = self.getRandVerseID(authors)
                exec_time = exec_time + delay
                self.addRowIntoQueue(name, email, exec_time, verse_id)

            # Для тех кто отписался от рассылки стишки не рассылаем!

            else:
                #то же что и в ветке if, только для больего количества qpd
                #print('qpd is {0}'.format(qpd))
                interval_list = self.calculateDayInterval(qpd)

                for once, interval in zip((range(0, qpd)), interval_list):

                    exec_time = self.curTime
                    verse_id = self.getRandVerseID(authors)
                    exec_time = exec_time + delay + interval
                    self.addRowIntoQueue(name, email, exec_time, verse_id)

        crud.closeConnection()
        self.queueBlocker()
Example #18
0
class FillAuthors():
    def __init__(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        self.gatAllAuthors()
        self.getOneLineAuthors()

    def __del__(self):

        self.crud.closeConnection()

    # Парсит автора. Получает строку типа Александр Сергеевич Пушкин.
    # Возвращает словарь: authors['name':Александр, 'patronymic':Сергеевич,
    # 'lastname':Пушкин]
    def parseAuthors(self, string):

        names = string.split(' ')
        temp_names = []
        # Вырежем пробелы вокруг строки
        for x in names:
            temp_names.append(x.strip(' '))
        names = temp_names

        names_number = len(names)

        # Если тольоко фамилия
        if names_number == 1:

            author = {'lastname': string, 'name': '', 'patronymic': ''}

        # Если фамилия имя
        elif names_number == 2:

            author = {'lastname': names[1], 'name': names[0], 'patronymic': ''}

        # Если фамилия, имя, отчество
        elif names_number == 3:

            author = {
                'lastname': names[2],
                'name': names[0],
                'patronymic': names[1]
            }

        return author

    # Получает список всех авторов и ложит их в lst_distinct
    def gatAllAuthors(self):

        self.crud.sql = 'SELECT DISTINCT author FROM verses_list'
        self.lst_distinct = self.crud.readAct()

        authors_list = []
        # Пошел процесс преобразования фамилий
        for elem in self.lst_distinct:

            self.verseslist_IN_poets(elem[0])

    # Соединяет список всех авторов в одну строку
    def getOneLineAuthors(self):

        self.authors_line = []
        for elem in self.lst_distinct:

            self.authors_line.append(elem[0])

    # Проверяет наличие поэта в poets. Если такового нету - добавляет его
    def verseslist_IN_poets(self, raw_author):

        author = self.parseAuthors(raw_author)
        self.crud.sql = '''SELECT * FROM poets WHERE name=\'{0}\' and
                         patronymic=\'{1}\' and lastname=\'{2}\''''.format(
            author['name'], author['patronymic'], author['lastname'])
        res = self.crud.readAct()
        if len(res) == 0:
            print('Автора {0} нету в списке!'.format(author['lastname']))
            id = self.addAuthorIntoPoets(author)
            self.updateAuthorID(id, raw_author)

    # Получает список authors=[имя, отчество, фамилия]
    # Приводит в соответстиве таблицу poets. Если автор есть в poets, но его
    # нету в verses_list - этот автор удаляеться.
    def poets_IN_verseslist(self, author):

        lst_distinct = ';'.join(self.authors_line)
        # author - это кортеж, поэтому создадим новую переменную
        lastname = author[2]

        # Если такая фамилия есть то поищем подетальней
        if lst_distinct.count(lastname) != 0:

            # Проекранируем спецсимволы
            lastname = lastname.replace('(', '\(')
            lastname = lastname.replace(')', '\)')
            pattern = r'{0}\s*{1}\s*{2}'.format(author[0], author[1], lastname)
            # Ищем по всем имеющимся параметрам. Имя, Отчество, Фамилия
            res = re.search(pattern, lst_distinct)
            if res == None:
                print('Такого автора действительно нету в verses_list'
                      ' {0} {1} {2}'.format(author[0], author[1], lastname))
                # Молча удаляем лишнего поэта
                self.crud.sql = ("DELETE FROM poets WHERE name='{0}' and "
                                 "patronymic='{1}' and lastname='{2}'").format(
                                     author[0], author[1], author[2])
                self.crud.deleteAct()

        # Нету автора с такой фамилией? Смело можно удалять.
        else:
            print('Какой-то левый автор, нету его в verses_list'
                  ' {0}'.format(lastname))
            self.crud.sql = ("DELETE FROM poets WHERE name='{0}' and "
                             "patronymic='{1}' and lastname='{2}'").format(
                                 author[0], author[1], author[2])
            self.crud.deleteAct()

    # Непосредственно доавляет автора в poets table. Возвращет свеже присвоенное
    # id для данного поэта
    def addAuthorIntoPoets(self, author):

        self.crud.sql = '''INSERT INTO poets (name, patronymic, lastname)
                      VALUES (\'{0}\',\'{1}\',\'{2}\')'''.format(
            author['name'], author['patronymic'], author['lastname'])
        self.crud.createAct()

        self.crud.sql = '''SELECT id FROM poets WHERE name=\'{0}\' and
                         patronymic=\'{1}\' and lastname=\'{2}\''''.format(
            author['name'], author['patronymic'], author['lastname'])

        id = self.crud.readAct()

        return id[0]

    # Обновляет id поэта в verese_list table
    def updateAuthorID(self, id, author):

        self.crud.sql = ('''UPDATE verses_list SET author_id=\'{0}\'
                       WHERE author=\'{1}\''''.format(id, author))
        print('Успешно присовен ID={0:5} автору {1}'.format(id, author))
        self.crud.updateAct()

    # Остюда начинаеться процесс синхронизации поэтов verses_list -> poets
    def synchroPoetryToVerses_list(self):

        self.crud.sql = 'SELECT name, patronymic, lastname FROM poets'
        authors = self.crud.readAct()
        for author in authors:
            self.poets_IN_verseslist(author)