├── livro ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0013_remove_emprestimos_tempo_duracao.py │ ├── 0003_alter_livros_data_cadastro.py │ ├── 0004_alter_livros_data_cadastro.py │ ├── 0012_alter_emprestimos_tempo_duracao.py │ ├── 0015_alter_emprestimos_livro.py │ ├── 0014_alter_emprestimos_livro.py │ ├── 0016_emprestimos_avaliacao.py │ ├── 0007_categoria_usuario.py │ ├── 0010_alter_emprestimos_nome_emprestado.py │ ├── 0011_auto_20210826_1924.py │ ├── 0017_auto_20211028_1631.py │ ├── 0018_auto_20211028_1634.py │ ├── 0009_auto_20210826_1915.py │ ├── 0001_initial.py │ ├── 0005_auto_20210805_1803.py │ ├── 0006_auto_20210819_1754.py │ ├── 0002_auto_20210805_1749.py │ └── 0008_auto_20210826_1912.py ├── templatetags │ ├── __init__.py │ └── filtros.py ├── tests.py ├── apps.py ├── admin.py ├── forms.py ├── urls.py ├── models.py ├── templates │ ├── seus_emprestimos.html │ ├── home.html │ └── ver_livro.html └── views.py ├── biblioteca ├── __init__.py ├── urls.py ├── asgi.py ├── wsgi.py └── settings.py ├── usuarios ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0002_usuario_ativo.py │ └── 0001_initial.py ├── tests.py ├── apps.py ├── admin.py ├── models.py ├── urls.py ├── templates │ ├── login.html │ └── cadastro.html └── views.py ├── manage.py ├── .gitignore └── templates └── base.html /livro/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /biblioteca/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /usuarios/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /livro/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /livro/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /usuarios/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /livro/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /usuarios/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /livro/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class LivroConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'livro' 7 | -------------------------------------------------------------------------------- /usuarios/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsuariosConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'usuarios' 7 | -------------------------------------------------------------------------------- /livro/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Livros, Categoria, Emprestimos 3 | 4 | admin.site.register(Categoria) 5 | admin.site.register(Livros) 6 | admin.site.register(Emprestimos) 7 | -------------------------------------------------------------------------------- /biblioteca/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | urlpatterns = [ 5 | path('admin/', admin.site.urls), 6 | path('livro/', include('livro.urls')), 7 | path('auth/', include('usuarios.urls')) 8 | ] 9 | -------------------------------------------------------------------------------- /usuarios/admin.py: -------------------------------------------------------------------------------- 1 | from usuarios.models import Usuario 2 | from django.contrib import admin 3 | 4 | @admin.register(Usuario) 5 | class UsuarioAdmin(admin.ModelAdmin): 6 | list_display = ('nome', 'email', 'ativo') 7 | list_editable = ('email',) 8 | readonly_fields = ('senha',) 9 | search_fields = ('nome', 'email') 10 | list_filter = ('ativo',) 11 | 12 | 13 | -------------------------------------------------------------------------------- /usuarios/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | #user: caio12 4 | #email: caio@gmail.com 5 | #senha: teste1234 6 | 7 | class Usuario(models.Model): 8 | nome = models.CharField(max_length=30) 9 | email = models.EmailField() 10 | senha = models.CharField(max_length=64) 11 | ativo = models.BooleanField(default=False) 12 | 13 | def __str__(self) -> str: 14 | return self.nome -------------------------------------------------------------------------------- /usuarios/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('login/', views.login, name = 'login'), 6 | path('cadastro/', views.cadastro, name = 'cadastro'), 7 | path('validar_cadastro/', views.valida_cadastro, name = 'valida_cadastro'), 8 | path('validar_login/', views.validar_login, name = 'validar_login'), 9 | path('sair/', views.sair, name = 'sair') 10 | 11 | ] -------------------------------------------------------------------------------- /biblioteca/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for biblioteca project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'biblioteca.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /biblioteca/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for biblioteca project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'biblioteca.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /livro/migrations/0013_remove_emprestimos_tempo_duracao.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-26 22:25 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('livro', '0012_alter_emprestimos_tempo_duracao'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='emprestimos', 15 | name='tempo_duracao', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /usuarios/migrations/0002_usuario_ativo.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-12 00:55 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('usuarios', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='usuario', 15 | name='ativo', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /livro/templatetags/filtros.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from datetime import date, datetime 3 | 4 | register = template.Library() 5 | 6 | @register.filter 7 | def mostra_duracao(value1, value2): 8 | if all((isinstance(value1, datetime), isinstance(value2, datetime))): 9 | dias = (value1 - value2).days 10 | texto = 'Dias' 11 | if dias == 1: 12 | texto = 'Dia' 13 | 14 | return f"{dias} {texto}." 15 | 16 | return "Ainda não foi devolvido." 17 | 18 | -------------------------------------------------------------------------------- /livro/migrations/0003_alter_livros_data_cadastro.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-05 20:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('livro', '0002_auto_20210805_1749'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='livros', 15 | name='data_cadastro', 16 | field=models.DateField(auto_now=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /livro/migrations/0004_alter_livros_data_cadastro.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-05 20:54 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('livro', '0003_alter_livros_data_cadastro'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='livros', 15 | name='data_cadastro', 16 | field=models.DateField(auto_now_add=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /livro/migrations/0012_alter_emprestimos_tempo_duracao.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-26 22:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('livro', '0011_auto_20210826_1924'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='emprestimos', 15 | name='tempo_duracao', 16 | field=models.TimeField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /livro/migrations/0015_alter_emprestimos_livro.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-16 19:34 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('livro', '0014_alter_emprestimos_livro'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='emprestimos', 16 | name='livro', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='livro.livros'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /livro/migrations/0014_alter_emprestimos_livro.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-09-16 19:33 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('livro', '0013_remove_emprestimos_tempo_duracao'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='emprestimos', 16 | name='livro', 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='livro.livros'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /livro/migrations/0016_emprestimos_avaliacao.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-10-28 19:14 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('livro', '0015_alter_emprestimos_livro'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='emprestimos', 15 | name='avaliacao', 16 | field=models.CharField(choices=[('P', 'Péssimo'), ('R', 'Ruim'), ('B', 'Bom'), ('O', 'Ótimo')], default=1, max_length=1), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /livro/migrations/0007_categoria_usuario.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-26 21:51 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('usuarios', '0002_usuario_ativo'), 11 | ('livro', '0006_auto_20210819_1754'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='categoria', 17 | name='usuario', 18 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.DO_NOTHING, to='usuarios.usuario'), 19 | preserve_default=False, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /livro/migrations/0010_alter_emprestimos_nome_emprestado.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-26 22:19 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('usuarios', '0002_usuario_ativo'), 11 | ('livro', '0009_auto_20210826_1915'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='emprestimos', 17 | name='nome_emprestado', 18 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='usuarios.usuario'), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /livro/migrations/0011_auto_20210826_1924.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-26 22:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('livro', '0010_alter_emprestimos_nome_emprestado'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='emprestimos', 15 | name='data_devolucao', 16 | field=models.DateField(blank=True, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='emprestimos', 20 | name='data_emprestimo', 21 | field=models.DateField(blank=True, null=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /usuarios/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-11 20:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Usuario', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('nome', models.CharField(max_length=30)), 19 | ('email', models.EmailField(max_length=254)), 20 | ('senha', models.CharField(max_length=64)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'biblioteca.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /livro/migrations/0017_auto_20211028_1631.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-10-28 19:31 2 | 3 | import datetime 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('livro', '0016_emprestimos_avaliacao'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='emprestimos', 16 | name='data_devolucao', 17 | field=models.DateTimeField(blank=True, null=True), 18 | ), 19 | migrations.AlterField( 20 | model_name='emprestimos', 21 | name='data_emprestimo', 22 | field=models.DateTimeField(default=datetime.datetime(2021, 10, 28, 16, 31, 54, 316129)), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /livro/migrations/0018_auto_20211028_1634.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-10-28 19:34 2 | 3 | import datetime 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('livro', '0017_auto_20211028_1631'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='emprestimos', 16 | name='avaliacao', 17 | field=models.CharField(blank=True, choices=[('P', 'Péssimo'), ('R', 'Ruim'), ('B', 'Bom'), ('O', 'Ótimo')], max_length=1, null=True), 18 | ), 19 | migrations.AlterField( 20 | model_name='emprestimos', 21 | name='data_emprestimo', 22 | field=models.DateTimeField(default=datetime.datetime(2021, 10, 28, 16, 34, 20, 248634)), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /livro/forms.py: -------------------------------------------------------------------------------- 1 | from usuarios.models import Usuario 2 | from django import forms 3 | from django.db.models import fields 4 | from .models import Livros, Categoria 5 | from django.db import models 6 | from datetime import date 7 | 8 | 9 | class CadastroLivro(forms.ModelForm): 10 | class Meta: 11 | model = Livros 12 | fields = "__all__" 13 | 14 | def __init__(self, *args, **kwargs): 15 | super().__init__(*args, **kwargs) 16 | self.fields['usuario'].widget = forms.HiddenInput() 17 | 18 | class CategoriaLivro(forms.Form): 19 | nome = forms.CharField(max_length=30) 20 | descricao = forms.CharField(max_length=60) 21 | 22 | def __init__(self, *args, **kwargs): 23 | super().__init__(*args, **kwargs) 24 | self.fields['descricao'].widget = forms.Textarea() 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /livro/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | urlpatterns = [ 5 | path('home/', views.home, name = 'home'), 6 | path('ver_livro/', views.ver_livros, name = 'ver_livros' ), 7 | path('cadastrar_livro', views.cadastrar_livro, name='cadastrar_livro'), 8 | path('excluir_livro/', views.excluir_livro, name='excluir_livro'), 9 | path('cadastrar_categoria/', views.cadastrar_categoria, name='cadastrar_categoria'), 10 | path('cadastrar_emprestimo', views.cadastrar_emprestimo, name='cadastrar_emprestimo'), 11 | path('devolver_livro', views.devolver_livro, name="devolver_livro"), 12 | path('alterar_livro', views.alterar_livro, name="alterar_livro"), 13 | path('seus_empretismos', views.seus_emprestimos, name="seus_emprestimos"), 14 | path('processa_avaliacao', views.processa_avaliacao, name="processa_avaliacao") 15 | 16 | ] 17 | -------------------------------------------------------------------------------- /livro/migrations/0009_auto_20210826_1915.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-26 22:15 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('usuarios', '0002_usuario_ativo'), 11 | ('livro', '0008_auto_20210826_1912'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='emprestimos', 17 | name='nome_emprestado_anonimo', 18 | field=models.CharField(blank=True, max_length=30, null=True), 19 | ), 20 | migrations.AlterField( 21 | model_name='emprestimos', 22 | name='nome_emprestado', 23 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.DO_NOTHING, to='usuarios.usuario'), 24 | preserve_default=False, 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /livro/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-05 20:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Livros', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('nome', models.CharField(max_length=100)), 19 | ('autor', models.CharField(max_length=30)), 20 | ('co_autor', models.CharField(max_length=30)), 21 | ('data_cadastro', models.DateField()), 22 | ('emprestado', models.BooleanField(default=False)), 23 | ('nome_emprestado', models.CharField(max_length=30)), 24 | ('data_emprestimo', models.DateTimeField()), 25 | ('data_devolucao', models.DateTimeField()), 26 | ('tempo_duracao', models.DateField()), 27 | ], 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /livro/migrations/0005_auto_20210805_1803.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-05 21:03 2 | 3 | import datetime 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('livro', '0004_alter_livros_data_cadastro'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='livros', 16 | name='data_cadastro', 17 | field=models.DateField(default=datetime.date.today), 18 | ), 19 | migrations.AlterField( 20 | model_name='livros', 21 | name='data_devolucao', 22 | field=models.DateTimeField(blank=True, null=True), 23 | ), 24 | migrations.AlterField( 25 | model_name='livros', 26 | name='data_emprestimo', 27 | field=models.DateTimeField(blank=True, null=True), 28 | ), 29 | migrations.AlterField( 30 | model_name='livros', 31 | name='nome_emprestado', 32 | field=models.CharField(blank=True, max_length=30, null=True), 33 | ), 34 | migrations.AlterField( 35 | model_name='livros', 36 | name='tempo_duracao', 37 | field=models.DateField(blank=True, null=True), 38 | ), 39 | ] 40 | -------------------------------------------------------------------------------- /livro/migrations/0006_auto_20210819_1754.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-19 20:54 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('usuarios', '0002_usuario_ativo'), 11 | ('livro', '0005_auto_20210805_1803'), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Categoria', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('nome', models.CharField(max_length=30)), 20 | ('descricao', models.TextField()), 21 | ], 22 | ), 23 | migrations.AddField( 24 | model_name='livros', 25 | name='usuario', 26 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.DO_NOTHING, to='usuarios.usuario'), 27 | preserve_default=False, 28 | ), 29 | migrations.AddField( 30 | model_name='livros', 31 | name='categoria', 32 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.DO_NOTHING, to='livro.categoria'), 33 | preserve_default=False, 34 | ), 35 | ] 36 | -------------------------------------------------------------------------------- /livro/migrations/0002_auto_20210805_1749.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-05 20:49 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('livro', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='livros', 15 | options={'verbose_name': 'Livro'}, 16 | ), 17 | migrations.AlterField( 18 | model_name='livros', 19 | name='co_autor', 20 | field=models.CharField(blank=True, max_length=30), 21 | ), 22 | migrations.AlterField( 23 | model_name='livros', 24 | name='data_devolucao', 25 | field=models.DateTimeField(blank=True), 26 | ), 27 | migrations.AlterField( 28 | model_name='livros', 29 | name='data_emprestimo', 30 | field=models.DateTimeField(blank=True), 31 | ), 32 | migrations.AlterField( 33 | model_name='livros', 34 | name='nome_emprestado', 35 | field=models.CharField(blank=True, max_length=30), 36 | ), 37 | migrations.AlterField( 38 | model_name='livros', 39 | name='tempo_duracao', 40 | field=models.DateField(blank=True), 41 | ), 42 | ] 43 | -------------------------------------------------------------------------------- /usuarios/templates/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | 4 | {% block 'titulo' %}Login{% endblock %} 5 | 6 | 7 | {% block 'conteudo' %} 8 | 9 | 10 |
11 |
12 | {% if status == '1' %} 13 | 16 | 17 | {% endif %} 18 | 19 | {% if status == '2' %} 20 | 23 | 24 | {% endif %} 25 |
26 | 27 |
28 | 29 |
30 | 31 |
32 |

