Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
nodejs 23.3.0
ruby 4.0.2
21 changes: 13 additions & 8 deletions games/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def test_no_games(self):
response = self.client.get(reverse("games:index"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "No games are available.")
self.assertQuerysetEqual(response.context["games"], [])
self.assertQuerySetEqual(response.context["games"], [])

def test_one_game(self):
"""
Expand All @@ -33,7 +33,7 @@ def test_one_game(self):
response = self.client.get(reverse("games:index"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Test Game")
self.assertQuerysetEqual(response.context["games"], [game])
self.assertQuerySetEqual(response.context["games"], [game])

def test_many_games(self):
games = [
Expand All @@ -42,7 +42,7 @@ def test_many_games(self):
response = self.client.get(reverse("games:index"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Test Game 0")
self.assertQuerysetEqual(response.context["games"], games)
self.assertQuerySetEqual(response.context["games"], games)

def test_many_games_some_not_ingested(self):
games = [
Expand All @@ -55,7 +55,7 @@ def test_many_games_some_not_ingested(self):
response = self.client.get(reverse("games:index"))
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Test Game 0")
self.assertQuerysetEqual(response.context["games"], games)
self.assertQuerySetEqual(response.context["games"], games)


class GameDetailViewTests(TestCase):
Expand Down Expand Up @@ -159,10 +159,15 @@ def test_ingest_setup_pages(self):
results = game.vector_store.index.similarity_search("Setup instructions")

self.assertEqual(len(results), 3) # Both pages - plus a setup page
self.assertEqual(results[0].metadata["page"], 1)
self.assertEqual(results[0].metadata["game_id"], game.id)
self.assertEqual(results[0].metadata["document_id"], document.id)
self.assertTrue("Page 2" in results[0].page_content)
self.assertTrue(
any(
result.metadata["page"] == 1
and result.metadata["game_id"] == game.id
and result.metadata["document_id"] == document.id
and "Page 2" in result.page_content
for result in results
)
)


class GameVectorStoreTest(TestCase):
Expand Down
12 changes: 6 additions & 6 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ readme = "README.md"

[tool.poetry.dependencies]
python = ">=3.11.6,<3.15"
Django = "^4.2.4"
Django = "^5"
pypdf = "^3.15.0"
langchain = "^0.3.0"
openai = "^1.0"
Expand Down
9 changes: 8 additions & 1 deletion rulesbot/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,14 @@
AWS_SECRET_ACCESS_KEY = env("AWS_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = env("AWS_STORAGE_BUCKET_NAME")

DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
STORAGES = {
"default": {
"BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}

MEDIA_URL = "/mediafiles/"
MEDIA_ROOT = os.path.join(BASE_DIR, "mediafiles")
Expand Down
7 changes: 6 additions & 1 deletion templates/master.html
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,12 @@
{% if user.is_authenticated %}
<li><a class="nav-link" href="{% url 'chat:sessions' %}">Rules Chat Sessions</a></li>
<li><a class="nav-link" href="{% url 'users:account' %}">Manage Account</a></li>
<li><a class="nav-link" href="{% url 'users:logout' %}">Log out</a></li>
<li class="nav-item">
<form method="post" action="{% url 'users:logout' %}" class="d-inline">
{% csrf_token %}
<button type="submit" class="nav-link border-0 bg-transparent">Log out</button>
</form>
</li>
{% else %}
<li class="nav-item">
<a href="{% url 'users:login' %}" class="btn btn-sm bg-gradient-primary mb-0 me-1" role="button">Sign in</a>
Expand Down
5 changes: 4 additions & 1 deletion users/templates/users/account.html
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,10 @@ <h3>Manage Account</h3>
<div class="mt-4">
<a href="{% url 'users:change-password' %}" class="btn bg-gradient-info">Change Password</a>
<br>
<a href="{% url 'users:logout' %}" class="btn bg-gradient-danger">Log out</a>
<form method="post" action="{% url 'users:logout' %}" class="d-inline">
{% csrf_token %}
<button type="submit" class="btn bg-gradient-danger">Log out</button>
</form>
</div>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion users/templates/users/change_password.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ <h3 class="text-white mb-0">Changing password for {{ user.username }}</h3>
<h3 class="text-warning">Change Password</h3>
<form action="{% url 'users:change-password' %}" method="post">
{% csrf_token %}
{{ form }}
{{ form.as_div }}
<input type="submit" class="btn bg-gradient-warning" value="Change Password" />
</form>

Expand Down
2 changes: 1 addition & 1 deletion users/templates/users/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ <h3 class="font-weight-bolder text-info text-gradient">Welcome back</h3>
<div class="card-body">
<form action="{% url 'users:login' %}" method="post">
{% csrf_token %}
{{ form }}
{{ form.as_div }}
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="rememberMe" checked="">
<label class="form-check-label" for="rememberMe">Remember me</label>
Expand Down
3 changes: 1 addition & 2 deletions users/templates/users/sign_up.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@ <h3 class="font-weight-bolder text-primary text-gradient">Join us today!</h3>
<div class="card-body">
<form action="{% url 'users:sign-up' %}" method="post" onsubmit="gtag('event', 'sign_up_form_submit', {'event_category': 'Sign Up', 'event_label': 'Form Submitted'});">
{% csrf_token %}
{{ form }}
{{ form.as_div }}
<div class="text-center">
<form id="signUpForm" >
<input
type="submit"
class="btn bg-gradient-primary w-100 mt-4 mb-0"
Expand Down
23 changes: 13 additions & 10 deletions users/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ def test_post_signup_page_with_existing_username(self):
)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "users/sign_up.html")
self.assertFormError(response, "form", "username", "Username already exists")
self.assertFormError(
response.context["form"], "username", "Username already exists"
)

def test_post_signup_page_with_existing_email(self):
User.objects.create_user(
Expand All @@ -59,7 +61,7 @@ def test_post_signup_page_with_existing_email(self):
)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "users/sign_up.html")
self.assertFormError(response, "form", "email", "Email already exists")
self.assertFormError(response.context["form"], "email", "Email already exists")

def test_post_signup_page_with_non_matching_password(self):
response = self.client.post(
Expand All @@ -74,7 +76,7 @@ def test_post_signup_page_with_non_matching_password(self):
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "users/sign_up.html")
self.assertFormError(
response, "form", "confirm_password", "Passwords do not match"
response.context["form"], "confirm_password", "Passwords do not match"
)

def test_signup_user_cannot_access_admin(self):
Expand Down Expand Up @@ -142,18 +144,18 @@ def test_get_account_page_after_login(self):
response = self.client.get("/users/account")
self.assertEqual(response.status_code, 200)

def test_get_logout_page(self):
response = self.client.get("/users/logout")
def test_post_logout_page(self):
response = self.client.post("/users/logout")
self.assertEqual(response.status_code, 302)
self.assertRedirects(response, "/")

def test_get_logout_page_after_login(self):
def test_post_logout_page_after_login(self):
User.objects.create_user(username="testuser", email="test", password="test")
self.client.login(username="testuser", password="test")
response = self.client.get("/users/account")
self.assertEqual(response.status_code, 200)

response = self.client.get("/users/logout")
response = self.client.post("/users/logout")
self.assertEqual(response.status_code, 302)
self.assertRedirects(response, "/")

Expand Down Expand Up @@ -201,7 +203,9 @@ def test_post_change_password_page_with_wrong_current_password(self):
)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "users/change_password.html")
self.assertFormError(response, "form", "current_password", "Incorrect password")
self.assertFormError(
response.context["form"], "current_password", "Incorrect password"
)

def test_post_change_password_page_with_non_matching_passwords(self):
User.objects.create_user(username="testuser", email="test", password="test")
Expand All @@ -217,8 +221,7 @@ def test_post_change_password_page_with_non_matching_passwords(self):
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "users/change_password.html")
self.assertFormError(
response,
"form",
response.context["form"],
"confirm_new_password",
"Passwords do not match",
)
3 changes: 1 addition & 2 deletions users/urls.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from django.contrib.auth.views import LogoutView
from django.urls import path

from . import views
Expand All @@ -10,5 +9,5 @@
path("login", views.login_view, name="login"),
path("account", views.account_view, name="account"),
path("change-password", views.change_password_view, name="change-password"),
path("logout", LogoutView.as_view(), name="logout"),
path("logout", views.logout_view, name="logout"),
]
9 changes: 8 additions & 1 deletion users/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.contrib.auth import authenticate, login
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.shortcuts import redirect, render
from django.urls import reverse
from django.views.decorators.http import require_POST

from users.forms import ChangePasswordForm, LoginForm, SignupForm

Expand Down Expand Up @@ -115,3 +116,9 @@ def change_password_view(request):
return render(
request, "users/change_password.html", {"user": request.user, "form": form}
)


@require_POST
def logout_view(request):
logout(request)
return redirect("/")
Loading