commit inicial

francisco/photos
Francisco Sandoval 2023-12-05 10:34:47 -03:00
commit 0a9b81b8b5
67 changed files with 3291 additions and 0 deletions

11
.gitignore vendored 100644
View File

@ -0,0 +1,11 @@
# carpeta de dependencias
/dependencias
# ignorar respaldos de base de datos
*.sql.gz
db.sqlite3
.env
.vscode
__pycache__
migrations

View File

@ -0,0 +1,517 @@
/* AREA DE DESARROLLO */
CREATE SCHEMA desarrollo1;
SET SEARCH_PATH TO desarrollo1;
/* REQUERIDO PARA TIPO GEOMETRY */
CREATE EXTENSION IF NOT EXISTS postgis;
/*==============================================================*/
/* Table: APLICACION */
/*==============================================================*/
create table if not exists APLICACION (
ID_APLICACION INT4 not null,
NOMBRE_APP varchar(100) null,
VIGENTE BOOL null,
constraint PK_APLICACION primary key (ID_APLICACION)
);
/*==============================================================*/
/* Table: COMUNA */
/*==============================================================*/
create table if not exists COMUNA (
ID_COMUNA INT4 not null,
ID_REGION INT4 null,
NOMBRE_COMUNA varchar(100) null,
constraint PK_COMUNA primary key (ID_COMUNA)
);
/*==============================================================*/
/* Table: CONDUCTOR */
/*==============================================================*/
create table if not exists CONDUCTOR (
PATENTE VARCHAR(10) null,
RUT NUMERIC(12) null,
VIGENTE BOOL null
);
/*==============================================================*/
/* Table: DISPOSITIVO */
/*==============================================================*/
create table if not exists DISPOSITIVO (
ID_DISPOSITIVO INT4 not null,
ID_PARADERO INT4 null,
VIGENTE BOOL null,
ULTIMA_CONEXION DATE null,
constraint PK_DISPOSITIVO primary key (ID_DISPOSITIVO)
);
/*==============================================================*/
/* Table: FUNCIONARIO */
/*==============================================================*/
create table if not exists FUNCIONARIO (
RUT NUMERIC(12) null,
ID_OPERADOR INT4 null,
DESDE DATE null,
HASTA DATE null
);
/*==============================================================*/
/* Table: GTFS_CALENDAR */
/*==============================================================*/
create table if not exists GTFS_CALENDAR (
ID_LINEA INT4 not null,
MONDAY BOOL null,
TUESDAY BOOL null,
WEDNESDAY BOOL null,
THURSDAY BOOL null,
FRIDAY BOOL null,
SALURDAY BOOL null,
SUNDAY BOOL null,
constraint PK_GTFS_CALENDAR primary key (ID_LINEA)
);
/*==============================================================*/
/* Table: GTFS_FREQUENCIE */
/*==============================================================*/
create table if not exists GTFS_FREQUENCIE (
ID_TRIPS INT4 null,
START_TIME TIME null,
END_TIME TIME null,
HEADWAY_SECS int null,
EXACT_TIME int null
);
/*==============================================================*/
/* Index: INDEX_FREQUENCIE */
/*==============================================================*/
create index INDEX_FREQUENCIE on GTFS_FREQUENCIE (
ID_TRIPS
);
/*==============================================================*/
/* Table: GTFS_ROUTES */
/*==============================================================*/
create table if not exists GTFS_ROUTES (
ID_ROUTES INT4 not null,
ID_OPERADOR INT4 null,
ID_ROUTE_TYPE int null,
SHORT_NAME varchar(100) null,
LONG_NAME varchar(300) null,
DESCRIPCION varchar(500) null,
ROUTE_COLOR VARCHAR(6) null,
ROUTE_TEXT_COLOR VARCHAR(6) null,
ROUTE_SORT_ORDER int null,
constraint PK_GTFS_ROUTES primary key (ID_ROUTES)
);
/*==============================================================*/
/* Table: GTFS_ROUTE_TYPE */
/*==============================================================*/
create table if not exists GTFS_ROUTE_TYPE (
ID_ROUTE_TYPE int not null,
DESCRIPCION varchar(100) null,
constraint PK_GTFS_ROUTE_TYPE primary key (ID_ROUTE_TYPE)
);
/*==============================================================*/
/* Table: GTFS_SHAPE */
/*==============================================================*/
create table if not exists GTFS_SHAPE (
ID_SHAPES INT4 not null,
SHAPE_PT_LAT geometry null,
SHAPE_PT_LON geometry null,
SHAPE_PT_SEQUENCE int null,
SHAOE_DIST_TRAVELED float null,
constraint PK_GTFS_SHAPE primary key (ID_SHAPES)
);
/*==============================================================*/
/* Table: GTFS_STOP_TIMES */
/*==============================================================*/
create table if not exists GTFS_STOP_TIMES (
ID_PARADERO INT4 not null,
ID_TRIPS INT4 not null,
ARRIVAL_TIME TIME null,
STOP_SEQUENCE int null,
STOP_HEADSIGN varchar(100) null,
constraint PK_GTFS_STOP_TIMES primary key (ID_PARADERO, ID_TRIPS)
);
/*==============================================================*/
/* Table: GTFS_TRIPS */
/*==============================================================*/
create table if not exists GTFS_TRIPS (
ID_TRIPS INT4 not null,
ID_ROUTES INT4 null,
ID_LINEA INT4 null,
ID_SHAPES INT4 null,
ID_TRIPS_REGRESO INT4 null,
TRIP_HEADSIGN varchar(100) null,
SHORT_NAME varchar(100) null,
DIRECCION_ID int null,
constraint PK_GTFS_TRIPS primary key (ID_TRIPS)
);
/*==============================================================*/
/* Table: LINEA */
/*==============================================================*/
create table if not exists LINEA (
ID_LINEA INT4 not null,
ID_OPERADOR INT4 null,
IID_TIPO_TRANSPORTE INT4 null,
ID_REGION INT4 null,
VIGENTE BOOL null,
NOMBRE VARCHAR(100) null,
URL varchar(300) null,
constraint PK_LINEA primary key (ID_LINEA)
);
/*==============================================================*/
/* Table: OPERADOR */
/*==============================================================*/
create table if not exists OPERADOR (
ID_OPERADOR INT4 not null,
ID_REGION INT4 null,
VIGENTE BOOL null,
constraint PK_OPERADOR primary key (ID_OPERADOR)
);
/*==============================================================*/
/* Table: PARADERO */
/*==============================================================*/
create table if not exists PARADERO (
ID_PARADERO INT4 not null,
ID_COMUNA INT4 null,
ID_TIPO_PARADERO INT4 null,
VIGENTE BOOL null,
STOP_CODE varchar(100) null,
STOP_NAME varchar(100) null,
STOP_DESC varchar(300) null,
STOP_LAT geometry null,
STOP_LON geometry null,
constraint PK_PARADERO primary key (ID_PARADERO)
);
/*==============================================================*/
/* Table: PARADERO_IMAGEN */
/*==============================================================*/
create table if not exists PARADERO_IMAGEN (
ID_PARADERO INT4 not null,
IMAGEN BYTEA null,
constraint PK_PARADERO_IMAGEN primary key (ID_PARADERO)
);
/*==============================================================*/
/* Table: PERSONA */
/*==============================================================*/
create table if not exists PERSONA (
RUT NUMERIC(12) not null,
ID_TIPO_TRATAMIENTO INT4 null,
ID_COMUNA INT4 null,
DV CHAR(1) null,
NOMBRES VARCHAR(100) null,
APELLIDO_A VARCHAR(100) null,
APELLIDO_B VARCHAR(100) null,
FONO VARCHAR(100) null,
EMAIL VARCHAR(100) null,
FECHA_NACIMIENTO DATE null,
DIRECCION VARCHAR(100) null,
constraint PK_PERSONA primary key (RUT)
);
/*==============================================================*/
/* Table: REGION */
/*==============================================================*/
create table if not exists REGION (
ID_REGION INT4 not null,
NOMBRE_REGION VARCHAR(100) not null,
constraint PK_REGION primary key (ID_REGION)
);
/*==============================================================*/
/* Table: ROL */
/*==============================================================*/
create table if not exists ROL (
ID_ROL INT4 not null,
NOMBRE_ROL varchar(100) not null,
constraint PK_ROL primary key (ID_ROL)
);
/*==============================================================*/
/* Table: ROL_APLICACION */
/*==============================================================*/
create table if not exists ROL_APLICACION (
ID_APLICACION INT4 not null,
ID_ROL INT4 not null,
SOLO_VISUALIZAR BOOL null,
ID_ROL_APP SERIAL4 not null,
CONSTRAINT rol_aplicacion_pk PRIMARY KEY (ID_ROL_APP)
);
CREATE UNIQUE INDEX rol_aplicacion_id_aplicacion_idx ON ROL_APLICACION USING btree (ID_APLICACION, ID_ROL);
/*==============================================================*/
/* Table: TIPO_DISPOSITIVO */
/*==============================================================*/
create table if not exists TIPO_DISPOSITIVO (
ID_DISPOSITIVO INT4 null,
ID_TIPO_DISPOSITIVO INT4 null
);
/*==============================================================*/
/* Table: TIPO_PARADERO */
/*==============================================================*/
create table if not exists TIPO_PARADERO (
ID_TIPO_PARADERO INT4 not null,
DESCRIPCION VARCHAR(100) null,
constraint PK_TIPO_PARADERO primary key (ID_TIPO_PARADERO)
);
/*==============================================================*/
/* Table: TIPO_TRANSPORTE */
/*==============================================================*/
create table if not exists TIPO_TRANSPORTE (
IID_TIPO_TRANSPORTE INT4 not null,
DESCRIPCION VARCHAR(50) null,
constraint PK_TIPO_TRANSPORTE primary key (IID_TIPO_TRANSPORTE)
);
/*==============================================================*/
/* Table: TIPO_TRATAMIENTO_PERSONA */
/*==============================================================*/
create table if not exists TIPO_TRATAMIENTO_PERSONA (
ID_TIPO_TRATAMIENTO INT4 not null,
TRATAMIENTO varchar(50) null,
constraint PK_TIPO_TRATAMIENTO_PERSONA primary key (ID_TIPO_TRATAMIENTO)
);
comment on table TIPO_TRATAMIENTO_PERSONA is
'Establece el tratamiento de como dirigirse hacia una persona:
Ejemplo
Señor
Señora
Srta';
/*==============================================================*/
/* Table: TIPO_VEHICULO */
/*==============================================================*/
create table if not exists TIPO_VEHICULO (
ID_TIPO_VEHICULO int not null,
DESCRIPCION varchar(100) null,
constraint PK_TIPO_VEHICULO primary key (ID_TIPO_VEHICULO)
);
/*==============================================================*/
/* Table: USUARIO */
/*==============================================================*/
create table if not exists USUARIO (
LOGIN VARCHAR(20) not null,
RUT NUMERIC(12) null,
CLAVE VARCHAR(20) null,
VIGENTE bool null,
constraint PK_USUARIO primary key (LOGIN)
);
/*==============================================================*/
/* Table: USUARIO_ROL */
/*==============================================================*/
create table if not exists USUARIO_ROL (
LOGIN VARCHAR(20) null,
ID_ROL INT4 null,
VIGENTE BOOL null
);
/*==============================================================*/
/* Table: VEHICULO */
/*==============================================================*/
create table if not exists VEHICULO (
PPU VARCHAR(10) not null,
ID_TIPO_VEHICULO int null,
VIGENTE BOOL null,
constraint PK_VEHICULO primary key (PPU)
);
/*==============================================================*/
/* Table: VEHICULO_LINEA */
/*==============================================================*/
create table if not exists VEHICULO_LINEA (
PATENTE VARCHAR(10) null,
ID_LINEA INT4 null,
VIGENTE BOOL null
);
/*==============================================================*/
/* View: VW_PARADERO_LINEA */
/*==============================================================*/
create or replace view VW_PARADERO_LINEA as
select;
alter table COMUNA
add constraint FK_COMUNA_REFERENCE_REGION foreign key (ID_REGION)
references REGION (ID_REGION)
on delete restrict on update restrict;
alter table CONDUCTOR
add constraint FK_CONDUCTO_REFERENCE_VEHICULO foreign key (PATENTE)
references VEHICULO (PPU)
on delete restrict on update restrict;
alter table CONDUCTOR
add constraint FK_CONDUCTO_REFERENCE_PERSONA foreign key (RUT)
references PERSONA (RUT)
on delete restrict on update restrict;
alter table DISPOSITIVO
add constraint FK_DISPOSIT_REFERENCE_PARADERO foreign key (ID_PARADERO)
references PARADERO (ID_PARADERO)
on delete restrict on update restrict;
alter table FUNCIONARIO
add constraint FK_FUNCIONA_REFERENCE_PERSONA foreign key (RUT)
references PERSONA (RUT)
on delete restrict on update restrict;
alter table FUNCIONARIO
add constraint FK_FUNCIONA_REFERENCE_OPERADOR foreign key (ID_OPERADOR)
references OPERADOR (ID_OPERADOR)
on delete restrict on update restrict;
alter table GTFS_CALENDAR
add constraint FK_GTFS_CAL_REFERENCE_LINEA foreign key (ID_LINEA)
references LINEA (ID_LINEA)
on delete restrict on update restrict;
alter table GTFS_FREQUENCIE
add constraint FK_GTFS_FRE_REFERENCE_GTFS_TRI foreign key (ID_TRIPS)
references GTFS_TRIPS (ID_TRIPS)
on delete restrict on update restrict;
alter table GTFS_ROUTES
add constraint FK_GTFS_ROU_REFERENCE_OPERADOR foreign key (ID_OPERADOR)
references OPERADOR (ID_OPERADOR)
on delete restrict on update restrict;
alter table GTFS_ROUTES
add constraint FK_GTFS_ROU_REFERENCE_GTFS_ROU foreign key (ID_ROUTE_TYPE)
references GTFS_ROUTE_TYPE (ID_ROUTE_TYPE)
on delete restrict on update restrict;
alter table GTFS_STOP_TIMES
add constraint FK_GTFS_STO_REFERENCE_PARADERO foreign key (ID_PARADERO)
references PARADERO (ID_PARADERO)
on delete restrict on update restrict;
alter table GTFS_STOP_TIMES
add constraint FK_GTFS_STO_REFERENCE_GTFS_TRI foreign key (ID_TRIPS)
references GTFS_TRIPS (ID_TRIPS)
on delete restrict on update restrict;
alter table GTFS_TRIPS
add constraint FK_GTFS_TRI_REFERENCE_GTFS_ROU foreign key (ID_ROUTES)
references GTFS_ROUTES (ID_ROUTES)
on delete restrict on update restrict;
alter table GTFS_TRIPS
add constraint FK_GTFS_TRI_REFERENCE_LINEA foreign key (ID_LINEA)
references LINEA (ID_LINEA)
on delete restrict on update restrict;
alter table GTFS_TRIPS
add constraint FK_GTFS_TRI_REFERENCE_GTFS_SHA foreign key (ID_SHAPES)
references GTFS_SHAPE (ID_SHAPES)
on delete restrict on update restrict;
alter table GTFS_TRIPS
add constraint FK_GTFS_TRI_REFERENCE_GTFS_TRI foreign key (ID_TRIPS_REGRESO)
references GTFS_TRIPS (ID_TRIPS)
on delete restrict on update restrict;
alter table LINEA
add constraint FK_LINEA_REFERENCE_OPERADOR foreign key (ID_OPERADOR)
references OPERADOR (ID_OPERADOR)
on delete restrict on update restrict;
alter table LINEA
add constraint FK_LINEA_REFERENCE_TIPO_TRA foreign key (IID_TIPO_TRANSPORTE)
references TIPO_TRANSPORTE (IID_TIPO_TRANSPORTE)
on delete restrict on update restrict;
alter table LINEA
add constraint FK_LINEA_REFERENCE_REGION foreign key (ID_REGION)
references REGION (ID_REGION)
on delete restrict on update restrict;
alter table OPERADOR
add constraint FK_OPERADOR_REFERENCE_REGION foreign key (ID_REGION)
references REGION (ID_REGION)
on delete restrict on update restrict;
alter table PARADERO
add constraint FK_PARADERO_REFERENCE_COMUNA foreign key (ID_COMUNA)
references COMUNA (ID_COMUNA)
on delete restrict on update restrict;
alter table PARADERO
add constraint FK_PARADERO_REFERENCE_TIPO_PAR foreign key (ID_TIPO_PARADERO)
references TIPO_PARADERO (ID_TIPO_PARADERO)
on delete restrict on update restrict;
alter table PARADERO_IMAGEN
add constraint FK_PARADERO_REFERENCE_PARADERO foreign key (ID_PARADERO)
references PARADERO (ID_PARADERO)
on delete restrict on update restrict;
alter table PERSONA
add constraint FK_PERSONA_REFERENCE_COMUNA foreign key (ID_COMUNA)
references COMUNA (ID_COMUNA)
on delete restrict on update restrict;
alter table PERSONA
add constraint FK_PERSONA_REFERENCE_TIPO_TRA foreign key (ID_TIPO_TRATAMIENTO)
references TIPO_TRATAMIENTO_PERSONA (ID_TIPO_TRATAMIENTO)
on delete restrict on update restrict;
alter table ROL_APLICACION
add constraint FK_ROL_APLI_REFERENCE_APLICACI foreign key (ID_APLICACION)
references APLICACION (ID_APLICACION)
on delete restrict on update restrict;
alter table ROL_APLICACION
add constraint FK_ROL_APLI_REFERENCE_ROL foreign key (ID_ROL)
references ROL (ID_ROL)
on delete restrict on update restrict;
alter table TIPO_DISPOSITIVO
add constraint FK_TIPO_DIS_REFERENCE_DISPOSIT foreign key (ID_DISPOSITIVO)
references DISPOSITIVO (ID_DISPOSITIVO)
on delete restrict on update restrict;
alter table USUARIO
add constraint FK_USUARIO_REFERENCE_PERSONA foreign key (RUT)
references PERSONA (RUT)
on delete restrict on update restrict;
alter table USUARIO_ROL
add constraint FK_USUARIO__REFERENCE_USUARIO foreign key (LOGIN)
references USUARIO (LOGIN)
on delete restrict on update restrict;
alter table USUARIO_ROL
add constraint FK_USUARIO__REFERENCE_ROL foreign key (ID_ROL)
references ROL (ID_ROL)
on delete restrict on update restrict;
alter table VEHICULO
add constraint FK_VEHICULO_REFERENCE_TIPO_VEH foreign key (ID_TIPO_VEHICULO)
references TIPO_VEHICULO (ID_TIPO_VEHICULO)
on delete restrict on update restrict;
alter table VEHICULO_LINEA
add constraint FK_VEHICULO_REFERENCE_VEHICULO foreign key (PATENTE)
references VEHICULO (PPU)
on delete restrict on update restrict;
alter table VEHICULO_LINEA
add constraint FK_VEHICULO_REFERENCE_LINEA foreign key (ID_LINEA)
references LINEA (ID_LINEA)
on delete restrict on update restrict;

