Ejemplo n.º 1
0
def on_order_paid(order, payment, request, **kwargs):
    if not request:
        return

    ga_data = order.data.get("google_analytics", {})
    tracker = Tracker(settings.GOOGLE_ANALYTICS_ID, request.get_host())

    # create visitor
    visitor = Visitor()
    try:
        visitor.extract_from_utma(ga_data.get("utma", ""))
    except ValueError:
        return  # utma cookie value is invalid
    visitor.extract_from_server_meta(ga_data.get("meta", {}))

    # create session
    session = Session()
    try:
        session.extract_from_utmb(ga_data.get("utmb", ""))
    except ValueError:
        return  # utmb cookie value is invalid

    # create transaction
    transaction = Transaction()
    transaction.order_id = order.order_id
    transaction.total = order.subtotal
    transaction.tax = order.tax
    transaction.shipping = order.shipping
    transaction.city = order.billing_city.encode("utf8")
    transaction.country = ("%s" % order.billing_country).encode("utf8")
    transaction.currency = order.currency
    for item in order.items.all():
        i = Item()
        i.sku = item.sku
        i.name = item.name.encode("utf8")
        i.price = item.unit_price
        i.quantity = item.quantity
        transaction.add_item(i)

    # tracker.setcurrencyCode
    tracker.track_transaction(transaction, session, visitor)

    order.data["google_analytics"]["tracked"] = now()
    order.save()
Ejemplo n.º 2
0
def complete_process(request, backend, *args, **kwargs):
    """Authentication complete process"""
    # pop redirect value before the session is trashed on login()
    redirect_value = request.session.get(REDIRECT_FIELD_NAME, '') or \
                     request.REQUEST.get(REDIRECT_FIELD_NAME, '')

    if GA_ID:
        ga_tracker = Tracker(GA_ID, request.META.get('HTTP_HOST', ""))
        utmz = request.COOKIES.get("__utmz")
        if utmz:
            try:
                campaign = Campaign()
                campaign.extract_from_utmz(utmz)
                ga_tracker.campaign = campaign
            except:
                pass
        ga_visitor = Visitor()
        try:
            ga_visitor.extract_from_utma(request.COOKIES.get("__utma",""))
        except:
            pass
        ga_visitor.ip_address = request.META.get('REMOTE_ADDR')
        ga_session = Session()
        try:
            ga_session.extract_from_utmb(request.COOKIES.get("__utmb"))
        except:
            pass
    else:
        ga_tracker = None

    # Django 1.5 allow us to define custom User Model, so integrity errors
    # can be raised.
    try:
        user = auth_complete(request, backend, *args, **kwargs)
    except IntegrityError:
        try:
            if ga_tracker:
                ga_tracker.track_event(Event("Logins",backend.AUTH_BACKEND.name+"CompleteError",
                                       request.build_absolute_uri()),
                                       ga_session, ga_visitor)
        except:
            pass
        url = setting('SIGNUP_ERROR_URL', setting('LOGIN_ERROR_URL'))
        return HttpResponseRedirect(url)

    if isinstance(user, HttpResponse):
        return user

    if not user and request.user.is_authenticated():
        return HttpResponseRedirect(redirect_value)

    msg = None
    

    if user:
        if getattr(user, 'is_active', True):
            # catch is_new flag before login() might reset the instance
            is_new = getattr(user, 'is_new', False)
            login(request, user)
            # user.social_user is the used UserSocialAuth instance defined
            # in authenticate process
            social_user = user.social_user
            if redirect_value:
                request.session[REDIRECT_FIELD_NAME] = redirect_value or \
                                                       DEFAULT_REDIRECT

            if setting('SOCIAL_AUTH_SESSION_EXPIRATION', True):
                # Set session expiration date if present and not disabled by
                # setting. Use last social-auth instance for current provider,
                # users can associate several accounts with a same provider.
                expiration = social_user.expiration_datetime()
                if expiration:
                    try:
                        request.session.set_expiry(expiration)
                    except OverflowError:
                        # Handle django time zone overflow, set default expiry.
                        request.session.set_expiry(None)

            # store last login backend name in session
            key = setting('SOCIAL_AUTH_LAST_LOGIN',
                          'social_auth_last_login_backend')
            request.session[key] = social_user.provider

            # Remove possible redirect URL from session, if this is a new
            # account, send him to the new-users-page if defined.
            new_user_redirect = backend_setting(backend,
                                           'SOCIAL_AUTH_NEW_USER_REDIRECT_URL')
            if new_user_redirect and is_new:
                url = new_user_redirect
            else:
                url = redirect_value or \
                      backend_setting(backend,
                                      'SOCIAL_AUTH_LOGIN_REDIRECT_URL') or \
                      DEFAULT_REDIRECT
            if ga_tracker:
                ga_tracker.track_event(Event("Logins",backend.AUTH_BACKEND.name+"Complete",
                                   request.build_absolute_uri()),
                                   ga_session, ga_visitor)
        else:
            msg = setting('SOCIAL_AUTH_INACTIVE_USER_MESSAGE', None)
            url = backend_setting(backend, 'SOCIAL_AUTH_INACTIVE_USER_URL',
                                  LOGIN_ERROR_URL)
    else:
        msg = setting('LOGIN_ERROR_MESSAGE', None)
        url = backend_setting(backend, 'LOGIN_ERROR_URL', LOGIN_ERROR_URL)
        if ga_tracker:
            ga_tracker.track_event(Event("Logins",backend.AUTH_BACKEND.name+"CompleteError",
                               request.build_absolute_uri()),
                               ga_session, ga_visitor)
    if msg:
        messages.error(request, msg)

    if redirect_value and redirect_value != url:
        redirect_value = quote(redirect_value)
        if '?' in url:
            url += '&%s=%s' % (REDIRECT_FIELD_NAME, redirect_value)
        else:
            url += '?%s=%s' % (REDIRECT_FIELD_NAME, redirect_value)
    return HttpResponseRedirect(url)