vidjil issueshttps://gitlab.inria.fr/vidjil/vidjil/-/issues2020-09-24T12:38:43+02:00https://gitlab.inria.fr/vidjil/vidjil/-/issues/2953My Account: accès à ses préférences2020-09-24T12:38:43+02:00Mathieu GiraudMy Account: accès à ses préférencesExtrait de #1682.
@magiraud: Les préférences du client (voir #1188) se règlent actuellment directement dans le client, dans le menu "settings", qui sera à retransformer / éventuellement transformer en page autonome...
@magiraud: Devrai...Extrait de #1682.
@magiraud: Les préférences du client (voir #1188) se règlent actuellment directement dans le client, dans le menu "settings", qui sera à retransformer / éventuellement transformer en page autonome...
@magiraud: Devrait donner accès à "mes préférences ?" #878https://gitlab.inria.fr/vidjil/vidjil/-/issues/2747Organiser les sample_sets par projet pour accélérer les requêtes2020-09-23T17:32:47+02:00Ryan HerbertOrganiser les sample_sets par projet pour accélérer les requêtesActuellement on a un système qui est très flexible en termes de permissions et d'associations de samples à plusieurs sets, voire plusieurs groupes. Mais c'est aussi plutôt lent à cause du système de permissions que j'ai créé.
Avec la no...Actuellement on a un système qui est très flexible en termes de permissions et d'associations de samples à plusieurs sets, voire plusieurs groupes. Mais c'est aussi plutôt lent à cause du système de permissions que j'ai créé.
Avec la notion de hierarchie de groupes, on se retrouve avec des requêtes plutôt complexes pour déterminer si l'utilisateur a accès à un élément.
> Il faut chercher si l'utilisateur appartient à un groupe qui a la permission `access` ou à un groupe dont le parent a la permission `access`
Donc lister les sets d'un type particulier auxquels un utilisateur a accès revient au code suivant:
``` python
def vidjil_accessible_query(self, name, table, user_id=None):
"""
Returns a query with all accessible records for user_id or
the current logged in user
this method does not work on GAE because uses JOIN and IN
This is an adaptation of accessible_query that better fits
the current auth system with group associations
:param: name: The name of the query (eg. 'read')
:param: table: The table for accessibility
:param: user_id: ID of the user
Example:
Use as::
db(auth.vidjil_accessible_query('read', db.mytable, 1)).select(db.mytable.ALL)
"""
if not user_id:
user_id = self.user_id
db = self.db
if isinstance(table, str) and table in self.db.tables():
table = self.db[table]
elif isinstance(table, (Set, Query)):
# experimental: build a chained query for all tables
if isinstance(table, Set):
cquery = table.query
else:
cquery = table
tablenames = db._adapter.tables(cquery)
for tablename in tablenames:
cquery &= self.vidjil_accessible_query(name, tablename,
user_id=user_id)
return cquery
if not isinstance(table, str) and\
self.has_permission(name, table, 0, user_id):
return table.id > 0
membership = self.table_membership()
permission = self.table_permission()
perm_groups = self.get_permission_groups(name, user_id)
query = (table.id.belongs(
db(((membership.user_id == user_id) &
(membership.group_id.belongs(perm_groups)) &
(membership.group_id == permission.group_id) &
(permission.name == PermissionEnum.access.value) &
(permission.table_name == table)))._select(permission.record_id)) |
table.id.belongs(
db(((membership.user_id == user_id) &
(membership.group_id.belongs(perm_groups)) &
(membership.group_id == db.group_assoc.second_group_id) &
(db.group_assoc.first_group_id == permission.group_id) &
(permission.name == PermissionEnum.access.value) &
(permission.table_name == table)))._select(permission.record_id)))
if self.settings.everybody_group_id:
query |= table.id.belongs(
db(permission.group_id == self.settings.everybody_group_id)
(permission.name == name)
(permission.table_name == table)
._select(permission.record_id))
return query
```
Ce qui produit la requête SQL suivante:
```sql
SELECT `patient`.`id`, `patient`.`first_name`, `patient`.`last_name`, `patient`.`birth`, `patient`.`info`, `patient`.`id_label`, `patient`.`creator`, `patient`.`sample_set_id` FROM `patient`
WHERE (
(`patient`.`id` IN
(SELECT `auth_permission`.`record_id` FROM `auth_permission`, `auth_membership`
WHERE (
(
(
(
(`auth_membership`.`user_id` = 2)
AND (`auth_membership`.`group_id` IN (4))
)
AND (`auth_membership`.`group_id` = `auth_permission`.`group_id`)
) AND (`auth_permission`.`name` = 'access')
) AND (`auth_permission`.`table_name` = 'patient')
))
)
OR (`patient`.`id` IN
(SELECT `auth_permission`.`record_id` FROM `auth_permission`, `auth_membership`, `group_assoc`
WHERE (
(
(
(
(
(`auth_membership`.`user_id` = 2)
AND (`auth_membership`.`group_id` IN (4))
)
AND (`auth_membership`.`group_id` = `group_assoc`.`second_group_id`)
) AND (`group_assoc`.`first_group_id` = `auth_permission`.`group_id`)
) AND (`auth_permission`.`name` = 'access')
) AND (`auth_permission`.`table_name` = 'patient')
)
)
));
```
On a donc une requête composée de deux sous-requêtes chacune contenant un `IN` aussi long que le nombre de groupes auxquels l'utilisateur appartient, l'une avec un `join` et l'autre avec deux `join` (ici les joins sont implicites).
Et les autres primitives du model `VidjilAuth` sont composées de plusieurs `joins` et souvent plusieurs requêtes.
Avec une organisation par projet (avec une nouvelle table, et une clef étrangère dans la table `sample_set`) on pourrait se débarrasser complètement de la permission `access`, et par la même occasion on laisse tomber cette anbiguïté qu'on a avec les groupes de projets/hôpitaux et les groupes de rôles/permissions.
La requête "patient" deviendrait:
```python
def get_project_sets(type, project_id):
return db(
(db.sample_set.project_id == project_id) &
(db.sample_set.sample_type == type) &
(db[type].sample_set_id == db.sample_set.id)
).select(db[type].*)
```
Avec auparavant avoir vérifié que l'utilisateur ait accès à un groupe/rôle apparetenant au projet (2 joins sur relativement peu de données). Ce qui nous donne un total de 4 joins sur deux requêtes par rapport à un total de 3 joins répartis sur 3 requêtes, et on perd les `IN`
Il y a plusieurs autres endroits où des gains de jointures ou de requêtes seraient aussi envisageables (`get_permission(...)`, `can_view_sample_set(...)`, ...).
Ainsi que des endroits où les requêtes seraient plus complexes ?
J'aurais tendance à vouloir limiter les associations de samples à des sets du même projet car celà simplifierai certaines requêtes, comme l'autocompletiondes tags, et ainsi que celle des samples_sets à l'ajout d'un sample.
Ca éliminerait également l'impacte des grosses requêtes auxquelles nous les admins soumettons la BDD. Et donc on n'occuperait plus un (voire plus) de processus uwsgi pendant des durées prolongées (par exemple, plus d'une minute pour un compare patient).
Cette moification demanderait beaucoup de travail, donc ça ne serait pas pour tout de suite, mais je pense que celà réduirait le nombre de timeouts subis par nos utilisateurs. Celà demanderait peut-être plus d'analyse, de tests et de benchmarks.https://gitlab.inria.fr/vidjil/vidjil/-/issues/2575Doit on ajouter le créateur du groupe au groupe en question ?2017-12-19T08:47:20+01:00Ryan HerbertDoit on ajouter le créateur du groupe au groupe en question ?Lorsque l'on créé un groupe dans vidjil, l'utilisateur qui a créé le groupe est ajouté dans le groupe par défaut.
La plupart du temps ce n'est pas désiré, mais parfois c'est utile...Lorsque l'on créé un groupe dans vidjil, l'utilisateur qui a créé le groupe est ajouté dans le groupe par défaut.
La plupart du temps ce n'est pas désiré, mais parfois c'est utile...https://gitlab.inria.fr/vidjil/vidjil/-/issues/2572CrossDomain, web2py et login2021-03-10T19:57:22+01:00Mathieu GiraudCrossDomain, web2py et loginVu par @RyanHerb
Patcher web2py (puis pull request) ?
Voir #1113, #2525, #2571Vu par @RyanHerb
Patcher web2py (puis pull request) ?
Voir #1113, #2525, #2571Ryan HerbertRyan Herberthttps://gitlab.inria.fr/vidjil/vidjil/-/issues/2571Logout n'affiche pas de message2020-09-23T17:32:47+02:00Mathieu GiraudLogout n'affiche pas de messageVu par @RyanHerb, en lien avec #1113.Vu par @RyanHerb, en lien avec #1113.https://gitlab.inria.fr/vidjil/vidjil/-/issues/2114Mode anonyme / impersonate pour utilisateurs (ayant pourtant le droit infos p...2017-01-19T11:04:30+01:00Mathieu GiraudMode anonyme / impersonate pour utilisateurs (ayant pourtant le droit infos personnelles)Demande de Nathalie. On aimerait se balader dans l’application et avoir une vue anonyme, et en particulier faire un « export report » où tout est anonymisé. On pourrait avoir un switch quelque part (pas loin de My Account, voir #1682 ?...Demande de Nathalie. On aimerait se balader dans l’application et avoir une vue anonyme, et en particulier faire un « export report » où tout est anonymisé. On pourrait avoir un switch quelque part (pas loin de My Account, voir #1682 ? ou bien dans le client ?) qui change virtuellement la permission (c'est finalement comme un "Impersonate").
Une autre solution déjà possible serait de créer un autre compte avec profil invité, mais c’est moins pratique pour les utilisateurs.
@RyanHerb @mikael-s @flothoni https://gitlab.inria.fr/vidjil/vidjil/-/issues/2106Les décorateurs web2py fonctionneraient-ils ?2023-03-02T10:06:28+01:00Ryan HerbertLes décorateurs web2py fonctionneraient-ils ?Web2py fournit des décorateurs de fonction, notamment:
```python
@auth.requires_login()
@auth.requires_membership('group name')
@auth.requires_permission('read','table name',record_id)
```
Ces décorateurs pourraient-ils fonctionner...Web2py fournit des décorateurs de fonction, notamment:
```python
@auth.requires_login()
@auth.requires_membership('group name')
@auth.requires_permission('read','table name',record_id)
```
Ces décorateurs pourraient-ils fonctionner correctement avec le browser ? Pour avoir essayé avec `requires_login()` la fonction renvoi un code 303 et une erreur cross-origin arrive dans le terminal. Donc ça n'a pas l'air évident, mais je pense que si nous arrivions à trouver une solution simple, on pourrait enlever les redirections manuelles et parfois économiser un niveau d'indentation.
@magiraud @mikael-shttps://gitlab.inria.fr/vidjil/vidjil/-/issues/1114Login customisé2023-03-02T11:53:28+01:00Vidjil TeamLogin customiséApparament c'est pas évident... serait-ce possible de ne pas toucher à la BD mais uniquement changer le formulaire, pour avoir le controle dessus ?
http://nasko7.blogspot.fr/2011/09/web2py-tips-change-upload-folder.html
http://www.web2py...Apparament c'est pas évident... serait-ce possible de ne pas toucher à la BD mais uniquement changer le formulaire, pour avoir le controle dessus ?
http://nasko7.blogspot.fr/2011/09/web2py-tips-change-upload-folder.html
http://www.web2py.com/book/default/chapter/09#Customizing-Auth
***
@Duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/1113Login ne met pas d'erreur si mauvais login/mot de passe2020-09-24T15:02:03+02:00Vidjil TeamLogin ne met pas d'erreur si mauvais login/mot de passe
***
@Duez
***
@Duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/1104http://app.vidjil.org/browser/lille pourrait remplir le champ de login par dé...2017-10-23T11:33:43+02:00Vidjil Teamhttp://app.vidjil.org/browser/lille pourrait remplir le champ de login par défaut***
@Duez***
@Duez