Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
836 changes: 482 additions & 354 deletions poetry.lock

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,19 @@ django-queryable-properties = "^1.8.3"
django-cron = "^0.6.0"
djangosaml2 = "^1.5.5"
django-model-utils = "^4.3.1"
setuptools = "^67.7.1"
faker-commerce = "^1.0.3"

[tool.poetry.dev-dependencies]
pydocstyle = "^6.1.1"
flake8 = "^6.0.0"
freezegun = "^1.2.1"
black = "^22.3.0"
tomli = "^2.0.1"
faker = "^18.4.0"

[tool.poetry.group.dev-dependencies.dependencies]
factory-boy = "^3.2.1"

[tool.black]
line-length = 119
Expand Down
16 changes: 16 additions & 0 deletions website/associations/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,19 @@ class AssociationsConfig(AppConfig):
"""Associations app config."""

name = "associations"

def ready(self):
"""
Ready method.

:return: None
"""
from tosti.management.commands.createfixtures import Command as CreateFixturesCommand
from associations.fixtures import create_fixtures

def filter_create_fixtures_command(fixture_creators_list: list):
"""Add fixture for orders."""
fixture_creators_list.append({"app": "associations", "creator": create_fixtures})
return fixture_creators_list

CreateFixturesCommand.fixture_creators.add_filter(filter_create_fixtures_command)
12 changes: 12 additions & 0 deletions website/associations/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from associations.models import Association


def create_fixtures():
"""Create fixtures for the Associations app."""
Association.objects.create(name="BeeVee")
Association.objects.create(name="CognAC")
Association.objects.create(name="Desda")
Association.objects.create(name="Leonardo da Vinci")
Association.objects.create(name="Marie Curie")
Association.objects.create(name="Sigma")
Association.objects.create(name="Thalia")
2 changes: 1 addition & 1 deletion website/associations/fixtures/associations.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"model": "associations.association",
"pk": 5,
"fields": {
"name": "Marie-Curie"
"name": "Marie Curie"
}
},
{
Expand Down
8 changes: 8 additions & 0 deletions website/borrel/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ def ready(self):
"""Ready method."""
from venues.views import VenueCalendarView
from borrel import signals # noqa
from tosti.management.commands.createfixtures import Command as CreateFixturesCommand
from borrel.fixtures import create_random_fixtures

def filter_create_fixtures_command(fixture_creators_list: list):
"""Add fixture for orders."""
fixture_creators_list.append({"app": "borrel", "creator": create_random_fixtures})
return fixture_creators_list

def filter_reservation_button(reservation_buttons: list):
reservation_buttons.append(
Expand All @@ -23,3 +30,4 @@ def filter_reservation_button(reservation_buttons: list):
return reservation_buttons

VenueCalendarView.reservation_buttons.add_filter(filter_reservation_button)
CreateFixturesCommand.fixture_creators.add_filter(filter_create_fixtures_command)
5 changes: 5 additions & 0 deletions website/borrel/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@


def create_random_fixtures():
"""Create random fixtures."""
pass
9 changes: 9 additions & 0 deletions website/orders/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ def ready(self):
explainer_page_how_to_manage_shift_tab,
)
from tosti.views import ExplainerView
from tosti.management.commands.createfixtures import Command as CreateFixturesCommand
from orders.fixtures import create_random_fixtures

def filter_user_page(user_page_list: list):
"""Add Ordered items tab on accounts page."""
Expand Down Expand Up @@ -50,8 +52,15 @@ def filter_explainer_page(explainer_page_list: list):
)
return explainer_page_list

def filter_create_fixtures_command(fixture_creators_list: list):
"""Add fixture for orders."""
fixture_creators_list.append({"app": "orders", "creator": create_random_fixtures})
return fixture_creators_list

AccountView.user_data_tabs.add_filter(filter_user_page)
ExplainerView.explainer_tabs.add_filter(filter_explainer_page)
CreateFixturesCommand.fixture_creators.add_filter(filter_create_fixtures_command)


def announcements(self, request):
"""Add announcements."""
Expand Down
120 changes: 120 additions & 0 deletions website/orders/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import random
from datetime import timedelta, datetime

