diff --git a/Dockerfile b/Dockerfile index cdde390..56662fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ FROM python:3.7 as backend -RUN apt-get update -qq \ - && apt-get install -y --no-install-recommends default-mysql-client=1.0.5 \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* +RUN apt-get update -qq \ + && apt-get install -y postgresql-contrib libpq-dev python3-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* ENV PYTHONUNBUFFERED 1 diff --git a/chart/lw-app/Chart.yaml b/chart/lw-app/Chart.yaml index e0fbb6e..7e8df12 100644 --- a/chart/lw-app/Chart.yaml +++ b/chart/lw-app/Chart.yaml @@ -7,7 +7,6 @@ version: 0.0.1 appVersion: 0.0.1 dependencies: - - name: mariadb - chart: stable/mariadb - version: 7.5.1 + - name: postgresql + version: 9.3.2 repository: "https://charts.bitnami.com/bitnami" diff --git a/chart/lw-app/templates/django-deployment.yaml b/chart/lw-app/templates/django-deployment.yaml index a7a9b53..60b2b6c 100644 --- a/chart/lw-app/templates/django-deployment.yaml +++ b/chart/lw-app/templates/django-deployment.yaml @@ -86,9 +86,9 @@ spec: - name: DJANGO_SETTINGS_MODULE value: 'lw.core.settings.production' - name: DB_NAME - value: {{ .Values.mariadb.db.name }} + value: {{ .Release.Namespace}}-postgresql-headless - name: DB_USER - value: {{ .Values.mariadb.db.user }} + value: {{ .Values.postgresql.postgresqlUsername }} - name: DB_HOST value: {{ .Release.Name }}-mariadb - name: DB_PASSWORD diff --git a/chart/lw-app/values.yaml b/chart/lw-app/values.yaml index ce0bc55..47a8ff3 100644 --- a/chart/lw-app/values.yaml +++ b/chart/lw-app/values.yaml @@ -27,21 +27,8 @@ nginx: ingress: enabled: false -mariadb: - master: - resources: - limits: - memory: 200Mi - - replication: - enabled: false - - rootUser: - forcePassword: true - password: test - - db: - name: lw - user: lw - forcePassword: true - password: test +postgresql: + local: true + postgresqlPassword: qwerty + volumePermissions: + enabled: true diff --git a/docker-compose.yml b/docker-compose.yml index c89c513..35a6d7f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,13 +2,11 @@ version: '3.4' services: db: - image: mariadb:10.3 + image: postgres:13-alpine environment: - MYSQL_DATABASE: lw - MYSQL_ALLOW_EMPTY_PASSWORD: 1 - volumes: - - ./db:/var/lib/mysql - - ./mysql.conf.d:/etc/mysql/conf.d + - POSTGRES_HOST_AUTH_METHOD=trust + ports: + - 5432:5432 nginx: build: @@ -21,7 +19,7 @@ services: build: context: . target: backend - command: bash -c "pip install -r requirements.txt && python manage.py migrate && ./manage.py runserver 0.0.0.0:8080" + command: bash -c "pip install -r requirements.txt && python manage.py migrate && python -m pdb manage.py runserver 0.0.0.0:8080" volumes: - .:/code ports: @@ -32,7 +30,8 @@ services: DJANGO_ENV: dev DJANGO_SETTINGS_MODULE: 'lw.core.settings.dev' DB_NAME: 'lw' - DB_USER: 'root' + DB_USER: 'postgres' DB_PASSWORD: '' DB_HOST: db + DB_PORT: 5432 SECRET_KEY: secret_key diff --git a/import.py b/import.py index e446c7f..7d0086a 100644 --- a/import.py +++ b/import.py @@ -26,16 +26,16 @@ def patched_save(self, *args, **kwargs): home_page = HomePage.objects.live()[0] -index_page_type = ContentType.objects.get(app_label='translations', model='TranslationIndexPage') +index_page_type = ContentType.objects.get(app_label='translations', model='translationindexpage') index_page = TranslationIndexPage(id=253, intro='', title='Переводы', slug='w', content_type=index_page_type) home_page.add_child(instance=index_page) index_page.save_revision().publish() -json_path = '/work/books_lw_dump.json' +json_path = 'books_lw_dump.json' BookImporter(json_path).run() -json_path = '/work/translations_lw_dump.json' +json_path = 'translations_lw_dump.json' TranslationPageImporter(json_path).run() -csv_path = '/work/users.csv' -UsersImporter(csv_path).run() +# csv_path = 'users.csv' +# UsersImporter(csv_path).run() diff --git a/lw/core/settings/base.py b/lw/core/settings/base.py index de10633..34d1f0f 100644 --- a/lw/core/settings/base.py +++ b/lw/core/settings/base.py @@ -26,13 +26,15 @@ INSTALLED_APPS = [ 'lw.core', 'lw.home', - 'lw.search', 'lw.translations', 'wagtailmedia', 'wagtail.contrib.forms', 'wagtail.contrib.redirects', + 'wagtail.contrib.modeladmin', + 'wagtail.contrib.postgres_search', + 'wagtail.contrib.search_promotions', 'wagtail.embeds', 'wagtail.sites', 'wagtail.users', @@ -42,7 +44,6 @@ 'wagtail.search', 'wagtail.admin', 'wagtail.core', - 'wagtail.contrib.modeladmin', 'wagtailmenus', 'modelcluster', @@ -122,11 +123,12 @@ DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.mysql', + 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DB_NAME', 'oops'), # 'oops' is to avoid failure when we start dev_sqlite 'USER': os.environ.get('DB_USER', 'oops'), 'PASSWORD': os.environ.get('DB_PASSWORD', 'oops'), 'HOST': os.environ.get('DB_HOST', 'oops'), + 'PORT': os.environ.get('DB_PORT', 'oops') } } @@ -228,3 +230,11 @@ ACCOUNT_LOGIN_ON_PASSWORD_RESET = True ACCOUNT_LOGOUT_REDIRECT_URL = '/' ACCOUNT_EMAIL_VERIFICATION = None + +WAGTAILSEARCH_BACKENDS = { + 'default': { + 'BACKEND': 'wagtail.contrib.postgres_search.backend', + 'ATOMIC_REBUILD': True, + 'SEARCH_CONFIG': 'russian', + }, +} diff --git a/lw/core/urls.py b/lw/core/urls.py index f495e8f..f874b28 100644 --- a/lw/core/urls.py +++ b/lw/core/urls.py @@ -6,24 +6,14 @@ from wagtail.core import urls as wagtail_urls from wagtail.documents import urls as wagtaildocs_urls -from lw.search import views as search_views from . import views urlpatterns = [ path('django-admin/', admin.site.urls), - path('admin/', include(wagtailadmin_urls)), path('documents/', include(wagtaildocs_urls)), - - path('search/', search_views.search, name='search'), - - # path('user/logout/', views.logout_view), - path('', include('allauth.urls')), - - # For anything not caught by a more specific rule above, hand over to - # Wagtail's page serving mechanism. This should be the last pattern in - # the list: + path('', include('lw.translations.urls')), path('', include(wagtail_urls)), ] diff --git a/lw/home/jinja2/home/sidebar_content.html b/lw/home/jinja2/home/sidebar_content.html index 1508912..f2c4740 100644 --- a/lw/home/jinja2/home/sidebar_content.html +++ b/lw/home/jinja2/home/sidebar_content.html @@ -1,3 +1,6 @@ -Поиск
+
+ + +
ВК-виджет
Ссылки diff --git a/lw/search/__init__.py b/lw/search/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/lw/search/views.py b/lw/search/views.py deleted file mode 100644 index eeace7c..0000000 --- a/lw/search/views.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator -from django.shortcuts import render - -from wagtail.core.models import Page -from wagtail.search.models import Query - - -def search(request): - search_query = request.GET.get('query', None) - page = request.GET.get('page', 1) - - # Search - if search_query: - search_results = Page.objects.live().search(search_query) - query = Query.get(search_query) - - # Record hit - query.add_hit() - else: - search_results = Page.objects.none() - - # Pagination - paginator = Paginator(search_results, 10) - try: - search_results = paginator.page(page) - except PageNotAnInteger: - search_results = paginator.page(1) - except EmptyPage: - search_results = paginator.page(paginator.num_pages) - - return render(request, 'search/search.html', { - 'search_query': search_query, - 'search_results': search_results, - }) diff --git a/lw/search/templates/search/search.html b/lw/translations/jinja2/search.html similarity index 59% rename from lw/search/templates/search/search.html rename to lw/translations/jinja2/search.html index 5f222e5..ccbd58b 100644 --- a/lw/search/templates/search/search.html +++ b/lw/translations/jinja2/search.html @@ -1,5 +1,6 @@ {% extends "base.html" %} -{% load static wagtailcore_tags %} + +{#% load static wagtailcore_tags %#} {% block body_class %}template-searchresults{% endblock %} @@ -8,7 +9,7 @@ {% block content %}

