modifié : ../app.py nouveau fichier : cloud.py nouveau fichier : common_imports.py nouveau fichier : config.py nouveau fichier : dns.py nouveau fichier : kaz_user.py nouveau fichier : ldap.py nouveau fichier : mattermost.py nouveau fichier : paheko.py nouveau fichier : password.py nouveau fichier : quota.py nouveau fichier : sympa.py nouveau fichier : test.py
		
			
				
	
	
		
			224 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from resources.common_imports import *
 | |
| 
 | |
| #les variables globales minimum
 | |
| from resources.config import site_url, webmail_url, mdp_url
 | |
| 
 | |
| 
 | |
| class Kaz_user(Resource):
 | |
| 
 | |
|     def __init__(self):
 | |
|         global sympa_liste_info
 | |
|         
 | |
|         self.paheko_users_action_resource = Paheko_users_action()
 | |
|         self.paheko_user_resource=Paheko_user()
 | |
|         self.ldap_user_resource = Ldap_user()
 | |
|         self.password_create_resource = Password_create()        
 | |
|         self.mattermost_message_resource=Mattermost_message()
 | |
|         self.mattermost_user_resource=Mattermost_user()
 | |
|         self.mattermost_user_team_resource=Mattermost_user_team()
 | |
|         self.mattermost_user_channel_resource=Mattermost_user_channel()
 | |
|         self.mattermost_team_resource=Mattermost_team()                
 | |
|         self.sympa_user_resource=Sympa_user()
 | |
|         
 | |
| 
 | |
| #********************************************************************************************
 | |
|     @jwt_required()
 | |
|     def delete(self):
 | |
|         """
 | |
|         Utile pour les tests de createUser. Avant le POST de /kaz/create/users. Ça permet de supprimer/maj les comptes.
 | |
|         ---
 | |
|         tags:
 | |
|           - Kaz User
 | |
|         security:
 | |
|           - Bearer: []                
 | |
|         parameters: []
 | |
|         responses:
 | |
|             201:
 | |
|                 description: Succès        
 | |
|             401: 
 | |
|                 description: Oops, un soucis quelconque
 | |
|         """      
 | |
|         #verrou pour empêcher de lancer en même temps la même api          
 | |
|         try:
 | |
|           prefixe="del_user_lock_"
 | |
|           if glob(f"{tempfile.gettempdir()}/{prefixe}*"): raise ValueError("ERREUR 0 : api déjà en cours d'utilisation !")
 | |
|           lock_file = tempfile.NamedTemporaryFile(prefix=prefixe,delete=True)
 | |
|         
 | |
|           #TODO à remplir à la main
 | |
|           liste_emails=["",""]
 | |
|           email_secours=""
 | |
|           liste_sympa=""
 | |
|           
 | |
|           for email in liste_emails:
 | |
|             res, status_code = self.ldap_user_resource.delete(email)
 | |
|             res, status_code = self.mattermost_user_resource.delete(email)
 | |
|             nom_orga=''.join(random.choice(string.ascii_lowercase) for _ in range(8))                        
 | |
|             res, status_code = self.paheko_user_resource.put(email,"nom_orga",nom_orga)
 | |
|             res, status_code = self.paheko_user_resource.put(email,"action_auto","A créer")
 | |
|             res, status_code = self.paheko_user_resource.put(email,"email_secours",email_secours)
 | |
|             res, status_code = self.sympa_user_resource.delete(email,liste_sympa)
 | |
|             res, status_code = self.sympa_user_resource.delete(email_secours,liste_sympa)
 | |
|             msg=f"**POST AUTO** suppression de {email} ok"
 | |
|             self.mattermost_message_resource.post(message=msg)          
 | |
|           return "OK", 200
 | |
| 
 | |
|         except ValueError as e:
 | |
|           msg=f"(classe: {__class__.__name__} : {e}"
 | |
|           self.mattermost_message_resource.post(message=msg)
 | |
|           return str(msg), 401
 | |
|         
 | |
| #********************************************************************************************
 | |
| 
 | |
|     @jwt_required()
 | |
|     def post(self):
 | |
