Compare commits

1 Commits

Author SHA1 Message Date
imperosol
acdb9660f6 deps: bump django-ninja to 1.5.0 2025-11-23 00:48:32 +01:00
8 changed files with 570 additions and 482 deletions

View File

@@ -1,18 +1,16 @@
from typing import Annotated from typing import Annotated
from annotated_types import MinLen
from django.db.models import Q from django.db.models import Q
from ninja import Field, FilterSchema, ModelSchema from ninja import FilterLookup, FilterSchema, ModelSchema
from club.models import Club, Membership from club.models import Club, Membership
from core.schemas import SimpleUserSchema from core.schemas import NonEmptyStr, SimpleUserSchema
class ClubSearchFilterSchema(FilterSchema): class ClubSearchFilterSchema(FilterSchema):
search: Annotated[str, MinLen(1)] | None = Field(None, q="name__icontains") search: Annotated[NonEmptyStr | None, FilterLookup("name__icontains")] = None
is_active: bool | None = None is_active: bool | None = None
parent_id: int | None = None parent_id: int | None = None
parent_name: str | None = Field(None, q="parent__name__icontains")
exclude_ids: set[int] | None = None exclude_ids: set[int] | None = None
def filter_exclude_ids(self, value: set[int] | None): def filter_exclude_ids(self, value: set[int] | None):

View File

@@ -1,9 +1,9 @@
from datetime import datetime from datetime import datetime
from typing import Annotated
from ninja import FilterSchema, ModelSchema from ninja import FilterLookup, FilterSchema, ModelSchema
from ninja_extra import service_resolver from ninja_extra import service_resolver
from ninja_extra.context import RouteContext from ninja_extra.context import RouteContext
from pydantic import Field
from club.schemas import ClubProfileSchema from club.schemas import ClubProfileSchema
from com.models import News, NewsDate from com.models import News, NewsDate
@@ -11,12 +11,12 @@ from core.markdown import markdown
class NewsDateFilterSchema(FilterSchema): class NewsDateFilterSchema(FilterSchema):
before: datetime | None = Field(None, q="end_date__lt") before: Annotated[datetime | None, FilterLookup("end_date__lt")] = None
after: datetime | None = Field(None, q="start_date__gt") after: Annotated[datetime | None, FilterLookup("start_date__gt")] = None
club_id: int | None = Field(None, q="news__club_id") club_id: Annotated[int | None, FilterLookup("news__club_id")] = None
news_id: int | None = None news_id: int | None = None
is_published: bool | None = Field(None, q="news__is_published") is_published: Annotated[bool | None, FilterLookup("news__is_published")] = None
title: str | None = Field(None, q="news__title__icontains") title: Annotated[str | None, FilterLookup("news__title__icontains")] = None
class NewsSchema(ModelSchema): class NewsSchema(ModelSchema):

View File

@@ -15,6 +15,8 @@ from pydantic_core.core_schema import ValidationInfo
from core.models import Group, QuickUploadImage, SithFile, User from core.models import Group, QuickUploadImage, SithFile, User
from core.utils import is_image from core.utils import is_image
NonEmptyStr = Annotated[str, MinLen(1)]
class UploadedImage(UploadedFile): class UploadedImage(UploadedFile):
@classmethod @classmethod

View File

@@ -1,13 +1,12 @@
from datetime import datetime from datetime import datetime
from typing import Annotated, Self from typing import Annotated, Self
from annotated_types import MinLen
from django.urls import reverse from django.urls import reverse
from ninja import Field, FilterSchema, ModelSchema, Schema from ninja import FilterLookup, FilterSchema, ModelSchema, Schema
from pydantic import model_validator from pydantic import model_validator
from club.schemas import SimpleClubSchema from club.schemas import SimpleClubSchema
from core.schemas import GroupSchema, SimpleUserSchema from core.schemas import GroupSchema, NonEmptyStr, SimpleUserSchema
from counter.models import Counter, Product, ProductType from counter.models import Counter, Product, ProductType
@@ -21,7 +20,7 @@ class CounterSchema(ModelSchema):
class CounterFilterSchema(FilterSchema): class CounterFilterSchema(FilterSchema):
search: Annotated[str, MinLen(1)] = Field(None, q="name__icontains") search: Annotated[NonEmptyStr | None, FilterLookup("name__icontains")] = None
class SimplifiedCounterSchema(ModelSchema): class SimplifiedCounterSchema(ModelSchema):
@@ -93,18 +92,18 @@ class ProductSchema(ModelSchema):
class ProductFilterSchema(FilterSchema): class ProductFilterSchema(FilterSchema):
search: Annotated[str, MinLen(1)] | None = Field( search: Annotated[
None, q=["name__icontains", "code__icontains"] NonEmptyStr | None, FilterLookup(["name__icontains", "code__icontains"])
) ] = None
is_archived: bool | None = Field(None, q="archived") is_archived: Annotated[bool | None, FilterLookup("archived")] = None
buying_groups: set[int] | None = Field(None, q="buying_groups__in") buying_groups: Annotated[set[int] | None, FilterLookup("buying_groups__in")] = None
product_type: set[int] | None = Field(None, q="product_type__in") product_type: Annotated[set[int] | None, FilterLookup("product_type__in")] = None
club: set[int] | None = Field(None, q="club__in") club: Annotated[set[int] | None, FilterLookup("club__in")] = None
counter: set[int] | None = Field(None, q="counters__in") counter: Annotated[set[int] | None, FilterLookup("counters__in")] = None
class SaleFilterSchema(FilterSchema): class SaleFilterSchema(FilterSchema):
before: datetime | None = Field(None, q="date__lt") before: Annotated[datetime | None, FilterLookup("date__lt")] = None
after: datetime | None = Field(None, q="date__gt") after: Annotated[datetime | None, FilterLookup("date__gt")] = None
counters: set[int] | None = Field(None, q="counter__in") counters: Annotated[set[int] | None, FilterLookup("counter__in")] = None
products: set[int] | None = Field(None, q="product__in") products: Annotated[set[int] | None, FilterLookup("product__in")] = None

