Enzo Yair

feature/#10_crear_formularios

@@ -24,7 +24,7 @@ logs @@ -24,7 +24,7 @@ logs
24 # Installer logs 24 # Installer logs
25 pip-log.txt 25 pip-log.txt
26 26
27 -# Unit test / coverage reports 27 +# Unit tests / coverage reports
28 .coverage 28 .coverage
29 .tox 29 .tox
30 nosetests.xml 30 nosetests.xml
@@ -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
  1 +from django.contrib import admin
  2 +
  3 +# Register your models here.
  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 + '''
  1 +from django.apps import AppConfig
  2 +
  3 +
  4 +class EdictoConfig(AppConfig):
  5 + default_auto_field = 'django.db.models.BigAutoField'
  6 + name = 'edicto'
  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 + ]
  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 + ]
  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
  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',)
  1 +from django.test import TestCase
  2 +
  3 +# Create your tests here.
  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)
  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
  1 +from django.shortcuts import render
  2 +
  3 +# Create your views here.
@@ -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