Open edX’i Özelleştirmek – Bölüm I: Eklentiler

Open edX ve Eklentiler

Open edX’i Özelleştirmek – Bölüm I: Eklentiler

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.

Ege Güneş

Ege Güneş, İstanbul Üniversitesi Hukuk Fakültesi'nden mezun oldu. Günlük yaşamında özgür yazılımlardan yana ve Linux kullanıyor. Favori dağıtımıysa Fedora. Ege, sen bana birini fena halde Android... Ne dersin Akın?

2 Yorumlar
  • Ali Işıngör
    Cevapla
    Gönderim13:32, 22 Ekim 2018

    Ege selam,

    XBlock ile eklenti arasındaki fark nedir, benim kafamda çok da net olmayan bir ayrım. Biraz açabilir misin?

Yorum Yaz

Yorum
İsim
E-Posta
Website