#! /usr/bin/python
# -*- coding: cp1252 -*-

## kodifikazioak: cp1252, iso-8859-1, utf8, ...

#=========================================
# (c) Alfredo Barrainkua. Lizentzia: GPL3
#=========================================

# Filename: ordu2ical.py



__module_name__ = "Ordutegiak iCAL-era"
__module_version__ = "1.4"
__module_description__ = "Ordutegien datu-basean oinarriturik, irakasleen, ikasle taldeen eta gelen egutegi fitxategiak sortzen ditu"
__module_author__ = "Alfredo Barrainkua"


###############################################################################################################

#						Ordutegiak to iCal

###############################################################################################################
#
# 1.0 - 2008.03.17
#	Hasierako bertsioa
# 1.1 - 2008-08-03
#	Literalen zuzenketa batzuk
# 1.2 - 2008-09-25
#	Log fitxategian, "Gela:" jartzen duen tokian, "Gela / Aula:" jarri
# 1.3 - 2008-10-23
#	TZID:\nX-LIC-LOCATION -> TZID:X-LIC-LOCATION
#	Akats hau (2 lerrotan jarri) dela eta, Zimbrak errorea ematen zuen inportatzerakoan
#	Orain, ez du "-" irakasle / talde / gelaren ordutegia sortzen.
# 1.4 - 2009-02-17
#	Ikasle taldeen eta ikasgelen ordutegiak ongi sortzen ditu
#
###############################################################################################################

import string, readline
import sys, commands
import MySQLdb
from datetime import date
from time import time, localtime, strftime
import codecs


# Scriptaren izena / Nombre del programa
PRGNAME = "ordu2ical"

# UID-an jartzeko domeinuia / Dominio de la escuela. Para el UID
DOMAIN = "@iurreta-institutua.net"

# Noiz hasten den ordutegia. Lehenengo astelehena: 2008.09.08
# Inicio del calendario. Primer lunes: 2008.09.08
EGUNA = {"L": "20080908", "M": "20080909", "X": "20080910", "J": "20080911", "V": "20080912"}
H_ORDUA1 = {"1": "081500", "2": "091500", "3": "101500", "4": "114500", "5": "124500", "6": "134500", "7": "", "8": "180000", "9": "190000", "10": "200000", "11": "210000"}
H_ORDUA2 = {"1": "081500", "2": "091000", "3": "100500", "4": "110000", "5": "122500", "6": "131500", "7": "140500", "8": "180000", "9": "190000", "10": "200000", "11": "210000"}
B_ORDUA1 = {"1": "091500", "2": "101500", "3": "111500", "4": "124500", "5": "134500", "6": "144500", "7": "", "8": "190000", "9": "200000", "10": "210000", "11": "220000"}
B_ORDUA2 = {"1": "091000", "2": "100500", "3": "110000", "4": "115500", "5": "131500", "6": "140500", "7": "145500", "8": "190000", "9": "200000", "10": "210000", "11": "220000"}

# Azken eguna: 2009.06.30 / Ultimo dia: 2009.06.30
A_EGUNA = "20090630"

# Literalak. Euskaraz eta gazteleraz / Literales. En euskara y castellano
# Egutegien komentarioak zein hizkuntzatan sortu nahi dituzun aukeratzeko, ezkomentatu erabili nahi duzun hizkuntza, eta komentatu bestea
# Seleccin del idioma a utilizar en la creacion de los calendarios. Descomenta el idioma deseado y comenta el otro
# == EUSKERA ==
G = "Zaintza"
RDP = "Bilera"
G_GELA = "Irakasle gela"
RDP_GELA = "Alorgunea"
G_DESC = "Irakasle gelan egon behar da. Ez ahaztu zaintza liburuan sinatzea."
RDP_DESC = "\\nAlorreko bilerak: Alorgunean\\nTutore bilerak: Irakasle gelan\\nAlorburu bilerak: NA104 gelan "
I_DESC = "Irakaslea: "
A_DESC = "Irakasgaia: "
T_DESC = "Taldea: "
GL_DESC = "Gela: "

# == CASTELLANO ==
# G = "Guardia"
#RDP = "Reunion"
#G_GELA = "Sala de profesores"
#RDP_GELA = "Departamento"
# G_DESC = "Se ha de permanecer en la sala de profesores. No olvidaros de firmar en el libro de guardias."
# RDP_DESC = "\\nReuniones de departamento: Departamento\\nReuniones de tutores: Sala de profesores\\nReuniones de jefes de departamento: Direccion"
# I_DESC = "Profesor: "
# A_DESC = "Asignatura: "
#T_DESC = "Grupo: "
#GL_DESC = "Aula: "


