mirror of
https://github.com/eitchtee/WYGIWYH.git
synced 2026-01-17 22:46:41 +01:00
77 lines
3.3 KiB
Python
77 lines
3.3 KiB
Python
from import_export.widgets import ForeignKeyWidget
|
|
|
|
|
|
class AllObjectsForeignKeyWidget(ForeignKeyWidget):
|
|
"""
|
|
ForeignKeyWidget that uses 'all_objects' manager for lookups,
|
|
bypassing user-filtered managers like SharedObjectManager.
|
|
Also filters by owner if available in the row data.
|
|
"""
|
|
|
|
def get_queryset(self, value, row, *args, **kwargs):
|
|
# Use all_objects manager if available, otherwise fall back to default
|
|
if hasattr(self.model, "all_objects"):
|
|
qs = self.model.all_objects.all()
|
|
# Filter by owner if the row has an owner field and the model has owner
|
|
if row:
|
|
# Check for direct owner field first
|
|
owner_id = row.get("owner") if "owner" in row else None
|
|
# Fall back to account_owner for models like InstallmentPlan
|
|
if not owner_id and "account_owner" in row:
|
|
owner_id = row.get("account_owner")
|
|
# If still no owner, try to get it from the existing record's account
|
|
# This handles backward compatibility with older exports
|
|
if not owner_id and "id" in row and row.get("id"):
|
|
try:
|
|
# Try to find the existing record and get owner from its account
|
|
from apps.transactions.models import (
|
|
InstallmentPlan,
|
|
RecurringTransaction,
|
|
)
|
|
|
|
record_id = row.get("id")
|
|
# Try to find the existing InstallmentPlan or RecurringTransaction
|
|
for model_class in [InstallmentPlan, RecurringTransaction]:
|
|
try:
|
|
existing = model_class.all_objects.get(id=record_id)
|
|
if existing.account:
|
|
owner_id = existing.account.owner_id
|
|
break
|
|
except model_class.DoesNotExist:
|
|
continue
|
|
except Exception:
|
|
pass
|
|
# Final fallback: use the current logged-in user
|
|
# This handles restoring to a fresh database with older exports
|
|
if not owner_id:
|
|
from apps.common.middleware.thread_local import get_current_user
|
|
|
|
user = get_current_user()
|
|
if user and user.is_authenticated:
|
|
owner_id = user.id
|
|
if owner_id:
|
|
qs = qs.filter(owner_id=owner_id)
|
|
return qs
|
|
return super().get_queryset(value, row, *args, **kwargs)
|
|
|
|
|
|
class AutoCreateForeignKeyWidget(ForeignKeyWidget):
|
|
def clean(self, value, row=None, *args, **kwargs):
|
|
if value:
|
|
try:
|
|
return super().clean(value, row, **kwargs)
|
|
except self.model.DoesNotExist:
|
|
return self.model.objects.create(name=value)
|
|
return None
|
|
|
|
|
|
class SkipMissingForeignKeyWidget(ForeignKeyWidget):
|
|
def clean(self, value, row=None, *args, **kwargs):
|
|
if not value:
|
|
return None
|
|
|
|
try:
|
|
return super().clean(value, row, *args, **kwargs)
|
|
except self.model.DoesNotExist:
|
|
return None
|