55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
import sqlalchemy as sa
|
|
from ..models.user import User
|
|
|
|
|
|
class UserService(object):
|
|
|
|
@classmethod
|
|
def all(cls, request):
|
|
items = request.dbsession.query(User).order_by(sa.asc(User.name)).all()
|
|
return items
|
|
|
|
@classmethod
|
|
def by_name(cls, request, name ):
|
|
item = request.dbsession.query(User).filter(User.name == name).first()
|
|
return item
|
|
|
|
@classmethod
|
|
def by_google_sub(cls, request, google_sub):
|
|
# Le sub est l'identifiant stable de Google : l'email peut changer.
|
|
if not google_sub:
|
|
return None
|
|
return request.dbsession.query(User).filter(
|
|
User.google_sub == google_sub).first()
|
|
|
|
@classmethod
|
|
def delete(cls, request, id):
|
|
# Attention : aucune cascade vers entries.creator / entries.editor,
|
|
# supprimer un utilisateur laisse son email dans ces colonnes.
|
|
request.dbsession.query(User).filter(User.id == id).delete(synchronize_session=False)
|
|
return
|
|
|
|
def make_groupfinder(admin_emails):
|
|
# Retourne le callback de la politique d'authentification.
|
|
#
|
|
# AUCUNE requete SQL ici : pyramid_tm lit request.authenticated_userid dans
|
|
# manager.begin(), donc une requete par requete HTTP a l'interieur de la
|
|
# transaction, et la moindre erreur de base mettrait en 500 toutes les
|
|
# routes, y compris /login et le callback OAuth lui-meme.
|
|
# La liste des administrateurs vient de la configuration auth.admin_emails,
|
|
# et les comptes autorises sont ceux de la table users, verifiee dans le
|
|
# callback OAuth : un userid inconnu ne peut donc pas arriver ici.
|
|
admins = frozenset(admin_emails)
|
|
|
|
def groupfinder(userid, request):
|
|
if not userid:
|
|
# None => non connecte
|
|
return None
|
|
if userid in admins:
|
|
return ['group:administrators']
|
|
# [] => connecte mais sans droit manage
|
|
return []
|
|
|
|
return groupfinder
|
|
|