Merge branch 'feature/#10_crear_formularios' into 'develop'
Feature/#10 crear formularios See merge request !13
Showing
22 changed files
with
339 additions
and
7 deletions
@@ -71,20 +71,20 @@ def agregar_varios_permisos_grupo(permisos_por_app, grupo): | @@ -71,20 +71,20 @@ def agregar_varios_permisos_grupo(permisos_por_app, grupo): | ||
71 | 71 | ||
72 | @pytest.fixture | 72 | @pytest.fixture |
73 | def get_default_test_user(): | 73 | def get_default_test_user(): |
74 | - test_user = create_user(username='test_user', first_name='Test', last_name='User', email='test@user', documento_identidad='12345678') | 74 | + test_user = create_user(username='test_user', first_name='Test', last_name='User', email='tests@user', documento_identidad='12345678') |
75 | return test_user | 75 | return test_user |
76 | 76 | ||
77 | 77 | ||
78 | @pytest.fixture | 78 | @pytest.fixture |
79 | def crear_usuarios(): | 79 | def crear_usuarios(): |
80 | usuario1 = create_user(username='usuario1', first_name='Usuario', last_name='J', | 80 | usuario1 = create_user(username='usuario1', first_name='Usuario', last_name='J', |
81 | - email='test@user1', documento_identidad='12345777') | 81 | + email='tests@user1', documento_identidad='12345777') |
82 | 82 | ||
83 | usuario2 = create_user(username='usuario2', first_name='Usuario', last_name='S', | 83 | usuario2 = create_user(username='usuario2', first_name='Usuario', last_name='S', |
84 | - email='test@user2', documento_identidad='12345679') | 84 | + email='tests@user2', documento_identidad='12345679') |
85 | 85 | ||
86 | usuario3 = create_user(username='usuario3', first_name='Usuario', last_name='P', | 86 | usuario3 = create_user(username='usuario3', first_name='Usuario', last_name='P', |
87 | - email='test@user3', documento_identidad='12345699') | 87 | + email='tests@user3', documento_identidad='12345699') |
88 | 88 | ||
89 | return usuario1, usuario2, usuario3 | 89 | return usuario1, usuario2, usuario3 |
90 | 90 |
project/apps/edicto/__init__.py
0 → 100644
project/apps/edicto/admin.py
0 → 100644
project/apps/edicto/api.py
0 → 100644
1 | +from rest_framework import viewsets | ||
2 | +from rest_framework import status | ||
3 | +from rest_framework.response import Response | ||
4 | +# from rest_framework.decorators import action | ||
5 | + | ||
6 | +from .models import Edicto | ||
7 | +from .serializer import EdictoSerializer | ||
8 | +from .utils import contador | ||
9 | + | ||
10 | + | ||
11 | +class EdictoView(viewsets.ModelViewSet): | ||
12 | + queryset = Edicto.objects.all().order_by('id') | ||
13 | + serializer_class = EdictoSerializer | ||
14 | + | ||
15 | + def create(self, request, *args, **kwargs): | ||
16 | + edicto = request.data.get('edicto') | ||
17 | + cantidad_palabras = contador(edicto) | ||
18 | + | ||
19 | + serializer = self.get_serializer(data=request.data) | ||
20 | + serializer.is_valid(raise_exception=True) | ||
21 | + serializer.save(cantidad_palabras=cantidad_palabras) | ||
22 | + | ||
23 | + return Response(serializer.data, status=status.HTTP_201_CREATED) |
project/apps/edicto/apps.py
0 → 100644
project/apps/edicto/constants.py
0 → 100644
1 | +from django.utils.translation import gettext_lazy as _ | ||
2 | + | ||
3 | +INICIADO = 'iniciado' | ||
4 | +PENDIENTE_DE_PAGO = 'pendiente_de_pago' | ||
5 | +PUBLICADO = 'publicado' | ||
6 | +APROBADO = 'aprobado' | ||
7 | +RECHAZADO = 'rechazado' | ||
8 | + | ||
9 | + | ||
10 | +STATUS_CHOICE = [ | ||
11 | + (INICIADO, _('iniciado')), | ||
12 | + (PENDIENTE_DE_PAGO, _('pendiente_de_pago')), | ||
13 | + (PUBLICADO, _('publicado')), | ||
14 | + (APROBADO,_('aprobado')), | ||
15 | + (RECHAZADO, _('rechazado')), | ||
16 | + ] |
project/apps/edicto/contador.py
0 → 100644
1 | +from .models import Edicto, ComprobantePago, Precio | ||
2 | + | ||
3 | + | ||
4 | +def contador(edicto_id, precio_id): | ||
5 | + edicto = Edicto.objects.select_related('usuario').get(id=edicto_id) | ||
6 | + organismo = edicto.usuario.organismo.es_publico | ||
7 | + | ||
8 | + sellos = edicto.cantidad_sellos | ||
9 | + palabras = edicto.cantidad_palabras | ||
10 | + copias = edicto.cantidad_copias | ||
11 | + publicar = edicto.dias_publicar | ||
12 | + | ||
13 | + precio_valores = Precio.objects.values('precio', 'precio_ejemplar').get(id=precio_id) | ||
14 | + precio = precio_valores['precio'] | ||
15 | + precio_ejemplar = precio_valores['precio_ejemplar'] | ||
16 | + | ||
17 | + result_palabra = (sellos + palabras) * precio | ||
18 | + result_ejemplar = (copias * precio_ejemplar) + (publicar * precio_ejemplar) | ||
19 | + | ||
20 | + if organismo: | ||
21 | + resultado = result_ejemplar + result_palabra / 2 | ||
22 | + else: | ||
23 | + resultado = result_ejemplar + result_palabra | ||
24 | + | ||
25 | + precio_resultado = ComprobantePago(edicto=edicto, resultado=resultado) | ||
26 | + precio_resultado.save() | ||
27 | + return precio_resultado |
1 | +# Generated by Django 4.1.9 on 2023-07-03 22:26 | ||
2 | + | ||
3 | +from django.conf import settings | ||
4 | +from django.db import migrations, models | ||
5 | +import django.db.models.deletion | ||
6 | +import edicto.utils | ||
7 | + | ||
8 | + | ||
9 | +class Migration(migrations.Migration): | ||
10 | + | ||
11 | + initial = True | ||
12 | + | ||
13 | + dependencies = [ | ||
14 | + ('organismo', '0002_organismo_es_publico'), | ||
15 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
16 | + ] | ||
17 | + | ||
18 | + operations = [ | ||
19 | + migrations.CreateModel( | ||
20 | + name='Precio', | ||
21 | + fields=[ | ||
22 | + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
23 | + ('precio', models.FloatField(max_length=50)), | ||
24 | + ('vigencia_desde', models.DateTimeField()), | ||
25 | + ('vigencia_hasta', models.DateTimeField()), | ||
26 | + ('moneda', models.CharField(max_length=50)), | ||
27 | + ('precio_ejemplar', models.FloatField(max_length=50)), | ||
28 | + ('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), | ||
29 | + ], | ||
30 | + options={ | ||
31 | + 'verbose_name': 'Administrador', | ||
32 | + 'verbose_name_plural': 'Administradores', | ||
33 | + }, | ||
34 | + ), | ||
35 | + migrations.CreateModel( | ||
36 | + name='Edicto', | ||
37 | + fields=[ | ||
38 | + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
39 | + ('cuerpo_edicto', models.TextField()), | ||
40 | + ('archivo', models.FileField(upload_to='uploads/%Y/%m/%d/', validators=[edicto.utils.valid_extension])), | ||
41 | + ('dias_plubicar', models.FloatField(default=0.0)), | ||
42 | + ('cantidad_sellos', models.FloatField(default=0.0)), | ||
43 | + ('estado', models.CharField(choices=[('iniciado', 'iniciado'), ('pendiente_de_pago', 'pendiente_de_pago'), ('publicado', 'publicado'), ('rechazado', 'rechazado')], default='inciado', max_length=150)), | ||
44 | + ('cantidad_palabras', models.IntegerField()), | ||
45 | + ('cantidad_copias', models.IntegerField()), | ||
46 | + ('fecha_publicacion', models.DateTimeField()), | ||
47 | + ('organismo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organismo.organismo', verbose_name='Organismo')), | ||
48 | + ('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Usuario')), | ||
49 | + ], | ||
50 | + options={ | ||
51 | + 'verbose_name': 'Edicto', | ||
52 | + 'verbose_name_plural': 'Edictos', | ||
53 | + }, | ||
54 | + ), | ||
55 | + migrations.CreateModel( | ||
56 | + name='ComprobantePago', | ||
57 | + fields=[ | ||
58 | + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
59 | + ('resultado', models.FloatField()), | ||
60 | + ('numero_comprobante', models.CharField(max_length=300)), | ||
61 | + ('fecha_pago', models.DateTimeField()), | ||
62 | + ('edicto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='edicto.edicto')), | ||
63 | + ], | ||
64 | + options={ | ||
65 | + 'verbose_name': 'ComprobantePago', | ||
66 | + 'verbose_name_plural': 'ComprobantesPagos', | ||
67 | + }, | ||
68 | + ), | ||
69 | + ] |
1 | +# Generated by Django 4.1.9 on 2023-07-12 12:00 | ||
2 | + | ||
3 | +from django.db import migrations, models | ||
4 | + | ||
5 | + | ||
6 | +class Migration(migrations.Migration): | ||
7 | + | ||
8 | + dependencies = [ | ||
9 | + ('edicto', '0001_initial'), | ||
10 | + ] | ||
11 | + | ||
12 | + operations = [ | ||
13 | + migrations.AlterField( | ||
14 | + model_name='comprobantepago', | ||
15 | + name='fecha_pago', | ||
16 | + field=models.DateTimeField(null=True), | ||
17 | + ), | ||
18 | + migrations.AlterField( | ||
19 | + model_name='comprobantepago', | ||
20 | + name='numero_comprobante', | ||
21 | + field=models.CharField(max_length=300, null=True), | ||
22 | + ), | ||
23 | + ] |
project/apps/edicto/migrations/0003_edicto_fecha_creacion_edicto_fecha_modificacion_and_more.py
0 → 100644
1 | +# Generated by Django 4.1.9 on 2023-07-13 11:49 | ||
2 | + | ||
3 | +from django.db import migrations, models | ||
4 | +import django.utils.timezone | ||
5 | + | ||
6 | + | ||
7 | +class Migration(migrations.Migration): | ||
8 | + | ||
9 | + dependencies = [ | ||
10 | + ('edicto', '0002_alter_comprobantepago_fecha_pago_and_more'), | ||
11 | + ] | ||
12 | + | ||
13 | + operations = [ | ||
14 | + migrations.AddField( | ||
15 | + model_name='edicto', | ||
16 | + name='fecha_creacion', | ||
17 | + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), | ||
18 | + preserve_default=False, | ||
19 | + ), | ||
20 | + migrations.AddField( | ||
21 | + model_name='edicto', | ||
22 | + name='fecha_modificacion', | ||
23 | + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), | ||
24 | + preserve_default=False, | ||
25 | + ), | ||
26 | + migrations.AlterField( | ||
27 | + model_name='edicto', | ||
28 | + name='estado', | ||
29 | + field=models.CharField(choices=[('iniciado', 'iniciado'), ('pendiente_de_pago', 'pendiente_de_pago'), ('publicado', 'publicado'), ('aprobado', 'aprobado'), ('rechazado', 'rechazado')], default='inciado', max_length=150), | ||
30 | + ), | ||
31 | + ] |
1 | +# Generated by Django 4.1.9 on 2023-07-17 12:04 | ||
2 | + | ||
3 | +from django.db import migrations | ||
4 | + | ||
5 | + | ||
6 | +class Migration(migrations.Migration): | ||
7 | + | ||
8 | + dependencies = [ | ||
9 | + ('edicto', '0003_edicto_fecha_creacion_edicto_fecha_modificacion_and_more'), | ||
10 | + ] | ||
11 | + | ||
12 | + operations = [ | ||
13 | + migrations.RemoveField( | ||
14 | + model_name='edicto', | ||
15 | + name='organismo', | ||
16 | + ), | ||
17 | + ] |
project/apps/edicto/migrations/__init__.py
0 → 100644
project/apps/edicto/models.py
0 → 100644
1 | +from django.db import models | ||
2 | + | ||
3 | + | ||
4 | +from .utils import valid_extension | ||
5 | +from .constants import STATUS_CHOICE | ||
6 | + | ||
7 | +from usuario.models import Usuario | ||
8 | +from organismo.models import Organismo | ||
9 | + | ||
10 | +# Create your models here. | ||
11 | + | ||
12 | + | ||
13 | +class Precio (models.Model): | ||
14 | + precio = models.FloatField(max_length=50, blank=False, null=False) | ||
15 | + vigencia_desde = models.DateTimeField() | ||
16 | + vigencia_hasta = models.DateTimeField() | ||
17 | + usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE) | ||
18 | + moneda = models.CharField(max_length=50, blank=False, null=False) | ||
19 | + precio_ejemplar = models.FloatField(max_length=50, blank=False, null=False) | ||
20 | + | ||
21 | + class Meta: | ||
22 | + verbose_name = 'Administrador' | ||
23 | + verbose_name_plural = 'Administradores' | ||
24 | + | ||
25 | + def __str__(self): | ||
26 | + return self.moneda | ||
27 | + | ||
28 | + | ||
29 | +class Edicto(models.Model): | ||
30 | + usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE, verbose_name='Usuario') | ||
31 | + cuerpo_edicto = models.TextField(blank=False, null=False) | ||
32 | + archivo = models.FileField(upload_to="uploads/%Y/%m/%d/", null=False, blank=False, validators=[valid_extension]) | ||
33 | + dias_plubicar = models.FloatField(default=0.00, blank=False, null=False) | ||
34 | + cantidad_sellos = models.FloatField(default=0.00, blank=False, null=False) | ||
35 | + estado = models.CharField(max_length=150, choices=STATUS_CHOICE, default='inciado') | ||
36 | + cantidad_palabras = models.IntegerField() | ||
37 | + cantidad_copias = models.IntegerField() | ||
38 | + fecha_publicacion = models.DateTimeField() | ||
39 | + fecha_creacion = models.DateTimeField(auto_now_add=True) | ||
40 | + fecha_modificacion = models.DateTimeField(auto_now_add=True) | ||
41 | + | ||
42 | + class Meta: | ||
43 | + verbose_name = 'Edicto' | ||
44 | + verbose_name_plural = 'Edictos' | ||
45 | + | ||
46 | + def __str__(self): | ||
47 | + return self.cuerpo_edicto | ||
48 | + | ||
49 | + | ||
50 | +class ComprobantePago(models.Model): | ||
51 | + edicto = models.ForeignKey(Edicto, on_delete=models.CASCADE) | ||
52 | + resultado = models.FloatField(blank=False, null=False) | ||
53 | + numero_comprobante = models.CharField(max_length=300, blank=False, null=True) | ||
54 | + fecha_pago = models.DateTimeField(blank=False, null=True) | ||
55 | + | ||
56 | + class Meta: | ||
57 | + verbose_name = 'ComprobantePago' | ||
58 | + verbose_name_plural = 'ComprobantesPagos' | ||
59 | + | ||
60 | + def __str__(self): | ||
61 | + return self.edicto |
project/apps/edicto/serializer.py
0 → 100644
1 | +from rest_framework import serializers | ||
2 | + | ||
3 | + | ||
4 | +from .models import Edicto | ||
5 | + | ||
6 | + | ||
7 | +class EdictoSerializer(serializers.ModelSerializer): | ||
8 | + cantidad_palabras = serializers.IntegerField(read_only=True) | ||
9 | + created = serializers.DateTimeField(read_only=True) | ||
10 | + | ||
11 | + class Meta: | ||
12 | + model = Edicto | ||
13 | + fields = ('cuerpo_edicto', | ||
14 | + 'dias_publicar', | ||
15 | + 'cantidad_sellos', | ||
16 | + 'estado', | ||
17 | + 'cantidad_copias', | ||
18 | + 'fecha_publicacion',) |
project/apps/edicto/tests.py
0 → 100644
project/apps/edicto/tests/__init__.py
0 → 100644
project/apps/edicto/tests/tests_edicto.py
0 → 100644
1 | +from django.test import TestCase | ||
2 | +from edicto.utils import contador | ||
3 | + | ||
4 | + | ||
5 | +class ContadorTestCase(TestCase): | ||
6 | + def test_contador(self): | ||
7 | + edicto = "Texto de prueba con palabras números y expresiones 58. (...) (entre paréntesis [y corchetes])" | ||
8 | + resultado = contador(edicto) | ||
9 | + self.assertEqual(resultado, 16) |
project/apps/edicto/utils.py
0 → 100644
1 | +from django.core.exceptions import ValidationError | ||
2 | +import re | ||
3 | + | ||
4 | + | ||
5 | +def valid_extension(value): | ||
6 | + if (not value.name.endswith('.pdf') and | ||
7 | + not value.name.endswith('.jpeg') and | ||
8 | + not value.name.endswith('.png') and | ||
9 | + not value.name.endswith('.jpg')): | ||
10 | + raise ValidationError("Archivos permitidos: .pdf .jpg, .jpeg, .png") | ||
11 | + | ||
12 | + | ||
13 | +def contador(edicto): | ||
14 | + numeros = re.findall(r'\b\d+(?:\.\d+)?\b', edicto) | ||
15 | + expresiones = re.findall(r'[(\[{](.*?)[)\]}]', edicto) | ||
16 | + texto = edicto.split() | ||
17 | + cantidad_palabras = len(texto) | ||
18 | + cantidad_numeros = len(numeros) | ||
19 | + cantidad_expresiones = len(expresiones) | ||
20 | + total_edicto = cantidad_palabras + cantidad_numeros + cantidad_expresiones - 1 | ||
21 | + return total_edicto |
project/apps/edicto/views.py
0 → 100644
@@ -2,9 +2,10 @@ from rest_framework import routers | @@ -2,9 +2,10 @@ from rest_framework import routers | ||
2 | 2 | ||
3 | from organismo import api as organismo_api | 3 | from organismo import api as organismo_api |
4 | from usuario import api as usuario_api | 4 | from usuario import api as usuario_api |
5 | - | 5 | +from edicto.api import EdictoView |
6 | # Define routes | 6 | # Define routes |
7 | router = routers.DefaultRouter() | 7 | router = routers.DefaultRouter() |
8 | 8 | ||
9 | router.register(prefix='usuario', viewset=usuario_api.UsuarioViewSet) | 9 | router.register(prefix='usuario', viewset=usuario_api.UsuarioViewSet) |
10 | -router.register(prefix='organismo', viewset=organismo_api.OrganismoViewSet) | ||
10 | +router.register(prefix='organismo', viewset=organismo_api.OrganismoViewSet) | ||
11 | +router.register(r'edicto', EdictoView, basename='edicto') |
@@ -57,6 +57,7 @@ PROJECT_APPS = ( | @@ -57,6 +57,7 @@ PROJECT_APPS = ( | ||
57 | 'core', | 57 | 'core', |
58 | 'organismo', | 58 | 'organismo', |
59 | 'usuario', | 59 | 'usuario', |
60 | + 'edicto', | ||
60 | ) | 61 | ) |
61 | 62 | ||
62 | INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + PROJECT_APPS | 63 | INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + PROJECT_APPS |
-
Please register or login to post a comment