Login

33 |
34 | 35 |
{% csrf_token %} 36 | 37 | 38 |
39 | 40 | 41 |
42 | 43 | Cadastro 44 | 45 | 46 |
47 |
48 | 49 |
50 | 51 |
52 | 53 | 54 |
55 | 56 |
57 | 58 | 59 | {% endblock %} -------------------------------------------------------------------------------- /livro/migrations/0008_auto_20210826_1912.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.6 on 2021-08-26 22:12 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('livro', '0007_categoria_usuario'), 11 | ] 12 | 13 | operations = [ 14 | migrations.RemoveField( 15 | model_name='livros', 16 | name='data_devolucao', 17 | ), 18 | migrations.RemoveField( 19 | model_name='livros', 20 | name='data_emprestimo', 21 | ), 22 | migrations.RemoveField( 23 | model_name='livros', 24 | name='nome_emprestado', 25 | ), 26 | migrations.RemoveField( 27 | model_name='livros', 28 | name='tempo_duracao', 29 | ), 30 | migrations.CreateModel( 31 | name='Emprestimos', 32 | fields=[ 33 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 34 | ('nome_emprestado', models.CharField(blank=True, max_length=30, null=True)), 35 | ('data_emprestimo', models.DateTimeField(blank=True, null=True)), 36 | ('data_devolucao', models.DateTimeField(blank=True, null=True)), 37 | ('tempo_duracao', models.DateField(blank=True, null=True)), 38 | ('livro', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='livro.livros')), 39 | ], 40 | ), 41 | ] 42 | -------------------------------------------------------------------------------- /livro/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from datetime import date 3 | import datetime 4 | from django.db.models.base import Model 5 | from usuarios.models import Usuario 6 | 7 | class Categoria(models.Model): 8 | nome = models.CharField(max_length=30) 9 | descricao = models.TextField() 10 | usuario = models.ForeignKey(Usuario, on_delete=models.DO_NOTHING) 11 | 12 | def __str__(self) -> str: 13 | return self.nome 14 | 15 | 16 | class Livros(models.Model): 17 | nome = models.CharField(max_length = 100) 18 | autor = models.CharField(max_length = 30) 19 | co_autor = models.CharField(max_length = 30, blank = True) 20 | data_cadastro = models.DateField(default = date.today) 21 | emprestado = models.BooleanField(default = False) 22 | categoria = models.ForeignKey(Categoria, on_delete=models.DO_NOTHING) 23 | usuario = models.ForeignKey(Usuario, on_delete=models.DO_NOTHING) 24 | 25 | class Meta: 26 | verbose_name = 'Livro' 27 | 28 | def __str__(self): 29 | return self.nome 30 | 31 | class Emprestimos(models.Model): 32 | choices = ( 33 | ('P', 'Péssimo'), 34 | ('R', 'Ruim'), 35 | ('B', 'Bom'), 36 | ('O', 'Ótimo') 37 | ) 38 | nome_emprestado = models.ForeignKey(Usuario, on_delete=models.DO_NOTHING, blank = True, null = True) 39 | nome_emprestado_anonimo = models.CharField(max_length = 30, blank = True, null = True) 40 | data_emprestimo = models.DateTimeField(default=datetime.datetime.now()) 41 | data_devolucao = models.DateTimeField(blank = True, null = True) 42 | livro = models.ForeignKey(Livros, on_delete=models.DO_NOTHING) 43 | avaliacao = models.CharField(max_length=1, choices=choices, null=True, blank=True) 44 | 45 | def __str__(self) -> str: 46 | return f"{self.nome_emprestado} | {self.livro}" 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /usuarios/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.http import HttpResponse 3 | from .models import Usuario 4 | from django.shortcuts import redirect 5 | from hashlib import sha256 6 | 7 | def login(request): 8 | if request.session.get('usuario'): 9 | return redirect('/livro/home/') 10 | status = request.GET.get('status') 11 | return render(request, 'login.html', {'status': status}) 12 | 13 | def cadastro(request): 14 | if request.session.get('usuario'): 15 | return redirect('/livro/home/') 16 | status = request.GET.get('status') 17 | return render(request, 'cadastro.html', {'status': status}) 18 | 19 | 20 | def valida_cadastro(request): 21 | nome = request.POST.get('nome') 22 | senha = request.POST.get('senha') 23 | email = request.POST.get('email') 24 | 25 | usuario = Usuario.objects.filter(email = email) 26 | 27 | if len(nome.strip()) == 0 or len(email.strip()) == 0: 28 | return redirect('/auth/cadastro/?status=1') 29 | 30 | if len(senha) < 8: 31 | return redirect('/auth/cadastro/?status=2') 32 | 33 | if len(usuario) > 0: 34 | return redirect('/auth/cadatro/?status=3') 35 | 36 | try: 37 | senha = sha256(senha.encode()).hexdigest() 38 | usuario = Usuario(nome = nome, 39 | senha = senha, 40 | email = email) 41 | usuario.save() 42 | 43 | return redirect('/auth/cadastro/?status=0') 44 | except: 45 | return redirect('/auth/cadastro/?status=4') 46 | 47 | 48 | def validar_login(request): 49 | email = request.POST.get('email') 50 | senha = request.POST.get('senha') 51 | 52 | senha = sha256(senha.encode()).hexdigest() 53 | 54 | usuario = Usuario.objects.filter(email = email).filter(senha = senha) 55 | 56 | if len(usuario) == 0: 57 | return redirect('/auth/login/?status=1') 58 | elif len(usuario) > 0: 59 | request.session['usuario'] = usuario[0].id 60 | return redirect(f'/livro/home/') 61 | 62 | return HttpResponse(f"{email} {senha}") 63 | 64 | 65 | def sair(request): 66 | request.session.flush() 67 | return redirect('/auth/login/') -------------------------------------------------------------------------------- /usuarios/templates/cadastro.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block 'titulo' %} Cadastro {% endblock %} 4 | 5 | 6 | {% block 'conteudo' %} 7 | 8 |
9 |
10 | {% if status == '0'%} 11 | 14 | {% endif %} 15 | 16 | {% if status == '1'%} 17 | 20 | {% endif %} 21 | 22 | {% if status == '2'%} 23 | 26 | {% endif %} 27 | 28 | {% if status == '3'%} 29 | 32 | {% endif %} 33 | 34 | {% if status == '4'%} 35 | 38 | {% endif %} 39 |
40 | 41 |
42 | 43 |
44 | 45 |
46 |

