mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 08:31:08 -05:00
fixed a bunch of things, hopefully didn't break things
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user