import django.db.utils
import faker_commerce
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.db.models import Q
from django.utils import timezone

from orders.models import OrderVenue, Product, Shift
from venues.models import Venue
from faker import Factory as FakerFactory

User = get_user_model()


def create_random_fixtures():
"""Create random fixtures."""
create_order_venues()
create_products()
create_shifts()


def get_random_users(amount=2):
"""Get random users."""
users = User.objects.order_by("?")
if amount > users.count():
return list(users)
else:
return users[:amount]


def create_shifts():
"""Create fixtures for Shifts."""
today = timezone.now()
one_month_ago = today + timedelta(days=31)
date_to_check = one_month_ago
order_venues = OrderVenue.objects.filter(Q(
venue__name="Noordkantine"
) | Q(venue__name="Zuidkantine"))
for _ in range(0, 31):
date_to_check = date_to_check + timedelta(days=1)
if date_to_check.weekday() < 5:
for order_venue in order_venues:
create_shift = random.randint(0, 10)
if create_shift != 0:
shift_start = timezone.make_aware(datetime(year=date_to_check.year, month=date_to_check.month, day=date_to_check.day, hour=12, minute=15))
shift_end = timezone.make_aware(datetime(year=date_to_check.year, month=date_to_check.month, day=date_to_check.day, hour=13, minute=30))
created_shift = Shift.objects.create(
venue=order_venue,
start=shift_start,
end=shift_end,
)
for user in get_random_users():
created_shift.assignees.add(user)
created_shift.save()


def create_order_venues():
"""Create fixtures for OrderVenue's."""
if Venue.objects.filter(name="Noordkantine").exists():
OrderVenue.objects.create(venue=Venue.objects.get(name="Noordkantine"))

if Venue.objects.filter(name="Zuidkantine").exists():
OrderVenue.objects.create(venue=Venue.objects.get(name="Zuidkantine"))

for venue in Venue.objects.all():
if venue.name == "Noordkantine" or venue.name == "Zuidkantine":
pass
else:
if random.randint(0, 1) == 1:
OrderVenue.objects.create(venue=venue)


def create_products():
"""Create products."""
faker = FakerFactory.create("en_GB")
faker.add_provider(faker_commerce.Provider)

tosti_cheese = Product.objects.create(
name="Tosti Cheese",
icon="cheese",
current_price=0.5,
)
tosti_ham_cheese = Product.objects.create(
name="Tosti Ham Cheese",
icon="bacon",
current_price=0.5,
)

if OrderVenue.objects.filter(venue__name="Noordkantine").exists():
north_canteen = OrderVenue.objects.get(venue__name="Noordkantine")
tosti_cheese.available_at.add(north_canteen)
tosti_ham_cheese.available_at.add(north_canteen)

if OrderVenue.objects.filter(venue__name="Zuidkantine").exists():
south_canteen = OrderVenue.objects.get(venue__name="Zuidkantine")
tosti_cheese.available_at.add(south_canteen)
tosti_ham_cheese.available_at.add(south_canteen)

for _ in range(0, 20):
try:
new_product = Product.objects.create(
name=faker.ecommerce_name(),
available=False if random.randint(0, 100) == 0 else True,
current_price=(random.randint(0, 1000) / 100),
orderable=False,
ignore_shift_restrictions=True,
max_allowed_per_shift=None,
)
amount_of_venues_available = random.randint(0, OrderVenue.objects.all().count())
order_venues_available = OrderVenue.objects.order_by("?")[:amount_of_venues_available]
for order_venue in order_venues_available:
new_product.available_at.add(order_venue)
except ValidationError:
pass
except django.db.utils.IntegrityError:
pass

Empty file.
Empty file.
17 changes: 17 additions & 0 deletions website/tosti/management/commands/createfixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.core.management import BaseCommand

from tosti.filter import Filter


class Command(BaseCommand):
"""Command to create random fixtures."""

fixture_creators = Filter()

