112 lines
4.0 KiB
Python
112 lines
4.0 KiB
Python
|
import json
|
||
|
import random
|
||
|
from datetime import date, timedelta
|
||
|
|
||
|
from django.core.management.base import BaseCommand
|
||
|
from django.contrib.auth.models import User
|
||
|
|
||
|
from bills.serializers import TagSerializer, ShopTagSerializer, ShopSerializer, ReceiptSerializer
|
||
|
|
||
|
class Command(BaseCommand):
|
||
|
args = '<foo bar ...>'
|
||
|
help = 'our help string comes here'
|
||
|
|
||
|
def _load_data(self):
|
||
|
with open("./bills/management/commands/data.json", 'r') as json_file:
|
||
|
self.data = json.load(json_file)
|
||
|
|
||
|
def _user_exists(self, username):
|
||
|
return User.objects.filter(username=username).exists()
|
||
|
|
||
|
def _create_user(self, username: str):
|
||
|
password = f"{username}_pass"
|
||
|
user_exists = self._user_exists(username)
|
||
|
|
||
|
if user_exists:
|
||
|
if input(f">: Delete {username} from db? [y/N]: ") != 'y':
|
||
|
return None
|
||
|
else:
|
||
|
User.objects.get(username=username).delete()
|
||
|
self.stdout.write(f"> User '{username}' deleted!")
|
||
|
|
||
|
user = User.objects.create_user(username, "", password)
|
||
|
self.stdout.write(f"> Created user '{username}' with password '{password}'")
|
||
|
return user
|
||
|
|
||
|
def _create_tags(self, user):
|
||
|
created_tags = []
|
||
|
for tag in self.data["tags"]:
|
||
|
created_tag = TagSerializer(data=tag)
|
||
|
created_tag.is_valid()
|
||
|
created_tag.save(owner=user)
|
||
|
self.stdout.write(f"> Created tag: '{created_tag.data['name']}'")
|
||
|
created_tags.append(created_tag.data['name'])
|
||
|
|
||
|
self.stdout.write(f"> Created tags")
|
||
|
return created_tags
|
||
|
|
||
|
def _create_shop_tags(self, user):
|
||
|
created_tags = []
|
||
|
for tag in self.data["shop_tags"]:
|
||
|
created_tag = ShopTagSerializer(data=tag)
|
||
|
created_tag.is_valid()
|
||
|
created_tag.save(owner=user)
|
||
|
self.stdout.write(f"> Created shop tag: '{created_tag.data['name']}'")
|
||
|
created_tags.append(created_tag.data['name'])
|
||
|
|
||
|
self.stdout.write(f"> Created shop tags")
|
||
|
return created_tags
|
||
|
|
||
|
|
||
|
def _create_shops(self, user, shop_tags):
|
||
|
created_shops = []
|
||
|
for shop in self.data["shops"]:
|
||
|
created_shop = ShopSerializer(data=shop)
|
||
|
created_shop.is_valid()
|
||
|
created_shop.save(owner=user)
|
||
|
self.stdout.write(f"> Created shop: '{created_shop.data['name']}'")
|
||
|
created_shops.append(created_shop.data)
|
||
|
|
||
|
self.stdout.write(f"> Created shop")
|
||
|
return created_shops
|
||
|
|
||
|
def _create_receipts(self, user, shops, tags, shop_tags):
|
||
|
# dates for last 30 days
|
||
|
for d in [date.today() - timedelta(31) + timedelta(n)for n in range(31)]:
|
||
|
if random.random() > 0.4:
|
||
|
continue
|
||
|
receipt_date = f"{d.year}-{d.month}-{d.day}"
|
||
|
receipt_schop = random.choice(shops)
|
||
|
receipt_products = [random.choice(self.data["products"])]
|
||
|
|
||
|
for product in self.data["products"]:
|
||
|
if random.random() < 0.20:
|
||
|
receipt_products.append(product)
|
||
|
|
||
|
new_receipt_data = {
|
||
|
"shop": receipt_schop,
|
||
|
"date": receipt_date,
|
||
|
"products": receipt_products
|
||
|
}
|
||
|
|
||
|
created_receipt = ReceiptSerializer(data=new_receipt_data)
|
||
|
is_valid = created_receipt.is_valid()
|
||
|
if not is_valid:
|
||
|
print(created_receipt.errors)
|
||
|
break;
|
||
|
created_receipt.save(owner=user)
|
||
|
self.stdout.write(f"> Created receipt: {receipt_date} | {receipt_schop['name']}")
|
||
|
|
||
|
|
||
|
|
||
|
def handle(self, *args, **options):
|
||
|
self.stdout.write(f"_/-\__/-\_POPULATE DB _/-\__/-\_")
|
||
|
user = self._create_user("demo_user")
|
||
|
if user != None:
|
||
|
self._load_data()
|
||
|
tags = self._create_tags(user)
|
||
|
shop_tags = self._create_shop_tags(user)
|
||
|
shops = self._create_shops(user, shop_tags)
|
||
|
self._create_receipts(user,shops, tags, shop_tags)
|
||
|
self.stdout.write(f"_/-\__/-\_ DONE _/-\__/-\_")
|