Merge branch 'ticket-testing' into 'master'
Update inventory for 2018 See merge request LCA2018/symposion_app!49
This commit is contained in:
		
						commit
						2c2fb35557
					
				
					 2 changed files with 160 additions and 77 deletions
				
			
		|  | @ -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 | ||||
|  |  | |||
|  | @ -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]", | ||||
|                         "<a href='https://lca2018.org/attend'>registration page</a>", | ||||
|             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) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 James Polley
						James Polley