fix friend_code editing

This commit is contained in:
badblocks 2025-03-15 15:22:41 -07:00
parent 36f97be9d0
commit 0ac8ac8d5c
5 changed files with 88 additions and 9 deletions

View file

@ -1,4 +1,4 @@
# Generated by Django 5.1.2 on 2025-03-14 05:35 # Generated by Django 5.1.2 on 2025-03-15 22:05
import django.contrib.auth.models import django.contrib.auth.models
import django.contrib.auth.validators import django.contrib.auth.validators

View file

@ -1,10 +1,18 @@
from django.urls import path from django.urls import path
from .views import ListFriendCodesView, AddFriendCodeView, DeleteFriendCodeView, ChangeDefaultFriendCodeView, SettingsView from .views import (
ListFriendCodesView,
AddFriendCodeView,
DeleteFriendCodeView,
ChangeDefaultFriendCodeView,
EditFriendCodeView,
SettingsView,
)
urlpatterns = [ urlpatterns = [
# ... other account URLs ... # ... other account URLs ...
path("friend-codes/", ListFriendCodesView.as_view(), name="list_friend_codes"), path("friend-codes/", ListFriendCodesView.as_view(), name="list_friend_codes"),
path("friend-codes/add/", AddFriendCodeView.as_view(), name="add_friend_code"), path("friend-codes/add/", AddFriendCodeView.as_view(), name="add_friend_code"),
path("friend-codes/edit/<int:pk>/", EditFriendCodeView.as_view(), name="edit_friend_code"),
path("friend-codes/delete/<int:pk>/", DeleteFriendCodeView.as_view(), name="delete_friend_code"), path("friend-codes/delete/<int:pk>/", DeleteFriendCodeView.as_view(), name="delete_friend_code"),
path("friend-codes/default/<int:pk>/", ChangeDefaultFriendCodeView.as_view(), name="change_default_friend_code"), path("friend-codes/default/<int:pk>/", ChangeDefaultFriendCodeView.as_view(), name="change_default_friend_code"),
path("settings/", SettingsView.as_view(), name="settings"), path("settings/", SettingsView.as_view(), name="settings"),

View file

@ -2,7 +2,7 @@ from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import redirect, get_object_or_404
from django.views.generic import ListView, CreateView, DeleteView, View, TemplateView from django.views.generic import ListView, CreateView, DeleteView, View, TemplateView, UpdateView
from accounts.models import FriendCode from accounts.models import FriendCode
from accounts.forms import FriendCodeForm from accounts.forms import FriendCodeForm
from django.db.models import Case, When, Value, BooleanField from django.db.models import Case, When, Value, BooleanField
@ -128,3 +128,24 @@ class SettingsView(LoginRequiredMixin, TemplateView):
Display the user's settings. Display the user's settings.
""" """
template_name = "account/settings.html" template_name = "account/settings.html"
class EditFriendCodeView(LoginRequiredMixin, UpdateView):
"""
Edit the in-game name for a friend code.
The friend code itself is displayed as plain text.
Also includes "Set Default" and "Delete" buttons in the template.
"""
model = FriendCode
# Only the in_game_name field is editable
fields = ['in_game_name']
template_name = "friend_codes/edit_friend_code.html"
context_object_name = "friend_code"
success_url = reverse_lazy("list_friend_codes")
def get_queryset(self):
# Ensure the user can only edit their own friend codes
return FriendCode.objects.filter(user=self.request.user)
def form_valid(self, form):
messages.success(self.request, "Friend code updated successfully.")
return super().form_valid(form)

View file

@ -0,0 +1,50 @@
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Edit Friend Code{% endblock %}
{% block content %}
<div class="container mx-auto max-w-3xl mt-6">
<h1 class="text-3xl font-bold mb-4">Edit Friend Code</h1>
<!-- Display the friend code as plain text -->
<div class="mb-4 p-4 bg-base-100 dark:bg-base-900 rounded shadow">
<span class="font-mono text-sm sm:text-base">Friend Code: {{ friend_code.friend_code }}</span>
</div>
<!-- Update form for editing the in-game name -->
<form method="post" novalidate id="edit-friendcode-form">
{% csrf_token %}
<div class="mb-4">
{{ form.in_game_name.as_widget }}
{% if form.in_game_name.errors %}
<div class="text-red-600 text-sm">
{{ form.in_game_name.errors }}
</div>
{% endif %}
</div>
</form>
<div class="flex flex-col md:flex-row justify-between items-center mt-6">
<!-- Left group: Set Default & Delete -->
<div class="flex items-center space-x-4">
<form method="post" action="{% url 'change_default_friend_code' friend_code.id %}" class="inline">
{% csrf_token %}
{% if not friend_code.is_default %}
<button type="submit" class="btn btn-secondary">Set as Default</button>
{% else %}
<button type="button" class="btn btn-secondary" disabled>Default</button>
{% endif %}
</form>
<a href="{% url 'delete_friend_code' friend_code.id %}" class="btn btn-error">Delete</a>
</div>
<!-- Right group: Cancel & Update -->
<div class="flex items-center space-x-4 mt-4 md:mt-0">
<a href="{% url 'list_friend_codes' %}" class="btn btn-secondary">Cancel</a>
<!-- This update button is outside the form but tied to it with the HTML5 'form' attribute -->
<button type="submit" form="edit-friendcode-form" class="btn btn-primary">Update</button>
</div>
</div>
</div>
{% endblock %}

View file

@ -11,22 +11,22 @@
{% for code in friend_codes %} {% for code in friend_codes %}
<li class="w-full grid grid-cols-2 grid-rows-2 md:grid-cols-8 md:grid-rows-1 items-center {% if code.is_default %}bg-green-200 dark:bg-green-300 dark:text-base-100{% else %}bg-base-100 dark:bg-base-900 dark:text-white{% endif %} p-4 rounded shadow"> <li class="w-full grid grid-cols-2 grid-rows-2 md:grid-cols-8 md:grid-rows-1 items-center {% if code.is_default %}bg-green-200 dark:bg-green-300 dark:text-base-100{% else %}bg-base-100 dark:bg-base-900 dark:text-white{% endif %} p-4 rounded shadow">
<div class="row-start-1 md:col-span-3"> <div class="row-start-1 md:col-span-3">
<span>{{ code.in_game_name }}</span> <span class="align-baseline"><a href="{% url 'edit_friend_code' code.id %}">{{ code.in_game_name }}</a></span>
{% if code.is_default %} {% if code.is_default %}
<span class="badge badge-success ml-2">Default</span> <span class="badge badge-success ml-2 align-baseline">Default</span>
{% endif %} {% endif %}
</div> </div>
<div class="row-start-2 col-start-1 md:row-start-1 md:col-span-3 {% if not code.is_default %}mr-4{% endif %}"> <div class="row-start-2 col-start-1 md:row-start-1 md:col-span-3 {% if not code.is_default %}mr-4{% endif %}">
<span class="font-mono text-sm sm:text-base">{{ code.friend_code }}</span> <span class="font-mono text-sm sm:text-base align-baseline">{{ code.friend_code }}</span>
</div> </div>
<div class="row-start-2 col-start-2 md:row-start-1 md:col-span-2 flex justify-end space-x-2"> <div class="row-start-2 col-start-2 md:row-start-1 md:col-span-2 flex justify-end space-x-2">
{% if not code.is_default %} {% if not code.is_default %}
<form method="post" action="{% url 'change_default_friend_code' code.id %}"> <form method="post" action="{% url 'change_default_friend_code' code.id %}">
{% csrf_token %} {% csrf_token %}
<button type="submit" class="btn btn-secondary btn-sm">Set Default</button> <button type="submit" class="btn btn-secondary btn-sm align-baseline">Set Default</button>
</form> </form>
{% endif %} {% endif %}
<a href="{% url 'delete_friend_code' code.id %}" class="btn btn-error btn-sm">Delete</a> <a href="{% url 'delete_friend_code' code.id %}" class="btn btn-error btn-sm align-baseline">Delete</a>
</div> </div>
</li> </li>
{% endfor %} {% endfor %}