Validate form in Django

0

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)
    
asked by anonymous 11.10.2018 / 13:10

0 answers