Hi, I am using the django_import_export package but i am not been able to
import files, the tables are related. Please find the attached
files(models, resources and admin) for your reference.

Please help me

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CALYpPT-j0jNMZYm7POFfW94fjjSkATEn_ZAYYn6kZx6Wyc3AfQ%40mail.gmail.com.
from django.db import models
from django.utils import timezone
from django.conf import settings
import decimal
from apps.product.models import *

# ________________ Permit Information Analysis ________________
class Info(models.Model):

    O_PORT = [
        ('Overland', 'Overland'),
        ('Ghana', 'Ghana'),
        ('By Air', 'By Air'),
        ('By Road', 'By Road'),
        ('Takoradi', 'Takoradi'),
        ('Tema', 'Tema'),
    ]


    PAYMENT_TYPE = [
        ('Cash Against Document', 'Cash Against Document'),
        ('Bank Draft', 'Bank Draft'),
        ('Cash Against Document', 'Cash Against Document'),
        ('Letter of Credit', 'Letter of Credit'),
        ('Wire Transfer', 'Wire Transfer'),
        ('PrePaid', 'PrePaid'),
    ]

    exporter = models.CharField(max_length=150)
    buyer = models.CharField(max_length=150)
    vessel = models.CharField(max_length=150)
    date_of_transaction = models.DateField(default=timezone.now, verbose_name="Transaction Date")
    originating_port = models.CharField(choices=O_PORT, max_length=8, default="Ghana")
    city_destination = models.CharField(max_length=150, verbose_name="City of Destination")
    country_destination = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name="Country of Destination")
    contract_number = models.CharField(max_length=150, verbose_name="Contract Number")
    a2_form = models.CharField(max_length=50, blank=True, null=True)
    payment_type = models.CharField(max_length=100)
    negotiating_bank = models.ForeignKey(Bank, on_delete=models.CASCADE)
    container_or_vehicle = models.CharField(max_length=50)
    driver_name = models.CharField(max_length=150, blank=True)

    # records on user
    added_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, editable=False, verbose_name="Added By")
    updated_by = models.CharField(max_length=50, default='Admin', null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

    permit_NUM = models.CharField(max_length=30, unique=True, verbose_name="Permit Number")

    class Meta:
        verbose_name = "Capture Permit Info"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.exporter



# ________________ Permit ________________
class Permit(models.Model):

    CONVERSION = [
        ('1.0000', '1.0000'),
        ('0.0006', '0.0006'),
        ('0.0007', '0.0007'),
        ('0.0010', '0.0010'),
        ('0.0015', '0.0015'),
    ]

    UNITS = [

        ('m2', 'm2'),
        ('m3', 'm3'),

    ]

    CURRENCY = [
        ('USD', 'USD'),
        ('GHS', 'GHS'),
        ('CFA', 'CFA'),
        ('Euro', 'Euro'),

    ]

    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    specie = models.ForeignKey(Specie, on_delete=models.CASCADE)
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE)
    info = models.ForeignKey(Info, on_delete=models.CASCADE)

    # volume
    volume = models.DecimalField(max_digits=19, decimal_places=3)
    conversion_factor = models.CharField(choices=CONVERSION, max_length=8)
    units = models.CharField(choices=UNITS, max_length=5, default='m3')
    unit_price = models.DecimalField(max_digits=19, decimal_places=2)
    currency = models.CharField(max_length=15)
    ex_rate = models.DecimalField(max_digits=19, decimal_places=4, verbose_name='Exchange Rate')


    def __str__(self):
        return self.info.exporter
    
    @property
    def my_value(self):
        val = self.volume * self.unit_price
        val = round(val, 2)
        return val

    @property
    def derived_volume(self):
        dv = self.volume * decimal.Decimal(self.conversion_factor)
        dv = round(dv, 3)
        return dv

    @property
    def euro_value(self):
        ev = self.volume * self.unit_price * self.ex_rate
        ev = round(ev, 2)
        return ev

    
from import_export import resources
from apps.permit.models import Permit, Info
from apps.product.models import *
from import_export.fields import Field
from import_export.widgets import ForeignKeyWidget
import decimal


