add time to date and add update field

This commit is contained in:
Christoph J. Scherr 2023-10-02 10:23:03 +02:00
parent a9a90e9bd4
commit 05497e10e1
31 changed files with 143 additions and 4946 deletions

View File

@ -9,14 +9,17 @@ services:
# MYSQL_PASSWORD: changethisforprod # MYSQL_PASSWORD: changethisforprod
MYSQL_ROOT_PASSWORD: root MYSQL_ROOT_PASSWORD: root
volumes: volumes:
- db_data:/var/lib/mysql # - db_data:/var/lib/mysql
- ./docker/db/scripts:/docker-entrypoint-initdb.d/ - ./docker/db/scripts:/docker-entrypoint-initdb.d/
main: main:
build: ./docker/main build: ./docker/main
command: bash -c " command: bash -c "echo 'setting django up'
python manage.py migrate
&& python manage.py collectstatic --noinput && 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 && python manage.py runserver 0.0.0.0:80
" "
volumes: volumes:
@ -43,21 +46,6 @@ services:
- ./gawa/static:/srv/static - ./gawa/static:/srv/static
- ./gawa/media:/srv/media - ./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: db-admin:
image: phpmyadmin image: phpmyadmin
ports: ports:
@ -71,4 +59,4 @@ services:
volumes: volumes:
caddy_data: caddy_data:
caddy_config: caddy_config:
db_data: # db_data:

File diff suppressed because it is too large Load Diff

View File

