diff --git a/vrobbler/apps/people/migrations/0003_person_created_by.py b/vrobbler/apps/people/migrations/0003_person_created_by.py new file mode 100644 index 0000000..c8bf658 --- /dev/null +++ b/vrobbler/apps/people/migrations/0003_person_created_by.py @@ -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, + ), + ), + ] diff --git a/vrobbler/apps/people/models.py b/vrobbler/apps/people/models.py index 3f01094..2109ff7 100644 --- a/vrobbler/apps/people/models.py +++ b/vrobbler/apps/people/models.py @@ -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) diff --git a/vrobbler/apps/people/urls.py b/vrobbler/apps/people/urls.py new file mode 100644 index 0000000..88be3d2 --- /dev/null +++ b/vrobbler/apps/people/urls.py @@ -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//edit/", + views.PersonUpdateView.as_view(), + name="person_edit", + ), +] diff --git a/vrobbler/apps/people/views.py b/vrobbler/apps/people/views.py new file mode 100644 index 0000000..77527de --- /dev/null +++ b/vrobbler/apps/people/views.py @@ -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 diff --git a/vrobbler/templates/people/person_form.html b/vrobbler/templates/people/person_form.html new file mode 100644 index 0000000..9a8485a --- /dev/null +++ b/vrobbler/templates/people/person_form.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} +{% block content %} +
+
+

People

+
+ +
+
+

Add Person

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+ +
+

Your People

+
    + {% for person in people %} +
  • + {{ person.name }} + Edit +
  • + {% empty %} +
  • No people yet.
  • + {% endfor %} +
+
+
+
+{% endblock %} diff --git a/vrobbler/urls.py b/vrobbler/urls.py index a43b035..7e50147 100644 --- a/vrobbler/urls.py +++ b/vrobbler/urls.py @@ -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(