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 __init__(self): #Удаляем queue crud = Crud('localhost', 'andrew', 'andrew', 'verses') crud.sql = 'DROP TABLE queue;' crud.deleteAct() print('Drop\'нули таблицу queue') crud.closeConnection()
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()
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
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()
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 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()
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()
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 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)