Cadastre-se

47 |
48 | 49 |
{% csrf_token %} 50 | 51 | 52 | 53 |
54 | 55 | 56 |
57 | 58 | 59 |
60 | 61 | Login 62 | 63 | 64 |
65 |
66 | 67 |
68 | 69 |
70 | 71 | 72 |
73 | 74 |
75 | 76 | 77 | {% endblock %} -------------------------------------------------------------------------------- /livro/templates/seus_emprestimos.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block 'head' %} 4 | 5 | 16 | 17 | {% endblock %} 18 | 19 | 20 | {% block 'conteudo' %} 21 |
22 |
23 |

SEUS EMPRÉSTIMOS

24 | 25 | {% for emprestimo in emprestimos %} 26 | 27 |
28 | 29 |
30 |

{{emprestimo.livro}}

31 |
32 |
33 |
34 | 37 |
38 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 50 |
51 | {% endfor %} 52 |
53 | 54 | {% endblock %} -------------------------------------------------------------------------------- /livro/templates/home.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | 4 | {% block 'conteudo' %} 5 | 6 |
7 | 8 |
9 | {% if status_categoria == '1' %} 10 | 13 | {% endif %} 14 | 15 |
16 | 17 | 18 | {% for livro in livros %} 19 |
20 |
21 |
22 | 23 |
{{livro.nome}}
24 | 25 | 26 |
Emprestado
27 | 28 | {% if livro.emprestado %} 29 | 30 | 31 | 32 | 33 | {% else %} 34 | 35 | 36 | 37 | 38 | {% endif %} 39 | 40 |
41 |
42 | Acessar 43 |
44 | 45 | 46 |
47 |
48 |
49 | 50 | 51 | 52 | {% endfor %} 53 | 54 | 55 | 56 | 57 |
58 |
59 | 60 | {% endblock %} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | *.py[cod] 3 | *$py.class 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | build/ 11 | develop-eggs/ 12 | dist/ 13 | downloads/ 14 | eggs/ 15 | .eggs/ 16 | lib/ 17 | lib64/ 18 | parts/ 19 | sdist/ 20 | var/ 21 | wheels/ 22 | pip-wheel-metadata/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | local_settings.py 60 | db.sqlite3 61 | db.sqlite3-journal 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # IPython 80 | profile_default/ 81 | ipython_config.py 82 | 83 | # pyenv 84 | .python-version 85 | 86 | # pipenv 87 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 88 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 89 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 90 | # install all needed dependencies. 91 | #Pipfile.lock 92 | 93 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 94 | __pypackages__/ 95 | 96 | # Celery stuff 97 | celerybeat-schedule 98 | celerybeat.pid 99 | 100 | # SageMath parsed files 101 | *.sage.py 102 | 103 | # Environments 104 | .env 105 | .venv 106 | env/ 107 | venv/ 108 | ENV/ 109 | env.bak/ 110 | venv.bak/ 111 | 112 | # Spyder project settings 113 | .spyderproject 114 | .spyproject 115 | 116 | # Rope project settings 117 | .ropeproject 118 | 119 | # mkdocs documentation 120 | /site 121 | 122 | # mypy 123 | .mypy_cache/ 124 | .dmypy.json 125 | dmypy.json 126 | 127 | # Pyre type checker 128 | .pyre/ -------------------------------------------------------------------------------- /biblioteca/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for biblioteca project. 3 | 4 | Generated by 'django-admin startproject' using Django 3.2.6. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/3.2/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | 16 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 17 | BASE_DIR = Path(__file__).resolve().parent.parent 18 | 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | SECRET_KEY = 'django-insecure-51%05e2*phpmn9mj$epml3mk14rgrigvffc(g3#g0y^90ywv**' 25 | 26 | # SECURITY WARNING: don't run with debug turned on in production! 27 | DEBUG = True 28 | 29 | ALLOWED_HOSTS = [] 30 | 31 | 32 | # Application definition 33 | 34 | INSTALLED_APPS = [ 35 | 'django.contrib.admin', 36 | 'django.contrib.auth', 37 | 'django.contrib.contenttypes', 38 | 'django.contrib.sessions', 39 | 'django.contrib.messages', 40 | 'django.contrib.staticfiles', 41 | 'livro', 42 | 'usuarios' 43 | ] 44 | 45 | MIDDLEWARE = [ 46 | 'django.middleware.security.SecurityMiddleware', 47 | 'django.contrib.sessions.middleware.SessionMiddleware', 48 | 'django.middleware.common.CommonMiddleware', 49 | 'django.middleware.csrf.CsrfViewMiddleware', 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 | 'django.contrib.messages.middleware.MessageMiddleware', 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 | ] 54 | 55 | ROOT_URLCONF = 'biblioteca.urls' 56 | 57 | TEMPLATES = [ 58 | { 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 61 | 'APP_DIRS': True, 62 | 'OPTIONS': { 63 | 'context_processors': [ 64 | 'django.template.context_processors.debug', 65 | 'django.template.context_processors.request', 66 | 'django.contrib.auth.context_processors.auth', 67 | 'django.contrib.messages.context_processors.messages', 68 | ], 69 | 70 | 'libraries':{ 71 | 'filtros': 'livro.templatetags.filtros', 72 | 73 | 74 | } 75 | }, 76 | 77 | }, 78 | ] 79 | 80 | WSGI_APPLICATION = 'biblioteca.wsgi.application' 81 | 82 | 83 | # Database 84 | # https://docs.djangoproject.com/en/3.2/ref/settings/#databases 85 | 86 | DATABASES = { 87 | 'default': { 88 | 'ENGINE': 'django.db.backends.sqlite3', 89 | 'NAME': BASE_DIR / 'db.sqlite3', 90 | } 91 | } 92 | 93 | 94 | # Password validation 95 | # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators 96 | 97 | AUTH_PASSWORD_VALIDATORS = [ 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 100 | }, 101 | { 102 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 103 | }, 104 | { 105 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 106 | }, 107 | { 108 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 109 | }, 110 | ] 111 | 112 | 113 | # Internationalization 114 | # https://docs.djangoproject.com/en/3.2/topics/i18n/ 115 | 116 | LANGUAGE_CODE = 'pt-BR' 117 | 118 | TIME_ZONE = 'America/Sao_Paulo' 119 | 120 | USE_I18N = True 121 | 122 | USE_L10N = True 123 | 124 | USE_TZ = True 125 | 126 | 127 | # Static files (CSS, JavaScript, Images) 128 | # https://docs.djangoproject.com/en/3.2/howto/static-files/ 129 | 130 | STATIC_URL = '/static/' 131 | 132 | # Default primary key field type 133 | # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field 134 | 135 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 136 | -------------------------------------------------------------------------------- /livro/templates/ver_livro.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load filtros %} 3 | 4 | {% block 'conteudo' %} 5 | 6 | 25 | 26 | 27 |
28 |
29 |
30 | {% csrf_token %} 31 | 32 |

