Преглед изворни кода

Cambio búsqueda y filtrado

Celestino Rey пре 1 година
родитељ
комит
9ee7ba5d11
5 измењених фајлова са 58 додато и 48 уклоњено
  1. 37 9
      src/finanzas/forms.py
  2. 12 13
      src/finanzas/views.py
  3. 0 7
      src/templates/_navigation.html
  4. 0 4
      src/templates/base.html
  5. 9 15
      src/templates/dashboard.html

+ 37 - 9
src/finanzas/forms.py

@@ -1,7 +1,8 @@
 from django import forms
+from datetime import datetime
 from decimal import Decimal, InvalidOperation
 from .models import Movimiento, Cuenta
-
+from django.utils.translation import gettext_lazy as _
 
 class MovimientoForm(forms.ModelForm):
     monto = forms.CharField()
@@ -41,14 +42,6 @@ class MovimientoForm(forms.ModelForm):
             raise forms.ValidationError("Introduzca un número válido. Puede usar coma o punto como separador decimal.")
 
 
-class FiltroForm(forms.Form):
-    #    fecha_inicio = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
-    #    fecha_fin = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
-    #    cuenta = forms.ModelChoiceField(queryset=Cuenta.objects.all(), required=False)
-    buscar = forms.CharField(required=False, label='',
-                             widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Buscar...'}))
-
-
 class CuentaForm(forms.ModelForm):
     saldo = forms.CharField()
 
@@ -76,3 +69,38 @@ class CuentaForm(forms.ModelForm):
             return Decimal(valor)
         except InvalidOperation:
             raise forms.ValidationError("Introduzca un número válido. Use coma o punto como separador decimal.")
+
+
+class FiltroMesAnioForm(forms.Form):
+    MESES = [
+        (1, _('Enero')),
+        (2, _('Febrero')),
+        (3, _('Marzo')),
+        (4, _('Abril')),
+        (5, _('Mayo')),
+        (6, _('Junio')),
+        (7, _('Julio')),
+        (8, _('Agosto')),
+        (9, _('Septiembre')),
+        (10, _('Octubre')),
+        (11, _('Noviembre')),
+        (12, _('Diciembre')),
+    ]
+    ANIOS = [(a, a) for a in range(2020, datetime.now().year + 1)]
+
+    mes = forms.ChoiceField(choices=MESES, label='Mes')
+    anio = forms.ChoiceField(choices=ANIOS, label='Año')
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.fields['mes'].widget.attrs.update({'class': 'form-control'})
+        self.fields['anio'].widget.attrs.update({'class': 'form-control'})
+
+
+class FiltroForm(forms.Form):
+    #    fecha_inicio = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
+    #    fecha_fin = forms.DateField(required=False, widget=forms.DateInput(attrs={'type': 'date'}))
+    #    cuenta = forms.ModelChoiceField(queryset=Cuenta.objects.all(), required=False)
+    buscar = forms.CharField(required=False, label='',
+                             widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Buscar...'}))
+

+ 12 - 13
src/finanzas/views.py

@@ -18,7 +18,7 @@ import re
 
 from accounts import models
 from .models import Movimiento, Cuenta, MovimientoFrecuente, Categoria, TransaccionRecurrente
-from .forms import MovimientoForm, FiltroForm, CuentaForm
+from .forms import MovimientoForm, FiltroForm, CuentaForm, FiltroMesAnioForm
 from .recurrentes import procesar_transacciones_recurrentes
 
 
@@ -32,21 +32,19 @@ def dashboard(request):
 
     hoy = now()
 
-    # Obtener mes y año de GET o usar el actual
-    mes = int(request.GET.get('mes', hoy.month))
-    anio = int(request.GET.get('anio', hoy.year))
+    form_fecha = FiltroMesAnioForm(request.GET or None)
+    mes = hoy.month
+    anio = hoy.year
 
-    logger.warning(f"dashboard: mes: {mes} / año: {anio}")
+    if form_fecha.is_valid():
+        mes = int(form_fecha.cleaned_data['mes'])
+        anio = int(form_fecha.cleaned_data['anio'])
 
-    # Obtener último día del mes
-    ultimo_dia = monthrange(anio, mes)[1]
-
-    # Crear fechas aware
-    inicio_naive = datetime.combine(date(anio, mes, 1), time.min)
-    fin_naive = datetime.combine(date(anio, mes, ultimo_dia), time.max)
+    #logger.warning(f"dashboard: mes: {mes} / año: {anio}")
 
-    inicio_mes = make_aware(inicio_naive) if is_naive(inicio_naive) else inicio_naive
-    fin_mes = make_aware(fin_naive) if is_naive(fin_naive) else fin_naive
+    inicio_mes = timezone.make_aware(datetime(anio, mes, 1))
+    ultimo_dia = monthrange(anio, mes)[1]
+    fin_mes = timezone.make_aware(datetime(anio, mes, ultimo_dia, 23, 59, 59))
 
     movimientos = Movimiento.objects.filter(usuario=request.user, fecha__range=(inicio_mes, fin_mes)).order_by('-fecha')
 
@@ -67,6 +65,7 @@ def dashboard(request):
         'movimientos': movimientos,
         'user': request.user,
         'form_filtro': form_filtro,
+        'form_fecha': form_fecha,
         'favoritas': favoritas,
         'frecuentes': frecuentes,
         'mes': mes,

+ 0 - 7
src/templates/_navigation.html

@@ -4,13 +4,6 @@
         <div>
            <i id="menu-btn" class="bi bi-list"></i>               
         </div>
-        {% if form_filtro %}
-        <div class="form-group">
-            <form method="get">
-                {{ form_filtro.as_p }}
-            </form>
-        </div>
-        {% endif %}
     </div>
 
     <div class="profile">

+ 0 - 4
src/templates/base.html

@@ -14,10 +14,6 @@
                 <div>
                 <i id="menu-btn" class="bi bi-list""></i>               
                 </div>
-                <div class="search">
-                <i class="bi bi-search"></i>              
-                    <input type="text" placeholder="Buscar...">
-                </div>
             </div>
 
             <div class="profile">

+ 9 - 15
src/templates/dashboard.html

@@ -40,21 +40,15 @@
     </div>
 
     <div class="board">
-        <div>
-            <form method="get" class="mb-3">
-                <select name="mes">
-                {% for m in 1|to:12 %}
-                    <option value="{{ m }}" {% if m == mes %}selected{% endif %}>
-                    {{ m }}
-                    </option>
-                {% endfor %}
-                </select>
-                <select name="anio">
-                {% for y in 2020|to:anio %}
-                    <option value="{{ y }}" {% if y == anio %}selected{% endif %}>{{ y }}</option>
-                {% endfor %}
-                </select>
-                <button type="submit">Filtrar</button>
+        <div class="form-group">
+            <form method="get">
+                {{ form_fecha.mes }}
+                {{ form_fecha.anio }}
+                {{ form_filtro.buscar }}
+                <button type="submit" class="btn btn-primari">Filtrar</button>
+                {% if form_filtro.buscar.value %}
+                    <a href="{% url 'dashboard' %}?mes={{ form_fecha.mes.value }}&anio={{ form_fecha.anio.value }}" class="btn btn-outline-secondary">Limpiar</a>
+                {% endif %}
             </form>
         </div>