Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rename ItemCollection and Item to Menu and Ticket #487

Merged
merged 13 commits into from
Mar 11, 2024
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,5 @@ monkeytype.sqlite3
.env
.env.testing
.envrc
.DS_Store
.venv
7 changes: 3 additions & 4 deletions boxoffice/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from flask_rq2 import RQ
from pytz import timezone

from baseframe import Version, assets, baseframe
from baseframe import Version, baseframe
from baseframe.utils import JSONProvider
from coaster.assets import WebpackManifest
from flask_lastuser import Lastuser
Expand All @@ -28,7 +28,6 @@
# --- Assets ---------------------------------------------------------------------------

version = Version(__version__)
assets['boxoffice.js'][version] = 'js/scripts.js'

# --- Import rest of the app -----------------------------------------------------------

Expand All @@ -38,8 +37,8 @@
DiscountCoupon,
DiscountPolicy,
Invoice,
Item,
ItemCollection,
Ticket,
Menu,
Organization,
Price,
User,
Expand Down
34 changes: 17 additions & 17 deletions boxoffice/assets/js/views/router.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import { IndexView } from './index';
import { OrgView } from './org';
import { OrgReportView } from './admin_org_report';
import { DiscountPolicyView } from './admin_discount_policy';
import { DeleteDiscountPolicyView } from './delete_discount_policy';
import { MenuView } from './item_collection';
import { MenuNewView } from './new_item_collection';
import { MenuEditView } from './edit_item_collection';
import { OrdersView } from './admin_orders';
import { OrderView } from './admin_order';
import { ReportView } from './admin_report';
import { TicketView } from './admin_item';
import { NewTicketView } from './new_item';
import { EditTicketView } from './edit_item';
import { NewPriceView } from './new_price';
import { EditPriceView } from './edit_price';
import { NewCategoryView } from './new_category';
import { EditCategoryView } from './edit_category';
import { PartialRefundOrderView } from './partial_refund_order';
import { OrgReportView } from './org_report_admin';
import { DiscountPolicyView } from './discount_policy_admin';
import { DeleteDiscountPolicyView } from './discount_policy_delete';
import { MenuView } from './menu';
import { MenuNewView } from './menu_new';
import { MenuEditView } from './menu_edit';
import { OrdersView } from './orders_admin';
import { OrderView } from './order_admin';
import { ReportView } from './report_admin';
import { TicketView } from './ticket_admin';
import { NewTicketView } from './ticket_new';
import { EditTicketView } from './ticket_edit';
import { NewPriceView } from './price_new';
import { EditPriceView } from './price_edit';
import { NewCategoryView } from './category_new';
import { EditCategoryView } from './category_edit';
import { PartialRefundOrderView } from './order_partial_refund';

const Backbone = require('backbone');

Expand Down
4 changes: 2 additions & 2 deletions boxoffice/forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

from .category import *
from .discount import *
from .item import *
from .item_collection import *
from .menu import *
from .order import *
from .order_refund import *
from .participant import *
from .price import *
from .ticket import *
22 changes: 11 additions & 11 deletions boxoffice/forms/discount.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
DiscountCoupon,
DiscountPolicy,
DiscountTypeEnum,
Item,
ItemCollection,
Menu,
Ticket,
sa,
)

Expand Down Expand Up @@ -72,9 +72,9 @@ class AutomaticDiscountPolicyForm(DiscountPolicyForm):

def __post_init__(self) -> None:
self.tickets.query = (
Item.query.join(ItemCollection, Item.menu_id == ItemCollection.id)
.filter(ItemCollection.organization == self.edit_parent)
.options(sa.orm.load_only(Item.id, Item.title))
Ticket.query.join(Menu, Ticket.menu_id == Menu.id)
.filter(Menu.organization == self.edit_parent)
.options(sa.orm.load_only(Ticket.id, Ticket.title))
)


Expand Down Expand Up @@ -123,9 +123,9 @@ class CouponBasedDiscountPolicyForm(DiscountPolicyForm):

def __post_init__(self) -> None:
self.tickets.query = (
Item.query.join(ItemCollection, Item.menu_id == ItemCollection.id)
.filter(ItemCollection.organization == self.edit_parent)
.options(sa.orm.load_only(Item.id, Item.title))
Ticket.query.join(Menu, Ticket.menu_id == Menu.id)
.filter(Menu.organization == self.edit_parent)
.options(sa.orm.load_only(Ticket.id, Ticket.title))
)


Expand Down Expand Up @@ -203,9 +203,9 @@ class DiscountPriceForm(forms.Form):

