Skip to content

Commit

Permalink
Ya se muestran las materias con codigo alfanumerico (#20)
Browse files Browse the repository at this point in the history
* Update materias.json con materias 2024 Ing. Informática

Añadidos las materias que me aparecen a mi (mi carrera es Ingeniería en Informática) en https://guaraniautogestion.fi.uba.ar/g3w/oferta_comisiones.
Añadir las de cada uno es facil, solamente hay que correr este script que hice en `inspeccionar -> consola`:
    const periodos = document.querySelectorAll("[periodo]");
    
    const data = new Map()
    
    periodos.forEach(periodo => {
      const materias = periodo.querySelectorAll("[actividad]")
      materias.forEach(materia => {
        const indiceParentesis = materia.getAttribute("actividad").indexOf("(");
        const materiaId = materia.getAttribute("actividad").slice(indiceParentesis + 1, -1);
        const materiaName = materia.getAttribute("actividad").slice(0, indiceParentesis).trim();
        data.set(materiaId, materiaName);
      })
    })
    console.log(Object.fromEntries(data))

Luego, solo hay que hacer click derecho -> "Copiar Objeto"

* Aparecen los nombres de todas las materias (incluidas las de los codigos alfanumericos) en la lista de materias

* cambiado reponames de tipo de dato Set a Array

* Ahora se muestran los repositorios de las materias con codigo alfanumerico

* formateo de codigo trabajado con prettier

* correccion aparecían los repositorios de materias nuevas al estar el filtro fiubaOnly

* Aparecen los nombres de todas las materias (incluidas las de los codigos alfanumericos) en la lista de materias

* cambiado reponames de tipo de dato Set a Array

* Ahora se muestran los repositorios de las materias con codigo alfanumerico

* formateo de codigo trabajado con prettier

* correccion aparecían los repositorios de materias nuevas al estar el filtro fiubaOnly

* Añadida carpeta guia para subir materias

1. Se "capitalizaron" los palabras de los nombres de las materias (primera letra de cada palabra en mayúscula)
2. Cree una carpeta que tiene un README.md con los pasos a seguir para obtener las materias y actualizar el json (decime si esta bien o si está de más y lo saco)

* formateo del json por separado

* obtener-subir-materias afuera del src

* actualizado README del obtener-subir-materias
  • Loading branch information
juli-rivero authored Aug 12, 2024
1 parent eae1bf4 commit 14d2726
Show file tree
Hide file tree
Showing 9 changed files with 239 additions and 113 deletions.
31 changes: 31 additions & 0 deletions obtener-subir-materias/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Como puedo obtener y subir las materias de mi carrera

> [!TIP]
> Si ya tenes las materias que queres subir anda a la seccion 2
> [!NOTE]
> Como el SIU Guaraní no permite obtener las materias con sus respectivos códigos públicamente, este proceso se tiene que hacer iniciando sesión en el SIU Guarani de FIUBA, ir a oferta de comisiones, agarrar todas las materias con sus códigos y subirlos manualmente.
## Obtener códigos y materias de tu carrera

1. Dirigirte a oferta_comisiones del SIU Guarani de FIUBA (https://guaraniautogestion.fi.uba.ar/g3w/oferta_comisiones)
2. Abrir la consola del inspeccionar (Ctrl + Mayus + i)
3. Copiar el contenido del script "obtenerMateriasdelSiuOfertaComisiones.js" (se encuentra en esta carpeta)
4. Pegarlo en la consola del inspeccionar y ejecutarlo (dependiendo del navegador es presionar Enter o hacer click en un boton)
5. Hacer click derecho sobre el arreglo mostrado -> "Copy Object"

## Actualizar json

1. Una vez que tenemos las materias como un objeto de estructura `{ <codigo>: <nombre> }`, sobreescribimos el archivo "materias-a-subir.json" (se encuentra en esta carpeta)
2. Ejecutar el archivo "actualizar_json.py" (una manera sencilla es con el boton de play si estas usando Visual Code)

## Formatear json

1. Ejecutar el archivo "formatear_json.js" (una manera sencilla es con el boton de play si estas usando Visual Code)

## Guardar y subir cambios

1. `git add src/data/materias.json`
2. `git commit -m "materias de la carrera <carrera> añadidas"`
3. `git push origin master`
4. Hacer pull request (desde github) a [fDelMazo/FIUBA-Repos](https://github.com/FdelMazo/FIUBA-Repos)
22 changes: 22 additions & 0 deletions obtener-subir-materias/actualizar_json.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import os

# Obtener la ruta absoluta del directorio actual del script
script_dir = os.path.dirname(os.path.abspath(__file__))

# Construir las rutas absolutas
materias_a_subir_path = os.path.join(script_dir, "materias-a-subir.json")
materias_path = os.path.abspath(os.path.join(script_dir, "../src/data/materias.json"))

import json

with (
open(materias_a_subir_path, "r", encoding='utf-8') as archivo_materias_a_subir,
open(materias_path, "r", encoding='utf-8') as archivo_materias
):
materias_a_subir = json.load(archivo_materias_a_subir)
materias = json.load(archivo_materias)
for key, value in materias_a_subir.items():
materias[key] = value

with open(materias_path, "w", encoding='utf-8') as archivo_materias:
json.dump(materias, archivo_materias, ensure_ascii=False, indent=2)
39 changes: 39 additions & 0 deletions obtener-subir-materias/formatear_json.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import os

# Obtener la ruta absoluta del directorio actual del script
script_dir = os.path.dirname(os.path.abspath(__file__))

# Construir las rutas absolutas
materias_a_subir_path = os.path.join(script_dir, "materias-a-subir.json")
materias_path = os.path.abspath(os.path.join(script_dir, "../src/data/materias.json"))

import json

def format_name(texto: str):
words = texto.split()
palabras_vacias = ['y','para', 'de', 'del', 'el', 'los', 'la', 'las', 'al', 'su', 'sus', 'en', 'a', 'por', 'no', 'e', 'con']
nivel = ['I','II','III','IV','V']
variantes = ['A','B','C']
excepciones = ['AT', 'SEP']


for index, word in enumerate(words):
if not word in excepciones:
if index == len(words)-1 and word.upper() in variantes:
words[index] = word.upper()
elif word.upper() in nivel:
words[index] = word.upper()
elif word.lower() in palabras_vacias:
words[index] = word.lower()
else:
words[index] = word.capitalize()

return ' '.join(words)

with open(materias_path, "r", encoding='utf-8') as archivo_materias:
materias = json.load(archivo_materias)
for key, value in materias.items():
materias[key] = format_name(value)

with open(materias_path, "w", encoding='utf-8') as archivo_materias:
json.dump(materias, archivo_materias, ensure_ascii=False, indent=2)
32 changes: 32 additions & 0 deletions obtener-subir-materias/materias-a-subir.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"CB002": "ÁLGEBRA LINEAL",
"CB100": "ALGORITMOS Y ESTRUCTURAS DE DATOS",
"CB001": "ANÁLISIS MATEMÁTICO II",
"CB005": "ANÁLISIS MATEMÁTICO III",
"TA061": "APRENDIZAJE AUTOMÁTICO",
"TB034": "ARQUITECTURA DE SOFTWARE",
"TA044": "BASE DE DATOS",
"TA047": "CIENCIA DE DATOS",
"TB032": "COMPUTACIÓN CUÁNTICA",
"TC018": "EMPRESAS DE BASE TECNOLÓGICA I",
"TC019": "EMPRESAS DE BASE TECNOLÓGICA II",
"CB024": "FÍSICA PARA INFORMÁTICA",
"TB021": "FUNDAMENTOS DE PROGRAMACIÓN",
"TC017": "GESTIÓN DEL DESARROLLO DE SISTEMAS INFORMÁTICOS",
"TA046": "INGENIERÍA DE SOFTWARE I",
"TA049": "INGENIERÍA DE SOFTWARE II",
"TB022": "INTRODUCCIÓN AL DESARROLLO DE SOFTWARE",
"CB051": "MODELACIÓN NUMÉRICA",
"TB023": "ORGANIZACIÓN DEL COMPUTADOR",
"TB025": "PARADIGMAS DE PROGRAMACIÓN",
"CB003": "PROBABILIDAD Y ESTADÍSTICA",
"TB026": "PROGRAMACIÓN CONCURRENTE",
"TA048": "REDES",
"TB028": "SIMULACIÓN",
"TA050": "SISTEMAS DISTRIBUIDOS I",
"TA043": "SISTEMAS OPERATIVOS",
"TA045": "TALLER DE PROGRAMACIÓN",
"TB024": "TEORÍA DE ALGORITMOS",
"TA053": "TRABAJO PROFESIONAL DE INGENIERÍA INFORMÁTICA",
"TA062": "APRENDIZAJE PROFUNDO"
}
13 changes: 13 additions & 0 deletions obtener-subir-materias/obtenerMateriasdelSiuOfertaComisiones.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const periodos = document.querySelectorAll("[periodo]");
const data = new Map()

periodos.forEach(periodo => {
const materias = periodo.querySelectorAll("[actividad]")
materias.forEach(materia => {
const indiceParentesis = materia.getAttribute("actividad").indexOf("(");
const materiaId = materia.getAttribute("actividad").slice(indiceParentesis + 1, -1);
const materiaName = materia.getAttribute("actividad").slice(0, indiceParentesis).trim();
data.set(materiaId, materiaName);
})
})
console.log(Object.fromEntries(data))
53 changes: 20 additions & 33 deletions src/components/MainApp.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,42 +19,29 @@ const MainApp = () => {
}, [data]);

const materias = React.useMemo(() => {
const codigosMaterias = [
...new Set(
data.flatMap((r) => r.topics.filter((t) => t.match(/^\d\d\d\d$/))),
),
];

let allMaterias = Object.keys(ALIAS_MATERIAS).reduce((acc, c) => {
const nombre = ALIAS_MATERIAS[c];
let m = acc.find((mx) => mx.nombre === nombre);
if (m) {
m.codigos.push(c);
} else {
acc.push({
codigos: [c],
nombre,
const mapa = data.reduce((mapa, repo) => {
const codigosEnRepo = repo.topics
.map((t) => t.toUpperCase())
.filter((t) => ALIAS_MATERIAS.hasOwnProperty(t));
codigosEnRepo.forEach((codigoEnRepo) => {
const nombreMateria = ALIAS_MATERIAS[codigoEnRepo];
const valuesAntes = mapa.get(nombreMateria);
const codigosAntes = valuesAntes ? valuesAntes.codigos : [];
const reposAntes = valuesAntes ? valuesAntes.reponames : [];
mapa.set(nombreMateria, {
codigos: [...new Set([...codigosAntes, codigoEnRepo])],
reponames: [...new Set([...reposAntes, repo.full_name])],
});
}
return acc;
}, []);
});

codigosMaterias.forEach((c) => {
const materia = allMaterias.find((m) => m.codigos.includes(c));
if (!materia) return;
if (materia.reponames) {
materia.reponames = new Set([
...materia.reponames,
...data.filter((r) => r.topics.includes(c)).map((r) => r.full_name),
]);
} else {
materia["reponames"] = new Set(
data.filter((r) => r.topics.includes(c)).map((r) => r.full_name),
);
}
});
return mapa;
}, new Map());
const materias = Array.from(mapa, ([nombreMateria, objeto]) => ({
nombre: nombreMateria,
...objeto,
}));

return allMaterias.filter((m) => m.reponames?.size > 0);
return materias;
}, [data]);

const [codigoSelected, setCodigoSelected] = React.useState(() => {
Expand Down
4 changes: 2 additions & 2 deletions src/components/Materias.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const Materias = ({
const [nombreFilter, setNombreFilter] = React.useState("");
const shownMaterias = React.useMemo(() => {
return materias
.sort((a, b) => b.reponames.size - a.reponames.size)
.sort((a, b) => b.reponames.length - a.reponames.length)
.filter((m) => {
const nombreFilterNormalizado = nombreFilter
.normalize("NFD")
Expand Down Expand Up @@ -122,7 +122,7 @@ const Materias = ({

<Flex alignItems="center">
<Text fontWeight={600} color="gray.800">
{m.reponames.size}
{m.reponames.length}
</Text>
<Icon as={RepoIcon} w={5} h={5} color="gray.800" />
</Flex>
Expand Down
52 changes: 27 additions & 25 deletions src/components/Repos.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import {
Search2Icon,
StarIcon,
TimeIcon,
} from "@chakra-ui/icons";
import { Search2Icon, StarIcon, TimeIcon } from "@chakra-ui/icons";
import {
Box,
Button,
Expand All @@ -27,31 +23,32 @@ const Repos = ({ materiaSelected, repos, materias }) => {
const [nombreFilter, setNombreFilter] = React.useState("");

const shownRepos = React.useMemo(() => {
let reposToShow = repos
let reposToShow = repos;
if (fiubaOnly) {
reposToShow = repos
.filter(
(r) =>
!materias
.flatMap((m) => m.codigos)
.some((c) => r.repoData.topics.includes(c)),
)
reposToShow = repos.filter(
(r) =>
!materias
.flatMap((m) => m.codigos)
.some((c) => r.repoData.topics.includes(c.toLowerCase())),
);
} else if (materiaSelected) {
reposToShow = repos
.filter((r) =>
materiaSelected.codigos.some((c) => r.repoData.topics.includes(c)),
)
reposToShow = repos.filter((r) =>
materiaSelected.codigos.some((c) =>
r.repoData.topics.includes(c.toLowerCase()),
),
);
}

if (nombreFilter) {
reposToShow = reposToShow.filter((r) =>
r.user.toLowerCase().includes(nombreFilter.toLowerCase()) ||
r.description?.toLowerCase().includes(nombreFilter.toLowerCase()) ||
r.repoName.toLowerCase().includes(nombreFilter.toLowerCase())
)
reposToShow = reposToShow.filter(
(r) =>
r.user.toLowerCase().includes(nombreFilter.toLowerCase()) ||
r.description?.toLowerCase().includes(nombreFilter.toLowerCase()) ||
r.repoName.toLowerCase().includes(nombreFilter.toLowerCase()),
);
}

return reposToShow.sort(sortOption.sortFn)
return reposToShow.sort(sortOption.sortFn);
}, [materiaSelected, repos, materias, fiubaOnly, sortOption, nombreFilter]);

return (
Expand Down Expand Up @@ -112,7 +109,10 @@ const Repos = ({ materiaSelected, repos, materias }) => {
>
{repos.length ? (
<Center>
<SortFeature sortOption={sortOption} setSortOption={setSortOption} />
<SortFeature
sortOption={sortOption}
setSortOption={setSortOption}
/>
<RepoCards repoDetails={shownRepos} />
</Center>
) : (
Expand All @@ -137,7 +137,9 @@ const SortFeature = ({ sortOption, setSortOption }) => {
icon={sortOption.icon}
onClick={() => {
setSortOption(
sortOption.shortName === sortOptions[0].shortName ? sortOptions[1] : sortOptions[0]
sortOption.shortName === sortOptions[0].shortName
? sortOptions[1]
: sortOptions[0],
);
}}
/>
Expand Down
Loading

0 comments on commit 14d2726

Please sign in to comment.