class Visitor(models.Model): session_key = models.CharField(max_length=40, primary_key=True) user = models.ForeignKey( settings.AUTH_USER_MODEL, related_name='visit_history', null=True, editable=False, on_delete=models.CASCADE, ) # Update to GenericIPAddress in Django 1.4 ip_address = models.CharField(max_length=39, editable=False) user_agent = models.TextField(null=True, editable=False) start_time = models.DateTimeField(default=timezone.now, editable=False) expiry_age = models.IntegerField(null=True, editable=False) expiry_time = models.DateTimeField(null=True, editable=False) time_on_site = models.IntegerField(null=True, editable=False) end_time = models.DateTimeField(null=True, editable=False) objects = VisitorManager() def session_expired(self): """The session has ended due to session expiration.""" if self.expiry_time: return self.expiry_time <= timezone.now() return False session_expired.boolean = True def session_ended(self): """The session has ended due to an explicit logout.""" return bool(self.end_time) session_ended.boolean = True @property def geoip_data(self): """Attempt to retrieve MaxMind GeoIP data based on visitor's IP.""" if not HAS_GEOIP or not TRACK_USING_GEOIP: return if not hasattr(self, '_geoip_data'): self._geoip_data = None try: gip = GeoIP(cache=GEOIP_CACHE_TYPE) self._geoip_data = gip.city(self.ip_address) except GeoIPException: msg = 'Error getting GeoIP data for IP "{0}"'.format( self.ip_address) log.exception(msg) return self._geoip_data class Meta(object): ordering = ('-start_time', ) permissions = (('view_visitor', 'Can view visitor'), )
class Visitor(models.Model): session_key = models.CharField(max_length=40, primary_key=True) user = models.ForeignKey(User, related_name='visit_history', null=True, editable=False) # Update to GenericIPAddress in Django 1.4 ip_address = models.CharField(max_length=39, editable=False) user_agent = models.TextField(null=True, editable=False) start_time = models.DateTimeField(default=timezone.now, editable=False) expiry_age = models.IntegerField(null=True, editable=False) expiry_time = models.DateTimeField(null=True, editable=False) time_on_site = models.IntegerField(null=True, editable=False) end_time = models.DateTimeField(null=True, editable=False) objects = VisitorManager() def session_expired(self): "The session has ended due to session expiration" if self.expiry_time: return self.expiry_time <= timezone.now() return False session_expired.boolean = True def session_ended(self): "The session has ended due to an explicit logout" return bool(self.end_time) session_ended.boolean = True @property def time_elapsed_on_site(self): return timedelta(seconds=int(self.time_on_site)) @property def geoip_data(self): "Attempts to retrieve MaxMind GeoIP data based upon the visitor's IP" if not HAS_GEOIP or not TRACK_USING_GEOIP: return if not hasattr(self, '_geoip_data'): self._geoip_data = None try: gip = GeoIP(cache=GEOIP_CACHE_TYPE) self._geoip_data = gip.city(self.ip_address) except GeoIPException: log.error('Error getting GeoIP data for IP "%s": %s' % (self.ip_address, traceback.format_exc())) return self._geoip_data class Meta(object): ordering = ('-start_time',) permissions = ( ('view_visitor', 'Can view visitor'), )
class Visitor(models.Model): session_key = models.CharField(max_length=40, primary_key=True) user = models.ForeignKey( settings.AUTH_USER_MODEL, related_name='visit_history', null=True, editable=False, on_delete=models.CASCADE, ) # Update to GenericIPAddress in Django 1.4 ip_address = models.CharField(max_length=39, editable=False) user_agent = models.TextField(null=True, editable=False) start_time = models.DateTimeField(default=timezone.now, editable=False) expiry_age = models.IntegerField(null=True, editable=False) expiry_time = models.DateTimeField(null=True, editable=False) time_on_site = models.IntegerField(null=True, editable=False) end_time = models.DateTimeField(null=True, editable=False) geoip_data = JSONField(null=True, editable=False) objects = VisitorManager() def __str__(self): return self.user.__str__() if self.user else self.session_key def session_expired(self): """The session has ended due to session expiration.""" if self.expiry_time: return self.expiry_time <= timezone.now() return False session_expired.boolean = True def session_ended(self): """The session has ended due to an explicit logout.""" return bool(self.end_time) session_ended.boolean = True def get_geoip_data(self): """Attempt to retrieve MaxMind GeoIP data based on visitor's IP.""" return self.geoip_data class Meta(object): ordering = ('-start_time', ) permissions = (('view_visitor', 'Can view visitor'), )