MoodleTasksUnzipper como se hizo

El código

El código esta hecho en python un lenguaje de programación interpretado con el que es posible desarrollar en distintos sistemas.

http://www.python.org/

A continuación comento el código, y las distintas funciones que lleva a cabo. Para comentarlo uso los mismos comentarios de python, ver las líneas que empiezan por ##.

## La primera línea permite al BASH (línea de comandos de Linux) conocer.
## que el programa que hay a continuación se ejecuta con Python.
#!/usr/bin/env python
## El fichero está codificado en UTF-8
# -*- coding: utf-8 -*-

import os, re, zipfile
from zipfile import ZipFile

## En que nivel de directori del fichero de backup, se encuentran las prácticas
## del usuario.
ASSIGNMENT_LEVEL = 4

## El nombre del fichero xml que continen el nombre de los alumnos y información del
## curso, és imprescindible para poner un nombre coherente en la carpeta de cada alumno.
## el fichero moodle.xml se encuentra dentro del archivo de backup.zip
MOODLE_XML_FILENAME = 'moodle.xml'

## Nombre del fichero que contiene la copia de seguridad.
MOODLE_BACKUP_FILENAME = 'backup.zip'

## Directorio donde se encuentran las prácticas de los alumnos dentro de la copia
## de seguridad (backup.zip).
MOODLE_MODDATA_DIR = 'moddata'

## Comprueba si la cadena es un número, o no.
def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

## Descomprimir todo un fichero zip en el directorio actual.
def extractAll(zipName):
    z = ZipFile(zipName)
    for f in z.namelist():
        if f.endswith('/'):
            os.makedirs(f)
        else:
            z.extract(f)

## Dado una ruta hacia un fichero o directorio, renombra el código de usuario de los directorios
## al login del usuario de moodle. El login de usuario se encuentra dentro del fichero moodle.xml
## dentro de la copia de seguridad.
def getNewUserDir(filePath, userList):
  entries = re.split("/", filePath)
  newpath = filePath


  ## Si no disponemos de 4 directorios anidados. No estamos hablando de una entrega
  ## de usuario.
  ## Ejemplo: moddata/assignment/2600/327/
  if (len(entries) < ASSIGNMENT_LEVEL):
    return newpath

    dirUsuari = entries[ASSIGNMENT_LEVEL-1]

    if not is_number(dirUsuari):
      return newpath

    cont = 0
    newpath = ''

    ## Reconstuimos el camino al fichero (path) línea a línea. Sustituyendo el id de usuio por
    ## el login.
    for f in entries:
      fok = f
      if (f == dirUsuari):
        if (dirUsuari in userList):
          fok = userList[dirUsuari]

      if (cont == len(entries)-1):
        newpath = newpath + fok;
        break;
      else:
        newpath = newpath + fok + '/';

      cont = cont + 1

    return newpath

## Extraer los datos de un fichero zip, renombrar los directorios
## de los usuarios de su número de série al login del mismo.
## És más fácil corregir las prácticas de esta forma.
def extractModData(zipName, userList):
  z = ZipFile(zipName)
  for f in z.namelist():
    if MOODLE_MODDATA_DIR in f:
      newf = getNewUserDir(f, userList)
      print newf

      if newf.endswith('/'):
        os.makedirs(newf)
      else:
        ## Descomprimir sin usar el método extract que no permite definir un nuevo directorio
                ## de destino
        data = z.read(f)
        myfile = open(newf, "wb")
        myfile.write(data)
        myfile.close()

        zipExtension = re.search('\.[zZ][iI][pP]$', newf)
        if (not zipExtension is None):
          #TODO: Problemes al descomprimir, ficheros con accento son problematicos.
          try:
            z1 = ZipFile(newf);
            print "Unzipping : " + newf
            z1.extractall(os.path.dirname(newf) + "/")
          except:
            print "Error unzipping ..."

## Descomprime el fichero XML con información del curso.
def extractModXML(zipName):
  z = ZipFile(zipName)
  for f in z.namelist():
    if MOODLE_XML_FILENAME in f:
        data = z.read(f)
        myfile = open(MOODLE_XML_FILENAME, "wb")
        myfile.write(data)
        myfile.close()
        return 1
  return 0

## Obtener el id de usuario a partir del moodle.xml
def obtenirIdUsuari(userList):
  from xml.dom import minidom
  xmldoc = minidom.parse(MOODLE_XML_FILENAME)
  itemlist = xmldoc.getElementsByTagName('USER')
  for s in itemlist :
      id = s.getElementsByTagName('ID')[0].firstChild.data
      sourceName = s.getElementsByTagName('USERNAME')[0].firstChild.data
      userList[id] = sourceName

## Función principal, que ejecuta el programa.
if __name__ == '__main__':
  userList = {}
  try:
    if (extractModXML(MOODLE_BACKUP_FILENAME)!=0):
      obtenirIdUsuari(userList)
      extractModData(MOODLE_BACKUP_FILENAME, userList)
      print "All ok"
    else:
      print "The moodle backup file: backup.zip, must be in the same folder."
  except Exception as error:
      print "Error unziping files: " + str(error)
  print "Press any Key to exit."
  raw_input()

Enlaces a otros blogs