View File

@ -0,0 +1,70 @@
version: "3"
name: transporte
services:
app:
image: python:3.11-alpine
depends_on:
- db
environment:
- PORT=4000
- DBHOST=db
- DBPORT=5432
- DBNAME=database
- DBSCHEMA=desarrollo1
- DBUSER=postgres
- DBPASS=password
- SECRET_JWT="kf6Jc!f30Z!1k1N0#!%#"
ports:
- 4000:4000
volumes:
- ../:/app
- venv:/root/venv
working_dir: /app
command: sh -c "
[ -d /root/venv/bin ] || ( \
python -m venv /root/venv/ \
&& . /root/venv/bin/activate \
&& pip install -r requirements.txt \
) ;
. /root/venv/bin/activate ;
cd /app ;
[ -d project ] || django-admin startproject project ;
[ -f .env ] || ( [ -f .env.develop ] && cp .env.develop .env ) ;
chmod -R o+w project/ ;
python project/manage.py runserver 0.0.0.0:$$PORT
"
# REF: https://github.com/postgis/docker-postgis/tree/master/14-3.3
db:
image: postgres:14-alpine-geometry
build:
context: ./postgres-geometry
dockerfile: Dockerfile
volumes:
- db:/var/lib/postgresql/data
- ./backups:/docker-entrypoint-initdb.d
#- ./01_create_tables.sql:/docker-entrypoint-initdb.d/01_create_tables.sql
ports:
- 5436:5432
environment:
POSTGRES_PASSWORD: password
POSTGRES_DB: database
PGDATA: /var/lib/postgresql/data/pgdata
adminer:
image: adminer
ports:
- 8080:8080
environment:
ADMINER_DEFAULT_SERVER: db
ADMINER_DEFAULT_USER: postgres
ADMINER_DEFAULT_PASSWORD: password
ADMINER_DESIGN: lucas-sandery
volumes:
db:
venv:

View File

@ -0,0 +1,129 @@
FROM postgres:14-alpine3.15
LABEL maintainer="PostGIS Project - https://postgis.net"
ENV POSTGIS_VERSION 3.2.1
ENV POSTGIS_SHA256 1e9cc4c4f390e4c3be4f5c125a72f39dfa847412332952429952cbd731ac9ba3
RUN set -eux \
\
&& if [ $(printf %.1s "$POSTGIS_VERSION") == 3 ]; then \
set -eux ; \
#
# using only v3.15
#
#GEOS: https://pkgs.alpinelinux.org/packages?name=geos&branch=v3.15 \
export GEOS_ALPINE_VER=3.10 ; \
#GDAL: https://pkgs.alpinelinux.org/packages?name=gdal&branch=v3.15 \
export GDAL_ALPINE_VER=3.4 ; \
#PROJ: https://pkgs.alpinelinux.org/packages?name=proj&branch=v3.15 \
export PROJ_ALPINE_VER=8.2 ; \
#
elif [ $(printf %.1s "$POSTGIS_VERSION") == 2 ]; then \
set -eux ; \
#
# using older branches v3.13; v3.14 for GEOS,GDAL,PROJ
#
#GEOS: https://pkgs.alpinelinux.org/packages?name=geos&branch=v3.13 \
export GEOS_ALPINE_VER=3.8 ; \
#GDAL: https://pkgs.alpinelinux.org/packages?name=gdal&branch=v3.14 \
export GDAL_ALPINE_VER=3.2 ; \
#PROJ: https://pkgs.alpinelinux.org/packages?name=proj&branch=v3.14 \
export PROJ_ALPINE_VER=7.2 ; \
#
\
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.14/main' >> /etc/apk/repositories ; \
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.14/community' >> /etc/apk/repositories ; \
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.13/main' >> /etc/apk/repositories ; \
echo 'https://dl-cdn.alpinelinux.org/alpine/v3.13/community' >> /etc/apk/repositories ; \
\
else \
set -eux ; \
echo ".... unknown \$POSTGIS_VERSION ...." ; \
exit 1 ; \
fi \
\
&& apk add --no-cache --virtual .fetch-deps \
ca-certificates \
openssl \
tar \
\
&& wget -O postgis.tar.gz "https://github.com/postgis/postgis/archive/${POSTGIS_VERSION}.tar.gz" \
&& echo "${POSTGIS_SHA256} *postgis.tar.gz" | sha256sum -c - \
&& mkdir -p /usr/src/postgis \
&& tar \
--extract \
--file postgis.tar.gz \
--directory /usr/src/postgis \
--strip-components 1 \
&& rm postgis.tar.gz \
\
&& apk add --no-cache --virtual .build-deps \
\
gdal-dev~=${GDAL_ALPINE_VER} \
geos-dev~=${GEOS_ALPINE_VER} \
proj-dev~=${PROJ_ALPINE_VER} \
\
autoconf \
automake \
clang-dev \
file \
g++ \
gcc \
gettext-dev \
json-c-dev \
libtool \
libxml2-dev \
llvm-dev \
make \
pcre-dev \
perl \
protobuf-c-dev \
\
# build PostGIS
\
&& cd /usr/src/postgis \
&& gettextize \
&& ./autogen.sh \
&& ./configure \
--with-pcredir="$(pcre-config --prefix)" \
&& make -j$(nproc) \
&& make install \
\
# regress check
&& mkdir /tempdb \
&& chown -R postgres:postgres /tempdb \
&& su postgres -c 'pg_ctl -D /tempdb init' \
&& su postgres -c 'pg_ctl -D /tempdb start' \
&& cd regress \
&& make -j$(nproc) check RUNTESTFLAGS=--extension PGUSER=postgres \
#&& make -j$(nproc) check RUNTESTFLAGS=--dumprestore PGUSER=postgres \
#&& make garden PGUSER=postgres \
\
&& su postgres -c 'psql -c "CREATE EXTENSION IF NOT EXISTS postgis;"' \
&& su postgres -c 'psql -t -c "SELECT version();"' >> /_pgis_full_version.txt \
&& su postgres -c 'psql -t -c "SELECT PostGIS_Full_Version();"' >> /_pgis_full_version.txt \
\
&& su postgres -c 'pg_ctl -D /tempdb --mode=immediate stop' \
&& rm -rf /tempdb \
&& rm -rf /tmp/pgis_reg \
# add .postgis-rundeps
&& apk add --no-cache --virtual .postgis-rundeps \
\
gdal~=${GDAL_ALPINE_VER} \
geos~=${GEOS_ALPINE_VER} \
proj~=${PROJ_ALPINE_VER} \
\
json-c \
libstdc++ \
pcre \
protobuf-c \
# clean
&& cd / \
&& rm -rf /usr/src/postgis \
&& apk del .fetch-deps .build-deps \
# print PostGIS_Full_Version() for the log. ( experimental & internal )
&& cat /_pgis_full_version.txt
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/10_postgis.sh
COPY ./update-postgis.sh /usr/local/bin

View File

@ -0,0 +1,22 @@
#!/bin/sh
set -e
# Perform all actions as $POSTGRES_USER
export PGUSER="$POSTGRES_USER"
# Create the 'template_postgis' template db
"${psql[@]}" <<- 'EOSQL'
CREATE DATABASE template_postgis IS_TEMPLATE true;
EOSQL
# Load PostGIS into both template_database and $POSTGRES_DB
for DB in template_postgis "$POSTGRES_DB"; do
echo "Loading PostGIS extensions into $DB"
"${psql[@]}" --dbname="$DB" <<-'EOSQL'
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder;
EOSQL
done

View File

@ -0,0 +1,28 @@
#!/bin/sh
set -e
# Perform all actions as $POSTGRES_USER
export PGUSER="$POSTGRES_USER"
POSTGIS_VERSION="${POSTGIS_VERSION%%+*}"
# Load PostGIS into both template_database and $POSTGRES_DB
for DB in template_postgis "$POSTGRES_DB" "${@}"; do
echo "Updating PostGIS extensions '$DB' to $POSTGIS_VERSION"
psql --dbname="$DB" -c "
-- Upgrade PostGIS (includes raster)
CREATE EXTENSION IF NOT EXISTS postgis VERSION '$POSTGIS_VERSION';
ALTER EXTENSION postgis UPDATE TO '$POSTGIS_VERSION';
-- Upgrade Topology
CREATE EXTENSION IF NOT EXISTS postgis_topology VERSION '$POSTGIS_VERSION';
ALTER EXTENSION postgis_topology UPDATE TO '$POSTGIS_VERSION';
-- Install Tiger dependencies in case not already installed
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
-- Upgrade US Tiger Geocoder
CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder VERSION '$POSTGIS_VERSION';
ALTER EXTENSION postgis_tiger_geocoder UPDATE TO '$POSTGIS_VERSION';
"
done

212
docs/LUR.csv 100644
View File

