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.validators

View file

@ -1,10 +1,18 @@
from django.urls import path
from .views import ListFriendCodesView, AddFriendCodeView, DeleteFriendCodeView, ChangeDefaultFriendCodeView, SettingsView
from .views import (
ListFriendCodesView,
AddFriendCodeView,
DeleteFriendCodeView,
ChangeDefaultFriendCodeView,
EditFriendCodeView,
SettingsView,
)
urlpatterns = [
# ... other account URLs ...
path("friend-codes/", ListFriendCodesView.as_view(), name="list_friend_codes"),
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/default/<int:pk>/", ChangeDefaultFriendCodeView.as_view(), name="change_default_friend_code"),
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.urls import reverse_lazy
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.forms import FriendCodeForm
from django.db.models import Case, When, Value, BooleanField
@ -127,4 +127,25 @@ class SettingsView(LoginRequiredMixin, TemplateView):
"""
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 %}
<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">
<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 %}
<span class="badge badge-success ml-2">Default</span>
<span class="badge badge-success ml-2 align-baseline">Default</span>
{% endif %}
</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 %}">
<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 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 %}
<form method="post" action="{% url 'change_default_friend_code' code.id %}">
{% 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>
{% 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>
</li>
{% endfor %}