View File

@@ -1,9 +1,9 @@
from typing import Literal from typing import Annotated, Literal
from django.db.models import Q from django.db.models import Q
from django.utils import html from django.utils import html
from haystack.query import SearchQuerySet from haystack.query import SearchQuerySet
from ninja import FilterSchema, ModelSchema, Schema from ninja import FilterLookup, FilterSchema, ModelSchema, Schema
from pydantic import AliasPath, ConfigDict, Field, TypeAdapter from pydantic import AliasPath, ConfigDict, Field, TypeAdapter
from pydantic.alias_generators import to_camel from pydantic.alias_generators import to_camel
@@ -114,13 +114,14 @@ class UvSchema(ModelSchema):
class UvFilterSchema(FilterSchema): class UvFilterSchema(FilterSchema):
search: str | None = Field(None, q="code__icontains") search: Annotated[str | None, FilterLookup("code__icontains")] = None
semester: set[Literal["AUTUMN", "SPRING"]] | None = None semester: set[Literal["AUTUMN", "SPRING"]] | None = None
credit_type: set[Literal["CS", "TM", "EC", "OM", "QC"]] | None = Field( credit_type: Annotated[
None, q="credit_type__in" set[Literal["CS", "TM", "EC", "OM", "QC"]] | None,
) FilterLookup("credit_type__in"),
] = None
language: str = "FR" language: str = "FR"
department: set[str] | None = Field(None, q="department__in") department: Annotated[set[str] | None, FilterLookup("department__in")] = None
def filter_search(self, value: str | None) -> Q: def filter_search(self, value: str | None) -> Q:
"""Special filter for the search text. """Special filter for the search text.

View File

@@ -20,8 +20,8 @@ license = { text = "GPL-3.0-only" }
requires-python = "<4.0,>=3.12" requires-python = "<4.0,>=3.12"
dependencies = [ dependencies = [
"django>=5.2.8,<6.0.0", "django>=5.2.8,<6.0.0",
"django-ninja>=1.4.5,<2.0.0", "django-ninja>=1.5.0,<6.0.0",
"django-ninja-extra>=0.30.2,<1.0.0", "django-ninja-extra>=0.30.6",
"Pillow>=12.0.0,<13.0.0", "Pillow>=12.0.0,<13.0.0",
"mistune>=3.1.4,<4.0.0", "mistune>=3.1.4,<4.0.0",
"django-jinja<3.0.0,>=2.11.0", "django-jinja<3.0.0,>=2.11.0",

View File

@@ -2,20 +2,19 @@ from datetime import datetime
from pathlib import Path from pathlib import Path
from typing import Annotated from typing import Annotated
from annotated_types import MinLen
from django.urls import reverse from django.urls import reverse
from ninja import FilterSchema, ModelSchema, Schema from ninja import FilterLookup, FilterSchema, ModelSchema, Schema
from pydantic import Field, NonNegativeInt from pydantic import Field, NonNegativeInt
from core.schemas import SimpleUserSchema, UserProfileSchema from core.schemas import NonEmptyStr, SimpleUserSchema, UserProfileSchema
from sas.models import Album, Picture, PictureModerationRequest from sas.models import Album, Picture, PictureModerationRequest
class AlbumFilterSchema(FilterSchema): class AlbumFilterSchema(FilterSchema):
search: Annotated[str, MinLen(1)] | None = Field(None, q="name__icontains") search: Annotated[NonEmptyStr | None, FilterLookup("name__icontains")] = None
before_date: datetime | None = Field(None, q="event_date__lte") before_date: Annotated[datetime | None, FilterLookup("event_date__lte")] = None
after_date: datetime | None = Field(None, q="event_date__gte") after_date: Annotated[datetime | None, FilterLookup("event_date__gte")] = None
parent_id: int | None = Field(None, q="parent_id") parent_id: Annotated[int | None, FilterLookup("parent_id")] = None
class SimpleAlbumSchema(ModelSchema): class SimpleAlbumSchema(ModelSchema):
@@ -60,10 +59,12 @@ class AlbumAutocompleteSchema(ModelSchema):
class PictureFilterSchema(FilterSchema): class PictureFilterSchema(FilterSchema):
before_date: datetime | None = Field(None, q="date__lte") before_date: Annotated[datetime | None, FilterLookup("date__lte")] = None
after_date: datetime | None = Field(None, q="date__gte") after_date: Annotated[datetime | None, FilterLookup("date__gte")] = None
users_identified: set[int] | None = Field(None, q="people__user_id__in") users_identified: Annotated[
album_id: int | None = Field(None, q="parent_id") set[int] | None, FilterLookup("people__user_id__in")
] = None
album_id: Annotated[int | None, FilterLookup("parent_id")] = None
class PictureSchema(ModelSchema): class PictureSchema(ModelSchema):

955
uv.lock generated

File diff suppressed because it is too large Load Diff