Skip to content

Commit

Permalink
Wrap needed with get_or_create
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrey Rusakov committed Sep 30, 2024
1 parent aae535f commit 5323991
Show file tree
Hide file tree
Showing 2 changed files with 352 additions and 7 deletions.
2 changes: 1 addition & 1 deletion api/management/commands/prepareusertests.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class Command(BaseCommand):
"""
def handle(self, *args, **options):
# Set all ready orders to ARCHIVED
orders_ready = Order.objects.filter(status=Order.OrderStatus.READY).all()
orders_ready = Order.objects.filter(order_status=Order.OrderStatus.READY).all()
for order in orders_ready:
order.order_status = Order.OrderStatus.ARCHIVED
order.save()
Expand Down
357 changes: 351 additions & 6 deletions api/management/commands/seed.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,360 @@
import os
import datetime
from pathlib import Path
from django.db import models
from django.utils import timezone
from django.conf import settings
from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.management.base import BaseCommand
import random
from django.contrib.auth import get_user_model
from django.contrib.auth.models import User
from api.models import Contact, Order, OrderItem, OrderType, Product, DataFormat, Identity, Metadata, Pricing, Money
from django.contrib.gis.geos import Polygon
from api.helpers import _zip_them_all
from typing import TypeVar, Generic, Type
from collections.abc import MutableMapping

T = TypeVar('T', bound=models.Model)
UserModel = get_user_model()


class Command(BaseCommand):
help = "seed database for testing and development."

def handle(self, *args, **options):
print('Seeding data...')
seed(self)
print('Done.')
self.stdout.write("Seeding data...\n")
self.seed()
self.stdout.write("Done.\n")

def notice(self, msg: str):
self.stdout.write(self.style.NOTICE(msg))

def success(self, msg: str):
self.stdout.write(self.style.SUCCESS(msg))

def error(self, msg: str):
self.stdout.write(self.style.ERROR(msg))

def getOrCreate(self, model: Type[T], defaults: MutableMapping[str, any] | None = ..., **kwargs) -> T:
(value, created) = model.objects.get_or_create(defaults, **kwargs)
typeName = model.__name__
if created:
self.success(f"Created {typeName} \"{value}\"")
else:
self.notice(f"Not creating {typeName}: \"{value}\" - already exists")
return value

def addUser(self, username: str, email: str, password: str) -> User:
return self.getOrCreate(UserModel, username=username, defaults={email: email, password: password})

def setIdentity(self, user: User, params: dict[str, any]) -> Identity:
for k, v in params.items():
setattr(user.identity, k, v)
user.identity.save()
self.success(f"Updated identity for user '{user.username}'")
return user.identity

def addContact(self, user: User, params: dict[str, any]) -> Contact:
params["belongs_to"] = user
contact = self.addContact(**params)
self.success(f"Created contact \"{contact.first_name} {contact.last_name}\"")
return contact

def addOrderType(self, name: str) -> OrderType:
return self.getOrCreate(OrderType, name=name)

def addProduct(self, user: User, label: str) -> OrderType:
return self.getOrCreate(Product, label=label, defaults={
"metadata": self.getOrCreate(Metadata, name="metadata", defaults={"modified_user_id": user.id}),
"pricing": self.getOrCreate(Pricing, name="Free", defaults={"pricing_type": Pricing.PricingType.FREE}),
"provider": user
})

def addDataFormat(self, name: str) -> DataFormat:
return self.getOrCreate(DataFormat, name=name)

def seed(self):
# Create users
rincevent = self.addUser(
'rincevent', '[email protected]', 'rincevent')
self.setIdentity(rincevent, {
"email": os.environ.get('EMAIL_TEST_TO', '[email protected]'),
"first_name": 'Jean',
"last_name": 'Michoud',
"street": 'Rue de Tivoli 22',
"postcode": '2000',
"city": 'Neuchâtel',
"country": 'Suisse',
"company_name": 'Service du Registre Foncier et de la Géomatique - SITN',
"phone": '+41 32 000 00 00'})

mmi = self.addUser("mmi", "[email protected]", "mmi")
self.setIdentity(mmi, {
"email": os.environ.get('EMAIL_TEST_TO_ARXIT', '[email protected]'),
"first_name": 'Jeanne',
"last_name": 'Paschoud',
"street": 'Rue de Tivoli 22',
"postcode": '2000',
"city": 'Neuchâtel',
"country": 'Suisse',
"company_name": 'Service du Registre Foncier et de la Géomatique - SITN',
"phone": '+41 32 000 00 00'})

mma = self.addUser("mma", "[email protected]", "mma")
self.setIdentity(mma, {
"email": '[email protected]',
"first_name": 'Jean-René',
"last_name": 'Humbert-Droz L\'Authentique',
"street": 'Rue de Tivoli 22',
"postcode": '2000',
"city": 'Neuchâtel',
"country": 'Suisse',
"company_name": 'Service du Registre Foncier et de la Géomatique - SITN',
"phone": '+41 32 000 00 00'})

mka2 = self.addUser("mka", "[email protected]", "mka")
self.setIdentity(mka2, {
"email": '[email protected]',
"first_name": 'Michaël',
"last_name": 'Kalbermatten',
"street": 'Rue de Tivoli 22',
"postcode": '2000',
"city": 'Neuchâtel',
"country": 'Suisse',
"company_name": 'Service du Registre Foncier et de la Géomatique - SITN',
"phone": '+41 32 000 00 00',
"subscribed": True})

# contacts
contact1 = Contact.objects.create(
first_name='Marc',
last_name='Riedo',
email='[email protected]',
postcode=2000,
city='Neuchâtel',
country='Suisse',
company_name='SITN',
phone='+41 00 787 45 15',
belongs_to=mmi
)
contact1.save()
contact2 = Contact.objects.create(
first_name='Marcelle',
last_name='Rieda',
email='[email protected]',
postcode=2000,
city='Neuchâtel',
country='Suisse',
company_name='SITN',
phone='+41 00 787 45 16',
belongs_to=mmi
)
contact2.save()
contact3 = Contact.objects.create(
first_name='Jean',
last_name='Doe',
email='[email protected]',
postcode=2000,
city='Lausanne',
country='Suisse',
company_name='Marine de Colombier',
phone='+41 00 787 29 16',
belongs_to=mmi
)
contact3.save()
contact_mka2 = Contact.objects.create(
first_name='Jean',
last_name='Doe',
email='[email protected]',
postcode=2000,
city='Lausanne',
country='Suisse',
company_name='Marine de Colombier',
phone='+41 00 787 29 16',
belongs_to=mka2
)
contact_mka2.save()

order_geom = Polygon((
(
2528577.8382161376,
1193422.4003930448
),
(
2542482.6542869355,
1193422.4329014618
),
(
2542482.568523701,
1199018.36469272
),
(
2528577.807487005,
1199018.324372703
),
(
2528577.8382161376,
1193422.4003930448
)
))

order_type_prive = self.addOrderType('Privé')

# Create orders
order1 = Order.objects.create(
title='Plan de situation pour enquête',
description='C\'est un test',
order_type=order_type_prive,
client=rincevent,
geom=order_geom,
invoice_reference='Dossier n°545454',
date_ordered=timezone.now())
order1.save()

order2 = Order.objects.create(
title='Plan de situation pour enquête',
description='C\'est un test',
order_type=order_type_prive,
client=rincevent,
geom=order_geom,
invoice_reference='Dossier n°545454',
date_ordered=timezone.now())
order2.save()

order3 = Order.objects.create(
title='Plan de situation pour enquête',
description='C\'est un test',
order_type=order_type_prive,
client=rincevent,
geom=order_geom,
invoice_reference='Dossier n°545454',
date_ordered=timezone.now())
order3.save()

order4 = Order.objects.create(
title='Plan de situation pour enquête',
description='C\'est un test',
order_type=order_type_prive,
client=mma,
geom=order_geom,
invoice_reference='Dossier n°545454',
date_ordered=timezone.now())
order4.save()

order_mka2 = Order.objects.create(
title='Plan de situation pour enquête',
description='C\'est un test',
order_type=order_type_prive,
client=mka2,
geom=order_geom,
invoice_reference='Dossier n°545454',
date_ordered=timezone.now())
order_mka2.save()

order_download = Order.objects.create(
title='Commande prête à être téléchargée',
description='C\'est un test',
order_type=order_type_prive,
client=mmi,
geom=order_geom,
invoice_reference='Dossier 8',
date_ordered=timezone.now())
order_download.save()

order_quoted = Order.objects.create(
title='Commande devisée pour test',
description='C\'est un test',
order_type=order_type_prive,
client=mmi,
geom=order_geom,
invoice_reference='Dossier n°545454',
date_ordered=timezone.now())
order_quoted.save()

# Products
product1 = self.addProduct(mma, 'MO - Cadastre complet')
product2 = self.addProduct(mma, 'Maquette 3D')
product_deprecated = self.addProduct(mma,
'MO07 - Objets divers et éléments linéaires - linéaires')

data_format = self.addDataFormat('Geobat NE complet (DXF)')
data_format_maquette = self.addDataFormat('3dm (Fichier Rhino)')

orderitems = [
OrderItem.objects.create(order=order1, product=product1),
OrderItem.objects.create(order=order1, product=product2),
OrderItem.objects.create(order=order_download, product=product1),
OrderItem.objects.create(order=order2, product=product1),
OrderItem.objects.create(
order=order3, product=product1, data_format=data_format),
OrderItem.objects.create(order=order4, product=product2),
OrderItem.objects.create(
order=order_mka2, product=product1, data_format=data_format)
]
for order_item in orderitems:
order_item.set_price()
order_item.save()
order_item_deprecated = OrderItem.objects.create(
order=order_mka2, product=product_deprecated, data_format=data_format)
order_item_deprecated.set_price(price=Money(
400, 'CHF'), base_fee=Money(150, 'CHF'))
order_item_deprecated.price_status = OrderItem.PricingStatus.CALCULATED
order_item_deprecated.save()

order_item_download = OrderItem.objects.create(
order=order_download, product=product2, data_format=data_format_maquette)
order_item_download.set_price(price=Money(
400, 'CHF'), base_fee=Money(150, 'CHF'))
order_item_download.price_status = OrderItem.PricingStatus.CALCULATED
order_item_download.save()

order_item_quoted = OrderItem.objects.create(
order=order_quoted, product=product2, data_format=data_format_maquette)
order_item_quoted.set_price(price=Money(
400, 'CHF'), base_fee=Money(150, 'CHF'))
order_item_quoted.price_status = OrderItem.PricingStatus.CALCULATED
order_item_quoted.save()

order2.set_price()
order2.save()

order3.set_price()
order3.confirm()
order3.invoice_contact = contact1
order3.save()

order4.save()

order_mka2.invoice_contact = contact_mka2
order_mka2.set_price()
order_mka2.date_ordered = datetime.datetime(
2018, 12, 1, 8, 20, 3, 0, tzinfo=datetime.timezone.utc)
order_mka2.order_status = Order.OrderStatus.ARCHIVED
order_mka2.save()

order_download.set_price()
empty_zip_data = b'PK\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
extract_file = SimpleUploadedFile(
"result.zip", empty_zip_data, content_type="multipart/form-data")
for order_item in order_download.items.all():
order_item.extract_result = extract_file
order_item.status = OrderItem.OrderItemStatus.PROCESSED
order_item.save()
order_download.order_status = Order.OrderStatus.PROCESSED

# Creating zip with all zips without background process unsupported by manage.py
zip_list_path = list(order_download.items.all(
).values_list('extract_result', flat=True))
today = timezone.now()
zip_path = Path(
'extract',
str(today.year), str(today.month),
"{}{}.zip".format('0a2ebb0a-', str(order_download.id)))
order_download.extract_result.name = zip_path.as_posix()
full_zip_path = Path(settings.MEDIA_ROOT, zip_path)
_zip_them_all(full_zip_path, zip_list_path)
order_download.save()

def seed(cmd: Command):
pass
order_quoted.set_price()
order_quoted.quote_done()
order_quoted.save()

0 comments on commit 5323991

Please sign in to comment.