@ -22,863 +22,3 @@ SET time_zone = "+00:00";
-- --
CREATE DATABASE IF NOT EXISTS `gawa` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE IF NOT EXISTS `gawa` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `gawa`; 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.', '<pre>\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</pre>'),
(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', '{<BlogPost>\"hidden test\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1),
(33, '2023-06-04 18:30:33.544753', '4', '{<Keyword>\"some keyword\"}', 1, '[{\"added\": {}}]', 1, 1),
(34, '2023-06-04 18:30:36.040424', '4', '{<BlogPost>\"hidden test\"}', 2, '[{\"changed\": {\"fields\": [\"Keywords\"]}}]', 5, 1),
(35, '2023-06-04 18:43:00.039374', '5', '{<Keyword>\"Linux\"}', 1, '[{\"added\": {}}]', 1, 1),
(36, '2023-06-04 18:43:06.821221', '6', '{<Keyword>\"Wayland\"}', 1, '[{\"added\": {}}]', 1, 1),
(37, '2023-06-04 18:43:30.492957', '2', '{<Category>\"Linux\"}', 1, '[{\"added\": {}}]', 4, 1),
(38, '2023-06-04 18:43:53.420012', '5', '{<BlogPost>\"wayland\"}', 1, '[{\"added\": {}}]', 5, 1),
(39, '2023-06-04 18:44:38.145122', '5', '{<BlogPost>\"wayland\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1),
(40, '2023-06-04 18:48:08.975475', '5', '{<BlogPost>\"wayland\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1),
(41, '2023-06-04 20:59:48.580334', '3', '{<BlogPost>\"test\"}', 2, '[{\"changed\": {\"fields\": [\"Keywords\"]}}]', 5, 1),
(42, '2023-06-04 21:12:48.508525', '6', '{<BlogPost>\"keywords\"}', 1, '[{\"added\": {}}]', 5, 1),
(43, '2023-06-04 21:13:03.091539', '6', '{<BlogPost>\"keywords\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1),
(44, '2023-06-04 21:13:30.855689', '6', '{<BlogPost>\"keywords\"}', 2, '[{\"changed\": {\"fields\": [\"Thumbnail\"]}}]', 5, 1),
(45, '2023-06-05 16:17:00.484477', '7', '{<Keyword>\"selfhosting\"}', 1, '[{\"added\": {}}]', 1, 1),
(46, '2023-06-05 16:19:31.228250', 'https://european-alternatives.eu/', '{<Link>\"european alternative\"}', 1, '[{\"added\": {}}]', 12, 1),
(47, '2023-06-05 16:19:42.921776', 'https://european-alternatives.eu/', '{<Link>\"european alternatives\"}', 2, '[{\"changed\": {\"fields\": [\"Title en\"]}}]', 12, 1),
(48, '2023-06-05 16:40:04.807992', '8', '{<Keyword>\"tool\"}', 1, '[{\"added\": {}}]', 1, 1),
(49, '2023-06-05 16:40:51.112180', 'https://grep.app/', '{<Link>\"grep.app\"}', 1, '[{\"added\": {}}]', 12, 1),
(50, '2023-06-05 16:46:27.851078', 'https://cscherr.de', '{<Link>\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1),
(51, '2023-06-05 16:46:30.662372', 'https://cscherr.de', '{<Link>\"title EN\"}', 2, '[]', 12, 1),
(52, '2023-06-05 16:46:32.422354', 'https://cscherr.de', '{<Link>\"title EN\"}', 2, '[]', 12, 1),
(53, '2023-06-05 16:46:59.815579', 'https://cscherr.de', '{<Link>\"title EN\"}', 2, '[]', 12, 1),
(54, '2023-06-05 16:47:14.035243', 'https://cschderr.de', '{<Link>\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1),
(55, '2023-06-05 16:47:19.004185', 'https://dscschderr.de', '{<Link>\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1),
(56, '2023-06-05 16:47:23.499798', 'https://cssdachderr.de', '{<Link>\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1),
(57, '2023-06-05 17:13:16.967522', 'https://cscherr.de', '{<Link>\"title EN\"}', 2, '[{\"changed\": {\"fields\": [\"Keywords\"]}}]', 12, 1),
(58, '2023-06-05 17:14:44.255231', 'https://dscschderr.de', '{<Link>\"title EN\"}', 3, '', 12, 1),
(59, '2023-06-05 17:14:44.256420', 'https://cssdachderr.de', '{<Link>\"title EN\"}', 3, '', 12, 1),
(60, '2023-06-05 17:14:44.257328', 'https://cscherr.de', '{<Link>\"title EN\"}', 3, '', 12, 1),
(61, '2023-06-05 17:14:44.258159', 'https://cschderr.de', '{<Link>\"title EN\"}', 3, '', 12, 1),
(62, '2023-06-05 17:57:00.163052', 'https://cscherr.de', '{<Link>\"title EN\"}', 1, '[{\"added\": {}}]', 12, 1),
(63, '2023-06-05 20:58:00.230539', 'https://teslskdhglkjsahglkjdhflahgdlkjshgalskdhglkjsahglkjdsah.de', '{<Link>\"unavailable test\"}', 1, '[{\"added\": {}}]', 12, 1),
(64, '2023-06-05 21:17:01.550940', '4', '{<BlogPost>\"hidden test\"}', 2, '[{\"changed\": {\"fields\": [\"Featured\"]}}]', 5, 1),
(65, '2023-06-16 20:37:32.073731', '3', '{<BlogPost>\"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', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1),
(67, '2023-06-16 22:06:07.120314', '3', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1),
(68, '2023-06-16 22:09:16.732254', '3', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1),
(69, '2023-06-16 22:09:57.723744', '3', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Desc de\"]}}]', 5, 1),
(70, '2023-06-16 22:11:24.685523', '3', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Desc en\"]}}]', 5, 1),
(71, '2023-06-16 22:35:07.849677', '3', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Desc de\"]}}]', 5, 1),
(72, '2023-06-16 22:36:52.536498', '3', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1),
(73, '2023-06-16 22:37:59.812320', '3', '{<BlogPost>\"test en\"}', 2, '[{\"changed\": {\"fields\": [\"Body en\"]}}]', 5, 1),
(74, '2023-07-15 12:44:37.681112', '9', '{<Keyword>\"social media\"}', 1, '[{\"added\": {}}]', 1, 1),
(75, '2023-07-15 12:44:47.420748', '10', '{<Keyword>\"mastodon\"}', 1, '[{\"added\": {}}]', 1, 1),
(76, '2023-07-15 12:46:17.179222', 'https://infosec.exchange/@plexsheep/', '{<Link>\"Mastodon\"}', 1, '[{\"added\": {}}]', 12, 1),
(77, '2023-07-15 12:47:41.308504', 'https://cscherr.de', '{<Link>\"title EN\"}', 3, '', 12, 1),
(78, '2023-09-27 18:43:24.048812', '11', '{<Keyword>\"Hacking\"}', 1, '[{\"added\": {}}]', 1, 1),
(79, '2023-09-27 18:43:32.913389', 'https://cscg.de/', '{<Link>\"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<div class=\"d-md-flex flex-md-row-reverse align-items-center justify-content-between\"> <div class=\"mb-3 mb-md-0 d-flex text-nowrap\"><a class=\"btn btn-sm btn-bd-light rounded-2\" href=\"https://github.com/twbs/bootstrap/blob/v5.3.0/sit', '2023-06-03', '/blog/test/test', 1),
(4, 'hidden test', 'hidden test', '', '', 'Beschreibung DE', 'Description EN', NULL, '/blog/test/hidden', 1),
(5, 'Wayland', 'wayland', 'Linux Display Server', 'linux display server', 'Wayland ist ein Linux Display Server der endlich X11 verdrängen soll.', 'Wayland is a linux display server that will finally make X11 legacy software.', '2023-06-04', '/blog/Linux/wayland', 1),
(6, 'schlüsslis', 'keywords', 'viele von denen', 'too many', 'Beschreibung DE', 'Description EN', '2023-06-04', '/blog/test/badly-formatted', 1),
(10, 'Europäische Alternativen', 'european alternatives', '', '', 'Hilft bei der Suche nach europäischen Alternativen für digitale Dienstleistungen und Produkte, wie Cloud-Dienste und SaaS-Produkte.', 'Helps you find European alternatives for digital service and products, like cloud services and SaaS products.', '2023-06-05', '/links#european alternatives', 1),
(11, 'grep.app', 'grep.app', '', '', 'Suche über eine halbe Million Git-Repos', 'Search across a half million git repos', '2023-06-05', '/links#grep.app', 1),
(17, 'unavailable test', 'unavailable test', '', '', 'Beschreibung DE', 'Description EN', NULL, '/links#unavailable test', 1),
(18, 'Mastodon', 'Mastodon', 'Dezentralisiertes social Media', 'decentralized social media', 'Mastodon ist ein Microblogging Dienst im Fediverse. Ähnlich wie Twitter, aber besser.', 'Mastodon is a microblogging service on the fediverse, think twitter but better and more free.', '2023-07-15', '/links#Mastodon', 1),
(19, 'Cyber Security Challenge Deutschland', 'Cyber Security Challenge Germany', 'Nationaler IT-Sicherheitswettbewerb', 'National IT-Security Competition', 'Wettbewerb für Jugendliche (bis zu 25 Jahren) im Bereich IT-Sicherheit', 'Competition for youth (up to 25 years old) in Cybersecurity', '2023-09-27', '/links#Cyber Security Challenge Germany', 1);
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `start_searchable_keywords`
--
CREATE TABLE `start_searchable_keywords` (
`id` bigint(20) NOT NULL,
`searchable_id` bigint(20) NOT NULL,
`keyword_id` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Daten für Tabelle `start_searchable_keywords`
--
INSERT INTO `start_searchable_keywords` (`id`, `searchable_id`, `keyword_id`) VALUES
(1, 1, 1),
(2, 2, 2),
(9, 3, 1),
(10, 3, 2),
(3, 3, 3),
(4, 4, 3),
(5, 4, 4),
(6, 5, 3),
(7, 5, 5),
(8, 5, 6),
(11, 6, 1),
(12, 6, 2),
(13, 6, 3),
(14, 6, 4),
(15, 6, 5),
(16, 6, 6),
(20, 10, 7),
(21, 11, 8),
(34, 17, 3),
(35, 18, 9),
(36, 18, 10),
(37, 19, 11);
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `start_staticsite`
--
CREATE TABLE `start_staticsite` (
`searchable_ptr_id` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
--
-- Daten für Tabelle `start_staticsite`
--
INSERT INTO `start_staticsite` (`searchable_ptr_id`) VALUES
(1),
(2);
--
-- Indizes der exportierten Tabellen
--
--
-- Indizes für die Tabelle `auth_group`
--
ALTER TABLE `auth_group`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `name` (`name`);
--
-- Indizes für die Tabelle `auth_group_permissions`
--
ALTER TABLE `auth_group_permissions`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `auth_group_permissions_group_id_permission_id_0cd325b0_uniq` (`group_id`,`permission_id`),
ADD KEY `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` (`permission_id`);
--
-- Indizes für die Tabelle `auth_permission`
--
ALTER TABLE `auth_permission`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `auth_permission_content_type_id_codename_01ab375a_uniq` (`content_type_id`,`codename`);
--
-- Indizes für die Tabelle `auth_user`
--
ALTER TABLE `auth_user`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `username` (`username`);
--
-- Indizes für die Tabelle `auth_user_groups`
--
ALTER TABLE `auth_user_groups`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `auth_user_groups_user_id_group_id_94350c0c_uniq` (`user_id`,`group_id`),
ADD KEY `auth_user_groups_group_id_97559544_fk_auth_group_id` (`group_id`);
--
-- Indizes für die Tabelle `auth_user_user_permissions`
--
ALTER TABLE `auth_user_user_permissions`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `auth_user_user_permissions_user_id_permission_id_14a6b632_uniq` (`user_id`,`permission_id`),
ADD KEY `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` (`permission_id`);
--
-- Indizes für die Tabelle `blog_blogpost`
--
ALTER TABLE `blog_blogpost`
ADD PRIMARY KEY (`searchable_ptr_id`),
ADD KEY `blog_blogpost_category_id_0e9835dd_fk_blog_category_id` (`category_id`),
ADD KEY `blog_blogpost_slug_9e84ade1` (`slug`);
--
-- Indizes für die Tabelle `blog_category`
--
ALTER TABLE `blog_category`
ADD PRIMARY KEY (`id`),
ADD KEY `blog_category_slug_92643dc5` (`slug`);
--
-- Indizes für die Tabelle `django_admin_log`
--
ALTER TABLE `django_admin_log`
ADD PRIMARY KEY (`id`),
ADD KEY `django_admin_log_content_type_id_c4bce8eb_fk_django_co` (`content_type_id`),
ADD KEY `django_admin_log_user_id_c564eba6_fk_auth_user_id` (`user_id`);
--
-- Indizes für die Tabelle `django_content_type`
--
ALTER TABLE `django_content_type`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `django_content_type_app_label_model_76bd3d3b_uniq` (`app_label`,`model`);
--
-- Indizes für die Tabelle `django_migrations`
--
ALTER TABLE `django_migrations`
ADD PRIMARY KEY (`id`);
--
-- Indizes für die Tabelle `django_session`
--
ALTER TABLE `django_session`
ADD PRIMARY KEY (`session_key`),
ADD KEY `django_session_expire_date_a5c62663` (`expire_date`);
--
-- Indizes für die Tabelle `start_keyword`
--
ALTER TABLE `start_keyword`
ADD PRIMARY KEY (`id`);
--
-- Indizes für die Tabelle `start_link`
--
ALTER TABLE `start_link`
ADD PRIMARY KEY (`url`),
ADD UNIQUE KEY `searchable_ptr_id` (`searchable_ptr_id`);
--
-- Indizes für die Tabelle `start_searchable`
--
ALTER TABLE `start_searchable`
ADD PRIMARY KEY (`id`);
--
-- Indizes für die Tabelle `start_searchable_keywords`
--
ALTER TABLE `start_searchable_keywords`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `start_searchable_keywords_searchable_id_keyword_id_2feb5e58_uniq` (`searchable_id`,`keyword_id`),
ADD KEY `start_searchable_key_keyword_id_230512a8_fk_start_key` (`keyword_id`);
--
-- Indizes für die Tabelle `start_staticsite`
--
ALTER TABLE `start_staticsite`
ADD PRIMARY KEY (`searchable_ptr_id`);
--
-- AUTO_INCREMENT für exportierte Tabellen
--
--
-- AUTO_INCREMENT für Tabelle `auth_group`
--
ALTER TABLE `auth_group`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `auth_group_permissions`
--
ALTER TABLE `auth_group_permissions`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `auth_permission`
--
ALTER TABLE `auth_permission`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=49;
--
-- AUTO_INCREMENT für Tabelle `auth_user`
--
ALTER TABLE `auth_user`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
--
-- AUTO_INCREMENT für Tabelle `auth_user_groups`
--
ALTER TABLE `auth_user_groups`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `auth_user_user_permissions`
--
ALTER TABLE `auth_user_user_permissions`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
--
-- AUTO_INCREMENT für Tabelle `blog_category`
--
ALTER TABLE `blog_category`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
--
-- AUTO_INCREMENT für Tabelle `django_admin_log`
--
ALTER TABLE `django_admin_log`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=80;
--
-- AUTO_INCREMENT für Tabelle `django_content_type`
--
ALTER TABLE `django_content_type`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;
--
-- AUTO_INCREMENT für Tabelle `django_migrations`
--
ALTER TABLE `django_migrations`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=39;
--
-- AUTO_INCREMENT für Tabelle `start_keyword`
--
ALTER TABLE `start_keyword`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
--
-- AUTO_INCREMENT für Tabelle `start_searchable`
--
ALTER TABLE `start_searchable`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=20;
--
-- AUTO_INCREMENT für Tabelle `start_searchable_keywords`
--
ALTER TABLE `start_searchable_keywords`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=38;
--
-- Constraints der exportierten Tabellen
--
--
-- Constraints der Tabelle `auth_group_permissions`
--
ALTER TABLE `auth_group_permissions`
ADD CONSTRAINT `auth_group_permissio_permission_id_84c5c92e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`),
ADD CONSTRAINT `auth_group_permissions_group_id_b120cbf9_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`);
--
-- Constraints der Tabelle `auth_permission`
--
ALTER TABLE `auth_permission`
ADD CONSTRAINT `auth_permission_content_type_id_2f476e4b_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`);
--
-- Constraints der Tabelle `auth_user_groups`
--
ALTER TABLE `auth_user_groups`
ADD CONSTRAINT `auth_user_groups_group_id_97559544_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`),
ADD CONSTRAINT `auth_user_groups_user_id_6a12ed8b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
--
-- Constraints der Tabelle `auth_user_user_permissions`
--
ALTER TABLE `auth_user_user_permissions`
ADD CONSTRAINT `auth_user_user_permi_permission_id_1fbb5f2c_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`),
ADD CONSTRAINT `auth_user_user_permissions_user_id_a95ead1b_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
--
-- Constraints der Tabelle `blog_blogpost`
--
ALTER TABLE `blog_blogpost`
ADD CONSTRAINT `blog_blogpost_category_id_0e9835dd_fk_blog_category_id` FOREIGN KEY (`category_id`) REFERENCES `blog_category` (`id`),
ADD CONSTRAINT `blog_blogpost_searchable_ptr_id_2b1446e8_fk_start_searchable_id` FOREIGN KEY (`searchable_ptr_id`) REFERENCES `start_searchable` (`id`);
--
-- Constraints der Tabelle `django_admin_log`
--
ALTER TABLE `django_admin_log`
ADD CONSTRAINT `django_admin_log_content_type_id_c4bce8eb_fk_django_co` FOREIGN KEY (`content_type_id`) REFERENCES `django_content_type` (`id`),
ADD CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
--
-- Constraints der Tabelle `start_link`
--
ALTER TABLE `start_link`
ADD CONSTRAINT `start_link_searchable_ptr_id_be644807_fk_start_searchable_id` FOREIGN KEY (`searchable_ptr_id`) REFERENCES `start_searchable` (`id`);
--
-- Constraints der Tabelle `start_searchable_keywords`
--
ALTER TABLE `start_searchable_keywords`
ADD CONSTRAINT `start_searchable_key_keyword_id_230512a8_fk_start_key` FOREIGN KEY (`keyword_id`) REFERENCES `start_keyword` (`id`),
ADD CONSTRAINT `start_searchable_key_searchable_id_a2d58376_fk_start_sea` FOREIGN KEY (`searchable_id`) REFERENCES `start_searchable` (`id`);
--
-- Constraints der Tabelle `start_staticsite`
--
ALTER TABLE `start_staticsite`
ADD CONSTRAINT `start_staticsite_searchable_ptr_id_aae84485_fk_start_sea` FOREIGN KEY (`searchable_ptr_id`) REFERENCES `start_searchable` (`id`);
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 */;

View File

@ -1,4 +1,5 @@
date = "2023-09-29" date = "2023-10-02 09:59:00.127936"
update = "2023-10-02 09:59:00.127936"
keywords = ["bash"] keywords = ["bash"]
category = "Guide" category = "Guide"
featured = true featured = true
@ -12,11 +13,3 @@ desc = """
bash scripting can be kind of weird. bash scripting can be kind of weird.
This guide explains how they work without any fuzz. 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.
"""

View File

@ -1,12 +1,47 @@
# Generated by Django 3.2.19 on 2023-06-03 12:03 # Generated by Django 3.2.21 on 2023-10-02 08:14
from django.db import migrations import blog.models
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True
dependencies = [ dependencies = [
('start', '0001_initial'),
] ]
operations = [ operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50)),
('slug', models.SlugField(unique=True)),
],
options={
'verbose_name': 'Category',
'verbose_name_plural': 'Categories',
},
),
migrations.CreateModel(
name='BlogPost',
fields=[
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='start.searchable')),
('body_en', models.TextField(blank=True, default='Dieser Artikel ist nicht auf deutsch verfügbar.')),
('body_de', models.TextField(blank=True, default='This aritcle is not available in english.')),
('thumbnail', models.ImageField(blank=True, default='img/thumbnails/default.jpg', upload_to='img/thumbnails')),
('featured', models.BooleanField(default=False)),
('langs', models.CharField(default="{'en': False, 'de': False}", max_length=64)),
('slug', models.SlugField()),
('category', models.ForeignKey(default=blog.models.Category.get_or_create_uncategorized, on_delete=django.db.models.deletion.SET_DEFAULT, to='blog.category')),
],
options={
'verbose_name': 'blog post',
'verbose_name_plural': 'blog posts',
},
bases=('start.searchable',),
),
] ]

View File

@ -1,35 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 12:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('start', '0002_keyword_searchable_staticsite'),
('blog', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50)),
('slug', models.SlugField()),
],
),
migrations.CreateModel(
name='BlogPost',
fields=[
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='start.searchable')),
('body', models.TextField()),
('thumbnail', models.ImageField(blank=True, upload_to='')),
('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='blog.category')),
],
bases=('start.searchable',),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 18:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('blog', '0002_blogpost_category'),
]
operations = [
migrations.AddField(
model_name='blogpost',
name='public',
field=models.BooleanField(default=True),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 19:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('blog', '0003_blogpost_public'),
]
operations = [
migrations.AddField(
model_name='blogpost',
name='slug',
field=models.SlugField(default='test'),
preserve_default=False,
),
]

View File

@ -1,23 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 22:50
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('blog', '0004_blogpost_slug'),
]
operations = [
migrations.AddField(
model_name='blogpost',
name='featured',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='blogpost',
name='thumbnail',
field=models.ImageField(blank=True, upload_to='img/thumbnails'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 22:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('blog', '0005_auto_20230604_0050'),
]
operations = [
migrations.AddField(
model_name='blogpost',
name='markdown',
field=models.BooleanField(default=False),
),
]

View File

@ -1,17 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 23:13
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('blog', '0006_blogpost_markdown'),
]
operations = [
migrations.RemoveField(
model_name='blogpost',
name='public',
),
]

View File

@ -1,21 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 23:56
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('blog', '0007_remove_blogpost_public'),
]
operations = [
migrations.AlterModelOptions(
name='blogpost',
options={'verbose_name': 'blog post', 'verbose_name_plural': 'blog posts'},
),
migrations.AlterModelOptions(
name='category',
options={'verbose_name': 'Category', 'verbose_name_plural': 'Categories'},
),
]