# .ics fitxategien kokapena / Ubicacion de ficheros .ics
PATH = "ical/"

# Datu-basea kudeatzeko baloreak / Datos de gestion de la base de datos
# Soilik irakurtzeko erabiltzailea / Usuario de solo lectura
HOST = "10.22.3.8"
USER = "weborria"
PASSWORD = "weborria"
DATABASE = "ordutegiak"


# Datu-basea kudeatzeko funtzioak / Funciones de acceso a la base de datos
# Datu-basearen egitura: / Estructura de la base de datos:
# 0-	Irakaslea varchar(24)			# Profesor
# 1-	Eguna varchar(2)			# Dia
# 2-	Ordua varchar(2)			# Hora
# 3-	Asignatura varchar(12)			# Asignatura
# 4-	Taldea varchar(12)			# Grupo
# 5-	Gela varchar(12)			# Aula
# 6-	Jarduera varchar(5)			# Actividad (RDP / G / LEC)
#
def hartu_irakasle_zerrenda () :
	print "Irakasle zerrenda hartzen / Tomando la lista de profesores"
	db = MySQLdb.connect(host = HOST, user = USER, passwd = PASSWORD, db = DATABASE)
	cursor = db.cursor()
	cursor.execute("SET NAMES 'utf8'")
	cursor.execute("SELECT DISTINCT Irakaslea FROM ordutegiak ORDER BY Irakaslea", ())
	lines = cursor.fetchall()
	cursor.close()
	db.close()
	return lines

def hartu_talde_zerrenda () :
	print "Talde zerrenda hartzen / Tomando la lista de grupos"
	l_kop = 0
	db = MySQLdb.connect(host = HOST, user = USER, passwd = PASSWORD, db = DATABASE)
	cursor = db.cursor()
	cursor.execute("SET NAMES 'utf8'")
	cursor.execute("SELECT DISTINCT Taldea FROM ordutegiak ORDER BY Taldea", ())
	lines = cursor.fetchall()
	cursor.close()
	db.close()
	return lines

def hartu_gela_zerrenda () :
	print "Gela zerrenda hartzen / Tomando la lista de aulas"
	l_kop = 0
	db = MySQLdb.connect(host = HOST, user = USER, passwd = PASSWORD, db = DATABASE)
	cursor = db.cursor()
	cursor.execute("SET NAMES 'utf8'")
	cursor.execute("SELECT DISTINCT Gela FROM ordutegiak ORDER BY Gela", ())
	lines = cursor.fetchall()
	cursor.close()
	db.close()
	return lines


def hartu_irakasle_ordutegia (Izena) :
	print Izena + "-ren ordutegia hartzen / Tomando el horario de " + Izena
	db = MySQLdb.connect(host = HOST, user = USER, passwd = PASSWORD, db = DATABASE)
	cursor = db.cursor()
	cursor.execute("SET NAMES 'utf8'")
	cursor.execute("SELECT * FROM ordutegiak WHERE Irakaslea = %s", (Izena))
	lines = cursor.fetchall()
	cursor.close()
	db.close()
	return lines

def hartu_talde_ordutegia (Taldea) :
	print Taldea + " taldearen ordutegia hartzen / Tomando el horario del grupo " + Taldea
	db = MySQLdb.connect(host = HOST, user = USER, passwd = PASSWORD, db = DATABASE)
	cursor = db.cursor()
	cursor.execute("SET NAMES 'utf8'")
	cursor.execute("SELECT * FROM ordutegiak WHERE Taldea = %s", (Taldea))
	lines = cursor.fetchall()
	cursor.close()
	db.close()
	return lines

def hartu_gela_ordutegia (Gela) :
	print Gela + " gelaren ordutegia hartzen / Tomando el horario del aula " + Gela
	db = MySQLdb.connect(host = HOST, user = USER, passwd = PASSWORD, db = DATABASE)
	cursor = db.cursor()
	cursor.execute("SET NAMES 'utf8'")
	cursor.execute("SELECT * FROM ordutegiak WHERE Gela = %s", (Gela))
	lines = cursor.fetchall()
	cursor.close()
	db.close()
	return lines


