def get_active_users(request): """ Retrieves a list of active users which is returned as plain JSON for easier manipulation with JavaScript. """ if request.is_ajax(): active = Visitor.objects.active().reverse() now = get_now() # we don't put the session key or IP address here for security reasons try: data = {'users': [{ 'id': v.id, #'user': uc(v.user), 'user_agent': uc(v.user_agent), 'referrer': uc(v.referrer), 'url': uc(v.url), 'page_views': v.page_views, 'geoip': v.geoip_data_json, 'last_update': (now - v.last_update).seconds, 'friendly_time': ', '.join(friendly_time((now - v.last_update).seconds)), } for v in active]} except: log.error('There was a problem putting all of the visitor data together:\n%s\n\n%s' % (traceback.format_exc(), locals())) return HttpResponse(content='{}', mimetype='text/javascript') response = HttpResponse(content=JSONEncoder().encode(data), mimetype='text/javascript') response['Content-Length'] = len(response.content) return response # if the request was not made via AJAX, raise a 404 raise Http404
def process_request(self, request): timeout = utils.get_cleanup_timeout() if str(timeout).isdigit(): log.debug('Cleaning up visitors older than %s hours' % timeout) now = utils.get_now() timeout = now - timedelta(hours=int(timeout)) Visitor.objects.filter(last_update__lte=timeout).delete()
def active(self, timeout=None): """ Retrieves only visitors who have been active within the timeout period. """ if not timeout: timeout = utils.get_timeout() now = utils.get_now() cutoff = now - timedelta(minutes=timeout) return self.get_queryset().filter(last_update__gte=cutoff)
def process_request(self, request): # don't process AJAX requests if request.is_ajax(): return # create some useful variables ip_address = utils.get_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '')[:255] # retrieve untracked user agents from cache ua_key = '_tracking_untracked_uas' untracked = cache.get(ua_key) if untracked is None: log.info('Updating untracked user agent cache') untracked = UntrackedUserAgent.objects.all() cache.set(ua_key, untracked, 3600) # see if the user agent is not supposed to be tracked for ua in untracked: # if the keyword is found in the user agent, stop tracking if user_agent.find(ua.keyword) != -1: log.debug('Not tracking UA "%s" because of keyword: %s' % (user_agent, ua.keyword)) return if hasattr(request, 'session') and request.session.session_key: # use the current session key if we can session_key = request.session.session_key else: # otherwise just fake a session key session_key = '%s:%s' % (ip_address, user_agent) session_key = session_key[:40] # ensure that the request.path does not begin with any of the prefixes for prefix in self.prefixes: if request.path.startswith(prefix): log.debug('Not tracking request to: %s' % request.path) return # if we get here, the URL needs to be tracked # determine what time it is now = utils.get_now() attrs = { 'session_key': session_key, 'ip_address': ip_address } # for some reason, Visitor.objects.get_or_create was not working here try: visitor = Visitor.objects.get(**attrs) except Visitor.DoesNotExist: # see if there's a visitor with the same IP and user agent # within the last 5 minutes cutoff = now - timedelta(minutes=5) visitors = Visitor.objects.filter( ip_address=ip_address, user_agent=user_agent, last_update__gte=cutoff ) if len(visitors): visitor = visitors[0] visitor.session_key = session_key log.debug('Using existing visitor for IP %s / UA %s: %s' % (ip_address, user_agent, visitor.id)) else: # it's probably safe to assume that the visitor is brand new visitor = Visitor(**attrs) log.debug('Created a new visitor: %s' % attrs) except: return # determine whether or not the user is logged in user = request.user if isinstance(user, AnonymousUser): user = None # update the tracking information visitor.user = user visitor.user_agent = user_agent # if the visitor record is new, or the visitor hasn't been here for # at least an hour, update their referrer URL one_hour_ago = now - timedelta(hours=1) if not visitor.last_update or visitor.last_update <= one_hour_ago: visitor.referrer = utils.u_clean(request.META.get('HTTP_REFERER', 'unknown')[:255]) # reset the number of pages they've been to visitor.page_views = 0 visitor.session_start = now visitor.url = request.path visitor.page_views += 1 visitor.last_update = now try: sid = transaction.savepoint() visitor.save() transaction.savepoint_commit(sid) except IntegrityError: transaction.savepoint_rollback(sid) except DatabaseError: log.error('There was a problem saving visitor information:\n%s\n\n%s' % (traceback.format_exc(), locals()))