143 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import re
 | 
						|
import requests
 | 
						|
 | 
						|
from .config import getDockersConfig, getSecretConfig
 | 
						|
 | 
						|
paheko_ident = getSecretConfig("paheko", "API_USER")
 | 
						|
paheko_pass = getSecretConfig("paheko", "API_PASSWORD")
 | 
						|
paheko_auth = (paheko_ident, paheko_pass)
 | 
						|
paheko_url = f"https://kaz-paheko.{getDockersConfig('domain')}"
 | 
						|
 | 
						|
class Paheko:
 | 
						|
    def get_categories(self):
 | 
						|
        """
 | 
						|
        Récupérer les catégories Paheko avec le compteur associé
 | 
						|
        """
 | 
						|
        api_url = paheko_url + '/api/user/categories'
 | 
						|
 | 
						|
        response = requests.get(api_url, auth=paheko_auth)
 | 
						|
 | 
						|
        if response.status_code == 200:
 | 
						|
            data = response.json()
 | 
						|
            return data
 | 
						|
        else:
 | 
						|
            return None
 | 
						|
 | 
						|
 | 
						|
    def get_categorie_id(self, categorie_name):
 | 
						|
        categories = self.get_categories()
 | 
						|
        for categorie in categories.values():
 | 
						|
            if categorie["name"] == categorie_name:
 | 
						|
                return categorie["id"]
 | 
						|
        return None
 | 
						|
 | 
						|
 | 
						|
    def get_users_in_categorie(self,categorie):
 | 
						|
        """
 | 
						|
        Afficher les membres d'une catégorie Paheko
 | 
						|
        """
 | 
						|
        if not (isinstance(categorie, int) or categorie.isdigit()):
 | 
						|
            return 'Id de category non valide', 400
 | 
						|
 | 
						|
        api_url = f"{paheko_url}/api/user/category/{categorie}.json"
 | 
						|
 | 
						|
        response = requests.get(api_url, auth=paheko_auth)
 | 
						|
 | 
						|
        if response.status_code == 200:
 | 
						|
            data = response.json()
 | 
						|
            return data
 | 
						|
        else:
 | 
						|
            return None
 | 
						|
 | 
						|
 | 
						|
    def get_user(self,ident):
 | 
						|
        """
 | 
						|
        Afficher un membre de Paheko par son email kaz ou son numéro ou le non court de l'orga
 | 
						|
        """
 | 
						|
 | 
						|
        emailmatchregexp = re.compile(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")
 | 
						|
 | 
						|
        if emailmatchregexp.match(ident):
 | 
						|
          data = { "sql": f"select * from users where email='{ident}' or alias = '{ident}'" }
 | 
						|
          api_url = paheko_url + '/api/sql/'
 | 
						|
          response = requests.post(api_url, auth=paheko_auth,  data=data)
 | 
						|
          #TODO: if faut Rechercher count et vérifier que = 1 et supprimer le count=1 dans la réponse
 | 
						|
        elif  ident.isdigit():
 | 
						|
          api_url = paheko_url + '/api/user/'+ident
 | 
						|
          response = requests.get(api_url, auth=paheko_auth)
 | 
						|
        else:
 | 
						|
          nomorga = re.sub(r'\W+', '', ident) # on vire les caractères non alphanumérique
 | 
						|
          data = { "sql": f"select * from users where admin_orga=1 and nom_orga='{nomorga}'" }
 | 
						|
          api_url = paheko_url + '/api/sql/'
 | 
						|
          response = requests.post(api_url, auth=paheko_auth,  data=data)
 | 
						|
          #TODO:if faut Rechercher count et vérifier que = 1  et supprimer le count=1 dans la réponse
 | 
						|
 | 
						|
        if response.status_code == 200:
 | 
						|
            data = response.json()
 | 
						|
            if data["count"] == 1:
 | 
						|
                 return data["results"][0]
 | 
						|
            elif data["count"] == 0:
 | 
						|
                 return None
 | 
						|
            else:
 | 
						|
                 return data["results"]
 | 
						|
        else:
 | 
						|
            return None
 | 
						|
 | 
						|
 | 
						|
    def set_user(self,ident,field,new_value):
 | 
						|
        """
 | 
						|
        Modifie la valeur d'un champ d'un membre paheko (ident= numéro paheko ou email kaz)
 | 
						|
        """
 | 
						|
 | 
						|
        #récupérer le numero paheko si on fournit un email kaz
 | 
						|
        emailmatchregexp = re.compile(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")
 | 
						|
        if emailmatchregexp.match(ident):
 | 
						|
          data = { "sql": f"select id from users where email='{ident}'" }
 | 
						|
          api_url = paheko_url + '/api/sql/'
 | 
						|
          response = requests.post(api_url, auth=paheko_auth, data=data)
 | 
						|
          if response.status_code == 200:
 | 
						|
              #on extrait l'id de la réponse
 | 
						|
              data = response.json()
 | 
						|
              if data['count'] == 0:
 | 
						|
                print("email non trouvé")
 | 
						|
                return None
 | 
						|
              elif data['count'] > 1:
 | 
						|
                  print("trop de résultat")
 | 
						|
                  return None
 | 
						|
              else:
 | 
						|
                #OK
 | 
						|
                ident = data['results'][0]['id']
 | 
						|
          else:
 | 
						|
              print("pas de résultat")
 | 
						|
              return None
 | 
						|
        elif not ident.isdigit():
 | 
						|
           print("Identifiant utilisateur invalide")
 | 
						|
           return None
 | 
						|
 | 
						|
        regexp = re.compile("[^a-zA-Z0-9 \\r\\n\\t" + re.escape(string.punctuation) + "]")
 | 
						|
        valeur = regexp.sub('',new_value) # mouais, il faudrait être beaucoup plus précis ici en fonction des champs qu'on accepte...
 | 
						|
 | 
						|
        champ = re.sub(r'\W+','',field) # pas de caractères non alphanumériques ici, dans l'idéal, c'est à choisir dans une liste plutot
 | 
						|
 | 
						|
        api_url = paheko_url + '/api/user/'+str(ident)
 | 
						|
        payload = {champ: valeur}
 | 
						|
        response = requests.post(api_url, auth=paheko_auth, data=payload)
 | 
						|
        return response.json()
 | 
						|
 | 
						|
 | 
						|
    def get_users_with_action(self, action):
 | 
						|
        """
 | 
						|
        retourne tous les membres de paheko avec une action à mener (création du compte kaz / modification...)
 | 
						|
        """
 | 
						|
 | 
						|
        api_url = paheko_url + '/api/sql/'
 | 
						|
        payload = { "sql": f"select * from users where action_auto='{action}'" }
 | 
						|
        response = requests.post(api_url, auth=paheko_auth,  data=payload)
 | 
						|
 | 
						|
        if response.status_code == 200:
 | 
						|
            return response.json()
 | 
						|
        else:
 | 
						|
            return None
 | 
						|
 | 
						|
 |