1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-13 00:38:06 +00:00
bramw_baserow/backend/src/baserow/contrib/database/populate.py
2025-03-18 20:58:54 +00:00

364 lines
13 KiB
Python

from io import BytesIO
from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import make_password
from django.db import transaction
from faker import Faker
from baserow.contrib.database.fields.models import Field, SelectOption
from baserow.contrib.database.fields.registries import field_type_registry
from baserow.contrib.database.models import Database
from baserow.contrib.database.rows.handler import RowHandler
from baserow.contrib.database.table.handler import TableHandler
from baserow.contrib.database.table.models import Table
from baserow.core.handler import CoreHandler
from baserow.core.user_files.handler import UserFileHandler
User = get_user_model()
@transaction.atomic
def load_test_data():
fake = Faker()
print("Add basic data...")
user = User.objects.get(email="admin@baserow.io")
workspace = user.workspaceuser_set.get(workspace__name="Acme Corp").workspace
try:
database = Database.objects.get(name="Back to local", trashed=False)
except Database.DoesNotExist:
database = CoreHandler().create_application(
user, workspace, "database", name="Back to local"
)
try:
products_table = Table.objects.get(name="Products", database=database)
except Table.DoesNotExist:
products_table = TableHandler().create_table_and_fields(
user,
database,
name="Products",
fields=[
("Name", "text", {}),
(
"Category",
"single_select",
{},
),
("Notes", "long_text", {"field_options": {"width": 400}}),
],
)
select_field = Field.objects.get(table=products_table, name="Category")
select_by_name = {}
for order, option in enumerate(
[
{"color": "dark-green", "value": "Fruit & Vegetable"},
{"color": "light-orange", "value": "Dairy"},
{"color": "dark-red", "value": "Meat"},
{"color": "blue", "value": "Fish"},
{"color": "dark-gray", "value": "Bakery"},
{"color": "dark-blue", "value": "Beverage"},
{"color": "light-green", "value": "Grocery"},
]
):
select_option = SelectOption.objects.create(
field=select_field,
order=order,
value=option["value"],
color=option["color"],
)
select_by_name[select_option.value] = select_option.id
data = [
("Bread", select_by_name["Bakery"], fake.sentence(nb_words=10)),
("Croissant", select_by_name["Bakery"], fake.sentence(nb_words=10)),
("Vine", select_by_name["Beverage"], fake.sentence(nb_words=10)),
("Beer", select_by_name["Beverage"], fake.sentence(nb_words=5)),
("Milk", select_by_name["Dairy"], fake.sentence(nb_words=10)),
("Cheese", select_by_name["Dairy"], fake.sentence(nb_words=10)),
("Butter", select_by_name["Dairy"], fake.sentence(nb_words=15)),
("Fish", select_by_name["Fish"], fake.sentence(nb_words=10)),
("Apple", select_by_name["Fruit & Vegetable"], fake.sentence(nb_words=10)),
("Grapes", select_by_name["Fruit & Vegetable"], fake.sentence(nb_words=3)),
("Carrot", select_by_name["Fruit & Vegetable"], fake.sentence(nb_words=10)),
("Onion", select_by_name["Fruit & Vegetable"], fake.sentence(nb_words=10)),
("Flour", select_by_name["Grocery"], fake.sentence(nb_words=10)),
("Honey", select_by_name["Grocery"], fake.sentence(nb_words=5)),
("Oil", select_by_name["Grocery"], fake.sentence(nb_words=10)),
("Pork", select_by_name["Meat"], fake.sentence(nb_words=10)),
("Beef", select_by_name["Meat"], fake.sentence(nb_words=5)),
("Chicken", select_by_name["Meat"], fake.sentence(nb_words=10)),
("Rabbit", select_by_name["Meat"], fake.sentence(nb_words=10)),
]
RowHandler().import_rows(
user, products_table, data=data, send_realtime_update=False
)
try:
suppliers_table = Table.objects.get(name="Suppliers", database=database)
except Table.DoesNotExist:
suppliers_table = TableHandler().create_table_and_fields(
user,
database,
name="Suppliers",
fields=[
("Name", "text", {}),
("Products", "link_row", {"link_row_table": products_table}),
("Production", "rating", {}),
("Certification", "multiple_select", {}),
("Image", "file", {}),
("Notes", "long_text", {"field_options": {"width": 400}}),
],
)
for i in range(20):
image = fake.image()
UserFileHandler().upload_user_file(user, f"image_{i}.png", BytesIO(image))
products = products_table.get_model(attribute_names=True)
select_field = Field.objects.get(table=suppliers_table, name="Certification")
for order, option in enumerate(
[
{"color": "dark-green", "value": "Organic"},
{"color": "light-orange", "value": "Fair trade"},
{"color": "light-green", "value": "Natural"},
{"color": "light-blue", "value": "Animal protection"},
{"color": "blue", "value": "Eco"},
{"color": "dark-blue", "value": "Equitable"},
]
):
select_option = SelectOption.objects.create(
field=select_field,
order=order,
value=option["value"],
color=option["color"],
)
select_by_name[select_option.value] = select_option.id
products_by_name = {p.name: p.id for p in products.objects.all()}
certif_by_name = {p.value: p.id for p in select_field.select_options.all()}
image_field = Field.objects.get(table=suppliers_table, name="Image")
file_field_type = field_type_registry.get("file")
cache = {}
random_file_1 = file_field_type.random_value(image_field, fake, cache)
random_file_2 = file_field_type.random_value(image_field, fake, cache)
random_file_3 = file_field_type.random_value(image_field, fake, cache)
random_file_4 = file_field_type.random_value(image_field, fake, cache)
data = [
(
"The happy cow",
[products_by_name["Milk"], products_by_name["Butter"]],
3,
[certif_by_name["Animal protection"]],
random_file_1,
"Animals here are happy.",
),
(
"Jack's farm",
[
products_by_name["Carrot"],
products_by_name["Onion"],
products_by_name["Chicken"],
],
5,
[certif_by_name["Organic"], certif_by_name["Equitable"]],
random_file_2,
"Good guy.",
),
(
"Horse & crocodile",
[products_by_name["Beef"]],
2,
[certif_by_name["Fair trade"]],
random_file_3,
"",
),
(
"Vines LTD",
[products_by_name["Vine"], products_by_name["Grapes"]],
4,
[
certif_by_name["Organic"],
certif_by_name["Natural"],
],
random_file_4,
"Excellent white & red wines.",
),
]
RowHandler().import_rows(
user, suppliers_table, data=data, send_realtime_update=False
)
try:
retailers_table = Table.objects.get(name="Retailers", database=database)
except Table.DoesNotExist:
retailers_table = TableHandler().create_table_and_fields(
user,
database,
name="Retailers",
fields=[
("Name", "text", {}),
("Suppliers", "link_row", {"link_row_table": suppliers_table}),
("Rating", "rating", {}),
("Notes", "long_text", {"field_options": {"width": 400}}),
],
)
suppliers = suppliers_table.get_model(attribute_names=True)
suppliers_by_name = {p.name: p.id for p in suppliers.objects.all()}
data = [
(
"All from the farm",
[suppliers_by_name["The happy cow"], suppliers_by_name["Jack's farm"]],
3,
fake.sentence(nb_words=10),
),
(
"My little supermarket",
[suppliers_by_name["Vines LTD"]],
1,
fake.sentence(nb_words=10),
),
(
"Organic4U",
[suppliers_by_name["The happy cow"]],
5,
fake.sentence(nb_words=10),
),
(
"Ecomarket",
[
suppliers_by_name["Horse & crocodile"],
suppliers_by_name["Jack's farm"],
],
3,
fake.sentence(nb_words=10),
),
(
"Welcome to the farm",
[suppliers_by_name["The happy cow"]],
4,
fake.sentence(nb_words=10),
),
]
RowHandler().import_rows(
user, retailers_table, data=data, send_realtime_update=False
)
try:
user_accounts_table = Table.objects.get(name="User Accounts", database=database)
except Table.DoesNotExist:
user_accounts_table = TableHandler().create_table_and_fields(
user,
database,
name="User Accounts",
fields=[
("Username", "text", {}),
("Email", "email", {}),
("Password", "password", {}),
("Role", "text", {}),
("Date Joined", "date", {}),
("Subscription Type", "single_select", {}),
("Profile Picture", "file", {}),
("Bio", "long_text", {"field_options": {"width": 400}}),
],
)
for i in range(20):
image = fake.image()
UserFileHandler().upload_user_file(
user, f"profile_pic_{i}.png", BytesIO(image)
)
select_field = Field.objects.get(
table=user_accounts_table, name="Subscription Type"
)
for order, option in enumerate(
[
{"color": "gold", "value": "Gold"},
{"color": "silver", "value": "Silver"},
{"color": "bronze", "value": "Bronze"},
]
):
SelectOption.objects.create(
field=select_field,
order=order,
value=option["value"],
color=option["color"],
)
subscription_by_name = {
p.value: p.id for p in select_field.select_options.all()
}
image_field = Field.objects.get(
table=user_accounts_table, name="Profile Picture"
)
file_field_type = field_type_registry.get("file")
cache = {}
random_file_1 = file_field_type.random_value(image_field, fake, cache)
random_file_2 = file_field_type.random_value(image_field, fake, cache)
random_file_3 = file_field_type.random_value(image_field, fake, cache)
random_file_4 = file_field_type.random_value(image_field, fake, cache)
data = [
(
"user1",
"user1@baserow.io",
make_password("password"),
"admin",
"2020-01-01",
subscription_by_name["Gold"],
random_file_1,
"Just a user bio.",
),
(
"user2",
"user2@baserow.io",
make_password("password"),
"student",
"2021-02-02",
subscription_by_name["Silver"],
random_file_2,
"Another user bio.",
),
(
"user3",
"user3@baserow.io",
make_password("password"),
"teacher",
"2022-03-03",
subscription_by_name["Bronze"],
random_file_3,
"",
),
(
"user4",
"user4@baserow.io",
make_password("password"),
"student",
"2023-04-04",
subscription_by_name["Gold"],
random_file_4,
"Loves coding and cats.",
),
]
RowHandler().import_rows(
user, user_accounts_table, data=data, send_realtime_update=False
)