Skip to content

Commit

Permalink
inbox and outbox optimizations
Browse files Browse the repository at this point in the history
  • Loading branch information
smithellis committed Apr 17, 2024
1 parent b56ce6f commit fc930f3
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 23 deletions.
14 changes: 8 additions & 6 deletions kitsune/messages/jinja2/messages/inbox.html
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,17 @@ <h1 class="sumo-page-heading">{{ title }}</h1>
</div>
<div class="avatar-details">
<span class="avatar">
{{ avatar_link(message.sender) }}
{{ avatar_link(message.sender, default_avatar) }}
</span>
<div class="from user">
<span class="from user">
{{ name_link(message.sender) }}
{{ datetimeformat(message.created) }}
</div>
<a class="read" href="{{ url('messages.read', message.id) }}" title="{{ _('Read message') }}">
{{ message.content_parsed|striptags|truncate(length=160) }}
</a>
</span>
<span class="message-view">
<a class="read" href="{{ url('messages.read', message.id) }}" title="{{ _('Read message') }}">
{{ message.content_parsed|striptags|truncate(length=160) }}
</a>
</span>
<a class="delete" href="{{ url('messages.delete', message.id) }}" title="{{ _('Delete message') }}">&#x2716;</a>
</div>
</li>
Expand Down
8 changes: 4 additions & 4 deletions kitsune/messages/jinja2/messages/includes/macros.html
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
{% from "includes/common_macros.html" import content_editor with context %}

{% macro avatar_link(user=None) -%}
{% macro avatar_link(user=None, default_avatar=None) -%}
{% if user %}
<a rel="nofollow" href="{{ profile_url(user) }}">
<img src="{{ profile_avatar(user) }}" height="48" width="48" alt="{{ display_name(user) }}" />
<img src="{{ user.profile.fxa_avatar or webpack_static(default_avatar) }}" height="48" width="48" alt="{{ display_name(user) }}" />
</a>
{% else %}
<img src="{{ profile_avatar(user) }}" height="48" width="48" alt="{{ _('System') }}" />
<img src="{{ user.profile.fxa_avatar or webpack_static(default_avatar) }}" height="48" width="48" alt="{{ _('System') }}" />
{% endif %}
{%- endmacro %}

{% macro name_link(user=None, name=None) -%}
{% if user -%}
<a rel="nofollow" href="{{ profile_url(user) }}">{% if name %}{{ name }}{% else %}{{ display_name(user) }}{% endif %}</a>
{%- else -%}
{{ name if name else _('System') }}
{{ name if name else _('None') }}
{%- endif %}
{%- endmacro %}

Expand Down
8 changes: 5 additions & 3 deletions kitsune/messages/jinja2/messages/outbox.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ <h1 class="sumo-page-heading">{{ title }}</h1>
<b>{{ _('Message') }}</b>
</span>
<span class="delete-button">

</span>
</div>
</li>
Expand All @@ -58,7 +57,7 @@ <h1 class="sumo-page-heading">{{ title }}</h1>
{%- if name -%}
{{ name }}
{%- else -%}
{{ display_name(user) }}
{{ user.profile.display_name }}
{%- endif %}
{%- if not loop.last -%},{%- endif -%}
</a>
Expand All @@ -75,7 +74,10 @@ <h1 class="sumo-page-heading">{{ title }}</h1>
{% if message.to_group %}
{% if message.to_groups_count > 0 -%}
{%- for group in message.to_group.all()[:3] -%}
{{ group_link(group) }}
{%- for profile in group.profile.all() -%}
{% set group_slug = profile.slug %}
<a href="{{ url('groups.profile', group_slug) }}">{{ group }}</a>
{%- endfor -%}
{%- if not loop.last -%},{%- endif -%}
{% endfor %}
{%- if message.to_groups_count > 3 -%}
Expand Down
13 changes: 8 additions & 5 deletions kitsune/messages/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,24 +28,27 @@ def send_message(to, text=None, sender=None):
groups_qs = groups_qs.prefetch_related(Prefetch("user_set"))

# Resolve all unique users, including those in groups
users = set(users_qs)
# but keep up with users from groups
to_users = set(users_qs)
group_users = set()
for group in groups_qs:
users.update(group.user_set.all())
group_users.update(group.user_set.all())
all_recipients_of_message = to_users.union(group_users)

# Create the outbox message
outbox_message = OutboxMessage.objects.create(sender=sender, message=text)
outbox_message.to.set(users)
outbox_message.to.set(to_users)
outbox_message.to_group.set(groups_qs)

# Fetch settings for email notifications in one go
users_to_email = set(
Setting.objects.filter(
user__in=users, name="email_private_messages", value=True
user__in=all_recipients_of_message, name="email_private_messages", value=True
).values_list("user__id", flat=True)
)

# Create inbox messages and handle emails
for user in users:
for user in all_recipients_of_message:
inbox_message = InboxMessage.objects.create(sender=sender, to=user, message=text)
if user.id in users_to_email:
email_private_message(inbox_message_id=inbox_message.id)
Expand Down
25 changes: 21 additions & 4 deletions kitsune/messages/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import json

from django.conf import settings
from django.contrib import messages as contrib_messages
from django.contrib.auth.models import Group
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseRedirect
Expand All @@ -20,12 +21,20 @@
@login_required
def inbox(request):
user = request.user
messages = InboxMessage.objects.filter(to=user).order_by("-created")
messages = (
InboxMessage.objects.filter(to=user)
.order_by("-created")
.prefetch_related("sender__profile")
)
count = messages.count()

messages = paginate(request, messages, per_page=MESSAGES_PER_PAGE, count=count)

return render(request, "messages/inbox.html", {"msgs": messages})
return render(
request,
"messages/inbox.html",
{"msgs": messages, "default_avatar": settings.DEFAULT_AVATAR},
)


@login_required
Expand All @@ -36,7 +45,11 @@ def read(request, msgid):
message.update(read=True)
initial = {"to": message.sender, "in_reply_to": message.pk}
form = ReplyForm(initial=initial)
response = render(request, "messages/read.html", {"message": message, "form": form})
response = render(
request,
"messages/read.html",
{"message": message, "form": form, "default_avatar": settings.DEFAULT_AVATAR},
)
return response


Expand All @@ -57,7 +70,11 @@ def read_outbox(request, msgid):
@login_required
def outbox(request):
user = request.user
messages = OutboxMessage.objects.filter(sender=user).order_by("-created")
messages = (
OutboxMessage.objects.filter(sender=user)
.order_by("-created")
.prefetch_related("to", "to_group")
)
count = messages.count()
messages = paginate(request, messages, per_page=MESSAGES_PER_PAGE, count=count)

Expand Down
3 changes: 2 additions & 1 deletion kitsune/sumo/static/sumo/scss/components/_inbox.scss
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,8 @@ time {

.to,
.to-group,
.to-user {
.to-user,
.from-user {
p {
margin: 0;
padding: 0;
Expand Down

0 comments on commit fc930f3

Please sign in to comment.