Пример #1
2
    parser.add_argument('quiz', help="The category to check", default='TEST 1')
    args = parser.parse_args()


    config = ConfigParser.ConfigParser()
    config.read([args.config, os.path.expanduser('~/.moodleapi.cfg')])

    username = config.get("account", "user")
    password = config.get("account", "pass")
    course = args.course

    if args.user:
        username = parser.user
    if args.password:
        password = args.password

    m = Moodle(args.url)
    m.login(username, password)
    m.course = course
    result = m.extract_quiz(args.quiz)
    with open("overview.csv", "w") as f:
        f.write("duration,points\n")
        for r in result:
            f.write("{0},{1}\n".format(r["duration"].total_seconds(), r["total_points"]))

    for i in [0, 1]:
        with open("q.csv".format(i+1), "w") as f:
            f.write("duration,tries,points\n")
            for r in result:
                f.write("{0},{1},{2}\n".format(r["duration"].total_seconds(), r["questions"][i]["tries"], r["questions"][i]["points"]))
Пример #2
0
class Moodle_parser(object):
    def __init__(self, username, password):
        self.output_dir = "output/"
        self.database = "database.json"
        self.db = {}

        self.moodle = Moodle(username, password)
        if not self.moodle.login():
            exit()

        self.initDatabase()

    def makeDir(self, path):
        os.makedirs(path, exist_ok=True)

    def fileWrite(self, filePath, text):
        with open(filePath, "w") as f:
            f.write(text)
        return True

    def sanitizeInput(self, inputText):
        #specialchars list (excluding `-`, `_`, `/` and `.`)
        punc = string.punctuation. \
            replace("-", ""). \
            replace("_", ""). \
            replace(".", ""). \
            replace("/", "")

        #replacement chars
        reps = [
            ["æ", "ae"],
            ["ø", "oe"],
            ["å", "aa"],
            [" ", "-"],
            ["_", "-"],
        ]

        # lowercase it
        inputText = inputText.lower()

        # remove all puncution chars
        for char in punc:
            inputText = inputText.replace(char, "")

        # replace chars
        for rep in reps:
            inputText = inputText.replace(rep[0], rep[1])

        # replace double `-`
        strLen = len(inputText)
        while True:
            inputText = inputText.replace("--", "-")
            
            if len(inputText) == strLen:
                break
            strLen = len(inputText)

        return inputText

    def initDatabase(self):
        if not os.path.isfile(self.database):
            self.fileWrite(self.database, '{"files": []}')
        data = open(self.database, "r").read()
        self.db = json.loads(data)
        return True

    def saveDatabase(self):
        self.fileWrite(self.database, json.dumps(self.db))

    def findFile(self, fileid = None, href = None, etag = None, sha1 = None):
        for mFile in self.db["files"]:
            if (href and mFile["href"] == href or
                etag and mFile["etag"] == etag or 
                fileid and mFile["fileid"] == fileid or
                sha1 and mFile["sha1"] == sha1):
                return mFile
        return False

    def getFile(self, href, folder):
        headers = {}
        fileDb = self.findFile(href=href)
        if fileDb:
            headers["If-None-Match"] = fileDb["etag"]

        r = self.moodle.getFile(href, tempfile = "file.tmp", headers=headers)
        
        if not r:
            return False

        if r.status_code == 304:
            return True

        d = r.headers["content-disposition"]
        fname = re.findall("filename=(.+)", d)
        fname = fname[0][1:-1]

        self.db["files"].append({
            "etag": r.headers["Etag"],
            "href": href,
        })

        os.rename("file.tmp", folder+"/"+self.sanitizeInput(fname))

        return True

    def download_files(self):
        semesters = self.moodle.semesters()

        if not semesters:
            return False

        for semester in semesters:
            if not semester["name"] == "Autumn 2018":
                continue

            self.getSemester(semester)

    def getSemester(self, semester):
        semesterName = self.sanitizeInput(semester["name"])
        semesterFolder = self.output_dir+semesterName
        self.makeDir(semesterFolder)

        for course in semester["courses"]:
            courseDict = self.moodle.course(course["href"])
            if not courseDict:
                continue

            self.getCourse(semesterFolder, course, courseDict)

    def getCourse(self, folder, course, sections):
        courseName = self.sanitizeInput(course["name"][:course["name"].rfind("(")-1])
        courseFolder = folder+"/"+courseName
        self.makeDir(courseFolder)

        for section in sections:
            self.getSection(courseFolder, section)

    def getSection(self, folder, section):
        sectionName = self.sanitizeInput(section["name"]).replace(".", "")
        sectionFolder = folder+"/"+section["number"]+"-"+sectionName
        self.makeDir(sectionFolder)

        if section["summary"]:
            self.fileWrite(sectionFolder+"/summary.txt", section["summary"])

        for child in section["children"]:
            if child["type"] == "resource":
                self.getFile(child["href"], sectionFolder)
            elif child["type"] == "folder":
                folderName = self.sanitizeInput(child["name"])
                folderFolder = sectionFolder+"/"+folderName
                self.makeDir(folderFolder)
                if child["text"]:
                    self.fileWrite(folderFolder+"/summary.txt", child["text"])

                for f in child["files"]:
                    self.getFile(f["href"], folderFolder)
            elif child["type"] == "page":
                pageName = self.sanitizeInput(child["name"])
                if child["text"]:
                    self.fileWrite(sectionFolder+"/"+pageName, child["text"])
Пример #3
0
                        help="Password to use to connect")
    parser.add_argument('--config',
                        dest='config',
                        help='config file to load',
                        default='moodle.cfg')
    parser.add_argument('--url',
                        dest='url',
                        help='moodle base url',
                        default='https://csimoodle.ucd.ie/moodle/')

    parser.add_argument('category',
                        help="The category to check",
                        default='TEST 2')
    args = parser.parse_args()

    config = ConfigParser.ConfigParser()
    config.read([args.config, os.path.expanduser('~/.moodleapi.cfg')])

    username = config.get("account", "user")
    password = config.get("account", "pass")
    course = args.course

    if args.user:
        username = parser.user
    if args.password:
        password = args.password

    m = Moodle(args.url)
    m.login(username, password)
    m.course = course
    m.check_questions(args.category, verify)