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