fixed a bunch of things, hopefully didn't break things

This commit is contained in:
pacnpal
2024-11-05 21:51:02 +00:00
parent 2e8a725933
commit eb5d2acab5
30 changed files with 944 additions and 569 deletions

View File

@@ -1,9 +1,15 @@
from typing import Any, Dict, Optional, Type, Union, cast
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.conf import settings
from django.utils import timezone
from django.apps import apps
from django.core.exceptions import ObjectDoesNotExist, FieldDoesNotExist
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import AnonymousUser
UserType = Union[AbstractBaseUser, AnonymousUser]
class EditSubmission(models.Model):
STATUS_CHOICES = [
@@ -78,60 +84,76 @@ class EditSubmission(models.Model):
models.Index(fields=['status']),
]
def __str__(self):
def __str__(self) -> str:
action = "creation" if self.submission_type == 'CREATE' else "edit"
target = self.content_object or self.content_type.model_class().__name__
model_class = self.content_type.model_class()
target = self.content_object or (model_class.__name__ if model_class else 'Unknown')
return f"{action} by {self.user.username} on {target}"
def _resolve_foreign_keys(self, data):
def _resolve_foreign_keys(self, data: Dict[str, Any]) -> Dict[str, Any]:
"""Convert foreign key IDs to model instances"""
model_class = self.content_type.model_class()
if not model_class:
raise ValueError("Could not resolve model class")
resolved_data = data.copy()
for field_name, value in data.items():
field = model_class._meta.get_field(field_name)
if isinstance(field, models.ForeignKey) and value is not None:
related_model = field.related_model
resolved_data[field_name] = related_model.objects.get(id=value)
try:
field = model_class._meta.get_field(field_name)
if isinstance(field, models.ForeignKey) and value is not None:
related_model = field.related_model
if related_model:
resolved_data[field_name] = related_model.objects.get(id=value)
except (FieldDoesNotExist, ObjectDoesNotExist):
continue
return resolved_data
def approve(self, user):
def approve(self, user: UserType) -> Optional[models.Model]:
"""Approve the submission and apply the changes"""
self.status = 'APPROVED'
self.handled_by = user
self.handled_by = user # type: ignore
self.handled_at = timezone.now()
model_class = self.content_type.model_class()
resolved_data = self._resolve_foreign_keys(self.changes)
if not model_class:
raise ValueError("Could not resolve model class")
if self.submission_type == 'CREATE':
# Create new object
obj = model_class(**resolved_data)
obj.save()
# Update object_id after creation
self.object_id = obj.id
else:
# Apply changes to existing object
obj = self.content_object
for field, value in resolved_data.items():
setattr(obj, field, value)
obj.save()
self.save()
return obj
try:
resolved_data = self._resolve_foreign_keys(self.changes)
def reject(self, user):
if self.submission_type == 'CREATE':
# Create new object
obj = model_class(**resolved_data)
obj.save()
# Update object_id after creation
self.object_id = getattr(obj, 'id', None)
else:
# Apply changes to existing object
obj = self.content_object
if not obj:
raise ValueError("Content object not found")
for field, value in resolved_data.items():
setattr(obj, field, value)
obj.save()
self.save()
return obj
except Exception as e:
raise ValueError(f"Error approving submission: {str(e)}") from e
def reject(self, user: UserType) -> None:
"""Reject the submission"""
self.status = 'REJECTED'
self.handled_by = user
self.handled_by = user # type: ignore
self.handled_at = timezone.now()
self.save()
def escalate(self, user):
def escalate(self, user: UserType) -> None:
"""Escalate the submission to admin"""
self.status = 'ESCALATED'
self.handled_by = user
self.handled_by = user # type: ignore
self.handled_at = timezone.now()
self.save()
@@ -189,15 +211,15 @@ class PhotoSubmission(models.Model):
models.Index(fields=['status']),
]
def __str__(self):
def __str__(self) -> str:
return f"Photo submission by {self.user.username} for {self.content_object}"
def approve(self, moderator, notes=''):
def approve(self, moderator: UserType, notes: str = '') -> None:
"""Approve the photo submission"""
from media.models import Photo
self.status = 'APPROVED'
self.handled_by = moderator
self.handled_by = moderator # type: ignore
self.handled_at = timezone.now()
self.notes = notes
@@ -213,15 +235,15 @@ class PhotoSubmission(models.Model):
self.save()
def reject(self, moderator, notes):
def reject(self, moderator: UserType, notes: str) -> None:
"""Reject the photo submission"""
self.status = 'REJECTED'
self.handled_by = moderator
self.handled_by = moderator # type: ignore
self.handled_at = timezone.now()
self.notes = notes
self.save()
def auto_approve(self):
def auto_approve(self) -> None:
"""Auto-approve the photo submission (for moderators/admins)"""
from media.models import Photo