Пример #1
0
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
Пример #2
0
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
Пример #3
0
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'}
Пример #4
0
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'}
Пример #5
0
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'}
Пример #6
0
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,
        },
    )
Пример #7
0
    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)
Пример #8
0
    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)
Пример #9
0
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,
    })
Пример #10
0
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