[people] Add a create/edit page for people

This commit is contained in:
2026-03-21 11:07:37 -04:00
parent 851c747a60
commit 8bfc5646f9
6 changed files with 118 additions and 3 deletions

View File

@ -0,0 +1,27 @@
# Generated by Django 4.2.29 on 2026-03-21 15:06
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("people", "0002_remove_person_bgstat_id_person_bgstats_id"),
]
operations = [
migrations.AddField(
model_name="person",
name="created_by",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="created_people",
to=settings.AUTH_USER_MODEL,
),
),
]

View File

@ -10,6 +10,9 @@ class Person(TimeStampedModel):
"""A non-system user model that can be optionally associated with a User."""
user = models.ForeignKey(User, on_delete=models.DO_NOTHING, **BNULL)
created_by = models.ForeignKey(
User, on_delete=models.DO_NOTHING, **BNULL, related_name="created_people"
)
name = models.CharField(max_length=100, **BNULL)
bgstats_id = models.UUIDField(**BNULL)
bgg_username = models.CharField(max_length=100, **BNULL)

View File

@ -0,0 +1,14 @@
from django.urls import path
from people import views
app_name = "people"
urlpatterns = [
path("people/", views.PersonCreateUpdateView.as_view(), name="person_form"),
path(
"people/<int:pk>/edit/",
views.PersonUpdateView.as_view(),
name="person_edit",
),
]

View File

@ -0,0 +1,37 @@
from django.views import generic
from django.urls import reverse_lazy
from people.models import Person
class PersonCreateUpdateView(generic.CreateView):
model = Person
fields = ["name", "bgstats_id", "bgg_username", "lichess_username", "bio"]
template_name = "people/person_form.html"
success_url = reverse_lazy("people:person_form")
def get_initial(self):
initial = super().get_initial()
initial["created_by"] = self.request.user
return initial
def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)
context_data["people"] = Person.objects.filter(created_by=self.request.user)
return context_data
def form_valid(self, form):
form.instance.created_by = self.request.user
return super().form_valid(form)
class PersonUpdateView(generic.UpdateView):
model = Person
fields = ["name", "bgstats_id", "bgg_username", "lichess_username", "bio"]
template_name = "people/person_form.html"
success_url = reverse_lazy("people:person_form")
def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)
context_data["people"] = Person.objects.filter(created_by=self.request.user)
return context_data

View File

@ -0,0 +1,33 @@
{% extends "base.html" %}
{% block content %}
<main class="col-md-4 ms-sm-auto col-lg-10 px-md-4">
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
<h1 class="h2">People</h1>
</div>
<div class="row">
<div class="col-md-4">
<h3>Add Person</h3>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
</div>
<div class="col-md-8">
<h3>Your People</h3>
<ul>
{% for person in people %}
<li>
{{ person.name }}
<a href="{% url 'people:person_edit' person.pk %}">Edit</a>
</li>
{% empty %}
<li>No people yet.</li>
{% endfor %}
</ul>
</div>
</div>
</main>
{% endblock %}

View File

@ -97,6 +97,8 @@ from vrobbler.apps.bricksets.api.views import BrickSetViewSet
from vrobbler.apps.webpages import urls as webpages_urls
from vrobbler.apps.webpages.api.views import DomainViewSet, WebPageViewSet
from vrobbler.apps.people import urls as people_urls
# from vrobbler.apps.modern_ui import urls as modern_ui_urls
router = routers.DefaultRouter()
@ -167,9 +169,8 @@ urlpatterns = [
path("", include(moods_urls, namespace="moods")),
path("", include(scrobble_urls, namespace="scrobbles")),
path("", include(profiles_urls, namespace="profiles")),
path(
"", scrobbles_views.RecentScrobbleList.as_view(), name="vrobbler-home"
),
path("", include(people_urls, namespace="people")),
path("", scrobbles_views.RecentScrobbleList.as_view(), name="vrobbler-home"),
]
if settings.DEBUG:
urlpatterns = urlpatterns + static(