Source code for useful_inkleby.useful_django.admin.io

'''
Helper decorators for working with django_import_export.

Fixes issue with pre-20th c dates until there's a fix in main import_export

'''
from django.contrib import admin
try:
    from import_export import resources
except:
    import_export = None

from django.utils import datetime_safe
from import_export import widgets
import functools


[docs]class PastSafeDateTimeWidget(widgets.DateTimeWidget):
[docs] def render(self, value): if not value: return "" try: return value.strftime(self.formats[0]) except: return datetime_safe.new_date(value).strftime(self.formats[0])
[docs]class PastSafeModelResource(resources.ModelResource): """ Minor tweak to fix pre 1900 date issue """
[docs] @classmethod def widget_from_django_field(cls, f, default=widgets.Widget): """ Returns the widget that would likely be associated with each Django type. """ result = default internal_type = f.get_internal_type() if internal_type in ('ManyToManyField', ): result = functools.partial(widgets.ManyToManyWidget, model=f.rel.to) if internal_type in ('ForeignKey', 'OneToOneField', ): result = functools.partial(widgets.ForeignKeyWidget, model=f.rel.to) if internal_type in ('DecimalField', ): result = widgets.DecimalWidget if internal_type in ('DateTimeField', ): result = PastSafeDateTimeWidget elif internal_type in ('DateField', ): result = widgets.DateWidget elif internal_type in ('IntegerField', 'PositiveIntegerField', 'BigIntegerField', 'PositiveSmallIntegerField', 'SmallIntegerField', 'AutoField'): result = widgets.IntegerWidget elif internal_type in ('BooleanField', 'NullBooleanField'): result = widgets.BooleanWidget return result
[docs]def construct_model_resource(passed_model): class LocalResource(PastSafeModelResource): class Meta: model = passed_model return LocalResource
[docs]def io_admin_register(passed_model): """ filter that registers ImportExportModelAdmin and assigns them a blank model_resource """ model_resource = construct_model_resource(passed_model) def inner(admin_cls): class ModelAdmin(admin_cls): resource_class = model_resource admin.site.register(passed_model,ModelAdmin) return ModelAdmin return inner