This is the final blog report summarizing the work done for 📚 LMS Integration project during Google Summer of Code 2021 🖥.
Here is the more detailed Phase 1 Report :
LMS Integration: Phase 1 Report (GSoC 2021- Ayan Biswas)
Currently CircuitVerse have a basic LMS within CircuitVerse to manage assignments. But with the increasing demand for a full-fledged LMS features, it is required to be integrated with publicly available popular LMSs like Moodle/Canvas etc. However individual LMS integration per case to case basis is not possible, so CircuitVerse is looking for a way to integrate with multiple LMSs in a single flow. See the CircuitVerse Wiki and Project Board for more details.
The major goals of the project are listed below :
In the video below, I have demonstrated the integration of CircuitVerse with the Moodle LMS. Please watch the video to see the integration in action.
Here is a diagrammatic representation of the LMS Integration Project:
The entire logic of incoming and outgoing requests are handled by the ims-lti gem, which is a Ruby gem that implements the LTI protocol.
This project has two main segments:
See in app/controllers/lti_controller.rb
@provider = IMS::LTI::ToolProvider.new(
params[:oauth_consumer_key],
@assignment.lti_shared_secret,
params
)
here the provider is specified with the consumer key and shared secret of the LMS and in the next step the entire LTI request is validated.
See in app/controllers/lti_controller.rb
if [email protected]_request?(request)
render :launch_error, status: 401
return
end
If the request is valid, then corresponding assignment is fetched from the database and proper page is rendered and delivered via iframe to the LMS.
For the grade pass back service the native LTI protocol is followed, because the ims-lti gem doesn’t support the flow as per our requirements.
So the grade pass back service is implemented as per specifications of IMS-Global, see in lti_score_submission.rb
def call
response = oauth_token.post(lis_outcome_service_url, score_body.to_xml, 'Content-Type' => 'application/xml')
if response.body.match(/\bsuccess\b/)
puts "score submitted"
return true
else
puts "score submission failed"
return false
end
end
for more information about the grade pass back service please refer Learning Tools Interoperability (LTI) Implementation Guide
The goals are almost achieved. The following features are added to CircuitVerse:
Here are the pull requests made to the CircuitVerse main repository:
Here are the pull requests made to the CircuitVerseDocs repository:
Rspec tests has been added to check the entire LTI integration flow. Please refer to the spec/requests/lti_spec.rb
Here is a glimpse of the testing scenarios of the LMS integration project
The tutorial documentation for the teachers has been also added to the CircuitVerseDocs check the documentation here
Here is a glimpse of the documentation of the LMS integration project
The initial integration of CircuitVerse with the LMS is ready for production use of teachers and students. The next step is to add more features to the platform.Here are some of the future plans :
I have described my entire journey through a series of blogs in my web profile.You can find the links below, please click on the links to read the posts:
My Journey to Google Summer of Code 21 with CircuitVerse and insights on the Proposal for GSoC
Learning Tools Interoperability implementation in Ruby on Rails
Google Summer of Code has been a great experience for me. I have learned a lot from my project and I am very happy with the outcome.Engaging in the beautiful community like CircuitVerse is an excellent opportunity for me, I also want to thank my mentors Aboobacker MK, Satvik Ramaprasad and Shivansh Srivastava for their extreme support and continuous code reviews.
Looking forward to contribute even more to CircuitVerse and the whole Open-source community !
Thank you for reading 🎉 Happy coding 🖥