View File

@ -1,27 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-16 20:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('blog', '0008_auto_20230604_0156'),
]
operations = [
migrations.RemoveField(
model_name='blogpost',
name='body',
),
migrations.AddField(
model_name='blogpost',
name='body_de',
field=models.TextField(default='Bis jetzt keine deutsche Übersetzung.'),
),
migrations.AddField(
model_name='blogpost',
name='body_en',
field=models.TextField(default='No english translation yet.'),
),
]

View File

@ -1,32 +0,0 @@
# Generated by Django 3.2.21 on 2023-09-30 21:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('blog', '0009_auto_20230616_2236'),
]
operations = [
migrations.RemoveField(
model_name='blogpost',
name='markdown',
),
migrations.AddField(
model_name='blogpost',
name='langs',
field=models.CharField(default="['en': False, 'de': False]", max_length=64),
),
migrations.AlterField(
model_name='blogpost',
name='body_de',
field=models.TextField(blank=True, default=''),
),
migrations.AlterField(
model_name='blogpost',
name='body_en',
field=models.TextField(blank=True, default=''),
),
]

View File

@ -1,23 +0,0 @@
# 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),
),
]

View File

@ -59,8 +59,22 @@ class BlogPost(Searchable):
""" """
Should contain a blogpost Should contain a blogpost
""" """
body_en = models.TextField(blank=True, default="") DATA_DIR = "/app/blog/data/articles"
body_de = models.TextField(blank=True, default="") DEFAULT_LANGS = {'en': False, 'de': False}
META_TOP_KEYS = [
"date",
"update",
"keywords",
"category",
"featured",
"public",
"lang"]
META_LANG_KEYS = ["title", "subtitle", "desc"]
body_en = models.TextField(blank=True,
default="""Dieser Artikel ist nicht auf deutsch verfügbar.""")
body_de = models.TextField(blank=True,
default="""This aritcle is not available in english.""")
category = models.ForeignKey( category = models.ForeignKey(
Category, on_delete=models.SET_DEFAULT, null=False, Category, on_delete=models.SET_DEFAULT, null=False,
default=Category.get_or_create_uncategorized) default=Category.get_or_create_uncategorized)
@ -70,22 +84,9 @@ class BlogPost(Searchable):
default="img/thumbnails/default.jpg") default="img/thumbnails/default.jpg")
featured = models.BooleanField(default=False) featured = models.BooleanField(default=False)
langs = models.CharField( langs = models.CharField(
default="['en': False, 'de': False]", max_length=64) default=DEFAULT_LANGS.__repr__(), max_length=64)
slug = models.SlugField() slug = models.SlugField()
# TODO autodiscover new blog posts based on markdown files?
DATA_DIR = "/app/blog/data/articles"
DEFAULT_LANGS = {'en': False, 'de': False}
META_TOP_KEYS = [
"date",
"keywords",
"category",
"featured",
"public",
"lang"]
META_LANG_KEYS = ["title", "subtitle", "desc"]
def regenerate(self): def regenerate(self):
""" """
regenerate a object regenerate a object
@ -115,6 +116,7 @@ class BlogPost(Searchable):
logger.error(f"could not find meta file for '{self}'") logger.error(f"could not find meta file for '{self}'")
return return
data = toml.load(fmeta) data = toml.load(fmeta)
langs = self.get_langs()
for key in self.META_TOP_KEYS: for key in self.META_TOP_KEYS:
if key not in data: if key not in data:
logger.error(f"Key '{key}' missing in meta file for '{self}'") logger.error(f"Key '{key}' missing in meta file for '{self}'")
@ -123,10 +125,14 @@ class BlogPost(Searchable):
for lang in data['lang']: for lang in data['lang']:
for key in self.META_LANG_KEYS: for key in self.META_LANG_KEYS:
if key not in data['lang'][lang]: if key not in data['lang'][lang]:
logger.error( logger.warning(
f"Key '{key}' ('{lang}') missing in meta file for '{self}'")
raise ValueError(
f"Key '{key}' ('{lang}') missing in meta file for '{self}'") f"Key '{key}' ('{lang}') missing in meta file for '{self}'")
langs[lang] = False
else:
langs[lang] = True
if not langs[lang]:
# no translation for this language
continue
with open(f"{self.DATA_DIR}/{lang}-{self.slug}.md") as f_en: with open(f"{self.DATA_DIR}/{lang}-{self.slug}.md") as f_en:
MD.reset() MD.reset()
body: str = f_en.read() body: str = f_en.read()
@ -145,6 +151,7 @@ class BlogPost(Searchable):
logger.error( logger.error(
f"unknown language '{lang}' in meta file for '{self}'") f"unknown language '{lang}' in meta file for '{self}'")
self.date = data["date"] self.date = data["date"]
self.update = data["update"]
self.featured = data["featured"] self.featured = data["featured"]
self.public = data["public"] self.public = data["public"]
# NOTE: thumbnail is optional # NOTE: thumbnail is optional

