def test_next_pages(self): self.login('to', 'pwd') query_parameters = '?var1=hello&var2=world' response = self.client.get(reverse('notifications:mark_all_as_read'), data={ "next": reverse('notifications:unread') + query_parameters, }) self.assertRedirects( response, reverse('notifications:unread') + query_parameters) slug = id2slug(self.to_user.notifications.first().id) response = self.client.get(reverse('notifications:mark_as_read', args=[slug]), data={ "next": reverse('notifications:unread') + query_parameters, }) self.assertRedirects( response, reverse('notifications:unread') + query_parameters) slug = id2slug(self.to_user.notifications.first().id) response = self.client.get( reverse('notifications:mark_as_unread', args=[slug]), { "next": reverse('notifications:unread') + query_parameters, }) self.assertRedirects( response, reverse('notifications:unread') + query_parameters)
def test_next_pages(self): self.login('to','pwd') response = self.client.get(reverse('notifications:mark_all_as_read')+"?next="+reverse('notifications:unread')) self.assertRedirects(response,reverse('notifications:unread')) slug = id2slug(self.to_user.notifications.first().id) response = self.client.get(reverse('notifications:mark_as_read',args=[slug])+"?next="+reverse('notifications:unread')) self.assertRedirects(response,reverse('notifications:unread')) slug = id2slug(self.to_user.notifications.first().id) response = self.client.get(reverse('notifications:mark_as_unread',args=[slug])+"?next="+reverse('notifications:unread')) self.assertRedirects(response,reverse('notifications:unread'))
def default(self, obj): if isinstance(obj, Notification): slug = str(id2slug(obj.id)) data = obj.data actor_str = str(obj.actor) if data is not None and 'is_public' in data and not data[ 'is_public']: actor_str = 'Anonymous' data['image_url'] = settings.ANONYMOUS_USER_PORTRAIT_URL return { 'slug': slug, 'actor': actor_str, 'verb': obj.verb, 'description': obj.description or '', 'action_object': str(obj.action_object), 'target': str(obj.target), 'timestamp': obj.timestamp, 'data': data, 'unread': obj.unread, 'mark_read_url': '/notifications/api/notifications/' + slug + '/mark-read', } return super(NotificationEncoder, self).default(obj)
def test_unread_messages_pages(self): self.login('to', 'pwd') response = self.client.get(reverse('notifications:unread')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.unread())) self.assertEqual(len(response.context['notifications']), self.message_count) for i, n in enumerate(self.to_user.notifications.all()): if i % 3 == 0: response = self.client.get( reverse('notifications:mark_as_read', args=[id2slug(n.id)])) self.assertEqual(response.status_code, 302) response = self.client.get(reverse('notifications:unread')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.unread())) self.assertTrue( len(response.context['notifications']) < self.message_count) response = self.client.get(reverse('notifications:mark_all_as_read')) self.assertRedirects(response, reverse('notifications:unread')) response = self.client.get(reverse('notifications:unread')) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.unread())) self.assertEqual(len(response.context['notifications']), 0)
def test_next_pages(self): self.login('to', 'pwd') response = self.client.get(reverse('notifications:mark_all_as_read'), data={ "next": reverse('notifications:unread'), }) self.assertRedirects(response, reverse('notifications:unread')) slug = id2slug(self.to_user.notifications_notification_related.first().id) response = self.client.get(reverse('notifications:mark_as_read', args=[slug]), data={ "next": reverse('notifications:unread'), }) self.assertRedirects(response, reverse('notifications:unread')) slug = id2slug(self.to_user.notifications_notification_related.first().id) response = self.client.get(reverse('notifications:mark_as_unread', args=[slug]), { "next": reverse('notifications:unread'), }) self.assertRedirects(response, reverse('notifications:unread'))
def live_unread_notification_list(request): ''' Return a json with a unread notification list ''' try: user_is_authenticated = request.user.is_authenticated() except TypeError: # Django >= 1.11 user_is_authenticated = request.user.is_authenticated if not user_is_authenticated: data = {'unread_count': 0, 'unread_list': []} return JsonResponse(data) try: # If they don't specify, make it 5. num_to_fetch = request.GET.get('max', 5) num_to_fetch = int(num_to_fetch) # if num_to_fetch is negative, force at least one fetched notifications num_to_fetch = max(1, num_to_fetch) # put a sane ceiling on the number retrievable num_to_fetch = min(num_to_fetch, 100) except ValueError: num_to_fetch = 5 # If casting to an int fails, just make it 5. try: fetch_start_index = int(request.GET.get('start', 0)) except ValueError: fetch_start_index = 0 unread_list = [] notifications = _get_unread_notificatons(request) for notification in notifications[fetch_start_index:num_to_fetch + fetch_start_index]: struct = model_to_dict(notification) timestamp_display = date_filter( localtime(notification.timestamp), dj_settings.SHORT_DATETIME_FORMAT, ) struct['timestamp_display'] = timestamp_display struct['slug'] = id2slug(notification.id) if notification.actor: struct['actor'] = str(notification.actor) if notification.target: struct['target'] = str(notification.target) if notification.action_object: struct['action_object'] = str(notification.action_object) if notification.data: struct['data'] = notification.data unread_list.append(struct) if request.GET.get('mark_as_read'): notification.mark_as_read() data = { 'unread_count': request.user.notifications.unread().count(), 'unread_list': unread_list } return JsonResponse(data)
def test_unread_list_api(self): self.login('to', 'pwd') response = self.client.get( reverse('notifications:live_unread_notification_list')) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['unread_count', 'unread_list']) self.assertEqual(data['unread_count'], self.message_count) self.assertEqual(len(data['unread_list']), self.message_count) response = self.client.get( reverse('notifications:live_unread_notification_list'), data={"max": 5}) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['unread_count', 'unread_list']) self.assertEqual(data['unread_count'], self.message_count) self.assertEqual(len(data['unread_list']), 5) # Test with a bad 'max' value response = self.client.get( reverse('notifications:live_unread_notification_list'), data={ "max": "this_is_wrong", }) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['unread_count', 'unread_list']) self.assertEqual(data['unread_count'], self.message_count) self.assertEqual(len(data['unread_list']), self.message_count) Notification.objects.filter(recipient=self.to_user).mark_all_as_read() response = self.client.get( reverse('notifications:live_unread_notification_list')) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['unread_count', 'unread_list']) self.assertEqual(data['unread_count'], 0) self.assertEqual(len(data['unread_list']), 0) notify.send(self.from_user, recipient=self.to_user, verb='commented', action_object=self.from_user) response = self.client.get( reverse('notifications:live_unread_notification_list')) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['unread_count', 'unread_list']) self.assertEqual(data['unread_count'], 1) self.assertEqual(len(data['unread_list']), 1) self.assertEqual(data['unread_list'][0]['verb'], 'commented') self.assertEqual(data['unread_list'][0]['slug'], id2slug(data['unread_list'][0]['id']))
def test_next_pages(self): self.login('to', 'pwd') query_parameters = '?var1=hello&var2=world' response = self.client.get(reverse('notifications:mark_all_as_read'),data={ "next": reverse('notifications:unread') + query_parameters, }) self.assertRedirects(response, reverse('notifications:unread') + query_parameters) slug = id2slug(self.to_user.notifications.first().id) response = self.client.get(reverse('notifications:mark_as_read', args=[slug]), data={ "next": reverse('notifications:unread') + query_parameters, }) self.assertRedirects(response, reverse('notifications:unread') + query_parameters) slug = id2slug(self.to_user.notifications.first().id) response = self.client.get(reverse('notifications:mark_as_unread', args=[slug]), { "next": reverse('notifications:unread') + query_parameters, }) self.assertRedirects(response, reverse('notifications:unread') + query_parameters)
def test_delete_messages_pages(self): self.login('to', 'pwd') slug = id2slug(self.to_user.notifications.first().id) response = self.client.get(reverse('notifications:delete', args=[slug])) self.assertRedirects(response, reverse('notifications:all')) response = self.client.get(reverse('notifications:all')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.all())) self.assertEqual(len(response.context['notifications']), self.message_count - 1)
def live_all_notification_list(request): ''' Return a json with a unread notification list ''' try: user_is_authenticated = request.user.is_authenticated() except TypeError: # Django >= 1.11 user_is_authenticated = request.user.is_authenticated if not user_is_authenticated: data = {'all_count': 0, 'unread_count': 0, 'all_list': []} return JsonResponse(data) default_num_to_fetch = get_config()['NUM_TO_FETCH'] try: # If they don't specify, make it 5. num_to_fetch = request.GET.get('max', default_num_to_fetch) num_to_fetch = int(num_to_fetch) if not (1 <= num_to_fetch <= 100): num_to_fetch = default_num_to_fetch except ValueError: # If casting to an int fails. num_to_fetch = default_num_to_fetch before_datetime = request.GET.get('before') all_notifications_qs = request.user.notifications.all() if before_datetime: all_notifications_qs = all_notifications_qs.filter( timestamp__lt=dateutil.parser.parse(before_datetime)) all_list = [] for notification in all_notifications_qs[0:num_to_fetch]: struct = model_to_dict(notification) struct['slug'] = id2slug(notification.id) if notification.actor: struct['actor'] = str(notification.actor) if notification.target: struct['target'] = str(notification.target) if notification.action_object: struct['action_object'] = str(notification.action_object) if notification.data: struct['data'] = notification.data all_list.append(struct) if request.GET.get('mark_as_read'): notification.mark_as_read() data = { 'all_count': request.user.notifications.count(), 'unread_count': request.user.notifications.unread().count(), 'all_list': all_list } return JsonResponse(data)
def test_soft_delete_messages_manager(self): self.login('to', 'pwd') slug = id2slug(self.to_user.notifications_notification_related.first().id) response = self.client.get(reverse('notifications:delete', args=[slug])) self.assertRedirects(response, reverse('notifications:all')) response = self.client.get(reverse('notifications:all')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications_notification_related.active())) self.assertEqual(len(response.context['notifications']), self.message_count-1) response = self.client.get(reverse('notifications:unread')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications_notification_related.unread())) self.assertEqual(len(response.context['notifications']), self.message_count-1)
def test_soft_delete_messages_manager(self): self.login('to', 'pwd') slug = id2slug(self.to_user.notifications.first().id) response = self.client.get(reverse('notifications:delete', args=[slug])) self.assertRedirects(response, reverse('notifications:all')) response = self.client.get(reverse('notifications:all')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.active())) self.assertEqual(len(response.context['notifications']), self.message_count-1) response = self.client.get(reverse('notifications:unread')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.unread())) self.assertEqual(len(response.context['notifications']), self.message_count-1)
def live_unread_notification_list(request): ''' Return a json with a unread notification list ''' try: user_is_authenticated = request.user.is_authenticated() except TypeError: # Django >= 1.11 user_is_authenticated = request.user.is_authenticated if not user_is_authenticated: data = { 'unread_count': 0, 'unread_list': [] } return JsonResponse(data) try: # If they don't specify, make it 5. num_to_fetch = request.GET.get('max', 5) num_to_fetch = int(num_to_fetch) # if num_to_fetch is negative, force at least one fetched notifications num_to_fetch = max(1, num_to_fetch) # put a sane ceiling on the number retrievable num_to_fetch = min(num_to_fetch, 100) except ValueError: num_to_fetch = 5 # If casting to an int fails, just make it 5. unread_list = [] for notification in request.user.notifications.unread()[0:num_to_fetch]: struct = model_to_dict(notification) struct['slug'] = id2slug(notification.id) if notification.actor: struct['actor'] = str(notification.actor) if notification.target: struct['target'] = str(notification.target) if notification.action_object: struct['action_object'] = str(notification.action_object) if notification.data: struct['data'] = notification.data unread_list.append(struct) if request.GET.get('mark_as_read'): notification.mark_as_read() data = { 'unread_count': request.user.notifications.unread().count(), 'unread_list': unread_list } return JsonResponse(data)
def live_all_notification_list(request): ''' Return a json with a notification list ''' try: user_is_authenticated = request.user.is_authenticated() except TypeError: # Django >= 1.11 user_is_authenticated = request.user.is_authenticated print(user_is_authenticated) if not user_is_authenticated: data = { 'all_count': 0, 'all_list': [] } return JsonResponse(data) default_num_to_fetch = get_config()['NUM_TO_FETCH'] try: # If they don't specify, make it 5. num_to_fetch = request.GET.get('max', default_num_to_fetch) num_to_fetch = int(num_to_fetch) if not (1 <= num_to_fetch <= 100): num_to_fetch = default_num_to_fetch except ValueError: # If casting to an int fails. num_to_fetch = default_num_to_fetch all_list = [] for notification in request.user.notifications.all()[0:num_to_fetch]: struct = model_to_dict(notification) struct['slug'] = id2slug(notification.id) if notification.actor: struct['actor'] = str(notification.actor) if notification.target: struct['target'] = str(notification.target) if notification.action_object: struct['action_object'] = str(notification.action_object) if notification.data: struct['data'] = notification.data if notification.verb: struct['verb'] = notification.verb all_list.append(struct) data = { 'all_count': request.user.notifications.count(), 'all_list': all_list } return HttpResponse(json.dumps(data))
def live_unread_notification_list(request): ''' Return a json with a unread notification list ''' try: user_is_authenticated = request.user.is_authenticated() except TypeError: # Django >= 1.11 user_is_authenticated = request.user.is_authenticated if not user_is_authenticated: data = { 'unread_count': 0, 'unread_list': [] } return JsonResponse(data) default_num_to_fetch = get_config()['NUM_TO_FETCH'] try: # If they don't specify, make it 5. num_to_fetch = request.GET.get('max', default_num_to_fetch) num_to_fetch = int(num_to_fetch) if not (1 <= num_to_fetch <= 100): num_to_fetch = default_num_to_fetch except ValueError: # If casting to an int fails. num_to_fetch = default_num_to_fetch unread_list = [] for notification in request.user.notifications.unread()[0:num_to_fetch]: struct = model_to_dict(notification) struct['slug'] = id2slug(notification.id) if notification.actor: struct['actor'] = str(notification.actor) if notification.target: struct['target'] = str(notification.target) if notification.action_object: struct['action_object'] = str(notification.action_object) if notification.data: struct['data'] = notification.data struct['timestamp'] = arrow.get(struct['timestamp']).humanize(locale='ar') unread_list.append(struct) if request.GET.get('mark_as_read'): notification.mark_as_read() data = { 'unread_count': request.user.notifications.unread().count(), 'unread_list': unread_list } return JsonResponse(data)
def live_all_notification_list(request): ''' Return a json with a unread notification list ''' try: user_is_authenticated = request.user.is_authenticated() except TypeError: # Django >= 1.11 user_is_authenticated = request.user.is_authenticated if not user_is_authenticated: data = { 'all_count': 0, 'all_list': [] } return JsonResponse(data) default_num_to_fetch = get_config()['NUM_TO_FETCH'] try: # If they don't specify, make it 5. num_to_fetch = request.GET.get('max', default_num_to_fetch) num_to_fetch = int(num_to_fetch) if not (1 <= num_to_fetch <= 100): num_to_fetch = default_num_to_fetch except ValueError: # If casting to an int fails. num_to_fetch = default_num_to_fetch all_list = [] for notification in request.user.notifications.all()[0:num_to_fetch]: struct = model_to_dict(notification) struct['slug'] = id2slug(notification.id) if notification.actor: struct['actor'] = str(notification.actor) if notification.target: struct['target'] = str(notification.target) if notification.action_object: struct['action_object'] = str(notification.action_object) if notification.data: struct['data'] = notification.data all_list.append(struct) if request.GET.get('mark_as_read'): notification.mark_as_read() data = { 'all_count': request.user.notifications.count(), 'all_list': all_list } return JsonResponse(data)
def build_notification_data(user, notification_type, num_to_fetch, mark_as_read): unread_list = [] data = user.notifications.unread().filter(level=notification_type) for notification in data[0:num_to_fetch]: struct = model_to_dict(notification) struct['slug'] = id2slug(notification.id) if notification.actor: struct['actor'] = str(notification.actor) if notification.target: struct['target'] = str(notification.target) if notification.action_object: struct['action_object'] = str(notification.action_object) if notification.data: struct['data'] = notification.data if mark_as_read: notification.mark_as_read() unread_list.append(struct) return (unread_list, data.count())
def test_all_list_api(self): self.login('to', 'pwd') response = self.client.get(reverse('notifications:live_all_notification_list')) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['all_count', 'all_list']) self.assertEqual(data['all_count'], self.message_count) self.assertEqual(len(data['all_list']), self.message_count) response = self.client.get(reverse('notifications:live_all_notification_list'), data={"max": 5}) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['all_count', 'all_list']) self.assertEqual(data['all_count'], self.message_count) self.assertEqual(len(data['all_list']), 5) # Test with a bad 'max' value response = self.client.get(reverse('notifications:live_all_notification_list'), data={ "max": "this_is_wrong", }) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['all_count', 'all_list']) self.assertEqual(data['all_count'], self.message_count) self.assertEqual(len(data['all_list']), self.message_count) Notification.objects.filter(recipient=self.to_user).mark_all_as_read() response = self.client.get(reverse('notifications:live_all_notification_list')) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['all_count', 'all_list']) self.assertEqual(data['all_count'], self.message_count) self.assertEqual(len(data['all_list']), self.message_count) notify.send(self.from_user, recipient=self.to_user, verb='commented', action_object=self.from_user) response = self.client.get(reverse('notifications:live_all_notification_list')) data = json.loads(response.content.decode('utf-8')) self.assertEqual(sorted(list(data.keys())), ['all_count', 'all_list']) self.assertEqual(data['all_count'], self.message_count + 1) self.assertEqual(len(data['all_list']), self.message_count) self.assertEqual(data['all_list'][0]['verb'], 'commented') self.assertEqual(data['all_list'][0]['slug'], id2slug(data['all_list'][0]['id']))
def slug(self): return id2slug(self.id)
def test_unread_messages_pages(self): self.login('to', 'pwd') response = self.client.get(reverse('notifications:unread')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.unread())) self.assertEqual(len(response.context['notifications']), self.message_count) for index, notification in enumerate(self.to_user.notifications.all()): if index % 3 == 0: response = self.client.get(reverse('notifications:mark_as_read', args=[id2slug(notification.id)])) self.assertEqual(response.status_code, 302) response = self.client.get(reverse('notifications:unread')) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.unread())) self.assertTrue(len(response.context['notifications']) < self.message_count) response = self.client.get(reverse('notifications:mark_all_as_read')) self.assertRedirects(response, reverse('notifications:unread')) response = self.client.get(reverse('notifications:unread')) self.assertEqual(len(response.context['notifications']), len(self.to_user.notifications.unread())) self.assertEqual(len(response.context['notifications']), 0)
def test_unread_messages_pages(self): response = self.client.get('/inbox/notifications/') self.assertEqual(response.status_code,200) self.assertEqual(len(response.context['notifications']),len(self.to_user.notifications.unread())) self.assertEqual(len(response.context['notifications']), self.message_count) for i,n in enumerate(self.to_user.notifications.all()): if i%3 == 0: response = self.client.get(reverse('notifications:mark_as_read',args=[id2slug(n.id)])) self.assertEqual(response.status_code,302) response = self.client.get(reverse('notifications:mark_all_as_read')) self.assertRedirects(response,reverse('notifications:all')) response = self.client.get(reverse('notifications:unread')) self.assertEqual(len(response.context['notifications']),len(self.to_user.notifications.unread())) self.assertEqual(len(response.context['notifications']),0)