# Urteko ordu aldaketa biak / Los dos cambios horarios anuales
def jarri_ical_ordu_aldaketak (icalfile) :
	icalfile.write ("BEGIN:VTIMEZONE\n")
	icalfile.write ("TZID:X-LIC-LOCATION\n")
	icalfile.write ("BEGIN:DAYLIGHT\n")
	icalfile.write ("TZOFFSETFROM:+0100\n")
	icalfile.write ("TZOFFSETTO:+0200\n")
	icalfile.write ("TZNAME:CEST\n")
	icalfile.write ("DTSTART:19700329T020000\n")
	icalfile.write ("RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\n")
	icalfile.write ("END:DAYLIGHT\n")
	icalfile.write ("BEGIN:STANDARD\n")
	icalfile.write ("TZOFFSETFROM:+0200\n")
	icalfile.write ("TZOFFSETTO:+0100\n")
	icalfile.write ("TZNAME:CET\n")
	icalfile.write ("DTSTART:19701025T030000\n")
	icalfile.write ("RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n")
	icalfile.write ("END:STANDARD\n")
	icalfile.write ("END:VTIMEZONE\n")



#-----------------------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------------------

# Erregistro fitxategiaren izena / Nombre del fichero de logs
gaur_d = date.today()
LOGFILE = PRGNAME + gaur_d.strftime("%Y%m%d") + "-" + strftime("%H%M%S", localtime()) + ".log"
print LOGFILE



# Erregistroa idazteko fitxategia ireki / Abrir el fichero de logs
logfile = open (LOGFILE, "w")

# Erregistro fitxategiko goiburua idatzi / Cabecera del fichero de logs
logfile.write ("**********************************************************************************\n")
logfile.write ("** 				LOG FITXATEGIA					**\n")
logfile.write ("**********************************************************************************\n\n")


# Momentuko data VCALENDAR formatuan (EZ ISO8601) / Fecha y hora actual en formato VCALENDAR
TSTAMP = gaur_d.strftime("%Y%m%d") + "T" + strftime("%H%M%S", localtime()) + "Z"

logfile.write("Sortze data / Fecha creacion: " + TSTAMP + "\n\n")


# Hartu irakasleen zerrenda / Toma la lista de profesores
zerrenda = hartu_irakasle_zerrenda ()
# Sortu irakasleen egutegi fitxategi guztiak / Crea todos los ficheros de calendario de los profesores
for lerroa in zerrenda :
	irakaslea = lerroa[0]
	if (irakaslea == "-") :
	    continue
	logfile.write("Irakaslea / Profesor: " + irakaslea + "\n")
	# Sortu iCal fitxategia / Crea fichero iCal
#	ICALFILE1 = irakaslea.decode("cp1252")
#	ICALFILE = PATH + ICALFILE1.encode("iso-8859-1") + ".ics"
	ICALFILE = PATH + irakaslea.replace(" ", "_") + ".ics"
	icalfile = open (ICALFILE, "w")
	# Jarri fitxategiaren goiburuak eta ordu aldaketak / Pone la cabecera y cambios horarios en el fichero
	icalfile.write ("BEGIN:VCALENDAR\n")
	icalfile.write ("VERSION:2.0\n")
	icalfile.write ("PRODID:ordu2ical Iurreta GLHB Institutua\n")
	jarri_ical_ordu_aldaketak (icalfile)

	print irakaslea

	# hartu irakasle honen ordu guztiak / Toma todas las horas de este profesor
	orduak = hartu_irakasle_ordutegia (irakaslea)
	# sartu ordutegia / Crea el horario
	for ordua in orduak :
