Remove ajax_select from core

This commit is contained in:
Antoine Bartuccio 2024-10-20 23:25:56 +02:00
parent e7181257e3
commit 8b419dcee6
5 changed files with 61 additions and 12 deletions

View File

@ -75,8 +75,8 @@ class SithFileController(ControllerBase):
permissions=[CanAccessLookup], permissions=[CanAccessLookup],
) )
@paginate(PageNumberPaginationExtra, page_size=50) @paginate(PageNumberPaginationExtra, page_size=50)
def search_files(self, query: Annotated[str, annotated_types.MinLen(1)]): def search_files(self, search: Annotated[str, annotated_types.MinLen(1)]):
return SithFile.objects.filter(is_in_sas=False).filter(name__icontains=query) return SithFile.objects.filter(is_in_sas=False).filter(name__icontains=search)
@api_controller("/group") @api_controller("/group")

View File

@ -1,3 +1,4 @@
from pathlib import Path
from typing import Annotated from typing import Annotated
from annotated_types import MinLen from annotated_types import MinLen
@ -50,6 +51,12 @@ class SithFileSchema(ModelSchema):
model = SithFile model = SithFile
fields = ["id", "name"] fields = ["id", "name"]
path: str
@staticmethod
def resolve_path(obj: SithFile) -> str:
return str(Path(obj.get_parent_path()) / obj.name)
class GroupSchema(ModelSchema): class GroupSchema(ModelSchema):
class Meta: class Meta:

View File

@ -4,8 +4,10 @@ import type { TomOption } from "tom-select/dist/types/types";
import type { escape_html } from "tom-select/dist/types/utils"; import type { escape_html } from "tom-select/dist/types/utils";
import { import {
type GroupSchema, type GroupSchema,
type SithFileSchema,
type UserProfileSchema, type UserProfileSchema,
groupSearchGroup, groupSearchGroup,
sithfileSearchFiles,
userSearchUsers, userSearchUsers,
} from "#openapi"; } from "#openapi";
@ -71,3 +73,28 @@ export class GroupsAjaxSelect extends AjaxSelect {
return `<span>${sanitize(item.name)}</span>`; return `<span>${sanitize(item.name)}</span>`;
} }
} }
@registerComponent("sith-file-ajax-select")
export class SithFileAjaxSelect extends AjaxSelect {
protected valueField = "id";
protected labelField = "path";
protected searchField = ["path", "name"];
protected async search(query: string): Promise<TomOption[]> {
const resp = await sithfileSearchFiles({ query: { search: query } });
if (resp.data) {
return resp.data.results;
}
return [];
}
protected renderOption(item: SithFileSchema, sanitize: typeof escape_html) {
return `<div class="select-item">
<span class="select-item-text">${sanitize(item.path)}</span>
</div>`;
}
protected renderItem(item: SithFileSchema, sanitize: typeof escape_html) {
return `<span>${sanitize(item.path)}</span>`;
}
}

View File

@ -18,7 +18,6 @@ from urllib.parse import quote, urljoin
# This file contains all the views that concern the page model # This file contains all the views that concern the page model
from wsgiref.util import FileWrapper from wsgiref.util import FileWrapper
from ajax_select import make_ajax_field
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
@ -39,6 +38,11 @@ from core.views import (
CanViewMixin, CanViewMixin,
can_view, can_view,
) )
from core.views.widgets.select import (
AutoCompleteSelectMultipleGroup,
AutoCompleteSelectSithFile,
AutoCompleteSelectUser,
)
from counter.utils import is_logged_in_counter from counter.utils import is_logged_in_counter
@ -217,14 +221,13 @@ class FileEditPropForm(forms.ModelForm):
class Meta: class Meta:
model = SithFile model = SithFile
fields = ["parent", "owner", "edit_groups", "view_groups"] fields = ["parent", "owner", "edit_groups", "view_groups"]
widgets = {
"parent": AutoCompleteSelectSithFile,
"owner": AutoCompleteSelectUser,
"edit_groups": AutoCompleteSelectMultipleGroup,
"view_groups": AutoCompleteSelectMultipleGroup,
}
parent = make_ajax_field(SithFile, "parent", "files", help_text="")
edit_groups = make_ajax_field(
SithFile, "edit_groups", "groups", help_text="", label=_("edit group")
)
view_groups = make_ajax_field(
SithFile, "view_groups", "groups", help_text="", label=_("view group")
)
recursive = forms.BooleanField(label=_("Apply rights recursively"), required=False) recursive = forms.BooleanField(label=_("Apply rights recursively"), required=False)

View File

@ -3,8 +3,8 @@ from django.db.models import Model
from django.forms import Select, SelectMultiple from django.forms import Select, SelectMultiple
from ninja import ModelSchema from ninja import ModelSchema
from core.models import Group, User from core.models import Group, SithFile, User
from core.schemas import GroupSchema, UserProfileSchema from core.schemas import GroupSchema, SithFileSchema, UserProfileSchema
class AutoCompleteSelectMixin: class AutoCompleteSelectMixin:
@ -91,3 +91,15 @@ class AutoCompleteSelectMultipleGroup(AutoCompleteSelectMixin, SelectMultiple):
component_name = "group-ajax-select" component_name = "group-ajax-select"
model = Group model = Group
schema = GroupSchema schema = GroupSchema
class AutoCompleteSelectSithFile(AutoCompleteSelectMixin, Select):
component_name = "sith-file-ajax-select"
model = SithFile
schema = SithFileSchema
class AutoCompleteSelectMultipleSithFile(AutoCompleteSelectMixin, SelectMultiple):
component_name = "sith-file-ajax-select"
model = SithFile
schema = SithFileSchema