# Resource for import nd export
class PermitResource(resources.ModelResource):
    info__exporter = Field(column_name='Exporter', attribute='info',
                           widget=ForeignKeyWidget(Info, 'exporter'))

    product__name = Field(column_name='Product', attribute='product',
                          widget=ForeignKeyWidget(Product, 'name'))
    specie__name = Field(column_name='Species', attribute='specie',
                         widget=ForeignKeyWidget(Specie, 'name'))
    grade__name = Field(column_name='Grade', attribute='grade',
                        widget=ForeignKeyWidget(Grade, 'name'))

    info__buyer = Field(column_name='Buyer', attribute='info',
                        widget=ForeignKeyWidget(Info, 'buyer'))
    info__vessel = Field(column_name='Vessel', attribute='info',
                         widget=ForeignKeyWidget(Info, 'vessel'))
    info__date_of_transaction = Field(
        column_name='Transaction_Date', attribute='info', widget=ForeignKeyWidget(Info, 'date_of_transaction'))
    info__originating_port = Field(
        column_name='O_Port', attribute='info', widget=ForeignKeyWidget(Info, 'originating_port'))
    info__city_destination = Field(
        column_name='D_City', attribute='info', widget=ForeignKeyWidget(Info, 'city_destination'))
    info__contract_number = Field(
        column_name='ContractNo', attribute='info', widget=ForeignKeyWidget(Info, 'contract_number'))
    info__a2_form = Field(column_name='FormA', attribute='info',
                          widget=ForeignKeyWidget(Info, 'a2_form'))
    info__payment_type = Field(
        column_name='Pmt_Type', attribute='info', widget=ForeignKeyWidget(Info, 'payment_type'))

    info__negotiating_bank__name = Field(
        column_name='Bank', attribute='info__negotiating_bank', widget=ForeignKeyWidget(Bank, 'name'))

    info__container_or_vehicle = Field(
        column_name='Container No', attribute='info', widget=ForeignKeyWidget(Info, 'container_or_vehicle'))
    info__driver_name = Field(column_name='Drivers_Nme', attribute='info',
                              widget=ForeignKeyWidget(Info, 'driver_name'))
    info__permit_NUM = Field(column_name='PermitNo', attribute='info',
                             widget=ForeignKeyWidget(Info, 'permit_NUM'))
    info__country_destination = Field(
        column_name='D_Country', attribute='info', widget=ForeignKeyWidget(Info, 'country_destination'))

    # conversion_factor = Field(column_name='Conversion Factor')
    # units = Field(column_name='Units')
    # unit_price = Field(column_name='Unit Price')

    # currency = Field(column_name='Currency')
    # ex_rate = Field(column_name='Exchange Rate')
    # volume = Field(column_name='Volume')

    # id = Field(column_name='ID')

    # value = Field(column_name='Value_')
    # derived_volume = Field(column_name='Derived Volume')
    # euro_value = Field(column_name='Euro Value')

    # def dehydrate_derived_volume(self, permit):
    #     ans = permit.volume * decimal.Decimal(permit.conversion_factor)
    #     return ans

    # def dehydrate_value(self, permit):
    #     val = permit.volume * permit.unit_price
    #     return val

    # def dehydrate_euro_value(self, permit):
    #     ev = permit.volume * permit.unit_price * permit.ex_rate
    #     return ev

    class Meta:
        model = Permit
        skip_unchanged = False
        report_skipped = False

        fields = (
            'info__exporter', 'info__buyer', 'info__vessel', 'info__date_of_transaction',
            'info__originating_port', 'info__city_destination', 'info__country_destination',
            'info__contract_number', 'info__permit_NUM', 'info__a2_form',
            'info__payment_type', 'info__negotiating_bank__name', 'info__container_or_vehicle',
            'info__driver_name', 'specie__name', 'product__name', 'grade__name',
            'volume', 'conversion_factor',
            'units', 'unit_price', 'currency', 'ex_rate', 'id',

        )
        export_order = (
            'id', 'info__exporter', 'info__buyer', 'info__vessel', 'info__date_of_transaction',
            'info__originating_port', 'info__city_destination', 'info__country_destination',
            'info__contract_number', 'info__permit_NUM', 'info__a2_form',
            'info__payment_type', 'info__negotiating_bank__name', 'info__container_or_vehicle',
            'info__driver_name', 'specie__name', 'product__name',  'grade__name',
            'volume', 'conversion_factor',
            'units', 'unit_price', 'currency', 'ex_rate',

        )
from django.contrib import admin
from apps.permit.models import Info, Permit
from import_export.admin import ImportExportModelAdmin
from django.contrib.auth.models import Group
from apps.permit.resources import PermitResource


from django_admin_listfilter_dropdown.filters import (
    DropdownFilter, ChoiceDropdownFilter, RelatedDropdownFilter)


class PermitInline(admin.StackedInline):
    autocomplete_fields = ['product', 'specie', 'grade']
    model = Permit
    min_num = 1
    max_num = 50
    extra = 0


@admin.register(Info)
class InfoAdmin(admin.ModelAdmin):

    # actions = None

    list_display = ('exporter', 'buyer', 'permit_NUM', 'date_of_transaction',
                    'date_added', 'added_by', 'updated_by', 'country_destination')
    search_fields = ('exporter', 'permit_NUM',)
    list_filter = ('added_by', 'date_added')
    ordering = ('-date_added',)
    date_hierarchy = 'date_of_transaction'
    list_per_page = 20
    list_display_links = ('exporter', 'buyer', 'permit_NUM')
    autocomplete_fields = ['country_destination', 'negotiating_bank']
   

    inlines = [PermitInline, ]

    fieldsets = (
        (None, {'fields': ('exporter', 'buyer',
                           'vessel', 'date_of_transaction', 'originating_port', 'negotiating_bank',
                           'city_destination', 'country_destination', 'contract_number',
                           'a2_form', 'payment_type', 'container_or_vehicle', 'driver_name', 'permit_NUM')}),
    )

    def save_model(self, request, obj, form, change):
        obj.updated_by = request.user.username

        if not obj.pk:
            # Only set added_by during the first save.
            obj.added_by = request.user

        super().save_model(request, obj, form, change)


@admin.register(Permit)
class PermitAdmin(ImportExportModelAdmin):

    # resource for export and import
    resource_class = PermitResource

    list_display = ('get_exporter', 'product', 'specie', 'grade', 'volume', 'conversion_factor',
                    'unit_price', 'currency', 'ex_rate', 'my_value', 'derived_volume', 'euro_value', 'date_of_transaction')
    list_filter = [('product', RelatedDropdownFilter), ('specie', RelatedDropdownFilter), ('grade', RelatedDropdownFilter), ('info__country_destination__west_africa', DropdownFilter), ('info__country_destination', RelatedDropdownFilter), ('info__payment_type', DropdownFilter), ]
    date_hierarchy = 'info__date_of_transaction'
    list_per_page = 20
    search_fields = ('info__exporter', 'product__name')
    ordering = ('id',)
    

    # remove the ‘Add’ button
    def has_add_permission(self, request):
        return False

    def get_exporter(self, obj):
        return obj.info.exporter

    def date_of_transaction(self, obj):
        return obj.info.date_of_transaction

    get_exporter.admin_order_field = 'exporter'  # Allows column order sorting
    get_exporter.short_description = 'Exporter'  # Renames column head
    

Reply via email to