Compare commits

..

3 Commits

Author SHA1 Message Date
2598c7f8fc convert on run 2021-03-02 12:26:19 +01:00
c5ed0343c6 stats par semaine 2021-03-02 12:09:05 +01:00
b131a2400b start export markdown 2021-03-02 11:57:31 +01:00
5 changed files with 413 additions and 40 deletions

View File

@ -24,10 +24,14 @@ puis naviguer sur https://localhost:3300
## Comment ça marche? ## Comment ça marche?
Mettre les gtg_tasks.xml Mettre les gtg_tasks.xml et tags.xml dans le dossier source.
Lancer le serveur node,
aller sur
http://localhost:3300
Ce serveur va lire un fichier dans le dossier source, celui des tâches de GTG, puis en faire un json, et en sortir des statistiques dans une page web.
Ce serveur va lire un fichier dans le dossier **source**, celui des tâches de GTG, puis en faire un json, et en sortir des statistiques dans une page web ainsi qu'un fichier markdown dans le dossier **output**.
## sources ## sources

View File

@ -1 +1,259 @@
# Export de Tags GTG du 02/03/2021 à 11:09:59 # Export de Tâches GTG
date: 02/03/2021 à 12:24:30
# Rapport hebdomadaire de dev
## 8 ont été fermées
* node
* agenda du libre
* faire une page qui donne les infos d'un commerce via addok
* mettre un store vuex
* @cil faire la page de chiffrement et déchiffrement sur @framadate
* tester le speech to text de mozilla common voice
* * trouver où sont stockées les données de GTG
* * les ajouter au backup borg
---
# Rapport des tâches durant les 7 derniers jours
## 29 ont été fermées
* Boulot
* node
* voix du nucléaire
* contacter une boite pour faire un devis @mail ou @tel
* rdv conf jitsi avec Myrto
* agenda du libre
* faire une page qui donne les infos d'un commerce via addok
* ménage dans nextcloud, dédupliquer et ne garder que les textes, les assos, et osm @spaceship
* @nas décharger le dossier home vers le bazar de @spaceship @backup @archives
* enlever les dossiers de backup de Drive
* faire un borg @backup sur le @nas
* mettre un store vuex
* rdv @tel déchetterie pour les cartons
* copier les dossiers de @backup de prod de @fatland dans le nas
* copier les musiques du NAS dans spaceship @backup
* @cil faire la page de chiffrement et déchiffrement sur @framadate
* tester le speech to text de mozilla common voice
* contacter le support de PCW @tel
* * trouver où sont stockées les données de GTG
* * les ajouter au backup borg
* demander paiement
* renouveller les papiers sur malt
* demander validation des jours pour février par @mail a Thierry
* commander resto chat botté
* scotch électrique veilleuses du breau
* les appeler @tel
* envoyer pitch de présentation OSM à krys
* trouver un contact @tel pour assurance pacifica, regarder sur une facture assurance voiture
* fatland extraire les textes non syncronisés avec nextcloud
## 68 ont été ouvertes
* noter les anniv de la famille fontenay
* faire un mail de suivi à la liste edu concernant le podcast libre à vous @mail
* nextcloud prob avec les pdf
* choisir un spot lumineux pour le sapin
* voir pour une selle plus confortable @vélo @achat
* réparer la commande via interrupteur enocean
* syncro dans le NAS après un borg backup du spaceship
* dédupliquer la musique sur @spaceship
* trouver une chiffroparty sur l'agenda du libre / mobilizon
* faire compte du mois après paiement de mission
* voir Estelle et compagnie
* @badoune accès à son site
* ajout de typo dans ubuntu
* ranger les tâches de la semaine dans un tag @grosse_pierre
* essayer freecad pour faire une maison
* monter video accéléré osm forêt mapping
* monter les dossiers de serveurs distants sur un dossier de catwoman @spaceship
* @framadate @symfony rétablir l'api framadate sur @sys
* persister un sondage : enregistrer le cas de choix identiques pour tous les choix
* @frontend @framadate style de formulaire selon les maquettes posant les questions
* @frontend enregistrer un objet de forulaire localement
* faire marcher l'api framadate localement en php8
* mettre icinga sur le @vps
* monitorer avec icinga les différents serveurs par un ping
* prendre un bearer token de connec
* lancer la mutation GraphQl de création d'event
* faire marcher localement l'import d'event en masse
* réinstall la bdd postgresql sur @spaceship
* bitwarden dédupliquer grâce à keepass
* @blog présentation du transcripteur vosk @media
* @backup faire marcher syncthing correctement entre @spaceship et @cloud et @spare
* @edu @gtg regarder la doc de recherche
* étudier ajout de @nextcloud pour les @voixdunuc
* @vosk transcription améliorer le script de conversion de tous les inputs
* participer à une visio chiffrofête
* @edu tester emacs et orgmode
* @nas ranger les vidéos du dossier docu conf youtube
* sauvegarder les vidéos du @nas sur un disque externe
* chaussons
* drap lit de Fao
* serveur node en backend pour s'authentifier
* appel oauth
* carte resto à faire
* envoi du mail suivi réparation par email @mail à support@pcw.fr
* importer les entités dans le dépot sf5
* remplacer le contenu du dépot date-poll-api par celui de sf5
* mettre à jour les prérequis de dépendance avec php8
* config docker
* @osm mettre à jour déchetterie https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drecycling
* mission en cours HigcoBox
* matomo check sur pages du staging
* intercom passer par node
* générer un fichier d'env pour le staging
* regarder des sites de mission logiciel libre https://www.libre-entreprise.org/
* exporter la liste de mes titres likés sur spotify avec un coup de wget
* stopper mon abonnement spotify
* envoyer à novaa par @mail les papiers fiscalité axa
* fin de @mission
* @cil atelier libération de tel des gafam
https://mypads.framapad.org/mypads/?/mypads/group/cil-gometz-0vj64720/pad/view/telephones-libres-ejj847vy
* proposer libre en fête
* gestion d'assurance
* récupérer recommandé a la poste avant 17h30
* écrire un exportateur de tâches de GTD depuis GTG vers un format json
* @dev faire un environnement de dev local @nextcloud
* ajouter une variable matomo custom
* matomo envoyer la valeur SC si présent dans l'url
* faire une app de démo pour nextcloud
* faire une page qui fasse comme cryptpad pour être déchiffrée @chiffrement @dev
---
# Rapport des autres tâches durant le mois
## 29 ont été fermées
## 68 ont été ouvertes
---
# Stats de fermeture des tâches
---
# Export de toutes les 264 tâches ouvertes GTG
---
# Export de toutes les 183 tâches fermées GTG
# Export de Tags GTG
* @osm , 39
* @graph , 10
* @forum , 2
* @dev , 115
* @vélo , 6
* @écriture , 8
* @rémunéré , 16
* @edu , 28
* @mail , 23
* @vacances , 12
* @tel , 17
* @mobilizon , 26
* @elec , 4
* @pognon , 9
* @travaux , 29
* @administratif , 9
* @associatif , 34
* @serveur , 3
* @work , 30
* @nextcloud , 16
* @encryption , 2
* @untouched , 82
* @adminsys , 16
* @recherche , 19
* @tasks , 5
* @social , 14
* @GTG , 5
* @sys , 30
* @vps , 5
* @qzine , 3
* @blog , 11
* @solabaie , 2
* @createrra , 1
* @contacts , 3
* @carnet , 1
* @opendata , 2
* @achat , 15
* @cuisine , 1
* @livre , 12
* @achats , 0
* @nas , 7
* @musique , 1
* @DL , 1
* @nginx , 2
* @sysadmin , 1
* @impots , 1
* @degfam , 1
* @tesla , 1
* @lecture , 13
* @boulot , 22
* @mastodon , 4
* @backup , 33
* @claire , 12
* @famille , 11
* @video , 3
* @waiting_for, , 0
* @déconfinage , 11
* @waiting_for , 11
* @josm , 14
* @bot , 2
* @scraping , 13
* @chapril , 1
* @jardin , 15
* @cil-gometz , 9
* @photo , 2
* @fanzine , 3
* @interview , 4
* @audio , 2
* @dadou , 2
* @gtg , 2
* @resolv , 1
* @fibre , 1
* @peertube , 3
* @cloud , 2
* @media , 2
* @extérieur , 14
* @voixdunuc , 5
* @fediverse , 42
* @admins , 0
* @april , 3
* @spaceship , 12
* @ordi , 1
* @plume , 3
* @oauth , 9
* @monitoring , 3
* @bitwarden , 1
* @archives , 2
* @chiffrement , 14
* @graphql , 5
* @livestream , 3
* @install , 1
* @rails , 3
* @fatland , 2
* @courrier , 1
* @klassroom , 2
* @caisse , 3
* @symfnoy , 0
* @domoticz , 2
* @autohébergement , 3
* @grivery , 3
* @framadate , 12
* @badoune , 2
* @grosse_pierre , 6
* @symfony , 13
* @inbox , 2
* @frontend , 11
* @spare , 1
* framadate , 0
* @vosk , 1
* @rangement , 3
* @mission , 8
* @assurance , 3
rapport généré avec gtg2nodejs par tykayn - contact@cipherbliss.com

