From ff231dfbc112da4b568b2beed294fa55b3382855 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Wed, 27 Sep 2023 22:23:13 +0200 Subject: [PATCH 01/27] basic markdown loading --- docker-compose.yml | 26 ++++----- docker/main/requirements.txt | 3 +- gawa/blog/data/articles/en-test.md | 86 ++++++++++++++++++++++++++++++ gawa/blog/models.py | 79 ++++++++++++++++++++++++++- requirements.txt | 10 ++++ 5 files changed, 189 insertions(+), 15 deletions(-) create mode 100644 gawa/blog/data/articles/en-test.md create mode 100644 requirements.txt diff --git a/docker-compose.yml b/docker-compose.yml index 54def0d..60d96f8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,7 @@ services: command: bash -c " python manage.py migrate && python manage.py collectstatic --noinput - && python manage.py runserver 0.0.0.0:8000 + && python manage.py runserver 0.0.0.0:80 " volumes: - ./gawa:/app @@ -44,18 +44,18 @@ services: - ./gawa/media:/srv/media - blog: - image: ghost - environment: - database__client: mysql - database__connection__host: db - database__connection__user: blog - database__connection__password: blogpass - database__connection__database: blog - url: http://localhost:8081 - NODE_ENV: development - depends_on: - - db + # blog: + # image: ghost + # environment: + # database__client: mysql + # database__connection__host: db + # database__connection__user: blog + # database__connection__password: blogpass + # database__connection__database: blog + # url: http://localhost:8081 + # NODE_ENV: development + # depends_on: + # - db db-admin: diff --git a/docker/main/requirements.txt b/docker/main/requirements.txt index 1a9a9ae..082b81c 100644 --- a/docker/main/requirements.txt +++ b/docker/main/requirements.txt @@ -6,4 +6,5 @@ django-libsass>=0.7 pillow>=9.0.0 colorlog>=6.7.0 favicon>=0.7.0 -libpt>=0.1.5 +markdown>=3.4.4 +Pygments>=2.16.1 diff --git a/gawa/blog/data/articles/en-test.md b/gawa/blog/data/articles/en-test.md new file mode 100644 index 0000000..daaacfc --- /dev/null +++ b/gawa/blog/data/articles/en-test.md @@ -0,0 +1,86 @@ +--- +Title: test +Subtitle: sub +Desc: brief desc +Date: 2023-09-27 +Keywords: main + foo + bar + qux +Category: Test +Featured: True +Public: True +--- + +# Test article +---------------------------------------- +This is a crazy testy + +### toc? +[TOC] + +## foo + +HTML + +lipsum[^1] + +
INLINE DIVbold
+ +### bar bar + +| important | table | +|-----------|-------| +| value | 2 | +| 3 | 4 | +| 5 | 2 | + +## foo + +#### big code + +```py +from django.db import models +from django.utils.translation import gettext as _ +from start.models import Searchable + +import logging +logger = logging.getLogger(__name__) + +import markdown +ARTICLE_DIR = "/app/blog/data/articles" +EXTENSIONS = [ + "extra", + "admonition", + "codehilite", + "toc" +] + +class Category(models.Model): + """ + A category of blog posts + + Name not translated because it would make i18n in urls and Searchables specifically a pain. + Maybe some day it would be cool if these were Searchable + """ + name= models.CharField(max_length=50) + slug = models.SlugField() + + class Meta: + verbose_name = _("Category") + verbose_name_plural = _("Categories") + + def __str__(self): + return f"{{<{self.__class__.__name__}>\"{self.name}\"}}" +``` + +### a +bar +#### a +qux +###### a +baau + +*[HTML]: Hyper Text Markup Language + +[^1]: foooootnote diff --git a/gawa/blog/models.py b/gawa/blog/models.py index 7e4ba13..eaae681 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -5,6 +5,17 @@ from start.models import Searchable import logging logger = logging.getLogger(__name__) +import markdown +ARTICLE_DIR = "/app/blog/data/articles" +EXTENSIONS = [ + "extra", + "admonition", + "codehilite", + "meta", + "toc" +] +MD = markdown.Markdown(extensions=EXTENSIONS) + class Category(models.Model): """ A category of blog posts @@ -31,7 +42,6 @@ class BlogPost(Searchable): category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True) thumbnail = models.ImageField(blank=True, upload_to="img/thumbnails") featured = models.BooleanField(default=False) - markdown = models.BooleanField(default=False) slug = models.SlugField() @@ -42,9 +52,76 @@ class BlogPost(Searchable): Implements the abstract method of Searchable """ logger.info(f"regenerating {self.__class__.__name__} object: {self}") + # url stuff self.suburl = f"/blog/{self.category.name}/{self.slug}" + + # load from markdown + self.regenerate_markdown() + self.save() + def regenerate_markdown(self): + """ + generate an article fromm it's original markdown file + """ + logger.info(f"regenerating article from markdown for: {self}") + try: + f_en = open(f"{ARTICLE_DIR}/en-{self.slug}.md") + + body_en: str = f_en.read() + + html_en: str = MD.convert(body_en) + try: + meta_en = MD.Meta + self.title_en = meta_en["title"][0] + self.subtitle_en = meta_en["subtitle"][0] + self.desc_en = meta_en["desc"][0] + # TODO: parse date from markdown + self.featured = meta_en["featured"][0] == "True" + self.public = meta_en["public"][0] == "True" + # TODO: parse keywords from markdown + # TODO: parse category from markdown + + # if keyword or category do not exist, create them + # I suppose + except Exception as e: + logger.warning(f"could not generate metadata {self.slug} from markdown: {e}") + + self.body_en = html_en + except FileNotFoundError as e: + # TODO: mark as untranslated + pass + except Exception as e: + logger.warning(f"could not generate article {self.slug} from markdown: {e}") + try: + f_de = open(f"{ARTICLE_DIR}/de-{self.slug}.md") + + body_de: str = f_de.read() + + html_de: str = MD.convert(body_de) + try: + meta_de = MD.Meta + self.title_de = meta_de["title"][0] + self.subtitle_de = meta_de["subtitle"][0] + self.desc_de = meta_de["desc"][0] + # TODO: parse date from markdown + self.featured = meta_de["featured"][0] == "True" + self.public = meta_de["public"][0] == "True" + # TODO: parse keywords from markdown + # TODO: parse category from markdown + + # if keyword or category do not exist, create them + # I suppose + except Exception as e: + logger.warning(f"could not generate metadata {self.slug} from markdown: {e}") + + self.body_de = html_de + except FileNotFoundError as e: + # TODO: mark as untranslated + pass + except Exception as e: + logger.warning(f"could not generate article {self.slug} from markdown: {e}") + class Meta: verbose_name = _("blog post") verbose_name_plural = _("blog posts") diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..082b81c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +Django>=3.0,<4.0 +psycopg2>=2.8 +mysqlclient>=1.4.3 +django_compressor>=2.2 +django-libsass>=0.7 +pillow>=9.0.0 +colorlog>=6.7.0 +favicon>=0.7.0 +markdown>=3.4.4 +Pygments>=2.16.1 From 56cd5943d2952a3f3c92b0702d628d7eaa2f59ad Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Wed, 27 Sep 2023 23:10:49 +0200 Subject: [PATCH 02/27] syntax highlighting in markdown --- docker/main/Dockerfile | 2 ++ gawa/blog/models.py | 10 +++++++++- gawa/start/templates/base.html | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docker/main/Dockerfile b/docker/main/Dockerfile index 62286c3..4db93cb 100644 --- a/docker/main/Dockerfile +++ b/docker/main/Dockerfile @@ -8,3 +8,5 @@ RUN apt update && apt install -y gettext && rm -rf /var/lib/apt/lists/* COPY requirements.txt /app/ RUN pip install -r requirements.txt COPY . /app/ +RUN mkdir -p /app/static +RUN pygmentize -S nord -f html -a .codehilite > /app/static/codehighlight.css diff --git a/gawa/blog/models.py b/gawa/blog/models.py index eaae681..660e918 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -14,7 +14,14 @@ EXTENSIONS = [ "meta", "toc" ] -MD = markdown.Markdown(extensions=EXTENSIONS) +EXTENSION_CONFIGS = { + 'codehilite': { + 'linenums': True, + 'pygments_style': 'monokai' + }, +} + +MD = markdown.Markdown(extensions=EXTENSIONS, extension_configs=EXTENSION_CONFIGS) class Category(models.Model): """ @@ -44,6 +51,7 @@ class BlogPost(Searchable): featured = models.BooleanField(default=False) slug = models.SlugField() + # TODO autodiscover new blog posts based on markdown files? def regenerate(self): """ diff --git a/gawa/start/templates/base.html b/gawa/start/templates/base.html index c9b980f..f5105b8 100644 --- a/gawa/start/templates/base.html +++ b/gawa/start/templates/base.html @@ -11,6 +11,8 @@ {% compress css %} + + {% endcompress %} {% block headscripts %} {% endblock headscripts %} @@ -108,6 +102,7 @@ {% compress js %} + {% endcompress %} From f8c3577a5458564b1cff419054fa9175b409c1cc Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 1 Oct 2023 16:12:30 +0200 Subject: [PATCH 10/27] move js --- gawa/start/templates/dark_light_switch.html | 23 ------------------ gawa/start/templates/nav.html | 27 +++------------------ 2 files changed, 4 insertions(+), 46 deletions(-) delete mode 100644 gawa/start/templates/dark_light_switch.html diff --git a/gawa/start/templates/dark_light_switch.html b/gawa/start/templates/dark_light_switch.html deleted file mode 100644 index 18fb77f..0000000 --- a/gawa/start/templates/dark_light_switch.html +++ /dev/null @@ -1,23 +0,0 @@ - - diff --git a/gawa/start/templates/nav.html b/gawa/start/templates/nav.html index fec8528..51ac8b4 100644 --- a/gawa/start/templates/nav.html +++ b/gawa/start/templates/nav.html @@ -51,7 +51,7 @@ {% include 'main_search_form.html' %} - From 6d9660f44c72f644022710365f558b31319393ce Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 1 Oct 2023 17:05:44 +0200 Subject: [PATCH 11/27] formatting --- gawa/gawa/settings.py | 17 +++++++------ gawa/gawa/urls.py | 2 +- gawa/start/admin.py | 12 +++++++--- gawa/start/apps.py | 1 + gawa/start/forms.py | 5 ++-- gawa/start/middleware.py | 3 ++- gawa/start/models.py | 33 ++++++++++++++++---------- gawa/start/templatetags/helper_tags.py | 1 - gawa/start/urls.py | 3 ++- gawa/start/views.py | 12 +++++++--- 10 files changed, 56 insertions(+), 33 deletions(-) diff --git a/gawa/gawa/settings.py b/gawa/gawa/settings.py index 922b879..4c65909 100644 --- a/gawa/gawa/settings.py +++ b/gawa/gawa/settings.py @@ -11,6 +11,8 @@ https://docs.djangoproject.com/en/3.2/ref/settings/ """ # for getting envvars +import logging +from django.utils.translation import gettext_lazy as _ import os # default django @@ -35,7 +37,7 @@ ALLOWED_HOSTS = ["*"] # Allow inclusion of stuff from these origins CORS_ALLOWED_ORIGINS = [ - "https://static.cscherr.de", + "https://static.cscherr.de", ] # Application definition @@ -100,7 +102,6 @@ DATABASES = { } - # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators @@ -123,7 +124,6 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ -from django.utils.translation import gettext_lazy as _ LANGUAGES = [ ("de", _("German")), @@ -155,10 +155,10 @@ STATIC_URL = '/static/' COMPRESS_ENABLED = True STATICFILES_FINDERS = [ - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'compressor.finders.CompressorFinder', - ] + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + 'compressor.finders.CompressorFinder', +] COMPRESS_PRECOMPILERS = ( ('text/x-scss', 'django_libsass.SassCompiler'), @@ -173,7 +173,6 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # Logging configs -import logging myServerFormatter = ServerFormatter myServerFormatter.default_time_format = "%Y-%M-%d %H:%M:%S" @@ -294,7 +293,7 @@ LOGGING = { # Media stuff # this is where user uploaded files will go. # TODO change this for prod -#MEDIA_ROOT = "/home/plex/Documents/code/python/gawa/media" +# MEDIA_ROOT = "/home/plex/Documents/code/python/gawa/media" MEDIA_ROOT = "/app/media" MEDIA_URL = "/media/" # FILE_UPLOAD_TEMP_DIR = "/tmp/gawa/upload" diff --git a/gawa/gawa/urls.py b/gawa/gawa/urls.py index 9647025..e748c58 100644 --- a/gawa/gawa/urls.py +++ b/gawa/gawa/urls.py @@ -21,7 +21,7 @@ from django.conf import settings from django.conf.urls.static import static urlpatterns = [ - re_path(r'^i18n/', include('django.conf.urls.i18n')), + re_path(r'^i18n/', include('django.conf.urls.i18n')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += i18n_patterns( diff --git a/gawa/start/admin.py b/gawa/start/admin.py index a050b64..5865b61 100644 --- a/gawa/start/admin.py +++ b/gawa/start/admin.py @@ -10,6 +10,7 @@ def regenerate(modeladmin, request, queryset): for obj in queryset: obj.regenerate() + @admin.register(Keyword) class KeywordAdmin(admin.ModelAdmin): """ @@ -17,21 +18,25 @@ class KeywordAdmin(admin.ModelAdmin): """ 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"] + 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"] + list_display = ["title_en", "subtitle_en", + "title_de", "subtitle_de", "suburl"] ordering = ['title_de', 'title_en'] actions = [regenerate] @@ -41,6 +46,7 @@ class LinkAdmin(admin.ModelAdmin): """ Admin Interface for Links """ - list_display = ["title_en", "title_de", "url", "suburl", "favicon", "status", "personal"] + list_display = ["title_en", "title_de", "url", + "suburl", "favicon", "status", "personal"] ordering = ['status', 'title_de', 'title_en'] actions = [regenerate] diff --git a/gawa/start/apps.py b/gawa/start/apps.py index 7ec3c85..9f48da5 100644 --- a/gawa/start/apps.py +++ b/gawa/start/apps.py @@ -1,5 +1,6 @@ from django.apps import AppConfig + class StartConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'start' diff --git a/gawa/start/forms.py b/gawa/start/forms.py index ae05552..50c218b 100644 --- a/gawa/start/forms.py +++ b/gawa/start/forms.py @@ -1,10 +1,11 @@ from django import forms from django.utils.translation import gettext as _ + class MainSearchForm(forms.Form): search = forms.CharField( - max_length=100, - label='' + max_length=100, + label='' ) search.widget = forms.TextInput( attrs={ diff --git a/gawa/start/middleware.py b/gawa/start/middleware.py index d8fa48f..a2d286c 100644 --- a/gawa/start/middleware.py +++ b/gawa/start/middleware.py @@ -15,7 +15,8 @@ class LangBasedOnUrlMiddleware(MiddlewareMixin): def process_request(request): if hasattr(request, 'session'): - active_session_lang = request.session.get(translation.LANGUAGE_SESSION_KEY) + active_session_lang = request.session.get( + translation.LANGUAGE_SESSION_KEY) if active_session_lang == request.LANGUAGE_CODE: return diff --git a/gawa/start/models.py b/gawa/start/models.py index b9c1f03..91a78f8 100644 --- a/gawa/start/models.py +++ b/gawa/start/models.py @@ -1,3 +1,6 @@ +import random +import favicon +import requests from django.db import models from django.db.models.options import override from django.utils.translation import gettext as _ @@ -8,9 +11,6 @@ from django.conf import settings import logging logger = logging.getLogger(__name__) -import requests -import favicon -import random class Keyword(models.Model): """ @@ -26,6 +26,7 @@ class Keyword(models.Model): verbose_name = _("Keyword") verbose_name_plural = _("keywords") + class Searchable(models.Model): """ Abstract class for any model that should be searchable. @@ -37,8 +38,10 @@ class Searchable(models.Model): title_en = models.CharField(max_length=50, default="title EN") 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="Beschreibung DE") - desc_en = models.TextField(blank=True, max_length=250, unique=False, default="Description EN") + desc_de = models.TextField( + blank=True, max_length=250, unique=False, default="Beschreibung DE") + desc_en = models.TextField( + blank=True, max_length=250, unique=False, default="Description EN") # may be empty/blank for some entries date = models.DateField(blank=True, null=True) keywords = models.ManyToManyField(Keyword) @@ -61,12 +64,14 @@ class Searchable(models.Model): """ regenerate a object """ - raise NotImplementedError(f"{self.__class__.__name__} does not implement regenerate") + 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, @@ -75,20 +80,21 @@ class StaticSite(Searchable): 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() + # self.save() pass class Meta: verbose_name = _("static site") verbose_name_plural = _("static sites") + class Link(Searchable): """ contains all my interesting links @@ -121,11 +127,13 @@ class Link(Searchable): icons = favicon.get(self.url, timeout=2) except (ConnectionError) as ce: # just keep whatever was stored if we cant get a new favicon - logger.warn(f"unable to download favicon for {self}: {ce.with_traceback(None)}") + logger.warn( + f"unable to download favicon for {self}: {ce.with_traceback(None)}") self.status = False except Exception as e: - logger.warn(f"Unexpected Exception while downloading {self}: {e.with_traceback(None)}") + logger.warn( + f"Unexpected Exception while downloading {self}: {e.with_traceback(None)}") self.status = False else: @@ -144,9 +152,10 @@ class Link(Searchable): except FileNotFoundError as fe: logger.error(f"cant write favicon to file for {self}: {fe}") self.favicon = None - + except Exception as e: - logger.warn(f"Unexpected Exception while downloading {self}: {e.with_traceback(None)}") + logger.warn( + f"Unexpected Exception while downloading {self}: {e.with_traceback(None)}") self.favicon = None self.save() diff --git a/gawa/start/templatetags/helper_tags.py b/gawa/start/templatetags/helper_tags.py index 877aa81..b3d66bb 100644 --- a/gawa/start/templatetags/helper_tags.py +++ b/gawa/start/templatetags/helper_tags.py @@ -36,4 +36,3 @@ def change_lang(context, lang="de", *args, **kwargs): finally: activate(lang) return "%s" % url - diff --git a/gawa/start/urls.py b/gawa/start/urls.py index cf2981d..de4b1cb 100644 --- a/gawa/start/urls.py +++ b/gawa/start/urls.py @@ -9,5 +9,6 @@ urlpatterns = [ path("legal/", views.LegalInfo.as_view(), name="legal"), path("links/", views.Links.as_view(), name="links"), path("professional/", views.LegalInfo.as_view(), name="professional"), - path('language/activate//', views.ActivateLanguage.as_view(), name='activate_language'), + path('language/activate//', + views.ActivateLanguage.as_view(), name='activate_language'), ] diff --git a/gawa/start/views.py b/gawa/start/views.py index 8aacbd8..d07cf7a 100644 --- a/gawa/start/views.py +++ b/gawa/start/views.py @@ -18,6 +18,7 @@ from abc import ABC import logging logger = logging.getLogger(__name__) + class SearchableView(View, ABC): """ This abstract view implements some traits of views that should show up @@ -40,6 +41,7 @@ class Index(TemplateView, SearchableView): template_name: str = "start/index.html" + class Professional(TemplateView, SearchableView): """ Professional informations that might interest a professional employer @@ -47,6 +49,7 @@ class Professional(TemplateView, SearchableView): # TODO template_name: str = "start/legalinfo.html" + class LegalInfo(TemplateView, SearchableView): """ Legal info that the german authorities want. @@ -54,20 +57,22 @@ class LegalInfo(TemplateView, SearchableView): # TODO template_name: str = "start/legalinfo.html" + class ActivateLanguage(View): """ Set the language to whatever """ language_code = '' - redirect_to = '' + redirect_to = '' def get(self, request, *args, **kwargs): - self.redirect_to = request.META.get('HTTP_REFERER') + self.redirect_to = request.META.get('HTTP_REFERER') self.language_code = kwargs.get('language_code') translation.activate(self.language_code) request.session[translation.LANGUAGE_SESSION_KEY] = self.language_code return redirect(self.redirect_to) + class MainSearch(ListView): """ Search for anything. @@ -94,6 +99,7 @@ class MainSearch(ListView): return render(request, "errors/bad_request.html") return super().get(request, *args, **kwargs) + class Links(ListView): """ This View contains links to various interesting sites. @@ -115,6 +121,6 @@ class Links(ListView): return object_list def get_context_data(self, *, object_list=None, **kwargs): - context = super().get_context_data(object_list=object_list, **kwargs) + context = super().get_context_data(object_list=object_list, **kwargs) context['personal_links'] = self.get_queryset_personal_links() return context From 37c3104bc5285f69cf70b40498d0be28480efaac Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 1 Oct 2023 18:06:07 +0200 Subject: [PATCH 12/27] generate category --- README.md | 21 ++++-- gawa/blog/models.py | 94 ++++++++++++++++++------- gawa/blog/templates/admin/blogpost.html | 15 ++-- 3 files changed, 90 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index db492b0..8621ad7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# gawa +# Gawa Gawa is my personal website. I've personally written it using the Django framework. @@ -7,21 +7,28 @@ Gawa is my personal website. I've personally written it using the Django framewo These are the Credentials for logging into the admin panel: | Username | Password | |----------|----------| -| root | root | +| `root` | `root` | ### Blog -| Username | Password | -|--------------------|--------------| -| contact@cscherr.de | hrCcDa0jBspG | +| Username | Password | +|--------------------------------------------------|----------------| +| [`contact@cscherr.de`](mailto:contact@cscherr.de) | `hrCcDa0jBspG` | ## License -Bootstrap: MIT Licensed -Django: BSD 3-Clause "New" or "Revised" License +Bootstrap: MIT Licensed +Django: BSD 3-Clause "New" or "Revised" License __Gawa: MIT Licensed, see LICENSE__ +## Dependencies + +| Description | Package (fedora) | +|----------------|------------------| +| Database stuff | `libpq-devel` | +| Database stuff | `mariadb` | + ## Security - [ ] Do something about the files in the blog dir diff --git a/gawa/blog/models.py b/gawa/blog/models.py index 736d3be..c5e9041 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -1,3 +1,8 @@ +import ast +import re +import os +import pathlib +import markdown from django.db import models from django.utils.translation import gettext as _ from start.models import Searchable @@ -5,7 +10,6 @@ from start.models import Searchable import logging logger = logging.getLogger(__name__) -import markdown EXTENSIONS = [ "extra", "admonition", @@ -20,11 +24,9 @@ EXTENSION_CONFIGS = { }, } -MD = markdown.Markdown(extensions=EXTENSIONS, extension_configs=EXTENSION_CONFIGS) +MD = markdown.Markdown(extensions=EXTENSIONS, + extension_configs=EXTENSION_CONFIGS) -import pathlib -import os -import re class Category(models.Model): """ @@ -33,8 +35,8 @@ class Category(models.Model): Name not translated because it would make i18n in urls and Searchables specifically a pain. Maybe some day it would be cool if these were Searchable """ - name= models.CharField(max_length=50) - slug = models.SlugField() + name = models.CharField(max_length=50) + slug = models.SlugField(unique=True) class Meta: verbose_name = _("Category") @@ -43,16 +45,19 @@ class Category(models.Model): def __str__(self): return f"{{<{self.__class__.__name__}>\"{self.name}\"}}" + class BlogPost(Searchable): """ Should contain a blogpost """ body_en = models.TextField(blank=True, default="") body_de = models.TextField(blank=True, default="") - category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True) + category = models.ForeignKey( + Category, on_delete=models.SET_NULL, null=True) thumbnail = models.ImageField(blank=True, upload_to="img/thumbnails") featured = models.BooleanField(default=False) - langs = models.CharField(default="['en': False, 'de': False]", max_length=64) + langs = models.CharField( + default="['en': False, 'de': False]", max_length=64) slug = models.SlugField() # TODO autodiscover new blog posts based on markdown files? @@ -88,21 +93,38 @@ class BlogPost(Searchable): html_en: str = MD.convert(body_en) try: + # NOTE: MD.Meta is generated after MD.convert() by the meta + # extension. + if not hasattr(MD, 'Meta'): + logger.error("Metadata extension for markdown\ + not loaded") + raise ValueError("Metadata extension for markdown\ + not loaded") meta_en = MD.Meta self.title_en = meta_en["title"][0] self.subtitle_en = meta_en["subtitle"][0] self.desc_en = meta_en["desc"][0] - # TODO: parse date from markdown + self.date = meta_en["date"][0] self.featured = meta_en["featured"][0] == "True" self.public = meta_en["public"][0] == "True" # self.thumbnail = meta_en["thumbnail"] # TODO: parse keywords from markdown # TODO: parse category from markdown + try: + category: Category = Category.objects.get( + slug=meta_en['category'][0]) + except Category.DoesNotExist: + category = Category.objects.create( + name=meta_en['category'], slug=meta_en['category']) + logger.debug(f"category of {self}: {category}") + self.category = category + # if keyword or category do not exist, create them # I suppose except Exception as e: - logger.warning(f"could not generate metadata {self.slug} from markdown: {e}") + logger.warning( + f"could not generate metadata {self.slug} from markdown: {e}") self.body_en = "" self.body_en = html_en @@ -110,7 +132,8 @@ class BlogPost(Searchable): # TODO: mark as untranslated pass except Exception as e: - logger.warning(f"could not generate article {self.slug} from markdown: {e}") + logger.warning( + f"could not generate article {self.slug} from markdown: {e}") try: MD.reset() with open(f"{self.DATA_DIR}/de-{self.slug}.md") as f_de: @@ -119,6 +142,13 @@ class BlogPost(Searchable): html_de: str = MD.convert(body_de) try: + # NOTE: MD.Meta is generated after MD.convert() by the meta + # extension. + if not hasattr(MD, 'Meta'): + logger.error("Metadata extension for markdown\ + not loaded") + raise ValueError("Metadata extension for markdown\ + not loaded") meta_de = MD.Meta self.title_de = meta_de["title"][0] self.subtitle_de = meta_de["subtitle"][0] @@ -133,7 +163,8 @@ class BlogPost(Searchable): # if keyword or category do not exist, create them # I suppose except Exception as e: - logger.warning(f"could not generate metadata {self.slug} from markdown: {e}") + logger.warning( + f"could not generate metadata {self.slug} from markdown: {e}") self.body_de = "" self.body_de = html_de @@ -141,9 +172,10 @@ class BlogPost(Searchable): # TODO: mark as untranslated pass except Exception as e: - logger.warning(f"could not generate article {self.slug} from markdown: {e}") + logger.warning( + f"could not generate article {self.slug} from markdown: {e}") - def get_langs(self) -> dict[str, bool]: + def get_langs(self) -> dict[str, bool] | None: """ get available languages """ @@ -152,7 +184,13 @@ class BlogPost(Searchable): # SECURITY: # If someone could inject the langs field, arbitrary python code might # run, Potentially ending in a critical RCE vulnerability - return eval(str(self.langs)) + try: + langs = ast.literal_eval(str(self.langs)) + return langs + except ValueError as e: + logger.error( + f"could not safely evaluate 'langs' for '{self}': {e}") + return None def set_langs(self, langs: dict[str, bool]): """ @@ -179,7 +217,8 @@ class BlogPost(Searchable): if not data_dir.is_dir(): logger.error(f"'{cls.DATA_DIR} is not a directory'") - files = [f for f in os.listdir(data_dir) if (data_dir.joinpath(f)).is_file()] + files = [f for f in os.listdir(data_dir) if ( + data_dir.joinpath(f)).is_file()] logger.debug(f"discovered files: {files}") # finding lang and title @@ -191,9 +230,15 @@ class BlogPost(Searchable): # parse file name try: matches = re.match(regex, file[0]) - current_lang = matches.group(1) - file[1][current_lang] = True - file[2] = matches.group(2) + if matches is None: + logger.warning( + f"Data file '{file[0]}' does not fit to the filename\ + regex") + files.remove(file) + else: + current_lang = matches.group(1) + file[1][current_lang] = True + file[2] = matches.group(2) except Exception as e: logger.error(e) files.remove(file) @@ -215,12 +260,14 @@ class BlogPost(Searchable): # only a single version of this file continue except Exception as e: - logger.error(f"Could not combine BlogPosts for '{file[0]}': {e}") + logger.error( + f"Could not combine BlogPosts for '{file[0]}': {e}") try: # deduplicate _files = [] - for f in [[_f[1],_f[2]] for _f in files]: # dont care about fname + for f in [[_f[1], _f[2]] + for _f in files]: # dont care about fname if f not in _files: _files.append(f) files = _files @@ -232,12 +279,11 @@ class BlogPost(Searchable): try: obj = BlogPost(langs=file[0], slug=file[1]) obj.sync_file() + obj.regenerate() obj.save() except Exception as e: logger.error(f"Could not create BlogPost for '{file[1]}': {e}") - - class Meta: verbose_name = _("blog post") verbose_name_plural = _("blog posts") diff --git a/gawa/blog/templates/admin/blogpost.html b/gawa/blog/templates/admin/blogpost.html index e1f2936..750d46d 100644 --- a/gawa/blog/templates/admin/blogpost.html +++ b/gawa/blog/templates/admin/blogpost.html @@ -1,9 +1,6 @@ -{% extends 'admin/change_list.html' %} - -{% block object-tools %} -
- {% csrf_token %} - -
- {{ block.super }} -{% endblock %} +{% extends 'admin/change_list.html' %} {% block object-tools %} +
+ {% csrf_token %} + +
+{{ block.super }} {% endblock %} From c42653df8008e95384f7c0093f6cebf56a4f2a2d Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 1 Oct 2023 18:09:38 +0200 Subject: [PATCH 13/27] format --- gawa/blog/templates/blog/featured.html | 92 ++++++++++++++++---------- 1 file changed, 56 insertions(+), 36 deletions(-) diff --git a/gawa/blog/templates/blog/featured.html b/gawa/blog/templates/blog/featured.html index 22d064a..cece5d3 100644 --- a/gawa/blog/templates/blog/featured.html +++ b/gawa/blog/templates/blog/featured.html @@ -1,40 +1,60 @@ -{% load i18n %} -{% get_current_language as LANGUAGE_CODE %} +{% load i18n %} {% get_current_language as LANGUAGE_CODE %}
-

{% trans "Featured" %}

-
- {% for post in featured_posts %} - From 6ad7f0cfbdd69e5cda4d4f82ccd41c5f09adeae5 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 1 Oct 2023 19:06:35 +0200 Subject: [PATCH 14/27] thumbnail loading --- gawa/blog/data/articles/en-bash-arrays.md | 1 - gawa/blog/data/articles/en-test.md | 1 + gawa/blog/models.py | 11 ++++++----- gawa/media/img/thumbnails/AlbumCover.png | Bin 63488 -> 0 bytes gawa/media/img/thumbnails/bash.png | Bin 0 -> 12115 bytes gawa/media/img/thumbnails/default.jpg | Bin 0 -> 21590 bytes gawa/media/img/thumbnails/wayland_logo.png | Bin 26765 -> 0 bytes 7 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 gawa/media/img/thumbnails/AlbumCover.png create mode 100644 gawa/media/img/thumbnails/bash.png create mode 100644 gawa/media/img/thumbnails/default.jpg delete mode 100644 gawa/media/img/thumbnails/wayland_logo.png diff --git a/gawa/blog/data/articles/en-bash-arrays.md b/gawa/blog/data/articles/en-bash-arrays.md index 297584d..c2556f0 100644 --- a/gawa/blog/data/articles/en-bash-arrays.md +++ b/gawa/blog/data/articles/en-bash-arrays.md @@ -3,7 +3,6 @@ Title: Bash Arrays Subtitle: sub Desc: Brief intro to Bash Arrays Date: 2023-09-29 -Thumbnail: media/thumbnails/wayland.png Keywords: bash technology Category: Test diff --git a/gawa/blog/data/articles/en-test.md b/gawa/blog/data/articles/en-test.md index c2556f0..b580c5e 100644 --- a/gawa/blog/data/articles/en-test.md +++ b/gawa/blog/data/articles/en-test.md @@ -3,6 +3,7 @@ Title: Bash Arrays Subtitle: sub Desc: Brief intro to Bash Arrays Date: 2023-09-29 +Thumbnail: img/thumbnails/bash.png Keywords: bash technology Category: Test diff --git a/gawa/blog/models.py b/gawa/blog/models.py index c5e9041..58cd154 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -54,7 +54,10 @@ class BlogPost(Searchable): body_de = models.TextField(blank=True, default="") category = models.ForeignKey( Category, on_delete=models.SET_NULL, null=True) - thumbnail = models.ImageField(blank=True, upload_to="img/thumbnails") + thumbnail = models.ImageField( + blank=True, + upload_to="img/thumbnails", + default="img/thumbnails/default.jpg") featured = models.BooleanField(default=False) langs = models.CharField( default="['en': False, 'de': False]", max_length=64) @@ -107,9 +110,9 @@ class BlogPost(Searchable): self.date = meta_en["date"][0] self.featured = meta_en["featured"][0] == "True" self.public = meta_en["public"][0] == "True" - # self.thumbnail = meta_en["thumbnail"] + if "thumbnail" in meta_en: + self.thumbnail = meta_en["thumbnail"][0] # TODO: parse keywords from markdown - # TODO: parse category from markdown try: category: Category = Category.objects.get( @@ -120,8 +123,6 @@ class BlogPost(Searchable): logger.debug(f"category of {self}: {category}") self.category = category - # if keyword or category do not exist, create them - # I suppose except Exception as e: logger.warning( f"could not generate metadata {self.slug} from markdown: {e}") diff --git a/gawa/media/img/thumbnails/AlbumCover.png b/gawa/media/img/thumbnails/AlbumCover.png deleted file mode 100644 index 51a81fa03060807e49a1a80755818e5ffce146ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63488 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 Y1_b=5DrqWK$XmSmf6xE_ZO{Mz0qIG%hyVZp diff --git a/gawa/media/img/thumbnails/bash.png b/gawa/media/img/thumbnails/bash.png new file mode 100644 index 0000000000000000000000000000000000000000..2ede2ad751bdb17c517c2f9e03c3d6862e25fbcd GIT binary patch literal 12115 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 LeMqT_ZN&coKan}M From a2fc4eb8b86e1a78d3c658efb9440e1af444ad72 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Sun, 1 Oct 2023 19:33:43 +0200 Subject: [PATCH 15/27] featured filter keywords out --- gawa/blog/models.py | 8 ++ gawa/blog/templates/blog/featured.html | 106 ++++++++++++------------- gawa/start/templatetags/helper_tags.py | 23 +++--- 3 files changed, 71 insertions(+), 66 deletions(-) diff --git a/gawa/blog/models.py b/gawa/blog/models.py index 58cd154..3dc3c88 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -68,6 +68,12 @@ class BlogPost(Searchable): DATA_DIR = "/app/blog/data/articles" DEFAULT_LANGS = {'en': False, 'de': False} + def key_words(self) -> bool: + """ + check if the post has keywords + """ + return False + def regenerate(self): """ regenerate a object @@ -123,6 +129,8 @@ class BlogPost(Searchable): logger.debug(f"category of {self}: {category}") self.category = category + self.keywords = None + except Exception as e: logger.warning( f"could not generate metadata {self.slug} from markdown: {e}") diff --git a/gawa/blog/templates/blog/featured.html b/gawa/blog/templates/blog/featured.html index cece5d3..0a23c55 100644 --- a/gawa/blog/templates/blog/featured.html +++ b/gawa/blog/templates/blog/featured.html @@ -1,60 +1,54 @@ -{% load i18n %} {% get_current_language as LANGUAGE_CODE %} +{% load i18n %} +{% get_current_language as LANGUAGE_CODE %}
-

{% trans "Featured" %}

