From 76de1f484e9598ade868e7e52c337c9631b18e72 Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Tue, 14 Jun 2022 13:44:56 +0000 Subject: [PATCH] add gallery and members to search, delete template, update Redesign --- fet2020/gallery/models.py | 14 ++++ fet2020/gallery/search_indexes.py | 22 +++++++ fet2020/gallery/views.py | 18 +++--- fet2020/intern/models.py | 3 + fet2020/intern/search_indexes.py | 4 +- fet2020/members/models.py | 3 + fet2020/members/search_indexes.py | 12 ++++ fet2020/posts/models.py | 3 + fet2020/posts/search_indexes.py | 8 +-- fet2020/search/forms.py | 64 ++++++++++++++++--- fet2020/templates/search/album.html | 21 ++++++ fet2020/templates/search/etherpad.html | 11 ++++ fet2020/templates/search/index.html | 55 +++++++++------- .../search/indexes/intern/etherpad_text.txt | 3 - .../search/indexes/posts/post_text.txt | 4 -- fet2020/templates/search/member.html | 10 +++ fet2020/templates/search/post.html | 15 +++++ 17 files changed, 215 insertions(+), 55 deletions(-) create mode 100644 fet2020/gallery/search_indexes.py create mode 100644 fet2020/members/search_indexes.py create mode 100644 fet2020/templates/search/album.html create mode 100644 fet2020/templates/search/etherpad.html delete mode 100644 fet2020/templates/search/indexes/intern/etherpad_text.txt delete mode 100644 fet2020/templates/search/indexes/posts/post_text.txt create mode 100644 fet2020/templates/search/member.html create mode 100644 fet2020/templates/search/post.html diff --git a/fet2020/gallery/models.py b/fet2020/gallery/models.py index aac9db5b..ed220065 100644 --- a/fet2020/gallery/models.py +++ b/fet2020/gallery/models.py @@ -5,6 +5,8 @@ from django.utils import timezone from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ +from .utils import get_image_list + class Album(models.Model): title = models.CharField(verbose_name="Titel", max_length=200) @@ -51,3 +53,15 @@ class Album(models.Model): self.slug = slugify(self.title) super().save(*args, **kwargs) + + def get_images(self): + return get_image_list(self.folder_name) + + def get_images_length_sub_3(self): + return len(self.get_images()) - 3 + + def get_model_name(self): + return self._meta.model_name + + def get_thumbnail(self): + return None diff --git a/fet2020/gallery/search_indexes.py b/fet2020/gallery/search_indexes.py new file mode 100644 index 00000000..37f99366 --- /dev/null +++ b/fet2020/gallery/search_indexes.py @@ -0,0 +1,22 @@ +from haystack import indexes + +from django.utils import timezone + +from .models import Album + + +class PostIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True) + title = indexes.EdgeNgramField(model_attr="title") + description = indexes.EdgeNgramField(model_attr="description", null=True) + status = indexes.CharField(model_attr="status") + event_date = indexes.DateField() + + def get_model(self): + return Album + + def prepare_event_date(self, obj): + if not obj.event_date: + return timezone.now().date() + + return obj.event_date diff --git a/fet2020/gallery/views.py b/fet2020/gallery/views.py index 262def20..a0c2da2d 100644 --- a/fet2020/gallery/views.py +++ b/fet2020/gallery/views.py @@ -9,7 +9,7 @@ from django.utils.text import slugify from authentications.decorators import authenticated_user from .models import Album -from .utils import create_thumbs, get_folder_list, get_image_list +from .utils import create_thumbs, get_folder_list def index(request): @@ -21,11 +21,13 @@ def index(request): if folders: for folder in folders: if not Album.objects.filter(folder_name=folder): - album = Album( - title=folder, - slug=slugify(folder), - folder_name=folder, - event_date=None, + albums.append( + Album( + title=folder, + slug=slugify(folder), + folder_name=folder, + event_date=None, + ) ) else: # show only PUBLIC albums. @@ -34,7 +36,7 @@ def index(request): ) for album in list(albums): - img_list = get_image_list(album.folder_name) + img_list = album.get_images() if img_list: if album.thumbnail: for img in img_list: @@ -74,7 +76,7 @@ def show_album(request, slug): else: raise Http404("wrong album slug") - img_list = get_image_list(album.folder_name) + img_list = album.get_images() if not img_list: # empty album is temporarily set to DRAFT. album.status = Album.DRAFT diff --git a/fet2020/intern/models.py b/fet2020/intern/models.py index cdaec67b..acbf9424 100644 --- a/fet2020/intern/models.py +++ b/fet2020/intern/models.py @@ -181,6 +181,9 @@ class Etherpad(models.Model): return get_pad_html(self.__get_pad_name()) + def get_model_name(self): + return self._meta.model_name + class FileUpload(models.Model): title = models.CharField(verbose_name="Titel", max_length=128, blank=True) diff --git a/fet2020/intern/search_indexes.py b/fet2020/intern/search_indexes.py index 4d4cb5a7..a2254ff5 100644 --- a/fet2020/intern/search_indexes.py +++ b/fet2020/intern/search_indexes.py @@ -5,10 +5,10 @@ from .models import Etherpad class EtherpadIndex(indexes.SearchIndex, indexes.Indexable): - text = indexes.CharField(document=True, use_template=True) + text = indexes.CharField(document=True) title = indexes.CharField(model_attr="title") date = indexes.DateField(model_attr="date") - etherpad = indexes.EdgeNgramField(null=True) + etherpad = indexes.CharField(null=True) def get_model(self): return Etherpad diff --git a/fet2020/members/models.py b/fet2020/members/models.py index d89afc40..12ca5575 100644 --- a/fet2020/members/models.py +++ b/fet2020/members/models.py @@ -104,6 +104,9 @@ class Member(models.Model): user.first_name = self.firstname user.save() + def get_model_name(self): + return self._meta.model_name + class JobGroup(models.Model): name = models.CharField(max_length=128) diff --git a/fet2020/members/search_indexes.py b/fet2020/members/search_indexes.py new file mode 100644 index 00000000..8a33b351 --- /dev/null +++ b/fet2020/members/search_indexes.py @@ -0,0 +1,12 @@ +from haystack import indexes + +from .models import Member + + +class PostIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.CharField(document=True) + firstname = indexes.EdgeNgramField(model_attr="firstname") + surname = indexes.EdgeNgramField(model_attr="surname") + + def get_model(self): + return Member diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index fa357ca2..a2b5b67d 100644 --- a/fet2020/posts/models.py +++ b/fet2020/posts/models.py @@ -216,6 +216,9 @@ class Post(models.Model): return None return create_pad_for_post(self.slug, "protocol") + def get_model_name(self): + return self._meta.model_name + @property def three_tag_names(self): return self.tags.names()[:3] diff --git a/fet2020/posts/search_indexes.py b/fet2020/posts/search_indexes.py index a6697510..aab838c7 100644 --- a/fet2020/posts/search_indexes.py +++ b/fet2020/posts/search_indexes.py @@ -5,13 +5,13 @@ from .models import Post class PostIndex(indexes.SearchIndex, indexes.Indexable): - text = indexes.CharField(document=True, use_template=True) + text = indexes.CharField(document=True) title = indexes.EdgeNgramField(model_attr="title") body = indexes.EdgeNgramField(model_attr="body", null=True) - status = indexes.EdgeNgramField(model_attr="status") + status = indexes.CharField(model_attr="status") date = indexes.DateField() - agenda = indexes.EdgeNgramField(null=True) - protocol = indexes.EdgeNgramField(null=True) + agenda = indexes.EdgeNgramField() + protocol = indexes.EdgeNgramField() def get_model(self): return Post diff --git a/fet2020/search/forms.py b/fet2020/search/forms.py index 045b0199..2cf8f440 100644 --- a/fet2020/search/forms.py +++ b/fet2020/search/forms.py @@ -3,7 +3,9 @@ from collections import deque from haystack.forms import SearchForm from haystack.query import SQ +from gallery.models import Album from intern.models import Etherpad +from members.models import Member from posts.models import Post @@ -15,6 +17,21 @@ class FetUserSearchForm(SearchForm): if not self.cleaned_data.get("q"): return self.no_query_found() + sqs_gallery = self.searchqueryset.models(Album) + sqs_gallery = sqs_gallery.filter( + SQ(title__icontains=self.cleaned_data["q"]) + | SQ(description__icontains=self.cleaned_data["q"]) + ) + + sqs_intern = self.searchqueryset.models(Etherpad) + sqs_intern = sqs_intern.filter(etherpad__icontains=self.cleaned_data["q"]) + + sqs_member = self.searchqueryset.models(Member) + sqs_member = sqs_member.filter( + SQ(firstname__icontains=self.cleaned_data["q"]) + | SQ(surname__icontains=self.cleaned_data["q"]) + ) + sqs_post = self.searchqueryset.models(Post) sqs_post = sqs_post.filter( SQ(title__icontains=self.cleaned_data["q"]) @@ -23,18 +40,24 @@ class FetUserSearchForm(SearchForm): | SQ(protocol__icontains=self.cleaned_data["q"]) ) - sqs_intern = self.searchqueryset.models(Etherpad) - sqs_intern = sqs_intern.filter(etherpad__icontains=self.cleaned_data["q"]) - - results = deque([]) - - for elem in sqs_post.order_by("-date"): - results.append(elem.object) + tmp_results = deque([]) for elem in sqs_intern.order_by("-date"): + tmp_results.append(elem.object) + + for elem in sqs_post.order_by("-date"): + tmp_results.append(elem.object) + + tmp_results = sorted(tmp_results, key=lambda elem: elem.date, reverse=True) + + results = [] + for elem in sqs_gallery.order_by("-event_date"): results.append(elem.object) - return sorted(results, key=lambda elem: elem.date, reverse=True) + for elem in sqs_member: + results.append(elem.object) + + return results + tmp_results class NonUserSearchForm(SearchForm): @@ -45,6 +68,18 @@ class NonUserSearchForm(SearchForm): if not self.cleaned_data.get("q"): return self.no_query_found() + sqs_gallery = self.searchqueryset.models(Album).filter(status="20") + sqs_gallery = sqs_gallery.filter( + SQ(title__icontains=self.cleaned_data["q"]) + | SQ(description__icontains=self.cleaned_data["q"]) + ) + + sqs_member = self.searchqueryset.models(Member) + sqs_member = sqs_member.filter( + SQ(firstname__icontains=self.cleaned_data["q"]) + | SQ(surname__icontains=self.cleaned_data["q"]) + ) + sqs_post = self.searchqueryset.models(Post).filter(status="20") sqs_post = sqs_post.filter( SQ(title__icontains=self.cleaned_data["q"]) @@ -52,9 +87,18 @@ class NonUserSearchForm(SearchForm): | SQ(agenda__icontains=self.cleaned_data["q"]) ) - results = deque([]) + tmp_results = deque([]) for elem in sqs_post.order_by("-date"): + tmp_results.append(elem.object) + + tmp_results = sorted(tmp_results, key=lambda elem: elem.date, reverse=True) + + results = [] + for elem in sqs_gallery.order_by("-event_date"): results.append(elem.object) - return sorted(results, key=lambda elem: elem.date, reverse=True) + for elem in sqs_member: + results.append(elem.object) + + return results + tmp_results diff --git a/fet2020/templates/search/album.html b/fet2020/templates/search/album.html new file mode 100644 index 00000000..f237abf0 --- /dev/null +++ b/fet2020/templates/search/album.html @@ -0,0 +1,21 @@ + + +
+

{{ result.title }}

+
{{ result.description|safe }}
+
+ + {{ result.photographer|default:'' }} am {{ result.event_date|date:"d. M. Y" }} +
+
+
diff --git a/fet2020/templates/search/etherpad.html b/fet2020/templates/search/etherpad.html new file mode 100644 index 00000000..bc5a1115 --- /dev/null +++ b/fet2020/templates/search/etherpad.html @@ -0,0 +1,11 @@ + + +
+

{{ result.title|truncatechars:50 }}

+
{{ result.etherpad_html|safe|truncatechars:120 }}
+
+ + Am {{ result.date|date:"d. M. Y" }} +
+
+
diff --git a/fet2020/templates/search/index.html b/fet2020/templates/search/index.html index e2b4d349..89bb4584 100644 --- a/fet2020/templates/search/index.html +++ b/fet2020/templates/search/index.html @@ -1,33 +1,40 @@ {% extends 'base.html' %} +{% block title %}Suche{% endblock %} + {% block content %} -
-

Suchen

-
- -
- - {{ form.as_table }} - - - - -
  - -
- - {% if object_list %} -

Results

+ +
+

Suchergebnisse

+
+
+ + + + +
+ +
+ {% if form.q.value %} +
{% for result in object_list %} -

- {{ result.date|date }}: {{ result.title }} -

+ {% if result.get_model_name == 'post' %} + {% include 'search/post.html' %} + {% elif result.get_model_name == 'etherpad' %} + {% include 'search/etherpad.html' %} + {% elif result.get_model_name == 'member' %} + {% include 'search/member.html' %} + {% elif result.get_model_name == 'album' %} + {% include 'search/album.html' %} + {% endif %} {% empty %} -

No results found.

+
+

Keine Ergebnisse gefunden.

+
{% endfor %} +
{% endif %} - -
-
+ + {% endblock %} diff --git a/fet2020/templates/search/indexes/intern/etherpad_text.txt b/fet2020/templates/search/indexes/intern/etherpad_text.txt deleted file mode 100644 index 7bac4979..00000000 --- a/fet2020/templates/search/indexes/intern/etherpad_text.txt +++ /dev/null @@ -1,3 +0,0 @@ -{{ object.title }} -{{ object.date }} -{{ object.etherpad|safe }} diff --git a/fet2020/templates/search/indexes/posts/post_text.txt b/fet2020/templates/search/indexes/posts/post_text.txt deleted file mode 100644 index e9be43b3..00000000 --- a/fet2020/templates/search/indexes/posts/post_text.txt +++ /dev/null @@ -1,4 +0,0 @@ -{{ object.title }} -{{ object.body|safe }} -{{ object.agenda|safe }} -{{ object.protocol|safe }} diff --git a/fet2020/templates/search/member.html b/fet2020/templates/search/member.html new file mode 100644 index 00000000..ced118da --- /dev/null +++ b/fet2020/templates/search/member.html @@ -0,0 +1,10 @@ + +
+
+

{{ result.firstname }} {{ result.surname }}

+
    +
  • {{ result.nickname }}
  • +
  • {{ result.mailaccount }}
  • +
+
+
diff --git a/fet2020/templates/search/post.html b/fet2020/templates/search/post.html new file mode 100644 index 00000000..f2f5ec67 --- /dev/null +++ b/fet2020/templates/search/post.html @@ -0,0 +1,15 @@ + + +
+

{{ result.title|truncatechars:50 }}

+ {% if result.body %} +
{{ result.body|safe|truncatechars:120 }}
+ {% elif result.agenda_html %} +
{{ result.agenda_html|safe|truncatechars:120 }}
+ {% endif %} +
+ + {{ result.author }} am {{ result.date|date:"d. M. Y" }} +
+
+