View File

@ -1,12 +1,75 @@
# Generated by Django 3.2.19 on 2023-06-03 12:03 # Generated by Django 3.2.21 on 2023-10-02 08:14
from django.db import migrations from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True
dependencies = [ dependencies = [
] ]
operations = [ operations = [
migrations.CreateModel(
name='Keyword',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('slug', models.SlugField(unique=True)),
('text_de', models.CharField(max_length=40)),
('text_en', models.CharField(max_length=40)),
],
options={
'verbose_name': 'Keyword',
'verbose_name_plural': 'keywords',
},
),
migrations.CreateModel(
name='Searchable',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title_de', models.CharField(default='Nicht übersetzt', max_length=50)),
('title_en', models.CharField(default='Not translated', max_length=50)),
('subtitle_de', models.CharField(blank=True, max_length=50)),
('subtitle_en', models.CharField(blank=True, max_length=50)),
('desc_de', models.TextField(blank=True, default='Keine Beschreibung', max_length=250)),
('desc_en', models.TextField(blank=True, default='no description', max_length=250)),
('date', models.DateTimeField(blank=True, null=True)),
('update', models.DateTimeField(blank=True, null=True)),
('suburl', models.CharField(blank=True, max_length=200, null=True)),
('public', models.BooleanField(default=False)),
('keywords', models.ManyToManyField(blank=True, to='start.Keyword')),
],
options={
'verbose_name': 'Searchable',
'verbose_name_plural': 'Searchables',
},
),
migrations.CreateModel(
name='Link',
fields=[
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='start.searchable')),
('url', models.URLField(primary_key=True, serialize=False, unique=True)),
('favicon', models.ImageField(blank=True, null=True, upload_to='img/links/favicons')),
('status', models.BooleanField(default=False)),
('personal', models.BooleanField(default=False)),
],
options={
'verbose_name': 'Link',
'verbose_name_plural': 'Links',
},
bases=('start.searchable',),
),
migrations.CreateModel(
name='StaticSite',
fields=[
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='start.searchable')),
],
options={
'verbose_name': 'static site',
'verbose_name_plural': 'static sites',
},
bases=('start.searchable',),
),
] ]

