feat: add link_type field to quick links
Build and Push / build (release) Successful in 1m10s

Adds link_type column to quick_links table for iframe vs new_tab behavior.
Includes Alembic migration and schema updates.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Jeroen Schweitzer
2026-01-03 14:38:10 +01:00
co-authored by Claude Opus 4.5
parent 381d43b60b
commit 49be935b5d
5 changed files with 37 additions and 1 deletions
+6
View File
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.6.1] - 2026-01-03
### Added
- `link_type` field to quick links for iframe vs new tab behavior
## [1.6.0] - 2026-01-03 ## [1.6.0] - 2026-01-03
### Added ### Added
@@ -0,0 +1,26 @@
"""add_link_type_to_quick_links
Revision ID: f0349c95aa5d
Revises: 003
Create Date: 2026-01-03 13:14:46.911770+00:00
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = 'f0349c95aa5d'
down_revision: Union[str, None] = '003'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.add_column('quick_links', sa.Column('link_type', sa.String(length=20), nullable=True, server_default='iframe'))
# Update existing rows to have the default value
op.execute("UPDATE quick_links SET link_type = 'iframe' WHERE link_type IS NULL")
def downgrade() -> None:
op.drop_column('quick_links', 'link_type')
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "core-api" name = "core-api"
version = "1.6.0" version = "1.6.1"
description = "Core Code API - Infrastructure management and tools API" description = "Core Code API - Infrastructure management and tools API"
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
+1
View File
@@ -31,6 +31,7 @@ class QuickLink(Base):
# Ordering and display # Ordering and display
position = Column(Integer, default=0) position = Column(Integer, default=0)
is_visible = Column(Boolean, default=True) is_visible = Column(Boolean, default=True)
link_type = Column(String(20), default="iframe") # "iframe", "new_tab", etc.
# Styling # Styling
color = Column(String(20), nullable=True) # Hex color for the link card color = Column(String(20), nullable=True) # Hex color for the link card
+3
View File
@@ -26,6 +26,7 @@ class QuickLinkCreate(QuickLinkBase):
"""Schema for creating a quick link""" """Schema for creating a quick link"""
position: Optional[int] = Field(0, ge=0, description="Display position") position: Optional[int] = Field(0, ge=0, description="Display position")
is_visible: Optional[bool] = Field(True, description="Whether link is visible") is_visible: Optional[bool] = Field(True, description="Whether link is visible")
link_type: Optional[str] = Field("iframe", max_length=20, description="Link type: iframe, new_tab")
class QuickLinkUpdate(BaseSchema): class QuickLinkUpdate(BaseSchema):
@@ -37,6 +38,7 @@ class QuickLinkUpdate(BaseSchema):
category: Optional[str] = Field(None, max_length=50) category: Optional[str] = Field(None, max_length=50)
position: Optional[int] = Field(None, ge=0) position: Optional[int] = Field(None, ge=0)
is_visible: Optional[bool] = None is_visible: Optional[bool] = None
link_type: Optional[str] = Field(None, max_length=20)
color: Optional[str] = Field(None, max_length=20) color: Optional[str] = Field(None, max_length=20)
background_color: Optional[str] = Field(None, max_length=20) background_color: Optional[str] = Field(None, max_length=20)
@@ -47,6 +49,7 @@ class QuickLinkResponse(QuickLinkBase):
user_id: Optional[str] = None user_id: Optional[str] = None
position: int position: int
is_visible: bool is_visible: bool
link_type: str = "iframe"
created_at: datetime created_at: datetime
updated_at: datetime updated_at: datetime