[AA-909] Create goal reminder email (#28822)
* feat: Create goal reminder email in ace * creating email
This commit is contained in:
committed by
GitHub
parent
38944b836b
commit
caec8f6f29
@@ -3,18 +3,29 @@ Command to trigger sending reminder emails for learners to achieve their Course
|
||||
"""
|
||||
from datetime import date, timedelta
|
||||
import logging
|
||||
import six
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.sites.models import Site
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.urls import reverse
|
||||
from edx_ace import ace
|
||||
from edx_ace.message import Message
|
||||
from edx_ace.recipient import Recipient
|
||||
|
||||
from common.djangoapps.student.models import CourseEnrollment
|
||||
from lms.djangoapps.certificates.api import get_certificate_for_user_id
|
||||
from lms.djangoapps.certificates.data import CertificateStatuses
|
||||
from lms.djangoapps.course_goals.models import CourseGoal, CourseGoalReminderStatus, UserActivity
|
||||
from lms.djangoapps.course_goals.toggles import COURSE_GOALS_NUMBER_OF_DAYS_GOALS
|
||||
from openedx.core.djangoapps.ace_common.template_context import get_base_template_context
|
||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference
|
||||
from openedx.core.lib.celery.task_utils import emulate_http_request
|
||||
from openedx.features.course_duration_limits.access import get_user_course_expiration_date
|
||||
from openedx.features.course_experience import course_home_url_name
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -22,8 +33,53 @@ MONDAY_WEEKDAY = 0
|
||||
SUNDAY_WEEKDAY = 6
|
||||
|
||||
|
||||
def ace_send():
|
||||
"""Just here as a mock hook for tests - drop this once we fix AA-909"""
|
||||
def send_ace_message(goal):
|
||||
"""
|
||||
Send an email reminding users to stay on track for their learning goal in this course
|
||||
|
||||
Arguments:
|
||||
goal (CourseGoal): Goal object
|
||||
"""
|
||||
user = goal.user
|
||||
try:
|
||||
course = CourseOverview.get_from_id(goal.course_key)
|
||||
except CourseOverview.DoesNotExist:
|
||||
log.error("Goal Reminder course not found.")
|
||||
|
||||
course_name = course.display_name
|
||||
|
||||
site = Site.objects.get_current()
|
||||
message_context = get_base_template_context(site)
|
||||
|
||||
course_home_url = reverse(course_home_url_name(course.id), args=[str(course.id)])
|
||||
course_home_absolute_url_parts = ("https", site.name, course_home_url, '', '', '')
|
||||
course_home_absolute_url = six.moves.urllib.parse.urlunparse(course_home_absolute_url_parts)
|
||||
|
||||
goals_unsubscribe_url = reverse(
|
||||
'course-home:unsubscribe-from-course-goal',
|
||||
kwargs={'token': goal.unsubscribe_token}
|
||||
)
|
||||
|
||||
message_context.update({
|
||||
'email': user.email,
|
||||
'platform_name': configuration_helpers.get_value('PLATFORM_NAME', settings.PLATFORM_NAME),
|
||||
'course_name': course_name,
|
||||
'days_per_week': goal.days_per_week,
|
||||
'course_url': course_home_absolute_url,
|
||||
'goals_unsubscribe_url': goals_unsubscribe_url,
|
||||
'unsubscribe_url': None, # We don't want to include the default unsubscribe link
|
||||
})
|
||||
|
||||
msg = Message(
|
||||
name="goalreminder",
|
||||
app_label="course_goals",
|
||||
recipient=Recipient(user.id, user.email),
|
||||
language=get_user_preference(user, LANGUAGE_KEY),
|
||||
context=message_context
|
||||
)
|
||||
|
||||
with emulate_http_request(site, user):
|
||||
ace.send(msg)
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
@@ -104,9 +160,7 @@ class Command(BaseCommand):
|
||||
# Essentially, if today is Sunday, days_left_in_week should be 1 since they have Sunday to hit their goal.
|
||||
days_left_in_week = SUNDAY_WEEKDAY - today.weekday() + 1
|
||||
if required_days_left == days_left_in_week:
|
||||
# TODO: hook up email AA-909
|
||||
# ace.send(msg)
|
||||
ace_send() # temporary for tests, drop with AA-909 and just mock ace.send directly
|
||||
send_ace_message(goal)
|
||||
CourseGoalReminderStatus.objects.update_or_create(goal=goal, defaults={'email_reminder_sent': True})
|
||||
return True
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ class TestGoalReminderEmailCommand(TestCase):
|
||||
|
||||
def call_command(self, day=TUESDAY, expect_sent=None, expect_send_count=None):
|
||||
"""Calls the management command with a frozen time and optionally checks whether we sent an email"""
|
||||
with mock.patch('lms.djangoapps.course_goals.management.commands.goal_reminder_email.ace_send') as mock_send:
|
||||
with mock.patch('lms.djangoapps.course_goals.management.commands.goal_reminder_email.send_ace_message') as mock_send: # pylint: disable=line-too-long
|
||||
with freeze_time(f'2021-03-0{day + 1}'): # March 2021 starts on a Monday
|
||||
call_command('goal_reminder_email')
|
||||
|
||||
|
||||
@@ -1,33 +1,85 @@
|
||||
{% extends 'ace_common/edx_ace/common/base_body.html' %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load django_markup %}
|
||||
{% load static %}
|
||||
{% block content %}
|
||||
<table width="100%" align="left" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
{# email client support for style sheets is pretty spotty, so we have to inline all of these styles #}
|
||||
{# we're using important below to override inline styles and my understanding is for email clients where media queries do not work, they'll simply see the desktop css on their phone #}
|
||||
<table style="font-family: Inter;" width="calc(100% + 2.5rem)" align="left" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tr>
|
||||
<td>
|
||||
<h1>
|
||||
{% trans "There's still time to reach your goal" as tmsg %}{{ tmsg | force_escape }}
|
||||
</h1>
|
||||
<p style="color: rgba(0,0,0,.75);">
|
||||
{% filter force_escape %}
|
||||
{% blocktrans %}You set a goal of learning 3x a week in Rhetoric: The Art of Persuasive Writing and Public Speaking. You're not quite there, but there's still time to reach that goal!{% endblocktrans %}
|
||||
{% endfilter %}
|
||||
<br />
|
||||
</p>
|
||||
{% include "goal_reminder_banner.html" %}
|
||||
<style>
|
||||
@media only screen and (max-width: 600px) {
|
||||
.goal-reminder-body-wrapper {
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="goal-reminder-body-wrapper" style="margin-top: 2.25rem; margin-left: 1.0625rem;">
|
||||
<h1 style="
|
||||
font-size: 1.375rem;
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
line-height: 1.75rem;
|
||||
text-align: left;
|
||||
">
|
||||
{% filter force_escape %}{% blocktrans %}
|
||||
There's still time to reach your goal
|
||||
{% endblocktrans %}{% endfilter %}
|
||||
</h1>
|
||||
|
||||
<p style="color: rgba(0,0,0,.75);">
|
||||
{% filter force_escape %}
|
||||
{% blocktrans %}Remember, you can always change your learning goal. The best goal is one that you can stick to. {% endblocktrans %}
|
||||
{% endfilter %}
|
||||
<br />
|
||||
</p>
|
||||
<p style="color: rgba(0,0,0,.75);">
|
||||
{% filter force_escape %}
|
||||
{% blocktrans asvar goal_text %}
|
||||
You set a goal of learning {start_bold}{{days_per_week}} times a week in {{course_name}}{end_bold}. You're not quite there, but there's still time to reach that goal!
|
||||
{% endblocktrans %}
|
||||
{% endfilter %}
|
||||
{% interpolate_html goal_text start_bold='<b>'|safe end_bold='</b>'|safe %}
|
||||
<br />
|
||||
</p>
|
||||
|
||||
{% filter force_escape %}
|
||||
{% blocktrans asvar course_cta_text %}Adjust my goal{% endblocktrans %}
|
||||
{% endfilter %}
|
||||
{% include "ace_common/edx_ace/common/return_to_course_cta.html" with course_cta_text=course_cta_text course_cta_url=reset_link %}
|
||||
<a style="color: white; text-decoration: none; display: inline-block;"
|
||||
href="{{course_url}}" target="_blank">
|
||||
<div style="padding: 0.5rem 0.75rem; background: #D23228; margin-bottom: 1rem;">
|
||||
{% filter force_escape %}{% blocktrans %}
|
||||
Jump back in
|
||||
{% endblocktrans %}{% endfilter %}
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<p style="color: rgba(0,0,0,.75);">
|
||||
{% filter force_escape %}{% blocktrans %}
|
||||
Remember, you can always change your learning goal. The best goal is one that you can stick to.
|
||||
{% endblocktrans %}{% endfilter %}
|
||||
<br />
|
||||
</p>
|
||||
|
||||
<a style="color: #D23228; text-decoration: none; display: inline-block; border: 0.0625rem solid #F2F0EF;"
|
||||
href="{{course_url}}" target="_blank">
|
||||
<div style="padding: 0.5rem 0.75rem; background: white;">
|
||||
{% filter force_escape %}{% blocktrans %}
|
||||
Adjust my goal
|
||||
{% endblocktrans %}{% endfilter %}
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a style="
|
||||
color: #00688D;
|
||||
display: block;
|
||||
font-size: 0.875rem;
|
||||
margin: 0.9375rem auto 0 auto;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
width: 11.5625rem;
|
||||
"
|
||||
href="{{goals_unsubscribe_url}}" target="_blank">
|
||||
{% filter force_escape %}{% blocktrans %}
|
||||
Unsubscribe from goal reminder emails to this course
|
||||
{% endblocktrans %}{% endfilter %}
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,11 @@
|
||||
{% load i18n %}
|
||||
{% trans "You’re almost there!" %}
|
||||
{% trans "There's still time to reach your goal" as tmsg %}
|
||||
{% blocktrans %}You set a goal of learning {{days_per_week}} times a week in {{course_name}}. You're not quite there, but there's still time to reach that goal!{% endblocktrans %}
|
||||
{% trans "Jump back in"}
|
||||
{{course_url}}
|
||||
{% blocktrans %}Remember, you can always change your learning goal. The best goal is one that you can stick to. {% endblocktrans %}
|
||||
{% trans "Adjust my goal"}
|
||||
{{course_url}}
|
||||
{% trans "Unsubscribe from goal reminder emails to this course"}
|
||||
{{course_url}}
|
||||
@@ -0,0 +1 @@
|
||||
{{ platform_name }}
|
||||
@@ -0,0 +1 @@
|
||||
{% extends 'ace_common/edx_ace/common/base_head.html' %}
|
||||
@@ -0,0 +1,4 @@
|
||||
{% load i18n %}
|
||||
{% autoescape off %}
|
||||
{% blocktrans trimmed %}You've almost reached your goal in {{ course_name }}{% endblocktrans %}
|
||||
{% endautoescape %}
|
||||
75
lms/templates/goal_reminder_banner.html
Normal file
75
lms/templates/goal_reminder_banner.html
Normal file
@@ -0,0 +1,75 @@
|
||||
{% load i18n %}
|
||||
{# email client support for style sheets is pretty spotty, so we have to inline all of these styles #}
|
||||
{# we're using important below to override inline styles and my understanding is for email clients where media queries do not work, they'll simply see the desktop css on their phone #}
|
||||
<style>
|
||||
.goals-two-color:first-line { color: white !important;}
|
||||
|
||||
@media only screen and (max-width: 600px) {
|
||||
.goals-banner-div {
|
||||
width: 85% !important;
|
||||
}
|
||||
|
||||
.goals-two-color {
|
||||
font-size: 1.5625rem !important;
|
||||
line-height: 1.875rem !important;
|
||||
margin: 2.25rem 0 !important;
|
||||
width: 12.5rem !important;
|
||||
}
|
||||
|
||||
.goals-banner-wrapper-div {
|
||||
height: 6.25rem !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="goals-banner-wrapper-div" style="height: 14.0625rem; font-family: Inter, Arial, sans-serif;">
|
||||
<div class="goals-banner-div" style="margin-left: -1.25rem; margin-top: -1rem; width: 100%;position: absolute;">
|
||||
<svg style="position: absolute; max-height: 14.5rem;" viewBox="0 0 560 232" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="mask0" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="560" height="232">
|
||||
<rect y="0.543091" width="560" height="230.983" fill="#00262B"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0)">
|
||||
<rect y="0.543091" width="560" height="230.983" fill="#00262B"/>
|
||||
<rect x="10.9041" y="-30.3442" width="22.8297" height="131.607" transform="rotate(17.8992 10.9041 -30.3442)" fill="#2D494E"/>
|
||||
<line x1="355.725" y1="234.593" x2="367.302" y2="181.05" stroke="#03C7E8" stroke-width="8"/>
|
||||
<path d="M417.05 -35.1023H622.564L560.567 258.697H353.508L417.05 -35.1023Z" fill="#F2F0EF"/>
|
||||
<path d="M477.214 193.022V55.8274C477.227 55.2608 477.025 54.7106 476.649 54.2882C476.274 53.8658 475.752 53.6027 475.191 53.5523C474.9 53.5365 474.61 53.5804 474.337 53.6814C474.064 53.7823 473.814 53.9382 473.603 54.1395C473.392 54.3408 473.224 54.5833 473.109 54.8521C472.995 55.1209 472.936 55.4103 472.936 55.7028V193.022C472.936 193.592 473.161 194.139 473.563 194.542C473.964 194.946 474.508 195.172 475.075 195.172C475.642 195.172 476.187 194.946 476.588 194.542C476.989 194.139 477.214 193.592 477.214 193.022V193.022Z" fill="#2D494E"/>
|
||||
<path d="M475.075 196.003C474.289 196.003 473.535 195.688 472.979 195.129C472.423 194.57 472.11 193.812 472.11 193.022V55.7028C472.108 55.2974 472.189 54.8958 472.347 54.523C472.506 54.1501 472.738 53.8137 473.031 53.5345C473.323 53.2552 473.669 53.0391 474.048 52.8994C474.426 52.7597 474.829 52.6993 475.232 52.7219C476.007 52.7792 476.73 53.1333 477.253 53.7112C477.775 54.289 478.057 55.0466 478.04 55.8273V193.022C478.04 193.812 477.728 194.57 477.172 195.129C476.616 195.688 475.862 196.003 475.075 196.003ZM475.075 54.3826C474.902 54.3803 474.73 54.413 474.57 54.4785C474.41 54.5441 474.264 54.6412 474.142 54.7643C474.019 54.8873 473.923 55.0338 473.857 55.1949C473.792 55.3561 473.76 55.5288 473.762 55.7028V193.022C473.762 193.372 473.9 193.708 474.147 193.955C474.393 194.203 474.727 194.342 475.075 194.342C475.423 194.342 475.757 194.203 476.004 193.955C476.25 193.708 476.388 193.372 476.388 193.022V55.8273C476.401 55.4739 476.28 55.1287 476.051 54.8608C475.821 54.5929 475.499 54.4221 475.149 54.3826H475.075Z" fill="#2D494E"/>
|
||||
<path d="M435.465 193.669C442.898 170.146 449.588 149.662 456.228 129.901C456.417 129.385 456.409 128.817 456.207 128.306C456.004 127.796 455.62 127.379 455.13 127.136C454.857 127.011 454.562 126.944 454.262 126.942C453.963 126.939 453.666 126.999 453.391 127.119C453.116 127.239 452.869 127.415 452.667 127.637C452.464 127.859 452.31 128.121 452.214 128.406C445.549 148.217 438.859 168.776 431.385 192.341C431.282 192.664 431.257 193.006 431.311 193.341C431.365 193.675 431.496 193.992 431.695 194.266C431.894 194.539 432.154 194.762 432.455 194.915C432.756 195.068 433.088 195.148 433.425 195.147C433.877 195.149 434.317 195.007 434.684 194.742C435.05 194.476 435.324 194.101 435.465 193.669V193.669Z" fill="#2D494E"/>
|
||||
<path d="M433.425 196.003C432.958 196.003 432.497 195.892 432.08 195.679C431.663 195.467 431.303 195.158 431.027 194.778C430.752 194.398 430.57 193.959 430.495 193.495C430.421 193.031 430.457 192.556 430.601 192.108C438.1 168.411 444.723 148.101 451.43 128.173C451.564 127.779 451.779 127.417 452.061 127.11C452.343 126.804 452.685 126.56 453.066 126.394C453.447 126.229 453.858 126.145 454.273 126.148C454.688 126.151 455.098 126.242 455.477 126.413C456.149 126.746 456.677 127.315 456.96 128.013C457.243 128.711 457.262 129.489 457.013 130.199C450.323 150.127 443.724 170.354 436.25 193.952C436.058 194.552 435.68 195.074 435.172 195.443C434.664 195.812 434.052 196.008 433.425 196.003V196.003ZM454.238 127.775C453.964 127.775 453.697 127.861 453.474 128.022C453.252 128.183 453.086 128.41 452.999 128.672C446.293 148.599 439.677 168.926 432.17 192.607C432.107 192.806 432.092 193.018 432.126 193.224C432.161 193.431 432.244 193.626 432.368 193.794C432.488 193.963 432.647 194.1 432.831 194.194C433.015 194.288 433.219 194.336 433.425 194.334C433.704 194.331 433.975 194.24 434.2 194.075C434.425 193.91 434.593 193.678 434.68 193.412V193.412C442.114 169.798 448.721 149.529 455.452 129.627C455.542 129.424 455.58 129.202 455.562 128.982C455.545 128.761 455.472 128.548 455.351 128.362C455.23 128.177 455.065 128.025 454.87 127.921C454.676 127.817 454.458 127.764 454.238 127.767V127.775Z" fill="#2D494E"/>
|
||||
<path d="M516.725 195.172C517.062 195.171 517.393 195.09 517.693 194.936C517.993 194.783 518.252 194.56 518.451 194.287C518.649 194.014 518.781 193.698 518.836 193.364C518.89 193.03 518.866 192.688 518.765 192.366C511.332 168.801 504.618 148.267 497.961 128.481C497.807 127.996 497.491 127.579 497.067 127.302C496.642 127.025 496.135 126.905 495.632 126.961C495.318 127.002 495.017 127.113 494.75 127.285C494.484 127.457 494.259 127.686 494.092 127.956C493.924 128.226 493.818 128.53 493.782 128.846C493.745 129.162 493.779 129.483 493.881 129.784C500.529 149.571 507.219 170.105 514.677 193.669C514.817 194.105 515.09 194.486 515.458 194.756C515.826 195.026 516.27 195.171 516.725 195.172V195.172Z" fill="#2D494E"/>
|
||||
<path d="M516.725 196.003C516.094 196.005 515.478 195.804 514.968 195.429C514.458 195.054 514.081 194.524 513.892 193.918C506.402 170.263 499.794 149.969 493.096 130.05C492.959 129.639 492.913 129.203 492.963 128.772C493.013 128.341 493.157 127.927 493.385 127.559C493.617 127.182 493.929 126.862 494.299 126.622C494.669 126.383 495.088 126.229 495.524 126.172C496.218 126.089 496.918 126.25 497.506 126.629C498.093 127.007 498.532 127.58 498.745 128.248C505.435 148.176 512.051 168.469 519.55 192.183C519.691 192.63 519.726 193.104 519.651 193.567C519.576 194.03 519.394 194.468 519.119 194.847C518.843 195.225 518.483 195.533 518.067 195.746C517.652 195.958 517.192 196.069 516.725 196.069V196.003ZM495.904 127.775H495.747C495.554 127.799 495.368 127.867 495.203 127.972C495.038 128.077 494.899 128.218 494.795 128.384C494.69 128.55 494.624 128.737 494.6 128.931C494.576 129.126 494.596 129.324 494.657 129.51C501.364 149.438 507.971 169.739 515.47 193.445C515.556 193.712 515.724 193.944 515.95 194.11C516.175 194.275 516.446 194.365 516.725 194.367C516.932 194.366 517.136 194.317 517.32 194.222C517.505 194.128 517.664 193.991 517.786 193.822C517.907 193.654 517.988 193.459 518.02 193.253C518.052 193.048 518.036 192.838 517.972 192.64C510.481 168.975 503.874 148.674 497.176 128.771C497.094 128.493 496.927 128.247 496.699 128.068C496.471 127.89 496.193 127.787 495.904 127.775V127.775Z" fill="#2D494E"/>
|
||||
<path d="M475.075 177.154C506.621 177.154 532.194 151.444 532.194 119.729C532.194 88.014 506.621 62.3038 475.075 62.3038C443.529 62.3038 417.956 88.014 417.956 119.729C417.956 151.444 443.529 177.154 475.075 177.154Z" fill="#03C7E8"/>
|
||||
<path d="M475.075 177.993C463.613 177.994 452.407 174.579 442.876 168.178C433.344 161.777 425.915 152.678 421.527 142.031C417.14 131.385 415.991 119.67 418.226 108.367C420.461 97.0648 425.98 86.6824 434.085 78.5332C442.189 70.3841 452.516 64.8342 463.758 62.5854C475 60.3366 486.653 61.4899 497.243 65.8995C507.833 70.3091 516.884 77.7769 523.253 87.3585C529.621 96.9401 533.02 108.205 533.02 119.729C533.003 135.175 526.892 149.983 516.03 160.905C505.167 171.828 490.438 177.973 475.075 177.993V177.993ZM475.075 63.1342C463.939 63.1325 453.053 66.4511 443.793 72.6701C434.533 78.8891 427.315 87.7292 423.053 98.0724C418.79 108.416 417.675 119.797 419.847 130.778C422.019 141.759 427.381 151.845 435.256 159.762C443.13 167.678 453.163 173.069 464.085 175.253C475.007 177.437 486.328 176.315 496.616 172.03C506.904 167.745 515.697 160.489 521.883 151.179C528.069 141.87 531.37 130.925 531.368 119.729C531.351 104.725 525.414 90.3396 514.861 79.7298C504.308 69.1201 490 63.1518 475.075 63.1342V63.1342Z" fill="#2D494E"/>
|
||||
<path d="M475.075 167.315C501.216 167.315 522.407 146.01 522.407 119.729C522.407 93.4481 501.216 72.1432 475.075 72.1432C448.934 72.1432 427.743 93.4481 427.743 119.729C427.743 146.01 448.934 167.315 475.075 167.315Z" fill="white"/>
|
||||
<path d="M475.075 168.145C465.55 168.145 456.24 165.306 448.32 159.986C440.4 154.666 434.228 147.104 430.583 138.257C426.938 129.41 425.984 119.675 427.842 110.284C429.701 100.892 434.287 92.2648 441.022 85.4937C447.757 78.7225 456.338 74.1113 465.68 72.2432C475.022 70.375 484.705 71.3338 493.505 74.9983C502.304 78.6629 509.826 84.8685 515.117 92.8305C520.409 100.792 523.233 110.153 523.233 119.729C523.22 132.566 518.142 144.873 509.114 153.95C500.085 163.027 487.844 168.132 475.075 168.145V168.145ZM475.075 72.9818C465.877 72.9818 456.885 75.7242 449.237 80.8621C441.589 86.0001 435.628 93.3028 432.108 101.847C428.588 110.391 427.668 119.792 429.463 128.862C431.258 137.932 435.688 146.263 442.193 152.801C448.698 159.34 456.985 163.792 466.007 165.595C475.029 167.399 484.38 166.472 492.878 162.931C501.376 159.391 508.639 153.397 513.748 145.707C518.857 138.017 521.583 128.977 521.582 119.729C521.566 107.334 516.661 95.4515 507.943 86.6878C499.224 77.9241 487.404 72.995 475.075 72.9818Z" fill="#2D494E"/>
|
||||
<path d="M475.075 155.059C494.484 155.059 510.217 139.241 510.217 119.729C510.217 100.217 494.484 84.3988 475.075 84.3988C455.667 84.3988 439.933 100.217 439.933 119.729C439.933 139.241 455.667 155.059 475.075 155.059Z" fill="#03C7E8"/>
|
||||
<path d="M475.075 155.915C467.959 155.923 461 153.809 455.078 149.84C449.157 145.872 444.539 140.227 441.81 133.62C439.08 127.012 438.361 119.739 439.743 112.721C441.125 105.703 444.546 99.2541 449.574 94.191C454.602 89.1279 461.011 85.6777 467.99 84.2768C474.969 82.876 482.204 83.5875 488.78 86.3213C495.357 89.055 500.979 93.6883 504.936 99.6349C508.893 105.582 511.007 112.574 511.01 119.729C511.003 129.314 507.217 138.505 500.481 145.288C493.745 152.071 484.609 155.893 475.075 155.915ZM475.075 85.2457C468.284 85.2375 461.642 87.255 455.992 91.043C450.341 94.8309 445.935 100.219 443.332 106.525C440.728 112.831 440.044 119.773 441.366 126.47C442.688 133.167 445.956 139.32 450.757 144.149C455.558 148.978 461.676 152.267 468.337 153.599C474.999 154.931 481.903 154.247 488.177 151.632C494.451 149.018 499.812 144.591 503.583 138.912C507.353 133.233 509.363 126.557 509.358 119.729C509.347 110.588 505.733 101.824 499.307 95.3578C492.881 88.8911 484.167 85.2489 475.075 85.2291V85.2457Z" fill="#2D494E"/>
|
||||
<path d="M475.075 143.891C488.349 143.891 499.109 133.074 499.109 119.729C499.109 106.384 488.349 95.5666 475.075 95.5666C461.802 95.5666 451.041 106.384 451.041 119.729C451.041 133.074 461.802 143.891 475.075 143.891Z" fill="white"/>
|
||||
<path d="M475.075 144.722C470.158 144.723 465.351 143.259 461.262 140.514C457.172 137.769 453.985 133.866 452.102 129.299C450.219 124.732 449.726 119.707 450.684 114.858C451.642 110.01 454.009 105.556 457.486 102.059C460.962 98.5633 465.391 96.1821 470.214 95.2171C475.037 94.2521 480.035 94.7465 484.578 96.6379C489.121 98.5293 493.004 101.733 495.736 105.843C498.468 109.953 499.926 114.786 499.926 119.729C499.92 126.354 497.3 132.706 492.641 137.391C487.982 142.077 481.665 144.713 475.075 144.722V144.722ZM475.075 96.4052C470.484 96.4036 465.996 97.7708 462.179 100.334C458.361 102.897 455.385 106.541 453.627 110.805C451.87 115.068 451.409 119.76 452.305 124.287C453.2 128.814 455.41 132.972 458.657 136.236C461.903 139.499 466.039 141.721 470.541 142.621C475.044 143.522 479.711 143.059 483.952 141.292C488.193 139.525 491.817 136.533 494.367 132.695C496.916 128.857 498.276 124.344 498.275 119.729C498.266 113.546 495.819 107.618 491.47 103.246C487.121 98.8742 481.225 96.414 475.075 96.4052V96.4052Z" fill="#2D494E"/>
|
||||
<path d="M475.075 133.114C482.428 133.114 488.389 127.121 488.389 119.729C488.389 112.337 482.428 106.344 475.075 106.344C467.722 106.344 461.762 112.337 461.762 119.729C461.762 127.121 467.722 133.114 475.075 133.114Z" fill="#03C7E8"/>
|
||||
<path d="M475.075 133.944C472.279 133.944 469.545 133.11 467.22 131.549C464.894 129.987 463.082 127.766 462.012 125.169C460.942 122.571 460.662 119.713 461.207 116.956C461.753 114.198 463.1 111.665 465.077 109.677C467.055 107.689 469.574 106.336 472.317 105.787C475.059 105.239 477.902 105.52 480.486 106.596C483.07 107.672 485.278 109.494 486.832 111.832C488.385 114.169 489.215 116.918 489.215 119.729C489.21 123.498 487.719 127.111 485.068 129.776C482.418 132.441 478.824 133.94 475.075 133.944V133.944ZM475.075 107.175C472.605 107.175 470.191 107.911 468.137 109.29C466.084 110.67 464.483 112.631 463.538 114.925C462.593 117.219 462.346 119.743 462.827 122.178C463.309 124.614 464.499 126.851 466.245 128.606C467.991 130.362 470.217 131.558 472.639 132.042C475.061 132.527 477.572 132.278 479.854 131.328C482.136 130.378 484.086 128.769 485.458 126.704C486.83 124.639 487.563 122.212 487.563 119.729C487.558 116.401 486.241 113.21 483.9 110.857C481.559 108.503 478.386 107.179 475.075 107.175V107.175Z" fill="#2D494E"/>
|
||||
<path d="M423.547 78.7941L410.539 84.6727L429.444 99.3196L443.055 93.9724L423.547 78.7941Z" fill="#D23228"/>
|
||||
<path d="M429.444 100.15C429.261 100.149 429.082 100.091 428.932 99.9839L410.036 85.337C409.923 85.2493 409.835 85.1339 409.781 85.0021C409.726 84.8702 409.706 84.7264 409.722 84.5844C409.739 84.4424 409.792 84.3072 409.875 84.1918C409.959 84.0763 410.071 83.9846 410.201 83.9255L423.209 78.0468C423.343 77.9884 423.49 77.9669 423.635 77.9844C423.78 78.0019 423.918 78.0578 424.035 78.1464L443.542 93.3247C443.659 93.4144 443.751 93.534 443.806 93.671C443.862 93.808 443.88 93.9575 443.859 94.104C443.838 94.2505 443.779 94.3887 443.687 94.5042C443.595 94.6198 443.473 94.7085 443.336 94.7612L429.725 100.108C429.634 100.137 429.539 100.151 429.444 100.15V100.15ZM412.1 84.8554L429.543 98.3814L441.362 93.7399L423.465 79.7572L412.1 84.8554Z" fill="#2D494E"/>
|
||||
<path d="M423.267 77.972L427.817 65.9905L444.583 82.0988L443.055 93.9724L423.267 77.972Z" fill="#D23228"/>
|
||||
<path d="M443.055 94.8027C442.866 94.8035 442.682 94.739 442.535 94.62L422.713 78.6197C422.576 78.5097 422.477 78.3587 422.431 78.1885C422.385 78.0183 422.394 77.8378 422.457 77.6731L427.008 65.6999C427.057 65.5712 427.137 65.4568 427.24 65.3669C427.344 65.2771 427.469 65.2146 427.602 65.1851C427.746 65.1447 427.898 65.1442 428.042 65.1837C428.186 65.2231 428.317 65.3011 428.42 65.4092L445.194 81.5175C445.288 81.6075 445.359 81.7182 445.402 81.8408C445.445 81.9633 445.458 82.0944 445.442 82.2233L443.906 94.0969C443.887 94.2434 443.829 94.3822 443.739 94.499C443.649 94.6158 443.53 94.7063 443.394 94.7612C443.285 94.7986 443.17 94.8127 443.055 94.8027ZM424.291 77.698L442.46 92.4031L443.749 82.4392L428.172 67.4934L424.291 77.698Z" fill="#2D494E"/>
|
||||
<path d="M475.29 121.871C474.857 121.869 474.438 121.719 474.101 121.448L415.288 74.4598C415.076 74.307 414.897 74.1124 414.762 73.8878C414.627 73.6633 414.539 73.4135 414.503 73.1537C414.468 72.8938 414.485 72.6294 414.553 72.3764C414.622 72.1234 414.742 71.8871 414.904 71.6819C415.067 71.4767 415.269 71.3069 415.499 71.1828C415.729 71.0588 415.982 70.983 416.242 70.9601C416.502 70.9373 416.764 70.9678 417.011 71.0498C417.259 71.1319 417.488 71.2638 417.683 71.4374L476.487 118.442C476.799 118.692 477.025 119.033 477.135 119.418C477.245 119.803 477.234 120.213 477.103 120.591C476.971 120.97 476.726 121.297 476.401 121.53C476.077 121.762 475.688 121.887 475.29 121.888V121.871Z" fill="#F0CC00"/>
|
||||
<path d="M475.29 122.702C474.671 122.7 474.071 122.486 473.589 122.095L414.776 75.1074C414.212 74.6445 413.853 73.9754 413.779 73.2469C413.704 72.5183 413.921 71.7899 414.38 71.2215C414.834 70.6508 415.494 70.2835 416.217 70.1996C416.939 70.1156 417.665 70.3217 418.237 70.7731L477.049 117.786C477.494 118.144 477.817 118.632 477.974 119.183C478.131 119.733 478.114 120.319 477.926 120.86C477.737 121.401 477.386 121.869 476.922 122.2C476.457 122.532 475.901 122.71 475.331 122.71L475.29 122.702ZM416.486 71.8276C416.259 71.8292 416.038 71.9015 415.853 72.0346C415.668 72.1677 415.529 72.355 415.455 72.5708C415.381 72.7867 415.375 73.0203 415.438 73.2396C415.502 73.459 415.631 73.6531 415.809 73.7955L474.613 120.8C474.842 120.974 475.13 121.053 475.415 121.021C475.701 120.988 475.964 120.847 476.149 120.626C476.239 120.512 476.306 120.382 476.346 120.243C476.386 120.103 476.398 119.957 476.382 119.813C476.366 119.669 476.322 119.529 476.252 119.402C476.182 119.275 476.088 119.163 475.975 119.073L417.171 72.0518C416.971 71.9099 416.731 71.837 416.486 71.8442V71.8276Z" fill="#2D494E"/>
|
||||
</g>
|
||||
</svg>
|
||||
<h2 class="goals-two-color" style="
|
||||
color: #F0CD01;
|
||||
font-size: 2.6875rem;
|
||||
font-weight: bold;
|
||||
line-height: 3rem;
|
||||
margin: 4.1875rem 0 4.1875rem 1.0625rem;
|
||||
padding-left: 1.25rem;
|
||||
position: absolute;
|
||||
width: 18.75rem;
|
||||
">
|
||||
{% filter force_escape %}{% blocktrans %}
|
||||
You’re almost there!
|
||||
{% endblocktrans %}{% endfilter %}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user