def __post_init__(self) -> None:
self.ticket.query = (
Item.query.join(ItemCollection, Item.menu_id == ItemCollection.id)
.filter(ItemCollection.organization_id == self.edit_parent.organization_id)
.options(sa.orm.load_only(Item.id, Item.title))
Ticket.query.join(Menu, Ticket.menu_id == Menu.id)
.filter(Menu.organization_id == self.edit_parent.organization_id)
.options(sa.orm.load_only(Ticket.id, Ticket.title))
)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

from ..data import indian_states, indian_states_dict

__all__ = ['ItemCollectionForm']
__all__ = ['MenuForm']


class ItemCollectionForm(forms.Form):
class MenuForm(forms.Form):
title = forms.StringField(
__("Item Collection title"),
validators=[
Expand Down
4 changes: 2 additions & 2 deletions boxoffice/forms/participant.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from baseframe import __, forms

from ..models import Assignee, Item, LineItem, Order, OrderStatus
from ..models import Assignee, LineItem, Order, OrderStatus, Ticket

__all__ = ["AssigneeForm"]

Expand All @@ -25,7 +25,7 @@ class AssigneeForm(forms.Form):
def validate_email(self, field: forms.Field) -> None:
existing_assignees = (
Assignee.query.join(LineItem, Assignee.line_item_id == LineItem.id)
.join(Item)
.join(Ticket)
.join(Order)
.filter(LineItem.ticket_id == self.edit_parent.ticket_id)
.filter(Order.status != OrderStatus.CANCELLED)
Expand Down
8 changes: 4 additions & 4 deletions boxoffice/forms/item.py → boxoffice/forms/ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
from baseframe import __, forms, localized_country_list

from ..data import indian_states, indian_states_dict
from ..models import Category, ItemCollection, sa
from ..models import Category, Menu, sa

__all__ = ['ItemForm']
__all__ = ['TicketForm']


ASSIGNEE_DETAILS_PLACEHOLDER = {
Expand All @@ -27,7 +27,7 @@
}


class ItemForm(forms.Form):
class TicketForm(forms.Form):
title = forms.StringField(
__("Item title"),
validators=[
Expand Down Expand Up @@ -98,7 +98,7 @@ def __post_init__(self) -> None:
]
self.place_supply_country_code.choices = [('', '')] + localized_country_list()
self.category.query = (
Category.query.join(ItemCollection, Category.menu_id == ItemCollection.id)
Category.query.join(Menu, Category.menu_id == Menu.id)
.filter(Category.menu == self.edit_parent)
.options(sa.orm.load_only(Category.id, Category.title))
)
Expand Down
4 changes: 2 additions & 2 deletions boxoffice/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ class Model(ModelBase, DeclarativeBase):
from .category import * # isort:skip
from .discount_policy import * # isort:skip
from .invoice import * # isort:skip
from .item import * # isort:skip
from .item_collection import * # isort:skip
from .ticket import * # isort:skip
from .menu import * # isort:skip
from .line_item import * # isort:skip
from .line_item_discounter import * # isort:skip
from .order import * # isort:skip
Expand Down
10 changes: 5 additions & 5 deletions boxoffice/models/category.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ class Category(BaseScopedNameMixin[int, User], Model):
menu_id: Mapped[UUID] = sa.orm.mapped_column(
'item_collection_id', sa.ForeignKey('item_collection.id')
)
menu: Mapped[ItemCollection] = relationship(back_populates='categories')
menu: Mapped[Menu] = relationship(back_populates='categories')
seq: Mapped[int]
tickets: Mapped[list[Item]] = relationship(
tickets: Mapped[list[Ticket]] = relationship(
cascade='all, delete-orphan', back_populates='category'
)
parent: Mapped[ItemCollection] = sa.orm.synonym('menu')
parent: Mapped[Menu] = sa.orm.synonym('menu')

__roles__ = {'category_owner': {'read': {'id', 'name', 'title', 'menu_id'}}}

Expand All @@ -38,5 +38,5 @@ def roles_for(self, actor=None, anchors=()):


if TYPE_CHECKING:
from .item import Item
from .item_collection import ItemCollection
from .menu import Menu
from .ticket import Ticket
8 changes: 4 additions & 4 deletions boxoffice/models/discount_policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class DiscountPolicy(BaseScopedNameMixin[UUID, User], Model):
discount_coupons: Mapped[list[DiscountCoupon]] = relationship(
cascade='all, delete-orphan', back_populates='discount_policy'
)
tickets: Mapped[list[Item]] = relationship(
tickets: Mapped[list[Ticket]] = relationship(
secondary=item_discount_policy, back_populates='discount_policies'
)
prices: Mapped[list[Price]] = relationship(cascade='all, delete-orphan')
Expand Down Expand Up @@ -205,7 +205,7 @@ def make_bulk(cls, discount_code_base, **kwargs) -> DiscountPolicy:

@classmethod
def get_from_ticket(
cls, ticket: Item, qty, coupon_codes: Sequence[str] = ()
cls, ticket: Ticket, qty, coupon_codes: Sequence[str] = ()
) -> list[PolicyCoupon]:
"""
Return a list of (discount_policy, discount_coupon) tuples.
Expand Down Expand Up @@ -260,7 +260,7 @@ def line_items_count(self):
).count()

@classmethod
def is_valid_access_coupon(cls, ticket: Item, code_list):
def is_valid_access_coupon(cls, ticket: Ticket, code_list):
"""
Check if any of code_list is a valid access code for the specified ticket.

Expand Down Expand Up @@ -368,4 +368,4 @@ class PolicyCoupon:
from .line_item import LineItem # isort:skip

if TYPE_CHECKING:
from .item import Item, Price
from .ticket import Price, Ticket
18 changes: 8 additions & 10 deletions boxoffice/models/line_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ class LineItem(BaseMixin[UUID, User], Model):
ticket_id: Mapped[UUID] = sa.orm.mapped_column(
'item_id', sa.ForeignKey('item.id'), index=True, unique=False
)
ticket: Mapped[Item] = relationship(back_populates='line_items')
ticket: Mapped[Ticket] = relationship(back_populates='line_items')
previous_id: Mapped[UUID | None] = sa.orm.mapped_column(
sa.ForeignKey('line_item.id'), unique=True
)
Expand Down Expand Up @@ -143,13 +143,13 @@ def calculate(
# make named tuples for line items,
# assign the base_amount for each of them, None if a ticket is unavailable
for line_item in line_items:
ticket: Item | None
ticket: Ticket | None
if isinstance(line_item, LineItem):
ticket = line_item.ticket
base_amount = line_item.base_amount
line_item_id = line_item.id
else:
ticket = Item.query.get(line_item['ticket_id'])
ticket = Ticket.query.get(line_item['ticket_id'])
if ticket is None:
continue
current_price = ticket.current_price()
Expand Down Expand Up @@ -252,9 +252,7 @@ def get_max_seq(cls, order: Order) -> int:
)


def counts_per_date_per_item(
menu: ItemCollection, user_tz: tzinfo
) -> dict[date, dict[str, int]]:
def counts_per_date_per_item(menu: Menu, user_tz: tzinfo) -> dict[date, dict[str, int]]:
"""
Return number of line items sold per date per ticket.

Expand Down Expand Up @@ -344,12 +342,12 @@ def calculate_weekly_sales(
sa.func.sum(LineItem.final_amount).label('sum'),
)
.select_from(LineItem)
.join(Item, LineItem.ticket_id == Item.id)
.join(Ticket, LineItem.ticket_id == Ticket.id)
.where(
LineItem.status.in_(
[LineItemStatus.CONFIRMED.value, LineItemStatus.CANCELLED.value]
),
Item.menu_id.in_(menu_ids),
Ticket.menu_id.in_(menu_ids),
sa.func.timezone(user_tz, sa.func.timezone('UTC', LineItem.ordered_at))
>= start_at,
sa.func.timezone(user_tz, sa.func.timezone('UTC', LineItem.ordered_at))
Expand Down Expand Up @@ -377,10 +375,10 @@ def sales_delta(user_tz: tzinfo, ticket_ids: Sequence[str]):


# Tail import
from .item import Item # isort:skip
from .ticket import Ticket # isort:skip
from .line_item_discounter import LineItemDiscounter # isort:skip

if TYPE_CHECKING:
from .discount_policy import DiscountCoupon, DiscountPolicy
from .item_collection import ItemCollection
from .menu import Menu
from .order import Order
6 changes: 3 additions & 3 deletions boxoffice/models/line_item_discounter.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def get_valid_discounts(
if not line_items:
return []

ticket = Item.query.get(line_items[0].ticket_id)
ticket = Ticket.query.get(line_items[0].ticket_id)
if ticket is None or not ticket.is_available and not ticket.is_cancellable():
# Ticket unavailable, no discounts
return []
Expand All @@ -54,7 +54,7 @@ def calculate_discounted_amount(
return Decimal(0)

if discount_policy.is_price_based:
ticket = Item.query.get(line_item.ticket_id)
ticket = Ticket.query.get(line_item.ticket_id)
if ticket is None: # Failsafe flagged by static type checker
return Decimal(0)
discounted_price = ticket.discounted_price(discount_policy)
Expand Down Expand Up @@ -194,4 +194,4 @@ def get_combos(


# Tail imports
from .item import Item # isort:skip
from .ticket import Ticket # isort:skip
Loading
Loading