From 356f26e570f149e7ea817fa683663c86a0c1afdd Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 3 Oct 2012 10:54:48 +0200 Subject: [PATCH] first commit --- .gitignore | 5 ++ README.rst | 2 + polynum_blackboard/__init__.py | 84 ++++++++++++++++++++++++++++++++++ setup.py | 21 +++++++++ 4 files changed, 112 insertions(+) create mode 100644 .gitignore create mode 100644 README.rst create mode 100644 polynum_blackboard/__init__.py create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..be8be98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +local_settings.py +*.pyc +polynum.db +polynum/static +polynum/media diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..32c527c --- /dev/null +++ b/README.rst @@ -0,0 +1,2 @@ +Blackboard connector for polynum +============================================================= diff --git a/polynum_blackboard/__init__.py b/polynum_blackboard/__init__.py new file mode 100644 index 0000000..babf164 --- /dev/null +++ b/polynum_blackboard/__init__.py @@ -0,0 +1,84 @@ +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], ' [GetCourseByOwner |GetCourseByUE |SendFile ]' + + + + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..7be67d6 --- /dev/null +++ b/setup.py @@ -0,0 +1,21 @@ +#! /usr/bin/env python + +''' Setup script for Blackboard connector for polynum +''' + +from setuptools import setup, find_packages + +setup(name="Connecteur Blackboard pour Polynum", + version=0.1, + license="AGPLv3 or later", + description="Permet l'envoi de polycopiés directement dans un cours du logiciel Blackboard", + url="http://dev.entrouvert.org/projects/polynum-blackboard/", + author="Entr'ouvert", + author_email="info@entrouvert.org", + maintainer="Benjamin Dauvergne", + maintainer_email="bdauvergne@entrouvert.com", + packages=find_packages(), + package_data={}, + install_requires=[ + ], +)