diff --git a/bookwyrm/templates/direct_messages.html b/bookwyrm/templates/direct_messages.html
new file mode 100644
index 00000000..6a20b111
--- /dev/null
+++ b/bookwyrm/templates/direct_messages.html
@@ -0,0 +1,37 @@
+{% extends 'layout.html' %}
+{% block content %}
+
+
+
Direct Messages
+
+ {% if not activities %}
+
You have no messages right now.
+ {% endif %}
+ {% for activity in activities %}
+
+ {% include 'snippets/status.html' with status=activity %}
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html
index bcbdca2a..ab113ad0 100644
--- a/bookwyrm/templates/layout.html
+++ b/bookwyrm/templates/layout.html
@@ -68,6 +68,9 @@
{% include 'snippets/username.html' with user=request.user %}
+
+ Direct messages
+
Profile
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py
index a9792038..3cbb7510 100644
--- a/bookwyrm/urls.py
+++ b/bookwyrm/urls.py
@@ -53,7 +53,8 @@ urlpatterns = [
path('', views.home),
re_path(r'^(?P
home|local|federated)/?$', views.home_tab),
- re_path(r'^notifications/?', views.notifications_page),
+ re_path(r'^notifications/?$', views.notifications_page),
+ re_path(r'^direct-messages/?$', views.direct_messages_page),
re_path(r'^import/?$', views.import_page),
re_path(r'^import-status/(\d+)/?$', views.import_status),
re_path(r'^user-edit/?$', views.edit_profile_page),
diff --git a/bookwyrm/views.py b/bookwyrm/views.py
index 562f575e..f32638d4 100644
--- a/bookwyrm/views.py
+++ b/bookwyrm/views.py
@@ -113,11 +113,36 @@ def get_suggested_books(user, max_books=5):
return suggested_books
+@login_required
+@require_GET
+def direct_messages_page(request, page=1):
+ ''' like a feed but for dms only '''
+ activities = get_activity_feed(request.user, 'direct')
+ paginated = Paginator(activities, PAGE_LENGTH)
+ activity_page = paginated.page(page)
+
+ prev_page = next_page = None
+ if activity_page.has_next():
+ next_page = '/direct-message/?page=%d#feed' % \
+ activity_page.next_page_number()
+ if activity_page.has_previous():
+ prev_page = '/direct-messages/?page=%d#feed' % \
+ activity_page.previous_page_number()
+ data = {
+ 'title': 'Direct Messages',
+ 'user': request.user,
+ 'activities': activity_page.object_list,
+ 'next': next_page,
+ 'prev': prev_page,
+ }
+ return TemplateResponse(request, 'direct_messages.html', data)
+
+
def get_activity_feed(user, filter_level, model=models.Status):
''' get a filtered queryset of statuses '''
- # status updates for your follow network
if user.is_anonymous:
user = None
+
if user:
following = models.User.objects.filter(
Q(followers=user) | Q(id=user.id)
@@ -135,6 +160,16 @@ def get_activity_feed(user, filter_level, model=models.Status):
'-published_date'
)
+ if filter_level == 'direct':
+ return activities.filter(
+ Q(user=user) | Q(mention_users=user),
+ privacy='direct'
+ )
+
+ # never show DMs in the regular feed
+ activities = activities.filter(~Q(privacy='direct'))
+
+
if hasattr(activities, 'select_subclasses'):
activities = activities.select_subclasses()