KAnanev/Page-analyzer

View on GitHub
page_analyzer/models.py

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
from datetime import datetime
from typing import Optional, List, Dict, Union
from urllib.parse import urlparse

import validators
from pydantic import BaseModel, field_validator, Field

from page_analyzer.services.utils import get_date_now

URL_MAX_LENGTH = 255


class URLBaseMixin(BaseModel):
    id: Optional[int] = None
    created_at: datetime = Field(default_factory=get_date_now)


class URLModel(URLBaseMixin):
    name: str = Field(max_length=URL_MAX_LENGTH)

    @field_validator('name')
    def validate_url(cls, value: str) -> str:

        if not validators.url(value):
            raise ValueError('Invalid url address')
        url = urlparse(value)
        return f'{url.scheme}://{url.netloc}'.lower()


class URLChecks(URLBaseMixin):
    url_id: int
    status_code: Optional[int] = None
    h1: Optional[str] = None
    title: Optional[str] = None
    description: Optional[str] = None


class URLSModel(URLModel):
    url_checks: Optional[List[URLChecks]] = []

    @field_validator('url_checks')
    def validate_url_checks(cls, value: List) -> List[
        Dict[str, Union[str, int]]
    ]:
        value.sort(key=lambda x: -x.id)
        return value