def assign(self, user, site=None, start_date=None, end_date=None): if site is None: site = get_current_site() result = [] for date in reversed( self.missing_dates(user=user, site=site, start_date=start_date, end_date=end_date)): user_segment, created = self.get_or_create(user=user, site=site, date=date) if not user_segment.segment: try: user_segment.segment = self.model._get_segment(user=user, date=date) if not user_segment.segment: raise ValueError('get_segment cannot be empty: %r' % user_segment.segment) except: user_segment.delete() raise user_segment.save() result.append(user_segment) return result
def create_sign_in(self, user, medium, datetime): """Log the fact that the user has become active again.""" sign_in, _ = SignIn.objects.get_or_create(site=get_current_site(), user=user, medium=medium, datetime=datetime) return sign_in
def setUp(self): self.mox = mox.Mox() self.user = User.objects.create_user('user', '*****@*****.**', 'user') self.activity, _ = DailyActivity.objects.stamp(user=self.user, site=get_current_site(), medium='Default') self.activity.days = 29 self.activity.save()
def _track(self, request, response): # Has the user done anything today? activity, created = DailyActivity.objects.stamp( user=request.user, site=get_current_site(), medium=self.medium(request=request, response=response)) if created: # Send a signal as the user has become active today signals.new_day.send(daily_activity=activity, request=request, sender=self.__class__) return response
def get_user_segments(segment, usernames=None, start_date=None, end_date=None): """ Returns a QuerySet of segment objects for usernames. `usernames` is a list of usernames to match. """ result = segment.objects.filter(site=get_current_site()) if start_date: pass if end_date: pass if usernames: result = result.filter(user__in=get_users(usernames=usernames)) return result
def missing_dates(self, user, site=None, start_date=None, end_date=None): if site is None: site = get_current_site() date_joined = user.date_joined.date() if start_date is None or start_date < date_joined: # Start looking from the day the user joined. start_date = date_joined today = date.today() if end_date is None or end_date >= today: # Stop looking at yesterday, because today is not valid. end_date = today - ONE_DAY # Figure out which dates have already been computed segments = self.model.objects.filter(user=user, site=site) if site is None: segments = segments.filter(site__isnull=True) dates = segments.filter(date__range=(start_date, end_date)).values_list( 'date', flat=True ) # Figure out the missing dates date_range = irange(start_date, end_date + ONE_DAY, ONE_DAY) return list(sorted(set(date_range) - set(dates)))
def missing_dates(self, user, site=None, start_date=None, end_date=None): if site is None: site = get_current_site() date_joined = user.date_joined.date() if start_date is None or start_date < date_joined: # Start looking from the day the user joined. start_date = date_joined today = date.today() if end_date is None or end_date >= today: # Stop looking at yesterday, because today is not valid. end_date = today - ONE_DAY # Figure out which dates have already been computed segments = self.model.objects.filter(user=user, site=site) if site is None: segments = segments.filter(site__isnull=True) dates = segments.filter(date__range=(start_date, end_date)).values_list('date', flat=True) # Figure out the missing dates date_range = irange(start_date, end_date + ONE_DAY, ONE_DAY) return list(sorted(set(date_range) - set(dates)))
def _track(self, request, response): # Figure out when the user last had any activity user = request.user now = datetime.now() site = get_current_site() medium = self.medium(request=request, response=response) activity, created = LastActivity.objects.get_or_create( user=user, site=site, medium=medium, defaults={'datetime': now}) past = activity.datetime if (now - past) > timedelta(seconds=1): # Update the last activity stamp activity.datetime = now activity.save() if created or \ (now - past) > timedelta(seconds=settings.LAST_ACTIVITY_WINDOW): sign_in = self.create_sign_in(user=user, medium=medium, datetime=now) # Send a signal as the user has become active again signals.sign_in.send(sign_in=sign_in, request=request, sender=self.__class__) return response
def assign(self, user, site=None, start_date=None, end_date=None): if site is None: site = get_current_site() result = [] for date in reversed(self.missing_dates(user=user, site=site, start_date=start_date, end_date=end_date)): user_segment, created = self.get_or_create( user=user, site=site, date=date ) if not user_segment.segment: try: user_segment.segment = self.model._get_segment(user=user, date=date) if not user_segment.segment: raise ValueError('get_segment cannot be empty: %r' % user_segment.segment) except: user_segment.delete() raise user_segment.save() result.append(user_segment) return result