Ready for the first deployment!

main
Jaap Joris Vens 2020-03-11 11:48:37 +01:00
rodzic 2ef844044d
commit b56bbec534
7 zmienionych plików z 73 dodań i 73 usunięć

Wyświetl plik

@ -7,41 +7,24 @@ from django.utils.translation import gettext_lazy as _
Page = swapper.load_model('cms', 'Page')
Section = swapper.load_model('cms', 'Section')
class ConfirmationForm(forms.Form):
pass
class ContactForm(forms.Form):
sender = forms.EmailField(label=_('Your email address'))
spam_protection = forms.CharField(label=_('Your message'), widget=forms.Textarea())
message = forms.CharField(label=_('Your message'), widget=forms.Textarea(), initial='Hi there!')
def save(self, request):
hostname = request.get_host()
body = self.cleaned_data.get('spam_protection')
if len(body.split()) < 7:
return
spamcheck = self.cleaned_data.get('message')
if spamcheck != 'Hi there!':
return
email = EmailMessage(
to = ['info@' + hostname],
from_email = 'noreply@' + hostname,
body = body,
subject = _('Contact form at %(hostname)s.') % {'hostname': hostname},
headers = {'Reply-To': self.cleaned_data.get('sender')},
)
email.send()
class PageForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.formsets = [SectionFormSet(
extra = 1 if self.instance.pk else 2
self.formsets = [forms.inlineformset_factory(
parent_model = Page,
model = Section,
form = SectionForm,
formset = BaseSectionFormSet,
extra=extra,
)(
data=self.data if self.is_bound else None,
files=self.files if self.is_bound else None,
instance=self.instance,
form_kwargs={'label_suffix': self.label_suffix},
)]
if not self.instance.pk:
self.formsets[0][0].empty_permitted = False
def is_valid(self):
return super().is_valid() and self.formsets[0].is_valid()
@ -76,9 +59,6 @@ class SectionForm(forms.ModelForm):
self.fields['type'].choices = self._meta.model.TYPES
self.fields['type'].initial = self._meta.model.TYPES[0][0]
self.fields['type'].widget.attrs['class'] = 'type'
self.fields['type'].widget.attrs['data-form'] = self.prefix
def delete(self):
instance = super().save()
instance.delete()
@ -111,10 +91,6 @@ class SectionForm(forms.ModelForm):
# ignored entirely. Workaround to force a ChoiceField anyway:
type = forms.ChoiceField()
#SectionFormSet = inlineformset_factory(Page, Section, form=SectionForm, extra=1)
class BaseSectionFormSet(forms.BaseInlineFormSet):
'''If a swappable Section model defines one-to-many fields, (i.e. has
foreign keys pointing to it) formsets will be generated for the
@ -136,11 +112,13 @@ class BaseSectionFormSet(forms.BaseInlineFormSet):
form.formsets = []
for field in section._meta.get_fields():
if field.one_to_many:
if getattr(section, field.name).exists():
extra = 1
else:
extra = 2
formset = forms.inlineformset_factory(Section, field.related_model, fields='__all__', extra=extra)(
extra = 1 if getattr(section, field.name).exists() else 2
formset = forms.inlineformset_factory(
Section, field.related_model,
fields='__all__',
extra=extra,
)(
instance=section,
data=form.data if self.is_bound else None,
files=form.files if self.is_bound else None,
@ -165,10 +143,25 @@ class BaseSectionFormSet(forms.BaseInlineFormSet):
formset.save(commit=commit)
return result
SectionFormSet = forms.inlineformset_factory(
parent_model = Page,
model = Section,
form = SectionForm,
formset = BaseSectionFormSet,
extra=1,
)
class ContactForm(forms.Form):
sender = forms.EmailField(label=_('Your email address'))
spam_protection = forms.CharField(label=_('Your message'), widget=forms.Textarea())
message = forms.CharField(label=_('Your message'), widget=forms.Textarea(), initial='Hi there!')
def save(self, request):
hostname = request.get_host()
body = self.cleaned_data.get('spam_protection')
if len(body.split()) < 7:
return
spamcheck = self.cleaned_data.get('message')
if spamcheck != 'Hi there!':
return
email = EmailMessage(
to = ['info@' + hostname],
from_email = 'noreply@' + hostname,
body = body,
subject = _('Contact form at %(hostname)s.') % {'hostname': hostname},
headers = {'Reply-To': self.cleaned_data.get('sender')},
)
email.send()

Wyświetl plik

@ -1,8 +1,10 @@
$font: Merriweather, sans-serif;
body {
html, body {
font-family: $font;
line-height: 2;
margin: 0;
padding: 0;
}
/* Form elements */
@ -12,10 +14,13 @@ form.cms {
overflow: hidden;
min-height: 100vh;
$background: #fff6;
padding-bottom: 125px;
display: flex;
align-items: center;
justify-content: center;
div.wrapper {
margin: 0 auto;
max-width: none;
flex: 0 1 640px;
padding: 0 0.5em;
}
@ -33,7 +38,6 @@ form.cms {
clear: both;
width: 50px;
cursor: pointer;
float: right;
}
div.formfield {

Wyświetl plik

@ -1,15 +1,20 @@
body {
html, body {
font-family: Merriweather, sans-serif;
line-height: 2; }
line-height: 2;
margin: 0;
padding: 0; }
/* Form elements */
form.cms {
background: #bfb;
overflow: hidden;
min-height: 100vh;
padding-bottom: 125px; }
display: flex;
align-items: center;
justify-content: center; }
form.cms div.wrapper {
margin: 0 auto;
max-width: none;
flex: 0 1 640px;
padding: 0 0.5em; }
form.cms fieldset {
background: #fff6;
@ -22,8 +27,7 @@ form.cms {
display: block;
clear: both;
width: 50px;
cursor: pointer;
float: right; }
cursor: pointer; }
form.cms div.formfield {
margin-bottom: 10px;
clear: both;

Wyświetl plik

@ -5,5 +5,5 @@
"admin.scss"
],
"names": [],
"mappings": "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"
"mappings": "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"
}

Wyświetl plik

@ -96,8 +96,9 @@
}
function setEventHandlers() {
for (let typefield of document.querySelectorAll('select.type')) {
let form = document.getElementById(typefield.dataset.form);
for (let typefield of document.querySelectorAll('select[name$=-type]')) {
let formId = typefield.name.replace(/-type$/, '');
let form = document.getElementById(formId);
let type = typefield.value.toLowerCase();
showRelevantFields(form, type);
typefield.addEventListener('input', function() {

Wyświetl plik

@ -1,23 +1,21 @@
{% extends "base.html" %}
{% extends "admin.html" %}
{% load static %}
{% load i18n %}
{% block nav %}
{% endblock %}
{% block content %}
<form method="post" class="cms">
{% csrf_token %}
<section>
<div class="wrapper">
<form method="post" class="cms" novalidate>
<div class="wrapper">
{% csrf_token %}
<fieldset>
{{form.non_field_errors}}
<h1>{% trans 'Log in' %}</h1>
{% for field in form %}
{% include 'cms/formfield.html' with field=field %}
{% endfor %}
<button class="button">{% trans 'Log in' %}</button>
</div>
</section>
</fieldset>
</div>
<div class="edit page">
<button><img src="{% static 'cms/save.png' %}"></button>
</div>
</form>
{% endblock %}

Wyświetl plik

@ -10,7 +10,7 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.mixins import UserPassesTestMixin
from .decorators import register_view
from .forms import PageForm, SectionForm, SectionFormSet
from .forms import PageForm
Page = swapper.load_model('cms', 'Page')
Section = swapper.load_model('cms', 'Section')