Replace contact page with contact email address
This commit is contained in:
parent
0562cea479
commit
298998324c
@ -215,52 +215,6 @@ input[type=submit]:hover,
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Contact form
|
|
||||||
========================================================================== */
|
|
||||||
.contact-form {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(2, 1fr);
|
|
||||||
gap: 0 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-form p:nth-child(6) {
|
|
||||||
grid-column: span 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-form #id_captcha {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
display: flex;
|
|
||||||
justify-content: flex-end;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-form div:last-child {
|
|
||||||
grid-column: 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-form label {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
:is(.contact-form) input, select, textarea {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 600px) {
|
|
||||||
.contact-form {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
.contact-form p:nth-child(6),
|
|
||||||
.contact-form div:last-child {
|
|
||||||
grid-column: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
figure {
|
figure {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|||||||
@ -13,8 +13,6 @@ from captcha.fields import CaptchaField
|
|||||||
from core.models import Order
|
from core.models import Order
|
||||||
from core import CoffeeGrind, ShippingContainer
|
from core import CoffeeGrind, ShippingContainer
|
||||||
|
|
||||||
from .tasks import contact_form_email
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@ -137,34 +135,3 @@ class OrderCreateForm(forms.ModelForm):
|
|||||||
|
|
||||||
class CouponApplyForm(forms.Form):
|
class CouponApplyForm(forms.Form):
|
||||||
code = forms.CharField(label='Coupon code')
|
code = forms.CharField(label='Coupon code')
|
||||||
|
|
||||||
|
|
||||||
class ContactForm(forms.Form):
|
|
||||||
GOOGLE = 'Google Search'
|
|
||||||
SHOP = 'The coffee shop'
|
|
||||||
WOM = 'Word of mouth'
|
|
||||||
PRODUCT = 'Coffee Bag'
|
|
||||||
STORE = 'Store'
|
|
||||||
OTHER = 'Other'
|
|
||||||
|
|
||||||
REFERAL_CHOICES = [
|
|
||||||
(GOOGLE, 'Google Search'),
|
|
||||||
(SHOP, '"Better Living Through Coffee" coffee shop'),
|
|
||||||
(WOM, 'Friend/Relative'),
|
|
||||||
(PRODUCT, 'Our Coffee Bag'),
|
|
||||||
(STORE, 'PT Food Coop/other store'),
|
|
||||||
(OTHER, 'Other (please describe below)'),
|
|
||||||
]
|
|
||||||
|
|
||||||
full_name = forms.CharField()
|
|
||||||
email_address = forms.EmailField()
|
|
||||||
referal = forms.ChoiceField(
|
|
||||||
label='How did you find our website?',
|
|
||||||
choices=REFERAL_CHOICES
|
|
||||||
)
|
|
||||||
subject = forms.CharField()
|
|
||||||
message = forms.CharField(widget=forms.Textarea)
|
|
||||||
captcha = CaptchaField()
|
|
||||||
|
|
||||||
def send_email(self):
|
|
||||||
contact_form_email.delay(self.cleaned_data)
|
|
||||||
|
|||||||
@ -6,26 +6,3 @@ from django.core.mail import EmailMessage, send_mail
|
|||||||
from templated_email import send_templated_mail
|
from templated_email import send_templated_mail
|
||||||
|
|
||||||
logger = get_task_logger(__name__)
|
logger = get_task_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
CONTACT_FORM_TEMPLATE = 'storefront/contact_form'
|
|
||||||
|
|
||||||
|
|
||||||
@shared_task(name='contact_form_email')
|
|
||||||
def contact_form_email(formdata):
|
|
||||||
with open(f'{settings.BASE_DIR.parent}/.blacklist') as blacklist:
|
|
||||||
if formdata.get('email_address') not in blacklist.read():
|
|
||||||
send_templated_mail(
|
|
||||||
template_name=CONTACT_FORM_TEMPLATE,
|
|
||||||
from_email=settings.DEFAULT_FROM_EMAIL,
|
|
||||||
recipient_list=[settings.DEFAULT_CONTACT_EMAIL],
|
|
||||||
context=formdata
|
|
||||||
)
|
|
||||||
|
|
||||||
logger.info(
|
|
||||||
f"Contact form email sent from {formdata['email_address']}"
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
logger.warn(
|
|
||||||
f"{formdata['email_address']} tried to send an email but was on the blacklist"
|
|
||||||
)
|
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
<input type="submit" value="Continue">
|
<input type="submit" value="Continue">
|
||||||
</p>
|
</p>
|
||||||
</form>
|
</form>
|
||||||
<p>We validate addresses with USPS, if you are having issues please contact us at <a href="mailto:support@ptcoffee.com">support@ptcoffee.com</a> or use the contact information found on our <a href="{% url 'storefront:contact' %}">contact</a> page.</p>
|
<p>We validate addresses with USPS, if you are having issues please contact us at <a href="mailto:support@ptcoffee.com">support@ptcoffee.com</a>.</p>
|
||||||
</section>
|
</section>
|
||||||
</article>
|
</article>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@ -1,57 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block head_title %}Contact | {% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="site__banner site__banner--site">
|
|
||||||
<h1>Contact us</h1>
|
|
||||||
</div>
|
|
||||||
<article>
|
|
||||||
<header>
|
|
||||||
<h4>Problem with your online order or have a question?</h4>
|
|
||||||
<p>
|
|
||||||
Please contact us, we’re happy to help you over the phone<br>
|
|
||||||
<a href="tel:+13603855856">(360) 385-5856</a> Mon-Fri between 9:00 am and 5:00 pm Pacific Time.
|
|
||||||
</p>
|
|
||||||
<p>Or send us a message using the form below and we'll email you back as soon as we can.</p>
|
|
||||||
</header>
|
|
||||||
<section>
|
|
||||||
<form action="{% url 'storefront:contact' %}" method="post" class="contact-form">
|
|
||||||
{% csrf_token %}
|
|
||||||
{{ form.non_field_errors }}
|
|
||||||
<p>
|
|
||||||
{{ form.full_name.errors }}
|
|
||||||
<label for="{{ form.full_name.id_for_label }}">Full name:</label>
|
|
||||||
{{ form.full_name }}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{{ form.email_address.errors }}
|
|
||||||
<label for="{{ form.email_address.id_for_label }}">Email address</label>
|
|
||||||
{{ form.email_address }}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{{ form.referal.errors }}
|
|
||||||
<label for="{{ form.referal.id_for_label }}">How did you find our website?</label>
|
|
||||||
{{ form.referal }}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{{ form.subject.errors }}
|
|
||||||
<label for="{{ form.subject.id_for_label }}">Subject:</label>
|
|
||||||
{{ form.subject }}
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{{ form.message.errors }}
|
|
||||||
<label for="{{ form.message.id_for_label }}">Message:</label>
|
|
||||||
{{ form.message }}
|
|
||||||
</p>
|
|
||||||
<div>
|
|
||||||
{{ form.captcha.errors }}
|
|
||||||
<p>
|
|
||||||
{{ form.captcha }}
|
|
||||||
</p>
|
|
||||||
<p><input type="submit" value="Send message"></p>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</section>
|
|
||||||
</article>
|
|
||||||
{% endblock %}
|
|
||||||
@ -20,7 +20,7 @@ from storefront.views import (
|
|||||||
PaymentDoneView, PaymentCanceledView,
|
PaymentDoneView, PaymentCanceledView,
|
||||||
CustomerDetailView, CustomerUpdateView, OrderDetailView,
|
CustomerDetailView, CustomerUpdateView, OrderDetailView,
|
||||||
CustomerAddressCreateView, CustomerAddressUpdateView,
|
CustomerAddressCreateView, CustomerAddressUpdateView,
|
||||||
AboutView, FairTradeView, ReviewListView, ContactFormView,
|
AboutView, FairTradeView, ReviewListView,
|
||||||
)
|
)
|
||||||
from storefront.cart import Cart
|
from storefront.cart import Cart
|
||||||
|
|
||||||
@ -426,21 +426,3 @@ class ReviewListViewTest(TestCase):
|
|||||||
response = self.client.get(reverse('storefront:reviews'))
|
response = self.client.get(reverse('storefront:reviews'))
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertTemplateUsed(response, 'storefront/reviews.html')
|
self.assertTemplateUsed(response, 'storefront/reviews.html')
|
||||||
|
|
||||||
|
|
||||||
class ContactFormViewTest(TestCase):
|
|
||||||
def setUp(self):
|
|
||||||
self.client = Client()
|
|
||||||
|
|
||||||
def test_view_url_exists_at_desired_location(self):
|
|
||||||
response = self.client.get('/contact/')
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
|
|
||||||
def test_view_url_accessible_by_name(self):
|
|
||||||
response = self.client.get(reverse('storefront:contact'))
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
|
|
||||||
def test_view_uses_correct_template(self):
|
|
||||||
response = self.client.get(reverse('storefront:contact'))
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
self.assertTemplateUsed(response, 'storefront/contact_form.html')
|
|
||||||
|
|||||||
@ -5,7 +5,6 @@ urlpatterns = [
|
|||||||
path('about/', views.AboutView.as_view(), name='about'),
|
path('about/', views.AboutView.as_view(), name='about'),
|
||||||
path('fair-trade/', views.FairTradeView.as_view(), name='fair-trade'),
|
path('fair-trade/', views.FairTradeView.as_view(), name='fair-trade'),
|
||||||
path('reviews/', views.ReviewListView.as_view(), name='reviews'),
|
path('reviews/', views.ReviewListView.as_view(), name='reviews'),
|
||||||
path('contact/', views.ContactFormView.as_view(), name='contact'),
|
|
||||||
|
|
||||||
path('', views.ProductListView.as_view(), name='product-list'),
|
path('', views.ProductListView.as_view(), name='product-list'),
|
||||||
path('products/<int:pk>/', include([
|
path('products/<int:pk>/', include([
|
||||||
|
|||||||
@ -36,7 +36,7 @@ from core import OrderStatus, ShippingContainer
|
|||||||
|
|
||||||
from .forms import (
|
from .forms import (
|
||||||
AddToCartForm, UpdateCartItemForm, OrderCreateForm,
|
AddToCartForm, UpdateCartItemForm, OrderCreateForm,
|
||||||
AddressForm, CouponApplyForm, ContactForm, CheckoutShippingForm,
|
AddressForm, CouponApplyForm, CheckoutShippingForm,
|
||||||
)
|
)
|
||||||
from .cart import Cart
|
from .cart import Cart
|
||||||
from .payments import CaptureOrder
|
from .payments import CaptureOrder
|
||||||
@ -491,14 +491,3 @@ class FairTradeView(TemplateView):
|
|||||||
|
|
||||||
class ReviewListView(TemplateView):
|
class ReviewListView(TemplateView):
|
||||||
template_name = 'storefront/reviews.html'
|
template_name = 'storefront/reviews.html'
|
||||||
|
|
||||||
|
|
||||||
class ContactFormView(FormView, SuccessMessageMixin):
|
|
||||||
template_name = 'storefront/contact_form.html'
|
|
||||||
form_class = ContactForm
|
|
||||||
success_url = reverse_lazy('storefront:product-list')
|
|
||||||
success_message = 'Message sent.'
|
|
||||||
|
|
||||||
def form_valid(self, form):
|
|
||||||
form.send_email()
|
|
||||||
return super().form_valid(form)
|
|
||||||
|
|||||||
@ -51,7 +51,7 @@
|
|||||||
<li><a class="nav__link" href="{% url 'storefront:reviews' %}">Reviews</a></li>
|
<li><a class="nav__link" href="{% url 'storefront:reviews' %}">Reviews</a></li>
|
||||||
<li><a class="nav__link" href="{% url 'storefront:about' %}">About</a></li>
|
<li><a class="nav__link" href="{% url 'storefront:about' %}">About</a></li>
|
||||||
<li><a class="nav__link" href="https://bltcoffee.com/">Cafe</a></li>
|
<li><a class="nav__link" href="https://bltcoffee.com/">Cafe</a></li>
|
||||||
<li><a class="nav__link" href="{% url 'storefront:contact' %}">Contact</a></li>
|
<li><a class="nav__link" href="mailto:support@ptcoffee.com">Contact</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<div class="nav__menu nav__account">
|
<div class="nav__menu nav__account">
|
||||||
@ -93,13 +93,13 @@
|
|||||||
<p><button class="show-modal">Subscribe to our newsletter</button></p>
|
<p><button class="show-modal">Subscribe to our newsletter</button></p>
|
||||||
<p>
|
<p>
|
||||||
<strong>Problem with your online order or have a question?</strong><br>
|
<strong>Problem with your online order or have a question?</strong><br>
|
||||||
Please <a href="{% url 'storefront:contact' %}">contact us</a>, we’re happy to help you over the phone at <a href="tel:+13603855856">(360) 385-5856</a><br>
|
Please <a href="mailto:support@ptcoffee.com">contact us</a>, we’re happy to help you over the phone at <a href="tel:+13603855856">(360) 385-5856</a><br>
|
||||||
Mon-Fri between 9:00 am and 5:00 pm Pacific Time.<br>
|
Mon-Fri between 9:00 am and 5:00 pm Pacific Time.<br>
|
||||||
<address>854 East Park Ave. Suite 1, Port Townsend, WA 98368</address>
|
<address>854 East Park Ave. Suite 1, Port Townsend, WA 98368</address>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Better Living Food Company Inc.℠<br>
|
Better Living Food Company Inc.℠<br>
|
||||||
<small><a href="{% url 'storefront:contact' %}">Contact</a> | Fair Trade | Organic</small>
|
<small><a href="mailto:support@ptcoffee.com">Contact</a> | Fair Trade | Organic</small>
|
||||||
<br>
|
<br>
|
||||||
<small>Website by <a href="https://nathanjchapman.com">Nathan Chapman</a></small>
|
<small>Website by <a href="https://nathanjchapman.com">Nathan Chapman</a></small>
|
||||||
<br><br>
|
<br><br>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user