BuyAndKnow/bk_api/bills/management/commands/populate_db.py
Stanislaw-Golebiewski 22ee8ab48d pagination
2020-01-20 00:05:18 +01:00

112 lines
4.1 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 100 days
for d in [date.today() - timedelta(100) + timedelta(n)for n in range(100)]:
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 _/-\__/-\_")