Showing
19 changed files
with
285 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) | ||
24 | + | ||
25 | + | ||
26 | +''' class EdictoView(viewsets.ModelViewSet): | ||
27 | + queryset = Edicto.objects.all() | ||
28 | + serializer_class = EdictoSerializer | ||
29 | + | ||
30 | + @action(detail=True, methods='post') | ||
31 | + def post(self, request): | ||
32 | + | ||
33 | + edicto = request.data.get('edicto') | ||
34 | + cantidad_palabras = contador(edicto) | ||
35 | + serializer = self.get_serializer(data=request.data) | ||
36 | + if not serializer.is_valid(raise_exception=True): | ||
37 | + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) | ||
38 | + serializer.save(cantidad_palabras=cantidad_palabras) | ||
39 | + return Response(serializer.data, status=status.HTTP_201_CREATED) | ||
40 | + ''' |
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 | +RECHAZADO = 'rechazado' | ||
7 | + | ||
8 | + | ||
9 | +STATUS_CHOICE = [ | ||
10 | + (INICIADO, _('iniciado')), | ||
11 | + (PENDIENTE_DE_PAGO, _('pendiente_de_pago')), | ||
12 | + (PUBLICADO, _('publicado')), | ||
13 | + (RECHAZADO, _('rechazado')), | ||
14 | + ] |
project/apps/edicto/contador.py
0 → 100644
1 | +from django.db.models import F | ||
2 | + | ||
3 | +from organismo.models import Organismo | ||
4 | +from .models import Edicto, ComprobantePago | ||
5 | + | ||
6 | + | ||
7 | +def contador(edicto_id, nombre_id): | ||
8 | + edicto = Edicto.objects.select_related('usuario').get(id=edicto_id) | ||
9 | + organismo_object = Organismo.objects.get(id=nombre_id) | ||
10 | + organismo = organismo_object.es_publico | ||
11 | + | ||
12 | + sellos = edicto.cantidad_sellos | ||
13 | + palabras = edicto.cantidad_palabras | ||
14 | + copias = edicto.cantidad_copias | ||
15 | + publicar = edicto.dias_publicar | ||
16 | + | ||
17 | + precios = edicto.usuario.precio_set.all().values('precio', 'precio_ejemplar') | ||
18 | + precios_ejemplar = precios.aggregate( | ||
19 | + precio=F('precio'), | ||
20 | + precio_ejemplar=F('precio_ejemplar'), | ||
21 | + ) | ||
22 | + precio = precios_ejemplar['precio'] | ||
23 | + precio_copia = precios_ejemplar['precio_ejemplar'] | ||
24 | + | ||
25 | + result_palabra = (sellos + palabras) * precio | ||
26 | + result_ejemplar = (copias * precio_copia) + (publicar * precio_copia) | ||
27 | + | ||
28 | + if organismo is True: | ||
29 | + resultado = result_ejemplar + result_palabra / 2 | ||
30 | + else: | ||
31 | + resultado = result_ejemplar + result_palabra | ||
32 | + | ||
33 | + precio_resultado = ComprobantePago(edicto=edicto, resultado=resultado) | ||
34 | + precio_resultado.save() | ||
35 | + 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 | + ] |
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 | + organismo = models.ForeignKey(Organismo, on_delete=models.CASCADE, verbose_name='Organismo') | ||
32 | + cuerpo_edicto = models.TextField(blank=False, null=False) | ||
33 | + archivo = models.FileField(upload_to="uploads/%Y/%m/%d/", null=False, blank=False, validators=[valid_extension]) | ||
34 | + dias_plubicar = models.FloatField(default=0.00, blank=False, null=False) | ||
35 | + cantidad_sellos = models.FloatField(default=0.00, blank=False, null=False) | ||
36 | + estado = models.CharField(max_length=150, choices=STATUS_CHOICE, default='inciado') | ||
37 | + cantidad_palabras = models.IntegerField() | ||
38 | + cantidad_copias = models.IntegerField() | ||
39 | + fecha_publicacion = models.DateTimeField() | ||
40 | + | ||
41 | + class Meta: | ||
42 | + verbose_name = 'Edicto' | ||
43 | + verbose_name_plural = 'Edictos' | ||
44 | + | ||
45 | + def __str__(self): | ||
46 | + return self.cuerpo_edicto | ||
47 | + | ||
48 | + | ||
49 | +class ComprobantePago(models.Model): | ||
50 | + edicto = models.ForeignKey(Edicto, on_delete=models.CASCADE) | ||
51 | + resultado = models.FloatField(blank=False, null=False) | ||
52 | + numero_comprobante = models.CharField(max_length=300, blank=False, null=False) | ||
53 | + fecha_pago = models.DateTimeField() | ||
54 | + | ||
55 | + class Meta: | ||
56 | + verbose_name = 'ComprobantePago' | ||
57 | + verbose_name_plural = 'ComprobantesPagos' | ||
58 | + | ||
59 | + def __str__(self): | ||
60 | + 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 | + exclude = ('updated',) |
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