feat: Introduce lists and reviews apps, refactor user list functionality from accounts, and add user profile fields.

This commit is contained in:
pacnpal
2025-12-26 09:27:44 -05:00
parent ed04b30469
commit cd8868a591
37 changed files with 5900 additions and 281 deletions

View File

@@ -0,0 +1,750 @@
# Generated by Django 5.1.6 on 2025-12-26 14:10
import apps.core.state_machine.fields
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
("moderation", "0007_convert_status_to_richfsmfield"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterModelOptions(
name="bulkoperation",
options={
"ordering": ["-created_at"],
"verbose_name": "Bulk Operation",
"verbose_name_plural": "Bulk Operations",
},
),
migrations.AlterModelOptions(
name="editsubmission",
options={
"ordering": ["-created_at"],
"verbose_name": "Edit Submission",
"verbose_name_plural": "Edit Submissions",
},
),
migrations.AlterModelOptions(
name="moderationaction",
options={
"ordering": ["-created_at"],
"verbose_name": "Moderation Action",
"verbose_name_plural": "Moderation Actions",
},
),
migrations.AlterModelOptions(
name="moderationqueue",
options={
"ordering": ["priority", "created_at"],
"verbose_name": "Moderation Queue Item",
"verbose_name_plural": "Moderation Queue Items",
},
),
migrations.AlterModelOptions(
name="moderationreport",
options={
"ordering": ["-created_at"],
"verbose_name": "Moderation Report",
"verbose_name_plural": "Moderation Reports",
},
),
migrations.AlterModelOptions(
name="photosubmission",
options={
"ordering": ["-created_at"],
"verbose_name": "Photo Submission",
"verbose_name_plural": "Photo Submissions",
},
),
migrations.AlterField(
model_name="bulkoperation",
name="completed_at",
field=models.DateTimeField(
blank=True, help_text="When this operation completed", null=True
),
),
migrations.AlterField(
model_name="bulkoperation",
name="created_by",
field=models.ForeignKey(
help_text="User who created this operation",
on_delete=django.db.models.deletion.CASCADE,
related_name="bulk_operations_created",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="bulkoperation",
name="started_at",
field=models.DateTimeField(
blank=True, help_text="When this operation started", null=True
),
),
migrations.AlterField(
model_name="bulkoperation",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this operation was last updated"
),
),
migrations.AlterField(
model_name="bulkoperationevent",
name="completed_at",
field=models.DateTimeField(
blank=True, help_text="When this operation completed", null=True
),
),
migrations.AlterField(
model_name="bulkoperationevent",
name="created_by",
field=models.ForeignKey(
db_constraint=False,
help_text="User who created this operation",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="bulkoperationevent",
name="started_at",
field=models.DateTimeField(
blank=True, help_text="When this operation started", null=True
),
),
migrations.AlterField(
model_name="bulkoperationevent",
name="status",
field=apps.core.state_machine.fields.RichFSMField(
allow_deprecated=False,
choice_group="bulk_operation_statuses",
choices=[
("PENDING", "Pending"),
("RUNNING", "Running"),
("COMPLETED", "Completed"),
("FAILED", "Failed"),
("CANCELLED", "Cancelled"),
],
default="PENDING",
domain="moderation",
max_length=20,
),
),
migrations.AlterField(
model_name="bulkoperationevent",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this operation was last updated"
),
),
migrations.AlterField(
model_name="editsubmission",
name="content_type",
field=models.ForeignKey(
help_text="Type of object being edited",
on_delete=django.db.models.deletion.CASCADE,
to="contenttypes.contenttype",
),
),
migrations.AlterField(
model_name="editsubmission",
name="handled_at",
field=models.DateTimeField(
blank=True, help_text="When this submission was handled", null=True
),
),
migrations.AlterField(
model_name="editsubmission",
name="handled_by",
field=models.ForeignKey(
blank=True,
help_text="Moderator who handled this submission",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="handled_submissions",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="editsubmission",
name="object_id",
field=models.PositiveIntegerField(
blank=True,
help_text="ID of object being edited (null for new objects)",
null=True,
),
),
migrations.AlterField(
model_name="editsubmission",
name="user",
field=models.ForeignKey(
help_text="User who submitted this edit",
on_delete=django.db.models.deletion.CASCADE,
related_name="edit_submissions",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="editsubmissionevent",
name="content_type",
field=models.ForeignKey(
db_constraint=False,
help_text="Type of object being edited",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="contenttypes.contenttype",
),
),
migrations.AlterField(
model_name="editsubmissionevent",
name="handled_at",
field=models.DateTimeField(
blank=True, help_text="When this submission was handled", null=True
),
),
migrations.AlterField(
model_name="editsubmissionevent",
name="handled_by",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="Moderator who handled this submission",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="editsubmissionevent",
name="object_id",
field=models.PositiveIntegerField(
blank=True,
help_text="ID of object being edited (null for new objects)",
null=True,
),
),
migrations.AlterField(
model_name="editsubmissionevent",
name="status",
field=apps.core.state_machine.fields.RichFSMField(
allow_deprecated=False,
choice_group="edit_submission_statuses",
choices=[
("PENDING", "Pending"),
("APPROVED", "Approved"),
("REJECTED", "Rejected"),
("ESCALATED", "Escalated"),
],
default="PENDING",
domain="moderation",
max_length=20,
),
),
migrations.AlterField(
model_name="editsubmissionevent",
name="user",
field=models.ForeignKey(
db_constraint=False,
help_text="User who submitted this edit",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationaction",
name="created_at",
field=models.DateTimeField(
auto_now_add=True, help_text="When this action was created"
),
),
migrations.AlterField(
model_name="moderationaction",
name="moderator",
field=models.ForeignKey(
help_text="Moderator who took this action",
on_delete=django.db.models.deletion.CASCADE,
related_name="moderation_actions_taken",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationaction",
name="related_report",
field=models.ForeignKey(
blank=True,
help_text="Related moderation report",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="actions_taken",
to="moderation.moderationreport",
),
),
migrations.AlterField(
model_name="moderationaction",
name="target_user",
field=models.ForeignKey(
help_text="User this action was taken against",
on_delete=django.db.models.deletion.CASCADE,
related_name="moderation_actions_received",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationaction",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this action was last updated"
),
),
migrations.AlterField(
model_name="moderationactionevent",
name="created_at",
field=models.DateTimeField(
auto_now_add=True, help_text="When this action was created"
),
),
migrations.AlterField(
model_name="moderationactionevent",
name="moderator",
field=models.ForeignKey(
db_constraint=False,
help_text="Moderator who took this action",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationactionevent",
name="related_report",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="Related moderation report",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="moderation.moderationreport",
),
),
migrations.AlterField(
model_name="moderationactionevent",
name="target_user",
field=models.ForeignKey(
db_constraint=False,
help_text="User this action was taken against",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationactionevent",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this action was last updated"
),
),
migrations.AlterField(
model_name="moderationqueue",
name="assigned_at",
field=models.DateTimeField(
blank=True, help_text="When this item was assigned", null=True
),
),
migrations.AlterField(
model_name="moderationqueue",
name="assigned_to",
field=models.ForeignKey(
blank=True,
help_text="Moderator assigned to this item",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="assigned_queue_items",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationqueue",
name="created_at",
field=models.DateTimeField(
auto_now_add=True, help_text="When this item was created"
),
),
migrations.AlterField(
model_name="moderationqueue",
name="flagged_by",
field=models.ForeignKey(
blank=True,
help_text="User who flagged this item",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="flagged_queue_items",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationqueue",
name="related_report",
field=models.ForeignKey(
blank=True,
help_text="Related moderation report",
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="queue_items",
to="moderation.moderationreport",
),
),
migrations.AlterField(
model_name="moderationqueue",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this item was last updated"
),
),
migrations.AlterField(
model_name="moderationqueueevent",
name="assigned_at",
field=models.DateTimeField(
blank=True, help_text="When this item was assigned", null=True
),
),
migrations.AlterField(
model_name="moderationqueueevent",
name="assigned_to",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="Moderator assigned to this item",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationqueueevent",
name="created_at",
field=models.DateTimeField(
auto_now_add=True, help_text="When this item was created"
),
),
migrations.AlterField(
model_name="moderationqueueevent",
name="flagged_by",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="User who flagged this item",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationqueueevent",
name="related_report",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="Related moderation report",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="moderation.moderationreport",
),
),
migrations.AlterField(
model_name="moderationqueueevent",
name="status",
field=apps.core.state_machine.fields.RichFSMField(
allow_deprecated=False,
choice_group="moderation_queue_statuses",
choices=[
("PENDING", "Pending"),
("IN_PROGRESS", "In Progress"),
("COMPLETED", "Completed"),
("CANCELLED", "Cancelled"),
],
default="PENDING",
domain="moderation",
max_length=20,
),
),
migrations.AlterField(
model_name="moderationqueueevent",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this item was last updated"
),
),
migrations.AlterField(
model_name="moderationreport",
name="assigned_moderator",
field=models.ForeignKey(
blank=True,
help_text="Moderator assigned to handle this report",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="assigned_moderation_reports",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationreport",
name="created_at",
field=models.DateTimeField(
auto_now_add=True, help_text="When this report was created"
),
),
migrations.AlterField(
model_name="moderationreport",
name="reported_by",
field=models.ForeignKey(
help_text="User who made this report",
on_delete=django.db.models.deletion.CASCADE,
related_name="moderation_reports_made",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationreport",
name="resolved_at",
field=models.DateTimeField(
blank=True, help_text="When this report was resolved", null=True
),
),
migrations.AlterField(
model_name="moderationreport",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this report was last updated"
),
),
migrations.AlterField(
model_name="moderationreportevent",
name="assigned_moderator",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="Moderator assigned to handle this report",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationreportevent",
name="created_at",
field=models.DateTimeField(
auto_now_add=True, help_text="When this report was created"
),
),
migrations.AlterField(
model_name="moderationreportevent",
name="reported_by",
field=models.ForeignKey(
db_constraint=False,
help_text="User who made this report",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="moderationreportevent",
name="resolved_at",
field=models.DateTimeField(
blank=True, help_text="When this report was resolved", null=True
),
),
migrations.AlterField(
model_name="moderationreportevent",
name="status",
field=apps.core.state_machine.fields.RichFSMField(
allow_deprecated=False,
choice_group="moderation_report_statuses",
choices=[
("PENDING", "Pending Review"),
("UNDER_REVIEW", "Under Review"),
("RESOLVED", "Resolved"),
("DISMISSED", "Dismissed"),
],
default="PENDING",
domain="moderation",
max_length=20,
),
),
migrations.AlterField(
model_name="moderationreportevent",
name="updated_at",
field=models.DateTimeField(
auto_now=True, help_text="When this report was last updated"
),
),
migrations.AlterField(
model_name="photosubmission",
name="caption",
field=models.CharField(
blank=True, help_text="Photo caption", max_length=255
),
),
migrations.AlterField(
model_name="photosubmission",
name="content_type",
field=models.ForeignKey(
help_text="Type of object this photo is for",
on_delete=django.db.models.deletion.CASCADE,
to="contenttypes.contenttype",
),
),
migrations.AlterField(
model_name="photosubmission",
name="date_taken",
field=models.DateField(
blank=True, help_text="Date the photo was taken", null=True
),
),
migrations.AlterField(
model_name="photosubmission",
name="handled_at",
field=models.DateTimeField(
blank=True, help_text="When this submission was handled", null=True
),
),
migrations.AlterField(
model_name="photosubmission",
name="handled_by",
field=models.ForeignKey(
blank=True,
help_text="Moderator who handled this submission",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="handled_photos",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="photosubmission",
name="object_id",
field=models.PositiveIntegerField(
help_text="ID of object this photo is for"
),
),
migrations.AlterField(
model_name="photosubmission",
name="user",
field=models.ForeignKey(
help_text="User who submitted this photo",
on_delete=django.db.models.deletion.CASCADE,
related_name="photo_submissions",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="caption",
field=models.CharField(
blank=True, help_text="Photo caption", max_length=255
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="content_type",
field=models.ForeignKey(
db_constraint=False,
help_text="Type of object this photo is for",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="contenttypes.contenttype",
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="date_taken",
field=models.DateField(
blank=True, help_text="Date the photo was taken", null=True
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="handled_at",
field=models.DateTimeField(
blank=True, help_text="When this submission was handled", null=True
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="handled_by",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="Moderator who handled this submission",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="object_id",
field=models.PositiveIntegerField(
help_text="ID of object this photo is for"
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="status",
field=apps.core.state_machine.fields.RichFSMField(
allow_deprecated=False,
choice_group="photo_submission_statuses",
choices=[
("PENDING", "Pending"),
("APPROVED", "Approved"),
("REJECTED", "Rejected"),
("ESCALATED", "Escalated"),
],
default="PENDING",
domain="moderation",
max_length=20,
),
),
migrations.AlterField(
model_name="photosubmissionevent",
name="user",
field=models.ForeignKey(
db_constraint=False,
help_text="User who submitted this photo",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
]