Add missing model files: post.py and category.py
This commit is contained in:
97
models/category.py
Normal file
97
models/category.py
Normal file
@@ -0,0 +1,97 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Category Model
|
||||
|
||||
from typing import Optional, Dict, List
|
||||
from .database import db_manager
|
||||
from datetime import datetime
|
||||
|
||||
class Category:
|
||||
def __init__(self, **kwargs):
|
||||
self.id = kwargs.get('id')
|
||||
self.name = kwargs.get('name')
|
||||
self.slug = kwargs.get('slug')
|
||||
self.description = kwargs.get('description')
|
||||
self.color = kwargs.get('color', '#007bff')
|
||||
self.created_at = kwargs.get('created_at')
|
||||
|
||||
async def save(self) -> int:
|
||||
"""Save category to database"""
|
||||
if self.id:
|
||||
# Update existing category
|
||||
query = """
|
||||
UPDATE categories SET
|
||||
name=%s, slug=%s, description=%s, color=%s
|
||||
WHERE id=%s
|
||||
"""
|
||||
params = (self.name, self.slug, self.description, self.color, self.id)
|
||||
await db_manager.execute_update(query, params)
|
||||
return self.id
|
||||
else:
|
||||
# Insert new category
|
||||
query = """
|
||||
INSERT INTO categories (name, slug, description, color)
|
||||
VALUES (%s, %s, %s, %s)
|
||||
"""
|
||||
params = (self.name, self.slug, self.description, self.color)
|
||||
category_id = await db_manager.execute_insert(query, params)
|
||||
self.id = category_id
|
||||
return category_id
|
||||
|
||||
@classmethod
|
||||
async def find_by_id(cls, category_id: int) -> Optional['Category']:
|
||||
"""Find category by ID"""
|
||||
query = "SELECT * FROM categories WHERE id = %s"
|
||||
results = await db_manager.execute_query(query, (category_id,))
|
||||
if results:
|
||||
return cls(**results[0])
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
async def find_by_slug(cls, slug: str) -> Optional['Category']:
|
||||
"""Find category by slug"""
|
||||
query = "SELECT * FROM categories WHERE slug = %s"
|
||||
results = await db_manager.execute_query(query, (slug,))
|
||||
if results:
|
||||
return cls(**results[0])
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
async def get_all(cls, limit: int = 50) -> List['Category']:
|
||||
"""Get all categories"""
|
||||
query = "SELECT * FROM categories ORDER BY name ASC LIMIT %s"
|
||||
results = await db_manager.execute_query(query, (limit,))
|
||||
return [cls(**row) for row in results]
|
||||
|
||||
@classmethod
|
||||
async def count(cls) -> int:
|
||||
"""Count total categories"""
|
||||
query = "SELECT COUNT(*) as count FROM categories"
|
||||
results = await db_manager.execute_query(query)
|
||||
return results[0]['count'] if results else 0
|
||||
|
||||
async def delete(self) -> bool:
|
||||
"""Delete category"""
|
||||
query = "DELETE FROM categories WHERE id = %s"
|
||||
affected = await db_manager.execute_update(query, (self.id,))
|
||||
return affected > 0
|
||||
|
||||
def to_dict(self) -> Dict:
|
||||
"""Convert category to dictionary"""
|
||||
return {
|
||||
'id': self.id,
|
||||
'name': self.name,
|
||||
'slug': self.slug,
|
||||
'description': self.description,
|
||||
'color': self.color,
|
||||
'created_at': self.created_at.isoformat() if self.created_at else None
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def generate_slug(name: str) -> str:
|
||||
"""Generate URL-friendly slug from name"""
|
||||
import re
|
||||
slug = re.sub(r'[^\w\s-]', '', name).strip().lower()
|
||||
slug = re.sub(r'[\s_-]+', '-', slug)
|
||||
return slug
|
||||
Reference in New Issue
Block a user