@@ -45,61 +45,61 @@ def __init__(self, base_url=None, map_function=None, requests_kwargs=None):
4545
4646 def fulltext_search (self , query , module = 'Object' , limit = 100 , offset = 0 ):
4747 url = f"{ self .base_url } /ria-ws/application/module/{ module } /search"
48- data = FULLTEXT_TEMPLATE .format (
49- module_name = module ,
50- limit = limit ,
51- offset = offset ,
52- query = query ,
53- )
54- xml = data .encode ("utf-8" )
55- xml_response = self ._post_xml (url , xml )
56- return response .SearchResponse (xml_response , self .map_function )
48+ params = {
49+ 'module_name' : module ,
50+ 'query' : query ,
51+ }
52+ data_loader = DataPoster (url , params , FULLTEXT_TEMPLATE , self .requests_kwargs )
53+ return response .SearchResponse (data_loader , limit , offset , self .map_function )
5754
5855 def search (self , field , value , module = 'Object' , limit = 100 , offset = 0 ):
5956 url = f"{ self .base_url } /ria-ws/application/module/{ module } /search"
60- data = SEARCH_TEMPLATE .format (
61- module_name = module ,
62- limit = limit ,
63- offset = offset ,
64- field = field ,
65- value = value ,
66- )
67- xml = data .encode ("utf-8" )
68- xml_response = self ._post_xml (url , xml )
69- return response .SearchResponse (xml_response , self .map_function )
57+ params = {
58+ 'module_name' : module ,
59+ 'field' : field ,
60+ 'value' : value ,
61+ }
62+ data_loader = DataPoster (url , params , SEARCH_TEMPLATE , self .requests_kwargs )
63+ return response .SearchResponse (data_loader , limit , offset , self .map_function )
7064
7165 def module_item (self , id , module = 'Object' ):
7266 url = f"{ self .base_url } /ria-ws/application/module/{ module } /{ id } "
73- xml_response = self . _get_xml (url )
74- resp = response .SearchResponse (xml_response )
75- if len ( resp ) == 1 :
67+ data_loader = DataLoader (url , self . requests_kwargs )
68+ resp = response .SearchResponse (data_loader )
69+ if resp . count == 1 :
7670 return resp [0 ]
7771 return resp
7872
7973 def download_attachment (self , id , module = 'Object' , dir = '.' ):
8074 url = f"{ self .base_url } /ria-ws/application/module/{ module } /{ id } /attachment"
81- return self ._download_file (url , dir )
75+ data_loader = DataLoader (url , self .requests_kwargs )
76+ return data_loader .download_file (url , dir )
8277
83- def _download_file (self , url , dir ):
84- headers = {'Accept' : 'application/octet-stream' }
85- res = self ._get_content (url , headers )
86- d = res .headers .get ('Content-Disposition' )
87- fname = re .findall ("filename=(.+)" , d )[0 ]
88- assert fname , "Could not find filename in Content-Disposition header"
89- path = os .path .join (dir , fname )
90- with open (path , 'wb' ) as f :
91- for chunk in res .iter_content (1024 ):
92- f .write (chunk )
93- return path
9478
95- def _get_xml (self , url ):
96- res = self ._get_content (url )
79+ class DataPoster (object ):
80+ def __init__ (self , url , params = None , template = None , requests_kwargs = None ):
81+ self .session = requests .Session ()
82+ self .url = url
83+ self .params = params
84+ self .template = template
85+ self .xmlparser = xmlparse .XMLParser ()
86+ self .requests_kwargs = requests_kwargs or {}
87+
88+ def load (self , ** kwargs ):
89+ self .params .update (kwargs )
90+ xml = self .template .format (** self .params ).encode ('utf-8' )
91+ return self ._post_xml (self .url , xml )
92+
93+ def _post_xml (self , url , xml ):
94+ headers = {'Content-Type' : 'application/xml' }
95+ res = self ._post_content (url , xml , headers )
9796 return self .xmlparser .parse (res .content )
9897
99- def _get_content (self , url , headers = {} ):
98+ def _post_content (self , url , data , headers ):
10099 try :
101- res = self .session .get (
100+ res = self .session .post (
102101 url ,
102+ data = data ,
103103 headers = headers ,
104104 ** self .requests_kwargs
105105 )
@@ -111,16 +111,38 @@ def _get_content(self, url, headers={}):
111111
112112 return res
113113
114- def _post_xml (self , url , xml ):
115- headers = {'Content-Type' : 'application/xml' }
116- res = self ._post_content (url , xml , headers )
114+
115+ class DataLoader (object ):
116+ def __init__ (self , url , requests_kwargs = None ):
117+ self .session = requests .Session ()
118+ self .url = url
119+ self .xmlparser = xmlparse .XMLParser ()
120+ self .requests_kwargs = requests_kwargs or {}
121+
122+ def load (self , ** kwargs ):
123+ xml = self ._get_xml (self .url )
124+ return xml
125+
126+ def download_file (self , url , dir ):
127+ headers = {'Accept' : 'application/octet-stream' }
128+ res = self ._get_content (url , headers )
129+ d = res .headers .get ('Content-Disposition' )
130+ fname = re .findall ("filename=(.+)" , d )[0 ]
131+ assert fname , "Could not find filename in Content-Disposition header"
132+ path = os .path .join (dir , fname )
133+ with open (path , 'wb' ) as f :
134+ for chunk in res .iter_content (1024 ):
135+ f .write (chunk )
136+ return path
137+
138+ def _get_xml (self , url ):
139+ res = self ._get_content (url )
117140 return self .xmlparser .parse (res .content )
118141
119- def _post_content (self , url , data , headers ):
142+ def _get_content (self , url , headers = {} ):
120143 try :
121- res = self .session .post (
144+ res = self .session .get (
122145 url ,
123- data = data ,
124146 headers = headers ,
125147 ** self .requests_kwargs
126148 )
@@ -129,4 +151,5 @@ def _post_content(self, url, data, headers):
129151 raise errors .MuseumPlusError ("HTTP error: %s" % e )
130152 except requests .exceptions .RequestException as e :
131153 raise errors .MuseumPlusError ("Request error: %s" % e )
154+
132155 return res
0 commit comments