remove searchable model
This commit is contained in:
parent
e868e0ccee
commit
4e322f7211
|
@ -12,12 +12,6 @@ class CategoryAdmin(admin.ModelAdmin):
|
||||||
|
|
||||||
list_display = ["name", "slug"]
|
list_display = ["name", "slug"]
|
||||||
|
|
||||||
@admin.action(description=_("Regenerate traits"))
|
|
||||||
def regenerate(modeladmin, request, queryset):
|
|
||||||
for obj in queryset:
|
|
||||||
obj.regenerate()
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(BlogPost)
|
@admin.register(BlogPost)
|
||||||
class BlogPostAdmin(admin.ModelAdmin):
|
class BlogPostAdmin(admin.ModelAdmin):
|
||||||
"""
|
"""
|
||||||
|
@ -26,8 +20,6 @@ class BlogPostAdmin(admin.ModelAdmin):
|
||||||
list_display = ["title_en", "subtitle_en", "title_de", "subtitle_de", "date", "category", "slug", "suburl", "public"]
|
list_display = ["title_en", "subtitle_en", "title_de", "subtitle_de", "date", "category", "slug", "suburl", "public"]
|
||||||
date_hierarchy = "date"
|
date_hierarchy = "date"
|
||||||
ordering = ['title_de', 'title_en']
|
ordering = ['title_de', 'title_en']
|
||||||
actions = [regenerate]
|
|
||||||
|
|
||||||
change_list_template = "admin/blogpost.html"
|
change_list_template = "admin/blogpost.html"
|
||||||
|
|
||||||
def get_urls(self):
|
def get_urls(self):
|
||||||
|
|
|
@ -1,47 +1,12 @@
|
||||||
# Generated by Django 3.2.21 on 2023-10-02 08:14
|
# Generated by Django 4.2.6 on 2023-10-10 09:58
|
||||||
|
|
||||||
import blog.models
|
from django.db import migrations
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('start', '0001_initial'),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
|
||||||
name='Category',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('name', models.CharField(max_length=50)),
|
|
||||||
('slug', models.SlugField(unique=True)),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Category',
|
|
||||||
'verbose_name_plural': 'Categories',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='BlogPost',
|
|
||||||
fields=[
|
|
||||||
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='start.searchable')),
|
|
||||||
('body_en', models.TextField(blank=True, default='Dieser Artikel ist nicht auf deutsch verfügbar.')),
|
|
||||||
('body_de', models.TextField(blank=True, default='This aritcle is not available in english.')),
|
|
||||||
('thumbnail', models.ImageField(blank=True, default='img/thumbnails/default.jpg', upload_to='img/thumbnails')),
|
|
||||||
('featured', models.BooleanField(default=False)),
|
|
||||||
('langs', models.CharField(default="{'en': False, 'de': False}", max_length=64)),
|
|
||||||
('slug', models.SlugField()),
|
|
||||||
('category', models.ForeignKey(default=blog.models.Category.get_or_create_uncategorized, on_delete=django.db.models.deletion.SET_DEFAULT, to='blog.category')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'blog post',
|
|
||||||
'verbose_name_plural': 'blog posts',
|
|
||||||
},
|
|
||||||
bases=('start.searchable',),
|
|
||||||
),
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
# Generated by Django 4.2.5 on 2023-10-02 19:03
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('blog', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='blogpost',
|
|
||||||
name='slug',
|
|
||||||
field=models.SlugField(unique=True),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
# Generated by Django 4.2.6 on 2023-10-10 09:58
|
||||||
|
|
||||||
|
import blog.models
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('start', '0002_initial'),
|
||||||
|
('blog', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Category',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=50)),
|
||||||
|
('slug', models.SlugField(unique=True)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Category',
|
||||||
|
'verbose_name_plural': 'Categories',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='BlogPost',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('body_en', models.TextField(blank=True, default='Dieser Artikel ist nicht auf deutsch verfügbar.')),
|
||||||
|
('body_de', models.TextField(blank=True, default='This aritcle is not available in english.')),
|
||||||
|
('thumbnail', models.ImageField(blank=True, default='img/thumbnails/default.jpg', upload_to='img/thumbnails')),
|
||||||
|
('featured', models.BooleanField(default=False)),
|
||||||
|
('langs', models.CharField(default="{'en': False, 'de': False}", max_length=64)),
|
||||||
|
('slug', models.SlugField(unique=True)),
|
||||||
|
('title_de', models.CharField(default='Nicht übersetzt', max_length=50)),
|
||||||
|
('title_en', models.CharField(default='Not translated', max_length=50)),
|
||||||
|
('subtitle_de', models.CharField(blank=True, max_length=50)),
|
||||||
|
('subtitle_en', models.CharField(blank=True, max_length=50)),
|
||||||
|
('desc_de', models.TextField(blank=True, default='Keine Beschreibung', max_length=250)),
|
||||||
|
('desc_en', models.TextField(blank=True, default='no description', max_length=250)),
|
||||||
|
('date', models.DateTimeField(blank=True, null=True)),
|
||||||
|
('update', models.DateTimeField(blank=True, null=True)),
|
||||||
|
('suburl', models.CharField(blank=True, max_length=200, null=True)),
|
||||||
|
('public', models.BooleanField(default=False)),
|
||||||
|
('category', models.ForeignKey(default=blog.models.Category.get_or_create_uncategorized, on_delete=django.db.models.deletion.SET_DEFAULT, to='blog.category')),
|
||||||
|
('keywords', models.ManyToManyField(blank=True, to='start.keyword')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'blog post',
|
||||||
|
'verbose_name_plural': 'blog posts',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
|
@ -7,7 +7,7 @@ import markdown
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from start.models import Keyword, Searchable
|
from start.models import Keyword
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -56,7 +56,7 @@ class Category(models.Model):
|
||||||
slug="uncategorized", name="uncategorized")
|
slug="uncategorized", name="uncategorized")
|
||||||
|
|
||||||
|
|
||||||
class BlogPost(Searchable):
|
class BlogPost(models.Model):
|
||||||
"""
|
"""
|
||||||
Should contain a blogpost
|
Should contain a blogpost
|
||||||
"""
|
"""
|
||||||
|
@ -87,6 +87,19 @@ class BlogPost(Searchable):
|
||||||
langs = models.CharField(
|
langs = models.CharField(
|
||||||
default=DEFAULT_LANGS.__repr__(), max_length=64)
|
default=DEFAULT_LANGS.__repr__(), max_length=64)
|
||||||
slug = models.SlugField(unique=True, blank=False)
|
slug = models.SlugField(unique=True, blank=False)
|
||||||
|
title_de = models.CharField(max_length=50, default="Nicht übersetzt")
|
||||||
|
title_en = models.CharField(max_length=50, default="Not translated")
|
||||||
|
subtitle_de = models.CharField(max_length=50, blank=True)
|
||||||
|
subtitle_en = models.CharField(max_length=50, blank=True)
|
||||||
|
desc_de = models.TextField(
|
||||||
|
blank=True, max_length=250, unique=False, default="Keine Beschreibung")
|
||||||
|
desc_en = models.TextField(
|
||||||
|
blank=True, max_length=250, unique=False, default="no description")
|
||||||
|
date = models.DateTimeField(blank=True, null=True)
|
||||||
|
update = models.DateTimeField(blank=True, null=True)
|
||||||
|
keywords = models.ManyToManyField(Keyword, blank=True)
|
||||||
|
suburl = models.CharField(max_length=200, blank=True, null=True)
|
||||||
|
public = models.BooleanField(default=False)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
# check if the slug is empty if we remove whitespaces
|
# check if the slug is empty if we remove whitespaces
|
||||||
|
|
|
@ -43,14 +43,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="container text-center jumbotron my-3">
|
<div class="container text-center jumbotron my-3">
|
||||||
<h1 class="my-4">{% translate "Looking for anything specific?" %}</h1>
|
<h2 class="my-5">
|
||||||
{% include 'main_search_form.html' %}
|
|
||||||
<h4 class="my-5">
|
|
||||||
<a href="{% url 'blog:browse' %}"
|
<a href="{% url 'blog:browse' %}"
|
||||||
class="link-offset-2 link-underline link-underline-opacity-0">
|
class="link-offset-2 link-underline link-underline-opacity-0">
|
||||||
{% translate "Browse posts" %}
|
{% translate "Browse posts" %}
|
||||||
</a>
|
</a>
|
||||||
</h4>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
{% include 'blog/featured.html' %}
|
{% include 'blog/featured.html' %}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -9,13 +9,11 @@ from django.views.generic import TemplateView, DetailView, ListView, View
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from .models import BlogPost, Category, Keyword
|
from .models import BlogPost, Category, Keyword
|
||||||
|
|
||||||
from start.views import SearchableView
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Index(TemplateView, SearchableView):
|
class Index(TemplateView):
|
||||||
"""
|
"""
|
||||||
The index page of the gawa/blog app.
|
The index page of the gawa/blog app.
|
||||||
|
|
||||||
|
@ -51,7 +49,6 @@ class Browse(ListView):
|
||||||
Scroll through a list of blog posts
|
Scroll through a list of blog posts
|
||||||
|
|
||||||
There should also be some kind of filter, for category and date.
|
There should also be some kind of filter, for category and date.
|
||||||
Of course, Articles will also show up in the MainSearchView
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
model = BlogPost
|
model = BlogPost
|
||||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2023-10-09 23:19+0200\n"
|
"POT-Creation-Date: 2023-10-10 11:46+0200\n"
|
||||||
"PO-Revision-Date: 2023-10-08 21:03+0200\n"
|
"PO-Revision-Date: 2023-10-08 21:03+0200\n"
|
||||||
"Last-Translator: <software@cscherr.de>\n"
|
"Last-Translator: <software@cscherr.de>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -19,10 +19,6 @@ msgstr ""
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Translated-Using: django-rosetta 0.9.9\n"
|
"X-Translated-Using: django-rosetta 0.9.9\n"
|
||||||
|
|
||||||
#: blog/admin.py:15 start/admin.py:8
|
|
||||||
msgid "Regenerate traits"
|
|
||||||
msgstr "Eigenschaften regenerieren"
|
|
||||||
|
|
||||||
#: blog/models.py:44
|
#: blog/models.py:44
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr "Kategorie"
|
msgstr "Kategorie"
|
||||||
|
@ -31,11 +27,11 @@ msgstr "Kategorie"
|
||||||
msgid "Categories"
|
msgid "Categories"
|
||||||
msgstr "Kategorien"
|
msgstr "Kategorien"
|
||||||
|
|
||||||
#: blog/models.py:282
|
#: blog/models.py:295
|
||||||
msgid "blog post"
|
msgid "blog post"
|
||||||
msgstr "Blog Post"
|
msgstr "Blog Post"
|
||||||
|
|
||||||
#: blog/models.py:283
|
#: blog/models.py:296
|
||||||
msgid "blog posts"
|
msgid "blog posts"
|
||||||
msgstr "Blog Posts"
|
msgstr "Blog Posts"
|
||||||
|
|
||||||
|
@ -65,7 +61,6 @@ msgid "updated"
|
||||||
msgstr "aktualisiert"
|
msgstr "aktualisiert"
|
||||||
|
|
||||||
#: blog/templates/blog/browse.html:47 start/forms.py:15
|
#: blog/templates/blog/browse.html:47 start/forms.py:15
|
||||||
#: start/templates/main_search_form.html:3
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Suche"
|
msgstr "Suche"
|
||||||
|
|
||||||
|
@ -156,11 +151,7 @@ msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"Das ist mein persönlicher Blog. Ich lade hier hoch was auch immer ich möchte."
|
"Das ist mein persönlicher Blog. Ich lade hier hoch was auch immer ich möchte."
|
||||||
|
|
||||||
#: blog/templates/blog/index.html:46
|
#: blog/templates/blog/index.html:49
|
||||||
msgid "Looking for anything specific?"
|
|
||||||
msgstr "Suchst du nach etwas speziellem?"
|
|
||||||
|
|
||||||
#: blog/templates/blog/index.html:51
|
|
||||||
msgid "Browse posts"
|
msgid "Browse posts"
|
||||||
msgstr "Posts durchsuchen"
|
msgstr "Posts durchsuchen"
|
||||||
|
|
||||||
|
@ -172,6 +163,10 @@ msgstr "Deutsch"
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Englisch"
|
msgstr "Englisch"
|
||||||
|
|
||||||
|
#: start/admin.py:8
|
||||||
|
msgid "Regenerate traits"
|
||||||
|
msgstr "Eigenschaften regenerieren"
|
||||||
|
|
||||||
#: start/models.py:27
|
#: start/models.py:27
|
||||||
msgid "Keyword"
|
msgid "Keyword"
|
||||||
msgstr "Schlüsselwort"
|
msgstr "Schlüsselwort"
|
||||||
|
@ -180,27 +175,11 @@ msgstr "Schlüsselwort"
|
||||||
msgid "keywords"
|
msgid "keywords"
|
||||||
msgstr "Schlüsselwörter"
|
msgstr "Schlüsselwörter"
|
||||||
|
|
||||||
#: start/models.py:72
|
#: start/models.py:109
|
||||||
msgid "Searchable"
|
|
||||||
msgstr "suchbares Objekt"
|
|
||||||
|
|
||||||
#: start/models.py:73
|
|
||||||
msgid "Searchables"
|
|
||||||
msgstr "suchbare Objekte"
|
|
||||||
|
|
||||||
#: start/models.py:95
|
|
||||||
msgid "static site"
|
|
||||||
msgstr "statische Seite"
|
|
||||||
|
|
||||||
#: start/models.py:96
|
|
||||||
msgid "static sites"
|
|
||||||
msgstr "statische Seiten"
|
|
||||||
|
|
||||||
#: start/models.py:165
|
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr "Link"
|
msgstr "Link"
|
||||||
|
|
||||||
#: start/models.py:166 start/templates/nav.html:36
|
#: start/models.py:110 start/templates/nav.html:36
|
||||||
#: start/templates/start/legalinfo.html:8 start/templates/start/links.html:5
|
#: start/templates/start/legalinfo.html:8 start/templates/start/links.html:5
|
||||||
msgid "Links"
|
msgid "Links"
|
||||||
msgstr "Links"
|
msgstr "Links"
|
||||||
|
@ -281,10 +260,6 @@ msgstr "Kontakt"
|
||||||
msgid "Deutschland"
|
msgid "Deutschland"
|
||||||
msgstr "Deutschland"
|
msgstr "Deutschland"
|
||||||
|
|
||||||
#: start/templates/main_search_form.html:4
|
|
||||||
msgid "Go"
|
|
||||||
msgstr "Los"
|
|
||||||
|
|
||||||
#: start/templates/nav.html:27 start/templates/nav.html:30
|
#: start/templates/nav.html:27 start/templates/nav.html:30
|
||||||
#: start/templates/nav.html:54
|
#: start/templates/nav.html:54
|
||||||
msgid "Start"
|
msgid "Start"
|
||||||
|
@ -544,6 +519,24 @@ msgstr "Andere"
|
||||||
msgid "Search for"
|
msgid "Search for"
|
||||||
msgstr "Suche nach"
|
msgstr "Suche nach"
|
||||||
|
|
||||||
|
#~ msgid "Looking for anything specific?"
|
||||||
|
#~ msgstr "Suchst du nach etwas speziellem?"
|
||||||
|
|
||||||
|
#~ msgid "Searchable"
|
||||||
|
#~ msgstr "suchbares Objekt"
|
||||||
|
|
||||||
|
#~ msgid "Searchables"
|
||||||
|
#~ msgstr "suchbare Objekte"
|
||||||
|
|
||||||
|
#~ msgid "static site"
|
||||||
|
#~ msgstr "statische Seite"
|
||||||
|
|
||||||
|
#~ msgid "static sites"
|
||||||
|
#~ msgstr "statische Seiten"
|
||||||
|
|
||||||
|
#~ msgid "Go"
|
||||||
|
#~ msgstr "Los"
|
||||||
|
|
||||||
#~ msgid "Email "
|
#~ msgid "Email "
|
||||||
#~ msgstr "E-Mail"
|
#~ msgstr "E-Mail"
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2023-10-09 23:19+0200\n"
|
"POT-Creation-Date: 2023-10-10 11:46+0200\n"
|
||||||
"PO-Revision-Date: 2023-10-08 15:18+0200\n"
|
"PO-Revision-Date: 2023-10-08 15:18+0200\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
|
@ -18,10 +18,6 @@ msgstr ""
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Generator: Poedit 3.3.2\n"
|
"X-Generator: Poedit 3.3.2\n"
|
||||||
|
|
||||||
#: blog/admin.py:15 start/admin.py:8
|
|
||||||
msgid "Regenerate traits"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: blog/models.py:44
|
#: blog/models.py:44
|
||||||
msgid "Category"
|
msgid "Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -30,11 +26,11 @@ msgstr ""
|
||||||
msgid "Categories"
|
msgid "Categories"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: blog/models.py:282
|
#: blog/models.py:295
|
||||||
msgid "blog post"
|
msgid "blog post"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: blog/models.py:283
|
#: blog/models.py:296
|
||||||
msgid "blog posts"
|
msgid "blog posts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -64,7 +60,6 @@ msgid "updated"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: blog/templates/blog/browse.html:47 start/forms.py:15
|
#: blog/templates/blog/browse.html:47 start/forms.py:15
|
||||||
#: start/templates/main_search_form.html:3
|
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -144,11 +139,7 @@ msgid ""
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: blog/templates/blog/index.html:46
|
#: blog/templates/blog/index.html:49
|
||||||
msgid "Looking for anything specific?"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: blog/templates/blog/index.html:51
|
|
||||||
msgid "Browse posts"
|
msgid "Browse posts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -160,6 +151,10 @@ msgstr ""
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: start/admin.py:8
|
||||||
|
msgid "Regenerate traits"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: start/models.py:27
|
#: start/models.py:27
|
||||||
msgid "Keyword"
|
msgid "Keyword"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -168,27 +163,11 @@ msgstr ""
|
||||||
msgid "keywords"
|
msgid "keywords"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: start/models.py:72
|
#: start/models.py:109
|
||||||
msgid "Searchable"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: start/models.py:73
|
|
||||||
msgid "Searchables"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: start/models.py:95
|
|
||||||
msgid "static site"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: start/models.py:96
|
|
||||||
msgid "static sites"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: start/models.py:165
|
|
||||||
msgid "Link"
|
msgid "Link"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: start/models.py:166 start/templates/nav.html:36
|
#: start/models.py:110 start/templates/nav.html:36
|
||||||
#: start/templates/start/legalinfo.html:8 start/templates/start/links.html:5
|
#: start/templates/start/legalinfo.html:8 start/templates/start/links.html:5
|
||||||
msgid "Links"
|
msgid "Links"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -262,10 +241,6 @@ msgstr "Contact"
|
||||||
msgid "Deutschland"
|
msgid "Deutschland"
|
||||||
msgstr "Germany"
|
msgstr "Germany"
|
||||||
|
|
||||||
#: start/templates/main_search_form.html:4
|
|
||||||
msgid "Go"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: start/templates/nav.html:27 start/templates/nav.html:30
|
#: start/templates/nav.html:27 start/templates/nav.html:30
|
||||||
#: start/templates/nav.html:54
|
#: start/templates/nav.html:54
|
||||||
msgid "Start"
|
msgid "Start"
|
||||||
|
|
|
@ -19,28 +19,6 @@ class KeywordAdmin(admin.ModelAdmin):
|
||||||
list_display = ["text_en", "text_de"]
|
list_display = ["text_en", "text_de"]
|
||||||
|
|
||||||
|
|
||||||
@admin.register(StaticSite)
|
|
||||||
class StaticSiteAdmin(admin.ModelAdmin):
|
|
||||||
"""
|
|
||||||
Admin Interface for StaticSite
|
|
||||||
"""
|
|
||||||
list_display = ["title_en", "subtitle_en",
|
|
||||||
"title_de", "subtitle_de", "suburl"]
|
|
||||||
ordering = ['title_de', 'title_en']
|
|
||||||
actions = [regenerate]
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Searchable)
|
|
||||||
class SearchableAdmin(admin.ModelAdmin):
|
|
||||||
"""
|
|
||||||
Abstract Admin Interface for all Searchables
|
|
||||||
"""
|
|
||||||
list_display = ["title_en", "subtitle_en",
|
|
||||||
"title_de", "subtitle_de", "suburl"]
|
|
||||||
ordering = ['title_de', 'title_en']
|
|
||||||
actions = [regenerate]
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Link)
|
@admin.register(Link)
|
||||||
class LinkAdmin(admin.ModelAdmin):
|
class LinkAdmin(admin.ModelAdmin):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,75 +1,12 @@
|
||||||
# Generated by Django 3.2.21 on 2023-10-02 08:14
|
# Generated by Django 4.2.6 on 2023-10-10 09:58
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
|
||||||
name='Keyword',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('slug', models.SlugField(unique=True)),
|
|
||||||
('text_de', models.CharField(max_length=40)),
|
|
||||||
('text_en', models.CharField(max_length=40)),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Keyword',
|
|
||||||
'verbose_name_plural': 'keywords',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Searchable',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('title_de', models.CharField(default='Nicht übersetzt', max_length=50)),
|
|
||||||
('title_en', models.CharField(default='Not translated', max_length=50)),
|
|
||||||
('subtitle_de', models.CharField(blank=True, max_length=50)),
|
|
||||||
('subtitle_en', models.CharField(blank=True, max_length=50)),
|
|
||||||
('desc_de', models.TextField(blank=True, default='Keine Beschreibung', max_length=250)),
|
|
||||||
('desc_en', models.TextField(blank=True, default='no description', max_length=250)),
|
|
||||||
('date', models.DateTimeField(blank=True, null=True)),
|
|
||||||
('update', models.DateTimeField(blank=True, null=True)),
|
|
||||||
('suburl', models.CharField(blank=True, max_length=200, null=True)),
|
|
||||||
('public', models.BooleanField(default=False)),
|
|
||||||
('keywords', models.ManyToManyField(blank=True, to='start.Keyword')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Searchable',
|
|
||||||
'verbose_name_plural': 'Searchables',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='Link',
|
|
||||||
fields=[
|
|
||||||
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='start.searchable')),
|
|
||||||
('url', models.URLField(primary_key=True, serialize=False, unique=True)),
|
|
||||||
('favicon', models.ImageField(blank=True, null=True, upload_to='img/links/favicons')),
|
|
||||||
('status', models.BooleanField(default=False)),
|
|
||||||
('personal', models.BooleanField(default=False)),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'Link',
|
|
||||||
'verbose_name_plural': 'Links',
|
|
||||||
},
|
|
||||||
bases=('start.searchable',),
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='StaticSite',
|
|
||||||
fields=[
|
|
||||||
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='start.searchable')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': 'static site',
|
|
||||||
'verbose_name_plural': 'static sites',
|
|
||||||
},
|
|
||||||
bases=('start.searchable',),
|
|
||||||
),
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
# Generated by Django 4.2.6 on 2023-10-10 09:58
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('start', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Keyword',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('slug', models.SlugField(unique=True)),
|
||||||
|
('text_de', models.CharField(max_length=40)),
|
||||||
|
('text_en', models.CharField(max_length=40)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Keyword',
|
||||||
|
'verbose_name_plural': 'keywords',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Link',
|
||||||
|
fields=[
|
||||||
|
('url', models.URLField(primary_key=True, serialize=False, unique=True)),
|
||||||
|
('favicon', models.ImageField(blank=True, null=True, upload_to='img/links/favicons')),
|
||||||
|
('status', models.BooleanField(default=False)),
|
||||||
|
('personal', models.BooleanField(default=False)),
|
||||||
|
('title_de', models.CharField(default='Nicht übersetzt', max_length=50)),
|
||||||
|
('title_en', models.CharField(default='Not translated', max_length=50)),
|
||||||
|
('subtitle_de', models.CharField(blank=True, max_length=50)),
|
||||||
|
('subtitle_en', models.CharField(blank=True, max_length=50)),
|
||||||
|
('desc_de', models.TextField(blank=True, default='Keine Beschreibung', max_length=250)),
|
||||||
|
('desc_en', models.TextField(blank=True, default='no description', max_length=250)),
|
||||||
|
('date', models.DateTimeField(blank=True, null=True)),
|
||||||
|
('update', models.DateTimeField(blank=True, null=True)),
|
||||||
|
('suburl', models.CharField(blank=True, max_length=200, null=True)),
|
||||||
|
('public', models.BooleanField(default=False)),
|
||||||
|
('keywords', models.ManyToManyField(blank=True, to='start.keyword')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Link',
|
||||||
|
'verbose_name_plural': 'Links',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
|
@ -27,14 +27,17 @@ class Keyword(models.Model):
|
||||||
verbose_name = _("Keyword")
|
verbose_name = _("Keyword")
|
||||||
verbose_name_plural = _("keywords")
|
verbose_name_plural = _("keywords")
|
||||||
|
|
||||||
|
class Link(models.Model):
|
||||||
class Searchable(models.Model):
|
|
||||||
"""
|
"""
|
||||||
Abstract class for any model that should be searchable.
|
contains all my interesting links
|
||||||
This model will be searched for by the searchbox that is in every upper part of the website.
|
|
||||||
|
|
||||||
This class is not a real abstract class, I need to query it in the main search, so thats impossible
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# the actual link
|
||||||
|
url = models.URLField(unique=True, null=False, primary_key=True)
|
||||||
|
favicon_dir: str = "img/links/favicons"
|
||||||
|
favicon = models.ImageField(blank=True, upload_to=favicon_dir, null=True)
|
||||||
|
status = models.BooleanField(default=False)
|
||||||
|
personal = models.BooleanField(default=False)
|
||||||
title_de = models.CharField(max_length=50, default="Nicht übersetzt")
|
title_de = models.CharField(max_length=50, default="Nicht übersetzt")
|
||||||
title_en = models.CharField(max_length=50, default="Not translated")
|
title_en = models.CharField(max_length=50, default="Not translated")
|
||||||
subtitle_de = models.CharField(max_length=50, blank=True)
|
subtitle_de = models.CharField(max_length=50, blank=True)
|
||||||
|
@ -49,65 +52,6 @@ class Searchable(models.Model):
|
||||||
suburl = models.CharField(max_length=200, blank=True, null=True)
|
suburl = models.CharField(max_length=200, blank=True, null=True)
|
||||||
public = models.BooleanField(default=False)
|
public = models.BooleanField(default=False)
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def regenerate_all_entries(cls):
|
|
||||||
"""
|
|
||||||
regenerate all searchable items
|
|
||||||
"""
|
|
||||||
logger.info(f"regenerating all {Searchable.__name__} entries")
|
|
||||||
for obj in cls.objects.all():
|
|
||||||
obj.regenerate()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return f"{{<{self.__class__.__name__}>\"{self.title_en}\"}}"
|
|
||||||
|
|
||||||
def regenerate(self):
|
|
||||||
"""
|
|
||||||
regenerate a object
|
|
||||||
"""
|
|
||||||
raise NotImplementedError(
|
|
||||||
f"{self.__class__.__name__} does not implement regenerate")
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = _("Searchable")
|
|
||||||
verbose_name_plural = _("Searchables")
|
|
||||||
|
|
||||||
|
|
||||||
class StaticSite(Searchable):
|
|
||||||
"""
|
|
||||||
This model represents any static site, such as start:index,
|
|
||||||
that should show up in search.
|
|
||||||
|
|
||||||
Every searchable view should inherit from start.views.SearchableView.
|
|
||||||
# TODO automate scanning for SearchableView classes
|
|
||||||
"""
|
|
||||||
|
|
||||||
def regenerate(self):
|
|
||||||
"""
|
|
||||||
regenerate a object
|
|
||||||
"""
|
|
||||||
logger.info(f"regenerating {self.__class__.__name__} object: {self}")
|
|
||||||
logger.warning(f"{self.__class__.__name__} cannot regenerate.")
|
|
||||||
# self.save()
|
|
||||||
pass
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = _("static site")
|
|
||||||
verbose_name_plural = _("static sites")
|
|
||||||
|
|
||||||
|
|
||||||
class Link(Searchable):
|
|
||||||
"""
|
|
||||||
contains all my interesting links
|
|
||||||
"""
|
|
||||||
|
|
||||||
# the actual link
|
|
||||||
url = models.URLField(unique=True, null=False, primary_key=True)
|
|
||||||
favicon_dir: str = "img/links/favicons"
|
|
||||||
favicon = models.ImageField(blank=True, upload_to=favicon_dir, null=True)
|
|
||||||
status = models.BooleanField(default=False)
|
|
||||||
personal = models.BooleanField(default=False)
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{{<{self.__class__.__name__}>\"{self.title_en}\"}}"
|
return f"{{<{self.__class__.__name__}>\"{self.title_en}\"}}"
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
{% load i18n %}
|
|
||||||
<form class="d-flex" role="search" action="{% url 'start:search' %}" method="GET">
|
|
||||||
<input type="search" name="search" class="form-control me-2" aria-label="Search" placeholder="{% trans "Search" %}" required id="id_search">
|
|
||||||
<button class="btn bg-primary fw-bold" type="submit">{% translate "Go" %}</button>
|
|
||||||
</form>
|
|
|
@ -119,7 +119,6 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item dropdown">{% include 'main_search_form.html' %}</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -5,7 +5,6 @@ from . import views
|
||||||
app_name: str = "start"
|
app_name: str = "start"
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", views.Index.as_view(), name="index"),
|
path("", views.Index.as_view(), name="index"),
|
||||||
path("search/", views.MainSearch.as_view(), name="search"),
|
|
||||||
path("reporting/", views.Reporting.as_view(), name="reporting"),
|
path("reporting/", views.Reporting.as_view(), name="reporting"),
|
||||||
path("legal/", views.LegalInfo.as_view(), name="legal"),
|
path("legal/", views.LegalInfo.as_view(), name="legal"),
|
||||||
path("links/", views.Links.as_view(), name="links"),
|
path("links/", views.Links.as_view(), name="links"),
|
||||||
|
|
|
@ -11,8 +11,7 @@ from django.views.static import loader
|
||||||
from django.views import i18n
|
from django.views import i18n
|
||||||
from requests import request
|
from requests import request
|
||||||
|
|
||||||
from .forms import MainSearchForm
|
from .models import Link
|
||||||
from .models import Link, Searchable
|
|
||||||
|
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
|
|
||||||
|
@ -20,30 +19,18 @@ import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SearchableView(View, ABC):
|
class Index(TemplateView):
|
||||||
"""
|
|
||||||
This abstract view implements some traits of views that should show up
|
|
||||||
in the main search
|
|
||||||
"""
|
|
||||||
title: str
|
|
||||||
subtitle: str
|
|
||||||
desc: str
|
|
||||||
date: None = None
|
|
||||||
keywords: list[str]
|
|
||||||
|
|
||||||
|
|
||||||
class Index(TemplateView, SearchableView):
|
|
||||||
"""
|
"""
|
||||||
The index page of the gawa app.
|
The index page of the gawa app.
|
||||||
|
|
||||||
Utilizes a generic view, because I will do so for all views,
|
Utilizes a generic view, because I will do so for all views,
|
||||||
a regular view function would suffice.
|
a regular view function would suffice.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
template_name: str = "start/index.html"
|
template_name: str = "start/index.html"
|
||||||
|
|
||||||
|
|
||||||
class Professional(TemplateView, SearchableView):
|
class Professional(TemplateView):
|
||||||
"""
|
"""
|
||||||
Professional informations that might interest a professional employer
|
Professional informations that might interest a professional employer
|
||||||
"""
|
"""
|
||||||
|
@ -51,7 +38,7 @@ class Professional(TemplateView, SearchableView):
|
||||||
template_name: str = "start/legalinfo.html"
|
template_name: str = "start/legalinfo.html"
|
||||||
|
|
||||||
|
|
||||||
class Reporting(TemplateView, SearchableView):
|
class Reporting(TemplateView):
|
||||||
"""
|
"""
|
||||||
Reporting Interface and information about the allowed scope of searching for
|
Reporting Interface and information about the allowed scope of searching for
|
||||||
security issues.
|
security issues.
|
||||||
|
@ -59,39 +46,14 @@ class Reporting(TemplateView, SearchableView):
|
||||||
# TODO
|
# TODO
|
||||||
template_name: str = "start/reporting.html"
|
template_name: str = "start/reporting.html"
|
||||||
|
|
||||||
class LegalInfo(TemplateView, SearchableView):
|
|
||||||
|
class LegalInfo(TemplateView):
|
||||||
"""
|
"""
|
||||||
Legal info that the german authorities want.
|
Legal info that the german authorities want.
|
||||||
"""
|
"""
|
||||||
# TODO
|
# TODO
|
||||||
template_name: str = "start/legalinfo.html"
|
template_name: str = "start/legalinfo.html"
|
||||||
|
|
||||||
class MainSearch(ListView):
|
|
||||||
"""
|
|
||||||
Search for anything.
|
|
||||||
"""
|
|
||||||
|
|
||||||
model = Searchable
|
|
||||||
object_list = [] # this is only declaration, the view breaks without it.
|
|
||||||
template_name: str = "start/search.html"
|
|
||||||
|
|
||||||
def get_queryset(self) -> QuerySet:
|
|
||||||
search = self.request.GET.get("search")
|
|
||||||
object_list = Searchable.objects.filter(
|
|
||||||
Q(title_de__icontains=search) | Q(title_en__icontains=search) |
|
|
||||||
Q(subtitle_de__icontains=search) | Q(subtitle_en__icontains=search) |
|
|
||||||
Q(desc_de__icontains=search) | Q(desc_en__icontains=search) |
|
|
||||||
Q(public=True)
|
|
||||||
)
|
|
||||||
object_list = object_list.filter(public=True)
|
|
||||||
return object_list
|
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
|
||||||
form = MainSearchForm(request.GET)
|
|
||||||
if not form.is_valid():
|
|
||||||
return render(request, "errors/bad_request.html")
|
|
||||||
return super().get(request, *args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
class Links(ListView):
|
class Links(ListView):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue