Răsfoiți Sursa

newsletter working, generic pages

Juan Carlos 5 ani în urmă
părinte
comite
f38fd7f30c

+ 92 - 12
marktplatz/forms.py

@@ -1,22 +1,25 @@
 from django import forms
 
 from django.conf import settings
-from .models import *
+from django.core.files import File
 from django.contrib.auth.forms import UserCreationForm
 from django_file_form.forms import UploadedFileField, FileFormMixin, CharField, MultipleUploadedFileField
 from django.contrib.auth.models import User
-from crispy_forms.helper import FormHelper
+from django.urls import reverse, reverse_lazy
+from django.forms import formset_factory
+from django.forms.widgets import HiddenInput
+from django.forms.models import inlineformset_factory
 # from crispy_forms.layout.buttons import Submit, InputButton
+
 from crispy_forms.layout import Layout, Field, Fieldset, Div, Row, Column, HTML, ButtonHolder, Submit
 from crispy_forms.bootstrap import InlineField
-from django.forms.models import inlineformset_factory
-from django.forms import formset_factory
-from django import forms
+from crispy_forms.helper import FormHelper
 from captcha.fields import CaptchaField
-from django.core.files import File
-from marktplatz.widgets import *
-from django.forms.widgets import HiddenInput
+from newsletter.forms import *
 
+from marktplatz.widgets import *
+from .models import *
+from .urls import *
 
 def extend_help_text( help_text, myList ):
     extended_text = help_text
@@ -55,19 +58,96 @@ class textSearchForm(forms.Form):
 
 class searchAgentForm(forms.ModelForm):
 
+
     class Meta:
         model = SearchAgent
-        fields = '__all__'
-        # fields = ('first_name','last_name','adress','postcode','city','country', 'email','phonenumber','alternate_phonenumber','skype_name','website', 'terms')
+        fields = ('ort', 'email')
+
+    agent_layout = Layout(
+        Fieldset(
+            ('Suchagent'),
+            'ort',
+        ),
+    )
+
+
+class AgentNewslwtterForm(forms.Form, searchAgentForm):
+
+    email_field = forms.EmailField( label = 'Email', required=True, max_length=254 )
+    subscribe = forms.BooleanField( label = 'Newsletter abonnieren', help_text='', required = False )
+    captcha = CaptchaField( label = 'Bitte lösen Sie die Gleichung', generator='captcha.helpers.math_challenge' )
+
+
+    # def clean(self):
+    #     # Then call the clean() method of the super  class
+    #     cleaned_data = super(AgentNewslwtterForm, self).clean()
+    #     cleaned_data['email'] = cleaned_data['email_field']
+    #     return cleaned_data
+
+    def __init__(self, *args, **kwargs):
+        super(searchAgentForm, self).__init__(*args, **kwargs)
+        self.helper = FormHelper(self)
+        self.helper.attrs = {  'enctype' : "multipart/form-data" }
+        self.helper.form_action = reverse('agent-newsletter-create', kwargs={'newsletter_slug': "test_news"}    )
+
+        self.helper.layout = Layout(
+            self.agent_layout,
+           'email_field',
+           'subscribe',
+           'captcha',
+           ButtonHolder(
+               Submit('submit', 'Anmelden', css_class='border-thin border-dark mybtn')
+           ),
+               # Submit('submit', 'Submit', css_class='btn border-dark rounded-0 mybtn'),
+
+           )
+
+
+
+
+
+
+# class MarktSubscribeRequestForm(SubscribeRequestForm, searchAgentForm):
+#     """
+#     Request subscription to the newsletter. Will result in an activation email
+#     being sent with a link where one can edit, confirm and activate one's
+#     subscription.
+#     """
+#
+#     newsletter = Newsletter.objects.get(title="Test")
+#     subscribeForm = SubscribeRequestForm(request.POST or None, newsletter=newsletter)
+#
+#     def __init__(self, *args, **kwargs):
+#         super(MarktSubscribeRequestForm, self).__init__(*args, **kwargs)
+#         self.helper = FormHelper()
+#         # self.helper.form_tag = False
+#         self.helper.layout = Layout(
+#             self.agent_layout,
+#            'email_field',
+#
+#                # Submit('submit', 'Submit', css_class='btn border-dark rounded-0 mybtn'),
+#
+#            )
+
+
+
+
 
 class RegisterForm(forms.ModelForm):
-    terms = forms.BooleanField(required=True,  label= ('I accept and have read the <a href="https://www.mediaarchitecture.org/privacy-policy/">Privacy Policy.</a>'))
+    drurl = reverse_lazy( 'pages-generic', kwargs=  { 'page': 'DATENSCHUTZRICHTLINIE' } )
+    terms = forms.BooleanField(required=True,  label= ('Ich akzeptiere die <a href="{}"> Datenschutzrichtlinie und habe sie gelesen.</a>' )  )
 
     class Meta:
         model = Contact
         fields = ('first_name','last_name','adress','postcode','city','country',
                   'email','phonenumber','alternate_phonenumber','skype_name','website', 'terms')
 
+    def __init__(self, *args, **kwargs):
+        super(RegisterForm, self).__init__(*args, **kwargs)
+        drurl = reverse_lazy( 'pages-generic', kwargs=  { 'page': 'DATENSCHUTZRICHTLINIE' } )
+        tmurl = reverse_lazy( 'pages-generic', kwargs=  { 'page': 'TEILNAHME' } )
+        self.fields ['terms'].label = 'Ich akzeptiere die <a href="{}"> Datenschutzrichtlinie</a> sowie die  <a href="{}"> Teilnahmebedingungen</a> und habe sie gelesen.'.format(drurl, tmurl)
+
 class SignUpForm(UserCreationForm):
     captcha = CaptchaField( generator='captcha.helpers.math_challenge' )
 
@@ -176,7 +256,7 @@ class WohnprojektForm(ProductForm):
 
              'awohnungen',
 
