Exemplo n.º 1
0
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
Exemplo n.º 2
0
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,
    })