View File

@ -12,6 +12,7 @@
"fs": "0.0.1-security", "fs": "0.0.1-security",
"http-errors": "^1.6.3", "http-errors": "^1.6.3",
"jade": "^1.11.0", "jade": "^1.11.0",
"lodash": "^4.17.21",
"morgan": "^1.9.1", "morgan": "^1.9.1",
"pug": "^3.0.0" "pug": "^3.0.0"
}, },

View File

@ -1,12 +1,12 @@
var express = require('express'); var express = require('express');
var fs = require('fs'); var fs = require('fs');
var _ = require('lodash');
var parseString = require("xml2js").parseString; var parseString = require("xml2js").parseString;
var router = express.Router(); var router = express.Router();
var fileToOpen = 'gtg_tasks'
// const convertFiles = true; let convertFiles = true;
let convertFiles = false; // let convertFiles = false;
let computeDataOnExtract = true; let computeDataOnExtract = true;
let jsonAllData = { let jsonAllData = {
@ -67,17 +67,57 @@ function computeData(jsonAllData) {
// let tagCountTasks = Object.create(jsonAllData.tags); // let tagCountTasks = Object.create(jsonAllData.tags);
jsonAllData.stats = { jsonAllData.stats = {
tasksCount : jsonAllData.tasks.project.task.length, tasksCount : jsonAllData.tasks.project.task.length,
tasksClosed: 0, tasksClosed : 0,
tasksOpen : 0, tasksOpen : 0,
maxTasksCountPerTag : 0, maxTasksCountPerTag: 0,
listOpen : [], listOpen : [],
listClosed : [], listOpenWeekly : [],
listOpenMonthly : [],
listClosed : [],
listClosedWeekly : [],
listDevWeeklyClosed : [],
listClosedMonthly : [],
} }
let now = new Date();
for (let t of jsonAllData.tasks.project.task) { for (let t of jsonAllData.tasks.project.task) {
// console.log('t', t) // console.log('t', t)
let tags = t["$"].tags.split(',') let tags = t["$"].tags.split(',')
// count open and closed tasks
let dateOfTask = new Date()
if (t['$'].status == 'Active') {
jsonAllData.stats.listOpen.push(t)
let addeddate = new Date(t.addeddate)
let daysDiff = getNumberOfDaysDiffTwoDates(addeddate, now);
if (daysDiff <= 7) {
jsonAllData.stats.listOpenWeekly.push(t)
} else if (daysDiff >= 7 & daysDiff <= 31) {
jsonAllData.stats.listOpenMonthly.push(t)
}
} else if (t['$'].status == 'Done') {
jsonAllData.stats.listClosed.push(t)
let donedate = new Date(t.donedate)
let daysDiff = getNumberOfDaysDiffTwoDates(donedate, now);
if (daysDiff <= 7) {
jsonAllData.stats.listClosedWeekly.push(t)
// tâches uniquement de dev
if((/\b(dev|sysadmin|écriture|edu|fediverse)\b/g).test(t['$'].tags)
){
jsonAllData.stats.listDevWeeklyClosed.push(t)
}
} else if (daysDiff >= 7 & daysDiff <= 31) {
jsonAllData.stats.listClosedMonthly.push(t)
}
}
for (let tag of tags) { for (let tag of tags) {
// console.log('tag', tag) // console.log('tag', tag)
jsonAllData.tags.tagstore.tag.map(elem => { jsonAllData.tags.tagstore.tag.map(elem => {
@ -103,29 +143,30 @@ function computeData(jsonAllData) {
elem.tasksListByTitle.push(t.title) elem.tasksListByTitle.push(t.title)
if (t['$'].status == "Active") { if (t['$'].status == "Active") {
elem.tasksListIsActiveByTitle.push(t.title) elem.tasksListIsActiveByTitle.push(t.title)
} }
if (t['$'].status == "Done") { if (t['$'].status == "Done") {
elem.tasksListIsDoneByTitle.push(t.title) elem.tasksListIsDoneByTitle.push(t.title)
} }
} }
if(elem.tasks > jsonAllData.stats.maxTasksCountPerTag){ if (elem.tasks > jsonAllData.stats.maxTasksCountPerTag) {
jsonAllData.stats.maxTasksCountPerTag = elem.tasks jsonAllData.stats.maxTasksCountPerTag = elem.tasks
} }
}) })
} }
if (t.donedate) {
jsonAllData.stats.tasksClosed++;
jsonAllData.stats.listOpen.push(t);
} else {
jsonAllData.stats.tasksOpen++;
}
// console.log('tags', tags)
} }
// sort tags by name
return jsonAllData return jsonAllData
} }
const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
function getNumberOfDaysDiffTwoDates(firstDate, secondDate) {
return Math.round(Math.abs((firstDate - secondDate) / oneDay));
}
function convertOneXmlToJson(fileToOpen, res) { function convertOneXmlToJson(fileToOpen, res) {
fs.readFile(`sources/${fileToOpen}.xml`, "utf-8", function (err, data) { fs.readFile(`sources/${fileToOpen}.xml`, "utf-8", function (err, data) {
if (err) console.log(err); if (err) console.log(err);
@ -146,40 +187,105 @@ function getPercent(someCount, total) {
function computeBgColorOnProportionOfOpenTasks(someProportionNumber) { function computeBgColorOnProportionOfOpenTasks(someProportionNumber) {
let result = ''; let result = '';
if(someProportionNumber >= 95){ if (someProportionNumber >= 95) {
result = 'proportion-over-95' result = 'proportion-over-95'
} } else if (someProportionNumber >= 90) {
else if(someProportionNumber >= 90){
result = 'proportion-over-90' result = 'proportion-over-90'
} } else if (someProportionNumber >= 80) {
else if(someProportionNumber >= 80){
result = 'proportion-over-80' result = 'proportion-over-80'
} } else if (someProportionNumber >= 65) {
else if(someProportionNumber >= 65){
result = 'proportion-over-65' result = 'proportion-over-65'
} } else if (someProportionNumber >= 50) {
else if(someProportionNumber >= 50){
result = 'proportion-over-50' result = 'proportion-over-50'
} } else if (someProportionNumber >= 40) {
else if(someProportionNumber >= 40){
result = 'proportion-over-40' result = 'proportion-over-40'
} } else if (someProportionNumber >= 25) {
else if(someProportionNumber >= 25){
result = 'proportion-over-25' result = 'proportion-over-25'
} } else if (someProportionNumber >= 15) {
else if(someProportionNumber >= 15){
result = 'proportion-over-15' result = 'proportion-over-15'
} }
return result; return result;
} }
let datenow = new Date();
let dataTagsMd = `# Export de Tâches GTG \n date: ` + datenow.toLocaleString()
function exportToMarkdown(res) { function exportToMarkdown(res) {
let datenow = new Date();
let dataTagsMd = '# Export de Tags GTG du '+ datenow.toLocaleString(); // fichier de rapport des tâches fermées durant les 7 derniers jours
dataTagsMd += `\n# Rapport hebdomadaire de dev `;
dataTagsMd += `\n## ${jsonAllData.stats.listDevWeeklyClosed.length} ont été fermées `;
jsonAllData.stats.listDevWeeklyClosed.map(elem => {
dataTagsMd += `\n * ${elem.title}`;
})
dataTagsMd += `\n `;
dataTagsMd += `\n---`;
dataTagsMd += `\n `;
dataTagsMd += `\n# Rapport des tâches durant les 7 derniers jours `;
dataTagsMd += `\n `;
dataTagsMd += `\n## ${jsonAllData.stats.listClosedWeekly.length} ont été fermées `;
dataTagsMd += `\n `;
jsonAllData.stats.listClosedWeekly.map(elem => {
dataTagsMd += `\n * ${elem.title}`;
})
dataTagsMd += `\n## ${jsonAllData.stats.listOpenWeekly.length} ont été ouvertes `;
dataTagsMd += `\n `;
jsonAllData.stats.listOpenWeekly.map(elem => {
dataTagsMd += `\n * ${elem.title}`;
})
dataTagsMd += `\n--- `;
// fichier de rapport des tâches fermées durant les 31 derniers jours
dataTagsMd += `\n# Rapport des autres tâches durant le mois `;
dataTagsMd += `\n `;
dataTagsMd += `\n## ${jsonAllData.stats.listClosedWeekly.length} ont été fermées `;
dataTagsMd += `\n `;
dataTagsMd += `\n## ${jsonAllData.stats.listOpenWeekly.length} ont été ouvertes `;
dataTagsMd += `\n `;
dataTagsMd += `\n--- `;
// stats de fermeture des tâches
dataTagsMd += `\n# Stats de fermeture des tâches `;
dataTagsMd += `\n `;
dataTagsMd += `\n--- `;
dataTagsMd += `\n `;
dataTagsMd += `\n# Export de toutes les ${jsonAllData.stats.listOpen.length} tâches ouvertes GTG \n `;
dataTagsMd += `\n `;
// jsonAllData.stats.listOpen.map(elem => {
// dataTagsMd += `\n## ${elem.title} `;
// dataTagsMd += `\n statut : ${elem['$'].status} `;
// dataTagsMd += `\n créé le : ${elem.addeddate} `;
// dataTagsMd += `\n modifié le : ${elem.modified} `;
// dataTagsMd += `\n prévu pour : ${elem.duedate | ''} `;
// dataTagsMd += `\n ${elem.content} `;
// })
dataTagsMd += `\n--- `;
dataTagsMd += `\n `;
dataTagsMd += `\n# Export de toutes les ${jsonAllData.stats.listClosed.length} tâches fermées GTG \n `;
dataTagsMd += `\n `;
//
// jsonAllData.stats.listClosed.map(elem=>{
// dataTagsMd += `\n * ${elem.title} `;
// })
dataTagsMd += `\n `;
dataTagsMd += `\n# Export de Tags GTG \n `;
dataTagsMd += `\n `;
dataTagsMd += `\n `;
let sortedTagsByTitle = _.sortBy(jsonAllData.tags.tagstore.tag, [(o) => {
o["$"].name
}])
sortedTagsByTitle.map(elem => {
dataTagsMd += `\n * ${elem['$'].name} , ${elem.tasks | 0}`;
})
dataTagsMd += `\n `;
dataTagsMd += `\n rapport généré avec gtg2nodejs par tykayn - contact@cipherbliss.com `;
// write file to disk // write file to disk
fs.writeFile('output/export_tags.md', dataTagsMd, 'utf8', (err) => { fs.writeFile(`output/export_tags.md`, dataTagsMd, `utf8`, (err) => {
if (err) { if (err) {
console.log(`Error writing file: ${err}`); console.log(`Error writing file: ${err}`);

View File

@ -6,8 +6,12 @@ block content
section.tasks section.tasks
h2 #{json.tasks.project.task.length} Tâches h2 #{json.tasks.project.task.length} Tâches
ul.stats ul.stats
li #{json.stats.tasksOpen} ouvertes li #{json.stats.listOpen.length} ouvertes
li #{json.stats.tasksClosed} fermées li #{json.stats.listOpenWeekly.length} ouvertes cette semaine
li #{json.stats.listOpenMonthly.length} ouvertes ce mois-ci
li #{json.stats.listClosed.length} fermées
li #{json.stats.listClosedWeekly.length} fermées cette semaine
li #{json.stats.listClosedMonthly.length} fermées ce mois-ci
section.tags section.tags
h2 #{json.tags.tagstore.tag.length} Tags h2 #{json.tags.tagstore.tag.length} Tags
p maximum de #{json.stats.maxTasksCountPerTag} tâches pour un tag. p maximum de #{json.stats.maxTasksCountPerTag} tâches pour un tag.