2018 yoğun bir şekilde Open edX ile uğraştığım bir yıl oldu. İlk bakışta diş geçirmesi zor bir canavar gibi görünse de zamanla alışıp, sevmeye bile başladım.
Tabii, bir kere düzgün kurup yönetmeye başladıktan sonra sıra çeşitli yeni özellik taleplerine geldi:
- “Şuraya bir görsel eklesek?”
- “Biz şu servisi kullanıyoruz. Onunla entegre edebilir miyiz?”
- “Kursuma şöyle bir içerik eklemek istiyorum.”
Ortada hem özgür hem de Python ile yazılmış bir yazılım olunca, insan hemen kaynak koduna dalıp istediği değişiklikleri yapabilmenin cazibesine kapılabiliyor. Ancak, ilk günden itibaren özgün Open edX‘ten kopmama yönündeki irademizi büyük ölçüde koruduk. Bu konudaki kararlılığımızın birkaç sebebi var:
- edX geliştiricileri her sürümü uzun bir test sürecinden sonra yayımlıyorlar. Her sürüm öncesi tüm topluluğun katkı verdiği yüzlerce kişilik bir emekten bahsediyoruz. Kaynak koduna yapacağımız her yama, bizim bu test sürecinden yararlanma şansımızı azaltıyor.
- Yeni sürümle gelen değişiklikler ile kendi değişikliklerimizin çakışması halinde bu çakışmayı el yordamı ile çözmek zorunda kalıyoruz ve bu son derece hataya gebe bir süreç.
- En kötüsü ise yukarıdaki sebeplerden dolayı yeni sürüme geçmeme kararı alma ve güncelliğimizi yitirme ihtimalimiz.
Sağolsunlar, edX ve topluluktaki katkıcılar da Open edX’i kaynak kodunu değiştirmeden özelleştirmek için açtıkları kapılarla hayatımızı kolaylaştırıyor. İşte bu yazı, yukarıda bahsettiğim kapıları anlatacağımız bir serinin ilki. Bugün size Open edX’e nasıl eklenti yazabileceğinizi anlatacağım.
Eklentiler
Eklenti özelliği, ilk olarak Hawthorn Beta sürümüyle gözüme çarptı. Aslında bu özellik uzun zamandır mevcutmuş ama Hawthorn sürümünde geliştirme ekibinden biraz sevgi görerek sisteme eklentiyi tanıtabilmek için gerekli kod miktarı ciddi şekilde azaltılmış. Bundan sonra açıklayacağım her şeyin, eklentilerin bu yeni halini temel alacağından Hawthorn ve sonraki sürümler için geçerli olacağını belirtmiş olayım.
Eklentiler en çok yukarıdaki ikinci talep için kullanılabilir. Harici bir servisten gelen özel bir isteği karşılamak, Open edX üzerindeki bir olay üzerine (kursa kayıt ya da kurstan ayrılma, yeni öğrenci kaydı vs.) harici bir servise bir istek yapmak gibi ihtiyaçlara cevap vermek için birebir.
Örneğin, açılan her yeni kursu Slack’te duyuran bir eklenti yazabiliriz.
Bir eklenti yaratmak
Open edX’in eklentileri arka planda iki şeyden yararlanıyor:
1. Eklentiyi tespit etmek ve dinamik olarak yüklemek için Openstack’in Stevedore kütüphanesi
2. Eklenti ile yeni bir url, view ya da model tanımlayabilmek için Django’nun uygulama mantığı
Dolayısıyla, Open edX’in tanıyıp sisteme entegre edebileceği bir eklenti yaratmak için temelde iki şeye ihtiyacımız var: Doğru hazırlanmış bir `setup.py` ve bir `AppConfig` alt sınıfı. Aşağıda bunları örnek olarak göstereceğim. Tam tekmil bir eklenti için kodun tamamını GitHub’da bulabilirsiniz.
Örnek `AppConfig`:
from django.apps import AppConfig class NotifySlackConfig(AppConfig): name = "notify-slack" verbose_name = "Notify Slack on course publish" plugin_app = { u"signals.config": { u"cms.djangoapp": { u"recievers": [{ u"receiver_func_name": u"notify_slack_on_course_publish", u"signal_path': u"notify_slack.signals.COURSE_PUBLISHED", u"dispatch_uid': u"notify_slack_on_course_publish" }] } } }
Farkettiğiniz üzere Django’nun sinyal özelliğini kullanıyoruz. Open edX kodun genelinde sinyallerden yararlanıyor ve bu da “abone” olunabilecek bir sürü olay anlamına geliyor. Ancak, bu sinyaller belgelendirilmiş değil; bu konuda `grep` sizin dostunuz.
Örnek `setup.py`:
import os from setuptools import setup, find_packages setup( name="notify-slack", version="0.1", description="Open edX plugin to notify Slack on course publish", packages=find_packages(), install_requires=[ "Django", "slackclient" ], entry_points={ "cms.djangoapp": [ "notify_slack = notify_slack.apps:NotifySlackConfig" ] } )
`setup.py` içindeki esas önemli kısım “entry_points”. Stevedore bu sayede eklentimizi bulup sisteme entegre ediyor.
Gördüğünüz gibi eklenti özelliği ve kod genelinde kullanılan sinyaller, çeşitli olayları izleyip bunlar üzerine istediğimiz aksiyonları almamıza olanak tanıyor ve Open edX’e özellik eklemek için sadece hayal gücünüzle sınırlı bir alan açıyor. Serinin ikinci bölümünde Open edX’i nasıl temalandırabileceğinizden bahsedeceğiz.
Ali Işıngör
Ege selam,
XBlock ile eklenti arasındaki fark nedir, benim kafamda çok da net olmayan bir ayrım. Biraz açabilir misin?
Ege Güneş
Selam,
XBlock, kurs seviyesindeki bileşenleri özelleştirmek veya yeni bileşenler yaratmak için tasarlanmış bir sistem. Bir XBlock’un çalışabilmesi için kendini en az bir kurs ile eşleştirmesi gerekiyor ve işlevselliği sadece o kurslar için geçerli hale geliyor. Buna karşılık bir eklenti, herhangi bir kurstan bağımsız şekilde sisteme entegre olup işlevini yerine getirebiliyor.
Burada özet geçmiş olayım. Serinin 3. bölümünde XBlock’tan detaylı şekilde bahsedeceğim.
Geribildirim: Open edX'i Özelleştirmek – Bölüm II: Temalar - Artistanbul
Geribildirim: Open edX'i Özelleştirmek - Bölüm III: XBlock - Artistanbul