diff --git a/README.md b/README.md index bc1b233..bf745e4 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,8 @@ ```bash $ # Get the code -$ git clone https://github.com/creativetimofficial/material-dashboard-django.git -$ cd material-dashboard-django +$ git clone https://github.com/imorlxs/django-ddsi +$ cd django-ddsi $ $ # Virtualenv modules installation (Unix based systems) $ virtualenv env diff --git a/apps/home/admin.py b/apps/home/admin.py index 304ee83..b1f98fa 100644 --- a/apps/home/admin.py +++ b/apps/home/admin.py @@ -6,3 +6,7 @@ from django.contrib import admin # Register your models here. + +from .models import Campana + +admin.site.register(Campana) \ No newline at end of file diff --git a/apps/home/forms.py b/apps/home/forms.py new file mode 100644 index 0000000..4945d0f --- /dev/null +++ b/apps/home/forms.py @@ -0,0 +1,31 @@ +from django import forms +from .models import Ingreso, Gasto # Importa los modelos +from .models import Campana + +class IngresoForm(forms.ModelForm): + class Meta: + model = Ingreso + fields = ['monto_ingreso'] + widgets = { + 'monto_ingreso': forms.NumberInput(attrs={'class': 'form-control'}), + } + +class GastoForm(forms.ModelForm): + class Meta: + model = Gasto + fields = ['monto_gasto'] + widgets = { + 'monto_gasto': forms.NumberInput(attrs={'class': 'form-control'}), + } + +class CampanaForm(forms.ModelForm): + class Meta: + model = Campana + fields = ['id_campana', 'nombre_campana', 'tipo', 'estado', 'precio'] + widgets = { + 'id_campana': forms.TextInput(attrs={'class': 'form-control'}), + 'nombre_campana': forms.TextInput(attrs={'class': 'form-control'}), + 'tipo': forms.TextInput(attrs={'class': 'form-control'}), + 'estado': forms.Select(attrs={'class': 'form-control'}), + 'precio': forms.NumberInput(attrs={'class': 'form-control'}), + } \ No newline at end of file diff --git a/apps/home/migrations/0001_initial.py b/apps/home/migrations/0001_initial.py new file mode 100644 index 0000000..d099689 --- /dev/null +++ b/apps/home/migrations/0001_initial.py @@ -0,0 +1,117 @@ +# Generated by Django 3.2.6 on 2024-12-05 10:50 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Campaña', + fields=[ + ('id_campaña', models.CharField(max_length=10, primary_key=True, serialize=False)), + ('nombre_campaña', models.CharField(max_length=20)), + ('tipo', models.CharField(max_length=20)), + ('estado', models.CharField(choices=[('activa', 'Activa'), ('pendiente', 'Pendiente'), ('finalizada', 'Finalizada')], max_length=10)), + ('precio', models.DecimalField(decimal_places=2, max_digits=10)), + ('motivo_bajaCampaña', models.CharField(blank=True, max_length=50, null=True)), + ], + ), + migrations.CreateModel( + name='Empleado', + fields=[ + ('DNIEmpleado', models.CharField(max_length=9, primary_key=True, serialize=False)), + ('nombreEmpleado', models.CharField(max_length=20)), + ('apellidosEmpleado', models.CharField(max_length=40)), + ('cargo', models.CharField(max_length=20)), + ('telefonoEmpleado', models.CharField(max_length=20)), + ('emailEmpleado', models.CharField(max_length=40)), + ('direccionEmpleado', models.CharField(max_length=40)), + ('fecha_nacEmpleado', models.DateField()), + ('motivo_bajaEmpleado', models.CharField(blank=True, max_length=20, null=True)), + ('fecha_bajaEmpleado', models.DateField(blank=True, null=True)), + ('contraseña', models.CharField(max_length=4)), + ], + ), + migrations.CreateModel( + name='Gasto', + fields=[ + ('id_gasto', models.AutoField(primary_key=True, serialize=False)), + ('monto_gasto', models.DecimalField(decimal_places=2, max_digits=10)), + ], + ), + migrations.CreateModel( + name='Ingreso', + fields=[ + ('id_ingreso', models.AutoField(primary_key=True, serialize=False)), + ('monto_ingreso', models.DecimalField(decimal_places=2, max_digits=10)), + ], + ), + migrations.CreateModel( + name='Producto', + fields=[ + ('ID_producto', models.CharField(max_length=13, primary_key=True, serialize=False)), + ('nombre_producto', models.CharField(max_length=24)), + ('cantidad', models.IntegerField()), + ('precio', models.DecimalField(decimal_places=2, max_digits=10)), + ('tallas', models.CharField(max_length=60)), + ('proveedor', models.CharField(max_length=24)), + ], + ), + migrations.CreateModel( + name='Socio', + fields=[ + ('DNISocio', models.CharField(max_length=9, primary_key=True, serialize=False)), + ('nombreSocio', models.CharField(max_length=24)), + ('apellidosSocio', models.CharField(max_length=24)), + ('emailSocio', models.CharField(max_length=40)), + ('telefonoSocio', models.CharField(max_length=9)), + ('direccionSocio', models.CharField(max_length=40)), + ('fecha_nacSocio', models.DateField()), + ('motivo_bajaSocio', models.CharField(blank=True, max_length=60, null=True)), + ('fecha_bajaSocio', models.DateField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='Ordena', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fecha_gasto', models.DateField()), + ('hora_gasto', models.DateTimeField()), + ('id_gasto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.gasto')), + ('id_producto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.producto')), + ], + options={ + 'unique_together': {('id_producto', 'id_gasto')}, + }, + ), + migrations.CreateModel( + name='Genera', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('id_campaña', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.campaña')), + ('id_gasto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.gasto')), + ], + options={ + 'unique_together': {('id_campaña', 'id_gasto')}, + }, + ), + migrations.CreateModel( + name='Compra', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fecha_compra', models.DateField()), + ('dnisocio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.socio')), + ('id_producto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.producto')), + ], + options={ + 'unique_together': {('id_producto', 'dnisocio')}, + }, + ), + ] diff --git a/apps/home/migrations/0002_auto_20241211_1801.py b/apps/home/migrations/0002_auto_20241211_1801.py new file mode 100644 index 0000000..243950e --- /dev/null +++ b/apps/home/migrations/0002_auto_20241211_1801.py @@ -0,0 +1,46 @@ +# Generated by Django 3.2.6 on 2024-12-11 17:01 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0001_initial'), + ] + + operations = [ + migrations.RenameModel( + old_name='Campaña', + new_name='Campana', + ), + migrations.RenameField( + model_name='campana', + old_name='id_campaña', + new_name='id_campana', + ), + migrations.RenameField( + model_name='campana', + old_name='motivo_bajaCampaña', + new_name='motivo_bajaCampana', + ), + migrations.RenameField( + model_name='campana', + old_name='nombre_campaña', + new_name='nombre_campana', + ), + migrations.RenameField( + model_name='empleado', + old_name='contraseña', + new_name='contrasena', + ), + migrations.RenameField( + model_name='genera', + old_name='id_campaña', + new_name='id_campana', + ), + migrations.AlterUniqueTogether( + name='genera', + unique_together={('id_campana', 'id_gasto')}, + ), + ] diff --git a/apps/home/migrations/0003_alter_campana_id_campana.py b/apps/home/migrations/0003_alter_campana_id_campana.py new file mode 100644 index 0000000..dbfdaa6 --- /dev/null +++ b/apps/home/migrations/0003_alter_campana_id_campana.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2025-01-06 18:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0002_auto_20241211_1801'), + ] + + operations = [ + migrations.AlterField( + model_name='campana', + name='id_campana', + field=models.AutoField(max_length=10, primary_key=True, serialize=False), + ), + ] diff --git a/apps/home/migrations/0004_remove_campana_motivo_bajacampana.py b/apps/home/migrations/0004_remove_campana_motivo_bajacampana.py new file mode 100644 index 0000000..dc65099 --- /dev/null +++ b/apps/home/migrations/0004_remove_campana_motivo_bajacampana.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.6 on 2025-01-08 10:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('home', '0003_alter_campana_id_campana'), + ] + + operations = [ + migrations.RemoveField( + model_name='campana', + name='motivo_bajaCampana', + ), + ] diff --git a/apps/home/models.py b/apps/home/models.py index c94fe84..f679b90 100644 --- a/apps/home/models.py +++ b/apps/home/models.py @@ -7,4 +7,114 @@ from django.contrib.auth.models import User # Create your models here. +# Empleado +class Empleado(models.Model): + DNIEmpleado = models.CharField(max_length=9, primary_key=True) + nombreEmpleado = models.CharField(max_length=20) + apellidosEmpleado = models.CharField(max_length=40) + cargo = models.CharField(max_length=20) + telefonoEmpleado = models.CharField(max_length=20) + emailEmpleado = models.CharField(max_length=40) + direccionEmpleado = models.CharField(max_length=40) + fecha_nacEmpleado = models.DateField() + motivo_bajaEmpleado = models.CharField(max_length=20, null=True, blank=True) + fecha_bajaEmpleado = models.DateField(null=True, blank=True) + contrasena = models.CharField(max_length=4) + + def _str_(self): + return f'{self.nombreEmpleado} {self.apellidosEmpleado}' + + +# Socio +class Socio(models.Model): + DNISocio = models.CharField(max_length=9, primary_key=True) + nombreSocio = models.CharField(max_length=24) + apellidosSocio = models.CharField(max_length=24) + emailSocio = models.CharField(max_length=40) + telefonoSocio = models.CharField(max_length=9) + direccionSocio = models.CharField(max_length=40) + fecha_nacSocio = models.DateField() + motivo_bajaSocio = models.CharField(max_length=60, null=True, blank=True) + fecha_bajaSocio = models.DateField(null=True, blank=True) + + def _str_(self): + return f'{self.nombreSocio} {self.apellidosSocio}' + + +# Producto +class Producto(models.Model): + ID_producto = models.CharField(max_length=13, primary_key=True) + nombre_producto = models.CharField(max_length=24) + cantidad = models.IntegerField() + precio = models.DecimalField(max_digits=10, decimal_places=2) + tallas = models.CharField(max_length=60) + proveedor = models.CharField(max_length=24) + + def _str_(self): + return self.nombre_producto + + +# Ingreso +class Ingreso(models.Model): + id_ingreso = models.AutoField(primary_key=True) + monto_ingreso = models.DecimalField(max_digits=10, decimal_places=2) + + def _str_(self): + return f'Ingreso {self.id_ingreso}' + + +# Gasto +class Gasto(models.Model): + id_gasto = models.AutoField(primary_key=True) + monto_gasto = models.DecimalField(max_digits=10, decimal_places=2) + + def _str_(self): + return f'Gasto {self.id_gasto}' + + +# Campana +class Campana(models.Model): + ESTADO_CHOICES = [ + ('activa', 'Activa'), + ('pendiente', 'Pendiente'), + ('finalizada', 'Finalizada') + ] + + id_campana = models.AutoField(max_length=10, primary_key=True) + nombre_campana = models.CharField(max_length=20) + tipo = models.CharField(max_length=20) + estado = models.CharField(max_length=10, choices=ESTADO_CHOICES) + precio = models.DecimalField(max_digits=10, decimal_places=2) + + def _str_(self): + return f'Campana {self.id_campana}' + +# Genera +class Genera(models.Model): + id_campana = models.ForeignKey(Campana, on_delete=models.CASCADE) + id_gasto = models.ForeignKey(Gasto, on_delete=models.CASCADE) + + class Meta: + unique_together = ('id_campana', 'id_gasto') + + +# Ordena +class Ordena(models.Model): + id_producto = models.ForeignKey(Producto, on_delete=models.CASCADE) + id_gasto = models.ForeignKey(Gasto, on_delete=models.CASCADE) + fecha_gasto = models.DateField() + hora_gasto = models.DateTimeField() + + class Meta: + unique_together = ('id_producto', 'id_gasto') + + +# Compra +class Compra(models.Model): + id_producto = models.ForeignKey(Producto, on_delete=models.CASCADE) + dnisocio = models.ForeignKey(Socio, on_delete=models.CASCADE) + fecha_compra = models.DateField() + + class Meta: + unique_together = ('id_producto', 'dnisocio') diff --git a/apps/home/urls.py b/apps/home/urls.py index 5acb444..d551125 100644 --- a/apps/home/urls.py +++ b/apps/home/urls.py @@ -10,8 +10,24 @@ # The home page path('', views.index, name='home'), + + #path('contabilidad', views.contabilidad_view, name='contabilidad'), + path('ingresos', views.ingresos_view, name='ingresos'), + path('gastos', views.gastos_view, name='gastos'), + path('contabilidad', views.contabilidad_view, name='contabilidad'), + path('eliminar_ingreso//', views.eliminar_ingreso, name='eliminar_ingreso'), + path('eliminar_gasto//', views.eliminar_gasto, name='eliminar_gasto'), + + + path('campanas', views.campanas_view, name='campanas'), # Vista principal de campañas + path('eliminar_campana//', views.eliminar_campana, name='eliminar_campana'), # Eliminar campaña + #path('editar_campana//', views.editar_campana, name='editar_campana'), # Editar campaña + # Matches any html file re_path(r'^.*\.*', views.pages, name='pages'), + + ] + diff --git a/apps/home/views.py b/apps/home/views.py index 2513b78..1edb344 100644 --- a/apps/home/views.py +++ b/apps/home/views.py @@ -5,10 +5,143 @@ from django import template from django.contrib.auth.decorators import login_required -from django.http import HttpResponse, HttpResponseRedirect +from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.template import loader from django.urls import reverse +from django.db.models import Sum +from django.db.models import Q +# Modelos DDSI +from .models import Ingreso +from .models import Gasto +from .forms import IngresoForm, GastoForm +from django.shortcuts import render, redirect, get_object_or_404 +from django.contrib import messages +from .models import Campana +from .forms import CampanaForm + + +def contabilidad_view(request): + # Calcular la suma de los ingresos + total_ingresos = Ingreso.objects.all().aggregate(total=Sum('monto_ingreso'))['total'] or 0 + + # Calcular la suma de los gastos + total_gastos = Gasto.objects.all().aggregate(total=Sum('monto_gasto'))['total'] or 0 + + # Calcular el balance neto + balance_neto = total_ingresos - total_gastos + + # Pasar todo al contexto + return render(request, 'home/contabilidad.html', { + 'total_ingresos': total_ingresos, + 'total_gastos': total_gastos, + 'balance_neto': balance_neto, + }) + +@login_required(login_url="/login/") +def ingresos_view(request): + # BUSCAR INGRESOS + search_query = request.GET.get('search', '') + if search_query: + ingresos = Ingreso.objects.filter(id_ingreso__icontains=search_query) + else: + ingresos = Ingreso.objects.all() + + context = { + 'ingresos': ingresos, + } + + # Manejo de formularios para anadir ingresos y gastos + if request.method == 'POST': + if 'add_ingreso' in request.POST: # Si se pulsa el botón de Ingreso + ingreso_form = IngresoForm(request.POST) + if ingreso_form.is_valid(): + ingreso_form.save() + return redirect('ingresos') # Redirige a la misma página + elif 'edit_ingreso' in request.POST: # Si se pulsa el botón de Editar + # Obtener el id del ingreso desde el formulario POST + ingreso_id = request.POST.get('ingreso_id') # El ID viene con el formulario + ingreso = get_object_or_404(Ingreso, id_ingreso=ingreso_id) + ingreso_form = IngresoForm(request.POST, instance=ingreso) + if ingreso_form.is_valid(): + ingreso_form.save() + return redirect('ingresos') # Redirige a la misma página + else: + ingreso_form = IngresoForm() + + # Si estamos editando un ingreso, obtenemos ese ingreso + ingreso_id = request.GET.get('edit', None) + if ingreso_id: + ingreso = get_object_or_404(Ingreso, id_ingreso=ingreso_id) + ingreso_form = IngresoForm(instance=ingreso) + + context['ingreso_form'] = ingreso_form + + html_template = loader.get_template('home/ingresos.html') + return HttpResponse(html_template.render(context, request)) + + +@login_required(login_url="/login/") +def gastos_view(request): + # BUSCAR GASTOS + search_query = request.GET.get('search', '') + if search_query: + gastos = Gasto.objects.filter(id_gasto__icontains=search_query) + else: + gastos = Gasto.objects.all() + + context = { + 'gastos': gastos, + } + + # Manejo de formularios para anadir gastos y gastos + if request.method == 'POST': + if 'add_gasto' in request.POST: # Si se pulsa el botón de Gasto + gasto_form = GastoForm(request.POST) + if gasto_form.is_valid(): + gasto_form.save() + return redirect('gastos') # Redirige a la misma página + elif 'edit_gasto' in request.POST: # Si se pulsa el botón de Editar + # Obtener el id del gasto desde el formulario POST + gasto_id = request.POST.get('gasto_id') # El ID viene con el formulario + gasto = get_object_or_404(Gasto, id_gasto=gasto_id) + gasto_form = GastoForm(request.POST, instance=gasto) + if gasto_form.is_valid(): + gasto_form.save() + return redirect('gastos') # Redirige a la misma página + else: + gasto_form = GastoForm() + + # Si estamos editando un gasto, obtenemos ese gasto + gasto_id = request.GET.get('edit', None) + if gasto_id: + gasto = get_object_or_404(Gasto, id_gasto=gasto_id) + gasto_form = GastoForm(instance=gasto) + + context['gasto_form'] = gasto_form + + html_template = loader.get_template('home/gastos.html') + return HttpResponse(html_template.render(context, request)) + + + +@login_required(login_url="/login/") +def eliminar_ingreso(request, ingreso_id): + # Asegurarse de que la solicitud sea POST + if request.method == 'POST': + ingreso = get_object_or_404(Ingreso, id_ingreso=ingreso_id) + ingreso.delete() # Elimina el ingreso de la base de datos + + return redirect('contabilidad') # Redirige a la vista de contabilidad + +@login_required(login_url="/login/") +def eliminar_gasto(request, gasto_id): + # Asegurarse de que la solicitud sea POST + if request.method == 'POST': + gasto = get_object_or_404(Gasto, id_gasto=gasto_id) + gasto.delete() # Elimina el ingreso de la base de datos + + return redirect('contabilidad') # Redirige a la vista de contabilidad @login_required(login_url="/login/") def index(request): @@ -30,6 +163,7 @@ def pages(request): if load_template == 'admin': return HttpResponseRedirect(reverse('admin:index')) context['segment'] = load_template + html_template = loader.get_template('home/' + load_template) return HttpResponse(html_template.render(context, request)) @@ -42,3 +176,68 @@ def pages(request): except: html_template = loader.get_template('home/page-500.html') return HttpResponse(html_template.render(context, request)) + + +@login_required(login_url="/login/") +def campanas_view(request): + # Search query + search_query = request.GET.get('search', '') + if search_query: + campanas = Campana.objects.filter(nombre_campana__icontains=search_query) + else: + campanas = Campana.objects.all() + + context = { + 'campanas': campanas, + } + + # Modules Management + campana_form = CampanaForm() # Always initialize the form at the beginning + + if request.method == 'POST': + # Verify that the campaign edit has been clicked + if 'edit_campana' in request.POST: + campana_id = request.POST.get('campana_id') + if campana_id: + # Get the corresponding campaign + campana = get_object_or_404(Campana, id_campana=campana_id) + campana_form = CampanaForm(request.POST, instance=campana) + + # If the form is valid, we save the data + if campana_form.is_valid(): + campana_form.save() + messages.success(request, "¡Campaña editada con éxito!") + return redirect('campanas') # Redirects to the view of the campaign + else: + # Add an error message if the form is invalid + messages.error(request, "Hay algunos errores en el formulario.") + else: + messages.error(request, "No se encontró el ID de campaña.") + + # Verify that adding a new campaign has been clicked + elif 'add_campana' in request.POST: + campana_form = CampanaForm(request.POST) # Create a new form with the submitted data + + # If the form is valid, we save the data + if campana_form.is_valid(): + campana_form.save() + messages.success(request, "¡Nueva campaña agregada exitosamente!") + return redirect('campanas') # Redirects to the view of the campaign + else: + # Add an error message if the form is invalid + messages.error(request, "Hay algunos errores en el formulario.") + + context['campana_form'] = campana_form + + # Template path + html_template = loader.get_template('home/campanas.html') + return HttpResponse(html_template.render(context, request)) + +@login_required(login_url="/login/") +def eliminar_campana(request, id_campana): + # Make sure the request is POST + if request.method == 'POST': + campana = get_object_or_404(Campana, id_campana=id_campana) + campana.delete() # Delete the campaign from the database + + return redirect('campanas') # redirects to the view of the campaign \ No newline at end of file diff --git a/apps/templates/home/campanas.html b/apps/templates/home/campanas.html new file mode 100644 index 0000000..8140280 --- /dev/null +++ b/apps/templates/home/campanas.html @@ -0,0 +1,127 @@ +{% extends "layouts/base.html" %} +{% block title %}Campañas{% endblock %} + +{% block content %} +
+
+
+
+

Campañas

+

Listado de todas las campañas

+
+
+ + +
+ +
+
+
+
+ + + + + + + + {% for campana in campanas %} + + + + + + {% endfor %} + +
IDNombre CampañaAcciones
{{ campana.id_campana }}{{ campana.nombre_campana }} + + + +
+ {% csrf_token %} + +
+
+
+
+
+
+
+ + + + + + + + + + +{% endblock content %} diff --git a/apps/templates/home/contabilidad.html b/apps/templates/home/contabilidad.html new file mode 100644 index 0000000..ebc4626 --- /dev/null +++ b/apps/templates/home/contabilidad.html @@ -0,0 +1,82 @@ +{% extends "layouts/base.html" %} + +{% block title %} Contabilidad {% endblock %} + + +{% block stylesheets %}{% endblock stylesheets %} + +{% block content %} + + + +{% endblock content %} + + +{% block javascripts %} + + + +{% endblock javascripts %} diff --git a/apps/templates/home/ejemplo.html b/apps/templates/home/ejemplo.html new file mode 100644 index 0000000..9bad42a --- /dev/null +++ b/apps/templates/home/ejemplo.html @@ -0,0 +1,41 @@ +def gastos_view(request): + # BUSCAR GASTOS + search_query = request.GET.get('search', '') + if search_query: + gastos = Gasto.objects.filter(id_gasto__icontains=search_query) + else: + gastos = Gasto.objects.all() + + context = { + 'gastos': gastos, + } + + # Manejo de formularios para añadir gastos y gastos + if request.method == 'POST': + if 'add_gasto' in request.POST: # Si se pulsa el botón de Gasto + gasto_form = GastoForm(request.POST) + if gasto_form.is_valid(): + gasto_form.save() + return redirect('gastos') # Redirige a la misma página + elif 'edit_gasto' in request.POST: # Si se pulsa el botón de Editar + # Obtener el id del gasto desde el formulario POST + gasto_id = request.POST.get('gasto_id') # El ID viene con el formulario + gasto = get_object_or_404(Gasto, id_gasto=gasto_id) + gasto_form = GastoForm(request.POST, instance=gasto) + if gasto_form.is_valid(): + gasto_form.save() + return redirect('gastos') # Redirige a la misma página + else: + gasto_form = GastoForm() + + # Si estamos editando un gasto, obtenemos ese gasto + gasto_id = request.GET.get('edit', None) + if gasto_id: + gasto = get_object_or_404(Gasto, id_gasto=gasto_id) + gasto_form = GastoForm(instance=gasto) + + context['gasto_form'] = gasto_form + + html_template = loader.get_template('home/gastos.html') + return HttpResponse(html_template.render(context, request)) + diff --git a/apps/templates/home/gastos.html b/apps/templates/home/gastos.html new file mode 100644 index 0000000..da4dd4d --- /dev/null +++ b/apps/templates/home/gastos.html @@ -0,0 +1,135 @@ +{% extends "layouts/base.html" %} +{% block title %} UI Tables {% endblock %} + + +{% block stylesheets %}{% endblock stylesheets %} +{% block content %} + +
+ + + + +
+
+
+

Gastos

+

Listado de todos los gastos

+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + + + + + + {% for gasto in gastos %} + + + + + + {% endfor %} + +
IDMonto GastoAcciones
{{ gasto.id_gasto }}€ {{ gasto.monto_gasto }} + +
+ {% csrf_token %} + +
+
+
+
+
+
+ + + + + + + +
+ +{% endblock content %} + + +{% block javascripts %} + + +{% endblock javascripts %} \ No newline at end of file diff --git a/apps/templates/home/ingresos.html b/apps/templates/home/ingresos.html new file mode 100644 index 0000000..e18fbd0 --- /dev/null +++ b/apps/templates/home/ingresos.html @@ -0,0 +1,135 @@ +{% extends "layouts/base.html" %} +{% block title %} UI Tables {% endblock %} + + +{% block stylesheets %}{% endblock stylesheets %} +{% block content %} + +
+ + + + +
+
+
+

Ingresos

+

Listado de todos los ingresos

+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+ + + + + + + + {% for ingreso in ingresos %} + + + + + + {% endfor %} + +
IDMonto IngresoAcciones
{{ ingreso.id_ingreso }}€ {{ ingreso.monto_ingreso }} + +
+ {% csrf_token %} + +
+
+
+
+
+
+ + + + + + + +
+ +{% endblock content %} + + +{% block javascripts %} + + +{% endblock javascripts %} \ No newline at end of file diff --git a/apps/templates/home/ui-tables.html b/apps/templates/home/ui-tables.html deleted file mode 100644 index 400ca3b..0000000 --- a/apps/templates/home/ui-tables.html +++ /dev/null @@ -1,286 +0,0 @@ -{% extends "layouts/base.html" %} - -{% block title %} UI Tables {% endblock %} - - -{% block stylesheets %}{% endblock stylesheets %} - -{% block content %} - -
-
-
-
-

Simple Table

-

Here is a subtitle for this table

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ID - - Name - - Country - - City - - Salary -
- 1 - - Dakota Rice - - Niger - - Oud-Turnhout - - $36,738 -
- 2 - - Minerva Hooper - - Curaçao - - Sinaai-Waas - - $23,789 -
- 3 - - Sage Rodriguez - - Netherlands - - Baileux - - $56,142 -
- 4 - - Philip Chaney - - Korea, South - - Overland Park - - $38,735 -
- 5 - - Doris Greene - - Malawi - - Feldkirchen in Kärnten - - $63,542 -
- 6 - - Mason Porter - - Chile - - Gloucester - - $78,615 -
-
-
-
-
-
-
-
-

Table on Plain Background

-

Here is a subtitle for this table

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ID - - Name - - Country - - City - - Salary -
- 1 - - Dakota Rice - - Niger - - Oud-Turnhout - - $36,738 -
- 2 - - Minerva Hooper - - Curaçao - - Sinaai-Waas - - $23,789 -
- 3 - - Sage Rodriguez - - Netherlands - - Baileux - - $56,142 -
- 4 - - Philip Chaney - - Korea, South - - Overland Park - - $38,735 -
- 5 - - Doris Greene - - Malawi - - Feldkirchen in Kärnten - - $63,542 -
- 6 - - Mason Porter - - Chile - - Gloucester - - $78,615 -
-
-
-
-
-
- -{% endblock content %} - - -{% block javascripts %}{% endblock javascripts %} diff --git a/apps/templates/includes/navigation.html b/apps/templates/includes/navigation.html index 15faff6..473c651 100644 --- a/apps/templates/includes/navigation.html +++ b/apps/templates/includes/navigation.html @@ -3,7 +3,7 @@