| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- from django.contrib import messages
- from django.shortcuts import redirect, render
- from django.urls import reverse_lazy
- from django.views.generic import CreateView, DeleteView, ListView, UpdateView
- from .forms import DividendoForm, OperacionForm, ValorForm
- from .models import Dividendo, Operacion, Valor
- from .services import actualizar_precios, desglose_fifo, posiciones, resumen_fiscal, totales
- class CancelarUrlMixin:
- """Aporta la URL de cancelación al formulario (vuelve atrás si hay referer)."""
- def get_context_data(self, **kwargs):
- ctx = super().get_context_data(**kwargs)
- ctx['cancelar_url'] = self.request.META.get('HTTP_REFERER') or str(self.success_url)
- return ctx
- def dashboard(request):
- pos = posiciones()
- context = {
- 'posiciones': pos,
- 'abiertas': [p for p in pos if p['acciones'] > 0],
- 'cerradas': [p for p in pos if p['acciones'] == 0],
- 'totales': totales(pos),
- }
- return render(request, 'cartera/dashboard.html', context)
- def actualizar(request):
- if request.method == 'POST':
- correctos, errores = actualizar_precios()
- if correctos:
- messages.success(request, f'Precios actualizados: {correctos}')
- for ticker, motivo in errores:
- messages.warning(request, f'{ticker}: {motivo}')
- return redirect('cartera:dashboard')
- def fifo(request):
- filas = desglose_fifo()
- context = {
- 'filas': filas,
- 'fiscal': resumen_fiscal(filas),
- 'total': sum((f['resultado'] or 0 for f in filas), start=0),
- }
- return render(request, 'cartera/fifo.html', context)
- class OperacionListView(ListView):
- model = Operacion
- template_name = 'cartera/operacion_list.html'
- context_object_name = 'operaciones'
- queryset = Operacion.objects.select_related('valor')
- class OperacionCreateView(CancelarUrlMixin, CreateView):
- model = Operacion
- form_class = OperacionForm
- template_name = 'cartera/form.html'
- success_url = reverse_lazy('cartera:operaciones')
- titulo = 'Nueva operación'
- def form_valid(self, form):
- messages.success(self.request, 'Operación registrada')
- return super().form_valid(form)
- class OperacionUpdateView(CancelarUrlMixin, UpdateView):
- model = Operacion
- form_class = OperacionForm
- template_name = 'cartera/form.html'
- success_url = reverse_lazy('cartera:operaciones')
- titulo = 'Editar operación'
- def form_valid(self, form):
- messages.success(self.request, 'Operación actualizada')
- return super().form_valid(form)
- class OperacionDeleteView(DeleteView):
- model = Operacion
- template_name = 'cartera/confirm_delete.html'
- success_url = reverse_lazy('cartera:operaciones')
- titulo = 'Eliminar operación'
- def form_valid(self, form):
- messages.success(self.request, 'Operación eliminada')
- return super().form_valid(form)
- class DividendoListView(ListView):
- model = Dividendo
- template_name = 'cartera/dividendo_list.html'
- context_object_name = 'dividendos'
- queryset = Dividendo.objects.select_related('valor')
- class DividendoCreateView(CancelarUrlMixin, CreateView):
- model = Dividendo
- form_class = DividendoForm
- template_name = 'cartera/form.html'
- success_url = reverse_lazy('cartera:dividendos')
- titulo = 'Nuevo dividendo'
- def form_valid(self, form):
- messages.success(self.request, 'Dividendo registrado')
- return super().form_valid(form)
- class DividendoUpdateView(CancelarUrlMixin, UpdateView):
- model = Dividendo
- form_class = DividendoForm
- template_name = 'cartera/form.html'
- success_url = reverse_lazy('cartera:dividendos')
- titulo = 'Editar dividendo'
- def form_valid(self, form):
- messages.success(self.request, 'Dividendo actualizado')
- return super().form_valid(form)
- class DividendoDeleteView(DeleteView):
- model = Dividendo
- template_name = 'cartera/confirm_delete.html'
- success_url = reverse_lazy('cartera:dividendos')
- titulo = 'Eliminar dividendo'
- def form_valid(self, form):
- messages.success(self.request, 'Dividendo eliminado')
- return super().form_valid(form)
- class ValorListView(ListView):
- model = Valor
- template_name = 'cartera/valor_list.html'
- context_object_name = 'valores'
- class ValorCreateView(CancelarUrlMixin, CreateView):
- model = Valor
- form_class = ValorForm
- template_name = 'cartera/form.html'
- success_url = reverse_lazy('cartera:valores')
- titulo = 'Nuevo valor'
- def form_valid(self, form):
- messages.success(self.request, 'Valor creado')
- return super().form_valid(form)
- class ValorUpdateView(CancelarUrlMixin, UpdateView):
- model = Valor
- form_class = ValorForm
- template_name = 'cartera/form.html'
- success_url = reverse_lazy('cartera:valores')
- titulo = 'Editar valor'
- def form_valid(self, form):
- messages.success(self.request, 'Valor actualizado')
- return super().form_valid(form)
- class ValorDeleteView(DeleteView):
- model = Valor
- template_name = 'cartera/confirm_delete.html'
- success_url = reverse_lazy('cartera:valores')
- titulo = 'Eliminar valor'
- def form_valid(self, form):
- messages.success(self.request, 'Valor eliminado (con todas sus operaciones)')
- return super().form_valid(form)
|