Пример #1
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()
Пример #2
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()
Пример #3
0
class Preparing:
    def __init__(self):

        crud = Crud('localhost', 'andrew', 'andrew', 'proxy')
        #Проверить наличие прокси
        self.checkProxiesTable()

    def __del__(self):

        self.crud.closeConnection()

    #Проверяет наличие таблицы proxies. Если ее нет, то создает.
    #В противном случае проходит мимо
    def checkProxiesTable(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'proxy')
        self.crud.sql = 'SHOW TABLE STATUS LIKE \'proxies\''
        result = self.crud.readAct()

        # Таблицы нету, её прийдеться создать
        if len(result) == 0:
            print('Нету таблицы с прокси адресами! Щас создадим')
            #Cоздадим таблицу proxies
            self.crud.sql = '''CREATE TABLE proxies (
                             id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
                             ip_address VARCHAR(20),
                             port SMALLINT, 
                             time INT, 
                             UNIQUE (ip_address));'''
            result = self.crud.createAct()

        #В противном случае можно завязывать с этапом создания proxies
        else:
            print('proxies?! Походу есть такая таблица!')
Пример #4
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()
Пример #5
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()
Пример #6
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()
Пример #7
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()
Пример #8
0
class TimeMarks(Logs):
    def __init__(self):

        #Проверить наличие time_marks
        self.checkTimeMarksExist()
        self.clearLogFile()
        #Пробуем разблокировать очередь, если прошло 20 часов
        self.unlockQueue()

    def __del__(self):

        self.crud.closeConnection()

    #Проверяет наличие таблицы time_marks. Если ее нет, то создает.
    #В противном случае проходит мимо
    def checkTimeMarksExist(self):

        self.crud = Crud('localhost', 'andrew', 'andrew', 'verses')
        self.crud.sql = 'SHOW TABLE STATUS LIKE \'time_marks\''
        result = self.crud.readAct()

        # Таблицы нету, её прийдеться создать
        if len(result) == 0:
            print('Нету таблицы временных меток! Щас создадим')
            #Cоздадим таблицу time_marks
            self.crud.sql = '''CREATE TABLE time_marks(
                            name VARCHAR(40) NOT NULL,
                            last_time INT NOT NULL,
                            locked BOOLEAN NOT NULL
                            );'''
            result = self.crud.createAct()
            #наполним значениями
            self.crud.sql = ('INSERT INTO time_marks (name,last_time,locked)'
                             'VALUES (\'queue\',{0},false)'.format(
                                 self.curTime))
            self.crud.createAct()
            self.crud.sql = ('INSERT INTO time_marks (name,last_time,locked)'
                             'VALUES (\'log\',{0},false)'.format(self.curTime))
            self.crud.createAct()

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

    # Получает значени блокировки таблицы queue
    def getQueueLock(self):

        self.crud.sql = 'SELECT locked FROM time_marks WHERE name=\'queue\''
        locked = self.crud.readAct()[0]
        locked = locked[0]

        return locked

    # Принимает lockedval. Это булево значение в числовом виде (0 или 1).
    # На основе lockedval ставит бит доступа на запись в таблицу Queue.
    def setQueueLock(self, lockedval):

        self.crud.sql = ('UPDATE time_marks SET locked=\'{0}\' WHERE '
                         'name=\'queue\''.format(lockedval))
        self.crud.updateAct()

        self.crud.sql = ('SELECT locked FROM time_marks WHERE '
                         'name=\'queue\'')
        locked = (self.crud.readAct())[0]
        print('Значение locked было изменено. Текущее значение'
              ' {0}'.format(locked))

    # Снимает блокировку на запись таблицы queue. Делает это только при
    # случае если минуло значение времени allowed_time
    def unlockQueue(self):

        allowed_time = 72000  #Эквивалентно 20-ти часам

        self.crud.sql = (
            'SELECT last_time FROM time_marks WHERE name=\'queue\'')
        last_time = self.crud.readAct()[0][0]

        elapsed = self.curTime - last_time
        print('Прошло времени - {0}, а нужно {1} для сбрасывания '
              'блокировки'.format(elapsed, allowed_time))

        if elapsed >= allowed_time:
            #Снять блокировку с queue
            self.setQueueLock(0)
            # выставим актуальное время
            self.setActualQueueTime()

        else:
            print('Еще рано сбрасывать блокировку')

    # Выставляет текущее время в таблице временных меток для строки queue
    def setActualQueueTime(self):

        actual_time = self.curTime
        self.crud.sql = ('UPDATE time_marks SET last_time=\'{0}\' WHERE '
                         'name=\'queue\''.format(actual_time))
        self.crud.updateAct()

    # Выставляет текущее время в таблице временных меток для строки log
    def setActualLogTime(self):

        actual_time = self.curTime
        self.crud.sql = ('UPDATE time_marks SET last_time=\'{0}\' WHERE '
                         'name=\'log\''.format(actual_time))
        self.crud.updateAct()
Пример #9
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)