Пример #1
0
class ScrumPy(object):
	'''
    O ScrumPy gerencia toda a parte lógica e a comunicação
    com a Interface com o Usuário (ScrumPy é uma Fachada).
    '''

	def __init__(self):
		self.__listaUsuarios = ListaUsuarios()
		self.__listaProjetos = ListaProjetos()
		self.__projetoAtual = None
		self.__usuarioAtual = None

	# @ParamType login 
	# @ParamType senha 
	def logarUsuario(self, login, senha):
		'''
		Consulta a lista de usuários em busca do usuário que possui o
		login informado, a partir do login e da senha, e o define como
		o usuário atual do programa.
		'''		
		usuario = self.__listaUsuarios.logarUsuario(login, senha)
		self.__definirUsuarioAtual(usuario)
		self.__definirProjetoAtual(None)

	# @ParamType usuario 
	def __definirUsuarioAtual(self, usuario):
		'''
		Define o usuário dado como o usuário atual do programa, 
		registrando-o no ScrumPy.
		'''		
		self.__usuarioAtual = usuario

	def __verificarSeUsuarioLogado(self):
		if self.__usuarioAtual == None:
			raise UsuarioNaoLogado
		
		
	def __verificarSeUsuarioAdmin(self):
		if not self.__listaUsuarios.ehAdmin(self.__usuarioAtual.obterLogin()):
			raise UsuarioSemPermissao
	# @ParamType nome 
	# @ParamType login 
	# @ParamType senha 
	def cadastrarUsuario(self, nome, login, senha):
		'''
		Delega o cadastro de um novo usuário à lista de usuários, 
		informando o nome, login e senha do novo usuário.
		'''
		self.__verificarSeUsuarioLogado()
		
		self.__verificarSeUsuarioAdmin()
		self.__listaUsuarios.cadastrarUsuario(nome, login, senha)

	def obterUsuarios(self):
		'''
		Informa o login de todos os usuários cadastrados no sistema.
		'''
		self.__verificarSeUsuarioLogado()
		
		return self.__listaUsuarios.obterUsuarios()

	# @ParamType nome 
	# @ParamType time 
	# @ParamType prodOwner 
	# @ParamType scrumMaster 
	def criarProjeto(self, nome, time, prodOwner, scrumMaster):
		'''
		Primeiro, verifica se todos os logins informados são validos.
		Após isso, delega a criação de um novo projeto à fabrica de projetos,
		informando todos os logins necessários: nome, time, prodOwner e
		scrumMaster. Por fim, registra este projeto na lista de projetos.
		'''
		self.__verificarSeUsuarioLogado()
		
		if not self.__listaUsuarios.ehAdmin(self.__usuarioAtual.obterLogin()):
			raise UsuarioSemPermissao
		
		logins = time + [prodOwner, scrumMaster]
		self.__listaUsuarios.verificarUsuarios(logins)
		fabricaProjetos = FabricaProjetos.getInstance()
		projeto = fabricaProjetos.criarProjeto(nome, time, prodOwner, scrumMaster)
		self.__listaProjetos.adicionarProjeto(projeto)
		return projeto.obterId()

	def obterProjetosParticipados(self):
		'''
		Informa todos os projetos com participação do usuário atual.
		'''
		self.__verificarSeUsuarioLogado()
		
		return self.__listaProjetos.obterProjParticipados(self.__usuarioAtual.obterLogin())

	# @ParamType idProj 
	def abrirProjeto(self, idProj):
		
		'''
		Informa o nome e o id do projeto cuja id foi informada e
		registra o projeto como atual no sistema.
		'''
		projetosParticipados = self.obterProjetosParticipados()		
		
		projeto = self.__listaProjetos.obterProjeto(idProj)
		
		if idProj not in projetosParticipados:
			raise NaoParticipaDoProjeto
		
		info = projeto.obterInfo()
		self.__definirProjetoAtual(projeto)
		return info

	def obterEstorias(self):
		'''
		Informa todas as estorias e tarefas do projeto atual.
		'''
		if self.__projetoAtual == None:
			raise SemProjetoAberto
		
		mapaEstoriasTarefas = []
		estorias = self.__projetoAtual.obterEstorias()
		for estoria in estorias:
			tarefas = self.__projetoAtual.obterTarefasDeEstoria(estoria)
			mapaEstoriasTarefas.append((estoria, tarefas))
		return mapaEstoriasTarefas
	
	def obterTarefasDeEstoria(self, estoria):
		return self.__projetoAtual.obterTarefasDeEstoria(estoria)
		
	# @ParamType projeto 
	def __definirProjetoAtual(self, projeto):
		'''
		Define o projeto dado como o atual, armazenando o seu id.
		'''
		self.__projetoAtual = projeto

	# @ParamType duracao 
	# @ParamType estoriasEscolhidas 
	# @ParamType mapaTarefasMembros 
	def criarSprintBackLog(self, duracao, estoriasEscolhidas, mapaTarefasMembros):
		'''
		Verifica se a duração da sprint é valida, se os usuários existem.
		Delega  a verificação da existencia das estorias, das tarefas, a
		definição dos responsáveis das respectivas tarefas e delega a 
		criação da sprintBackLog ao projeto atual.
		'''
		if self.__projetoAtual == None:
			raise SemProjetoAberto

		if self.__projetoAtual.obterProdOwner() != self.__usuarioAtual.obterLogin():
			raise UsuarioSemPermissao
				
		if duracao <= 0:
			raise DuracaoInvalida
		self.__projetoAtual.verificarEstorias(estoriasEscolhidas)
		self.__projetoAtual.verificarTarefasExistem(mapaTarefasMembros.keys())
		self.__listaUsuarios.verificarUsuarios(mapaTarefasMembros.values())
		self.__projetoAtual.definirResponsaveis(mapaTarefasMembros)
		self.__projetoAtual.criarSprintBackLog(estoriasEscolhidas, duracao)


	# @ParamType nome 
	# @ParamType descricao 
	# @ParamType tarefas 
	def criarEstoria(self, nome, descricao, tarefas):
		
		'''
		Delega a criação de uma estoria ao projeto atual, informando
		o nome, descrição e tarefas dados.
		'''
		if self.__projetoAtual == None:
			raise SemProjetoAberto
		
		if self.__projetoAtual.obterProdOwner() != self.__usuarioAtual.obterLogin():
			raise UsuarioSemPermissao
		
		self.__projetoAtual.verificarTarefasPendentes(tarefas)
		self.__projetoAtual.criarEstoria(nome, descricao, tarefas)

	# @ParamType idTarefa 
	def marcarTarefaConcluida(self, idTarefa):
		'''
		Delega a definição de uma tarefa concluída ao projeto atual que
		removendo-a da lista de tarefas.
		'''
		if self.__projetoAtual == None:
			raise SemProjetoAberto
		
		if not self.__projetoAtual.pertenceAoTime(self.__usuarioAtual.obterLogin()):
			raise UsuarioSemPermissao
		
		self.__projetoAtual.marcarTarefaConcluida(idTarefa)

	def obterTarefas(self):
		'''
		Informa as tarefas do projeto atual(contidas na lista de tarefas).
		'''
		if self.__projetoAtual == None:
			raise SemProjetoAberto
		
		return self.__projetoAtual.obterTarefas()

	# @ParamType nome 
	# @ParamType descricao 
	# @ParamType dificuldade 
	# @ParamType tarefasPreRequisitos 
	def criarTarefa(self, nome, descricao, dificuldade, tarefasPreRequisitos, estimativa):
		'''
		Delega criação de uma Tarefa ao projeto atual.
		'''
		self.__verificarSeUsuarioLogado()
		
		login = self.__usuarioAtual.obterLogin()
		if login != self.__projetoAtual.obterScrumMaster() and \
			login != self.__projetoAtual.obterProdOwner():
			raise UsuarioSemPermissao
		
		if self.__projetoAtual == None:
			raise SemProjetoAberto
		
		self.__projetoAtual.verificarTarefasExistem(tarefasPreRequisitos)
		self.__projetoAtual.criarTarefa(nome, descricao, dificuldade, tarefasPreRequisitos, estimativa)

	def obterUsuarioAtual(self):
		'''
		Retorna o usuário atualmente logando no ScrumPy.
		'''
		self.__verificarSeUsuarioLogado()
		
		return self.__usuarioAtual.obterLogin()
	
	def obterProjetoAtual(self):
		'''
		Retorna o projeto atulamente aberto no ScrumPy.
		'''
		if self.__projetoAtual == None:
			raise SemProjetoAberto
		return self.__projetoAtual.obterId()