View File

@ -1,46 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 12:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('start', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Keyword',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text_de', models.CharField(max_length=40)),
('text_en', models.CharField(max_length=40)),
],
),
migrations.CreateModel(
name='Searchable',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title_de', models.CharField(default='Titel DE', max_length=50)),
('title_en', models.CharField(default='title en', max_length=50)),
('subtitle_de', models.CharField(blank=True, max_length=50)),
('subtitle_en', models.CharField(blank=True, max_length=50)),
('desc_de', models.CharField(default='Beschreibung DE', max_length=250, unique=True)),
('desc_en', models.CharField(default='Description EN', max_length=250, unique=True)),
('date', models.DateField(blank=True, null=True)),
('suburl', models.CharField(blank=True, max_length=200, null=True)),
('keywords', models.ManyToManyField(to='start.Keyword')),
],
),
migrations.CreateModel(
name='StaticSite',
fields=[
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='start.searchable')),
],
bases=('start.searchable',),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-03 23:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0002_keyword_searchable_staticsite'),
]
operations = [
migrations.AddField(
model_name='searchable',
name='public',
field=models.BooleanField(default=True),
),
]

View File

@ -1,35 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-04 21:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0003_searchable_public'),
]
operations = [
migrations.AlterModelOptions(
name='keyword',
options={'verbose_name': 'Keyword', 'verbose_name_plural': 'keywords'},
),
migrations.AlterModelOptions(
name='searchable',
options={'verbose_name': 'Searchable', 'verbose_name_plural': 'Searchables'},
),
migrations.AlterModelOptions(
name='staticsite',
options={'verbose_name': 'static site', 'verbose_name_plural': 'static sites'},
),
migrations.AlterField(
model_name='searchable',
name='desc_de',
field=models.CharField(default='Beschreibung DE', max_length=250),
),
migrations.AlterField(
model_name='searchable',
name='desc_en',
field=models.CharField(default='Description EN', max_length=250),
),
]

