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 django.contrib import admin
from api import models
# from .models import Usuario, Rol, UsuarioRol # from .models import Usuario, Rol, UsuarioRol
# from .models import Aplicacion, RolAplicacion # from .models import Aplicacion, RolAplicacion
# from .models import Persona, TipoTratamientoPersona # from .models import Persona, TipoTratamientoPersona
@ -11,3 +12,7 @@ from django.contrib import admin
# admin.site.register(Rol) # admin.site.register(Rol)
# admin.site.register(RolAplicacion) # 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 return response
match = resolve(request.path) match = resolve(request.path)
logging.error(match)
# se omite esta regla al mostrar imagen de paradero # 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) response = self.get_response(request)
return response return response
if not request.headers.get('Authorization'): if not request.headers.get('Authorization'):
return HttpResponse('Debe indicar el token de autorización', status = 400) 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): class ParaderoImagen(models.Model):
id_paradero = models.OneToOneField(Paradero, models.DO_NOTHING, db_column='id_paradero', primary_key=True) id_paradero_imagen = models.AutoField(primary_key=True)
imagen = models.BinaryField(blank=True, null=True) id_paradero = models.ForeignKey(Paradero, models.DO_NOTHING, db_column='id_paradero', blank=False, null=False)
content_type = models.CharField(max_length=50, blank=True, null=True) imagen = models.BinaryField(blank=False, null=False)
content_type = models.CharField(max_length=50, blank=False, null=False)
class Meta: class Meta:
managed = False managed = False

View File

@ -54,6 +54,19 @@ class ParaderoSerializer(serializers.ModelSerializer):
model = models.Paradero model = models.Paradero
fields = '__all__' 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 OperadorSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.Operador model = models.Operador

View File

@ -3,6 +3,7 @@ from rest_framework import routers
# from api import views # from api import views
from api.views import usuario, auth, aplicacion, tipo, persona, comuna, region, paradero, rol, rolaplicacion 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 mapa, linea, operador
from api.views import paradero_imagen
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register('aplicaciones', aplicacion.AplicacionViewSet) router.register('aplicaciones', aplicacion.AplicacionViewSet)
@ -16,6 +17,7 @@ router.register('tipos/vehiculo', tipo.TipoVehiculoViewSet)
router.register('comunas', comuna.ComunaViewSet) router.register('comunas', comuna.ComunaViewSet)
router.register('regiones', region.RegionViewSet) router.register('regiones', region.RegionViewSet)
router.register('paraderos', paradero.ParaderoViewSet) router.register('paraderos', paradero.ParaderoViewSet)
router.register('paraderos-image', paradero_imagen.ParaderoImagenListView, basename='paradero_imagen')
router.register('lineas', linea.LineaViewSet) router.register('lineas', linea.LineaViewSet)
router.register('operadores', operador.OperadorViewSet) router.register('operadores', operador.OperadorViewSet)
router.register('roles', rol.RolViewSet) router.register('roles', rol.RolViewSet)
@ -26,5 +28,6 @@ urlpatterns = [
path('auth/', auth.jwt_login, name='auth'), path('auth/', auth.jwt_login, name='auth'),
path('mapas/paraderos/', mapa.paraderos, name='mapa-paraderos'), path('mapas/paraderos/', mapa.paraderos, name='mapa-paraderos'),
path('mapas/rutas/', mapa.rutas, name='mapa-rutas'), 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 Paradero, ParaderoImagen
from ..models import Linea, GtfsShape, GtfsTrips from ..models import Linea, GtfsShape, GtfsTrips
from .paradero import url_image_paradero
from logging import error from logging import error
google_api_key = 'AIzaSyDnFO9w_SsodjBuY5tOK8-kQJns_l5klQ4' google_api_key = 'AIzaSyDnFO9w_SsodjBuY5tOK8-kQJns_l5klQ4'
@ -22,7 +21,6 @@ def paraderos(request):
paraderos = Paradero.objects.all() paraderos = Paradero.objects.all()
for p in paraderos: for p in paraderos:
url_image = url_image_paradero(request, p.id_paradero)
marks.append({ marks.append({
'position': { 'lat': p.stop_lat, 'lng': p.stop_lon }, 'position': { 'lat': p.stop_lat, 'lng': p.stop_lon },
@ -31,7 +29,6 @@ def paraderos(request):
'location': p.stop_name, 'location': p.stop_name,
'id_comuna': p.id_comuna, 'id_comuna': p.id_comuna,
'id_tipo_paradero': p.id_tipo_paradero, 'id_tipo_paradero': p.id_tipo_paradero,
'url_image': url_image
}) })
return JsonResponse({ 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.decorators import action, schema, api_view
from rest_framework.parsers import MultiPartParser from rest_framework.parsers import MultiPartParser
from rest_framework.generics import ListAPIView
from django.http import JsonResponse, HttpResponse from django.http import JsonResponse, HttpResponse
from django_filters.rest_framework import DjangoFilterBackend
from .. import models, serializers from .. import models, serializers
from ..schemas import ParaderoImageSchema from ..schemas import ParaderoImageSchema
@ -14,48 +16,36 @@ class ParaderoViewSet(viewsets.ModelViewSet):
queryset = models.Paradero.objects.all() queryset = models.Paradero.objects.all()
serializer_class = serializers.ParaderoSerializer 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 return response
if request.method == 'POST': def create(self, request, pk = None):
paradero = models.Paradero.objects.filter(id_paradero = id).first()
imagen = request.FILES['imagen'] imagen = request.FILES['imagen']
id_paradero = request.data.get('id_paradero')
content_type = imagen.content_type content_type = imagen.content_type
imagen_bytea = imagen.read() imagen_bytea = imagen.read()
paradero_imagen = models.ParaderoImagen.objects.filter(id_paradero = id).first() paradero = models.Paradero.objects.filter(id_paradero = id_paradero).first()
if not paradero_imagen:
paradero_imagen = models.ParaderoImagen( paradero_imagen = models.ParaderoImagen(
id_paradero = paradero, id_paradero = paradero,
imagen = imagen_bytea, imagen = imagen_bytea,
content_type = content_type content_type = content_type
) )
paradero_imagen.save() paradero_imagen.save()
else: return JsonResponse({ 'ok': True })
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)
})
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}/')

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 charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>...</title> <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"> <link rel="stylesheet" href="/assets/index-2d1bb0fd.css">
</head> </head>
<body> <body>

View File

@ -41,6 +41,7 @@ INSTALLED_APPS = [
'rest_framework', 'rest_framework',
'coreapi', 'coreapi',
'corsheaders', 'corsheaders',
'django_filters',
'api', 'api',
] ]
@ -139,7 +140,7 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', '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_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [ CORS_ORIGIN_WHITELIST = [

View File

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

View File

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

View File

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