- diff --git a/gawa/start/templatetags/helper_tags.py b/gawa/start/templatetags/helper_tags.py index b3d66bb..e467d8a 100644 --- a/gawa/start/templatetags/helper_tags.py +++ b/gawa/start/templatetags/helper_tags.py @@ -23,16 +23,19 @@ def change_lang(context, lang="de", *args, **kwargs): logger.debug(f"changing lang from '{lang}'") - path = context['request'].get_raw_uri() - url = path try: - cur_lang: str = get_language() - url = re.sub(f"/{cur_lang}/", f"/{lang}/", url) + path = context['request'].get_raw_uri() + url = path + try: + cur_lang: str = get_language() + url = re.sub(f"/{cur_lang}/", f"/{lang}/", url) + except Exception as e: + logger.error(f"exception while building language switcher form: {e}") + logger.debug(f"this is the context: {context}") + + finally: + activate(lang) + return "%s" % url except Exception as e: - logger.error(f"exception while building language switcher form: {e}") - logger.debug(f"this is the context: {context}") - - finally: - activate(lang) - return "%s" % url + logger.error(f"passing error chain: {e}") From adac98601886f4416e5aca0784ed69fe810faecd Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 00:52:54 +0200 Subject: [PATCH 16/27] add unique slug to keywords --- .../migrations/0011_auto_20231002_0051.py | 23 +++++++++++++++++++ gawa/start/migrations/0013_keyword_slug.py | 19 +++++++++++++++ gawa/start/models.py | 1 + 3 files changed, 43 insertions(+) create mode 100644 gawa/blog/migrations/0011_auto_20231002_0051.py create mode 100644 gawa/start/migrations/0013_keyword_slug.py diff --git a/gawa/blog/migrations/0011_auto_20231002_0051.py b/gawa/blog/migrations/0011_auto_20231002_0051.py new file mode 100644 index 0000000..242240d --- /dev/null +++ b/gawa/blog/migrations/0011_auto_20231002_0051.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.21 on 2023-10-01 22:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0010_auto_20230930_2331'), + ] + + operations = [ + migrations.AlterField( + model_name='blogpost', + name='thumbnail', + field=models.ImageField(blank=True, default='img/thumbnails/default.jpg', upload_to='img/thumbnails'), + ), + migrations.AlterField( + model_name='category', + name='slug', + field=models.SlugField(unique=True), + ), + ] diff --git a/gawa/start/migrations/0013_keyword_slug.py b/gawa/start/migrations/0013_keyword_slug.py new file mode 100644 index 0000000..d682ae1 --- /dev/null +++ b/gawa/start/migrations/0013_keyword_slug.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.21 on 2023-10-01 22:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('start', '0012_auto_20230930_2331'), + ] + + operations = [ + migrations.AddField( + model_name='keyword', + name='slug', + field=models.SlugField(default='foo', unique=True), + preserve_default=False, + ), + ] diff --git a/gawa/start/models.py b/gawa/start/models.py index 91a78f8..0ae4c51 100644 --- a/gawa/start/models.py +++ b/gawa/start/models.py @@ -16,6 +16,7 @@ class Keyword(models.Model): """ this is the model that should contain searchable keywords """ + slug = models.SlugField(unique=True) text_de = models.CharField(max_length=40) text_en = models.CharField(max_length=40) From b269b452fd773d1fb07486cc54d98fbdb70da008 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 00:56:26 +0200 Subject: [PATCH 17/27] keywords are created --- gawa/blog/models.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gawa/blog/models.py b/gawa/blog/models.py index 3dc3c88..cffb4ea 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -5,7 +5,7 @@ import pathlib import markdown from django.db import models from django.utils.translation import gettext as _ -from start.models import Searchable +from start.models import Keyword, Searchable import logging logger = logging.getLogger(__name__) @@ -129,7 +129,15 @@ class BlogPost(Searchable): logger.debug(f"category of {self}: {category}") self.category = category - self.keywords = None + for item in meta_en["keywords"]: + try: + keyword: Keyword = Keyword.objects.get( + slug=item) + except Keyword.DoesNotExist: + keyword = Keyword.objects.create( + slug=item, text_en=item, text_de=item) + logger.debug(f"keywords of '{self}': {self.keywords}") + except Exception as e: logger.warning( From 3be2f095c0d5781c0128df44d382e2b77db752c5 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 01:41:50 +0200 Subject: [PATCH 18/27] keywords work SOMEHOW --- gawa/blog/data/articles/de-test.md | 1 + gawa/blog/models.py | 51 +++++++++++++------ .../0014_alter_searchable_keywords.py | 18 +++++++ gawa/start/models.py | 4 +- gawa/start/templatetags/helper_tags.py | 2 - shell.sh | 2 + 6 files changed, 58 insertions(+), 20 deletions(-) create mode 100644 gawa/start/migrations/0014_alter_searchable_keywords.py create mode 100755 shell.sh diff --git a/gawa/blog/data/articles/de-test.md b/gawa/blog/data/articles/de-test.md index 19d2053..7e8dbd5 100644 --- a/gawa/blog/data/articles/de-test.md +++ b/gawa/blog/data/articles/de-test.md @@ -5,6 +5,7 @@ Desc: Brief intro to Bash Arrays Date: 2023-09-29 Keywords: bash technology + test Category: Test Featured: True Public: True diff --git a/gawa/blog/models.py b/gawa/blog/models.py index cffb4ea..dfd409a 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -68,11 +68,11 @@ class BlogPost(Searchable): DATA_DIR = "/app/blog/data/articles" DEFAULT_LANGS = {'en': False, 'de': False} - def key_words(self) -> bool: + def has_keywords(self) -> bool: """ check if the post has keywords """ - return False + return self.keywords.first() is not None def regenerate(self): """ @@ -104,6 +104,8 @@ class BlogPost(Searchable): try: # NOTE: MD.Meta is generated after MD.convert() by the meta # extension. + # Meta not being shown is a reported issue: + # https://github.com/Python-Markdown/markdown/issues/1383 if not hasattr(MD, 'Meta'): logger.error("Metadata extension for markdown\ not loaded") @@ -118,7 +120,6 @@ class BlogPost(Searchable): self.public = meta_en["public"][0] == "True" if "thumbnail" in meta_en: self.thumbnail = meta_en["thumbnail"][0] - # TODO: parse keywords from markdown try: category: Category = Category.objects.get( @@ -126,19 +127,19 @@ class BlogPost(Searchable): except Category.DoesNotExist: category = Category.objects.create( name=meta_en['category'], slug=meta_en['category']) - logger.debug(f"category of {self}: {category}") self.category = category + # NOTE: we need to save before we can use the manytomany + # logic. + self.save() for item in meta_en["keywords"]: try: - keyword: Keyword = Keyword.objects.get( - slug=item) + self.keywords.add(Keyword.objects.get(slug=item)) except Keyword.DoesNotExist: - keyword = Keyword.objects.create( + self.keywords.create( slug=item, text_en=item, text_de=item) logger.debug(f"keywords of '{self}': {self.keywords}") - except Exception as e: logger.warning( f"could not generate metadata {self.slug} from markdown: {e}") @@ -161,6 +162,8 @@ class BlogPost(Searchable): try: # NOTE: MD.Meta is generated after MD.convert() by the meta # extension. + # Meta not being shown is a reported issue: + # https://github.com/Python-Markdown/markdown/issues/1383 if not hasattr(MD, 'Meta'): logger.error("Metadata extension for markdown\ not loaded") @@ -173,12 +176,27 @@ class BlogPost(Searchable): # TODO: parse date from markdown self.featured = meta_de["featured"][0] == "True" self.public = meta_de["public"][0] == "True" - # self.thumbnail = meta_de["thumbnail"] - # TODO: parse keywords from markdown - # TODO: parse category from markdown + if "thumbnail" in meta_de: + self.thumbnail = meta_de["thumbnail"][0] - # if keyword or category do not exist, create them - # I suppose + try: + category: Category = Category.objects.get( + slug=meta_de['category'][0]) + except Category.DoesNotExist: + category = Category.objects.create( + name=meta_de['category'], slug=meta_de['category']) + self.category = category + + # NOTE: we need to save before we can use the manytomany + # logic. + self.save() + for item in meta_de["keywords"]: + try: + self.keywords.add(Keyword.objects.get(slug=item)) + except Keyword.DoesNotExist: + self.keywords.create( + slug=item, text_en=item, text_de=item) + logger.debug(f"keywords of '{self}': {self.keywords}") except Exception as e: logger.warning( f"could not generate metadata {self.slug} from markdown: {e}") @@ -191,8 +209,9 @@ class BlogPost(Searchable): except Exception as e: logger.warning( f"could not generate article {self.slug} from markdown: {e}") + self.save() - def get_langs(self) -> dict[str, bool] | None: + def get_langs(self) -> dict[str, bool]: """ get available languages """ @@ -207,7 +226,7 @@ class BlogPost(Searchable): except ValueError as e: logger.error( f"could not safely evaluate 'langs' for '{self}': {e}") - return None + raise e def set_langs(self, langs: dict[str, bool]): """ @@ -215,7 +234,7 @@ class BlogPost(Searchable): """ self.langs = langs.__repr__() - @classmethod + @ classmethod def sync_all(cls): """ Sync all Blog Posts with the filesystem. diff --git a/gawa/start/migrations/0014_alter_searchable_keywords.py b/gawa/start/migrations/0014_alter_searchable_keywords.py new file mode 100644 index 0000000..51a96ba --- /dev/null +++ b/gawa/start/migrations/0014_alter_searchable_keywords.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.21 on 2023-10-01 23:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('start', '0013_keyword_slug'), + ] + + operations = [ + migrations.AlterField( + model_name='searchable', + name='keywords', + field=models.ManyToManyField(blank=True, to='start.Keyword'), + ), + ] diff --git a/gawa/start/models.py b/gawa/start/models.py index 0ae4c51..eb21710 100644 --- a/gawa/start/models.py +++ b/gawa/start/models.py @@ -21,7 +21,7 @@ class Keyword(models.Model): text_en = models.CharField(max_length=40) def __str__(self): - return f"{{<{self.__class__.__name__}>\"{self.text_en}\"}}" + return f"{{<{self.__class__.__name__}>\"{self.slug}\"}}" class Meta: verbose_name = _("Keyword") @@ -45,7 +45,7 @@ class Searchable(models.Model): blank=True, max_length=250, unique=False, default="Description EN") # may be empty/blank for some entries date = models.DateField(blank=True, null=True) - keywords = models.ManyToManyField(Keyword) + keywords = models.ManyToManyField(Keyword, blank=True) suburl = models.CharField(max_length=200, blank=True, null=True) public = models.BooleanField(default=False) diff --git a/gawa/start/templatetags/helper_tags.py b/gawa/start/templatetags/helper_tags.py index e467d8a..ce0157b 100644 --- a/gawa/start/templatetags/helper_tags.py +++ b/gawa/start/templatetags/helper_tags.py @@ -21,8 +21,6 @@ def change_lang(context, lang="de", *args, **kwargs): """ logger = logging.getLogger(__name__) - logger.debug(f"changing lang from '{lang}'") - try: path = context['request'].get_raw_uri() url = path diff --git a/shell.sh b/shell.sh new file mode 100755 index 0000000..d7405b3 --- /dev/null +++ b/shell.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker compose exec -it main python manage.py shell From 3bf0dd42c766639b920f5074a9fb8a0746cad560 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 03:06:45 +0200 Subject: [PATCH 19/27] tonl parse pretty good --- docker/main/requirements.txt | 1 + gawa/blog/data/articles/de-test.md | 13 -- gawa/blog/data/articles/en-empty.md | 8 + gawa/blog/data/articles/en-test.md | 13 -- gawa/blog/data/articles/test.toml | 24 +++ gawa/blog/models.py | 206 ++++++++++--------------- gawa/blog/templates/blog/featured.html | 86 +++++------ 7 files changed, 159 insertions(+), 192 deletions(-) create mode 100644 gawa/blog/data/articles/en-empty.md create mode 100644 gawa/blog/data/articles/test.toml diff --git a/docker/main/requirements.txt b/docker/main/requirements.txt index 082b81c..31fb00a 100644 --- a/docker/main/requirements.txt +++ b/docker/main/requirements.txt @@ -8,3 +8,4 @@ colorlog>=6.7.0 favicon>=0.7.0 markdown>=3.4.4 Pygments>=2.16.1 +toml>=0.10 diff --git a/gawa/blog/data/articles/de-test.md b/gawa/blog/data/articles/de-test.md index 7e8dbd5..1b84e4c 100644 --- a/gawa/blog/data/articles/de-test.md +++ b/gawa/blog/data/articles/de-test.md @@ -1,16 +1,3 @@ ---- -Title: Bash Arrays -Subtitle: sub -Desc: Brief intro to Bash Arrays -Date: 2023-09-29 -Keywords: bash - technology - test -Category: Test -Featured: True -Public: True ---- - **NOTE** This is a stolen article from [opensource.com](https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays) diff --git a/gawa/blog/data/articles/en-empty.md b/gawa/blog/data/articles/en-empty.md new file mode 100644 index 0000000..b05de61 --- /dev/null +++ b/gawa/blog/data/articles/en-empty.md @@ -0,0 +1,8 @@ +--- +Title: empty +Subtitle: empty +Desc: empty +Date: 2023-09-29 +Featured: True +Public: False +--- diff --git a/gawa/blog/data/articles/en-test.md b/gawa/blog/data/articles/en-test.md index b580c5e..1fa7e64 100644 --- a/gawa/blog/data/articles/en-test.md +++ b/gawa/blog/data/articles/en-test.md @@ -1,16 +1,3 @@ ---- -Title: Bash Arrays -Subtitle: sub -Desc: Brief intro to Bash Arrays -Date: 2023-09-29 -Thumbnail: img/thumbnails/bash.png -Keywords: bash - technology -Category: Test -Featured: True -Public: True ---- - **NOTE** This is a stolen article from [opensource.com](https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays) diff --git a/gawa/blog/data/articles/test.toml b/gawa/blog/data/articles/test.toml new file mode 100644 index 0000000..7f0d45e --- /dev/null +++ b/gawa/blog/data/articles/test.toml @@ -0,0 +1,24 @@ +date = "2023-09-29" +keywords = ["test", "bash"] +category = "Test" +featured = true +public = true +thumbnail = "img/thumbnails/bash.png" + +[lang.en] +title = "title" +subtitle = "subtitle" +desc = """ +long +multiline +desc +""" + +[lang.de] +title = "Titel" +subtitle = "Subtitel" +desc = """ +Lange, +mehrzeilige, +Beschreibung +""" diff --git a/gawa/blog/models.py b/gawa/blog/models.py index dfd409a..f768365 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -1,3 +1,4 @@ +import toml import ast import re import os @@ -45,6 +46,14 @@ class Category(models.Model): def __str__(self): return f"{{<{self.__class__.__name__}>\"{self.name}\"}}" + @staticmethod + def get_or_create_uncategorized(): + try: + return Category.objects.get(slug="uncategorized") + except Category.DoesNotExist: + return Category.objects.create( + slug="uncategorized", name="uncategorized") + class BlogPost(Searchable): """ @@ -53,7 +62,8 @@ class BlogPost(Searchable): body_en = models.TextField(blank=True, default="") body_de = models.TextField(blank=True, default="") category = models.ForeignKey( - Category, on_delete=models.SET_NULL, null=True) + Category, on_delete=models.SET_DEFAULT, null=False, + default=Category.get_or_create_uncategorized) thumbnail = models.ImageField( blank=True, upload_to="img/thumbnails", @@ -67,12 +77,14 @@ class BlogPost(Searchable): DATA_DIR = "/app/blog/data/articles" DEFAULT_LANGS = {'en': False, 'de': False} - - def has_keywords(self) -> bool: - """ - check if the post has keywords - """ - return self.keywords.first() is not None + META_TOP_KEYS = [ + "date", + "keywords", + "category", + "featured", + "public", + "lang"] + META_LANG_KEYS = ["title", "subtitle", "desc"] def regenerate(self): """ @@ -85,130 +97,80 @@ class BlogPost(Searchable): self.suburl = f"/blog/{self.category.name}/{self.slug}" # load from markdown - self.sync_file() + # self.sync_file() + # redundand vvvv self.save() def sync_file(self): """ generate an article fromm it's original markdown file """ - logger.info(f"regenerating article from markdown for: {self}") + logger = logging.getLogger(__name__) + logger.info(f"syncing article to markdown for: {self}") + # read metadata try: - MD.reset() - with open(f"{self.DATA_DIR}/en-{self.slug}.md") as f_en: - - body_en: str = f_en.read() - - html_en: str = MD.convert(body_en) - try: - # NOTE: MD.Meta is generated after MD.convert() by the meta - # extension. - # Meta not being shown is a reported issue: - # https://github.com/Python-Markdown/markdown/issues/1383 - if not hasattr(MD, 'Meta'): - logger.error("Metadata extension for markdown\ - not loaded") - raise ValueError("Metadata extension for markdown\ - not loaded") - meta_en = MD.Meta - self.title_en = meta_en["title"][0] - self.subtitle_en = meta_en["subtitle"][0] - self.desc_en = meta_en["desc"][0] - self.date = meta_en["date"][0] - self.featured = meta_en["featured"][0] == "True" - self.public = meta_en["public"][0] == "True" - if "thumbnail" in meta_en: - self.thumbnail = meta_en["thumbnail"][0] - - try: - category: Category = Category.objects.get( - slug=meta_en['category'][0]) - except Category.DoesNotExist: - category = Category.objects.create( - name=meta_en['category'], slug=meta_en['category']) - self.category = category - - # NOTE: we need to save before we can use the manytomany - # logic. - self.save() - for item in meta_en["keywords"]: - try: - self.keywords.add(Keyword.objects.get(slug=item)) - except Keyword.DoesNotExist: - self.keywords.create( - slug=item, text_en=item, text_de=item) - logger.debug(f"keywords of '{self}': {self.keywords}") - - except Exception as e: - logger.warning( - f"could not generate metadata {self.slug} from markdown: {e}") - - self.body_en = "" - self.body_en = html_en - except FileNotFoundError as e: - # TODO: mark as untranslated - pass + fmeta = open(f"{self.DATA_DIR}/{self.slug}.toml", "r") except Exception as e: - logger.warning( - f"could not generate article {self.slug} from markdown: {e}") - try: - MD.reset() - with open(f"{self.DATA_DIR}/de-{self.slug}.md") as f_de: - - body_de: str = f_de.read() - - html_de: str = MD.convert(body_de) - try: - # NOTE: MD.Meta is generated after MD.convert() by the meta - # extension. - # Meta not being shown is a reported issue: - # https://github.com/Python-Markdown/markdown/issues/1383 - if not hasattr(MD, 'Meta'): - logger.error("Metadata extension for markdown\ - not loaded") - raise ValueError("Metadata extension for markdown\ - not loaded") - meta_de = MD.Meta - self.title_de = meta_de["title"][0] - self.subtitle_de = meta_de["subtitle"][0] - self.desc_de = meta_de["desc"][0] - # TODO: parse date from markdown - self.featured = meta_de["featured"][0] == "True" - self.public = meta_de["public"][0] == "True" - if "thumbnail" in meta_de: - self.thumbnail = meta_de["thumbnail"][0] - - try: - category: Category = Category.objects.get( - slug=meta_de['category'][0]) - except Category.DoesNotExist: - category = Category.objects.create( - name=meta_de['category'], slug=meta_de['category']) - self.category = category - - # NOTE: we need to save before we can use the manytomany - # logic. - self.save() - for item in meta_de["keywords"]: - try: - self.keywords.add(Keyword.objects.get(slug=item)) - except Keyword.DoesNotExist: - self.keywords.create( - slug=item, text_en=item, text_de=item) - logger.debug(f"keywords of '{self}': {self.keywords}") - except Exception as e: - logger.warning( - f"could not generate metadata {self.slug} from markdown: {e}") - - self.body_de = "" - self.body_de = html_de - except FileNotFoundError as e: - # TODO: mark as untranslated - pass - except Exception as e: - logger.warning( - f"could not generate article {self.slug} from markdown: {e}") + logger.error(f"could not find meta file for '{self}'") + return + data = toml.load(fmeta) + for key in self.META_TOP_KEYS: + if key not in data: + logger.error(f"Key '{key}' missing in meta file for '{self}'") + raise ValueError( + f"Key '{key}' missing in meta file for '{self}'") + for lang in data['lang']: + for key in self.META_LANG_KEYS: + if key not in data['lang'][lang]: + logger.error( + f"Key '{key}' ('{lang}') missing in meta file for '{self}'") + raise ValueError( + f"Key '{key}' ('{lang}') missing in meta file for '{self}'") + with open(f"{self.DATA_DIR}/{lang}-{self.slug}.md") as f_en: + MD.reset() + body: str = f_en.read() + # FIXME: + # these fields are loaded but wrong? + # de is in en, de is empty + match lang: + case "en": + self.title_en = data['lang'][lang]["title"] + self.subtitle_en = data['lang'][lang]["subtitle"] + self.desc_en = data['lang'][lang]["desc"] + self.body_en = MD.convert(body) + case "de": + self.title_en = data['lang'][lang]["title"] + self.subtitle_en = data['lang'][lang]["subtitle"] + self.desc_en = data['lang'][lang]["desc"] + self.body_de = MD.convert(body) + case _: + logger.error( + f"unknown language '{lang}' in meta file for '{self}'") + self.date = data["date"] + self.featured = data["featured"] + self.public = data["public"] + # NOTE: thumbnail is optional + if "thumbnail" in data: + self.thumbnail = data["thumbnail"] + # NOTE: thumbnail is optional + if "category" in data: + try: + category: Category = Category.objects.get( + slug=data['category']) + except Category.DoesNotExist: + category = Category.objects.create( + name=data['category'], slug=data['category']) + self.category = category + self.save() + logger.debug("keywords next") + for keyword in data["keywords"]: + try: + self.keywords.add(Keyword.objects.get(slug=keyword)) + except Keyword.DoesNotExist: + self.keywords.create( + slug=keyword, text_en=keyword, text_de=keyword) + logger.debug(f"keywords of '{self}': {self.keywords}") self.save() def get_langs(self) -> dict[str, bool]: diff --git a/gawa/blog/templates/blog/featured.html b/gawa/blog/templates/blog/featured.html index 0a23c55..28cfd8b 100644 --- a/gawa/blog/templates/blog/featured.html +++ b/gawa/blog/templates/blog/featured.html @@ -7,48 +7,46 @@ - {% endfor %} -
+ thumbnail +
+ {% if LANGUAGE_CODE == "de" %} +
+ {{ post.title_de }}{{ post.subtitle }} +
+

{{ post.desc_de }}

+ {% elif LANGUAGE_CODE == "en" %} +
+ {{ post.title_en }}{{ post.subtitle }} +
+

{{ post.desc_en }}

+ {% else %} +
+ {{ post.title_en }}{{ post.subtitle }} +
+

{{ post.desc_en }}

+ {% endif %} +
+
+
    +
  • + {% translate "category" %}: {{ post.category.name }} +
  • + {% for keyword in post.keywords.all %} + {% if LANGUAGE_CODE == "de" %} +
  • {{ keyword.text_de }}
  • + {% elif LANGUAGE_CODE == "en" %} +
  • {{ keyword.text_en }}
  • + {% else %} +
  • {{ keyword.text_en }}
  • + {% endif %} + {% endfor %} +
+
+ +
+ {% endfor %} +
From a9a90e9bd45bc73f5f5d2598a455ed9426e325b1 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 09:49:04 +0200 Subject: [PATCH 20/27] toml metafile works --- gawa/blog/admin.py | 2 +- gawa/blog/data/articles/bash-arrays.toml | 22 +++++ .../{de-test.md => de-bash-arrays.md} | 0 gawa/blog/data/articles/en-bash-arrays.md | 12 --- gawa/blog/data/articles/en-empty.md | 8 -- gawa/blog/data/articles/en-test.md | 90 ------------------- gawa/blog/data/articles/test.toml | 24 ----- gawa/blog/models.py | 32 +++---- 8 files changed, 39 insertions(+), 151 deletions(-) create mode 100644 gawa/blog/data/articles/bash-arrays.toml rename gawa/blog/data/articles/{de-test.md => de-bash-arrays.md} (100%) delete mode 100644 gawa/blog/data/articles/en-empty.md delete mode 100644 gawa/blog/data/articles/en-test.md delete mode 100644 gawa/blog/data/articles/test.toml diff --git a/gawa/blog/admin.py b/gawa/blog/admin.py index 845847a..fd8f9f2 100644 --- a/gawa/blog/admin.py +++ b/gawa/blog/admin.py @@ -38,5 +38,5 @@ class BlogPostAdmin(admin.ModelAdmin): return my_urls + urls def sync_with_fs(self, request): - BlogPost.sync_all() + BlogPost.sync_with_fs() return HttpResponseRedirect("../") diff --git a/gawa/blog/data/articles/bash-arrays.toml b/gawa/blog/data/articles/bash-arrays.toml new file mode 100644 index 0000000..d608c30 --- /dev/null +++ b/gawa/blog/data/articles/bash-arrays.toml @@ -0,0 +1,22 @@ +date = "2023-09-29" +keywords = ["bash"] +category = "Guide" +featured = true +public = true +thumbnail = "img/thumbnails/bash.png" + +[lang.en] +title = "bash arrays" +subtitle = "how to work with bash arrays" +desc = """ +bash scripting can be kind of weird. +This guide explains how they work without any fuzz. +""" + +[lang.de] +title = "Bash Arrays" +subtitle = "Wie man mit Bash Arrays arbeitet" +desc = """ +Bash Skripte sind manchmal etwas seltsam. +Hier wird erklärt, wie man mit Bash Arrays arbeitet. +""" diff --git a/gawa/blog/data/articles/de-test.md b/gawa/blog/data/articles/de-bash-arrays.md similarity index 100% rename from gawa/blog/data/articles/de-test.md rename to gawa/blog/data/articles/de-bash-arrays.md diff --git a/gawa/blog/data/articles/en-bash-arrays.md b/gawa/blog/data/articles/en-bash-arrays.md index c2556f0..1fa7e64 100644 --- a/gawa/blog/data/articles/en-bash-arrays.md +++ b/gawa/blog/data/articles/en-bash-arrays.md @@ -1,15 +1,3 @@ ---- -Title: Bash Arrays -Subtitle: sub -Desc: Brief intro to Bash Arrays -Date: 2023-09-29 -Keywords: bash - technology -Category: Test -Featured: True -Public: True ---- - **NOTE** This is a stolen article from [opensource.com](https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays) diff --git a/gawa/blog/data/articles/en-empty.md b/gawa/blog/data/articles/en-empty.md deleted file mode 100644 index b05de61..0000000 --- a/gawa/blog/data/articles/en-empty.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -Title: empty -Subtitle: empty -Desc: empty -Date: 2023-09-29 -Featured: True -Public: False ---- diff --git a/gawa/blog/data/articles/en-test.md b/gawa/blog/data/articles/en-test.md deleted file mode 100644 index 1fa7e64..0000000 --- a/gawa/blog/data/articles/en-test.md +++ /dev/null @@ -1,90 +0,0 @@ -**NOTE** - -This is a stolen article from [opensource.com](https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays) -about bash scripting. It's a good article and I've decided to use it to test my -markdown rendering. - -# Bash scripting - -[TOC] - - -## Wait, but why? - -Writing about Bash is challenging because it's remarkably easy for an article -to devolve into a manual that focuses on syntax oddities. Rest assured, -however, the intent of this article is to avoid having you RTFM. - -## A real (actually useful) example - -To that end, let's consider a real-world scenario and how Bash can help: -You are leading a new effort at your company to evaluate and optimize the -runtime of your internal data pipeline. As a first step, you want to do a -parameter sweep to evaluate how well the pipeline makes use of threads. For -the sake of simplicity, we'll treat the pipeline as a compiled C++ black box -where the only parameter we can tweak is the number of threads reserved for -data processing: `./pipeline --threads 4.` - -## The basics - -The first thing we'll do is define an array containing the values of the -`--threads` parameter that we want to test: - -```bash -allThreads=(1 2 4 8 16 32 64 128) -``` - -In this example, all the elements are numbers, but it need not be the -case—arrays in Bash can contain both numbers and strings, e.g., `myArray=(1 -2 "three" 4 "five")` is a valid expression. And just as with any other Bash -variable, make sure to leave no spaces around the equal sign. Otherwise, -Bash will treat the variable name as a program to execute, and the `=` as its -first parameter! - -Now that we've initialized the array, let's retrieve a few of its -elements. You'll notice that simply doing `echo $allThreads` will output only -the first element. - -To understand why that is, let's take a step back and revisit how we usually -output variables in Bash. Consider the following scenario: - -```bash -type="article" echo "Found 42 $type" -``` - -Say the variable $type is given to us as a singular noun and we want to add -an `s` at the end of our sentence. We can't simply add an s to `$type` since -that would turn it into a different variable, `$types`. And although we could -utilize code contortions such as `echo "Found 42 "$type"s"`, the best way -to solve this problem is to use curly braces: `echo "Found 42 ${type}s"`, -which allows us to tell Bash where the name of a variable starts and ends -(interestingly, this is the same syntax used in JavaScript/ES6 to inject -variables and expressions in template literals). - -So as it turns out, although Bash variables don't generally require curly -brackets, they are required for arrays. In turn, this allows us to specify -the index to access, e.g., `echo ${allThreads[1]}` returns the second element -of the array. Not including brackets, e.g.,`echo $allThreads[1]`, leads Bash -to treat `[1]` as a string and output it as such. - -Yes, Bash arrays have odd syntax, but at least they are zero-indexed, unlike -some other languages (I'm looking at you, R).[^1] - -## Looping through arrays - -Although in the examples above we used integer indices in our arrays, let's -consider two occasions when that won't be the case: First, if we wanted the -$i-th element of the array, where $i is a variable containing the index of -interest, we can retrieve that element using: echo ${allThreads[$i]}. Second, -to output all the elements of an array, we replace the numeric index with -the @ symbol (you can think of @ as standing for all): - -```bash -type="article" -echo "Found 42 $type" -``` - -*[RTFM]: Read the Fucking Manual -*[HTML]: Hyper Text Markup Language - -[^1]: Example Footnote diff --git a/gawa/blog/data/articles/test.toml b/gawa/blog/data/articles/test.toml deleted file mode 100644 index 7f0d45e..0000000 --- a/gawa/blog/data/articles/test.toml +++ /dev/null @@ -1,24 +0,0 @@ -date = "2023-09-29" -keywords = ["test", "bash"] -category = "Test" -featured = true -public = true -thumbnail = "img/thumbnails/bash.png" - -[lang.en] -title = "title" -subtitle = "subtitle" -desc = """ -long -multiline -desc -""" - -[lang.de] -title = "Titel" -subtitle = "Subtitel" -desc = """ -Lange, -mehrzeilige, -Beschreibung -""" diff --git a/gawa/blog/models.py b/gawa/blog/models.py index f768365..415b3ff 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -130,9 +130,6 @@ class BlogPost(Searchable): with open(f"{self.DATA_DIR}/{lang}-{self.slug}.md") as f_en: MD.reset() body: str = f_en.read() - # FIXME: - # these fields are loaded but wrong? - # de is in en, de is empty match lang: case "en": self.title_en = data['lang'][lang]["title"] @@ -140,9 +137,9 @@ class BlogPost(Searchable): self.desc_en = data['lang'][lang]["desc"] self.body_en = MD.convert(body) case "de": - self.title_en = data['lang'][lang]["title"] - self.subtitle_en = data['lang'][lang]["subtitle"] - self.desc_en = data['lang'][lang]["desc"] + self.title_de = data['lang'][lang]["title"] + self.subtitle_de = data['lang'][lang]["subtitle"] + self.desc_de = data['lang'][lang]["desc"] self.body_de = MD.convert(body) case _: logger.error( @@ -153,7 +150,7 @@ class BlogPost(Searchable): # NOTE: thumbnail is optional if "thumbnail" in data: self.thumbnail = data["thumbnail"] - # NOTE: thumbnail is optional + # NOTE: category is optional if "category" in data: try: category: Category = Category.objects.get( @@ -163,26 +160,27 @@ class BlogPost(Searchable): name=data['category'], slug=data['category']) self.category = category self.save() - logger.debug("keywords next") for keyword in data["keywords"]: try: self.keywords.add(Keyword.objects.get(slug=keyword)) except Keyword.DoesNotExist: self.keywords.create( slug=keyword, text_en=keyword, text_de=keyword) - logger.debug(f"keywords of '{self}': {self.keywords}") self.save() def get_langs(self) -> dict[str, bool]: """ get available languages """ - # TODO: - # make sure this is safe # SECURITY: - # If someone could inject the langs field, arbitrary python code might - # run, Potentially ending in a critical RCE vulnerability + # If someone could inject the langs field, literal_eval will evaluate to + # any literal Python value. This should not be a concern. + # If we would use a regular eval here, an attacker who controls one of + # the `langs` of a BlogPost could run arbitrary Python code. try: + # literal_eval is safe because it only parses literals, not any kind + # of python expression. If the given str is not a valid literal, + # ValueError will be raised langs = ast.literal_eval(str(self.langs)) return langs except ValueError as e: @@ -197,13 +195,13 @@ class BlogPost(Searchable): self.langs = langs.__repr__() @ classmethod - def sync_all(cls): + def sync_with_fs(cls): """ Sync all Blog Posts with the filesystem. Caution: Will delete all Blog Posts """ - # logger.name = logger.name + ".sync_all" + # logger.name = logger.name + ".sync_with_fs" # delete all existing objects BlogPost.objects.all().delete() @@ -221,6 +219,7 @@ class BlogPost(Searchable): # finding lang and title regex = r"^(en|de)-(.*)\.md" + # TODO: only find toml files # filepath, language codes, slug files = [[f, cls.DEFAULT_LANGS, ""] for f in files] @@ -242,7 +241,7 @@ class BlogPost(Searchable): files.remove(file) # PERF: - # Could possibly be done in one loop + # Optimize for single loop, should be doable and better design # collapse diffrent versions for file in files: @@ -261,6 +260,7 @@ class BlogPost(Searchable): logger.error( f"Could not combine BlogPosts for '{file[0]}': {e}") + # TODO: not needed when relying on toml files try: # deduplicate _files = [] From 05497e10e1e38a1aeb60ae94c9b5bd3304d484e1 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 10:23:03 +0200 Subject: [PATCH 21/27] add time to date and add update field --- docker-compose.yml | 26 +- docker/db/scripts/blog.sql | 3493 ----------------- docker/db/scripts/gawa.sql | 860 ---- gawa/blog/data/articles/bash-arrays.toml | 11 +- gawa/blog/migrations/0001_initial.py | 39 +- .../blog/migrations/0002_blogpost_category.py | 35 - gawa/blog/migrations/0003_blogpost_public.py | 18 - gawa/blog/migrations/0004_blogpost_slug.py | 19 - .../migrations/0005_auto_20230604_0050.py | 23 - .../blog/migrations/0006_blogpost_markdown.py | 18 - .../migrations/0007_remove_blogpost_public.py | 17 - .../migrations/0008_auto_20230604_0156.py | 21 - .../migrations/0009_auto_20230616_2236.py | 27 - .../migrations/0010_auto_20230930_2331.py | 32 - .../migrations/0011_auto_20231002_0051.py | 23 - gawa/blog/models.py | 45 +- gawa/start/migrations/0001_initial.py | 67 +- .../0002_keyword_searchable_staticsite.py | 46 - .../migrations/0003_searchable_public.py | 18 - .../migrations/0004_auto_20230604_2312.py | 35 - gawa/start/migrations/0005_link.py | 26 - .../0006_alter_searchable_title_en.py | 18 - gawa/start/migrations/0007_link_favicon.py | 18 - gawa/start/migrations/0008_link_status.py | 18 - .../migrations/0009_alter_link_favicon.py | 18 - gawa/start/migrations/0010_link_personal.py | 18 - .../migrations/0011_auto_20230715_1441.py | 23 - .../migrations/0012_auto_20230930_2331.py | 28 - gawa/start/migrations/0013_keyword_slug.py | 19 - .../0014_alter_searchable_keywords.py | 18 - gawa/start/models.py | 12 +- 31 files changed, 143 insertions(+), 4946 deletions(-) delete mode 100644 docker/db/scripts/blog.sql delete mode 100644 gawa/blog/migrations/0002_blogpost_category.py delete mode 100644 gawa/blog/migrations/0003_blogpost_public.py delete mode 100644 gawa/blog/migrations/0004_blogpost_slug.py delete mode 100644 gawa/blog/migrations/0005_auto_20230604_0050.py delete mode 100644 gawa/blog/migrations/0006_blogpost_markdown.py delete mode 100644 gawa/blog/migrations/0007_remove_blogpost_public.py delete mode 100644 gawa/blog/migrations/0008_auto_20230604_0156.py delete mode 100644 gawa/blog/migrations/0009_auto_20230616_2236.py delete mode 100644 gawa/blog/migrations/0010_auto_20230930_2331.py delete mode 100644 gawa/blog/migrations/0011_auto_20231002_0051.py delete mode 100644 gawa/start/migrations/0002_keyword_searchable_staticsite.py delete mode 100644 gawa/start/migrations/0003_searchable_public.py delete mode 100644 gawa/start/migrations/0004_auto_20230604_2312.py delete mode 100644 gawa/start/migrations/0005_link.py delete mode 100644 gawa/start/migrations/0006_alter_searchable_title_en.py delete mode 100644 gawa/start/migrations/0007_link_favicon.py delete mode 100644 gawa/start/migrations/0008_link_status.py delete mode 100644 gawa/start/migrations/0009_alter_link_favicon.py delete mode 100644 gawa/start/migrations/0010_link_personal.py delete mode 100644 gawa/start/migrations/0011_auto_20230715_1441.py delete mode 100644 gawa/start/migrations/0012_auto_20230930_2331.py delete mode 100644 gawa/start/migrations/0013_keyword_slug.py delete mode 100644 gawa/start/migrations/0014_alter_searchable_keywords.py diff --git a/docker-compose.yml b/docker-compose.yml index 60d96f8..780ee2c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,14 +9,17 @@ services: # MYSQL_PASSWORD: changethisforprod MYSQL_ROOT_PASSWORD: root volumes: - - db_data:/var/lib/mysql + # - db_data:/var/lib/mysql - ./docker/db/scripts:/docker-entrypoint-initdb.d/ main: build: ./docker/main - command: bash -c " - python manage.py migrate + command: bash -c "echo 'setting django up' && python manage.py collectstatic --noinput + && sleep 3 + && python manage.py migrate + && DJANGO_SUPERUSER_PASSWORD='root' python manage.py createsuperuser\ + --username root --noinput --email software@cscherr.de && python manage.py runserver 0.0.0.0:80 " volumes: @@ -43,21 +46,6 @@ services: - ./gawa/static:/srv/static - ./gawa/media:/srv/media - - # blog: - # image: ghost - # environment: - # database__client: mysql - # database__connection__host: db - # database__connection__user: blog - # database__connection__password: blogpass - # database__connection__database: blog - # url: http://localhost:8081 - # NODE_ENV: development - # depends_on: - # - db - - db-admin: image: phpmyadmin ports: @@ -71,4 +59,4 @@ services: volumes: caddy_data: caddy_config: - db_data: + # db_data: diff --git a/docker/db/scripts/blog.sql b/docker/db/scripts/blog.sql deleted file mode 100644 index d477d6c..0000000 --- a/docker/db/scripts/blog.sql +++ /dev/null @@ -1,3493 +0,0 @@ --- phpMyAdmin SQL Dump --- version 5.2.1 --- https://www.phpmyadmin.net/ --- --- Host: db --- Erstellungszeit: 26. Sep 2023 um 20:24 --- Server-Version: 10.11.3-MariaDB-1:10.11.3+maria~ubu2204 --- PHP-Version: 8.1.19 - -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -START TRANSACTION; -SET time_zone = "+00:00"; - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; - --- --- Datenbank: `blog` --- -CREATE DATABASE IF NOT EXISTS `blog` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -USE `blog`; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `actions` --- - -CREATE TABLE `actions` ( - `id` varchar(24) NOT NULL, - `resource_id` varchar(24) DEFAULT NULL, - `resource_type` varchar(50) NOT NULL, - `actor_id` varchar(24) NOT NULL, - `actor_type` varchar(50) NOT NULL, - `event` varchar(50) NOT NULL, - `context` text DEFAULT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `actions` --- - -INSERT INTO `actions` (`id`, `resource_id`, `resource_type`, `actor_id`, `actor_type`, `event`, `context`, `created_at`) VALUES -('6511f8abcd1c0b0001715739', '1', 'user', '1', 'user', 'edited', '{\"primary_name\":\"Christoph J. Scherr\"}', '2023-09-25 21:16:27'), -('6511f9c2cd1c0b000171573a', '6511f58c6740bf0001d14224', 'setting', '1', 'user', 'edited', '{\"key\":\"cover_image\",\"group\":\"site\"}', '2023-09-25 21:21:06'), -('6511f9c2cd1c0b000171573b', '6511f58c6740bf0001d14226', 'setting', '1', 'user', 'edited', '{\"key\":\"accent_color\",\"group\":\"site\"}', '2023-09-25 21:21:06'), -('6511f9c2cd1c0b000171573c', '6511f58c6740bf0001d14225', 'setting', '1', 'user', 'edited', '{\"key\":\"icon\",\"group\":\"site\"}', '2023-09-25 21:21:06'), -('6511fa23cd1c0b000171573d', '6511f58c6740bf0001d14224', 'setting', '1', 'user', 'edited', '{\"key\":\"cover_image\",\"group\":\"site\"}', '2023-09-25 21:22:43'), -('6511fa96cd1c0b000171573e', '6511f58c6740bf0001d14224', 'setting', '1', 'user', 'edited', '{\"key\":\"cover_image\",\"group\":\"site\"}', '2023-09-25 21:24:38'), -('6511fac1cd1c0b0001715743', '6511f58c6740bf0001d14237', 'setting', '1', 'user', 'edited', '{\"key\":\"active_theme\",\"group\":\"theme\"}', '2023-09-25 21:25:21'), -('6511fadfcd1c0b0001715744', '6511f58c6740bf0001d14237', 'setting', '1', 'user', 'edited', '{\"key\":\"active_theme\",\"group\":\"theme\"}', '2023-09-25 21:25:51'), -('6511fb20cd1c0b0001715745', '6511f58c6740bf0001d1425a', 'setting', '1', 'user', 'edited', '{\"key\":\"email_track_opens\",\"group\":\"email\"}', '2023-09-25 21:26:56'), -('6511fb20cd1c0b0001715746', '6511f845cd1c0b00017156d6', 'setting', '1', 'user', 'edited', '{\"key\":\"email_track_clicks\",\"group\":\"email\"}', '2023-09-25 21:26:56'), -('6511fb20cd1c0b0001715747', '6511f845cd1c0b00017156e3', 'setting', '1', 'user', 'edited', '{\"key\":\"outbound_link_tagging\",\"group\":\"analytics\"}', '2023-09-25 21:26:56'), -('6511fbd2cd1c0b0001715748', '6511f58c6740bf0001d14222', 'setting', '1', 'user', 'edited', '{\"key\":\"description\",\"group\":\"site\"}', '2023-09-25 21:29:54'), -('6511fc02cd1c0b000171574c', '6511fc02cd1c0b0001715749', 'post', '1', 'user', 'added', '{\"type\":\"page\",\"primary_name\":\"What can i do with pages?\"}', '2023-09-25 21:30:42'), -('6511fc0acd1c0b0001715750', '6511fc02cd1c0b0001715749', 'post', '1', 'user', 'edited', '{\"type\":\"page\",\"primary_name\":\"What can i do with pages?\"}', '2023-09-25 21:30:50'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `api_keys` --- - -CREATE TABLE `api_keys` ( - `id` varchar(24) NOT NULL, - `type` varchar(50) NOT NULL, - `secret` varchar(191) NOT NULL, - `role_id` varchar(24) DEFAULT NULL, - `integration_id` varchar(24) DEFAULT NULL, - `user_id` varchar(24) DEFAULT NULL, - `last_seen_at` datetime DEFAULT NULL, - `last_seen_version` varchar(50) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `api_keys` --- - -INSERT INTO `api_keys` (`id`, `type`, `secret`, `role_id`, `integration_id`, `user_id`, `last_seen_at`, `last_seen_version`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES -('6511f58b6740bf0001d14112', 'admin', '7b19112b007bf41a2dfdb1017d994dac4b51595ba32ca49fff96522749cf4227', '6511f58a6740bf0001d140aa', '6511f58b6740bf0001d14111', NULL, NULL, NULL, '2023-09-25 21:03:07', '1', '2023-09-25 21:03:07', '1'), -('6511f58b6740bf0001d14114', 'admin', '05923cb84fee10110889e5e7bc11331ea259997b3b7c70df330e5d2e9057c0e9', '6511f58a6740bf0001d140ab', '6511f58b6740bf0001d14113', NULL, NULL, NULL, '2023-09-25 21:03:07', '1', '2023-09-25 21:03:07', '1'), -('6511f58b6740bf0001d14116', 'admin', 'b78d67b68466b6ca5330c83d2dc009789c74830f07404d84728d1bd8e353a18c', '6511f58a6740bf0001d140ac', '6511f58b6740bf0001d14115', NULL, NULL, NULL, '2023-09-25 21:03:07', '1', '2023-09-25 21:03:07', '1'), -('6511f844cd1c0b00017156ac', 'content', '5ba6f2aeec53f40aca3fc5165e', NULL, '6511f844cd1c0b00017156ab', NULL, NULL, NULL, '2023-09-25 21:14:44', '1', NULL, NULL), -('6511f844cd1c0b00017156d2', 'admin', '408ece29cd864b32aa51af5b5a1fb2ea92c32e23d81908592a98fc91b8e4c542', '6511f844cd1c0b00017156cc', '6511f844cd1c0b00017156d1', NULL, NULL, NULL, '2023-09-25 21:14:44', '1', NULL, NULL), -('6511f846cd1c0b00017156ed', 'admin', 'e07e4541beceb6117a37e9cd08e9e895238cd45795ff5ba75283a98456cfd287', '6511f846cd1c0b00017156e8', '6511f846cd1c0b00017156ec', NULL, NULL, NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b000171572b', 'content', '5a196731dd3fbe894c02b3e07f', NULL, '6511f846cd1c0b000171572a', NULL, NULL, NULL, '2023-09-25 21:14:46', '1', NULL, NULL); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `benefits` --- - -CREATE TABLE `benefits` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) NOT NULL, - `slug` varchar(191) NOT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `brute` --- - -CREATE TABLE `brute` ( - `key` varchar(191) NOT NULL, - `firstRequest` bigint(20) NOT NULL, - `lastRequest` bigint(20) NOT NULL, - `lifetime` bigint(20) NOT NULL, - `count` int(11) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `brute` --- - -INSERT INTO `brute` (`key`, `firstRequest`, `lastRequest`, `lifetime`, `count`) VALUES -('2OvUhoXOksZy59gWuAWEv7k11vJcDQC8nkoh0mNOF+E=', 1695676276581, 1695676276581, 1695679876582, 1), -('9RJxfmXk47QyRIKSE0TUqs7ttaowUNM8NLymXi6Wf8s=', 1695676554872, 1695676554872, 1695719754873, 1), -('c7I0cGPKpSZn9B0Mzhzh5fsJSz22ckSH0YCmfrksJ0A=', 1695676554878, 1695676554878, 1708377354878, 1), -('ojbgWQs6vMwYbF78jfWcIJAw729N0uLM85Zr4Vx7HwY=', 1695676088298, 1695676088298, 1708376888300, 1); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `collections` --- - -CREATE TABLE `collections` ( - `id` varchar(24) NOT NULL, - `title` varchar(191) NOT NULL, - `slug` varchar(191) NOT NULL, - `description` varchar(2000) DEFAULT NULL, - `type` varchar(50) NOT NULL, - `filter` text DEFAULT NULL, - `feature_image` varchar(2000) DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `collections` --- - -INSERT INTO `collections` (`id`, `title`, `slug`, `description`, `type`, `filter`, `feature_image`, `created_at`, `updated_at`) VALUES -('6511f846cd1c0b000171570f', 'Latest', 'latest', 'All posts', 'automatic', '', NULL, '2023-09-25 21:14:46', NULL), -('6511f846cd1c0b0001715710', 'Featured', 'featured', 'Featured posts', 'automatic', 'featured:true', NULL, '2023-09-25 21:14:46', NULL); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `collections_posts` --- - -CREATE TABLE `collections_posts` ( - `id` varchar(24) NOT NULL, - `collection_id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `comments` --- - -CREATE TABLE `comments` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `member_id` varchar(24) DEFAULT NULL, - `parent_id` varchar(24) DEFAULT NULL, - `status` varchar(50) NOT NULL DEFAULT 'published', - `html` longtext DEFAULT NULL, - `edited_at` datetime DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `comment_likes` --- - -CREATE TABLE `comment_likes` ( - `id` varchar(24) NOT NULL, - `comment_id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `comment_reports` --- - -CREATE TABLE `comment_reports` ( - `id` varchar(24) NOT NULL, - `comment_id` varchar(24) NOT NULL, - `member_id` varchar(24) DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `custom_theme_settings` --- - -CREATE TABLE `custom_theme_settings` ( - `id` varchar(24) NOT NULL, - `theme` varchar(191) NOT NULL, - `key` varchar(191) NOT NULL, - `type` varchar(50) NOT NULL, - `value` text DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `custom_theme_settings` --- - -INSERT INTO `custom_theme_settings` (`id`, `theme`, `key`, `type`, `value`) VALUES -('6511f58c6740bf0001d14273', 'casper', 'title_font', 'select', 'Modern sans-serif'), -('6511f58c6740bf0001d14274', 'casper', 'body_font', 'select', 'Elegant serif'), -('6511f58c6740bf0001d14276', 'casper', 'feed_layout', 'select', 'Classic'), -('6511f58c6740bf0001d14277', 'casper', 'color_scheme', 'select', 'Auto'), -('6511f58c6740bf0001d1427c', 'casper', 'email_signup_text', 'text', 'Receive my Newsletter spam'), -('6511f847cd1c0b0001715732', 'casper', 'navigation_layout', 'select', 'Logo on cover'), -('6511f847cd1c0b0001715733', 'casper', 'show_publication_cover', 'boolean', 'true'), -('6511f847cd1c0b0001715734', 'casper', 'header_style', 'select', 'Left aligned'), -('6511f847cd1c0b0001715735', 'casper', 'post_image_style', 'select', 'Small'), -('6511f847cd1c0b0001715736', 'casper', 'show_recent_posts_footer', 'boolean', 'true'), -('6511fac1cd1c0b0001715740', 'journal', 'navigation_layout', 'select', 'Stacked'), -('6511fac1cd1c0b0001715741', 'journal', 'title_font', 'select', 'Modern sans-serif'), -('6511fac1cd1c0b0001715742', 'journal', 'body_font', 'select', 'Modern sans-serif'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `donation_payment_events` --- - -CREATE TABLE `donation_payment_events` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) DEFAULT NULL, - `email` varchar(191) NOT NULL, - `member_id` varchar(24) DEFAULT NULL, - `amount` int(11) NOT NULL, - `currency` varchar(50) NOT NULL, - `attribution_id` varchar(24) DEFAULT NULL, - `attribution_type` varchar(50) DEFAULT NULL, - `attribution_url` varchar(2000) DEFAULT NULL, - `referrer_source` varchar(191) DEFAULT NULL, - `referrer_medium` varchar(191) DEFAULT NULL, - `referrer_url` varchar(2000) DEFAULT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `emails` --- - -CREATE TABLE `emails` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `uuid` varchar(36) NOT NULL, - `status` varchar(50) NOT NULL DEFAULT 'pending', - `recipient_filter` text NOT NULL, - `error` varchar(2000) DEFAULT NULL, - `error_data` longtext DEFAULT NULL, - `email_count` int(10) UNSIGNED NOT NULL DEFAULT 0, - `delivered_count` int(10) UNSIGNED NOT NULL DEFAULT 0, - `opened_count` int(10) UNSIGNED NOT NULL DEFAULT 0, - `failed_count` int(10) UNSIGNED NOT NULL DEFAULT 0, - `subject` varchar(300) DEFAULT NULL, - `from` varchar(2000) DEFAULT NULL, - `reply_to` varchar(2000) DEFAULT NULL, - `html` longtext DEFAULT NULL, - `plaintext` longtext DEFAULT NULL, - `track_opens` tinyint(1) NOT NULL DEFAULT 0, - `submitted_at` datetime NOT NULL, - `newsletter_id` varchar(24) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL, - `track_clicks` tinyint(1) NOT NULL DEFAULT 0, - `feedback_enabled` tinyint(1) NOT NULL DEFAULT 0, - `source` longtext DEFAULT NULL, - `source_type` varchar(50) NOT NULL DEFAULT 'html' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `email_batches` --- - -CREATE TABLE `email_batches` ( - `id` varchar(24) NOT NULL, - `email_id` varchar(24) NOT NULL, - `provider_id` varchar(255) DEFAULT NULL, - `status` varchar(50) NOT NULL DEFAULT 'pending', - `member_segment` text DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime NOT NULL, - `error_status_code` int(10) UNSIGNED DEFAULT NULL, - `error_message` varchar(2000) DEFAULT NULL, - `error_data` longtext DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `email_recipients` --- - -CREATE TABLE `email_recipients` ( - `id` varchar(24) NOT NULL, - `email_id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `batch_id` varchar(24) NOT NULL, - `processed_at` datetime DEFAULT NULL, - `delivered_at` datetime DEFAULT NULL, - `opened_at` datetime DEFAULT NULL, - `failed_at` datetime DEFAULT NULL, - `member_uuid` varchar(36) NOT NULL, - `member_email` varchar(191) NOT NULL, - `member_name` varchar(191) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `email_recipient_failures` --- - -CREATE TABLE `email_recipient_failures` ( - `id` varchar(24) NOT NULL, - `email_id` varchar(24) NOT NULL, - `member_id` varchar(24) DEFAULT NULL, - `email_recipient_id` varchar(24) NOT NULL, - `code` int(10) UNSIGNED NOT NULL, - `enhanced_code` varchar(50) DEFAULT NULL, - `message` varchar(2000) NOT NULL, - `severity` varchar(50) NOT NULL DEFAULT 'permanent', - `failed_at` datetime NOT NULL, - `event_id` varchar(255) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `email_spam_complaint_events` --- - -CREATE TABLE `email_spam_complaint_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `email_id` varchar(24) NOT NULL, - `email_address` varchar(191) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `integrations` --- - -CREATE TABLE `integrations` ( - `id` varchar(24) NOT NULL, - `type` varchar(50) NOT NULL DEFAULT 'custom', - `name` varchar(191) NOT NULL, - `slug` varchar(191) NOT NULL, - `icon_image` varchar(2000) DEFAULT NULL, - `description` varchar(2000) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `integrations` --- - -INSERT INTO `integrations` (`id`, `type`, `name`, `slug`, `icon_image`, `description`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES -('6511f58b6740bf0001d14111', 'builtin', 'Zapier', 'zapier', NULL, 'Built-in Zapier integration', '2023-09-25 21:03:07', '1', '2023-09-25 21:03:07', '1'), -('6511f58b6740bf0001d14113', 'internal', 'Ghost Backup', 'ghost-backup', NULL, 'Internal DB Backup integration', '2023-09-25 21:03:07', '1', '2023-09-25 21:03:07', '1'), -('6511f58b6740bf0001d14115', 'internal', 'Ghost Scheduler', 'ghost-scheduler', NULL, 'Internal Scheduler integration', '2023-09-25 21:03:07', '1', '2023-09-25 21:03:07', '1'), -('6511f844cd1c0b00017156ab', 'internal', 'Ghost Internal Frontend', 'ghost-internal-frontend', NULL, 'Internal frontend integration', '2023-09-25 21:14:44', '1', NULL, NULL), -('6511f844cd1c0b00017156d1', 'core', 'Ghost Explore', 'ghost-explore', NULL, 'Internal Integration for the Ghost Explore directory', '2023-09-25 21:14:44', '1', NULL, NULL), -('6511f846cd1c0b00017156ec', 'core', 'Self-Serve Migration Integration', 'self-serve-migration', NULL, 'Core Integration for the Self-Serve migration tool', '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b000171572a', 'core', 'Ghost Core Content API', 'ghost-core-content', NULL, 'Internal Content API integration for Admin access', '2023-09-25 21:14:46', '1', NULL, NULL); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `invites` --- - -CREATE TABLE `invites` ( - `id` varchar(24) NOT NULL, - `role_id` varchar(24) NOT NULL, - `status` varchar(50) NOT NULL DEFAULT 'pending', - `token` varchar(191) NOT NULL, - `email` varchar(191) NOT NULL, - `expires` bigint(20) NOT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `jobs` --- - -CREATE TABLE `jobs` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) NOT NULL, - `status` varchar(50) NOT NULL DEFAULT 'queued', - `started_at` datetime DEFAULT NULL, - `finished_at` datetime DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `jobs` --- - -INSERT INTO `jobs` (`id`, `name`, `status`, `started_at`, `finished_at`, `created_at`, `updated_at`) VALUES -('6511f847cd1c0b0001715737', 'members-migrations', 'finished', '2023-09-25 21:14:47', '2023-09-25 21:14:47', '2023-09-25 21:14:47', '2023-09-25 21:14:47'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `labels` --- - -CREATE TABLE `labels` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) NOT NULL, - `slug` varchar(191) NOT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members` --- - -CREATE TABLE `members` ( - `id` varchar(24) NOT NULL, - `uuid` varchar(36) DEFAULT NULL, - `email` varchar(191) NOT NULL, - `status` varchar(50) NOT NULL DEFAULT 'free', - `name` varchar(191) DEFAULT NULL, - `note` varchar(2000) DEFAULT NULL, - `geolocation` varchar(2000) DEFAULT NULL, - `email_count` int(10) UNSIGNED NOT NULL DEFAULT 0, - `email_opened_count` int(10) UNSIGNED NOT NULL DEFAULT 0, - `email_open_rate` int(10) UNSIGNED DEFAULT NULL, - `last_seen_at` datetime DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL, - `last_commented_at` datetime DEFAULT NULL, - `expertise` varchar(191) DEFAULT NULL, - `enable_comment_notifications` tinyint(1) NOT NULL DEFAULT 1, - `email_disabled` tinyint(1) NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_cancel_events` --- - -CREATE TABLE `members_cancel_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `from_plan` varchar(255) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_click_events` --- - -CREATE TABLE `members_click_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `redirect_id` varchar(24) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_created_events` --- - -CREATE TABLE `members_created_events` ( - `id` varchar(24) NOT NULL, - `created_at` datetime NOT NULL, - `member_id` varchar(24) NOT NULL, - `attribution_id` varchar(24) DEFAULT NULL, - `attribution_type` varchar(50) DEFAULT NULL, - `attribution_url` varchar(2000) DEFAULT NULL, - `source` varchar(50) NOT NULL, - `referrer_source` varchar(191) DEFAULT NULL, - `referrer_medium` varchar(191) DEFAULT NULL, - `referrer_url` varchar(2000) DEFAULT NULL, - `batch_id` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_email_change_events` --- - -CREATE TABLE `members_email_change_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `to_email` varchar(191) NOT NULL, - `from_email` varchar(191) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_feedback` --- - -CREATE TABLE `members_feedback` ( - `id` varchar(24) NOT NULL, - `score` int(10) UNSIGNED NOT NULL DEFAULT 0, - `member_id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_labels` --- - -CREATE TABLE `members_labels` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `label_id` varchar(24) NOT NULL, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_login_events` --- - -CREATE TABLE `members_login_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_newsletters` --- - -CREATE TABLE `members_newsletters` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `newsletter_id` varchar(24) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_paid_subscription_events` --- - -CREATE TABLE `members_paid_subscription_events` ( - `id` varchar(24) NOT NULL, - `type` varchar(50) DEFAULT NULL, - `member_id` varchar(24) NOT NULL, - `subscription_id` varchar(24) DEFAULT NULL, - `from_plan` varchar(255) DEFAULT NULL, - `to_plan` varchar(255) DEFAULT NULL, - `currency` varchar(191) NOT NULL, - `source` varchar(50) NOT NULL, - `mrr_delta` int(11) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_payment_events` --- - -CREATE TABLE `members_payment_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `amount` int(11) NOT NULL, - `currency` varchar(191) NOT NULL, - `source` varchar(50) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_products` --- - -CREATE TABLE `members_products` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `product_id` varchar(24) NOT NULL, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0, - `expiry_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_product_events` --- - -CREATE TABLE `members_product_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `product_id` varchar(24) NOT NULL, - `action` varchar(50) DEFAULT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_status_events` --- - -CREATE TABLE `members_status_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `from_status` varchar(50) DEFAULT NULL, - `to_status` varchar(50) DEFAULT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_stripe_customers` --- - -CREATE TABLE `members_stripe_customers` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `customer_id` varchar(255) NOT NULL, - `name` varchar(191) DEFAULT NULL, - `email` varchar(191) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_stripe_customers_subscriptions` --- - -CREATE TABLE `members_stripe_customers_subscriptions` ( - `id` varchar(24) NOT NULL, - `customer_id` varchar(255) NOT NULL, - `subscription_id` varchar(255) NOT NULL, - `stripe_price_id` varchar(255) NOT NULL DEFAULT '', - `status` varchar(50) NOT NULL, - `cancel_at_period_end` tinyint(1) NOT NULL DEFAULT 0, - `cancellation_reason` varchar(500) DEFAULT NULL, - `current_period_end` datetime NOT NULL, - `start_date` datetime NOT NULL, - `default_payment_card_last4` varchar(4) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL, - `mrr` int(10) UNSIGNED NOT NULL DEFAULT 0, - `offer_id` varchar(24) DEFAULT NULL, - `plan_id` varchar(255) NOT NULL, - `plan_nickname` varchar(50) NOT NULL, - `plan_interval` varchar(50) NOT NULL, - `plan_amount` int(11) NOT NULL, - `plan_currency` varchar(191) NOT NULL, - `trial_start_at` datetime DEFAULT NULL, - `trial_end_at` datetime DEFAULT NULL, - `ghost_subscription_id` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_subscribe_events` --- - -CREATE TABLE `members_subscribe_events` ( - `id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `subscribed` tinyint(1) NOT NULL DEFAULT 1, - `created_at` datetime NOT NULL, - `source` varchar(50) DEFAULT NULL, - `newsletter_id` varchar(24) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `members_subscription_created_events` --- - -CREATE TABLE `members_subscription_created_events` ( - `id` varchar(24) NOT NULL, - `created_at` datetime NOT NULL, - `member_id` varchar(24) NOT NULL, - `subscription_id` varchar(24) NOT NULL, - `attribution_id` varchar(24) DEFAULT NULL, - `attribution_type` varchar(50) DEFAULT NULL, - `attribution_url` varchar(2000) DEFAULT NULL, - `referrer_source` varchar(191) DEFAULT NULL, - `referrer_medium` varchar(191) DEFAULT NULL, - `referrer_url` varchar(2000) DEFAULT NULL, - `batch_id` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `mentions` --- - -CREATE TABLE `mentions` ( - `id` varchar(24) NOT NULL, - `source` varchar(2000) NOT NULL, - `source_title` varchar(2000) DEFAULT NULL, - `source_site_title` varchar(2000) DEFAULT NULL, - `source_excerpt` varchar(2000) DEFAULT NULL, - `source_author` varchar(2000) DEFAULT NULL, - `source_featured_image` varchar(2000) DEFAULT NULL, - `source_favicon` varchar(2000) DEFAULT NULL, - `target` varchar(2000) NOT NULL, - `resource_id` varchar(24) DEFAULT NULL, - `resource_type` varchar(50) DEFAULT NULL, - `created_at` datetime NOT NULL, - `payload` text DEFAULT NULL, - `deleted` tinyint(1) NOT NULL DEFAULT 0, - `verified` tinyint(1) NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `migrations` --- - -CREATE TABLE `migrations` ( - `id` int(10) UNSIGNED NOT NULL, - `name` varchar(120) NOT NULL, - `version` varchar(70) NOT NULL, - `currentVersion` varchar(255) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `migrations` --- - -INSERT INTO `migrations` (`id`, `name`, `version`, `currentVersion`) VALUES -(1, '1-create-tables.js', 'init', '4.48'), -(2, '2-create-fixtures.js', 'init', '4.48'), -(3, '1-post-excerpt.js', '1.3', '4.48'), -(4, '1-codeinjection-post.js', '1.4', '4.48'), -(5, '1-og-twitter-post.js', '1.5', '4.48'), -(6, '1-add-backup-client.js', '1.7', '4.48'), -(7, '1-add-permissions-redirect.js', '1.9', '4.48'), -(8, '1-custom-template-post.js', '1.13', '4.48'), -(9, '2-theme-permissions.js', '1.13', '4.48'), -(10, '1-add-webhooks-table.js', '1.18', '4.48'), -(11, '1-webhook-permissions.js', '1.19', '4.48'), -(12, '1-remove-settings-keys.js', '1.20', '4.48'), -(13, '1-add-contributor-role.js', '1.21', '4.48'), -(14, '1-multiple-authors-DDL.js', '1.22', '4.48'), -(15, '1-multiple-authors-DML.js', '1.22', '4.48'), -(16, '1-update-koenig-beta-html.js', '1.25', '4.48'), -(17, '2-demo-post.js', '1.25', '4.48'), -(18, '1-rename-amp-column.js', '2.0', '4.48'), -(19, '2-update-posts.js', '2.0', '4.48'), -(20, '3-remove-koenig-labs.js', '2.0', '4.48'), -(21, '4-permalink-setting.js', '2.0', '4.48'), -(22, '5-remove-demo-post.js', '2.0', '4.48'), -(23, '6-replace-fixture-posts.js', '2.0', '4.48'), -(24, '1-add-sessions-table.js', '2.2', '4.48'), -(25, '2-add-integrations-and-api-key-tables.js', '2.2', '4.48'), -(26, '3-insert-admin-integration-role.js', '2.2', '4.48'), -(27, '4-insert-integration-and-api-key-permissions.js', '2.2', '4.48'), -(28, '5-add-mobiledoc-revisions-table.js', '2.2', '4.48'), -(29, '1-add-webhook-columns.js', '2.3', '4.48'), -(30, '2-add-webhook-edit-permission.js', '2.3', '4.48'), -(31, '1-add-webhook-permission-roles.js', '2.6', '4.48'), -(32, '1-add-members-table.js', '2.8', '4.48'), -(33, '1-remove-empty-strings.js', '2.13', '4.48'), -(34, '1-add-actions-table.js', '2.14', '4.48'), -(35, '2-add-actions-permissions.js', '2.14', '4.48'), -(36, '1-add-type-column-to-integrations.js', '2.15', '4.48'), -(37, '2-insert-zapier-integration.js', '2.15', '4.48'), -(38, '1-add-members-perrmissions.js', '2.16', '4.48'), -(39, '1-normalize-settings.js', '2.17', '4.48'), -(40, '2-posts-add-canonical-url.js', '2.17', '4.48'), -(41, '1-restore-settings-from-backup.js', '2.18', '4.48'), -(42, '1-update-editor-permissions.js', '2.21', '4.48'), -(43, '1-add-member-permissions-to-roles.js', '2.22', '4.48'), -(44, '1-insert-ghost-db-backup-role.js', '2.27', '4.48'), -(45, '2-insert-db-backup-integration.js', '2.27', '4.48'), -(46, '3-add-subdirectory-to-relative-canonical-urls.js', '2.27', '4.48'), -(47, '1-add-db-backup-content-permission.js', '2.28', '4.48'), -(48, '2-add-db-backup-content-permission-to-roles.js', '2.28', '4.48'), -(49, '3-insert-ghost-scheduler-role.js', '2.28', '4.48'), -(50, '4-insert-scheduler-integration.js', '2.28', '4.48'), -(51, '5-add-scheduler-permission-to-roles.js', '2.28', '4.48'), -(52, '6-add-type-column.js', '2.28', '4.48'), -(53, '7-populate-type-column.js', '2.28', '4.48'), -(54, '8-remove-page-column.js', '2.28', '4.48'), -(55, '1-add-post-page-column.js', '2.29', '4.48'), -(56, '2-populate-post-page-column.js', '2.29', '4.48'), -(57, '3-remove-page-type-column.js', '2.29', '4.48'), -(58, '1-remove-name-and-password-from-members-table.js', '2.31', '4.48'), -(59, '01-add-members-stripe-customers-table.js', '2.32', '4.48'), -(60, '02-add-name-to-members-table.js', '2.32', '4.48'), -(61, '01-correct-members-stripe-customers-table.js', '2.33', '4.48'), -(62, '01-add-stripe-customers-subscriptions-table.js', '2.34', '4.48'), -(63, '02-add-email-to-members-stripe-customers-table.js', '2.34', '4.48'), -(64, '03-add-name-to-members-stripe-customers-table.js', '2.34', '4.48'), -(65, '01-add-note-to-members-table.js', '2.35', '4.48'), -(66, '01-add-self-signup-and-from address-to-members-settings.js', '2.37', '4.48'), -(67, '01-remove-user-ghost-auth-columns.js', '3.0', '4.48'), -(68, '02-drop-token-auth-tables.js', '3.0', '4.48'), -(69, '03-drop-client-auth-tables.js', '3.0', '4.48'), -(70, '04-add-posts-meta-table.js', '3.0', '4.48'), -(71, '05-populate-posts-meta-table.js', '3.0', '4.48'), -(72, '06-remove-posts-meta-columns.js', '3.0', '4.48'), -(73, '07-add-posts-type-column.js', '3.0', '4.48'), -(74, '08-populate-posts-type-column.js', '3.0', '4.48'), -(75, '09-remove-posts-page-column.js', '3.0', '4.48'), -(76, '10-remove-empty-strings.js', '3.0', '4.48'), -(77, '11-update-posts-html.js', '3.0', '4.48'), -(78, '12-populate-members-table-from-subscribers.js', '3.0', '4.48'), -(79, '13-drop-subscribers-table.js', '3.0', '4.48'), -(80, '14-remove-subscribers-flag.js', '3.0', '4.48'), -(81, '01-add-send-email-when-published-to-posts.js', '3.1', '4.48'), -(82, '02-add-email-subject-to-posts-meta.js', '3.1', '4.48'), -(83, '03-add-email-preview-permissions.js', '3.1', '4.48'), -(84, '04-add-subscribed-flag-to-members.js', '3.1', '4.48'), -(85, '05-add-emails-table.js', '3.1', '4.48'), -(86, '06-add-email-permissions.js', '3.1', '4.48'), -(87, '07-add-uuid-field-to-members.js', '3.1', '4.48'), -(88, '08-add-uuid-values-to-members.js', '3.1', '4.48'), -(89, '09-add-further-email-permissions.js', '3.1', '4.48'), -(90, '10-add-email-error-data-column.js', '3.1', '4.48'), -(91, '01-add-cancel-at-period-end-to-subscriptions.js', '3.2', '4.48'), -(92, '1-add-labels-table.js', '3.6', '4.48'), -(93, '2-add-members-labels-table.js', '3.6', '4.48'), -(94, '3-add-labels-permissions.js', '3.6', '4.48'), -(95, '01-fix-incorrect-member-labels-foreign-keys.js', '3.7', '4.48'), -(96, '01-add-geolocation-to-members.js', '3.8', '4.48'), -(97, '01-add-member-sigin-url-permissions.js', '3.9', '4.48'), -(98, '01-remove-broken-complimentary-plan-from-members-settings.js', '3.11', '4.48'), -(99, '01-add-identity-permission.js', '3.12', '4.48'), -(100, '02-remove-legacy-is-paid-flag-from-settings.js', '3.12', '4.48'), -(101, '01-add-email-preview-permissions-to-roles.js', '3.18', '4.48'), -(102, '02-add-members_stripe_connect-auth-permissions.js', '3.18', '4.48'), -(103, '01-update-member-from-email-address.js', '3.19', '4.48'), -(104, '01-removed-legacy-values-from-settings-table.js', '3.22', '4.48'), -(105, '02-settings-key-renames.js', '3.22', '4.48'), -(106, '03-add-group-and-flags-to-settings.js', '3.22', '4.48'), -(107, '04-populate-settings-groups-and-flags.js', '3.22', '4.48'), -(108, '05-migrate-members-subscription-settings.js', '3.22', '4.48'), -(109, '06-migrate-stripe-connect-settings.js', '3.22', '4.48'), -(110, '07-update-type-for-settings.js', '3.22', '4.48'), -(111, '01-migrate-bulk-email-settings.js', '3.23', '4.48'), -(112, '02-remove-bulk-email-settings.js', '3.23', '4.48'), -(113, '03-update-portal-button-setting.js', '3.23', '4.48'), -(114, '04-add-meta-columns-to-tags-table.js', '3.23', '4.48'), -(115, '01-populate-group-for-new-portal-settings.js', '3.24', '4.48'), -(116, '01-add-members-stripe-webhook-settings.js', '3.25', '4.48'), -(117, '01-add-amp-gtag-id-setting.js', '3.26', '4.48'), -(118, '01-remove-duplicate-subscriptions.js', '3.29', '4.48'), -(119, '02-remove-duplicate-customers.js', '3.29', '4.48'), -(120, '03-remove-orphaned-customers.js', '3.29', '4.48'), -(121, '04-remove-orphaned-subscriptions.js', '3.29', '4.48'), -(122, '05-add-member-constraints.js', '3.29', '4.48'), -(123, '01-add-member-signin-url-permission-roles.js', '3.30', '4.48'), -(124, '01-add-member-support-address-setting.js', '3.32', '4.48'), -(125, '02-add-member-reply-address-setting.js', '3.32', '4.48'), -(126, '03-add-routes-hash-setting.js', '3.32', '4.48'), -(127, '01-add-email-recipients-tables.js', '3.33', '4.48'), -(128, '01-add-tokens-table.js', '3.34', '4.48'), -(129, '01-add-address-columns-to-emails-table.js', '3.35', '4.48'), -(130, '01-add-snippets-table.js', '3.36', '4.48'), -(131, '02-add-snippets-permissions.js', '3.36', '4.48'), -(132, '01-update-portal-button-setting.js', '3.37', '4.48'), -(133, '01-add-email-recipient-filter-column.js', '3.38', '4.48'), -(134, '02-populate-email-recipient-filter-column.js', '3.38', '4.48'), -(135, '03-add-recipient-filter-column.js', '3.38', '4.48'), -(136, '04-populate-recipient-filter-column.js', '3.38', '4.48'), -(137, '05-add-emails-track-opens-column.js', '3.38', '4.48'), -(138, '06-add-newsletter-settings.js', '3.38', '4.48'), -(139, '07-migrate-newsletter-settings-from-config.js', '3.38', '4.48'), -(140, '08-repopulate-send-email-when-published-down-migration.js', '3.38', '4.48'), -(141, '09-remove-send-email-when-published-column.js', '3.38', '4.48'), -(142, '01-add-members-signup-redirect-settings.js', '3.39', '4.48'), -(143, '02-add-user-id-to-api-keys-table.js', '3.39', '4.48'), -(144, '03-add-email-track-opens-setting.js', '3.39', '4.48'), -(145, '04-add-cancellation-reason-column.js', '3.39', '4.48'), -(146, '05-remove-unused-columns-on-emails.js', '3.39', '4.48'), -(147, '06-add-email-recipient-index.js', '3.39', '4.48'), -(148, '07-add-email-recipients-event-timestamps.js', '3.39', '4.48'), -(149, '08-add-email-stats-columns.js', '3.39', '4.48'), -(150, '01-add-members-email-open-rate-column.js', '3.40', '4.48'), -(151, '02-add members-email-aggregation-columns.js', '3.40', '4.48'), -(152, '03-populate-members-email-counts.js', '3.40', '4.48'), -(153, '01-add-firstpromoter-settings.js', '3.41', '4.48'), -(154, '01-update-mobiledoc.js', '4.0', '4.48'), -(155, '02-add-status-column-to-members.js', '4.0', '4.48'), -(156, '03-populate-status-column-for-members.js', '4.0', '4.48'), -(157, '04-drop-apps-related-tables.js', '4.0', '4.48'), -(158, '05-add-members-subscribe-events-table.js', '4.0', '4.48'), -(159, '06-populate-members-subscribe-events-table.js', '4.0', '4.48'), -(160, '07-alter-unique-constraint-for-posts-slug.js', '4.0', '4.48'), -(161, '08-add-members-login-events-table.js', '4.0', '4.48'), -(162, '09-add-members-email-change-events-table.js', '4.0', '4.48'), -(163, '10-add-members-status-events-table.js', '4.0', '4.48'), -(164, '11-add-members-paid-subscription-events-table.js', '4.0', '4.48'), -(165, '12-delete-apps-related-settings-keys.js', '4.0', '4.48'), -(166, '13-add-members-payment-events-table.js', '4.0', '4.48'), -(167, '14-remove-orphaned-stripe-records.js', '4.0', '4.48'), -(168, '15-add-frontmatter-column-to-meta.js', '4.0', '4.48'), -(169, '16-refactor-slack-setting.js', '4.0', '4.48'), -(170, '17-populate-members-status-events-table.js', '4.0', '4.48'), -(171, '18-transform-urls-absolute-to-transform-ready.js', '4.0', '4.48'), -(172, '19-remove-labs-members-setting.js', '4.0', '4.48'), -(173, '20-refactor-unsplash-setting.js', '4.0', '4.48'), -(174, '21-sanitize-email-batches-provider-id.js', '4.0', '4.48'), -(175, '22-solve-orphaned-webhooks.js', '4.0', '4.48'), -(176, '23-regenerate-posts-html.js', '4.0', '4.48'), -(177, '24-add-missing-email-permissions.js', '4.0', '4.48'), -(178, '25-populate-members-paid-subscription-events-table.js', '4.0', '4.48'), -(179, '26-add-cascade-on-delete.js', '4.0', '4.48'), -(180, '27-add-primary-key-brute-migrations-lock.js', '4.0', '4.48'), -(181, '28-add-webhook-intergrations-foreign-key.js', '4.0', '4.48'), -(182, '29-fix-foreign-key-for-members-stripe-customers-subscriptions.js', '4.0', '4.48'), -(183, '30-set-default-accent-color.js', '4.0', '4.48'), -(184, '01-fix-backup-content-permission-typo.js', '4.1', '4.48'), -(185, '02-add-unique-constraint-for-member-stripe-tables.js', '4.1', '4.48'), -(186, '01-fix-incorrect-mrr-delta-events.js', '4.2', '4.48'), -(187, '01-add-products-table.js', '4.3', '4.48'), -(188, '02-add-members-products-table.js', '4.3', '4.48'), -(189, '03-add-default-product.js', '4.3', '4.48'), -(190, '04-attach-members-to-product.js', '4.3', '4.48'), -(191, '05-add-stripe-products-table.js', '4.3', '4.48'), -(192, '06-add-stripe-prices-table.js', '4.3', '4.48'), -(193, '07-add-products-permissions.js', '4.3', '4.48'), -(194, '08-migrate-members-signup-setting.js', '4.3', '4.48'), -(195, '09-add-price-id-column-to-subscriptions-table.js', '4.3', '4.48'), -(196, '10-populate-stripe-price-id-in-subscriptions.js', '4.3', '4.48'), -(197, '01-restore-free-members-signup-setting-from-backup.js', '4.4', '4.48'), -(198, '02-migrate-members-signup-access.js', '4.4', '4.48'), -(199, '01-add-stripe-price-description-column.js', '4.5', '4.48'), -(200, '02-add-product-description-column.js', '4.5', '4.48'), -(201, '03-give-label-read-permissions-to-editors.js', '4.5', '4.48'), -(202, '04-remove-unique-constraint-from-product-name.js', '4.5', '4.48'), -(203, '05-rename-default-product-to-site-title.js', '4.5', '4.48'), -(204, '01-remove-comped-status.js', '4.6', '4.48'), -(205, '01-add-monthly-price-column-to-products.js', '4.7', '4.48'), -(206, '02-add-yearly-price-column-to-products.js', '4.7', '4.48'), -(207, '03-add-labs-setting.js', '4.7', '4.48'), -(208, '01-add-feature-image-alt-column-to-posts-meta.js', '4.8', '4.48'), -(209, '02-add-feature-image-caption-column-to-posts-meta.js', '4.8', '4.48'), -(210, '03-add-default-product-portal-products.js', '4.8', '4.48'), -(211, '04-migrate-show-newsletter-header-setting.js', '4.8', '4.48'), -(212, '01-add-reset-all-passwords-permission.js', '4.9', '4.48'), -(213, '02-add-benefits-table.js', '4.9', '4.48'), -(214, '03-add-products-benefits-table.js', '4.9', '4.48'), -(215, '04-add-member-segment-to-email-batches.js', '4.9', '4.48'), -(216, '05-fix-missed-mobiledoc-url-transforms.js', '4.9', '4.48'), -(217, '06-add-comped-status.js', '4.9', '4.48'), -(218, '07-update-comped-members-status-events.js', '4.9', '4.48'), -(219, '01-add-oauth-user-data.js', '4.11', '4.48'), -(220, '02-add-email-verification-required-setting.js', '4.11', '4.48'), -(221, '01-add-email-only-column-to-posts-meta-table.js', '4.12', '4.48'), -(222, '02-fix-member-statuses.js', '4.12', '4.48'), -(223, '01-add-members-stripe-connect-auth-permission-to-administrators.js', '4.13', '4.48'), -(224, '02-add-members-products-events-table.js', '4.13', '4.48'), -(225, '01-fix-comped-member-statuses.js', '4.14', '4.48'), -(226, '02-fix-free-members-status-events.js', '4.14', '4.48'), -(227, '01-add-temp-members-analytic-events-table.js', '4.15', '4.48'), -(228, '01-add-custom-theme-settings-table.js', '4.16', '4.48'), -(229, '01-add-custom-theme-settings-permissions.js', '4.17', '4.48'), -(230, '02-add-offers-table.js', '4.17', '4.48'), -(231, '03-add-offers-permissions.js', '4.17', '4.48'), -(232, '01-add-active-column-to-offers.js', '4.19', '4.48'), -(233, '02-add-offer-redemptions-table.js', '4.19', '4.48'), -(234, '01-remove-offer-redemptions-table.js', '4.20', '4.48'), -(235, '02-remove-offers-table.js', '4.20', '4.48'), -(236, '03-add-offers-table.js', '4.20', '4.48'), -(237, '04-add-offer-redemptions-table.js', '4.20', '4.48'), -(238, '05-remove-not-null-constraint-from-portal-title.js', '4.20', '4.48'), -(239, '01-add-is-launch-complete-setting.js', '4.22', '4.48'), -(240, '02-update-launch-complete-setting-from-user-data.js', '4.22', '4.48'), -(241, '01-truncate-offer-names.js', '4.23', '4.48'), -(242, '2022-01-14-11-50-add-type-column-to-products.js', '4.33', '4.48'), -(243, '2022-01-14-11-51-add-default-free-tier.js', '4.33', '4.48'), -(244, '2022-01-18-09-07-remove-duplicate-offer-redemptions.js', '4.33', '4.48'), -(245, '2022-01-19-10-43-add-active-column-to-products-table.js', '4.33', '4.48'), -(246, '2022-01-25-13-53-add-welcome-page-url-column-to-products.js', '4.34', '4.48'), -(247, '2022-01-20-05-55-add-post-products-table.js', '4.35', '4.48'), -(248, '2022-01-30-15-17-set-welcome-page-url-from-settings.js', '4.35', '4.48'), -(249, '2022-02-01-11-48-update-email-recipient-filter-column-type.js', '4.35', '4.48'), -(250, '2022-02-01-12-03-update-recipient-filter-column-type.js', '4.35', '4.48'), -(251, '2022-02-02-10-38-add-default-content-visibility-tiers-setting.js', '4.35', '4.48'), -(252, '2022-02-02-13-10-transform-specific-tiers-default-content-visibility.js', '4.35', '4.48'), -(253, '2022-02-04-04-34-populate-empty-portal-products.js', '4.35', '4.48'), -(254, '2022-02-07-14-34-add-last-seen-at-column-to-members.js', '4.36', '4.48'), -(255, '2022-02-21-09-53-backfill-members-last-seen-at-column.js', '4.37', '4.48'), -(256, '2022-03-01-08-46-add-visibility-to-tiers.js', '4.38', '4.48'), -(257, '2022-03-03-16-12-add-visibility-to-tiers.js', '4.38', '4.48'), -(258, '2022-03-03-16-17-drop-tiers-visible-column.js', '4.38', '4.48'), -(259, '2022-03-07-10-57-update-free-products-visibility-column.js', '4.39', '4.48'), -(260, '2022-03-07-10-57-update-products-visibility-column.js', '4.39', '4.48'), -(261, '2022-03-07-14-37-add-members-cancel-events-table.js', '4.40', '4.48'), -(262, '2022-03-15-06-40-add-offers-admin-integration-permission-roles.js', '4.40', '4.48'), -(263, '2022-03-15-06-40-add-tiers-admin-integration-permission-roles.js', '4.40', '4.48'), -(264, '2022-03-21-17-17-add.js', '4.42', '4.48'), -(265, '2022-03-30-15-44-add-newsletter-permissions.js', '4.42', '4.48'), -(266, '2022-03-28-19-26-recreate-newsletter-table.js', '4.43', '4.48'), -(267, '2022-03-29-14-45-add-members-newsletters-table.js', '4.43', '4.48'), -(268, '2022-04-01-10-13-add-post-newsletter-relation.js', '4.43', '4.48'), -(269, '2022-04-06-09-47-add-type-column-to-paid-subscription-events.js', '4.43', '4.48'), -(270, '2022-04-06-14-56-add-email-newsletter-relation.js', '4.43', '4.48'), -(271, '2022-04-08-10-45-add-subscription-id-to-mrr-events.js', '4.43', '4.48'), -(272, '2022-04-06-15-22-populate-type-column-for-paid-subscription-events.js', '4.44', '4.48'), -(273, '2022-04-08-11-54-add-cancelled-events.js', '4.44', '4.48'), -(274, '2022-04-11-08-24-add-newsletter-permissions.js', '4.44', '4.48'), -(275, '2022-04-11-10-54-add-mrr-to-subscriptions.js', '4.44', '4.48'), -(276, '2022-04-12-07-33-fill-mrr.js', '4.44', '4.48'), -(277, '2022-04-13-12-00-remove-newsletter-sender-name-not-null-constraint.js', '4.44', '4.48'), -(278, '2022-04-15-07-53-add-offer-id-to-subscriptions.js', '4.44', '4.48'), -(279, '2022-04-19-12-23-backfill-subscriptions-offers.js', '4.45', '4.48'), -(280, '2022-04-20-11-25-add-newsletter-read-permission.js', '4.45', '4.48'), -(281, '2022-04-21-02-55-add-notifications-key-entry-to-settings-table.js', '4.45', '4.48'), -(282, '2022-04-13-12-00-add-created-at-newsletters.js', '4.46', '4.48'), -(283, '2022-04-13-12-01-add-updated-at-newsletters.js', '4.46', '4.48'), -(284, '2022-04-13-12-02-fill-created-at-newsletters.js', '4.46', '4.48'), -(285, '2022-04-13-12-03-drop-nullable-created-at-newsletters.js', '4.46', '4.48'), -(286, '2022-04-13-12-08-newsletters-show-header-name.js', '4.46', '4.48'), -(287, '2022-04-13-12-57-add-uuid-column-to-newsletters.js', '4.46', '4.48'), -(288, '2022-04-13-12-58-fill-uuid-for-newsletters.js', '4.46', '4.48'), -(289, '2022-04-13-12-59-drop-nullable-uuid-newsletters.js', '4.46', '4.48'), -(290, '2022-04-13-13-00-add-default-newsletter.js', '4.46', '4.48'), -(291, '2022-04-20-08-39-map-subscribers-to-default-newsletter.js', '4.46', '4.48'), -(292, '2022-04-22-07-43-add-newsletter-id-to-subscribe-events.js', '4.46', '4.48'), -(293, '2022-04-27-07-59-set-newsletter-id-subscribe-events.js', '4.46', '4.48'), -(294, '2022-05-03-15-30-update-newsletter-sending-options.js', '4.47', '4.48'), -(295, '2022-05-04-10-03-transform-newsletter-header-image.js', '4.47', '4.48'), -(296, '2022-03-14-12-33-delete-duplicate-offer-redemptions.js', '5.0', '5.65'), -(297, '2022-03-28-15-25-backfill-mrr-adjustments-for-offers.js', '5.0', '5.65'), -(298, '2022-04-25-10-32-backfill-mrr-for-discounted-subscriptions.js', '5.0', '5.65'), -(299, '2022-04-26-15-44-backfill-mrr-events-for-canceled-subscriptions.js', '5.0', '5.65'), -(300, '2022-04-27-11-26-backfill-mrr-for-canceled-subscriptions.js', '5.0', '5.65'), -(301, '2022-04-28-03-26-remove-author-id-column-from-posts-table.js', '5.0', '5.65'), -(302, '2022-05-03-09-39-drop-nullable-subscribe-event-newsletter-id.js', '5.0', '5.65'), -(303, '2022-05-04-15-24-map-existing-emails-to-default-newsletter.js', '5.0', '5.65'), -(304, '2022-05-05-13-13-migrate-legacy-recipient-filters.js', '5.0', '5.65'), -(305, '2022-05-05-13-29-add-newsletters-admin-integration-permission-roles.js', '5.0', '5.65'), -(306, '2022-05-05-15-17-drop-oauth-table.js', '5.0', '5.65'), -(307, '2022-05-06-08-16-cleanup-client-subscriber-permissions.js', '5.0', '5.65'), -(308, '2022-05-06-13-22-add-frontend-integration.js', '5.0', '5.65'), -(309, '2022-05-09-10-00-drop-members-subscribed-column.js', '5.0', '5.65'), -(310, '2022-05-09-14-17-cleanup-invalid-users-status.js', '5.0', '5.65'), -(311, '2022-05-10-08-33-drop-members-analytics-table.js', '5.0', '5.65'), -(312, '2022-05-10-14-57-cleanup-invalid-posts-status.js', '5.0', '5.65'), -(313, '2022-05-11-12-08-drop-webhooks-status-column.js', '5.0', '5.65'), -(314, '2022-05-11-13-12-rename-settings.js', '5.0', '5.65'), -(315, '2022-05-11-16-36-remove-unused-settings.js', '5.0', '5.65'), -(316, '2022-05-12-10-29-add-newsletter-permissions-for-editors-and-authors.js', '5.0', '5.65'), -(317, '2022-05-12-13-51-add-label-permissions-for-authors.js', '5.0', '5.65'), -(318, '2022-05-13-11-38-drop-none-email-recipient-filter.js', '5.0', '5.65'), -(319, '2022-05-21-00-00-regenerate-posts-html.js', '5.0', '5.65'), -(320, '2022-07-04-13-49-add-comments-table.js', '5.3', '5.65'), -(321, '2022-07-05-09-36-add-comments-likes-table.js', '5.3', '5.65'), -(322, '2022-07-05-09-47-add-comments-reports-table.js', '5.3', '5.65'), -(323, '2022-07-05-10-00-add-comment-related-fields-to-members.js', '5.3', '5.65'), -(324, '2022-07-05-12-55-add-comments-crud-permissions.js', '5.3', '5.65'), -(325, '2022-07-05-15-35-add-comment-notifications-field-to-users-table.js', '5.3', '5.65'), -(326, '2022-07-06-07-26-add-comments-enabled-setting.js', '5.3', '5.65'), -(327, '2022-07-06-07-58-add-ghost-explore-integration-role.js', '5.3', '5.65'), -(328, '2022-07-06-09-13-add-ghost-explore-integration-role-permissions.js', '5.3', '5.65'), -(329, '2022-07-06-09-17-add-ghost-explore-integration.js', '5.3', '5.65'), -(330, '2022-07-06-09-26-add-ghost-explore-integration-api-key.js', '5.3', '5.65'), -(331, '2022-07-18-14-29-add-comment-reporting-permissions.js', '5.5', '5.65'), -(332, '2022-07-18-14-31-drop-reports-reason.js', '5.5', '5.65'), -(333, '2022-07-18-14-32-drop-nullable-member-id-from-likes.js', '5.5', '5.65'), -(334, '2022-07-18-14-33-fix-comments-on-delete-foreign-keys.js', '5.5', '5.65'), -(335, '2022-07-21-08-56-add-jobs-table.js', '5.5', '5.65'), -(336, '2022-07-27-13-40-change-explore-type.js', '5.6', '5.65'), -(337, '2022-08-02-06-09-add-trial-period-days-column-to-tiers.js', '5.8', '5.65'), -(338, '2022-08-03-15-28-add-trial-start-column-to-stripe-subscriptions.js', '5.8', '5.65'), -(339, '2022-08-03-15-29-add-trial-end-column-to-stripe-subscriptions.js', '5.8', '5.65'), -(340, '2022-08-09-08-32-added-new-integration-type.js', '5.9', '5.65'), -(341, '2022-08-15-05-34-add-expiry-at-column-to-members-products.js', '5.10', '5.65'), -(342, '2022-08-16-14-25-add-member-created-events-table.js', '5.10', '5.65'), -(343, '2022-08-16-14-25-add-subscription-created-events-table.js', '5.10', '5.65'), -(344, '2022-08-19-14-15-fix-comments-deletion-strategy.js', '5.10', '5.65'), -(345, '2022-08-22-11-03-add-member-alert-settings-columns-to-users.js', '5.11', '5.65'), -(346, '2022-08-23-13-41-backfill-members-created-events.js', '5.11', '5.65'), -(347, '2022-08-23-13-59-fix-page-resource-type.js', '5.11', '5.65'), -(348, '2022-09-02-12-55-rename-members-bio-to-expertise.js', '5.14', '5.65'), -(349, '2022-09-12-16-10-add-posts-lexical-column.js', '5.15', '5.65'), -(350, '2022-09-14-12-46-add-email-track-clicks-setting.js', '5.15', '5.65'), -(351, '2022-09-16-08-22-add-post-revisions-table.js', '5.15', '5.65'), -(352, '2022-09-19-09-04-add-link-redirects-table.js', '5.16', '5.65'), -(353, '2022-09-19-09-05-add-members-link-click-events-table.js', '5.16', '5.65'), -(354, '2022-09-19-17-44-add-referrer-columns-to-member-events-table.js', '5.16', '5.65'), -(355, '2022-09-19-17-44-add-referrer-columns-to-subscription-events-table.js', '5.16', '5.65'), -(356, '2022-09-27-13-53-remove-click-tracking-tables.js', '5.17', '5.65'), -(357, '2022-09-27-13-55-add-redirects-table.js', '5.17', '5.65'), -(358, '2022-09-27-13-56-add-members-click-events-table.js', '5.17', '5.65'), -(359, '2022-09-27-16-49-set-track-clicks-based-on-opens.js', '5.17', '5.65'), -(360, '2022-09-29-12-39-add-track-clicks-column-to-emails.js', '5.17', '5.65'), -(361, '2022-09-02-20-25-add-columns-to-products-table.js', '5.19', '5.65'), -(362, '2022-09-02-20-52-backfill-new-product-columns.js', '5.19', '5.65'), -(363, '2022-10-10-06-58-add-subscriptions-table.js', '5.19', '5.65'), -(364, '2022-10-10-10-05-add-members-feedback-table.js', '5.19', '5.65'), -(365, '2022-10-11-10-38-add-feedback-enabled-column-to-newsletters.js', '5.19', '5.65'), -(366, '2022-10-18-05-39-drop-nullable-tier-id.js', '5.20', '5.65'), -(367, '2022-10-18-10-13-add-ghost-subscription-id-column-to-mscs.js', '5.20', '5.65'), -(368, '2022-10-19-11-17-add-link-browse-permissions.js', '5.20', '5.65'), -(369, '2022-10-20-02-52-add-link-edit-permissions.js', '5.20', '5.65'), -(370, '2022-10-24-07-23-disable-feedback-enabled.js', '5.21', '5.65'), -(371, '2022-10-25-12-05-backfill-missed-products-columns.js', '5.21', '5.65'), -(372, '2022-10-26-04-49-add-batch-id-members-created-events.js', '5.21', '5.65'), -(373, '2022-10-26-04-49-add-batch-id-subscription-created-events.js', '5.21', '5.65'), -(374, '2022-10-26-04-50-member-subscription-created-batch-id.js', '5.21', '5.65'), -(375, '2022-10-26-09-32-add-feedback-enabled-column-to-emails.js', '5.21', '5.65'), -(376, '2022-10-27-09-50-add-member-track-source-setting.js', '5.21', '5.65'), -(377, '2022-10-31-12-03-backfill-new-product-columns.js', '5.22', '5.65'), -(378, '2022-11-21-09-32-add-source-columns-to-emails-table.js', '5.24', '5.65'), -(379, '2022-11-21-15-03-populate-source-column-with-html-for-emails.js', '5.24', '5.65'), -(380, '2022-11-21-15-57-add-error-columns-for-email-batches.js', '5.24', '5.65'), -(381, '2022-11-24-10-36-add-suppressions-table.js', '5.25', '5.65'), -(382, '2022-11-24-10-37-add-email-spam-complaint-events-table.js', '5.25', '5.65'), -(383, '2022-11-29-08-30-add-error-recipient-failures-table.js', '5.25', '5.65'), -(384, '2022-12-13-16-15-add-usage-colums-to-tokens.js', '5.27', '5.65'), -(385, '2023-01-04-04-12-drop-suppressions-table.js', '5.27', '5.65'), -(386, '2023-01-04-04-13-add-suppressions-table.js', '5.27', '5.65'), -(387, '2023-01-05-15-13-add-active-theme-permissions.js', '5.28', '5.65'), -(388, '2023-01-11-02-45-truncate-suppressions.js', '5.29', '5.65'), -(389, '2023-01-13-04-25-unsubscribe-suppressed-emails.js', '5.30', '5.65'), -(390, '2022-12-05-09-56-update-newsletter-subscriptions.js', '5.31', '5.65'), -(391, '2023-01-17-14-59-add-outbound-link-tagging-setting.js', '5.31', '5.65'), -(392, '2023-01-19-07-46-add-mentions-table.js', '5.31', '5.65'), -(393, '2023-01-24-08-00-fix-invalid-tier-expiry-for-paid-members.js', '5.32', '5.65'), -(394, '2023-01-24-08-09-restore-incorrect-expired-tiers-for-members.js', '5.32', '5.65'), -(395, '2023-01-30-07-27-add-mentions-permission.js', '5.34', '5.65'), -(396, '2023-02-08-03-08-add-mentions-notifications-column.js', '5.34', '5.65'), -(397, '2023-02-08-22-32-add-mentions-delete-column.js', '5.34', '5.65'), -(398, '2023-02-13-06-24-add-mentions-verified-column.js', '5.35', '5.65'), -(399, '2023-02-20-12-22-add-milestones-table.js', '5.36', '5.65'), -(400, '2023-02-21-12-29-add-milestone-notifications-column.js', '5.36', '5.65'), -(401, '2023-02-23-10-40-set-outbound-link-tagging-based-on-source-tracking.js', '5.36', '5.65'), -(402, '2023-03-13-09-29-add-newsletter-show-post-title-section.js', '5.39', '5.65'), -(403, '2023-03-13-13-11-add-newsletter-show-comment-cta.js', '5.39', '5.65'), -(404, '2023-03-13-14-30-add-newsletter-show-subscription-details.js', '5.39', '5.65'), -(405, '2023-03-14-12-26-add-last-mentions-email-report-timestamp-setting.js', '5.39', '5.65'), -(406, '2023-03-13-14-05-add-newsletter-show-latest-posts.js', '5.40', '5.65'), -(407, '2023-03-21-18-42-add-self-serve-integration-role.js', '5.40', '5.65'), -(408, '2023-03-21-18-43-add-self-serve-migration-and-permissions.js', '5.40', '5.65'), -(409, '2023-03-21-18-52-add-self-serve-integration.js', '5.40', '5.65'), -(410, '2023-03-21-19-02-add-self-serve-integration-api-key.js', '5.40', '5.65'), -(411, '2023-03-27-15-00-add-newsletter-colors.js', '5.41', '5.65'), -(412, '2023-03-27-17-51-fix-self-serve-integration-api-key-type.js', '5.41', '5.65'), -(413, '2023-04-04-07-03-add-portal-terms-settings.js', '5.42', '5.65'), -(414, '2023-04-14-04-17-add-snippets-lexical-column.js', '5.44', '5.65'), -(415, '2023-04-17-11-05-add-post-revision-author.js', '5.45', '5.65'), -(416, '2023-04-18-12-56-add-announcement-settings.js', '5.45', '5.65'), -(417, '2023-04-19-13-45-add-pintura-settings.js', '5.45', '5.65'), -(418, '2023-04-20-14-19-add-announcement-visibility-setting.js', '5.45', '5.65'), -(419, '2023-04-21-08-54-add-post-revision-status.js', '5.45', '5.65'), -(420, '2023-04-21-10-30-add-feature-image-to-revisions.js', '5.45', '5.65'), -(421, '2023-04-21-13-01-add-feature-image-meta-to-post-revisions.js', '5.45', '5.65'), -(422, '2023-05-30-19-03-update-pintura-setting.js', '5.51', '5.65'), -(423, '2023-06-07-10-17-add-collections-crud-persmissions.js', '5.51', '5.65'), -(424, '2023-06-13-12-24-add-temp-mail-events-table.js', '5.53', '5.65'), -(425, '2023-06-20-10-18-add-collections-table.js', '5.53', '5.65'), -(426, '2023-06-20-10-19-add-collections-posts-table.js', '5.53', '5.65'), -(427, '2023-07-07-11-57-add-show-title-and-feature-image-column-to-posts.js', '5.54', '5.65'), -(428, '2023-07-10-05-15-55-add-built-in-collections.js', '5.55', '5.65'), -(429, '2023-07-10-05-16-55-add-built-in-collection-posts.js', '5.55', '5.65'), -(430, '2023-07-14-10-11-12-add-email-disabled-field-to-members.js', '5.56', '5.65'), -(431, '2023-07-15-10-11-12-update-members-email-disabled-field.js', '5.56', '5.65'), -(432, '2023-07-26-12-44-stripe-products-nullable-product.js', '5.57', '5.65'), -(433, '2023-07-27-11-47-49-create-donation-events.js', '5.57', '5.65'), -(434, '2023-08-02-09-42-add-donation-settings.js', '5.58', '5.65'), -(435, '2023-08-07-10-42-add-donation-notifications-column.js', '5.59', '5.65'), -(436, '2023-08-07-11-17-05-add-posts-published-at-index.js', '5.59', '5.65'), -(437, '2023-08-29-10-17-add-recommendations-crud-permissions.js', '5.61', '5.65'), -(438, '2023-08-29-11-39-10-add-recommendations-table.js', '5.61', '5.65'), -(439, '2023-08-30-07-37-04-add-recommendations-enabled-settings.js', '5.61', '5.65'), -(440, '2023-09-12-11-22-10-add-recommendation-click-events-table.js', '5.63', '5.65'), -(441, '2023-09-12-11-22-11-add-recommendation-subscribe-events-table.js', '5.63', '5.65'), -(442, '2023-09-13-13-03-10-add-ghost-core-content-integration.js', '5.63', '5.65'), -(443, '2023-09-13-13-34-11-add-ghost-core-content-integration-key.js', '5.63', '5.65'), -(444, '2023-09-19-04-25-40-truncate-stale-built-in-collections-posts.js', '5.64', '5.65'), -(445, '2023-09-19-04-34-10-repopulate-built-in-collection-posts.js', '5.64', '5.65'), -(446, '2023-09-22-06-42-15-truncate-stale-built-in-collections-posts.js', '5.65', '5.65'), -(447, '2023-09-22-06-42-55-repopulate-built-in-featured-collection-posts.js', '5.65', '5.65'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `migrations_lock` --- - -CREATE TABLE `migrations_lock` ( - `lock_key` varchar(191) NOT NULL, - `locked` tinyint(1) DEFAULT 0, - `acquired_at` datetime DEFAULT NULL, - `released_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `migrations_lock` --- - -INSERT INTO `migrations_lock` (`lock_key`, `locked`, `acquired_at`, `released_at`) VALUES -('km01', 0, '2023-09-25 21:14:44', '2023-09-25 21:14:46'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `milestones` --- - -CREATE TABLE `milestones` ( - `id` varchar(24) NOT NULL, - `type` varchar(24) NOT NULL, - `value` int(11) NOT NULL, - `currency` varchar(24) DEFAULT NULL, - `created_at` datetime NOT NULL, - `email_sent_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `milestones` --- - -INSERT INTO `milestones` (`id`, `type`, `value`, `currency`, `created_at`, `email_sent_at`) VALUES -('6511f84dcd1c0b0001715738', 'members', 0, NULL, '2023-09-25 21:14:53', NULL); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `mobiledoc_revisions` --- - -CREATE TABLE `mobiledoc_revisions` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `mobiledoc` longtext DEFAULT NULL, - `created_at_ts` bigint(20) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `mobiledoc_revisions` --- - -INSERT INTO `mobiledoc_revisions` (`id`, `post_id`, `mobiledoc`, `created_at_ts`, `created_at`) VALUES -('6511f774fcc22500013e608f', '6511f58b6740bf0001d1410f', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"hr\",{}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"This is an independent publication. If you subscribe today, you\'ll get full access to the website as well as email newsletters about new content when it\'s available. Your subscription makes this site possible. Thank you!\"]]],[1,\"h3\",[[0,[],0,\"Access all areas\"]]],[1,\"p\",[[0,[],0,\"By signing up, you\'ll get access to the full archive of everything that\'s been published before and everything that\'s still to come. Your very own private library.\"]]],[1,\"h3\",[[0,[],0,\"Fresh content, delivered\"]]],[1,\"p\",[[0,[],0,\"Stay up to date with new content sent straight to your inbox! No more worrying about whether you missed something because of a pesky algorithm or news feed.\"]]],[1,\"h3\",[[0,[],0,\"Meet people like you\"]]],[1,\"p\",[[0,[],0,\"Join a community of other subscribers who share the same interests.\"]]],[10,0],[1,\"h3\",[[0,[],0,\"Start your own thing\"]]],[1,\"p\",[[0,[],0,\"Enjoying the experience? Get started for free and set up your very own subscription business using \"],[0,[0],1,\"Ghost\"],[0,[],0,\", the same platform that powers this website.\"]]]],\"ghostVersion\":\"4.0\"}', 1695676276474, '2023-09-25 21:11:16'), -('6511f774fcc22500013e6090', '6511f58b6740bf0001d1410f', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"hr\",{}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"cscherr Blog is an independent publication launched in September 2023 by Christoph J. Scherr. If you subscribe today, you\'ll get full access to the website as well as email newsletters about new content when it\'s available. Your subscription makes this site possible, and allows cscherr Blog to continue to exist. Thank you!\"]]],[1,\"h3\",[[0,[],0,\"Access all areas\"]]],[1,\"p\",[[0,[],0,\"By signing up, you\'ll get access to the full archive of everything that\'s been published before and everything that\'s still to come. Your very own private library.\"]]],[1,\"h3\",[[0,[],0,\"Fresh content, delivered\"]]],[1,\"p\",[[0,[],0,\"Stay up to date with new content sent straight to your inbox! No more worrying about whether you missed something because of a pesky algorithm or news feed.\"]]],[1,\"h3\",[[0,[],0,\"Meet people like you\"]]],[1,\"p\",[[0,[],0,\"Join a community of other subscribers who share the same interests.\"]]],[10,0],[1,\"h3\",[[0,[],0,\"Start your own thing\"]]],[1,\"p\",[[0,[],0,\"Enjoying the experience? Get started for free and set up your very own subscription business using \"],[0,[0],1,\"Ghost\"],[0,[],0,\", the same platform that powers this website.\"]]]],\"ghostVersion\":\"4.0\"}', 1695676276475, '2023-09-25 21:11:16'), -('6511f774fcc22500013e6091', '6511f58b6740bf0001d1410d', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[[\"a\",[\"href\",\"#/portal/\",\"rel\",\"noopener noreferrer\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"This is a brand new site that\'s just getting started. Things will be up and running here shortly, but you can \"],[0,[0],1,\"subscribe\"],[0,[],0,\" in the meantime if you\'d like to stay up to date and receive emails when new content is published!\"]]]],\"ghostVersion\":\"4.0\"}', 1695676276535, '2023-09-25 21:11:16'), -('6511f774fcc22500013e6092', '6511f58b6740bf0001d1410d', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[[\"a\",[\"href\",\"#/portal/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"This is cscherr Blog, a brand new site by Christoph J. Scherr that\'s just getting started. Things will be up and running here shortly, but you can \"],[0,[0],1,\"subscribe\"],[0,[],0,\" in the meantime if you\'d like to stay up to date and receive emails when new content is published!\"]]]],\"ghostVersion\":\"4.0\"}', 1695676276536, '2023-09-25 21:11:16'), -('6511fc02cd1c0b000171574b', '6511fc02cd1c0b0001715749', '{\"version\":\"0.3.1\",\"ghostVersion\":\"4.0\",\"markups\":[],\"atoms\":[],\"cards\":[],\"sections\":[[1,\"p\",[[0,[],0,\"\"]]]]}', 1695677442561, '2023-09-25 21:30:42'), -('6511fc0acd1c0b000171574f', '6511fc02cd1c0b0001715749', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"foo bar qux\"]]]],\"ghostVersion\":\"4.0\"}', 1695677450380, '2023-09-25 21:30:50'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `newsletters` --- - -CREATE TABLE `newsletters` ( - `id` varchar(24) NOT NULL, - `uuid` varchar(36) NOT NULL, - `name` varchar(191) NOT NULL, - `description` varchar(2000) DEFAULT NULL, - `slug` varchar(191) NOT NULL, - `sender_name` varchar(191) DEFAULT NULL, - `sender_email` varchar(191) DEFAULT NULL, - `sender_reply_to` varchar(191) NOT NULL DEFAULT 'newsletter', - `status` varchar(50) NOT NULL DEFAULT 'active', - `visibility` varchar(50) NOT NULL DEFAULT 'members', - `subscribe_on_signup` tinyint(1) NOT NULL DEFAULT 1, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0, - `header_image` varchar(2000) DEFAULT NULL, - `show_header_icon` tinyint(1) NOT NULL DEFAULT 1, - `show_header_title` tinyint(1) NOT NULL DEFAULT 1, - `title_font_category` varchar(191) NOT NULL DEFAULT 'sans_serif', - `title_alignment` varchar(191) NOT NULL DEFAULT 'center', - `show_feature_image` tinyint(1) NOT NULL DEFAULT 1, - `body_font_category` varchar(191) NOT NULL DEFAULT 'sans_serif', - `footer_content` text DEFAULT NULL, - `show_badge` tinyint(1) NOT NULL DEFAULT 1, - `show_header_name` tinyint(1) NOT NULL DEFAULT 1, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL, - `feedback_enabled` tinyint(1) NOT NULL DEFAULT 0, - `show_post_title_section` tinyint(1) NOT NULL DEFAULT 1, - `show_comment_cta` tinyint(1) NOT NULL DEFAULT 1, - `show_subscription_details` tinyint(1) NOT NULL DEFAULT 0, - `show_latest_posts` tinyint(1) NOT NULL DEFAULT 0, - `background_color` varchar(50) NOT NULL DEFAULT 'light', - `border_color` varchar(50) DEFAULT NULL, - `title_color` varchar(50) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `newsletters` --- - -INSERT INTO `newsletters` (`id`, `uuid`, `name`, `description`, `slug`, `sender_name`, `sender_email`, `sender_reply_to`, `status`, `visibility`, `subscribe_on_signup`, `sort_order`, `header_image`, `show_header_icon`, `show_header_title`, `title_font_category`, `title_alignment`, `show_feature_image`, `body_font_category`, `footer_content`, `show_badge`, `show_header_name`, `created_at`, `updated_at`, `feedback_enabled`, `show_post_title_section`, `show_comment_cta`, `show_subscription_details`, `show_latest_posts`, `background_color`, `border_color`, `title_color`) VALUES -('6511f58a6740bf0001d140a3', '871f0c4a-bc86-480e-9ad8-08deb2bf3113', 'cscherr Blog', NULL, 'default-newsletter', NULL, NULL, 'newsletter', 'active', 'members', 1, 0, NULL, 1, 1, 'sans_serif', 'center', 1, 'sans_serif', NULL, 1, 0, '2023-09-25 21:03:06', '2023-09-25 21:11:16', 0, 1, 1, 0, 0, 'light', NULL, NULL); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `offers` --- - -CREATE TABLE `offers` ( - `id` varchar(24) NOT NULL, - `active` tinyint(1) NOT NULL DEFAULT 1, - `name` varchar(191) NOT NULL, - `code` varchar(191) NOT NULL, - `product_id` varchar(24) NOT NULL, - `stripe_coupon_id` varchar(255) DEFAULT NULL, - `interval` varchar(50) NOT NULL, - `currency` varchar(50) DEFAULT NULL, - `discount_type` varchar(50) NOT NULL, - `discount_amount` int(11) NOT NULL, - `duration` varchar(50) NOT NULL, - `duration_in_months` int(11) DEFAULT NULL, - `portal_title` varchar(191) DEFAULT NULL, - `portal_description` varchar(2000) DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `offer_redemptions` --- - -CREATE TABLE `offer_redemptions` ( - `id` varchar(24) NOT NULL, - `offer_id` varchar(24) NOT NULL, - `member_id` varchar(24) NOT NULL, - `subscription_id` varchar(24) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `permissions` --- - -CREATE TABLE `permissions` ( - `id` varchar(24) NOT NULL, - `name` varchar(50) NOT NULL, - `object_type` varchar(50) NOT NULL, - `action_type` varchar(50) NOT NULL, - `object_id` varchar(24) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `permissions` --- - -INSERT INTO `permissions` (`id`, `name`, `object_type`, `action_type`, `object_id`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES -('6511f58a6740bf0001d140ad', 'Export database', 'db', 'exportContent', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ae', 'Import database', 'db', 'importContent', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140af', 'Delete all content', 'db', 'deleteAllContent', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b0', 'Send mail', 'mail', 'send', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b1', 'Browse notifications', 'notification', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b2', 'Add notifications', 'notification', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b3', 'Delete notifications', 'notification', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b4', 'Browse posts', 'post', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b5', 'Read posts', 'post', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b6', 'Edit posts', 'post', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b7', 'Add posts', 'post', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b8', 'Delete posts', 'post', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140b9', 'Browse settings', 'setting', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ba', 'Read settings', 'setting', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140bb', 'Edit settings', 'setting', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140bc', 'Generate slugs', 'slug', 'generate', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140bd', 'Browse tags', 'tag', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140be', 'Read tags', 'tag', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140bf', 'Edit tags', 'tag', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c0', 'Add tags', 'tag', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c1', 'Delete tags', 'tag', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c2', 'Browse themes', 'theme', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c3', 'Edit themes', 'theme', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c4', 'Activate themes', 'theme', 'activate', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c5', 'Upload themes', 'theme', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c6', 'Download themes', 'theme', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c7', 'Delete themes', 'theme', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c8', 'Browse users', 'user', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140c9', 'Read users', 'user', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ca', 'Edit users', 'user', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140cb', 'Add users', 'user', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140cc', 'Delete users', 'user', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140cd', 'Assign a role', 'role', 'assign', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ce', 'Browse roles', 'role', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140cf', 'Browse invites', 'invite', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d0', 'Read invites', 'invite', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d1', 'Edit invites', 'invite', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d2', 'Add invites', 'invite', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d3', 'Delete invites', 'invite', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d4', 'Download redirects', 'redirect', 'download', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d5', 'Upload redirects', 'redirect', 'upload', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d6', 'Add webhooks', 'webhook', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d7', 'Edit webhooks', 'webhook', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d8', 'Delete webhooks', 'webhook', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140d9', 'Browse integrations', 'integration', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140da', 'Read integrations', 'integration', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140db', 'Edit integrations', 'integration', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140dc', 'Add integrations', 'integration', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140dd', 'Delete integrations', 'integration', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140de', 'Browse API keys', 'api_key', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140df', 'Read API keys', 'api_key', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e0', 'Edit API keys', 'api_key', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e1', 'Add API keys', 'api_key', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e2', 'Delete API keys', 'api_key', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e3', 'Browse Actions', 'action', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e4', 'Browse Members', 'member', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e5', 'Read Members', 'member', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e6', 'Edit Members', 'member', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e7', 'Add Members', 'member', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e8', 'Delete Members', 'member', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140e9', 'Browse Products', 'product', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ea', 'Read Products', 'product', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140eb', 'Edit Products', 'product', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ec', 'Add Products', 'product', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ed', 'Delete Products', 'product', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ee', 'Publish posts', 'post', 'publish', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ef', 'Backup database', 'db', 'backupContent', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f0', 'Email preview', 'email_preview', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f1', 'Send test email', 'email_preview', 'sendTestEmail', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f2', 'Browse emails', 'email', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f3', 'Read emails', 'email', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f4', 'Retry emails', 'email', 'retry', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f5', 'Browse labels', 'label', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f6', 'Read labels', 'label', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f7', 'Edit labels', 'label', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f8', 'Add labels', 'label', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140f9', 'Delete labels', 'label', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140fa', 'Read member signin urls', 'member_signin_url', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140fb', 'Read identities', 'identity', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140fc', 'Auth Stripe Connect for Members', 'members_stripe_connect', 'auth', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140fd', 'Browse snippets', 'snippet', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140fe', 'Read snippets', 'snippet', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ff', 'Edit snippets', 'snippet', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14100', 'Add snippets', 'snippet', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14101', 'Delete snippets', 'snippet', 'destroy', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14102', 'Browse offers', 'offer', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14103', 'Read offers', 'offer', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14104', 'Edit offers', 'offer', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14105', 'Add offers', 'offer', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14106', 'Reset all passwords', 'authentication', 'resetAllPasswords', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14107', 'Browse custom theme settings', 'custom_theme_setting', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14108', 'Edit custom theme settings', 'custom_theme_setting', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d14109', 'Browse newsletters', 'newsletter', 'browse', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d1410a', 'Read newsletters', 'newsletter', 'read', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d1410b', 'Add newsletters', 'newsletter', 'add', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d1410c', 'Edit newsletters', 'newsletter', 'edit', NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f844cd1c0b00017156b3', 'Browse comments', 'comment', 'browse', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156b6', 'Read comments', 'comment', 'read', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156b9', 'Edit comments', 'comment', 'edit', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156bc', 'Add comments', 'comment', 'add', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156bf', 'Delete comments', 'comment', 'destroy', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156c2', 'Moderate comments', 'comment', 'moderate', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156c5', 'Like comments', 'comment', 'like', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156c8', 'Unlike comments', 'comment', 'unlike', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156cd', 'Read explore data', 'explore', 'read', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f844cd1c0b00017156d3', 'Report comments', 'comment', 'report', NULL, '2023-09-25 21:14:44', '1', '2023-09-25 21:14:44', '1'), -('6511f845cd1c0b00017156d7', 'Browse links', 'link', 'browse', NULL, '2023-09-25 21:14:45', '1', '2023-09-25 21:14:45', '1'), -('6511f845cd1c0b00017156da', 'Edit links', 'link', 'edit', NULL, '2023-09-25 21:14:45', '1', '2023-09-25 21:14:45', '1'), -('6511f845cd1c0b00017156de', 'View active theme details', 'theme', 'readActive', NULL, '2023-09-25 21:14:45', '1', '2023-09-25 21:14:45', '1'), -('6511f846cd1c0b00017156e4', 'Browse mentions', 'mention', 'browse', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b00017156f6', 'Browse collections', 'collection', 'browse', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b00017156fc', 'Read collections', 'collection', 'read', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b0001715702', 'Edit collections', 'collection', 'edit', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b0001715706', 'Add collections', 'collection', 'add', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b000171570b', 'Delete collections', 'collection', 'destroy', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b0001715714', 'Browse recommendations', 'recommendation', 'browse', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b000171571a', 'Read recommendations', 'recommendation', 'read', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b0001715720', 'Edit recommendations', 'recommendation', 'edit', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b0001715723', 'Add recommendations', 'recommendation', 'add', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'), -('6511f846cd1c0b0001715726', 'Delete recommendations', 'recommendation', 'destroy', NULL, '2023-09-25 21:14:46', '1', '2023-09-25 21:14:46', '1'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `permissions_roles` --- - -CREATE TABLE `permissions_roles` ( - `id` varchar(24) NOT NULL, - `role_id` varchar(24) NOT NULL, - `permission_id` varchar(24) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `permissions_roles` --- - -INSERT INTO `permissions_roles` (`id`, `role_id`, `permission_id`) VALUES -('6511f58b6740bf0001d14117', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ad'), -('6511f58b6740bf0001d14118', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ae'), -('6511f58b6740bf0001d14119', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140af'), -('6511f58b6740bf0001d1411a', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ef'), -('6511f58b6740bf0001d1411b', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b0'), -('6511f58b6740bf0001d1411c', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b1'), -('6511f58b6740bf0001d1411d', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b2'), -('6511f58b6740bf0001d1411e', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b3'), -('6511f58b6740bf0001d1411f', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b4'), -('6511f58b6740bf0001d14120', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b5'), -('6511f58b6740bf0001d14121', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b6'), -('6511f58b6740bf0001d14122', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b7'), -('6511f58b6740bf0001d14123', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b8'), -('6511f58b6740bf0001d14124', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ee'), -('6511f58b6740bf0001d14125', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140b9'), -('6511f58b6740bf0001d14126', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ba'), -('6511f58b6740bf0001d14127', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140bb'), -('6511f58b6740bf0001d14128', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140bc'), -('6511f58b6740bf0001d14129', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140bd'), -('6511f58b6740bf0001d1412a', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140be'), -('6511f58b6740bf0001d1412b', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140bf'), -('6511f58b6740bf0001d1412c', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c0'), -('6511f58b6740bf0001d1412d', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c1'), -('6511f58b6740bf0001d1412e', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c2'), -('6511f58b6740bf0001d1412f', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c3'), -('6511f58b6740bf0001d14130', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c4'), -('6511f58b6740bf0001d14131', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c5'), -('6511f58b6740bf0001d14132', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c6'), -('6511f58b6740bf0001d14133', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c7'), -('6511f58b6740bf0001d14134', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c8'), -('6511f58b6740bf0001d14135', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140c9'), -('6511f58b6740bf0001d14136', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ca'), -('6511f58b6740bf0001d14137', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140cb'), -('6511f58b6740bf0001d14138', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140cc'), -('6511f58b6740bf0001d14139', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140cd'), -('6511f58b6740bf0001d1413a', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ce'), -('6511f58b6740bf0001d1413b', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140cf'), -('6511f58b6740bf0001d1413c', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d0'), -('6511f58b6740bf0001d1413d', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d1'), -('6511f58b6740bf0001d1413e', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d2'), -('6511f58b6740bf0001d1413f', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d3'), -('6511f58b6740bf0001d14140', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d4'), -('6511f58b6740bf0001d14141', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d5'), -('6511f58b6740bf0001d14142', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d6'), -('6511f58b6740bf0001d14143', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d7'), -('6511f58b6740bf0001d14144', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d8'), -('6511f58b6740bf0001d14145', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140d9'), -('6511f58b6740bf0001d14146', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140da'), -('6511f58b6740bf0001d14147', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140db'), -('6511f58b6740bf0001d14148', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140dc'), -('6511f58b6740bf0001d14149', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140dd'), -('6511f58b6740bf0001d1414a', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140de'), -('6511f58b6740bf0001d1414b', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140df'), -('6511f58b6740bf0001d1414c', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e0'), -('6511f58b6740bf0001d1414d', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e1'), -('6511f58b6740bf0001d1414e', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e2'), -('6511f58b6740bf0001d1414f', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e3'), -('6511f58b6740bf0001d14150', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e4'), -('6511f58b6740bf0001d14151', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e5'), -('6511f58b6740bf0001d14152', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e6'), -('6511f58b6740bf0001d14153', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e7'), -('6511f58b6740bf0001d14154', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e8'), -('6511f58b6740bf0001d14155', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140e9'), -('6511f58b6740bf0001d14156', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ea'), -('6511f58b6740bf0001d14157', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140eb'), -('6511f58b6740bf0001d14158', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ec'), -('6511f58b6740bf0001d14159', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ed'), -('6511f58b6740bf0001d1415a', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f5'), -('6511f58b6740bf0001d1415b', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f6'), -('6511f58b6740bf0001d1415c', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f7'), -('6511f58b6740bf0001d1415d', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f8'), -('6511f58b6740bf0001d1415e', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f9'), -('6511f58b6740bf0001d1415f', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f0'), -('6511f58b6740bf0001d14160', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f1'), -('6511f58b6740bf0001d14161', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f2'), -('6511f58b6740bf0001d14162', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f3'), -('6511f58b6740bf0001d14163', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140f4'), -('6511f58b6740bf0001d14164', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140fa'), -('6511f58b6740bf0001d14165', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140fd'), -('6511f58b6740bf0001d14166', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140fe'), -('6511f58b6740bf0001d14167', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140ff'), -('6511f58b6740bf0001d14168', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14100'), -('6511f58b6740bf0001d14169', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14101'), -('6511f58b6740bf0001d1416a', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14107'), -('6511f58b6740bf0001d1416b', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14108'), -('6511f58b6740bf0001d1416c', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14102'), -('6511f58b6740bf0001d1416d', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14103'), -('6511f58b6740bf0001d1416e', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14104'), -('6511f58b6740bf0001d1416f', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14105'), -('6511f58b6740bf0001d14170', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14106'), -('6511f58b6740bf0001d14171', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d140fc'), -('6511f58b6740bf0001d14172', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d14109'), -('6511f58b6740bf0001d14173', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d1410a'), -('6511f58b6740bf0001d14174', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d1410b'), -('6511f58b6740bf0001d14175', '6511f58a6740bf0001d140a5', '6511f58a6740bf0001d1410c'), -('6511f58b6740bf0001d14176', '6511f58a6740bf0001d140ab', '6511f58a6740bf0001d140ad'), -('6511f58b6740bf0001d14177', '6511f58a6740bf0001d140ab', '6511f58a6740bf0001d140ae'), -('6511f58b6740bf0001d14178', '6511f58a6740bf0001d140ab', '6511f58a6740bf0001d140af'), -('6511f58b6740bf0001d14179', '6511f58a6740bf0001d140ab', '6511f58a6740bf0001d140ef'), -('6511f58b6740bf0001d1417a', '6511f58a6740bf0001d140ac', '6511f58a6740bf0001d140ee'), -('6511f58b6740bf0001d1417b', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b0'), -('6511f58b6740bf0001d1417c', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b1'), -('6511f58b6740bf0001d1417d', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b2'), -('6511f58b6740bf0001d1417e', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b3'), -('6511f58b6740bf0001d1417f', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b4'), -('6511f58b6740bf0001d14180', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b5'), -('6511f58b6740bf0001d14181', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b6'), -('6511f58b6740bf0001d14182', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b7'), -('6511f58b6740bf0001d14183', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b8'), -('6511f58b6740bf0001d14184', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140ee'), -('6511f58b6740bf0001d14185', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140b9'), -('6511f58b6740bf0001d14186', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140ba'), -('6511f58b6740bf0001d14187', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140bb'), -('6511f58b6740bf0001d14188', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140bc'), -('6511f58b6740bf0001d14189', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140bd'), -('6511f58b6740bf0001d1418a', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140be'), -('6511f58b6740bf0001d1418b', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140bf'), -('6511f58b6740bf0001d1418c', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c0'), -('6511f58b6740bf0001d1418d', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c1'), -('6511f58b6740bf0001d1418e', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c2'), -('6511f58b6740bf0001d1418f', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c3'), -('6511f58b6740bf0001d14190', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c4'), -('6511f58b6740bf0001d14191', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c5'), -('6511f58b6740bf0001d14192', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c6'), -('6511f58b6740bf0001d14193', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c7'), -('6511f58b6740bf0001d14194', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c8'), -('6511f58b6740bf0001d14195', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140c9'), -('6511f58b6740bf0001d14196', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140ca'), -('6511f58b6740bf0001d14197', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140cb'), -('6511f58b6740bf0001d14198', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140cc'), -('6511f58b6740bf0001d14199', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140cd'), -('6511f58b6740bf0001d1419a', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140ce'), -('6511f58b6740bf0001d1419b', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140cf'), -('6511f58b6740bf0001d1419c', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d0'), -('6511f58b6740bf0001d1419d', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d1'), -('6511f58b6740bf0001d1419e', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d2'), -('6511f58b6740bf0001d1419f', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d3'), -('6511f58b6740bf0001d141a0', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d4'), -('6511f58b6740bf0001d141a1', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d5'), -('6511f58b6740bf0001d141a2', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d6'), -('6511f58b6740bf0001d141a3', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d7'), -('6511f58b6740bf0001d141a4', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140d8'), -('6511f58b6740bf0001d141a5', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140e3'), -('6511f58b6740bf0001d141a6', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140e4'), -('6511f58b6740bf0001d141a7', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140e5'), -('6511f58b6740bf0001d141a8', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140e6'), -('6511f58b6740bf0001d141a9', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140e7'), -('6511f58b6740bf0001d141aa', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140e8'), -('6511f58b6740bf0001d141ab', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f5'), -('6511f58b6740bf0001d141ac', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f6'), -('6511f58b6740bf0001d141ad', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f7'), -('6511f58b6740bf0001d141ae', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f8'), -('6511f58b6740bf0001d141af', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f9'), -('6511f58b6740bf0001d141b0', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f0'), -('6511f58b6740bf0001d141b1', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f1'), -('6511f58b6740bf0001d141b2', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f2'), -('6511f58b6740bf0001d141b3', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f3'), -('6511f58b6740bf0001d141b4', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140f4'), -('6511f58b6740bf0001d141b5', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140fd'), -('6511f58b6740bf0001d141b6', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140fe'), -('6511f58b6740bf0001d141b7', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140ff'), -('6511f58b6740bf0001d141b8', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d14100'), -('6511f58b6740bf0001d141b9', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d14101'), -('6511f58b6740bf0001d141ba', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140e9'), -('6511f58b6740bf0001d141bb', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140ea'), -('6511f58b6740bf0001d141bc', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140eb'), -('6511f58b6740bf0001d141bd', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d140ec'), -('6511f58b6740bf0001d141be', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d14102'), -('6511f58b6740bf0001d141bf', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d14103'), -('6511f58b6740bf0001d141c0', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d14104'), -('6511f58b6740bf0001d141c1', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d14105'), -('6511f58b6740bf0001d141c2', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b1'), -('6511f58b6740bf0001d141c3', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b2'), -('6511f58b6740bf0001d141c4', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b3'), -('6511f58b6740bf0001d141c5', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b4'), -('6511f58b6740bf0001d141c6', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b5'), -('6511f58b6740bf0001d141c7', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b6'), -('6511f58b6740bf0001d141c8', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b7'), -('6511f58b6740bf0001d141c9', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b8'), -('6511f58b6740bf0001d141ca', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140ee'), -('6511f58b6740bf0001d141cb', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140b9'), -('6511f58b6740bf0001d141cc', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140ba'), -('6511f58b6740bf0001d141cd', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140bc'), -('6511f58b6740bf0001d141ce', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140bd'), -('6511f58b6740bf0001d141cf', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140be'), -('6511f58b6740bf0001d141d0', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140bf'), -('6511f58b6740bf0001d141d1', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140c0'), -('6511f58b6740bf0001d141d2', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140c1'), -('6511f58b6740bf0001d141d3', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140c8'), -('6511f58b6740bf0001d141d4', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140c9'), -('6511f58b6740bf0001d141d5', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140ca'), -('6511f58b6740bf0001d141d6', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140cb'), -('6511f58b6740bf0001d141d7', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140cc'), -('6511f58b6740bf0001d141d8', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140cd'), -('6511f58b6740bf0001d141d9', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140ce'), -('6511f58b6740bf0001d141da', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140cf'), -('6511f58b6740bf0001d141db', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140d0'), -('6511f58b6740bf0001d141dc', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140d1'), -('6511f58b6740bf0001d141dd', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140d2'), -('6511f58b6740bf0001d141de', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140d3'), -('6511f58b6740bf0001d141df', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140c2'), -('6511f58b6740bf0001d141e0', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140f0'), -('6511f58b6740bf0001d141e1', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140f1'), -('6511f58b6740bf0001d141e2', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140f2'), -('6511f58b6740bf0001d141e3', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140f3'), -('6511f58b6740bf0001d141e4', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140f4'), -('6511f58b6740bf0001d141e5', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140fd'), -('6511f58b6740bf0001d141e6', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140fe'), -('6511f58b6740bf0001d141e7', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140ff'), -('6511f58b6740bf0001d141e8', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d14100'), -('6511f58b6740bf0001d141e9', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d14101'), -('6511f58b6740bf0001d141ea', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140f5'), -('6511f58b6740bf0001d141eb', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140f6'), -('6511f58b6740bf0001d141ec', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140e9'), -('6511f58b6740bf0001d141ed', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d140ea'), -('6511f58b6740bf0001d141ee', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140b4'), -('6511f58b6740bf0001d141ef', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140b5'), -('6511f58b6740bf0001d141f0', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140b7'), -('6511f58b6740bf0001d141f1', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140b9'), -('6511f58b6740bf0001d141f2', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140ba'), -('6511f58b6740bf0001d141f3', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140bc'), -('6511f58b6740bf0001d141f4', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140bd'), -('6511f58b6740bf0001d141f5', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140be'), -('6511f58b6740bf0001d141f6', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140c0'), -('6511f58b6740bf0001d141f7', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140c8'), -('6511f58b6740bf0001d141f8', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140c9'), -('6511f58b6740bf0001d141f9', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140ce'), -('6511f58b6740bf0001d141fa', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140c2'), -('6511f58b6740bf0001d141fb', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140f0'), -('6511f58b6740bf0001d141fc', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140f3'), -('6511f58b6740bf0001d141fd', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140fd'), -('6511f58b6740bf0001d141fe', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140fe'), -('6511f58b6740bf0001d141ff', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140e9'), -('6511f58b6740bf0001d14200', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140ea'), -('6511f58b6740bf0001d14201', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140b4'), -('6511f58b6740bf0001d14202', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140b5'), -('6511f58b6740bf0001d14203', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140b7'), -('6511f58b6740bf0001d14204', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140b9'), -('6511f58b6740bf0001d14205', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140ba'), -('6511f58b6740bf0001d14206', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140bc'), -('6511f58b6740bf0001d14207', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140bd'), -('6511f58b6740bf0001d14208', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140be'), -('6511f58b6740bf0001d14209', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140c8'), -('6511f58b6740bf0001d1420a', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140c9'), -('6511f58b6740bf0001d1420b', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140ce'), -('6511f58b6740bf0001d1420c', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140c2'), -('6511f58b6740bf0001d1420d', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140f0'), -('6511f58b6740bf0001d1420e', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140f3'), -('6511f58b6740bf0001d1420f', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140fd'), -('6511f58b6740bf0001d14210', '6511f58a6740bf0001d140a8', '6511f58a6740bf0001d140fe'), -('6511f844cd1c0b00017156a7', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d14109'), -('6511f844cd1c0b00017156a8', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d1410a'), -('6511f844cd1c0b00017156a9', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d1410c'), -('6511f844cd1c0b00017156aa', '6511f58a6740bf0001d140aa', '6511f58a6740bf0001d1410b'), -('6511f844cd1c0b00017156ad', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d14109'), -('6511f844cd1c0b00017156ae', '6511f58a6740bf0001d140a6', '6511f58a6740bf0001d1410a'), -('6511f844cd1c0b00017156af', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d14109'), -('6511f844cd1c0b00017156b0', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d1410a'), -('6511f844cd1c0b00017156b1', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140f5'), -('6511f844cd1c0b00017156b2', '6511f58a6740bf0001d140a7', '6511f58a6740bf0001d140f6'), -('6511f844cd1c0b00017156b4', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156b3'), -('6511f844cd1c0b00017156b5', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156b3'), -('6511f844cd1c0b00017156b7', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156b6'), -('6511f844cd1c0b00017156b8', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156b6'), -('6511f844cd1c0b00017156ba', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156b9'), -('6511f844cd1c0b00017156bb', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156b9'), -('6511f844cd1c0b00017156bd', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156bc'), -('6511f844cd1c0b00017156be', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156bc'), -('6511f844cd1c0b00017156c0', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156bf'), -('6511f844cd1c0b00017156c1', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156bf'), -('6511f844cd1c0b00017156c3', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156c2'), -('6511f844cd1c0b00017156c4', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156c2'), -('6511f844cd1c0b00017156c6', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156c5'), -('6511f844cd1c0b00017156c7', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156c5'), -('6511f844cd1c0b00017156c9', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156c8'), -('6511f844cd1c0b00017156ca', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156c8'), -('6511f844cd1c0b00017156ce', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156cd'), -('6511f844cd1c0b00017156cf', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156cd'), -('6511f844cd1c0b00017156d0', '6511f844cd1c0b00017156cc', '6511f844cd1c0b00017156cd'), -('6511f844cd1c0b00017156d4', '6511f58a6740bf0001d140a5', '6511f844cd1c0b00017156d3'), -('6511f844cd1c0b00017156d5', '6511f58a6740bf0001d140aa', '6511f844cd1c0b00017156d3'), -('6511f845cd1c0b00017156d8', '6511f58a6740bf0001d140a5', '6511f845cd1c0b00017156d7'), -('6511f845cd1c0b00017156d9', '6511f58a6740bf0001d140aa', '6511f845cd1c0b00017156d7'), -('6511f845cd1c0b00017156db', '6511f58a6740bf0001d140a5', '6511f845cd1c0b00017156da'), -('6511f845cd1c0b00017156dc', '6511f58a6740bf0001d140aa', '6511f845cd1c0b00017156da'), -('6511f845cd1c0b00017156df', '6511f58a6740bf0001d140a7', '6511f845cd1c0b00017156de'), -('6511f845cd1c0b00017156e0', '6511f58a6740bf0001d140a6', '6511f845cd1c0b00017156de'), -('6511f845cd1c0b00017156e1', '6511f58a6740bf0001d140a5', '6511f845cd1c0b00017156de'), -('6511f845cd1c0b00017156e2', '6511f58a6740bf0001d140aa', '6511f845cd1c0b00017156de'), -('6511f846cd1c0b00017156e5', '6511f58a6740bf0001d140a5', '6511f846cd1c0b00017156e4'), -('6511f846cd1c0b00017156e6', '6511f58a6740bf0001d140aa', '6511f846cd1c0b00017156e4'), -('6511f846cd1c0b00017156e9', '6511f846cd1c0b00017156e8', '6511f58a6740bf0001d140ae'), -('6511f846cd1c0b00017156ea', '6511f846cd1c0b00017156e8', '6511f58a6740bf0001d140e7'), -('6511f846cd1c0b00017156eb', '6511f846cd1c0b00017156e8', '6511f58a6740bf0001d140be'), -('6511f846cd1c0b00017156f7', '6511f58a6740bf0001d140a5', '6511f846cd1c0b00017156f6'), -('6511f846cd1c0b00017156f8', '6511f58a6740bf0001d140aa', '6511f846cd1c0b00017156f6'), -('6511f846cd1c0b00017156f9', '6511f58a6740bf0001d140a6', '6511f846cd1c0b00017156f6'), -('6511f846cd1c0b00017156fa', '6511f58a6740bf0001d140a7', '6511f846cd1c0b00017156f6'), -('6511f846cd1c0b00017156fb', '6511f58a6740bf0001d140a8', '6511f846cd1c0b00017156f6'), -('6511f846cd1c0b00017156fd', '6511f58a6740bf0001d140a5', '6511f846cd1c0b00017156fc'), -('6511f846cd1c0b00017156fe', '6511f58a6740bf0001d140aa', '6511f846cd1c0b00017156fc'), -('6511f846cd1c0b00017156ff', '6511f58a6740bf0001d140a6', '6511f846cd1c0b00017156fc'), -('6511f846cd1c0b0001715700', '6511f58a6740bf0001d140a7', '6511f846cd1c0b00017156fc'), -('6511f846cd1c0b0001715701', '6511f58a6740bf0001d140a8', '6511f846cd1c0b00017156fc'), -('6511f846cd1c0b0001715703', '6511f58a6740bf0001d140a5', '6511f846cd1c0b0001715702'), -('6511f846cd1c0b0001715704', '6511f58a6740bf0001d140aa', '6511f846cd1c0b0001715702'), -('6511f846cd1c0b0001715705', '6511f58a6740bf0001d140a6', '6511f846cd1c0b0001715702'), -('6511f846cd1c0b0001715707', '6511f58a6740bf0001d140a5', '6511f846cd1c0b0001715706'), -('6511f846cd1c0b0001715708', '6511f58a6740bf0001d140aa', '6511f846cd1c0b0001715706'), -('6511f846cd1c0b0001715709', '6511f58a6740bf0001d140a6', '6511f846cd1c0b0001715706'), -('6511f846cd1c0b000171570a', '6511f58a6740bf0001d140a7', '6511f846cd1c0b0001715706'), -('6511f846cd1c0b000171570c', '6511f58a6740bf0001d140a5', '6511f846cd1c0b000171570b'), -('6511f846cd1c0b000171570d', '6511f58a6740bf0001d140aa', '6511f846cd1c0b000171570b'), -('6511f846cd1c0b000171570e', '6511f58a6740bf0001d140a6', '6511f846cd1c0b000171570b'), -('6511f846cd1c0b0001715715', '6511f58a6740bf0001d140a5', '6511f846cd1c0b0001715714'), -('6511f846cd1c0b0001715716', '6511f58a6740bf0001d140aa', '6511f846cd1c0b0001715714'), -('6511f846cd1c0b0001715717', '6511f58a6740bf0001d140a6', '6511f846cd1c0b0001715714'), -('6511f846cd1c0b0001715718', '6511f58a6740bf0001d140a7', '6511f846cd1c0b0001715714'), -('6511f846cd1c0b0001715719', '6511f58a6740bf0001d140a8', '6511f846cd1c0b0001715714'), -('6511f846cd1c0b000171571b', '6511f58a6740bf0001d140a5', '6511f846cd1c0b000171571a'), -('6511f846cd1c0b000171571c', '6511f58a6740bf0001d140aa', '6511f846cd1c0b000171571a'), -('6511f846cd1c0b000171571d', '6511f58a6740bf0001d140a6', '6511f846cd1c0b000171571a'), -('6511f846cd1c0b000171571e', '6511f58a6740bf0001d140a7', '6511f846cd1c0b000171571a'), -('6511f846cd1c0b000171571f', '6511f58a6740bf0001d140a8', '6511f846cd1c0b000171571a'), -('6511f846cd1c0b0001715721', '6511f58a6740bf0001d140a5', '6511f846cd1c0b0001715720'), -('6511f846cd1c0b0001715722', '6511f58a6740bf0001d140aa', '6511f846cd1c0b0001715720'), -('6511f846cd1c0b0001715724', '6511f58a6740bf0001d140a5', '6511f846cd1c0b0001715723'), -('6511f846cd1c0b0001715725', '6511f58a6740bf0001d140aa', '6511f846cd1c0b0001715723'), -('6511f846cd1c0b0001715727', '6511f58a6740bf0001d140a5', '6511f846cd1c0b0001715726'), -('6511f846cd1c0b0001715728', '6511f58a6740bf0001d140aa', '6511f846cd1c0b0001715726'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `permissions_users` --- - -CREATE TABLE `permissions_users` ( - `id` varchar(24) NOT NULL, - `user_id` varchar(24) NOT NULL, - `permission_id` varchar(24) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `posts` --- - -CREATE TABLE `posts` ( - `id` varchar(24) NOT NULL, - `uuid` varchar(36) NOT NULL, - `title` varchar(2000) NOT NULL, - `slug` varchar(191) NOT NULL, - `mobiledoc` longtext DEFAULT NULL, - `html` longtext DEFAULT NULL, - `comment_id` varchar(50) DEFAULT NULL, - `plaintext` longtext DEFAULT NULL, - `feature_image` varchar(2000) DEFAULT NULL, - `featured` tinyint(1) NOT NULL DEFAULT 0, - `type` varchar(50) NOT NULL DEFAULT 'post', - `status` varchar(50) NOT NULL DEFAULT 'draft', - `locale` varchar(6) DEFAULT NULL, - `visibility` varchar(50) NOT NULL DEFAULT 'public', - `email_recipient_filter` text NOT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL, - `published_at` datetime DEFAULT NULL, - `published_by` varchar(24) DEFAULT NULL, - `custom_excerpt` varchar(2000) DEFAULT NULL, - `codeinjection_head` text DEFAULT NULL, - `codeinjection_foot` text DEFAULT NULL, - `custom_template` varchar(100) DEFAULT NULL, - `canonical_url` text DEFAULT NULL, - `newsletter_id` varchar(24) DEFAULT NULL, - `lexical` longtext DEFAULT NULL, - `show_title_and_feature_image` tinyint(1) NOT NULL DEFAULT 1 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `posts` --- - -INSERT INTO `posts` (`id`, `uuid`, `title`, `slug`, `mobiledoc`, `html`, `comment_id`, `plaintext`, `feature_image`, `featured`, `type`, `status`, `locale`, `visibility`, `email_recipient_filter`, `created_at`, `created_by`, `updated_at`, `updated_by`, `published_at`, `published_by`, `custom_excerpt`, `codeinjection_head`, `codeinjection_foot`, `custom_template`, `canonical_url`, `newsletter_id`, `lexical`, `show_title_and_feature_image`) VALUES -('6511f58b6740bf0001d1410d', 'ec448f26-4a46-4de5-b5c4-3ebf6f019750', 'Coming soon', 'coming-soon', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[[\"a\",[\"href\",\"#/portal/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"This is cscherr Blog, a brand new site by Christoph J. Scherr that\'s just getting started. Things will be up and running here shortly, but you can \"],[0,[0],1,\"subscribe\"],[0,[],0,\" in the meantime if you\'d like to stay up to date and receive emails when new content is published!\"]]]],\"ghostVersion\":\"4.0\"}', '

This is cscherr Blog, a brand new site by Christoph J. Scherr that\'s just getting started. Things will be up and running here shortly, but you can subscribe in the meantime if you\'d like to stay up to date and receive emails when new content is published!

', '6511f58b6740bf0001d1410d', 'This is cscherr Blog, a brand new site by Christoph J. Scherr that\'s just\ngetting started. Things will be up and running here shortly, but you can \nsubscribe in the meantime if you\'d like to stay up to date and receive emails\nwhen new content is published!', 'https://static.ghost.org/v4.0.0/images/feature-image.jpg', 0, 'post', 'published', NULL, 'public', 'all', '2023-09-25 21:03:07', '1', '2023-09-25 21:11:16', '6511f58b6740bf0001d1410d', '2023-09-25 21:03:07', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1), -('6511f58b6740bf0001d1410f', '165debda-163b-4435-aa80-aca192466bf7', 'About this site', 'about', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"hr\",{}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"cscherr Blog is an independent publication launched in September 2023 by Christoph J. Scherr. If you subscribe today, you\'ll get full access to the website as well as email newsletters about new content when it\'s available. Your subscription makes this site possible, and allows cscherr Blog to continue to exist. Thank you!\"]]],[1,\"h3\",[[0,[],0,\"Access all areas\"]]],[1,\"p\",[[0,[],0,\"By signing up, you\'ll get access to the full archive of everything that\'s been published before and everything that\'s still to come. Your very own private library.\"]]],[1,\"h3\",[[0,[],0,\"Fresh content, delivered\"]]],[1,\"p\",[[0,[],0,\"Stay up to date with new content sent straight to your inbox! No more worrying about whether you missed something because of a pesky algorithm or news feed.\"]]],[1,\"h3\",[[0,[],0,\"Meet people like you\"]]],[1,\"p\",[[0,[],0,\"Join a community of other subscribers who share the same interests.\"]]],[10,0],[1,\"h3\",[[0,[],0,\"Start your own thing\"]]],[1,\"p\",[[0,[],0,\"Enjoying the experience? Get started for free and set up your very own subscription business using \"],[0,[0],1,\"Ghost\"],[0,[],0,\", the same platform that powers this website.\"]]]],\"ghostVersion\":\"4.0\"}', '

cscherr Blog is an independent publication launched in September 2023 by Christoph J. Scherr. If you subscribe today, you\'ll get full access to the website as well as email newsletters about new content when it\'s available. Your subscription makes this site possible, and allows cscherr Blog to continue to exist. Thank you!

Access all areas

By signing up, you\'ll get access to the full archive of everything that\'s been published before and everything that\'s still to come. Your very own private library.

Fresh content, delivered

Stay up to date with new content sent straight to your inbox! No more worrying about whether you missed something because of a pesky algorithm or news feed.

Meet people like you

Join a community of other subscribers who share the same interests.


Start your own thing

Enjoying the experience? Get started for free and set up your very own subscription business using Ghost, the same platform that powers this website.

', '6511f58b6740bf0001d1410f', 'cscherr Blog is an independent publication launched in September 2023 by\nChristoph J. Scherr. If you subscribe today, you\'ll get full access to the\nwebsite as well as email newsletters about new content when it\'s available. Your\nsubscription makes this site possible, and allows cscherr Blog to continue to\nexist. Thank you!\n\nAccess all areas\nBy signing up, you\'ll get access to the full archive of everything that\'s been\npublished before and everything that\'s still to come. Your very own private\nlibrary.\n\nFresh content, delivered\nStay up to date with new content sent straight to your inbox! No more worrying\nabout whether you missed something because of a pesky algorithm or news feed.\n\nMeet people like you\nJoin a community of other subscribers who share the same interests.\n\n\n--------------------------------------------------------------------------------\n\nStart your own thing\nEnjoying the experience? Get started for free and set up your very own\nsubscription business using Ghost [https://ghost.org], the same platform that\npowers this website.', NULL, 0, 'page', 'published', NULL, 'public', 'all', '2023-09-25 21:03:07', '1', '2023-09-25 21:11:16', '6511f58b6740bf0001d1410f', '2023-09-25 21:03:08', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1), -('6511fc02cd1c0b0001715749', 'b4ddffd1-1ceb-4e8d-839a-46250ccc8386', 'What can i do with pages?', 'what-can-i-do-with-pages', '{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"foo bar qux\"]]]],\"ghostVersion\":\"4.0\"}', '

foo bar qux

', '6511fc02cd1c0b0001715749', 'foo bar qux', NULL, 0, 'page', 'draft', NULL, 'public', 'all', '2023-09-25 21:30:42', '1', '2023-09-25 21:30:50', '1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `posts_authors` --- - -CREATE TABLE `posts_authors` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `author_id` varchar(24) NOT NULL, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `posts_authors` --- - -INSERT INTO `posts_authors` (`id`, `post_id`, `author_id`, `sort_order`) VALUES -('6511f58b6740bf0001d1410e', '6511f58b6740bf0001d1410d', '1', 0), -('6511f58b6740bf0001d14110', '6511f58b6740bf0001d1410f', '1', 0), -('6511fc02cd1c0b000171574a', '6511fc02cd1c0b0001715749', '1', 0); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `posts_meta` --- - -CREATE TABLE `posts_meta` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `og_image` varchar(2000) DEFAULT NULL, - `og_title` varchar(300) DEFAULT NULL, - `og_description` varchar(500) DEFAULT NULL, - `twitter_image` varchar(2000) DEFAULT NULL, - `twitter_title` varchar(300) DEFAULT NULL, - `twitter_description` varchar(500) DEFAULT NULL, - `meta_title` varchar(2000) DEFAULT NULL, - `meta_description` varchar(2000) DEFAULT NULL, - `email_subject` varchar(300) DEFAULT NULL, - `frontmatter` text DEFAULT NULL, - `feature_image_alt` varchar(191) DEFAULT NULL, - `feature_image_caption` text DEFAULT NULL, - `email_only` tinyint(1) NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `posts_products` --- - -CREATE TABLE `posts_products` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `product_id` varchar(24) NOT NULL, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `posts_products` --- - -INSERT INTO `posts_products` (`id`, `post_id`, `product_id`, `sort_order`) VALUES -('6511fc0acd1c0b000171574d', '6511fc02cd1c0b0001715749', '6511f58a6740bf0001d140a1', 0), -('6511fc0acd1c0b000171574e', '6511fc02cd1c0b0001715749', '6511f58a6740bf0001d140a2', 1); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `posts_tags` --- - -CREATE TABLE `posts_tags` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `tag_id` varchar(24) NOT NULL, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `posts_tags` --- - -INSERT INTO `posts_tags` (`id`, `post_id`, `tag_id`, `sort_order`) VALUES -('6511f58b6740bf0001d14211', '6511f58b6740bf0001d1410d', '6511f58a6740bf0001d140a4', 0); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `post_revisions` --- - -CREATE TABLE `post_revisions` ( - `id` varchar(24) NOT NULL, - `post_id` varchar(24) NOT NULL, - `lexical` longtext DEFAULT NULL, - `created_at_ts` bigint(20) NOT NULL, - `created_at` datetime NOT NULL, - `author_id` varchar(24) DEFAULT NULL, - `title` varchar(2000) DEFAULT NULL, - `post_status` varchar(50) DEFAULT 'draft', - `reason` varchar(50) DEFAULT NULL, - `feature_image` varchar(2000) DEFAULT NULL, - `feature_image_caption` text DEFAULT NULL, - `feature_image_alt` varchar(191) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `products` --- - -CREATE TABLE `products` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) NOT NULL, - `slug` varchar(191) NOT NULL, - `active` tinyint(1) NOT NULL DEFAULT 1, - `welcome_page_url` varchar(2000) DEFAULT NULL, - `visibility` varchar(50) NOT NULL DEFAULT 'none', - `monthly_price_id` varchar(24) DEFAULT NULL, - `yearly_price_id` varchar(24) DEFAULT NULL, - `description` varchar(191) DEFAULT NULL, - `type` varchar(50) NOT NULL DEFAULT 'paid', - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL, - `trial_days` int(10) UNSIGNED NOT NULL DEFAULT 0, - `monthly_price` int(10) UNSIGNED DEFAULT NULL, - `yearly_price` int(10) UNSIGNED DEFAULT NULL, - `currency` varchar(50) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `products` --- - -INSERT INTO `products` (`id`, `name`, `slug`, `active`, `welcome_page_url`, `visibility`, `monthly_price_id`, `yearly_price_id`, `description`, `type`, `created_at`, `updated_at`, `trial_days`, `monthly_price`, `yearly_price`, `currency`) VALUES -('6511f58a6740bf0001d140a1', 'Free', 'free', 1, NULL, 'public', NULL, NULL, NULL, 'free', '2023-09-25 21:03:06', '2023-09-25 21:03:06', 0, NULL, NULL, NULL), -('6511f58a6740bf0001d140a2', 'cscherr Blog', 'default-product', 1, NULL, 'public', NULL, NULL, NULL, 'paid', '2023-09-25 21:03:06', '2023-09-25 21:11:16', 0, 500, 5000, 'usd'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `products_benefits` --- - -CREATE TABLE `products_benefits` ( - `id` varchar(24) NOT NULL, - `product_id` varchar(24) NOT NULL, - `benefit_id` varchar(24) NOT NULL, - `sort_order` int(10) UNSIGNED NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `recommendations` --- - -CREATE TABLE `recommendations` ( - `id` varchar(24) NOT NULL, - `url` varchar(2000) NOT NULL, - `title` varchar(2000) NOT NULL, - `excerpt` varchar(2000) DEFAULT NULL, - `featured_image` varchar(2000) DEFAULT NULL, - `favicon` varchar(2000) DEFAULT NULL, - `reason` varchar(2000) DEFAULT NULL, - `one_click_subscribe` tinyint(1) NOT NULL DEFAULT 0, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `recommendation_click_events` --- - -CREATE TABLE `recommendation_click_events` ( - `id` varchar(24) NOT NULL, - `recommendation_id` varchar(24) NOT NULL, - `member_id` varchar(24) DEFAULT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `recommendation_subscribe_events` --- - -CREATE TABLE `recommendation_subscribe_events` ( - `id` varchar(24) NOT NULL, - `recommendation_id` varchar(24) NOT NULL, - `member_id` varchar(24) DEFAULT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `redirects` --- - -CREATE TABLE `redirects` ( - `id` varchar(24) NOT NULL, - `from` varchar(2000) NOT NULL, - `to` varchar(2000) NOT NULL, - `post_id` varchar(24) DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `roles` --- - -CREATE TABLE `roles` ( - `id` varchar(24) NOT NULL, - `name` varchar(50) NOT NULL, - `description` varchar(2000) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `roles` --- - -INSERT INTO `roles` (`id`, `name`, `description`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES -('6511f58a6740bf0001d140a5', 'Administrator', 'Administrators', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140a6', 'Editor', 'Editors', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140a7', 'Author', 'Authors', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140a8', 'Contributor', 'Contributors', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140a9', 'Owner', 'Blog Owner', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140aa', 'Admin Integration', 'External Apps', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ab', 'DB Backup Integration', 'Internal DB Backup Client', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f58a6740bf0001d140ac', 'Scheduler Integration', 'Internal Scheduler Client', '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'), -('6511f844cd1c0b00017156cc', 'Ghost Explore Integration', 'Internal Integration for the Ghost Explore directory', '2023-09-25 21:14:44', '1', NULL, NULL), -('6511f846cd1c0b00017156e8', 'Self-Serve Migration Integration', 'Core Integration for the Ghost Explore directory', '2023-09-25 21:14:46', '1', NULL, NULL); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `roles_users` --- - -CREATE TABLE `roles_users` ( - `id` varchar(24) NOT NULL, - `role_id` varchar(24) NOT NULL, - `user_id` varchar(24) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `roles_users` --- - -INSERT INTO `roles_users` (`id`, `role_id`, `user_id`) VALUES -('6511f58b6740bf0001d14212', '6511f58a6740bf0001d140a9', '1'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `sessions` --- - -CREATE TABLE `sessions` ( - `id` varchar(24) NOT NULL, - `session_id` varchar(32) NOT NULL, - `user_id` varchar(24) NOT NULL, - `session_data` varchar(2000) NOT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `sessions` --- - -INSERT INTO `sessions` (`id`, `session_id`, `user_id`, `session_data`, `created_at`, `updated_at`) VALUES -('6511f774fcc22500013e6093', 'qu4Vs1MtAzDdkku6fwCdrQC97aTUpdA-', '1', '{\"cookie\":{\"originalMaxAge\":15768000000,\"expires\":\"2024-03-26T09:11:16.662Z\",\"secure\":false,\"httpOnly\":true,\"path\":\"/ghost\",\"sameSite\":\"lax\"},\"user_id\":\"1\",\"origin\":\"http://localhost:8081\",\"user_agent\":\"Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0\",\"ip\":\"172.27.0.1\"}', '2023-09-25 21:11:16', '2023-09-25 21:11:16'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `settings` --- - -CREATE TABLE `settings` ( - `id` varchar(24) NOT NULL, - `group` varchar(50) NOT NULL DEFAULT 'core', - `key` varchar(50) NOT NULL, - `value` text DEFAULT NULL, - `type` varchar(50) NOT NULL, - `flags` varchar(50) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `settings` --- - -INSERT INTO `settings` (`id`, `group`, `key`, `value`, `type`, `flags`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES -('6511f58c6740bf0001d14213', 'core', 'db_hash', 'd1f645cf-5585-481b-91ac-6838470ed10f', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14214', 'core', 'routes_hash', '3d180d52c663d173a6be791ef411ed01', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14215', 'core', 'next_update_check', '1695762464', 'number', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:07:44', '1'), -('6511f58c6740bf0001d14216', 'core', 'notifications', '[{\"dismissible\":true,\"location\":\"bottom\",\"status\":\"alert\",\"id\":\"130f7c24-113a-4768-a698-12a8b3422e81\",\"createdAtVersion\":\"4.48.9\",\"custom\":true,\"createdAt\":\"2022-05-26T17:12:51.000Z\",\"type\":\"info\",\"top\":true,\"message\":\"Ghost 5.0 is now available - You are using an old version of Ghost, which means you don\'t have access to the latest features. Read more!\",\"seen\":false,\"addedAt\":\"2023-09-25T21:07:44.536Z\"},{\"dismissible\":true,\"location\":\"bottom\",\"status\":\"alert\",\"id\":\"6511f775fcc22500013e6094\",\"createdAtVersion\":\"4.48.9\",\"type\":\"warn\",\"message\":\"Ghost is currently unable to send email. See https://ghost.org/docs/concepts/config/#mail for instructions.\",\"seen\":false,\"addedAt\":\"2023-09-25T21:11:17.195Z\"}]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:11:17', '1'), -('6511f58c6740bf0001d14217', 'core', 'version_notifications', '[]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14218', 'core', 'admin_session_secret', '6a6ebd1303050e46856d16fa094d754a19373afb4ab0d6e54c2acd1c379ae3bd', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14219', 'core', 'theme_session_secret', '1798fc87f3662244208673217985c9b951371f0f7c98d4580bcc5be265fc37f1', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1421a', 'core', 'ghost_public_key', '-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBAIukDOu3DZaPpECFs75aVG1ycwyRlBk49V7PIcvX8PXDzQ7OCsCF7FFgJQvlg3Kc\nz2vIF4gtSKRU66aBC+T5rJyfj2y5kvi7oVS+5h679tocdpuCfaC7ir//lOt7QdYRGUL4cYWA\nFEGTEdPufgxuJ/JyWc+GIk/EDiWGX95IkUJxAgMBAAE=\n-----END RSA PUBLIC KEY-----\n', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1421b', 'core', 'ghost_private_key', '-----BEGIN RSA PRIVATE KEY-----\nMIICWwIBAAKBgQCLpAzrtw2Wj6RAhbO+WlRtcnMMkZQZOPVezyHL1/D1w80OzgrAhexRYCUL\n5YNynM9ryBeILUikVOumgQvk+aycn49suZL4u6FUvuYeu/baHHabgn2gu4q//5Tre0HWERlC\n+HGFgBRBkxHT7n4MbifyclnPhiJPxA4lhl/eSJFCcQIDAQABAoGARPvuRiRQWijsA9QJT+hf\n/RGlNHhWqX8x+HxrPcCYEVGBY+b1+NYwQKM2qgHgRiahcaWPun5kfIpXQBJQRfXyB1LGA4NE\naxYrrt8YeYQSWOgSJnZUwYBTwWfbTijuV75bTFDpSKCPmwUHrnBDXjzFwpiglG//p9BTYrhp\nKUZs2IECQQDIzxKKRENGhljxXHgapZFV2ZcVSaMm9WrVZX59a2rYmHu0OsF1IvuOPBXfUTgH\n6DU+EZIzOM9iuN+7BHEnoWQ9AkEAsgUwbNtXb/3ISjjN0Dk1FXhnOtNFt1U9ajohvuy+PVmJ\nv2TN9Z+EetnDb8D9IrjxqCS2ZIdD6CvQvUiP/IQWRQJASk2k9JiRtDTeEGFA58s/3d5nsy7O\nOgoxf8jQZyQqIv85NtVO5EMPhe/hwAJTk0lu+gqSaHWq90KlNpRMMnfbmQJAT6HKm6cyYcJg\nSfNG/ZHZkRUe+E1xriTPKCmA1usH3mGjIJ5zEyCcHmgy6Fan5VRdpR1nCWkIk16mLUW8QvTD\nEQJANJwtnLZHwHTo1wgjA1uQelp51YLn9yjbQ5Df/7dMaO9sMYxMM/3JJipVzd9veS/DUw1O\nifVgOQb/9B5emyKJaw==\n-----END RSA PRIVATE KEY-----\n', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1421c', 'core', 'members_public_key', '-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBAMImjUMRGOYJfiP0gZ8VXUZTdeMl/27wZ7y3NnFziKC8FazDWnOvFIiXmuMh2Dx5\nmJ81Hesc6EEujJP+ofkw7AIlyV2qYWtWB/0ESNt9OgblfbUJ3M8u6jkDHziShsmzbvABD5h2\nmXu2Y0+gmbvsFWMOpuG1s/twu5Rc71uwPuQLAgMBAAE=\n-----END RSA PUBLIC KEY-----\n', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1421d', 'core', 'members_private_key', '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDCJo1DERjmCX4j9IGfFV1GU3XjJf9u8Ge8tzZxc4igvBWsw1pzrxSIl5rj\nIdg8eZifNR3rHOhBLoyT/qH5MOwCJcldqmFrVgf9BEjbfToG5X21CdzPLuo5Ax84kobJs27w\nAQ+Ydpl7tmNPoJm77BVjDqbhtbP7cLuUXO9bsD7kCwIDAQABAoGAabro7v8emhfNU/NRq7rM\nwwGsj3kf8+CD/eeghIQwgagr/ZudZKaR/hjhxpOl2Lk3fmxE0Mc7TFP3RplCyBv2SfkmgVT6\n8AGj7MhPbu+p6j96DIUbPIGjsSPwgrkqOEnJqKgW16snk26eaKKIGHtBKrmX/jEosEXIx+tK\nt8WsilECQQD1rYc49aek00wWJSF5iPt3p0a9eRoM1il/YsqIFKCug9Rmz/2oH8cYal6wZwor\nzhkN3SlhONqzD4YmqkcLLPx3AkEAyk7N/0Fonwe+K2/6zmtwjoAy07NM8q22X2pEVwumPkXp\ny76yC/PP+RkJuJME0VLhbnEX76rCh2is9isfHUj+DQJBAMNNjrjOONZEDzFvlRvrtJTbStYn\nJnlb6yNUYtMpKs9xB3IwGGMF2B1luh6b2y8VqT8nONUMAHfmeGvWY6HTwmMCQFAhYopl9/B1\neqdt1SOJfq2SrY8Yh7PfhkrIpoTrwk8MFgxzXcZKLef2ONl4sgHPGCdMeDSfqClGFqvybIKG\n9MkCQFbRN5gF4fDQ+iyaStFgONhlLuv+ICXLCLiiEzyToPe6XiYAyDx0Tf0X3lEyCDii60fl\n5Fu18LSD+ozMLQV52PE=\n-----END RSA PRIVATE KEY-----\n', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1421e', 'core', 'members_email_auth_secret', '7dfb987128b9be01e41c162f2df36ff905ad3a8974f2be404b6c2be0757942ff33f884c3bc459bdc5aee4d21f0c0fc2d6835ee9bae4988a11556ae5483577739', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1421f', 'core', 'members_stripe_webhook_id', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14220', 'core', 'members_stripe_webhook_secret', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14221', 'site', 'title', 'cscherr Blog', 'string', 'PUBLIC', '2023-09-25 21:03:08', '1', '2023-09-25 21:11:16', '1'), -('6511f58c6740bf0001d14222', 'site', 'description', 'Technology, Open-Source Software, Cybersecurity.', 'string', 'PUBLIC', '2023-09-25 21:03:08', '1', '2023-09-25 21:29:54', '1'), -('6511f58c6740bf0001d14223', 'site', 'logo', '', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14224', 'site', 'cover_image', '__GHOST_URL__/content/images/2023/09/The_Great_Wave_off_Kanagawa-original-3.jpg', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:24:38', '1'), -('6511f58c6740bf0001d14225', 'site', 'icon', '__GHOST_URL__/content/images/2023/09/new-PB--wide-margin-.png', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:21:05', '1'), -('6511f58c6740bf0001d14226', 'site', 'accent_color', '#ff7800', 'string', 'PUBLIC', '2023-09-25 21:03:08', '1', '2023-09-25 21:21:05', '1'), -('6511f58c6740bf0001d14227', 'site', 'locale', 'en', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14228', 'site', 'timezone', 'Europe/Amsterdam', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:13:36', '1'), -('6511f58c6740bf0001d14229', 'site', 'codeinjection_head', '', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1422a', 'site', 'codeinjection_foot', '', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1422b', 'site', 'facebook', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:13:36', '1'), -('6511f58c6740bf0001d1422c', 'site', 'twitter', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:13:36', '1'), -('6511f58c6740bf0001d1422d', 'site', 'navigation', '[{\"label\":\"Home\",\"url\":\"/\"},{\"label\":\"About\",\"url\":\"/about/\"}]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1422e', 'site', 'secondary_navigation', '[{\"label\":\"Sign up\",\"url\":\"#/portal/\"}]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1422f', 'site', 'meta_title', 'Personal Blog of Christoph J. Scherr', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:13:36', '1'), -('6511f58c6740bf0001d14230', 'site', 'meta_description', 'Technology, Open-Source Software, Cybersecurity.', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:13:36', '1'), -('6511f58c6740bf0001d14231', 'site', 'og_image', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14232', 'site', 'og_title', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14233', 'site', 'og_description', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14234', 'site', 'twitter_image', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14235', 'site', 'twitter_title', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14236', 'site', 'twitter_description', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14237', 'theme', 'active_theme', 'casper', 'string', 'RO', '2023-09-25 21:03:08', '1', '2023-09-25 21:25:51', '1'), -('6511f58c6740bf0001d14238', 'private', 'is_private', 'false', 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14239', 'private', 'password', '', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1423a', 'private', 'public_hash', '0eb3d21de543d2e5a2e6300c5a3c24', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1423b', 'members', 'default_content_visibility', 'public', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1423c', 'members', 'default_content_visibility_tiers', '[]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1423d', 'members', 'members_signup_access', 'all', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1423f', 'members', 'members_support_address', 'noreply', 'string', 'PUBLIC,RO', '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14244', 'members', 'stripe_secret_key', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14245', 'members', 'stripe_publishable_key', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14246', 'members', 'stripe_plans', '[]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14247', 'members', 'stripe_connect_publishable_key', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14248', 'members', 'stripe_connect_secret_key', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14249', 'members', 'stripe_connect_livemode', NULL, 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1424a', 'members', 'stripe_connect_display_name', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1424b', 'members', 'stripe_connect_account_id', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1424e', 'members', 'members_monthly_price_id', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1424f', 'members', 'members_yearly_price_id', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14250', 'portal', 'portal_name', 'true', 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14251', 'portal', 'portal_button', 'true', 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14252', 'portal', 'portal_plans', '[\"free\"]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14253', 'portal', 'portal_products', '[]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14254', 'portal', 'portal_button_style', 'icon-and-text', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14255', 'portal', 'portal_button_icon', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14256', 'portal', 'portal_button_signup_text', 'Subscribe', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14257', 'email', 'mailgun_domain', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14258', 'email', 'mailgun_api_key', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14259', 'email', 'mailgun_base_url', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1425a', 'email', 'email_track_opens', 'false', 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:26:56', '1'), -('6511f58c6740bf0001d1425b', 'email', 'email_verification_required', 'false', 'boolean', 'RO', '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1425c', 'amp', 'amp', 'false', 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1425d', 'amp', 'amp_gtag_id', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1425e', 'firstpromoter', 'firstpromoter', 'false', 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d1425f', 'firstpromoter', 'firstpromoter_id', NULL, 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14260', 'labs', 'labs', '{}', 'object', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14261', 'slack', 'slack_url', '', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:13:36', '1'), -('6511f58c6740bf0001d14262', 'slack', 'slack_username', 'Ghost', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:13:36', '1'), -('6511f58c6740bf0001d14263', 'unsplash', 'unsplash', 'true', 'boolean', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14264', 'views', 'shared_views', '[]', 'array', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14270', 'editor', 'editor_default_email_recipients', 'visibility', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f58c6740bf0001d14271', 'editor', 'editor_default_email_recipients_filter', 'all', 'string', NULL, '2023-09-25 21:03:08', '1', '2023-09-25 21:03:08', '1'), -('6511f844cd1c0b00017156cb', 'comments', 'comments_enabled', 'off', 'string', NULL, '2023-09-25 21:14:44', '1', NULL, NULL), -('6511f845cd1c0b00017156d6', 'email', 'email_track_clicks', 'false', 'boolean', NULL, '2023-09-25 21:14:45', '1', '2023-09-25 21:26:56', '1'), -('6511f845cd1c0b00017156dd', 'members', 'members_track_sources', 'true', 'boolean', NULL, '2023-09-25 21:14:45', '1', NULL, NULL), -('6511f845cd1c0b00017156e3', 'analytics', 'outbound_link_tagging', 'false', 'boolean', NULL, '2023-09-25 21:14:45', '1', '2023-09-25 21:26:56', '1'), -('6511f846cd1c0b00017156e7', 'core', 'last_mentions_report_email_timestamp', NULL, 'number', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156ee', 'portal', 'portal_signup_terms_html', NULL, 'string', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156ef', 'portal', 'portal_signup_checkbox_required', 'false', 'boolean', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156f0', 'announcement', 'announcement_content', NULL, 'string', 'PUBLIC', '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156f1', 'announcement', 'announcement_background', 'dark', 'string', 'PUBLIC', '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156f2', 'pintura', 'pintura', 'true', 'boolean', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156f3', 'pintura', 'pintura_js_url', NULL, 'string', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156f4', 'pintura', 'pintura_css_url', NULL, 'string', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b00017156f5', 'announcement', 'announcement_visibility', '[]', 'array', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b0001715712', 'donations', 'donations_currency', 'USD', 'string', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b0001715713', 'donations', 'donations_suggested_amount', '0', 'number', NULL, '2023-09-25 21:14:46', '1', NULL, NULL), -('6511f846cd1c0b0001715729', 'recommendations', 'recommendations_enabled', 'false', 'boolean', NULL, '2023-09-25 21:14:46', '1', NULL, NULL); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `snippets` --- - -CREATE TABLE `snippets` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) NOT NULL, - `mobiledoc` longtext NOT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL, - `lexical` longtext DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `stripe_prices` --- - -CREATE TABLE `stripe_prices` ( - `id` varchar(24) NOT NULL, - `stripe_price_id` varchar(255) NOT NULL, - `stripe_product_id` varchar(255) NOT NULL, - `active` tinyint(1) NOT NULL, - `nickname` varchar(50) DEFAULT NULL, - `currency` varchar(191) NOT NULL, - `amount` int(11) NOT NULL, - `type` varchar(50) NOT NULL DEFAULT 'recurring', - `interval` varchar(50) DEFAULT NULL, - `description` varchar(191) DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `stripe_products` --- - -CREATE TABLE `stripe_products` ( - `id` varchar(24) NOT NULL, - `product_id` varchar(24) DEFAULT NULL, - `stripe_product_id` varchar(255) NOT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `subscriptions` --- - -CREATE TABLE `subscriptions` ( - `id` varchar(24) NOT NULL, - `type` varchar(50) NOT NULL, - `status` varchar(50) NOT NULL, - `member_id` varchar(24) NOT NULL, - `tier_id` varchar(24) NOT NULL, - `cadence` varchar(50) DEFAULT NULL, - `currency` varchar(50) DEFAULT NULL, - `amount` int(11) DEFAULT NULL, - `payment_provider` varchar(50) DEFAULT NULL, - `payment_subscription_url` varchar(2000) DEFAULT NULL, - `payment_user_url` varchar(2000) DEFAULT NULL, - `offer_id` varchar(24) DEFAULT NULL, - `expires_at` datetime DEFAULT NULL, - `created_at` datetime NOT NULL, - `updated_at` datetime DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `suppressions` --- - -CREATE TABLE `suppressions` ( - `id` varchar(24) NOT NULL, - `email` varchar(191) NOT NULL, - `email_id` varchar(24) DEFAULT NULL, - `reason` varchar(50) NOT NULL, - `created_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `tags` --- - -CREATE TABLE `tags` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) NOT NULL, - `slug` varchar(191) NOT NULL, - `description` text DEFAULT NULL, - `feature_image` varchar(2000) DEFAULT NULL, - `parent_id` varchar(191) DEFAULT NULL, - `visibility` varchar(50) NOT NULL DEFAULT 'public', - `og_image` varchar(2000) DEFAULT NULL, - `og_title` varchar(300) DEFAULT NULL, - `og_description` varchar(500) DEFAULT NULL, - `twitter_image` varchar(2000) DEFAULT NULL, - `twitter_title` varchar(300) DEFAULT NULL, - `twitter_description` varchar(500) DEFAULT NULL, - `meta_title` varchar(2000) DEFAULT NULL, - `meta_description` varchar(2000) DEFAULT NULL, - `codeinjection_head` text DEFAULT NULL, - `codeinjection_foot` text DEFAULT NULL, - `canonical_url` varchar(2000) DEFAULT NULL, - `accent_color` varchar(50) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `tags` --- - -INSERT INTO `tags` (`id`, `name`, `slug`, `description`, `feature_image`, `parent_id`, `visibility`, `og_image`, `og_title`, `og_description`, `twitter_image`, `twitter_title`, `twitter_description`, `meta_title`, `meta_description`, `codeinjection_head`, `codeinjection_foot`, `canonical_url`, `accent_color`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES -('6511f58a6740bf0001d140a4', 'News', 'news', NULL, NULL, NULL, 'public', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2023-09-25 21:03:06', '1', '2023-09-25 21:03:06', '1'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `temp_mail_events` --- - -CREATE TABLE `temp_mail_events` ( - `id` varchar(100) NOT NULL, - `type` varchar(50) NOT NULL, - `message_id` varchar(150) NOT NULL, - `recipient` varchar(191) NOT NULL, - `occurred_at` datetime NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `tokens` --- - -CREATE TABLE `tokens` ( - `id` varchar(24) NOT NULL, - `token` varchar(32) NOT NULL, - `data` varchar(2000) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `first_used_at` datetime DEFAULT NULL, - `used_count` int(10) UNSIGNED NOT NULL DEFAULT 0 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `tokens` --- - -INSERT INTO `tokens` (`id`, `token`, `data`, `created_at`, `created_by`, `updated_at`, `first_used_at`, `used_count`) VALUES -('6511f6b8fcc22500013e608e', 'KcrdAk9K3NU4q5VKlrCSgQIle4Mv9dE3', '{\"email\":\"admin@cscherr.de\",\"name\":\"admin\"}', '2023-09-25 21:08:08', '6511f6b8fcc22500013e608e', NULL, NULL, 0); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `users` --- - -CREATE TABLE `users` ( - `id` varchar(24) NOT NULL, - `name` varchar(191) NOT NULL, - `slug` varchar(191) NOT NULL, - `password` varchar(60) NOT NULL, - `email` varchar(191) NOT NULL, - `profile_image` varchar(2000) DEFAULT NULL, - `cover_image` varchar(2000) DEFAULT NULL, - `bio` text DEFAULT NULL, - `website` varchar(2000) DEFAULT NULL, - `location` text DEFAULT NULL, - `facebook` varchar(2000) DEFAULT NULL, - `twitter` varchar(2000) DEFAULT NULL, - `accessibility` text DEFAULT NULL, - `status` varchar(50) NOT NULL DEFAULT 'active', - `locale` varchar(6) DEFAULT NULL, - `visibility` varchar(50) NOT NULL DEFAULT 'public', - `meta_title` varchar(2000) DEFAULT NULL, - `meta_description` varchar(2000) DEFAULT NULL, - `tour` text DEFAULT NULL, - `last_seen` datetime DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL, - `comment_notifications` tinyint(1) NOT NULL DEFAULT 1, - `free_member_signup_notification` tinyint(1) NOT NULL DEFAULT 1, - `paid_subscription_canceled_notification` tinyint(1) NOT NULL DEFAULT 0, - `paid_subscription_started_notification` tinyint(1) NOT NULL DEFAULT 1, - `mention_notifications` tinyint(1) NOT NULL DEFAULT 1, - `milestone_notifications` tinyint(1) NOT NULL DEFAULT 1, - `donation_notifications` tinyint(1) NOT NULL DEFAULT 1 -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `users` --- - -INSERT INTO `users` (`id`, `name`, `slug`, `password`, `email`, `profile_image`, `cover_image`, `bio`, `website`, `location`, `facebook`, `twitter`, `accessibility`, `status`, `locale`, `visibility`, `meta_title`, `meta_description`, `tour`, `last_seen`, `created_at`, `created_by`, `updated_at`, `updated_by`, `comment_notifications`, `free_member_signup_notification`, `paid_subscription_canceled_notification`, `paid_subscription_started_notification`, `mention_notifications`, `milestone_notifications`, `donation_notifications`) VALUES -('1', 'Christoph J. Scherr', 'christoph', '$2a$10$ugGf8ugWBgKOUXL39oT15./jmTQJRZDtYEr6aX4swILDUBle4pDWq', 'contact@cscherr.de', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '{\"nightShift\":true}', 'active', NULL, 'public', NULL, NULL, NULL, '2023-09-25 21:11:16', '2023-09-25 21:03:06', '1', '2023-09-25 21:16:27', '1', 1, 1, 0, 1, 1, 1, 1); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `webhooks` --- - -CREATE TABLE `webhooks` ( - `id` varchar(24) NOT NULL, - `event` varchar(50) NOT NULL, - `target_url` varchar(2000) NOT NULL, - `name` varchar(191) DEFAULT NULL, - `secret` varchar(191) DEFAULT NULL, - `api_version` varchar(50) NOT NULL DEFAULT 'v2', - `integration_id` varchar(24) NOT NULL, - `last_triggered_at` datetime DEFAULT NULL, - `last_triggered_status` varchar(50) DEFAULT NULL, - `last_triggered_error` varchar(50) DEFAULT NULL, - `created_at` datetime NOT NULL, - `created_by` varchar(24) NOT NULL, - `updated_at` datetime DEFAULT NULL, - `updated_by` varchar(24) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Indizes der exportierten Tabellen --- - --- --- Indizes für die Tabelle `actions` --- -ALTER TABLE `actions` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `api_keys` --- -ALTER TABLE `api_keys` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `api_keys_secret_unique` (`secret`); - --- --- Indizes für die Tabelle `benefits` --- -ALTER TABLE `benefits` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `benefits_slug_unique` (`slug`); - --- --- Indizes für die Tabelle `brute` --- -ALTER TABLE `brute` - ADD PRIMARY KEY (`key`); - --- --- Indizes für die Tabelle `collections` --- -ALTER TABLE `collections` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `collections_slug_unique` (`slug`); - --- --- Indizes für die Tabelle `collections_posts` --- -ALTER TABLE `collections_posts` - ADD PRIMARY KEY (`id`), - ADD KEY `collections_posts_collection_id_foreign` (`collection_id`), - ADD KEY `collections_posts_post_id_foreign` (`post_id`); - --- --- Indizes für die Tabelle `comments` --- -ALTER TABLE `comments` - ADD PRIMARY KEY (`id`), - ADD KEY `comments_post_id_foreign` (`post_id`), - ADD KEY `comments_member_id_foreign` (`member_id`), - ADD KEY `comments_parent_id_foreign` (`parent_id`); - --- --- Indizes für die Tabelle `comment_likes` --- -ALTER TABLE `comment_likes` - ADD PRIMARY KEY (`id`), - ADD KEY `comment_likes_comment_id_foreign` (`comment_id`), - ADD KEY `comment_likes_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `comment_reports` --- -ALTER TABLE `comment_reports` - ADD PRIMARY KEY (`id`), - ADD KEY `comment_reports_comment_id_foreign` (`comment_id`), - ADD KEY `comment_reports_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `custom_theme_settings` --- -ALTER TABLE `custom_theme_settings` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `donation_payment_events` --- -ALTER TABLE `donation_payment_events` - ADD PRIMARY KEY (`id`), - ADD KEY `donation_payment_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `emails` --- -ALTER TABLE `emails` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `emails_post_id_unique` (`post_id`), - ADD KEY `emails_post_id_index` (`post_id`), - ADD KEY `emails_newsletter_id_foreign` (`newsletter_id`); - --- --- Indizes für die Tabelle `email_batches` --- -ALTER TABLE `email_batches` - ADD PRIMARY KEY (`id`), - ADD KEY `email_batches_email_id_foreign` (`email_id`); - --- --- Indizes für die Tabelle `email_recipients` --- -ALTER TABLE `email_recipients` - ADD PRIMARY KEY (`id`), - ADD KEY `email_recipients_member_id_index` (`member_id`), - ADD KEY `email_recipients_batch_id_foreign` (`batch_id`), - ADD KEY `email_recipients_delivered_at_index` (`delivered_at`), - ADD KEY `email_recipients_opened_at_index` (`opened_at`), - ADD KEY `email_recipients_failed_at_index` (`failed_at`), - ADD KEY `email_recipients_email_id_member_email_index` (`email_id`,`member_email`); - --- --- Indizes für die Tabelle `email_recipient_failures` --- -ALTER TABLE `email_recipient_failures` - ADD PRIMARY KEY (`id`), - ADD KEY `email_recipient_failures_email_id_foreign` (`email_id`), - ADD KEY `email_recipient_failures_email_recipient_id_foreign` (`email_recipient_id`); - --- --- Indizes für die Tabelle `email_spam_complaint_events` --- -ALTER TABLE `email_spam_complaint_events` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `email_spam_complaint_events_email_id_member_id_unique` (`email_id`,`member_id`), - ADD KEY `email_spam_complaint_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `integrations` --- -ALTER TABLE `integrations` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `integrations_slug_unique` (`slug`); - --- --- Indizes für die Tabelle `invites` --- -ALTER TABLE `invites` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `invites_token_unique` (`token`), - ADD UNIQUE KEY `invites_email_unique` (`email`); - --- --- Indizes für die Tabelle `jobs` --- -ALTER TABLE `jobs` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `jobs_name_unique` (`name`); - --- --- Indizes für die Tabelle `labels` --- -ALTER TABLE `labels` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `labels_name_unique` (`name`), - ADD UNIQUE KEY `labels_slug_unique` (`slug`); - --- --- Indizes für die Tabelle `members` --- -ALTER TABLE `members` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `members_email_unique` (`email`), - ADD UNIQUE KEY `members_uuid_unique` (`uuid`), - ADD KEY `members_email_open_rate_index` (`email_open_rate`); - --- --- Indizes für die Tabelle `members_cancel_events` --- -ALTER TABLE `members_cancel_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_cancel_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_click_events` --- -ALTER TABLE `members_click_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_click_events_member_id_foreign` (`member_id`), - ADD KEY `members_click_events_redirect_id_foreign` (`redirect_id`); - --- --- Indizes für die Tabelle `members_created_events` --- -ALTER TABLE `members_created_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_created_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_email_change_events` --- -ALTER TABLE `members_email_change_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_email_change_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_feedback` --- -ALTER TABLE `members_feedback` - ADD PRIMARY KEY (`id`), - ADD KEY `members_feedback_member_id_foreign` (`member_id`), - ADD KEY `members_feedback_post_id_foreign` (`post_id`); - --- --- Indizes für die Tabelle `members_labels` --- -ALTER TABLE `members_labels` - ADD PRIMARY KEY (`id`), - ADD KEY `members_labels_member_id_foreign` (`member_id`), - ADD KEY `members_labels_label_id_foreign` (`label_id`); - --- --- Indizes für die Tabelle `members_login_events` --- -ALTER TABLE `members_login_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_login_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_newsletters` --- -ALTER TABLE `members_newsletters` - ADD PRIMARY KEY (`id`), - ADD KEY `members_newsletters_member_id_foreign` (`member_id`), - ADD KEY `members_newsletters_newsletter_id_foreign` (`newsletter_id`); - --- --- Indizes für die Tabelle `members_paid_subscription_events` --- -ALTER TABLE `members_paid_subscription_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_paid_subscription_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_payment_events` --- -ALTER TABLE `members_payment_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_payment_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_products` --- -ALTER TABLE `members_products` - ADD PRIMARY KEY (`id`), - ADD KEY `members_products_member_id_foreign` (`member_id`), - ADD KEY `members_products_product_id_foreign` (`product_id`); - --- --- Indizes für die Tabelle `members_product_events` --- -ALTER TABLE `members_product_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_product_events_member_id_foreign` (`member_id`), - ADD KEY `members_product_events_product_id_foreign` (`product_id`); - --- --- Indizes für die Tabelle `members_status_events` --- -ALTER TABLE `members_status_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_status_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_stripe_customers` --- -ALTER TABLE `members_stripe_customers` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `members_stripe_customers_customer_id_unique` (`customer_id`), - ADD KEY `members_stripe_customers_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `members_stripe_customers_subscriptions` --- -ALTER TABLE `members_stripe_customers_subscriptions` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `members_stripe_customers_subscriptions_subscription_id_unique` (`subscription_id`), - ADD KEY `members_stripe_customers_subscriptions_customer_id_foreign` (`customer_id`), - ADD KEY `members_stripe_customers_subscriptions_stripe_price_id_index` (`stripe_price_id`), - ADD KEY `members_stripe_customers_subscriptions_offer_id_foreign` (`offer_id`), - ADD KEY `mscs_ghost_subscription_id_foreign` (`ghost_subscription_id`); - --- --- Indizes für die Tabelle `members_subscribe_events` --- -ALTER TABLE `members_subscribe_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_subscribe_events_member_id_foreign` (`member_id`), - ADD KEY `members_subscribe_events_newsletter_id_foreign` (`newsletter_id`); - --- --- Indizes für die Tabelle `members_subscription_created_events` --- -ALTER TABLE `members_subscription_created_events` - ADD PRIMARY KEY (`id`), - ADD KEY `members_subscription_created_events_member_id_foreign` (`member_id`), - ADD KEY `members_subscription_created_events_subscription_id_foreign` (`subscription_id`); - --- --- Indizes für die Tabelle `mentions` --- -ALTER TABLE `mentions` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `migrations` --- -ALTER TABLE `migrations` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `migrations_name_version_unique` (`name`,`version`); - --- --- Indizes für die Tabelle `migrations_lock` --- -ALTER TABLE `migrations_lock` - ADD PRIMARY KEY (`lock_key`); - --- --- Indizes für die Tabelle `milestones` --- -ALTER TABLE `milestones` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `mobiledoc_revisions` --- -ALTER TABLE `mobiledoc_revisions` - ADD PRIMARY KEY (`id`), - ADD KEY `mobiledoc_revisions_post_id_index` (`post_id`); - --- --- Indizes für die Tabelle `newsletters` --- -ALTER TABLE `newsletters` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `newsletters_uuid_unique` (`uuid`), - ADD UNIQUE KEY `newsletters_name_unique` (`name`), - ADD UNIQUE KEY `newsletters_slug_unique` (`slug`); - --- --- Indizes für die Tabelle `offers` --- -ALTER TABLE `offers` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `offers_name_unique` (`name`), - ADD UNIQUE KEY `offers_code_unique` (`code`), - ADD UNIQUE KEY `offers_stripe_coupon_id_unique` (`stripe_coupon_id`), - ADD KEY `offers_product_id_foreign` (`product_id`); - --- --- Indizes für die Tabelle `offer_redemptions` --- -ALTER TABLE `offer_redemptions` - ADD PRIMARY KEY (`id`), - ADD KEY `offer_redemptions_offer_id_foreign` (`offer_id`), - ADD KEY `offer_redemptions_member_id_foreign` (`member_id`), - ADD KEY `offer_redemptions_subscription_id_foreign` (`subscription_id`); - --- --- Indizes für die Tabelle `permissions` --- -ALTER TABLE `permissions` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `permissions_name_unique` (`name`); - --- --- Indizes für die Tabelle `permissions_roles` --- -ALTER TABLE `permissions_roles` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `permissions_users` --- -ALTER TABLE `permissions_users` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `posts` --- -ALTER TABLE `posts` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `posts_slug_type_unique` (`slug`,`type`), - ADD KEY `posts_newsletter_id_foreign` (`newsletter_id`), - ADD KEY `posts_published_at_index` (`published_at`); - --- --- Indizes für die Tabelle `posts_authors` --- -ALTER TABLE `posts_authors` - ADD PRIMARY KEY (`id`), - ADD KEY `posts_authors_post_id_foreign` (`post_id`), - ADD KEY `posts_authors_author_id_foreign` (`author_id`); - --- --- Indizes für die Tabelle `posts_meta` --- -ALTER TABLE `posts_meta` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `posts_meta_post_id_unique` (`post_id`); - --- --- Indizes für die Tabelle `posts_products` --- -ALTER TABLE `posts_products` - ADD PRIMARY KEY (`id`), - ADD KEY `posts_products_post_id_foreign` (`post_id`), - ADD KEY `posts_products_product_id_foreign` (`product_id`); - --- --- Indizes für die Tabelle `posts_tags` --- -ALTER TABLE `posts_tags` - ADD PRIMARY KEY (`id`), - ADD KEY `posts_tags_post_id_foreign` (`post_id`), - ADD KEY `posts_tags_tag_id_foreign` (`tag_id`); - --- --- Indizes für die Tabelle `post_revisions` --- -ALTER TABLE `post_revisions` - ADD PRIMARY KEY (`id`), - ADD KEY `post_revisions_post_id_index` (`post_id`), - ADD KEY `post_revs_author_id_foreign` (`author_id`); - --- --- Indizes für die Tabelle `products` --- -ALTER TABLE `products` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `products_slug_unique` (`slug`); - --- --- Indizes für die Tabelle `products_benefits` --- -ALTER TABLE `products_benefits` - ADD PRIMARY KEY (`id`), - ADD KEY `products_benefits_product_id_foreign` (`product_id`), - ADD KEY `products_benefits_benefit_id_foreign` (`benefit_id`); - --- --- Indizes für die Tabelle `recommendations` --- -ALTER TABLE `recommendations` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `recommendation_click_events` --- -ALTER TABLE `recommendation_click_events` - ADD PRIMARY KEY (`id`), - ADD KEY `recommendation_click_events_recommendation_id_foreign` (`recommendation_id`), - ADD KEY `recommendation_click_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `recommendation_subscribe_events` --- -ALTER TABLE `recommendation_subscribe_events` - ADD PRIMARY KEY (`id`), - ADD KEY `recommendation_subscribe_events_recommendation_id_foreign` (`recommendation_id`), - ADD KEY `recommendation_subscribe_events_member_id_foreign` (`member_id`); - --- --- Indizes für die Tabelle `redirects` --- -ALTER TABLE `redirects` - ADD PRIMARY KEY (`id`), - ADD KEY `redirects_post_id_foreign` (`post_id`); - --- --- Indizes für die Tabelle `roles` --- -ALTER TABLE `roles` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `roles_name_unique` (`name`); - --- --- Indizes für die Tabelle `roles_users` --- -ALTER TABLE `roles_users` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `sessions` --- -ALTER TABLE `sessions` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `sessions_session_id_unique` (`session_id`); - --- --- Indizes für die Tabelle `settings` --- -ALTER TABLE `settings` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `settings_key_unique` (`key`); - --- --- Indizes für die Tabelle `snippets` --- -ALTER TABLE `snippets` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `snippets_name_unique` (`name`); - --- --- Indizes für die Tabelle `stripe_prices` --- -ALTER TABLE `stripe_prices` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `stripe_prices_stripe_price_id_unique` (`stripe_price_id`), - ADD KEY `stripe_prices_stripe_product_id_foreign` (`stripe_product_id`); - --- --- Indizes für die Tabelle `stripe_products` --- -ALTER TABLE `stripe_products` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `stripe_products_stripe_product_id_unique` (`stripe_product_id`), - ADD KEY `stripe_products_product_id_foreign` (`product_id`); - --- --- Indizes für die Tabelle `subscriptions` --- -ALTER TABLE `subscriptions` - ADD PRIMARY KEY (`id`), - ADD KEY `subscriptions_member_id_foreign` (`member_id`), - ADD KEY `subscriptions_tier_id_foreign` (`tier_id`), - ADD KEY `subscriptions_offer_id_foreign` (`offer_id`); - --- --- Indizes für die Tabelle `suppressions` --- -ALTER TABLE `suppressions` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `suppressions_email_unique` (`email`), - ADD KEY `suppressions_email_id_foreign` (`email_id`); - --- --- Indizes für die Tabelle `tags` --- -ALTER TABLE `tags` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `tags_slug_unique` (`slug`); - --- --- Indizes für die Tabelle `temp_mail_events` --- -ALTER TABLE `temp_mail_events` - ADD PRIMARY KEY (`id`); - --- --- Indizes für die Tabelle `tokens` --- -ALTER TABLE `tokens` - ADD PRIMARY KEY (`id`), - ADD KEY `tokens_token_index` (`token`); - --- --- Indizes für die Tabelle `users` --- -ALTER TABLE `users` - ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `users_slug_unique` (`slug`), - ADD UNIQUE KEY `users_email_unique` (`email`); - --- --- Indizes für die Tabelle `webhooks` --- -ALTER TABLE `webhooks` - ADD PRIMARY KEY (`id`), - ADD KEY `webhooks_integration_id_foreign` (`integration_id`); - --- --- AUTO_INCREMENT für exportierte Tabellen --- - --- --- AUTO_INCREMENT für Tabelle `migrations` --- -ALTER TABLE `migrations` - MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=448; - --- --- Constraints der exportierten Tabellen --- - --- --- Constraints der Tabelle `collections_posts` --- -ALTER TABLE `collections_posts` - ADD CONSTRAINT `collections_posts_collection_id_foreign` FOREIGN KEY (`collection_id`) REFERENCES `collections` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `collections_posts_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `comments` --- -ALTER TABLE `comments` - ADD CONSTRAINT `comments_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL, - ADD CONSTRAINT `comments_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `comments_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `comment_likes` --- -ALTER TABLE `comment_likes` - ADD CONSTRAINT `comment_likes_comment_id_foreign` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `comment_likes_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `comment_reports` --- -ALTER TABLE `comment_reports` - ADD CONSTRAINT `comment_reports_comment_id_foreign` FOREIGN KEY (`comment_id`) REFERENCES `comments` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `comment_reports_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL; - --- --- Constraints der Tabelle `donation_payment_events` --- -ALTER TABLE `donation_payment_events` - ADD CONSTRAINT `donation_payment_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL; - --- --- Constraints der Tabelle `emails` --- -ALTER TABLE `emails` - ADD CONSTRAINT `emails_newsletter_id_foreign` FOREIGN KEY (`newsletter_id`) REFERENCES `newsletters` (`id`); - --- --- Constraints der Tabelle `email_batches` --- -ALTER TABLE `email_batches` - ADD CONSTRAINT `email_batches_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `emails` (`id`); - --- --- Constraints der Tabelle `email_recipients` --- -ALTER TABLE `email_recipients` - ADD CONSTRAINT `email_recipients_batch_id_foreign` FOREIGN KEY (`batch_id`) REFERENCES `email_batches` (`id`), - ADD CONSTRAINT `email_recipients_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `emails` (`id`); - --- --- Constraints der Tabelle `email_recipient_failures` --- -ALTER TABLE `email_recipient_failures` - ADD CONSTRAINT `email_recipient_failures_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `emails` (`id`), - ADD CONSTRAINT `email_recipient_failures_email_recipient_id_foreign` FOREIGN KEY (`email_recipient_id`) REFERENCES `email_recipients` (`id`); - --- --- Constraints der Tabelle `email_spam_complaint_events` --- -ALTER TABLE `email_spam_complaint_events` - ADD CONSTRAINT `email_spam_complaint_events_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `emails` (`id`), - ADD CONSTRAINT `email_spam_complaint_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_cancel_events` --- -ALTER TABLE `members_cancel_events` - ADD CONSTRAINT `members_cancel_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_click_events` --- -ALTER TABLE `members_click_events` - ADD CONSTRAINT `members_click_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_click_events_redirect_id_foreign` FOREIGN KEY (`redirect_id`) REFERENCES `redirects` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_created_events` --- -ALTER TABLE `members_created_events` - ADD CONSTRAINT `members_created_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_email_change_events` --- -ALTER TABLE `members_email_change_events` - ADD CONSTRAINT `members_email_change_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_feedback` --- -ALTER TABLE `members_feedback` - ADD CONSTRAINT `members_feedback_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_feedback_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_labels` --- -ALTER TABLE `members_labels` - ADD CONSTRAINT `members_labels_label_id_foreign` FOREIGN KEY (`label_id`) REFERENCES `labels` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_labels_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_login_events` --- -ALTER TABLE `members_login_events` - ADD CONSTRAINT `members_login_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_newsletters` --- -ALTER TABLE `members_newsletters` - ADD CONSTRAINT `members_newsletters_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_newsletters_newsletter_id_foreign` FOREIGN KEY (`newsletter_id`) REFERENCES `newsletters` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_paid_subscription_events` --- -ALTER TABLE `members_paid_subscription_events` - ADD CONSTRAINT `members_paid_subscription_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_payment_events` --- -ALTER TABLE `members_payment_events` - ADD CONSTRAINT `members_payment_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_products` --- -ALTER TABLE `members_products` - ADD CONSTRAINT `members_products_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_products_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_product_events` --- -ALTER TABLE `members_product_events` - ADD CONSTRAINT `members_product_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_product_events_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`); - --- --- Constraints der Tabelle `members_status_events` --- -ALTER TABLE `members_status_events` - ADD CONSTRAINT `members_status_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_stripe_customers` --- -ALTER TABLE `members_stripe_customers` - ADD CONSTRAINT `members_stripe_customers_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_stripe_customers_subscriptions` --- -ALTER TABLE `members_stripe_customers_subscriptions` - ADD CONSTRAINT `members_stripe_customers_subscriptions_customer_id_foreign` FOREIGN KEY (`customer_id`) REFERENCES `members_stripe_customers` (`customer_id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_stripe_customers_subscriptions_offer_id_foreign` FOREIGN KEY (`offer_id`) REFERENCES `offers` (`id`), - ADD CONSTRAINT `mscs_ghost_subscription_id_foreign` FOREIGN KEY (`ghost_subscription_id`) REFERENCES `subscriptions` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `members_subscribe_events` --- -ALTER TABLE `members_subscribe_events` - ADD CONSTRAINT `members_subscribe_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_subscribe_events_newsletter_id_foreign` FOREIGN KEY (`newsletter_id`) REFERENCES `newsletters` (`id`); - --- --- Constraints der Tabelle `members_subscription_created_events` --- -ALTER TABLE `members_subscription_created_events` - ADD CONSTRAINT `members_subscription_created_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `members_subscription_created_events_subscription_id_foreign` FOREIGN KEY (`subscription_id`) REFERENCES `members_stripe_customers_subscriptions` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `offers` --- -ALTER TABLE `offers` - ADD CONSTRAINT `offers_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`); - --- --- Constraints der Tabelle `offer_redemptions` --- -ALTER TABLE `offer_redemptions` - ADD CONSTRAINT `offer_redemptions_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `offer_redemptions_offer_id_foreign` FOREIGN KEY (`offer_id`) REFERENCES `offers` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `offer_redemptions_subscription_id_foreign` FOREIGN KEY (`subscription_id`) REFERENCES `members_stripe_customers_subscriptions` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `posts` --- -ALTER TABLE `posts` - ADD CONSTRAINT `posts_newsletter_id_foreign` FOREIGN KEY (`newsletter_id`) REFERENCES `newsletters` (`id`); - --- --- Constraints der Tabelle `posts_authors` --- -ALTER TABLE `posts_authors` - ADD CONSTRAINT `posts_authors_author_id_foreign` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`), - ADD CONSTRAINT `posts_authors_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`); - --- --- Constraints der Tabelle `posts_meta` --- -ALTER TABLE `posts_meta` - ADD CONSTRAINT `posts_meta_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`); - --- --- Constraints der Tabelle `posts_products` --- -ALTER TABLE `posts_products` - ADD CONSTRAINT `posts_products_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `posts_products_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `posts_tags` --- -ALTER TABLE `posts_tags` - ADD CONSTRAINT `posts_tags_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`), - ADD CONSTRAINT `posts_tags_tag_id_foreign` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`); - --- --- Constraints der Tabelle `post_revisions` --- -ALTER TABLE `post_revisions` - ADD CONSTRAINT `post_revs_author_id_foreign` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`); - --- --- Constraints der Tabelle `products_benefits` --- -ALTER TABLE `products_benefits` - ADD CONSTRAINT `products_benefits_benefit_id_foreign` FOREIGN KEY (`benefit_id`) REFERENCES `benefits` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `products_benefits_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `recommendation_click_events` --- -ALTER TABLE `recommendation_click_events` - ADD CONSTRAINT `recommendation_click_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL, - ADD CONSTRAINT `recommendation_click_events_recommendation_id_foreign` FOREIGN KEY (`recommendation_id`) REFERENCES `recommendations` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `recommendation_subscribe_events` --- -ALTER TABLE `recommendation_subscribe_events` - ADD CONSTRAINT `recommendation_subscribe_events_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE SET NULL, - ADD CONSTRAINT `recommendation_subscribe_events_recommendation_id_foreign` FOREIGN KEY (`recommendation_id`) REFERENCES `recommendations` (`id`) ON DELETE CASCADE; - --- --- Constraints der Tabelle `redirects` --- -ALTER TABLE `redirects` - ADD CONSTRAINT `redirects_post_id_foreign` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`) ON DELETE SET NULL; - --- --- Constraints der Tabelle `stripe_prices` --- -ALTER TABLE `stripe_prices` - ADD CONSTRAINT `stripe_prices_stripe_product_id_foreign` FOREIGN KEY (`stripe_product_id`) REFERENCES `stripe_products` (`stripe_product_id`); - --- --- Constraints der Tabelle `stripe_products` --- -ALTER TABLE `stripe_products` - ADD CONSTRAINT `stripe_products_product_id_foreign` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`); - --- --- Constraints der Tabelle `subscriptions` --- -ALTER TABLE `subscriptions` - ADD CONSTRAINT `subscriptions_member_id_foreign` FOREIGN KEY (`member_id`) REFERENCES `members` (`id`) ON DELETE CASCADE, - ADD CONSTRAINT `subscriptions_offer_id_foreign` FOREIGN KEY (`offer_id`) REFERENCES `offers` (`id`), - ADD CONSTRAINT `subscriptions_tier_id_foreign` FOREIGN KEY (`tier_id`) REFERENCES `products` (`id`); - --- --- Constraints der Tabelle `suppressions` --- -ALTER TABLE `suppressions` - ADD CONSTRAINT `suppressions_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `emails` (`id`); - --- --- Constraints der Tabelle `webhooks` --- -ALTER TABLE `webhooks` - ADD CONSTRAINT `webhooks_integration_id_foreign` FOREIGN KEY (`integration_id`) REFERENCES `integrations` (`id`) ON DELETE CASCADE; -COMMIT; - -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/docker/db/scripts/gawa.sql b/docker/db/scripts/gawa.sql index a7842a8..33f8fcf 100644 --- a/docker/db/scripts/gawa.sql +++ b/docker/db/scripts/gawa.sql @@ -22,863 +22,3 @@ SET time_zone = "+00:00"; -- CREATE DATABASE IF NOT EXISTS `gawa` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE `gawa`; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `auth_group` --- - -CREATE TABLE `auth_group` ( - `id` int(11) NOT NULL, - `name` varchar(150) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `auth_group_permissions` --- - -CREATE TABLE `auth_group_permissions` ( - `id` bigint(20) NOT NULL, - `group_id` int(11) NOT NULL, - `permission_id` int(11) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `auth_permission` --- - -CREATE TABLE `auth_permission` ( - `id` int(11) NOT NULL, - `name` varchar(255) NOT NULL, - `content_type_id` int(11) NOT NULL, - `codename` varchar(100) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `auth_permission` --- - -INSERT INTO `auth_permission` (`id`, `name`, `content_type_id`, `codename`) VALUES -(1, 'Can add keyword', 1, 'add_keyword'), -(2, 'Can change keyword', 1, 'change_keyword'), -(3, 'Can delete keyword', 1, 'delete_keyword'), -(4, 'Can view keyword', 1, 'view_keyword'), -(5, 'Can add searchable', 2, 'add_searchable'), -(6, 'Can change searchable', 2, 'change_searchable'), -(7, 'Can delete searchable', 2, 'delete_searchable'), -(8, 'Can view searchable', 2, 'view_searchable'), -(9, 'Can add static site', 3, 'add_staticsite'), -(10, 'Can change static site', 3, 'change_staticsite'), -(11, 'Can delete static site', 3, 'delete_staticsite'), -(12, 'Can view static site', 3, 'view_staticsite'), -(13, 'Can add category', 4, 'add_category'), -(14, 'Can change category', 4, 'change_category'), -(15, 'Can delete category', 4, 'delete_category'), -(16, 'Can view category', 4, 'view_category'), -(17, 'Can add blog post', 5, 'add_blogpost'), -(18, 'Can change blog post', 5, 'change_blogpost'), -(19, 'Can delete blog post', 5, 'delete_blogpost'), -(20, 'Can view blog post', 5, 'view_blogpost'), -(21, 'Can add log entry', 6, 'add_logentry'), -(22, 'Can change log entry', 6, 'change_logentry'), -(23, 'Can delete log entry', 6, 'delete_logentry'), -(24, 'Can view log entry', 6, 'view_logentry'), -(25, 'Can add permission', 7, 'add_permission'), -(26, 'Can change permission', 7, 'change_permission'), -(27, 'Can delete permission', 7, 'delete_permission'), -(28, 'Can view permission', 7, 'view_permission'), -(29, 'Can add group', 8, 'add_group'), -(30, 'Can change group', 8, 'change_group'), -(31, 'Can delete group', 8, 'delete_group'), -(32, 'Can view group', 8, 'view_group'), -(33, 'Can add user', 9, 'add_user'), -(34, 'Can change user', 9, 'change_user'), -(35, 'Can delete user', 9, 'delete_user'), -(36, 'Can view user', 9, 'view_user'), -(37, 'Can add content type', 10, 'add_contenttype'), -(38, 'Can change content type', 10, 'change_contenttype'), -(39, 'Can delete content type', 10, 'delete_contenttype'), -(40, 'Can view content type', 10, 'view_contenttype'), -(41, 'Can add session', 11, 'add_session'), -(42, 'Can change session', 11, 'change_session'), -(43, 'Can delete session', 11, 'delete_session'), -(44, 'Can view session', 11, 'view_session'), -(45, 'Can add Link', 12, 'add_link'), -(46, 'Can change Link', 12, 'change_link'), -(47, 'Can delete Link', 12, 'delete_link'), -(48, 'Can view Link', 12, 'view_link'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `auth_user` --- - -CREATE TABLE `auth_user` ( - `id` int(11) NOT NULL, - `password` varchar(128) NOT NULL, - `last_login` datetime(6) DEFAULT NULL, - `is_superuser` tinyint(1) NOT NULL, - `username` varchar(150) NOT NULL, - `first_name` varchar(150) NOT NULL, - `last_name` varchar(150) NOT NULL, - `email` varchar(254) NOT NULL, - `is_staff` tinyint(1) NOT NULL, - `is_active` tinyint(1) NOT NULL, - `date_joined` datetime(6) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `auth_user` --- - -INSERT INTO `auth_user` (`id`, `password`, `last_login`, `is_superuser`, `username`, `first_name`, `last_name`, `email`, `is_staff`, `is_active`, `date_joined`) VALUES -(1, 'pbkdf2_sha256$260000$cOxciSMkcV8kSVG1gUjOi7$LmOAxpppL7oBM2F+rFy0cdOZfReqdHqq1T6vw8PfODQ=', '2023-09-26 20:47:23.142649', 1, 'root', '', '', '', 1, 1, '2023-06-03 11:59:57.779755'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `auth_user_groups` --- - -CREATE TABLE `auth_user_groups` ( - `id` bigint(20) NOT NULL, - `user_id` int(11) NOT NULL, - `group_id` int(11) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `auth_user_user_permissions` --- - -CREATE TABLE `auth_user_user_permissions` ( - `id` bigint(20) NOT NULL, - `user_id` int(11) NOT NULL, - `permission_id` int(11) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `blog_blogpost` --- - -CREATE TABLE `blog_blogpost` ( - `searchable_ptr_id` bigint(20) NOT NULL, - `thumbnail` varchar(100) NOT NULL, - `category_id` bigint(20) DEFAULT NULL, - `slug` varchar(50) NOT NULL, - `featured` tinyint(1) NOT NULL, - `markdown` tinyint(1) NOT NULL, - `body_de` longtext NOT NULL, - `body_en` longtext NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `blog_blogpost` --- - -INSERT INTO `blog_blogpost` (`searchable_ptr_id`, `thumbnail`, `category_id`, `slug`, `featured`, `markdown`, `body_de`, `body_en`) VALUES -(3, 'img/thumbnails/echter_ottifant.png', 1, 'test', 1, 0, 'Bis jetzt keine deutsche Übersetzung.', '
\r\n81.271 Aufrufe  29.03.2023\r\nStellaris First Contact challenge video. No FTL Challenge. We will not research or use any FTL methods, from hyperdrive to jump drive. Can we survive and become a galactic superpower? Or will the forces of darkness seek to usurp us!\r\n\r\nThey called me a madman.\r\nThey said it couldn\'t be done.\r\nNow I present to you,\r\n\r\nStellaris With No FTL Travel.\r\n\r\nLets Dive In!\r\n\r\nSellaris Stories Playlist:    • Stellaris Playthr...  \r\n\r\nStellaris Version 3.7\r\n\r\nIf you enjoyed this video please leave a like & SUBSCRIBE!\r\n\r\nHumble Bundle Affiliate link: https://www.humblebundle.com/?partner...\r\n\r\nPatreon: https://www.patreon.com/MontuPlays\r\nChannel Membership:    / @montuplays  \r\nTwitter: https://twitter.com/MontuPlays\r\nTwitch: https://www.twitch.tv/montuplays\r\nInstagram: https://www.instagram.com/montuplays/\r\nTiktok: https://www.tiktok.com/@montuplays\r\n\r\nAnd please comment with any feedback, any ideas or if you disagree!\r\n
'), -(4, 'img/thumbnails/thuglifemathemann.png', 1, 'hidden', 0, 0, 'Bis jetzt keine deutsche Übersetzung.', 'No english translation yet.'), -(5, 'img/thumbnails/wayland_logo.jpg', 2, 'wayland', 1, 0, 'Bis jetzt keine deutsche Übersetzung.', 'No english translation yet.'), -(6, 'img/thumbnails/Center_of_the_Milky_Way_Galaxy_IV__Composite.jpg', 1, 'badly-formatted', 1, 0, 'Bis jetzt keine deutsche Übersetzung.', 'No english translation yet.'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `blog_category` --- - -CREATE TABLE `blog_category` ( - `id` bigint(20) NOT NULL, - `name` varchar(50) NOT NULL, - `slug` varchar(50) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `blog_category` --- - -INSERT INTO `blog_category` (`id`, `name`, `slug`) VALUES -(1, 'test', 'test'), -(2, 'Linux', 'Linux'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `django_admin_log` --- - -CREATE TABLE `django_admin_log` ( - `id` int(11) NOT NULL, - `action_time` datetime(6) NOT NULL, - `object_id` longtext DEFAULT NULL, - `object_repr` varchar(200) NOT NULL, - `action_flag` smallint(5) UNSIGNED NOT NULL CHECK (`action_flag` >= 0), - `change_message` longtext NOT NULL, - `content_type_id` int(11) DEFAULT NULL, - `user_id` int(11) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `django_admin_log` --- - -INSERT INTO `django_admin_log` (`id`, `action_time`, `object_id`, `object_repr`, `action_flag`, `change_message`, `content_type_id`, `user_id`) VALUES -(1, '2023-06-03 12:04:18.697869', '1', 'Keyword object (1)', 1, '[{\"added\": {}}]', 1, 1), -(2, '2023-06-03 12:04:25.298763', '1', 'StaticSite object (1)', 1, '[{\"added\": {}}]', 3, 1), -(3, '2023-06-03 12:39:47.580686', '2', 'Keyword object (2)', 1, '[{\"added\": {}}]', 1, 1), -(4, '2023-06-03 12:39:54.676532', '2', 'StaticSite object (2)', 1, '[{\"added\": {}}]', 3, 1), -(5, '2023-06-03 18:49:19.838998', '3', 'Keyword object (3)', 1, '[{\"added\": {}}]', 1, 1), -(6, '2023-06-03 18:49:38.820915', '1', 'Category object (1)', 1, '[{\"added\": {}}]', 4, 1), -(7, '2023-06-03 18:50:06.156603', '3', 'BlogPost object (3)', 1, '[{\"added\": {}}]', 5, 1), -(8, '2023-06-03 22:24:55.684062', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Body\", \"Thumbnail\"]}}]', 5, 1), -(9, '2023-06-03 22:25:23.238473', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Body\"]}}]', 5, 1), -(10, '2023-06-03 22:32:15.868151', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(11, '2023-06-03 22:32:19.806919', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(12, '2023-06-03 22:34:12.390100', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(13, '2023-06-03 22:34:18.657049', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(14, '2023-06-03 22:35:20.148384', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(15, '2023-06-03 22:35:31.942529', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(16, '2023-06-03 22:37:55.565581', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(17, '2023-06-03 22:38:00.515394', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(18, '2023-06-03 22:42:32.527820', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(19, '2023-06-03 22:42:38.983331', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(20, '2023-06-03 22:43:03.221503', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(21, '2023-06-03 22:43:09.756742', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(22, '2023-06-03 22:43:32.898889', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(23, '2023-06-03 22:43:58.455830', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(24, '2023-06-03 22:44:49.711409', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(25, '2023-06-03 22:44:53.900045', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(26, '2023-06-03 22:46:22.495718', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(27, '2023-06-03 22:46:48.813958', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(28, '2023-06-03 23:10:31.960472', '3', 'BlogPost object (3)', 2, '[{\"changed\": {\"fields\": [\"Featured\"]}}]', 5, 1), -(29, '2023-06-03 23:11:49.738524', '3', 'BlogPost object (3)', 2, '[]', 5, 1), -(30, '2023-06-03 23:12:32.389296', '4', 'BlogPost object (4)', 1, '[{\"added\": {}}]', 5, 1), -(31, '2023-06-03 23:12:40.179260', '4', 'BlogPost object (4)', 2, '[{\"changed\": {\"fields\": [\"Public\", \"Featured\"]}}]', 5, 1), -(32, '2023-06-04 18:05:05.011703', '4', '{\"hidden test\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(33, '2023-06-04 18:30:33.544753', '4', '{\"some keyword\"}', 1, '[{\"added\": {}}]', 1, 1), -(34, '2023-06-04 18:30:36.040424', '4', '{\"hidden test\"}', 2, '[{\"changed\": {\"fields\": [\"Keywords\"]}}]', 5, 1), -(35, '2023-06-04 18:43:00.039374', '5', '{\"Linux\"}', 1, '[{\"added\": {}}]', 1, 1), -(36, '2023-06-04 18:43:06.821221', '6', '{\"Wayland\"}', 1, '[{\"added\": {}}]', 1, 1), -(37, '2023-06-04 18:43:30.492957', '2', '{\"Linux\"}', 1, '[{\"added\": {}}]', 4, 1), -(38, '2023-06-04 18:43:53.420012', '5', '{\"wayland\"}', 1, '[{\"added\": {}}]', 5, 1), -(39, '2023-06-04 18:44:38.145122', '5', '{\"wayland\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(40, '2023-06-04 18:48:08.975475', '5', '{\"wayland\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(41, '2023-06-04 20:59:48.580334', '3', '{\"test\"}', 2, '[{\"changed\": {\"fields\": [\"Keywords\"]}}]', 5, 1), -(42, '2023-06-04 21:12:48.508525', '6', '{\"keywords\"}', 1, '[{\"added\": {}}]', 5, 1), -(43, '2023-06-04 21:13:03.091539', '6', '{\"keywords\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(44, '2023-06-04 21:13:30.855689', '6', '{\"keywords\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1), -(45, '2023-06-05 16:17:00.484477', '7', '{\"selfhosting\"}', 1, '[{\"added\": {}}]', 1, 1), -(46, '2023-06-05 16:19:31.228250', 'https://european-alternatives.eu/', '{\"european alternative\"}', 1, '[{\"added\": {}}]', 12, 1), -(47, '2023-06-05 16:19:42.921776', 'https://european-alternatives.eu/', '{\"european alternatives\"}', 2, '[{\"changed\": {\"fields\": [\"Title en\"]}}]', 12, 1), -(48, '2023-06-05 16:40:04.807992', '8', '{\"tool\"}', 1, '[{\"added\": {}}]', 1, 1), -(49, '2023-06-05 16:40:51.112180', 'https://grep.app/', '{\"grep.app\"}', 1, '[{\"added\": {}}]', 12, 1), -(50, '2023-06-05 16:46:27.851078', 'https://cscherr.de', '{\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1), -(51, '2023-06-05 16:46:30.662372', 'https://cscherr.de', '{\"title EN\"}', 2, '[]', 12, 1), -(52, '2023-06-05 16:46:32.422354', 'https://cscherr.de', '{\"title EN\"}', 2, '[]', 12, 1), -(53, '2023-06-05 16:46:59.815579', 'https://cscherr.de', '{\"title EN\"}', 2, '[]', 12, 1), -(54, '2023-06-05 16:47:14.035243', 'https://cschderr.de', '{\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1), -(55, '2023-06-05 16:47:19.004185', 'https://dscschderr.de', '{\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1), -(56, '2023-06-05 16:47:23.499798', 'https://cssdachderr.de', '{\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1), -(57, '2023-06-05 17:13:16.967522', 'https://cscherr.de', '{\"title EN\"}', 2, '[{\"changed\": {\"fields\": [\"Keywords\"]}}]', 12, 1), -(58, '2023-06-05 17:14:44.255231', 'https://dscschderr.de', '{\"title EN\"}', 3, '', 12, 1), -(59, '2023-06-05 17:14:44.256420', 'https://cssdachderr.de', '{\"title EN\"}', 3, '', 12, 1), -(60, '2023-06-05 17:14:44.257328', 'https://cscherr.de', '{\"title EN\"}', 3, '', 12, 1), -(61, '2023-06-05 17:14:44.258159', 'https://cschderr.de', '{\"title EN\"}', 3, '', 12, 1), -(62, '2023-06-05 17:57:00.163052', 'https://cscherr.de', '{\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1), -(63, '2023-06-05 20:58:00.230539', 'https://teslskdhglkjsahglkjdhflahgdlkjshgalskdhglkjsahglkjdsah.de', '{\"unavailable test\"}', 1, '[{\"added\": {}}]', 12, 1), -(64, '2023-06-05 21:17:01.550940', '4', '{\"hidden test\"}', 2, '[{\"changed\": {\"fields\": [\"Featured\"]}}]', 5, 1), -(65, '2023-06-16 20:37:32.073731', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Title de\", \"Title en\", \"Subtitle de\", \"Subtitle en\", \"Desc de\", \"Desc en\", \"Body en\"]}}]', 5, 1), -(66, '2023-06-16 22:05:16.217084', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1), -(67, '2023-06-16 22:06:07.120314', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1), -(68, '2023-06-16 22:09:16.732254', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1), -(69, '2023-06-16 22:09:57.723744', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Desc de\"]}}]', 5, 1), -(70, '2023-06-16 22:11:24.685523', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Desc en\"]}}]', 5, 1), -(71, '2023-06-16 22:35:07.849677', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Desc de\"]}}]', 5, 1), -(72, '2023-06-16 22:36:52.536498', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1), -(73, '2023-06-16 22:37:59.812320', '3', '{\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1), -(74, '2023-07-15 12:44:37.681112', '9', '{\"social media\"}', 1, '[{\"added\": {}}]', 1, 1), -(75, '2023-07-15 12:44:47.420748', '10', '{\"mastodon\"}', 1, '[{\"added\": {}}]', 1, 1), -(76, '2023-07-15 12:46:17.179222', 'https://infosec.exchange/@plexsheep/', '{\"Mastodon\"}', 1, '[{\"added\": {}}]', 12, 1), -(77, '2023-07-15 12:47:41.308504', 'https://cscherr.de', '{\"title EN\"}', 3, '', 12, 1), -(78, '2023-09-27 18:43:24.048812', '11', '{\"Hacking\"}', 1, '[{\"added\": {}}]', 1, 1), -(79, '2023-09-27 18:43:32.913389', 'https://cscg.de/', '{\"Cyber Security Challenge Germany\"}', 1, '[{\"added\": {}}]', 12, 1); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `django_content_type` --- - -CREATE TABLE `django_content_type` ( - `id` int(11) NOT NULL, - `app_label` varchar(100) NOT NULL, - `model` varchar(100) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `django_content_type` --- - -INSERT INTO `django_content_type` (`id`, `app_label`, `model`) VALUES -(6, 'admin', 'logentry'), -(8, 'auth', 'group'), -(7, 'auth', 'permission'), -(9, 'auth', 'user'), -(5, 'blog', 'blogpost'), -(4, 'blog', 'category'), -(10, 'contenttypes', 'contenttype'), -(11, 'sessions', 'session'), -(1, 'start', 'keyword'), -(12, 'start', 'link'), -(2, 'start', 'searchable'), -(3, 'start', 'staticsite'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `django_migrations` --- - -CREATE TABLE `django_migrations` ( - `id` bigint(20) NOT NULL, - `app` varchar(255) NOT NULL, - `name` varchar(255) NOT NULL, - `applied` datetime(6) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `django_migrations` --- - -INSERT INTO `django_migrations` (`id`, `app`, `name`, `applied`) VALUES -(1, 'contenttypes', '0001_initial', '2023-06-03 11:56:39.134383'), -(2, 'auth', '0001_initial', '2023-06-03 11:56:39.493397'), -(3, 'admin', '0001_initial', '2023-06-03 11:56:39.576389'), -(4, 'admin', '0002_logentry_remove_auto_add', '2023-06-03 11:56:39.587912'), -(5, 'admin', '0003_logentry_add_action_flag_choices', '2023-06-03 11:56:39.599213'), -(6, 'contenttypes', '0002_remove_content_type_name', '2023-06-03 11:56:39.670533'), -(7, 'auth', '0002_alter_permission_name_max_length', '2023-06-03 11:56:39.707524'), -(8, 'auth', '0003_alter_user_email_max_length', '2023-06-03 11:56:39.731843'), -(9, 'auth', '0004_alter_user_username_opts', '2023-06-03 11:56:39.745982'), -(10, 'auth', '0005_alter_user_last_login_null', '2023-06-03 11:56:39.782422'), -(11, 'auth', '0006_require_contenttypes_0002', '2023-06-03 11:56:39.785282'), -(12, 'auth', '0007_alter_validators_add_error_messages', '2023-06-03 11:56:39.797106'), -(13, 'auth', '0008_alter_user_username_max_length', '2023-06-03 11:56:39.827272'), -(14, 'auth', '0009_alter_user_last_name_max_length', '2023-06-03 11:56:39.851866'), -(15, 'auth', '0010_alter_group_name_max_length', '2023-06-03 11:56:39.879276'), -(16, 'auth', '0011_update_proxy_permissions', '2023-06-03 11:56:39.894042'), -(17, 'auth', '0012_alter_user_first_name_max_length', '2023-06-03 11:56:39.922412'), -(18, 'sessions', '0001_initial', '2023-06-03 11:56:39.960733'), -(19, 'start', '0001_initial', '2023-06-03 12:03:45.768696'), -(20, 'start', '0002_keyword_searchable_staticsite', '2023-06-03 12:03:45.941730'), -(21, 'blog', '0001_initial', '2023-06-03 12:03:45.945010'), -(22, 'blog', '0002_blogpost_category', '2023-06-03 12:03:46.053269'), -(23, 'blog', '0003_blogpost_public', '2023-06-03 18:52:48.544852'), -(24, 'blog', '0004_blogpost_slug', '2023-06-03 19:06:14.602364'), -(25, 'blog', '0005_auto_20230604_0050', '2023-06-03 22:50:53.031820'), -(26, 'blog', '0006_blogpost_markdown', '2023-06-03 22:55:58.592031'), -(27, 'blog', '0007_remove_blogpost_public', '2023-06-03 23:13:24.592228'), -(28, 'start', '0003_searchable_public', '2023-06-03 23:13:24.624613'), -(29, 'blog', '0008_auto_20230604_0156', '2023-06-03 23:56:46.268858'), -(30, 'start', '0004_auto_20230604_2312', '2023-06-04 21:12:38.055586'), -(31, 'start', '0005_link', '2023-06-05 16:15:09.586322'), -(32, 'start', '0006_alter_searchable_title_en', '2023-06-05 16:18:36.026234'), -(33, 'start', '0007_link_favicon', '2023-06-05 17:48:34.359895'), -(34, 'start', '0008_link_status', '2023-06-05 20:55:49.654569'), -(35, 'start', '0009_alter_link_favicon', '2023-06-05 23:01:06.878071'), -(36, 'blog', '0009_auto_20230616_2236', '2023-06-16 20:36:25.811914'), -(37, 'start', '0010_link_personal', '2023-07-15 12:20:30.979727'), -(38, 'start', '0011_auto_20230715_1441', '2023-07-15 12:41:41.290671'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `django_session` --- - -CREATE TABLE `django_session` ( - `session_key` varchar(40) NOT NULL, - `session_data` longtext NOT NULL, - `expire_date` datetime(6) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `django_session` --- - -INSERT INTO `django_session` (`session_key`, `session_data`, `expire_date`) VALUES -('0upcgnoxwloj2oe517p5gs49u5lp5zzq', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1qAGqc:py_DCOFJ-FumxDRyHNdQX5fRdemoczmVG1R6SSAoQXA', '2023-06-30 21:19:10.696506'), -('1gv9x0aqsv9wnwjrdfn2jb2lmb6e7m1q', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1q6I0M:8ck2jJRPvLCTVo8eO3Uf55V1qSCCmhbIVhoTqD-r-Io', '2023-06-19 21:44:46.153044'), -('2vj0n37v54tosuve9rzd869cxcto8mz2', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q5sLF:8r4rYdTtQYok9kkyr3UhO9m92jAPZC405pDYwP09-qA', '2023-06-18 18:20:37.522039'), -('3xiqj0zj3hqhng68kgetjvl3h3ef6rga', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6Dwi:pSwhudkZDOHfIFHna_Qhk4zH3yb3hNDC_HIwKt70DIE', '2023-06-19 17:24:44.189905'), -('64c4rub7ajgnj111shwcpvpvhfangkw6', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6IWp:gB20zXAKoPRbLklQlEzPAB2etNe510dvcw3HjZ2YqhE', '2023-06-19 22:18:19.400916'), -('7ig4cdxegsgr67am0qahc168ne7vnl6n', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q5aKH:la2kbcUB5332lRGgq-fmRfExgAqu21jCINyFziVMiPw', '2023-06-17 23:06:25.760931'), -('7zziio2fl6g4y2zlmbod3iqz8axi0c0w', '.eJxVjDsOgzAQBe_iOrLwD-yU6TmDtbteAwkyEuAqyt0DEg3tvJn3FXGGMlQYWDwFF_EQEeo-xrrxGqd0QHVnCPThcg7pfZSLpKXs64TyVOS1brJfEs-vy70djLCNR20Qk2tyY3UO1gT0wWhEm5kaF6gNGdkZRc560IrYAOkWsLPOd4iEIH5_vbE96w:1qAdo6:_7Ggp630uFVTXvIfzqnMcFQPZifnfd32YNw2xrRX4e4', '2023-07-01 21:50:06.829517'), -('82mt5l930fx2l18pvq62xve1dyjuczg4', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6ImI:L5uK3sW-CLiZwmK82SRpB46kruvoVv7shUM9VtzOvaw', '2023-06-19 22:34:18.417914'), -('90cu9ksglbxjuav0ycu34entpl3u4qze', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6DPn:FCYUrqa7sxjHrLAxvrd4xcXst3Bld3roZXiMIm6_F7g', '2023-06-19 16:50:43.835428'), -('9vrglur3tcfw30khosdk0whixdw5868f', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6DJf:JMQ65g3ch9bxIJXCyHfBkmz8xqpCFDLqCCEB-Fjk1j8', '2023-06-19 16:44:23.542502'), -('a4lile9twdhc1yhb4jm2v5arw3njpmej', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6bpg:OnpuTHTxOIhBWx00CQPrpYZhMxGIhsNypGHc_4oxT_Q', '2023-06-20 18:55:04.321078'), -('aj8r2xou6zmiev2qu09skea7uxl7mk4s', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1qlEwK:PJsxynHSnR99RgKTXCdS04bczAM31zWnfKa_JbPQZJQ', '2023-10-10 20:45:52.004706'), -('b19ur3eet73u66lfhf7iowvb8e6ki2td', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6IJN:ZIdTfsHuPhlUBDAW9wvz2hoEtMH4NYqgkomYVIieAhY', '2023-06-19 22:04:25.445445'), -('b1xgysjxf4yjco704xam548jixstkxk4', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6IWp:gB20zXAKoPRbLklQlEzPAB2etNe510dvcw3HjZ2YqhE', '2023-06-19 22:18:19.426849'), -('evj2deqvxhbyxb49e9h6l9na2qbaqf95', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q5QmI:1rGcG2CjkEKezGaLrT8fLFdInLOqIDp2ctZb5w2h9eY', '2023-06-17 12:54:42.590440'), -('gx6813mra4mjk14s8731rtb9yrqepdq6', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6IJN:ZIdTfsHuPhlUBDAW9wvz2hoEtMH4NYqgkomYVIieAhY', '2023-06-19 22:04:25.426613'), -('hseisfnzpao3n9vgsrm5xup83mnh5m8x', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6Ddw:jbkCHqvAo-dZVnT_cPPyzr3ifoYQ8RWqavgGkZOLxM4', '2023-06-19 17:05:20.044989'), -('i99yua650ef8vl8b5fj5ap6adkwga4mf', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1qlEKO:T9QlV6VyTrt6qAIWcDbc_DQAlr_CjRHFQupnY92Oqnc', '2023-10-10 20:06:40.283402'), -('iax6u7cdt7ccouzt9ewkgyzz1my8jl16', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6FnU:aw4jJP-LzV0_VQMDgNJdIAkd4HinLKxDb6fP3ls6p5I', '2023-06-19 19:23:20.996410'), -('ir5lngwwf38u4ro0dreraqdv7sy8fl4j', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1qkrLe:q--VIRxGKEfZEr1h28GRACqTPEwcSGOklzwjb2-BBco', '2023-10-09 19:34:26.798740'), -('jav4im7bxc31yig1weoojczl725hjetd', '.eJxVjDsOgzAQBe_iOrLwD-yU6TmDtbteAwkyEuAqyt0DEg3tvJn3FXGGMlQYWDwFF_EQEeo-xrrxGqd0QHVnCPThcg7pfZSLpKXs64TyVOS1brJfEs-vy70djLCNR20Qk2tyY3UO1gT0wWhEm5kaF6gNGdkZRc560IrYAOkWsLPOd4iEIH5_vbE96w:1qKfJc:bpPnwVuuqPB9oVGr8Revg7vj3eAIo1niHfWEmf8O0o0', '2023-07-29 13:28:04.767178'), -('jf3upknvj24cbyz5ucf2hvqes4o6brzf', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1qAFve:_RL7IYW9MkLOwRPU7s-iljlJETcf2JNT8-s0CiQBgbI', '2023-06-30 20:20:18.080997'), -('nowaza4auf15ea5ceduizupmuoai5wed', '.eJxVjDsOgzAQBe_iOrLwD-yU6TmDtbteAwkyEuAqyt0DEg3tvJn3FXGGMlQYWDwFF_EQEeo-xrrxGqd0QHVnCPThcg7pfZSLpKXs64TyVOS1brJfEs-vy70djLCNR20Qk2tyY3UO1gT0wWhEm5kaF6gNGdkZRc560IrYAOkWsLPOd4iEIH5_vbE96w:1qlZTU:uwTe0XhXUDx5AoyAuiMe8bsgud4-dczCsuKKhjQxjno', '2023-10-11 18:41:28.391526'), -('nxbpuu69n360c4rtr30gatez80zceypc', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1q5uwg:26g54m5XFWYTIyQ_XXmbuFM0dXKFK5PjIpnffTPooec', '2023-06-18 21:07:26.651759'), -('oksqlmqq4d95qbthf77cekpstsoras0x', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1qAHVI:zMwTYu2mF4TuMp3z6xyGegM5Z4dV2QOS4KErwB_42IY', '2023-06-30 22:01:12.013664'), -('ou12hhptv10i3dicpx9eg73qhr2c2spw', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1qAFve:D4NUcsnUU5BQLest9ZT3q98QlX1Vidt_wW73IIUcD0c', '2023-06-30 20:20:18.023866'), -('oxfk3q8saufspyg0hiinj9re5by7exfa', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1qKdzi:6328QizeSnm7IrCb8D9WhpBYgBql6UhxN2DT65FLV8I', '2023-07-29 12:03:26.437263'), -('puu3uusjwghp6krjt33eh1hkd8zmpzp5', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6bpg:OnpuTHTxOIhBWx00CQPrpYZhMxGIhsNypGHc_4oxT_Q', '2023-06-20 18:55:04.318858'), -('qizi095sgnejjvs8rwhp7pqdfekmallu', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1q5WGm:eC3Esvpesob9k12yWTUQU-w3r1_FbxdRLENuAFm9ZXk', '2023-06-17 18:46:32.666643'), -('qkmrqp3xxmungtb5xbrwe2yjwe7lqt4g', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6D0o:MBtnPS-eBpBPozK1IVNCJRQ7FAd7kNKqq2aK4M8oq80', '2023-06-19 16:24:54.958490'), -('qwkkyzzeqjg9172kyfek1hd9nzqtru3q', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6IWp:gB20zXAKoPRbLklQlEzPAB2etNe510dvcw3HjZ2YqhE', '2023-06-19 22:18:19.401336'), -('qysgaziztbpgvtl3kyttosi93s1zwtvf', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q5QV9:1Uw36kLgFSXm1VjcuuiIGpkmQuRN_KK0Ma3Zl4DXT6o', '2023-06-17 12:36:59.495979'), -('rkty698r11z7zm85k2geknm0rcjwyfqv', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6IWp:gB20zXAKoPRbLklQlEzPAB2etNe510dvcw3HjZ2YqhE', '2023-06-19 22:18:19.414335'), -('rtammfv9ja1mbvbgw7sdw4veiyp03xxm', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6IJN:ZIdTfsHuPhlUBDAW9wvz2hoEtMH4NYqgkomYVIieAhY', '2023-06-19 22:04:25.435536'), -('swp0hlg8yx4hxwu7u9d7si0o9m8it1pn', 'eyJfbGFuZ3VhZ2UiOiJlbiJ9:1q5uoj:aBQfKM4_0_2dMJJKcfn6UXCiUpxS-b_UgIJiN0nRaqo', '2023-06-18 20:59:13.449268'), -('t2kwan6ekp81crswrsi9hii4b61imuue', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6DnA:j-cI0mcCObdleGdnyjXwXCzYLi4AmXpo610VPxQBmM4', '2023-06-19 17:14:52.657342'), -('tvscp47jrsn5z4fzay4sozctp4o9tpr7', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6Ftl:fbR1czINKX_3OFLpBEjlPSoOqVf4B5Yx5U13i83cz2Y', '2023-06-19 19:29:49.516429'), -('ty2uxmb0kropbz7ag4yk848t4hen54j7', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6J1L:beudjtx8mUL9cLZg3z3PKqP5hW8lp_inxnyW3f3HEDk', '2023-06-19 22:49:51.870050'), -('whu9nbomfw3i5gs8fttvjxacu247tuft', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6Drn:Eb7ima9uOKmHWTfkubqTkzHczghiDOglJCki3bib51I', '2023-06-19 17:19:39.665491'), -('z35tevuzugpk08wbgtlcvktitb5cuuvj', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1qkrLg:t7mBZwP_Vzcn3gtTR-jeZ3P779bwZI_4o502I-Erxks', '2023-10-09 19:34:28.894312'), -('zj7tnj6l3xwq4n2vy4eg1gsvmc7rgagx', 'eyJfbGFuZ3VhZ2UiOiJkZSJ9:1q6Czj:IPERPMMtjCuW4sOHOEc7FY58NgjY0u8Lh10NMcinf_Y', '2023-06-19 16:23:47.958648'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `start_keyword` --- - -CREATE TABLE `start_keyword` ( - `id` bigint(20) NOT NULL, - `text_de` varchar(40) NOT NULL, - `text_en` varchar(40) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `start_keyword` --- - -INSERT INTO `start_keyword` (`id`, `text_de`, `text_en`) VALUES -(1, 'Statisch', 'static'), -(2, 'Blog', 'blog'), -(3, 'test', 'test'), -(4, 'ein keyword', 'some keyword'), -(5, 'Linux', 'Linux'), -(6, 'Wayland', 'Wayland'), -(7, 'Selfhosting', 'selfhosting'), -(8, 'Tool', 'tool'), -(9, 'Social Media', 'social media'), -(10, 'Mastodon', 'mastodon'), -(11, 'Hacking', 'Hacking'); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `start_link` --- - -CREATE TABLE `start_link` ( - `searchable_ptr_id` bigint(20) NOT NULL, - `url` varchar(200) NOT NULL, - `favicon` varchar(100) DEFAULT NULL, - `status` tinyint(1) NOT NULL, - `personal` tinyint(1) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `start_link` --- - -INSERT INTO `start_link` (`searchable_ptr_id`, `url`, `favicon`, `status`, `personal`) VALUES -(19, 'https://cscg.de/', 'img/links/favicons/favicon-12398.png', 1, 0), -(10, 'https://european-alternatives.eu/', 'img/links/favicons/favicon-36105.png', 1, 0), -(11, 'https://grep.app/', 'img/links/favicons/favicon-43495.png', 1, 0), -(18, 'https://infosec.exchange/@plexsheep/', 'img/links/favicons/favicon-46734.png', 1, 1), -(17, 'https://teslskdhglkjsahglkjdhflahgdlkjshgalskdhglkjsahglkjdsah.de', '', 0, 0); - --- -------------------------------------------------------- - --- --- Tabellenstruktur für Tabelle `start_searchable` --- - -CREATE TABLE `start_searchable` ( - `id` bigint(20) NOT NULL, - `title_de` varchar(50) NOT NULL, - `title_en` varchar(50) NOT NULL, - `subtitle_de` varchar(50) NOT NULL, - `subtitle_en` varchar(50) NOT NULL, - `desc_de` longtext NOT NULL, - `desc_en` longtext NOT NULL, - `date` date DEFAULT NULL, - `suburl` varchar(200) DEFAULT NULL, - `public` tinyint(1) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- --- Daten für Tabelle `start_searchable` --- - -INSERT INTO `start_searchable` (`id`, `title_de`, `title_en`, `subtitle_de`, `subtitle_en`, `desc_de`, `desc_en`, `date`, `suburl`, `public`) VALUES -(1, 'Startseite', 'startpage', '', '', 'Die Startseite von cscherr.de', 'The startpage of cscherr.de', NULL, '/', 1), -(2, 'Blog', 'blog', '', '', 'Die Startseite des Blogs', 'The startpage of the blob', NULL, '/blog', 1), -(3, 'Test de', 'test en', 'test blogpost de', 'test blogpost en', 'selbst gebaut oder template? Moritz — gestern um 23:16 Uhr Selbst natürlich Christoph — gestern um 23:16 Uhr wenn du ein framework suchst empfehle ich django, gibt aber genug auswahl Moritz — gestern um 23:16 Uhr Brauche aber erstmal die Zeit, wollte', 'ENENENEN
Date: Mon, 2 Oct 2023 10:33:01 +0200 Subject: [PATCH 22/27] langs setting --- gawa/blog/models.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gawa/blog/models.py b/gawa/blog/models.py index 3226b18..395ec6d 100644 --- a/gawa/blog/models.py +++ b/gawa/blog/models.py @@ -122,6 +122,12 @@ class BlogPost(Searchable): logger.error(f"Key '{key}' missing in meta file for '{self}'") raise ValueError( f"Key '{key}' missing in meta file for '{self}'") + for lang in self.DEFAULT_LANGS.keys(): + if lang not in data['lang']: + langs[lang] = False + else: + langs[lang] = True + self.set_langs(langs) for lang in data['lang']: for key in self.META_LANG_KEYS: if key not in data['lang'][lang]: From 6f2267e18aae96e398e9be55408fcbb9e97898bc Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 10:59:15 +0200 Subject: [PATCH 23/27] add timestamp to blogpost --- gawa/blog/templates/blog/blogpost.html | 129 +++++++++++++++---------- gawa/start/templatetags/helper_tags.py | 4 + 2 files changed, 83 insertions(+), 50 deletions(-) diff --git a/gawa/blog/templates/blog/blogpost.html b/gawa/blog/templates/blog/blogpost.html index 94e40c4..8d973b8 100644 --- a/gawa/blog/templates/blog/blogpost.html +++ b/gawa/blog/templates/blog/blogpost.html @@ -1,69 +1,98 @@ {% extends 'base.html' %} {% load i18n %} +{% load helper_tags %} {% get_current_language as LANGUAGE_CODE %} -{% block languagecode %}{{ LANGUAGE_CODE }}{% endblock languagecode %} -{% block title %}{% translate "cscherr.de" %} - {% translate "Blog" %}{% endblock title %} +{% block languagecode %} + {{ LANGUAGE_CODE }} +{% endblock languagecode %} +{% block title %} + {% translate "cscherr.de" %} - {% translate "Blog" %} +{% endblock title %} {% block nav %} -{% include 'nav.html' %} + {% include 'nav.html' %} {% endblock nav %} {% block headscripts %} - + {% endblock headscripts %} {% block main %} -
-
-
-
-
- {% if LANGUAGE_CODE == "de" %} -

{{ post.title_de }}
- {{ post.subtitle_de }}


- {% elif LANGUAGE_CODE == "en" %} -

{{ post.title_en }}
- {{ post.subtitle_en }}


- {% else %} -

{{ post.title_en }}
- {{ post.subtitle_en }}


- {% endif %} -
-
-
-
- - thumbnail - -
-
+
+
+
+
{% if LANGUAGE_CODE == "de" %} -

{{ post.desc_de }}

+

+ {{ post.title_de }} +
+ {{ post.subtitle_de }} +

+
{% elif LANGUAGE_CODE == "en" %} -

{{ post.desc_en }}

+

+ {{ post.title_en }} +
+ {{ post.subtitle_en }} +

+
{% else %} -

{{ post.desc_en }}

+

+ {{ post.title_en }} +
+ {{ post.subtitle_en }} +

+
{% endif %}
+
+
-

{{ post.date }}

+ + thumbnail +
-
-

{{ post.category.name }}

+
+
+ {% if LANGUAGE_CODE == "de" %} +

{{ post.desc_de }}

+ {% elif LANGUAGE_CODE == "en" %} +

{{ post.desc_en }}

+ {% else %} +

{{ post.desc_en }}

+ {% endif %} +
+
+

+ {{ post.category.name }} +

+
+
-
+
+
+ {% if LANGUAGE_CODE == "de" %} + {{ post.body_de | safe }} + {% elif LANGUAGE_CODE == "en" %} + {{ post.body_en | safe }} + {% else %} + {{ post.body_en | safe }} + {% endif %} +
+
+
+
+ {% format_time post.date as date %} +

{% trans "published" %}: {{ date }}

+
+
+ {% format_time post.update as update %} +

{% trans "updated" %}: {{ update }}

+
+
+
-
-
- {% if LANGUAGE_CODE == "de" %} - {{ post.body_de | safe }} - {% elif LANGUAGE_CODE == "en" %} - {{ post.body_en | safe }} - {% else %} - {{ post.body_en | safe }} - {% endif %} -
-
-
-
-{% include 'blog/featured.html' %} -{% endblock main %} + {% include 'blog/featured.html' %} + {% endblock main %} diff --git a/gawa/start/templatetags/helper_tags.py b/gawa/start/templatetags/helper_tags.py index ce0157b..fe8780c 100644 --- a/gawa/start/templatetags/helper_tags.py +++ b/gawa/start/templatetags/helper_tags.py @@ -1,6 +1,7 @@ from django.template import Library from django.urls import resolve, reverse from django.utils.translation import activate, get_language +from datetime import datetime import re @@ -9,6 +10,9 @@ logger = logging.getLogger(__name__) register = Library() +@register.simple_tag +def format_time(timestamp: datetime) -> str: + return timestamp.strftime("%F %H:%M:%S") @register.simple_tag(takes_context=True) def change_lang(context, lang="de", *args, **kwargs): From e8c332fce41cd02b7c46b342cbdc7b4b514338f0 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 11:04:48 +0200 Subject: [PATCH 24/27] add date to card view --- gawa/blog/templates/blog/featured.html | 7 +++++++ gawa/start/templatetags/helper_tags.py | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/gawa/blog/templates/blog/featured.html b/gawa/blog/templates/blog/featured.html index 28cfd8b..4f025e5 100644 --- a/gawa/blog/templates/blog/featured.html +++ b/gawa/blog/templates/blog/featured.html @@ -1,4 +1,5 @@ {% load i18n %} +{% load helper_tags %} {% get_current_language as LANGUAGE_CODE %}

{% trans "Featured" %}

@@ -45,6 +46,12 @@ {% endfor %}
+
+
  • + {% format_time post.date "%F" as date %} + {% trans "published" %}: {{ date }} +
  • +
    {% endfor %} diff --git a/gawa/start/templatetags/helper_tags.py b/gawa/start/templatetags/helper_tags.py index fe8780c..17d8d8e 100644 --- a/gawa/start/templatetags/helper_tags.py +++ b/gawa/start/templatetags/helper_tags.py @@ -11,8 +11,8 @@ logger = logging.getLogger(__name__) register = Library() @register.simple_tag -def format_time(timestamp: datetime) -> str: - return timestamp.strftime("%F %H:%M:%S") +def format_time(timestamp: datetime, format: str = "%F %H:%M:%S") -> str: + return timestamp.strftime(format) @register.simple_tag(takes_context=True) def change_lang(context, lang="de", *args, **kwargs): From d287b3291d9999f0c2174f671aba288c3865d3e8 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 11:16:23 +0200 Subject: [PATCH 25/27] image scaling and styling --- gawa/blog/templates/blog/blogpost.html | 56 +++++++++++++------------- gawa/blog/templates/blog/featured.html | 4 +- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/gawa/blog/templates/blog/blogpost.html b/gawa/blog/templates/blog/blogpost.html index 8d973b8..09a0e79 100644 --- a/gawa/blog/templates/blog/blogpost.html +++ b/gawa/blog/templates/blog/blogpost.html @@ -22,39 +22,37 @@
    -
    - {% if LANGUAGE_CODE == "de" %} -

    - {{ post.title_de }} -
    - {{ post.subtitle_de }} -

    -
    - {% elif LANGUAGE_CODE == "en" %} -

    - {{ post.title_en }} -
    - {{ post.subtitle_en }} -

    -
    - {% else %} -

    - {{ post.title_en }} -
    - {{ post.subtitle_en }} -

    -
    - {% endif %} -
    -
    -
    thumbnail
    -
    -
    +
    +
    + {% if LANGUAGE_CODE == "de" %} +

    + {{ post.title_de }} +
    + {{ post.subtitle_de }} +

    +
    + {% elif LANGUAGE_CODE == "en" %} +

    + {{ post.title_en }} +
    + {{ post.subtitle_en }} +

    +
    + {% else %} +

    + {{ post.title_en }} +
    + {{ post.subtitle_en }} +

    +
    + {% endif %} +
    +
    {% if LANGUAGE_CODE == "de" %}

    {{ post.desc_de }}

    {% elif LANGUAGE_CODE == "en" %} @@ -63,7 +61,7 @@

    {{ post.desc_en }}

    {% endif %}
    -
    +

    {{ post.category.name }}

    diff --git a/gawa/blog/templates/blog/featured.html b/gawa/blog/templates/blog/featured.html index 4f025e5..a575c4f 100644 --- a/gawa/blog/templates/blog/featured.html +++ b/gawa/blog/templates/blog/featured.html @@ -9,8 +9,8 @@ thumbnail
    {% if LANGUAGE_CODE == "de" %} From c59d243cc089a68189f6bd7395d22459c6c06a76 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 11:30:42 +0200 Subject: [PATCH 26/27] add timezone to dates --- gawa/blog/data/articles/bash-arrays.toml | 2 +- gawa/start/templatetags/helper_tags.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gawa/blog/data/articles/bash-arrays.toml b/gawa/blog/data/articles/bash-arrays.toml index 0d1f0d0..b6146c2 100644 --- a/gawa/blog/data/articles/bash-arrays.toml +++ b/gawa/blog/data/articles/bash-arrays.toml @@ -1,5 +1,5 @@ date = "2023-10-02 09:59:00.127936" -update = "2023-10-02 09:59:00.127936" +update = "2023-10-02 10:59:00.127936" keywords = ["bash"] category = "Guide" featured = true diff --git a/gawa/start/templatetags/helper_tags.py b/gawa/start/templatetags/helper_tags.py index 17d8d8e..65adf8a 100644 --- a/gawa/start/templatetags/helper_tags.py +++ b/gawa/start/templatetags/helper_tags.py @@ -11,7 +11,7 @@ logger = logging.getLogger(__name__) register = Library() @register.simple_tag -def format_time(timestamp: datetime, format: str = "%F %H:%M:%S") -> str: +def format_time(timestamp: datetime, format: str = "%F %H:%M:%S %Z") -> str: return timestamp.strftime(format) @register.simple_tag(takes_context=True) From 7e3f33a824f4a1451e312368d447b9925ac3f940 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Mon, 2 Oct 2023 11:30:52 +0200 Subject: [PATCH 27/27] ignore already created superuser --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 780ee2c..4d9ddc4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,7 @@ services: && sleep 3 && python manage.py migrate && DJANGO_SUPERUSER_PASSWORD='root' python manage.py createsuperuser\ - --username root --noinput --email software@cscherr.de + --username root --noinput --email software@cscherr.de || true && python manage.py runserver 0.0.0.0:80 " volumes: