From 5816b94beadb5de0428359c613ab66cff9ff9228 Mon Sep 17 00:00:00 2001 From: Isaac Morales Date: Thu, 5 Dec 2024 08:42:52 +0100 Subject: [PATCH 01/17] Creados modelos BD --- apps/home/models.py | 111 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/apps/home/models.py b/apps/home/models.py index c94fe84..bada2c5 100644 --- a/apps/home/models.py +++ b/apps/home/models.py @@ -7,4 +7,115 @@ 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) + contraseña = 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}' + + +# Campaña +class Campaña(models.Model): + ESTADO_CHOICES = [ + ('activa', 'Activa'), + ('pendiente', 'Pendiente'), + ('finalizada', 'Finalizada') + ] + + id_campaña = models.CharField(max_length=10, primary_key=True) + nombre_campaña = 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) + motivo_bajaCampaña = models.CharField(max_length=50, null=True, blank=True) + + def _str_(self): + return self.nombre_campaña + + +# Genera +class Genera(models.Model): + id_campaña = models.ForeignKey(Campaña, on_delete=models.CASCADE) + id_gasto = models.ForeignKey(Gasto, on_delete=models.CASCADE) + + class Meta: + unique_together = ('id_campaña', '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') \ No newline at end of file From df4c85a2a3cd3d27e5b0c0e03bccc8a9e6b7d526 Mon Sep 17 00:00:00 2001 From: Isaac Morales Date: Thu, 5 Dec 2024 09:02:40 +0100 Subject: [PATCH 02/17] Actualizar sidebar --- apps/home/migrations/0001_initial.py | 117 +++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 apps/home/migrations/0001_initial.py diff --git a/apps/home/migrations/0001_initial.py b/apps/home/migrations/0001_initial.py new file mode 100644 index 0000000..cd1f865 --- /dev/null +++ b/apps/home/migrations/0001_initial.py @@ -0,0 +1,117 @@ +# Generated by Django 3.2.6 on 2024-12-05 07:46 + +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')}, + }, + ), + ] From 25eb0111cbfbd7a8be28b484dda1f0051e85d039 Mon Sep 17 00:00:00 2001 From: Isaac Morales Date: Thu, 5 Dec 2024 09:02:56 +0100 Subject: [PATCH 03/17] Actualizar sidebar --- apps/templates/includes/sidebar.html | 53 +++++++--------------------- 1 file changed, 12 insertions(+), 41 deletions(-) diff --git a/apps/templates/includes/sidebar.html b/apps/templates/includes/sidebar.html index cc5d0d5..e499570 100644 --- a/apps/templates/includes/sidebar.html +++ b/apps/templates/includes/sidebar.html @@ -1,8 +1,8 @@ - {% include 'includes/fixed-plugin.html' %} - {% include 'includes/scripts.html' %} {% include 'includes/scripts-sidebar.html' %} From b0075a07dc2262ad709d81bc4b82d715496b3aa5 Mon Sep 17 00:00:00 2001 From: Isaac Morales Date: Thu, 5 Dec 2024 13:21:52 +0100 Subject: [PATCH 08/17] separados ingresos y gastos --- apps/home/urls.py | 5 +- apps/home/views.py | 98 +++++++++++----- apps/templates/home/contabilidad.html | 158 -------------------------- apps/templates/home/ejemplo.html | 51 +++++++-- apps/templates/home/gastos.html | 135 ++++++++++++++++++++++ apps/templates/home/ingresos.html | 135 ++++++++++++++++++++++ 6 files changed, 384 insertions(+), 198 deletions(-) create mode 100644 apps/templates/home/gastos.html create mode 100644 apps/templates/home/ingresos.html diff --git a/apps/home/urls.py b/apps/home/urls.py index 9ec82ce..a8da06e 100644 --- a/apps/home/urls.py +++ b/apps/home/urls.py @@ -11,7 +11,10 @@ # The home page path('', views.index, name='home'), - path('contabilidad', views.contabilidad_view, name='contabilidad'), + #path('contabilidad', views.contabilidad_view, name='contabilidad'), + path('ingresos', views.ingresos_view, name='ingresos'), + path('gastos', views.gastos_view, name='gastos'), + path('eliminar_ingreso//', views.eliminar_ingreso, name='eliminar_ingreso'), path('eliminar_gasto//', views.eliminar_gasto, name='eliminar_gasto'), diff --git a/apps/home/views.py b/apps/home/views.py index 4ec2e5b..c524e17 100644 --- a/apps/home/views.py +++ b/apps/home/views.py @@ -16,53 +16,93 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib import messages - @login_required(login_url="/login/") -def contabilidad_view(request): - context = {'segment': 'contabilidad.html'} - -# BUSCAR INGRESOS - searchi_query = request.GET.get('search_ingreso', '') - - if searchi_query: - ingresos = Ingreso.objects.filter(id_ingreso__icontains=searchi_query) +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() - -# BUSCAR GASTOS - searchg_query = request.GET.get('search_gasto', '') - if searchg_query: - gastos = Gasto.objects.filter(id_gasto__icontains=searchg_query) - else: - gastos = Gasto.objects.all() - - context['ingresos'] = ingresos - context['gastos'] = gastos - - # Manejo de formularios para añadir ingresos y gastos + context = { + 'ingresos': ingresos, + } + + # Manejo de formularios para añadir 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('contabilidad') # Redirige a la misma página - elif 'add_gasto' in request.POST: # Si se pulsa el botón de Gasto + 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 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('contabilidad') + 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: - ingreso_form = IngresoForm() gasto_form = GastoForm() - - context['ingreso_form'] = ingreso_form + + # 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/contabilidad.html') + 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 diff --git a/apps/templates/home/contabilidad.html b/apps/templates/home/contabilidad.html index fd7b310..eec998c 100644 --- a/apps/templates/home/contabilidad.html +++ b/apps/templates/home/contabilidad.html @@ -6,164 +6,6 @@ {% block content %}
- - - - -
-
-
-

Ingresos

-

Listado de todos los ingresos

-
-
-
- - -
-
-
- -
-
- -
-
-
- - - - - - - - {% for ingreso in ingresos %} - - - - - - {% endfor %} - -
IDMonto IngresoAcciones
{{ ingreso.id_ingreso }}€ {{ ingreso.monto_ingreso }} - -
- {% csrf_token %} - -
-
-
-
-
-
- - -
-
-
-

Gastos

-

Listado de todos los gastos

- -
-
-
- - -
-
-
- -
-
-
-
-
- - - - - - - - {% for gasto in gastos %} - - - - - - {% endfor %} - -
IDMonto GastoAcciones
{{ gasto.id_gasto }}€ {{ gasto.monto_gasto }} - -
- {% csrf_token %} - -
-
-
-
-
-
- - - - - -
diff --git a/apps/templates/home/ejemplo.html b/apps/templates/home/ejemplo.html index e580f08..9bad42a 100644 --- a/apps/templates/home/ejemplo.html +++ b/apps/templates/home/ejemplo.html @@ -1,10 +1,41 @@ -{% extends 'base.html' %} - -{% block content %} -

Añadir Ingreso

-
- {% csrf_token %} - {{ ingreso_form.as_p }} - -
-{% endblock %} \ No newline at end of file +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 From 082ac261c8727e4459775c486a6b9b8526733030 Mon Sep 17 00:00:00 2001 From: Isaac Morales Date: Thu, 5 Dec 2024 13:45:42 +0100 Subject: [PATCH 09/17] =?UTF-8?q?He=20separado=20contabilidad=20y=20le=20h?= =?UTF-8?q?e=20hecho=20un=20peque=C3=B1o=20dashboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/home/urls.py | 2 +- apps/home/views.py | 18 ++++++ apps/templates/home/contabilidad.html | 76 +++++++++++++++++++++++-- apps/templates/includes/navigation.html | 2 +- apps/templates/layouts/base.html | 2 +- 5 files changed, 92 insertions(+), 8 deletions(-) diff --git a/apps/home/urls.py b/apps/home/urls.py index a8da06e..f987ef3 100644 --- a/apps/home/urls.py +++ b/apps/home/urls.py @@ -14,7 +14,7 @@ #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'), diff --git a/apps/home/views.py b/apps/home/views.py index c524e17..66a8d36 100644 --- a/apps/home/views.py +++ b/apps/home/views.py @@ -8,6 +8,7 @@ from django.http import HttpResponse, HttpResponseRedirect, JsonResponse from django.template import loader from django.urls import reverse +from django.db.models import Sum # Modelos DDSI from .models import Ingreso @@ -16,6 +17,23 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib import messages +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 diff --git a/apps/templates/home/contabilidad.html b/apps/templates/home/contabilidad.html index eec998c..ebc4626 100644 --- a/apps/templates/home/contabilidad.html +++ b/apps/templates/home/contabilidad.html @@ -1,16 +1,82 @@ {% extends "layouts/base.html" %} -{% block title %} UI Tables {% endblock %} + +{% block title %} Contabilidad {% endblock %} {% block stylesheets %}{% endblock stylesheets %} -{% block content %} -
+{% block content %} +
-
+ + + + + +
+
+
+
+ account_balance_wallet +
+

Balance Neto

+

${{ balance_neto|floatformat:0 }}

+
+ +
+
+
{% endblock content %} -{% block javascripts %}{% endblock javascripts %} \ No newline at end of file +{% 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 @@