/src/mwslib.py

https://github.com/jleyva/mooconsole · Python · 226 lines · 154 code · 68 blank · 4 comment · 47 complexity · 688d7d52807ac1c3cacb87ecb36d23b9 MD5 · raw file

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import xml.dom.minidom
  5. import urllib
  6. import urllib2
  7. import logging
  8. class MoodleWSHelper(object):
  9. def __init__(self,ws_dir):
  10. self.logger = logging.getLogger('MLogger.MWSLib.MoodleWSHelper')
  11. def getText(nodelist):
  12. rc = ""
  13. for node in nodelist:
  14. if node.nodeType == node.TEXT_NODE:
  15. rc = rc + node.data
  16. return rc
  17. self.ws_list = []
  18. ws_list_dir = os.listdir(ws_dir)
  19. ws_list_dir.sort()
  20. for ws_file in ws_list_dir:
  21. fp = os.path.join(ws_dir,ws_file)
  22. if os.path.isfile(fp):
  23. xmlc = open(fp).read()
  24. dom = xml.dom.minidom.parseString(xmlc)
  25. ws_ds = {}
  26. ws_ds['name'] = getText(dom.getElementsByTagName("name")[0].childNodes)
  27. ws_ds['description'] = getText(dom.getElementsByTagName("description")[0].childNodes)
  28. ws_ds['wsfname'] = getText(dom.getElementsByTagName("wsfname")[0].childNodes)
  29. ws_ds['params'] = {}
  30. for param in dom.getElementsByTagName('param'):
  31. param_name = getText(param.getElementsByTagName("name")[0].childNodes)
  32. structure = getText(param.getElementsByTagName("structure")[0].childNodes)
  33. type = getText(param.getElementsByTagName("type")[0].childNodes)
  34. ws_ds['params'][param_name] = {}
  35. ws_ds['params'][param_name]['structure'] = structure
  36. ws_ds['params'][param_name]['type'] = type
  37. if type == 'object':
  38. ws_ds['params'][param_name]['attributes'] = []
  39. object = param.getElementsByTagName("object")[0]
  40. for attrs in object.getElementsByTagName('attribute'):
  41. #print attrs.tagName+'abbb'
  42. ws_ds['params'][param_name]['attributes'].append((getText(attrs.childNodes),attrs.getAttribute('type')))
  43. self.ws_list.append(ws_ds)
  44. self.logger.debug('Web service descriptors loaded: %s', self.ws_list)
  45. class MoodleWS(object):
  46. def __init__(self, ws_object):
  47. self.name = ws_object['name']
  48. self.description = ws_object['description']
  49. self.wsfname = ws_object['wsfname']
  50. self.params = ws_object['params']
  51. self.data_grid = {}
  52. self.cols = {}
  53. self.logger = logging.getLogger('MLogger.MWSLib.MoodleWS')
  54. def set_data_grid(self,param,data):
  55. self.data_grid[param] = data
  56. def get_data_grid(self,param):
  57. return self.data_grid[param]
  58. def get_grid_cols(self, param):
  59. param_data = self.params[param]
  60. if param not in self.cols:
  61. self.cols[param] = []
  62. if param_data['type'] == u'object':
  63. for a_name, a_type in param_data['attributes']:
  64. if a_type == 'int':
  65. self.cols[param].append({'name' : a_name, 'format' : 'number'})
  66. else:
  67. self.cols[param].append({'name' : a_name, 'format' : ''})
  68. else:
  69. if param_data['type'] == 'int':
  70. self.cols[param].append({'name' : param, 'format' : 'number'})
  71. else:
  72. self.cols[param].append({'name' : param, 'format' : ''})
  73. return self.cols[param]
  74. def set_data(self,data):
  75. self.ws_data = {}
  76. for p_name,p_data in self.params.iteritems():
  77. if p_data['type'] == 'object' and p_data['structure'] == 'list':
  78. cols = self.get_grid_cols(p_name)
  79. l_cols = []
  80. for c_data in cols:
  81. c_name = c_data['name']
  82. l_cols.append(c_name)
  83. pos = 0
  84. for row in data:
  85. valid_row = False
  86. l_data = len(row)
  87. for i in range(0,l_data):
  88. if row[i] != u'':
  89. valid_row = True
  90. if valid_row:
  91. for i in range(0,l_data):
  92. self.ws_data[p_name+'['+str(pos)+']['+l_cols[i]+']'] = row[i]
  93. pos = pos + 1
  94. elif p_data['structure'] == 'list':
  95. pos = 0
  96. for row in data:
  97. if row[0] != u'':
  98. self.ws_data[p_name+'['+str(pos)+']'] = row[0]
  99. pos = pos + 1
  100. else:
  101. if data[0][0] != u'':
  102. self.ws_data[p_name] = data[0][0]
  103. def is_ready(self):
  104. return len(self.ws_data) > 0
  105. def execute(self, site):
  106. opener = urllib2.build_opener()
  107. urllib2.install_opener(opener)
  108. headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; WindowsNT)'}
  109. if site.wstoken:
  110. url = site.url + '/webservice/rest/server.php?wstoken='+site.wstoken+'&wsfunction='+self.wsfname
  111. elif site.wsusername != '' and site.wspassword != '':
  112. url = site.url + '/webservice/rest/server.php?wsusername='+site.wsusername +'&wspassword='+site.wspassword +'&wsfunction='+self.wsfname
  113. else:
  114. return (False, None)
  115. params = urllib.urlencode(self.ws_data)
  116. self.logger.debug('Executing WS: %s %s',url,params)
  117. req = urllib2.Request(url, params, headers)
  118. response = ''
  119. try:
  120. response = urllib2.urlopen(req).read()
  121. except:
  122. return (False, None)
  123. def getText(nodelist):
  124. rc = ""
  125. for node in nodelist:
  126. if node.nodeType == node.TEXT_NODE:
  127. rc = rc + node.data
  128. return rc
  129. self.logger.debug('WS Response: %s',response)
  130. if response.find('<EXCEPTION class') > -1:
  131. dom = xml.dom.minidom.parseString(response)
  132. message = getText(dom.getElementsByTagName("MESSAGE")[0].childNodes)
  133. return (False,message)
  134. else:
  135. dom = xml.dom.minidom.parseString(response)
  136. grid = []
  137. cols_names = []
  138. first = True
  139. for single in dom.getElementsByTagName('SINGLE'):
  140. cols = []
  141. for key in single.getElementsByTagName('KEY'):
  142. try:
  143. value = ''
  144. for val in key.getElementsByTagName("VALUE"):
  145. if value != '':
  146. value = value+','+getText(val.childNodes)
  147. else:
  148. value = getText(val.childNodes)
  149. finally:
  150. cols.append(value)
  151. if first:
  152. cols_names.append(key.getAttribute('name'))
  153. first = False
  154. grid.append(cols)
  155. return (True,(cols_names,grid))
  156. if __name__ == "__main__":
  157. #For testing
  158. pass