180 likes | 291 Views
Integration Between “Things”™ - with a Catch. Chris Greenough Northern Arizona University Chris.Greenough@nau.edu @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
E N D
Integration Between “Things”™ - with a Catch Chris GreenoughNorthern Arizona University Chris.Greenough@nau.edu@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
Business Logic IMS Enterprise Based Objects • Business Logic • Update Local Database • Apply “Override” Information • IMS Enterprise Based Objects
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 • BBLearn9.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 emailingBbWorldFeedback@blackboard.com. The title of this session is: • Integration Between Blackboard Learn™, Release 9.1, Vista 8, Others and PeopleSoft - with a Catch
defprocessMembership(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)
defprocessGroup(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.pyhttp://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_infoi) ;