def reattach_suggest(request, mlist_fqdn, threadid): mlist = get_object_or_404(MailingList, name=mlist_fqdn) thread = get_object_or_404(Thread, mailinglist=mlist, thread_id=threadid) default_search_query = stripped_subject(mlist, thread.subject).lower().replace( "re:", "") search_query = request.GET.get("q") if not search_query: search_query = default_search_query search_query = search_query.strip() emails = SearchQuerySet().filter(mailinglist__exact=mlist_fqdn, content=search_query)[:50] suggested_threads = [] for msg in emails: sugg_thread = msg.object.thread if (sugg_thread not in suggested_threads and sugg_thread.thread_id != threadid): suggested_threads.append(sugg_thread) context = { 'mlist': mlist, 'suggested_threads': suggested_threads[:10], } return render(request, "hyperkitty/ajax/reattach_suggest.html", context)
def _get_thread_replies(request, thread, limit, offset=1): ''' Get and sort the replies for a thread. By default, offset = 1 to skip the original message. ''' if not thread: raise Http404 sort_mode = request.GET.get("sort", "thread") if sort_mode not in ("date", "thread"): raise SuspiciousOperation if sort_mode == "thread": sort_mode = "thread_order" mlist = thread.mailinglist initial_subject = stripped_subject(mlist, thread.starting_email.subject) emails = list(thread.emails.order_by(sort_mode)[offset:offset + limit]) for email in emails: # Extract all the votes for this message if request.user.is_authenticated(): email.myvote = email.votes.filter(user=request.user).first() else: email.myvote = None # Threading position if sort_mode == "thread_order": email.level = email.thread_depth - 1 # replies start ragged left if email.level > 5: email.level = 5 elif email.level < 0: email.level = 0 # Subject change subject = stripped_subject(mlist, email.subject) if subject.lower().startswith("re:"): subject = subject[3:].strip() if subject.strip() == initial_subject.strip(): email.changed_subject = False else: email.changed_subject = subject return emails
def _get_thread_replies(request, thread, limit, offset=1): ''' Get and sort the replies for a thread. By default, offset = 1 to skip the original message. ''' if not thread: raise Http404 sort_mode = request.GET.get("sort", "thread") if sort_mode not in ("date", "thread"): raise SuspiciousOperation if sort_mode == "thread": sort_mode = "thread_order" mlist = thread.mailinglist initial_subject = stripped_subject(mlist, thread.starting_email.subject) emails = list(thread.emails.order_by(sort_mode)[offset:offset+limit]) for email in emails: # Extract all the votes for this message if request.user.is_authenticated(): email.myvote = email.votes.filter(user=request.user).first() else: email.myvote = None # Threading position if sort_mode == "thread_order": email.level = email.thread_depth - 1 # replies start ragged left if email.level > 5: email.level = 5 elif email.level < 0: email.level = 0 # Subject change subject = stripped_subject(mlist, email.subject) if subject.lower().startswith("re:"): subject = subject[3:].strip() if subject.strip() == initial_subject.strip(): email.changed_subject = False else: email.changed_subject = subject return emails
def _get_thread_replies(request, thread, limit, offset=0): ''' Get and sort the replies for a thread. ''' if not thread: raise Http404 sort_mode = request.GET.get("sort", "thread") if sort_mode not in ("date", "thread"): raise SuspiciousOperation if sort_mode == "thread": sort_mode = "thread_order" mlist = thread.mailinglist initial_subject = stripped_subject(mlist, thread.starting_email.subject) emails = list( thread.emails.exclude( pk=thread.starting_email.pk).order_by(sort_mode)[offset:offset + limit]) for email in emails: # Extract all the votes for this message if request.user.is_authenticated: email.myvote = email.votes.filter(user=request.user).first() else: email.myvote = None # Threading position if sort_mode == "thread_order": # If the email's thread_order is None, we set it to 1 by # default. This field should be re-computed when the async job # compute_thread_order_depth runs for this new email comes in # and fix things. if email.thread_order is None: email.thread_order = 1 email.level = email.thread_depth - 1 # replies start ragged left if email.level > 5: email.level = 5 elif email.level < 0: email.level = 0 # Subject change subject = email.subject.strip() if mlist.subject_prefix: subject = subject.replace(mlist.subject_prefix, "") subject = REPLY_RE.sub("", subject.strip()) if subject == initial_subject.strip(): email.changed_subject = False else: email.changed_subject = subject return emails
def reattach_suggest(request, mlist_fqdn, threadid): mlist = get_object_or_404(MailingList, name=mlist_fqdn) thread = get_object_or_404(Thread, mailinglist=mlist, thread_id=threadid) default_search_query = stripped_subject( mlist, thread.subject).lower().replace("re:", "") search_query = request.GET.get("q") if not search_query: search_query = default_search_query search_query = search_query.strip() emails = SearchQuerySet().filter( mailinglist__exact=mlist_fqdn, content=search_query)[:50] suggested_threads = [] for msg in emails: sugg_thread = msg.object.thread if sugg_thread not in suggested_threads \ and sugg_thread.thread_id != threadid: suggested_threads.append(sugg_thread) context = { 'mlist' : mlist, 'suggested_threads': suggested_threads[:10], } return render(request, "hyperkitty/ajax/reattach_suggest.html", context)
def strip_subject(subject, mlist): return stripped_subject(mlist, subject)
def thread_index(request, mlist_fqdn, threadid, month=None, year=None): ''' Displays all the email for a given thread identifier ''' mlist = get_object_or_404(MailingList, name=mlist_fqdn) thread = get_object_or_404(Thread, mailinglist=mlist, thread_id=threadid) starting_email = thread.starting_email sort_mode = request.GET.get("sort", "thread") if request.user.is_authenticated(): starting_email.myvote = starting_email.votes.filter( user=request.user).first() else: starting_email.myvote = None # Tags tag_form = AddTagForm() # Favorites fav_action = "add" if request.user.is_authenticated() and Favorite.objects.filter( thread=thread, user=request.user).exists(): fav_action = "rm" # Category category, category_form = get_category_widget(request, thread.category) # Extract relative dates today = datetime.date.today() days_old = today - starting_email.date.date() days_inactive = today - thread.date_active.date() subject = stripped_subject(mlist, starting_email.subject) # Last view last_view = None if request.user.is_authenticated(): last_view_obj, created = LastView.objects.get_or_create( thread=thread, user=request.user) if not created: last_view = last_view_obj.view_date last_view_obj.save() # update timestamp # get the number of unread messages if last_view is None: if request.user.is_authenticated(): unread_count = thread.emails_count else: unread_count = 0 else: unread_count = thread.emails.filter(date__gt=last_view).count() # TODO: eventually move to a middleware ? # http://djangosnippets.org/snippets/1865/ user_agent = request.META.get('HTTP_USER_AGENT', None) if user_agent: is_bot = robot_detection.is_robot(user_agent) else: is_bot = True # Export button export = { "url": "%s?thread=%s" % (reverse("hk_list_export_mbox", kwargs={ "mlist_fqdn": mlist.name, "filename": "%s-%s" % (mlist.name, thread.thread_id) }), thread.thread_id), "message": _("Download"), "title": _("This thread in gzipped mbox format"), } context = { 'mlist': mlist, 'thread': thread, 'starting_email': starting_email, 'subject': subject, 'addtag_form': tag_form, 'month': thread.date_active, 'months_list': get_months(mlist), 'days_inactive': days_inactive.days, 'days_old': days_old.days, 'sort_mode': sort_mode, 'fav_action': fav_action, 'reply_form': get_posting_form(ReplyForm, request, mlist), 'is_bot': is_bot, 'num_comments': thread.emails_count - 1, 'last_view': last_view, 'unread_count': unread_count, 'category_form': category_form, 'category': category, 'export': export, } if is_bot: # Don't rely on AJAX to load the replies # The limit is a safety measure, don't let a bot kill the DB context["replies"] = _get_thread_replies(request, thread, limit=1000) return render(request, "hyperkitty/thread.html", context)
def thread_index(request, mlist_fqdn, threadid, month=None, year=None): ''' Displays all the email for a given thread identifier ''' # pylint: disable=unused-argument mlist = get_object_or_404(MailingList, name=mlist_fqdn) thread = get_object_or_404(Thread, mailinglist=mlist, thread_id=threadid) starting_email = thread.starting_email sort_mode = request.GET.get("sort", "thread") if request.user.is_authenticated(): starting_email.myvote = starting_email.votes.filter( user=request.user).first() else: starting_email.myvote = None # Tags tag_form = AddTagForm() # Favorites fav_action = "add" if request.user.is_authenticated() and Favorite.objects.filter( thread=thread, user=request.user).exists(): fav_action = "rm" # Category category, category_form = get_category_widget(request, thread.category) # Extract relative dates today = datetime.date.today() days_old = today - starting_email.date.date() days_inactive = today - thread.date_active.date() subject = stripped_subject(mlist, starting_email.subject) # Last view last_view = None if request.user.is_authenticated(): last_view_obj, created = LastView.objects.get_or_create( thread=thread, user=request.user) if not created: last_view = last_view_obj.view_date last_view_obj.save() # update timestamp # get the number of unread messages if last_view is None: if request.user.is_authenticated(): unread_count = thread.emails_count else: unread_count = 0 else: unread_count = thread.emails.filter(date__gt=last_view).count() # TODO: eventually move to a middleware ? # http://djangosnippets.org/snippets/1865/ user_agent = request.META.get('HTTP_USER_AGENT', None) if user_agent: is_bot = robot_detection.is_robot(user_agent) else: is_bot = True # Export button export = { "url": "%s?thread=%s" % ( reverse("hk_list_export_mbox", kwargs={ "mlist_fqdn": mlist.name, "filename": "%s-%s" % (mlist.name, thread.thread_id)}), thread.thread_id), "message": _("Download"), "title": _("This thread in gzipped mbox format"), } context = { 'mlist': mlist, 'thread': thread, 'starting_email': starting_email, 'subject': subject, 'addtag_form': tag_form, 'month': thread.date_active, 'months_list': get_months(mlist), 'days_inactive': days_inactive.days, 'days_old': days_old.days, 'sort_mode': sort_mode, 'fav_action': fav_action, 'reply_form': get_posting_form(ReplyForm, request, mlist), 'is_bot': is_bot, 'num_comments': thread.emails_count - 1, 'last_view': last_view, 'unread_count': unread_count, 'category_form': category_form, 'category': category, 'export': export, } if is_bot: # Don't rely on AJAX to load the replies # The limit is a safety measure, don't let a bot kill the DB context["replies"] = _get_thread_replies(request, thread, limit=1000) return render(request, "hyperkitty/thread.html", context)
def thread_index(request, mlist_fqdn, threadid, month=None, year=None): ''' Displays all the email for a given thread identifier ''' # pylint: disable=unused-argument mlist = get_object_or_404(MailingList, name=mlist_fqdn) thread = get_object_or_404(Thread, mailinglist=mlist, thread_id=threadid) starting_email = thread.starting_email sort_mode = request.GET.get("sort", "thread") if request.user.is_authenticated(): starting_email.myvote = starting_email.votes.filter( user=request.user).first() else: starting_email.myvote = None # Tags tag_form = AddTagForm() # Favorites fav_action = "add" if request.user.is_authenticated() and Favorite.objects.filter( thread=thread, user=request.user).exists(): fav_action = "rm" # Category categories = [ (c.name, c.name.upper()) for c in ThreadCategory.objects.all() ] \ + [("", "no category")] category, category_form = get_category_widget(request, thread.category, categories) # Extract relative dates today = datetime.date.today() days_old = today - starting_email.date.date() days_inactive = today - thread.date_active.date() subject = stripped_subject(mlist, starting_email.subject) # Last view last_view = None if request.user.is_authenticated(): last_view_obj, created = LastView.objects.get_or_create( thread=thread, user=request.user) if not created: last_view = last_view_obj.view_date last_view_obj.save() # update timestamp # get the number of unread messages if last_view is None: if request.user.is_authenticated(): unread_count = thread.emails_count else: unread_count = 0 else: unread_count = thread.emails.filter(date__gt=last_view).count() # Flash messages flash_messages = [] flash_msg = request.GET.get("msg") if flash_msg: flash_msg = { "type": FLASH_MESSAGES[flash_msg][0], "msg": FLASH_MESSAGES[flash_msg][1] } flash_messages.append(flash_msg) # TODO: eventually move to a middleware ? # http://djangosnippets.org/snippets/1865/ user_agent = request.META.get('HTTP_USER_AGENT', None) if user_agent: is_bot = robot_detection.is_robot(user_agent) else: is_bot = True context = { 'mlist': mlist, 'thread': thread, 'starting_email': starting_email, 'subject': subject, 'addtag_form': tag_form, 'month': thread.date_active, 'months_list': get_months(mlist), 'days_inactive': days_inactive.days, 'days_old': days_old.days, 'sort_mode': sort_mode, 'fav_action': fav_action, 'reply_form': ReplyForm(), 'is_bot': is_bot, 'num_comments': thread.emails_count - 1, 'last_view': last_view, 'unread_count': unread_count, 'category_form': category_form, 'category': category, 'flash_messages': flash_messages, } if is_bot: # Don't rely on AJAX to load the replies # The limit is a safety measure, don't let a bot kill the DB context["replies"] = _get_thread_replies(request, thread, limit=1000) return render(request, "hyperkitty/thread.html", context)
def thread_index(request, mlist_fqdn, threadid, month=None, year=None): ''' Displays all the email for a given thread identifier ''' # pylint: disable=unused-argument mlist = get_object_or_404(MailingList, name=mlist_fqdn) thread = get_object_or_404(Thread, mailinglist=mlist, thread_id=threadid) starting_email = thread.starting_email sort_mode = request.GET.get("sort", "thread") if request.user.is_authenticated(): starting_email.myvote = starting_email.votes.filter( user=request.user).first() else: starting_email.myvote = None # Tags tag_form = AddTagForm() # Favorites fav_action = "add" if request.user.is_authenticated() and Favorite.objects.filter( thread=thread, user=request.user).exists(): fav_action = "rm" # Category categories = [ (c.name, c.name.upper()) for c in ThreadCategory.objects.all() ] \ + [("", "no category")] category, category_form = get_category_widget( request, thread.category, categories) # Extract relative dates today = datetime.date.today() days_old = today - starting_email.date.date() days_inactive = today - thread.date_active.date() subject = stripped_subject(mlist, starting_email.subject) # Last view last_view = None if request.user.is_authenticated(): last_view_obj, created = LastView.objects.get_or_create( thread=thread, user=request.user) if not created: last_view = last_view_obj.view_date last_view_obj.save() # update timestamp # get the number of unread messages if last_view is None: if request.user.is_authenticated(): unread_count = thread.emails_count else: unread_count = 0 else: unread_count = thread.emails.filter(date__gt=last_view).count() # Flash messages flash_messages = [] flash_msg = request.GET.get("msg") if flash_msg: flash_msg = { "type": FLASH_MESSAGES[flash_msg][0], "msg": FLASH_MESSAGES[flash_msg][1] } flash_messages.append(flash_msg) # TODO: eventually move to a middleware ? # http://djangosnippets.org/snippets/1865/ user_agent = request.META.get('HTTP_USER_AGENT', None) if user_agent: is_bot = robot_detection.is_robot(user_agent) else: is_bot = True context = { 'mlist': mlist, 'thread': thread, 'starting_email': starting_email, 'subject': subject, 'addtag_form': tag_form, 'month': thread.date_active, 'months_list': get_months(mlist), 'days_inactive': days_inactive.days, 'days_old': days_old.days, 'sort_mode': sort_mode, 'fav_action': fav_action, 'reply_form': ReplyForm(), 'is_bot': is_bot, 'num_comments': thread.emails_count - 1, 'last_view': last_view, 'unread_count': unread_count, 'category_form': category_form, 'category': category, 'flash_messages': flash_messages, } if is_bot: # Don't rely on AJAX to load the replies # The limit is a safety measure, don't let a bot kill the DB context["replies"] = _get_thread_replies(request, thread, limit=1000) return render(request, "hyperkitty/thread.html", context)