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

3
.gitignore vendored
View File

@ -7,4 +7,5 @@
db.sqlite3
.env
.vscode
__pycache__
__pycache__
migrations

View File

@ -10,6 +10,8 @@ services:
environment:
- PORT=4000
- DBHOST=db
# - DBHOST=192.168.1.5
# - DBPORT=5436
- DBNAME=database
- DBSCHEMA=desarrollo1
- DBUSER=postgres

View File

@ -1,7 +1,9 @@
from django.urls import resolve
from django.http import HttpResponse
from .models import Usuario, Persona
import jwt
from decouple import config
import jwt
import logging
private_key = config('SECRET_JWT')
@ -19,6 +21,13 @@ class ApiMiddleware:
if request.path == '/api/auth/' and request.method == 'POST':
response = self.get_response(request)
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'):
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):
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=100, blank=False, null=True)
class Meta:
managed = False

View File

@ -30,3 +30,14 @@ class UsuarioSchema(AutoSchema):
coreapi.Field('vigente', location='form', description='Vigente'),
]
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
fields = '__all__'
class ParaderoSerializer(serializers.ModelSerializer):
class Meta:
model = models.Paradero
fields = '__all__'
class UsuarioSerializer(serializers.ModelSerializer):
# muestro informacion de persona en un objeto aparte
persona = serializers.SerializerMethodField()

View File

@ -1,7 +1,7 @@
from django.urls import path, include
from rest_framework import routers
# 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
router = routers.DefaultRouter()
@ -15,9 +15,11 @@ router.register('tipos/paradero', tipo.TipoParaderoViewSet)
router.register('tipos/vehiculo', tipo.TipoVehiculoViewSet)
router.register('comunas', comuna.ComunaViewSet)
router.register('regiones', region.RegionViewSet)
router.register('paraderos', paradero.ParaderoViewSet)
urlpatterns = [
path('', include(router.urls)),
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 django.views.decorators.csrf import csrf_exempt
from ..models import Paradero, ParaderoImagen
from .paradero import url_image_paradero
from logging import error
@ -18,13 +19,16 @@ 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
},
'position': { 'lat': p.stop_lat, 'lng': p.stop_lon },
'id_paradero': 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({

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 name="viewport" content="width=device-width, initial-scale=1.0" />
<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">
</head>
<body>

View File

@ -5,4 +5,5 @@ django-cors-headers
coreapi
python-decouple
PyJWT
pymongo
pymongo
Pillow