|         """
 | |
|         Créé un nouveau kaznaute: inscription sur MM / Cloud / email + msg sur MM + email à partir de action="a créer" sur paheko
 | |
|         ---
 | |
|         tags:
 | |
|           - Kaz User
 | |
|         security:
 | |
|           - Bearer: []                
 | |
|         parameters: []
 | |
|         responses:
 | |
|             201:
 | |
|                 description: Succès, kaznaute créé        
 | |
|             400: 
 | |
|                 description: Oops, rien à créer
 | |
|             401: 
 | |
|                 description: Oops, un soucis quelconque
 | |
|         """
 | |
|         
 | |
|         try:
 | |
| 
 | |
|           #verrou pour empêcher de lancer en même temps la même api          
 | |
|           prefixe="create_user_lock_"
 | |
|           if glob(f"{tempfile.gettempdir()}/{prefixe}*"): raise ValueError("ERREUR 0 : api déjà en cours d'utilisation !")
 | |
|           lock_file = tempfile.NamedTemporaryFile(prefix=prefixe,delete=True)
 | |
|          
 | |
|           #qui sont les kaznautes à créer ?   
 | |
|           liste_kaznautes, status_code = self.paheko_users_action_resource.get("A créer")
 | |
|           
 | |
|           if liste_kaznautes=="pas de résultat": return "ERREUR: paheko non joignable",401
 | |
|           
 | |
|           count=liste_kaznautes['count']
 | |
|           if count==0: return "aucun nouveau kaznaute à créer",400
 | |
|           
 | |
|           #au moins un kaznaute à créer
 | |
|           for tab in liste_kaznautes['results']:          
 | |
|             email = tab['email'].lower() 
 | |
|                      
 | |
|             # est-il déjà dans le ldap ? (mail ou alias)          
 | |
|             res, status_code = self.ldap_user_resource.get(email)         
 | |
|             if status_code != 400: raise ValueError(f"ERREUR 1: {email} déjà existant dans ldap. {res}, on arrête tout")
 | |
|             
 | |
|             #test nom orga
 | |
|             if tab['admin_orga'] == 1:
 | |
|               if tab['nom_orga'] is None: 
 | |
|                 raise ValueError(f"ERREUR 0 sur paheko: {email} : nom_orga vide, on arrête tout")
 | |
|               if not bool(re.match(r'^[a-z0-9-]+$', tab['nom_orga'])):
 | |
|                 raise ValueError(f"ERREUR 0 sur paheko: {email} : nom_orga ({tab['nom_orga']}) incohérent (minuscule/chiffre/-), on arrête tout")
 | |
|                       
 | |
|             #test email_secours
 | |
|             email_secours = tab['email_secours'].lower()
 | |
|             if not validate_email(email_secours): raise EmailNotValidError()
 | |
| 
 | |
|             #test quota
 | |
|             quota = tab['quota_disque']
 | |
|             if not quota.isdigit(): raise ValueError(f"ERREUR 2: quota non numérique : {quota}, on arrête tout")
 | |
|           
 | |
|             #quel type de test ?
 | |
|             #"nom": "ROUSSEAU Mickael",
 | |
|             nom, prenom = tab['nom'].split(maxsplit=1)
 | |
|             
 | |
|             #on génère un password
 | |
|             password,status_code = self.password_create_resource.get()
 | |
|           
 | |
|             #on créé dans le ldap
 | |
|             #à quoi servent prenom/nom dans le ldap ?
 | |
|             data = {
 | |
|               "prenom": prenom,
 | |
|               "nom": nom,
 | |
|               "password": password,
 | |
|               "email_secours": email_secours,
 | |
|               "quota": quota
 | |
|             }            
 | |
|             res, status_code = self.ldap_user_resource.put(email, **data)
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 3 sur ldap: {email} : {res}, on arrête tout ")
 | |
|             
 | |
|             #on créé dans MM 
 | |
|             user = email.split('@')[0]
 | |
|             res, status_code = self.mattermost_user_resource.post(user,email,password)
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 4 sur MM: {email} : {res}, on arrête tout ")
 | |
|                       
 | |
|             # et on affecte à l'équipe kaz
 | |
|             res, status_code = self.mattermost_user_team_resource.post(email,"kaz")
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 5 sur MM: {email} : {res}, on arrête tout ")
 | |
