-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Song files management (.sg) #19
Comments
Déolé, je n'arrrive pas à m'exprimer en anglais (vivement mon stage en angleterre ...) On peut juste vérifier si personne d'autre n'a fait de modifs entre-temps. Pour ça, on peut utiliser l'étape de validation des formulaires (surchager la méthode
Je ne comprend pas cette phrase =( Sinon, moi je l'aurai fait dans l'autre sens : d'abord la partie affichage, ensuite la partie sauvegarde et commit. Mais pourquoi pas dans ce sens =) |
Honnêtement, je préfèrerais pour l'instant un lock strict (si quelqu'un a entamé des modifs, les autres attendent). J'aimerais pas que je fasse des modifs et que sur mon 'save' on me dise qu'il faut recommencer parce que quelqu'un d'autre a modifié entre temps, et je ne pense pas que le commun des guitaristes de feu de camp sache s'y retrouver dans un merge à trois voies ;) donc je n'envisage pas cette solution pour régler les conflits ...
"le BE (partie de l'app sur le serveur) ne fait pas de compilation/transformation (au moins au début, peut-être plus tard)"
Ça, c'est mon penchant naturel ;) de préferer faire fonctionner les services avant leur présentation à l'utilisateur. Tu l'auras sans doute perçu, je suis plutôt BE que FE. |
À ce moment, c'est la vue Edit qu'il faut bloquer, d'une manière ou d'une autre. Peut-être avec un décorateur ? |
Question, finalement on utilise des VersionedFileField ou non pour les fichiers .sg ? |
Je suis en train d'y jeter un oeil; je vois un problème : ce module crée ses propres noms de fichiers, tous dans un répertoire (cf https://github.com/Yaco-Sistemas/django-vff/blob/master/vff/field.py#L57 et https://github.com/Yaco-Sistemas/django-vff/blob/master/vff/git_backend.py#L97 ).
|
Je suis pour la première solution aussi : ils semble qu'ils utilisent des noms de fichiers étranges pour garantir l'unicité des fichiers, ce dont on a moins besoin pour notre part (les noms étrange j'entends !) |
Juste un petit point sur l'état des choses: J'ai mené quelques réflexions et recherches concernant la modification des fichiers d'une part et l'ajout dans le VCS (séquence add-commit). Dans les deux cas, on a des risques de corruption suite à des accès parallèles (multi-thread et/ou multi-process). J'envisage deux solutions:
J'ai moins de temps en ce moment, donc ça avance moins vite, mais je n'oublie pas ;) Je peux rapidement programmer l'accès en lecture pour affichage si l'un de vous en a besoin; dites moi ! |
Je pense qu'il est plus simple dans un premier temps de faire un lock (les partiels approchant, mon temps disponible va fortement est réduit les prochains jours...) |
Ça me va aussi =)
Moi je viens de finir, et je vais avoir une semaine de vacances avant de reprendre, donc ça va être l'inverse ^^ Par contre, en lien avec le stokage, je me demande comment sera gérée la position des fichiers : avec une fonction du style |
un champ en BDD ? |
Oui, un champ en bdd est une des idées. Ou alors utiliser une des fonctions de gitpython BlockingLockFile ou LockFile. J'ai vaguement commencé avec une table en bdd, puis me suis décidé à poser la question sur SO qui ont apporté des avis plutôt négatifs sur les locks en général . Je pense que cette réticence aux locks est à modérer dans notre cas par le fait que nous n'attendons pas souvent des éditions d'un fichier par plusieurs utilisateurs en parallèle, c'est plutôt le cas d'exception - dont il faut se protéger toutefois. |
Je suis plutôt pour les fonctions de gitpython pour ma part -> le lock n'est ainsi lié qu'à une instance et pas à une entrée dans la BDD. Concernant les réponses sur SO, je suis assez d'accord avec le dernier commentaire : ceux qui utilisent git n'aiment pas les verrous ! Mais dans notre cas c'est en effet moins gênant, les éditions successives seront plutôt des corrections que des réécritures complètes. |
légère imcompréhension : le champ en BDD était en réponse à "comment sera gérée la position des fichiers?" |
Pour la position des fichiers : n'est ce pas pour l'instant le champ |
C'est ça pour l'instant, mais je me demandais ce que ça serait plus tard ^^ Je n'en ai pas encore besoin, mais ça sera utile pour la génération des fichiers .sb, dernière étape avant la compilation des carnets ! |
J'ai des interrogations... qui cherchent des réponses dans les 'use cases'. Commençons avec le point suivant:
Que se voit-il alors présenter pour
|
Moi je suis pour le message 1 =) Du coup ça nécessite de stocker le commit en plus dans le carnet de chant, et de faire une comparaison. La question suivante est effectue-t-on cette comparaison lors de l'affichage du champ ou lors de la compilation du carnet ? |
Aussi pour le 1, mais je pense plutôt à une autre question: |
Pour la compilation, je pensais plutôt à une mise en cache : la dernière version PDF du carnet est mise en cache pendant 1 ou 2 semaine, puis supprimée du serveur. Mais il faut aussi discuter de ce point, en effet =) |
moi aussi, on est tous d'accord 👍
C'est ce que j'aurais envisagé aussi.
Lorsque l'utilisateur ré-ouvre son carnet, on pourrait afficher
Lorsque l'utilisateur clique sur la mise à jour d'un ou de tous le chants, deux possibilités:
Je serais pour la mise à jour directe, mais il faut alors se mettre d'accord sur ce qu'est une mise à jour : une correction d'erreurs. Si une mise à jour pourrait être par exemple un changement de tonalité, je suis pour afficher le diff et laisser choisir. |
En bonus on pourrait proposer d'envoyer le carnet par mail (sorte de backup déporté) Concernant la gestion des différentes versions (en fonction des commits), il faut d'abord un gros travail sur le moteur de rendu! (et en fonction de son implémentation, gérer celle du site web) |
Je pensais utiliser deux chemins d'inclusion : Soit le chant est à la dernière version et on met
À ce moment là, il faut soit stocker le type de mise à jour, soit choisir pour tous les chants. Concernant le changement de tonalité, il n'est pas nécessaire de mettre à jour le chant pour l'effectuer : le package |
oui, on est ok La tonalité, c'était juste un exemple de modification du contenu. Ça pourrait aussi être l'ajout d'un couplet. |
si un système de file d'attente est implémentée, le dossier |
Oui, en effet ... Du coup, avec le préprocesseur, on peut récupérer dans le dossier temporaire l'ensemble des fichiers .sg nécessaires, avec toutes les versions ; et faire des |
Aujourd'hui, on a ça pour la base de fichiers actuellement connus (réalisé avec AsciiFlow) :
Il va falloir en plus stocker une information similaire pour les
Pour la génération, seul le C'est pour trouver les bonnes réponses aux questions suivantes que c'est plus galère :
C'est pour cette raison que Même si
Comme à la création du book les informations sont prises dans le Qu'est ce que ça vous inspire ? |
Un autre "problème" : j'ouvre mon carnet d'il y a un an qui contenait "la juman de micho". Une bonne âme a corrigé le titre entre temps. Mon carnet référence donc une version ancienne du fichier. Dans la table "Song", il y a maintenant "La jument de Michao". Le titre "la juman de micho" n'est plus accessible dans notre db. Possibilités pour la gestion de carnet avec des versions anciennes de chants :
Stocker song et artist pour chaque chant dans un carnet pourrait donner ceci :
Qu'est ce que ça vous inspire ? |
Pour ma part, je voyais plutôt l'ensemble comme ça :
Le champ
Je croit qu'il suffit de comparer la valeur de
Où se trouve-t-il : l'ID du chant n'a pas changée, donc pour retrouver le chemin de l' Toutefois ce système ne permet pas de savoir si le fichier a été renommé sans aller chercher l'ancienne version du fichier .sg.
Ce n'est pas grave, vu que l'on accède pas aux chants par leur titre.
Tu parle de l'affichage web ? Je suis pour afficher les infos mises à jour, ou un message : "ce chant a été supprimé, vous pouvez toutefois continuer à l'utiliser dans ce carnet" dans le cas où il l'a été.
Pour moi, on ne va chercher les versions anciennes que lors de la compilation, ou de la visualisation de l'historique. On peut aussi se dire que sauf suppression, les utilisateurs voudront bien des dernières versions, et afficher une page de mise à jour avant d'accéder à un carnet ancien. Sur cette page on affiche les différences, et on permet la mise à jour. Il ne reste à aller parser pour affichage que les chants qui ne sont pas à leur dernière version. |
Si un chant est supprimé, l'artiste correspondant n'est pas nécessairement supprimé ! (et je pense qu'on va se pourrir la vie a essayer de gérer les chants supprimés) |
Ça sert principalement à permettre aux utilisateurs de retrouver leurs carnets tels qu'ils étaient 1 ou 2 ans avant. Une autre solution serait de ne pas gérer les versions de chants et de simplement garder les fichiers PDF correspondant aux carnets indéfiniment. En limitant du coup le nombre de carnets par utilisateurs (5 ou 10) Une autre solution encore, à laquelle je viens de penser serait de garder les infos (artist, title, commit) du chant dans un champ supplémentaire du modèle ItemsInSongbook, par exemple de type JSON Field. C'est la question "où met-on les informations ?" : dans une autre table ou dans un champ supplémentaire. Cette dernière solution est moins souple, mais doit permettre de recréer le carnet à l'identique : la seule information utile pour la création du PDF est après tout le commit : si on peut récupérer le fichier originel, on a alors accès à toutes les infos. Et pour l'affichage, on peut effectuer une comparaison du commit, et si ce dernier diffère, aller chercher l'ancien titre et l'ancien artiste. |
Oui, c'est une possibilité. On peut même dire que l'utilisateur est responsable de conserver son PDF si il veut le réutiliser plus tard, ça nous évite la responsabilité du stockage (à part pour une certaine durée, le temps qu'ils le récupèrent).
Vu le temps que prennent les accès via l'ORM, c'est une solution que je trouve tout à fait viable. Le stockage en table serait plus 'correct', mais si les temps de traitement explosent, bof. Il y a certainement moyen d'optimiser - juste les requêtes SQL pour les quelques copies à faire ne devraient pas prendre beaucoup de temps, mais est-ce-que ça vaut le coup?
En fait, l'object hash est même suffisant. |
👍
👍
il y a moyen de faire des JOIN et autre dans la BDD (c'est même fait pour ça ...) |
La question est : quels avantages y a-t-il a utiliser des tables supplémentaires, et quels avantages à utiliser deux champs ( |
merci pour ta compassion :) Même si ça fait ch... de faire des trucs qu'on doit jeter, je reste objectif : si c'est mieux, on fait comme ça. Quelquefois, faut essayer pour décider.
je ne suis pas sûr de ce que tu veux dire. Je ne suis pas expert en django, mais il me semble que l'ORM fonctionne en lazy, et qu'il met des join là où il en faut. Perso, si on peut éviter le SQL direct, je préfère, à cause d'une part du traitement des risques d'injection et d'autre part du découplage des classes de modèles qui oblige à mettre à jour les requêtes à chaque modif des modèles. |
Je suis bien incapable de savoir le fonctionnement de l'ORM de django... @jmclem si je comprends bien tu as implémenté le schéma d'un de tes messages précédents ?
(à propos duquel je suis encore dubitatif concernant la pertinence de |
oui
ce n'est pas faute d'avoir essayé... |
Concernant les perfs : j'aimerais comprendre où le temps est perdu. Je vais essayer de profiler et de voir si on peut optimiser le truc. Si ça ne marche pas, je reconvertis avec le stockage en JSON dans ItemsInSongbook. |
Il y a bien eu quelques messages, mais aucune décision clairement prise à ma connaissance ? (#35) |
Il fonctionne effectivement en lazy. Tout est là : https://docs.djangoproject.com/en/dev/ref/models/querysets/
Je ne sais pas. Il peut fonctionner en CGI avec apache si j'ai tout bien compris. Je peut tenter de faire des test là dessus si besoin. Sinon pour les requêtes, elles sont donnée en détail par django-toolbar. |
J'ai fait tourner un profiler chez moi; le temps était passé dans les commits :
Après recherches, j'ai compris que la cause en est que par défaut django est en autocommit : chaque appel db est suivi d'un commit (voir la doc).
|
Effectivement la différence est visible! |
Alors pour la partie synchronisation du dépôt avec la bdd, on peut utiliser ça (http://developer.github.com/webhooks/) pour savoir quand un push a été fait sur le dépôt. |
Décidément, GitHub est plein de ressources... Plus généralement, je me pose la question de qui va ordonner la mise à jour. À terme, je verrais bien une notification via le site web ou email d'un admin lorsque des mises à jour sont disponibles. L'admin a alors la possibilité de déclencher manuellement la mise à jour. Les hooks mentionnés par @Luthaf pourraient avoir leur place dans la notification. |
Pourquoi pas =) Par exemple en ajoutant un lien dans la zone d'administration des chants pour synchroniser la base de donnée avec le dépôt. Les push depuis le dépôt du site web vers github auraient lieu quand ? Tous les jours s'il y a eu des modifications ? |
Bonne question. Toutes les installs n'auront pas nécessairement des repos avec github comme origin, et certains peuvent vouloir faire tourner ça en privé. Je peux aussi avoir sur une repo github comme origin, mais pas le droit de pusher dessus. D'autre part, à partir du moment où nous modifions les chants sur l'install, on s'expose à des gestions plus complexes: pull comme push peuvent conduire à des conflits de merges. Tant que songbook-web ne modifie pas la repo, on est en push simple, et nous n'avons pas ces conflits. |
ca pourrait peut-être nécessiter une issue complète, genre "Gestion des versions"
on risque d'ajouter pas mal de fonctions qui risquent de ne pas être utilisées si on attend pas assez... Une version hyper-light pourrait être simplement: Le moyen principal de mise à jour est via le site web. Pour les trucs plus complexes, on laisse les utilisateurs expérimentés cloner ce répertoire et faire leurs merge comme ils veulent (avec d'autres répertoires par exemple)... |
Allons-y ! Et je pense que l'on peut fermer celle là, non ? |
Tout à fait d'accord. Je propose quand même de garder cette issue ouverte tout de même jusqu'à ce que l'update depuis le site web soit possible (càd mise à jour de la repo, des tables song et artist). |
I begin with management of song files. I foresee to first address management on the server, with following functionality/aspects :
Management in FE (browser) will come afterwards (displaying, editing).
Has someone other views / ideas ?
The text was updated successfully, but these errors were encountered: