def history(site, start_page_id): """ 過去ログ """ _limit = 20 svm = generate_index_contents(site) # パラメータチェック start_page_id = int(start_page_id) if start_page_id == 100000000: pages = Page.get_new_history(site_id=site.id, _limit=_limit) else: pages = Page.get_history(site_id=site.id, pk_until=start_page_id, _limit=_limit) # pageのランク付け pages = page_rank(pages) # 次のページの遷移先 is_next = None if pages and len(pages) == _limit: last_page_id = pages[-1].id is_next = last_page_id - 1 return render_template('dat/history.html', site=site, keyword=keyword, list_pages=pages, svm=svm, is_next=is_next)
def update_at(self): from module.site.page import Page import datetime import pytz pages = Page.get_new_history(self.id) new_list = sorted(pages, key=lambda x: x.id, reverse=True) now = datetime.datetime.now(pytz.utc) for page in new_list: if page.is_enable(now): return page.open_at raise ValueError
def update_at(self): from module.site.page import Page import datetime import pytz pages = Page.get_new_history(self.id) new_list = sorted(pages, key=lambda x: x.id, reverse=True) now = datetime.datetime.now(pytz.utc) for page in new_list: if page.is_enable(now): return page.open_at raise ValueError
def get_pr_page(site, _limit=3): """ クローラー最適化のために、外部サイトのページを取得する :param site: site :return: list[Page] """ other_site = _get_other_site(site) pages = Page.get_new_history(other_site.id, _limit=30) pages = sorted(pages, key=lambda x: x.view_count, reverse=True) result = [] now = datetime.datetime.now(pytz.utc) for page in pages: if page.is_enable(now): result.append(page) if len(result) >= _limit: return result return result
def get_pr_page(site, _limit=3): """ クローラー最適化のために、外部サイトのページを取得する :param site: site :return: list[Page] """ other_site = _get_other_site(site) pages = Page.get_new_history(other_site.id, _limit=30) pages = sorted(pages, key=lambda x: x.view_count, reverse=True) result = [] now = datetime.datetime.now(pytz.utc) for page in pages: if page.is_enable(now): result.append(page) if len(result) >= _limit: return result return result
def generate_index_contents(site, _limit=30, extend_page=None, ignore_ids=()): """ トップページ表示用のデータを生成する :param site: Site :param _limit: int :param extend_page: list(Page) :param ignore_ids: list(int) :return: SiteViewModel """ pages = Page.get_new_history(site.id, _limit=_limit) if extend_page: pages += extend_page # 未来日公開の記事は公開しない now = datetime.datetime.now(pytz.utc) pages = [page for page in pages if page.is_enable(now=now)] if ignore_ids: pages_repository = { page.id: page for page in pages if page.id not in ignore_ids } else: pages_repository = {page.id: page for page in pages} pages = list(pages_repository.values()) # ページが存在しない if bool(pages) is False: raise SiteEmptyError # 10件未満 if len(pages) <= 10: pr_pages = get_pr_page(site) return SiteViewModel(site=site, contents=random.choice(pages), panels=[random.choice(pages) for x in range(6)], page_list=pages + pr_pages) # 最新の10件からviewが多い1件を取る new_list = sorted(pages, key=lambda x: x.id, reverse=True)[:10] new_list = sorted(new_list, key=lambda x: x.view_count, reverse=True) if len(new_list) == len([page for page in new_list if page.start_at]): new_list = sorted(new_list, key=lambda x: x.start_at, reverse=True) contents = new_list[0] new_list = new_list[1:] pages_repository.pop(contents.id) # 人気順に並んだ最新の9件からパネル用の3件を取る random.shuffle(new_list) panels = new_list[1:4] for panel_page in panels: panel_page.set_favorite(False) pages_repository.pop(panel_page.id) # 残りの46件からviewが多い3件を取る left_pages = list(pages_repository.values()) left_pages = sorted(left_pages, key=lambda x: x.view_count, reverse=True) for x in range(3): panel_page = left_pages.pop() panel_page.set_favorite(True) panels.append(panel_page) random.shuffle(panels) # 残りページをView数をベースに点数付与 for page in left_pages[0:3]: # 3件 page.set_view_level(PageViewLevel.SUPERNOVA) for page in left_pages[3:5]: # 2件 page.set_view_level(PageViewLevel.HOT) for page in left_pages[5:7]: # 2件 page.set_view_level(PageViewLevel.WARM) # 残りをidで降順ソートする left_pages = sorted(left_pages, key=lambda x: x.id, reverse=True) # クローラー用のPRページを追加 left_pages = left_pages[:20] left_pages += get_pr_page(site) return SiteViewModel(site=site, contents=contents, panels=panels, page_list=left_pages)
def generate_index_contents(site, _limit=30, extend_page=None, ignore_ids=()): """ トップページ表示用のデータを生成する :param site: Site :param _limit: int :param extend_page: list(Page) :param ignore_ids: list(int) :return: SiteViewModel """ pages = Page.get_new_history(site.id, _limit=_limit) if extend_page: pages += extend_page # 未来日公開の記事は公開しない now = datetime.datetime.now(pytz.utc) pages = [page for page in pages if page.is_enable(now=now)] if ignore_ids: pages_repository = {page.id: page for page in pages if page.id not in ignore_ids} else: pages_repository = {page.id: page for page in pages} pages = list(pages_repository.values()) # ページが存在しない if bool(pages) is False: raise SiteEmptyError # 10件未満 if len(pages) <= 10: pr_pages = get_pr_page(site) return SiteViewModel(site=site, contents=random.choice(pages), panels=[random.choice(pages) for x in range(6)], page_list=pages + pr_pages) # 最新の10件からviewが多い1件を取る new_list = sorted(pages, key=lambda x: x.id, reverse=True)[:10] new_list = sorted(new_list, key=lambda x: x.view_count, reverse=True) if len(new_list) == len([page for page in new_list if page.start_at]): new_list = sorted(new_list, key=lambda x: x.start_at, reverse=True) contents = new_list[0] new_list = new_list[1:] pages_repository.pop(contents.id) # 人気順に並んだ最新の9件からパネル用の3件を取る random.shuffle(new_list) panels = new_list[1:4] for panel_page in panels: panel_page.set_favorite(False) pages_repository.pop(panel_page.id) # 残りの46件からviewが多い3件を取る left_pages = list(pages_repository.values()) left_pages = sorted(left_pages, key=lambda x: x.view_count, reverse=True) for x in range(3): panel_page = left_pages.pop() panel_page.set_favorite(True) panels.append(panel_page) random.shuffle(panels) # 残りページをView数をベースに点数付与 for page in left_pages[0:3]: # 3件 page.set_view_level(PageViewLevel.SUPERNOVA) for page in left_pages[3:5]: # 2件 page.set_view_level(PageViewLevel.HOT) for page in left_pages[5:7]: # 2件 page.set_view_level(PageViewLevel.WARM) # 残りをidで降順ソートする left_pages = sorted(left_pages, key=lambda x:x.id, reverse=True) # クローラー用のPRページを追加 left_pages = left_pages[:20] left_pages += get_pr_page(site) return SiteViewModel(site=site, contents=contents, panels=panels, page_list=left_pages)