Martín Miranda

Merge branch 'feature/#10_crear_formularios' into 'develop'

Feature/#10 crear formularios



See merge request !13
@@ -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)
  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 +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 + ]
  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 + ]
  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 + ]
  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
  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',)
  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