first commit

This commit is contained in:
Benjamin Dauvergne 2012-10-03 10:54:48 +02:00
commit 356f26e570
4 changed files with 112 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
local_settings.py
*.pyc
polynum.db
polynum/static
polynum/media

2
README.rst Normal file
View File

@ -0,0 +1,2 @@
Blackboard connector for polynum
=============================================================

View File

@ -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], '<url> [GetCourseByOwner <user_login>|GetCourseByUE <UE_ID>|SendFile <filename> <courseid1,courseid2,courseid3,etc.>]'

21
setup.py Normal file
View File

@ -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=[
],
)