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()
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()
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?! Походу есть такая таблица!')
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()
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()
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()
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()
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()
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)