Merge remote-tracking branch 'origin/master/backend' into master/backend

develop/Rodrigo/Backend
Francisco Sandoval 2023-08-09 20:35:32 -04:00
commit 19315dfb45
13 changed files with 216 additions and 116 deletions

1
.gitignore vendored
View File

@ -8,3 +8,4 @@ db.sqlite3
.env .env
.vscode .vscode
__pycache__ __pycache__
migrations

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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')
] ]

View File

@ -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({

View File

@ -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

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-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>

View File

@ -6,3 +6,4 @@ coreapi
python-decouple python-decouple
PyJWT PyJWT
pymongo pymongo
Pillow