first commit
This commit is contained in:
commit
356f26e570
|
@ -0,0 +1,5 @@
|
||||||
|
local_settings.py
|
||||||
|
*.pyc
|
||||||
|
polynum.db
|
||||||
|
polynum/static
|
||||||
|
polynum/media
|
|
@ -0,0 +1,2 @@
|
||||||
|
Blackboard connector for polynum
|
||||||
|
=============================================================
|
|
@ -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.>]'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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=[
|
||||||
|
],
|
||||||
|
)
|
Reference in New Issue