Example #1
0
from bob_emploi.frontend.server import proto
from bob_emploi.frontend.server.mail import campaign
from bob_emploi.frontend.server.mail import mail_send

_TWO_YEARS_AGO_STRING = \
    proto.datetime_to_json_string(datetime.datetime.now() - datetime.timedelta(730))


def _account_deletion_notice_vars(user: user_pb2.User, **unused_kwargs: Any) -> dict[str, str]:
    return dict(
        campaign.get_default_vars(user),
        loginUrl=campaign.create_logged_url(user.user_id))


campaign.register_campaign(campaign.Campaign(
    campaign_id='account-deletion-notice',
    mongo_filters={
        # User hasn't been on Bob for two years.
        'registeredAt': {'$lt': _TWO_YEARS_AGO_STRING},
        'requestedByUserAtDate': {'$not': {'$gt': _TWO_YEARS_AGO_STRING}},
        # User hasn't read any email we sent to them in the last two years.
        'emailsSent': {'$not': {'$elemMatch': {
            'sentAt': {'$gt': _TWO_YEARS_AGO_STRING},
            'status': {'$in': list(mail_send.READ_EMAIL_STATUS_STRINGS)},
        }}},
    },
    get_vars=_account_deletion_notice_vars,
    sender_name=i18n.make_translatable_string("Joanna et l'équipe de {{var:productName}}"),
    sender_email='*****@*****.**',
))
    campaign.Campaign(
        campaign_id='prepare-your-application',
        mongo_filters={
            'projects': {'$elemMatch': {
                'isIncomplete': {'$ne': True},
            }},
        },
        get_vars=_get_prepare_your_application_vars,
        sender_name=i18n.make_translatable_string("Joanna et l'équipe de {{var:productName}}"),
        sender_email='*****@*****.**',
        is_coaching=True,
        is_big_focus=True,
    ),
    campaign.Campaign(
        campaign_id='prepare-your-application-short',
        mongo_filters={
            'projects': {'$elemMatch': {
                'isIncomplete': {'$ne': True},
            }},
        },
        get_vars=_get_prepare_your_application_short_vars,
        sender_name=i18n.make_translatable_string("Pascal et l'équipe de {{var:productName}}"),
        sender_email='*****@*****.**',
        is_coaching=True,
        is_big_focus=False,
    ),
]

for the_campaign in _CAMPAIGNS:
    campaign.register_campaign(the_campaign)
Example #3
0
                        'gender': user_profile_pb2.Gender.Name(
                            user.profile.gender),
                        'mainChallenge': main_challenge_id,
                    }),
            }),
    }


_FFS_CAMPAIGN = campaign.Campaign(
    campaign_id=_CAMPAIGN_ID,
    mongo_filters={
        'emailsSent': {
            '$not': {
                '$elemMatch': {
                    'campaignId': _CAMPAIGN_ID
                }
            }
        },
        # Don't bug very old users, they wouldn't pass the date check anyway.
        'registeredAt': {
            '$gt': '2022-02-01'
        },
    },
    get_vars=_get_ffs_vars,
    sender_name=i18n.make_translatable_string(
        'Tabitha de {{var:productName}}'),
    sender_email='*****@*****.**',
)

campaign.register_campaign(_FFS_CAMPAIGN)
Example #4
0
            'de definir votre projet professionnel')

    return campaign.get_default_coaching_email_vars(user) | {
        'inDepartement': scoring_project.populate_template('%inDepartement'),
        'jobs': [{'name': job.name} for job in reorient_jobs],
        'ofJobName': of_job_name,
    }