#		print ordua[0] + "*" + ordua[1] + "*" + ordua[2] + "*" + ordua[3] + "*" + ordua[4] + "*" + ordua[5] + "*" + ordua[6]
		icalfile.write ("BEGIN:VEVENT\n")
		icalfile.write ("CREATED:" + TSTAMP + "\n")
		icalfile.write ("LAST-MODIFIED:" + TSTAMP + "\n")
		icalfile.write ("DTSTAMP:" + TSTAMP + "\n")
		# UID-a. Konponenteak: Momentuko deskripzio bat, irakaslea, asignatura, ordua eta domeinua konponenteak.
		# UID. Componentes: Descripcin del momento de creado, profesor, asignatura, la hora y el dominio.
		icalfile.write ("UID:" + TSTAMP + ordua[0] + ordua[1] + ordua[2] + ordua[3] + DOMAIN + "\n")

		# Klasea, bilera edo zaintza / Clase, reunion o guardia
		if ordua[6] == "RDP" :
			icalfile.write ("SUMMARY:" + RDP + "\n")
		elif ordua[6] == "G" :
			icalfile.write ("SUMMARY:" + G + "\n")
		else :
			icalfile.write ("SUMMARY:" + ordua[3] + "\n")
		# Maiztasuna, astero / Frecuencia, semanal, hasta el dia A_EGUNA
		icalfile.write ("RRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=" + A_EGUNA + "\n")

		# Astearte eta asteazkenetan, ordutegia ezberdina da
		# Martes y miercoles, el horario es diferente
		if (ordua[1] == "M") or (ordua[1] == "X" ) :
			icalfile.write ("DTSTART;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + H_ORDUA2[ordua[2]] + "\n")
			icalfile.write ("DTEND;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + B_ORDUA2[ordua[2]] + "\n")
		else :
			icalfile.write ("DTSTART;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + H_ORDUA1[ordua[2]] + "\n")
			icalfile.write ("DTEND;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + B_ORDUA1[ordua[2]] + "\n")

		# Gela / Aula
		if ordua[6] == "RDP" :
			icalfile.write ("LOCATION:" + RDP_GELA + "\n")
			icalfile.write ("DESCRIPTION:" + RDP_DESC + "\n")
		elif ordua[6] == "G" :
			icalfile.write ("LOCATION:" + G_GELA + "\n")
			icalfile.write ("DESCRIPTION:" + G_DESC + "\n")
		else :
			icalfile.write ("LOCATION:" + ordua[5] + "\n")
			icalfile.write ("DESCRIPTION:" + "\\n" + A_DESC + ordua[3] + '\\n' + T_DESC + ordua[4] + '\\n' + GL_DESC + ordua[5] + "\n")
		icalfile.write ("END:VEVENT\n")

	# bukatu eta itxi fitxategia / Finalizar y cerrar el fichero
	icalfile.write ("END:VCALENDAR\n")
	icalfile.close ()



# Hartu taldeen zerrenda / Tomar la lista de grupos
zerrenda = hartu_talde_zerrenda ()
# Sortu taldeen egutegi fitxategi guztiak / Crea el fichero de calendario de todos los grupos
for lerroa in zerrenda :
	taldea = lerroa[0]
	if (taldea == "-") :
	    continue
	logfile.write("Taldea / Grupo: " + taldea + "\n")
	# Sortu iCcal fitxategia / Crea el fichero iCal
	ICALFILE = PATH + taldea.replace(" ", "_") + ".ics"
	icalfile = open (ICALFILE, "w")
	# Jarri fitxategiaren goiburuak eta ordu aldaketak / Pone las cabeceras y cambios de horario del fichero
	icalfile.write ("BEGIN:VCALENDAR\n")
	icalfile.write ("VERSION:2.0\n")
	icalfile.write ("PRODID:ordu2ical Iurreta GLHB Institutua\n")
	jarri_ical_ordu_aldaketak (icalfile)

	print taldea

	# Hartu talde honen ordu guztiak / Toma todas las horas de este grupo
	orduak = hartu_talde_ordutegia (taldea)
	# Sartu ordutegia / Pone el horario
	for ordua in orduak :
#		print ordua[0] + "*" + ordua[1] + "*" + ordua[2] + "*" + ordua[3] + "*" + ordua[4] + "*" + ordua[5] + "*" + ordua[6]
		icalfile.write ("BEGIN:VEVENT\n")
		icalfile.write ("CREATED:" + TSTAMP + "\n")
		icalfile.write ("LAST-MODIFIED:" + TSTAMP + "\n")
		icalfile.write ("DTSTAMP:" + TSTAMP + "\n")
		# UID-a. Konponenteak: Momentuko deskripzio bat, taldea eta domeinua.
		# UID. Componentes: Descripcin del momento de creado, el grupo y el dominio.
		icalfile.write ("UID:" + TSTAMP + ordua[1] + ordua[2] + ordua[3] + DOMAIN + "\n")

		# Zein asignatura daukan / La asignatura
		icalfile.write ("SUMMARY:" + ordua[3] + "\n")
		# Maiztasuna, astero / Frecuencia, semanal, hasta el dia A_EGUNA
		icalfile.write ("RRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=" + A_EGUNA + "\n")

		# Astearte eta asteazkenetan, ordutegia ezberdina da
		# Martes y miercoles, el horario es diferente
		if (ordua[1] == "M") or (ordua[1] == "X" ) :
			icalfile.write ("DTSTART;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + H_ORDUA2[ordua[2]] + "\n")
			icalfile.write ("DTEND;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + B_ORDUA2[ordua[2]] + "\n")
		else :
			icalfile.write ("DTSTART;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + H_ORDUA1[ordua[2]] + "\n")
			icalfile.write ("DTEND;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + B_ORDUA1[ordua[2]] + "\n")

		# Gela
		icalfile.write ("LOCATION:" + ordua[5] + "\n")
		icalfile.write ("DESCRIPTION:" + "\\n" + I_DESC + ordua[0] + "\\n" + A_DESC + ordua[3] + '\\n' + GL_DESC + ordua[5] + "\n")
		icalfile.write ("END:VEVENT\n")

	# bukatu eta itxi fitxategia
	icalfile.write ("END:VCALENDAR\n")
	icalfile.close ()



# Hartu gelen zerrenda / Toma la lista de aulas
zerrenda = hartu_gela_zerrenda ()
# Sortu gelen egutegi fitxategi guztiak / Crea los ficheros de calendarios de las aulas
for lerroa in zerrenda :
	gela = lerroa[0]
	if (gela == "-") :
	    continue
	logfile.write("Gela / Aula: " + gela + "\n")
	# Sortu iCal fitxategia / Crea el fichero iCal
	ICALFILE = PATH + gela.replace(" ", "_") + ".ics"
	icalfile = open (ICALFILE, "w")
	# Jarri fitxategiaren goiburuak eta ordu aldaketak / Pone las cabeceras y cambios de horario del fichero
	icalfile.write ("BEGIN:VCALENDAR\n")
	icalfile.write ("VERSION:2.0\n")
	icalfile.write ("PRODID:ordu2ical Iurreta GLHB Institutua\n")
	jarri_ical_ordu_aldaketak (icalfile)

	print gela

	# Hartu gela honen ordu guztiak / Toma las horas de este aula
	orduak = hartu_gela_ordutegia (gela)
	# Sartu ordutegia / Pone el horario
	for ordua in orduak :
#		print ordua[0] + "*" + ordua[1] + "*" + ordua[2] + "*" + ordua[3] + "*" + ordua[4] + "*" + ordua[5] + "*" + ordua[6]
		icalfile.write ("BEGIN:VEVENT\n")
		icalfile.write ("CREATED:" + TSTAMP + "\n")
		icalfile.write ("LAST-MODIFIED:" + TSTAMP + "\n")
		icalfile.write ("DTSTAMP:" + TSTAMP + "\n")
		# UID-a. Konponenteak: Momentuko deskripzio bat, ordua eta domeinua.
		# UID. Componentes: Descripcin del momento de creado, la hora y el dominio.
		icalfile.write ("UID:" + TSTAMP + ordua[1] + ordua[2] + ordua[3] + DOMAIN + "\n")

		# Zein talde daukan / El grupo que la ocupa
		icalfile.write ("SUMMARY:" + ordua[4] + "\n")
		# Maiztasuna, astero / Frecuencia, semanal, hasta A_EGUNA
		icalfile.write ("RRULE:FREQ=WEEKLY;INTERVAL=1;UNTIL=" + A_EGUNA + "\n")

		# Astearte eta asteazkenetan, ordutegia ezberdina da
		# Martes y miercoles, el horario es diferente
		if (ordua[1] == "M") or (ordua[1] == "X" ) :
			icalfile.write ("DTSTART;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + H_ORDUA2[ordua[2]] + "\n")
			icalfile.write ("DTEND;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + B_ORDUA2[ordua[2]] + "\n")
		else :
			icalfile.write ("DTSTART;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + H_ORDUA1[ordua[2]] + "\n")
			icalfile.write ("DTEND;TZID=/softwarestudio.org/Tzfile/Europe/Madrid:" + EGUNA[ordua[1]] + "T" + B_ORDUA1[ordua[2]] + "\n")

		# Gela / Aula
		icalfile.write ("LOCATION:" + ordua[5] + "\n")
		icalfile.write ("DESCRIPTION:" + "\\n" + I_DESC + ordua[0] + "\\n" + A_DESC + ordua[3] + "\\n" + T_DESC + ordua[4] + "\n")
		icalfile.write ("END:VEVENT\n")

	# Bukatu eta itxi fitxategia / Terminar y cerrar el fichero
	icalfile.write ("END:VCALENDAR\n")
	icalfile.close ()


# Lerro bukaerak CR + LF (VAX / DOS / Windows erakoak) izan behar dute (RFC2445)
# Los finales de linea han de ser CR + LF (VAX / DOS / Windows erakoak). RFC2445
commands.getstatusoutput ("/usr/bin/unix2dos " + PATH + "*.*")


logfile.write("========== Log fitxategiaren amaiera ==========\n")

# Itxi erregistro fitxategia / Cerrar el fichero de logs
logfile.close()

sys.exit(0)

