Enzo Yair

Merge branch 'feature/#27_serializar_comprobante_de_pago' into 'develop'

cambios en permisos, sobreescritura del metodo get y serializar comprobante de pago



See merge request !22
from django.contrib import admin
from .models import Edicto, Precio
# Register your models here.
admin.site.register(Precio)
admin.site.register(Edicto)
... ...
from rest_framework import viewsets, mixins, status, serializers
from rest_framework.response import Response
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import action
from datetime import datetime
... ... @@ -8,6 +7,7 @@ from datetime import datetime
from .models import Edicto, Precio
from .serializer import EdictoSerializer, PrecioSerializer
from .utils import contador
# from .precio import contador
class EdictoViewSet(mixins.CreateModelMixin,
... ... @@ -19,8 +19,7 @@ class EdictoViewSet(mixins.CreateModelMixin,
queryset = Edicto.objects.all().order_by('id')
serializer_class = EdictoSerializer
authentication_classes = [SessionAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]
permission_classes = [IsAuthenticated, ]
@action(detail=True, methods=['put', 'patch'])
def custom_update(self, request):
... ... @@ -39,6 +38,29 @@ class EdictoViewSet(mixins.CreateModelMixin,
cantidad_palabras = contador(edicto)
serializer.save(cantidad_palabras=cantidad_palabras)
def include_fecha_publicacion(self):
return self.request.user.is_staff
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, many=True)
for data in serializer.data:
if self.include_fecha_publicacion():
edicto = queryset.get(id=data['edicto_id'])
data['fecha_publicacion'] = edicto.fecha_publicacion
return Response(serializer.data, status=status.HTTP_200_OK)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
if self.include_fecha_publicacion():
serializer.data['fecha_publicacion'] = instance.fecha_publicacion
return Response(serializer.data, status=status.HTTP_200_OK)
class PrecioViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
... ... @@ -47,8 +69,7 @@ class PrecioViewSet(mixins.CreateModelMixin,
queryset = Precio.objects.all().order_by('id')
serializer_class = PrecioSerializer
authentication_classes = [SessionAuthentication, BasicAuthentication]
permission_classes = [IsAuthenticated]
permission_classes = [IsAuthenticated, ]
def create(self, request, *args, **kwargs):
user = request.user
... ... @@ -57,3 +78,10 @@ class PrecioViewSet(mixins.CreateModelMixin,
raise serializers.ValidationError("El usuario no es parte del personal designado.")
return super().create(request, *args, **kwargs)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
data = serializer.data
data['id'] = instance.id
return Response(data)
... ...
... ... @@ -16,7 +16,7 @@ STATUS_CHOICE = [
]
EXTENSIONES_VALIDAS = ["pdf", "docx", "jpg", "jpeg", "png"]
EXTENSIONES_VALIDAS = ["pdf", "docx",]
PESOS = 'peso_argentino'
... ...
# Generated by Django 4.1.9 on 2023-08-11 12:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('edicto', '0003_alter_precio_moneda'),
]
operations = [
migrations.AddField(
model_name='edicto',
name='comentarios',
field=models.CharField(blank=True, max_length=500, null=True),
),
]
... ...
# Generated by Django 4.1.9 on 2023-08-11 13:14
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('edicto', '0004_edicto_comentarios'),
]
operations = [
migrations.RenameField(
model_name='edicto',
old_name='comentarios',
new_name='observaciones',
),
]
... ...
# Generated by Django 4.1.9 on 2023-08-14 14:29
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('edicto', '0005_rename_comentarios_edicto_observaciones'),
]
operations = [
migrations.RemoveField(
model_name='comprobantepago',
name='edicto',
),
]
... ...
# Generated by Django 4.1.9 on 2023-08-14 22:33
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('edicto', '0006_remove_comprobantepago_edicto'),
]
operations = [
migrations.AlterField(
model_name='edicto',
name='usuario',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='Usuario', to=settings.AUTH_USER_MODEL),
),
]
... ...
# Generated by Django 4.1.9 on 2023-08-15 00:08
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('edicto', '0007_alter_edicto_usuario'),
]
operations = [
migrations.AlterField(
model_name='edicto',
name='fecha_publicacion',
field=models.DateField(blank=True, null=True),
),
migrations.AlterField(
model_name='edicto',
name='usuario',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Usuario'),
),
]
... ...
... ... @@ -32,7 +32,8 @@ class Edicto(models.Model):
estado = models.CharField(max_length=150, choices=STATUS_CHOICE, default='inciado')
cantidad_palabras = models.IntegerField(blank=False, null=False)
cantidad_copias = models.PositiveIntegerField(blank=False, null=False)
fecha_publicacion = models.DateField(blank=False, null=False)
fecha_publicacion = models.DateField(blank=True, null=True)
observaciones = models.CharField(max_length=500, blank=True, null=True)
fecha_creacion = models.DateTimeField(auto_now_add=True)
fecha_modificacion = models.DateTimeField(auto_now_add=True)
... ... @@ -45,7 +46,6 @@ class Edicto(models.Model):
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)
... ... @@ -55,4 +55,4 @@ class ComprobantePago(models.Model):
verbose_name_plural = 'ComprobantesPagos'
def __str__(self):
return self.edicto
return self.numero_comprobante
... ...
from django.utils import timezone
from .models import Edicto, ComprobantePago, Precio
... ... @@ -10,9 +11,20 @@ def contador(edicto_id, precio_id):
copias = edicto.cantidad_copias
publicar = edicto.dias_publicar
precio_valores = Precio.objects.values('precio', 'precio_ejemplar').get(id=precio_id)
precio_valores = Precio.objects.values('precio',
'precio_ejemplar',
'vigencia_desde',
'vigencia_hasta',).get(id=precio_id)
precio = precio_valores['precio']
precio_ejemplar = precio_valores['precio_ejemplar']
vigencia_desde = precio_valores['vigencia_desde']
vigencia_hasta = precio_valores['vigencia_hasta']
current_datetime = timezone.now()
if not (vigencia_desde <= current_datetime <= vigencia_hasta):
raise ValueError("El precio seleccionado no se encuentra dentro de las fechas permitidas.")
result_palabra = (sellos + palabras) * precio
result_ejemplar = (copias * precio_ejemplar) + (publicar * precio_ejemplar)
... ...
... ... @@ -3,33 +3,52 @@ from rest_framework import serializers
from .constants import EXTENSIONES_VALIDAS
from .models import Edicto, Precio, ComprobantePago
from usuario.serializers import UsuarioSerializer
class EdictoSerializer(serializers.ModelSerializer):
edicto_id = serializers.ReadOnlyField(source='id')
class Meta:
model = Edicto
fields = ('usuario',
'edicto_id',
'cuerpo_edicto',
'estado',
'cantidad_palabras',
'dias_publicar',
'cantidad_sellos',
'cantidad_copias',
'fecha_publicacion',
'archivo',
'fecha_creacion',
'observaciones',
)
read_only_fields = ('cantidad_palabras', 'fecha_creacion')
included_serializers = {
'usuario': 'usuario.serializers.UsuarioSerializer',
}
def to_representation(self, instance):
data = super().to_representation(instance)
user = self.context['request'].user
if user.is_staff:
data['fecha_publicacion'] = instance.fecha_publicacion
return data
@staticmethod
def validate_archivo(value):
filename, extension = value.name.rsplit(".", 1)
if extension.lower() not in EXTENSIONES_VALIDAS:
raise serializers.ValidationError("Archivos permitidos: .pdf, .docx, .jpg, .jpeg, .png")
raise serializers.ValidationError("Archivos permitidos: .pdf, .docx, .jpg, .png")
return value
class PrecioSerializer(serializers.ModelSerializer):
usuario = UsuarioSerializer()
class Meta:
model = Precio
fields = ('usuario',
... ... @@ -45,7 +64,7 @@ class PrecioSerializer(serializers.ModelSerializer):
user = request.user if request else None
if not user or user.is_anonymous:
raise serializers.ValidationError("El usuario debe estar autenticado.")
if not user.is_staff:
if not user.es_staff:
raise serializers.ValidationError("El usuario no es parte del personal designado.")
return data
... ...
... ... @@ -10,3 +10,4 @@ router.register(prefix='usuario', viewset=usuario_api.UsuarioViewSet)
router.register(prefix='organismo', viewset=organismo_api.OrganismoViewSet)
router.register(prefix='edicto', viewset=edicto_api.EdictoViewSet)
router.register(prefix='precio', viewset=edicto_api.PrecioViewSet)
... ...