def handle(self, *args, **kwargs):
"""Create random fixtures, in order of filters."""
creators_list = self.fixture_creators.do_filter([])
creators_list.reverse()
for creator in creators_list:
print("Running {}".format(creator['app']))
creator['creator']()
9 changes: 9 additions & 0 deletions website/users/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,12 @@ class UsersConfig(AppConfig):
def ready(self):
"""Register signals."""
import users.signals # noqa
from tosti.management.commands.createfixtures import Command as CreateFixturesCommand
from users.fixtures import create_fixtures

def filter_create_fixtures_command(fixture_creators_list: list):
"""Add fixture for orders."""
fixture_creators_list.append({"app": "users", "creator": create_fixtures})
return fixture_creators_list

CreateFixturesCommand.fixture_creators.add_filter(filter_create_fixtures_command)
28 changes: 28 additions & 0 deletions website/users/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import string
import random

from django.contrib.auth import get_user_model
from faker import Factory as FakerFactory

User = get_user_model()


def create_fixtures():
"""Create random users."""
faker = FakerFactory.create("nl_NL")

for _ in range(0, 50):
profile = faker.profile()
profile["password"] = "".join(
random.choice(string.ascii_uppercase + string.digits) for _ in range(16)
)
username = faker.numerify(text="s#######")
User.objects.create_user(
username,
email=profile["mail"],
password=profile["password"],
full_name=profile["name"],
first_name=profile["name"].split()[0],
last_name=" ".join(profile["name"].split()[1:]),
)

8 changes: 8 additions & 0 deletions website/venues/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ def ready(self):
"""Ready method."""
from venues.views import VenueCalendarView
from venues import signals # noqa
from tosti.management.commands.createfixtures import Command as CreateFixturesCommand
from venues.fixtures import create_fixtures

def filter_create_fixtures_command(fixture_creators_list: list):
"""Add fixture for venues."""
fixture_creators_list.append({"app": "venues", "creator": create_fixtures})
return fixture_creators_list

def filter_reservation_button(reservation_buttons: list):
reservation_buttons.append(
Expand All @@ -22,3 +29,4 @@ def filter_reservation_button(reservation_buttons: list):
return reservation_buttons

VenueCalendarView.reservation_buttons.add_filter(filter_reservation_button)
CreateFixturesCommand.fixture_creators.add_filter(filter_create_fixtures_command)
76 changes: 76 additions & 0 deletions website/venues/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import math
import random
from datetime import timedelta

from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.utils import timezone

from venues.models import Venue, Reservation
from faker import Factory as FakerFactory

User = get_user_model()


faker = FakerFactory.create("nl_NL")


def generate_title():
"""Generate a random title."""
words = faker.words(random.randint(1, 3))
return " ".join([word.capitalize() for word in words])


def create_fixtures():
"""Create random fixtures."""
create_venues()
create_random_reservations()


def create_venues():
"""Create fixtures for OrderVenue's."""
Venue.objects.create(
name="Noordkantine",
slug="noordkantine",
active=True,
color_in_calendar="#0d6efd",
can_be_reserved=True,
automatically_accept_first_reservation=False,
)
Venue.objects.create(
name="Zuidkantine",
slug="zuidkantine",
active=True,
color_in_calendar="#dc3545",
can_be_reserved=True,
automatically_accept_first_reservation=False,
)


def create_random_reservations():
"""Create randomized reservations."""
for i in range(0, 50):
try:
create_random_reservation()
except ValidationError:
pass


def create_random_reservation():
"""Create a random Reservation."""
reservation = Reservation()
reservation.comments = faker.paragraph()
reservation.title = generate_title()
reservation.start = faker.date_time_between("-30d", "+30d", timezone.get_current_timezone())
duration_hour = math.ceil(random.expovariate(0.2))
reservation.end = reservation.start + timedelta(hours=duration_hour)
reservation.venue = Venue.objects.order_by("?").first()
reservation.user_created = User.objects.order_by("?").first()
users_that_have_access_count = math.ceil(random.expovariate(0.2)) - 1
reservation.accepted = random.choice([True, True, True, False, None, None])
reservation.clean()
reservation.save()
users_that_have_access = [x for x in User.objects.order_by("?")[:users_that_have_access_count]]

for user in users_that_have_access:
reservation.users_access.add(user)