campaign.register_campaign(campaign.Campaign(
    campaign_id='jobbing',
    mongo_filters={
        'projects': {'$elemMatch': {
            'isIncomplete': {'$ne': True},
            'openedStrategies.strategyId': 'diploma-free-job',
        }},
    },
    get_vars=_get_jobbing_vars,
    sender_name=i18n.make_translatable_string("Joanna et l'équipe de {{var:productName}}"),
    sender_email='*****@*****.**',
    is_coaching=True,
    is_big_focus=False,
))
campaign.register_campaign(campaign.Campaign(
    campaign_id='jobbing-short',
    mongo_filters={
        'projects': {'$elemMatch': {
            'isIncomplete': {'$ne': True},
            'openedStrategies.strategyId': 'diploma-free-job',
        }},
    },
    get_vars=_get_jobbing_short_vars,
Example #5
0
) -> dict[str, Any]:
    if not any(email.campaign_id == 'jobflix-first-eval'
               for email in user.emails_sent):
        raise campaign.DoNotSend(
            'Only useful for user that have received the first campaign')
    next_week = now + datetime.timedelta(days=7)
    return campaign.get_default_vars(user) | {
        'closingDate': next_week.strftime('%A %d %B'),
    }


campaign.register_campaign(
    campaign.Campaign(campaign_id='jobflix-first-eval',
                      mongo_filters={'projects.isIncomplete': {
                          '$ne': True
                      }},
                      get_vars=_get_first_eval_vars,
                      sender_name=i18n.make_translatable_string(
                          "{0} et l'équipe de {1}").format('Tabitha', 'Bob'),
                      sender_email='*****@*****.**'))

campaign.register_campaign(
    campaign.Campaign(
        campaign_id='jobflix-first-eval-reminder',
        mongo_filters={'emailsSent.campaignId': 'jobflix-first-eval'},
        get_vars=_get_first_eval_reminder_vars,
        sender_name=i18n.make_translatable_string(
            "{0} et l'équipe de {1}").format('Tabitha', 'Bob'),
        sender_email='*****@*****.**'))

campaign.register_campaign(
Example #6
0
# TODO(pascal): Add a daily mail_blast once this code is live.
campaign.register_campaign(
    campaign.Campaign(
        campaign_id=_CAMPAIGN_ID,
        mongo_filters={
            'projects': {
                '$elemMatch': {
                    'jobSearchHasNotStarted': {
                        '$ne': True
                    },
                    'isIncomplete': {
                        '$ne': True
                    },
                    'actions.0': {
                        '$exists': True
                    },
                }
            },
            'emailsSent': {
                '$not': {
                    '$elemMatch': {
                        'campaignId': _CAMPAIGN_ID
                    }
                }
            },
        },
        get_vars=_get_vars,
        sender_name=i18n.make_translatable_string(
            "{{var:firstTeamMember}} et l'équipe de {{var:productName}}"),
        sender_email='*****@*****.**',
    ))
Example #7
0
        'whySpecificCompany':
        why_specific_company,
    }


campaign.register_campaign(
    campaign.Campaign(
        campaign_id='focus-spontaneous',
        mongo_filters={
            'projects': {
                '$elemMatch': {
                    'jobSearchHasNotStarted': {
                        '$ne': True
                    },
                    'isIncomplete': {
                        '$ne': True
                    },
                }
            },
        },
        get_vars=_get_spontaneous_vars,
        sender_name=i18n.make_translatable_string(
            "Joanna et l'équipe de {{var:productName}}"),
        sender_email='*****@*****.**',
        is_coaching=True,
        is_big_focus=True,
    ))
campaign.register_campaign(
    campaign.Campaign(
        campaign_id='spontaneous-short',
        mongo_filters={
            'projects': {
Example #8
0
        goal = 'décrocher votre prochain emploi'

    return campaign.get_default_coaching_email_vars(user) | {
        'goal': goal,
        'numberUsers': '250\u00A0000',
        'lastYear': str(now.year - 1),
        'year': str(now.year),
    }


campaign.register_campaign(
    campaign.Campaign(
        campaign_id='christmas',
        mongo_filters={},
        get_vars=_christmas_vars,
        is_coaching=True,
        is_big_focus=True,
        sender_name=i18n.make_translatable_string(
            'Joanna de {{var:productName}}'),
        sender_email='*****@*****.**',
    ))
campaign.register_campaign(
    campaign.Campaign(
        campaign_id='new-year',
        mongo_filters={},
        get_vars=_new_year_vars,
        sender_name=i18n.make_translatable_string(
            'Joanna de {{var:productName}}'),
        sender_email='*****@*****.**',
    ))
Example #9
0
        campaign.get_deep_link_advice(user.user_id, project, 'fresh-resume')

    return campaign.get_default_coaching_email_vars(user) | {
        'deepLinkAdviceUrl': deep_link_advice_url,
        'hasExperience': has_experience,
        'isSeptember': campaign.as_template_boolean(now.month == 9),
        'loginUrl': campaign.create_logged_url(user.user_id)
    }


campaign.register_campaign(
    campaign.Campaign(
        campaign_id='improve-cv',
        mongo_filters={
            'profile.frustrations': 'RESUME',
            'projects': {
                '$elemMatch': {
                    'isIncomplete': {
                        '$ne': True
                    },
                }
            },
        },
        get_vars=_get_improve_cv_vars,
        sender_name=i18n.make_translatable_string(
            "Joanna et l'équipe de {{var:productName}}"),
        sender_email='*****@*****.**',
        is_coaching=True,
        is_big_focus=True,
    ))
Example #10
0
        'inCity': in_city,
        'inTargetDomain': in_target_domain,
        'isAbleBodied': campaign.as_template_boolean(not user.profile.has_handicap),
        'isYoung': campaign.as_template_boolean(age <= max_young),
        'jobGroupInDepartement': f'{job_group_name} {in_departement}',
        'networkApplicationPercentage': network_application_importance,
    }


campaign.register_campaign(campaign.Campaign(
    campaign_id='focus-network',
    mongo_filters={
        'projects': {'$elemMatch': {
            'networkEstimate': 1,
            'isIncomplete': {'$ne': True},
        }},
    },
    get_vars=_get_network_vars,
    sender_name=i18n.make_translatable_string("Joanna et l'équipe de {{var:productName}}"),
    sender_email='*****@*****.**',
    is_coaching=True,
    is_big_focus=True,
))

campaign.register_campaign(campaign.Campaign(
    campaign_id='network-plus',
    mongo_filters={
        'projects': {'$elemMatch': {
            'networkEstimate': {'$gte': 2},
            'isIncomplete': {'$ne': True},
        }},
    },
Example #11
0
"""

import json
import os
import typing
from typing import Any

from bob_emploi.frontend.server import i18n
from bob_emploi.frontend.server.mail import campaign


def _get_mongo_filters() -> dict[str, Any]:
    """Get the mongo filters from env vars."""

    filters_as_string = os.getenv('RESEARCH_TARGET_USERS', '')
    if not filters_as_string:
        return {}

    return typing.cast(dict[str, Any], json.loads(filters_as_string))


campaign.register_campaign(
    campaign.Campaign(
        campaign_id='bob-research-recruit',
        get_mongo_filters=_get_mongo_filters,
        get_vars=campaign.get_default_vars,
        sender_name=i18n.make_translatable_string(
            "Tabitha et l'équipe de {{var:productName}}"),
        sender_email='*****@*****.**',
    ))
Example #12
0
def _get_switch_vars(user: user_pb2.User, *, now: datetime.datetime,
                     **unused_kwargs: Any) -> dict[str, str]:
    """Compute all variables required for the Switch campaign."""

    if now.year - user.profile.year_of_birth < 22:
        raise campaign.DoNotSend('User is too young')

    project = next((p for p in user.projects), project_pb2.Project())

    if project.seniority <= project_pb2.INTERMEDIARY:
        raise campaign.DoNotSend("User doesn't have enough experience")

    return campaign.get_default_coaching_email_vars(user) | {
        'isConverting':
        campaign.as_template_boolean(
            project.kind == project_pb2.REORIENTATION),
    }


campaign.register_campaign(
    campaign.Campaign(
        campaign_id='switch-grant',
        mongo_filters={},
        is_coaching=True,
        get_vars=_get_switch_vars,
        sender_name=i18n.make_translatable_string(
            'Joanna de {{var:productName}}'),
        sender_email='*****@*****.**',
    ))
Example #13
0
    }


_NPS_CAMPAIGN = campaign.Campaign(
    # See https://app.mailjet.com/template/100819/build
    campaign_id=_CAMPAIGN_ID,
    mongo_filters={
        'emailsSent': {
            '$not': {
                '$elemMatch': {
                    'campaignId': _CAMPAIGN_ID
                }
            }
        },
        'projects': {
            '$exists': True
        },
        'projects.isIncomplete': {
            '$ne': True
        },
        'registeredAt': {
            '$gt': '2018-01-01'
        },
    },
    get_vars=_get_nps_vars,
    sender_name=product.bob.name,
    sender_email='*****@*****.**',
)

campaign.register_campaign(_NPS_CAMPAIGN)
Example #14
0
    return campaign.get_default_coaching_email_vars(user) | {
        'applicationModes': _make_section(application_modes_section),
        'departements': _make_section(departements_section),
        'employmentType': _make_section(employment_types_section),
        'imtLink': imt_link,
        'inCity': scoring_project.populate_template('%inCity'),
        'jobNameInDepartement': job_name_in_departement,
        'loginUrl': campaign.create_logged_url(user.user_id),
        'marketStress': _make_section(market_stress_section),
        'months': _make_section(months_section),
        'ofJobNameInDepartement': of_job_name_in_departement,
        'ofJobName': of_job_name,
    }


campaign.register_campaign(campaign.Campaign(
    campaign_id='imt',
    mongo_filters={
        'projects': {
            '$elemMatch': {
                'isIncomplete': {'$ne': True},
            },
        },
    },
    get_vars=_get_imt_vars,
    sender_name=i18n.make_translatable_string("Pascal et l'équipe de {{var:productName}}"),
    sender_email='*****@*****.**',
    is_coaching=True,
    is_big_focus=True,
))