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()
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 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 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)