0

Moodle 用のモバイル アプリケーションを作成しようとしています。これには、moodle での Web サービスの作成と有効化が含まれます。Web サービスの作成に成功し、関数 core_course_get_courses および core_course_get_contents を使用してコースとコースの詳細を取得できました。

ここで、moodle からコースの完了ステータスを取得する必要があります。これを行うために使用できる機能はありますか。Web サービスを調べましたが、このデータを提供する関数は見つかりませんでした。これを達成するための外部プラグインはありますか? または他の助け?

4

1 に答える 1

2

私はしばらく前に同様の問題を抱えていました。この問題を解決するには、次の 2 つの方法があると思います。

  1. Moodle 内で完了コースのステータスを返すローカル Web サービスを開発します。それを行う関数は、次の行に沿ったものになります。

    <?php
    require_once("{$CFG->libdir}/completionlib.php");
    $cinfo = new completion_info($course_object);
    $iscomplete = $cinfo->is_course_complete($USER->id);
    ?>
    
  2. Moodle の外部で、コースの完了ページを取得して解析し、値を返す Web サービスを作成します。これは私が個人的に選んだ方法です (ただし、Moodle の UI 更新によって簡単に壊れてしまうため、少し危険です)。

    私はPythonでそれをしました。これは、最初に Web ページを取得するためのコードです。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import urllib, urllib2, cookielib
    
    username = 'USER'
    password = 'PASSWORD'
    wwwroot = 'wwwroot of your moodle'
    remember = 0;
    
    def get_nv_page(url):
        cj = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        login_data = urllib.urlencode({'username' : username, 'password' : password, 'rememberusername': remember})
        opener.open(wwwroot + '/login/index.php', login_data)
        resp = opener.open(url)
        return resp.read()
    
    def get_completion_course(course_id):
        url = wwwroot + '/course/report/completion/index.php?course=' + str(course_id)
        return get_nv_page(url)
    

    そして、それを解析するには...

    import requests, re
    from bs4 import BeautifulSoup
    
    def grab_completion_table(self, raw_doc):
        """ Convert an html course's completion page from moodle into a python list """
        list_video_activities = []
        completion_table = {}
        doc = BeautifulSoup(raw_doc)
        html_table = doc.find('table', id="completion-progress")
        activities = html_table.find_all('th', attrs={ 'class': 'criteriaicon'})
    
        for activity in activities:
            url = activity.find('a', href=re.compile('.*mod\/url\/view.*'))
            if url is not None:
                list_video_activities.append(url['title'])
            else:
                list_video_activities.append(False)
    
        user_rows = html_table.find_all('tr', id=re.compile('user-[0-9]*'))
    
        for user_row in user_rows:
            user_id = user_row['id'].split('-')[1]
            activities_completion_info = user_row.find_all('td', attrs={ 'class': 'completion-progresscell'})
            completion_user_table = []
    
            for i, video_activity in enumerate(list_video_activities):
                if video_activity != False:
                    activity_info = activities_completion_info[i].find('img')['title'].split(',')[1].strip()
                    activity_completion_info = activity_info.split(':')[1].strip()
                    # I put this: [ video_title, completion_status ] 
                    completion_user_table.append((video_activity, activity_completion_info))
    
            completion_table[user_id] = completion_user_table
    
        return completion_table
    

    Python のデータを使用すると、Web サービスを簡単に追加できます。プロジェクトで python を使用できるかどうかはわかりませんが、このアプローチは他の言語でも再現できると思います。

于 2013-09-18T09:02:29.610 に答える