{"id":22120472,"url":"https://github.com/umactually/devotion-backend","last_synced_at":"2026-07-08T15:31:42.248Z","repository":{"id":239544703,"uuid":"767611741","full_name":"UmActually/Devotion-Backend","owner":"UmActually","description":null,"archived":false,"fork":false,"pushed_at":"2025-01-16T15:14:49.000Z","size":219,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-29T00:46:56.823Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UmActually.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-05T15:54:46.000Z","updated_at":"2025-01-16T15:14:51.000Z","dependencies_parsed_at":"2025-01-05T15:34:34.484Z","dependency_job_id":"d886ddce-a459-481a-9128-afd1a87f7dee","html_url":"https://github.com/UmActually/Devotion-Backend","commit_stats":null,"previous_names":["umactually/devotion-backend"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/UmActually/Devotion-Backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UmActually%2FDevotion-Backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UmActually%2FDevotion-Backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UmActually%2FDevotion-Backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UmActually%2FDevotion-Backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UmActually","download_url":"https://codeload.github.com/UmActually/Devotion-Backend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UmActually%2FDevotion-Backend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35270196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-08T02:00:06.796Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-01T14:23:44.074Z","updated_at":"2026-07-08T15:31:42.201Z","avatar_url":"https://github.com/UmActually.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# D. E. V. O. T. I. O. N.\n\n\u003e Development Environment for the Visualization of Organizational Tasks Inspired Obviously by Notion\n\n## Setup del back end\n\nRequiere Python 3.9 o superior.\n\n```bash\npip install -r requirements.txt\ngunicorn devotion.wsgi\n```\n\n## API bonita\n\n☆ = Requiere autenticación de token Bearer.\n\nPara crear o actualizar un recurso, el usuario debe ser líder del proyecto papá. La única excepción a esto es PUT `/tasks/\u003cid\u003e/status/`, que puede ser ejecutado por cualquier miembro del proyecto. Ser un superuser sobrepasa todas estas restricciones.\n\n- GET `/test/` - _Hola, mundo_\n\n**Users**\n\n- POST `/users/` - _[Crear usuario](#post-users---crear-usuario)_\n- POST `/login/` - _[Iniciar sesión](#post-login---iniciar-sesi%C3%B3n)_\n- GET `/users/` - _[Obtener todos los usuarios ☆](#get-users---obtener-todos-los-usuarios-)_\n- GET `/me/` - _[Obtener usuario ☆](#get-me---obtener-usuario-)_\n- PUT `/me/` - _[Actualizar usuario ☆](#put-me---actualizar-usuario-)_\n- GET `/me/projects/` - _[Obtener proyectos del usuario ☆](#get-meprojects---obtener-proyectos-del-usuario-)_\n- GET `/me/calendar/` - _[Obtener calendario global del usuario ☆](#get-mecalendar---obtener-calendario-global-del-usuario-)_\n\n**Projects**\n\n- POST `/projects/` - _[Crear proyecto ☆](#post-projects---crear-proyecto-)_\n- GET `/projects/\u003cid\u003e/` - _[Obtener proyecto](#get-projectsid---obtener-proyecto)_\n- GET `/projects/\u003cid\u003e/members/` - _[Obtener miembros del proyecto ☆](#get-projectsidmembers---obtener-miembros-del-proyecto-)_\n- PUT `/projects/\u003cid\u003e/` - _[Actualizar proyecto ☆](#put-projectsid---actualizar-proyecto-)_\n- DELETE `/projects/\u003cid\u003e/` - _[Eliminar proyecto ☆](#delete-projectsid---eliminar-proyecto-)_\n\n**Tasks**\n\n- POST `/tasks/` - _[Crear tarea ☆](#post-tasks---crear-tarea-)_\n- GET `/tasks/\u003cid\u003e/` - _[Obtener tarea](#get-tasksid---obtener-tarea)_\n- PUT `/tasks/\u003cid\u003e/` - _[Actualizar tarea ☆](#put-tasksid---actualizar-tarea-)_\n- PUT `/tasks/\u003cid\u003e/status/` - _[Cambiar estado de tarea ☆](#put-tasksidstatus---cambiar-estado-de-tarea-)_\n- DELETE `/tasks/\u003cid\u003e/` - _[Eliminar tarea ☆](#delete-tasksid---eliminar-tarea-)_\n\n**Dashboard (Aún no tan)**\n\n- GET `/projects/\u003cid\u003e/dashboard/` - _Obtener dashboard del proyecto_\n- POST `/projects/\u003cid\u003e/dashboard/widgets/` - _Crear widget_\n- PUT `/projects/\u003cid\u003e/dashboard/widgets/` - _Actualizar widget_\n- POST `/projects/\u003cid\u003e/dashboard/sources/` - _Crear fuente de datos_\n\n---\n\n### Users\n\n#### POST `/users/` - _Crear usuario_\n\n**Entrada**\n\n- `email`\n- `password`\n- `first_names`\n- `last_names`\n\n**Salida**\n\n```json\n{\n  \"id\": 1,\n  \"token\": \"eyJ0...\"\n}\n```\n\n---\n\n#### POST `/login/` - _Iniciar sesión_\n\n**Entrada**\n\n- `email`\n- `password`\n\n**Salida**\n\n```json\n{\n  \"access\": \"eyJ0...\",\n  \"refresh\": \"eyJ0...\"\n}\n```\n\n---\n\n#### GET `/users/` - _Obtener todos los usuarios ☆_\n\n**Salida**\n\n```json\n[\n  {\n    \"id\": \"e729a80d-0033-4e0e-8891-20085212b445\",\n    \"email\": \"sergioperez@example.com\",\n    \"firstNames\": \"Sergio\",\n    \"lastNames\": \"Pérez\"\n  },\n  {\n    \"id\": \"42e74cee-497c-41f5-834e-ac3578229cb6\",\n    \"email\": \"lewishamilton@example.com\",\n    \"firstNames\": \"Lewis\",\n    \"lastNames\": \"Hamilton\"\n  },\n  ...\n]\n```\n\n---\n\n#### GET `/me/` - _Obtener usuario ☆_\n\n**Salida**\n\n```json\n{\n  \"id\": \"e729a80d-0033-4e0e-8891-20085212b445\",\n  \"email\": \"sergioperez@example.com\",\n  \"firstNames\": \"Sergio\",\n  \"lastNames\": \"Pérez\"\n}\n```\n\n---\n\n#### PUT `/me/` - _Actualizar usuario ☆_\n\n**Entrada**\n\n- `email` (opcional)\n- `first_names` (opcional)\n- `last_names` (opcional)\n\n---\n\n#### GET `/me/projects/` - _Obtener proyectos del usuario ☆_\n\n**Salida**\n\n```json\n[\n  {\n    \"id\": \"4bfca576-83d2-447a-9b79-cdc778417c84\",\n    \"name\": \"FSAE 2024\",\n    \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin volutpat tortor eget lacus ultricies, nec ullamcorper risus viverra. Pellentesque non ultrices nibh.\"\n  },\n  ...\n]\n```\n\n---\n\n#### GET `/me/calendar/` - _Obtener calendario global del usuario ☆_\n\n**Salida**\n\nNota: las fechas son arreglos de dos números, que representan la posición de la tarea (o tareas) en la matriz del calendario.\n\n```json\n{\n  \"tasks\": [\n    {\n      \"date\": [\n        0,\n        1\n      ],\n      \"tasks\": [\n        {\n          \"id\": \"f8ed4488-0fbc-44b4-9b96-c626caf6a44a\",\n          \"name\": \"Junta inicial 123\",\n          \"status\": 2,\n          \"priority\": 0\n        },\n        ...\n      ]\n    },\n    ...\n  ],\n  \"today\": [\n    1,\n    5\n  ]\n}\n```\n\n---\n\n### Projects\n\n#### POST `/projects/` - _Crear proyecto ☆_\n\n**Entrada**\n\n- `name`\n- `description`\n- `parent` (opcional) - _ID del proyecto papá_\n- `leaders` - _IDs de usuarios líderes separados por \",\"_\n- `members` - _IDs de usuarios miembros separados por \",\"_\n\n---\n\n#### GET `/projects/\u003cid\u003e/` - _Obtener proyecto_\n\n**Query params**\n\n- `get` - _Para obtener respuestas parciales de solo la información del proyecto o solo las tareas del mismo (sí ahorra mucho tiempo)._\n  - _Opciones: `info`, `tasks`, `all`, default es `all`_\n- `view` - _Cambia el formato de la respuesta para facilitar el front._\n  - _Opciones: `table`, `kanban`, `calendar`, default es `table`_\n- `assigned` - _Mostrar solo tareas asignadas al usuario. Si la request no tiene autenticación, este parámetro se ignora._\n  - _Opciones: `true`, `false`, default es `false`_\n- `subtree` - _Mostrar todo el subárbol de tareas debajo del proyecto actual._\n  - _Opciones: `true`, `false`, default es `false`_\n\n**Salida**\n\nParámetros default:\n\n```json\n{\n  \"id\": \"887ebfdd-bd39-417c-9b42-90396c2b8e59\",\n  \"name\": \"Chasis\",\n  \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin volutpat tortor eget lacus ultricies, nec ullamcorper risus viverra. Pellentesque non ultrices nibh.\",\n  \"breadcrumbs\": [\n    [\n      \"4bfca576-83d2-447a-9b79-cdc778417c84\",\n      \"FSAE 2024\",\n      false\n    ],\n    ...\n  ],\n  \"projects\": [\n    {\n      \"id\": \"169bdff0-30d5-4b7f-ad7a-c2793a1a7328\",\n      \"name\": \"Cockpit\",\n      \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin volutpat tortor eget lacus ultricies, nec ullamcorper risus viverra. Pellentesque non ultrices nibh.\"\n    },\n    ...\n  ],\n  \"tasks\": [\n    {\n      \"id\": \"0191827d-1e38-4647-885c-aef73ea494b0\",\n      \"name\": \"Peso y distribución\",\n      \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidid.\",\n      \"status\": 3,\n      \"priority\": 0,\n      \"startDate\": \"2024-02-13\",\n      \"dueDate\": \"2024-02-21\",\n      \"assignee\": \"Alexander Albon\",\n      \"parentProject\": \"887ebfdd-bd39-417c-9b42-90396c2b8e59\",\n      \"parentTask\": null\n    },\n    ...\n  ],\n  \"progress\": 50\n}\n```\n\nEjemplo con get=`tasks`\u0026view=`calendar`:\n\nNota: las fechas son arreglos de dos números, que representan la posición de la tarea (o tareas) en la matriz del calendario.\n\n```json\n{\n  \"tasks\": [\n    {\n      \"date\": [\n        0,\n        3\n      ],\n      \"tasks\": [\n        {\n          \"id\": \"9bcfd443-9ff2-42cd-b69e-75aa032891e1\",\n          \"name\": \"Diseño del chasis\",\n          \"status\": 0,\n          \"priority\": 0\n        },\n        ...\n      ]\n    },\n    ...\n  ],\n  \"today\": [\n    1,\n    5\n  ]\n}\n```\n\nEjemplo con get=`tasks`\u0026view=`kanban`:\n\n```json\n{\n  \"tasks\": {\n    \"notStarted\": [\n      {\n        \"id\": \"95a7529b-e750-4c2a-867c-cdb9b167ae34\",\n        \"name\": \"Investigación de nuevos materiales para la construcción del chasis\",\n        \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidid.\",\n        \"priority\": 1,\n        \"assignee\": {\n          \"id\": \"f8c2280f-3840-490f-b85a-0779badd8f66\",\n          \"name\": \"George Russell\"\n        }\n      },\n      ...\n    ],\n    \"inProgress\": [\n      ...\n    ],\n    \"inReview\": [\n      ...\n    ],\n    \"done\": [\n      ...\n    ]\n  }\n}\n```\n\n---\n\n#### GET `/projects/\u003cid\u003e/members/` - _Obtener miembros del proyecto ☆_\n\n**Salida**\n\n```json\n[\n  {\n    \"id\": \"4fceb6df-d3ac-4f5a-b177-995ac5673d1a\",\n    \"email\": \"valtteribottas@example.com\",\n    \"firstNames\": \"Valtteri\",\n    \"lastNames\": \"Bottas\"\n  },\n  ...\n]\n```\n\n---\n\n#### PUT `/projects/\u003cid\u003e/` - _Actualizar proyecto ☆_\n\n**Entrada**\n\n- `name` (opcional)\n- `description` (opcional)\n- `parent` (opcional) - _ID del proyecto papá_\n- `leaders` (opcional) - _IDs de usuarios líderes separados por \",\"_\n- `members` (opcional) - _IDs de usuarios miembros separados por \",\"_\n\n---\n\n#### DELETE `/projects/\u003cid\u003e/` - _Eliminar proyecto ☆_\n\n---\n\n### Tasks\n\n#### POST `/tasks/` - _Crear tarea ☆_\n\n**Entrada**\n\n- `name`\n- `description` (opcional)\n- `priority` (opcional) - _Entero. 0 es baja, 1 es media, 2 es alta, default es 0_\n- `start_date` (opcional) - _Fecha de inicio en formato YYYY-MM-DD, default es hoy, o `due_date` si ésta es del pasado_\n- `due_date` - _Formato YYYY-MM-DD_\n- `parent_project` - _ID del proyecto papá_\n- `parent_task` (opcional) - _ID de la tarea papá_\n- `assignee` - _ID del usuario asignado_\n\n---\n\n#### GET `/tasks/\u003cid\u003e/` - _Obtener tarea_\n\n**Query params**\n\n- `get` - _Para obtener respuestas parciales de solo la información de la tarea o solo las subtareas de la misma (sí ahorra mucho tiempo)._\n  - _Opciones: `info`, `tasks`, `all`, default es `all`_\n- `view` - _Cambia el formato de la respuesta para facilitar el front._\n  - _Opciones: `table`, `kanban`, `calendar`, default es `table`_\n- `assigned` - _Mostrar solo tareas asignadas al usuario. Si la request no tiene autenticación, este parámetro se ignora._\n  - _Opciones: `true`, `false`, default es `false`_\n- `subtree` - _Mostrar todo el subárbol de tareas debajo de la tarea actual._\n  - _Opciones: `true`, `false`, default es `false`_\n\n**Salida**\n\nEjemplo con parámetros default:\n\n```json\n{\n  \"id\": \"0191827d-1e38-4647-885c-aef73ea494b0\",\n  \"name\": \"Peso y distribución\",\n  \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidid.\",\n  \"status\": 3,\n  \"priority\": 0,\n  \"startDate\": \"2024-02-13\",\n  \"dueDate\": \"2024-02-21\",\n  \"assignee\": \"Alexander Albon\",\n  \"breadcrumbs\": [\n    [\n      \"4bfca576-83d2-447a-9b79-cdc778417c84\",\n      \"FSAE 2024\",\n      false\n    ],\n    ...\n  ],\n  \"tasks\": [\n    {\n      \"id\": \"0191827d-1e38-4647-885c-aef73ea494b0\",\n      \"name\": \"Peso y distribución\",\n      \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidid.\",\n      \"status\": 3,\n      \"priority\": 0,\n      \"startDate\": \"2024-02-13\",\n      \"dueDate\": \"2024-02-21\",\n      \"assignee\": \"Alexander Albon\",\n      \"parentProject\": \"887ebfdd-bd39-417c-9b42-90396c2b8e59\",\n      \"parentTask\": null\n    },\n    ...\n  ]\n}\n```\n\nEjemplo con get=`tasks`\u0026view=`calendar`:\n\nNota: las fechas son arreglos de dos números, que representan la posición de la tarea (o tareas) en la matriz del calendario.\n\n```json\n{\n  \"tasks\": [\n    {\n      \"date\": [\n        0,\n        3\n      ],\n      \"tasks\": [\n        {\n          \"id\": \"9bcfd443-9ff2-42cd-b69e-75aa032891e1\",\n          \"name\": \"Diseño del chasis\",\n          \"status\": 0,\n          \"priority\": 0\n        },\n        ...\n      ]\n    },\n    ...\n  ],\n  \"today\": [\n    1,\n    5\n  ]\n}\n```\n\nEjemplo con get=`tasks`\u0026view=`kanban`:\n\n```json\n{\n  \"tasks\": {\n    \"notStarted\": [\n      {\n        \"id\": \"95a7529b-e750-4c2a-867c-cdb9b167ae34\",\n        \"name\": \"Investigación de nuevos materiales para la construcción del chasis\",\n        \"description\": \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incidid.\",\n        \"priority\": 1,\n        \"assignee\": {\n          \"id\": \"f8c2280f-3840-490f-b85a-0779badd8f66\",\n          \"name\": \"George Russell\"\n        }\n      },\n      ...\n    ],\n    \"inProgress\": [\n      ...\n    ],\n    \"inReview\": [\n      ...\n    ],\n    \"done\": [\n      ...\n    ]\n  }\n}\n```\n\n#### PUT `/tasks/\u003cid\u003e/` - _Actualizar tarea ☆_\n\n**Entrada**\n\n- `name` (opcional)\n- `description` (opcional)\n- `priority` (opcional) - _Entero. 0 es baja, 1 es media, 2 es alta, default es 0_\n- `start_date` (opcional) - _Fecha de inicio en formato YYYY-MM-DD, default es hoy, o `due_date` si ésta es del pasado_\n- `due_date` (opcional) - _Formato YYYY-MM-DD_\n- `parent_project` (opcional) - _ID del proyecto papá_\n- `parent_task` (opcional) - _ID de la tarea papá_\n- `assignee` (opcional) - _ID del usuario asignado_\n\n---\n\n#### PUT `/tasks/\u003cid\u003e/status/` - _Cambiar estado de tarea ☆_\n\n**Entrada**\n\n- `status` - _Entero. 0 es pendiente, 1 es en progreso, 2 es en revisión, 3 es completada_\n\n---\n\n#### DELETE `/tasks/\u003cid\u003e/` - _Eliminar tarea ☆_\n\n---\n\nPowered by SALAD, Society of Academic Labor and Application Development.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fumactually%2Fdevotion-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fumactually%2Fdevotion-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fumactually%2Fdevotion-backend/lists"}