mirror of
https://github.com/bcomsugi/Quickbooks-API.git
synced 2026-01-09 09:42:40 +07:00
can filter a list of values or single text
This commit is contained in:
parent
bfe33dc45a
commit
1b879b7a4b
84
QBClasses.py
84
QBClasses.py
@ -5,11 +5,31 @@ import timeit
|
||||
|
||||
# from functools import wraps
|
||||
|
||||
def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements:list):
|
||||
iREs = []
|
||||
# print(f'{includeRetElements_allowed = }\n{includeRetElements = }')
|
||||
if isinstance(includeRetElements, str): #if user put 1 str argument in IncludeRetElements, change it to list
|
||||
includeRetElements = [includeRetElements]
|
||||
for iRE in includeRetElements:
|
||||
for iRE_a in includeRetElements_allowed:
|
||||
if iRE.lower() == iRE_a.lower():
|
||||
iREs.append(iRE_a)
|
||||
break
|
||||
return iREs
|
||||
|
||||
|
||||
class ItemInventoryQuery(baseQBQuery):
|
||||
def __init__(self, *args, **kwargs):
|
||||
print(f'{args = }')
|
||||
print(f'{kwargs = }')
|
||||
super().__init__(*args, **kwargs)
|
||||
self.includeRetElements_allowed = ["FullName", "TimeCreated", "TimeModified", "EditSequence", "Name", "IsActive", "ClassRef", "ParentRef", "Sublevel", "BarCodeValue",
|
||||
"ManufacturerPartNumber", "UnitOfMeasureSetRef", "IsTaxIncluded", "SalesTaxCodeRef", "SalesDesc,", "SalesPrice", "IncomeAccountRef",
|
||||
"PurchaseDesc", "PurchaseCost", "PurchaseTaxCodeRef", "COGSAccountRef", "PrefVendorRef", "AssetAccountRef", "ReforderPoint", "Max", "QuantityOnHand",
|
||||
"AcerageCost", "QuantityOnOrder", "QuantityOnSalesOrder",
|
||||
"ExternalGUID", "DataExtRet",
|
||||
]
|
||||
self.cleanIncludeRetElements = cleanIncludeRetElements
|
||||
self.retName = 'ItemInventoryRet'
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]={}
|
||||
if 'ListID' in kwargs:
|
||||
@ -30,7 +50,10 @@ class ItemInventoryQuery(baseQBQuery):
|
||||
if 'FromName' in kwargs or 'ToName' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")}
|
||||
if 'IncludeRetElement' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=kwargs['IncludeRetElement']
|
||||
IRE = self.cleanIncludeRetElements(self.includeRetElements_allowed, kwargs["IncludeRetElement"])
|
||||
# self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=kwargs['IncludeRetElement']
|
||||
print(f"{IRE = }")
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE
|
||||
if 'OwnerID' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID']
|
||||
|
||||
@ -42,6 +65,8 @@ class GeneralSummaryReportQuery(baseQBQuery):
|
||||
print(f'{args = }')
|
||||
print(f'{kwargs = }')
|
||||
super().__init__( )
|
||||
self.includeRetElements_allowed = ["ReportTitle", "ReportSubtitle", "ReportBasis", "NumRows", "NumColumns", "NumColTitleRows", "ColDesc", "ReportData", ]
|
||||
self.cleanIncludeRetElements = cleanIncludeRetElements
|
||||
self.retName = 'ReportRet'
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]={}
|
||||
|
||||
@ -71,7 +96,10 @@ class GeneralSummaryReportQuery(baseQBQuery):
|
||||
if 'FromName' in kwargs or 'ToName' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["NameRangeFilter"]={'FromName':kwargs.get('FromName', ""), 'ToName':kwargs.get('ToName', "")}
|
||||
if 'IncludeRetElement' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=kwargs['IncludeRetElement']
|
||||
IRE = self.cleanIncludeRetElements(self.includeRetElements_allowed, kwargs["IncludeRetElement"])
|
||||
print(f"{IRE = }")
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE
|
||||
# self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=kwargs['IncludeRetElement']
|
||||
if 'OwnerID' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID']
|
||||
|
||||
@ -150,11 +178,19 @@ class InvoiceAdd(baseQBQuery):
|
||||
# print(a2)
|
||||
# print(a1)
|
||||
|
||||
|
||||
class CustomerQuery(baseQBQuery):
|
||||
def __init__(self, *args, **kwargs):
|
||||
print(f'{args = }')
|
||||
print(f'{kwargs = }')
|
||||
super().__init__(*args, **kwargs)
|
||||
self.includeRetElements_allowed = ["FullName", "TimeCreated", "TimeModified", "EditSequence", "Name", "IsActive", "ClassRef", "ParentRef", "Sublevel", "CompanyName", "Salutation",
|
||||
"FirstName", "MiddleName", "LastName", "JobTitle", "BillAddress", "BillAddressBlock", "ShipAddress", "ShipAddressBlock", "ShipToAddress", "Phone",
|
||||
"AltPhone", "Fax", "Email", "Cc", "Contact", "AltContact", "AdditionalContactRef", "ContactsRet", "CustomerTypeRef", "TermsRef", "SalesRepRef",
|
||||
"Balance", "TotalBalance", "SalesTaxCodeRef", "ItemSalesTaxRef", "SalesTaxCountry", "ResaleNumber", "AccountNumber", "CreditLimit",
|
||||
"PreferredPaymentMethodRef", "CreditCardInfo", "JobStatus", "JobStartDate", "JobProjectedEndDate", "JobEndDate", "JobDesc", "JobTypeRef", "Notes",
|
||||
"AdditionalNotesRet", "PreferredDeliveryMethod", "PriceLevelRef", "ExternalGUID", "TaxRegistrationNumber", "CurrencyRef", "DataExtRet"]
|
||||
self.cleanIncludeRetElements = cleanIncludeRetElements
|
||||
self.onError = "stopOnError"
|
||||
self.retName = 'CustomerRet'
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]={}
|
||||
@ -179,29 +215,56 @@ class CustomerQuery(baseQBQuery):
|
||||
if 'Operator' in kwargs and 'Amount' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["TotalBalanceFilter"]={'Operator':kwargs['Operator'], 'Amount':kwargs['Amount']}
|
||||
if 'IncludeRetElement' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=kwargs['IncludeRetElement']
|
||||
IRE = cleanIncludeRetElements(self.includeRetElements_allowed, kwargs['IncludeRetElement'])
|
||||
print("after IRE")
|
||||
print(f'{IRE = }')
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE
|
||||
if 'OwnerID' in kwargs:
|
||||
self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID']
|
||||
|
||||
print(self.__class__.__name__ + "Rq")
|
||||
print(self.QBDict)
|
||||
print(f'{self.QBDict = }' )
|
||||
print(f'{self.includeRetElements_allowed =}')
|
||||
|
||||
|
||||
|
||||
@timing
|
||||
def main():
|
||||
g= GeneralSummaryReportQuery(GeneralSummaryReportType="ProfitAndLossStandard", ReportDateMacro="ThisYear")
|
||||
print(g, type(g))
|
||||
print(type(g.all()))
|
||||
print(g.all())
|
||||
pprint.pprint(g.filter("ColData").all())
|
||||
|
||||
def iteminventoryquery():
|
||||
# g=ItemInventoryQuery(MaxReturned=2)
|
||||
g=ItemInventoryQuery(MaxReturned = 200, OwnerID=0)#, IncludeRetElement="DataExtRet") #put OwnerID=0 to get DataExtRet
|
||||
# print("before g.all")
|
||||
# print(f'{g.all() = }')
|
||||
# print("after g.all")
|
||||
# print("")
|
||||
# pprint.pprint(g.filter(["FullName", "Name", "sublevel"]).all())
|
||||
# print(f'{g.filter("fullname") = }')
|
||||
# print(g.filter(["Fullname", "Name"]).count())
|
||||
|
||||
print(g.filter(["DataExtRet"]).all())
|
||||
|
||||
def customerquery():
|
||||
g= CustomerQuery(MaxReturned=3, IncludeRetElement=["FullName", "Name", "CompanyName", "BillAddressBlock", "ShipAddress"])
|
||||
g= CustomerQuery(MaxReturned=3, IncludeRetElement=["fullname", "name", "CompanyName", "BillAddressBlock", "ShipAddressBlock"])
|
||||
# g= CustomerQuery(MaxReturned=20, ActiveStatus="ActiveOnly", MatchCriterion="StartsWith", Name="to", IncludeRetElement=["fullname", "name", "billaddressblock", "currencyfilter"])
|
||||
# print(g.IncludeRetElements_allowed)
|
||||
print("init finish")
|
||||
print(f'{type(g.all()) = }')
|
||||
# print(f'{type(g.all()) = }')
|
||||
print("before g.all")
|
||||
print(f'{g.all() = }')
|
||||
# print("after g.all")
|
||||
# pprint.pprint(g.filter("ColData").all())
|
||||
print("after g.all")
|
||||
pprint.pprint(f'{g.filter(["FullName", "Name"]).all() = }')
|
||||
print(f'{g.filter() = }')
|
||||
# pprint.pprint(g.filter(["FullName", "abc", "BillAddressBlock"]).all())
|
||||
print(f'{g.filter(["FullName", "abc", "BillAddressBlock"]).all() = }')
|
||||
print("")
|
||||
print(f'{g.filter([ "Addr1", "Addr2", "Addr3", "Addr4", "Addr5"]).all() = }')
|
||||
print(f'{g.filter([ "Addr1", "Addr2", "Addr3", "Addr4", "Addr5"]) = }')
|
||||
print(f'{g.filter(["fullname", "name"]).lastValue() = }')
|
||||
|
||||
def readxmltodict():
|
||||
import xmltodict
|
||||
@ -252,7 +315,8 @@ def readxmltodict():
|
||||
|
||||
if __name__ == "__main__":
|
||||
# main()
|
||||
customerquery()
|
||||
iteminventoryquery()
|
||||
# customerquery()
|
||||
# readxmltodict()
|
||||
|
||||
|
||||
|
||||
248
server.py
248
server.py
@ -21,13 +21,17 @@ class baseQBQuery:
|
||||
def __init__(self, *args, **kwargs, ) -> None:
|
||||
# print(f'{kwargs = }')
|
||||
# print(f'{args = }')
|
||||
self.onError = "continueOnError"
|
||||
self.QBXML = None
|
||||
self.QBDict = {}
|
||||
self.response_string = None
|
||||
self.Rs = None
|
||||
self.varDict = {}
|
||||
### start ### variable to be replace with other class init value
|
||||
self.onError = "continueOnError"
|
||||
self.cleanIncludeRetElements = None
|
||||
self.includeRetElements_allowed = None
|
||||
self.retName = None
|
||||
### end ### variable to be replace with other class init value
|
||||
self.listOfDict = self.ListOfDict(None, self.varDict, self.retName)
|
||||
self.statusCode = -1
|
||||
self.statusMessage = ""
|
||||
@ -35,9 +39,10 @@ class baseQBQuery:
|
||||
|
||||
@timing
|
||||
def create_QBXML(self):
|
||||
version = "13.0"
|
||||
dataDict = { ### Header for qmxml with version attribute
|
||||
"?qbxml": {
|
||||
"@version": "13.0",
|
||||
"@version": version,
|
||||
}
|
||||
}
|
||||
# dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Simple Example ###
|
||||
@ -60,9 +65,9 @@ class baseQBQuery:
|
||||
dataDict["?qbxml"]["QBXML"] = {"QBXMLMsgsRq": { ### Example with multiple FullName Item ###
|
||||
"@onError": self.onError,
|
||||
firstKey: self.QBDict[firstKey]}}
|
||||
# print(f'{dataDict = }')
|
||||
print(f'{dataDict = }')
|
||||
# # QBXML = '<?qbxml version="13.0"?>' + xmltodict.unparse(dataDict, pretty=True)
|
||||
self.QBXML = xmltodict.unparse(dataDict, pretty=True).replace("</?qbxml>", "")
|
||||
self.QBXML = xmltodict.unparse(dataDict, pretty=True).replace("</?qbxml>", "").replace(f'version="{version}"', f'version="{version}"?')
|
||||
print(self.QBXML)
|
||||
return self.QBXML
|
||||
|
||||
@ -89,14 +94,14 @@ class baseQBQuery:
|
||||
# QBXML = ET.fromstring(self.response_string)
|
||||
# print(xmltodict.parse(self.response_string))
|
||||
self.varDict = xmltodict.parse(self.response_string)
|
||||
pprint.pprint(self.varDict)
|
||||
# pprint.pprint(self.varDict)
|
||||
self.listOfDict.varDict = self.varDict
|
||||
self.listOfDict.filterKey = "@statusCode"
|
||||
self.statusCode = self.listOfDict.firstValue()
|
||||
self.listOfDict.filterKey = "@statusMessage"
|
||||
self.statusMessage = self.listOfDict.firstValue()
|
||||
self.listOfDict.filterKey = "@statusSeverity"
|
||||
self.statusSeverity = self.listOfDict.firstValue()
|
||||
self.listOfDict.filterKey = ["@statusCode"]
|
||||
self.statusCode = self.listOfDict.firstValue().get('@statusCode',None)
|
||||
self.listOfDict.filterKey = ["@statusMessage"]
|
||||
self.statusMessage = self.listOfDict.firstValue().get('@statusMessage',None)
|
||||
self.listOfDict.filterKey = ["@statusSeverity"]
|
||||
self.statusSeverity = self.listOfDict.firstValue().get('@statusSeverity')
|
||||
print(f'{self.statusCode = }, {self.statusMessage = }, {self.statusSeverity = }')
|
||||
# isStatusOK=None
|
||||
|
||||
@ -151,10 +156,23 @@ class baseQBQuery:
|
||||
return True
|
||||
return False
|
||||
|
||||
def filter(self, key):
|
||||
def filter(self, key=None):
|
||||
if not self.runCheck():
|
||||
return None
|
||||
return self.ListOfDict(key, self.varDict, self.retName)
|
||||
return []
|
||||
if isinstance(key, str):
|
||||
key = [key]
|
||||
elif isinstance(key, list):
|
||||
pass
|
||||
elif isinstance(key, dict):
|
||||
key = [x for x,y in key.items()]
|
||||
else:
|
||||
return []
|
||||
key = self.cleanIncludeRetElements(self.includeRetElements_allowed, key)
|
||||
print(f'f {key = }')
|
||||
if key:
|
||||
return self.ListOfDict(key, self.varDict, self.retName)
|
||||
else:
|
||||
return self.ListOfDict(["abc"], self.varDict, self.retName)
|
||||
### dont use this way, better returning class because the value if you assign to variable, the valu will be the last filterKey inputed
|
||||
### if return class, every filterKey is an object, different from other filterKey
|
||||
self.listOfDict.varDict = self.varDict
|
||||
@ -162,10 +180,11 @@ class baseQBQuery:
|
||||
return self.listOfDict
|
||||
###
|
||||
|
||||
def all(self):
|
||||
def all(self) -> dict:
|
||||
if not self.runCheck():
|
||||
return None
|
||||
return self.ListOfDict(None, self.varDict, self.retName).firstValue()
|
||||
# return self.ListOfDict(None, self.varDict, self.retName).firstValue()
|
||||
return self.ListOfDict(None, self.varDict, self.retName).firstValue()[self.retName]
|
||||
### dont use this way
|
||||
self.listOfDict.varDict = self.varDict
|
||||
self.listOfDict.filterKey = self.retName
|
||||
@ -181,7 +200,7 @@ class baseQBQuery:
|
||||
if key:
|
||||
self.filterKey = key
|
||||
else:
|
||||
self.filterKey = retName
|
||||
self.filterKey = [retName]
|
||||
# print(f"{self.filterKey = }")
|
||||
self.varDict = var
|
||||
# print("listofDict")
|
||||
@ -193,16 +212,23 @@ class baseQBQuery:
|
||||
self.filterKey=filterKey
|
||||
|
||||
|
||||
def all(self, var:dict=None, dataRetList:list=None):
|
||||
def dct(self, var:dict=None, dataRetList:list=None):
|
||||
for xdct in self.find_listOfDict(var, dataRetList):
|
||||
print(f'{xdct = }')
|
||||
_dct = [x[self.filterKey] for x in self.find_listOfDict(var, dataRetList)]
|
||||
return _dct
|
||||
|
||||
_lst = [x[self.filterKey] for x in self.find_listOfDict(var, dataRetList)]
|
||||
def all(self, var:dict=None, dataRetList:list=None):
|
||||
_lst = [x for x in self.find_listOfDict(var, dataRetList)]
|
||||
# _lst = [x[self.filterKey] for x in self.find_listOfDict(var, dataRetList)]
|
||||
# if _lst:
|
||||
return _lst
|
||||
# else:
|
||||
# return [None]
|
||||
# return []
|
||||
|
||||
def allOnlyValue(self, var:dict=None, dataRetList:list=None):
|
||||
_lst = [x for x in self.find_listOfDict(var, dataRetList)]
|
||||
return _lst
|
||||
|
||||
def first(self, var:dict=None, dataRetList:list=None):
|
||||
return next(self.find_listOfDict( var, dataRetList), None)
|
||||
@ -210,28 +236,56 @@ class baseQBQuery:
|
||||
def firstValue(self, var:dict=None, dataRetList:list=None):
|
||||
# return self.first(var, dataRetList)[self.filterKey]
|
||||
_val=self.first(var, dataRetList)
|
||||
# print(f'{_val = }')
|
||||
if _val:
|
||||
return _val[self.filterKey]
|
||||
# return _val[self.filterKey]
|
||||
return _val
|
||||
else:
|
||||
return None
|
||||
return []
|
||||
|
||||
def last(self, var:dict=None, dataRetList:list=None):
|
||||
# *_, last = self.find_listOfDict( var, dataRetList)
|
||||
_val= self.all(var, dataRetList)
|
||||
if _val:return _val[-1]
|
||||
else: return None
|
||||
else: return []
|
||||
|
||||
def lastValue(self, var:dict=None, dataRetList:list=None):
|
||||
_val=self.last(var, dataRetList)
|
||||
# print(f"lastValue {_val =}")
|
||||
if _val:
|
||||
return _val[self.filterKey]
|
||||
# return _val[self.filterKey]
|
||||
return _val
|
||||
else:
|
||||
return None
|
||||
return []
|
||||
|
||||
def count(self, var:dict=None, dataRetList:list=None):
|
||||
# print(len(self.all()))
|
||||
return len(self.all())
|
||||
|
||||
# def find_listOfDict(self, var:dict=None, dataRetList:list=None, ):
|
||||
# # print("genfinekeys")
|
||||
# if var==None:
|
||||
# var=self.varDict
|
||||
# # print(f"{var = }")
|
||||
# if dataRetList is None:
|
||||
# dataRetList = []
|
||||
# if isinstance(var, list):
|
||||
# # print("list var")
|
||||
# for _ in var:
|
||||
# yield from self.find_listOfDict( _, )
|
||||
# elif isinstance(var, dict):
|
||||
# # print("dict var")
|
||||
# if self.filterKey in var:
|
||||
# dataRetList.append({self.filterKey: var[self.filterKey]})
|
||||
# print(f"{dataRetList = }")
|
||||
# yield {self.filterKey: var[self.filterKey]}
|
||||
# else:
|
||||
# # print(f'dict else var={var}')
|
||||
# for _ in var:
|
||||
# # print(_)
|
||||
# yield from self.find_listOfDict(var[_], )
|
||||
# return dataRetList
|
||||
|
||||
def find_listOfDict(self, var:dict=None, dataRetList:list=None, ):
|
||||
# print("genfinekeys")
|
||||
if var==None:
|
||||
@ -245,10 +299,19 @@ class baseQBQuery:
|
||||
yield from self.find_listOfDict( _, )
|
||||
elif isinstance(var, dict):
|
||||
# print("dict var")
|
||||
if self.filterKey in var:
|
||||
dataRetList.append({self.filterKey: var[self.filterKey]})
|
||||
found = False
|
||||
tempDct = {}
|
||||
for fKey in self.filterKey:
|
||||
# if self.filterKey in var:
|
||||
if fKey in var:
|
||||
found = True
|
||||
tempDct[fKey]=var[fKey]
|
||||
# print(f'{tempDct = }')
|
||||
if found:
|
||||
# dataRetList.append({self.filterKey: var[self.filterKey]})
|
||||
dataRetList.append(tempDct)
|
||||
# print(f"{dataRetList = }")
|
||||
yield {self.filterKey: var[self.filterKey]}
|
||||
yield tempDct #{self.filterKey: var[self.filterKey]}
|
||||
else:
|
||||
# print(f'dict else var={var}')
|
||||
for _ in var:
|
||||
@ -256,6 +319,7 @@ class baseQBQuery:
|
||||
yield from self.find_listOfDict(var[_], )
|
||||
return dataRetList
|
||||
|
||||
|
||||
# def find_allListOfDict(self, key, var:dict=None, dataRetList:list=None):
|
||||
# return [x for x in self.find_listOfDict(key, var, dataRetList)]
|
||||
|
||||
@ -289,6 +353,9 @@ class baseQBQuery:
|
||||
# yield from self.find_listOfDict(key, var[_], )
|
||||
# return dataRetList
|
||||
|
||||
|
||||
#### dont delete.
|
||||
### Example of extracting dictionary value by key
|
||||
def gen_dict_extract(self, key, var:dict=None): ### Utils
|
||||
if var==None:
|
||||
var=self.response_string
|
||||
@ -307,11 +374,12 @@ class baseQBQuery:
|
||||
for result in self.gen_dict_extract(key, d):
|
||||
yield result
|
||||
|
||||
def __str__(self, *args) -> str:
|
||||
def __str__(self, *args, **kwargs) -> str:
|
||||
# return str(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML())))
|
||||
# print("__str__")
|
||||
return str(self.all())
|
||||
return self.__class__.__name__
|
||||
return str(self.get_datarow())
|
||||
# return "hello"
|
||||
|
||||
|
||||
# def get_datarow(self, *args):
|
||||
@ -320,9 +388,6 @@ class baseQBQuery:
|
||||
# def get_dict(self, *args):
|
||||
# return pd.DataFrame(self._get_datarow(self.connect_to_quickbooks(self.create_QBXML())))
|
||||
|
||||
# def get_total(self):
|
||||
# return self._get_total(self.connect_to_quickbooks(self.create_QBXML()))
|
||||
|
||||
def status_ok(self, QBXML):
|
||||
GSRQRs=QBXML.find('.//GeneralSummaryReportQueryRs')
|
||||
status_code = GSRQRs.attrib #.get('statusCode')
|
||||
@ -336,121 +401,6 @@ class baseQBQuery:
|
||||
else:
|
||||
return False, status_code
|
||||
|
||||
# def get_coldesc(self, QBXML):
|
||||
# coldescs = QBXML.findall('.//ColDesc')
|
||||
# coldesclist=[]
|
||||
# firstcol=[]
|
||||
# allcols=[]
|
||||
# for idx, coldesc in enumerate(coldescs):
|
||||
# coltitles = coldesc.findall('ColTitle')
|
||||
# # coldesclist.append(coltitles[1].attrib.get('value'))
|
||||
# firstcol.append(coltitles[0].attrib.get('value'))
|
||||
# cols=[]
|
||||
# for idy, coltitle in enumerate(coltitles):
|
||||
# cols.append(coltitle.attrib.get('value'))
|
||||
# # allcols[idy].append(coltitle.attrib.get('value'))
|
||||
# # print(idx, coltitle.tag)
|
||||
# # print(idx, coltitle.attrib.get('value'))
|
||||
# allcols.append(cols)
|
||||
# print(f'getcoldesc:{firstcol}; coldesclist:{coldesclist}; allcols:{allcols}')
|
||||
# # print(allcols)
|
||||
# return allcols
|
||||
|
||||
# def _get_total(self, response_string):
|
||||
# # print(response_string)
|
||||
# # Parse the response into an Element Tree and peel away the layers of response
|
||||
# QBXML = ET.fromstring(response_string)
|
||||
# if self.status_ok(QBXML):
|
||||
# print("")
|
||||
# # print(QBXML)
|
||||
# # QBXMLMsgsRs = QBXML.find('QBXMLMsgsRs') #this is a must have. dont CHANGE. this is the root
|
||||
# total = QBXML.findall('.//TotalRow')
|
||||
# return {'Total':total[0][1].attrib.get('value')}
|
||||
# else:
|
||||
# return ()
|
||||
|
||||
# def get_reportsubtitle(self, QBXML):
|
||||
# reportsubtitle=QBXML.find('.//ReportSubtitle').text
|
||||
# return reportsubtitle
|
||||
|
||||
# def _get_datarow(self, response_string):
|
||||
# # print(response_string)
|
||||
# print('get_datarow')
|
||||
# # Parse the response into an Element Tree and peel away the layers of response
|
||||
# QBXML = ET.fromstring(response_string)
|
||||
# datadict={}
|
||||
# reportsubtitle=None
|
||||
# total = float(QBXML.find('.//TotalRow')[1].attrib.get('value'))
|
||||
# status, statusdict= self.status_ok(QBXML)
|
||||
# print(status, statusdict, total)
|
||||
# if status and total > 0:
|
||||
# # print("get_datarow status ok")
|
||||
# reportsubtitle=self.get_reportsubtitle(QBXML)
|
||||
# DataRowRs = QBXML.iter("DataRow")
|
||||
# col_desc=self.get_coldesc(QBXML)
|
||||
# # print(f'getdatarow coldesc:{col_desc}')
|
||||
# # print(f'Datarow length:{len(list(DataRowRs))}')
|
||||
# temp=[]
|
||||
# rowvalue=[]
|
||||
# amount=[]
|
||||
# rowType=[]
|
||||
# idxerrorcount=0
|
||||
# # print(DataRowRs)
|
||||
# for idx_datarow, DataRow in enumerate(DataRowRs):
|
||||
# # print(DataRow.attrib.get('rowNumber'))
|
||||
# RowData=DataRow.find('RowData')
|
||||
# if RowData is None:
|
||||
# print(f'{idx_datarow} none continue')
|
||||
# idxerrorcount+=1
|
||||
# continue
|
||||
# if 'value' not in DataRow.find('RowData').attrib:
|
||||
# print(f'{idx_datarow} value continue')
|
||||
# idxerrorcount+=1
|
||||
# continue
|
||||
# RowData_value=DataRow.find('RowData').attrib.get('value')
|
||||
# rowType.append(RowData_value)
|
||||
# ColDatas = DataRow.findall("ColData")
|
||||
# cols=[]
|
||||
# for idx_coldata, coldata in enumerate(ColDatas):
|
||||
# if idx_coldata==0:
|
||||
# cols.append(rowType[idx_datarow-idxerrorcount])
|
||||
# else:
|
||||
# cols.append(coldata.attrib.get('value'))
|
||||
# rowvalue.append(cols)
|
||||
# temp.append(ColDatas[0].attrib.get('value'))
|
||||
# # datadict[ColDatas[0].attrib.get('colID')]=temp
|
||||
# amount.append(ColDatas[1].attrib.get('value'))
|
||||
# # datadict[ColDatas[1].attrib.get('colID')]=amount
|
||||
# # print(rowvalue)
|
||||
# datadict['rowvalue']=rowvalue
|
||||
# datadict['RowType']=rowType
|
||||
# datadict['CustomerFullName']=temp #ganti dgn rowType
|
||||
# datadict['Sales']=amount
|
||||
# # print(f"lendatadict {len(datadict['CustomerFullName'])}, {len(datadict['Sales'])}, {len(datadict['RowType'])}, {len(datadict['rowvalue'])}")
|
||||
|
||||
# df=pd.DataFrame(rowvalue)
|
||||
# col_desc= [cdesc[-1] for cdesc in col_desc]
|
||||
# print(f'coldesc getdatarow:{col_desc}')
|
||||
|
||||
# # print(df)
|
||||
# df.columns=col_desc
|
||||
# # print(df)
|
||||
# # print('lendatadict')
|
||||
# print(f"lendatadict {len(datadict['CustomerFullName'])}, {len(datadict['Sales'])}, {len(datadict['RowType'])}, {len(datadict['rowvalue'])}")
|
||||
# datadict=df.to_dict('list')
|
||||
# # print(datadict, type(datadict))
|
||||
# return datadict, reportsubtitle
|
||||
# else:
|
||||
# return datadict, reportsubtitle
|
||||
|
||||
# def validate_date(self, date_text):
|
||||
# if date_text is None:
|
||||
# return None
|
||||
# try:
|
||||
# return datetime.datetime.strptime(date_text, '%Y-%m-%d').date()
|
||||
# except ValueError:
|
||||
# return None
|
||||
# # raise ValueError("Incorrect data format, should be YYYY-MM-DD")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
pass
|
||||
Loading…
Reference in New Issue
Block a user