Martín Miranda

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

Feature/#10 crear formularios



See merge request !13
... ... @@ -24,7 +24,7 @@ logs
# Installer logs
pip-log.txt
# Unit test / coverage reports
# Unit tests / coverage reports
.coverage
.tox
nosetests.xml
... ...
... ... @@ -71,20 +71,20 @@ def agregar_varios_permisos_grupo(permisos_por_app, grupo):
@pytest.fixture
def get_default_test_user():
test_user = create_user(username='test_user', first_name='Test', last_name='User', email='test@user', documento_identidad='12345678')
test_user = create_user(username='test_user', first_name='Test', last_name='User', email='tests@user', documento_identidad='12345678')
return test_user
@pytest.fixture
def crear_usuarios():
usuario1 = create_user(username='usuario1', first_name='Usuario', last_name='J',
email='test@user1', documento_identidad='12345777')
email='tests@user1', documento_identidad='12345777')
usuario2 = create_user(username='usuario2', first_name='Usuario', last_name='S',
email='test@user2', documento_identidad='12345679')
email='tests@user2', documento_identidad='12345679')
usuario3 = create_user(username='usuario3', first_name='Usuario', last_name='P',
email='test@user3', documento_identidad='12345699')
email='tests@user3', documento_identidad='12345699')
return usuario1, usuario2, usuario3
... ...
from django.contrib import admin
# Register your models here.
... ...
from rest_framework import viewsets
from rest_framework import status
from rest_framework.response import Response
# from rest_framework.decorators import action
from .models import Edicto
from .serializer import EdictoSerializer
from .utils import contador
class EdictoView(viewsets.ModelViewSet):
queryset = Edicto.objects.all().order_by('id')
serializer_class = EdictoSerializer
def create(self, request, *args, **kwargs):
edicto = request.data.get('edicto')
cantidad_palabras = contador(edicto)
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save(cantidad_palabras=cantidad_palabras)
return Response(serializer.data, status=status.HTTP_201_CREATED)
... ...
from django.apps import AppConfig
class EdictoConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'edicto'
... ...
from django.utils.translation import gettext_lazy as _
INICIADO = 'iniciado'
PENDIENTE_DE_PAGO = 'pendiente_de_pago'
PUBLICADO = 'publicado'
APROBADO = 'aprobado'
RECHAZADO = 'rechazado'
STATUS_CHOICE = [
(INICIADO, _('iniciado')),
(PENDIENTE_DE_PAGO, _('pendiente_de_pago')),
(PUBLICADO, _('publicado')),
(APROBADO,_('aprobado')),
(RECHAZADO, _('rechazado')),
]
... ...
from .models import Edicto, ComprobantePago, Precio
def contador(edicto_id, precio_id):
edicto = Edicto.objects.select_related('usuario').get(id=edicto_id)
organismo = edicto.usuario.organismo.es_publico
sellos = edicto.cantidad_sellos
palabras = edicto.cantidad_palabras
copias = edicto.cantidad_copias
publicar = edicto.dias_publicar
precio_valores = Precio.objects.values('precio', 'precio_ejemplar').get(id=precio_id)
precio = precio_valores['precio']
precio_ejemplar = precio_valores['precio_ejemplar']
result_palabra = (sellos + palabras) * precio
result_ejemplar = (copias * precio_ejemplar) + (publicar * precio_ejemplar)
if organismo:
resultado = result_ejemplar + result_palabra / 2
else:
resultado = result_ejemplar + result_palabra
precio_resultado = ComprobantePago(edicto=edicto, resultado=resultado)
precio_resultado.save()
return precio_resultado
... ...
# Generated by Django 4.1.9 on 2023-07-03 22:26
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import edicto.utils
class Migration(migrations.Migration):
initial = True
dependencies = [
('organismo', '0002_organismo_es_publico'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Precio',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('precio', models.FloatField(max_length=50)),
('vigencia_desde', models.DateTimeField()),
('vigencia_hasta', models.DateTimeField()),
('moneda', models.CharField(max_length=50)),
('precio_ejemplar', models.FloatField(max_length=50)),
('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Administrador',
'verbose_name_plural': 'Administradores',
},
),
migrations.CreateModel(
name='Edicto',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('cuerpo_edicto', models.TextField()),
('archivo', models.FileField(upload_to='uploads/%Y/%m/%d/', validators=[edicto.utils.valid_extension])),
('dias_plubicar', models.FloatField(default=0.0)),
('cantidad_sellos', models.FloatField(default=0.0)),
('estado', models.CharField(choices=[('iniciado', 'iniciado'), ('pendiente_de_pago', 'pendiente_de_pago'), ('publicado', 'publicado'), ('rechazado', 'rechazado')], default='inciado', max_length=150)),
('cantidad_palabras', models.IntegerField()),
('cantidad_copias', models.IntegerField()),
('fecha_publicacion', models.DateTimeField()),
('organismo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='organismo.organismo', verbose_name='Organismo')),
('usuario', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Usuario')),
],
options={
'verbose_name': 'Edicto',
'verbose_name_plural': 'Edictos',
},
),
migrations.CreateModel(
name='ComprobantePago',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('resultado', models.FloatField()),
('numero_comprobante', models.CharField(max_length=300)),
('fecha_pago', models.DateTimeField()),
('edicto', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='edicto.edicto')),
],
options={
'verbose_name': 'ComprobantePago',
'verbose_name_plural': 'ComprobantesPagos',
},
),
]
... ...
# Generated by Django 4.1.9 on 2023-07-12 12:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('edicto', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='comprobantepago',
name='fecha_pago',
field=models.DateTimeField(null=True),
),
migrations.AlterField(
model_name='comprobantepago',
name='numero_comprobante',
field=models.CharField(max_length=300, null=True),
),
]
... ...
# Generated by Django 4.1.9 on 2023-07-13 11:49
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('edicto', '0002_alter_comprobantepago_fecha_pago_and_more'),
]
operations = [
migrations.AddField(
model_name='edicto',
name='fecha_creacion',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AddField(
model_name='edicto',
name='fecha_modificacion',
field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AlterField(
model_name='edicto',
name='estado',
field=models.CharField(choices=[('iniciado', 'iniciado'), ('pendiente_de_pago', 'pendiente_de_pago'), ('publicado', 'publicado'), ('aprobado', 'aprobado'), ('rechazado', 'rechazado')], default='inciado', max_length=150),
),
]
... ...
# Generated by Django 4.1.9 on 2023-07-17 12:04
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('edicto', '0003_edicto_fecha_creacion_edicto_fecha_modificacion_and_more'),
]
operations = [
migrations.RemoveField(
model_name='edicto',
name='organismo',
),
]
... ...
from django.db import models
from .utils import valid_extension
from .constants import STATUS_CHOICE
from usuario.models import Usuario
from organismo.models import Organismo
# Create your models here.
class Precio (models.Model):
precio = models.FloatField(max_length=50, blank=False, null=False)
vigencia_desde = models.DateTimeField()
vigencia_hasta = models.DateTimeField()
usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE)
moneda = models.CharField(max_length=50, blank=False, null=False)
precio_ejemplar = models.FloatField(max_length=50, blank=False, null=False)
class Meta:
verbose_name = 'Administrador'
verbose_name_plural = 'Administradores'
def __str__(self):
return self.moneda
class Edicto(models.Model):
usuario = models.ForeignKey(Usuario, on_delete=models.CASCADE, verbose_name='Usuario')
cuerpo_edicto = models.TextField(blank=False, null=False)
archivo = models.FileField(upload_to="uploads/%Y/%m/%d/", null=False, blank=False, validators=[valid_extension])
dias_plubicar = models.FloatField(default=0.00, blank=False, null=False)
cantidad_sellos = models.FloatField(default=0.00, blank=False, null=False)
estado = models.CharField(max_length=150, choices=STATUS_CHOICE, default='inciado')
cantidad_palabras = models.IntegerField()
cantidad_copias = models.IntegerField()
fecha_publicacion = models.DateTimeField()
fecha_creacion = models.DateTimeField(auto_now_add=True)
fecha_modificacion = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = 'Edicto'
verbose_name_plural = 'Edictos'
def __str__(self):
return self.cuerpo_edicto
class ComprobantePago(models.Model):
edicto = models.ForeignKey(Edicto, on_delete=models.CASCADE)
resultado = models.FloatField(blank=False, null=False)
numero_comprobante = models.CharField(max_length=300, blank=False, null=True)
fecha_pago = models.DateTimeField(blank=False, null=True)
class Meta:
verbose_name = 'ComprobantePago'
verbose_name_plural = 'ComprobantesPagos'
def __str__(self):
return self.edicto
... ...
from rest_framework import serializers
from .models import Edicto
class EdictoSerializer(serializers.ModelSerializer):
cantidad_palabras = serializers.IntegerField(read_only=True)
created = serializers.DateTimeField(read_only=True)
class Meta:
model = Edicto
fields = ('cuerpo_edicto',
'dias_publicar',
'cantidad_sellos',
'estado',
'cantidad_copias',
'fecha_publicacion',)
... ...
from django.test import TestCase
# Create your tests here.
... ...
from django.test import TestCase
from edicto.utils import contador
class ContadorTestCase(TestCase):
def test_contador(self):
edicto = "Texto de prueba con palabras números y expresiones 58. (...) (entre paréntesis [y corchetes])"
resultado = contador(edicto)
self.assertEqual(resultado, 16)
... ...
from django.core.exceptions import ValidationError
import re
def valid_extension(value):
if (not value.name.endswith('.pdf') and
not value.name.endswith('.jpeg') and
not value.name.endswith('.png') and
not value.name.endswith('.jpg')):
raise ValidationError("Archivos permitidos: .pdf .jpg, .jpeg, .png")
def contador(edicto):
numeros = re.findall(r'\b\d+(?:\.\d+)?\b', edicto)
expresiones = re.findall(r'[(\[{](.*?)[)\]}]', edicto)
texto = edicto.split()
cantidad_palabras = len(texto)
cantidad_numeros = len(numeros)
cantidad_expresiones = len(expresiones)
total_edicto = cantidad_palabras + cantidad_numeros + cantidad_expresiones - 1
return total_edicto
... ...
from django.shortcuts import render
# Create your views here.
... ...
... ... @@ -2,9 +2,10 @@ from rest_framework import routers
from organismo import api as organismo_api
from usuario import api as usuario_api
from edicto.api import EdictoView
# Define routes
router = routers.DefaultRouter()
router.register(prefix='usuario', viewset=usuario_api.UsuarioViewSet)
router.register(prefix='organismo', viewset=organismo_api.OrganismoViewSet)
\ No newline at end of file
router.register(prefix='organismo', viewset=organismo_api.OrganismoViewSet)
router.register(r'edicto', EdictoView, basename='edicto')
... ...
... ... @@ -57,6 +57,7 @@ PROJECT_APPS = (
'core',
'organismo',
'usuario',
'edicto',
)
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + PROJECT_APPS
... ...