Integration Between “Things”™ - with a Catch
Chris GreenoughNorthern Arizona University
[email protected]@GreenO
Background
• Initially PeopleSoft extracts were IMS Enterprise 1.01 Vista 3 was IMS Enterprise 1.1
• Needs in our SIS did not match the needs in our LMS
• More need around campus for enrollment data
• Constant development since 2008
What’s wrong with direct Integration
• Data in your SIS is not Life in your LMS– Incompletes– Guests Lecturers– Cross Listed Classes (What a mess)– Name Changes– Anything else you can think of!
Basic Overview
Export Logic Import
Technical Details
• Originally written in Java ported to Python• “Event”/Snapshot based• LMS Enterprise 1.1 Based• Oracle Backend• Multiple Destinations
Inbound Sources
IMS Enterprise Based ObjectsLIS before LIS?
IMS XML Extract
PeopleSoft
LIS Soon?
Banner
No Idea!
Kuali
Business Logic
IMS Enterprise Based Objects
Business Logic
Update Local Database Apply “Override” Information
IMS Enterprise Based Objects
Outbound Sources
IMS Enterprise Based Objects
Internal Database
Classes.nau.edu
iTunesU
IMS XML
Vista Web SIAPI
Bb Web Services
BBLearn SOAP/WS-
Security
Internal Web
Services
Push Tool
IMS Objects
• Objects– Group– Relationship– Properties– Membership– Member– Bulk load
• Methods to get override values(default) and underlying values
DB Schema
• LMS_GROUP_INFO• LMS_MEMBER_INFO• LMS_ENROLLMENT_INFO• LMS_DESTINATION_INFO• LMS_OVERRIDE_INFO
– TABLE_NAME– TABLE_ID– FIELD– VALUE
Web Service Integration
• Vista – Multipart IMS XML Web Upload to SIAPI
• BBLearn 9.1– WS-Security SOAP requests to API– Using Internally Developed BbPy Web
Service Bindings
Conclusion
• There is a need to control every field of data from the SIS to the LMS
• Distil all sources to common data sources, IMS Enterprise Spec
• Separate inbound and outbound data• Hopefully LIS will help the connections• Allows for future expansion
Questions/Links
• IMS Enterprise Spec 1.1 http://www.imsglobal.org/enterprise/
• Python http://code.google.com/p/bbpy/
• About.Mehttp://about.me/greeno
• Twitter@GreenO
Please provide feedback for this session by [email protected].
The title of this session is:
Integration Between Blackboard Learn™, Release 9.1, Vista 8, Others and PeopleSoft - with a Catch
def processMembership(self,membership): membership.cacheId="%s:%s"%(membership.sourcedidid,membership.sourcedidsource) logger.info("Starting Membership %s:%s"%(membership.sourcedidid,membership.sourcedidsource)) logger.debug(membership) if(self.shouldProcess(membership)): group = self.odb.getGroup(membership.sourcedidid, membership.sourcedidsource) self.setSubroleToNothing(membership) self.addMissingMembershipTags(membership) self.updateRoles(membership) self.emplidToRegid(membership) self.updateMembershipFromOverride(membership) if getattr(membership,"snap",False): self.processSnap(membership) self.updateDb(membership) self.processExpire(membership, group) self.removeGraders(membership) self.markDestinations(membership) self.markVistaUpdates(membership) self.markDuelEnrollments(membership) self.checkRollup(membership,group) self.runEndPoints(membership) logger.info("Ending Membership") logger.debug(membership)
def processGroup(self,group): group.cacheId="%s:%s"%(group.sourcedidid,group.sourcedidsource) logger.info("Starting Group %s:%s"%(group.sourcedidid,group.sourcedidsource)) self.logInfo(group, "Starting Group") self.checkDeleted(group) self.updateGroupFromOverride(group) if hasattr(group,"incomplete"): raise DatabaseErrors.GroupNotFound("Group Not Found!") self.addMissingGroupTags(group) if group.sourcedidsource == config.datasource: self.updateGroupTitle(group) self.createLCH(group) self.createRollups(group) self.updateDb(group) self.extendEndDates(group) self.markVistaUpdates(group) self.markDestinations(group) self.runEndPoints(group) self.sendMembership(group) self.logInfo(group,"Ending Group")
http://code.google.com/p/bbpy/source/browse/trunk/bbpy/src/BbPy/security/SignatureHandler.py
http://code.google.com/p/bbpy/source/browse/trunk/bbpy/src/BbPy/ContextWS.py
CREATE OR REPLACE VIEW "OVERRIDE_VISTA_GROUP_INFO" ("VISTA_GROUP_ID", "SOURCEDID_ID", "SOURCEDID_SOURCE", "LC_PARENT_ID", "ROLLUP_ID", "TYPE_LEVEL", "SHORT_DESCRIPTION", "LONG_DESCRIPTION", "FULL_DESCRIPTION", "ORG_ID", "ORG_NAME", "BKHIERARCHY", "DIVISION", "BEGIN_DATE", "BEGIN_RESTRICT", "END_DATE", "END_RESTRICT", "ADMIN_PERIOD", "EMAIL", "URL", "WEBCT_TEMPLATE", "CREATE_TS", "MODIFY_TS", "EXPIRE_TS", "COMMENTS", "VISTA_DATA_SOURCE_ID") AS (select VISTA_GROUP_ID, SOURCEDID_ID, SOURCEDID_SOURCE, LC_PARENT_ID,decode( (select 1 from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='ROLLUP_ID'), null, i.ROLLUP_ID, 1,(select value from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='ROLLUP_ID'), '') as ROLLUP_ID,TYPE_LEVEL,decode( (select 1 from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='SHORT_DESCRIPTION'), null, i.SHORT_DESCRIPTION, 1,(select value from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='SHORT_DESCRIPTION'), '') as SHORT_DESCRIPTION, decode( (select 1 from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='LONG_DESCRIPTION'), null, i.LONG_DESCRIPTION, 1,(select value from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='LONG_DESCRIPTION'), '') as LONG_DESCRIPTION, decode( (select 1 from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='FULL_DESCRIPTION'), null, i.FULL_DESCRIPTION, 1,(select value from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='FULL_DESCRIPTION'), '') as FULL_DESCRIPTION, ORG_ID, ORG_NAME, BKHIERARCHY, DIVISION,decode( (select 1 from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='BEGIN_DATE'), null, i.BEGIN_DATE, 1,(select value from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='BEGIN_DATE'), '') as BEGIN_DATE, BEGIN_RESTRICT, decode( (select 1 from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='END_DATE'), null, i.END_DATE, 1,(select value from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='END_DATE'), '') as END_DATE, END_RESTRICT, ADMIN_PERIOD, EMAIL, URL, WEBCT_TEMPLATE, CREATE_TS, MODIFY_TS,decode( (select 1 from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='EXPIRE_TS'), null, i.EXPIRE_TS, 1,(select value from vista_ims_adm.vista_override_info o where table_name='VISTA_GROUP_INFO' and table_id=i.vista_group_id and field='EXPIRE_TS'), '') as EXPIRE_TS,COMMENTS, VISTA_DATA_SOURCE_ID from vista_ims_adm.vista_group_info i) ;
Top Related