add getvaluesof()

This commit is contained in:
bcomsugi 2024-07-23 18:59:52 +07:00
parent 0f769f33ce
commit d7dd3ae1ba
3 changed files with 128 additions and 116 deletions

View File

@ -1,33 +1,23 @@
from server import baseQBQuery, timing from server import baseQBQuery, timing
import pprint import pprint
import timeit import timeit
from time import time import xml.dom.minidom
from utils import timing, cleanIncludeRetElements
def timing(f):
# @wraps(f)
def wrap(*args, **kw):
ts = time()
result = f(*args, **kw)
te = time()
print('func:%r args:[%r, %r] took: %2.6f sec' % \
(f.__name__, args, kw, te-ts))
return result
return wrap
# from functools import wraps # from functools import wraps
def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements:list): # def cleanIncludeRetElements(includeRetElements_allowed:list, includeRetElements:list):
iREs = [] # iREs = []
# print(f'{includeRetElements_allowed = }\n{includeRetElements = }') # # print(f'{includeRetElements_allowed = }\n{includeRetElements = }')
if isinstance(includeRetElements, str): #if user put 1 str argument in IncludeRetElements, change it to list # if isinstance(includeRetElements, str): #if user put 1 str argument in IncludeRetElements, change it to list
includeRetElements = [includeRetElements] # includeRetElements = [includeRetElements]
for iRE in includeRetElements: # for iRE in includeRetElements:
for iRE_a in includeRetElements_allowed: # for iRE_a in includeRetElements_allowed:
if iRE.lower() == iRE_a.lower(): # if iRE.lower() == iRE_a.lower():
iREs.append(iRE_a) # iREs.append(iRE_a)
break # break
return iREs # return iREs
class ItemInventoryQuery(baseQBQuery): class ItemInventoryQuery(baseQBQuery):
@ -79,6 +69,7 @@ class ItemInventoryQuery(baseQBQuery):
# print(self.__class__.__name__ + "Rq") # print(self.__class__.__name__ + "Rq")
# print(self.QBDict) # print(self.QBDict)
self.runCheck() ### running the qbxml connection to get data ###
class GeneralSummaryReportQuery(baseQBQuery): class GeneralSummaryReportQuery(baseQBQuery):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -126,6 +117,7 @@ class GeneralSummaryReportQuery(baseQBQuery):
print(self.__class__.__name__ + "Rq") print(self.__class__.__name__ + "Rq")
print(f'{self.QBDict = }') print(f'{self.QBDict = }')
self.runCheck() ### running the qbxml connection to get data ###
class InvoiceAdd(baseQBQuery): class InvoiceAdd(baseQBQuery):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -162,42 +154,6 @@ class InvoiceAdd(baseQBQuery):
# print(self.__class__.__name__ + "Rq") # print(self.__class__.__name__ + "Rq")
# print(self.QBDict) # print(self.QBDict)
# x=ItemInventoryQuery('bagus', 'kedua', key5=5, key2="hore", FullName1='hooooo', FromName1="sg", ToName1="sugi", IncludeRetElement1=['Name', 'FullName'], MaxReturned="2")
# x.create_QBXML()
# x.connect_to_quickbooks()
# # print(x.find_firstListOfDict("FullName")['FullName'])
# # print(x.find_firstListOfDictValue("PurchaseCost"))
# # print(x.find_firstListOfDict("PurchaseCost"))
# # print(x.find_allListOfDict("FullName"))
# # pprint.pprint(x.Rs)
# # print("ada" if list(x.find_listOfDict("FullName")) else "ga")
# print(x.filter("FullName"))
# y=x.filter("Name")
# print(type(x.filter("FullName1")))
# print(type(y))
# print(x.filter("FullName1").all())
# _test=x.filter("FullName1").all()
# if _test:
# print(_test)
# try:
# print(x.filter("FullName1").all()[-1])
# except Exception as e:
# print(e)
# print(x.filter("FullName1").first())
# print(x.filter("FullName1").firstValue())
# print(x.filter("FullName1").last())
# print(x.filter("FullName1").lastValue())
# print(x.filter("FullName").count())
# print(y.last())
# print(y.lastValue())
# pprint.pprint(x.all())
# a1=x.filter("FullName")
# print(a1)
# a2 = x.filter("Name")
# print(a2)
# print(a1)
class CustomerQuery(baseQBQuery): class CustomerQuery(baseQBQuery):
@ -246,10 +202,11 @@ class CustomerQuery(baseQBQuery):
self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE self.QBDict[self.__class__.__name__ + "Rq"]["IncludeRetElement"]=IRE
if 'OwnerID' in kwargs: if 'OwnerID' in kwargs:
self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID'] self.QBDict[self.__class__.__name__ + "Rq"]["OwnerID"]=kwargs['OwnerID']
print(self.__class__.__name__ + "Rq") print(self.__class__.__name__ + "Rq")
print(f'{self.QBDict = }' ) print(f'{self.QBDict = }' )
print(f'{self.includeRetElements_allowed =}') # print(f'{self.includeRetElements_allowed =}')
self.runCheck() ### running the qbxml connection to get data ###
@ -266,7 +223,7 @@ if __name__ == "__main__":
@timing @timing
def iteminventoryquery(): def iteminventoryquery():
# g=ItemInventoryQuery() # g=ItemInventoryQuery()
g=ItemInventoryQuery(debug = False, MaxReturned = None, IncludeRetElement=["FullName", "DataExtRet", "Name", "QuantityOnHand", "QuantityOnSalesOrder", "QuantityOnOrder", ]) #put OwnerID=0 to get DataExtRet g=ItemInventoryQuery(debug = True, MaxReturned = 3, IncludeRetElement=["FullName", "DataExtRet", "Name", "QuantityOnHand", "QuantityOnSalesOrder", "QuantityOnOrder", ]) #put OwnerID=0 to get DataExtRet
# print("before g.all") # print("before g.all")
# print(f'{g.all() = }') # print(f'{g.all() = }')
# print("after g.all") # print("after g.all")
@ -275,13 +232,17 @@ if __name__ == "__main__":
# print(f'{g.filter("fullname") = }') # print(f'{g.filter("fullname") = }')
# print(f'{g = }') # print(f'{g = }')
# pprint.pprint(g.response_string,indent=4 )
print(g.response_string, type(g.response_string))
print("before") print("before")
# print(g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).first()) # print(g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).first())
c = g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).all() c = g.filter([ "Name", "QuantityOnHand", "QUantityOnSalesOrder", "QuantityonOrder"]).first()
print(c) print("c:",type(c), c)
# pprint.pprint(g.returnRet()) # pprint.pprint(g.returnRet())
# print(g.filter("name").firstValue()) # print(g.filter("name").firstValue())
print(g.count()) print(g.count())
print(g.statusOk)
print(g.filter(["name", "quantityonhand"]).getValuesOf("quantityonhand"))
# print(g.filter(["DataExtRet"]).all()) # print(g.filter(["DataExtRet"]).all())

