def __init__(self):
		"""
		Prépare l'API à etre utiliser par l'application.
		Elle va initialiser tout les composants qui seront alors
		utilisable.
		@param self: L'argument implicite.
		@todo: Exporter tout les calendrier ouverts (sous ensemble), checkboxes
		"""
		self._agendas = dict()
		self._fabrique = FabriqueExporteur()
class ModeleAgenda(object):
	"""
	La classe qui permet de manipuler les L{Agenda}s et toutes les fonctionnalités
	liées.
	C'est elle qui va contenir tous les éléments que la Vue va pouvoir lire.
	Elle permet essentiellement de stocker les Agendas ouverts.
	B{Mais aussi de gérer l'ouverture/fermeture de dépendances (vu que cela consiste
	à charger/décharger des fichiers).}
	@ivar _agendas: un dictionnaire mappant des L{Agenda}s par leurs noms
	@ivar _fabrique: La fabrique d'exporteurs pour les différentes exportations.
	@author: Laurent Bardoux p1108365
	@version: 1.0
	"""
	
	def __init__(self):
		"""
		Prépare l'API à etre utiliser par l'application.
		Elle va initialiser tout les composants qui seront alors
		utilisable.
		@param self: L'argument implicite.
		@todo: Exporter tout les calendrier ouverts (sous ensemble), checkboxes
		"""
		self._agendas = dict()
		self._fabrique = FabriqueExporteur()
	#__init__
	
	
	def chargerAgenda(self, nomFichier):
		"""
		Cette fonction permet de charger un Agenda dans le dictionnaire.
		nomFichier sera traité pour nommer l'Agenda.
		@param self: L'argument implicite.
		@type nomFichier: str
		@param nomFichier: le nom du fichier dont on doit lire le contenu pour créer un Agenda
		@raise IOError: Si un problème concernant la lecture/ouverture du fichier arrive.
		@raise ValueError: Si le fichier n'est pas un ICS.
		@rtype: L{Agenda}
		@return: L'agenda qui a été chargé, mappé par son nom (accessible par agenda.nom)
		@todo: cas ou le fichier est déjà chargé, doublons de noms, confirmation, attente, etc
		"""
		agenda = Agenda.Agenda(nomFichier, datetime.now().year)
		importer(agenda, nomFichier)
		self._agendas[nomFichier] = agenda
		return agenda
	#chargerAgenda
	
	
	def dechargerAgenda(self, agenda):
		"""
		Cette fonction permet de décharger un Agenda de la mémoire.
		Il ne sera donc plus pris en compte par le modèle.
		Il doit donc en conséquence ne plus etre accessible par la Vue
		du coté vue.
		Rien se sera sauvegardé non plus, à la charge de la vue de notifier
		l'utilisateur.
		@param self: L'argument implicite
		@type agenda: L{Agenda}
		@param agenda: L'agenda à décharger
		"""
		cible = self._agendas.get(agenda.nomComplet, None)
		if cible is not None:
			cible.detruire()
			del self._agendas[agenda.nomComplet]
			del agenda
		#if
	#dechargerAgenda
	
	
	def ajouterDependanceA(self, agenda, nomFichier):
		"""
		Permet d'ajouter une dépendance à un L{Agenda}, importée depuis
		le fichier nomFichier.
		@param self: L'argument implicite
		@type agenda: L{Agenda}
		@param agenda: L'agenda sur lequel ajouter la dépendance
		@type nomFichier: str
		@param nomFichier: un nom de fichier existant
		@raise IOError: Si un problème arrive avec les opérations sur nomFichier
		"""
		dependance = Dependance.Dependance(nomFichier, datetime.now().year)
		importer(dependance, nomFichier)
		agenda.insererFils(dependance)
	#ajouterDependanceA
	
	
	def enleverDependanceDe(self, agenda, nomDependance):
		"""
		Permet de retirer une dépendance de I{agenda}, en se basant sur
		son nom I{nomDependance}.
		Il faut savoir que la recherche d'une dépendance se fait uniquement
		au niveau inférieur de l'agenda cible (ie parmis les fils directs)
		@param self: L'argument implicite
		@type agenda: L{Agenda}
		@param agenda: un agenda duquel on veut retirer une dépendance.
		@type nomDependance: str
		@param nomDependance: le nom de fichier qui représente la dépendance
		"""
		# savoir si on fonctionne par nom ou par références
		agenda.retirerFils(nomDependance)
	#enleverDependanceDe
	
	
	def sauvegarderAgenda(self, agenda, nomDeSauvegarde=None):
		"""
		Permet de sauvegarder un agenda, pour pouvoir le charger plus tard.
		Si on ne fournit pas le nomDeSauvegarde, on utilisera le nom de
		l'agenda.
		@param self: L'argument implicite.
		@type agenda: L{Agenda}
		@param agenda: L'agenda que l'on veut sauvegarder.
		@type nomDeSauvegarde: str
		@param nomDeSauvegarde: un nom de fichier valide
		@raise IOError: Si un problème de droit, d'ecriture, d'ouverture survient.
		"""
		nom = agenda.nomComplet
		if nomDeSauvegarde is not None:
			nom = nomDeSauvegarde
		#if
		exporteur = self._fabrique.fabrique(exporteurs.ICS, nom)
		exporteur.exporter(agenda)
	#sauvegarderAgenda
	
	
	def faireDiff(self, agenda1, agenda2):
		"""
		Lance une comparaison entre I{agenda1} et I{agenda2}.
		@param self: L'argument implicite.
		@type agenda1: L{Agenda}
		@param agenda1: le premier agenda à comparer.
		@type agenda2: L{Agenda}
		@param agenda2: le second agenda à comparer.
		@rtype: L{Diff}
		@return: Renvoi un objet Diff contenant les différences.
		"""
		if agenda1 is None or agenda2 is None:
			raise ValueError()
		#if
		monDiff = Diff(agenda1, agenda2)
		monDiff.comparer()
		return monDiff
	#faireDiff
	
	
	def avoirAgendaParNomComplet(self, nom):
		"""
		Permet de récupérer un agenda grace à son nom (complet ou non)
		@param self: L'argument implicite
		@type nom: str
		@param nom: le nom (complet ou non) de l'agenda que l'on veut.
		@raise ValueError: si le nom n'existe pas dans le conteneur
		@rtype: L{Agenda}
		@return: L'agenda voulu si il existe dans le conteneur.
		"""
		if nom not in self._agendas.keys():
			for agenda in self._agendas.values():
				if agenda.nom == nom or agenda.nomComplet == nom:
					return agenda
				#if
			#for
			raise ValueError("L'agenda " + str(nom) + " est inconnu !")
		#if
		return self._agendas.get(nom)
	#avoirAgendaParNomComplet
	
	
	def exporterAuFormatTxt(self, agenda, nomExport):
		"""
		Permet d'exporter l'I{agenda} au format texte.
		@param self: L'argument implicite.
		@type agenda: L{Agenda}
		@param agenda: L'agenda que l'on veut exporter.
		@type nomExport: str
		@param nomExport: le nom sous lequel exporter (nom de fichier)
		@raise IOError: si un problème survient avec les manipulations de fichiers.
		"""
		exporteur = self._fabrique.fabrique(exporteurs.TXT, nomExport)
		exporteur.exporter(agenda)
	#exporterAuFormatTxt
	
	
	@property
	def agendas(self):
		"""Un accesseur pour les agendas disponibles"""
		return self._agendas