85 lines
3.2 KiB
Python
85 lines
3.2 KiB
Python
import requests
|
|
import os.path
|
|
import xml.etree.ElementTree as etree
|
|
import collections
|
|
import logging
|
|
|
|
CourseByOwnerResponse = collections.namedtuple('CourseByOwnerResponse',
|
|
('message', 'courses'))
|
|
Course = collections.namedtuple('Course',
|
|
('id', 'name', 'available'))
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class BlackboardConnector(object):
|
|
def __init__(self, url):
|
|
self.url = url
|
|
|
|
def _get_course_helper(self, r):
|
|
r.encoding = 'utf-8'
|
|
if r.status_code == 200:
|
|
x = etree.XML(r.text.encode('utf-8'))
|
|
info_message_elt = x.find('infoMessage')
|
|
course_elts = x.findall('*/course')
|
|
courses = []
|
|
for course_elt in course_elts:
|
|
id_elt = course_elt.find('ID')
|
|
name_elt = course_elt.find('name')
|
|
available_elt = course_elt.find('available')
|
|
if None in (id_elt, name_elt, available_elt) or available_elt.text not in ('YES', 'NO'):
|
|
logger.error('invalid answer to GetCourseByOwner: %r', r.text)
|
|
return False, 'Erreur BlackBoard'
|
|
course = Course(id_elt.text.strip(), name_elt.text.strip(),
|
|
available_elt.text == 'YES')
|
|
courses.append(course)
|
|
return True, CourseByOwnerResponse(info_message_elt.text.strip(),
|
|
courses)
|
|
elif r.status_code == 400:
|
|
return False, r.text
|
|
else:
|
|
logging.error('BlackBoard code HTTP %s', r.status_code)
|
|
return False, 'Erreur BlackBoard'
|
|
|
|
def get_course_by_owner(self, user_login):
|
|
assert user_login
|
|
r = requests.get(os.path.join(self.url, 'GetCourseByOwner'),
|
|
params={'user_login': user_login.encode('ascii')})
|
|
return self._get_course_helper(r)
|
|
|
|
def get_course_by_ue(self, entity_code):
|
|
assert entity_code
|
|
r = requests.get(os.path.join(self.url, 'GetCourseByUE'),
|
|
params={'UE_ID': entity_code.encode('ascii')})
|
|
return self._get_course_helper(r)
|
|
|
|
def send_file(self, uploadfile, courses_id):
|
|
assert hasattr(uploadfile, 'read')
|
|
assert hasattr(courses_id, '__iter__')
|
|
assert len(courses_id) > 0
|
|
assert all(map(bool, courses_id))
|
|
|
|
r = requests.post(os.path.join(self.url, 'SendFile'),
|
|
params={'course_ID': courses_id},
|
|
files={'uploadfile': uploadfile})
|
|
if r.status_code == 200:
|
|
return True, r.text
|
|
return False, r.text
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
import logging
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
connector = BlackboardConnector(sys.argv[1])
|
|
if len(sys.argv) == 4 and sys.argv[2] == 'GetCourseByOwner':
|
|
print connector.get_course_by_owner(sys.argv[3])
|
|
elif len(sys.argv) == 4 and sys.argv[2] == 'GetCourseByUE':
|
|
print connector.get_course_by_ue(sys.argv[3])
|
|
elif len(sys.argv) == 5 and sys.argv[2] == 'SendFile':
|
|
print connector.send_file(file(sys.argv[3]), sys.argv[4].split(','))
|
|
else:
|
|
print 'Syntax: python', sys.argv[0], '<url> [GetCourseByOwner <user_login>|GetCourseByUE <UE_ID>|SendFile <filename> <courseid1,courseid2,courseid3,etc.>]'
|
|
|
|
|
|
|
|
|