@ -0,0 +1,212 @@
"codigo";"texto1";"texto2";"texto3";"texto4";"bgcolor1";"color1";"bgcolor2";"color2"
"02D";"San Vicente - Puerto";"Colón - Av. Grecia";"Cerro Amarillo";"Diego Portales";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"02D";"San Vicente - Puerto";"Colón - Av. Grecia";"Cerro Amarillo";"02K";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"02K";"Puerto - Thno";"San Vicente";"Nueva Los Lobos";"Los Copihues";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"02K";"Puerto - Thno";"San Vicente";"Nueva Los Lobos";"02A";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"02A";"Colón - Puerto";"San Vicente";"Nueva Los Lobos";"Centinela";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"02A";"Colón - Puerto";"San Vicente";"Nueva Los Lobos";"02P";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"02P";"San Vicente";"Puerto - Colón";"Lan C - Floresta";"Peñuelas";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"02P";"San Vicente";"Puerto - Colón";"Lan C - Floresta";"02C";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"02C";"Arenal Cementerio 2";"Hospital Higueras";"Colón ";"Peñuelas";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"02C";"Arenal Cementerio 2";"Hospital Higueras";"Colón ";"02L";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"02L";"Arenal Cementerio 2";"Hospital Higueras";"Colón ";"Diego Portales";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"02L";"Arenal Cementerio 2";"Hospital Higueras";"Colón ";"10D";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"10D";"San Martin";"Mall - Autopista";"Puente de Arco";"Las Canchas";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10A";"8 Oriente - San Martín";"Mall - Autopista";"Thno - San Vicente";"CENTINELA";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10A";"8 Oriente - San Martín";"Mall - Autopista";"Thno - San Vicente";"10B";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"10B";"San Martín";"Mall-Autopista";"Thno-S.Vicente";"Lobos Viejos";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10B";"San Martín";"Mall-Autopista";"Thno-S.Vicente";"10C";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"10C";"8 Oriente - San Martín";"Mall - Autopista";"Thno - S.Vicente";"LAS CANCHAS";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10C";"8 Oriente - San Martín";"Mall - Autopista";"Thno - S.Vicente";"10M";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"10M";"Autopista - Mall";"Concep. - Chigte.";"8 Oriente";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10O";"Bilbao - Autopista";"Mall - Concep.";"Chigte - O'higgins";"POBL. PORVENIR";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10P";"Autopista-Mall";"Concep- - Chigte";"8 Oriente";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10J";"8 Oriente - San Martín";"Autopista - Thno.";"Avda. Del Pescador";"CENTINELA";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10L";"Avda Del Pescador";"Mall - Chigte";"8 Oriente";"Los Bloques";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10N";"Autopista - Mall";"Concep. - Chigte";"8 Oriente";"LOS BLOQUES";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10T";"8 Oriente - San Martín";"Autopista - mall";"Thno - Las Canchas";"TUMBES";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"10K";"Las Canchas - Thno";"Mall - Autopista";"8 Oriente - Chigte";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"11E";"8 Oriente - San Martín";"Autopista - Mall";"J. Repullo - Sta. Marta";"TALCAHUANO";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"11F";"San Martín";"Mall- Autopista";"Higueras-Bilbao";"Talcahuano";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"11Q";"Santa Marta - Mall";"Autopista - O´Higgins";"8 Oriente - Chigte";"Los Bloques";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"11R";"Bilbao-Hosp. Higueras";"Autopista-Mall";"O´Higgins-Chigte";"PORVENIR";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"11C";"8 Oriente - San Martín";"Autopista - Mall";"Repullo - San Marcos";"TALCAHUANO";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"11M";"San Marcos - J. Repullo";"Mall - O´Higgins";"8 Oriente - Chigte";"LOS BLOQUES";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"12Q";"Prat-Vega";"Club Hípico";"Industrias";"Puerto";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"12R";"Prat-Vega";"Boldos-Bremen";"Industrias";"Puerto";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"12A";"Club Hípico";"Vega-Prat";"Chiguayante";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"12B";"Bremen-Boldos";"Vega-Prat";"Chiguayante";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"13G";"8 Oriente - S. Martin";"Mall - Trébol - Autopista";"Directo - Thno";"PTA. LEONES";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"13S";"Autopista - Mall";"Tribunales - P. Vald";"8 Oriente - Chgte";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"14H";"San Martín";"Mall-Autopista";"Directo-Thno";"San Vicente";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"14Z";"San Martín - Hospital";"Plaza Acevedo";"A Las Puertas";"Term.Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"14T";"Autopista-Mall";"O'Higgins-Tribunales";" 8 Oriente - Los Altos - Chgte";"Coquimbo";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"14U";"O´Higgins";"Tribunales - P. Valdivia";"Chgte - O´Higgins - Los Altos";"Policlinico - Coquimbo";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"16I";"8 Oriente - San Martín";"Mall-Autopista";"Santa Marta - Consultorio";"San Vicente";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"16V";"Santa Marta - Consultorio";"Mall - O´Higgins";"8 Oriente - Chiguayante";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"16H";"8 Oriente - San Martín";"Mall-Autopista";"S. Marcos - Consultorio";"San Vicente";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"16K";"M. Montt - Consultorio";"San Marcos - Mall - Paicavi ";"O'Higgins - 8 Oriente";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"17A";"Centro - O´Higgins";"P. Valdivia - Prat - Carrera";"Pza. Acevedo - Penco Chico";"Cº Verde Bajo";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"17O";"Centro - 8 Oriente";"San Martín - Hospital";"Pza. Acevedo - Collao - UBB";"NONGUEN";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"17M";"Centro - O´Higgins";"P. Valdivia - Prat - Carrera";"Pza. Acevedo - Fanaloza";"MONTAHUE - PENCO";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"17W";"Centro - O´Higgins";"P.De Valdivia - Chgte";"Pob. Porvenir";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"17X";"Centro - O´Higgins";"P. Valdivia - 8 Oriente";"Chgte. - Pob. Porvenir";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"17C";"Montahue - Centro";"O´Higgins - P. De valdivia";"Chgte - Porvenir";"LEONERA";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"18P";"San Martín";"Hospital";"Collao-UBB";"Palomares";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"18Y";"O´Higgins- Centro";"P.Devaldivia";"Chiguayante";"Hualqui";"rgb(204,138,0)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20V";"Puente Llacolén";"Los Carrera - Mall";"Autopista-Thno";"Pta. Los Leones";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20J";"Puente Llacolén";"San Martín";"Mall - Autopista";"Pta. Los Leones";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20A";"Autopista-Mall";"O´Higgins";"Puente Llacolén";"Boca Sur";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20L";"Autopista-Mall";"Los Carrera";"Puente Llacolén";"Boca Sur";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20Z";"Pioneros- P Llacolén";"Los Carreras";"Mall- Autopista";"Pta. Los Leones";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20W";"Autopista - Mall";"Av. Los Carrera";"Pte Llacolén- Pioneros";"San Pedro De La Costa";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20T";"O'carrol - Pioneros";"Pte. Llacolén - Av. Los Carrera";"Mall - Autopista";"Pta. Los Leones";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"20M";"Autopista - Mall";"O""Higgins - Pte Llacolén";"Pioneros - O'carrol";"San Pedro De La Costa";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"21Q";"Puente Llacolén";"San Martín";"Hospital-Puertas";"Term. Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"21B";"Centro-O´Higgins";"Puente Llacolén";"Spring Hill";"Candelaria";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22D";"O´Higgins";"Puente Llacolén";"Boca Sur";"Michaihue";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22K";"Puente Llacolén";"Los Carrera - Collao";"Ubb-Nonguen";"Araucana";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22R";"Puente Llacolén";"San Martín";"Hospital-Collao";"U.Bio Bio";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22S";"Puente Llacolén";"S.Martín-Collao";"Ubb - Nonguén";"Araucana";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22X";"Puente Llacolén";"San Martín";"Hospital";"Galvarino";"rgb(198,0,126)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22J";"Pioneros - P.Llacolén";"San Martín";"Gral Novoa - Los Lirios";"Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22C";"O´Higgins";"Puente Llacolén";"P.Aguirre Cerda";"Lomas - Coloane";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22N";"Los Carrera";"Puente Llacolén";"Boca Sur";"Michaihue";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22E";"O´Higgins";"Puente Llacolén";"Fuera De La Villa";"Candelaria";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"22O";"Los Carrera";"Pte. Llacolén";"Los Pioneros";"San Pedro De La Costa";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23L";"Puente Llacolén";"Los Carrera";"Collao-UBB";"Nonguen";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23E";"Sta.Beatriz - Pioneros";"Pte. Llacolén";"Los Carrera";"PTA. TERMINAL COLLAO";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23V";"Los Carrera";"Pte. Llacolén";"Pioneros - Sta.Beatriz";"MICHAIHUE";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23A";"Puente Nuevo";"Vega-Maipú";"Hosp. Trabajador";"Term. Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23P";"Los Carrera";"Puente Llacolén";"Boca Sur";"Michaihue";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23Q";"Carrera-Vega";"Candelaria";"Boca Sur";"Michaihue";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"23N";"Los Pioneros";"Pte. Llacolén";"Los Carrera";"Pta. Terminal Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23T";"Los Carrera";"Pte. Llacolén";"Los Pioneros";"San Pedro De La Costa";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23B";"Sta. Beatriz-Verluys";"Pte. Llacolén";"Los Carrera";"Pta. Terminal Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23S";"Los Carrera-Pte.Llacolén";"V. Victoria-Sta. Beatriz";"V. San Sebastián";"Av. Michaihue";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23C";"S. Henríquez-Escritores";"Sn. Pedro Viejo - Pte. Bicent";"Mall Biobío - Los Carrera";"Pta. Terminal Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"23H";"Los Carrera-Mall Biobío";"Pte. Bicent.- S. Pedro Viejo";"Outlet Mall - Los Escritores";"Silva Henríquez";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"24M";"Villa- P.Llacolén";"Los Carrera";"Collao-Los Lirios";"Los Fresnos";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"24T";"Villa-P.Llacolén";"San Martín";"Collao - Los Lirios";"Los Fresnos";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"24F";"O´Higgins";"Puente Llacolén";"Por Villa S.Pedro";"Candelaria";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"24R";"Los Carrera";"Puente Llacolén";"Por Villa S.Pedro";"Candelaria";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30M";"Freire - Vega";"Bremen - Hualpén";"Lan B - Higueras";"INDUSTRIAS";"rgb(155,39,67)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30N";"Penco Chico";"Freire - Lan B";"Bremen - Hualpén";"INDUSTRIAS";"rgb(155,39,67)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30R";"O´Higgins- Prat";"Vega - Colón";"V.San Martín";"Higueras";"rgb(155,39,67)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30Q";"O´Higgins- Vega";"Mall- Autopista";"V. San Martín";"Higueras";"rgb(155,39,67)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30B";"Colón -Vega";"Los Carrera";"Plaza Acevedo";"Penco Lirquen";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30C";"Autopista- Mall";"Freire- Centro";"Prat- Carrera";"Penco Lirquen";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30D";"Hualpén";"Vega - Carrera";"Penco - Lirquén";"RIOS DE CHILE";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"30E";"Hualpén";"Vega - Prat";"Carrera - Lirquén";"PENCO CHICO";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"31D";"O´Higgins-Prat";"Vga- Colón";"Talcahuano";"Lobos Viejos";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"31F";"Colón- Vega";"Prat -Carrera";"Penco";"Lirquen";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"32G";"Colón -Vega";"Prat- Carrera";"Penco- Lirquén";"Rios De Chile";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"32E";"O'higgins - Prat";"Vega - Colon";"Talcahuano";"Lobos Viejos";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"32K";" Hospital Higueras";" Colón - Vega";" Montahue - Lirquén";"RIOS DE CHILE";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"32J";"Lirquén - Montahue";"O'Higgins - Vega";"Hospital Higueras";"LOBOS VIEJOS";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"40G";"Autopista- Mall";"O´Higgins";"Puente Llacolén";"Candelaria";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"40B";"Vega- Maipú";"P.Acevedo- Ubb";"Araucana- Valle";"Nonguen";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"40N";"San Martín";"Autopista -Mall";"Lan C- Bremen";"4 Esquinas";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"40P";"Freire- Prat";"Vega- Lan C";"Bremen -Cañería";"4 Esquinas";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"41Q";"Autopista- Mall";"Paicaví -Freire";"Prat- Lider";"Concepción";"rgb(198,0,126)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"41C";"Vega- Prat";"Maipú -Paicaví";"Hospital -Puertas";"Term. Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"41V";"Prat -Maipú";"Mall - Autopista";"Lan C - P.Aylwin";"Hualpencillo";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"41R";"Centro - Freire";"Vega- Lan B";"Los Boldos";"Hualpencillo";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"42U";"C.Hípico - Vega";"San Martín";"Hospital -Puertas";"Term. Collao";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"42F";"Club Hípico";"Autopista - Mall";"O´Higgins- Prat";"Concepción";"rgb(198,0,126)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"42H";"Centro -Freire";"Vega - C.Hipico";"Finlandia";"Hualpen - 4 Esq";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"42W";"Prat - Maipú";"Mall -Autopista";"Club Hípico";"Hualpen - 4 Esq";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"43T";"O´Higgins";"Tucapel - Freire";"Vega -Bremen";"Hualpencillo";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"43J";"Vega - Maipú";"Janequeo";"C.Henriquez";"Sta. Sabina";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"44E";"Heras-Rengo";"Chacab.- C.Henríq.";"V.Cap.-Torreones";"Lomas-Mall";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"44U";"Torreones-Freire";"Vega-Ramuntcho";"Grecia- D.Portales";"Hualpencillo";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"44A";"Heras-Rengo";"Chacabuco ";"C.Henruq.-V.Cap.";"Lomas-Mall";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"44B";"Freire-Vega";"Ramuntcho";"Grecia- D.Portales";"Hualpencillo";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"50S";"Autopista- Mall";"O´Higgins";"Prat- Vega";"Concepción";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"50U";"Vega -Mall";"Denavi Sur - Bosque";"V.S Martín- Estadio";"Higueras - Gaete";"rgb(155,39,67)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"52A";"Freire -Prat";"Vega -Colón";"Talcahuano";"Pta. Leones";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"52D";"Colón - Vega";"Prat -Maipú";"Collao -UBB";"Palomares";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"56O";"O´Higgins";"Vega - Colón";"Talcahuano";"Pta. Los Leones";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"56V";"Colón - Vega";"San Martín";"Los Lirios - Los Fresnos";"T. Collao - Hospital";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"57Y";"Autopista - Mall";"Paicaví";"O'higgins - Prat";"CONCEPCIÓN";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"57P";"O'higgins - Prat";"Vega - Colón";"Hosp. Higueras";"SAN VICENTE";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"60X";"Paicaví - Freire";"Prat - Vega";"Lan C - Grecia";"Hualpencillo";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"60Y";"Freire - Vega";"Lan C - Grecia";"Consultorio";"Padre Hurtado";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"60Z";"V.Cap - Ejército";"A.Pinto - Freire";"Lider Prat";"P. Valdivia";"rgb(137,141,141)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"60K";"Maipú - Paicaví";"Bº Norte - Santa Sabina";"Princesas - Lomas";"Sta. Sabina";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"60L";"Maipú - Paicaví";"Bº Norte - Princesas";"Portal - Lomas";"Sta. Sabina";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"60M";"Maipú -Tucapel";"Ventus - T. Merino";"B. Modelo - S. Sabina";"Consultorio Sta Sabina";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"62H";"Higueras -Colón";"Vega - Los Carrera";"Penco- C Verde";"Lirquen";"rgb(0,140,149)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"62M";"O´Higgins -Prat";"Vega -Higueras";"Hospital";"SAN VICENTE";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"62O";"Higueras -Colón";"Vega -Maipú";"C.Henriquez";"Villa Cap";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"62N";"O´Higgins- Prat";"Vega -Higueras";"Hospital";"SAN VICENTE";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"62V";"Higueras - St. Marta";"Vega -Maipú";"C.Henriquez";"Villa Cap";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"62S";"O´Higgins- Prat";"Vega - St. Marta";"Hospital - Higueras";"SAN VICENTE";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"63I";"Rengo - Centro";"Puente Llacolén";"San Pedro Viejo";"Recodo";"rgb(0,119,73)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"63K";"C.Henriquez";"Freire -Prat";"Cementerio";"J.Pablo II";"rgb(255,199,44)";"rgb(0,0,0)";"rgb(255,215,0)";"rgb(0,0,0)"
"63F";"Rengo - Centro";"Chacabuco - Hospital";" C. Henríquez";"CHILLANCITO";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"63G";"Puente Llacolén";"Lincoyán";"Ejército";"B.Norte";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"63P";"Prat -Maipú";"C.Henriquez";"Villa Cap";"B. Norte";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"63H";"Chacabuco";"Hospital - Lincoyán";"Ejército";"B. NORTE";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"63L";"Rengo - Chacabuco";"Hospital - C.Henríquez";"Andalién - Bellavista";"San Sebastián";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"63B";"Andalién - C. Henríquez";"Hospital - Chacabuco";"Lincoyán - Ejército";"Barrio Norte";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"65Q";"P.del Río - Maipú";"P. Acevedo";"V. Cap - T. Merino";"STA. SABINA";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"65R";"Prat - Maipú";"Pelantaro - C. Henriquez";"V.Cap - Campos Bellavista";"Sta. Sabina";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"65D";"P. Acevedo - Freire";"P. del Río";"Cementerio - Vega";"P.SAAVEDRA.";"rgb(255,199,44)";"rgb(0,0,0)";"rgb(255,215,0)";"rgb(0,0,0)"
"65E";"Freire -Prat";"Vega- Los Boldos";"Floresta - P. Hurtado";"Peñuelas";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"65S";"Costanera - Maipú";"Pelantaro - C.Henríquez";"V. Cap - Torreones";"STA. SABINA";"rgb(45,41,38)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"65F";"C.Henríquez-Lientur";"Freire-Costanera";"Directo Easy Jumbo";"ALTO COSTANERA";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"70I";"O´Higgins -Vega";"Colón -Thno";"P.Arco -N.Lobos";"Centinela";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"70J";"O´Higgins - Vega";"Colón - Talcahuano";"Pte. Arco - N. Los Lobos";"Los Copihues";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"70K";"O´Higgins -Vega";"Mall -Autopista";"Thno -Pte .Arco";"Los Copihues";"rgb(203,51,59)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"70H";"Autopista -Mall";"Carrera -Serrano";"Maipú - Collao";"Va.Nonguen";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"70F";"Colon - Vega";"Maipú - Collao";"Ubb - Valle";"Nonguen";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"70G";"Colón - Vega";"Maipú - Collao";"UBB - Palomares";"Km10";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"71I";"Vega -Maipú";"Plaza Acevedo";"Ubb- Zoológico";"V. Nonguen";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"71Z";"Freire -Prat";"Hualpencillo";"Bremen- Cañeria";"4 Esquinas - Lenga";"rgb(236,105,7)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"72J";"O´Higgins";"P.De Valdivia";"Clínicas";"Lonco";"rgb(137,141,141)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"72K";"O´Higgins";"Pedro De Valdivia";"Clinicas";"Lonco";"rgb(137,141,141)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"72W";"San Martín";"Hospital - Collao";"U.B.B. - Valle";"NONGUÉN";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"72Z";"San Martín";"Hospital - Collao";"U.B.B.";"VALLE NOBLE";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"80K";"San Martín";"Mall -Autopista";"Talcahuano";"San Vicente";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"80L";"San Martín";"Mall -Autopista";"Talcahuano";"San Vicente";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"80H";"Autopista- Mall";"O´Higgins";"Chiguayante";"Hualqui";"rgb(204,138,0)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"80Z";"Autopista- Mall";"O´Higgins";"Chiguayante";"Valle Piedra";"rgb(0,119,200)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"80J";"Santa Josefina";"San Martin - Mall";"Autopista - Thno";"San Vicente";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"80Q";"Autopista- Mall";"O'higgins - Chgte";"Santa Josefina";"Hualqui";"rgb(204,138,0)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"81C";"Industrias -Lan C";"Vega -Prat";"Chiguayante";"Hualqui";"rgb(204,138,0)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"81S";"Prat -Vega";"Hualpencillo";"Lan C- Industrias";"Puerto";"rgb(16,6,159)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"90E";"Alemparte- Maipú";"A Las Puertas";"Terminal Collao";"Los Lagos";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"90Y";"Rengo - Chacab.";"Hospital";"Collao -Los Lirios";"Los Queules";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"90J";"Chacab. -Tucapel";"Carrera -Prat";"Alemparte";"Pq.Central";"rgb(255,199,44)";"rgb(0,0,0)";"rgb(255,215,0)";"rgb(0,0,0)"
"90X";"O´Higgins -Prat";"Maipú - Tucapel";"Laguna Redonda";"Pq. Central";"rgb(255,199,44)";"rgb(0,0,0)";"rgb(255,215,0)";"rgb(0,0,0)"
"B01R";"San Martín";"Tucapel";"EIM Concepción";"Estación - Tribunales";"rgb(236,105,7)";"rgb(0,0,0)";"rgb(236,105,7)";"rgb(255,255,255)"
"B01I";"San Martín";"Tucapel";"EIM Concepción";"Estación - Tribunales";"rgb(236,105,7)";"rgb(0,0,0)";"rgb(236,105,7)";"rgb(255,255,255)"
"B02R";"Mall - Paicavi";"O'Higgins";"Lider Prat";"Centro Concepción";"rgb(236,105,7)";"rgb(0,0,0)";"rgb(236,105,7)";"rgb(255,255,255)"
"B02I";"San Martín";"Paicaví - Mall";"Brisas Del Sol";"Mall - Casino";"rgb(236,105,7)";"rgb(0,0,0)";"rgb(236,105,7)";"rgb(255,255,255)"
"B02I";"San Martín";"Paicaví - Mall";"Brisas Del Sol";"300r";"rgb(236,105,7)";"rgb(0,0,0)";"rgb(0,0,0)";"rgb(0,0,0)"
"300r";"Concepción";"Vega Monumental";"Ruta 160";"Lota ";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"300r";"Concepción";"Vega Monumental";"Ruta 160";"301r";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"301r";"Concepción";"Vega Monumental";"Ruta 160";"Lota ";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"301r";"Concepción";"Vega Monumental";"Ruta 160";"302r";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"302r";"Concepción";"Vega Monumental";"Ruta 160";"Lota ";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"302r";"Concepción";"Vega Monumental";"Ruta 160";"303r";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"303r";"Concepción";"Vega Monumental";"Ruta 160";"Lota ";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"303r";"Concepción";"Vega Monumental";"Ruta 160";"304r";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"304r";"Concepción";"Vega Monumental";"Ruta 160";"Lota ";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"304r";"Concepción";"Vega Monumental";"Ruta 160";"305r";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"305r";"Concepción";"Vega Monumental";"Ruta 160";"Colcura";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"305r";"Concepción";"Vega Monumental";"Ruta 160";"300i";"rgb(0,30,96)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"300i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"Concepción";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"300i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"301i";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"301i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"Concepción";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"301i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"302i";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"302i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"Concepción";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"302i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"303i";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"303i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"Concepción";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"303i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"304i";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"304i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"Concepción";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"304i";"Lota-Coronel";"Ruta 160";"Pte. Juan Pablo II";"305i";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(0,0,0)";"rgb(0,0,0)"
"305i";"Lota - Coronel";"Ruta 160";"Pte. Juan Pablo II";"Concepción";"rgb(152,29,151)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"201i";"Est Biotrén JP II";"Vega Monumental";"Av. Los Carrera";"CONCEPCIÓN";"rgb(198,0,126)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
"201r";"Colo Colo";"Vega Monumental";"Av. Pedro de Valdivia";"SANTA JUANA";"rgb(59,162,220)";"rgb(255,255,255)";"rgb(255,215,0)";"rgb(0,0,0)"
1 codigo texto1 texto2 texto3 texto4 bgcolor1 color1 bgcolor2 color2
2 02D San Vicente - Puerto Colón - Av. Grecia Cerro Amarillo Diego Portales rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
3 02D San Vicente - Puerto Colón - Av. Grecia Cerro Amarillo 02K rgb(236,105,7) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
4 02K Puerto - Thno San Vicente Nueva Los Lobos Los Copihues rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
5 02K Puerto - Thno San Vicente Nueva Los Lobos 02A rgb(203,51,59) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
6 02A Colón - Puerto San Vicente Nueva Los Lobos Centinela rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
7 02A Colón - Puerto San Vicente Nueva Los Lobos 02P rgb(203,51,59) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
8 02P San Vicente Puerto - Colón Lan C - Floresta Peñuelas rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
9 02P San Vicente Puerto - Colón Lan C - Floresta 02C rgb(236,105,7) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
10 02C Arenal Cementerio 2 Hospital Higueras Colón Peñuelas rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
11 02C Arenal Cementerio 2 Hospital Higueras Colón 02L rgb(236,105,7) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
12 02L Arenal Cementerio 2 Hospital Higueras Colón Diego Portales rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
13 02L Arenal Cementerio 2 Hospital Higueras Colón 10D rgb(236,105,7) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
14 10D San Martin Mall - Autopista Puente de Arco Las Canchas rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
15 10A 8 Oriente - San Martín Mall - Autopista Thno - San Vicente CENTINELA rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
16 10A 8 Oriente - San Martín Mall - Autopista Thno - San Vicente 10B rgb(203,51,59) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
17 10B San Martín Mall-Autopista Thno-S.Vicente Lobos Viejos rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
18 10B San Martín Mall-Autopista Thno-S.Vicente 10C rgb(203,51,59) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
19 10C 8 Oriente - San Martín Mall - Autopista Thno - S.Vicente LAS CANCHAS rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
20 10C 8 Oriente - San Martín Mall - Autopista Thno - S.Vicente 10M rgb(203,51,59) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
21 10M Autopista - Mall Concep. - Chigte. 8 Oriente LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
22 10O Bilbao - Autopista Mall - Concep. Chigte - O'higgins POBL. PORVENIR rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
23 10P Autopista-Mall Concep- - Chigte 8 Oriente LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
24 10J 8 Oriente - San Martín Autopista - Thno. Avda. Del Pescador CENTINELA rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
25 10L Avda Del Pescador Mall - Chigte 8 Oriente Los Bloques rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
26 10N Autopista - Mall Concep. - Chigte 8 Oriente LOS BLOQUES rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
27 10T 8 Oriente - San Martín Autopista - mall Thno - Las Canchas TUMBES rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
28 10K Las Canchas - Thno Mall - Autopista 8 Oriente - Chigte LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
29 11E 8 Oriente - San Martín Autopista - Mall J. Repullo - Sta. Marta TALCAHUANO rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
30 11F San Martín Mall- Autopista Higueras-Bilbao Talcahuano rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
31 11Q Santa Marta - Mall Autopista - O´Higgins 8 Oriente - Chigte Los Bloques rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
32 11R Bilbao-Hosp. Higueras Autopista-Mall O´Higgins-Chigte PORVENIR rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
33 11C 8 Oriente - San Martín Autopista - Mall Repullo - San Marcos TALCAHUANO rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
34 11M San Marcos - J. Repullo Mall - O´Higgins 8 Oriente - Chigte LOS BLOQUES rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
35 12Q Prat-Vega Club Hípico Industrias Puerto rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
36 12R Prat-Vega Boldos-Bremen Industrias Puerto rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
37 12A Club Hípico Vega-Prat Chiguayante LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
38 12B Bremen-Boldos Vega-Prat Chiguayante LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
39 13G 8 Oriente - S. Martin Mall - Trébol - Autopista Directo - Thno PTA. LEONES rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
40 13S Autopista - Mall Tribunales - P. Vald 8 Oriente - Chgte LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
41 14H San Martín Mall-Autopista Directo-Thno San Vicente rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
42 14Z San Martín - Hospital Plaza Acevedo A Las Puertas Term.Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
43 14T Autopista-Mall O'Higgins-Tribunales 8 Oriente - Los Altos - Chgte Coquimbo rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
44 14U O´Higgins Tribunales - P. Valdivia Chgte - O´Higgins - Los Altos Policlinico - Coquimbo rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
45 16I 8 Oriente - San Martín Mall-Autopista Santa Marta - Consultorio San Vicente rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
46 16V Santa Marta - Consultorio Mall - O´Higgins 8 Oriente - Chiguayante LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
47 16H 8 Oriente - San Martín Mall-Autopista S. Marcos - Consultorio San Vicente rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
48 16K M. Montt - Consultorio San Marcos - Mall - Paicavi O'Higgins - 8 Oriente LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
49 17A Centro - O´Higgins P. Valdivia - Prat - Carrera Pza. Acevedo - Penco Chico Cº Verde Bajo rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
50 17O Centro - 8 Oriente San Martín - Hospital Pza. Acevedo - Collao - UBB NONGUEN rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
51 17M Centro - O´Higgins P. Valdivia - Prat - Carrera Pza. Acevedo - Fanaloza MONTAHUE - PENCO rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
52 17W Centro - O´Higgins P.De Valdivia - Chgte Pob. Porvenir LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
53 17X Centro - O´Higgins P. Valdivia - 8 Oriente Chgte. - Pob. Porvenir LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
54 17C Montahue - Centro O´Higgins - P. De valdivia Chgte - Porvenir LEONERA rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
55 18P San Martín Hospital Collao-UBB Palomares rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
56 18Y O´Higgins- Centro P.Devaldivia Chiguayante Hualqui rgb(204,138,0) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
57 20V Puente Llacolén Los Carrera - Mall Autopista-Thno Pta. Los Leones rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
58 20J Puente Llacolén San Martín Mall - Autopista Pta. Los Leones rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
59 20A Autopista-Mall O´Higgins Puente Llacolén Boca Sur rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
60 20L Autopista-Mall Los Carrera Puente Llacolén Boca Sur rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
61 20Z Pioneros- P Llacolén Los Carreras Mall- Autopista Pta. Los Leones rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
62 20W Autopista - Mall Av. Los Carrera Pte Llacolén- Pioneros San Pedro De La Costa rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
63 20T O'carrol - Pioneros Pte. Llacolén - Av. Los Carrera Mall - Autopista Pta. Los Leones rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
64 20M Autopista - Mall O"Higgins - Pte Llacolén Pioneros - O'carrol San Pedro De La Costa rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
65 21Q Puente Llacolén San Martín Hospital-Puertas Term. Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
66 21B Centro-O´Higgins Puente Llacolén Spring Hill Candelaria rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
67 22D O´Higgins Puente Llacolén Boca Sur Michaihue rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
68 22K Puente Llacolén Los Carrera - Collao Ubb-Nonguen Araucana rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
69 22R Puente Llacolén San Martín Hospital-Collao U.Bio Bio rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
70 22S Puente Llacolén S.Martín-Collao Ubb - Nonguén Araucana rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
71 22X Puente Llacolén San Martín Hospital Galvarino rgb(198,0,126) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
72 22J Pioneros - P.Llacolén San Martín Gral Novoa - Los Lirios Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
73 22C O´Higgins Puente Llacolén P.Aguirre Cerda Lomas - Coloane rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
74 22N Los Carrera Puente Llacolén Boca Sur Michaihue rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
75 22E O´Higgins Puente Llacolén Fuera De La Villa Candelaria rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
76 22O Los Carrera Pte. Llacolén Los Pioneros San Pedro De La Costa rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
77 23L Puente Llacolén Los Carrera Collao-UBB Nonguen rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
78 23E Sta.Beatriz - Pioneros Pte. Llacolén Los Carrera PTA. TERMINAL COLLAO rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
79 23V Los Carrera Pte. Llacolén Pioneros - Sta.Beatriz MICHAIHUE rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
80 23A Puente Nuevo Vega-Maipú Hosp. Trabajador Term. Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
81 23P Los Carrera Puente Llacolén Boca Sur Michaihue rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
82 23Q Carrera-Vega Candelaria Boca Sur Michaihue rgb(0,119,73) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
83 23N Los Pioneros Pte. Llacolén Los Carrera Pta. Terminal Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
84 23T Los Carrera Pte. Llacolén Los Pioneros San Pedro De La Costa rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
85 23B Sta. Beatriz-Verluys Pte. Llacolén Los Carrera Pta. Terminal Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
86 23S Los Carrera-Pte.Llacolén V. Victoria-Sta. Beatriz V. San Sebastián Av. Michaihue rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
87 23C S. Henríquez-Escritores Sn. Pedro Viejo - Pte. Bicent Mall Biobío - Los Carrera Pta. Terminal Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
88 23H Los Carrera-Mall Biobío Pte. Bicent.- S. Pedro Viejo Outlet Mall - Los Escritores Silva Henríquez rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
89 24M Villa- P.Llacolén Los Carrera Collao-Los Lirios Los Fresnos rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
90 24T Villa-P.Llacolén San Martín Collao - Los Lirios Los Fresnos rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
91 24F O´Higgins Puente Llacolén Por Villa S.Pedro Candelaria rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
92 24R Los Carrera Puente Llacolén Por Villa S.Pedro Candelaria rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
93 30M Freire - Vega Bremen - Hualpén Lan B - Higueras INDUSTRIAS rgb(155,39,67) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
94 30N Penco Chico Freire - Lan B Bremen - Hualpén INDUSTRIAS rgb(155,39,67) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
95 30R O´Higgins- Prat Vega - Colón V.San Martín Higueras rgb(155,39,67) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
96 30Q O´Higgins- Vega Mall- Autopista V. San Martín Higueras rgb(155,39,67) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
97 30B Colón -Vega Los Carrera Plaza Acevedo Penco Lirquen rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
98 30C Autopista- Mall Freire- Centro Prat- Carrera Penco Lirquen rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
99 30D Hualpén Vega - Carrera Penco - Lirquén RIOS DE CHILE rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
100 30E Hualpén Vega - Prat Carrera - Lirquén PENCO CHICO rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
101 31D O´Higgins-Prat Vga- Colón Talcahuano Lobos Viejos rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
102 31F Colón- Vega Prat -Carrera Penco Lirquen rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
103 32G Colón -Vega Prat- Carrera Penco- Lirquén Rios De Chile rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
104 32E O'higgins - Prat Vega - Colon Talcahuano Lobos Viejos rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
105 32K Hospital Higueras Colón - Vega Montahue - Lirquén RIOS DE CHILE rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
106 32J Lirquén - Montahue O'Higgins - Vega Hospital Higueras LOBOS VIEJOS rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
107 40G Autopista- Mall O´Higgins Puente Llacolén Candelaria rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
108 40B Vega- Maipú P.Acevedo- Ubb Araucana- Valle Nonguen rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
109 40N San Martín Autopista -Mall Lan C- Bremen 4 Esquinas rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
110 40P Freire- Prat Vega- Lan C Bremen -Cañería 4 Esquinas rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
111 41Q Autopista- Mall Paicaví -Freire Prat- Lider Concepción rgb(198,0,126) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
112 41C Vega- Prat Maipú -Paicaví Hospital -Puertas Term. Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
113 41V Prat -Maipú Mall - Autopista Lan C - P.Aylwin Hualpencillo rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
114 41R Centro - Freire Vega- Lan B Los Boldos Hualpencillo rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
115 42U C.Hípico - Vega San Martín Hospital -Puertas Term. Collao rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
116 42F Club Hípico Autopista - Mall O´Higgins- Prat Concepción rgb(198,0,126) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
117 42H Centro -Freire Vega - C.Hipico Finlandia Hualpen - 4 Esq rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
118 42W Prat - Maipú Mall -Autopista Club Hípico Hualpen - 4 Esq rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
119 43T O´Higgins Tucapel - Freire Vega -Bremen Hualpencillo rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
120 43J Vega - Maipú Janequeo C.Henriquez Sta. Sabina rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
121 44E Heras-Rengo Chacab.- C.Henríq. V.Cap.-Torreones Lomas-Mall rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
122 44U Torreones-Freire Vega-Ramuntcho Grecia- D.Portales Hualpencillo rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
123 44A Heras-Rengo Chacabuco C.Henruq.-V.Cap. Lomas-Mall rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
124 44B Freire-Vega Ramuntcho Grecia- D.Portales Hualpencillo rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
125 50S Autopista- Mall O´Higgins Prat- Vega Concepción rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
126 50U Vega -Mall Denavi Sur - Bosque V.S Martín- Estadio Higueras - Gaete rgb(155,39,67) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
127 52A Freire -Prat Vega -Colón Talcahuano Pta. Leones rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
128 52D Colón - Vega Prat -Maipú Collao -UBB Palomares rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
129 56O O´Higgins Vega - Colón Talcahuano Pta. Los Leones rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
130 56V Colón - Vega San Martín Los Lirios - Los Fresnos T. Collao - Hospital rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
131 57Y Autopista - Mall Paicaví O'higgins - Prat CONCEPCIÓN rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
132 57P O'higgins - Prat Vega - Colón Hosp. Higueras SAN VICENTE rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
133 60X Paicaví - Freire Prat - Vega Lan C - Grecia Hualpencillo rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
134 60Y Freire - Vega Lan C - Grecia Consultorio Padre Hurtado rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
135 60Z V.Cap - Ejército A.Pinto - Freire Lider Prat P. Valdivia rgb(137,141,141) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
136 60K Maipú - Paicaví Bº Norte - Santa Sabina Princesas - Lomas Sta. Sabina rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
137 60L Maipú - Paicaví Bº Norte - Princesas Portal - Lomas Sta. Sabina rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
138 60M Maipú -Tucapel Ventus - T. Merino B. Modelo - S. Sabina Consultorio Sta Sabina rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
139 62H Higueras -Colón Vega - Los Carrera Penco- C Verde Lirquen rgb(0,140,149) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
140 62M O´Higgins -Prat Vega -Higueras Hospital SAN VICENTE rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
141 62O Higueras -Colón Vega -Maipú C.Henriquez Villa Cap rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
142 62N O´Higgins- Prat Vega -Higueras Hospital SAN VICENTE rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
143 62V Higueras - St. Marta Vega -Maipú C.Henriquez Villa Cap rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
144 62S O´Higgins- Prat Vega - St. Marta Hospital - Higueras SAN VICENTE rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
145 63I Rengo - Centro Puente Llacolén San Pedro Viejo Recodo rgb(0,119,73) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
146 63K C.Henriquez Freire -Prat Cementerio J.Pablo II rgb(255,199,44) rgb(0,0,0) rgb(255,215,0) rgb(0,0,0)
147 63F Rengo - Centro Chacabuco - Hospital C. Henríquez CHILLANCITO rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
148 63G Puente Llacolén Lincoyán Ejército B.Norte rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
149 63P Prat -Maipú C.Henriquez Villa Cap B. Norte rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
150 63H Chacabuco Hospital - Lincoyán Ejército B. NORTE rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
151 63L Rengo - Chacabuco Hospital - C.Henríquez Andalién - Bellavista San Sebastián rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
152 63B Andalién - C. Henríquez Hospital - Chacabuco Lincoyán - Ejército Barrio Norte rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
153 65Q P.del Río - Maipú P. Acevedo V. Cap - T. Merino STA. SABINA rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
154 65R Prat - Maipú Pelantaro - C. Henriquez V.Cap - Campos Bellavista Sta. Sabina rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
155 65D P. Acevedo - Freire P. del Río Cementerio - Vega P.SAAVEDRA. rgb(255,199,44) rgb(0,0,0) rgb(255,215,0) rgb(0,0,0)
156 65E Freire -Prat Vega- Los Boldos Floresta - P. Hurtado Peñuelas rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
157 65S Costanera - Maipú Pelantaro - C.Henríquez V. Cap - Torreones STA. SABINA rgb(45,41,38) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
158 65F C.Henríquez-Lientur Freire-Costanera Directo Easy Jumbo ALTO COSTANERA rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
159 70I O´Higgins -Vega Colón -Thno P.Arco -N.Lobos Centinela rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
160 70J O´Higgins - Vega Colón - Talcahuano Pte. Arco - N. Los Lobos Los Copihues rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
161 70K O´Higgins -Vega Mall -Autopista Thno -Pte .Arco Los Copihues rgb(203,51,59) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
162 70H Autopista -Mall Carrera -Serrano Maipú - Collao Va.Nonguen rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
163 70F Colon - Vega Maipú - Collao Ubb - Valle Nonguen rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
164 70G Colón - Vega Maipú - Collao UBB - Palomares Km10 rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
165 71I Vega -Maipú Plaza Acevedo Ubb- Zoológico V. Nonguen rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
166 71Z Freire -Prat Hualpencillo Bremen- Cañeria 4 Esquinas - Lenga rgb(236,105,7) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
167 72J O´Higgins P.De Valdivia Clínicas Lonco rgb(137,141,141) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
168 72K O´Higgins Pedro De Valdivia Clinicas Lonco rgb(137,141,141) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
169 72W San Martín Hospital - Collao U.B.B. - Valle NONGUÉN rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
170 72Z San Martín Hospital - Collao U.B.B. VALLE NOBLE rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
171 80K San Martín Mall -Autopista Talcahuano San Vicente rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
172 80L San Martín Mall -Autopista Talcahuano San Vicente rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
173 80H Autopista- Mall O´Higgins Chiguayante Hualqui rgb(204,138,0) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
174 80Z Autopista- Mall O´Higgins Chiguayante Valle Piedra rgb(0,119,200) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
175 80J Santa Josefina San Martin - Mall Autopista - Thno San Vicente rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
176 80Q Autopista- Mall O'higgins - Chgte Santa Josefina Hualqui rgb(204,138,0) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
177 81C Industrias -Lan C Vega -Prat Chiguayante Hualqui rgb(204,138,0) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
178 81S Prat -Vega Hualpencillo Lan C- Industrias Puerto rgb(16,6,159) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
179 90E Alemparte- Maipú A Las Puertas Terminal Collao Los Lagos rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
180 90Y Rengo - Chacab. Hospital Collao -Los Lirios Los Queules rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
181 90J Chacab. -Tucapel Carrera -Prat Alemparte Pq.Central rgb(255,199,44) rgb(0,0,0) rgb(255,215,0) rgb(0,0,0)
182 90X O´Higgins -Prat Maipú - Tucapel Laguna Redonda Pq. Central rgb(255,199,44) rgb(0,0,0) rgb(255,215,0) rgb(0,0,0)
183 B01R San Martín Tucapel EIM Concepción Estación - Tribunales rgb(236,105,7) rgb(0,0,0) rgb(236,105,7) rgb(255,255,255)
184 B01I San Martín Tucapel EIM Concepción Estación - Tribunales rgb(236,105,7) rgb(0,0,0) rgb(236,105,7) rgb(255,255,255)
185 B02R Mall - Paicavi O'Higgins Lider Prat Centro Concepción rgb(236,105,7) rgb(0,0,0) rgb(236,105,7) rgb(255,255,255)
186 B02I San Martín Paicaví - Mall Brisas Del Sol Mall - Casino rgb(236,105,7) rgb(0,0,0) rgb(236,105,7) rgb(255,255,255)
187 B02I San Martín Paicaví - Mall Brisas Del Sol 300r rgb(236,105,7) rgb(0,0,0) rgb(0,0,0) rgb(0,0,0)
188 300r Concepción Vega Monumental Ruta 160 Lota rgb(0,30,96) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
189 300r Concepción Vega Monumental Ruta 160 301r rgb(0,30,96) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
190 301r Concepción Vega Monumental Ruta 160 Lota rgb(0,30,96) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
191 301r Concepción Vega Monumental Ruta 160 302r rgb(0,30,96) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
192 302r Concepción Vega Monumental Ruta 160 Lota rgb(0,30,96) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
193 302r Concepción Vega Monumental Ruta 160 303r rgb(0,30,96) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
194 303r Concepción Vega Monumental Ruta 160 Lota rgb(0,30,96) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
195 303r Concepción Vega Monumental Ruta 160 304r rgb(0,30,96) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
196 304r Concepción Vega Monumental Ruta 160 Lota rgb(0,30,96) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
197 304r Concepción Vega Monumental Ruta 160 305r rgb(0,30,96) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
198 305r Concepción Vega Monumental Ruta 160 Colcura rgb(0,30,96) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
199 305r Concepción Vega Monumental Ruta 160 300i rgb(0,30,96) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
200 300i Lota-Coronel Ruta 160 Pte. Juan Pablo II Concepción rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
201 300i Lota-Coronel Ruta 160 Pte. Juan Pablo II 301i rgb(152,29,151) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
202 301i Lota-Coronel Ruta 160 Pte. Juan Pablo II Concepción rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
203 301i Lota-Coronel Ruta 160 Pte. Juan Pablo II 302i rgb(152,29,151) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
204 302i Lota-Coronel Ruta 160 Pte. Juan Pablo II Concepción rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
205 302i Lota-Coronel Ruta 160 Pte. Juan Pablo II 303i rgb(152,29,151) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
206 303i Lota-Coronel Ruta 160 Pte. Juan Pablo II Concepción rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
207 303i Lota-Coronel Ruta 160 Pte. Juan Pablo II 304i rgb(152,29,151) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
208 304i Lota-Coronel Ruta 160 Pte. Juan Pablo II Concepción rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
209 304i Lota-Coronel Ruta 160 Pte. Juan Pablo II 305i rgb(152,29,151) rgb(255,255,255) rgb(0,0,0) rgb(0,0,0)
210 305i Lota - Coronel Ruta 160 Pte. Juan Pablo II Concepción rgb(152,29,151) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
211 201i Est Biotrén JP II Vega Monumental Av. Los Carrera CONCEPCIÓN rgb(198,0,126) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)
212 201r Colo Colo Vega Monumental Av. Pedro de Valdivia SANTA JUANA rgb(59,162,220) rgb(255,255,255) rgb(255,215,0) rgb(0,0,0)

