134 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import json
 | 
						|
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
 | 
						|
                    order_dict["Created On"] = str(order.created_at)
 | 
						|
                    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,
 | 
						|
                        }
 | 
						|
                        order_dict["Terminated on"] = str(vm_detail.terminated_at)
 | 
						|
 | 
						|
                    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)
 | 
						|
                    }
 | 
						|
                    if uhk.private_key:
 | 
						|
                        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
 | 
						|
                }
 | 
						|
                print(json.dumps(output_dict, indent=4))
 | 
						|
        except Exception as e:
 | 
						|
            print(" *** Error occurred. Details {}".format(str(e)))
 |