124
server.py
View File

@ -1,9 +1,10 @@
import pprint import pprint
import xmltodict import xmltodict
import win32com.client import win32com.client
import xml.etree.ElementTree as ET # import xml.etree.ElementTree as ET
import xml.dom.minidom as minidom
from time import time from time import time
from utils import cleanIncludeRetElements
def timing(f): def timing(f):
# @wraps(f) # @wraps(f)
@ -28,13 +29,13 @@ class baseQBQuery:
self.varDict = {} self.varDict = {}
### start ### variable to be replace with other class init value ### start ### variable to be replace with other class init value
self.onError = "continueOnError" self.onError = "continueOnError"
self.cleanIncludeRetElements = None # self.cleanIncludeRetElements = None
self.includeRetElements_allowed = None self.includeRetElements_allowed = None
self.retName = None self.retName = None
self.defaultFilterKey = None self.defaultFilterKey = None
self.class_debug = False self.class_debug = False
### end ### variable to be replace with other class init value ### end ### variable to be replace with other class init value
self.listOfDict = self.ListOfDict(None, self.varDict, self.retName) self.listOfDict = self.ListOfDict(None, self.varDict, self.retName, False)
self.statusCode = -1 self.statusCode = -1
self.statusMessage = "" self.statusMessage = ""
self.statusSeverity = "" self.statusSeverity = ""
@ -71,7 +72,7 @@ class baseQBQuery:
print(f'{dataDict = }') print(f'{dataDict = }')
# # QBXML = '<?qbxml version="13.0"?>' + xmltodict.unparse(dataDict, pretty=True) # # QBXML = '<?qbxml version="13.0"?>' + xmltodict.unparse(dataDict, pretty=True)
self.QBXML = xmltodict.unparse(dataDict, pretty=True).replace("</?qbxml>", "").replace(f'version="{version}"', f'version="{version}"?') self.QBXML = xmltodict.unparse(dataDict, pretty=True).replace("</?qbxml>", "").replace(f'version="{version}"', f'version="{version}"?')
print(self.QBXML) print(self.QBXML, type(self.QBXML))
return self.QBXML return self.QBXML
# @timing # @timing
@ -88,7 +89,13 @@ class baseQBQuery:
# Disconnect from Quickbooks # Disconnect from Quickbooks
sessionManager.EndSession(ticket) # Close the company file sessionManager.EndSession(ticket) # Close the company file
sessionManager.CloseConnection() # Close the connection sessionManager.CloseConnection() # Close the connection
# Beautify response_string
# print(f'{self.response_string = }') # print(f'{self.response_string = }')
xml = minidom.parseString(self.response_string.replace("\n", ""))
self.response_string = xml.toprettyxml()
# print(f'{self.response_string = }')
self.statusOk = self.isDataOK() self.statusOk = self.isDataOK()
return self.statusOk return self.statusOk
return self.response_string return self.response_string
@ -108,6 +115,7 @@ class baseQBQuery:
self.listOfDict.filterKey = ["@statusSeverity"] self.listOfDict.filterKey = ["@statusSeverity"]
self.statusSeverity = self.listOfDict.firstValue().get('@statusSeverity') self.statusSeverity = self.listOfDict.firstValue().get('@statusSeverity')
self.listOfDict.filterKey = [self.retName] self.listOfDict.filterKey = [self.retName]
print(self.listOfDict.firstValue())
if self.listOfDict.firstValue().get(self.retName,None)==None: if self.listOfDict.firstValue().get(self.retName,None)==None:
return False return False
@ -116,7 +124,7 @@ class baseQBQuery:
return True return True
# isStatusOK=None # isStatusOK=None
# for _ in self.find_listOfDict("FullName", ): ###berhasil # for _ in self.findKeyInDict("FullName", ): ###berhasil
# print(f'{_ = }') # print(f'{_ = }')
# for _ in self.gen_dict_extract("@statusMessage", self.varDict): # for _ in self.gen_dict_extract("@statusMessage", self.varDict):
# print(_) # print(_)
@ -131,10 +139,10 @@ class baseQBQuery:
# # print(f'{self.retName = }') # # print(f'{self.retName = }')
# self.Rs = self.find_firstListOfDict(self.retName)[self.retName] # self.Rs = self.find_firstListOfDict(self.retName)[self.retName]
# # self.Rs=self.returnRet(self.varDict) # # self.Rs=self.returnRet(self.varDict)
# # # print(self.find_listOfDict("FullName", )) ###test # # # print(self.findKeyInDict("FullName", )) ###test
# # print(self.find_listOfDict("FullName", self.find_listOfDict("QBXMLMsgsRs1", ))) ###test # # print(self.findKeyInDict("FullName", self.findKeyInDict("QBXMLMsgsRs1", ))) ###test
# # # print(self.find_listOfDict("@statusMessage", )) ###test # # # print(self.findKeyInDict("@statusMessage", )) ###test
# # for _ in self.find_listOfDict("QBXMLMsgsRs",): ###trial blm berhasil # # for _ in self.findKeyInDict("QBXMLMsgsRs",): ###trial blm berhasil
# # print(f'2{_ = }') # # print(f'2{_ = }')
# # print(f'{self.Rs = }') # # print(f'{self.Rs = }')
# # print(type(self.Rs)) # # print(type(self.Rs))
@ -158,6 +166,7 @@ class baseQBQuery:
return None return None
def runCheck(self): def runCheck(self):
# print("runCheck")
if self.varDict: if self.varDict:
return True return True
if self.response_string: if self.response_string:
@ -182,11 +191,11 @@ class baseQBQuery:
def filter(self, key=None): def filter(self, key=None):
# print(f'{key = }') print(f'{key = }')
# print(f'{self.statusOk = }') # print(f'{self.statusOk = }')
if not self.runCheck(): if not self.runCheck():
print("not runcheck") print("not runcheck")
return self.ListOfDict(["abc"], self.varDict, self.retName, self.statusOk) return self.ListOfDict(["abc"], self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
return [] return []
if isinstance(key, str): if isinstance(key, str):
key = [key] key = [key]
@ -196,12 +205,12 @@ class baseQBQuery:
key = [x for x,y in key.items()] key = [x for x,y in key.items()]
else: else:
return [] return []
key = self.cleanIncludeRetElements(self.includeRetElements_allowed, key) key = cleanIncludeRetElements(self.includeRetElements_allowed, key)
# print(f'f {key = }') # print(f'f {key = }')
if key: if key:
return self.ListOfDict(key, self.varDict, self.retName) return self.ListOfDict(key, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
else: else:
return self.ListOfDict(["abc"], self.varDict, self.retName) return self.ListOfDict(["abc"], self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk)
### dont use this way, better returning class because the value if you assign to variable, the valu will be the last filterKey inputed ### 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 ### if return class, every filterKey is an object, different from other filterKey
self.listOfDict.varDict = self.varDict self.listOfDict.varDict = self.varDict
@ -213,7 +222,7 @@ class baseQBQuery:
if not self.runCheck(): if not self.runCheck():
return None 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] return self.ListOfDict(None, self.varDict, self.retName, self.includeRetElements_allowed, self.statusOk).firstValue()[self.retName]
### dont use this way ### dont use this way
self.listOfDict.varDict = self.varDict self.listOfDict.varDict = self.varDict
self.listOfDict.filterKey = self.retName self.listOfDict.filterKey = self.retName
@ -223,7 +232,7 @@ class baseQBQuery:
class ListOfDict: class ListOfDict:
def __init__(self, key, var, retName, statusOk:bool = True) -> None: def __init__(self, key, var, retName, includeRetElements_allowed:list ,statusOk:bool = True) -> None:
# print(f'{key =}, {var =}') # print(f'{key =}, {var =}')
# self.first = self.find_firstListOfDict(key) # self.first = self.find_firstListOfDict(key)
if key: if key:
@ -233,8 +242,10 @@ class baseQBQuery:
# print(f"{self.filterKey = }") # print(f"{self.filterKey = }")
self.varDict = var self.varDict = var
self.statusOk = statusOk self.statusOk = statusOk
self._includeRetElements_allowed = includeRetElements_allowed
# print("listofDict") # print("listofDict")
def __repr__(self) -> str: def __repr__(self) -> str:
return str(self.all()) return str(self.all())
@ -242,18 +253,31 @@ class baseQBQuery:
self.filterKey=filterKey self.filterKey=filterKey
def dct(self, var:dict=None, dataRetList:list=None): def getValuesOf(self, key:str=None, var:dict=None, dataRetList:list=None) :
for xdct in self.find_listOfDict(var, dataRetList): if key==None:
print(f'{xdct = }') key = self.filterKey[0]
_dct = [x[self.filterKey] for x in self.find_listOfDict(var, dataRetList)] elif isinstance(key, str):
pass
else:
raise TypeError(f'{key=} should be string not {type(key)}')
key = cleanIncludeRetElements(self._includeRetElements_allowed, key)
if len(key)==0:
key = self.filterKey[0]
else:
key = key[0]
# print(f'getvaluesof {key = }')
# for xdct in self.findKeyInDict(var, dataRetList):
# print(f'{xdct = }', type(xdct), self.filterKey[0], key)
_dct = [x[key] for x in self.findKeyInDict(var, dataRetList)]
# print(_dct)
return _dct return _dct
def all(self, var:dict=None, dataRetList:list=None): def all(self, var:dict=None, dataRetList:list=None) -> list:
# print(f'{self.statusOk = }') # print(f'{self.statusOk = }')
if not self.statusOk: if not self.statusOk:
return [] return []
_lst = [x for x in self.find_listOfDict(var, dataRetList)] _lst = [x for x in self.findKeyInDict(var, dataRetList)]
# _lst = [x[self.filterKey] for x in self.find_listOfDict(var, dataRetList)] # _lst = [x[self.filterKey] for x in self.findKeyInDict(var, dataRetList)]
# if _lst: # if _lst:
return _lst return _lst
# else: # else:
@ -262,18 +286,18 @@ class baseQBQuery:
def allOnlyValue(self, var:dict=None, dataRetList:list=None): def allOnlyValue(self, var:dict=None, dataRetList:list=None):
if not self.statusOk: if not self.statusOk:
return [] return []
_lst = [x for x in self.find_listOfDict(var, dataRetList)] _lst = [x for x in self.findKeyInDict(var, dataRetList)]
return _lst return _lst
def first(self, var:dict=None, dataRetList:list=None): def first(self, var:dict=None, dataRetList:list=None) -> dict:
if not self.statusOk: if not self.statusOk:
return [] return {}
return next(self.find_listOfDict( var, dataRetList), None) return next(self.findKeyInDict( var, dataRetList), {})
def firstValue(self, var:dict=None, dataRetList:list=None): def firstValue(self, var:dict=None, dataRetList:list=None) ->dict:
if not self.statusOk: if not self.statusOk:
print("firstValue statusOk is False") print("firstValue statusOk is False")
return [] return {}
# return self.first(var, dataRetList)[self.filterKey] # return self.first(var, dataRetList)[self.filterKey]
_val=self.first(var, dataRetList) _val=self.first(var, dataRetList)
# print(f'{_val = }') # print(f'{_val = }')
@ -281,34 +305,34 @@ class baseQBQuery:
# return _val[self.filterKey] # return _val[self.filterKey]
return _val return _val
else: else:
return [] return {}
def last(self, var:dict=None, dataRetList:list=None): def last(self, var:dict=None, dataRetList:list=None) -> dict:
if not self.statusOk: if not self.statusOk:
return [] return {}
# *_, last = self.find_listOfDict( var, dataRetList) # *_, last = self.findKeyInDict( var, dataRetList)
_val= self.all(var, dataRetList) _val= self.all(var, dataRetList)
if _val:return _val[-1] if _val:return _val[-1]
else: return [] else: return {}
def lastValue(self, var:dict=None, dataRetList:list=None): def lastValue(self, var:dict=None, dataRetList:list=None) -> dict:
if not self.statusOk: if not self.statusOk:
return [] return {}
_val=self.last(var, dataRetList) _val=self.last(var, dataRetList)
# print(f"lastValue {_val =}") # print(f"lastValue {_val =}")
if _val: if _val:
# return _val[self.filterKey] # return _val[self.filterKey]
return _val return _val
else: else:
return [] return {}
def count(self, var:dict=None, dataRetList:list=None): def count(self, var:dict=None, dataRetList:list=None) -> int:
if not self.statusOk: if not self.statusOk:
return 0 return 0
# print(len(self.all())) # print(len(self.all()))
return len(self.all()) return len(self.all())
# def find_listOfDict(self, var:dict=None, dataRetList:list=None, ): # def findKeyInDict(self, var:dict=None, dataRetList:list=None, ):
# # print("genfinekeys") # # print("genfinekeys")
# if var==None: # if var==None:
# var=self.varDict # var=self.varDict
@ -318,7 +342,7 @@ class baseQBQuery:
# if isinstance(var, list): # if isinstance(var, list):
# # print("list var") # # print("list var")
# for _ in var: # for _ in var:
# yield from self.find_listOfDict( _, ) # yield from self.findKeyInDict( _, )
# elif isinstance(var, dict): # elif isinstance(var, dict):
# # print("dict var") # # print("dict var")
# if self.filterKey in var: # if self.filterKey in var:
@ -329,10 +353,10 @@ class baseQBQuery:
# # print(f'dict else var={var}') # # print(f'dict else var={var}')
# for _ in var: # for _ in var:
# # print(_) # # print(_)
# yield from self.find_listOfDict(var[_], ) # yield from self.findKeyInDict(var[_], )
# return dataRetList # return dataRetList
def find_listOfDict(self, var:dict=None, dataRetList:list=None, ): def findKeyInDict(self, var:dict=None, dataRetList:list=None, ):
# print("genfinekeys") # print("genfinekeys")
if var==None: if var==None:
var=self.varDict var=self.varDict
@ -342,7 +366,7 @@ class baseQBQuery:
if isinstance(var, list): if isinstance(var, list):
# print("list var") # print("list var")
for _ in var: for _ in var:
yield from self.find_listOfDict( _, ) yield from self.findKeyInDict( _, )
elif isinstance(var, dict): elif isinstance(var, dict):
# print("dict var") # print("dict var")
found = False found = False
@ -362,20 +386,20 @@ class baseQBQuery:
# print(f'dict else var={var}') # print(f'dict else var={var}')
for _ in var: for _ in var:
# print(_) # print(_)
yield from self.find_listOfDict(var[_], ) yield from self.findKeyInDict(var[_], )
return dataRetList return dataRetList
# def find_allListOfDict(self, key, var:dict=None, dataRetList:list=None): # def find_allListOfDict(self, key, var:dict=None, dataRetList:list=None):
# return [x for x in self.find_listOfDict(key, var, dataRetList)] # return [x for x in self.findKeyInDict(key, var, dataRetList)]
# def find_firstListOfDictValue(self, key, var:dict=None, dataRetList:list=None): # def find_firstListOfDictValue(self, key, var:dict=None, dataRetList:list=None):
# return self.find_firstListOfDict(key, var, dataRetList)[key] # return self.find_firstListOfDict(key, var, dataRetList)[key]
# def find_firstListOfDict(self, key, var:dict=None, dataRetList:list=None): # def find_firstListOfDict(self, key, var:dict=None, dataRetList:list=None):
# return next(self.find_listOfDict(key, var, dataRetList), None) # return next(self.findKeyInDict(key, var, dataRetList), None)
# def find_listOfDict(self, key, var:dict=None, dataRetList:list=None, ): # def findKeyInDict(self, key, var:dict=None, dataRetList:list=None, ):
# # print("genfinekeys") # # print("genfinekeys")
# if var==None: # if var==None:
# var=self.varDict # var=self.varDict
@ -385,7 +409,7 @@ class baseQBQuery:
# if isinstance(var, list): # if isinstance(var, list):
# # print("list var") # # print("list var")
# for _ in var: # for _ in var:
# yield from self.find_listOfDict(key, _, ) # yield from self.findKeyInDict(key, _, )
# elif isinstance(var, dict): # elif isinstance(var, dict):
# # print("dict var") # # print("dict var")
# if key in var: # if key in var:
@ -396,7 +420,7 @@ class baseQBQuery:
# # print(f'dict else var={var}') # # print(f'dict else var={var}')
# for _ in var: # for _ in var:
# # print(_) # # print(_)
# yield from self.find_listOfDict(key, var[_], ) # yield from self.findKeyInDict(key, var[_], )
# return dataRetList # return dataRetList

27
utils.py Normal file
View File

@ -0,0 +1,27 @@
from time import time
def timing(f):
# @wraps(f)
def wrap(*args, **kw):
ts = time()
result = f(*args, **kw)
te = time()
print('func:%r args:[%r, %r] took: %2.6f sec' % \
(f.__name__, args, kw, te-ts))
return result
return wrap
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