Search

-
+
@@ -17,7 +18,7 @@

Search

- {% if search_results.has_previous %} - Previous + {% if search_results.has_previous() %} + Previous {% endif %} - {% if search_results.has_next %} - Next + {% if search_results.has_next() %} + Next {% endif %} {% elif search_query %} No results found diff --git a/lw/translations/models/book_page.py b/lw/translations/models/book_page.py index 9e869c9..96f41bc 100644 --- a/lw/translations/models/book_page.py +++ b/lw/translations/models/book_page.py @@ -4,6 +4,9 @@ from wagtail.core.fields import RichTextField from wagtail.admin.edit_handlers import FieldPanel +from wagtail.search import index +from django.utils import timezone + class BookPage(Page): body = RichTextField(blank=True, null=True) @@ -31,6 +34,12 @@ def children(self): FieldPanel('readthesequences_link'), ] + search_fields = Page.search_fields + [ + index.SearchField('title'), + index.SearchField('body'), + index.FilterField('date'), + ] + def get_url_parts(self, *args, **kwargs): (site_id, root_url, _) = super().get_url_parts(*args, **kwargs) return (site_id, root_url, '/w/' + self.slug) diff --git a/lw/translations/models/translation_page.py b/lw/translations/models/translation_page.py index da740f1..88a6218 100644 --- a/lw/translations/models/translation_page.py +++ b/lw/translations/models/translation_page.py @@ -6,6 +6,9 @@ from wagtailmedia.edit_handlers import MediaChooserPanel +from wagtail.search import index +from django.utils import timezone + class TranslationPage(Page): body = RichTextField(blank=True) author = models.CharField(max_length=100, blank=True, null=True) @@ -37,6 +40,12 @@ class TranslationPage(Page): MediaChooserPanel('audio'), ] + search_fields = Page.search_fields + [ + index.SearchField('title'), + index.SearchField('body'), + # index.FilterField('date'), + ] + def get_url_parts(self, *args, **kwargs): (site_id, root_url, _) = super().get_url_parts(*args, **kwargs) return (site_id, root_url, '/w/' + self.slug) diff --git a/lw/translations/urls.py b/lw/translations/urls.py new file mode 100644 index 0000000..4e23a1f --- /dev/null +++ b/lw/translations/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('search/node', views.search, name='search'), +] diff --git a/lw/translations/views.py b/lw/translations/views.py index 91ea44a..be725dc 100644 --- a/lw/translations/views.py +++ b/lw/translations/views.py @@ -1,3 +1,35 @@ from django.shortcuts import render +from django.http import HttpResponse +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from wagtail.core.models import Page +from wagtail.search.models import Query -# Create your views here. +def search(request): + search_query = request.GET.get('query', None) + page = request.GET.get('page', 1) + + # Search + if search_query: + search_results = Page.objects.live().search(search_query) + query = Query.get(search_query) + + # Record hit + query.add_hit() + else: + search_results = Page.objects.none() + + # Pagination + paginator = Paginator(search_results, 10) + try: + search_results = paginator.page(page) + except PageNotAnInteger: + search_results = paginator.page(1) + except EmptyPage: + search_results = paginator.page(paginator.num_pages) + + import pdb; pdb.set_trace() + + return render(request, 'search.html', { + 'search_query': search_query, + 'search_results': search_results, + }) diff --git a/services/data_migrations/importers/book/book_importer.py b/services/data_migrations/importers/book/book_importer.py index 711d639..1fd6a1a 100644 --- a/services/data_migrations/importers/book/book_importer.py +++ b/services/data_migrations/importers/book/book_importer.py @@ -69,7 +69,7 @@ def find_parent(self, created_books, index_page, parent_id): def build_book(self, book_json): - bookpage_type = ContentType.objects.get(app_label='translations', model='BookPage') + bookpage_type = ContentType.objects.get(app_label='translations', model='bookpage') slug = self.generate_slug(book_json['title']) book = BookPage( diff --git a/services/data_migrations/importers/translation_page/translation_page_importer.py b/services/data_migrations/importers/translation_page/translation_page_importer.py index 0c4a36b..45fee8e 100644 --- a/services/data_migrations/importers/translation_page/translation_page_importer.py +++ b/services/data_migrations/importers/translation_page/translation_page_importer.py @@ -75,7 +75,7 @@ def find_parent(self, books, created_translations, index_page, parent_id): def build_translation(self, translation_json): - translationpage_type = ContentType.objects.get(app_label='translations', model='TranslationPage') + translationpage_type = ContentType.objects.get(app_label='translations', model='translationpage') slug = self.generate_slug(translation_json['title']) html_body = markdown.markdown(translation_json['body_value'], extensions=['md_in_html'])