| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  | import logging | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2019-11-04 17:09:40 +05:30
										 |  |  | import uuid | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-04 17:09:40 +05:30
										 |  |  | import oca | 
					
						
							|  |  |  | import stripe | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  | from django.core.management.base import BaseCommand | 
					
						
							| 
									
										
										
										
											2019-11-04 17:09:40 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  | from hosting.models import ( | 
					
						
							| 
									
										
										
										
											2019-11-04 17:09:40 +05:30
										 |  |  |     UserCardDetail, UserHostingKey | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2019-11-04 17:09:40 +05:30
										 |  |  | from membership.models import CustomUser, DeletedUser | 
					
						
							| 
									
										
										
										
											2019-04-28 23:57:39 +02:00
										 |  |  | from opennebula_api.models import OpenNebulaManager | 
					
						
							| 
									
										
										
										
											2019-11-04 17:09:40 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  | logger = logging.getLogger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def query_yes_no(question, default="yes"): | 
					
						
							|  |  |  |     """Ask a yes/no question via raw_input() and return their answer.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     "question" is a string that is presented to the user. | 
					
						
							|  |  |  |     "default" is the presumed answer if the user just hits <Enter>. | 
					
						
							|  |  |  |         It must be "yes" (the default), "no" or None (meaning | 
					
						
							|  |  |  |         an answer is required of the user). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The "answer" return value is True for "yes" or False for "no". | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     valid = {"yes": True, "y": True, "ye": True, | 
					
						
							|  |  |  |              "no": False, "n": False} | 
					
						
							|  |  |  |     if default is None: | 
					
						
							|  |  |  |         prompt = " [y/n] " | 
					
						
							|  |  |  |     elif default == "yes": | 
					
						
							|  |  |  |         prompt = " [Y/n] " | 
					
						
							|  |  |  |     elif default == "no": | 
					
						
							|  |  |  |         prompt = " [y/N] " | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         raise ValueError("invalid default answer: '%s'" % default) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while True: | 
					
						
							|  |  |  |         sys.stdout.write(question + prompt) | 
					
						
							|  |  |  |         choice = input().lower() | 
					
						
							|  |  |  |         if default is not None and choice == '': | 
					
						
							|  |  |  |             return valid[default] | 
					
						
							|  |  |  |         elif choice in valid: | 
					
						
							|  |  |  |             return valid[choice] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             sys.stdout.write("Please respond with 'yes' or 'no' " | 
					
						
							|  |  |  |                              "(or 'y' or 'n').\n") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Command(BaseCommand): | 
					
						
							|  |  |  |     help = '''Deletes all resources of the user from the project''' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def add_arguments(self, parser): | 
					
						
							|  |  |  |         parser.add_argument('customer_email', nargs='+', type=str) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def handle(self, *args, **options): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             for email in options['customer_email']: | 
					
						
							|  |  |  |                 r = query_yes_no("Are you sure you want to delete {} ?".format( | 
					
						
							|  |  |  |                     email, None | 
					
						
							|  |  |  |                 )) | 
					
						
							|  |  |  |                 if r: | 
					
						
							|  |  |  |                     logger.debug("Deleting user {}".format(email)) | 
					
						
							|  |  |  |                     # Get stripe customer instance and delete the customer | 
					
						
							|  |  |  |                     try: | 
					
						
							|  |  |  |                         cus_user = CustomUser.objects.get(email=email) | 
					
						
							|  |  |  |                     except CustomUser.DoesNotExist as dne: | 
					
						
							|  |  |  |                         logger.error("CustomUser with email {} does " | 
					
						
							|  |  |  |                                      "not exist".format(email)) | 
					
						
							|  |  |  |                         sys.exit(1) | 
					
						
							|  |  |  |                     stripe_customer = cus_user.stripecustomer | 
					
						
							| 
									
										
										
										
											2019-04-29 00:17:59 +02:00
										 |  |  |                     c = stripe.Customer.retrieve( | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  |                         stripe_customer.stripe_id | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2019-04-29 00:53:06 +02:00
										 |  |  |                     cus_delete_obj = c.delete() | 
					
						
							|  |  |  |                     if cus_delete_obj.deleted: | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  |                         logger.debug( | 
					
						
							|  |  |  |                             "StripeCustomer {} associated with {} deleted" | 
					
						
							|  |  |  |                             "".format(stripe_customer.stripe_id, email) | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         logger.error("Error while deleting the StripeCustomer") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     # delete UserCardDetail | 
					
						
							| 
									
										
										
										
											2019-04-29 00:53:06 +02:00
										 |  |  |                     ucds = UserCardDetail.objects.filter( | 
					
						
							|  |  |  |                         stripe_customer=stripe_customer | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2019-04-29 00:53:06 +02:00
										 |  |  |                     for ucd in ucds: | 
					
						
							| 
									
										
										
										
											2019-05-06 08:30:50 +02:00
										 |  |  |                         if ucd is not None: | 
					
						
							|  |  |  |                             logger.debug( | 
					
						
							|  |  |  |                                 "User Card Detail {} associated with {} deleted" | 
					
						
							|  |  |  |                                 "".format(ucd.id, email) | 
					
						
							|  |  |  |                             ) | 
					
						
							| 
									
										
										
										
											2019-05-06 08:47:59 +02:00
										 |  |  |                             ucd.delete() | 
					
						
							| 
									
										
										
										
											2019-05-06 08:30:50 +02:00
										 |  |  |                         else: | 
					
						
							|  |  |  |                             logger.error( | 
					
						
							|  |  |  |                                 "Error while deleting the User Card Detail") | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     # delete UserHostingKey | 
					
						
							|  |  |  |                     uhks = UserHostingKey.objects.filter( | 
					
						
							| 
									
										
										
										
											2019-04-29 00:53:06 +02:00
										 |  |  |                         user=cus_user | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  |                     ) | 
					
						
							|  |  |  |                     for uhk in uhks: | 
					
						
							|  |  |  |                         uhk.delete() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     # delete stripe customer | 
					
						
							|  |  |  |                     stripe_customer.delete() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-06 08:08:51 +02:00
										 |  |  |                     # add user to deleteduser | 
					
						
							|  |  |  |                     DeletedUser.objects.create( | 
					
						
							|  |  |  |                         email=cus_user.email, name=cus_user.name, | 
					
						
							|  |  |  |                         user_id = cus_user.id | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-04 17:09:40 +05:30
										 |  |  |                     # reset CustomUser | 
					
						
							|  |  |  |                     cus_user.email = str(uuid.uuid4()) | 
					
						
							|  |  |  |                     cus_user.validated = 0 | 
					
						
							|  |  |  |                     cus_user.save() | 
					
						
							| 
									
										
										
										
											2019-04-28 23:57:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     # remove user from OpenNebula | 
					
						
							|  |  |  |                     manager = OpenNebulaManager() | 
					
						
							| 
									
										
										
										
											2019-05-06 08:08:51 +02:00
										 |  |  |                     user_pool = manager._get_user_pool() | 
					
						
							|  |  |  |                     on_user = user_pool.get_by_name(email) | 
					
						
							|  |  |  |                     if on_user.id > 0: | 
					
						
							|  |  |  |                         logger.debug( | 
					
						
							|  |  |  |                             "Deleting user {} => ID={} from opennebula".format( | 
					
						
							|  |  |  |                                 email, on_user.id) | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                         manager.oneadmin_client.call( | 
					
						
							|  |  |  |                             oca.User.METHODS['delete'], on_user.id | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         logger.error( | 
					
						
							|  |  |  |                             "User not found with email {}. " | 
					
						
							|  |  |  |                             "Not doing anything".format(email) | 
					
						
							|  |  |  |                         ) | 
					
						
							| 
									
										
										
										
											2019-04-28 23:57:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-28 23:14:14 +02:00
										 |  |  |                     logger.debug("Deleted {} SUCCESSFULLY.".format(email)) | 
					
						
							|  |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(" *** Error occurred. Details {}".format(str(e))) |