def karma(request): """Admin view that displays karma related data.""" if not request.user.has_perm('users.view_karma_points'): raise PermissionDenied if request.POST.get('init'): init_karma.delay() messages.add_message(request, messages.SUCCESS, 'init_karma task queued!') return HttpResponseRedirect(request.path) if request.POST.get('recalculate'): recalculate_karma_points.delay() messages.add_message(request, messages.SUCCESS, 'recalculate_karma_points task queued!') return HttpResponseRedirect(request.path) if request.POST.get('update-top'): update_top_contributors.delay() messages.add_message(request, messages.SUCCESS, 'update_top_contributors task queued!') return HttpResponseRedirect(request.path) kmgr = KarmaManager() top_alltime = [ _user_karma_alltime(u, kmgr) for u in kmgr.top_users('all') or [] ] top_week = [ _user_karma_week(u, kmgr) for u in kmgr.top_users(daterange='1w') or [] ] username = request.GET.get('username') user_karma = None if username: try: user = User.objects.get(username=username) d = kmgr.user_data(user) user_karma = [{'key': k, 'value': d[k]} for k in sorted(d.keys())] except User.DoesNotExist: pass return render( request, 'admin/karma.html', { 'title': 'Karma', 'top_alltime': top_alltime, 'top_week': top_week, 'username': username, 'user_karma': user_karma })
def karma(request): """Admin view that displays karma related data.""" if not request.user.has_perm('users.view_karma_points'): raise PermissionDenied if request.POST.get('init'): init_karma.delay() messages.add_message(request, messages.SUCCESS, 'init_karma task queued!') return HttpResponseRedirect(request.path) if request.POST.get('recalculate'): recalculate_karma_points.delay() messages.add_message(request, messages.SUCCESS, 'recalculate_karma_points task queued!') return HttpResponseRedirect(request.path) if request.POST.get('update-top'): update_top_contributors.delay() messages.add_message(request, messages.SUCCESS, 'update_top_contributors task queued!') return HttpResponseRedirect(request.path) kmgr = KarmaManager() top_alltime = [_user_karma_alltime(u, kmgr) for u in kmgr.top_users('all') or []] top_week = [_user_karma_week(u, kmgr) for u in kmgr.top_users(daterange='1w') or []] username = request.GET.get('username') user_karma = None if username: try: user = User.objects.get(username=username) d = kmgr.user_data(user) user_karma = [{'key': k, 'value': d[k]} for k in sorted(d.keys())] except User.DoesNotExist: pass return render( request, 'admin/karma.html', {'title': 'Karma', 'top_alltime': top_alltime, 'top_week': top_week, 'username': username, 'user_karma': user_karma})
def users(request): """Returns list of user karma information. GET paramaters: * daterange - 7d, 1m, 3m, 6m or 1y (default: 1y) * sort - field to sort on (default: points). Order is always descending. * page - starts at 1 (default: 1) * pagesize - (default: 100) Returns list of objects with the following fields: userid, username, points, <action_types> """ form = UserAPIForm(request.GET) if not form.is_valid(): return {'success': False, 'errors': form.errors} daterange = form.cleaned_data.get('daterange') or '1y' sort = form.cleaned_data.get('sort') or 'points' page = form.cleaned_data.get('page') or 1 pagesize = form.cleaned_data.get('pagesize') or 100 mgr = KarmaManager() users = mgr.top_users(daterange, type=sort, count=pagesize, offset=(page - 1) * pagesize) or [] now = datetime.now() action_types = KarmaManager.action_types.keys() schema = ['id', 'username', 'lastactivity', 'points'] + action_types user_list = [] for u in users: user = [u.id, u.username] last_activity = Answer.last_activity_for(u) user.append((now - last_activity).days if last_activity else None) user.append(mgr.count(daterange, u, type='points')) for t in action_types: user.append(mgr.count(daterange, u, type=t)) user_list.append(user) return { 'success': True, 'results': user_list, 'schema': schema}
def users(request): """Returns list of user karma information. GET paramaters: * daterange - 7d, 1m, 3m, 6m or 1y (default: 1y) * sort - field to sort on (default: points). Order is always descending. * page - starts at 1 (default: 1) * pagesize - (default: 100) Returns list of objects with the following fields: userid, username, points, <action_types> """ form = UserAPIForm(request.GET) if not form.is_valid(): return {'success': False, 'errors': form.errors} daterange = form.cleaned_data.get('daterange') or '1y' sort = form.cleaned_data.get('sort') or 'points' page = form.cleaned_data.get('page') or 1 pagesize = form.cleaned_data.get('pagesize') or 100 mgr = KarmaManager() users = mgr.top_users( daterange, type=sort, count=pagesize, offset=(page - 1) * pagesize) or [] now = datetime.now() action_types = KarmaManager.action_types.keys() schema = ['id', 'username', 'lastactivity', 'points'] + action_types user_list = [] for u in users: user = [u.id, u.username] last_activity = Answer.last_activity_for(u) user.append((now - last_activity).days if last_activity else None) user.append(mgr.count(daterange, u, type='points')) for t in action_types: user.append(mgr.count(daterange, u, type=t)) user_list.append(user) return {'success': True, 'results': user_list, 'schema': schema}
class KarmaManagerTests(TestCase): @mock.patch.object(waffle, 'switch_is_active') def setUp(self, switch_is_active): switch_is_active.return_value = True super(KarmaManagerTests, self).setUp() try: self.mgr = KarmaManager() redis_client('karma').flushdb() except RedisError: raise SkipTest self.user1 = user(save=True) self.user2 = user(save=True) self.user3 = user(save=True) today = date.today() # user1 actions (3 + 3 + 7): TestAction1(user=self.user1, day=today).save() TestAction1(user=self.user1, day=today).save() TestAction2(user=self.user1, day=today).save() # user2 actions (3 + 7 + 7): TestAction1(user=self.user2, day=today - timedelta(days=8)).save() TestAction2(user=self.user2, day=today - timedelta(days=32)).save() TestAction2(user=self.user2, day=today - timedelta(days=360)).save() # user3 actions (3 + 3 + 3 + 7): TestAction1(user=self.user3, day=today - timedelta(days=10)).save() TestAction1(user=self.user3, day=today - timedelta(days=40)).save() TestAction1(user=self.user3, day=today - timedelta(days=190)).save() TestAction2(user=self.user3, day=today - timedelta(days=3)).save() @mock.patch.object(waffle, 'switch_is_active') def test_count(self, switch_is_active): """Test count method.""" switch_is_active.return_value = True self.mgr.update_top() eq_(13, self.mgr.count('all', self.user1, type='points')) eq_(2, self.mgr.count('all', self.user1, type=TestAction1.action_type)) eq_(1, self.mgr.count('all', self.user1, type=TestAction2.action_type)) eq_(0, self.mgr.count('1w', self.user2, type='points')) eq_(3, self.mgr.count('1m', self.user2, type='points')) eq_(2, self.mgr.count('1y', self.user2, type=TestAction2.action_type)) eq_(2, self.mgr.count('6m', self.user3, type=TestAction1.action_type)) @mock.patch.object(waffle, 'switch_is_active') def test_top_users(self, switch_is_active): """Test top_users method.""" switch_is_active.return_value = True self.mgr.update_top() u1, u2, u3 = self.user1, self.user2, self.user3 eq_([u3, u1, u2], self.mgr.top_users('3m')) eq_([u3, u1, u2], self.mgr.top_users('all', type=TestAction1.action_type)) eq_([u3, u1, u2], self.mgr.top_users('all', type=TestAction1.action_type)) eq_([u1], self.mgr.top_users('1w', type=TestAction1.action_type)) eq_([u1, u3], self.mgr.top_users(daterange='1w')) @mock.patch.object(waffle, 'switch_is_active') def test_ranking(self, switch_is_active): """Test ranking method.""" switch_is_active.return_value = True self.mgr.update_top() eq_(1, self.mgr.ranking('all', self.user2)) eq_(3, self.mgr.ranking('all', self.user1)) eq_(1, self.mgr.ranking('1w', self.user1)) eq_(1, self.mgr.ranking('all', self.user3, type=TestAction1.action_type)) @mock.patch.object(waffle, 'switch_is_active') def test_recalculate_points(self, switch_is_active): """Test the recalculate_points method.""" switch_is_active.return_value = True # Create Points with new point values. p1 = Points.objects.create(action='test-action-1', points=15) Points.objects.create(action='test-action-2', points=12) self.mgr.recalculate_points(self.user1) eq_(42, self.mgr.count('all', self.user1, type='points')) # Update one of the Point values. p1.points = 30 p1.save() self.mgr.recalculate_points(self.user1) eq_(72, self.mgr.count('all', self.user1, type='points')) @mock.patch.object(waffle, 'switch_is_active') def test_overview_counts(self, switch_is_active): """Verify the overview counts are correct.""" switch_is_active.return_value = True self.mgr.update_top() eq_(46, self.mgr.count('all', type='points')) eq_(6, self.mgr.count('all', type=TestAction1.action_type)) eq_(4, self.mgr.count('all', type=TestAction2.action_type)) eq_(2, self.mgr.count('1w', type=TestAction1.action_type)) eq_(2, self.mgr.count('1m', type=TestAction2.action_type)) eq_(3, self.mgr.count('6m', type=TestAction2.action_type)) eq_(2, self.mgr.day_count(type=TestAction1.action_type)) eq_(1, self.mgr.day_count(type=TestAction2.action_type))
class KarmaManagerTests(TestCase): @mock.patch.object(waffle, 'switch_is_active') def setUp(self, switch_is_active): switch_is_active.return_value = True super(KarmaManagerTests, self).setUp() try: self.mgr = KarmaManager() redis_client('karma').flushdb() except RedisError: raise SkipTest self.user1 = user(save=True) self.user2 = user(save=True) self.user3 = user(save=True) today = date.today() # user1 actions (3 + 3 + 7): TestAction1(user=self.user1, day=today).save() TestAction1(user=self.user1, day=today).save() TestAction2(user=self.user1, day=today).save() # user2 actions (3 + 7 + 7): TestAction1(user=self.user2, day=today - timedelta(days=8)).save() TestAction2(user=self.user2, day=today - timedelta(days=32)).save() TestAction2(user=self.user2, day=today - timedelta(days=360)).save() # user3 actions (3 + 3 + 3 + 7): TestAction1(user=self.user3, day=today - timedelta(days=10)).save() TestAction1(user=self.user3, day=today - timedelta(days=40)).save() TestAction1(user=self.user3, day=today - timedelta(days=190)).save() TestAction2(user=self.user3, day=today - timedelta(days=3)).save() @mock.patch.object(waffle, 'switch_is_active') def test_count(self, switch_is_active): """Test count method.""" switch_is_active.return_value = True self.mgr.update_top() eq_(13, self.mgr.count('all', self.user1, type='points')) eq_(2, self.mgr.count('all', self.user1, type=TestAction1.action_type)) eq_(1, self.mgr.count('all', self.user1, type=TestAction2.action_type)) eq_(0, self.mgr.count('1w', self.user2, type='points')) eq_(3, self.mgr.count('1m', self.user2, type='points')) eq_(2, self.mgr.count('1y', self.user2, type=TestAction2.action_type)) eq_(2, self.mgr.count('6m', self.user3, type=TestAction1.action_type)) @mock.patch.object(waffle, 'switch_is_active') def test_top_users(self, switch_is_active): """Test top_users method.""" switch_is_active.return_value = True self.mgr.update_top() u1, u2, u3 = self.user1, self.user2, self.user3 eq_([u3, u1, u2], self.mgr.top_users('3m')) eq_([u3, u1, u2], self.mgr.top_users('all', type=TestAction1.action_type)) eq_([u3, u1, u2], self.mgr.top_users('all', type=TestAction1.action_type)) eq_([u1], self.mgr.top_users('1w', type=TestAction1.action_type)) eq_([u1, u3], self.mgr.top_users(daterange='1w')) @mock.patch.object(waffle, 'switch_is_active') def test_ranking(self, switch_is_active): """Test ranking method.""" switch_is_active.return_value = True self.mgr.update_top() eq_(1, self.mgr.ranking('all', self.user2)) eq_(3, self.mgr.ranking('all', self.user1)) eq_(1, self.mgr.ranking('1w', self.user1)) eq_(1, self.mgr.ranking('all', self.user3, type=TestAction1.action_type)) @mock.patch.object(waffle, 'switch_is_active') def test_recalculate_points(self, switch_is_active): """Test the recalculate_points method.""" switch_is_active.return_value = True # Create Points with new point values. p1 = Points.objects.create(action='test-action-1', points=15) Points.objects.create(action='test-action-2', points=12) self.mgr.recalculate_points(self.user1) eq_(42, self.mgr.count('all', self.user1, type='points')) # Update one of the Point values. p1.points = 30 p1.save() self.mgr.recalculate_points(self.user1) eq_(72, self.mgr.count('all', self.user1, type='points')) @mock.patch.object(waffle, 'switch_is_active') def test_overview_counts(self, switch_is_active): """Verify the overview counts are correct.""" switch_is_active.return_value = True self.mgr.update_top() eq_(46, self.mgr.count('all', type='points')) eq_(6, self.mgr.count('all', type=TestAction1.action_type)) eq_(4, self.mgr.count('all', type=TestAction2.action_type)) eq_(2, self.mgr.count('1w', type=TestAction1.action_type)) eq_(2, self.mgr.count('1m', type=TestAction2.action_type)) eq_(3, self.mgr.count('6m', type=TestAction2.action_type)) eq_(2, self.mgr.day_count(type=TestAction1.action_type)) eq_(1, self.mgr.day_count(type=TestAction2.action_type))