From 79379ee7b26f6c8d1c1f156189c01ed6dc61df52 Mon Sep 17 00:00:00 2001 From: trinkey Date: Tue, 24 Dec 2024 12:14:38 -0500 Subject: [PATCH] user page (finished?!?!) --- tmessage/static/js/messages.js | 15 ++++--- tmessage/templates/404.html | 2 + tmessage/templates/message-page.html | 2 +- tmessage/templates/message.html | 2 +- tmessage/templates/messages.html | 8 ++-- tmessage/templates/user.html | 33 ++++++++++++++ tmessage/urls.py | 5 ++- tmessage/views/__init__.py | 2 +- tmessage/views/api.py | 66 +++++++++++++++++++++++++--- tmessage/views/templates.py | 18 +++++++- 10 files changed, 131 insertions(+), 22 deletions(-) create mode 100644 tmessage/templates/user.html diff --git a/tmessage/static/js/messages.js b/tmessage/static/js/messages.js index 7efad69..e7be54b 100644 --- a/tmessage/static/js/messages.js +++ b/tmessage/static/js/messages.js @@ -3,7 +3,7 @@ let timelineElement = document.getElementById("messages"); let moreButton = document.getElementById("more-button"); function escapeHTML(content) { - return content.replaceAll("&", "&").replaceAll("<", ">").replaceAll(">", "<"); + return content.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"); } function getMessageHTML(messageJSON, canRespond) { @@ -11,7 +11,7 @@ function getMessageHTML(messageJSON, canRespond) { el.classList.add("message-container"); el.dataset.messageId = messageJSON.id; el.innerHTML = ` -

Messaging ${messageJSON.to}: ${messageJSON.response ? `${timeSince(messageJSON.response_timestamp)}` : ""}

+

Messaging ${messageJSON.to}: ${messageJSON.response ? timeSince(messageJSON.response_timestamp) : ""}

<${messageJSON.from ? "a" : "b"} href="/u/${messageJSON.from}/">${messageJSON.from || "Anony­mous"} writes: ${timeSince(messageJSON.timestamp)}
${escapeHTML(messageJSON.content)}
@@ -25,7 +25,7 @@ function getMessageHTML(messageJSON, canRespond) { ${messageJSON.response ? "" : ``} - ` : `No response` + ` : (messageJSON.response ? "" : `No response`) }`; return el @@ -48,8 +48,13 @@ function replyTo(messageID) { .then((response) => (response.json())) .then((json) => { if (json.success) { - let response = document.createElement("div"); - response.innerHTML = `${timeSince(json.timestamp)}
${escapeHTML(json.content)}
`; + let response = document.createElement("pre"); + response.classList.add("not-code"); + response.classList.add("no-margin"); + response.innerText = json.content; + + msgContainer.querySelector("[data-timestamp-here]").innerHTML = timeSince(json.timestamp); + err.innerHTML = ""; msgContainer.querySelector("textarea").replaceWith(response); diff --git a/tmessage/templates/404.html b/tmessage/templates/404.html index 221afca..43ca803 100644 --- a/tmessage/templates/404.html +++ b/tmessage/templates/404.html @@ -1,5 +1,7 @@ {% extends "base.html" %} +{% block title %}Page Not Found - {% endblock %} + {% block body %}

Hmm. That doesn't look right.

Make sure the URL is correct and try again. diff --git a/tmessage/templates/message-page.html b/tmessage/templates/message-page.html index 0635439..39d90ba 100644 --- a/tmessage/templates/message-page.html +++ b/tmessage/templates/message-page.html @@ -15,7 +15,7 @@ {% if username %} - Logged in as {{ username }} + Logged in as {{ username }}

View your messages

{% else %} Not logged in. diff --git a/tmessage/templates/message.html b/tmessage/templates/message.html index ddd5311..eb513cc 100644 --- a/tmessage/templates/message.html +++ b/tmessage/templates/message.html @@ -8,7 +8,7 @@ {% csrf_token %}

{% if self_username %} - Logged in as {{ username }} + Logged in as {{ username }}
diff --git a/tmessage/templates/messages.html b/tmessage/templates/messages.html index eb5f96b..5fc06fc 100644 --- a/tmessage/templates/messages.html +++ b/tmessage/templates/messages.html @@ -2,7 +2,7 @@ {% block head %} - + {% endblock %} {% block body %} @@ -16,11 +16,11 @@

- All messages - - Not responded + All messages - + Not responded

Loading...
- +

+{% endblock %} + +{% block body %} +

{{ username }}'s Messages

+

Message {{ username }}

+ +
+

+

+ All messages - + With response +

+
Loading...
+

+ +


+ + {% if self_username %} +

Logged in as {{ self_username }}

+

View your messages

+ {% else %} + Not logged in. + {% if config.new_users %}Sign up{% else %}Log in{% endif %}? + {% endif %} + + + +{% endblock %} diff --git a/tmessage/urls.py b/tmessage/urls.py index 5f468c2..38ce01d 100644 --- a/tmessage/urls.py +++ b/tmessage/urls.py @@ -1,8 +1,8 @@ from django.contrib import admin from django.urls import include, path -from .views import (api_messages, auth, index, message, message_page, messages, - profile) +from .views import (api_messages, api_user, auth, index, message, message_page, + messages, profile) urlpatterns = [ path("", index), @@ -12,6 +12,7 @@ urlpatterns = [ path("m//", message), path("msg//", message_page), path("api/messages/", api_messages), + path("api/user//", api_user), path("static/", include("tmessage.views.static")), path("django-admin/", admin.site.urls) ] diff --git a/tmessage/views/__init__.py b/tmessage/views/__init__.py index 5a1f428..66daf91 100644 --- a/tmessage/views/__init__.py +++ b/tmessage/views/__init__.py @@ -1,3 +1,3 @@ -from .api import api_messages # noqa: F401 +from .api import api_messages, api_user # noqa: F401 from .templates import (auth, index, message, message_page, # noqa: F401 messages, profile) diff --git a/tmessage/views/api.py b/tmessage/views/api.py index 912f8fc..bb8c220 100644 --- a/tmessage/views/api.py +++ b/tmessage/views/api.py @@ -3,10 +3,11 @@ import math import time from django.core.handlers.wsgi import WSGIRequest +from django.db.models import Q from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt -from tmessage.models import tMMessage +from tmessage.models import tMMessage, tMUser from .helper import get_user_object, get_username @@ -18,6 +19,11 @@ def _json_response(data: dict | list, /, *, status: int=200, content_type: str=" content_type=content_type ) +def _add_qF(original: None | Q, new: Q) -> Q: + if original is None: + return new + return original | new + RESPONSE_400 = _json_response({ "success": False }, status=400) RESPONSE_401 = _json_response({ "success": False }, status=401) RESPONSE_403 = _json_response({ "success": False }, status=403) @@ -35,19 +41,23 @@ def api_messages(request: WSGIRequest) -> HttpResponse: body = json.loads(request.body) reply = body["content"].strip() message_id = body["id"] + print(reply) - if not (isinstance(message_id, int) and isinstance(reply, str)): + if not (isinstance(message_id, int) and isinstance(reply, str) and reply): + print("1") return RESPONSE_400 try: message = tMMessage.objects.get(message_id=message_id) except tMMessage.DoesNotExist: + print("2") return RESPONSE_400 if username != message.u_to.username: return RESPONSE_403 if message.response is not None: + print("3") return RESPONSE_400 message.response = reply @@ -81,16 +91,16 @@ def api_messages(request: WSGIRequest) -> HttpResponse: "success": True }) - queryFilter = {} + queryFilter = None if "offset" in request.GET and (request.GET.get("offset") or "").isdigit(): - queryFilter["message_id__lt"] = int(request.GET.get("offset") or "") + queryFilter = _add_qF(queryFilter, Q(message_id__lt=int(request.GET.get("offset") or ""))) if "unread" in request.GET: - queryFilter["response"] = None + queryFilter = _add_qF(queryFilter, Q(response=None)) if queryFilter: - msgObjects = user.received.filter(**queryFilter) + msgObjects = user.received.filter(queryFilter) # type: ignore else: msgObjects = user.received.all() # type: ignore @@ -116,3 +126,47 @@ def api_messages(request: WSGIRequest) -> HttpResponse: "messages": output, "more": msgObjects.count() > 50 }) + +def api_user(request: WSGIRequest, username: str) -> HttpResponse: + queryFilter = {} + + try: + user = get_user_object(username) + except tMUser.DoesNotExist: + return RESPONSE_400 + + queryFilter = None + + if "offset" in request.GET and (request.GET.get("offset") or "").isdigit(): + queryFilter = _add_qF(queryFilter, Q(message_id__lt=int(request.GET.get("offset") or ""))) + + if "all" not in request.GET: + queryFilter = _add_qF(queryFilter, ~Q(response=None)) + + if queryFilter: + msgObjects = user.received.filter(queryFilter) # type: ignore + else: + msgObjects = user.received.all() # type: ignore + + output = [] + messages = msgObjects.order_by("-sent_timestamp" if "all" in request.GET else "-response_timestamp")[:50].values_list( + "message_id", "content", "response", "anonymous", "u_from", "u_to", "sent_timestamp", "response_timestamp" + ) + + for message in messages: + output.append({ + "id": message[0], + "content": message[1], + "response": message[2], + "from": message[4] if not message[3] and message[4] else None, + "to": message[5], + "timestamp": message[6], + "response_timestamp": message[7] + }) + + return _json_response({ + "success": True, + "canRespond": username == get_username(request), + "messages": output, + "more": msgObjects.count() > 50 + }) diff --git a/tmessage/views/templates.py b/tmessage/views/templates.py index 34a986b..100239d 100644 --- a/tmessage/views/templates.py +++ b/tmessage/views/templates.py @@ -5,7 +5,7 @@ from datetime import datetime from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponse, HttpResponseRedirect -from tmessage.models import tMMessage +from tmessage.models import tMMessage, tMUser from .helper import (get_user_object, get_username, render_template, username_exists) @@ -36,7 +36,21 @@ def index(request: WSGIRequest) -> HttpResponse: ) def profile(request: WSGIRequest, username: str) -> HttpResponse: - ... + try: + get_user_object(username) + except tMUser.DoesNotExist: + return render_template( + request, "404.html" + ) + + self_username = get_username(request) + + return render_template( + request, "user.html", + title=username, + username=username, + self_username=self_username + ) def message_page(request: WSGIRequest, message_id: int) -> HttpResponse: try: