Add more schema extensions; importing support

This commit is contained in:
Lance Edgar 2020-07-06 21:16:01 -05:00
parent 4402d79052
commit 6ce4b59509
8 changed files with 541 additions and 37 deletions

View file

@ -81,12 +81,13 @@ class FromCOREPOSAPI(importing.Importer):
return get_core_members(self.api, progress=self.progress)
class CustomerImporter(FromCOREPOSAPI, importing.model.CustomerImporter):
class CustomerImporter(FromCOREPOSAPI, corepos_importing.model.CustomerImporter):
"""
Importer for customer data from CORE POS API.
"""
key = 'number'
key = 'corepos_account_id'
supported_fields = [
'corepos_account_id',
'id',
'number',
'name',
@ -126,6 +127,7 @@ class CustomerImporter(FromCOREPOSAPI, importing.model.CustomerImporter):
raise NotImplementedError("TODO: how to handle member with no customers?")
return {
'corepos_account_id': int(member['customerAccountID']),
'id': member['customerAccountID'],
'number': int(member['cardNo']),
'name': normalize_full_name(customer['firstName'],
@ -256,7 +258,10 @@ class CustomerPersonImporter(FromCOREPOSAPI, importing.model.CustomerPersonImpor
super(CustomerPersonImporter, self).setup()
model = self.config.get_model()
self.customers = self.cache_model(model.Customer, key='id')
query = self.session.query(model.Customer)\
.join(model.CoreCustomer)
self.customers = self.cache_model(model.Customer, query=query,
key='corepos_account_id')
query = self.session.query(model.Person)\
.join(model.CorePerson)\
@ -279,7 +284,7 @@ class CustomerPersonImporter(FromCOREPOSAPI, importing.model.CustomerPersonImpor
reverse=True)
for i, customer in enumerate(customers, 1):
normalized.append({
'customer_account_id': member['customerAccountID'],
'customer_account_id': int(member['customerAccountID']),
'person_customer_id': customer['customerID'],
'ordinal': i,
})
@ -288,13 +293,14 @@ class CustomerPersonImporter(FromCOREPOSAPI, importing.model.CustomerPersonImpor
message="Collecting CustomerPerson data from CORE")
return normalized
def get_customer(self, id):
def get_customer(self, account_id):
if hasattr(self, 'customers'):
return self.customers.get(id)
return self.customers.get(account_id)
try:
return self.session.query(model.Customer)\
.filter(model.Customer.id == id)\
.join(model.CoreCustomer)\
.filter(model.CoreCustomer.corepos_account_id == account_id)\
.one()
except NoResultFound:
pass
@ -333,12 +339,13 @@ class CustomerPersonImporter(FromCOREPOSAPI, importing.model.CustomerPersonImpor
}
class DepartmentImporter(FromCOREPOSAPI, importing.model.DepartmentImporter):
class DepartmentImporter(FromCOREPOSAPI, corepos_importing.model.DepartmentImporter):
"""
Importer for department data from CORE POS API.
"""
key = 'number'
key = 'corepos_number'
supported_fields = [
'corepos_number',
'number',
'name',
]
@ -348,17 +355,19 @@ class DepartmentImporter(FromCOREPOSAPI, importing.model.DepartmentImporter):
def normalize_host_object(self, department):
return {
'corepos_number': int(department['dept_no']),
'number': int(department['dept_no']),
'name': department['dept_name'],
}
class SubdepartmentImporter(FromCOREPOSAPI, importing.model.SubdepartmentImporter):
class SubdepartmentImporter(FromCOREPOSAPI, corepos_importing.model.SubdepartmentImporter):
"""
Importer for subdepartment data from CORE POS API.
"""
key = 'number'
key = 'corepos_number'
supported_fields = [
'corepos_number',
'number',
'name',
'department_number',
@ -373,6 +382,7 @@ class SubdepartmentImporter(FromCOREPOSAPI, importing.model.SubdepartmentImporte
department_number = int(subdepartment['dept_ID'])
return {
'corepos_number': int(subdepartment['subdept_no']),
'number': int(subdepartment['subdept_no']),
'name': subdepartment['subdept_name'],
'department_number': department_number,
@ -409,12 +419,13 @@ class VendorImporter(FromCOREPOSAPI, corepos_importing.model.VendorImporter):
}
class ProductImporter(FromCOREPOSAPI, importing.model.ProductImporter):
class ProductImporter(FromCOREPOSAPI, corepos_importing.model.ProductImporter):
"""
Importer for product data from CORE POS API.
"""
key = 'item_id'
key = 'corepos_id'
supported_fields = [
'corepos_id',
'item_id',
'upc',
'brand_name',
@ -456,6 +467,7 @@ class ProductImporter(FromCOREPOSAPI, importing.model.ProductImporter):
price = decimal.Decimal(product['normal_price'])
return {
'corepos_id': int(product['id']),
'item_id': product['upc'],
'upc': upc,
'brand_name': product.get('brand') or None,
@ -476,12 +488,13 @@ class ProductImporter(FromCOREPOSAPI, importing.model.ProductImporter):
}
class MemberImporter(FromCOREPOSAPI, importing.model.MemberImporter):
class MemberImporter(FromCOREPOSAPI, corepos_importing.model.MemberImporter):
"""
Importer for member data from CORE POS API.
"""
key = 'number'
key = 'corepos_account_id'
supported_fields = [
'corepos_account_id',
'number',
'id',
'customer_uuid',
@ -555,6 +568,7 @@ class MemberImporter(FromCOREPOSAPI, importing.model.MemberImporter):
withdrew = withdrew.date()
return {
'corepos_account_id': int(member['customerAccountID']),
'number': int(member['cardNo']),
'id': str(member['customerAccountID']),
'customer_uuid': customer.uuid,

View file

@ -115,31 +115,34 @@ class VendorImporter(FromCOREPOS, corepos_importing.model.VendorImporter):
}
class DepartmentImporter(FromCOREPOS, importing.model.DepartmentImporter):
class DepartmentImporter(FromCOREPOS, corepos_importing.model.DepartmentImporter):
"""
Importer for department data from CORE POS.
"""
host_model_class = corepos.Department
key = 'number'
key = 'corepos_number'
supported_fields = [
'corepos_number',
'number',
'name',
]
def normalize_host_object(self, department):
return {
'corepos_number': department.number,
'number': department.number,
'name': department.name,
}
class SubdepartmentImporter(FromCOREPOS, importing.model.SubdepartmentImporter):
class SubdepartmentImporter(FromCOREPOS, corepos_importing.model.SubdepartmentImporter):
"""
Importer for subdepartment data from CORE POS.
"""
host_model_class = corepos.Subdepartment
key = 'number'
key = 'corepos_number'
supported_fields = [
'corepos_number',
'number',
'name',
'department_number',
@ -147,19 +150,21 @@ class SubdepartmentImporter(FromCOREPOS, importing.model.SubdepartmentImporter):
def normalize_host_object(self, subdepartment):
return {
'corepos_number': subdepartment.number,
'number': subdepartment.number,
'name': subdepartment.name,
'department_number': subdepartment.department_number,
}
class ProductImporter(FromCOREPOS, importing.model.ProductImporter):
class ProductImporter(FromCOREPOS, corepos_importing.model.ProductImporter):
"""
Importer for product data from CORE POS.
"""
host_model_class = corepos.Product
key = 'item_id'
key = 'corepos_id'
supported_fields = [
'corepos_id',
'item_id',
'upc',
'brand_name',
@ -190,6 +195,7 @@ class ProductImporter(FromCOREPOS, importing.model.ProductImporter):
price = decimal.Decimal('{:03f}'.format(product.normal_price))
return {
'corepos_id': product.id,
'item_id': product.upc,
'upc': upc,
'brand_name': (product.brand or '').strip() or None,

View file

@ -50,9 +50,60 @@ class PersonImporter(importing.model.PersonImporter):
return query
class CustomerImporter(importing.model.CustomerImporter):
extension_attr = '_corepos'
extension_fields = [
'corepos_account_id',
]
class MemberImporter(importing.model.MemberImporter):
extension_attr = '_corepos'
extension_fields = [
'corepos_account_id',
]
class DepartmentImporter(importing.model.DepartmentImporter):
extension_attr = '_corepos'
extension_fields = [
'corepos_number',
]
class SubdepartmentImporter(importing.model.SubdepartmentImporter):
extension_attr = '_corepos'
extension_fields = [
'corepos_number',
]
class VendorImporter(importing.model.VendorImporter):
extension_attr = '_corepos'
extension_fields = [
'corepos_id',
]
class ProductImporter(importing.model.ProductImporter):
extension_attr = '_corepos'
extension_fields = [
'corepos_id',
]
def cache_query(self):
query = super(ProductImporter, self).cache_query()
model = self.config.get_model()
# we want to ignore products with no CORE ID, if that's (part of) our key
if 'corepos_id' in self.key:
query = query.join(model.CoreProduct)\
.filter(model.CoreProduct.corepos_id != None)
return query

View file

@ -35,7 +35,12 @@ class FromRattailToRattailVersions(base.FromRattailToRattailVersions):
def get_importers(self):
importers = super(FromRattailToRattailVersions, self).get_importers()
importers['CorePerson'] = CorePersonImporter
importers['CoreCustomer'] = CoreCustomerImporter
importers['CoreMember'] = CoreMemberImporter
importers['CoreDepartment'] = CoreDepartmentImporter
importers['CoreSubdepartment'] = CoreSubdepartmentImporter
importers['CoreVendor'] = CoreVendorImporter
importers['CoreProduct'] = CoreProductImporter
return importers
@ -47,9 +52,49 @@ class CorePersonImporter(base.VersionImporter):
return model.CorePerson
class CoreCustomerImporter(base.VersionImporter):
@property
def host_model_class(self):
model = self.config.get_model()
return model.CoreCustomer
class CoreMemberImporter(base.VersionImporter):
@property
def host_model_class(self):
model = self.config.get_model()
return model.CoreMember
class CoreDepartmentImporter(base.VersionImporter):
@property
def host_model_class(self):
model = self.config.get_model()
return model.CoreDepartment
class CoreSubdepartmentImporter(base.VersionImporter):
@property
def host_model_class(self):
model = self.config.get_model()
return model.CoreSubdepartment
class CoreVendorImporter(base.VersionImporter):
@property
def host_model_class(self):
model = self.config.get_model()
return model.CoreVendor
class CoreProductImporter(base.VersionImporter):
@property
def host_model_class(self):
model = self.config.get_model()
return model.CoreProduct