62
docs/LUR.py 100644
View File

@ -0,0 +1,62 @@
import openpyxl
import warnings
import csv
warnings.filterwarnings("ignore")
def read_excel():
# Ruta al archivo Excel (puedes ajustar esto según tu estructura de archivos)
file_path = 'paletas.xlsx'
# Abre el archivo Excel
wb = openpyxl.load_workbook(file_path, data_only=True)
# Selecciona una hoja específica o la hoja activa (por defecto)
sheet = wb['LUR'] # Puedes usar wb['NombreDeLaHoja'] para seleccionar una hoja específica
# Itera a través de las filas y columnas del archivo Excel
texto1 = ''
texto2 = ''
texto3 = ''
texto4 = ''
bgcolor1 = ''
bgcolor2 = ''
color1 = ''
color2 = ''
archivo_csv = 'LUR.csv'
with open(archivo_csv, 'w', newline='', encoding='latin-1') as f:
escritor = csv.writer(f, delimiter=';', quoting=csv.QUOTE_ALL)
escritor.writerow(['codigo','texto1','texto2','texto3','texto4','bgcolor1','color1','bgcolor2','color2'])
for row in sheet.iter_rows(values_only=True):
if row[0] is not None:
codigo = row[0]
texto1 = ''
texto2 = ''
texto3 = ''
texto4 = ''
if texto1 == '':
texto1 = row[3] or ''
bgcolor1 = f'rgb({row[5] or 0},{row[6] or 0},{row[7] or 0})'
color1 = f'rgb({row[9] or 0},{row[10] or 0},{row[11] or 0})'
elif texto2 == '':
texto2 = row[3] or ''
elif texto3 == '':
texto3 = row[3] or ''
else:
texto4 = row[3] or ''
bgcolor2 = f'rgb({row[5] or 0},{row[6] or 0},{row[7] or 0})'
color2 = f'rgb({row[9] or 0},{row[10] or 0},{row[11] or 0})'
if texto4 != '':
escritor.writerow([codigo,texto1,texto2,texto3,texto4,bgcolor1,color1,bgcolor2,color2])
# No olvides cerrar el archivo después de usarlo
wb.close()
# Tu código para renderizar una respuesta, redireccionar, o lo que necesites
read_excel()

BIN
docs/paletas.xlsx 100644

Binary file not shown.

View File

@ -0,0 +1,81 @@
@server = http://localhost:3000/api
@token = {{login.response.body.$.token}}
###
# @name login
POST {{server}}/auth/
Content-Type: application/json
{
"username": "usuario1",
"password": "usuario1"
}
###
# @name list
GET {{server}}/dispositivos?id_paradero=39530
Authorization: Bearer {{token}}
###
# @name url_public_paradero
GET {{server}}/paraderos/info-public/39530
Authorization: Bearer {{token}}
###
# @name whoami_existente
POST {{server}}/dispositivos/whoami/
Authorization: Bearer {{token}}
Content-Type: application/json
{
"whoami": {
"idDispositivo": "TTM543870hyt",
"KeyAutorizacion": "token"
}
}
###
# @name whoami_no_existe
POST {{server}}/dispositivos/whoami/
Authorization: Bearer {{token}}
Content-Type: application/json
{
"whoami": {
"idDispositivo": "otro",
"KeyAutorizacion": "token"
}
}
###
# @name get_info_device
POST {{server}}/dispositivos/getInfoDevice/
Authorization: Bearer {{token}}
Content-Type: application/json
{
"GetInfoDevice": {
"idDispositivo": "TTM543870hyt",
"KeyAutorizacion":"token"
}
}
###
GET {{server}}/lineas/proto?id_paradero=45086
Authorization: Bearer {{token}}
###
GET {{server}}/lineas/buses_proto/?id_linea=730-0
Authorization: Bearer {{token}}

View File

@ -0,0 +1,21 @@
@server = http://localhost:4000/api
@token = {{login.response.body.$.token}}
###
# @name login
POST {{server}}/auth/
Content-Type: application/json
{
"username": "0",
"password": "0"
}
###
GET {{server}}/letreros-lur
Authorization: Bearer {{token}}
###
GET {{server}}/letreros-lur/50U
Authorization: Bearer {{token}}

View File

@ -0,0 +1,26 @@
@server = http://localhost:4000/api
@token = {{login.response.body.$.token}}
###
# @name login
POST {{server}}/auth/
Content-Type: application/json
{
"username": "0",
"password": "0"
}
###
GET {{server}}/auth/
Authorization: Bearer {{token}}
###
GET {{server}}/aplicaciones/?ordering=-id_aplicacion
Authorization: Bearer {{token}}
###
GET {{server}}/paraderos-image/??id_paradero=42318
Authorization: Bearer {{token}}

View File

@ -0,0 +1,18 @@
@server = http://localhost:3000/api
@token = {{login.response.body.$.token}}
###
# @name login
POST {{server}}/auth/
Content-Type: application/json
{
"username": "usuario1",
"password": "usuario1"
}
###
# @name protodata
GET {{server}}/proto/status
Authorization: Bearer {{token}}

View File

View File

@ -0,0 +1,18 @@
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
# Register your models here.
# admin.site.register(Usuario)
# admin.site.register(UsuarioRol)
# admin.site.register(Persona)
# admin.site.register(TipoTratamientoPersona)
# admin.site.register(Rol)
# admin.site.register(RolAplicacion)
# admin.site.register(Aplicacion)
@admin.register(models.ParaderoImagen)
class ParaderoImagenAdmin(admin.ModelAdmin):
search_fields = ('id_paradero',)

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api'