View File

@ -1,26 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-05 16:15
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('start', '0004_auto_20230604_2312'),
]
operations = [
migrations.CreateModel(
name='Link',
fields=[
('searchable_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='start.searchable')),
('url', models.URLField(primary_key=True, serialize=False, unique=True)),
],
options={
'verbose_name': 'Link',
'verbose_name_plural': 'Links',
},
bases=('start.searchable',),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-05 16:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0005_link'),
]
operations = [
migrations.AlterField(
model_name='searchable',
name='title_en',
field=models.CharField(default='title EN', max_length=50),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-05 17:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0006_alter_searchable_title_en'),
]
operations = [
migrations.AddField(
model_name='link',
name='favicon',
field=models.ImageField(blank=True, upload_to='img/links/favicons'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-05 20:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0007_link_favicon'),
]
operations = [
migrations.AddField(
model_name='link',
name='status',
field=models.BooleanField(default=False),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-06-05 23:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0008_link_status'),
]
operations = [
migrations.AlterField(
model_name='link',
name='favicon',
field=models.ImageField(blank=True, null=True, upload_to='img/links/favicons'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.19 on 2023-07-15 12:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0009_alter_link_favicon'),
]
operations = [
migrations.AddField(
model_name='link',
name='personal',
field=models.BooleanField(default=False),
),
]

View File

@ -1,23 +0,0 @@
# Generated by Django 3.2.19 on 2023-07-15 12:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0010_link_personal'),
]
operations = [
migrations.AlterField(
model_name='searchable',
name='desc_de',
field=models.TextField(default='Beschreibung DE', max_length=250),
),
migrations.AlterField(
model_name='searchable',
name='desc_en',
field=models.TextField(default='Description EN', max_length=250),
),
]

View File

@ -1,28 +0,0 @@
# Generated by Django 3.2.21 on 2023-09-30 21:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('start', '0011_auto_20230715_1441'),
]
operations = [
migrations.AlterField(
model_name='searchable',
name='desc_de',
field=models.TextField(blank=True, default='Beschreibung DE', max_length=250),
),
migrations.AlterField(
model_name='searchable',
name='desc_en',
field=models.TextField(blank=True, default='Description EN', max_length=250),
),
migrations.AlterField(
model_name='searchable',
name='public',
field=models.BooleanField(default=False),
),
]

View File

@ -1,19 +0,0 @@
# 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,
),
]

View File

@ -1,18 +0,0 @@
# 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'),
),
]

View File

@ -35,16 +35,16 @@ class Searchable(models.Model):
This class is not a real abstract class, I need to query it in the main search, so thats impossible This class is not a real abstract class, I need to query it in the main search, so thats impossible
""" """
title_de = models.CharField(max_length=50, default="Titel DE") title_de = models.CharField(max_length=50, default="Nicht übersetzt")
title_en = models.CharField(max_length=50, default="title EN") title_en = models.CharField(max_length=50, default="Not translated")
subtitle_de = models.CharField(max_length=50, blank=True) subtitle_de = models.CharField(max_length=50, blank=True)
subtitle_en = models.CharField(max_length=50, blank=True) subtitle_en = models.CharField(max_length=50, blank=True)
desc_de = models.TextField( desc_de = models.TextField(
blank=True, max_length=250, unique=False, default="Beschreibung DE") blank=True, max_length=250, unique=False, default="Keine Beschreibung")
desc_en = models.TextField( desc_en = models.TextField(
blank=True, max_length=250, unique=False, default="Description EN") blank=True, max_length=250, unique=False, default="no description")
# may be empty/blank for some entries date = models.DateTimeField(blank=True, null=True)
date = models.DateField(blank=True, null=True) update = models.DateTimeField(blank=True, null=True)
keywords = models.ManyToManyField(Keyword, blank=True) keywords = models.ManyToManyField(Keyword, blank=True)
suburl = models.CharField(max_length=200, blank=True, null=True) suburl = models.CharField(max_length=200, blank=True, null=True)
public = models.BooleanField(default=False) public = models.BooleanField(default=False)