Add more schema extensions; importing support
This commit is contained in:
parent
4402d79052
commit
6ce4b59509
8 changed files with 541 additions and 37 deletions
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue