def _refresh_visitor(self, user, request, visit_time): # A Visitor row is unique by session_key session_key = request.session.session_key try: visitor = Visitor.objects.get(pk=session_key) except Visitor.DoesNotExist: # Log the ip address. Start time is managed via the field # `default` value ip_address = get_ip_address(request) visitor = Visitor(pk=session_key, ip_address=ip_address) # Update the user field if the visitor user is not set. This # implies authentication has occured on this request and now # the user is object exists. Check using `user_id` to prevent # a database hit. if user and not visitor.user_id: visitor.user_id = user.id # update some session expiration details visitor.expiry_age = request.session.get_expiry_age() visitor.expiry_time = request.session.get_expiry_date() # grab the latest User-Agent and store it user_agent = request.META.get('HTTP_USER_AGENT', None) if user_agent: visitor.user_agent = smart_text(user_agent, encoding='latin-1', errors='ignore') # grab the source param and store it source = request.GET.get('source', None) if source: visitor.source = source # grab the medium param and store it medium = request.GET.get('medium', None) if medium: visitor.medium = medium time_on_site = 0 if visitor.start_time: time_on_site = total_seconds(visit_time - visitor.start_time) visitor.time_on_site = int(time_on_site) try: with transaction.atomic(): visitor.save() except IntegrityError: # there is a small chance a second response has saved this # Visitor already and a second save() at the same time (having # failed to UPDATE anything) will attempt to INSERT the same # session key (pk) again causing an IntegrityError # If this happens we'll just grab the "winner" and use that! visitor = Visitor.objects.get(pk=session_key) return visitor