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 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()
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
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
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
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()
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 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
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()
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 RatingFile(): output_file = '/srv/http/poetry.com/authors_rating_file.html' top = 15 def __init__(self): self.getTopList() self.makeFile() print( 'Шикарно. Сфоримирован список авторов. Найти его можно по адресу ' '- {0}'.format(self.output_file)) # Получает список авторов def getTopList(self): self.crud = Crud('localhost', 'andrew', 'andrew', 'verses') self.crud.sql = '''SELECT lastname, name, patronymic, rating FROM poets ORDER BY rating DESC LIMIT {0}'''.format(self.top) self.authors = self.crud.readAct() # Запускает на исполнение создание файла авторов def makeFile(self): self.f = open(self.output_file, 'w') self.doHeader() self.doTable() self.doFooter() self.f.close() # Фомирует хэдер файла def doHeader(self): self.f.write(''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <table> <title>Full poetry list</title> <style type="text/css"> table {margin-left: auto;margin-right: auto; margin-top: 5%} td {padding: 5px 30px; font-size: 14pt} </style> ''') # Формирует футер def doFooter(self): self.f.write(''' </table> </body> </html> ''') # Формирует таблицу с авторами. С учетом ранее полученных предпочтений # (сортировки и выводимых полей) def doTable(self): self.f.write('''<tr><td colspan="3" style='text-align:center'> <b>ТОП-{0} АВТОРОВ</b></td></tr> <tr><td style='height:90px'>№</td><td>автор</td> <td>рейтинг</td></tr> '''.format(self.top)) i = 1 for row in self.authors: self.f.write( '''<tr><td>{0}</td><td>{1}</td><td>{2} %</td></tr>'''.format( i, ' '.join([row[0], row[1], row[2]]), row[3])) i = i + 1
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()
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()
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)
class IndexFile(): output_file = '/tmp/index.html' def __init__(self): self.getTopList() self.makeFile() print( 'Шикарно. Сфоримирован список авторов. Найти его можно по адресу ' '- {0}'.format(self.output_file)) # Получает список авторов def getTopList(self): self.crud = Crud('localhost', 'andrew', 'andrew', 'verses') self.crud.sql = '''SELECT lastname, name, patronymic, id FROM poets ORDER BY lastname''' self.authors = self.crud.readAct() # Запускает на исполнение создание файла авторов def makeFile(self): self.f = open(self.output_file, 'w') self.doHeader() self.doAuthorList() self.doBottomPart() self.doFooter() self.f.close() # Фомирует хэдер файла def doHeader(self): self.f.write(''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="myScript.js"></script> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-49334817-2', 'auto'); ga('send', 'pageview'); </script> <style type="text/css"> #wrapper {width: 700px; margin-left: auto;margin-right: auto; border: 1px solid black; padding-left:30px} #header {height: 200px; margin-left:-30px; margin-bottom:40px; font-size: 24pt;color:green; font-weight: bold; text-align: center} .user_input {width: 375px} select {width: 635px} option {font-size: 12pt} tr {height: 35px} .btn {font-size: 12pt; width: 100px} #content {height: 680px} #footer {height: 30px; font-size: 16pt; color:#CAE1FF; margin-left: -30px;padding: 15px 170px; text-align: center; background-color:#228B22} #sau_link:hover, #sau_link:link, #sau_link:visited, #sau_link:active {color:#CAE1FF; text-decoration: underline} </style> </head> <body> <title>Поэзия для каждого!</title> <form method="POST" action="handler.php" onsubmit="return empty_form()"> <div id="wrapper"> <div id="header"> GOOD VERSE MAILER <img src="images/header_image.jpg" alt="authors" style="margin: 5px 0px 0px 3px"> <div style="font-size: 16pt; color:green; margin: -6px 0px 0px 0px; font-weight: normal"> poetry for everyone </div> </div> <div id="content"> <div style="margin-bottom: 20px"> <table> <tr><td width="250px">Имя: </td> <td><input type="text" class="user_input" name="name"></td> </tr> <tr><td>email:</td><td><input type="email" class="user_input" name="email"></td> </tr> <tr><td>количество в день:</td><td><input type="text" pattern="[1-9]{1}" name="qpd" class="user_input"></td> </tr> </table> </div> ''') def doBottomPart(self): self.f.write(''' <div style="width: 450px; float:left; margin:10px 0px 10px 0px"><input type="radio" name="user" value="new" checked>новый пользователь</div> <div style="width: 200px; float:left; margin:10px 0px 10px 0px"><input type="radio" name="user" value="old">мне бы поменять :)</div> <div style="margin-top:60px; margin-bottom:0px"> <table><tr> <td width="425px"><button type="button" onclick="location.href='http://poetry.progreso.com.ua/help.html'" class="btn">Помощь</button></td> <td width="100px"><button type="reset" class="btn">Сборосить </button> </td> <td width="100px"><button type="submit" class="btn">ОК!</button></td> </tr></table> </div> </div> ''') # Формирует футер def doFooter(self): self.f.write(''' <div id="footer"><a id='sau_link' target='_blank' href='https://www.facebook.com/andrew.sotnikov'>Andrew Sotnikov </a> ^ 2017 ^ </div> </div> </form> </body> </html> ''') # Формирует таблицу с авторами. С учетом ранее полученных предпочтений # (сортировки и выводимых полей) def doAuthorList(self): self.f.write('''<div><select size="20" multiple name="author[]">''') for row in self.authors: self.f.write('''<option value="{1}">{0}</option>'''.format( ' '.join([row[0], row[1], row[2]]), row[3])) self.f.write('''</select></div>''')