This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
polynum-blackboard/polynum_blackboard/__init__.py

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.>]'