Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion blog/admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from blog.category.models import Category
from blog.extensions import db
from blog.post.models import Post
from blog.post.models import Post, Icon
from blog.tags.models import Tag
from blog.user.models import User

Expand Down Expand Up @@ -40,5 +40,6 @@ def create_admin(config_admin):
config_admin.add_view(UserView(Category, db.session, endpoint=""))
config_admin.add_view(UserView(Tag, db.session, endpoint=""))
config_admin.add_view(UserView(User, db.session, endpoint=""))
config_admin.add_view(UserView(Icon, db.session, endpoint=""))
path = os.path.join(os.path.dirname(__file__), "../static/upload")
config_admin.add_view(MyFileAdmin(path, "/static/upload", name="files"))
27 changes: 23 additions & 4 deletions blog/post/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# blog/posts/models.py
import datetime
from typing import TYPE_CHECKING, List
from typing import TYPE_CHECKING
import typing

import markdown
from sqlalchemy import DateTime, ForeignKey, Text
Expand All @@ -22,9 +23,10 @@
class Post(db.Model):
"""orm model for blog post."""

__tablename__ = "posts"
__tablename__ = "posts" # pyright: ignore[reportUnannotatedClassAttribute]

id: Mapped[int] = mapped_column(primary_key=True)
pagetitle: Mapped[str]
pagetitle: Mapped[str] = mapped_column(nullable=False, unique=False)
alias: Mapped[str] = mapped_column(nullable=False, unique=True)
content: Mapped[str] = mapped_column(type_=Text)
createdon: Mapped[datetime.datetime] = mapped_column(
Expand All @@ -39,13 +41,30 @@ class Post(db.Model):
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=True)
user: Mapped["User"] = relationship(back_populates="posts")
category: Mapped["Category"] = relationship(back_populates="posts")
tags: Mapped[List["Tag"]] = relationship(
tags: Mapped[list["Tag"]] = relationship(
secondary=posts_tags, back_populates="posts"
)

@property
def markdown(self):
return markdown.markdown(self.content, extensions=MARKDOWN_EXTENSIONS)

@typing.override
def __str__(self):
return f"{self.pagetitle}"


class Icon(db.Model):
"""orm model for icons."""

__tablename__ = "icons" # pyright: ignore[reportUnannotatedClassAttribute]

id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(nullable=False, unique=True)

url: Mapped[str] = mapped_column(nullable=False, unique=True)
content: Mapped[str] = mapped_column(type_=Text)

@typing.override
def __str__(self):
return f"{self.id} {self.title}"
8 changes: 6 additions & 2 deletions blog/post/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from blog.extensions import flask_sitemap

from blog import cache, db
from blog.post.models import Post
from blog.post.models import Post, Icon
from blog.category.models import Category

post = Blueprint("postb", __name__)
Expand All @@ -28,7 +28,11 @@ def decorated_function(*args, **kwargs):
page_category = current_app.config["PAGE_CATEGORY"]
pages_query = sa.select(Post).where(Post.category_id.in_(page_category))
pages = db.session.scalars(pages_query).all()
return f(pages=pages, *args, **kwargs)

icons_query = sa.select(Icon)
icons = db.session.scalars(icons_query).all()

return f(pages=pages, icons=icons, *args, **kwargs)

return decorated_function

Expand Down
20 changes: 5 additions & 15 deletions blog/templates/footer.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,11 @@

<div class="footer__content">
<div class="footer__links">
<a href="https://t.me/gunlinuxlog" class="nav__link" target="_blank" aria-label="Telegram">
<svg class="footer__icon" viewBox="0 0 24 24" fill="currentColor">
<path d="M9.036 16.395l-.393 4.48c.563 0 .806-.24 1.1-.527l2.642-2.544 5.48 4.017c1.006.553 1.72.263 1.962-.928l3.553-16.667c.32-1.508-.547-2.102-1.512-1.743L2.06 9.367c-1.47.575-1.455 1.4-.256 1.772l4.882 1.525 11.34-7.137c.534-.33 1.02-.147.62.21L9.036 16.395z"/>
</svg>
</a>
<a href="https://www.youtube.com/@gunlinux" class="nav__link" target="_blank" aria-label="YouTube">
<svg class="footer__icon" viewBox="0 0 24 24" fill="currentColor">
<path d="M19.6 3H4.4C3 3 2 4 2 5.4v13.2C2 20 3 21 4.4 21h15.2c1.4 0 2.4-1 2.4-2.4V5.4C22 4 21 3 19.6 3zm-8.6 14V7l7 5-7 5z"/>
</svg>
</a>
<a href="https://twitch.tv/gunlinux" class="nav__link" target="_blank" aria-label="Twitch">
<svg class="footer__icon" viewBox="0 0 24 24" fill="currentColor">
<path d="M4 2L2 6v16h6v2h4l2-2h4l4-4V2H4zm16 12l-2 2h-4l-2 2v-2H6V4h14v10zm-3-6h-2v4h2V8zm-4 0h-2v4h2V8z"/>
</svg>
</a>
{% for icon in icons %}
<a href="{{icon.url}}" title="{{icon.title}}" target="_blank" aria-label="{{icon.title}}" class="nav__link">
{{icon.content}}
</a>
{% endfor %}
</div>
</div>
</footer>
Expand Down
38 changes: 38 additions & 0 deletions migrations/versions/b0e3595603e9_add_icons_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
"""Add icons model

Revision ID: b0e3595603e9
Revises: 49df8e610d33
Create Date: 2025-07-25 03:43:25.175199

"""

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "b0e3595603e9"
down_revision = "49df8e610d33"
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"icons",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("title", sa.String(), nullable=False),
sa.Column("url", sa.String(), nullable=False),
sa.Column("content", sa.Text(), nullable=False),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("title"),
sa.UniqueConstraint("url"),
)
# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table("icons")
# ### end Alembic commands ###