Ship College Craft public site and point CI deploys at college_craft.
Deploy Beta / unit-tests (push) Successful in 21s
Deploy Beta / docker (push) Successful in 26s
Deploy Beta / deploy-beta (push) Successful in 6m25s

Replaces template branding with College Craft pages, assets, and copy, and
matches Gitea deploy workflows to the server-infra catalog name and master
branch so beta deploys actually run.

Closes #1
This commit is contained in:
2026-09-02 09:42:43 -05:00
parent b62357c8be
commit b46e192138
191 changed files with 2404 additions and 2041 deletions
+7 -1
View File
@@ -64,6 +64,12 @@ def tianji_tracking(request):
elif namespace == "social":
nav_section = "social"
page_name = url_name
if namespace == "blog":
page_name = "blog"
elif namespace == "public" and url_name:
page_name = url_name
return {
"tianji_enabled": getattr(settings, "TIANJI_ENABLED", False)
and bool(getattr(settings, "TIANJI_WEBSITE_ID", ""))
@@ -74,6 +80,6 @@ def tianji_tracking(request):
"https://tianji.aimloperations.com/tracker.js",
),
"tianji_website_id": getattr(settings, "TIANJI_WEBSITE_ID", ""),
"page_name": url_name,
"page_name": page_name,
"nav_section": nav_section,
}
+1 -1
View File
@@ -82,7 +82,7 @@ def plain_text_to_email_html(text: str) -> str:
lines = [html.escape(line) for line in para.split("\n")]
joined = "<br>\n".join(lines)
joined = _URL_RE.sub(
r'<a href="\1" style="color:#00626c;text-decoration:underline;">\1</a>',
r'<a href="\1" style="color:#a92121;text-decoration:underline;">\1</a>',
joined,
)
blocks.append(
+132 -3
View File
@@ -4,9 +4,11 @@ from django.conf import settings
class ContactForm(forms.Form):
INTEREST_CHOICES = [
("general", "General inquiry"),
("quote", "Request a quote"),
("support", "Support"),
("quote", "Free estimate"),
("interior", "Interior painting"),
("exterior", "Exterior painting"),
("commercial", "Commercial / multi-family"),
("deck", "Deck staining & power washing"),
("other", "Something else"),
]
@@ -109,6 +111,133 @@ class ContactForm(forms.Form):
self.fields["captcha"] = ReCaptchaField(widget=ReCaptchaV3)
class CareersForm(forms.Form):
POSITION_CHOICES = [
("foreman", "Job Foreman"),
("painter", "Painter"),
("sales", "Sales"),
("subcontractor", "Sub-Contractor"),
]
YES_NO = [("yes", "Yes"), ("no", "No")]
first_name = forms.CharField(
max_length=100,
widget=forms.TextInput(attrs={"class": "form-input", "id": "careers-first-name"}),
)
last_name = forms.CharField(
max_length=100,
required=False,
widget=forms.TextInput(attrs={"class": "form-input", "id": "careers-last-name"}),
)
email = forms.EmailField(
widget=forms.EmailInput(attrs={"class": "form-input", "id": "careers-email"}),
)
phone = forms.CharField(
max_length=32,
required=False,
widget=forms.TextInput(attrs={"class": "form-input", "id": "careers-phone"}),
)
address_line1 = forms.CharField(
max_length=200,
required=False,
label="Street address",
widget=forms.TextInput(
attrs={
"class": "form-input",
"id": "careers-address-line1",
"autocomplete": "off",
"data-ac": "line1",
}
),
)
address_line2 = forms.CharField(
max_length=200,
required=False,
label="Apt / suite",
widget=forms.TextInput(
attrs={
"class": "form-input",
"id": "careers-address-line2",
"autocomplete": "address-line2",
"data-ac": "line2",
}
),
)
address_city = forms.CharField(
max_length=100,
required=False,
label="City",
widget=forms.TextInput(
attrs={
"class": "form-input",
"id": "careers-address-city",
"autocomplete": "address-level2",
"data-ac": "city",
}
),
)
address_state = forms.CharField(
max_length=32,
required=False,
label="State",
widget=forms.TextInput(
attrs={
"class": "form-input",
"id": "careers-address-state",
"autocomplete": "address-level1",
"data-ac": "state",
}
),
)
address_zip = forms.CharField(
max_length=20,
required=False,
label="ZIP",
widget=forms.TextInput(
attrs={
"class": "form-input",
"id": "careers-address-zip",
"autocomplete": "postal-code",
"data-ac": "zip",
}
),
)
positions = forms.MultipleChoiceField(
choices=POSITION_CHOICES,
widget=forms.CheckboxSelectMultiple,
)
qualifications = forms.CharField(
label="Work history & qualifications",
widget=forms.Textarea(
attrs={"class": "form-input", "id": "careers-qualifications", "rows": 6}
),
)
start_date = forms.CharField(
max_length=120,
required=False,
label="When can you start?",
widget=forms.TextInput(attrs={"class": "form-input", "id": "careers-start"}),
)
drivers_license = forms.ChoiceField(
choices=YES_NO,
widget=forms.RadioSelect,
label="Do you have a valid driver's license?",
)
has_vehicle = forms.ChoiceField(
choices=YES_NO,
widget=forms.RadioSelect,
label="Do you have transportation to the job site?",
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if settings.RECAPTCHA_PUBLIC_KEY and settings.RECAPTCHA_PRIVATE_KEY:
from django_recaptcha.fields import ReCaptchaField
from django_recaptcha.widgets import ReCaptchaV3
self.fields["captcha"] = ReCaptchaField(widget=ReCaptchaV3)
class NotifyForm(forms.Form):
email = forms.EmailField(
widget=forms.EmailInput(attrs={"class": "form-input"}),
+3 -2
View File
@@ -13,7 +13,7 @@ from public.email_branding import email_brand_context
logger = logging.getLogger(__name__)
def notify_admins_of_contact_form(lead: Lead) -> bool:
def notify_admins_of_contact_form(lead: Lead, *, subject_prefix: str | None = None) -> bool:
"""
Email CONTACT_EMAIL when someone submits the public contact form.
@@ -62,8 +62,9 @@ def notify_admins_of_contact_form(lead: Lead) -> bool:
text_content = get_template("emails/contact_email.txt").render(ctx)
html_content = get_template("emails/contact_email.html").render(ctx)
prefix = subject_prefix or "New contact form inquiry"
mail = EmailMultiAlternatives(
subject=f"New contact form inquiry from {name}",
subject=f"{prefix} from {name}",
body=text_content,
from_email=settings.DEFAULT_FROM_EMAIL,
to=[to_email],
+7 -7
View File
@@ -36,11 +36,11 @@
color: #212121;
font-family: "Work Sans", Poppins, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
}
a { color: #00626c; }
a { color: #a92121; }
.email-btn {
display: inline-block;
padding: 12px 24px;
background-color: #00626c;
background-color: #a92121;
color: #ffffff !important;
text-decoration: none;
border-radius: 4px;
@@ -62,11 +62,11 @@
<tr>
<td align="center" style="padding:28px 24px 20px;border-bottom:1px solid #d9e3e4;">
{% if logo_url %}
<a href="{{ site_url|default:'https://mkdrealtor.com' }}" style="text-decoration:none;">
<img src="{{ logo_url }}" alt="{{ brand_name|default:'Your Company' }} · EXIT Realty" width="160" style="display:block;width:160px;max-width:70%;height:auto;">
<a href="{{ site_url|default:'https://collegecraft.com' }}" style="text-decoration:none;">
<img src="{{ logo_url }}" alt="{{ brand_name|default:'College Craft Painters' }}" width="160" style="display:block;width:160px;max-width:70%;height:auto;">
</a>
{% else %}
<p style="margin:0;font-size:20px;font-weight:700;letter-spacing:0.5px;color:#00626c;">
<p style="margin:0;font-size:20px;font-weight:700;letter-spacing:0.5px;color:#a92121;">
{{ brand_name }}
</p>
{% endif %}
@@ -82,7 +82,7 @@
</td>
</tr>
<tr>
<td style="height:3px;line-height:3px;font-size:0;background-color:#00626c;">&nbsp;</td>
<td style="height:3px;line-height:3px;font-size:0;background-color:#a92121;">&nbsp;</td>
</tr>
<tr>
<td style="padding:28px 28px 8px;color:#212121;font-size:15px;line-height:1.6;font-family:'Work Sans',Poppins,-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;">
@@ -102,7 +102,7 @@
{% if brand_tagline_html %}
{{ brand_tagline_html|safe }}
{% else %}
<a href="{{ site_url|default:'https://mkdrealtor.com' }}" style="color:#00626c;text-decoration:none;">{{ host_label|default:"mkdrealtor.com" }}</a>
<a href="{{ site_url|default:'https://collegecraft.com' }}" style="color:#a92121;text-decoration:none;">{{ host_label|default:"collegecraft.com" }}</a>
{% if brand_tagline %}
&nbsp;·&nbsp; {{ brand_tagline }}
{% endif %}
@@ -5,7 +5,7 @@
{% block content %}
<p style="margin:0 0 16px;color:#212121;">Your {{ channel_display }} campaign has finished sending.</p>
<p style="margin:0 0 8px;font-size:18px;font-weight:600;color:#00626c;">{{ campaign_name }}</p>
<p style="margin:0 0 8px;font-size:18px;font-weight:600;color:#a92121;">{{ campaign_name }}</p>
<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="margin:20px 0;">
<tr>
@@ -32,9 +32,9 @@
{% if report_url %}
<p style="margin:24px 0 0;">
<a class="email-btn" href="{{ report_url }}" style="display:inline-block;padding:12px 24px;background-color:#00626c;color:#ffffff !important;text-decoration:none;border-radius:4px;font-weight:600;font-size:14px;">Open campaign report</a>
<a class="email-btn" href="{{ report_url }}" style="display:inline-block;padding:12px 24px;background-color:#a92121;color:#ffffff !important;text-decoration:none;border-radius:4px;font-weight:600;font-size:14px;">Open campaign report</a>
</p>
{% endif %}
{% endblock %}
{% block footer_note %}Campaign summary from {{ brand_name|default:"Monica Dhillon" }}.{% endblock %}
{% block footer_note %}Campaign summary from {{ brand_name|default:"College Craft Painters" }}.{% endblock %}
@@ -11,6 +11,6 @@ Suppressed: {{ suppressed }}
{% if report_url %}Report: {{ report_url }}
{% endif %}
{{ brand_name|default:"Monica Dhillon" }}
{{ site_url|default:"https://mkdrealtor.com" }}
{{ brand_name|default:"College Craft Painters" }}
{{ site_url|default:"https://collegecraft.com" }}
{% if brand_tagline %}{{ brand_tagline }}{% endif %}
@@ -11,7 +11,7 @@
<p class="field-label" style="color:#6b7280;font-size:12px;text-transform:uppercase;letter-spacing:0.6px;margin:0 0 4px;">Email</p>
<p class="field-value" style="color:#212121;font-size:15px;margin:0 0 16px;">
<a href="mailto:{{ email }}" style="color:#00626c;text-decoration:none;">{{ email }}</a>
<a href="mailto:{{ email }}" style="color:#a92121;text-decoration:none;">{{ email }}</a>
</p>
<p class="field-label" style="color:#6b7280;font-size:12px;text-transform:uppercase;letter-spacing:0.6px;margin:0 0 4px;">Phone</p>
@@ -25,7 +25,7 @@
{% if portal_url %}
<p style="margin:24px 0 0;">
<a class="email-btn" href="{{ portal_url }}" style="display:inline-block;padding:12px 24px;background-color:#00626c;color:#ffffff !important;text-decoration:none;border-radius:4px;font-weight:600;font-size:14px;">View in portal</a>
<a class="email-btn" href="{{ portal_url }}" style="display:inline-block;padding:12px 24px;background-color:#a92121;color:#ffffff !important;text-decoration:none;border-radius:4px;font-weight:600;font-size:14px;">View in portal</a>
</p>
{% endif %}
{% endblock %}
@@ -1,4 +1,4 @@
New contact form inquiry — {{ brand_name|default:"Monica Dhillon" }}
New contact form inquiry — {{ brand_name|default:"College Craft Painters" }}
Name: {{ name }}
Email: {{ email }}
@@ -12,6 +12,6 @@ Message:
{% if portal_url %}View in portal: {{ portal_url }}
{% endif %}
{{ brand_name|default:"Monica Dhillon" }}
{{ site_url|default:"https://mkdrealtor.com" }}
{{ brand_name|default:"College Craft Painters" }}
{{ site_url|default:"https://collegecraft.com" }}
{% if brand_tagline %}{{ brand_tagline }}{% endif %}
@@ -15,11 +15,11 @@
{% block footer_note %}
{% if prefs_url or one_click_url %}
{% if prefs_url %}
<a href="{{ prefs_url }}" style="color:#00626c;text-decoration:underline;">Manage preferences</a>
<a href="{{ prefs_url }}" style="color:#a92121;text-decoration:underline;">Manage preferences</a>
{% endif %}
{% if prefs_url and one_click_url %}&nbsp;·&nbsp;{% endif %}
{% if one_click_url %}
<a href="{{ one_click_url }}" style="color:#00626c;text-decoration:underline;">Unsubscribe from email</a>
<a href="{{ one_click_url }}" style="color:#a92121;text-decoration:underline;">Unsubscribe from email</a>
{% endif %}
{% endif %}
{% endblock %}
@@ -5,6 +5,6 @@
{% if prefs_url %}Manage preferences: {{ prefs_url }}
{% endif %}{% if one_click_url %}Unsubscribe from email: {{ one_click_url }}
{% endif %}{{ brand_name|default:"Monica Dhillon" }}
{{ site_url|default:"https://mkdrealtor.com" }}
{% endif %}{{ brand_name|default:"College Craft Painters" }}
{{ site_url|default:"https://collegecraft.com" }}
{% if brand_tagline %}{{ brand_tagline }}{% endif %}
+12 -37
View File
@@ -1,46 +1,21 @@
{% extends "base.html" %}
{% load static %}
{% block title %}404 · {{ SITE_NAME }}{% endblock %}
{% block body %}
<div class="page">
<section class="section section-single bg-gray-800 primary-overlay" style="background-image: url({% static 'images/bg-image-7.jpg' %});">
<div class="section-single-inner">
<div class="section-single-dummy"></div>
<div class="section-single-main">
<div class="container">
<div class="row row-30">
<div class="col-sm-6 text-center text-sm-left">
<p class="text-extra-large">404</p>
</div>
<div class="col-sm-6">
<div class="section-single-main-content">
<h6 class="title-decorated title-decorated-lg">Page not found</h6>
<p><span class="text-width-2">That page may have moved or the link is outdated. Lets get you back on track.</span></p>
<a class="button button-lg button-primary button-winona" href="{% url 'public:home' %}">Back to home</a>
<a class="button button-lg button-default-outline button-winona" href="{% url 'public:contact' %}" style="margin-left:8px">Contact Monica</a>
</div>
</div>
</div>
</div>
</div>
<div class="footer-minimal section-single-footer">
<div class="container">
<div class="footer-minimal-inner">
<a class="brand" href="{% url 'public:home' %}">
<img src="{% static 'brand/exit_logo.png' %}" alt="EXIT Realty · {{ SITE_NAME }}" width="151" height="44"/>
</a>
<div class="footer-aside-copy" style="text-align:left">
<p class="rights">
<span>&copy;&nbsp;</span><span>{% now "Y" %}</span><span>&nbsp;</span><span>{{ SITE_NAME }} · MKDRealtor.com</span>
</p>
<p class="footer-made-by">
Made by <a href="{{ CREDIT_URL }}" target="_blank" rel="noopener noreferrer">{{ CREDIT_NAME }}</a>
</p>
</div>
{% block meta_robots %}noindex, follow{% endblock %}
{% block content %}
{% include "public/_breadcrumbs.html" with title="Page not found" %}
<section class="section section-md bg-default">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8 col-xl-6">
<div class="big-title-wrap">
<div class="big-title">404</div>
<h5 class="big-title-text">That page may have moved or the link is outdated.</h5>
</div>
<p><a class="button button-primary button-md" href="{% url 'public:home' %}">Back to home</a>
<a class="button button-gray" href="{% url 'public:contact' %}" style="margin-left:8px">Contact us</a></p>
</div>
</div>
</div>
</section>
</div>
{% endblock %}
@@ -0,0 +1,7 @@
{% load static %}
<section class="breadcrumbs-custom bg-image context-dark" style="background-image: url({% if bg_image %}{% static bg_image %}{% else %}{% static 'images/breadcrumbs-bg-6.jpg' %}{% endif %});">
<div class="container">
<h1 class="breadcrumbs-custom-title">{{ title }}</h1>
{% if subtitle %}<p class="breadcrumbs-custom-subtitle">{{ subtitle }}</p>{% endif %}
</div>
</section>
+91 -29
View File
@@ -3,9 +3,9 @@
{% block title %}About {{ SITE_NAME }}{% endblock %}
{% block og_title %}About {{ SITE_NAME }}{% endblock %}
{% block twitter_title %}About {{ SITE_NAME }}{% endblock %}
{% block meta_description %}About {{ SITE_NAME }}. {{ SITE_TAGLINE }}. {{ CONTACT_SERVICE_AREA }}.{% endblock %}
{% block og_description %}About {{ SITE_NAME }}. {{ SITE_TAGLINE }}. {{ CONTACT_SERVICE_AREA }}.{% endblock %}
{% block twitter_description %}About {{ SITE_NAME }}. {{ SITE_TAGLINE }}. {{ CONTACT_SERVICE_AREA }}.{% endblock %}
{% block meta_description %}College Craft has painted homes and businesses in Chicagoland from Wheaton since 1960. Experience, people, reputation, and value — the College Craft Difference.{% endblock %}
{% block og_description %}College Craft has painted homes and businesses in Chicagoland from Wheaton since 1960.{% endblock %}
{% block twitter_description %}College Craft has painted homes and businesses in Chicagoland from Wheaton since 1960.{% endblock %}
{% block structured_data %}
<script type="application/ld+json">
{
@@ -15,43 +15,105 @@
"url": "{{ PUBLIC_SITE_URL }}{% url 'public:about' %}",
"description": "{{ SITE_TAGLINE|escapejs }}",
"mainEntity": {
"@type": "Organization",
"@type": "HousePainter",
"name": "{{ SITE_NAME|escapejs }}",
"url": "{{ PUBLIC_SITE_URL }}/",
"telephone": "{{ CONTACT_PHONE|escapejs }}",
"email": "{{ CONTACT_EMAIL|escapejs }}"
"email": "{{ CONTACT_EMAIL|escapejs }}",
{% if CONTACT_ADDRESS %}"address": "{{ CONTACT_ADDRESS|escapejs }}",{% endif %}
"foundingDate": "1960"
}
}
</script>
{% endblock %}
{% block content %}
<section class="breadcrumbs-custom bg-image context-dark" style="background-image: url({% static 'images/breadcrumbs-image-1.jpg' %});">
<div class="breadcrumbs-custom-inner">
<div class="container breadcrumbs-custom-container">
<div class="breadcrumbs-custom-main">
<p class="breadcrumbs-custom-subtitle title-decorated">About</p>
<h1 class="text-uppercase breadcrumbs-custom-title">{{ SITE_NAME }}</h1>
</div>
<ul class="breadcrumbs-custom-path">
<li><a href="{% url 'public:home' %}">Home</a></li>
<li class="active">About</li>
</ul>
</div>
</div>
</section>
<section class="section section-lg">
{% include "public/_breadcrumbs.html" with title="About us" subtitle="There really is a difference in painting companies" %}
<section class="section section-lg bg-default">
<div class="container">
<div class="row row-50">
<div class="col-lg-8">
<h2>Who we are</h2>
<p>{% if SITE_TAGLINE %}{{ SITE_TAGLINE }}. {% endif %}Replace this paragraph with the clients story, team, and what customers should expect.</p>
<p>{% if CONTACT_SERVICE_AREA %}{{ CONTACT_SERVICE_AREA }}. {% endif %}Every site seeded from this template gets a unique public app — swap photos, copy, and service pages per brand.</p>
<a class="button button-primary button-winona" href="{% url 'public:contact' %}">Contact us</a>
<div class="row row-40 justify-content-between">
<div class="col-lg-7">
<h4 class="custom-title">Who we are</h4>
<p class="big">College Craft is a quality-driven interior and exterior painting company in Wheaton. We have served the western suburbs and greater Chicagoland since 1960.</p>
<p>Painting companies are not alike. Customers choose us again because we stand out in four areas: <strong>our experience, our people, our reputation, and our value</strong>.</p>
<div class="row row-40 align-items-center offset-custom-2">
<div class="col-md-6 color-black">
<article class="box-counter box-counter-2">
<div class="box-counter-main">
<div class="counter">80</div>
<div class="icon linearicons-trophy2"></div>
</div>
<div class="box-counter-title">Thousand jobs since 1960</div>
</article>
</div>
<div class="col-md-6">
<ul class="list-marked-2">
<li><span class="big">Wheaton headquarters</span></li>
<li><span class="big">Foreman on every job</span></li>
<li><span class="big">EPA certified lead-paint restoration</span></li>
</ul>
</div>
</div>
<h5 class="text-primary">Our experience</h5>
<p>No other painting company can come close to our experience serving residential and commercial customers. We know the correct preparation, coatings, and application systems. We do not take shortcuts. We do the job the right way — every time — and that efficiency saves you money.</p>
<h5 class="text-primary">Our reputation</h5>
<p>We have probably painted for some of your neighbors. Customers know they can trust College Craft to arrive on time, treat their family and home with respect, do great work, and clean up — then stand behind it, just as we have since 1960.</p>
<h5 class="text-primary">Our people</h5>
<p>We are careful when we select crews. Each crew has extensive College Craft experience, high standards, and a job foreman to keep the work correct and on time. Friendly, honest, hard-working.</p>
<h5 class="text-primary">Our value</h5>
<p>Written estimates are thorough: exact prices for labor and paint, optional items if you want them, no hidden charges. Industry-leading experience lets us price the job so there is enough time to do it correctly.</p>
<div class="img-wrap-1"><img src="{% static 'images/cc-about-house.jpg' %}" alt="College Craft exterior painting in the Chicago area" width="650" height="325"/></div>
<div class="row row-30 row-xxl-55">
<div class="col-sm-6 wow fadeInLeft" data-wow-delay="0.2s">
<div class="blurb-minimal unit unit-spacing-sm flex-column flex-lg-row">
<div class="unit-left"><div class="blurb-minimal-icon linearicons-pencil-ruler"></div></div>
<div class="unit-body">
<h5 class="blurb-minimal-title">Qualified crews</h5>
<p class="blurb-minimal-exeption">Experienced painters who know our standards.</p>
</div>
</div>
</div>
<div class="col-sm-6 wow fadeInLeft">
<div class="blurb-minimal unit unit-spacing-sm flex-column flex-lg-row">
<div class="unit-left"><div class="blurb-minimal-icon linearicons-color-sampler"></div></div>
<div class="unit-body">
<h5 class="blurb-minimal-title">Since 1960</h5>
<p class="blurb-minimal-exeption">Western suburbs and Chicagoland, job after job.</p>
</div>
</div>
</div>
</div>
<div class="button-wrap-2"><a class="button button-primary button-md" href="{% url 'public:contact' %}" data-tianji-event="about_cta">Request an estimate</a></div>
</div>
<div class="col-lg-4">
{% if CONTACT_PHONE %}<p><strong>Phone</strong><br><a href="tel:{{ CONTACT_PHONE_TEL }}">{{ CONTACT_PHONE }}</a></p>{% endif %}
{% if CONTACT_EMAIL %}<p><strong>Email</strong><br><a href="mailto:{{ CONTACT_EMAIL }}">{{ CONTACT_EMAIL }}</a></p>{% endif %}
{% if CONTACT_ADDRESS %}<p><strong>Address</strong><br>{{ CONTACT_ADDRESS }}</p>{% endif %}
<div class="row no-gutters">
<div class="col-sm-6 col-lg-12">
<div class="box-team">
<img src="{% static 'images/cc-painters-crew.jpg' %}" alt="College Craft painting crew" width="390" height="332"/>
<div class="meta">
<div class="heading-6 title">Our crews</div>
<p class="position">Interior &amp; exterior</p>
</div>
</div>
</div>
<div class="col-sm-6 col-lg-12">
<div class="box-team">
<img src="{% static 'images/cc-house-2.jpg' %}" alt="Finished College Craft exterior" width="390" height="332"/>
<div class="meta">
<div class="heading-6 title">Residential</div>
<p class="position">Homes across the western suburbs</p>
</div>
</div>
</div>
<div class="col-sm-6 col-lg-12">
<div class="box-team">
<img src="{% static 'images/cc-interior-3.jpg' %}" alt="Interior painting detail" width="390" height="332"/>
<div class="meta">
<div class="heading-6 title">Wheaton shop</div>
<p class="position">{{ CONTACT_ADDRESS }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
+183
View File
@@ -0,0 +1,183 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Join our team · {{ SITE_NAME }}{% endblock %}
{% block og_title %}Join our team · {{ SITE_NAME }}{% endblock %}
{% block twitter_title %}Join our team · {{ SITE_NAME }}{% endblock %}
{% block meta_description %}Apply to join College Crafts interior and exterior painting team in Wheaton — job foreman, painter, sales, and sub-contractor openings.{% endblock %}
{% block og_description %}Apply to join College Crafts painting team in Wheaton.{% endblock %}
{% block twitter_description %}Apply to join College Crafts painting team in Wheaton.{% endblock %}
{% block extra_head %}
<link rel="stylesheet" href="{% static 'css/address-autocomplete.css' %}">
{% endblock %}
{% block content %}
{% include "public/_breadcrumbs.html" with title="Careers" subtitle="Join our professional interior & exterior painting team" %}
<section class="section section-lg bg-default">
<div class="container">
<div class="row row-40">
<div class="col-lg-5">
<h4>Work with College Craft</h4>
<p class="big">We hire careful, hard-working people who take pride in prep, paint, and how they treat a customers home. A foreman is on every job. Apply below and we will follow up.</p>
<ul class="list-marked-2">
<li>Job Foreman</li>
<li>Painter</li>
<li>Sales</li>
<li>Sub-Contractor</li>
</ul>
<p>{% if CONTACT_PHONE %}Call {{ CONTACT_PHONE }} or {% endif %}stop by {{ CONTACT_ADDRESS }}.</p>
</div>
<div class="col-lg-7">
<form class="rd-form form-boxed" method="post" action="{% url 'public:careers' %}">
{% csrf_token %}
<div class="row row-30">
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.first_name.id_for_label }}">First name</label>
{{ form.first_name }}
{{ form.first_name.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.last_name.id_for_label }}">Last name</label>
{{ form.last_name }}
{{ form.last_name.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.email.id_for_label }}">Email</label>
{{ form.email }}
{{ form.email.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.phone.id_for_label }}">Phone</label>
{{ form.phone }}
{{ form.phone.errors }}
</div>
</div>
<div class="col-12">
<p class="form-label-outside">Address</p>
</div>
<div class="col-12" data-address-autocomplete data-suggest-url="{% url 'address_suggest' %}">
<div class="form-wrap address-ac-wrap">
<label class="form-label-outside" for="{{ form.address_line1.id_for_label }}">Street address</label>
{{ form.address_line1 }}
{{ form.address_line1.errors }}
</div>
<div class="row row-30">
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_line2.id_for_label }}">Apt / suite</label>
{{ form.address_line2 }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_city.id_for_label }}">City</label>
{{ form.address_city }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_state.id_for_label }}">State</label>
{{ form.address_state }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_zip.id_for_label }}">ZIP</label>
{{ form.address_zip }}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="form-wrap">
<p class="form-label-outside">Which positions are you applying for?</p>
<ul class="choice-list">
{% for value, label in form.positions.field.choices %}
<li>
<label>
<input type="checkbox" name="{{ form.positions.html_name }}" value="{{ value }}" {% if form.positions.value and value in form.positions.value %}checked{% endif %}>
{{ label }}
</label>
</li>
{% endfor %}
</ul>
{{ form.positions.errors }}
</div>
</div>
<div class="col-12">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.qualifications.id_for_label }}">Work history &amp; qualifications</label>
{{ form.qualifications }}
{{ form.qualifications.errors }}
</div>
</div>
<div class="col-12">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.start_date.id_for_label }}">When can you start?</label>
{{ form.start_date }}
{{ form.start_date.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<p class="form-label-outside">{{ form.drivers_license.label }}</p>
<ul class="choice-list">
{% for value, label in form.drivers_license.field.choices %}
<li>
<label>
<input type="radio" name="{{ form.drivers_license.html_name }}" value="{{ value }}" {% if form.drivers_license.value == value %}checked{% endif %}>
{{ label }}
</label>
</li>
{% endfor %}
</ul>
{{ form.drivers_license.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<p class="form-label-outside">{{ form.has_vehicle.label }}</p>
<ul class="choice-list">
{% for value, label in form.has_vehicle.field.choices %}
<li>
<label>
<input type="radio" name="{{ form.has_vehicle.html_name }}" value="{{ value }}" {% if form.has_vehicle.value == value %}checked{% endif %}>
{{ label }}
</label>
</li>
{% endfor %}
</ul>
{{ form.has_vehicle.errors }}
</div>
</div>
{% if form.captcha %}
<div class="col-12">{{ form.captcha }}{{ form.captcha.errors }}</div>
{% endif %}
<div class="col-12">
<p style="font-size:13px;color:#6b7280;margin:0 0 20px;">By submitting, you agree we may contact you about this application by email and SMS (if you provide a phone number).{% if form.captcha %} Protected by reCAPTCHA.{% endif %}</p>
<button class="button button-primary button-md" type="submit" data-tianji-event="careers_form_submit">Submit application</button>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
{% endblock %}
{% block tracking_events %}
{% if "sent" in request.GET %}
<script>
if (window.aimlTrackWhenReady) {
window.aimlTrackWhenReady('careers_form_success');
}
</script>
{% endif %}
{% endblock %}
{% block extra_js %}
<script src="{% static 'js/address-autocomplete.js' %}"></script>
{% endblock %}
+148 -165
View File
@@ -1,11 +1,11 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Contact {{ SITE_NAME }} · Get in Touch{% endblock %}
{% block og_title %}Contact {{ SITE_NAME }} · Get in Touch{% endblock %}
{% block twitter_title %}Contact {{ SITE_NAME }} · Get in Touch{% endblock %}
{% block meta_description %}Contact {{ SITE_NAME }}. {{ CONTACT_SERVICE_AREA }}. Call{% if CONTACT_PHONE %} {{ CONTACT_PHONE }}{% endif %}{% if CONTACT_EMAIL %} or email {{ CONTACT_EMAIL }}{% endif %}.{% endblock %}
{% block og_description %}Contact {{ SITE_NAME }}. {{ CONTACT_SERVICE_AREA }}. Call{% if CONTACT_PHONE %} {{ CONTACT_PHONE }}{% endif %}{% if CONTACT_EMAIL %} or email {{ CONTACT_EMAIL }}{% endif %}.{% endblock %}
{% block twitter_description %}Contact {{ SITE_NAME }}. {{ CONTACT_SERVICE_AREA }}. Call{% if CONTACT_PHONE %} {{ CONTACT_PHONE }}{% endif %}{% if CONTACT_EMAIL %} or email {{ CONTACT_EMAIL }}{% endif %}.{% endblock %}
{% block title %}Contact {{ SITE_NAME }} · Free estimate{% endblock %}
{% block og_title %}Contact {{ SITE_NAME }} · Free estimate{% endblock %}
{% block twitter_title %}Contact {{ SITE_NAME }} · Free estimate{% endblock %}
{% block meta_description %}Request a free painting estimate from College Craft in Wheaton. Call {{ CONTACT_PHONE }} or send a message. {{ CONTACT_ADDRESS }}.{% endblock %}
{% block og_description %}Request a free painting estimate from College Craft in Wheaton.{% endblock %}
{% block twitter_description %}Request a free painting estimate from College Craft in Wheaton.{% endblock %}
{% block structured_data %}
<script type="application/ld+json">
{
@@ -13,177 +13,160 @@
"@type": "ContactPage",
"name": "Contact {{ SITE_NAME|escapejs }}",
"url": "{{ PUBLIC_SITE_URL }}{% url 'public:contact' %}",
"description": "Contact {{ SITE_NAME|escapejs }}. {{ CONTACT_SERVICE_AREA|escapejs }}.",
"mainEntity": {
"@type": "Organization",
"@type": "HousePainter",
"name": "{{ SITE_NAME|escapejs }}",
"url": "{{ PUBLIC_SITE_URL }}/",
"telephone": "{{ CONTACT_PHONE|escapejs }}",
"email": "{{ CONTACT_EMAIL|escapejs }}",
{% if CONTACT_ADDRESS %}"address": "{{ CONTACT_ADDRESS|escapejs }}",{% endif %}
"areaServed": "{{ CONTACT_SERVICE_AREA|escapejs }}",
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"telephone": "{{ CONTACT_PHONE|escapejs }}",
"email": "{{ CONTACT_EMAIL|escapejs }}",
"areaServed": "{{ CONTACT_SERVICE_AREA|escapejs }}",
"availableLanguage": "English"
}
"areaServed": "{{ CONTACT_SERVICE_AREA|escapejs }}"
}
}
</script>
{% endblock %}
{% block content %}
<section class="breadcrumbs-custom bg-image context-dark" style="background-image: url({% static 'images/breadcrumbs-image-1.jpg' %});">
<div class="breadcrumbs-custom-inner">
<div class="container breadcrumbs-custom-container">
<div class="breadcrumbs-custom-main">
<p class="breadcrumbs-custom-subtitle title-decorated">Contact</p>
<h1 class="text-uppercase breadcrumbs-custom-title">Get in touch</h1>
</div>
<ul class="breadcrumbs-custom-path">
<li><a href="{% url 'public:home' %}">Home</a></li>
<li class="active">Contact</li>
</ul>
</div>
</div>
</section>
<section class="section section-sm">
<div class="container">
<div class="layout-bordered">
{% if CONTACT_PHONE %}
<div class="layout-bordered-item wow-outer">
<div class="layout-bordered-item-inner wow slideInUp">
<div class="icon icon-lg mdi mdi-phone text-primary"></div>
<ul class="list-0"><li><a class="link-default" href="tel:{{ CONTACT_PHONE_TEL }}">{{ CONTACT_PHONE }}</a></li></ul>
</div>
</div>
{% endif %}
{% if CONTACT_EMAIL %}
<div class="layout-bordered-item wow-outer">
<div class="layout-bordered-item-inner wow slideInUp">
<div class="icon icon-lg mdi mdi-email text-primary"></div>
<a class="link-default" href="mailto:{{ CONTACT_EMAIL }}">{{ CONTACT_EMAIL }}</a>
</div>
</div>
{% endif %}
{% if CONTACT_ADDRESS or CONTACT_SERVICE_AREA %}
<div class="layout-bordered-item wow-outer">
<div class="layout-bordered-item-inner wow slideInUp">
<div class="icon icon-lg mdi mdi-map-marker text-primary"></div>
<span class="link-default">{% if CONTACT_ADDRESS %}{{ CONTACT_ADDRESS }}{% else %}{{ CONTACT_SERVICE_AREA }}{% endif %}</span>
</div>
</div>
{% endif %}
</div>
</div>
</section>
<section class="section bg-gray-100 contact-form-section">
<div class="container section-lg">
<div class="row">
<div class="col-lg-8">
<h3 class="text-uppercase">Send a message</h3>
<form class="rd-form contact-message-form" method="post" action="{% url 'public:contact' %}">
{% csrf_token %}
<div class="row row-10">
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.first_name.id_for_label }}">First name</label>
{{ form.first_name }}
{{ form.first_name.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.last_name.id_for_label }}">Last name</label>
{{ form.last_name }}
{{ form.last_name.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.email.id_for_label }}">Email</label>
{{ form.email }}
{{ form.email.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.phone.id_for_label }}">Phone</label>
{{ form.phone }}
{{ form.phone.errors }}
</div>
</div>
<div class="col-12">
<p class="form-label-outside" style="margin:8px 0 4px">Mailing address <span style="font-weight:400;color:#6b7280">(optional — for postcards)</span></p>
</div>
<div class="col-12" data-address-autocomplete data-suggest-url="{% url 'address_suggest' %}">
<div class="form-wrap address-ac-wrap">
<label class="form-label-outside" for="{{ form.address_line1.id_for_label }}">Street address</label>
{{ form.address_line1 }}
{{ form.address_line1.errors }}
</div>
<div class="row row-10">
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_line2.id_for_label }}">Apt / suite</label>
{{ form.address_line2 }}
{{ form.address_line2.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_city.id_for_label }}">City</label>
{{ form.address_city }}
{{ form.address_city.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_state.id_for_label }}">State</label>
{{ form.address_state }}
{{ form.address_state.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_zip.id_for_label }}">ZIP</label>
{{ form.address_zip }}
{{ form.address_zip.errors }}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.interest.id_for_label }}">I am interested in</label>
{{ form.interest }}
{{ form.interest.errors }}
</div>
</div>
<div class="col-12">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.message.id_for_label }}">Message</label>
{{ form.message }}
{{ form.message.errors }}
</div>
</div>
{% if form.captcha %}
<div class="col-12">{{ form.captcha }}{{ form.captcha.errors }}</div>
{% endif %}
</div>
<p style="font-size:13px;color:#6b7280;margin:12px 0 20px;">By submitting, you agree I may contact you about your inquiry by email and SMS (if you provide a phone number). You can change preferences or unsubscribe anytime from links in messages, or reply STOP to SMS.{% if form.captcha %} Protected by reCAPTCHA.{% endif %}</p>
<button class="button button-primary button-winona" type="submit" data-tianji-event="contact_form_submit">Send message</button>
</form>
</div>
</div>
</div>
</section>
{% endblock %}
{% block extra_head %}
<link rel="stylesheet" href="{% static 'css/address-autocomplete.css' %}">
{% endblock %}
{% block content %}
{% include "public/_breadcrumbs.html" with title="Contact" subtitle="View our contacts or write us a message" bg_image="images/breadcrumbs-bg-7.jpg" %}
<section class="section section-md bg-default">
<div class="container">
<div class="row row-40">
<div class="col-sm-6 col-md-4">
<div class="box-lined">
<div class="box-lined-body">
<h6 class="box-lined-title">Email &amp; telephone</h6>
<ul class="box-lined-list">
{% if CONTACT_EMAIL %}<li><a class="big contact-link" href="mailto:{{ CONTACT_EMAIL }}">{{ CONTACT_EMAIL }}</a></li>{% endif %}
{% if CONTACT_PHONE %}<li><a class="big contact-link" href="tel:{{ CONTACT_PHONE_TEL }}">{{ CONTACT_PHONE }}</a></li>{% endif %}
</ul>
</div>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="box-lined">
<div class="box-lined-body">
<h6 class="box-lined-title">Address</h6>
<ul class="box-lined-list">
<li class="big text-black">{% if CONTACT_ADDRESS %}{{ CONTACT_ADDRESS }}{% else %}{{ CONTACT_SERVICE_AREA }}{% endif %}</li>
</ul>
</div>
</div>
</div>
<div class="col-sm-12 col-md-4">
<div class="box-lined">
<div class="box-lined-body">
<h6 class="box-lined-title">Service area</h6>
<ul class="box-lined-list">
<li class="big text-black">Western suburbs of Chicago, including Wheaton, Glen Ellyn, Geneva, St. Charles, Batavia, Naperville, and neighboring towns.</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="section section-md bg-default contact-form-section">
<div class="container">
<h4>Get in touch with us</h4>
<p class="big">Tell us about the rooms, the exterior, or the building. We will follow up with a free estimate.</p>
<form class="rd-form form-boxed" method="post" action="{% url 'public:contact' %}">
{% csrf_token %}
<div class="row row-50">
<div class="col-lg-4">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.first_name.id_for_label }}">First name</label>
{{ form.first_name }}
{{ form.first_name.errors }}
</div>
</div>
<div class="col-lg-4">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.last_name.id_for_label }}">Last name</label>
{{ form.last_name }}
{{ form.last_name.errors }}
</div>
</div>
<div class="col-lg-4">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.email.id_for_label }}">Email</label>
{{ form.email }}
{{ form.email.errors }}
</div>
</div>
<div class="col-lg-4">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.phone.id_for_label }}">Phone</label>
{{ form.phone }}
{{ form.phone.errors }}
</div>
</div>
<div class="col-lg-8">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.interest.id_for_label }}">I am interested in</label>
{{ form.interest }}
{{ form.interest.errors }}
</div>
</div>
<div class="col-12">
<p class="form-label-outside">Mailing address <span style="font-weight:400;color:#6b7280">(optional — for postcards)</span></p>
</div>
<div class="col-12" data-address-autocomplete data-suggest-url="{% url 'address_suggest' %}">
<div class="form-wrap address-ac-wrap">
<label class="form-label-outside" for="{{ form.address_line1.id_for_label }}">Street address</label>
{{ form.address_line1 }}
{{ form.address_line1.errors }}
</div>
<div class="row row-30">
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_line2.id_for_label }}">Apt / suite</label>
{{ form.address_line2 }}
{{ form.address_line2.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_city.id_for_label }}">City</label>
{{ form.address_city }}
{{ form.address_city.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_state.id_for_label }}">State</label>
{{ form.address_state }}
{{ form.address_state.errors }}
</div>
</div>
<div class="col-md-6">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.address_zip.id_for_label }}">ZIP</label>
{{ form.address_zip }}
{{ form.address_zip.errors }}
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="form-wrap">
<label class="form-label-outside" for="{{ form.message.id_for_label }}">Message</label>
{{ form.message }}
{{ form.message.errors }}
</div>
</div>
{% if form.captcha %}
<div class="col-12">{{ form.captcha }}{{ form.captcha.errors }}</div>
{% endif %}
<div class="col-md-12">
<p style="font-size:13px;color:#6b7280;margin:0 0 20px;">By submitting, you agree we may contact you about your inquiry by email and SMS (if you provide a phone number). You can change preferences or unsubscribe anytime from links in messages, or reply STOP to SMS.{% if form.captcha %} Protected by reCAPTCHA.{% endif %}</p>
<button class="button button-default" type="submit" data-tianji-event="contact_form_submit">Send</button>
</div>
</div>
</form>
</div>
</section>
{% endblock %}
{% block tracking_events %}
{% if "sent" in request.GET %}
<script>
+219 -52
View File
@@ -3,77 +3,244 @@
{% block title %}{{ SITE_NAME }}{% if SITE_TAGLINE %} · {{ SITE_TAGLINE }}{% endif %}{% endblock %}
{% block og_title %}{{ SITE_NAME }}{% endblock %}
{% block twitter_title %}{{ SITE_NAME }}{% endblock %}
{% block meta_description %}{{ SITE_NAME }}{% if SITE_TAGLINE %} — {{ SITE_TAGLINE }}.{% endif %} {{ CONTACT_SERVICE_AREA }}.{% endblock %}
{% block og_description %}{{ SITE_NAME }}{% if SITE_TAGLINE %} — {{ SITE_TAGLINE }}.{% endif %} {{ CONTACT_SERVICE_AREA }}.{% endblock %}
{% block twitter_description %}{{ SITE_NAME }}{% if SITE_TAGLINE %} — {{ SITE_TAGLINE }}.{% endif %} {{ CONTACT_SERVICE_AREA }}.{% endblock %}
{% block meta_description %}{{ SITE_NAME }} — interior and exterior painting for homes and businesses in Chicagoland since 1960. Free estimates. {{ CONTACT_PHONE }}.{% endblock %}
{% block og_description %}{{ SITE_NAME }} — interior and exterior painting for homes and businesses in Chicagoland since 1960.{% endblock %}
{% block twitter_description %}{{ SITE_NAME }} — interior and exterior painting for homes and businesses in Chicagoland since 1960.{% endblock %}
{% block extra_head %}
<link rel="preload" as="image" href="{% static 'images/cc-exterior-2.jpg' %}" fetchpriority="high">
{% endblock %}
{% block structured_data %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@type": "HousePainter",
"name": "{{ SITE_NAME|escapejs }}",
"url": "{{ PUBLIC_SITE_URL }}/",
"image": "{{ PUBLIC_SITE_URL }}{% static 'images/slider-minimal-slide-1-1920x968.jpg' %}",
"image": "{{ PUBLIC_SITE_URL }}{% static 'images/cc-exterior-2.jpg' %}",
"telephone": "{{ CONTACT_PHONE|escapejs }}",
"email": "{{ CONTACT_EMAIL|escapejs }}"{% if CONTACT_ADDRESS %},
"address": "{{ CONTACT_ADDRESS|escapejs }}"{% endif %}{% if CONTACT_SERVICE_AREA %},
"areaServed": "{{ CONTACT_SERVICE_AREA|escapejs }}"{% endif %}
"email": "{{ CONTACT_EMAIL|escapejs }}",
{% if CONTACT_ADDRESS %}"address": "{{ CONTACT_ADDRESS|escapejs }}",{% endif %}
"foundingDate": "1960",
"description": "{{ SITE_TAGLINE|escapejs }}",
"areaServed": "{{ CONTACT_SERVICE_AREA|escapejs }}"
}
</script>
{% endblock %}
{% block content %}
<div class="swiper-container swiper-slider swiper-slider-minimal" data-loop="false" data-slide-effect="fade" data-autoplay="false" data-simulate-touch="true">
<div class="swiper-wrapper">
<div class="swiper-slide" data-slide-bg="{% static 'images/slider-minimal-slide-1-1920x968.jpg' %}">
<div class="container">
<div class="jumbotron-classic-content">
<div class="wow-outer">
<div class="title-docor-text font-weight-bold title-decorated text-uppercase wow slideInLeft text-white">{{ SITE_NAME }}</div>
</div>
<h1 class="text-uppercase text-white font-weight-bold wow-outer"><span class="wow slideInDown" data-wow-delay=".2s">{% if SITE_TAGLINE %}{{ SITE_TAGLINE }}{% else %}Welcome{% endif %}</span></h1>
<p class="text-white wow-outer"><span class="wow slideInDown" data-wow-delay=".35s">{% if CONTACT_SERVICE_AREA %}{{ CONTACT_SERVICE_AREA }}. {% endif %}Tell us what you need — we will follow up promptly.</span></p>
<div class="wow-outer button-outer">
<a class="button button-md button-primary button-winona wow slideInDown" href="{% url 'public:contact' %}" data-wow-delay=".4s" data-tianji-event="hero_cta" data-tianji-event-destination="contact">Start a conversation</a>
<section class="section context-dark bg-image bg-mask bg-mask-2 section-fullheight section-90vh bg-sm-position" style="background-image: url({% static 'images/cc-exterior-2.jpg' %})">
<div class="section-fullheight-inner section-md">
<div class="container">
<div class="row justify-xl-content-end justify-content-center">
<div class="col-md-8 col-xl-6 text-center text-md-left">
<div class="jumbotron-custom wow fadeInRight">
<div class="title">Welcome<br class="d-none d-lg-block">to College Craft</div>
<p class="heading-subtitle">Outstanding interior and exterior painting for homes and businesses in Chicagoland since 1960. Experience, people, reputation, and value — the College Craft Difference.</p>
<a class="button-primary button-m button" href="{% url 'public:contact' %}" data-tianji-event="hero_cta" data-tianji-event-destination="contact">Get a free estimate</a>
</div>
</div>
</div>
</div>
</div>
</div>
<section class="section section-lg">
</section>
<section class="section section-xl-custom image-section section-lined">
<div class="container container-lined">
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-4"></div>
<div class="col-md-4"></div>
</div>
</div>
<div class="container">
<h2 class="text-uppercase text-center wow-outer"><span class="wow slideInDown">How we can help</span></h2>
<div class="row row-50">
<div class="col-md-4 wow-outer">
<article class="box-chloe wow slideInUp">
<div class="box-chloe__icon linearicons-phone"></div>
<div class="box-chloe__main">
<h3 class="box-chloe__title">Talk with us</h3>
<p>A real person answers. Share your goals and we will map the next step.</p>
</div>
</article>
</div>
<div class="col-md-4 wow-outer">
<article class="box-chloe wow slideInUp" data-wow-delay=".05s">
<div class="box-chloe__icon linearicons-register"></div>
<div class="box-chloe__main">
<h3 class="box-chloe__title">Stay informed</h3>
<p>Opt in on the contact form for email, SMS, or mail — only the channels you choose.</p>
</div>
</article>
</div>
<div class="col-md-4 wow-outer">
<article class="box-chloe wow slideInUp" data-wow-delay=".1s">
<div class="box-chloe__icon linearicons-apartment"></div>
<div class="box-chloe__main">
<h3 class="box-chloe__title">Work with us</h3>
<p>Replace this copy with your services. Brand, photos, and pages are unique to each client site.</p>
</div>
</article>
<div class="row">
<div class="col-md-7 col-lg-6">
<h3>A few words</h3>
<div class="content-subtitle font-weight-medium">about our painting company</div>
<p class="offset-xl-top-60 text-black">There really is a difference in painting companies. College Craft has served residential and commercial customers from our Wheaton shop since 1960 — more than 80,000 jobs, with the right preparation, coatings, and crews for a beautiful, long-lasting result.</p>
<div class="button-wrap-2"><a class="button-primary button-md button" href="{% url 'public:about' %}">Read more about us</a></div>
</div>
</div>
<div class="text-center" style="margin-top:24px">
<a class="button button-primary button-winona" href="{% url 'public:about' %}">About us</a>
</div>
<div class="image-container">
<div class="mock-up-1">
<div class="object object-1"><img class="wow fadeInRight" src="{% static 'images/cc-interior.jpg' %}" alt="Interior painting by College Craft" width="395" height="243"/></div>
<div class="object object-2"><img class="wow fadeInRight" src="{% static 'images/cc-exterior.jpg' %}" alt="Exterior house painting" width="384" height="189" data-wow-delay="0.2s"/></div>
<div class="object object-3"><img class="wow fadeInRight" src="{% static 'images/cc-dining.jpg' %}" alt="Dining room interior" width="395" height="243" data-wow-delay="0.4s"/></div>
<div class="object object-4"><img class="wow fadeInRight" src="{% static 'images/cc-elburn.jpg' %}" alt="Elburn exterior project" width="209" height="184" data-wow-delay="0.6s"/></div>
<div class="object object-5"><img class="wow fadeInRight" src="{% static 'images/cc-deck.jpg' %}" alt="Deck staining" width="395" height="243" data-wow-delay="0.2s"/></div>
<div class="object object-6"><img class="wow fadeInRight" src="{% static 'images/cc-house-3.jpg' %}" alt="Chicagoland home painted by College Craft" width="275" height="184" data-wow-delay="0.4s"/></div>
</div>
</div>
</section>
<section class="section section-lg section-lg-1 bg-gray-light context-light">
<div class="container">
<div class="row row-50 justify-content-between">
<div class="col-lg-7 col-xl-6">
<div class="row row-40 row-lg-0 row-flex number-counter">
<div class="col-sm-6 col-lg-6 wow fadeInLeft" data-wow-delay="0.2s">
<div class="blurb-hover">
<div class="blurb-hover-header">
<div class="blurb-hover-icon linearicons-pencil-ruler"></div>
<div class="blurb-hover-counter index-counter"></div>
</div>
<h5 class="blurb-hover-title">Our people</h5>
<p class="blurb-hover-exeption font-weight-normal">Experienced crews and a job foreman on every project.</p>
</div>
</div>
<div class="col-sm-6 col-lg-6 wow fadeInLeft">
<div class="blurb-hover">
<div class="blurb-hover-header">
<div class="blurb-hover-icon linearicons-color-sampler"></div>
<div class="blurb-hover-counter index-counter"></div>
</div>
<h5 class="blurb-hover-title">Since 1960</h5>
<p class="blurb-hover-exeption font-weight-normal">Over 80,000 jobs. We know the prep, coatings, and schedule your house needs.</p>
</div>
</div>
<div class="col-sm-6 col-lg-6 wow fadeInLeft" data-wow-delay="0.4s">
<div class="blurb-hover">
<div class="blurb-hover-header">
<div class="blurb-hover-icon linearicons-cube"></div>
<div class="blurb-hover-counter index-counter"></div>
</div>
<h5 class="blurb-hover-title">Our reputation</h5>
<p class="blurb-hover-exeption font-weight-normal">Neighbors recommend us. We stand behind the work.</p>
</div>
</div>
<div class="col-sm-6 col-lg-6 wow fadeInLeft" data-wow-delay="0.2s">
<div class="blurb-hover">
<div class="blurb-hover-header">
<div class="blurb-hover-icon linearicons-broom"></div>
<div class="blurb-hover-counter index-counter"></div>
</div>
<h5 class="blurb-hover-title">Our value</h5>
<p class="blurb-hover-exeption font-weight-normal">Written estimates with exact labor and paint — no hidden fees.</p>
</div>
</div>
</div>
</div>
<div class="col-lg-5 col-xl-5">
<h3>Services</h3>
<p class="big big-custom text-primary font-weight-normal">THAT WE PROVIDE</p>
<div class="card-group-custom number-counter-1" id="accordion1" role="tablist" aria-multiselectable="false">
<article class="card card-custom">
<div class="card-header" role="tab">
<div class="card-title"><a id="accordion1-card-head-ext" data-toggle="collapse" data-parent="#accordion1" href="#accordion1-card-body-ext" aria-controls="accordion1-card-body-ext" aria-expanded="true" role="button"><span class="index-counter"></span><span class="title">Exterior painting</span>
<div class="card-arrow"></div></a></div>
</div>
<div class="collapse show" id="accordion1-card-body-ext" aria-labelledby="accordion1-card-head-ext" data-parent="#accordion1" role="tabpanel">
<div class="card-body">
<p>Trim and siding, cedar, aluminum, vinyl, decks, power washing, carpentry repairs, and more — from bungalows to multi-family buildings. EPA certified lead-paint restoration.</p>
</div>
</div>
</article>
<article class="card card-custom card-secondary-2">
<div class="card-header" role="tab">
<div class="card-title"><a class="collapsed" id="accordion1-card-head-int" data-toggle="collapse" data-parent="#accordion1" href="#accordion1-card-body-int" aria-controls="accordion1-card-body-int" aria-expanded="false" role="button"><span class="index-counter"></span><span class="title">Interior painting</span>
<div class="card-arrow"></div></a></div>
</div>
<div class="collapse" id="accordion1-card-body-int" aria-labelledby="accordion1-card-head-int" data-parent="#accordion1" role="tabpanel">
<div class="card-body">
<p>Walls, ceilings, trim, cabinets, wallpaper removal, drywall, and color help from Sherwin-Williams. Thorough prep, top coatings, and a polite crew that cleans up.</p>
</div>
</div>
</article>
<article class="card card-custom card-secondary-3">
<div class="card-header" role="tab">
<div class="card-title"><a class="collapsed" id="accordion1-card-head-com" data-toggle="collapse" data-parent="#accordion1" href="#accordion1-card-body-com" aria-controls="accordion1-card-body-com" aria-expanded="false" role="button"><span class="index-counter"></span><span class="title">Commercial painting</span>
<div class="card-arrow"></div></a></div>
</div>
<div class="collapse" id="accordion1-card-body-com" aria-labelledby="accordion1-card-head-com" data-parent="#accordion1" role="tabpanel">
<div class="card-body">
<p>Offices, churches, townhomes, condominiums, and multi-family properties — scheduled around your tenants and your calendar.</p>
</div>
</div>
</article>
</div>
<div class="button-wrap" style="margin-top:24px"><a class="button button-primary button-md" href="{% url 'public:services' %}">View all services</a></div>
</div>
</div>
</div>
</section>
<section class="section section-lg bg-default section-lined">
<div class="container container-lined">
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-4"></div>
<div class="col-md-4"></div>
</div>
</div>
<div class="container position-relative">
<div class="row row-30 align-items-center">
<div class="col-sm-12 col-lg-4">
<h3>What we offer</h3>
</div>
<div class="col-sm-6 col-lg-4">
<div class="big block-1-custom">Preparation. Products. People. The three things that decide how a paint job looks — and how long it lasts.</div>
</div>
<div class="col-sm-6 col-lg-4">
<div class="block-2-custom">
<div class="counter-minimal">
<div class="counter-left">
<div class="counter">66</div>
</div>
<div class="counter-right">
<div class="postfix">+</div>
<div class="title">Years in Wheaton</div>
</div>
</div>
</div>
</div>
</div>
<div class="box-border-wrap-1 wow fadeInUp" data-wow-delay="0.2s">
<div class="row">
<a class="col-6 col-md-4 box-border" href="{% url 'public:services' %}">
<div class="title text-right"><span class="d-block">Careful</span><span class="d-block">preparation</span></div>
<div class="service-icon icon-xxl construction-icon-13"></div>
</a>
<a class="col-6 col-md-4 box-border" href="{% url 'public:services' %}">
<div class="title text-right"><span class="d-block">Quality</span><span class="d-block">materials</span></div>
<div class="service-icon icon-xxl construction-icon-05"></div>
</a>
<a class="col-6 col-md-4 box-border" href="{% url 'public:about' %}">
<div class="title text-right"><span class="d-block">Foreman on</span><span class="d-block">every job</span></div>
<div class="service-icon icon-xxl construction-icon-11"></div>
</a>
<a class="col-6 col-md-4 box-border" href="{% url 'public:services' %}">
<div class="title text-right"><span class="d-block">Color</span><span class="d-block">assistance</span></div>
<div class="service-icon icon-xxl construction-icon-07"></div>
</a>
<a class="col-6 col-md-4 box-border" href="{% url 'public:contact' %}">
<div class="title text-right"><span class="d-block">Written</span><span class="d-block">estimates</span></div>
<div class="service-icon icon-xxl construction-icon-18"></div>
</a>
<a class="col-6 col-md-4 box-border" href="{% url 'public:contact' %}">
<div class="icon icon-sm linearicons-arrow-right"></div>
</a>
</div>
</div>
</div>
</section>
<section class="section section-lg bg-gray-light context-light">
<div class="container">
<div class="row row-30">
<div class="col-sm-6">
<h3>Customer raves</h3>
</div>
<div class="col-sm-6 text-sm-right"><a class="button button-gray" href="{% url 'public:testimonials' %}">Read more</a></div>
</div>
<div class="row row-30">
{% for item in featured_testimonials %}
<div class="col-md-4">
<article class="testimonial-card">
<blockquote>“{{ item.quote }}”</blockquote>
<cite>{{ item.attribution }}</cite>
</article>
</div>
{% endfor %}
</div>
</div>
</section>
+122
View File
@@ -0,0 +1,122 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Painting services · {{ SITE_NAME }}{% endblock %}
{% block og_title %}Painting services · {{ SITE_NAME }}{% endblock %}
{% block twitter_title %}Painting services · {{ SITE_NAME }}{% endblock %}
{% block meta_description %}Interior painting, exterior painting, decks, power washing, and commercial work from College Craft in Wheaton. Serving Chicagoland since 1960.{% endblock %}
{% block og_description %}Interior, exterior, deck, and commercial painting from College Craft in Wheaton.{% endblock %}
{% block twitter_description %}Interior, exterior, deck, and commercial painting from College Craft in Wheaton.{% endblock %}
{% block content %}
{% include "public/_breadcrumbs.html" with title="Services" subtitle="Interior, exterior, commercial, and decks" %}
<section class="section section-md bg-default">
<div class="container container-custom-width-1">
<div class="row row-30 row-xxl-60 row-flex row-custom">
<div class="col-sm-6 col-md-4">
<div class="blurb-boxed">
<div class="blurb-boxed-header">
<h5 class="blurb-boxed-title">Interior painting</h5>
<div class="blurb-boxed-icon linearicons-bucket"></div>
</div>
<ul class="blurb-boxed-list">
<li>Walls, ceilings &amp; trim</li>
<li>Cabinets &amp; stained trim</li>
<li>Drywall, wallpaper, water damage</li>
</ul>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="blurb-boxed">
<div class="blurb-boxed-header">
<h5 class="blurb-boxed-title">Exterior painting</h5>
<div class="blurb-boxed-icon linearicons-tags"></div>
</div>
<ul class="blurb-boxed-list">
<li>Trim, siding, cedar, vinyl, aluminum</li>
<li>Carpentry repairs</li>
<li>Lead-paint restoration (EPA certified)</li>
</ul>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="blurb-boxed">
<div class="blurb-boxed-header">
<h5 class="blurb-boxed-title">Decks &amp; washing</h5>
<div class="blurb-boxed-icon linearicons-brush2"></div>
</div>
<ul class="blurb-boxed-list">
<li>Deck power wash &amp; stain</li>
<li>Whole-house power wash</li>
<li>Gutters, patios, fences, playsets</li>
</ul>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="blurb-boxed">
<div class="blurb-boxed-header">
<h5 class="blurb-boxed-title">Commercial</h5>
<div class="blurb-boxed-icon linearicons-city"></div>
</div>
<ul class="blurb-boxed-list">
<li>Offices &amp; churches</li>
<li>Townhomes &amp; condominiums</li>
<li>Multi-family buildings</li>
</ul>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="blurb-boxed">
<div class="blurb-boxed-header">
<h5 class="blurb-boxed-title">Preparation</h5>
<div class="blurb-boxed-icon linearicons-paint-roller"></div>
</div>
<ul class="blurb-boxed-list">
<li>Wash, scrape, prime, caulk</li>
<li>Patch, stain-block, protect floors</li>
<li>Cleanup when the job is done</li>
</ul>
</div>
</div>
<div class="col-sm-6 col-md-4">
<div class="blurb-boxed">
<div class="blurb-boxed-header">
<h5 class="blurb-boxed-title">Color help</h5>
<div class="blurb-boxed-icon linearicons-bubble-text"></div>
</div>
<ul class="blurb-boxed-list">
<li>Sherwin-Williams products</li>
<li>Color matching</li>
<li>Written estimates</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<section class="section section-lg bg-default">
<div class="container">
<div class="row row-40">
<div class="col-lg-6">
<h4>Interior painting &amp; maintenance</h4>
<p>Every interior job starts with a detailed proposal. We inspect the rooms, then give you written specs and pricing. Many interiors finish in a day or two. The result depends on three things: <strong>preparation, products, and people</strong>.</p>
<ul class="list-marked-2">
<li>Clean surfaces, move furniture, cover floors</li>
<li>Patch cracks and nicks; prime stains</li>
<li>Top-performing coatings from Sherwin-Williams and other brands</li>
<li>A full-time foreman and a crew we visit every day</li>
</ul>
<img src="{% static 'images/cc-interior.jpg' %}" alt="Interior painting" width="650" height="325"/>
</div>
<div class="col-lg-6">
<h4>Exterior painting &amp; maintenance</h4>
<p>Since 1960 we have painted exteriors from neighborhood bungalows to lakeshore mansions, churches, offices, and condominiums. Old house or new, big or small — a fair price and a job that lasts.</p>
<p>Surface prep is everything: careful wash, scrape, prime bare and rusted areas, caulk, replace failed window putty, and protect the grounds with drop cloths. Best warranty in the business.</p>
<img src="{% static 'images/cc-exterior.jpg' %}" alt="Exterior painting" width="650" height="325"/>
</div>
</div>
<div class="text-center" style="margin-top:40px">
<p class="big text-primary">College Craft is an EPA certified lead-paint restoration company.</p>
<a class="button button-primary button-md" href="{% url 'public:contact' %}" data-tianji-event="services_cta">Request a free estimate</a>
</div>
</div>
</section>
{% endblock %}
+10 -22
View File
@@ -3,36 +3,23 @@
{% block title %}Terms of Service · {{ SITE_NAME }}{% endblock %}
{% block og_title %}Terms of Service · {{ SITE_NAME }}{% endblock %}
{% block twitter_title %}Terms of Service · {{ SITE_NAME }}{% endblock %}
{% block meta_description %}Terms of Service for {{ SITE_NAME }} / MKDRealtor.com — how we use analytics, protect your information, and never sell or share personal data with third parties for marketing.{% endblock %}
{% block og_description %}Terms of Service for {{ SITE_NAME }} / MKDRealtor.com — how we use analytics, protect your information, and never sell or share personal data with third parties for marketing.{% endblock %}
{% block twitter_description %}Terms of Service for {{ SITE_NAME }} / MKDRealtor.com — how we use analytics, protect your information, and never sell or share personal data with third parties for marketing.{% endblock %}
{% block meta_description %}Terms of Service for {{ SITE_NAME }} — how we use analytics, protect your information, and never sell or share personal data with third parties for marketing.{% endblock %}
{% block og_description %}Terms of Service for {{ SITE_NAME }} — how we use analytics and protect your information.{% endblock %}
{% block twitter_description %}Terms of Service for {{ SITE_NAME }} — how we use analytics and protect your information.{% endblock %}
{% block content %}
<section class="breadcrumbs-custom bg-image context-dark" style="background-image: url({% static 'images/breadcrumbs-image-1.jpg' %});">
<div class="breadcrumbs-custom-inner">
<div class="container breadcrumbs-custom-container">
<div class="breadcrumbs-custom-main">
<p class="breadcrumbs-custom-subtitle title-decorated">Legal</p>
<h1 class="text-uppercase breadcrumbs-custom-title">Terms of Service</h1>
</div>
<ul class="breadcrumbs-custom-path">
<li><a href="{% url 'public:home' %}">Home</a></li>
<li class="active">Terms</li>
</ul>
</div>
</div>
</section>
<section class="section section-lg">
{% include "public/_breadcrumbs.html" with title="Terms of Service" subtitle="Legal" %}
<section class="section section-lg bg-default">
<div class="container legal-prose">
<p class="legal-lead">These Terms of Service describe how {{ SITE_NAME }} (“we,” “us”) operates MKDRealtor.com and related pages. By using this site you agree to these terms.</p>
<p class="legal-lead">These Terms of Service describe how {{ SITE_NAME }} (“we,” “us”) operates this website and related pages. By using this site you agree to these terms.</p>
<h2>Analytics and site performance</h2>
<p>We use analytics to monitor site performance, understand how visitors use the site, and improve content and reliability. Analytics may collect technical information such as pages viewed, approximate location derived from IP address, device/browser type, and referral source. This information is used only to operate and improve the site.</p>
<h2>We do not sell or share your data</h2>
<p>We never sell your personal information. We do not share or sell user data to third parties for their advertising or marketing. Contact-form submissions and related lead information are used only to respond to your inquiry and to run our real-estate practice.</p>
<p>We never sell your personal information. We do not share or sell user data to third parties for their advertising or marketing. Contact-form submissions, employment applications, and related lead information are used only to respond to your inquiry and to run our painting business.</p>
<h2>Information you provide</h2>
<p>When you submit the contact form or other requests, you may share your name, email, phone, mailing address, and message. We use that information to follow up with you and, with your consent, for related outreach (email, SMS, or postcard where applicable). You can change preferences or unsubscribe using the links in our messages, or by contacting us.</p>
<p>When you submit the contact form, careers form, or other requests, you may share your name, email, phone, mailing address, and message. We use that information to follow up with you and, with your consent, for related outreach (email, SMS, or postcard where applicable). You can change preferences or unsubscribe using the links in our messages, or by contacting us.</p>
<h2>Cookies and similar technologies</h2>
<p>We may use cookies or similar technologies needed for the site to work (for example session and security) and for analytics as described above. The analytics notice on the site acknowledges this use. For questions about cookies or analytics, contact us using the details below.</p>
@@ -41,8 +28,9 @@
<p>
{% if CONTACT_EMAIL %}<a class="link-default" href="mailto:{{ CONTACT_EMAIL }}">{{ CONTACT_EMAIL }}</a>{% endif %}
{% if CONTACT_PHONE %}{% if CONTACT_EMAIL %} · {% endif %}<a class="link-default" href="tel:{{ CONTACT_PHONE_TEL }}">{{ CONTACT_PHONE }}</a>{% endif %}
{% if CONTACT_ADDRESS %}<br>{{ CONTACT_ADDRESS }}{% endif %}
</p>
<p><a class="button button-primary button-winona" href="{% url 'public:contact' %}">Contact Monica</a></p>
<p><a class="button button-primary button-md" href="{% url 'public:contact' %}">Contact College Craft</a></p>
<p class="legal-updated">Last updated: {% now "F j, Y" %}</p>
</div>
@@ -0,0 +1,29 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Customer raves · {{ SITE_NAME }}{% endblock %}
{% block og_title %}Customer raves · {{ SITE_NAME }}{% endblock %}
{% block twitter_title %}Customer raves · {{ SITE_NAME }}{% endblock %}
{% block meta_description %}Word of mouth from College Craft customers — comments from our satisfaction surveys after interior and exterior painting jobs across Chicagoland.{% endblock %}
{% block og_description %}Word of mouth from College Craft customers after interior and exterior painting jobs.{% endblock %}
{% block twitter_description %}Word of mouth from College Craft customers after interior and exterior painting jobs.{% endblock %}
{% block content %}
{% include "public/_breadcrumbs.html" with title="Testimonials" subtitle="The College Craft Difference, in our customers words" %}
<section class="section section-lg bg-default">
<div class="container">
<p class="big">Word of mouth has always been the most important ingredient in College Crafts reputation. These comments come from our customer satisfaction survey at the end of each job.</p>
<div class="row row-30">
{% for item in testimonials %}
<div class="col-md-6 col-lg-4">
<article class="testimonial-card">
<blockquote>“{{ item.quote }}”</blockquote>
<cite>{{ item.attribution }}</cite>
</article>
</div>
{% endfor %}
</div>
<div class="text-center" style="margin-top:40px">
<a class="button button-primary button-md" href="{% url 'public:contact' %}">Request an estimate</a>
</div>
</div>
</section>
{% endblock %}
@@ -3,53 +3,51 @@
{% block title %}Under construction · {{ SITE_NAME }}{% endblock %}
{% block body %}
<div class="page">
<section class="section section-single bg-gray-800 primary-overlay" style="background-image: url({% static 'images/bg-image-4.jpg' %});">
<div class="section-single-inner">
<div class="section-single-dummy"></div>
<div class="section-single-main">
<div class="container">
<div class="row row-30 justify-content-center justify-content-sm-start">
<div class="col-sm-10 col-md-9 col-lg-7 col-xl-6">
<h6 class="title-decorated title-decorated-lg">Were getting ready to launch</h6>
<p>{{ SITE_NAME }} · MKDRealtor.coms new site is almost here. Leave your email and Ill let you know when its live — or reach out now if you need help buying or selling.</p>
<div class="rd-mailform-wrap">
<form class="rd-form form-inline" method="post" action="{% url 'public:under_construction' %}">
{% csrf_token %}
<div class="form-wrap">
<input class="form-input" id="{{ form.email.id_for_label }}" type="email" name="{{ form.email.name }}" required value="{{ form.email.value|default:'' }}">
<label class="form-label" for="{{ form.email.id_for_label }}">Your e-mail</label>
{{ form.email.errors }}
</div>
<div class="form-button">
<button class="button button-primary button-winona" type="submit" data-tianji-event="notify_me_submit">Notify me</button>
</div>
</form>
</div>
<p style="margin-top:20px">
<a class="button button-default-outline button-winona" href="{% url 'public:contact' %}" data-tianji-event="holding_contact">Contact Monica now</a>
</p>
</div>
</div>
</div>
</div>
<div class="footer-minimal section-single-footer">
<div class="container">
<div class="footer-minimal-inner">
<section class="section one-page-section">
<div class="row no-gutters row-flex">
<div class="col-lg-6">
<div class="one-page-wrap">
<div class="one-page-header">
<a class="brand" href="{% url 'public:home' %}">
<img src="{% static 'brand/exit_logo.png' %}" alt="EXIT Realty · {{ SITE_NAME }}" width="151" height="44"/>
<img class="brand-logo-dark" src="{% static 'brand/logo.png' %}" alt="{{ SITE_NAME }}" width="180" height="71"/>
</a>
<div class="footer-aside-copy" style="text-align:left">
<p class="rights">
<span>&copy;&nbsp;</span><span>{% now "Y" %}</span><span>&nbsp;</span><span>{{ SITE_NAME }} · MKDRealtor.com</span>
{% if CONTACT_PHONE %}<span>&nbsp;·&nbsp;</span><a href="tel:{{ CONTACT_PHONE_TEL }}">{{ CONTACT_PHONE }}</a>{% endif %}
</p>
<p class="footer-made-by">
Made by <a href="{{ CREDIT_URL }}" target="_blank" rel="noopener noreferrer">{{ CREDIT_NAME }}</a>
</p>
</div>
</div>
<div class="one-page-content">
{% if messages %}
<ul class="flash">
{% for message in messages %}
<li class="{{ message.tags }}">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
<div class="big">Our website is coming soon</div>
<h4 class="custom-title custom-title-small">{{ SITE_NAME }} is getting a new site. Leave your email and we will let you know when it is live.</h4>
<div class="heading-6">Subscribe to be notified:</div>
<form class="rd-form rd-form-inline" method="post" action="{% url 'public:under_construction' %}">
{% csrf_token %}
<div class="form-wrap form-wrap-icon">
<div class="form-icon mdi mdi-email-outline"></div>
<input class="form-input" id="{{ form.email.id_for_label }}" type="email" name="{{ form.email.name }}" required value="{{ form.email.value|default:'' }}">
<label class="form-label" for="{{ form.email.id_for_label }}">E-mail</label>
{{ form.email.errors }}
</div>
<div class="form-button">
<button class="button button-default" type="submit" data-tianji-event="notify_me_submit">Send</button>
</div>
</form>
<p class="paragraph-custom">We respect your privacy and never share your info.</p>
{% if CONTACT_PHONE %}
<p>Need a painter now? Call <a class="contact-link" href="tel:{{ CONTACT_PHONE_TEL }}">{{ CONTACT_PHONE }}</a>.</p>
{% endif %}
</div>
<div class="one-page-footer">
<p class="footer-made-by">
Made by <a href="{{ CREDIT_URL }}" target="_blank" rel="noopener noreferrer">{{ CREDIT_NAME }}</a>
</p>
</div>
</div>
</div>
<div class="col-lg-6 one-page-image" style="background: url({% static 'images/cc-exterior-2.jpg' %}) no-repeat; background-size:cover;"></div>
</div>
</section>
</div>
+11 -11
View File
@@ -1,34 +1,34 @@
{% extends "base.html" %}
{% block title %}Communication preferences · {{ SITE_NAME }}{% endblock %}
{% block content %}
<section class="section section-lg">
{% include "public/_breadcrumbs.html" with title="Communication preferences" %}
<section class="section section-lg bg-default">
<div class="container" style="max-width:560px;">
<h3 class="text-uppercase">Communication preferences</h3>
{% if not valid %}
<p>This preferences link is invalid or has expired.</p>
<p style="font-size:13px;color:#6b7280;">If you still get messages, reply STOP on SMS or contact Monica directly.</p>
<p style="font-size:13px;color:#6b7280;">If you still get messages, reply STOP on SMS or contact us directly.</p>
<p style="margin-top:24px">
<a class="button button-primary button-winona" href="{% url 'public:contact' %}">Contact Monica</a>
<a class="button button-gray-bordered button-winona" href="{% url 'public:home' %}">Back to home</a>
<a class="button button-primary button-md" href="{% url 'public:contact' %}">Contact us</a>
<a class="button button-gray" href="{% url 'public:home' %}">Back to home</a>
</p>
{% else %}
<p>You are subscribed as <strong>{{ identity }}</strong>.</p>
<form method="post" action="{% url 'public:unsubscribe' token=token %}">
{% csrf_token %}
<div class="form-wrap">
<label class="checkbox-inline">
<label class="pref-check">
<input type="checkbox" name="consent_email" value="1" {% if prefs.email %}checked{% endif %}>
Email marketing
</label>
</div>
<div class="form-wrap">
<label class="checkbox-inline">
<label class="pref-check">
<input type="checkbox" name="consent_sms" value="1" {% if prefs.sms %}checked{% endif %}>
SMS updates
</label>
</div>
<div class="form-wrap">
<label class="checkbox-inline">
<label class="pref-check">
<input type="checkbox" name="consent_postcard" value="1" {% if prefs.postcard %}checked{% endif %}>
Postcard mailings
</label>
@@ -38,16 +38,16 @@
Postcard mailings also need a postal address on file.
</p>
<div style="margin-top:24px;display:flex;flex-wrap:wrap;gap:12px;">
<button class="button button-primary button-winona" type="submit" name="action" value="save">
<button class="button button-primary button-md" type="submit" name="action" value="save">
Save preferences
</button>
<button class="button button-gray-bordered button-winona" type="submit" name="action" value="unsubscribe_all">
<button class="button button-gray" type="submit" name="action" value="unsubscribe_all">
Unsubscribe from all
</button>
</div>
</form>
<p style="margin-top:32px">
<a class="button button-gray-bordered button-winona" href="{% url 'public:home' %}">Back to home</a>
<a class="button button-gray" href="{% url 'public:home' %}">Back to home</a>
</p>
{% endif %}
</div>
+160
View File
@@ -0,0 +1,160 @@
"""Customer comments from College Craft satisfaction surveys (archived site)."""
TESTIMONIALS = [
{
"quote": (
"I have been meaning to send you a thank you for getting our outdoor "
"painting completed before our daughters wedding in June. When we got "
"back the wedding photos, I realized how awesome everything looked. I "
"had no idea the front porch would end up being the focal point for "
"photos so I was so happy the porch looked so awesome because of you "
"and your painting team. Thank you so much."
),
"attribution": "M. H. Elburn, Illinois",
},
{
"quote": "Could not be happier. The work got done quickly and very professionally. Excellent crew!",
"attribution": "T. K. Roselle, IL",
},
{
"quote": "Awesome, Awesome, Awesome job and crew. Exceeded expectations.",
"attribution": "K. H. Glen Ellyn, IL",
},
{
"quote": (
"This was my third time using College Craft. Your crew did an outstanding "
"job paying close attention to do a great job, ensuring it was done properly."
),
"attribution": "C. Z. Barrington, IL",
},
{
"quote": (
"The guys were great! Friendly and did an awesome job. Thank you for "
"squeezing me in so quickly. I will recommend you to others."
),
"attribution": "W. W. Naperville, IL",
},
{
"quote": (
"Thank you College Craft! The carpentry repair work & the painting have "
"given my house more than a facelift. To me, it has given that Million "
"Dollar Look! Truly, There Really is a Difference!!"
),
"attribution": "J. P. Geneva, IL",
},
{
"quote": (
"Your crew was great and did a great job on our house last week. They "
"cleaned up and touched up when the job was done. They all had a great "
"personality. If friends or neighbors want a suggestion for house painting, "
"we will recommend College Craft."
),
"attribution": "M. A. Glen Ellyn",
},
{
"quote": (
"Through the 45 years in this house we have had many good craftsmen, but "
"never before have we had as nice a crew as yours. They were helpful, "
"always courteous and very professional. We want them back!"
),
"attribution": "P. B. Wheaton, IL",
},
{
"quote": (
"I have used College Craft since 1999 and always call them when I need "
"painting. Great job and great people."
),
"attribution": "L. P. Bloomingdale, IL",
},
{
"quote": (
"This is the 3rd time Ive relied on College Craft. I really appreciate "
"their attention to detail, thorough preparation and flexibility."
),
"attribution": "R. K. Lemont, IL",
},
{
"quote": "The best experience I have ever had with a painting job. Very professional, friendly and helpful.",
"attribution": "L. M. Wheaton, IL",
},
{
"quote": (
"When you think of painters, great customer service is not the first thing "
"you think of, but that is exactly what impressed me so much about College Craft. "
"I will be sure to call College Craft again."
),
"attribution": "K. M. Batavia, IL",
},
{
"quote": (
"The house looks like NEW and it is 75 years old!!! We are so impressed "
"with College Crafts professionalism and work ethic. My husband and I "
"cannot stop talking about the awesome job."
),
"attribution": "M. S. Glen Ellyn, IL",
},
{
"quote": (
"I was quite impressed. I am in the construction business myself and if I "
"could find contractors that performed as professionally and quickly as this "
"crew, I would hire them permanently. I cannot believe the quality of the work!!"
),
"attribution": "M. T. Downers Grove, IL",
},
{
"quote": (
"Another super job by College Craft. I can always count on their work, price "
"and a job well done. Thorough, courteous and very good workers."
),
"attribution": "B. N. Glen Ellyn, IL",
},
{
"quote": (
"Neighbor across the street got a quote from you while our house was being "
"worked on. College Craft is the finest and you will be getting more business "
"from us in the future and always will recommend you."
),
"attribution": "R. D. Arlington Heights, IL",
},
{
"quote": "What a great job! I could not be happier. I will definitely recommend you to everyone.",
"attribution": "N. G. Downers Grove, IL",
},
{
"quote": "Outstanding painting great attention to detail. Excellent lines and edging. Coverage was excellent too.",
"attribution": "G. L. Elburn, IL",
},
{
"quote": "This is the fourth time I have used College Craft and I will continue to use them for all of my painting needs.",
"attribution": "K. P. Bolingbrook, IL",
},
{
"quote": (
"I had College Craft paint the interior of my home about 4 years ago and it "
"was done perfectly! I cant believe I am just as happy this time. You have "
"the best workers!"
),
"attribution": "L. K. Geneva, IL",
},
{
"quote": "Excellent job. Very thorough and responsive. Prompt and courteous. Very good clean up as well.",
"attribution": "C. K. Lisle, IL",
},
{
"quote": "Would absolutely recommend. Very courteous, friendly, professional and extremely fast.",
"attribution": "D. S. Oswego, IL",
},
{
"quote": "Thank you! We have a beautiful home to welcome friends and family.",
"attribution": "Loretto Convent Sisters, Western Springs, IL",
},
{
"quote": (
"House looks fantastic. You were definitely right itd make the windows look "
"new again. The team was great as well really professional and friendly."
),
"attribution": "A. P. St. Charles, IL",
},
]
FEATURED_TESTIMONIALS = TESTIMONIALS[:3]
+3
View File
@@ -7,6 +7,9 @@ app_name = "public"
urlpatterns = [
path("", views.home, name="home"),
path("about/", views.about, name="about"),
path("services/", views.services, name="services"),
path("testimonials/", views.testimonials, name="testimonials"),
path("careers/", views.careers, name="careers"),
path("contact/", views.contact, name="contact"),
path("terms/", views.terms, name="terms"),
path("robots.txt", views.robots_txt, name="robots_txt"),
+125 -51
View File
@@ -17,8 +17,9 @@ from contacts.consent import (
set_channel_preferences,
unsubscribe_all,
)
from public.forms import ContactForm, NotifyForm
from public.forms import CareersForm, ContactForm, NotifyForm
from public.notifications import notify_admins_of_contact_form
from public.testimonials_data import FEATURED_TESTIMONIALS, TESTIMONIALS
def _public_site_base(request) -> str:
@@ -28,14 +29,89 @@ def _public_site_base(request) -> str:
return request.build_absolute_uri("/").rstrip("/")
def _postal_from_form(data: dict) -> dict:
return Contact.make_postal_address(
line1=data.get("address_line1") or "",
line2=data.get("address_line2") or "",
city=data.get("address_city") or "",
state=data.get("address_state") or "",
zip_code=data.get("address_zip") or "",
)
def _create_lead(
request,
*,
data: dict,
source: str,
body: str,
consent_reason: str,
):
postal = _postal_from_form(data)
submitted_email = data["email"].lower()
contact_obj, _created, match_reason = upsert_contact(
email=submitted_email,
first_name=data["first_name"],
last_name=data.get("last_name") or "",
phone=data.get("phone") or "",
postal_address=postal if Contact.postal_address_has_content(postal) else None,
source=source,
)
ConsentRecord.objects.update_or_create(
contact=contact_obj,
channel=Channel.EMAIL,
defaults={"opted_in": True, "reason": consent_reason},
)
if (data.get("phone") or "").strip():
ConsentRecord.objects.update_or_create(
contact=contact_obj,
channel=Channel.SMS,
defaults={"opted_in": True, "reason": consent_reason},
)
if Contact.postal_address_has_content(postal):
ConsentRecord.objects.get_or_create(
contact=contact_obj,
channel=Channel.POSTCARD,
defaults={"opted_in": True, "reason": consent_reason},
)
if (
match_reason in {"phone", "address"}
and (contact_obj.email or "").lower() != submitted_email
):
body = (
f"Submitted email: {submitted_email} "
f"(merged by {match_reason} with "
f"{contact_obj.email or 'existing contact'})\n\n{body}"
).strip()
lead = Lead.objects.create(
contact=contact_obj,
message=body,
status=Lead.Status.NEW,
)
attribute_lead_from_request(request, lead)
return lead
def home(request):
return render(request, "public/home.html")
return render(
request,
"public/home.html",
{"featured_testimonials": FEATURED_TESTIMONIALS},
)
def about(request):
return render(request, "public/about.html")
def services(request):
return render(request, "public/services.html")
def testimonials(request):
return render(request, "public/testimonials.html", {"testimonials": TESTIMONIALS})
def terms(request):
return render(request, "public/terms.html")
@@ -64,7 +140,10 @@ def sitemap_xml(request):
paths = [
("public:home", "1.0", "weekly"),
("public:about", "0.8", "monthly"),
("public:services", "0.8", "monthly"),
("public:testimonials", "0.7", "monthly"),
("public:contact", "0.9", "monthly"),
("public:careers", "0.6", "monthly"),
("public:terms", "0.5", "yearly"),
]
from django.apps import apps as django_apps
@@ -95,61 +174,18 @@ def contact(request):
form = ContactForm(request.POST)
if form.is_valid():
data = form.cleaned_data
postal = Contact.make_postal_address(
line1=data.get("address_line1") or "",
line2=data.get("address_line2") or "",
city=data.get("address_city") or "",
state=data.get("address_state") or "",
zip_code=data.get("address_zip") or "",
)
submitted_email = data["email"].lower()
contact_obj, _created, match_reason = upsert_contact(
email=submitted_email,
first_name=data["first_name"],
last_name=data.get("last_name") or "",
phone=data.get("phone") or "",
postal_address=postal
if Contact.postal_address_has_content(postal)
else None,
source=Contact.Source.CONTACT_FORM,
)
ConsentRecord.objects.update_or_create(
contact=contact_obj,
channel=Channel.EMAIL,
defaults={"opted_in": True, "reason": "contact_form"},
)
if (data.get("phone") or "").strip():
ConsentRecord.objects.update_or_create(
contact=contact_obj,
channel=Channel.SMS,
defaults={"opted_in": True, "reason": "contact_form"},
)
if Contact.postal_address_has_content(postal):
ConsentRecord.objects.get_or_create(
contact=contact_obj,
channel=Channel.POSTCARD,
defaults={"opted_in": True, "reason": "contact_form"},
)
interest = data.get("interest") or ""
interest_label = dict(ContactForm.INTEREST_CHOICES).get(interest, interest)
body = data.get("message") or ""
if interest_label:
body = f"Interest: {interest_label}\n\n{body}".strip()
if (
match_reason in {"phone", "address"}
and (contact_obj.email or "").lower() != submitted_email
):
body = (
f"Submitted email: {submitted_email} "
f"(merged by {match_reason} with "
f"{contact_obj.email or 'existing contact'})\n\n{body}"
).strip()
lead = Lead.objects.create(
contact=contact_obj,
message=body,
status=Lead.Status.NEW,
lead = _create_lead(
request,
data=data,
source=Contact.Source.CONTACT_FORM,
body=body,
consent_reason="contact_form",
)
attribute_lead_from_request(request, lead)
notify_admins_of_contact_form(lead)
messages.success(request, "Thanks — we will be in touch soon.")
return redirect(f"{reverse('public:contact')}?sent=1")
@@ -158,6 +194,44 @@ def contact(request):
return render(request, "public/contact.html", {"form": form})
@require_http_methods(["GET", "POST"])
def careers(request):
if request.method == "POST":
form = CareersForm(request.POST)
if form.is_valid():
data = form.cleaned_data
position_labels = [
dict(CareersForm.POSITION_CHOICES).get(value, value)
for value in data.get("positions") or []
]
body_parts = [
"Interest: Employment application",
f"Positions: {', '.join(position_labels) or '(none)'}",
f"Start: {data.get('start_date') or '(not specified)'}",
f"Driver's license: {data.get('drivers_license') or '(not specified)'}",
f"Transportation: {data.get('has_vehicle') or '(not specified)'}",
"",
data.get("qualifications") or "",
]
lead = _create_lead(
request,
data=data,
source=Contact.Source.CAREERS,
body="\n".join(body_parts).strip(),
consent_reason="careers_form",
)
notify_admins_of_contact_form(
lead, subject_prefix="New employment application"
)
messages.success(
request, "Thanks — we received your application and will follow up."
)
return redirect(f"{reverse('public:careers')}?sent=1")
else:
form = CareersForm()
return render(request, "public/careers.html", {"form": form})
@require_http_methods(["GET", "POST"])
def under_construction(request):
"""Direct route (also used by middleware). Accepts notify-me emails."""