View File

@ -0,0 +1,9 @@
from rest_framework.exceptions import APIException
class NotAuthorized(APIException):
status_code = 401
default_detail = 'Acceso negado'
class JWTExpired(APIException):
status_code = 400
default_detail = 'Token ya no es valido'

View File

@ -0,0 +1,60 @@
from django.urls import resolve
from django.http import HttpResponse
from .models import Usuario, Persona
from decouple import config
import jwt
import logging
private_key = config('SECRET_JWT')
class ApiMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# se omite esta regla si no es api
if request.path[0:5] != '/api/':
response = self.get_response(request)
return response
# se omite esta regla en login
if request.path == '/api/auth/' and request.method == 'POST':
response = self.get_response(request)
return response
match = resolve(request.path)
logging.error(match)
# se omite esta regla al mostrar imagen de paradero
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)
authorization = request.headers.get('Authorization').split(' ')
token = authorization[1]
try:
decoded = jwt.decode(token, private_key, algorithms=["HS256"])
except jwt.ExpiredSignatureError:
return HttpResponse('token ya no es valido', status = 400)
except jwt.InvalidTokenError:
return HttpResponse('token es invalido', status = 400)
if decoded['login'] != '0':
usuario = Usuario.objects.filter(login = decoded['login'], vigente = True).values().first()
if not usuario:
return HttpResponse('Usuario ya no vigente', status = 400)
persona = Persona.objects.filter(rut = usuario['rut_id']).values().first()
if not persona:
return HttpResponse('No existe información de la persona', status = 500)
request.jwt_info = { 'login': usuario['login'], 'persona': persona }
else:
request.jwt_info = { 'login': '0', 'persona': None }
response = self.get_response(request)
return response

View File