33 | 34 | 35 |

36 | 37 |

38 | 39 | 40 |

41 | 42 |

43 | 44 | 45 |

46 | 47 | 48 | 62 | 63 |
64 | 65 |

66 | 67 |

{{livro.data_cadastro}}

68 |

69 | 70 |
71 | 72 | 73 | 74 | {% if livro.emprestado %} 75 | 76 | 77 | 78 | 79 | 80 | {% else %} 81 | 82 | 83 | 84 | 85 | {% endif %} 86 |
87 |
88 | 89 | 90 | 91 | 92 | 93 | 94 |
95 |
96 | 99 | 100 |
101 |

Histórico de emprestimo

102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | {% for i in emprestimos%} 115 | 116 | {% if i.nome_emprestado_anonimo == None %} 117 | 118 | {% else %} 119 | 120 | {% endif%} 121 | 122 | 123 | 124 | 132 | 133 | {% endfor %} 134 | 135 |
NomeData EmprestimoData devoluçãoTempo de duraçãoAvaliação
{{i.nome_emprestado}}{{i.nome_emprestado_anonimo}}{{i.data_emprestimo}}{{i.data_devolucao}}{{i.data_devolucao|mostra_duracao:i.data_emprestimo }} 125 | {% if i.avaliacao == None %} 126 | 127 | {% else%} 128 | {{i.avaliacao}} 129 | 130 | {% endif %} 131 |
136 | 137 | 138 |
139 | 140 | 141 | 142 | 169 | 170 | 171 | 181 | 182 | {% endblock %} -------------------------------------------------------------------------------- /livro/views.py: -------------------------------------------------------------------------------- 1 | from datetime import date, datetime 2 | from django.shortcuts import redirect, render 3 | from django.http import HttpResponse 4 | from usuarios.models import Usuario 5 | from .models import Emprestimos, Livros, Categoria 6 | from .forms import CadastroLivro, CategoriaLivro 7 | from django import forms 8 | from django.db.models import Q 9 | # Create your views here. 10 | 11 | def home(request): 12 | if request.session.get('usuario'): 13 | usuario = Usuario.objects.get(id = request.session['usuario']) 14 | status_categoria = request.GET.get('cadastro_categoria') 15 | livros = Livros.objects.filter(usuario = usuario) 16 | total_livros = livros.count() 17 | form = CadastroLivro() 18 | form.fields['usuario'].initial = request.session['usuario'] 19 | form.fields['categoria'].queryset = Categoria.objects.filter(usuario = usuario) 20 | form_categoria = CategoriaLivro() 21 | usuarios = Usuario.objects.all() 22 | 23 | livros_emprestar = Livros.objects.filter(usuario = usuario).filter(emprestado = False) 24 | livros_emprestados = Livros.objects.filter(usuario = usuario).filter(emprestado = True) 25 | 26 | 27 | 28 | return render(request, 'home.html', {'livros': livros, 29 | 'usuario_logado': request.session.get('usuario'), 30 | 'form': form, 31 | 'status_categoria': status_categoria, 32 | 'form_categoria': form_categoria, 33 | 'usuarios': usuarios, 34 | 'livros_emprestar': livros_emprestar, 35 | 'total_livro': total_livros, 36 | 'livros_emprestados': livros_emprestados}) 37 | else: 38 | return redirect('/auth/login/?status=2') 39 | 40 | 41 | def ver_livros(request, id): 42 | if request.session.get('usuario'): 43 | livro = Livros.objects.get(id = id) 44 | if request.session.get('usuario') == livro.usuario.id: 45 | usuario = Usuario.objects.get(id = request.session['usuario']) 46 | categoria_livro = Categoria.objects.filter(usuario = request.session.get('usuario')) 47 | emprestimos = Emprestimos.objects.filter(livro = livro) 48 | form = CadastroLivro() 49 | form.fields['usuario'].initial = request.session['usuario'] 50 | form.fields['categoria'].queryset = Categoria.objects.filter(usuario = usuario) 51 | 52 | form_categoria = CategoriaLivro() 53 | usuarios = Usuario.objects.all() 54 | 55 | livros_emprestar = Livros.objects.filter(usuario = usuario).filter(emprestado = False) 56 | livros_emprestados = Livros.objects.filter(usuario = usuario).filter(emprestado = True) 57 | 58 | return render(request, 'ver_livro.html', {'livro': livro, 59 | 'categoria_livro': categoria_livro, 60 | 'emprestimos': emprestimos, 61 | 'usuario_logado': request.session.get('usuario'), 62 | 'form': form, 63 | 'id_livro': id, 64 | 'form_categoria': form_categoria, 65 | 'usuarios': usuarios, 66 | 'livros_emprestar': livros_emprestar, 67 | 'livros_emprestados': livros_emprestados}) 68 | else: 69 | return HttpResponse('Esse livro não é seu') 70 | return redirect('/auth/login/?status=2') 71 | 72 | def cadastrar_livro(request): 73 | if request.method == 'POST': 74 | form = CadastroLivro(request.POST) 75 | 76 | if form.is_valid(): 77 | form.save() 78 | return redirect('/livro/home') 79 | else: 80 | return HttpResponse('DADOS INVÁLIDOS') 81 | 82 | def excluir_livro(request, id): 83 | livro = Livros.objects.get(id = id).delete() 84 | return redirect('/livro/home') 85 | 86 | def cadastrar_categoria(request): 87 | form = CategoriaLivro(request.POST) 88 | nome = form.data['nome'] 89 | descricao = form.data['descricao'] 90 | id_usuario = request.POST.get('usuario') 91 | if int(id_usuario) == int(request.session.get('usuario')): 92 | user = Usuario.objects.get(id = id_usuario) 93 | categoria = Categoria(nome = nome, descricao = descricao, usuario = user ) 94 | categoria.save() 95 | return redirect('/livro/home?cadastro_categoria=1') 96 | else: 97 | return HttpResponse('Pare de ser um usuário malandrinho. Não foi desta vez.') 98 | 99 | 100 | def cadastrar_emprestimo(request): 101 | if request.method == 'POST': 102 | nome_emprestado = request.POST.get('nome_emprestado') 103 | nome_emprestado_anonimo = request.POST.get('nome_emprestado_anonimo') 104 | livro_emprestado = request.POST.get('livro_emprestado') 105 | 106 | if nome_emprestado_anonimo: 107 | emprestimo = Emprestimos(nome_emprestado_anonimo = nome_emprestado_anonimo, 108 | livro_id = livro_emprestado) 109 | else: 110 | emprestimo = Emprestimos(nome_emprestado_id=nome_emprestado, 111 | livro_id = livro_emprestado) 112 | emprestimo.save() 113 | 114 | livro = Livros.objects.get(id = livro_emprestado) 115 | livro.emprestado = True 116 | livro.save() 117 | 118 | 119 | return redirect('/livro/home') 120 | 121 | def devolver_livro(request): 122 | id = request.POST.get('id_livro_devolver') 123 | livro_devolver = Livros.objects.get(id = id) 124 | livro_devolver.emprestado = False 125 | livro_devolver.save() 126 | 127 | emprestimo_devolver = Emprestimos.objects.get(Q(livro = livro_devolver) & Q(data_devolucao = None) ) 128 | emprestimo_devolver.data_devolucao = datetime.now() 129 | emprestimo_devolver.save() 130 | 131 | return redirect('/livro/home') 132 | 133 | def alterar_livro(request): 134 | livro_id = request.POST.get('livro_id') 135 | nome_livro = request.POST.get('nome_livro') 136 | autor = request.POST.get('autor') 137 | co_autor = request.POST.get('co_autor') 138 | categoria_id = request.POST.get('categoria_id') 139 | 140 | categoria = Categoria.objects.get(id = categoria_id) 141 | livro = Livros.objects.get(id = livro_id) 142 | if livro.usuario.id == request.session['usuario']: 143 | livro.nome = nome_livro 144 | livro.autor = autor 145 | livro.co_autor = co_autor 146 | livro.categoria = categoria 147 | livro.save() 148 | return redirect(f'/livro/ver_livro/{livro_id}') 149 | else: 150 | return redirect('/auth/sair') 151 | 152 | def seus_emprestimos(request): 153 | usuario = Usuario.objects.get(id = request.session['usuario']) 154 | emprestimos = Emprestimos.objects.filter(nome_emprestado = usuario) 155 | 156 | 157 | 158 | return render(request, 'seus_emprestimos.html', {'usuario_logado': request.session['usuario'], 159 | 'emprestimos': emprestimos}) 160 | 161 | def processa_avaliacao(request): 162 | id_emprestimo = request.POST.get('id_emprestimo') 163 | opcoes = request.POST.get('opcoes') 164 | id_livro = request.POST.get('id_livro') 165 | #TODO: Verificar segurança 166 | #TODO: Não permitir avaliação de livro nao devolvido 167 | #TODO: Colocar as estrelas 168 | emprestimo = Emprestimos.objects.get(id = id_emprestimo) 169 | emprestimo.avaliacao = opcoes 170 | emprestimo.save() 171 | return redirect(f'/livro/ver_livro/{id_livro}') -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | {% block 'head' %} {% endblock %} 11 | 12 | {% block 'titulo' %} {% endblock %} 13 | 14 | 15 | 16 | 17 | 18 | 39 | 40 | 41 | {% block 'conteudo' %} {% endblock %} 42 | 43 | 44 | 45 | 46 | 47 | {% if usuario_logado %} 48 | 135 | {% endif %} 136 | 137 | 138 | 191 | 192 | 193 | --------------------------------------------------------------------------------