Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 35 additions & 46 deletions src/unfold/fields.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from typing import Any

from django.contrib.admin import helpers
from django.contrib.admin.utils import lookup_field, quote
from django.core.exceptions import ObjectDoesNotExist
Expand All @@ -20,14 +22,15 @@

from unfold.settings import get_config
from unfold.utils import display_for_field, prettify_json
from unfold.widgets import (
CHECKBOX_LABEL_CLASSES,
INPUT_CLASSES,
LABEL_CLASSES,
)
from unfold.widgets import CHECKBOX_LABEL_CLASSES, INPUT_CLASSES, LABEL_CLASSES


class UnfoldAdminReadonlyField(helpers.AdminReadonlyField):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)

self.resolved_field = self._resolve_field()

def label_tag(self) -> SafeText:
attrs = {
"class": " ".join(LABEL_CLASSES + ["mb-2"]),
Expand All @@ -39,56 +42,36 @@ def label_tag(self) -> SafeText:

@property
def url(self) -> str | bool:
field, obj, model_admin = (
self.field["field"],
self.form.instance,
self.model_admin,
)

try:
f, attr, value = lookup_field(field, obj, model_admin)
except (AttributeError, ValueError, ObjectDoesNotExist):
return False

if not self.is_file():
if not self.is_file:
return False

if hasattr(obj, field):
field_value = getattr(obj, field)
if hasattr(self.form.instance, self.field["field"]):
field_value = getattr(self.form.instance, self.field["field"])

if field_value and hasattr(field_value, "url"):
return field_value.url

return False

@property
def is_json(self) -> bool:
field, obj, model_admin = (
self.field["field"],
self.form.instance,
self.model_admin,
)

try:
f, attr, value = lookup_field(field, obj, model_admin)
except (AttributeError, ValueError, ObjectDoesNotExist):
if not self.resolved_field:
return False

f, attr, value = self.resolved_field

return isinstance(f, JSONField)

@property
def is_image(self) -> bool:
field, obj, model_admin = (
self.field["field"],
self.form.instance,
self.model_admin,
)

try:
f, attr, value = lookup_field(field, obj, model_admin)
except (AttributeError, ValueError, ObjectDoesNotExist):
if not self.resolved_field:
return False

f, attr, value = self.resolved_field

if hasattr(attr, "image"):
return attr.image

elif (
isinstance(attr, property)
and hasattr(attr, "fget")
Expand All @@ -98,18 +81,12 @@ def is_image(self) -> bool:

return isinstance(f, ImageField)

@property
def is_file(self) -> bool:
field, obj, model_admin = (
self.field["field"],
self.form.instance,
self.model_admin,
)

try:
f, attr, value = lookup_field(field, obj, model_admin)
except (AttributeError, ValueError, ObjectDoesNotExist):
if not self.resolved_field:
return False

f, attr, value = self.resolved_field
return isinstance(f, ImageField | FileField)

def contents(self) -> str:
Expand Down Expand Up @@ -202,6 +179,18 @@ def _preprocess_field(self, contents: str) -> str:

return contents

def _resolve_field(self) -> bool | list:
field, obj, model_admin = (
self.field["field"],
self.form.instance,
self.model_admin,
)

try:
return lookup_field(field, obj, model_admin)
except (AttributeError, ValueError, ObjectDoesNotExist):
return False


class UnfoldAdminField(helpers.AdminField):
def __init__(self, *args, **kwargs):
Expand Down