def test_user_last_activity(self): ''' Test the helper function for last user activity ''' self.user_login('admin') user = User.objects.get(username='******') log = WorkoutLog.objects.get(pk=1) session = WorkoutSession.objects.get(pk=1) self.assertEqual(user.usercache.last_activity, datetime.date(2014, 1, 30)) self.assertEqual(get_user_last_activity(user), datetime.date(2014, 1, 30)) # Log more recent than session log.date = datetime.date(2014, 10, 2) log.save() session.date = datetime.date(2014, 10, 1) session.save() user = User.objects.get(username='******') self.assertEqual(get_user_last_activity(user), datetime.date(2014, 10, 2)) self.assertEqual(user.usercache.last_activity, datetime.date(2014, 10, 2)) # Session more recent than log log.date = datetime.date(2014, 9, 1) log.save() session.date = datetime.date(2014, 10, 5) session.save() user = User.objects.get(username='******') self.assertEqual(get_user_last_activity(user), datetime.date(2014, 10, 5)) self.assertEqual(user.usercache.last_activity, datetime.date(2014, 10, 5)) # No logs, but session WorkoutLog.objects.filter(user=user).delete() user = User.objects.get(username='******') self.assertEqual(get_user_last_activity(user), datetime.date(2014, 10, 5)) self.assertEqual(user.usercache.last_activity, datetime.date(2014, 10, 5))
def handle(self, *args, **options): ''' Process gyms and send emails ''' today = datetime.date.today() for gym in Gym.objects.all(): if int(options['verbosity']) >= 2: self.stdout.write("Processing gym '{}' ".format(gym)) user_list = [] trainer_list = [] user_list_no_activity = [] weeks = gym.config.weeks_inactive for profile in gym.userprofile_set.all(): user = profile.user if user.has_perm('gym.gym_trainer'): trainer_list.append(user) # Check appropriate permissions if is_any_gym_admin(user): continue # Check user preferences if not user.gymuserconfig.include_inactive: continue last_activity = get_user_last_activity(user) if not last_activity: user_list_no_activity.append({'user': user, 'last_activity': last_activity}) elif last_activity - today > datetime.timedelta(weeks=weeks): user_list.append({'user': user, 'last_activity': last_activity}) if user_list or user_list_no_activity: for trainer in trainer_list: # Profile might not have email if not trainer.email: continue # Check trainer preferences if not trainer.gymadminconfig.overview_inactive: continue translation.activate(trainer.userprofile.notification_language.short_name) subject = _('Reminder of inactive members') context = { 'weeks': weeks, 'user_list': user_list, 'user_list_no_activity': user_list_no_activity } message = render_to_string('gym/email_inactive_members.html', context) mail.send_mail(subject, message, EMAIL_FROM, [trainer.email], fail_silently=True)
def update_activity_cache(sender, instance, **kwargs): ''' Update the user's cached last activity date ''' user = instance.user user.usercache.last_activity = get_user_last_activity(user) user.usercache.save()
def handle(self, **options): ''' Process the options ''' print('** Updating last activity') for user in User.objects.all(): user.usercache.last_activity = get_user_last_activity(user) user.usercache.save()
def get_queryset(self): ''' Return a list with the users, not really a queryset. ''' out = [] for u in User.objects.filter(userprofile__gym_id=self.kwargs['pk']): out.append({'obj': u, 'last_log': get_user_last_activity(u), 'perms': {'manage_gym': u.has_perm('gym.manage_gym'), 'manage_gyms': u.has_perm('gym.manage_gyms'), 'gym_trainer': u.has_perm('gym.gym_trainer'), 'any_admin': is_any_gym_admin(u)}}) return out
def get_queryset(self): ''' Return a list with the users, not really a queryset. ''' out = [] for u in User.objects.filter(userprofile__gym_id=self.kwargs['pk']): out.append({ 'obj': u, 'last_log': get_user_last_activity(u), 'perms': { 'manage_gym': u.has_perm('gym.manage_gym'), 'manage_gyms': u.has_perm('gym.manage_gyms'), 'gym_trainer': u.has_perm('gym.gym_trainer'), 'any_admin': is_any_gym_admin(u) } }) return out
def handle(self, *args, **options): ''' Process gyms and send emails ''' today = datetime.date.today() for gym in Gym.objects.all(): if int(options['verbosity']) >= 2: self.stdout.write("* Processing gym '{}' ".format(gym)) user_list = [] trainer_list = [] user_list_no_activity = [] weeks = gym.config.weeks_inactive if not weeks: if int(options['verbosity']) >= 2: self.stdout.write(" Reminders deactivatd, skipping") continue for profile in gym.userprofile_set.all(): user = profile.user if user.has_perm('gym.gym_trainer'): trainer_list.append(user) # Check appropriate permissions if is_any_gym_admin(user): continue # Check user preferences if not user.gymuserconfig.include_inactive: continue last_activity = get_user_last_activity(user) if not last_activity: user_list_no_activity.append({ 'user': user, 'last_activity': last_activity }) elif last_activity - today > datetime.timedelta(weeks=weeks): user_list.append({ 'user': user, 'last_activity': last_activity }) if user_list or user_list_no_activity: for trainer in trainer_list: # Profile might not have email if not trainer.email: continue # Check trainer preferences if not trainer.gymadminconfig.overview_inactive: continue translation.activate( trainer.userprofile.notification_language.short_name) subject = _('Reminder of inactive members') context = { 'weeks': weeks, 'user_list': user_list, 'user_list_no_activity': user_list_no_activity } message = render_to_string( 'gym/email_inactive_members.html', context) mail.send_mail(subject, message, EMAIL_FROM, [trainer.email], fail_silently=True)