se modifica tabla paradero_imagen y corrige filtro

master/backend
Francisco Sandoval 2023-09-07 11:00:44 -03:00
parent 14c39dffa5
commit c5ba9f2000
15 changed files with 134 additions and 99 deletions

View File

@ -1,4 +1,5 @@
from django.contrib import admin
from api import models
# from .models import Usuario, Rol, UsuarioRol
# from .models import Aplicacion, RolAplicacion
# from .models import Persona, TipoTratamientoPersona
@ -10,4 +11,8 @@ from django.contrib import admin
# admin.site.register(TipoTratamientoPersona)
# admin.site.register(Rol)
# admin.site.register(RolAplicacion)
# admin.site.register(Aplicacion)
# admin.site.register(Aplicacion)
@admin.register(models.ParaderoImagen)
class ParaderoImagenAdmin(admin.ModelAdmin):
search_fields = ('id_paradero',)

View File

@ -23,12 +23,13 @@ class ApiMiddleware:
return response
match = resolve(request.path)
logging.error(match)
# se omite esta regla al mostrar imagen de paradero
if match.url_name == 'paradero-image' and request.method == 'GET':
if match.url_name == 'paradero_imagen-detail' and request.method == 'GET':
response = self.get_response(request)
return response
if not request.headers.get('Authorization'):
return HttpResponse('Debe indicar el token de autorización', status = 400)

View File

@ -208,9 +208,10 @@ class Paradero(models.Model):
class ParaderoImagen(models.Model):
id_paradero = models.OneToOneField(Paradero, models.DO_NOTHING, db_column='id_paradero', primary_key=True)
imagen = models.BinaryField(blank=True, null=True)
content_type = models.CharField(max_length=50, blank=True, null=True)
id_paradero_imagen = models.AutoField(primary_key=True)
id_paradero = models.ForeignKey(Paradero, models.DO_NOTHING, db_column='id_paradero', blank=False, null=False)
imagen = models.BinaryField(blank=False, null=False)
content_type = models.CharField(max_length=50, blank=False, null=False)
class Meta:
managed = False

View File

@ -54,6 +54,19 @@ class ParaderoSerializer(serializers.ModelSerializer):
model = models.Paradero
fields = '__all__'
class ParaderoImagenSerializer(serializers.ModelSerializer):
class Meta:
model = models.ParaderoImagen
fields = '__all__'
def to_representation(self, instance):
representation = super().to_representation(instance)
del representation['imagen']
request = self.context.get('request')
representation['url'] = request.build_absolute_uri(f'/api/paraderos-image/{instance.id_paradero_imagen}/')
return representation
class OperadorSerializer(serializers.ModelSerializer):
class Meta:
model = models.Operador

View File

@ -3,6 +3,7 @@ from rest_framework import routers
# from api import views
from api.views import usuario, auth, aplicacion, tipo, persona, comuna, region, paradero, rol, rolaplicacion
from api.views import mapa, linea, operador
from api.views import paradero_imagen
router = routers.DefaultRouter()
router.register('aplicaciones', aplicacion.AplicacionViewSet)
@ -16,6 +17,7 @@ router.register('tipos/vehiculo', tipo.TipoVehiculoViewSet)
router.register('comunas', comuna.ComunaViewSet)
router.register('regiones', region.RegionViewSet)
router.register('paraderos', paradero.ParaderoViewSet)
router.register('paraderos-image', paradero_imagen.ParaderoImagenListView, basename='paradero_imagen')
router.register('lineas', linea.LineaViewSet)
router.register('operadores', operador.OperadorViewSet)
router.register('roles', rol.RolViewSet)
@ -26,5 +28,6 @@ urlpatterns = [
path('auth/', auth.jwt_login, name='auth'),
path('mapas/paraderos/', mapa.paraderos, name='mapa-paraderos'),
path('mapas/rutas/', mapa.rutas, name='mapa-rutas'),
path('paraderos/image/<int:id>/', paradero.image, name='paradero-image')
# path('paraderos/image/', paradero.image, name='paradero-image-list'),
# path('paraderos/image/<int:id>/', paradero.image_one, name='paradero-image-one'),
]

View File

