__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" __license__ = "AGPL v3" from django import forms from django.db.models import Q from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Div, Field from crispy_bootstrap5.bootstrap5 import FloatingField from .models import Category, BlogPost class BlogPostSearchForm(forms.Form): category = forms.ModelChoiceField( queryset=Category.objects.all(), required=False, ) q = forms.CharField( max_length=32, label="Search (title, body, author)", required=False, ) def __init__(self, *args, **kwargs): self.user = kwargs.pop("user") super().__init__(*args, **kwargs) self.helper = FormHelper() self.helper.layout = Layout( Div( Div(Field("category"), css_class="col-lg-4"), Div(FloatingField("q", autocomplete="off"), css_class="col-lg-8"), css_class="row", ), Field("slug", type="hidden"), ) def search_results(self): posts = BlogPost.objects.all() if self.cleaned_data["category"]: posts = posts.filter(categories=self.cleaned_data["category"]) if self.cleaned_data["q"]: splitwords = self.cleaned_data["q"].replace(",", "").split(" ") query = Q() for word in splitwords: query = query & ( Q(title__icontains=word) | Q(blurb__icontains=word) | Q(body__icontains=word) | Q(posted_by__first_name__icontains=word) | Q(posted_by__last_name__icontains=word) ) posts = posts.filter(query).distinct() if not self.user.has_perm("blog.change_blogpost"): posts = posts.published() return posts