def to_vendor(data): """ Take data received by basket and convert it to be sent to SFDC @param data: dict data received @return: """ data = data.copy() contact = {} if data.pop("_set_subscriber", True): contact["Subscriber__c"] = True if "email" in data: if email_is_testing(data["email"]): contact["UAT_Test_Data__c"] = True if "country" in data: data["country"] = data["country"].strip().lower() if len(data["country"]) == 3: new_country = convert_country_3_to_2(data["country"]) if new_country: data["country"] = new_country if data["country"] not in SFDC_COUNTRIES_LIST: # just don't set the country del data["country"] lang = data.get("lang") if lang: lang = lang.strip() if lang.lower() in settings.EXTRA_SUPPORTED_LANGS: pass elif is_supported_newsletter_language(lang): data["lang"] = lang[:2].lower() else: # use our default language (English) if we don't support the language data["lang"] = "en" for k, v in data.items(): v = strip_whitespace(v) if v is not None and v != "" and k in FIELD_MAP: if k in PROCESSORS_TO_VENDOR: v = PROCESSORS_TO_VENDOR[k](v) contact[FIELD_MAP[k]] = v news_map = newsletter_map() newsletters = data.get("newsletters", None) if newsletters: if isinstance(newsletters, dict): # we got newsletter slugs with boolean values for k, v in newsletters.items(): try: contact[news_map[k]] = v except KeyError: pass else: # we got a list of slugs for subscriptions for nl in newsletters: try: contact[news_map[nl]] = True except KeyError: pass # truncate long data for field, length in FIELD_MAX_LENGTHS.items(): if field in contact and len(contact[field]) > length: statsd.incr("news.backends.sfdc.data_truncated") contact[field] = contact[field][:length] return contact
def upsert_contact(api_call_type, data, user_data): """ Update or insert (upsert) a contact record in SFDC @param int api_call_type: What kind of API call it was. Could be SUBSCRIBE, UNSUBSCRIBE, or SET. @param dict data: POST data from the form submission @param dict user_data: existing contact data from SFDC @return: token, created """ update_data = data.copy() forced_optin = data.pop('optin', False) if 'format' in data: update_data['format'] = 'T' if data['format'].upper().startswith( 'T') else 'H' newsletters = parse_newsletters_csv(data.get('newsletters')) if user_data: cur_newsletters = user_data.get('newsletters', None) else: cur_newsletters = None # check for and remove transactional newsletters if api_call_type == SUBSCRIBE: all_transactionals = set(get_transactional_message_ids()) newsletters_set = set(newsletters) transactionals = newsletters_set & all_transactionals if transactionals: newsletters = list(newsletters_set - transactionals) send_transactional_messages(update_data, user_data, list(transactionals)) if not newsletters: # no regular newsletters return None, None # Set the newsletter flags in the record by comparing to their # current subscriptions. update_data['newsletters'] = parse_newsletters(api_call_type, newsletters, cur_newsletters) if api_call_type != UNSUBSCRIBE: # Are they subscribing to any newsletters that don't require confirmation? # When including any newsletter that does not # require confirmation, user gets a pass on confirming and goes straight # to confirmed. to_subscribe = [ nl for nl, sub in update_data['newsletters'].items() if sub ] if to_subscribe and not (forced_optin or (user_data and user_data.get('optin'))): exempt_from_confirmation = Newsletter.objects \ .filter(slug__in=to_subscribe, requires_double_optin=False) \ .exists() if exempt_from_confirmation: update_data['optin'] = True # record source URL nl_map = newsletter_map() source_url = update_data.get('source_url') email = update_data.get('email') if not email: email = user_data.get('email') if user_data else None if email: # send all newsletters whether already subscribed or not # bug 1308971 # if api_call_type == SET this is pref center, so only send new subscriptions nl_list = newsletters if api_call_type == SUBSCRIBE else to_subscribe for nlid in nl_list: if nlid in nl_map: record_source_url.delay(email, source_url, nl_map[nlid]) if user_data is None: # no user found. create new one. update_data['token'] = generate_token() if settings.MAINTENANCE_MODE: sfdc_add_update.delay(update_data) else: # don't catch exceptions here. SalesforceError subclasses will retry. sfdc.add(update_data) return update_data['token'], True if forced_optin and not user_data.get('optin'): update_data['optin'] = True # they opted out of email before, but are subscribing again # clear the optout flag if api_call_type != UNSUBSCRIBE and user_data.get('optout'): update_data['optout'] = False # update record if user_data and user_data.get('token'): token = user_data['token'] else: token = update_data['token'] = generate_token() if settings.MAINTENANCE_MODE: sfdc_add_update.delay(update_data, user_data) else: sfdc.update(user_data, update_data) return token, False
def to_vendor(data): """ Take data received by basket and convert it to be sent to SFDC @param data: dict data received @return: """ data = data.copy() contact = {} if data.pop('_set_subscriber', True): contact['Subscriber__c'] = True if 'email' in data: if email_is_testing(data['email']): contact['UAT_Test_Data__c'] = True if 'country' in data: data['country'] = data['country'].lower() if len(data['country']) == 3: new_country = convert_country_3_to_2(data['country']) if new_country: data['country'] = new_country all_countries = product_details.get_regions('en-US').keys() if data['country'] not in all_countries: # just don't set the country del data['country'] lang = data.get('lang') if lang: if lang.lower() in settings.EXTRA_SUPPORTED_LANGS: pass elif is_supported_newsletter_language(lang): data['lang'] = lang[:2].lower() else: # use our default language (English) if we don't support the language data['lang'] = 'en' for k, v in data.iteritems(): if v and k in FIELD_MAP: if k in PROCESSORS_TO_VENDOR: v = PROCESSORS_TO_VENDOR[k](v) contact[FIELD_MAP[k]] = v news_map = newsletter_map() newsletters = data.get('newsletters', None) if newsletters: if isinstance(newsletters, dict): # we got newsletter slugs with boolean values for k, v in newsletters.items(): try: contact[news_map[k]] = v except KeyError: pass else: # we got a list of slugs for subscriptions for nl in newsletters: try: contact[news_map[nl]] = True except KeyError: pass # truncate long data for field, length in FIELD_MAX_LENGTHS.items(): if field in contact and len(contact[field]) > length: statsd.incr('news.backends.sfdc.data_truncated') contact[field] = contact[field][:length] return contact
def upsert_contact(api_call_type, data, user_data): """ Update or insert (upsert) a contact record in SFDC @param int api_call_type: What kind of API call it was. Could be SUBSCRIBE, UNSUBSCRIBE, or SET. @param dict data: POST data from the form submission @param dict user_data: existing contact data from SFDC @return: token, created """ update_data = data.copy() forced_optin = data.pop('optin', False) if 'format' in data: update_data['format'] = 'T' if data['format'].upper().startswith('T') else 'H' newsletters = parse_newsletters_csv(data.get('newsletters')) if user_data: cur_newsletters = user_data.get('newsletters', None) else: cur_newsletters = None # check for and remove transactional newsletters if api_call_type == SUBSCRIBE: all_transactionals = set(get_transactional_message_ids()) newsletters_set = set(newsletters) transactionals = newsletters_set & all_transactionals if transactionals: newsletters = list(newsletters_set - transactionals) send_transactional_messages(update_data, user_data, list(transactionals)) if not newsletters: # no regular newsletters return None, None # Set the newsletter flags in the record by comparing to their # current subscriptions. update_data['newsletters'] = parse_newsletters(api_call_type, newsletters, cur_newsletters) if api_call_type != UNSUBSCRIBE: # Are they subscribing to any newsletters that don't require confirmation? # When including any newsletter that does not # require confirmation, user gets a pass on confirming and goes straight # to confirmed. to_subscribe = [nl for nl, sub in update_data['newsletters'].iteritems() if sub] if to_subscribe and not (forced_optin or (user_data and user_data.get('optin'))): exempt_from_confirmation = Newsletter.objects \ .filter(slug__in=to_subscribe, requires_double_optin=False) \ .exists() if exempt_from_confirmation: update_data['optin'] = True # record source URL nl_map = newsletter_map() source_url = update_data.get('source_url') email = update_data.get('email') if not email: email = user_data.get('email') if user_data else None if email: # send all newsletters whether already subscribed or not # bug 1308971 # if api_call_type == SET this is pref center, so only send new subscriptions nl_list = newsletters if api_call_type == SUBSCRIBE else to_subscribe for nlid in nl_list: if nlid in nl_map: record_source_url.delay(email, source_url, nl_map[nlid]) if user_data is None: # no user found. create new one. update_data['token'] = generate_token() if settings.MAINTENANCE_MODE: sfdc_add_update.delay(update_data) else: # don't catch exceptions here. SalesforceError subclasses will retry. sfdc.add(update_data) return update_data['token'], True if forced_optin and not user_data.get('optin'): update_data['optin'] = True # they opted out of email before, but are subscribing again # clear the optout flag if api_call_type != UNSUBSCRIBE and user_data.get('optout'): update_data['optout'] = False # update record if user_data and user_data.get('token'): token = user_data['token'] else: token = update_data['token'] = generate_token() if settings.MAINTENANCE_MODE: sfdc_add_update.delay(update_data, user_data) else: sfdc.update(user_data, update_data) return token, False
def to_vendor(data): """ Take data received by basket and convert it to be sent to SFDC @param data: dict data received @return: """ data = data.copy() contact = {} if data.pop('_set_subscriber', True): contact['Subscriber__c'] = True if 'email' in data: if email_is_testing(data['email']): contact['UAT_Test_Data__c'] = True if 'country' in data: data['country'] = data['country'].lower() if len(data['country']) == 3: new_country = convert_country_3_to_2(data['country']) if new_country: data['country'] = new_country all_countries = product_details.get_regions('en-US').keys() if data['country'] not in all_countries: # just don't set the country del data['country'] lang = data.get('lang') if lang: if lang.lower() in settings.EXTRA_SUPPORTED_LANGS: pass elif is_supported_newsletter_language(lang): data['lang'] = lang[:2].lower() else: # use our default language (English) if we don't support the language data['lang'] = 'en' for k, v in data.iteritems(): if v != '' and k in FIELD_MAP: if k in PROCESSORS_TO_VENDOR: v = PROCESSORS_TO_VENDOR[k](v) contact[FIELD_MAP[k]] = v news_map = newsletter_map() newsletters = data.get('newsletters', None) if newsletters: if isinstance(newsletters, dict): # we got newsletter slugs with boolean values for k, v in newsletters.items(): try: contact[news_map[k]] = v except KeyError: pass else: # we got a list of slugs for subscriptions for nl in newsletters: try: contact[news_map[nl]] = True except KeyError: pass # truncate long data for field, length in FIELD_MAX_LENGTHS.items(): if field in contact and len(contact[field]) > length: statsd.incr('news.backends.sfdc.data_truncated') contact[field] = contact[field][:length] return contact