|           
 | |
|             #et aux 2 canaux de base
 | |
|             res, status_code = self.mattermost_user_channel_resource.post(email,"kaz","une-question--un-soucis")
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 6 sur MM: {email} : {res}, on arrête tout ")
 | |
|             res, status_code = self.mattermost_user_channel_resource.post(email,"kaz","cafe-du-commerce--ouvert-2424h")
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 7 sur MM: {email} : {res}, on arrête tout ")
 | |
|                         
 | |
|             #on créé une nouvelle équipe ds MM si besoin
 | |
|             if tab['admin_orga'] == 1:
 | |
|               res, status_code = self.mattermost_team_resource.post(tab['nom_orga'],email)
 | |
|               if status_code != 200: raise ValueError(f"ERREUR 8 sur MM: {email} : {res}, on arrête tout ")            
 | |
|               #BUG: créer la nouvelle équipe n'a pas rendu l'email admin, on le rajoute comme membre simple
 | |
|               res, status_code = self.mattermost_user_team_resource.post(email,tab['nom_orga'])
 | |
|               if status_code != 200: raise ValueError(f"ERREUR 8.1 sur MM: {email} : {res}, on arrête tout ")
 | |
|             
 | |
|             #on créé dans le cloud genéral
 | |
|             #inutile car tous les user du ldap sont user du cloud général.
 | |
|             
 | |
|             #on inscrit email et email_secours à la nl sympa_liste_info
 | |
|             res, status_code = self.sympa_user_resource.post(email,sympa_liste_info)
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 9 sur Sympa: {email} : {res}, on arrête tout ")          
 | |
|             res, status_code = self.sympa_user_resource.post(email_secours,sympa_liste_info)
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 10 sur Sympa: {email_secours} : {res}, on arrête tout ")
 | |
|           
 | |
|             #on construit/envoie le mail
 | |
|             context = {
 | |
|             'ADMIN_ORGA': tab['admin_orga'], 
 | |
|             'NOM': tab['nom'],
 | |
|             'EMAIL_SOUHAITE': email,
 | |
|             'PASSWORD': password,
 | |
|             'QUOTA': tab['quota_disque'],
 | |
|             'URL_WEBMAIL': webmail_url,
 | |
|             'URL_AGORA': mattermost_url,
 | |
|             'URL_MDP': mdp_url,
 | |
|             'URL_LISTE': sympa_url,
 | |
|             'URL_SITE': site_url,
 | |
|             'URL_CLOUD': cloud_url
 | |
|             }                  
 | |
|             subject="KAZ: confirmation d'inscription !"
 | |
|             sender=app.config['MAIL_USERNAME']
 | |
|             reply_to = app.config['MAIL_REPLY_TO']
 | |
|             msg = Message(subject=subject, sender=sender, reply_to=reply_to, recipients=[email,email_secours])
 | |
|             msg.html = render_template('email_inscription.html', **context)        
 | |
|             mail.send(msg)
 | |
|             
 | |
|             #on met le flag paheko action à Aucune
 | |
|             res, status_code = self.paheko_user_resource.put(email,"action_auto","Aucune")
 | |
|             if status_code != 200: raise ValueError(f"ERREUR 12 sur paheko: {email} : {res}, on arrête tout ")            
 | |
|           
 | |
|             #on post sur MM pour dire ok
 | |
|             msg=f"**POST AUTO** Inscription réussie pour {email} avec le secours {email_secours} Bisou!"
 | |
|             self.mattermost_message_resource.post(message=msg)
 | |
|                                     
 | |
|           return "fin des inscriptions", 201
 | |
|         
 | |
|         except EmailNotValidError as e:
 | |
|           msg=f"classe: {__class__.__name__} : ERREUR 13 : email_secours : {email_secours} " + str(e) +", on arrête tout"
 | |
|           self.mattermost_message_resource.post(message=msg)             
 | |
|           return msg, 401
 | |
|         except ValueError as e:
 | |
|           msg=f"(classe: {__class__.__name__} : {e}"
 | |
|           self.mattermost_message_resource.post(message=msg)
 | |
|           return str(msg), 401
 | |
|         
 | |
| 
 | |
| #*************************************************
 | |
| 
 | |
|  
 |