def user_responses(request, user, context): """ We list answers for question, comments, and answer accepted by others for this user. as well as mentions of the user user - the profile owner the view has two sub-views - "forum" - i.e. responses and "flags" - moderation items for mods only """ #0) temporary, till urls are fixed: update context # to contain response counts for all sub-sections context.update(view_context.get_for_inbox(request.user)) #1) select activity types according to section section = request.GET.get('section', 'forum') if section == 'flags' and not\ (request.user.is_moderator() or request.user.is_administrator()): raise Http404 if section == 'forum': activity_types = const.RESPONSE_ACTIVITY_TYPES_FOR_DISPLAY activity_types += (const.TYPE_ACTIVITY_MENTION, ) elif section == 'flags': activity_types = (const.TYPE_ACTIVITY_MARK_OFFENSIVE, ) if askbot_settings.ENABLE_CONTENT_MODERATION: activity_types += (const.TYPE_ACTIVITY_MODERATED_NEW_POST, const.TYPE_ACTIVITY_MODERATED_POST_EDIT) elif section == 'join_requests': return show_group_join_requests(request, user, context) elif section == 'messages': if request.user != user: raise Http404 from group_messaging.views import SendersList, ThreadsList context.update(SendersList().get_context(request)) context.update(ThreadsList().get_context(request)) data = { 'inbox_threads_count': context['threads_count'], #a hackfor the inbox count 'active_tab': 'users', 'page_class': 'user-profile-page', 'tab_name': 'inbox', 'inbox_section': section, 'tab_description': _('private messages'), 'page_title': _('profile - messages') } context.update(data) if 'thread_id' in request.GET: from group_messaging.models import Message from group_messaging.views import ThreadDetails try: thread_id = request.GET['thread_id'] context.update(ThreadDetails().get_context(request, thread_id)) context['group_messaging_template_name'] = \ 'group_messaging/home_thread_details.html' except Message.DoesNotExist: raise Http404 else: context[ 'group_messaging_template_name'] = 'group_messaging/home.html' #here we take shortcut, because we don't care about #all the extra context loaded below return render(request, 'user_inbox/messages.html', context) else: raise Http404 #2) load the activity notifications according to activity types #todo: insert pagination code here memo_set = request.user.get_notifications(activity_types) memo_set = memo_set.select_related( 'activity', 'activity__content_type', 'activity__question__thread', 'activity__user', 'activity__user__gravatar', ).order_by('-activity__active_at')[:const.USER_VIEW_DATA_SIZE] #3) "package" data for the output response_list = list() for memo in memo_set: if memo.activity.content_object is None: continue #a temp plug due to bug in the comment deletion response = { 'id': memo.id, 'timestamp': memo.activity.active_at, 'user': memo.activity.user, 'is_new': memo.is_new(), 'response_url': memo.activity.get_absolute_url(), 'response_snippet': memo.activity.get_snippet(), 'response_title': memo.activity.question.thread.title, 'response_type': memo.activity.get_activity_type_display(), 'response_id': memo.activity.question.id, 'nested_responses': [], 'response_content': memo.activity.content_object.html, } response_list.append(response) #4) sort by response id response_list.sort(lambda x, y: cmp(y['response_id'], x['response_id'])) #5) group responses by thread (response_id is really the question post id) last_response_id = None #flag to know if the response id is different filtered_response_list = list() for i, response in enumerate(response_list): #todo: group responses by the user as well if response['response_id'] == last_response_id: original_response = dict.copy( filtered_response_list[len(filtered_response_list) - 1]) original_response['nested_responses'].append(response) filtered_response_list[len(filtered_response_list) - 1] = original_response else: filtered_response_list.append(response) last_response_id = response['response_id'] #6) sort responses by time filtered_response_list.sort( lambda x, y: cmp(y['timestamp'], x['timestamp'])) reject_reasons = models.PostFlagReason.objects.all().order_by('title') data = { 'active_tab': 'users', 'page_class': 'user-profile-page', 'tab_name': 'inbox', 'inbox_section': section, 'tab_description': _('comments and answers to others questions'), 'page_title': _('profile - responses'), 'post_reject_reasons': reject_reasons, 'responses': filtered_response_list, } context.update(data) return render(request, 'user_inbox/responses_and_flags.html', context)
def user_responses(request, user, context): """ We list answers for question, comments, and answer accepted by others for this user. as well as mentions of the user user - the profile owner the view has two sub-views - "forum" - i.e. responses and "flags" - moderation items for mods only """ # 0) temporary, till urls are fixed: update context # to contain response counts for all sub-sections context.update(view_context.get_for_inbox(request.user)) # 1) select activity types according to section section = request.GET.get('section', 'forum') if section == 'forum': activity_types = const.RESPONSE_ACTIVITY_TYPES_FOR_DISPLAY activity_types += (const.TYPE_ACTIVITY_MENTION, ) elif section == 'join_requests': return show_group_join_requests(request, user, context) elif section == 'messages': if request.user != user: if not askbot_settings.ADMIN_INBOX_ACCESS_ENABLED: raise Http404 elif not (request.user.is_moderator() or request.user.is_administrator()): raise Http404 from group_messaging.views import SendersList, ThreadsList context.update(SendersList().get_context(request)) context.update(ThreadsList().get_context(request, user)) data = { 'inbox_threads_count': context['threads_count'], # a hackfor the inbox count 'active_tab': 'users', 'page_class': 'user-profile-page', 'tab_name': 'inbox', 'inbox_section': section, 'page_title': _('profile - messages') } context.update(data) if 'thread_id' in request.GET: from group_messaging.models import Message from group_messaging.views import ThreadDetails try: thread_id = request.GET['thread_id'] context.update(ThreadDetails().get_context(request, thread_id)) context['group_messaging_template_name'] = \ 'group_messaging/home_thread_details.jinja' except Message.DoesNotExist: raise Http404 else: context[ 'group_messaging_template_name'] = 'group_messaging/home.jinja' # here we take shortcut, because we don't care about # all the extra context loaded below return render(request, 'user_inbox/messages.jinja', context) else: raise Http404 # 2) load the activity notifications according to activity types # TODO: insert pagination code here memo_set = request.user.get_notifications(activity_types) memo_set = memo_set.select_related( 'activity', 'activity__content_type', 'activity__question__thread', 'activity__user', 'activity__user__gravatar', ).order_by('-activity__active_at')[:const.USER_VIEW_DATA_SIZE] # 3) "package" data for the output response_list = list() for memo in memo_set: obj = memo.activity.content_object if obj is None: memo.activity.delete() continue # a temp plug due to bug in the comment deletion act = memo.activity act_user = act.user act_message = act.get_activity_type_display() act_type = 'edit' response = { 'id': memo.id, 'timestamp': act.active_at, 'user': act_user, 'is_new': memo.is_new(), 'url': act.get_absolute_url(), 'snippet': act.get_snippet(), 'title': act.question.thread.title, 'message_type': act_message, 'memo_type': act_type, 'question_id': act.question.id, 'followup_messages': list(), 'content': obj.html or obj.text, } response_list.append(response) # 4) sort by response id response_list.sort(key=lambda ele: ele['question_id'], reverse=True) # 5) group responses by thread (response_id is really the question post id) last_question_id = None # flag to know if the question id is different filtered_message_list = list() for message in response_list: # TODO: group responses by the user as well if message['question_id'] == last_question_id: original_message = dict.copy(filtered_message_list[-1]) original_message['followup_messages'].append(message) filtered_message_list[-1] = original_message else: filtered_message_list.append(message) last_question_id = message['question_id'] # 6) sort responses by time filtered_message_list.sort(key=lambda ele: ele['timestamp'], reverse=True) reject_reasons = models.PostFlagReason.objects.all().order_by('title') data = { 'active_tab': 'users', 'page_class': 'user-profile-page', 'tab_name': 'inbox', 'inbox_section': section, 'page_title': _('profile - responses'), 'post_reject_reasons': reject_reasons, 'messages': filtered_message_list, } context.update(data) template = 'user_inbox/responses.jinja' return render(request, template, context)