@ -0,0 +1,416 @@
# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
# * Rearrange models' order
# * Make sure each model has one field with primary_key=True
# * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models
from .validaciones import rut_valido
class Aplicacion(models.Model):
id_aplicacion = models.IntegerField(primary_key=True)
nombre_app = models.CharField(max_length=100, blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
class Meta:
managed = False
db_table = 'aplicacion'
class Comuna(models.Model):
id_comuna = models.IntegerField(primary_key=True)
id_region = models.ForeignKey('Region', models.DO_NOTHING, db_column='id_region', blank=True, null=True)
nombre_comuna = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'comuna'
class Conductor(models.Model):
patente = models.OneToOneField('Vehiculo', models.DO_NOTHING, db_column='patente', primary_key=True)
rut = models.ForeignKey('Persona', models.DO_NOTHING, db_column='rut', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
class Meta:
managed = False
db_table = 'conductor'
class Dispositivo(models.Model):
id_dispositivo = models.CharField(primary_key=True, max_length=100)
id_paradero = models.ForeignKey('Paradero', models.DO_NOTHING, db_column='id_paradero', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
ultima_conexion = models.DateField(blank=True, null=True)
id_tipo_dispositivo = models.ForeignKey('TipoDispositivo', models.DO_NOTHING, db_column='id_tipo_dispositivo')
class Meta:
managed = False
db_table = 'dispositivo'
class Funcionario(models.Model):
rut = models.OneToOneField('Persona', models.DO_NOTHING, db_column='rut', primary_key=True)
id_operador = models.ForeignKey('Operador', models.DO_NOTHING, db_column='id_operador', blank=True, null=True)
desde = models.DateField(blank=True, null=True)
hasta = models.DateField(blank=True, null=True)
class Meta:
managed = False
db_table = 'funcionario'
class GtfsFrequencie(models.Model):
id_trip = models.ForeignKey('GtfsTrips', models.DO_NOTHING, db_column='id_trip', blank=True, null=True)
start_time = models.TimeField(blank=True, null=True)
end_time = models.TimeField(blank=True, null=True)
headway_secs = models.IntegerField(blank=True, null=True)
exact_time = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'gtfs_frequencie'
class GtfsPosiciones(models.Model):
id = models.UUIDField(primary_key=True)
trip_id = models.UUIDField()
route_id = models.IntegerField()
direction_id = models.SmallIntegerField(blank=True, null=True)
start_time = models.TimeField(blank=True, null=True)
start_date = models.DateField(blank=True, null=True)
schedule_relationship = models.SmallIntegerField(blank=True, null=True)
vehicle_license_plate = models.CharField(max_length=10, blank=True, null=True)
latitude = models.FloatField(blank=True, null=True)
longitude = models.FloatField(blank=True, null=True)
bearing = models.IntegerField(blank=True, null=True)
odometer = models.IntegerField(blank=True, null=True)
speed = models.FloatField(blank=True, null=True)
stop_sequence = models.IntegerField(blank=True, null=True)
stop_id = models.IntegerField(blank=True, null=True)
arrival_time = models.BigIntegerField(blank=True, null=True)
hora_llegada = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'gtfs_posiciones'
class GtfsRouteType(models.Model):
id_route_type = models.DecimalField(primary_key=True, max_digits=2, decimal_places=0)
descripcion = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'gtfs_route_type'
class GtfsShape(models.Model):
id_shape = models.DecimalField(max_digits=18, decimal_places=0)
shape_pt_lat = models.FloatField(blank=True, null=True)
shape_pt_lon = models.FloatField(blank=True, null=True)
shape_pt_sequence = models.IntegerField(blank=True, null=True)
shape_dist_traveled = models.FloatField(blank=True, null=True)
id_gtfs_pk = models.AutoField(primary_key=True)
class Meta:
managed = False
db_table = 'gtfs_shape'
unique_together = (('id_shape', 'shape_dist_traveled'),)
class GtfsStopTimes(models.Model):
id_paradero = models.OneToOneField('Paradero', models.DO_NOTHING, db_column='id_paradero', primary_key=True) # The composite primary key (id_paradero, id_trip) found, that is not supported. The first column is selected.
id_trip = models.ForeignKey('GtfsTrips', models.DO_NOTHING, db_column='id_trip')
arrival_time = models.CharField(max_length=15, blank=True, null=True)
stop_sequence = models.IntegerField(blank=True, null=True)
stop_headsign = models.CharField(max_length=100, blank=True, null=True)
departure_time = models.CharField(max_length=15, blank=True, null=True)
drop_off_type = models.IntegerField(blank=True, null=True)
shape_dist_traveled = models.FloatField(blank=True, null=True)
timepoint = models.IntegerField(blank=True, null=True)
pickup_type = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'gtfs_stop_times'
unique_together = (('id_paradero', 'id_trip'),)
class GtfsTrips(models.Model):
id_trip = models.CharField(primary_key=True, max_length=150)
id_linea = models.CharField(max_length=150, blank=True, null=True)
id_shape = models.IntegerField(blank=True, null=True)
id_trip_regreso = models.ForeignKey('self', models.DO_NOTHING, db_column='id_trip_regreso', blank=True, null=True)
trip_headsign = models.CharField(max_length=100, blank=True, null=True)
trip_short_name = models.CharField(max_length=100, blank=True, null=True)
direction_id = models.IntegerField(blank=True, null=True)
service_id = models.CharField(max_length=50, blank=True, null=True, db_comment='de calendario')
block_id = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'gtfs_trips'
class LetreroLUR(models.Model):
codigo = models.CharField(primary_key=True, max_length=10)
linea1 = models.CharField(max_length=50)
linea2 = models.CharField(max_length=50, blank=True, null=True)
linea3 = models.CharField(max_length=50, blank=True, null=True)
linea4 = models.CharField(max_length=50, blank=True, null=True)
bgcolor1 = models.CharField(max_length=20, blank=True, null=True)
color1 = models.CharField(max_length=20, blank=True, null=True)
bgcolor2 = models.CharField(max_length=20, blank=True, null=True)
color2 = models.CharField(max_length=20, blank=True, null=True)
class Meta:
managed = False
db_table = 'letrero_lur'
class Linea(models.Model):
id_linea = models.CharField(primary_key=True, max_length=150)
id_operador = models.ForeignKey('Operador', models.DO_NOTHING, db_column='id_operador', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
route_short_name = models.CharField(max_length=150, blank=True, null=True)
route_desc = models.CharField(max_length=150, blank=True, null=True)
route_type = models.ForeignKey(GtfsRouteType, models.DO_NOTHING, db_column='route_type', blank=True, null=True)
route_url = models.CharField(max_length=150, blank=True, null=True)
route_color = models.CharField(max_length=150, blank=True, null=True)
route_text_color = models.CharField(max_length=150, blank=True, null=True)
route_long_name = models.CharField(max_length=200, blank=True, null=True)
class Meta:
managed = False
db_table = 'linea'
class LineaParadero(models.Model):
id_linea_paradero = models.AutoField(primary_key=True)
id_linea = models.ForeignKey(Linea, models.DO_NOTHING, db_column='id_linea')
id_paradero = models.ForeignKey('Paradero', models.DO_NOTHING, db_column='id_paradero', blank=True, null=True)
class Meta:
managed = False
db_table = 'linea_paradero'
class Operador(models.Model):
id_operador = models.CharField(primary_key=True, max_length=150)
id_region = models.ForeignKey('Region', models.DO_NOTHING, db_column='id_region', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
nombre_operador = models.CharField(max_length=150, blank=True, null=True)
agency_url = models.CharField(max_length=200, blank=True, null=True)
agency_timezone = models.CharField(max_length=200, blank=True, null=True)
agency_lang = models.CharField(max_length=50, blank=True, null=True)
agency_phone = models.CharField(max_length=50, blank=True, null=True)
agency_fare_url = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'operador'
class Paradero(models.Model):
id_paradero = models.CharField(primary_key=True, max_length=50)
id_comuna = models.ForeignKey(Comuna, models.DO_NOTHING, db_column='id_comuna', blank=True, null=True)
id_tipo_paradero = models.ForeignKey('TipoParadero', models.DO_NOTHING, db_column='id_tipo_paradero', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
stop_code = models.CharField(max_length=100, blank=True, null=True)
stop_name = models.CharField(max_length=100, blank=True, null=True)
stop_desc = models.CharField(max_length=300, blank=True, null=True)
stop_lat = models.FloatField(blank=True, null=True)
stop_lon = models.FloatField(blank=True, null=True)
zone_id = models.CharField(max_length=200, blank=True, null=True)
stop_url = models.CharField(max_length=200, blank=True, null=True)
location_type = models.CharField(max_length=200, blank=True, null=True)
parent_station = models.CharField(max_length=200, blank=True, null=True)
stop_timezonene_id = models.CharField(max_length=200, blank=True, null=True)
wheelchair_boarding = models.DecimalField(max_digits=2, decimal_places=0, blank=True, null=True)
class Meta:
managed = False
db_table = 'paradero'
class ParaderoImagen(models.Model):
id_paradero_imagen = models.AutoField(primary_key=True)
id_paradero = models.ForeignKey(Paradero, models.DO_NOTHING, db_column='id_paradero')
imagen = models.BinaryField(blank=True, null=True)
content_type = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'paradero_imagen'
class Persona(models.Model):
rut = models.DecimalField(primary_key=True, max_digits=12, decimal_places=0)
id_tipo_tratamiento = models.ForeignKey('TipoTratamientoPersona', models.DO_NOTHING, db_column='id_tipo_tratamiento', blank=True, null=True)
id_comuna = models.ForeignKey(Comuna, models.DO_NOTHING, db_column='id_comuna', blank=True, null=True)
dv = models.CharField(max_length=1, blank=True, null=True)
nombres = models.CharField(max_length=100, blank=True, null=True)
apellido_a = models.CharField(max_length=100, blank=True, null=True)
apellido_b = models.CharField(max_length=100, blank=True, null=True)
fono = models.CharField(max_length=100, blank=True, null=True)
email = models.CharField(max_length=100, blank=True, null=True)
fecha_nacimiento = models.DateField(blank=True, null=True)
direccion = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'persona'
def save(self, *args, **kwargs):
# validacion se realiza solo si se esta creando el registro
if self._state.adding:
rut_completo = f'{self.rut}-{self.dv}'
if not rut_valido(rut_completo):
raise Exception(f'RUT {rut_completo}, no es valido!')
super().save(*args, **kwargs)
class Region(models.Model):
id_region = models.IntegerField(primary_key=True)
nombre_region = models.CharField(max_length=100)
class Meta:
managed = False
db_table = 'region'
class Rol(models.Model):
id_rol = models.IntegerField(primary_key=True)
nombre_rol = models.CharField(max_length=100)
class Meta:
managed = False
db_table = 'rol'
class RolAplicacion(models.Model):
id_aplicacion = models.ForeignKey(Aplicacion, models.DO_NOTHING, db_column='id_aplicacion')
id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol')
solo_visualizar = models.BooleanField(blank=True, null=True)
id_rol_app = models.AutoField(primary_key=True)
class Meta:
managed = False
db_table = 'rol_aplicacion'
unique_together = (('id_aplicacion', 'id_rol'),)
class SpatialRefSys(models.Model):
srid = models.IntegerField(primary_key=True)
auth_name = models.CharField(max_length=256, blank=True, null=True)
auth_srid = models.IntegerField(blank=True, null=True)
srtext = models.CharField(max_length=2048, blank=True, null=True)
proj4text = models.CharField(max_length=2048, blank=True, null=True)
class Meta:
managed = False
db_table = 'spatial_ref_sys'
class TipoDispositivo(models.Model):
id_tipo_dispositivo = models.IntegerField(primary_key=True)
descripcion = models.CharField(max_length=50)
class Meta:
managed = False
db_table = 'tipo_dispositivo'
class TipoParadero(models.Model):
id_tipo_paradero = models.IntegerField(primary_key=True)
descripcion = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'tipo_paradero'
class TipoTransporte(models.Model):
id_tipo_transporte = models.IntegerField(primary_key=True)
descripcion = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'tipo_transporte'
class TipoTratamientoPersona(models.Model):
id_tipo_tratamiento = models.IntegerField(primary_key=True)
tratamiento = models.CharField(max_length=50, blank=True, null=True)
class Meta:
managed = False
db_table = 'tipo_tratamiento_persona'
db_table_comment = 'Establece el tratamiento de como dirigirse hacia una persona:\r\nEjemplo\r\nSeñor\r\nSeñora\r\nSrta'
class TipoVehiculo(models.Model):
id_tipo_vehiculo = models.IntegerField(primary_key=True)
descripcion = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = False
db_table = 'tipo_vehiculo'
class Usuario(models.Model):
login = models.CharField(primary_key=True, max_length=60)
rut = models.ForeignKey(Persona, models.DO_NOTHING, db_column='rut', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
superuser = models.BooleanField(blank=True, null=True)
class Meta:
managed = False
db_table = 'usuario'
class UsuarioClave(models.Model):
login = models.OneToOneField(Usuario, models.DO_NOTHING, db_column='login', primary_key=True)
clave = models.CharField(max_length=60, blank=True, null=True)
clave_anterior = models.CharField(max_length=60, blank=True, null=True)
fecha_modificacion = models.DateField(blank=True, null=True)
codigo = models.DecimalField(max_digits=8, decimal_places=0, blank=True, null=True)
class Meta:
managed = False
db_table = 'usuario_clave'
class UsuarioRol(models.Model):
login = models.ForeignKey(Usuario, models.DO_NOTHING, db_column='login', blank=True, null=True)
id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
class Meta:
managed = False
db_table = 'usuario_rol'
class Vehiculo(models.Model):
ppu = models.CharField(primary_key=True, max_length=10)
id_tipo_vehiculo = models.ForeignKey(TipoVehiculo, models.DO_NOTHING, db_column='id_tipo_vehiculo', blank=True, null=True)
vigente = models.BooleanField(blank=True, null=True)
class Meta:
managed = False
db_table = 'vehiculo'
class VehiculoLinea(models.Model):
patente = models.OneToOneField(Vehiculo, models.DO_NOTHING, db_column='patente', primary_key=True) # The composite primary key (patente, id_linea) found, that is not supported. The first column is selected.
id_linea = models.ForeignKey(Linea, models.DO_NOTHING, db_column='id_linea')
vigente = models.BooleanField(blank=True, null=True)
class Meta:
managed = False
db_table = 'vehiculo_linea'
unique_together = (('patente', 'id_linea'),)

View File

@ -0,0 +1,43 @@
from rest_framework.schemas import AutoSchema
import coreapi
class AuthSchema(AutoSchema):
manual_fields = []
def get_manual_fields(self, path, method):
custom_fields = []
if method.lower() == 'post':
custom_fields = [
coreapi.Field('username', required=True, location='form', description='Usuario'),
coreapi.Field('password', required=True, location='form', description='Contraseña'),
]
return self._manual_fields + custom_fields
class UsuarioSchema(AutoSchema):
manual_fields = []
def get_manual_fields(self, path, method):
custom_fields = []
if method.lower() == 'post':
custom_fields = [
coreapi.Field('rut', required=True, location='form', description='RUT'),
coreapi.Field('nombres', required=True, location='form', description='Nombres'),
coreapi.Field('apellido_a', required=True, location='form', description='Apellido A'),
coreapi.Field('apellido_b', required=True, location='form', description='Apellido B'),
coreapi.Field('email', required=True, location='form', description='Correo Electrónico'),
coreapi.Field('login', required=True, location='form', description='Usuario'),
coreapi.Field('clave', required=True, location='form', description='Contraseña'),
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

@ -0,0 +1,132 @@
from rest_framework import serializers
from django.forms.models import model_to_dict
from django.core.serializers import serialize
from . import models
class AplicacionSerializer(serializers.ModelSerializer):
class Meta:
model = models.Aplicacion
fields = '__all__'
class DispositivoSerializer(serializers.ModelSerializer):
tipo_dispositivo = serializers.SerializerMethodField()
def get_tipo_dispositivo(self, row):
return model_to_dict(row.id_tipo_dispositivo)
class Meta:
model = models.Dispositivo
fields = '__all__'
class TipoDispositivoSerializer(serializers.ModelSerializer):
class Meta:
model = models.TipoDispositivo
fields = '__all__'
class TipoParaderoSerializer(serializers.ModelSerializer):
class Meta:
model = models.TipoParadero
fields = '__all__'
class TipoTransporteSerializer(serializers.ModelSerializer):
class Meta:
model = models.TipoTransporte
fields = '__all__'
class TipoVehiculoSerializer(serializers.ModelSerializer):
class Meta:
model = models.TipoVehiculo
fields = '__all__'
class TipoTratamientoPersonaSerializer(serializers.ModelSerializer):
class Meta:
model = models.TipoTratamientoPersona
fields = '__all__'
class PersonaSerializer(serializers.ModelSerializer):
class Meta:
model = models.Persona
fields = '__all__'
class ComunaSerializer(serializers.ModelSerializer):
class Meta:
model = models.Comuna
fields = '__all__'
class RegionSerializer(serializers.ModelSerializer):
class Meta:
model = models.Region
fields = '__all__'
class ParaderoSerializer(serializers.ModelSerializer):
class Meta:
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
fields = '__all__'
class LineaSerializer(serializers.ModelSerializer):
class Meta:
model = models.Linea
fields = '__all__'
class LineaParaderoSerializer(serializers.ModelSerializer):
class Meta:
model = models.LineaParadero
fields = '__all__'
class UsuarioSerializer(serializers.ModelSerializer):
# muestro informacion de persona en un objeto aparte
persona = serializers.SerializerMethodField()
class Meta:
model = models.Usuario
fields = '__all__'
read_only_fields = ['login']
def get_persona(self, row):
return model_to_dict(row.rut)
def to_representation(self, instance):
representation = super().to_representation(instance)
# Elimina el campo que deseas después de la actualización
if 'clave' in representation:
del representation['clave']
return representation
class AuthSerializer(serializers.Serializer):
username = serializers.CharField(required=True)
password = serializers.CharField(required=True, style={'input_type':'password'})
class RolSerializer(serializers.ModelSerializer):
class Meta:
model = models.Rol
fields = '__all__'
class RolAplicacionSerializer(serializers.ModelSerializer):
class Meta:
model = models.RolAplicacion
fields = '__all__'
class LetreroLUR_Serializer(serializers.ModelSerializer):
class Meta:
model = models.LetreroLUR
fields = '__all__'

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,38 @@
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, paradero, rol, rolaplicacion
from api.views import mapa, linea, letrero_lur, operador
from api.views import paradero_imagen, linea_paradero
from api.views import dispositivo
from api.views import proto
router = routers.DefaultRouter()
router.register('aplicaciones', aplicacion.AplicacionViewSet)
router.register('usuarios', usuario.UsuarioViewSet)
router.register('personas', persona.PersonaViewSet)
router.register('dispositivos', dispositivo.DispositivoViewSet)
router.register('tipos/persona', tipo.TipoTratamientoPersonaViewSet)
router.register('tipos/transporte', tipo.TipoTransporteViewSet)
router.register('tipos/dispositivo', tipo.TipoDispositivoViewSet)
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)
router.register('paraderos-image', paradero_imagen.ParaderoImagenListView, basename='paradero_imagen')
router.register('lineas', linea.LineaViewSet)
router.register('lineas-paradero', linea_paradero.LineaParaderoViewSet)
router.register('letreros-lur', letrero_lur.LetreroLUR_ViewSet)
router.register('operadores', operador.OperadorViewSet)
router.register('roles', rol.RolViewSet)
router.register('rolyaplicacion', rolaplicacion.RolAplicacionViewSet, basename='rol_aplicacion')
urlpatterns = [
path('', include(router.urls)),
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/info-public/<int:pk>/', paradero.info_public, name='paradero-infopublic'),
path('proto/status/', proto.status, name='proto_status'),
]

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,20 @@
def rut_valido(rut):
rut = rut.replace(".", "").replace("-", "") # Eliminar puntos y guiones
if len(rut) < 2:
return False
verificador = rut[-1]
numero = rut[:-1]
try:
suma = 0
contador = 0
for i in range(len(numero) - 1, -1, -1):
suma += int(numero[i]) * (2 + contador)
contador = (contador + 1) % 6
digito_verificador = 11 - suma % 11
if digito_verificador == 11:
digito_verificador = 0
if digito_verificador == 10:
digito_verificador = "k"
return str(digito_verificador) == verificador.lower()
except ValueError:
return False

View File

View File

@ -0,0 +1,7 @@
from rest_framework import viewsets
from .. import models, serializers
class AplicacionViewSet(viewsets.ModelViewSet):
queryset = models.Aplicacion.objects.all()
serializer_class = serializers.AplicacionSerializer
ordering_fields = '__all__'

View File

@ -0,0 +1,58 @@
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.http import JsonResponse
from rest_framework.decorators import action, api_view, schema
from .. import models, schemas
from decouple import config
import json
import jwt
from datetime import datetime, timedelta
import logging
private_key = config('SECRET_JWT')
# Views jwt
@csrf_exempt
@action(detail=False, methods=['post','get'])
@api_view(['GET','POST'])
@schema(schemas.AuthSchema())
def jwt_login(request):
if request.method == 'POST':
count = models.Usuario.objects.filter(vigente = True).count()
logging.error(f'count usuario vigente = {count}')
# validar username y password
input = json.loads(request.body)
username = input['username']
password = input['password']
usuario = None
if count > 0:
usuario = models.Usuario.objects.filter(login = username, vigente = True).values().first()
elif username == '0' and password == '0':
usuario = { 'login': '0', 'clave': '0' }
if not usuario:
return HttpResponse('Acceso no valido', status=400)
if username != '0':
clave = models.UsuarioClave.objects.filter(login = username).first()
if not clave or clave.clave != password:
return HttpResponse('Acceso no valido', status=400)
ahora = datetime.utcnow()
manana = ahora + timedelta(days=1)
manana = manana.replace(hour=0, minute=0, second=0, microsecond=0)
payload = {
'iat': ahora,
'exp': manana, # ahora + timedelta(minutes=60),
'login': usuario['login']
}
token = jwt.encode(payload, private_key, algorithm="HS256")
return JsonResponse({ 'token': token })
elif request.method == 'GET':
return JsonResponse(request.jwt_info)

View File

@ -0,0 +1,17 @@
from rest_framework import viewsets
from .. import models, serializers
from django.db import models as dj_models
class ComunaViewSet(viewsets.ModelViewSet):
queryset = models.Comuna.objects.all()
serializer_class = serializers.ComunaSerializer
def create(self, request, *args, **kwargs):
# se indica que si no se indico el id, entonces sea el maximo + 1
if not request.data.get('id_comuna', None):
max_id = models.Comuna.objects.aggregate(dj_models.Max('id_comuna'))['id_comuna__max']
new_id = max_id + 1 if max_id is not None else 1
request.data['id_comuna'] = new_id
return super().create(request, *args, **kwargs)

View File

@ -0,0 +1,89 @@
from rest_framework import viewsets
from django.http import JsonResponse
from django.db.models import F
from django.db import connection
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.decorators import action
from .. import models, serializers
import json
import logging
class DispositivoViewSet(viewsets.ModelViewSet):
queryset = models.Dispositivo.objects.all()
serializer_class = serializers.DispositivoSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id_paradero', 'id_tipo_dispositivo']
@action(detail=False, methods=['post'])
def whoami(self, request, pk=None):
input = json.loads(request.body)
whoami = input['whoami']
record = models.Paradero.objects \
.filter(dispositivo__id_dispositivo=whoami['idDispositivo']) \
.annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
.first()
if (record):
return JsonResponse({
"WhoamiResponse": {
"NroParadero": record.nro_paradero,
"NombreParadero": record.nombre_paradero,
"Status": "OK"
}
})
# retorna json de no existente
return JsonResponse({
"WhoamiResponse": {
"Status": "NOK",
"errorString": "Dispositivo no identificado"
}
})
@action(detail=False, methods=['post'])
def getInfoDevice(self, request, pk=None):
input = json.loads(request.body)
getInfoDevice = input['GetInfoDevice']
record = models.Paradero.objects \
.filter(dispositivo__id_dispositivo=getInfoDevice['idDispositivo']) \
.annotate(nro_paradero=F('id_paradero'), nombre_paradero=F('stop_name')) \
.first()
query = "SELECT json_data \
from gtfs_posiciones_json \
where stop_id = %s"
params = [ record.nro_paradero ]
with connection.cursor() as cursor:
cursor.execute(query, params)
row = cursor.fetchone()
connection.close()
detalle_lineas = []
for linea in row[0]:
# logging.error(linea['linea'])
data_linea = {
'Linea': linea['linea'],
'Descripcion': linea['Descripcion'],
'TipoLocomocion': linea['tipo_locomocion'],
'colorFondo': linea['colorFondo'],
'colorLetra': linea['colorLetra'],
'Llegadas': linea['Llegadas']
}
detalle_lineas.append(data_linea)
return JsonResponse({
"GetInfoDeviceResponse": {
"DetalleLineas": detalle_lineas,
"MensajeParadero": "No considerar, uso futuro"
}
})

View File

@ -0,0 +1,9 @@
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from .. import models, serializers
class LetreroLUR_ViewSet(viewsets.ModelViewSet):
queryset = models.LetreroLUR.objects.all()
serializer_class = serializers.LetreroLUR_Serializer

View File

@ -0,0 +1,116 @@
from rest_framework import viewsets
# from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
from django.db import connection
from .. import models, serializers
from django.http import JsonResponse
import logging
class LineaViewSet(viewsets.ModelViewSet):
queryset = models.Linea.objects.all()
serializer_class = serializers.LineaSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id_operador', 'route_short_name', 'route_long_name', 'vigente']
@action(detail=False, methods=['get'])
def proto(self, request, pk=None):
id_paradero = request.GET['id_paradero']
query = "SELECT json_data \
from gtfs_posiciones_json \
where stop_id = %s"
with connection.cursor() as cursor:
cursor.execute(query, [ id_paradero ])
row = cursor.fetchone()
return JsonResponse(row[0], safe=False)
@action(detail=False, methods=['get'])
def paraderos(self, request, pk=None):
pk = request.GET['id_linea']
paraderos = models.Paradero.objects \
.filter(vigente=True, lineaparadero__id_linea=pk) \
.values('id_paradero','stop_lat','stop_lon','stop_name') \
.all()
return JsonResponse(list(paraderos), safe=False)
@action(detail=False, methods=['get'])
def buses(self, request, pk=None):
pk = request.GET['id_linea']
query = "SELECT distinct \
l.route_color, \
l.route_text_color, \
gp.vehicle_license_plate as Patente_vehiculo, \
speed::numeric(5,2) as speed, \
gp.longitude::numeric, \
gp.latitude::numeric \
from gtfs_posiciones gp \
inner join linea l on (trim(gp.route_id)||'-'||trim(gp.direction_id::varchar)) = l.id_linea \
where l.id_linea = %s"
with connection.cursor() as cursor:
cursor.execute(query, [ pk ])
rows = cursor.fetchall()
buses = []
for row in rows:
buses.append({
'route_color': row[0],
'route_text_color': row[1],
'Patente_vehiculo': row[2],
'speed': row[3],
'longitude': row[4],
'latitude': row[5],
})
return JsonResponse(buses, safe=False)
@action(detail=False, methods=['get'])
def buses_proto(self, request, pk=None):
pk = request.GET['id_linea']
linea = models.Linea.objects \
.filter(id_linea=pk) \
.first()
logging.error(linea)
detalle_buses = []
paraderos = models.Paradero.objects \
.filter(vigente=True, lineaparadero__id_linea=pk) \
.values('id_paradero') \
.all()
query = "SELECT json_data \
from gtfs_posiciones_json \
where stop_id = %s"
for p in paraderos:
id_paradero = p['id_paradero']
with connection.cursor() as cursor:
cursor.execute(query, [ id_paradero ])
datajson = cursor.fetchone()
if datajson != None:
buses = list(filter(lambda rowjson: rowjson['Descripcion'] == linea.route_short_name, datajson[0]))
for bus in buses:
for llegada in bus['Llegadas']:
data_bus = {
'patente': llegada['patente'],
'estimada_gps': llegada['EstimadaGPS'],
'distancia_gps': llegada['DistanciaGPS'],
}
detalle_buses.append(data_bus)
return JsonResponse(detalle_buses, safe=False)

View File

@ -0,0 +1,11 @@
from rest_framework import viewsets
from django_filters.rest_framework import DjangoFilterBackend
from api.serializers import LineaParaderoSerializer
from api.models import LineaParadero
import logging
class LineaParaderoViewSet(viewsets.ModelViewSet):
queryset = LineaParadero.objects.all()
serializer_class = LineaParaderoSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id_linea', 'id_paradero']

View File

@ -0,0 +1,87 @@
from django.http import JsonResponse
from rest_framework.decorators import action, api_view, schema
from django.views.decorators.csrf import csrf_exempt
from django.db.models import F, Subquery, Value
from django.db.models.functions import Coalesce
from ..models import Paradero, ParaderoImagen
from ..models import Linea, GtfsShape, GtfsTrips
from logging import error
google_api_key = 'AIzaSyDnFO9w_SsodjBuY5tOK8-kQJns_l5klQ4'
center = {'lat': -36.8077884, 'lng': -73.0775401}
@csrf_exempt
@action(detail=False, methods=['get'])
@api_view(['GET'])
def paraderos(request):
zoom = 17
marks = []
paraderos = Paradero.objects.filter(vigente=True)
for p in paraderos:
marks.append({
'position': { 'lat': p.stop_lat, 'lng': p.stop_lon },
'id_paradero': p.id_paradero,
'title': 'Paradero #' + str(p.id_paradero),
'location': p.stop_name,
'id_comuna': p.id_comuna,
'id_tipo_paradero': p.id_tipo_paradero,
})
return JsonResponse({
'google_api_key': google_api_key,
'zoom': zoom,
'center': center,
'marks': marks
})
@csrf_exempt
@action(detail=False, methods=['get'])
@api_view(['GET'])
def rutas(request):
id_linea = request.GET.get('id_linea')
"""
SELECT gs.shape_pt_lat, gs.shape_pt_lon, gs.shape_pt_sequence
FROM gtfs_shape gs
WHERE gs.id_shape in (
SELECT DISTINCT id_shape
FROM gtfs_trips gt
WHERE gt.id_linea = '2990'
)
ORDER BY gs.id_shape, gs.sequence_coalesce
"""
"""
# Subquery para obtener los id_shape distintos de gtfs_trips
subquery = GtfsTrips.objects.filter(id_linea = id_linea).values('id_shape').distinct()
# Consulta principal con inner join y ordenamiento
queryset = GtfsShape.objects.annotate(
id_shape_subquery=Subquery(subquery),
shape_pt_sequence_coalesce=Coalesce('shape_pt_sequence', Value(0))
).filter(id_shape=F('id_shape_subquery')).order_by('shape_pt_sequence_coalesce')
result = queryset.values('shape_pt_lat', 'shape_pt_lon', 'shape_pt_sequence')
"""
# Subconsulta interna
subquery = GtfsTrips.objects.filter(id_linea=id_linea).values('id_shape').distinct()[:1]
# Consulta principal
query = GtfsShape.objects.filter(id_shape__in=subquery).order_by('id_shape', 'shape_pt_sequence')
# Obtener los campos requeridos
query = query.values('shape_pt_lat', 'shape_pt_lon', 'shape_pt_sequence')
# Ejecutar la consulta
resultados = query.all()
return JsonResponse({
'google_api_key': google_api_key,
'positions': list(resultados)
})

View File

@ -0,0 +1,12 @@
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
from .. import models, serializers
class OperadorViewSet(viewsets.ModelViewSet):
queryset = models.Operador.objects.all()
serializer_class = serializers.OperadorSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id_region', 'nombre_operador', 'vigente']

View File

@ -0,0 +1,24 @@
from django.http import JsonResponse
from rest_framework import viewsets
from api.serializers import ParaderoSerializer
from api.models import Paradero
import logging
class ParaderoViewSet(viewsets.ModelViewSet):
queryset = Paradero.objects.all()
serializer_class = ParaderoSerializer
def info_public(request, pk):
if hasattr(request.META,'HTTP_REFERER'):
referer = request.META['HTTP_REFERER']
else:
protocol = request.scheme
host = request.META['HTTP_HOST']
port = request.META['SERVER_PORT']
referer = f'{protocol}://{host}:{port}'
return JsonResponse({
'url_public': f'{referer}/public/infoStop?codigoParadero={pk}'
})

View File

@ -0,0 +1,34 @@
from rest_framework import generics, viewsets
from django_filters.rest_framework import DjangoFilterBackend
from django.http import HttpResponse, JsonResponse
from api.models import ParaderoImagen, Paradero
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
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 = Paradero.objects.filter(id_paradero = id_paradero).first()
paradero_imagen = ParaderoImagen(
id_paradero = paradero,
imagen = imagen_bytea,
content_type = content_type
)
paradero_imagen.save()
return JsonResponse({ 'ok': True })

View File

@ -0,0 +1,20 @@
from rest_framework import viewsets
from .. import models, serializers
from django.http import HttpResponse
import logging
class PersonaViewSet(viewsets.ModelViewSet):
queryset = models.Persona.objects.all()
serializer_class = serializers.PersonaSerializer
def destroy(self, request, pk=None):
return HttpResponse('No permitido eliminar', status=405)
def create(self, request):
try:
super().create(request)
except Exception as e:
# logging.warning(e.detail['rut'][0])
if e.detail['rut']:
return HttpResponse(e.detail['rut'][0], status=400)
return HttpResponse(e, status=400)

View File

@ -0,0 +1,46 @@
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import action, api_view
from api.utils import gtfs_realtime_pb2
from project.settings import BASE_DIR
from django.http import JsonResponse
import logging
def status(request):
nombre_archivo_proto = f'{BASE_DIR}/api/utils/demo.proto'
with open(nombre_archivo_proto, 'rb') as proto_file:
feed = gtfs_realtime_pb2.FeedMessage()
feed.ParseFromString(proto_file.read())
data = {} #get_object(feed)
# logging.error(dir(feed))
# logging.error(feed.header)
# logging.error(dir(feed.entity))
logging.error(feed.entity[0])
# logging.error(dir(feed.entity[0].trip_update))
return JsonResponse(data, safe=False)
def get_object(obj1, obj2 = {}, level = 1):
attributes = dir(obj1)
for attr in attributes:
if attr[0:1] != '_':
try:
for elem in obj1[attr]:
logging.error(elem)
except:
logging.error(attr)
pass
return obj2
def is_subscriptable(obj):
return hasattr(obj, '__getitem__')
def is_iterable(obj):
try:
iter(obj)
return True
except TypeError:
return False

View File

@ -0,0 +1,7 @@
from rest_framework import viewsets
from .. import models, serializers
class RegionViewSet(viewsets.ModelViewSet):
queryset = models.Region.objects.all()
serializer_class = serializers.RegionSerializer

View File

@ -0,0 +1,6 @@
from rest_framework import viewsets
from .. import models, serializers
class RolViewSet(viewsets.ModelViewSet):
queryset = models.Rol.objects.all()
serializer_class = serializers.RolSerializer

View File

@ -0,0 +1,16 @@
from rest_framework import viewsets
from .. import models, serializers
import logging
class RolAplicacionViewSet(viewsets.ModelViewSet):
serializer_class = serializers.RolAplicacionSerializer
def get_queryset(self):
id_rol = self.request.query_params.get('id_rol') # Obtener el valor del parámetro id_rol desde la solicitud
if id_rol is not None:
return models.RolAplicacion.objects.filter(id_rol=id_rol)
return models.RolAplicacion.objects.all()

View File

@ -0,0 +1,23 @@
from rest_framework import viewsets
from .. import models, serializers
class TipoTratamientoPersonaViewSet(viewsets.ModelViewSet):
queryset = models.TipoTratamientoPersona.objects.all()
serializer_class = serializers.TipoTratamientoPersonaSerializer
class TipoDispositivoViewSet(viewsets.ModelViewSet):
queryset = models.TipoDispositivo.objects.all()
serializer_class = serializers.TipoDispositivoSerializer
class TipoParaderoViewSet(viewsets.ModelViewSet):
queryset = models.TipoParadero.objects.all()
serializer_class = serializers.TipoParaderoSerializer
class TipoTransporteViewSet(viewsets.ModelViewSet):
queryset = models.TipoTransporte.objects.all()
serializer_class = serializers.TipoTransporteSerializer
class TipoVehiculoViewSet(viewsets.ModelViewSet):
queryset = models.TipoVehiculo.objects.all()
serializer_class = serializers.TipoVehiculoSerializer

View File

@ -0,0 +1,151 @@
from django.db import transaction
from django.http import HttpResponse
from rest_framework import viewsets
from rest_framework.response import Response
from .. import models, schemas, serializers
import json
import datetime
import logging
class UsuarioViewSet(viewsets.ModelViewSet):
queryset = models.Usuario.objects.all()
serializer_class = serializers.UsuarioSerializer
schema = schemas.UsuarioSchema()
def retrieve(self, request, pk=None):
data = super().retrieve(request, pk)
return data
def create(self, request):
try:
with transaction.atomic():
input = json.loads(request.body)
# validaciones se realiza a nivel del model
persona = models.Persona.objects.filter(rut = input['rut']).first()
id_tipo_tratamiento = input.get('id_tipo_tratamiento',None)
if not id_tipo_tratamiento:
id_tipo_tratamiento = None
if not persona:
persona = models.Persona(
rut = input['rut'],
dv = input['dv'],
nombres = input['nombres'],
apellido_a = input.get('apellido_a',None),
apellido_b = input.get('apellido_b',None),
email = input.get('email',None),
id_tipo_tratamiento = id_tipo_tratamiento
)
persona.save()
else:
persona.nombres = input['nombres']
persona.apellido_a = input.get('apellido_a',None)
persona.apellido_b = input.get('apellido_b',None)
persona.email = input.get('email',None)
persona.id_tipo_tratamiento = id_tipo_tratamiento
persona.save()
usuario = models.Usuario(
rut = persona,
login = input['login'],
vigente = input.get('vigente', False),
)
usuario.save()
logging.error(f'clave = {input["clave"]}')
if input['clave']:
logging.error('Modificar clave de usuario')
clave = models.UsuarioClave.objects.filter(login = usuario.login).first()
if clave:
logging.error('Clave Usuario ya existe')
clave.clave_anterior = clave.clave
clave.clave = input['clave']
clave.fecha_modificacion = datetime.datetime.now()
clave.save()
else:
logging.error('Clave Usuario se creará')
clave = models.UsuarioClave(
login = usuario.login,
clave = input['clave'],
fecha_modificacion = datetime.datetime.now()
)
clave.save()
return Response({
'rut': persona.rut,
'dv': persona.dv,
'nombres': persona.nombres,
'apellido_a': persona.apellido_a,
'apellido_b': persona.apellido_b,
'email': persona.email,
'login': usuario.login,
'vigente': usuario.vigente,
})
except ValueError as e:
transaction.rollback()
return HttpResponse(str(e), status = 400)
except Exception as e:
transaction.rollback()
print(e)
return HttpResponse(str(e), status = 500)
def update(self, request, *args, **kwargs):
input = json.loads(request.body)
logging.error(input)
try:
pk = input['rut']
with transaction.atomic():
# validaciones se realiza a nivel del model
persona = models.Persona.objects.filter(rut = pk).first()
usuario = models.Usuario.objects.filter(rut = pk).first()
usuario.vigente = input.get('vigente', False)
usuario.save()
logging.error(f'clave = {input["clave"]}')
if input['clave']:
logging.error('Modificar clave de usuario')
clave = models.UsuarioClave.objects.filter(login = usuario.login).first()
if clave:
logging.error('Clave Usuario ya existe')
clave.clave_anterior = clave.clave
clave.clave = input['clave']
clave.fecha_modificacion = datetime.datetime.now()
clave.save()
else:
logging.error('Clave Usuario se creará')
clave = models.UsuarioClave(
login = usuario,
clave = input['clave'],
fecha_modificacion = datetime.datetime.now()
)
clave.save()
return Response({
'rut': persona.rut,
'dv': persona.dv,
'nombres': persona.nombres,
'apellido_a': persona.apellido_a,
'apellido_b': persona.apellido_b,
'email': persona.email,
'login': usuario.login,
'vigente': usuario.vigente,
})
except ValueError as e:
transaction.rollback()
return HttpResponse(str(e), status = 400)
except Exception as e:
transaction.rollback()
print(e)
return HttpResponse(str(e), status = 500)

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
project/dist/avatars/avatar1.jpg vendored 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
project/dist/avatars/avatar2.png vendored 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
project/dist/avatars/avatar3.png vendored 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
project/dist/avatars/avatar4.png vendored 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
project/dist/avatars/avatar5.png vendored 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
project/dist/avatars/avatar6.png vendored 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
project/dist/avatars/avatar7.jpg vendored 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

14
project/dist/index.html vendored 100644
View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>...</title>
<script type="module" crossorigin src="/assets/index-8b0562d6.js"></script>
<link rel="stylesheet" href="/assets/index-f6f10183.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

22
project/manage.py 100755
View File

@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

View File

View File

@ -0,0 +1,16 @@
"""
ASGI config for project project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
application = get_asgi_application()

View File

@ -0,0 +1,172 @@
"""
Django settings for project project.
Generated by 'django-admin startproject' using Django 4.2.2.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""
from pathlib import Path
from decouple import config
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-ozq@8*t6cy&$lmu@qsvz+l6omsfncj6r1w)s**rtl3vd&j8_#b'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = [ '*' ]
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'coreapi',
'corsheaders',
'django_filters',
'api',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
'api.middlewares.ApiMiddleware',
]
ROOT_URLCONF = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [ BASE_DIR / 'dist' ],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': config('DBHOST', 'localhost'),
'PORT': config('DBPORT', 5432),
'USER': config('DBUSER','postgres'),
'PASSWORD': config('DBPASS','password'),
'NAME': config('DBNAME','database'),
'OPTIONS': {
'options': '-c search_path=' + config('DBSCHEMA', 'public')
}
}
}
# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/
LANGUAGE_CODE = 'es-cl'
TIME_ZONE = 'America/Santiago'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/
STATIC_URL = 'static/'
# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
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': ['django_filters.rest_framework.DjangoFilterBackend', 'rest_framework.filters.OrderingFilter'],
}
CORS_ORIGIN_ALLOW_ALL = True
# CORS_ORIGIN_ALLOW_ALL = False
# CORS_ORIGIN_WHITELIST = [
# "http://localhost:3000",
# "http://ubuntu.home:3000",
# "http://transporte.hz.kursor.cl",
# "http://transporte-backend.hz.kursor.cl",
# ]
# PARA VISUALIZAR LAS SENTENCIAS SQL QUE SE REALIZAN
"""
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'level': 'DEBUG', # Puedes ajustar el nivel de registro según tu necesidad.
},
},
}
"""

View File

@ -0,0 +1,36 @@
"""
URL configuration for project project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from rest_framework.documentation import include_docs_urls
from django.conf import settings
from django.conf.urls.static import static
from .views import frontend
urlpatterns = [
# FRONTEND
path('', frontend, name='home'),
# BACKEND
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
path('docs/', include_docs_urls(title = 'API Documentation')),
]
urlpatterns += static('assets/', document_root=f'{settings.BASE_DIR}/dist/assets')
urlpatterns += static('avatars/', document_root=f'{settings.BASE_DIR}/dist/avatars')

View File

@ -0,0 +1,7 @@
from django.template.loader import get_template
from django.http import HttpResponse
def frontend(request):
plantilla = get_template('index.html')
documento = plantilla.render()
return HttpResponse(documento)

View File

@ -0,0 +1,16 @@
"""
WSGI config for project project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
application = get_wsgi_application()

59
readme.md 100644
View File

@ -0,0 +1,59 @@
# Dependencias
* **Django**: framework django
* **psycopg2-binary**: permite uso de base datos postgres
* **djangorestframework**: permite crear rest api json
* **django-cors-headers**: requerido para desarrollo de frontend, permite acceso desde una dominio distinto al backend
* **django-filter**: permite filtrar resultado usando paraquetros en querystring
* **coreapi**: genera documentación de rest api
* **python-decouple**: lee archivo .env para variables de ambiente
* **PyJWT**: permite generar json-web-token
* **pymongo**: permite conectarse a base datos mongo
* **Pillow**: permite imagenar imagenes
* **openpyxl**: permite generar archivos excel
# Docker
Para iniciar la aplicacion usando docker
~~~bash
cd <carpeta del proyecto>/docker
docker compose up -d
~~~
# Script para levantar aplicacion python
**start.sh**
~~~bash
#!/bin/sh
cd /app
# si no existe directorio de ambiente, se crea
if [ ! -d /app/libs ]; then
python -m venv libs
. ./libs/bin/activate
pip install -r requirements.txt
fi
# activar ambiente con dependencias
. ./libs/bin/activate
# si no existe un proyecto inicial, lo crea
if [ ! -d /app/project ]; then
django-admin startproject project
fi
# iniciar servidor con puerto 8000
python /app/project/manage.py runserver 0.0.0.0:8000
~~~
# Extraer models de base de datos
~~~bash
python manage.py inspectdb > api/models.py
~~~

12
requirements.txt 100644
View File

@ -0,0 +1,12 @@
Django
psycopg2-binary
djangorestframework
django-cors-headers
django-filter
coreapi
python-decouple
PyJWT
pymongo
Pillow
openpyxl
google