diff --git a/make_dev_container.sh b/make_dev_container.sh index 6cd97397fee2c365b299b05b42fc70c14c6f9d7e..e29ffdc232bf610f999099fc7ef313f4dfeba720 100755 --- a/make_dev_container.sh +++ b/make_dev_container.sh @@ -14,7 +14,7 @@ docker exec symposion ./manage.py create_review_permissions docker exec symposion ./manage.py loaddata ./fixtures/miniconf-fixtures/*.json if [ -e ./symposion-fixtures ]; then pushd ./symposion-fixtures - ./load_data_local.sh + ./load_chunks_local.sh popd else docker exec -it symposion ./manage.py createsuperuser --username root --email root@example.com diff --git a/pinaxcon/registrasion/management/commands/populate_inventory.py b/pinaxcon/registrasion/management/commands/populate_inventory.py index b787f1495781524a40110629fbb4701f0ecc2e4a..ae2a09e62ac42f6f3d93c28338ca401249c69b18 100644 --- a/pinaxcon/registrasion/management/commands/populate_inventory.py +++ b/pinaxcon/registrasion/management/commands/populate_inventory.py @@ -46,6 +46,11 @@ class Command(BaseCommand): ("name", ), name="Can see unpublished products", ) + self.group_prepurchase = self.find_or_make( + Group, + ("name", ), + name="Pre-purchase", + ) def populate_inventory(self): # Categories @@ -56,7 +61,7 @@ class Command(BaseCommand): name="Ticket", description="Each type of ticket has different included products. " "For details of what products are included, see our " - "[LINK]registration details page.[/LINK]", + "registration page", required=True, render_type=inv.Category.RENDER_TYPE_RADIO, limit_per_user=1, @@ -67,7 +72,7 @@ class Command(BaseCommand): ("name",), name="Penguin Dinner Ticket", description="Tickets to our conference dinner on the evening of " - "Wednesday 18 January. All attendees may purchase " + "Wednesday 24 January. All attendees may purchase " "seats at the dinner, even if a dinner ticket is not " "included in your conference ticket price.", required=False, @@ -80,20 +85,20 @@ class Command(BaseCommand): ("name",), name="Speakers' Dinner Ticket", description="Tickets to our exclusive Speakers' Dinner on the " - "evening of Tuesday 17 January. You may purchase up " - "to 5 tickets in total, for significant others, and " + "evening of Tuesday 23 January. You may purchase up " + "to 5 tickets in total, for significant others and " "family members.", required=False, render_type=inv.Category.RENDER_TYPE_QUANTITY, limit_per_user=5, order=20, ) - self.pdns_breakfast = self.find_or_make( + self.pdns_category = self.find_or_make( inv.Category, ("name",), - name="Opening Reception Breakfast Ticket", - description="Tickets to our Opening Reception Breakfast. This " - "event will be held on the morning of Monday 16 " + name="Professional Delegates Networking Session Ticket", + description="Tickets to our Professional Delegates Networking session." + "This event will be held on the evening of Thursday 25th " "January, and is restricted to Professional Ticket " "holders, speakers, miniconf organisers, and invited " "guests.", @@ -106,31 +111,31 @@ class Command(BaseCommand): inv.Category, ("name",), name="T-Shirt", - description="Commemorative conference t-shirts, featuring secret " - "linux.conf.au 2017 artwork.", + description="Commemorative conference t-shirts, featuring the" + "linux.conf.au 2018 artwork.", required=False, render_type=inv.Category.RENDER_TYPE_ITEM_QUANTITY, order=40, ) - self.accommodation = self.find_or_make( - inv.Category, - ("name",), - name="Accommodation at University of Tasmania", - description="Accommodation at the University of Tasmania colleges " - "and apartments. You can come back and book your " - "accommodation at a later date, provided rooms remain " - "available. Rooms may only be booked from Sunday 15 " - "January--Saturday 21 January. If you wish to stay " - "for only a part of the 6-day period, you must book " - "accommodation for the full 6-day period. Rooms at " - "other hotels, including Wrest Point can be booked " - "elsewhere. For full details, see [LINK]our " - "accommodation page.[/LINK]", - required=False, - render_type=inv.Category.RENDER_TYPE_RADIO, - limit_per_user=1, - order=50, - ) + # self.accommodation = self.find_or_make( + # inv.Category, + # ("name",), + # name="Accommodation at University of Tasmania", + # description="Accommodation at the University of Tasmania colleges " + # "and apartments. You can come back and book your " + # "accommodation at a later date, provided rooms remain " + # "available. Rooms may only be booked from Sunday 15 " + # "January--Saturday 21 January. If you wish to stay " + # "for only a part of the 6-day period, you must book " + # "accommodation for the full 6-day period. Rooms at " + # "other hotels, including Wrest Point can be booked " + # "elsewhere. For full details, see [LINK]our " + # "accommodation page.[/LINK]", + # required=False, + # render_type=inv.Category.RENDER_TYPE_RADIO, + # limit_per_user=1, + # order=50, + # ) self.extras = self.find_or_make( inv.Category, ("name",), @@ -176,7 +181,7 @@ class Command(BaseCommand): ("name", "category",), category=self.ticket, name="Student", - price=Decimal("160.00"), + price=Decimal("149.00"), reservation_duration=hours(24), order=30, ) @@ -270,7 +275,7 @@ class Command(BaseCommand): ("name", "category",), category=self.penguin_dinner, name="Child", - description="Includes a child's meal and soft drink service.", + description="Children 14 and under. Includes a child's meal and soft drink service.", price=Decimal("50.00"), reservation_duration=hours(1), order=20, @@ -303,7 +308,7 @@ class Command(BaseCommand): ("name", "category",), category=self.speakers_dinner_ticket, name="Child", - description="Includes a child's meal and soft drink service.", + description="Children 14 and under. Includes a child's meal and soft drink service.", price=Decimal("60.00"), reservation_duration=hours(1), order=20, @@ -320,12 +325,12 @@ class Command(BaseCommand): order=30, ) - # PDNS breakfast + # PDNS self.pdns = self.find_or_make( inv.Product, ("name", "category",), - category=self.pdns_breakfast, + category=self.pdns_category, name="Conference Attendee", price=Decimal("00.00"), reservation_duration=hours(1), @@ -333,19 +338,19 @@ class Command(BaseCommand): order=10, ) - # Accommodation + # # Accommodation - self.accommodation_week = self.find_or_make( - inv.Product, - ("name", "category",), - category=self.accommodation, - name="Single Bedroom with Shared Bathrooms, includes full " - "breakfast, Sunday 15 January 2017--Saturday 21 January 2017", - price=Decimal("396.00"), - reservation_duration=hours(24), - limit_per_user=1, - order=10, - ) + # self.accommodation_week = self.find_or_make( + # inv.Product, + # ("name", "category",), + # category=self.accommodation, + # name="Single Bedroom with Shared Bathrooms, includes full " + # "breakfast, Sunday 15 January 2017--Saturday 21 January 2017", + # price=Decimal("396.00"), + # reservation_duration=hours(24), + # limit_per_user=1, + # order=10, + # ) # Extras @@ -367,14 +372,10 @@ class Command(BaseCommand): "Men's/Straight Cut Size", ("S", "M", "L", "XL", "2XL", "3XL", "5XL"), ), - "womens_classic": ShirtGroup( + "womens": ShirtGroup( "Women's Classic Fit", ("XS", "S", "M", "L", "XL", "2XL"), ), - "womens_semi": ShirtGroup( - "Women's Semi-Fitted", - ("S", "M", "L", "XL", "2XL"), - ), } self.shirts = {} @@ -408,6 +409,23 @@ class Command(BaseCommand): hide_voucher_products.products.set([ self.ticket_media, self.ticket_sponsor, + self.ticket_miniconfs_mt, + self.ticket_miniconfs_mon, + self.ticket_miniconfs_tue, + ]) + + hide_all_tickets = self.find_or_make( + cond.GroupMemberFlag, + ("description", ), + description="Can pre-purchase tickets", + condition=cond.FlagBase.ENABLE_IF_TRUE, + ) + hide_all_tickets.group.set([self.group_prepurchase]) + hide_all_tickets.products.set([ + self.ticket_fairy, + self.ticket_professional, + self.ticket_hobbyist, + self.ticket_student, ]) # Set limits. @@ -416,7 +434,7 @@ class Command(BaseCommand): ("description", ), description="Public ticket cap", condition=cond.FlagBase.DISABLE_IF_FALSE, - limit=450, + limit=600, ) public_ticket_cap.products.set([ self.ticket_fairy, @@ -425,27 +443,71 @@ class Command(BaseCommand): self.ticket_student, ]) - non_public_ticket_cap = self.find_or_make( + student_ticket_cap = self.find_or_make( cond.TimeOrStockLimitFlag, ("description", ), - description="Non-public ticket cap", + description="Student ticket cap", condition=cond.FlagBase.DISABLE_IF_FALSE, - limit=450, + limit=100, ) - non_public_ticket_cap.products.set([ - self.ticket_speaker, + public_ticket_cap.products.set([ + self.ticket_fairy, + self.ticket_professional, + self.ticket_hobbyist, + self.ticket_student, + ]) + + sponsor_ticket_cap = self.find_or_make( + cond.TimeOrStockLimitFlag, + ("description", ), + description="Reserved for sponsors", + condition=cond.FlagBase.DISABLE_IF_FALSE, + limit=70, + ) + sponsor_ticket_cap.products.set([ self.ticket_sponsor, - self.ticket_media, + ]) + + volunteer_ticket_cap = self.find_or_make( + cond.TimeOrStockLimitFlag, + ("description", ), + description="Reserrved for volunteers and organizers", + condition=cond.FlagBase.DISABLE_IF_FALSE, + limit=62, + ) + volunteer_ticket_cap.products.set([ self.ticket_team, self.ticket_volunteer, ]) + media_ticket_cap = self.find_or_make( + cond.TimeOrStockLimitFlag, + ("description", ), + description="Reserved for media", + condition=cond.FlagBase.DISABLE_IF_FALSE, + limit=10, + ) + media_ticket_cap.products.set([ + self.ticket_media, + ]) + + speaker_ticket_cap = self.find_or_make( + cond.TimeOrStockLimitFlag, + ("description", ), + description="Reserved for speakers (and miniconf organisers)", + condition=cond.FlagBase.DISABLE_IF_FALSE, + limit=104, + ) + speaker_ticket_cap.products.set([ + self.ticket_speaker, + ]) + penguin_dinner_cap = self.find_or_make( cond.TimeOrStockLimitFlag, ("description", ), description="Penguin dinner ticket cap", condition=cond.FlagBase.DISABLE_IF_FALSE, - limit=450, + limit=900, ) penguin_dinner_cap.categories.set([ self.penguin_dinner, @@ -456,7 +518,7 @@ class Command(BaseCommand): ("description", ), description="Speakers dinner ticket cap", condition=cond.FlagBase.DISABLE_IF_FALSE, - limit=150, + limit=135, ) speakers_dinner_cap.categories.set([ self.speakers_dinner_ticket, @@ -465,12 +527,12 @@ class Command(BaseCommand): pdns_cap = self.find_or_make( cond.TimeOrStockLimitFlag, ("description", ), - description="PDNS breakfast ticket cap", + description="PDNS ticket cap", condition=cond.FlagBase.DISABLE_IF_FALSE, limit=400, ) pdns_cap.categories.set([ - self.pdns_breakfast, + self.pdns_category, ]) # Volunteer tickets are for volunteers only @@ -535,7 +597,7 @@ class Command(BaseCommand): self.ticket_media, self.ticket_sponsor, ]) - pdns_by_ticket.categories.set([self.pdns_breakfast, ]) + pdns_by_ticket.categories.set([self.pdns_category, ]) # They are available to speakers pdns_by_speaker = self.find_or_make( @@ -548,7 +610,7 @@ class Command(BaseCommand): ) pdns_by_speaker.proposal_kind.set(self.main_conference_proposals) - pdns_by_speaker.categories.set([self.pdns_breakfast, ]) + pdns_by_speaker.categories.set([self.pdns_category, ]) # They are available to staff pdns_by_staff = self.find_or_make( @@ -556,13 +618,26 @@ class Command(BaseCommand): ("description", ), description="PDNS available to staff", condition=cond.FlagBase.ENABLE_IF_TRUE, - ) pdns_by_staff.group.set([ self.group_team, self.group_volunteers, ]) - pdns_by_staff.categories.set([self.pdns_breakfast, ]) + pdns_by_staff.categories.set([self.pdns_category, ]) + + #Don't allow people to get anything if they don't have a ticket first + needs_a_ticket = self.find_or_make( + cond.CategoryFlag, + ("description", ), + description="GottaGettaTicketFirst", + condition=cond.FlagBase.ENABLE_IF_TRUE, + enabling_category = self.ticket + ) + needs_a_ticket.categories.set([ + self.extras, + self.t_shirt, + self.penguin_dinner, + ]) def populate_discounts(self): @@ -583,14 +658,6 @@ class Command(BaseCommand): price=Decimal("150.00"), quantity=1, # Per user ) - self.find_or_make( - cond.DiscountForProduct, - ("discount", "product"), - discount=discount, - product=self.ticket_hobbyist, - price=Decimal("100.00"), - quantity=1, # Per user - ) def free_category(parent_discount, category, quantity=1): self.find_or_make( @@ -603,12 +670,28 @@ class Command(BaseCommand): ) # Early Bird Discount (general public) + early_bird_hobbyist_discount = self.find_or_make( + cond.TimeOrStockLimitDiscount, + ("description", ), + description="Early Bird Hobbyist", + end_time=datetime(year=2017, month=11, day=1), + limit=150, # Across all users + ) + self.find_or_make( + cond.DiscountForProduct, + ("discount", "product"), + discount=early_bird_hobbyist_discount, + product=self.ticket_hobbyist, + price=Decimal("100.00"), + quantity=1, # Per user + ) + early_bird = self.find_or_make( cond.TimeOrStockLimitDiscount, ("description", ), description="Early Bird", - end_time=datetime(year=2016, month=11, day=1), - limit=165, # Across all users + end_time=datetime(year=2017, month=11, day=1), + limit=200, # Across professionals and hobbyists ) add_early_birds(early_bird)