Просмотр статей по тэгам
parent
7c6fc02529
commit
6163505ca0
|
@ -1,4 +1,4 @@
|
||||||
from flask import abort, g, redirect, request, url_for
|
from flask import abort, redirect, request, url_for
|
||||||
from flask_admin.contrib import sqla
|
from flask_admin.contrib import sqla
|
||||||
from flask_ckeditor import CKEditorField
|
from flask_ckeditor import CKEditorField
|
||||||
from flask_security import current_user
|
from flask_security import current_user
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import locale
|
import locale
|
||||||
|
|
||||||
from flask import render_template, render_template_string, request
|
from flask import (redirect, render_template, render_template_string, request,
|
||||||
|
session, url_for)
|
||||||
|
|
||||||
from ..dbase.database import get_paginated_posts, get_post
|
from ..dbase.database import (get_all_posts_by_tag, get_paginated_posts,
|
||||||
|
get_post, get_tags)
|
||||||
from .blog import bp
|
from .blog import bp
|
||||||
|
|
||||||
locale.setlocale(locale.LC_ALL, "")
|
locale.setlocale(locale.LC_ALL, "")
|
||||||
|
@ -11,14 +13,14 @@ locale.setlocale(locale.LC_ALL, "")
|
||||||
@bp.route("/", methods=["GET"], defaults={"page": 1})
|
@bp.route("/", methods=["GET"], defaults={"page": 1})
|
||||||
@bp.route("/<int:page>", methods=["GET"])
|
@bp.route("/<int:page>", methods=["GET"])
|
||||||
def index(page=1):
|
def index(page=1):
|
||||||
per_page = 3
|
session["back_url"] = request.url
|
||||||
|
per_page = 2
|
||||||
posts, total_pages = get_paginated_posts(page, per_page)
|
posts, total_pages = get_paginated_posts(page, per_page)
|
||||||
list_pages = [
|
list_pages = [
|
||||||
x for x in range(1, total_pages + 1) if x >= page - 2 and x <= page + 2
|
x for x in range(1, total_pages + 1) if x >= page - 2 and x <= page + 2
|
||||||
]
|
]
|
||||||
return render_template(
|
return render_template(
|
||||||
"blog/index.html",
|
"blog/index.html",
|
||||||
request=request,
|
|
||||||
posts=posts,
|
posts=posts,
|
||||||
title="pyproger - разговоры про питон",
|
title="pyproger - разговоры про питон",
|
||||||
menu_title="pyproger",
|
menu_title="pyproger",
|
||||||
|
@ -31,13 +33,48 @@ def index(page=1):
|
||||||
@bp.route("/post/")
|
@bp.route("/post/")
|
||||||
@bp.route("/post/<path:slug>")
|
@bp.route("/post/<path:slug>")
|
||||||
def post(slug=None):
|
def post(slug=None):
|
||||||
if slug:
|
back_url = session.get("back_url")
|
||||||
|
if slug is not None:
|
||||||
current_post = get_post(slug)
|
current_post = get_post(slug)
|
||||||
return render_template(
|
return render_template(
|
||||||
"blog/postview.html",
|
"blog/postview.html",
|
||||||
title=f"pyproger - {current_post.Post.title}",
|
title=f"pyproger - {current_post.Post.title}",
|
||||||
menu_title="pyproger",
|
menu_title="pyproger",
|
||||||
post=current_post,
|
post=current_post,
|
||||||
|
back_url=back_url,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return render_template_string("noup")
|
return render_template_string("noup")
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/tags/")
|
||||||
|
def get_all_tags():
|
||||||
|
tags = get_tags()
|
||||||
|
return render_template(
|
||||||
|
"blog/tags.html",
|
||||||
|
tags=tags,
|
||||||
|
title="pyproger - поиск по тэгу",
|
||||||
|
menu_title="pyproger",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/tag/", methods=["GET"], defaults={"page": 1})
|
||||||
|
@bp.route("/tag/<path:tag>", methods=["GET"])
|
||||||
|
def get_posts_by_tag(page=1):
|
||||||
|
tag = request.args.get("tag")
|
||||||
|
if tag is None:
|
||||||
|
return redirect(url_for(".get_all_tags"))
|
||||||
|
per_page = 2
|
||||||
|
posts, total_pages = get_all_posts_by_tag(tag, page, per_page)
|
||||||
|
list_pages = [
|
||||||
|
x for x in range(1, total_pages + 1) if x >= page - 2 and x <= page + 2
|
||||||
|
]
|
||||||
|
return render_template(
|
||||||
|
"blog/index.html",
|
||||||
|
posts=posts,
|
||||||
|
title=f"pyproger - посты по {tag}",
|
||||||
|
menu_title="pyproger",
|
||||||
|
page=page,
|
||||||
|
total_pages=total_pages,
|
||||||
|
list_pages=list_pages,
|
||||||
|
)
|
||||||
|
|
|
@ -1,17 +1,21 @@
|
||||||
|
from logging import error
|
||||||
|
|
||||||
from . import db
|
from . import db
|
||||||
from .models import Post, User
|
from .models import Post, Tag, User
|
||||||
|
|
||||||
|
|
||||||
def get_paginated_posts(page, per_page):
|
def get_paginated_posts(page, per_page):
|
||||||
quer = (
|
all_post_query = (
|
||||||
db.session.query(Post, User)
|
db.session.query(Post, User)
|
||||||
.join(User, Post.author == User.id)
|
.join(User, Post.author == User.id)
|
||||||
.order_by(Post.create_datetime.desc())
|
.order_by(Post.create_datetime.desc())
|
||||||
.paginate(page=page, per_page=per_page, error_out=False)
|
.paginate(page=page, per_page=per_page, error_out=True)
|
||||||
|
)
|
||||||
|
total_pages = (
|
||||||
|
all_post_query.total // per_page + [0, 1][all_post_query.total % per_page != 0]
|
||||||
)
|
)
|
||||||
total_pages = quer.total // per_page + [0, 1][quer.total % per_page != 0]
|
|
||||||
|
|
||||||
return quer, total_pages
|
return all_post_query, total_pages
|
||||||
|
|
||||||
|
|
||||||
def get_post(slug):
|
def get_post(slug):
|
||||||
|
@ -22,3 +26,23 @@ def get_post(slug):
|
||||||
.first()
|
.first()
|
||||||
)
|
)
|
||||||
return post_query
|
return post_query
|
||||||
|
|
||||||
|
|
||||||
|
def get_tags():
|
||||||
|
tags_query = db.session.query(Tag).order_by(Tag.tag)
|
||||||
|
return tags_query
|
||||||
|
|
||||||
|
|
||||||
|
def get_all_posts_by_tag(tag, page, per_page):
|
||||||
|
posts_query = (
|
||||||
|
db.session.query(Post, User)
|
||||||
|
.join(User, Post.author == User.id)
|
||||||
|
.filter(Post.tags.any(Tag.tag == tag))
|
||||||
|
.order_by(Post.create_datetime.desc())
|
||||||
|
.paginate(page=page, per_page=per_page, error_out=True)
|
||||||
|
)
|
||||||
|
total_pages = (
|
||||||
|
posts_query.total // per_page + [0, 1][posts_query.total % per_page != 0]
|
||||||
|
)
|
||||||
|
print(posts_query)
|
||||||
|
return posts_query, total_pages
|
||||||
|
|
|
@ -9,11 +9,7 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="conteiner">
|
<div class="container px-4 px-lg-5">
|
||||||
<br>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container px-4 px-lg-5">
|
|
||||||
<div class="list-group justify-content-center">
|
<div class="list-group justify-content-center">
|
||||||
|
|
||||||
{% for p in posts %}
|
{% for p in posts %}
|
||||||
|
@ -22,11 +18,17 @@
|
||||||
{{ p.Post.description | safe}}
|
{{ p.Post.description | safe}}
|
||||||
</a>
|
</a>
|
||||||
<small>
|
<small>
|
||||||
Опубликовал
|
|
||||||
<a href="mailto:{{p.User.email}}">
|
{% for t in p.Post.tags %}
|
||||||
{{ p.User.username}}
|
<a class="link-offset-2 link-offset-3-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover" href="{{url_for(".get_posts_by_tag", tag=t.tag )}}">
|
||||||
</a>
|
#{{t.tag}}
|
||||||
{{ p.Post.create_datetime.strftime('%d %B, %Y') }}
|
</a>
|
||||||
|
{% endfor %}<br>
|
||||||
|
Опубликовал
|
||||||
|
<a href="mailto:{{p.User.email}}">
|
||||||
|
{{ p.User.username}}
|
||||||
|
</a>
|
||||||
|
{{ p.Post.create_datetime.strftime('%d %B, %Y') }}
|
||||||
</small>
|
</small>
|
||||||
<hr class="my-4" />
|
<hr class="my-4" />
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -15,5 +15,8 @@
|
||||||
<h4>{{ post.Post.title | safe }}</h4>
|
<h4>{{ post.Post.title | safe }}</h4>
|
||||||
{{ post.Post.text | safe }}
|
{{ post.Post.text | safe }}
|
||||||
</div>
|
</div>
|
||||||
|
<a class="link-offset-2 link-offset-3-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover" href="{{ back_url }}">
|
||||||
|
Назад
|
||||||
|
</a>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
{% extends 'blog/base.html' %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{{title}}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block menu_title %}
|
||||||
|
{{ menu_title }}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<!-- Main Content-->
|
||||||
|
<div class="conteiner">
|
||||||
|
<br>
|
||||||
|
<h4>Тэги статей:</h4>
|
||||||
|
{% for t in tags %}
|
||||||
|
<li>
|
||||||
|
<a class="link-offset-2 link-offset-3-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover" href="{{url_for(".get_posts_by_tag", tag=t.tag )}}">
|
||||||
|
#{{t.tag}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
<a class="link-offset-2 link-offset-3-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover" href="{{ back_url }}">
|
||||||
|
Назад
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -5,7 +5,7 @@ from flask_babel import Babel
|
||||||
|
|
||||||
|
|
||||||
def get_locale():
|
def get_locale():
|
||||||
translations = ["en", "ru"]
|
translations = ["ru"]
|
||||||
return request.accept_languages.best_match(translations)
|
return request.accept_languages.best_match(translations)
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,22 +14,4 @@ babel = Babel()
|
||||||
bp = Blueprint(
|
bp = Blueprint(
|
||||||
"bp_translation",
|
"bp_translation",
|
||||||
__name__,
|
__name__,
|
||||||
cli_group="translate",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@bp.cli.command("update")
|
|
||||||
def update():
|
|
||||||
"""Update all languages."""
|
|
||||||
if os.system("pybabel extract -F babel.cfg -k _l -o messages.pot ."):
|
|
||||||
raise RuntimeError("extract command failed")
|
|
||||||
if os.system("pybabel update -i messages.pot -d pi3code/translations"):
|
|
||||||
raise RuntimeError("update command failed")
|
|
||||||
os.remove("messages.pot")
|
|
||||||
|
|
||||||
|
|
||||||
@bp.cli.command("compile")
|
|
||||||
def compile():
|
|
||||||
"""Compile all languages."""
|
|
||||||
if os.system("pybabel compile -d pi3code/translations"):
|
|
||||||
raise RuntimeError("compile command failed")
|
|
||||||
|
|
Loading…
Reference in New Issue