diff --git a/chat_box/views.py b/chat_box/views.py
index 5bcabd1..5214725 100644
--- a/chat_box/views.py
+++ b/chat_box/views.py
@@ -501,9 +501,16 @@ def get_or_create_room(request):
user_room.last_seen = timezone.now()
user_room.save()
+ room_url = reverse("chat", kwargs={"room_id": room.id})
if request.method == "GET":
- return JsonResponse({"room": room.id, "other_user_id": other_user.id})
- return HttpResponseRedirect(reverse("chat", kwargs={"room_id": room.id}))
+ return JsonResponse(
+ {
+ "room": room.id,
+ "other_user_id": other_user.id,
+ "url": room_url,
+ }
+ )
+ return HttpResponseRedirect(room_url)
def get_unread_count(rooms, user):
diff --git a/dmoj/urls.py b/dmoj/urls.py
index 82d0925..d9dcb92 100644
--- a/dmoj/urls.py
+++ b/dmoj/urls.py
@@ -489,6 +489,7 @@ urlpatterns = [
reverse("all_user_submissions", args=[user])
),
),
+ url(r"^/toggle_follow/", user.toggle_follow, name="user_toggle_follow"),
url(
r"^/$",
lambda _, user: HttpResponsePermanentRedirect(
diff --git a/judge/views/user.py b/judge/views/user.py
index 01aa7d6..b47eb03 100644
--- a/judge/views/user.py
+++ b/judge/views/user.py
@@ -288,19 +288,6 @@ class UserAboutPage(UserPage):
return context
- # follow/unfollow user
- def post(self, request, user, *args, **kwargs):
- try:
- if not request.profile:
- raise Exception("You have to login")
- if request.profile.username == user:
- raise Exception("Cannot make friend with yourself")
-
- following_profile = Profile.objects.get(user__username=user)
- Friend.toggle_friend(request.profile, following_profile)
- finally:
- return HttpResponseRedirect(request.path_info)
-
class UserProblemsPage(UserPage):
template_name = "user/user-problems.html"
@@ -590,3 +577,17 @@ def toggle_darkmode(request):
return HttpResponseBadRequest()
request.session["darkmode"] = not request.session.get("darkmode", False)
return HttpResponseRedirect(path)
+
+
+@login_required
+def toggle_follow(request, user):
+ if request.method != "POST":
+ raise Http404()
+
+ profile_to_follow = get_object_or_404(Profile, user__username=user)
+
+ if request.profile.id == profile_to_follow.id:
+ raise Http404()
+
+ Friend.toggle_friend(request.profile, profile_to_follow)
+ return HttpResponseRedirect(reverse("user_page", args=(user,)))
diff --git a/resources/contest.scss b/resources/contest.scss
index cfdd478..1b5ed1e 100644
--- a/resources/contest.scss
+++ b/resources/contest.scss
@@ -272,7 +272,7 @@ form.contest-join-pseudotab {
}
.contest-participation-operation {
- float: right;
+ margin-left: auto;
.fa {
color: #444;
@@ -282,7 +282,7 @@ form.contest-join-pseudotab {
padding-left: 1px;
}
- padding: 0 5px;
+ padding-left: 5px;
}
#add-clarification {
diff --git a/resources/users.scss b/resources/users.scss
index a94e32f..669d296 100644
--- a/resources/users.scss
+++ b/resources/users.scss
@@ -59,7 +59,7 @@ th.header.rank {
vertical-align: middle;
}
- .rank, .points, .problems, .user-name {
+ .rank, .points, .problems {
white-space: nowrap;
max-width: 20em;
overflow: hidden;
diff --git a/templates/contest/ranking-css.html b/templates/contest/ranking-css.html
index 0c51968..0711fc6 100644
--- a/templates/contest/ranking-css.html
+++ b/templates/contest/ranking-css.html
@@ -28,8 +28,11 @@
}
.user-name {
- position: relative;
- padding-left: 2em !important;
+ padding-left: 1em !important;
+ padding-right: 1em !important;
+ display: flex;
+ min-width: max-content;
+ align-items: center;
}
.organization-column {
diff --git a/templates/user/user-base.html b/templates/user/user-base.html
index b7c545e..b7ad984 100644
--- a/templates/user/user-base.html
+++ b/templates/user/user-base.html
@@ -79,6 +79,19 @@
{% endblock %}
{% block js_media %}
+
{% block user_js_media %}{% endblock %}
{% endblock %}
@@ -90,7 +103,7 @@
{% if request.user != user.user %}
-