def _handle_user_request(request, slug): """Helper performing all pre-response operations on behalf of a user request.""" shortened = get_object_or_404(ShortenedUrl, slug=slug) campaign = shortened.campaign if campaign: set_visit( request, campaign.client.fb_app_id, start_event={'campaign_id': campaign.campaign_id}, cycle=True, ) if shortened.event_type: delayed_save.delay( Event( visit_id=request.visit.visit_id, event_type=shortened.event_type, campaign_id=campaign.campaign_id, content=slug, ) ) campaignstatus.handle_request(request, campaign) return shortened
def frame_faces(request, api, campaign_id, content_id): campaign = get_object_or_404(relational.Campaign, campaign_id=campaign_id) campaign_properties = campaign.campaignproperties.get() if campaign_properties.root_campaign_id != campaign_properties.campaign_id: LOG.warning("Received request for non-root campaign", extra={'request': request}) raise http.Http404 try: campaign_status = campaignstatus.handle_request(request, campaign, campaign_properties) except campaignstatus.DisallowedError as exc: return exc.make_error_response(embedded=True) client = campaign.client content = get_object_or_404(client.clientcontent, content_id=content_id) canvas = bool(re.search(r'\bcanvas\b', request.resolver_match.namespace)) db.bulk_create.delay([ relational.Event( visit_id=request.visit.pk, event_type='faces_page_load', campaign_id=campaign.pk, client_content_id=content.pk, content=api, ), relational.Event( visit_id=request.visit.pk, event_type=('faces_canvas_load' if canvas else 'faces_iframe_load'), campaign_id=campaign.pk, client_content_id=content.pk, content=api, ) ]) # If the visitor passed through FB OAuth and our incoming redirector, we # may be able to retrieve the result of their store_oauth_token job, # determine their FBID & token, and eagerly start their targeting jobs. task_id_oauth = request.session.get(OAUTH_TASK_KEY) if task_id_oauth: task_oauth = celery.current_app.AsyncResult(task_id_oauth) if task_oauth.ready(): del request.session[OAUTH_TASK_KEY] # no need to do this again token = task_oauth.result if task_oauth.successful() else None if token: faces_tasks_key = FACES_TASKS_KEY.format(api=api, campaign_id=campaign_id, content_id=content_id, fbid=token.fbid) if faces_tasks_key not in request.session: # Initiate targeting tasks: targeting_tasks = request_targeting( visit=request.visit, token=token, api=api, campaign=campaign, client_content=content, num_faces=campaign_properties.num_faces, ) request.session[faces_tasks_key] = [ (rank, task.id) for (rank, task) in targeting_tasks ] page_styles = utils.assign_page_styles( request.visit, relational.Page.FRAME_FACES, campaign, content, ) (serialized_properties,) = serialize('python', (campaign_properties,)) properties = serialized_properties['fields'] for override_key, field in [ ('efsuccessurl', 'client_thanks_url'), ('eferrorurl', 'client_error_url'), ]: value = request.REQUEST.get(override_key) or properties[field] properties[field] = "{}?{}".format( reverse('targetshare:outgoing', args=[client.fb_app_id, value]), urllib.urlencode({'campaignid': campaign_id}), ) default_permissions = client.fb_app.permissions.values_list('code', flat=True) return render(request, 'targetshare/frame_faces.html', { 'fb_params': { 'fb_app_name': client.fb_app.name, 'fb_app_id': client.fb_app_id, }, 'api': api, 'default_scope': ','.join(default_permissions.iterator()), 'campaign': campaign, 'content': content, 'properties': properties, 'campaign_css': page_styles, 'canvas': canvas, 'draft_preview': campaign_status.isdraft, # Debug mode currently on for all methods of targeted sharing # However will likely just reflect the canvas var in the future 'debug_mode': True, })