From 5934da3b129e0e9cded25afe9bc25e9f92d2090d Mon Sep 17 00:00:00 2001
From: scammo
Date: Mon, 11 Jul 2022 14:05:05 +0200
Subject: [PATCH 01/65] Update Satzung. Stand Generalversammlung vom 26.06.2022
---
content/mitglieder/satzung/contents.lr | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/content/mitglieder/satzung/contents.lr b/content/mitglieder/satzung/contents.lr
index e8de485c..5de8c48c 100644
--- a/content/mitglieder/satzung/contents.lr
+++ b/content/mitglieder/satzung/contents.lr
@@ -5,7 +5,7 @@ title: Satzung
body:
## WTF Kooperative eG
-05. Dezember 2020
+2022-06-26
## § 1 Name, Sitz, Zweck, Gegenstand
(1) Der Name der Genossenschaft lautet: WTF Kooperative eG. Der Sitz der Genossenschaft ist Hamburg.
@@ -61,7 +61,7 @@ verpflichtet, Adressenänderungen innerhalb von drei Wochen dem Vorstand mitzute
(6) Der Aufsichtsrat kann jederzeit Mitglieder des Vorstandes mit einfacher Mehrheit abwählen.
## § 6 Vorstand
-(1) Der Vorstand besteht aus mindestens zwei Mitgliedern; er leitet die Genossenschaft in eigener Verantwortung. Der Aufsichtsrat wählt die Mitglieder des Vorstands und gegebenenfalls deren Stellvertreter und bestimmt ihre Amtszeit. Wenn kein Aufsichtsrat bestellt ist, übernimmt die Generalversammlung dies.
+(1) Der Vorstand besteht aus mindestens zwei Mitgliedern. Der Vorstand leitet die Genossenschaft in eigener Verantwortung. Der Aufsichtsrat wählt im Falle des Ausscheidens eines aktiven Vorstandsmitgliedes einen neuen Vorstand aus den von der Generalversammlung gewählten Stellvertretern. Wenn kein Aufsichtsrat bestellt ist, übernimmt die Generalversammlung dies.
(2) Der Vorstand führt die Geschäfte der Genossenschaft gemäß den Vorschriften der Gesetze, insbesondere des Genossenschaftsgesetzes, der Satzung und der Allgemeinen Geschäftsordnung.
(3) Der Vorstand vertritt die Genossenschaft gerichtlich und außergerichtlich. Die Mitglieder des Vorstands sind einzeln zur Vertretung berechtigt.
(4) Der Vorstand kann schriftlich, in Textform, telefonisch und auf elektronischem Wege Beschlüsse fassen.
@@ -103,4 +103,3 @@ verpflichtet, Adressenänderungen innerhalb von drei Wochen dem Vorstand mitzute
## § 10 Bekanntmachungen
Bekanntmachungen der Genossenschaft erfolgen auf deren Internetseite und in den GenoNachrichten als unabhängiger Informationsplattform für das Genossenschaftswesen.
-Hamburg, 05.12.2020
From 068b27948213c15bd6823b0d679f77a59acecc46 Mon Sep 17 00:00:00 2001
From: Brain
Date: Tue, 12 Jul 2022 14:29:45 +0200
Subject: [PATCH 02/65] Be more specific which PRs are built
---
.drone.yml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/.drone.yml b/.drone.yml
index a43d74a5..3bb18e58 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -35,5 +35,7 @@ image_pull_secrets:
- dockerconfig
trigger:
+ branch:
+ - main
event:
- - pull_request
\ No newline at end of file
+ - pull_request
From 2ccd8339184f80fc8ec07e5fc7e88b21554684f2 Mon Sep 17 00:00:00 2001
From: Brain
Date: Tue, 12 Jul 2022 14:48:02 +0200
Subject: [PATCH 03/65] Sign drone config
---
.drone.yml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/.drone.yml b/.drone.yml
index 3bb18e58..00f9fc1a 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -39,3 +39,8 @@ trigger:
- main
event:
- pull_request
+---
+kind: signature
+hmac: a7c0aeda778717207ec641e7af90a358376eb3bfb22beeb67217b6d201e9e675
+
+...
From 840c01522c8d742133346e31e8cac526271d4b5b Mon Sep 17 00:00:00 2001
From: rev0lverheld
Date: Tue, 19 Jul 2022 21:32:12 +0200
Subject: [PATCH 04/65] Newsletter Juli 2022 hinzugefuegt
---
.../contents.lr | 51 +++++++++++++++++++
1 file changed, 51 insertions(+)
create mode 100644 content/blog/Blogversion-des-Newsletters-vom-Juni-2022/contents.lr
diff --git a/content/blog/Blogversion-des-Newsletters-vom-Juni-2022/contents.lr b/content/blog/Blogversion-des-Newsletters-vom-Juni-2022/contents.lr
new file mode 100644
index 00000000..9ddab971
--- /dev/null
+++ b/content/blog/Blogversion-des-Newsletters-vom-Juni-2022/contents.lr
@@ -0,0 +1,51 @@
+title: Was geht ab? (Juli 2022)
+---
+author: WTF Vorstand
+---
+body:
+
+Hallo Genoss*in!
+
+Anderthalb Jahre nach Genossenschaftsgründung haben sich am 18.06.2022 unsere Gründungsmitglieder, Vorstand und Aufsichtsrat erstmalig live und in Farbe zur gleichen Zeit am gleichen Ort getroffen – natürlich stilecht in Hamburg!
+
+Dort haben wir den aktuellen Stand der Genossenschaft sowie weitere Zukunftspläne und Ideen für neue Geschäftsfelder besprochen. Ein weiterer, für alle interessierten Mitglieder offener, Hybrid-Workshop soll am 24.-25.09.2022 folgen. Mehr Infos im Forum: https://forum.wtf-eg.de/t/interressiert-an-unserer-zukunft-bitte-den-24-25-september-blocken/716)
+
+### Fazit Generalversammlung
+
+Direkt am Wochenende darauf fand auch unsere Generalversammlung statt, die von unseren Mitgliedern genutzt wurde, sich über den Werdegang der WTF Kooperative eG zu informieren und einige bürokratische To Dos abzuhaken. Das Protokoll zu dieser Veranstaltung ist in Arbeit und wird allen Mitgliedern nach Fertigstellung zur Verfügung gestellt, sodass auch die nicht anwesenden Personen sich informiert halten können.
+
+Es gab berechtigte Anmerkungen, dass die Terminplanung für diese Generalversammlung relativ kurzfristig war, sodass nicht alle, die gerne gewollt hätten, auch teilnehmen konnten. Daher schonmal als Ankündigung: Am 20.11.2022 wird voraussichtlich die nächste Generalversammlung zur (Neu- bzw. Wieder-) Wahl der Vorstände (und ihrer Stellvertreter) stattfinden.
+
+### Kommunikationsgrund-sätze für das Forum
+
+Um die Kommunikation untereinander angenehmer zu gestalten, haben wir eine Nutzungsregelung für das Forum veröffentlicht. Du findest sie hier: https://forum.wtf-eg.de/t/wir-stellen-vor-eine-nutzungsregelung-fuer-dieses-forum/681 und wir würden uns freuen, wenn alle sich Mühe geben, dass das Miteinander in der digitalen Kommunikation konstruktiv und zielführend bleibt.
+
+### AGO-Treffen am 02.08.2022 um 20 Uhr
+
+Auch in Sachen AGO geht es voran. Wir treffen uns am 02.08.2022 um 20 Uhr im Jitsi, um den ersten Entwurf (https://git.wtf-eg.de/wtf-eg/allgemeine_geschaeftsordnung/src/branch/main/AGO.md) weiter zu verfeinern.
+
+Du bist herzlich eingeladen, dich an der Entwicklung unserer AGO zu beteiligen. Das Dokument regelt grundlegende Themen wie: Aufnahmeprozedere der Mitglieder, Überschussverteilung und Mitarbeiterbeteiligung, Übertragungen von Geschäftsanteilen, Grundlagen u.v.m. und kann auch auf Themen wie "Ethische Grundsätze der Genossenschaft" ausgeweitet werden. See you there!
+
+### Barcamp local-it.org
+
+Die Menschen des Local-IT e.V. veranstalten vom 11.-14.08.2022 ein Barcamp in 23909 Mechow (nahe Ratzeburg, ca. 1 h von Hamburg entfernt) und haben uns bzw. unsere Mitglieder zum gemeinsamen Werkeln und Ideen schmieden eingeladen.
+
+Der Verein hat sich “Demokratie stärken, mit digitaler Souveränität und freier Software” auf die Fahne geschrieben. Wenn Du Interesse hast, vorbeizuschauen, findest Du mehr Infos dazu im Forum https://forum.wtf-eg.de/t/hamburg-barcamp-des-local-it-e-v-am-11-14-08-2022-in-mechow-externe-veranstaltung/721 bzw. auf der Website des Vereins https://local-it.org/do-it-local-barcamp/.
+
+### BahnCard 100 zum Aktionspreis für alle unter 27 Jahren
+
+Um die Anreise zu sommerlichen Veranstaltungen noch komfortabler zu gestalten, bietet die Deutsche Bahn für alle Menschen unter 27 Jahren die Möglichkeit, bis zum 30.09.2022 eine BahnCard 100 zu einem reduzierten Preis zu erwerben. Damit zahlst Du für 12 Monate 2.664 € (also 222 € pro Monat) statt 4.144 € und hast den Bahnverkehr innerhalb Deutschlands, sowie ÖPNV in über 130 Städten unkompliziert inclusive.
+
+Eine Bestellung über die Genossenschaft kann nach Absprache erfolgen, Du kannst das Aktionsangebot aber auch unabhängig von der WTF Kooperative eG als Privatperson nutzen. Mehr Infos gibt es hier: https://www.bahn.de/angebot/bahncard/junge-reisende/bahncard100-aktion-u27
+
+Ansonsten bleibt uns nur zu sagen: Genieß' den Sommer, bleib' schön gesund und immer eine kalte Mate bereithalten für die kommende Hitzewelle!
+
+Genossenschaftliche Grüße
+
+Deine WTF Kooperative eG
+
+PS: Wenn Du keine Termine der WTF eG verpassen möchtest, abonniere doch unseren "WTF eG Interne Termine" Kalender https://work.wtf-eg.de/remote.php/dav/calendars/5468a190-1872-103b-8292-73b365a1b398/wtf-interne-termine_shared_by_wtf/
+---
+meta_description: Blogversion des Newsletters vom Juni 2022 mit einem Fazit zur Generalversammlung, Kommunikationsgrundsätze für das Forum, einem AGO-Treffen, einem Hinweis aufs Bar-Camp und ein Angebot für eine BahnCard 100 für Menschen unter 27
+---
+pub_date: 2022-07-19
From f508b40fd03ae64b8345f5d5e6157673983d260c Mon Sep 17 00:00:00 2001
From: muli
Date: Sun, 24 Jul 2022 10:35:55 +0200
Subject: [PATCH 05/65] fix: Honor stacking context to fix vanishing menu.
---
assets/css/style.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/assets/css/style.css b/assets/css/style.css
index 2020fd07..2293d8c5 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -1478,6 +1478,7 @@ footer {
background-image: none;
margin: 0;
padding: 0;
+ z-index: 40;
}
.slim_box__top_bar_left {
@@ -1517,7 +1518,6 @@ footer {
position: absolute;
top: 6.5rem;
right: 0;
- z-index: 30;
border-top: 2px solid var(--wtf-nearly-black);
border-left: 2px solid var(--wtf-nearly-black);
border-bottom: 2px solid var(--wtf-nearly-black);
From 7aa2ce027af98e28cddc7a745fa82bd3d4d956fe Mon Sep 17 00:00:00 2001
From: muli
Date: Sun, 24 Jul 2022 10:36:54 +0200
Subject: [PATCH 06/65] chore: Update .gitignore
---
.gitignore | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.gitignore b/.gitignore
index 165e06f6..503e0960 100644
--- a/.gitignore
+++ b/.gitignore
@@ -85,3 +85,9 @@ $RECYCLE.BIN/
# Windows shortcuts
*.lnk
+
+# Python virtual enviroment
+env
+.env
+venv
+.venv
From 8b20f0fab218bdeb0382218d261895f3fa4f3900 Mon Sep 17 00:00:00 2001
From: muli
Date: Sun, 24 Jul 2022 11:33:49 +0200
Subject: [PATCH 07/65] chore: Uncluttered navlist css.
---
assets/css/style.css | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/assets/css/style.css b/assets/css/style.css
index 2293d8c5..4bdac3c4 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -1294,6 +1294,7 @@ footer {
}
.primary_nav__navlist {
+ display: flex !important;
margin-right: 1.5rem;
}
@@ -1305,10 +1306,6 @@ footer {
display: none;
}
- .primary_nav__navlist {
- display: flex !important;
- }
-
.content__inner_box.-logo_header {
margin: -0.5rem 1.5rem 0 1.5rem;
}
From cfb859d0d6d9e9cda2f6f09f762ca6425fe15690 Mon Sep 17 00:00:00 2001
From: muli
Date: Sun, 24 Jul 2022 11:43:33 +0200
Subject: [PATCH 08/65] fix: Fixed unclickable sub menu by adjusting the height
of .header__privmary_nav.
---
assets/css/style.css | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/assets/css/style.css b/assets/css/style.css
index 4bdac3c4..2170c607 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -1244,7 +1244,7 @@ footer {
}
.slim_box__top_bar_left {
- margin: 1rem 0.5rem 0 0;
+ margin: 0 0.5rem 0 0;
height: 1.125rem;
background-image: url("../images/slim_header_top_triangles.svg");
background-position: right;
@@ -1289,6 +1289,10 @@ footer {
display: auto;
}
+ .header__primary_nav {
+ height: 2.5rem;
+ }
+
.secondary_nav__navlist {
margin-right: 1rem;
}
@@ -1298,6 +1302,10 @@ footer {
margin-right: 1.5rem;
}
+ .primary_nav__navlist > li:hover > .primary_nav__sub_navlist {
+ margin: 2.2rem 0 0 -0.5rem;
+ }
+
.primary_nav__members, .primary_nav__lang_switch {
display: none;
}
From 4181a9b1a83417c814a99f89504de2356123a09f Mon Sep 17 00:00:00 2001
From: muli
Date: Sun, 24 Jul 2022 12:20:56 +0200
Subject: [PATCH 09/65] fix: Fixed nearly unclickable logo in mobile view.
---
assets/css/style.css | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/assets/css/style.css b/assets/css/style.css
index 2170c607..3104edf0 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -225,6 +225,12 @@ header {
grid-row: 1 / span 1;
}
+.header__homelink {
+ display: inline-block;
+ position: relative;
+ z-index: 1;
+}
+
.header__button,
.content__button,
.claim__button,
From 2ec7326c3d5ae59acd0d5934419aa4c49b0c543b Mon Sep 17 00:00:00 2001
From: muli
Date: Wed, 3 Aug 2022 17:41:08 +0200
Subject: [PATCH 10/65] fix: Added a bit of visual space to the Dokumente page.
---
content/dokumente/contents.lr | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/content/dokumente/contents.lr b/content/dokumente/contents.lr
index f21cf336..338fa6fd 100644
--- a/content/dokumente/contents.lr
+++ b/content/dokumente/contents.lr
@@ -8,9 +8,9 @@ body:
| | | |
| --: | -- | -- |
-| **Satzung:** | | [wtf-satzung.pdf](/dokumente/wtf-satzung.pdf) |
-| **Beitragsordnung:** | | [wtf-beitragsordnung.pdf](/dokumente/wtf-beitragsordnung.pdf) |
-| **Beitrittserklärung:**| | [onboarding.wtf-eg.de](https://onboarding.wtf-eg.de) |
+| **Satzung:** | | [wtf-satzung.pdf](/dokumente/wtf-satzung.pdf) |
+| **Beitragsordnung:** | | [wtf-beitragsordnung.pdf](/dokumente/wtf-beitragsordnung.pdf) |
+| **Beitrittserklärung:**| | [onboarding.wtf-eg.de](https://onboarding.wtf-eg.de) |
From fbb55252d8672888ff30edce44e76edebd6585b5 Mon Sep 17 00:00:00 2001
From: muli
Date: Wed, 3 Aug 2022 17:46:57 +0200
Subject: [PATCH 11/65] fix: Fixed one typo and changed some "ligatures?" to
separate characters.
Leaves me a bit puzzled. I'm pretty sure I don't want these in the HTML as it breaks spell checking for example. Maybe there's CSS magic to add them automatically. Please correct me if I'm wrong.
---
content/mitglieder/satzung/contents.lr | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/content/mitglieder/satzung/contents.lr b/content/mitglieder/satzung/contents.lr
index 5de8c48c..30231e7b 100644
--- a/content/mitglieder/satzung/contents.lr
+++ b/content/mitglieder/satzung/contents.lr
@@ -10,8 +10,8 @@ body:
## § 1 Name, Sitz, Zweck, Gegenstand
(1) Der Name der Genossenschaft lautet: WTF Kooperative eG. Der Sitz der Genossenschaft ist Hamburg.
(2) Der Zweck der Genossenschaft ist die wirtschaftliche Förderung und Betreuung der Mitglieder.
-(3) Gegenstand des Unternehmens sind Dienstleistungen, Werktätigkeiten und Handel mit Bezug zu Informationstechnologien. Durch deren gemeinsame genossenschaftliche Vermarktung sowie Abwicklung einschlägiger kaufmännischer Dienstleistungen für die Mitglieder wird die Wirtschaft der Mitglieder im Sinne von § 1 Abs. 1 GenG durch Synergieeffekte gefördert.
-(4) Die Genossenschaft ist berechtigt, alle Maßnahmen zu treffen, die geeignet sind den Gesellschaftszweck zu fördern. Sie darf hierzu andere Unternehmen errichten und erwerben sowie sich an anderen Unternehmen beteiligen. Sie ist ferner berechtigt, Zweigniederlassungen zu errichten.
+(3) Gegenstand des Unternehmens sind Dienstleistungen, Werktätigkeiten und Handel mit Bezug zu Informationstechnologien. Durch deren gemeinsame genossenschaftliche Vermarktung sowie Abwicklung einschlägiger kaufmännischer Dienstleistungen für die Mitglieder wird die Wirtschaft der Mitglieder im Sinne von § 1 Abs. 1 GenG durch Synergieeffekte gefördert.
+(4) Die Genossenschaft ist berechtigt, alle Maßnahmen zu treffen, die geeignet sind den Gesellschaftszweck zu fördern. Sie darf hierzu andere Unternehmen errichten und erwerben sowie sich an anderen Unternehmen beteiligen. Sie ist ferner berechtigt, Zweigniederlassungen zu errichten.
(5) Zur Erfüllung der genossenschaftlichen Aufgaben kann sie sich der Hilfe sachverständiger Dritter bedienen.
(6) Geschäfte mit Nichtmitgliedern sind zulässig.
@@ -19,7 +19,7 @@ body:
(1) Zum Erwerb der Mitgliedschaft bedarf es einer unbedingten schriftlichen Beitrittserklärung. Die Mitgliedschaft können erwerben:
- a) natürliche Personen,
- b) Personengesellschaften,
-- c) juristische Personen des privaten oder öffentlichen Rechts.
+- c) juristische Personen des privaten oder öffentlichen Rechts.
(2) Über die Aufnahme in die Genossenschaft entscheidet der Vorstand.
(3) Die Mitgliedschaft endet durch
@@ -27,14 +27,14 @@ body:
- b) Übertragung des gesamten Geschäftsguthabens,
- c) Tod eines Mitglieds,
- d) Insolvenz eines Mitglieds,
-- e) Auflösung einer juristischen Person oder einer Personengesellschaft,
+- e) Auflösung einer juristischen Person oder einer Personengesellschaft,
- f) Ausschluss.
(4) Jedes Mitglied hat die Pflicht, das genossenschaftliche Unternehmen nach Kräften zu
unterstützen und die Interessen der Genossenschaft zu wahren. Ebenso ist jedes Mitglied
verpflichtet, Adressenänderungen innerhalb von drei Wochen dem Vorstand mitzuteilen.
-## § 3 Geschäftsanteil, Zahlungen, Rücklagen, Nachschusspflicht, Rückvergütung, Verjährung, Mindestkapital
+## § 3 Geschäftsanteil, Zahlungen, Rücklagen, Nachschusspflicht, Rückvergütung, Verjährung, Mindestkapital
(1) Ein Geschäftsanteil beträgt 100,- €. Er ist unverzüglich in voller Höhe einzuzahlen.
(2) Ein Mitglied kann mehrere Geschäftsanteile übernehmen. Die Gesamtzahl der Geschäftsanteile je Mitglied soll 100 Anteile nicht überschreiten.
(3) Mit Beitritt ist ein Eintrittsgeld/Agio zu leisten, welches den Rücklagen zuzuführen ist. Höhe und Fälligkeit beschließt die Generalversammlung.
@@ -53,7 +53,7 @@ verpflichtet, Adressenänderungen innerhalb von drei Wochen dem Vorstand mitzute
(9) Beschlüsse werden gem. § 47 GenG protokolliert.
## § 5 Aufsichtsrat
-(1) Sofern ein Aufsichtsrat bestellt wird, besteht dieser aus zumindest drei Mitgliedern; er überwacht die Geschäftsführung des Vorstands und ist verpflichtet, sich zu diesem Zweck über die Angelegenheiten der Genossenschaft zu unterrichten. Er kann jederzeit hierüber Berichterstattung vom Vorstand verlangen. Auch ein einzelnes Mitglied des Aufsichtsrats kann Auskünfte, jedoch nur an den Aufsichtsrat insgesamt, verlangen.
+(1) Sofern ein Aufsichtsrat bestellt wird, besteht dieser aus zumindest drei Mitgliedern; er überwacht die Geschäftsführung des Vorstands und ist verpflichtet, sich zu diesem Zweck über die Angelegenheiten der Genossenschaft zu unterrichten. Er kann jederzeit hierüber Berichterstattung vom Vorstand verlangen. Auch ein einzelnes Mitglied des Aufsichtsrats kann Auskünfte, jedoch nur an den Aufsichtsrat insgesamt, verlangen.
(2) Der Aufsichtsrat prüft den Jahresabschluss, den Lagebericht, soweit dieser gesetzlich erforderlich ist, und den Vorschlag des Vorstands für die Verwendung eines Jahresüberschusses oder für die Deckung eines Jahresfehlbetrags. Er hat sich darüber zu äußern und der Generalversammlung vor Feststellung des Jahresabschlusses Bericht zu erstatten. Jedes Mitglied des Aufsichtsrates hat den Inhalt des Prüfungsberichts zur Kenntnis zu nehmen.
(3) Einzelheiten über die Erfüllung der dem Aufsichtsrat obliegenden Pflichten regelt die vom Aufsichtsrat aufzustellende Geschäftsordnung. Ein Exemplar der Geschäftsordnung ist jedem Mitglied des Aufsichtsrats gegen Empfangsbestätigung auszuhändigen.
(4) Über eine größere Mitgliederzahl des Aufsichtsrats entscheidet die Generalversammlung. Der Aufsichtsrat ist beschlussfähig, wenn die Mehrheit seiner Mitglieder an der Abstimmung teilnimmt. Der Aufsichtsrat kann schriftlich, in Textform, telefonisch und auf elektronischem Wege Beschlüsse fassen.
@@ -67,14 +67,14 @@ verpflichtet, Adressenänderungen innerhalb von drei Wochen dem Vorstand mitzute
(4) Der Vorstand kann schriftlich, in Textform, telefonisch und auf elektronischem Wege Beschlüsse fassen.
(5) Dienstverträge mit Vorstandsmitgliedern werden vom Aufsichtsrat im Rahmen der Richtlinien der Generalversammlung und der Allgemeinen Geschäftsordnung abgeschlossen.
-## § 7 Pflichten, Kündigung, Ausschluss, Auseinandersetzung
-(1) Die Mitglieder sind verpflichtet, der Genossenschaft ihre Anschrift mitzuteilen.
+## § 7 Pflichten, Kündigung, Ausschluss, Auseinandersetzung
+(1) Die Mitglieder sind verpflichtet, der Genossenschaft ihre Anschrift mitzuteilen.
(2) Jedes Mitglied kann seine Mitgliedschaft zum Schluss eines Geschäftsjahres unter Einhaltung einer Frist von drei Monaten schriftlich kündigen.
-(3) Soweit ein Mitglied mit mehreren Geschäftsanteilen beteiligt ist, ohne hierzu durch die Satzung, die Allgemeine Geschäftsordnung oder eine Vereinbarung mit der Genossenschaft verpflichtet zu sein, kann es schriftlich einen oder mehrere Geschäftsanteile seiner zusätzlichen Beteiligung zum Schluss eines Geschäftsjahres unter Einhaltung einer Frist von drei Monaten kündigen.
+(3) Soweit ein Mitglied mit mehreren Geschäftsanteilen beteiligt ist, ohne hierzu durch die Satzung, die Allgemeine Geschäftsordnung oder eine Vereinbarung mit der Genossenschaft verpflichtet zu sein, kann es schriftlich einen oder mehrere Geschäftsanteile seiner zusätzlichen Beteiligung zum Schluss eines Geschäftsjahres unter Einhaltung einer Frist von drei Monaten kündigen.
(4) Die Übertragung des Geschäftsguthabens bedarf außer in den Fällen § 76 Abs. 2 GenG der Zustimmung des Vorstands.
(5) Mitglieder, deren Verhalten mit den Belangen oder Interessen der Genossenschaft nicht vereinbar ist, können ausgeschlossen werden. Dies gilt insbesondere, wenn
- a) das Mitglied durch Nichterfüllung seiner Verpflichtungen gegenüber der Genossenschaft diese schädigt oder geschädigt hat;
-- b) es trotz schriftlicher Aufforderung unter Androhung des Ausschlusses den satzungsmäßigen oder sonstigen der Genossenschaft gegenüber bestehenden Verpfichtungen nicht nachkommt;
+- b) es trotz schriftlicher Aufforderung unter Androhung des Ausschlusses den satzungsmäßigen oder sonstigen der Genossenschaft gegenüber bestehenden Verpflichtungen nicht nachkommt;
- c) es unrichtige Jahresabschlüsse oder Vermögensübersichten einreicht oder sonst unrichtige oder unvollständige Erklärungen über seine rechtlichen und/oder wirtschaftlichen Verhältnisse abgibt;
- d) es zahlungsunfähig geworden oder überschuldet ist oder wenn über sein Vermögen ein Antrag auf Eröffnung eines Insolvenzverfahrens gestellt wurde.
- e) es seinen Geschäftsbetrieb, Sitz oder Wohnsitz verlegt, ohne den Vorstand über die geänderte Anschrift zu informieren, oder wenn sein dauernder Aufenthaltsort unbekannt ist;
From 5c4d16660abc8b03d7ac02585fbccfe4c85311a6 Mon Sep 17 00:00:00 2001
From: muli
Date: Wed, 3 Aug 2022 17:48:07 +0200
Subject: [PATCH 12/65] feat: Updated the pdf document of the Satzung.
I created this from the HTML-Version. If there's an official PDF feel free to create a PR.
---
assets/dokumente/wtf-satzung.pdf | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/assets/dokumente/wtf-satzung.pdf b/assets/dokumente/wtf-satzung.pdf
index 9e08075d..224fd960 100644
--- a/assets/dokumente/wtf-satzung.pdf
+++ b/assets/dokumente/wtf-satzung.pdf
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:557750f1ebcfec1772164f29944961919cd2a88549f2ece09f402e6c9ee476a9
-size 775249
+oid sha256:4f505f32110236b2bc3864c026e4bf158936b96680373a4546b491a5c3e71348
+size 54414
From 436be5830b575d7276f0e2562adb0b0882f798f7 Mon Sep 17 00:00:00 2001
From: muli
Date: Sun, 29 May 2022 12:38:48 +0200
Subject: [PATCH 13/65] feat: Added dev server to project file.
---
wtf-eg.lektorproject | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/wtf-eg.lektorproject b/wtf-eg.lektorproject
index dce195e4..2d9c6fe6 100644
--- a/wtf-eg.lektorproject
+++ b/wtf-eg.lektorproject
@@ -13,6 +13,15 @@ default = yes
locale = de_DE
target = rsync://wtf@www.wtf-eg.net:/srv/www/www.wtf-eg.de/
+[servers.dev]
+name = dev
+url = https://spielwiese.wtf-eg.de/
+url_style = absolute
+enabled = yes
+default = yes
+locale = de_DE
+target = rsync://wtf@www.wtf-eg.net:/srv/www/spielwiese.wtf-eg.de/
+
[alternatives.de]
name = Deutsch
primary = true
From aeb1ae24fa535ac0f79b37684b2e09fb06b5f6b6 Mon Sep 17 00:00:00 2001
From: muli
Date: Thu, 16 Jun 2022 13:02:42 +0200
Subject: [PATCH 14/65] =?UTF-8?q?feat:=20WIP=20Kontaktformular=20hinzugef?=
=?UTF-8?q?=C3=BCgt.=20(#105)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Die URL ist noch hardcoded. Rückmeldung für den User fehlt noch. Die Nachricht geht noch nirgends hin. Spamprotection ohne Captcha ist nur in Ansätzen zu erkennen.
---
assets/css/style.css | 37 +++++++++++++++
assets/js/contact_form.js | 31 +++++++++++++
assets/js/contact_form_toggle.js | 5 +++
assets/php/contact_form.php | 77 ++++++++++++++++++++++++++++++++
content/kontakt/contents.lr | 2 +-
models/contact_page.ini | 4 ++
templates/contact_page.html | 51 +++++++++++++++++++++
templates/layout.html | 6 +++
8 files changed, 212 insertions(+), 1 deletion(-)
create mode 100644 assets/js/contact_form.js
create mode 100644 assets/js/contact_form_toggle.js
create mode 100644 assets/php/contact_form.php
create mode 100644 models/contact_page.ini
create mode 100644 templates/contact_page.html
diff --git a/assets/css/style.css b/assets/css/style.css
index 3104edf0..2a6d9074 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -31,6 +31,9 @@
--wtf-light-grey: #edefeb;
--wtf-lila: #6600ff;
+ /* misc colors */
+ --dark-red: #dc0000;
+
--column-count: 3;
}
@@ -882,6 +885,40 @@ hr.-even {
flex-direction: column;
justify-content: flex-start;
}
+
+.contact_form--required {
+ color: var(--dark-red)
+}
+
+.content__contact_form {
+
+}
+
+.contact_form__textarea,
+.contact_form__text_input,
+.contact_form__captcha {
+ display: flex;
+ flex-direction: column;
+}
+
+.contact_form__message {
+ height: 12em;
+}
+
+.contact_form__message,
+.contact_form__name,
+.contact_form__email,
+.contact_form__captcha {
+ font-family: 'Lato', sans-serif;
+ line-height: 1.3rem;
+ font-size: 1rem;
+}
+
+/* Hide captcha field as part of spam protection.
+ We got no real captcha. */
+.contact_form__captcha {
+ display: none;
+}
/* main - Ende */
/* footer - Start */
diff --git a/assets/js/contact_form.js b/assets/js/contact_form.js
new file mode 100644
index 00000000..2197618a
--- /dev/null
+++ b/assets/js/contact_form.js
@@ -0,0 +1,31 @@
+const ajaxUrl = 'https://spielwiese.wtf-eg.de/php/contact_form.php';
+// const submit_button = document.getElementsByClassName('contact_form__submit_button')[0];
+const contact_form = document.getElementsByClassName('content__contact_form')[0];
+const message = document.getElementsByClassName('contact_form__message')[0];
+const name = document.getElementsByClassName('contact_form__name')[0];
+const email = document.getElementsByClassName('contact_form__email')[0];
+const captcha = document.getElementsByClassName('contact_form__captcha')[0];
+
+contact_form.addEventListener('submit', function(event) {
+ event.preventDefault();
+ let formData = new FormData();
+ formData.append('message', message.value);
+ formData.append('name', name.value);
+ formData.append('email', email.value);
+
+ // If some bot entered some value, return.
+ if (typeof captcha.value == 'undefined') {
+ formData.append('captcha', 'Nudelsuppe');
+ } else {
+ console.log('bot detected');
+ return;
+ }
+
+ fetch(ajaxUrl, {
+ method: 'POST',
+ mode:'same-origin',
+ body: formData,
+ })
+ .then(response => response.json())
+ .then(json => {console.log(json)});
+}, false);
diff --git a/assets/js/contact_form_toggle.js b/assets/js/contact_form_toggle.js
new file mode 100644
index 00000000..b2dce0c2
--- /dev/null
+++ b/assets/js/contact_form_toggle.js
@@ -0,0 +1,5 @@
+/* Unhide contact form if JS is enabled */
+window.addEventListener('DOMContentLoaded', (event) => {
+ const contact_form_wrapper = document.getElementsByClassName('content__contact_form_wrapper')[0];
+ contact_form_wrapper.style.setProperty('display', 'block');
+});
diff --git a/assets/php/contact_form.php b/assets/php/contact_form.php
new file mode 100644
index 00000000..9f2d0777
--- /dev/null
+++ b/assets/php/contact_form.php
@@ -0,0 +1,77 @@
+ json_last_error_msg()]);
+ if ($json === false) {
+ // This should not happen, but …
+ $json = '{"jsonError":"unknown"}';
+ }
+ // Set HTTP response status code to: 500 - Internal Server Error
+ http_response_code(500);
+ }
+ header('Content-type: application/json');
+ echo $json;
+}
+
+if ($_SERVER["REQUEST_METHOD"] == "POST") {
+ $response = array();
+
+ if (
+ empty($_POST['message']) ||
+ empty($_POST['email']) ||
+ empty($_POST['name']) ||
+ $_POST['captcha'] != 'Nudelsuppe'
+ ) {
+ if (empty($_POST['message'])) {
+ $response['errors'][] = 'Du hast keine Nachricht eingegeben.';
+ }
+ if (empty($_POST['email'])) {
+ $response['errors'][] = 'Du hast keine E-Mail-Adresse eingegeben.';
+ }
+ if (empty($_POST['name'])) {
+ $response['errors'][] = 'Du hast keinen Namen eingegeben.';
+ }
+ if ($_POST['captcha'] != 'Nudelsuppe') {
+ $response['errors'][] = 'Wir glauben du bist ein Bot.';
+ }
+ } else {
+ $message = sanitize_text('message');
+ $name = sanitize_text('name');
+ $email = sanitize_text('email');
+
+ if (!send_message_to_office($message, $name, $email)) {
+ $response['errors'][] = 'Deine Nachricht konnte nicht übermittelt werden.';
+ } else {
+ $response['status'] = 'ok';
+ }
+ }
+ send_response($response);
+} else {
+ http_response_code(404);
+}
diff --git a/content/kontakt/contents.lr b/content/kontakt/contents.lr
index 149dd421..9094eac6 100644
--- a/content/kontakt/contents.lr
+++ b/content/kontakt/contents.lr
@@ -1,4 +1,4 @@
-_model: page
+_model: contact_page
---
title: Kontakt
---
diff --git a/models/contact_page.ini b/models/contact_page.ini
new file mode 100644
index 00000000..1ad4298d
--- /dev/null
+++ b/models/contact_page.ini
@@ -0,0 +1,4 @@
+[model]
+name = Contact Page
+label = {{ this.title }}
+inherits = page
diff --git a/templates/contact_page.html b/templates/contact_page.html
new file mode 100644
index 00000000..626c961a
--- /dev/null
+++ b/templates/contact_page.html
@@ -0,0 +1,51 @@
+{% extends "header_slim.html" %}
+{%- block title -%}{{ this.title }}{%- endblock -%}
+{%- block meta_description -%}
+ {%- if this.meta_description is defined and this.meta_description != "" -%}
+ {{ this.meta_description }}
+ {%- else -%}
+ Werkkooperative der Technikfreundinnen eG
+ {%- endif -%}
+{%- endblock -%}
+{% block body %}
+
+
+
{{ this.title }}
+
+
+
+
+
+ {{ this.body }}
+
+
+
Kontaktformular
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/templates/layout.html b/templates/layout.html
index 6b8ead4b..79dd07cd 100644
--- a/templates/layout.html
+++ b/templates/layout.html
@@ -63,6 +63,9 @@ __ ____________________
{% if 'manifest.json'|asseturl is defined -%}
{%- endif %}
+ {% if '/js/contact_form_toggle.js'|asseturl is defined -%}
+
+ {%- endif %}
@@ -128,4 +131,7 @@ __ ____________________
{%- if '/js/nav_toggle.js'|asseturl is defined -%}
{%- endif %}
+ {% if '/js/contact_form_toggle.js'|asseturl is defined -%}
+
+ {%- endif %}
From bbc1bc2b614ea1bc11620b6f7ed69b4072bd22e8 Mon Sep 17 00:00:00 2001
From: muli
Date: Thu, 16 Jun 2022 13:03:02 +0200
Subject: [PATCH 15/65] chore: Updated .gitignore.
---
.gitignore | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/.gitignore b/.gitignore
index 503e0960..b9e885ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,6 +14,7 @@ temp/
.DS_Store
.AppleDouble
.LSOverride
+.nova
# Icon must end with two \r
Icon
@@ -86,8 +87,12 @@ $RECYCLE.BIN/
# Windows shortcuts
*.lnk
-# Python virtual enviroment
-env
+### Python ###
+# Compiled python
+*.pyc
+
+# Virtaul environments
.env
-venv
.venv
+env
+venv
From 83d4694190b48821c5367314a5440a9a83dd605d Mon Sep 17 00:00:00 2001
From: muli
Date: Thu, 16 Jun 2022 13:03:29 +0200
Subject: [PATCH 16/65] fix: Fixed Syntax in manifest.json.
---
assets/manifest.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/assets/manifest.json b/assets/manifest.json
index 844121f9..7f70b548 100644
--- a/assets/manifest.json
+++ b/assets/manifest.json
@@ -6,6 +6,6 @@
"sizes": "96x96",
"type": "image\/png",
"density": "2.0"
- },
+ }
]
}
\ No newline at end of file
From 5a089b6a2ad030cc2c51b9cfe0f9de45d75ad918 Mon Sep 17 00:00:00 2001
From: muli
Date: Thu, 16 Jun 2022 16:41:24 +0200
Subject: [PATCH 17/65] feat: Bot-Detection erweitert. (#105)
---
assets/js/contact_form.js | 2 ++
assets/php/contact_form.php | 13 ++++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/assets/js/contact_form.js b/assets/js/contact_form.js
index 2197618a..9f90099e 100644
--- a/assets/js/contact_form.js
+++ b/assets/js/contact_form.js
@@ -5,6 +5,7 @@ const message = document.getElementsByClassName('contact_form__message')[0];
const name = document.getElementsByClassName('contact_form__name')[0];
const email = document.getElementsByClassName('contact_form__email')[0];
const captcha = document.getElementsByClassName('contact_form__captcha')[0];
+const now = (new Date().getTime/1000).toFixed();
contact_form.addEventListener('submit', function(event) {
event.preventDefault();
@@ -12,6 +13,7 @@ contact_form.addEventListener('submit', function(event) {
formData.append('message', message.value);
formData.append('name', name.value);
formData.append('email', email.value);
+ formData.append('time_sent', now);
// If some bot entered some value, return.
if (typeof captcha.value == 'undefined') {
diff --git a/assets/php/contact_form.php b/assets/php/contact_form.php
index 9f2d0777..ece29924 100644
--- a/assets/php/contact_form.php
+++ b/assets/php/contact_form.php
@@ -57,7 +57,18 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST['name'])) {
$response['errors'][] = 'Du hast keinen Namen eingegeben.';
}
- if ($_POST['captcha'] != 'Nudelsuppe') {
+ /*
+ Idee zur Bot-Erkennung:
+ 1. Ein Bot hat das Pseudocaptcha entweder leer abgeschickt, oder sich selbst etwas ausgedacht.
+ 2. Ein Bot schickt die Daten in unter 5s ab.
+ 3. Ein Mensch braucht nicht länger als 60min.
+ */
+ if (
+ $_POST['captcha'] != 'Nudelsuppe' ||
+ preg_match('d{10}', $_POST['time_sent']) != 1 ||
+ (preg_match('d{10}', $_POST['time_sent']) != 1 && time() - $_POST['time_sent'] < 5) ||
+ (preg_match('d{10}', $_POST['time_sent']) != 1 && time() - $_POST['time_sent'] > 3600)
+ ) {
$response['errors'][] = 'Wir glauben du bist ein Bot.';
}
} else {
From 2af9144fcbed1f3f82d536ec6791eadceb4c04ef Mon Sep 17 00:00:00 2001
From: muli
Date: Thu, 16 Jun 2022 16:52:20 +0200
Subject: [PATCH 18/65] =?UTF-8?q?feat:=20Arrow=20functions=20aufger=C3=A4u?=
=?UTF-8?q?mt=20und=20Fehlerbehandlung=20erg=C3=A4nzt.=20(#105)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
assets/js/contact_form.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/assets/js/contact_form.js b/assets/js/contact_form.js
index 9f90099e..5300af33 100644
--- a/assets/js/contact_form.js
+++ b/assets/js/contact_form.js
@@ -29,5 +29,6 @@ contact_form.addEventListener('submit', function(event) {
body: formData,
})
.then(response => response.json())
- .then(json => {console.log(json)});
+ .then(json => console.log(json))
+ .catch(error => console.log(error));
}, false);
From 487f2268b684e56e6560c007074674f5802d9780 Mon Sep 17 00:00:00 2001
From: muli
Date: Thu, 16 Jun 2022 18:23:05 +0200
Subject: [PATCH 19/65] feat: Fehlermeldungen anzeigen und Botdetection anhand
von Bearbeitunszeit. (#105)
---
assets/css/style.css | 8 +++++-
assets/js/contact_form.js | 31 +++++++++++++++++++++--
assets/php/contact_form.php | 50 ++++++++++++++++---------------------
templates/contact_page.html | 1 +
4 files changed, 59 insertions(+), 31 deletions(-)
diff --git a/assets/css/style.css b/assets/css/style.css
index 2a6d9074..a3c0ee0a 100644
--- a/assets/css/style.css
+++ b/assets/css/style.css
@@ -33,6 +33,7 @@
/* misc colors */
--dark-red: #dc0000;
+ --dark-green: #007000;
--column-count: 3;
}
@@ -886,10 +887,15 @@ hr.-even {
justify-content: flex-start;
}
-.contact_form--required {
+.contact_form--required,
+.--error {
color: var(--dark-red)
}
+.--success {
+ color: var(--dark-green);
+}
+
.content__contact_form {
}
diff --git a/assets/js/contact_form.js b/assets/js/contact_form.js
index 5300af33..c4182dd1 100644
--- a/assets/js/contact_form.js
+++ b/assets/js/contact_form.js
@@ -5,7 +5,8 @@ const message = document.getElementsByClassName('contact_form__message')[0];
const name = document.getElementsByClassName('contact_form__name')[0];
const email = document.getElementsByClassName('contact_form__email')[0];
const captcha = document.getElementsByClassName('contact_form__captcha')[0];
-const now = (new Date().getTime/1000).toFixed();
+const now = (new Date().getTime()/1000).toFixed();
+const feedback = document.getElementsByClassName('contact_form__feedback')[0];
contact_form.addEventListener('submit', function(event) {
event.preventDefault();
@@ -29,6 +30,32 @@ contact_form.addEventListener('submit', function(event) {
body: formData,
})
.then(response => response.json())
- .then(json => console.log(json))
+ .then(json => {
+ console.log(json)
+ if (json.errors) {
+ feedback.classList.add('--error');
+ // Über errors iterieren und diese ausgeben (evtl. nur ersten Fehler ausgeben?)
+ let error_message = '';
+ json.errors.forEach(function(error){
+ /**
+ * Nur Zeilenumbrüche wenn mehrer Fehlermeldungen existieren,
+ * aber bei der letzten nicht.
+ */
+ if (json.errors.length > 1) {
+ if (error == json.errors[json.errors.length - 1]) {
+ error_message = error_message + error;
+ } else {
+ error_message = error_message + error + ' ';
+ }
+ } else {
+ error_message = error_message + error;
+ }
+ })
+ feedback.innerHTML = error_message;
+ } else if (json.status == 'ok') {
+ feedback.classList.add('--success');
+ feedback.textContent = "Ihre Nachricht wurde erfolgreich ans Office geschickt.";
+ }
+ })
.catch(error => console.log(error));
}, false);
diff --git a/assets/php/contact_form.php b/assets/php/contact_form.php
index ece29924..ebc5b101 100644
--- a/assets/php/contact_form.php
+++ b/assets/php/contact_form.php
@@ -42,36 +42,30 @@ function send_response($response_data) {
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$response = array();
+ if (empty($_POST['message'])) {
+ $response['errors'][] = 'Du hast keine Nachricht eingegeben.';
+ }
+ if (empty($_POST['email'])) {
+ $response['errors'][] = 'Du hast keine E-Mail-Adresse eingegeben.';
+ }
+ if (empty($_POST['name'])) {
+ $response['errors'][] = 'Du hast keinen Namen eingegeben.';
+ }
+ /**
+ * Idee zur Bot-Erkennung:
+ * 1. Ein Bot hat das Pseudocaptcha entweder leer abgeschickt, oder sich selbst etwas ausgedacht.
+ * 2. Ein Bot schickt die Daten in unter 5s ab.
+ * 3. Ein Mensch braucht nicht länger als 60min.
+ */
if (
- empty($_POST['message']) ||
- empty($_POST['email']) ||
- empty($_POST['name']) ||
- $_POST['captcha'] != 'Nudelsuppe'
+ $_POST['captcha'] != 'Nudelsuppe' or
+ preg_match('/\d{10}/', $_POST['time_sent']) != 1 or
+ time() - intval($_POST['time_sent']) < 5 or
+ time() - intval($_POST['time_sent']) > 3600
) {
- if (empty($_POST['message'])) {
- $response['errors'][] = 'Du hast keine Nachricht eingegeben.';
- }
- if (empty($_POST['email'])) {
- $response['errors'][] = 'Du hast keine E-Mail-Adresse eingegeben.';
- }
- if (empty($_POST['name'])) {
- $response['errors'][] = 'Du hast keinen Namen eingegeben.';
- }
- /*
- Idee zur Bot-Erkennung:
- 1. Ein Bot hat das Pseudocaptcha entweder leer abgeschickt, oder sich selbst etwas ausgedacht.
- 2. Ein Bot schickt die Daten in unter 5s ab.
- 3. Ein Mensch braucht nicht länger als 60min.
- */
- if (
- $_POST['captcha'] != 'Nudelsuppe' ||
- preg_match('d{10}', $_POST['time_sent']) != 1 ||
- (preg_match('d{10}', $_POST['time_sent']) != 1 && time() - $_POST['time_sent'] < 5) ||
- (preg_match('d{10}', $_POST['time_sent']) != 1 && time() - $_POST['time_sent'] > 3600)
- ) {
- $response['errors'][] = 'Wir glauben du bist ein Bot.';
- }
- } else {
+ $response['errors'][] = 'Wir glauben du bist ein Bot.';
+ }
+ if (!array_key_exists('errors', $response)) {
$message = sanitize_text('message');
$name = sanitize_text('name');
$email = sanitize_text('email');
diff --git a/templates/contact_page.html b/templates/contact_page.html
index 626c961a..0e128cee 100644
--- a/templates/contact_page.html
+++ b/templates/contact_page.html
@@ -43,6 +43,7 @@