-             Fieldset ( 'FLächen',
+             Fieldset ( 'Flächen',
                 Div(
                   Div('wohnflaeche',  css_class='col-sm-3 col-3'),
                   Div('gewerbeflaechen', css_class='col-sm-3 col-3'),

+ 6 - 2
marktplatz/templates/marktplatz/form.html

@@ -26,13 +26,17 @@
       <div class='invalid-feedback' style="display: none;" >{{ contact_errors }}</div>
       {% endif %}
       <!-- end of debug -->
-      {{ form|crispy }}
 
+      {{ form|crispy }}
 
       {% csrf_token %}
       {{ signUp|crispy }}
       <br><br>
-    <button type="submit" class="btn border-dark rounded-0 mybtn" >Register</button>  </form>
+    <button type="submit" class="btn  border-thin mybtn" >Register</button>  </form>
+
+
+
+
     <div class="">
       <br><br><br>
     </div>

+ 49 - 0
marktplatz/templates/marktplatz/form_newsletter.html

@@ -0,0 +1,49 @@
+{% extends "base_generic.html" %}
+{% load static %}
+{% load crispy_forms_tags %}
+
+{% block content %}
+
+<style media="screen">
+
+  .form-error{
+    padding: 60 0 0 20;
+    color: #F00;
+
+  }
+</style>
+
+  <div class="col-sm-6">
+    <br>
+    {{ form_content | safe }}
+
+      {% csrf_token %}
+      <!-- Left here in case we need to debug -->
+      {% if form_errors %}
+      <div class='invalid-feedback' style="display: none;">{{ form_errors }}</div>
+      {% endif %}
+      <!-- end of debug -->
+
+
+      {% crispy form %}
+
+
+
+      {% csrf_token %}
+      {{ signUp|crispy }}
+      <br><br>
+
+
+
+    <!-- <form enctype="multipart/form-data" method="post" action="/newsletter/test_news/subscribe/">
+    {% csrf_token %}
+    <label for="id_email_field">E-mail:</label> <input type="email" name="email_field" required="" id="id_email_field">
+    <button id="id_submit" name="submit" value="Subscribe" type="submit">Subscribe</button>
+    </form> -->
+
+
+    <div class="">
+      <br><br><br>
+    </div>
+     </div>
+{% endblock %}

+ 2 - 2
marktplatz/templates/marktplatz/modal-sa.html

@@ -2,7 +2,7 @@
     .modal {
       display: none;
       position: fixed;
-      z-index: 1;
+      z-index: 3;
       padding-top: 100px;
       left: 0;
       top: 0;
@@ -45,7 +45,7 @@
       <!-- Modal content -->
       <div class="modal-content">
         <span id="agentClose" class="close">&times;</span>
-        <iframe src="{% url 'search-agent-create-embed' %}" style="border:0px #ffffff none;" name="myiFrame" scrolling="yes" frameborder="1" marginheight="0px" marginwidth="0px" height="600px" width="100%" allowfullscreen></iframe>
+        <iframe src="{% url 'search-agent-form-embed' %}" style="border:0px #ffffff none;" name="myiFrame" scrolling="yes" frameborder="1" marginheight="0px" marginwidth="0px" height="600px" width="100%" allowfullscreen></iframe>
       </div>
     </div>
 

+ 1 - 1
marktplatz/templates/marktplatz/product_detail.html

@@ -265,7 +265,7 @@
 </div>
 
 
-<div clas="container">
+<div class="container">
 
 	<div class="row" style="margin-top: 10px">
 

+ 2 - 2
marktplatz/templates/marktplatz/product_overview.html

@@ -157,9 +157,9 @@ $(document).ready(function(){
     background-color: #FFFD;
     border-radius: 150px;
 
-  	font-size: 2em;
+  	font-size: 1.5em;
     font-weight: bold;
-    font-family: NeuzeitGro-Bla;
+    font-family: NeuzeitGro-Reg;
     text-align: center;
 
   position: absolute;

+ 8 - 2
marktplatz/urls.py

@@ -14,8 +14,13 @@ urlpatterns = [
     path('products/search', views.SearchProductsView.as_view(), name='search-products'),
     path('products-list/', views.ProductsListView.as_view(), name='products-list'),
     path('products-list/embed', views.ProductsListView.as_view(  embed=True,  ), name='products-list-embed'),
-    path('suchagent/', views.SearchAgentCreate.as_view(), name='search-agent-create'),
-    path('suchagent/embed', views.SearchAgentCreate.as_view( embed=True, ), name='search-agent-create-embed'),
+    path('agent_newsletter/', views.AgentNewslwtterFormView.as_view(), name='search-agent-form'),
+    path('agent_newsletter/embed/', views.AgentNewslwtterFormView.as_view( embed=True, ), name='search-agent-form-embed'),
+    path('agent_newsletter/<slug:newsletter_slug>/anmelden/', views.AgentNewslwtterSubscribeView.as_view(   ), name='agent-newsletter-create'),
+    # path('agent_newsletter/<slug:newsletter_slug>/anmelden/embed/', views.AgentNewslwtterSubscribeView.as_view( embed=True,  ), name='agent-newsletter-create-embed'),
+    # path('agent_newsletter/anmelden', views.AgentNewslwtterSubscribeView.as_view(), name='search-agent-create'),
+    # path('suchagent/', views.SearchAgentCreate.as_view(), name='search-agent-create'),
+    # path('suchagent/embed', views.SearchAgentCreate.as_view( embed=True, ), name='search-agent-create-embed'),
     path('suchagent/<int:pk>/<slug:hash>/', views.SearchAgentDelete.as_view(), name='search-agent-delete'),
     path('product/<int:pk>', views.DetailView.as_view(), name='product-detail'),
     path('product/<int:pk>/embed', views.DetailView.as_view( embed=True, ), name='product-detail-embed'),
@@ -29,6 +34,7 @@ urlpatterns = [
     path('editProduct/<int:pk>', views.EditView.as_view(), name='edit-product'),
     path('addImage/<int:pk>', views.uploadView.as_view(), name='add-Image'),
     path('generic-test/', views.genericView.as_view(), name='generic-test'),
+    path('pages/<slug:page>/', pagesView.as_view(template_name="marktplatz/generic.html"), name='pages-generic'),
     path('generic/', TemplateView.as_view(template_name="marktplatz/generic.html"), name='generic'),
     path('images/<int:pk>', views.MediaView.as_view(), name='media-overview'),
     url(r'^delete_media/(?P<pk>\d+)/$', views.delete_media, name='delete-media'),

+ 105 - 2
marktplatz/views.py

@@ -36,6 +36,9 @@ from django.conf import settings
 
 from constance import config
 from django.db.models import Q
+from newsletter.forms import *
+from newsletter.views import *
+
 # from .forms import LinkFormSet, LinkForm, FormsetHelper, MediaFormsetHelper, MediaFormSet
 from marktplatz.models import *
 from .forms import *
@@ -72,6 +75,80 @@ def home(request):
         return  HttpResponseRedirect(reverse('products'))
 
 
+class AgentNewslwtterFormView(TemplateView):
+    template_name =  'marktplatz/form_newsletter.html'
+    embed = False
+
+    def get_context_data(self, **kwargs):
+        if self.embed :
+            kwargs['embed']       = True
+            kwargs['form_content']       = '<i  class="fas fa-bell"></i> Suchagent einrichten'
+            kwargs['content_a']       = 'Dein Suchagent wurde erstellt!'
+        return super().get_context_data(**kwargs)
+
+    def get(self, request, *args, **kwargs):
+        context = self.get_context_data()
+        context['form'] = AgentNewslwtterForm(  )
+        # print (context)
+        return render(request, self.template_name, context )
+
+class AgentNewslwtterSubscribeView(SubscribeRequestView):
+    action = 'subscribe'
+    # form_class = AgentNewslwtterForm
+    confirm = False
+    embed = False
+
+    def get_context_data(self, **kwargs):
+            if self.embed :
+                kwargs['embed']       = True
+                kwargs['form_content']       = '<i  class="fas fa-bell"></i> Suchagent einrichten'
+                kwargs['content_a']       = 'Dein Suchagent wurde erstellt!'
+
+            # kwargs['news_form']       =  SubscribeRequestForm()
+            return super().get_context_data(**kwargs)
+
+
+    # def get_form_kwargs(self):
+    #     """ Add ip to form kwargs for submitted forms. """
+    #     kwargs = super(SubscribeRequestView, self).get_form_kwargs()
+    #
+    #     if self.request.method in ('POST', 'PUT'):
+    #         kwargs['ip'] = self.request.META.get('REMOTE_ADDR')
+    #
+    #     return kwargs
+    #
+    # def get_subscription(self, form):
+    #     return form.save()
+
+    def post(self, request, *args, **kwargs):
+
+        data = request.POST.copy()
+        data["email"] = data["email_field"]
+
+        agent_form = AgentNewslwtterForm ( data )
+
+        if agent_form.is_valid():
+            agent_form.save()
+        else:
+            context = {}
+            context['form_errors'] = agent_form.errors
+            context['form'] = agent_form
+            return render(request, 'marktplatz/form_newsletter.html', context )
+
+        if agent_form.cleaned_data['subscribe'] :
+            # return super(SubscribeRequestView).get(self, request, *args, **kwargs)
+            return super().post( request, *args, **kwargs )
+            # return super(SubscribeRequestView, self).post( request, *args, **kwargs )
+
+
+        context = {}
+        context['content_a'] = '<br><i  class="fas fa-bell"></i><br><h2>Dein Suchagent wurde erstellt!</h2>'
+        return render(request, 'marktplatz/generic.html', context )
+
+    def dispatch(self, request, *args, **kwargs):
+
+        return super(SubscribeRequestView, self).dispatch( request, *args, **kwargs )
+
 
 class genericView(TemplateView):
     template_name =  'marktplatz/generic.html'
@@ -83,6 +160,30 @@ class genericView(TemplateView):
         print (context)
         return render(request, self.template_name, context )
 
+
+
+class pagesView(TemplateView):
+    template_name =  'marktplatz/generic.html'
+    def get(self, request, *args, **kwargs):
+        print (kwargs)
+        context = {}
+        context['content_a'] = "lalalala"
+        context['content_b'] = config
+        # print (config.items() )
+
+        if 'page' in kwargs:
+            context['content_a'] = kwargs['page']
+            try:
+
+                context['content_a'] = '<br><h2>' + kwargs['page'] + "</h2><br><br>"
+                context['content_b'] = getattr(config , kwargs['page'], '')
+            except KeyError:
+                raise Http404
+            # if config.get ( kwargs['page'] ) != None:
+            #     context['content_b'] = config.get ( kwargs['page'] )
+        return render(request, self.template_name, context )
+
+
 class SearchAgentCreate(CreateView):
     model = SearchAgent
     template_name =  'marktplatz/form.html'
@@ -96,6 +197,8 @@ class SearchAgentCreate(CreateView):
                 kwargs['embed']       = True
                 kwargs['form_content']       = '<i  class="fas fa-bell"></i> Suchagent einrichten'
                 kwargs['content_a']       = 'Dein Suchagent wurde erstellt!'
+
+            # kwargs['news_form']       =  SubscribeRequestForm()
             return super().get_context_data(**kwargs)
 
 
@@ -410,10 +513,10 @@ class lightboximg(LoginRequiredMixin, TemplateView):
 class registerView(FormView):
 
     template_name = 'marktplatz/form.html'
-    #form_class = RegisterForm
+    # form_class = RegisterForm
 
     def get(self, request):
-        #form = self.form_class()
+        # form = self.form_class()
         context = request.GET.dict()
         context['form'] = RegisterForm
         context['signUp'] = SignUpForm

+ 7 - 0
project_base/settings.py

@@ -195,6 +195,9 @@ CONSTANCE_CONFIG = {
     'CURRENT_EVENT': ('MAB20', 'Filter for the projects that should be evaluated'),
     'INFO_TXT': (INFO_TXT, 'Text to help with the fill in the submitform'),
     'SUBMIT_TEXT': (SUBMIT_TEXT, 'Text to welcome to the submitpage'),
+    'IMPRESSUM': ('Impressum text.', 'Impressum'),
+    'TEILNAHME': ('Teilnahmebedingungen text.', 'Teilnahmebedingungen'),
+    'DATENSCHUTZRICHTLINIE': ('Datenschutzrichtlinie text.', 'Datenschutzrichtlinie'),
     'ADMIN_EMAIL': ('juan@mediaarchitecture.org', 'Admin email'),
     'WEBSITE_TITEL': ('Markplatz', 'Name von der Webseite'),
     'WEBSEITE_URI': ('gemeinschaffen.com', 'Url von der Webseite, zB. gemeinschaffen.com'),
@@ -237,6 +240,8 @@ INSTALLED_APPS = [
 
 SITE_ID = 1
 
+
+
 NEWSLETTER_CONFIRM_EMAIL_UNSUBSCRIBE = False
 NEWSLETTER_RICHTEXT_WIDGET = "tinymce.widgets.TinyMCE"
 # Amount of seconds to wait between each email. Here 100ms is used.
@@ -267,6 +272,8 @@ MIDDLEWARE = [
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
+    'htmlmin.middleware.HtmlMinifyMiddleware',
+    'htmlmin.middleware.MarkRequestMiddleware',
     # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 
 ]

+ 4 - 4
project_base/templates/auth/login.html

@@ -6,10 +6,10 @@
      {% csrf_token %}
      <div class="col-sm-10">
 
-     <h4 style="margin-top: 5px">Hello, good to see you again!</h4>
+     <h4 style="margin-top: 5px">Hallo, schön Sie wieder zu sehen!</h4>
 
 <div class="form-group " style="margin-top: 20px" >
-{% if retry %} <p style="color: red">Try again here or reset pwd</p> {% endif %}
+{% if retry %} <p style="color: red">Versuchen Sie es hier erneut oder setzen Sie Ihr Passwort zurück</p> {% endif %}
     <label>{{ form.username.label_tag }}</label>
     <td>{{ form.username }}</td>
 </div>
@@ -24,13 +24,13 @@
   <input style="align-self: start" type="submit" class="btn btn-outline-secondary rounded-0 mybtn" value="login" />
       <input type="hidden" name="next" value="{{ next }}" />
 
-        <a style="align-self: end" class="btn btn-outline-secondary rounded-0 mybtn" href="{% url 'register-view' %}">Register new Account</a>
+        <a style="align-self: end" class="btn btn-outline-secondary rounded-0 mybtn" href="{% url 'register-view' %}">Neuen Account Registrieren</a>
 
 </div>
     </div>
      <div class="col-sm-10">
 
-         <a style="align-self: end" href="{% url 'password_reset' %}">Lost password?</a>
+         <a style="align-self: end" href="{% url 'password_reset' %}">Passwort vergessen?</a>
      </div>
 </form>
 

+ 3 - 3
project_base/templates/auth/password_reset_complete.html

@@ -1,6 +1,6 @@
 {% extends "base_generic.html" %}
 
 {% block content %}
-  <h1>The password has been changed!</h1>
-  <p><a href="{% url 'login' %}">log in again?</a></p>
-{% endblock %}
+  <h1>Das Passwort wurde geändert!</h1>
+  <p><a href="{% url 'login' %}">nochmal anmelden?</a></p>
+{% endblock %}

+ 5 - 5
project_base/templates/auth/password_reset_confirm.html

@@ -10,12 +10,12 @@
             <table>
                 <tr>
                     <td>{{ form.new_password1.errors }}
-                        <label for="id_new_password1">New password:</label></td>
+                        <label for="id_new_password1">Neues Passwort:</label></td>
                     <td>{{ form.new_password1 }}</td>
                 </tr>
                 <tr>
                     <td>{{ form.new_password2.errors }}
-                        <label for="id_new_password2">Confirm password:</label></td>
+                        <label for="id_new_password2">Passwort bestätigen:</label></td>
                     <td>{{ form.new_password2 }}</td>
                 </tr>
                 <tr>
@@ -25,7 +25,7 @@
             </table>
         </form>
     {% else %}
-        <h1>Password reset failed</h1>
-        <p>The password reset link was invalid, possibly because it has already been used. Please request a new password reset.</p>
+      <h1> Zurücksetzen des Passworts fehlgeschlagen </ h1>
+       <p> Der Link zum Zurücksetzen des Kennworts war ungültig, möglicherweise weil er bereits verwendet wurde. Bitte fordern Sie ein neues Zurücksetzen des Passworts an. </ P>
     {% endif %}
-{% endblock %}
+{% endblock %}

+ 2 - 2
project_base/templates/auth/password_reset_done.html

@@ -15,8 +15,8 @@
 
 {% block content_title %}<h3>{{ title }}</h3>{% endblock %}
 
-<p>{% trans "Relax. We've emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly." %}</p>
+<p> {% trans "Entspannen Sie sich. Wir haben Ihnen Anweisungen zum Festlegen Ihres Passworts per E-Mail gesendet, falls mit der von Ihnen eingegebenen E-Mail ein Konto vorhanden ist. Sie sollten diese in Kürze erhalten." %} </p>
 
-<p>{% trans "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder." %}</p>
+<p> {% trans "Wenn Sie keine E-Mail erhalten, stellen Sie bitte sicher, dass Sie die Adresse eingegeben haben, unter der Sie sich registriert haben, und überprüfen Sie Ihren Spam-Ordner." %} </p>
 
 {% endblock %}

+ 2 - 2
project_base/templates/auth/password_reset_email.html

@@ -1,2 +1,2 @@
-Someone asked for password reset for email {{ email }}. Follow the link below:
-{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
+Jemand hat nach einem Zurücksetzen des Passworts für E-Mail {{email}} gefragt. Folgen Sie dem Link unten:
+{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}

+ 2 - 2
project_base/templates/auth/password_reset_form.html

@@ -11,12 +11,12 @@
 </div>
 
 <form method="post">{% csrf_token %}
-  <p>Have you Forgotten your password!? O-: <br/> -No worries. <br/> Enter your email address below, and we'll email instructions for setting a new one.</p>
+  <p>Haben Sie Ihr Passwort vergessen!? O-: <br/> - Keine Sorge. <br/> Geben Sie unten Ihre E-Mail-Adresse ein, und wir senden Ihnen Anweisungen zum Festlegen einer neuen E-Mail.</p>
 
 <fieldset class="module aligned">
     <div class="form-row field-email">
         {{ form.email.errors }}
-        <label for="id_email">{% trans 'Email address:' %}</label>
+        <label for="id_email">{% trans 'E-Mail-Adresse :' %}</label>
         <div class="">
           &nbsp;
         </div>

+ 90 - 75
project_base/templates/base_generic.html

@@ -4,7 +4,7 @@
 <head>
 
     <meta charset="UTF-8">
-    {% block title %} <title>{{ config.WEBSITE_TITEL }}</title> {% endblock %}
+    <title>{% block title %} {{ config.WEBSITE_TITEL }} {% endblock %}</title>
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
     {% load static %}
 
@@ -50,97 +50,112 @@
 
 
     <style>
+      /* The Modal (background) */
+      .modal {
+        display: none;
+        /* Hidden by default */
+        position: fixed;
+        /* Stay in place */
+        z-index: 1;
+        /* Sit on top */
+        padding-top: 100px;
+        /* Location of the box */
+        left: 0;
+        top: 0;
+        width: 100%;
+        /* Full width */
+        height: 100%;
+        /* Full height */
+        overflow: auto;
+        /* Enable scroll if needed */
+        background-color: rgb(0, 0, 0);
+        /* Fallback color */
+        background-color: rgba(0, 0, 0, 0.4);
+        /* Black w/ opacity */
+      }
+
+      /* Modal Content */
+      .modal-content {
+        background-color: #fefefe;
+        margin: auto;
+        padding: 20px;
+        border: 1px solid #888;
+        width: 80%;
+      }
+
+      /* The Close Button */
+      .close {
+        color: #aaaaaa;
+        float: right;
+        font-size: 28px;
+        font-weight: bold;
+      }
+
+      .close:hover,
+      .close:focus {
+        color: #000;
+        text-decoration: none;
+        cursor: pointer;
+      }
+
+
+      .mab-menu-mega {
 
-    /* The Modal (background) */
-    .modal {
-      display: none; /* Hidden by default */
-      position: fixed; /* Stay in place */
-      z-index: 1; /* Sit on top */
-      padding-top: 100px; /* Location of the box */
-      left: 0;
-      top: 0;
-      width: 100%; /* Full width */
-      height: 100%; /* Full height */
-      overflow: auto; /* Enable scroll if needed */
-      background-color: rgb(0,0,0); /* Fallback color */
-      background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
-    }
-
-    /* Modal Content */
-    .modal-content {
-      background-color: #fefefe;
-      margin: auto;
-      padding: 20px;
-      border: 1px solid #888;
-      width: 80%;
-    }
-
-    /* The Close Button */
-    .close {
-      color: #aaaaaa;
-      float: right;
-      font-size: 28px;
-      font-weight: bold;
-    }
-
-    .close:hover,
-    .close:focus {
-      color: #000;
-      text-decoration: none;
-      cursor: pointer;
-    }
-
-
-    .mab-menu-mega {
-
-      padding: .15em .75em .15em 0.75em;
-      border-style: solid;
-      border-width: 0px;
-      border-color: #469CA8;
-      color: #469CA8;
-      background-color: #CEEAE8;
-      border-radius: 150px;
-
-    	font-size: 1em;
-      /* font-weight: bold; */
-      font-family: NeuzeitGro-Bla;
-      text-align: center;
-      margin: 5px 10px 5px 10px;
-
-
-    /* position: absolute;
+        padding: .15em .75em .15em 0.75em;
+        border-style: solid;
+        border-width: 0px;
+        border-color: #469CA8;
+        color: #469CA8;
+        background-color: #CEEAE8;
+        border-radius: 150px;
+
+        font-size: 1em;
+        /* font-weight: bold; */
+        font-family: NeuzeitGro-Bla;
+        text-align: center;
+        margin: 5px 10px 5px 10px;
+
+
+        /* position: absolute;
     bottom: 16px;
     left: 16px; */
 
 
-    }
-
+      }
 
-    .mab-menu-mega:hover {
-    	color: #FFF;
-    	background-color: #469cab;
-    }
 
-    .mab-menu-elm{
-      color: #469CA8;
-      padding: 12px 8px 12px 8px;
-      display:block;
+      .mab-menu-mega:hover {
+        color: #FFF;
+        background-color: #469cab;
+      }
 
-    }
-    .mab-menu-elm:hover{
-      color: #FFF;
+      .mab-menu-elm {
+        color: #469CA8;
+        padding: 12px 8px 12px 8px;
+        display: block;
 
-    }
+      }
 
+      .mab-menu-elm:hover {
+        color: #FFF;
 
+      }
 
+      .mab-logo {
 
+        padding-bottom: 10px;
+        width: 75%
+      }
     </style>
 
 
     {% block script %}
 
     {% endblock %}
+
+    {% block header %}
+    {% endblock header %}
+
 </head>
 <body>
 
@@ -187,7 +202,7 @@
     </li>
 
     <li class="nav-item mab-nav-item mab-menu-mega">
-      <span class=" active boldkur mab-menu-elm" onclick="window.location='{% url 'search-agent-create' %}' ">Suchagent</span>
+      <span class=" active boldkur mab-menu-elm" onclick="window.location='{% url 'search-agent-form' %}' ">Suchagent</span>
       <!-- <a class=" nav-link active nav-right boldkur mab-menu-elm  " style="" href="{% url 'login' %}">Suchagent</a> -->
     </li>
     <li class="nav-item mab-nav-item mab-menu-mega">
@@ -209,7 +224,7 @@
 
 <nav class="navbar navbar-fixed-top mab-navbar navbar-expand-lg navbar-light bg-light">
   <a class="navbar-brand navbar-right" href="{% url 'products' %}" style="width:45%" >
-    <img src="{% static 'logo_gemeinschaffen.png' %}" alt="Markplatz" class="img-fluid" width="auto" style="padding-bottom: 2px; width:75%">
+    <img src="{% static 'logo_gemeinschaffen.png' %}" alt="Markplatz" class="img-fluid mab-logo" width="auto" style="">
   </a>
 
   <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarBottom" aria-controls="navbarBottom" aria-expanded="false" aria-label="Toggle navigation">

+ 36 - 14
project_base/templates/newsletter/common.html

@@ -1,15 +1,37 @@
+{% extends "base_generic.html" %}
 {% load i18n %}
-<!DOCTYPE html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <title>{% block title %}{% trans "Newsletter" %}{% endblock title %}</title>
-        {% block header %}
-        {% endblock header %}
-    </head>
-
-    <body>
-        {% block body %}
-        {% endblock body %}
-    </body>
-</html>
+{% load tags %}
+{% load static %}
+
+
+{% block title %} {% trans "Newsletter" %} {% endblock %}
+
+
+
+{% block content %}
+<div class="container ">
+
+  <div class="row" style="margin-top: 10px">
+
+		<div class="col-sm-8">
+
+
+
+
+      {% block header %}
+      {% endblock header %}
+
+      {% block body %}
+      {% endblock body %}
+
+
+
+
+
+
+      </div>
+
+    </div>
+
+</div>
+{% endblock content %}

+ 1 - 1
requirements.txt

@@ -1,5 +1,5 @@
 django==3.1.3
-django-htmlmin==0.10.0
+django-htmlmin==0.11
 Pillow==6.2.0
 django-smtp-ssl==1.0
 django-imagekit==4.0.2