Merge remote-tracking branch 'origin/master/backend' into master/backend
commit
19315dfb45
|
@ -8,3 +8,4 @@ db.sqlite3
|
||||||
.env
|
.env
|
||||||
.vscode
|
.vscode
|
||||||
__pycache__
|
__pycache__
|
||||||
|
migrations
|
|
@ -10,6 +10,8 @@ services:
|
||||||
environment:
|
environment:
|
||||||
- PORT=4000
|
- PORT=4000
|
||||||
- DBHOST=db
|
- DBHOST=db
|
||||||
|
# - DBHOST=192.168.1.5
|
||||||
|
# - DBPORT=5436
|
||||||
- DBNAME=database
|
- DBNAME=database
|
||||||
- DBSCHEMA=desarrollo1
|
- DBSCHEMA=desarrollo1
|
||||||
- DBUSER=postgres
|
- DBUSER=postgres
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
|
from django.urls import resolve
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from .models import Usuario, Persona
|
from .models import Usuario, Persona
|
||||||
import jwt
|
|
||||||
from decouple import config
|
from decouple import config
|
||||||
|
import jwt
|
||||||
|
import logging
|
||||||
|
|
||||||
private_key = config('SECRET_JWT')
|
private_key = config('SECRET_JWT')
|
||||||
|
|
||||||
|
@ -20,6 +22,13 @@ class ApiMiddleware:
|
||||||
response = self.get_response(request)
|
response = self.get_response(request)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
match = resolve(request.path)
|
||||||
|
|
||||||
|
# se omite esta regla al mostrar imagen de paradero
|
||||||
|
if match.url_name == 'paradero-image' and request.method == 'GET':
|
||||||
|
response = self.get_response(request)
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,7 @@ 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 = models.OneToOneField(Paradero, models.DO_NOTHING, db_column='id_paradero', primary_key=True)
|
||||||
imagen = models.BinaryField(blank=True, null=True)
|
imagen = models.BinaryField(blank=True, null=True)
|
||||||
|
content_type = models.CharField(max_length=100, blank=False, null=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
managed = False
|
managed = False
|
||||||
|
|
|
@ -30,3 +30,14 @@ class UsuarioSchema(AutoSchema):
|
||||||
coreapi.Field('vigente', location='form', description='Vigente'),
|
coreapi.Field('vigente', location='form', description='Vigente'),
|
||||||
]
|
]
|
||||||
return self._manual_fields + custom_fields
|
return self._manual_fields + custom_fields
|
||||||
|
|
||||||
|
class ParaderoImageSchema(AutoSchema):
|
||||||
|
manual_fields = []
|
||||||
|
|
||||||
|
def get_manual_fields(self, path, method):
|
||||||
|
custom_fields = []
|
||||||
|
if method.lower() == 'post':
|
||||||
|
custom_fields=[
|
||||||
|
coreapi.Field('imagen', required=True, location='formData', type='file', description='Imagen a Subir')
|
||||||
|
]
|
||||||
|
return self._manual_fields + custom_fields
|
|
@ -49,6 +49,11 @@ class RegionSerializer(serializers.ModelSerializer):
|
||||||
model = models.Region
|
model = models.Region
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
class ParaderoSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.Paradero
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
class UsuarioSerializer(serializers.ModelSerializer):
|
class UsuarioSerializer(serializers.ModelSerializer):
|
||||||
# muestro informacion de persona en un objeto aparte
|
# muestro informacion de persona en un objeto aparte
|
||||||
persona = serializers.SerializerMethodField()
|
persona = serializers.SerializerMethodField()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
# from api import views
|
# from api import views
|
||||||
from api.views import usuario, auth, aplicacion, tipo, persona, comuna, region
|
from api.views import usuario, auth, aplicacion, tipo, persona, comuna, region, paradero
|
||||||
from api.views import mapa
|
from api.views import mapa
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
|
@ -15,9 +15,11 @@ router.register('tipos/paradero', tipo.TipoParaderoViewSet)
|
||||||
router.register('tipos/vehiculo', tipo.TipoVehiculoViewSet)
|
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)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', include(router.urls)),
|
path('', include(router.urls)),
|
||||||
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('paraderos/image/<int:id>/', paradero.image, name='paradero-image')
|
||||||
]
|
]
|
|
@ -3,6 +3,7 @@ from django.http import JsonResponse
|
||||||
from rest_framework.decorators import action, api_view, schema
|
from rest_framework.decorators import action, api_view, schema
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from ..models import Paradero, ParaderoImagen
|
from ..models import Paradero, ParaderoImagen
|
||||||
|
from .paradero import url_image_paradero
|
||||||
from logging import error
|
from logging import error
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,13 +19,16 @@ 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': {
|
'position': { 'lat': p.stop_lat, 'lng': p.stop_lon },
|
||||||
'lat': p.stop_lat,
|
'id_paradero': p.id_paradero,
|
||||||
'lng': p.stop_lon
|
|
||||||
},
|
|
||||||
'title': 'Paradero #' + str(p.id_paradero),
|
'title': 'Paradero #' + str(p.id_paradero),
|
||||||
'location': p.stop_name
|
'location': p.stop_name,
|
||||||
|
'id_comuna': p.id_comuna,
|
||||||
|
'id_tipo_paradero': p.id_tipo_paradero,
|
||||||
|
'url_image': url_image
|
||||||
})
|
})
|
||||||
|
|
||||||
return JsonResponse({
|
return JsonResponse({
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
from rest_framework import viewsets
|
||||||
|
from rest_framework.decorators import action, schema, api_view
|
||||||
|
from rest_framework.parsers import MultiPartParser
|
||||||
|
from django.http import JsonResponse, HttpResponse
|
||||||
|
|
||||||
|
from .. import models, serializers
|
||||||
|
from ..schemas import ParaderoImageSchema
|
||||||
|
from PIL import Image
|
||||||
|
import io
|
||||||
|
import coreapi
|
||||||
|
import logging
|
||||||
|
|
||||||
|
class ParaderoViewSet(viewsets.ModelViewSet):
|
||||||
|
queryset = models.Paradero.objects.all()
|
||||||
|
serializer_class = serializers.ParaderoSerializer
|
||||||
|
|
||||||
|
|
||||||
|
@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)
|
||||||
|
return response
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
paradero = models.Paradero.objects.filter(id_paradero = id).first()
|
||||||
|
imagen = request.FILES['imagen']
|
||||||
|
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)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
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}/')
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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-49ae2938.js"></script>
|
<script type="module" crossorigin src="/assets/index-6e9096f8.js"></script>
|
||||||
<link rel="stylesheet" href="/assets/index-2d1bb0fd.css">
|
<link rel="stylesheet" href="/assets/index-2d1bb0fd.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -6,3 +6,4 @@ coreapi
|
||||||
python-decouple
|
python-decouple
|
||||||
PyJWT
|
PyJWT
|
||||||
pymongo
|
pymongo
|
||||||
|
Pillow
|
Loading…
Reference in New Issue