138 lines
5.7 KiB
Python
138 lines
5.7 KiB
Python
|
import logging
|
||
|
import sys
|
||
|
from pprint import pprint
|
||
|
|
||
|
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']:
|
||
|
logger.debug("Creating dump for the user {}".format(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_on)
|
||
|
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"] = 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 is not None:
|
||
|
key["Private key"] = uhk.private_key
|
||
|
keys[uhk.name] = key
|
||
|
print("User {} dump is follows:")
|
||
|
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
|
||
|
}
|
||
|
pprint(output_dict)
|
||
|
logger.debug("Dumped user {} SUCCESSFULLY.".format(email))
|
||
|
except Exception as e:
|
||
|
print(" *** Error occurred. Details {}".format(str(e)))
|