E aí pessoal tudo tranquilo nesse vídeo vamos finalizar a nossa aplicação de listagem de tarefas vamos implementar a funcionalidade de conclusão de tarefas e também Iremos realizar alguns ajustes finais nas telas da nossa aplicação [Música] Lembrando que esse vídeo faz parte de uma playlist sobre introdução ao Jungle e o link para essa playlist com todos os vídeos publicados até o momento está na descrição do vídeo assim como o link para o repositório com o código fonte Então bora programar vamos lá para nossa época de todos e views bem a gente já tem aqui as nossas
quatro views que realizam as operações de Cruz de dentro do sistema e a gente precisa de uma nova ver o que vai marcar uma tarefa como concluída como é que esse processo vai acontecer aqui no nosso models nós temos o finished at que é um campo que por padrão ele vem como nulo né então a gente não tá cadastrando nada nesse Campo ainda basicamente a ideia de marcar uma tarefa como concluída é preencher esse campo com aquela data atual então cliquei no botão de concluir a tarefa eu vou pegar esse finish e colocar como a
data de hoje né Isso vai ser o que considero uma tarefa como concluída Então olha só não tem nada assim muito genérico nisso né é algo bem específico da minha regra de negócio então não vai ter um navio do Django que vai fazer tudo isso para gente como a gente já tem com lista viu o Create View update View Então a gente vai utilizar aqui dentro dos generics a classe viu que ela é só uma viu ela só determina um avião em formato de classe é a única coisa que ela faz todo o restante a
gente vai ter que fazer manualmente tá então eu vou criar aqui uma nova classe e a gente vai chamar aqui de complete viu que variedade viu E aí quando a gente utiliza a classe viu nós vamos definir métodos que vão dizer o comportamento da nossa aplicação então eu vou ter um método para cada verbo http Então como a gente está trabalhando na aplicação web tradicional é basicamente a gente trabalha com dois raps htp o verbo get e o verbo post o verbo Gate é quando é feito uma requisição para uma rota ali para exibir uma
página HTML alguma coisa do tipo e vai para o post geralmente quando a gente faz a submissão de um formulário então eu vou criar aqui um método chamado get que vai executar um código quando houver uma requisição do tipo get esse verbo né o perdão esse método ele vai ter que receber dois parâmetros O primeiro é o parâmetro que todo o método de classe precisa receber que é o selfie e o segundo é a própria equest a requisição então lembra que quando a gente estava trabalhando com a faixa base lá no começo era mais ou
menos dessa estrutura quando a gente trabalha com a classe base viu também funciona assim tá é só que o seguinte Além disso eu preciso saber qual a tarefa que está sendo marcada como concluída então a ideia semelhante ao delete viu o update viu então além de receber Quest eu também vou receber um outro parâmetro que é APK a primer aqui daquela tarefa em específico né então eu preciso buscar no banco de dados Qual é essa tarefa então marca ela como concluída como é que eu faço essa consulta eu poderia fazer o seguinte judô objetos ponto
get BK igual APK o que que isso está fazendo eu tô dizendo para buscar no banco de dados uma tarefa né que tenha a coluna PK igual ao parâmetro PK que eu recebo aqui na minha viu tá eu posso fazer isso aqui mas tem uma maneira mais interessante de fazer que é utilizando aqui do from Django shortc imports essa função aqui ela é um atalho por isso que ela vem aqui do Django shortcuts para conseguir fazer a busca de um determinado item no banco e caso ele não seja encontrado é exibir uma página de não
encontrado tá então eu vou criar uma variável chamada te deu e vou igualar ela com o get Object ou for primeiro parâmetro que eu preciso passar é qual a classe de modelo é a minha classe de tudo e depois eu preciso passar o parâmetro de busca que é pecar igual APK com isso eu já tenho outro jogo em mãos né a tarefa em mãos então o que que eu preciso fazer marcar ela como concluída Então vou pegar o tio do ponto vai ser igual a data de hoje E aí como é que eu faço para
pegar essa data né o ele vai ser deixa eu pegar aqui a classe Model né A minha classe te dou ele é do tipo date Field tá E aí a gente precisa criar Nova Instância de uma data E aí você tá gostando do que viu até agora se você quer se especializar ainda mais desenvolvimento backing já treinou meu lugar ideal para você somos uma escola especializada em formato dos roedores possuem os mais de 15 anos de experiência no mercado e já formamos mais de 200 mil alunos e nosso portal você encontra informações sobre as principais
linguagens e tecnologias e falamos de uma maneira muito mais completa sobre todos os assuntos que você está vendo nesse vídeo então clique no link da descrição e faça já a sua matrícula E aqui eu preciso igualar a data de hoje né como é que eu consigo pegar a data de hoje no Python a gente pode utilizar a própria biblioteca daystem tá então aqui ó from ponto Imports e aqui no tio do ponto finish at = leite. today então eu vou igualar esse aqui igual a data de hoje né No momento que eu cliquei nesse botão
com isso eu alterei o valor de tudo e eu preciso salvar essa alteração no banco então a gente chama aqui o ponto save então isso aqui vai de fato realizar vai salvar isso aqui no banco de dados Tá e por fim eu vou quero redirecionar isso para página de listagem de tarefas como é que eu faço um redirect aqui no Jango também lá do short curto a gente vai importar um redirect a função redirect e aqui embaixo vai chamar um Hitler redirect e eu passo para onde a torre redirecionando e eu quero redirecionar lá para
o meu tio underline Beleza então basicamente essa aqui é a ideia né então vamos configurar Nossa rota aqui setup URL Vou importar o meu tio do completo viu vou criar aqui um novo PF eu vou chamar ele aqui de complete e o ID da tarefa né então e defina aqui um name que vai ser o tio do underline complete acho que é isso vamos testar Então na verdade eu configurar a primeira URL lá na nossa listagem né então vamos aqui templates aqui no concluir eu vou colocar a minha url que vai ser para tudo underline
complete com o parâmetro PK igual to do ponto p k pronto vamos Executar a aplicação então Python Manager vamos lá na nossa página atualizar aqui a página Então tudo funcionando Vamos marcar essa tarefa aqui como concluída então concluir veja aqui apareceu agora finalizado em né a data foi setada aqui corretamente como a data de hoje Então a nossa funcionalidade de concluir tarefa já tá funcionando Porém para a gente fechar aqui com chave de ouro vamos fazer alguns ajustes né algum alguns pequenos ajustes na aplicação para ela ficar mais interessante primeiro ponto que eu queria verificar
é o seguinte a relação da listagem né como é que ela tá ordenada vamos fazer o seguinte Olha eu tenho uma tarefa de aí de um que é finalizar a Playlist de introdução ao diabo da trena web que ela foi criada não a data de entrega dela dia 21 de Maio de 2023 então eu vou criar aqui Uma Nova tarefa e eu quero que a data de entrega dela seja antes eu vou colocar para o dia 19 de maio de 2023 né então vou colocar aqui ó teste 2 19/05 de 2023 salvar e olha só
o teste 2 ele tá com uma data de entrega anterior a data de entrega da tarefa de ai de 1 mas ela vem aqui no final porque a ordem é com base no cadastro a ordem Tá Com base no id e assim faz mais sentido a gente exibir Primeiro as tarefas que estão mais próximas da data de entrega mais próximas de serem concluídas Então como é que eu posso ajustar essa ordenação se a gente voltar aqui na nossa nosso code lá na nossa camada de views quem faz isso essa listagem é a classe de teodovice
viu aqui eu não tenho nada que eu possa modificar né pelo menos a não a primeira vista e eu também não quero alterar aqui a classe como ela tá então a gente pode fazer essa modificação lá na classe de modelo Então posso vir aqui em models e nas classes de modelo do Django a gente pode criar um negócio chamado de classe metal essa meta Class é uma classe com configurações para o modelo que permitem que a gente consiga definir meta informações metadados né que são informações sobre os dados dentro da camada de modelo do Django
e dentro dessa meta Class eu posso definir um campo né um parâmetro chamado acho que é assim se eu não me engano que é uma lista que eu vou passar por onde eu quero ordenar esses dados e eu vou dizer que eu quero ordenar a partir da deadline Então vou ordenar aqui a parte da deadline salvei vou voltar aqui na aplicação né no meu na minha página Vou atualizar a página e veja que a ordem mudou agora o teste dois ele tá vindo como o primeiro porque a data de entrega dele tá mais recente se
eu quiser essa mesma ordem só que inversa por exemplo quem tá mais longe de ser primeiro basta eu colocar na frente aquele deline o menos tá então menos deline E aí funciona do jeito que a gente quer só que aqui vai ser apenas deadline sem do jeito que a gente tá aqui tá Beleza então a gente já tem ordenação aqui feita outra coisa é o seguinte essa tarefa ela já tá concluída então não faz muito sentido eu poder concluir ela de novo né então o ideal seria que esse botão aqui quando a tarefa ela já
está concluída ficasse desabilitado e outro ponto é não faz muito sentido eu também poder editar uma tarefa uma vez que ela já foi concluída excluir tudo bem Eu posso excluir a tarefa não quero mais ela aqui posso excluir mas concluir editar não faz muito sentido então caso a tarefa ela já esteja concluída eu vou desabilitar os botões de conclusão né para concluir e para editar Então vamos lá para o nosso template e basicamente o que eu vou fazer aqui é um IFF tá Então olha só aqui no nosso concluir eu vou dar aqui um enter
para conseguir enxergar né não ficar muito grande isso aqui e ficar difícil da gente conseguir enxergar que está sendo feito então deixa eu dar aqui alguns [Música] então na tag a eu vou colocar um IFF aqui do ângulo template e eu vou verificar se o meu tio do ponto existe se existir eu vou colocar uma propriedade que é o de zaybody Salve vamos ver como é que ficou não mudou deixa eu ver aqui no Bootstrap né Na verdade eu quero isso no botão Na verdade eu acho que isso não vai funcionar colocar o DJ vou
pouquinho está trabalhando com um link né Deixa eu só ver como é que a gente pode fazer aqui se eu não me engano a gente faz isso dentro da classe tá então deixa eu pegar esse todo aqui recortar ele e vou colocar aqui dentro da definição da classe Olha só vem aqui então vamos ver se isso aqui é o suficiente atualizar página agora sim olha só o botão de concluir que ele está desabilitado não consigo marcar ele né não consigo clicar e a mesma ideia a gente vai fazer para o editar Então olha só vou
copiar esse trechinho aqui do código que né que adiciona a classe de zebra dentro das classes desse link caso o esteja preenchido né então eu quero aqui no editar então vamos aqui editar Eu também dar uns entre eles aqui para a gente conseguir enxergar bem vamos ajustar a indenização e aqui pronto dizerbode pronto vamos voltar aqui na página atualizar e o botão de editar e o botão de gokui estão desabilitados é para esse item específico aqui que é o item 3 porque ele já foi concluído né uma tarefa que já tá concluída eu não consigo
concluir não consigo editar mais eu consigo excluir beleza e aqui um outro ponto e aí já é um ponto sobre a organização de código não vai ter nenhuma mudança de funcionalidade é que o seguinte a regra de negócio dentro da nossa aplicação para concluir uma tarefa é uma regra bem simples basicamente eu verifico se na verdade o certo o como a data de hoje e salvo né a tarefa atualmente é um processo simples mas pode ser que mais na frente a aplicação ela cresça um ponto que conclui uma tarefa não seja tão simples né preciso
fazer algumas verificações alguns testes e imagina que eu tenho vários locais aonde eu concluo uma tarefa eu teria que repetir essa regra de negócio em todas essas vias que fazem esse trabalho né de concluir uma tarefa E aí o jugo ele tem uma filosofia chamada de Fat Models a tradução é meio estranha seria como views magras e modelos gordos é meio estranho mas basicamente ela diz o seguinte regras de negócio estão devem estar dentro da camada de um modelo e não dentro da camada de viu avio ela deve ser a mais simples possível então nós
vamos extrair essa regra de negócio que novamente a regra do negócio bem simples mas é uma regra de negócio da nossa aplicação para dentro do modelo Então olha só vou recortar esse código na verdade nem vou recortar vou deixar aqui do jeito que tá vamos lá para o nosso models ponto pai e aqui dentro eu vou criar um método Tá eu vou criar aqui um método que é o mar s por ser um método ele precisa receber aqui o selfie como o primeiro parâmetro e o que que eu vou fazer eu vou verificar se o
selfie ele já está com o fim deixa quieto então e selfie e aqui eu vou negar né só quero entrar nesse se não tiver uma data de finalização aqui é norte né não é ponto de exclamação então se a data de finalização não tiver setada eu vou acertar ela então selfie pronto igual datey preciso importar que esse dente né então a gente vai importar ele aqui pronto e depois eu vou salvar então selfie ponto safe beleza e agora lá na minha viu em vez de eu fazer esse processo eu chamo o próprio tio do ponto
Mark complica beleza posso apagar aqui posso tirar essa importação né e assim a primeira vista parece que não teve tanta melhoria sim né eu tirei duas linhas de código daqui para colocar algumas linhas de código aqui na camada de modelo mais a vantagem disso é que eu centralizei a regra de negócio dentro do modelo então se em algum outro local eu preciso definir que uma um modelo foi marcada como completa eu não vou precisar fazer isso na mão não vou precisar repetir essa regra de negócio eu chamo o método do modelo que sabe como fazer
isso e se eu precisar alterar essa regra de negócio é altero em um único lugar em vez de sair alterando em vários lugares diferentes Tá então vamos só ver isso aqui vai funcionar vamos voltar aqui para nossa página vou marcar aqui o teste dois como conflito né completo concluir beleza foi marcada aqui como completo e já tá funcionando Tranquilo então é isso com isso a gente finalizou aqui o projeto já deu para ver inclusive uma filosofia do Django sobre boas práticas e organização do código que é o fat Model Skin News Conseguimos ver como criar
uma View que foge do padrão né que é um avião aqui que não necessariamente vai ter um avião genérico que consegue fazer tudo para gente a gente vai ter que fazer a regra todo o processo na mão mas ainda assim utilizando as classes bens de views que o Jungle provê tranquilo bom pessoal se você gostou do vídeo Não esqueça de curtir e compartilhar com todo mundo que você conhece está aprendendo a sua programação caso tenha ficado alguma dúvida ou queira dar alguma sugestão coloque nos comentários queremos responder a todos até a próxima