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)
'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)
'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,
) -> 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(
# 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='*****@*****.**', ))
'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': {
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='*****@*****.**', ))
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, ))
'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}, }}, },
""" 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='*****@*****.**', ))
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='*****@*****.**', ))
} _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)
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, ))