def messages_template_context(request, messages): replied_ids = frozenset(m.top_reference_id for m in messages) new_ids = new_messages(request, messages).values_list('id', flat=True) if is_contest_basicadmin(request): unanswered = unanswered_questions(messages) else: unanswered = [] to_display = [ { 'message': m, 'link_message': m.top_reference if m.top_reference in messages else m, 'needs_reply': m in unanswered, 'read': m.id not in new_ids, } for m in messages if m.id not in replied_ids ] def key(entry): return entry['needs_reply'], entry['message'].get_user_date() to_display.sort(key=key, reverse=True) return to_display
def messages_template_context(request, messages): replied_ids = frozenset(m.top_reference_id for m in messages) new_ids = new_messages(request, messages).values_list("id", flat=True) if is_contest_admin(request): unanswered = unanswered_questions(messages) else: unanswered = [] to_display = [ { "message": m, "link_message": m.top_reference if m.top_reference in messages else m, "needs_reply": m in unanswered, "read": m.id not in new_ids, } for m in messages if m.id not in replied_ids ] def key(entry): return entry["needs_reply"], entry["message"].date to_display.sort(key=key, reverse=True) return to_display
def navbar_messages_generator(request): if request.contest is None: return {} is_admin = is_contest_basicadmin(request) vis_messages = visible_messages(request) if is_admin: messages = unanswered_questions(vis_messages) else: messages = new_messages(request, vis_messages) count = messages.count() if count: text = ungettext('%(count)d NEW MESSAGE', '%(count)d NEW MESSAGES', count) % {'count': count} if count == 1: m = messages.get() link = reverse('message', kwargs={ 'contest_id': request.contest.id, 'message_id': m.top_reference_id if vis_messages.filter(id=m.top_reference_id).exists() else m.id }) else: link = reverse('contest_messages', kwargs={'contest_id': request.contest.id}) return {'link': link, 'text': text, 'id': 'contest_new_messages'} else: return {'link': None, 'text': None, 'id': 'contest_new_messages'}
def navbar_messages_generator(request): if request.contest is None: return {} is_admin = is_contest_admin(request) messages = visible_messages(request) visible_ids = messages.values_list('id', flat=True) if is_admin: messages = unanswered_questions(messages) else: messages = new_messages(request, messages) count = messages.count() if count: text = ungettext('%(count)d NEW MESSAGE', '%(count)d NEW MESSAGES', count) % { 'count': count } if count == 1: m = messages.get() link = reverse('message', kwargs={ 'contest_id': request.contest.id, 'message_id': m.top_reference_id if m.top_reference_id in visible_ids else m.id }) else: link = reverse('contest_messages', kwargs={'contest_id': request.contest.id}) return {'link': link, 'text': text, 'id': 'contest_new_messages'} else: return {'link': None, 'text': None, 'id': 'contest_new_messages'}
def navbar_messages_generator(request): if request.contest is None: return {} is_admin = is_contest_admin(request) messages = visible_messages(request) visible_ids = messages.values_list('id', flat=True) if is_admin: messages = unanswered_questions(messages) else: messages = new_messages(request, messages) count = messages.count() if count: text = ungettext('%(count)d NEW MESSAGE', '%(count)d NEW MESSAGES', count) % {'count': count} if count == 1: m = messages.get() link = reverse('message', kwargs={ 'contest_id': request.contest.id, 'message_id': m.top_reference_id if m.top_reference_id in visible_ids else m.id }) else: link = reverse('contest_messages', kwargs={'contest_id': request.contest.id}) return {'link': link, 'text': text, 'id': 'contest_new_messages'} else: return {'link': None, 'text': None, 'id': 'contest_new_messages'}
def all_messages_view(request): def make_entry(m): return { 'message': m, 'replies': [], 'timestamp': m.get_user_date(), # only for messages ordering 'is_new': m in new_msgs, 'has_new_message': m in new_msgs, # only for messages ordering 'needs_reply': m in unanswered, } form, vmsg_kwargs = process_filter_form(request) vmessages = visible_messages(request, **vmsg_kwargs) new_msgs = frozenset(new_messages(request, vmessages)) unanswered = unanswered_questions(vmessages) tree = {m.id: make_entry(m) for m in vmessages if m.top_reference is None} for m in vmessages: if m.id in tree: continue entry = make_entry(m) if m.top_reference_id in tree: parent = tree[m.top_reference_id] parent['replies'].append(entry) parent['timestamp'] = max(parent['timestamp'], entry['timestamp']) parent['has_new_message'] = max(parent['has_new_message'], entry['has_new_message']) else: tree[m.id] = entry if is_contest_basicadmin(request): sort_key = lambda x: (x['needs_reply'], x['has_new_message'], x[ 'timestamp']) else: sort_key = lambda x: (x['has_new_message'], x['needs_reply'], x[ 'timestamp']) tree_list = sorted(list(tree.values()), key=sort_key, reverse=True) for entry in tree_list: entry['replies'].sort(key=sort_key, reverse=True) if request.user.is_authenticated: mark_messages_read(request.user, vmessages) return TemplateResponse( request, 'questions/tree.html', { 'tree_list': tree_list, 'form': form, }, )
def test_marking_as_needs_reply(self): contest = Contest.objects.get() url = reverse('contest_all_messages', kwargs={'contest_id': contest.id}) self.assertTrue(self.client.login(username='******')) response = self.client.get(url) self.assertEqual(response.status_code, 200) unanswered = unanswered_questions(Message.objects.all()) # We need additional modules like django-webtest or beuatiful soup # to gracefully inspect HTML instead of template context for entry in response.context['tree_list']: self.assertEqual(entry['needs_reply'], entry['message'] in unanswered)
def all_messages_view(request): def make_entry(m): return { 'message': m, 'replies': [], 'timestamp': m.get_user_date(), # only for messages ordering 'is_new': m in new_msgs, 'has_new_message': m in new_msgs, # only for messages ordering 'needs_reply': m in unanswered, } form, vmsg_kwargs = process_filter_form(request) vmessages = visible_messages(request, **vmsg_kwargs) new_msgs = frozenset(new_messages(request, vmessages)) unanswered = unanswered_questions(vmessages) tree = {m.id: make_entry(m) for m in vmessages if m.top_reference is None} for m in vmessages: if m.id in tree: continue entry = make_entry(m) if m.top_reference_id in tree: parent = tree[m.top_reference_id] parent['replies'].append(entry) parent['timestamp'] = max(parent['timestamp'], entry['timestamp']) parent['has_new_message'] = max(parent['has_new_message'], entry['has_new_message']) else: tree[m.id] = entry if is_contest_admin(request): sort_key = lambda x: (x['needs_reply'], x['has_new_message'], x['timestamp']) else: sort_key = lambda x: (x['has_new_message'], x['needs_reply'], x['timestamp']) tree_list = sorted(list(tree.values()), key=sort_key, reverse=True) for entry in tree_list: entry['replies'].sort(key=sort_key, reverse=True) if request.user.is_authenticated: mark_messages_read(request.user, vmessages) return TemplateResponse(request, 'questions/tree.html', { 'tree_list': tree_list, 'form': form, })
def messages_template_context(request, messages): replied_ids = frozenset(m.top_reference_id for m in messages) new_ids = new_messages(request, messages).values_list('id', flat=True) if is_contest_admin(request): unanswered = unanswered_questions(messages) else: unanswered = [] to_display = [{ 'message': m, 'link_message': m.top_reference if m.top_reference in messages else m, 'needs_reply': m in unanswered, 'read': m.id not in new_ids, } for m in messages if m.id not in replied_ids] def key(entry): return entry['needs_reply'], entry['message'].get_user_date() to_display.sort(key=key, reverse=True) return to_display