Wednesday, February 10, 2021

Django Import and Export

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

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 django-users+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CALYpPT-j0jNMZYm7POFfW94fjjSkATEn_ZAYYn6kZx6Wyc3AfQ%40mail.gmail.com.

No comments:

Post a Comment