@ -7,7 +7,6 @@ from django.db.models.functions import Coalesce
from ..models import Paradero, ParaderoImagen
from ..models import Linea, GtfsShape, GtfsTrips
from .paradero import url_image_paradero
from logging import error
google_api_key = 'AIzaSyDnFO9w_SsodjBuY5tOK8-kQJns_l5klQ4'
@ -22,7 +21,6 @@ def paraderos(request):
paraderos = Paradero.objects.all()
for p in paraderos:
url_image = url_image_paradero(request, p.id_paradero)
marks.append({
'position': { 'lat': p.stop_lat, 'lng': p.stop_lon },
@ -31,7 +29,6 @@ def paraderos(request):
'location': p.stop_name,
'id_comuna': p.id_comuna,
'id_tipo_paradero': p.id_tipo_paradero,
'url_image': url_image
})
return JsonResponse({

View File

@ -1,7 +1,9 @@
from rest_framework import viewsets
from rest_framework import viewsets, filters
from rest_framework.decorators import action, schema, api_view
from rest_framework.parsers import MultiPartParser
from rest_framework.generics import ListAPIView
from django.http import JsonResponse, HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
from .. import models, serializers
from ..schemas import ParaderoImageSchema
@ -14,48 +16,36 @@ class ParaderoViewSet(viewsets.ModelViewSet):
queryset = models.Paradero.objects.all()
serializer_class = serializers.ParaderoSerializer
# class ParaderoImagenListView(ListAPIView):
# queryset = models.ParaderoImagen.objects.all()
# serializer_class = serializers.ParaderoImagenSerializer
# filter_backends = [filters.SearchFilter]
# search_fields = ['id_paradero']
@action(detail=False, methods=['GET','POST'], parser_classes=[MultiPartParser])
@api_view(['GET','POST'])
@schema(ParaderoImageSchema())
def image(request, id):
if request.method == 'GET':
paradero_imagen = models.ParaderoImagen.objects.filter(id_paradero = id).first()
if not paradero_imagen:
return HttpResponse('')
response = HttpResponse(content_type=paradero_imagen.content_type)
response.write(paradero_imagen.imagen)
"""
def retrieve(self, request, pk):
data = models.ParaderoImagen.objects.filter(id_paradero_imagen = pk).first()
response = HttpResponse(content_type=data.content_type)
response['Content-Disposition'] = 'inline'
response.write(data.imagen)
return response
if request.method == 'POST':
paradero = models.Paradero.objects.filter(id_paradero = id).first()
def create(self, request, pk = None):
imagen = request.FILES['imagen']
id_paradero = request.data.get('id_paradero')
content_type = imagen.content_type
imagen_bytea = imagen.read()
paradero_imagen = models.ParaderoImagen.objects.filter(id_paradero = id).first()
if not paradero_imagen:
paradero_imagen = models.ParaderoImagen(
id_paradero = paradero,
imagen = imagen_bytea,
content_type = content_type
)
paradero_imagen.save()
else:
paradero_imagen.imagen = imagen_bytea
paradero_imagen.content_type = content_type
paradero_imagen.save()
return JsonResponse({
'id_paradero': paradero.id_paradero,
'stop_name': paradero.stop_name,
'url_image': url_image_paradero(request, id)
})
paradero = models.Paradero.objects.filter(id_paradero = id_paradero).first()
def url_image_paradero(request, id):
paradero_imagen = models.ParaderoImagen.objects.filter(id_paradero = id).first()
if not paradero_imagen:
return None
return request.build_absolute_uri(f'/api/paraderos/image/{id}/')
paradero_imagen = models.ParaderoImagen(
id_paradero = paradero,
imagen = imagen_bytea,
content_type = content_type
)
paradero_imagen.save()
return JsonResponse({ 'ok': True })
"""

View File

@ -0,0 +1,18 @@
from rest_framework import generics, viewsets
from django_filters.rest_framework import DjangoFilterBackend
from django.http import HttpResponse
from api.models import ParaderoImagen
from api.serializers import ParaderoImagenSerializer
class ParaderoImagenListView(generics.ListAPIView, viewsets.ModelViewSet):
queryset = ParaderoImagen.objects.all()
serializer_class = ParaderoImagenSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id_paradero', 'content_type']
def retrieve(self, request, pk):
data = ParaderoImagen.objects.filter(id_paradero_imagen = pk).first()
response = HttpResponse(content_type=data.content_type)
response['Content-Disposition'] = 'inline'
response.write(data.imagen)
return response

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

File diff suppressed because one or more lines are too long

View File

@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>...</title>
<script type="module" crossorigin src="/assets/index-4e307889.js"></script>
<script type="module" crossorigin src="/assets/index-d0529d6c.js"></script>
<link rel="stylesheet" href="/assets/index-2d1bb0fd.css">
</head>
<body>

View File

@ -41,6 +41,7 @@ INSTALLED_APPS = [
'rest_framework',
'coreapi',
'corsheaders',
'django_filters',
'api',
]
@ -139,7 +140,7 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.OrderingFilter'],
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend', 'rest_framework.filters.OrderingFilter'],
}
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [

View File

@ -15,7 +15,7 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
# from django.contrib import admin
from django.contrib import admin
from django.urls import path, include
from rest_framework.documentation import include_docs_urls
from django.conf import settings
@ -27,7 +27,7 @@ urlpatterns = [
path('', frontend, name='home'),
# BACKEND
# path('admin/', admin.site.urls),
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
path('docs/', include_docs_urls(title = 'API Documentation')),
]

View File

@ -2,6 +2,7 @@ Django
psycopg2-binary
djangorestframework
django-cors-headers
django-filter
coreapi
python-decouple
PyJWT

View File

@ -19,3 +19,8 @@ Authorization: Bearer {{token}}
###
GET {{server}}/aplicaciones/?ordering=-id_aplicacion
Authorization: Bearer {{token}}
###
GET {{server}}/paraderos-image/??id_paradero=42318
Authorization: Bearer {{token}}