I need to do a validation from the save method, and since it is a college activity, I need to pass the unit tests, however, I am having difficulty in the last test, in which I have to validate if a student is not enrolling in a repeated discipline. (THE CODE MUST BE VALIDATED IN THE REGISTRY CLASS AND MUST BE DONE WITH IF AND EXCEPTION)
from django.db import models
class Professor(models.Model):
def __str__(self):
return self.nome + self.email
nome = models.TextField(max_length=255)
email = models.TextField(max_length=255)
celular = models.TextField(max_length=20)
login = models.TextField(max_length=20)
senha = models.TextField(max_length=20)
def save(self):
print('estou salvando')
if (self.login == ""):
raise Exception("ERRO: Sem Login")
if (self.email == ""):
self.email = "email nao fornecido"
if (Professor.objects.filter(login=self.login).exists()):
raise Exception("ERRO: Sem Email")
if (Aluno.objects.filter(login=self.login)):
raise Exception('ERRO: Login já existe')
super(Professor,self).save()
class Disciplina(models.Model):
def __str__(self):
return self.nome + self.ementa
nome = models.TextField(max_length=50)
ementa = models.TextField(max_length=5000)
def save(self):
print('estou salvando')
if (Disciplina.objects.filter(nome=self.nome).exists()):
raise Exception("ERRO: Disciplina Repetida")
super(Disciplina,self).save()
class DisciplinaOfertada(models.Model):
def __str__(self):
return self.curso + self.turma
curso = models.TextField(max_length=255)
turma = models.TextField(max_length=5)
ano = models.IntegerField() #um inteiro, representa um ano
semestre = models.IntegerField() #um inteiro, 1 para primeiro sem e 2 para segundo
professor = models.IntegerField() #id de um professor valido
disciplina = models.IntegerField() #id de uma disciplina valida
def save(self):
print('estou salvando')
if (self.curso not in ('ADS', 'SI', 'BD')):
raise Exception('ERRO: Curso Inválido')
if ((DisciplinaOfertada.objects.filter(curso=self.curso).exists()) and (DisciplinaOfertada.objects.filter(turma=self.turma).exists()) and (DisciplinaOfertada.objects.filter(ano=self.ano).exists()) and (DisciplinaOfertada.objects.filter(semestre=self.semestre).exists()) and (DisciplinaOfertada.objects.filter(professor=self.professor).exists()) and (DisciplinaOfertada.objects.filter(disciplina=self.disciplina).exists()) ):
raise Exception("ERRO: Disciplina Repetida")
if not(Professor.objects.filter(id=self.professor)):
raise Exception('ERRO: Professor inválido(ID)')
if not(Disciplina.objects.filter(id=self.disciplina)):
raise Exception('ERRO: Disciplina inválido(ID)')
super(DisciplinaOfertada,self).save()
class Aluno(models.Model):
def __str__(self):
return self.nome + self.email
nome = models.TextField(max_length=255)
email = models.TextField(max_length=255)
celular = models.TextField(max_length=20)
login = models.TextField(max_length=20)
senha = models.TextField(max_length=20)
def save(self):
print('estou salvando')
if(self.login == ""):
raise Exception("ERRO: Sem Login")
if(self.email == ""):
self.email = "email nao fornecido"
if (Aluno.objects.filter(login=self.login).exists()):
raise Exception("ERRO: Sem Email")
if(Professor.objects.filter(login=self.login)):
raise Exception('ERRO: Login já existe')
super(Aluno,self).save()
class Matricula(models.Model):
def __str__(self):
return self.aluno + self.disciplinaOfertada
aluno = models.IntegerField()
disciplinaOfertada = models.IntegerField()
def save(self):
print('estou salvando')
if(self.disciplinaOfertada == 4):
raise Exception('ERRO: O aluno só pode fazer 4 matrículas simultâneas')
super(Matricula,self).save()
The tests are these:
from django.test import TestCase
from .models import *
# Create your tests here.
class ProfessorTests(TestCase):
'''
Isso nao é um teste. Pode ignorar
'''
def setUp(self):
professor = Professor()
professor.login='astro'
professor.save()
try:
disciplina = Disciplina()
except:
return
disciplina = Disciplina()
disciplina.nome = 'Agronomia'
disciplina.save()
'''
Testa os campos que o professor tem que ter (veja o teste)
'''
def test_01_criar_professor(self):
professor = Professor()
professor.email='[email protected]'
professor.nome='lucas'
professor.celular='99999'
professor.login='lucas'
professor.senha='lucas123'
professor.save()
resultados=Professor.objects.filter(nome='lucas')
resultado = resultados[0]
self.assertEqual(resultado.login,'lucas')
self.assertEqual(resultado.celular,'99999')
self.assertEqual(resultado.nome,'lucas')
self.assertEqual(resultado.email,'[email protected]')
self.assertEqual(resultado.senha,'lucas123')
'''
devemos ter um erro quando o professor vier sem login
'''
def test_02_sem_login(self):
professor = Professor()
professor.nome='lucas'
professor.celular='99999'
professor.senha='lucas123'
self.assertRaises(Exception,professor.save)
'''
quando criamos um professor sem email, seu email deve ser
a string 'email nao fornecido'
'''
def test_03_sem_email(self):
professor = Professor()
professor.nome='lucas'
professor.celular='99999'
professor.login='lucas'
professor.senha='lucas123'
professor.save()
resultados=Professor.objects.filter(nome='lucas')
resultado = resultados[0]
self.assertEqual(resultado.email,'email nao fornecido')
self.assertEqual(len(resultados),1)
'''
Devemos ter um erro se o professor está vindo com um login que já existe
'''
def test_04_login_repetido(self):
professor = Professor()
professor.login='lucas'
professor.save()
professor = Professor()
professor.login='lucas'
self.assertRaises(Exception,professor.save)
'''
Os campos que deve ter uma disciplina
'''
def test_05_disciplina_salvar(self):
disciplina = Disciplina()
disciplina.nome = 'Matematica'
disciplina.ementa = 'resolver equacoes'
disciplina.save()
disciplinas = Disciplina.objects.filter(nome='Matematica')
disciplina_resultante = disciplinas[0]
self.assertEqual(disciplina_resultante.ementa, 'resolver equacoes')
'''
Nao pode haver duas disciplinas com o mesmo nome
'''
def test_06_disciplina_dobrada(self):
disciplina = Disciplina()
disciplina.nome = 'Matematica'
disciplina.save()
disciplina2 = Disciplina()
disciplina2.nome = 'Matematica'
self.assertRaises(Exception,disciplina2.save)
'''
Uma disciplinaOfertada é uma turma. Disciplina seria, por exemplo, lp2
disciplinaOfertada, lp2 no segundo semeste de 2018 para o curso de ADS
Veja os campos de uma disciplina ofertada abaixo
'''
def test_07_ofertada_salvar(self):
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2018
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=1
ofertada.save()
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2018
ofertada.semestre=1
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=1
ofertada.save()
ofertada = DisciplinaOfertada()
ofertada.curso='SI'
ofertada.ano=2018
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=1
ofertada.save()
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2017
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=1
ofertada.save()
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2017
ofertada.semestre=2
ofertada.turma='2b'
ofertada.professor=1
ofertada.disciplina=1
ofertada.save()
ofertas = DisciplinaOfertada.objects.filter(curso='ADS')
self.assertEqual(len(ofertas),4)
ofertas = DisciplinaOfertada.objects.filter(curso='SI')
self.assertEqual(len(ofertas),1)
self.assertEqual(Professor.objects.get(id=1).login,'astro')
self.assertEqual(Disciplina.objects.get(id=1).nome,'Agronomia')
'''
O campo curso pode ter 3 valores distintos: 'ADS', 'SI' e 'BD'
'''
def test_08_ofertada_salvar_curso_invalido(self):
ofertada = DisciplinaOfertada()
ofertada.curso='MAT'
ofertada.ano=2018
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=1
self.assertRaises(Exception,ofertada.save)
'''
Não podemos criar duas ofertadas com o mesmo ano. semestre, turma, curso e disciplina
Alguma dessas coisas tem que variar
'''
def test_09_ofertada_repetida(self):
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2018
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=1
ofertada.save()
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2018
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=1
self.assertRaises(Exception,ofertada.save)
'''
Temos que tomar cuidado para usarmos Ids válidas de professor e de disciplina, ao definir uma
disciplinaOfertada
'''
def test_10_ofertada_mal_definida_prof_ou_disciplina(self):
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2018
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=100
ofertada.disciplina=1
self.assertRaises(Exception,ofertada.save)
ofertada.professor=1
ofertada.disciplina=100
self.assertRaises(Exception,ofertada.save)
ofertada.professor=1
ofertada.disciplina=1
ofertada.save()
'''
Aluno é um modelo igual ao professor
'''
def test_11_criar_aluno(self):
aluno = Aluno()
aluno.email='[email protected]'
aluno.nome='lucas'
aluno.celular='99999'
aluno.login='lucas'
aluno.senha='lucas123'
aluno.save()
resultados=Aluno.objects.filter(nome='lucas')
resultado = resultados[0]
self.assertEqual(resultado.login,'lucas')
self.assertEqual(resultado.celular,'99999')
self.assertEqual(resultado.nome,'lucas')
self.assertEqual(resultado.email,'[email protected]')
self.assertEqual(resultado.senha,'lucas123')
'''
Que também nao aceita ficar sem email, e troca para
'email nao fornecido'
'''
def test_12_sem_email(self):
professor = Aluno()
professor.nome='lucas'
professor.celular='99999'
professor.login='lucas'
professor.senha='lucas123'
professor.save()
resultados=Aluno.objects.filter(nome='lucas')
resultado = resultados[0]
self.assertEqual(resultado.email,'email nao fornecido')
self.assertEqual(len(resultados),1)
'''
Também dá erro sem login
'''
def test_13_sem_login(self):
aluno = Aluno()
aluno.nome='lucas'
aluno.celular='99999'
aluno.senha='lucas123'
self.assertRaises(Exception,aluno.save)
'''
E tem erro com login repetido
'''
def test_14_login_repetido(self):
aluno = Aluno()
aluno.login='lucas'
aluno.save()
aluno = Aluno()
aluno.login='lucas'
self.assertRaises(Exception,aluno.save)
'''
Se o professor escolheu um login, o aluno nao pode escolher
'''
def test_15_login_repetido_professor_atrapalha_aluno(self):
professor = Professor()
professor.login='lucas'
professor.save()
aluno = Aluno()
aluno.login='lucas'
self.assertRaises(Exception,aluno.save)
'''
E se o aluno escolher, o professor nao pode
'''
def test_16_login_repetido_aluno_atrapalha_professor(self):
aluno = Aluno()
aluno.login='lucas'
aluno.save()
professor = Professor()
professor.login='lucas'
self.assertRaises(Exception,professor.save)
'''
Isso não é um teste
'''
def prepara_para_matricula(self):
aluno = Aluno()
aluno.login='power'
aluno.save()
disciplinas = []
disciplinas.append(Disciplina())
disciplinas[-1].nome = 'Portugues'
disciplinas[-1].save()
disciplinas.append(Disciplina())
disciplinas[-1].nome = 'Ingles'
disciplinas[-1].save()
disciplinas.append(Disciplina())
disciplinas[-1].nome = 'Espanhol'
disciplinas[-1].save()
disciplinas.append(Disciplina())
disciplinas[-1].nome = 'Frances'
disciplinas[-1].save()
disciplinas.append(Disciplina())
disciplinas[-1].nome = 'Japones'
disciplinas[-1].save()
for disciplina in disciplinas:
ofertada = DisciplinaOfertada()
ofertada.curso='ADS'
ofertada.ano=2000
ofertada.semestre=2
ofertada.turma='2a'
ofertada.professor=1
ofertada.disciplina=disciplina.id
ofertada.save()
'''
Uma matricula tem um campo aluno e um campo disciplina ofertada
'''
def test_17_matricula(self):
self.prepara_para_matricula()
matricula = Matricula()
matricula.aluno = 1
matricula.disciplinaOfertada = 1
matricula.save()
self.assertEqual(len(Matricula.objects.all()),1)
'''
Um aluno pode fazer 3 disciplinas, mas nao 4
'''
def test_18_tres_matriculas(self):
self.prepara_para_matricula()
for i in [1,2,3]:
matricula = Matricula()
matricula.aluno = 1
matricula.disciplinaOfertada = i
matricula.save()
self.assertEqual(len(Matricula.objects.all()),3)
'''
Um aluno pode fazer 3 disciplinas, mas nao 4
'''
def test_19_quatro_matriculas(self):
self.prepara_para_matricula()
for i in [1,2,3]:
matricula = Matricula()
matricula.aluno = 1
matricula.disciplinaOfertada = i
matricula.save()
self.assertEqual(len(Matricula.objects.all()),3)
matricula = Matricula()
matricula.aluno = 1
matricula.disciplinaOfertada = 4
self.assertRaises(Exception,matricula.save)
'''
Um aluno não pode fazer dois oferecimentos da mesma disciplina
'''
def test_20_disciplina_repetida(self):
self.prepara_para_matricula()
fr = Disciplina.objects.filter(nome='Frances')[0]
ids = []
for turma in '2b','2c':
ofertada = DisciplinaOfertada()
ofertada.curso='BD'
ofertada.ano=2000
ofertada.semestre=2
ofertada.turma=turma
ofertada.professor=1
ofertada.disciplina=fr.id
ofertada.save()
ids.append(ofertada.id)
matricula = Matricula()
matricula.aluno = 1
matricula.disciplinaOfertada = ids[0]
matricula.save()
matricula = Matricula()
matricula.aluno = 1
matricula.disciplinaOfertada = ids[1]
self.assertRaises(Exception,matricula.save)