| 
									
										
										
										
											2019-11-04 12:15:52 +05:30
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2019-11-04 07:16:59 +01:00
										 |  |  | import logging | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from django.core.management.base import BaseCommand | 
					
						
							|  |  |  | from membership.models import CustomUser | 
					
						
							|  |  |  | from hosting.models import ( | 
					
						
							|  |  |  |     HostingOrder, VMDetail, UserCardDetail, UserHostingKey | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | logger = logging.getLogger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Command(BaseCommand): | 
					
						
							|  |  |  |     help = '''Dumps the data of a customer into a json file''' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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']: | 
					
						
							|  |  |  |                 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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 hosting_orders = HostingOrder.objects.filter( | 
					
						
							|  |  |  |                     customer=cus_user.stripecustomer.id | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 vm_ids = [] | 
					
						
							|  |  |  |                 orders_dict = {} | 
					
						
							|  |  |  |                 for order in hosting_orders: | 
					
						
							|  |  |  |                     order_dict = {} | 
					
						
							|  |  |  |                     vm_ids.append(order.vm_id) | 
					
						
							|  |  |  |                     order_dict["VM_ID"] = order.vm_id | 
					
						
							|  |  |  |                     order_dict["Order Nr."] = order.id | 
					
						
							| 
									
										
										
										
											2019-11-04 11:59:44 +05:30
										 |  |  |                     order_dict["Created On"] = str(order.created_at) | 
					
						
							| 
									
										
										
										
											2019-11-04 07:16:59 +01:00
										 |  |  |                     order_dict["Price"] = order.price | 
					
						
							|  |  |  |                     order_dict["Payment card details"] = { | 
					
						
							|  |  |  |                         "last4": order.last4, | 
					
						
							|  |  |  |                         "brand": order.cc_brand | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     if order.subscription_id is not None and order.stripe_charge_id is None: | 
					
						
							|  |  |  |                         order_dict["Order type"] = "Monthly susbcription" | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         order_dict["Order type"] = "One time payment" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     # billing address | 
					
						
							|  |  |  |                     if order.billing_address is not None: | 
					
						
							|  |  |  |                         order_dict["Billing Address"] = { | 
					
						
							|  |  |  |                             "Street": order.billing_address.street_address, | 
					
						
							|  |  |  |                             "City": order.billing_address.city, | 
					
						
							|  |  |  |                             "Country": order.billing_address.country, | 
					
						
							|  |  |  |                             "Postal code": order.billing_address.postal_code, | 
					
						
							|  |  |  |                             "Card holder name": order.billing_address.cardholder_name | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         logger.error( | 
					
						
							|  |  |  |                             "did not find billing_address") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     # Order Detail | 
					
						
							|  |  |  |                     if order.order_detail is not None: | 
					
						
							|  |  |  |                         order_dict["Specifications"] = { | 
					
						
							|  |  |  |                             "RAM": "{} GB".format(order.order_detail.memory), | 
					
						
							|  |  |  |                             "Cores": order.order_detail.cores, | 
					
						
							|  |  |  |                             "Disk space (SSD)": "{} GB".format( | 
					
						
							|  |  |  |                                 order.order_detail.ssd_size) | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         logger.error( | 
					
						
							|  |  |  |                             "Did not find order_detail. None") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     vm_detail = VMDetail.objects.get(vm_id=order.vm_id) | 
					
						
							|  |  |  |                     if vm_detail is not None: | 
					
						
							|  |  |  |                         order_dict["VM Details"] = { | 
					
						
							|  |  |  |                             "VM_ID": order.vm_id, | 
					
						
							|  |  |  |                             "IPv4": vm_detail.ipv4, | 
					
						
							|  |  |  |                             "IPv6": vm_detail.ipv6, | 
					
						
							|  |  |  |                             "OS": vm_detail.configuration, | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2019-11-04 11:59:44 +05:30
										 |  |  |                         order_dict["Terminated on"] = str(vm_detail.terminated_at) | 
					
						
							| 
									
										
										
										
											2019-11-04 07:16:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     orders_dict[order.vm_id] = order_dict | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # UserCardDetail | 
					
						
							|  |  |  |                 cards = {} | 
					
						
							|  |  |  |                 ucds = UserCardDetail.objects.filter( | 
					
						
							|  |  |  |                     stripe_customer=cus_user.stripecustomer | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 for ucd in ucds: | 
					
						
							|  |  |  |                     card = {} | 
					
						
							|  |  |  |                     if ucd is not None: | 
					
						
							|  |  |  |                         card["Last 4"] = ucd.last4 | 
					
						
							|  |  |  |                         card["Brand"] = ucd.brand | 
					
						
							|  |  |  |                         card["Expiry month"] = ucd.exp_month | 
					
						
							|  |  |  |                         card["Expiry year"] = ucd.exp_year | 
					
						
							|  |  |  |                         card["Preferred"] = ucd.preferred | 
					
						
							|  |  |  |                         cards[ucd.id] = card | 
					
						
							|  |  |  |                     else: | 
					
						
							|  |  |  |                         logger.error( | 
					
						
							|  |  |  |                             "Error while deleting the User Card Detail") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # UserHostingKey | 
					
						
							|  |  |  |                 keys = {} | 
					
						
							|  |  |  |                 uhks = UserHostingKey.objects.filter( | 
					
						
							|  |  |  |                     user=cus_user | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 for uhk in uhks: | 
					
						
							|  |  |  |                     key = { | 
					
						
							|  |  |  |                         "Public key": uhk.public_key, | 
					
						
							|  |  |  |                         "Name": uhk.name, | 
					
						
							|  |  |  |                         "Created on": str(uhk.created_at) | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2019-11-04 12:15:52 +05:30
										 |  |  |                     if uhk.private_key: | 
					
						
							| 
									
										
										
										
											2019-11-04 07:16:59 +01:00
										 |  |  |                         key["Private key"] = uhk.private_key | 
					
						
							|  |  |  |                     keys[uhk.name] = key | 
					
						
							|  |  |  |                 output_dict = { | 
					
						
							|  |  |  |                     "User details": { | 
					
						
							|  |  |  |                         "Name": cus_user.name, | 
					
						
							|  |  |  |                         "Email": cus_user.email, | 
					
						
							|  |  |  |                         "Activated": "yes" if cus_user.validated == 1 else "no", | 
					
						
							|  |  |  |                         "Last login": str(cus_user.last_login) | 
					
						
							|  |  |  |                     }, | 
					
						
							|  |  |  |                     "Orders": orders_dict, | 
					
						
							|  |  |  |                     "Payment cards": cards, | 
					
						
							|  |  |  |                     "SSH Keys": keys | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2019-11-04 12:19:25 +05:30
										 |  |  |                 print(json.dumps(output_dict, indent=4)) | 
					
						
							| 
									
										
										
										
											2019-11-04 07:16:59 +01:00
										 |  |  |         except Exception as e: | 
					
						
							|  |  |  |             print(" *** Error occurred. Details {}".format(str(e))) |