Skip to content

Commit

Permalink
Merge pull request #13 from Brwnds/duda
Browse files Browse the repository at this point in the history
Configurações da rota e carrinho
  • Loading branch information
dudaa28 authored Sep 12, 2024
2 parents edfe18c + bacdc6b commit c682bb4
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 23 deletions.
5 changes: 5 additions & 0 deletions app/app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,4 +130,9 @@

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

# settings.py
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/home/' # Redireciona para a home após login
LOGOUT_REDIRECT_URL = '/login/' # Redireciona para a página de login após logout


2 changes: 2 additions & 0 deletions app/app/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,6 @@
path('catalogo/', views.catalogo, name='catalogo'),
path('basket/', views.basket, name='basket'),
path('adm/', views.admin, name='adm'),
path('adicionar_ao_carrinho/', views.adicionar_ao_carrinho, name='adicionar_ao_carrinho'),
path('listar_carrinho/', views.listar_carrinho, name='listar_carrinho'),
]
7 changes: 5 additions & 2 deletions app/loja/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,8 @@
# Registrar o modelo Bolo no admin
@admin.register(Bolo)
class BoloAdmin(admin.ModelAdmin):
list_display = ('sabor', 'descricao', 'imagem_url') # Exibe essas colunas na lista de bolos
search_fields = ('sabor',) # Permite pesquisar por sabor
# Exibe colunas adicionais, incluindo os preços para cada tamanho
list_display = ('sabor', 'descricao', 'imagem_url', 'preco_pequeno', 'preco_medio', 'preco_grande')

# Permite pesquisar pelo sabor
search_fields = ('sabor',)
66 changes: 47 additions & 19 deletions app/loja/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from decimal import Decimal


class Bolo(models.Model):
TAMANHOS = [
Expand All @@ -10,50 +12,76 @@ class Bolo(models.Model):
('G', 'Grande'),
]

PRECO_POR_TAMANHO = {
'P': 15.00,
'M': 25.00,
'G': 35.00,
}

sabor = models.CharField(max_length=100)
descricao = models.TextField()
imagem_url = models.URLField()
tamanho = models.CharField(max_length=1, choices=TAMANHOS) # Campo para tamanho
preco = models.DecimalField(max_digits=6, decimal_places=2, editable=False) # Preço baseado no tamanho

# Preços para cada tamanho
preco_pequeno = models.DecimalField(max_digits=6, decimal_places=2, default=15.00)
preco_medio = models.DecimalField(max_digits=6, decimal_places=2, default=25.00)
preco_grande = models.DecimalField(max_digits=6, decimal_places=2, default=35.00)

def save(self, *args, **kwargs):
# Define o preço baseado no tamanho escolhido
self.preco = self.PRECO_POR_TAMANHO[self.tamanho]
super().save(*args, **kwargs)
def get_preco_por_tamanho(self, tamanho):
if tamanho == 'P':
return self.preco_pequeno
elif tamanho == 'M':
return self.preco_medio
elif tamanho == 'G':
return self.preco_grande
else:
return None

def __str__(self):
return f'{self.sabor} ({self.get_tamanho_display()})'
return self.sabor


class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
carrinho = models.JSONField(default=list) # Carrinho como lista de dicionários
valor_total_carrinho = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)

def __str__(self):
return self.user.username

def adicionar_bolo_ao_carrinho(self, bolo):
# Verifica se o bolo já está no carrinho
def adicionar_bolo_ao_carrinho(self, bolo, tamanho):
# Obtém o preço de acordo com o tamanho
preco = bolo.get_preco_por_tamanho(tamanho)
if preco is None:
raise ValueError("Tamanho inválido")

# Converte o preço de Decimal para float
preco = float(preco)

# Verifica se o bolo de tamanho específico já está no carrinho
for item in self.carrinho:
if item['bolo_id'] == bolo.id:
if item['bolo_id'] == bolo.id and item['tamanho'] == tamanho:
# Incrementa a quantidade se o bolo já estiver no carrinho
item['quantidade'] += 1
# Atualiza o valor total
self.valor_total_carrinho += Decimal(preco)
break
else:
# Adiciona o bolo ao carrinho com quantidade 1 se ainda não estiver
self.carrinho.append({'bolo_id': bolo.id, 'quantidade': 1})
# Salva o perfil com o carrinho atualizado
# Adiciona o bolo ao carrinho com quantidade 1
self.carrinho.append({'bolo_id': bolo.id, 'tamanho': tamanho, 'preco': preco, 'quantidade': 1})
# Atualiza o valor total
self.valor_total_carrinho += Decimal(preco)

# Salva o perfil com o carrinho atualizado e o valor total
self.save()

def listar_carrinho(self):
return self.carrinho

def obter_valor_total(self):
return self.valor_total_carrinho

def limpar_carrinho(self):
# Limpa o carrinho e zera o valor total
self.carrinho = []
self.valor_total_carrinho = 0.00
self.save()



@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
Expand Down
35 changes: 33 additions & 2 deletions app/loja/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
from django.shortcuts import render, redirect
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from django.contrib import messages
from django.contrib.auth import authenticate, login as auth_login
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from .models import Bolo, Profile
import json


@login_required
def home(request):
return render(request, 'home.html')

Expand Down Expand Up @@ -38,11 +45,35 @@ def cadastro(request):
messages.error(request, "As senhas não coincidem")
return render(request, 'cadastro.html')

@login_required
def catalogo(request):
return render(request, 'catalogo.html')

@login_required
def basket(request):
return render(request, 'basket.html')

@login_required
def admin(request):
return render(request, 'admin.html')
return render(request, 'admin.html')

@require_POST
def adicionar_ao_carrinho(request):
data = json.loads(request.body)
bolo_nome = data['bolo_nome']
tamanho = data['tamanho']

# Encontra o bolo pelo nome
bolo = get_object_or_404(Bolo, sabor=bolo_nome)

# Obtém o perfil do usuário
profile = Profile.objects.get(user=request.user)

# Adiciona o bolo ao carrinho
profile.adicionar_bolo_ao_carrinho(bolo, tamanho)

return JsonResponse({'success': True})

def listar_carrinho(request):
profile = Profile.objects.get(user=request.user)
return JsonResponse({'carrinho': profile.listar_carrinho()})

0 comments on commit c682bb4

Please sign in to comment.