diff --git a/README.rst b/README.rst index 187a15cf..8f3fc64c 100644 --- a/README.rst +++ b/README.rst @@ -80,9 +80,10 @@ version of pip than is packaged with distros virtualenv. Note that this application is python 3 only so you must create your virtualenv with a python3 interpreter. -- ``virtualenv -p `which python3` venv`` +- ``python3 -m venv venv`` - ``source ./venv/bin/activate`` - ``pip install -c constraints.txt -r requirements.txt`` +- ``pip install -c constraints.txt -r vendored_requirements.txt`` Once your dev instance is up and running ---------------------------------------- @@ -138,7 +139,7 @@ admin3:XzynbNH9Sw3pLPXe Creating review permissions objects ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Some more voodoo magic that needs to be manually run because that's just how symposion works. -This creates the permission that needs to be applied to a user/group/team to be able to see the review sections of the site. +After conference Sections have been created, this command will add +Permission objects for those sections. ``./manage.py create_review_permissions`` diff --git a/docker/Dockerfile b/docker/Dockerfile index 688276bf..baf81ccd 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,6 +1,8 @@ FROM python:3.6 -COPY constraints.txt requirements.txt /reqs/ + +RUN set -ex \ + && apt-get update RUN set -ex \ && buildDeps=' \ @@ -15,18 +17,26 @@ RUN set -ex \ libmemcached-dev \ libsasl2-dev \ ' \ - && apt-get update \ + && apt-get install -y git xmlsec1 libmysqlclient18 \ && apt-get install -y $buildDeps --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/lib/apt/lists/* + +RUN set -ex \ + && pip install uwsgi + +COPY constraints.txt requirements.txt /reqs/ + +RUN set -ex \ && pip install --no-cache-dir -r /reqs/requirements.txt -c /reqs/constraints.txt \ - && pip install uwsgi \ && apt-get purge -y --auto-remove $buildDeps \ && rm -rf /usr/src/python ~/.cache COPY . /app/symposion_app WORKDIR /app/symposion_app +RUN set -x \ + && pip install -r vendored_requirements.txt -c /reqs/constraints.txt RUN set -x \ && DJANGO_SECRET_KEY=1234 STRIPE_PUBLIC_KEY=1234 STRIPE_SECRET_KEY=1234 \ DATABASE_URL="sqlite:////dev/null" \ diff --git a/docker/Dockerfile.makemigrations b/docker/Dockerfile.makemigrations index 5cf1dfeb..d64f416d 100644 --- a/docker/Dockerfile.makemigrations +++ b/docker/Dockerfile.makemigrations @@ -18,5 +18,8 @@ RUN set -ex \ && apt-get install -y git xmlsec1 libmysqlclient18 \ && apt-get install -y $buildDeps --no-install-recommends RUN pip install -c /setup/constraints.txt -r /setup/requirements.txt +COPY . /source +WORKDIR /source +RUN pip install -c /setup/constraints.txt -r /source/vendored_requirements.txt ENTRYPOINT ["python","/source/manage.py", "makemigrations"] diff --git a/docs/index.rst b/docs/index.rst index 4002c9d2..d87b76d8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -7,7 +7,7 @@ submission, reviews, scheduling and sponsor management. .. toctree:: - :maxdepth: 2 + :maxdepth: 3 project conference @@ -17,12 +17,6 @@ submission, reviews, scheduling and sponsor management. speakers schedule miniconfs - -.. include:: registrasion/README.rst - -.. toctree:: - :maxdepth: 3 - registrasion/index.rst About diff --git a/pinaxcon/registrasion/admin.py b/pinaxcon/registrasion/admin.py new file mode 100644 index 00000000..09679267 --- /dev/null +++ b/pinaxcon/registrasion/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin + +from .models import PastEvent + +admin.site.register(PastEvent) diff --git a/pinaxcon/registrasion/forms.py b/pinaxcon/registrasion/forms.py index b655f11c..7bb21f1e 100644 --- a/pinaxcon/registrasion/forms.py +++ b/pinaxcon/registrasion/forms.py @@ -9,7 +9,7 @@ class YesNoField(forms.TypedChoiceField): kwargs['required'] = True super(YesNoField, self).__init__( *args, - coerce=lambda x: x is True, + coerce=lambda x: x in ['True', 'Yes', True], choices=((None, '--------'), (False, 'No'), (True, 'Yes')), **kwargs ) diff --git a/pinaxcon/registrasion/management/commands/populate_inventory.py b/pinaxcon/registrasion/management/commands/populate_inventory.py index ae2a09e6..a1a36a32 100644 --- a/pinaxcon/registrasion/management/commands/populate_inventory.py +++ b/pinaxcon/registrasion/management/commands/populate_inventory.py @@ -13,7 +13,7 @@ from symposion import proposals class Command(BaseCommand): - help = 'Populates the inventory with the LCA2017 inventory model' + help = 'Populates the inventory with the LCA2018 inventory model' def add_arguments(self, parser): pass @@ -67,6 +67,20 @@ class Command(BaseCommand): limit_per_user=1, order=1, ) + self.terms = self.find_or_make( + inv.Category, + ("name",), + name="Terms, Conditions, and Code of Conduct Acceptance", + description="I agree to the " + " " + "terms and conditions of attendance, and I have read, " + "understood, and agree to act according to the standards set " + "forth in our " + "Code of Conduct.", + required=True, + render_type=inv.Category.RENDER_TYPE_CHECKBOX, + order=10, + ) self.penguin_dinner = self.find_or_make( inv.Category, ("name",), @@ -78,7 +92,7 @@ class Command(BaseCommand): required=False, render_type=inv.Category.RENDER_TYPE_QUANTITY, limit_per_user=10, - order=10, + order=20, ) self.speakers_dinner_ticket = self.find_or_make( inv.Category, @@ -91,7 +105,7 @@ class Command(BaseCommand): required=False, render_type=inv.Category.RENDER_TYPE_QUANTITY, limit_per_user=5, - order=20, + order=30, ) self.pdns_category = self.find_or_make( inv.Category, @@ -105,17 +119,17 @@ class Command(BaseCommand): required=False, render_type=inv.Category.RENDER_TYPE_RADIO, limit_per_user=1, - order=30, + order=40, ) self.t_shirt = self.find_or_make( inv.Category, ("name",), - name="T-Shirt", - description="Commemorative conference t-shirts, featuring the" + name="Shirt", + description="Commemorative conference polo shirts, featuring the " "linux.conf.au 2018 artwork.", required=False, render_type=inv.Category.RENDER_TYPE_ITEM_QUANTITY, - order=40, + order=50, ) # self.accommodation = self.find_or_make( # inv.Category, @@ -258,6 +272,17 @@ class Command(BaseCommand): order=90, ) + # Agreements + self.accept_terms = self.find_or_make( + inv.Product, + ("name","category",), + category = self.terms, + name="I Accept", + price=Decimal("00.00"), + reservation_duration=hours(24), + order=10, + limit_per_user=1, + ) # Penguin dinner self.penguin_adult = self.find_or_make( @@ -358,7 +383,7 @@ class Command(BaseCommand): inv.Product, ("name", "category",), category=self.extras, - name="Offset the carbon polution generated by your attendance, " + name="Offset the carbon pollution generated by your attendance, " "thanks to fifteen trees.", price=Decimal("5.00"), reservation_duration=hours(1), @@ -369,12 +394,12 @@ class Command(BaseCommand): ShirtGroup = namedtuple("ShirtGroup", ("prefix", "sizes")) shirt_names = { "mens": ShirtGroup( - "Men's/Straight Cut Size", - ("S", "M", "L", "XL", "2XL", "3XL", "5XL"), + "Men's/Straight Cut", + ("S", "M", "L", "XL", "2XL", "3XL", "4XL"), ), "womens": ShirtGroup( "Women's Classic Fit", - ("XS", "S", "M", "L", "XL", "2XL"), + ("8", "10", "12", "14", "16", "18"), ), } @@ -621,7 +646,6 @@ class Command(BaseCommand): ) pdns_by_staff.group.set([ self.group_team, - self.group_volunteers, ]) pdns_by_staff.categories.set([self.pdns_category, ]) @@ -630,14 +654,30 @@ class Command(BaseCommand): cond.CategoryFlag, ("description", ), description="GottaGettaTicketFirst", - condition=cond.FlagBase.ENABLE_IF_TRUE, + condition=cond.FlagBase.DISABLE_IF_FALSE, enabling_category = self.ticket ) needs_a_ticket.categories.set([ self.extras, self.t_shirt, self.penguin_dinner, + self.pdns_category, ]) + # Require attendees to accept the T&Cs and Code of Conduct + needs_agreement = self.find_or_make( + cond.CategoryFlag, + ("description", ), + description="Must Accept Terms", + condition=cond.FlagBase.DISABLE_IF_FALSE, + enabling_category = self.terms, + ) + needs_agreement.categories.set([ + self.extras, + self.t_shirt, + self.penguin_dinner, + self.pdns_category, + ]) + def populate_discounts(self): @@ -673,7 +713,7 @@ class Command(BaseCommand): early_bird_hobbyist_discount = self.find_or_make( cond.TimeOrStockLimitDiscount, ("description", ), - description="Early Bird Hobbyist", + description="Early Bird Discount - Hobbyist", end_time=datetime(year=2017, month=11, day=1), limit=150, # Across all users ) @@ -689,9 +729,9 @@ class Command(BaseCommand): early_bird = self.find_or_make( cond.TimeOrStockLimitDiscount, ("description", ), - description="Early Bird", + description="Early Bird Discount - Professional", end_time=datetime(year=2017, month=11, day=1), - limit=200, # Across professionals and hobbyists + limit=200, # Across professionals and fairy sponsors ) add_early_birds(early_bird) @@ -757,23 +797,22 @@ class Command(BaseCommand): ]) free_category(ticket_student_inclusions, self.t_shirt) - # Team & volunteer ticket inclusions + # Team ticket inclusions ticket_staff_inclusions = self.find_or_make( cond.IncludedProductDiscount, ("description", ), - description="Complimentary for ticket holder (staff/volunteer)", + description="Complimentary for ticket holder staff)", ) ticket_staff_inclusions.enabling_products.set([ self.ticket_team, - self.ticket_volunteer, ]) free_category(ticket_staff_inclusions, self.penguin_dinner) - # Team & volunteer t-shirts, regardless of ticket type + # Team & volunteer shirts, regardless of ticket type staff_t_shirts = self.find_or_make( cond.GroupMemberDiscount, ("description", ), - description="T-shirts complimentary for staff and volunteers", + description="Shirts complimentary for staff and volunteers", ) staff_t_shirts.group.set([ self.group_team, diff --git a/pinaxcon/registrasion/migrations/0006_auto_20170927_2301.py b/pinaxcon/registrasion/migrations/0006_auto_20170927_2301.py new file mode 100644 index 00000000..98330ac6 --- /dev/null +++ b/pinaxcon/registrasion/migrations/0006_auto_20170927_2301.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-09-27 13:01 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pinaxcon_registrasion', '0005_auto_20170702_2233'), + ] + + operations = [ + migrations.AddField( + model_name='attendeeprofile', + name='future_conference', + field=models.BooleanField(default=False, help_text='Select to have your login details made available to future Linux Australia conferences who share the same Single Sign On system.', verbose_name='Reuse my login for future Linux Australia conferences?'), + preserve_default=False, + ), + migrations.AlterField( + model_name='attendeeprofile', + name='lca_chat', + field=models.BooleanField(help_text='lca2018-chat is a high-traffic mailing list used by attendees during the week of the conference for general discussion.', verbose_name='Subscribe to the lca2018-chat list'), + ), + ] diff --git a/pinaxcon/registrasion/migrations/0007_auto_20170930_1610.py b/pinaxcon/registrasion/migrations/0007_auto_20170930_1610.py new file mode 100644 index 00000000..c5dafab2 --- /dev/null +++ b/pinaxcon/registrasion/migrations/0007_auto_20170930_1610.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-09-30 06:10 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pinaxcon_registrasion', '0006_auto_20170927_2301'), + ] + + operations = [ + migrations.AddField( + model_name='attendeeprofile', + name='agreement', + field=models.BooleanField(default=False, help_text='I agree to the terms and conditions of attendance, and I have read, understood, and agree to act according to the standards set forth in our Code of Conduct.'), + preserve_default=False, + ), + migrations.AlterField( + model_name='attendeeprofile', + name='state', + field=models.CharField(blank=True, help_text='If your Country is Australia, you must list a state.', max_length=256, verbose_name='State/Territory/Province'), + ), + ] diff --git a/pinaxcon/registrasion/migrations/0008_remove_attendeeprofile_agreement.py b/pinaxcon/registrasion/migrations/0008_remove_attendeeprofile_agreement.py new file mode 100644 index 00000000..d35526fe --- /dev/null +++ b/pinaxcon/registrasion/migrations/0008_remove_attendeeprofile_agreement.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-10-01 08:14 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('pinaxcon_registrasion', '0007_auto_20170930_1610'), + ] + + operations = [ + migrations.RemoveField( + model_name='attendeeprofile', + name='agreement', + ), + ] diff --git a/pinaxcon/registrasion/models.py b/pinaxcon/registrasion/models.py index f30af712..91a05382 100644 --- a/pinaxcon/registrasion/models.py +++ b/pinaxcon/registrasion/models.py @@ -138,6 +138,7 @@ class AttendeeProfile(rego.AttendeeProfileBase): state = models.CharField( max_length=256, verbose_name="State/Territory/Province", + help_text="If your Country is Australia, you must list a state.", blank=True, ) @@ -179,13 +180,21 @@ class AttendeeProfile(rego.AttendeeProfileBase): ) lca_chat = models.BooleanField( - verbose_name="Subscribe to the lca2017-chat list", - help_text="lca2017-chat is a high-traffic mailing list used by " + verbose_name="Subscribe to the lca2018-chat list", + help_text="lca2018-chat is a high-traffic mailing list used by " "attendees during the week of the conference for general " "discussion.", blank=True, ) + future_conference = models.BooleanField( + verbose_name = "Reuse my login for future Linux Australia conferences?", + help_text="Select to have your login details made available to future " + "Linux Australia conferences who share the same Single Sign " + "On system.", + blank=True, + ) + past_lca = models.ManyToManyField( PastEvent, verbose_name="Which past linux.conf.au events have you attended?", diff --git a/pinaxcon/settings.py b/pinaxcon/settings.py index 8dec25d8..6f2ff238 100644 --- a/pinaxcon/settings.py +++ b/pinaxcon/settings.py @@ -322,7 +322,7 @@ PROPOSAL_FORMS = { ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile" ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm" INVOICE_CURRENCY = "AUD" - +TICKET_PRODUCT_CATEGORY = 1 ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm" # CSRF custom error screen diff --git a/pinaxcon/templates/_form_snippet.html b/pinaxcon/templates/_form_snippet.html index 7d64b937..1e5193a3 100644 --- a/pinaxcon/templates/_form_snippet.html +++ b/pinaxcon/templates/_form_snippet.html @@ -1,4 +1,4 @@ -{% load pyconau2017_tags %} +{% load lca2018_tags %} {% load bootstrap %} {% if form.non_field_errors %} diff --git a/pinaxcon/templates/content_page.html b/pinaxcon/templates/content_page.html index 1b87f005..7fb76a8e 100644 --- a/pinaxcon/templates/content_page.html +++ b/pinaxcon/templates/content_page.html @@ -1,7 +1,7 @@ {% extends "site_base.html" %} {% load staticfiles %} -{% load pyconau2017_tags %} +{% load lca2018_tags %} {% load i18n %} diff --git a/pinaxcon/templates/dashboard.html b/pinaxcon/templates/dashboard.html index f681707a..841b0a01 100644 --- a/pinaxcon/templates/dashboard.html +++ b/pinaxcon/templates/dashboard.html @@ -5,7 +5,7 @@ {% load review_tags %} {% load teams_tags %} {% load registrasion_tags %} -{% load pyconau2017_tags %} +{% load lca2018_tags %} {% load staticfiles %} @@ -42,8 +42,8 @@
To attend the conference, you must register an attendee profile and purchase your ticket
- Get your ticket +To attend the conference, you must create an attendee profile and purchase your ticket
+ Get your ticket- Enquiries: please e-mail team@hobart.pyconau2017.org + Enquiries: please e-mail team@lca2018.org
The following discounts and complimentary items are available to you. If you wish to take advantage of this offer, you must choose your items below. This discounts will be applied automatically when you check out.{% regroup discounts by discount.description as discounts_grouped %} {% for discount_type in discounts_grouped %}
- You must select a product to receive any discounts.- -
- Applicable discounts will be applied automatically when you check out. -
Monday 16 January–Friday 20 January 2017.
-Wrest Point Convention Centre, Hobart, Tasmania, Australia.
+Monday 22 January–Friday 26 January 2018.
+University of Technology Sydney, New South Wales, Australia.
{% endblock %} {% block header_inset_image %}{% illustration "tuz.svg" %}{% endblock %} -{% block header_background_image %}{% static "pyconau2017/images/wp_bg_optimised.jpg" %}{% endblock %} +{% block header_background_image %}{% static "lca2018/images/wp_bg_optimised.jpg" %}{% endblock %} {% block content %} @@ -25,7 +25,7 @@ {% url "invoice_access" invoice.user.attendee.access_code as access_url %}Your most recent unpaid invoice will be available at {{ request.scheme }}://{{ request.get_host }}{{ access_url }} - You can give this URL to your accounts department to pay for this invoice.
+ You can print that page for your records, or give this URL to your accounts department to pay for this invoice