Compare commits

...

103 commits

Author SHA1 Message Date
5bf63fe046
Support YouTube videos 2024-09-27 23:00:06 +10:00
646735252f
Upgrade django-easy-thumbnails to support new Pillow
Pillow dropped the Image.ANTIALIAS constant.
2024-07-23 22:32:24 +10:00
711fde5a2f
Add email addresses to talk proposals list 2024-06-08 10:11:40 +10:00
28c73b4295
Only link to reviews for the current conference 2024-05-29 21:39:52 +10:00
64a94cc807
Add Selenium track 2024-05-28 23:09:17 +10:00
4a98404226
Add Selenium track 2024-05-28 23:01:43 +10:00
1372f4d27b
Add keynote panel proposal 2024-05-23 22:12:12 +10:00
9815e1131d
Remove mention of mask requirement 2024-05-17 12:19:42 +10:00
ba1def7e23
Fix slug 2024-05-15 22:51:09 +10:00
a35192b26a
Tweak form names 2024-05-15 22:43:11 +10:00
6557e60bfc
Add FOSSY 2024 CFP 2024-05-15 22:29:33 +10:00
e58a1891d5
Add migration for profile change, update CONFERENCE_ID for 2024 2024-05-06 18:04:54 +10:00
53633bb1d0
Note that homepage.html isn't used 2024-03-18 15:21:21 +11:00
239e9e94ed
Fix image URL 2024-03-18 15:02:58 +11:00
865d57c779
Update conference dates and venue 2024-03-18 15:00:24 +11:00
5f1fc54d6e
Update year to 2024
Date and location pending confirmation.
2024-03-18 15:00:24 +11:00
eb91004c3f
Update year to 2024
Date and location pending confirmation.
2024-03-12 16:38:02 +11:00
dc966ce335
Disable timezone support to work around Django/psycopg issues 2023-09-15 23:11:54 +10:00
b0ec7ce04e
Use OS psycop2 2023-09-15 23:03:38 +10:00
a9b9202a8a
Allow us to use system lxml 2023-09-15 22:57:53 +10:00
8bc0dfffc2
Update OS dependencies for Bookworm 2023-09-15 22:52:33 +10:00
e9ab231173
Update for Debian 12 2023-09-15 22:46:16 +10:00
503b9b164e
Lash up presentations report for naming videos 2023-07-17 13:36:23 +10:00
97beb8b131
Add video URL field 2023-07-14 18:37:45 +10:00
bde37005bd Add wifi SSID and password, a gross hack because I am bad at this 2023-07-13 17:22:39 -04:00
9d7af1ccad
Lash up an attendees CSV report 2023-07-08 01:35:32 +10:00
b5022e8b42
Improve the time display on schedule 2023-06-29 21:08:05 +10:00
c084c93192
Allow writing to all of pinaxcon/site_media/media
We previously allowed writing to the `documents` sub-directory, but we also need
to write to `speaker_photos` to upload speaker photos. Simplest to allow writing
to the `media` parent directory.
2023-06-27 14:31:29 +10:00
9e497ee27d
Fix typo with Attendee.DoesNotExist 2023-06-08 11:52:28 +10:00
9408a5c7bf
Avoid showing the test@example.com email address on the password reset page
Also updated login form to prompt you to use your username if you fail to login
with what looks like an email address.
2023-06-07 22:08:20 +10:00
9135d60067
Fix URLs 2023-05-23 13:08:45 +10:00
8f2fb70094
Add speaker talks report 2023-05-23 13:05:54 +10:00
1fccc11354
Add report for reviewing speakers/talks across all tracks 2023-05-23 12:24:16 +10:00
c56b15f279
Serve up uploaded media 2023-05-19 22:26:47 +10:00
50cfcb7683
Use cronic to make cron jobs less noisy 2023-05-06 16:41:30 +10:00
d11767cbf4
Fix a typo for SecurityProposalForm config 2023-05-05 23:28:43 +10:00
87987e9ce9
Add Right to Repair track 2023-05-05 23:11:07 +10:00
87fdbd8af1
Trial homepage via flatpages 2023-05-05 11:19:52 +10:00
9cb0c6f676
Add deployment scripts 2023-05-02 16:35:51 +10:00
3f31086dd8
Set Emacs defaults for CSS/HTML spacing 2023-05-02 16:31:30 +10:00
52ab8469f7
Add cron templates 2023-05-02 16:31:09 +10:00
f2b861c7a7
Add docs on T&Cs and Django 3.2 upgrade 2023-05-02 16:30:32 +10:00
a77e615e0d
Improve button wording on speaker management page
"Cancel" implied that the button would revert changes you'd made to add
speakers.
2023-05-02 13:58:24 +10:00
41f9a0efde
Add migration for dietary requirements 2023-05-02 13:55:41 +10:00
7dd8a0ad2d
Set logging level to INFO and xmlschema logging to WARNING
This eliminates the noisy messages about XML namespaces on startup and during
management commands.
2023-04-30 21:59:55 +10:00
6af1e594ad
Remove the ticket acknowledgement field 2023-04-28 22:19:52 +10:00
20d7b43efc
Update question about indicating any use of proprietary software 2023-04-25 08:07:36 +10:00
9a618bf54f
Add dietary help text 2023-04-25 08:06:18 +10:00
354825a85b
Add Security track 2023-04-25 07:49:50 +10:00
b195a34723
Fix homepage links 2023-04-25 07:04:17 +10:00
6ddb7b5675
Set SERVER_EMAIL required for error notifications 2023-04-24 19:57:21 +10:00
f6841d5135
Configure email errors 2023-04-24 19:40:52 +10:00
550f3f4122
Configure memcached 2023-04-24 19:40:36 +10:00
0d6b919f47
Increse harakiri for review dashboard 2023-04-24 18:47:00 +10:00
3e21ee85d0
Only apply Django security settings in production 2023-04-24 17:52:55 +10:00
743a4f678a
Add favicon, social images and meta description 2023-04-24 17:52:29 +10:00
3a51efd597
Configure Django production security settings 2023-04-24 17:19:56 +10:00
e6533e541d
Enable Django security middleware 2023-04-24 17:16:47 +10:00
2680b25f2c
Add a copy of 500.html that matches our template blocks
The builtin `pinax_theme_bootstrap` uses `body` instead of `content`.
2023-04-24 16:38:32 +10:00
c15c0bd782
Add image of Oregon Conference Center 2023-04-24 16:38:32 +10:00
37a7a41e2a
Pin upper limit on psycopg2 for Django 2.2 compatibility 2023-04-24 16:38:32 +10:00
34509d23eb
Make vendored symposion into an installable Python package
This allows us to install with `pip install "-e vendor/symposion"` similar to
the other vendored packages. There's no good reason for this to be different to
the others and depend on PYTHONPATH hacking.

Re-add
2023-04-24 16:38:25 +10:00
8020737d7a
Switch vendored requirements to "editable" to simplify development
This will allow us to remove the `sys.path` hacking in pinaxcon/settings.py.
2023-04-24 15:47:43 +10:00
cb12d08b95
Reduce homepage padding 2023-04-24 13:21:13 +10:00
1d0d5e1d10
Move remaining Pelican pages into Django 2023-04-24 13:16:39 +10:00
fbefff60a6
Update talk materials license 2023-04-24 12:38:48 +10:00
c56a805141
Indicate non-FOSS software 2023-04-24 11:59:37 +10:00
8d6519734c
Add settings 2023-04-24 09:28:07 +10:00
bf9735eae3
Add wildcard track 2023-04-24 09:22:00 +10:00
8e2f37d607
Remove speaker photo for now
Causing errors that we don't have time to debug.
2023-04-24 09:06:36 +10:00
a94fc3a9db
Remove references to "Tax Invoice" 2023-04-22 10:26:54 +10:00
759ddb78df
Add Health and Safety Guidelines to speaker form 2023-04-21 20:30:29 +10:00
43db436130
Tweak verbose_name for split out tracks 2023-04-21 18:44:11 +10:00
3f6dbc09c1
Split out Software Worker Co-ops track, re-add lightning talk format 2023-04-21 18:39:47 +10:00
33305d27ac
Can just live in /tmp instead 2023-04-20 20:27:50 +10:00
bc5849dbfc
Remove use of directory under /run
Seems to get remove after reboot.
2023-04-20 20:23:14 +10:00
74cda53eba
Allow primary topic to be null
We hide this field.
2023-04-20 19:43:34 +10:00
ccc22f6875
Remove reference to AUD 2023-04-20 19:15:10 +10:00
94de58b319
Add credits link 2023-04-20 18:40:57 +10:00
39cbb7cb59
Add proposal forms settings 2023-04-20 18:16:57 +10:00
827a482d32
Add models/forms for additional tracks 2023-04-20 17:47:34 +10:00
8173497769
Tweak theme with FOSSY green 2023-04-20 16:00:58 +10:00
2848db468e
Switch to django-user-accounts based account management 2023-04-20 15:47:14 +10:00
31e11c5350
Configure ADMINS setting via environment variable 2023-04-20 15:40:28 +10:00
064353d6ff
Align flatpages to left 2023-04-20 15:33:42 +10:00
71805cc66e
Add additional account app templates
This works around use block "body" when we need block "content".
2023-04-20 15:07:37 +10:00
ceda6dce0a
Only show GST line if non-zero 2023-04-20 14:58:12 +10:00
fc88c31d82
Switch default country to US, currency to USD, tax to zero
Also default linux_australia to field to false to avoid IntegrityError.
2023-04-20 14:56:59 +10:00
bfaa7d9115
Tweak speaker profile and proposal forms 2023-04-20 11:54:36 +10:00
c01dad66f7
Hide Linux Australia-specific questions, update registration changes date 2023-04-20 11:21:14 +10:00
dd23015270
Splice in the FOSSY static site 2023-04-20 00:00:56 +10:00
64b4d93470
Add django-user-accounts app for use in place of SSO 2023-04-20 00:00:00 +10:00
ecfa3c1fce
Change the CONFERENCE_ID 2023-04-18 22:55:12 +10:00
83356e5ac6
Set up SSL 2023-04-18 11:22:20 +10:00
f16b33cf17
Further branding updates 2023-04-15 17:07:24 +10:00
2a3944baa7
Add migrations 2023-04-15 16:56:49 +10:00
830da54d29
Further update branding and organisation details 2023-04-15 16:47:41 +10:00
de0100c93c
Apply FOSSY/Conservancy branding 2023-04-15 15:39:53 +10:00
5d2cff674d
Update uWSGI and Nginx config 2023-04-15 14:55:29 +10:00
4cf869c9fa
Prototype talk proposal forms for "Copyleft and Compliance" and "SFC Member Project" streams 2023-04-15 14:54:11 +10:00
0c3e579b8d
Add uWSGI and Nginx configs 2023-04-06 20:35:08 +10:00
95c7e803e7
Use PostgreSQL instead of MariaDB 2023-04-06 19:44:42 +10:00
afdc8a8776
Add initial FOSSY branding 2023-04-06 19:02:16 +10:00
221 changed files with 2858 additions and 129 deletions

5
.dir-locals.el Normal file
View file

@ -0,0 +1,5 @@
;;; Directory Local Variables -*- no-byte-compile: t -*-
;;; For more information see (info "(emacs) Directory Variables")
((web-mode . ((web-mode-css-indent-offset . 4)
(web-mode-markup-indent-offset . 2))))

View file

@ -125,7 +125,7 @@ Base Data
On initial creation and whenever you reset the database you must reload the On initial creation and whenever you reset the database you must reload the
basic data. This data is stored in the /fixtures directory. You can load this with: basic data. This data is stored in the /fixtures directory. You can load this with:
``./manage.py loaddata ./fixtures/{conference,proposal_base,sites,sitetree}.json`` ``./manage.py loaddata ./fixtures/{conference,sites,sitetree,flatpages}.json``
And to load the base admin users: And to load the base admin users:
@ -172,3 +172,17 @@ All commits to any dev/* branch create a dev review app; for instance, a commit
Manual deployments (eg, to staging and production) can be initiated from a pipeline's page - eg https://gitlab.com/laconfdev/symposion_app/pipelines/24003091 - after prior stages pass. Manual deployments (eg, to staging and production) can be initiated from a pipeline's page - eg https://gitlab.com/laconfdev/symposion_app/pipelines/24003091 - after prior stages pass.
Traps for new players
~~~~~~~~~~~~~~~~~~~~~
1. Terms and Conditions during ticket purchase workflow are implemented by having a product category called something like "Terms & Conditions" with a product called "I accept". See `settings.TERMS_PRODUCT_CATEGORY` and `pinaxcon/registrasion/management/commands/populate_inventory.py`.
Issues
~~~~~~
Couldn't upgrade to Django 3.2 due to `python_2_unicode_compatible` in `pinax-stripe==4.4.0`. Trialed `pinax-stripe-light==5.0.0`, which seems to be it's successor, but it's missing the `pinax.stripe.models.Charge` model.
Got `AssertionError: database connection isn't set to UTC` in development. Fixed by `pip install psycopg2==2.8.6`.

148
deploy/basics.yml Normal file
View file

@ -0,0 +1,148 @@
# Basic Ansible playbook to set up security essentials: Nginx dhparams, fail2ban,
# unattended-upgrades, history logging, firewall, no SSH keys and Postfix
# relay/rewriting/aliases.
#
# Run with:
# ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook deploy/basics.yml -i deploy/inventory.yml --verbose
- hosts: web
become: true
vars:
ansible_ssh_pipelining: true
tasks:
- name: Generate dhparams file for HTTP2
ansible.builtin.command:
cmd: openssl dhparam -out /etc/nginx/dhparam.pem 2048
creates: /etc/nginx/dhparam.pem
- name: Install fail2ban
apt:
pkg: fail2ban
- name: Install unattended-upgrades
apt:
pkg: unattended-upgrades
- name: Configure unattended upgrades overrides
# See defaults in 50unattended-upgrades.
copy:
dest: /etc/apt/apt.conf.d/20auto-upgrades
content: |
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Unattended-Upgrade::Mail "root";
- name: Add extensive history logging
blockinfile:
path: /etc/bash.bashrc
block: |
# Write to history file immediately (rather than only when shell is
# closed). For setting history length see HISTSIZE and HISTFILESIZE in
# bash(1).
shopt -s histappend
PROMPT_COMMAND='history -a'
HISTSIZE=1000000
HISTFILESIZE=1000000
insertafter: EOF
- name: Install `netfilter-persistent` && `iptables-persistent` packages
apt:
pkg:
- iptables-persistent
- netfilter-persistent
- name: Flush existing firewall rules
iptables:
flush: true
- name: Firewall rule - allow all loopback traffic
iptables:
action: append
chain: INPUT
in_interface: lo
jump: ACCEPT
- name: Firewall rule - allow established connections
iptables:
chain: INPUT
ctstate: ESTABLISHED,RELATED
jump: ACCEPT
- name: Firewall rule - allow port ping traffic
iptables:
chain: INPUT
jump: ACCEPT
protocol: icmp
- name: Firewall rule - allow port 22/SSH traffic
iptables:
chain: INPUT
destination_port: '22'
jump: ACCEPT
protocol: tcp
- name: Firewall rule - allow port 80/HTTP traffic
iptables:
chain: INPUT
destination_port: '80'
jump: ACCEPT
protocol: tcp
- name: Firewall rule - allow port 443/HTTPS traffic
iptables:
chain: INPUT
destination_port: '443'
jump: ACCEPT
protocol: tcp
- name: Firewall rule - drop any traffic without rule
iptables:
chain: INPUT
jump: DROP
- name: Disable SSH password authentication
lineinfile:
path: /etc/ssh/sshd_config
line: 'PasswordAuthentication no'
regexp: 'PasswordAuthentication '
# Postfix
- name: Postfix
apt:
pkg:
- postfix
- mailutils
## Commented because you only want this on first run ever.
# - name: Add file for SMTP credentials
# copy:
# dest: /etc/postfix/sasl_passwd
# content: |-
# # After updating, run `sudo postmap hash:/etc/postfix/sasl_passwd`.
# [mail.sfconservancy.org]:587 conference@sfconservancy.org:PASSWORD
- name: Configure Postfix envelope rewriting
copy:
dest: /etc/postfix/canonical
content: |-
/./ conference@sfconservancy.org
- name: Configure Postfix From header rewriting
copy:
dest: /etc/postfix/header_checks
content: |-
/^From:.*/ REPLACE From: conference@sfconservancy.org
- name: Configure Postfix for relaying
copy:
src: postfix/main.cf
dest: /etc/postfix/main.cf
- name: Alias mail to root
copy:
dest: /etc/aliases
content: |-
postmaster: root
root: sysadmin@sfconservancy.org, sysadmin@sturm.com.au

17
deploy/cron/cron.daily Normal file
View file

@ -0,0 +1,17 @@
#!/bin/bash
export DJANGO_SETTINGS_MODULE={{ env.settings }}
set -a
source {{ env.project_dir }}/env
# PYTHONPATH variable is not preserved by sudo.
# Clear out expired Django sessions.
cronic sudo --user={{ env.app_user }} --preserve-env PYTHONPATH={{ env.project_dir }}:$PYTHONPATH {{ env.virtualenv }}/bin/django-admin clearsessions
cronic sudo --user={{ env.app_user }} --preserve-env PYTHONPATH={{ env.project_dir }}:$PYTHONPATH {{ env.virtualenv }}/bin/django-admin expunge_deleted
# Local Variables:
# mode: shell-script-mode
# End:

51
deploy/nginx.conf Normal file
View file

@ -0,0 +1,51 @@
upstream {{ site_name }}_django_wsgi {
keepalive 2; # Cache 2 connections.
server unix:/tmp/{{ site_name }}_uwsgi.sock;
}
server {
listen 80;
server_name {{ env.domain }};
return 301 https://{{ env.domain }}$request_uri;
}
server {
listen 443 ssl http2;
server_name {{ env.domain }};
client_max_body_size 50M;
ssl_certificate /etc/letsencrypt/live/{{ env.domain }}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{{ env.domain }}/privkey.pem;
# Ask for HTTPS for 180 days.
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
# Advise browsers not to use content type sniffing to reduce chance of XSS attacks.
add_header X-Content-Type-Options nosniff;
# Advise browser to only load external content from these sites.
add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://code.jquery.com/jquery-3.5.1.min.js https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js https://js.stripe.com/v3/ https://r.stripe.com/0";
location / {
# Django web application including static files (via WhiteNoise).
uwsgi_pass symposion_django_wsgi;
include uwsgi_params;
# Disable gzip compression when where traffic might be over SSL
# to avoid an attack that may compromise Django's CSRF
# protection. See:
# https://www.djangoproject.com/weblog/2013/aug/06/breach-and-django/
gzip off;
}
location /site_media/ {
# User-uploaded files and generated reports.
alias {{ project_dir }}/pinaxcon/site_media/;
expires 1y;
}
location /.well-known/ {
# Used for "acmi-challenge".
alias {{ project_dir }}/htdocs/.well-known/;
}
}

65
deploy/postfix/main.cf Normal file
View file

@ -0,0 +1,65 @@
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = symposion.sfconservancy.org
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, symposion, localhost
relayhost = [mail.sfconservancy.org]:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
# Relay to Conservancy
#
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = secure
# Increase default limit of 10M to 50M
message_size_limit = 51200000
# This configuration rewrites both envelope sender and From header to a single
# fixed address so that all outgoing mail, including cron emails, can be
# delivered through a single user-grade SMTP account.
#
# Envelope
canonical_maps = regexp:/etc/postfix/canonical
canonical_classes = envelope_sender
# From header
smtp_header_checks = regexp:/etc/postfix/header_checks

35
deploy/uwsgi.ini Normal file
View file

@ -0,0 +1,35 @@
[uwsgi]
strict = true # Fail if unknown config parameter found.
plugins = python3
chdir = {{ project_dir }}
home = {{ virtualenv }}
module = pinaxcon.wsgi
master = true
socket = /tmp/{{ site_name }}_uwsgi.sock
processes = 3
harakiri = 30
max-requests = 5000
vacuum = true
# For Sentry, see https://docs.sentry.io/clients/python/advanced/#a-note-on-uwsgi.
enable-threads = true
log-prefix = {{ site_name }}
# Enable uWSGI stats server for use with uwsgitop.
# Run with: `sudo -u www-data uwsgitop /run/{{ site_name }}/django_uwsgi_stats.socket`
stats = /tmp/{{ site_name }}_uwsgi_stats.socket
# Memory reporting is useful for reviewing memory consumption with uwsgitop, but
# makes the logs a little noiser.
# memory-report = true
# Always use UTF-8 as the encoding for reading/writing files and other,
# regardless of system preferences. Will be default in Python 3.15. We were
# originally specifying LANG=en_AU.UTF-8 here, to handle Unicode chars in
# uploaded filenames, but this broke down when that locale wasn't
# installed. Using Python's UTF Mode should side-step this. See
# https://docs.python.org/3/library/os.html#utf8-mode.
env = PYTHONUTF8=1
# Haven't decided how to securely handle code being able to write __pycache__
# directories and bytecode into read-only directories.
env = PYTHONDONTWRITEBYTECODE=true
# Per Django deployment checklist.
env = PYTHONHASHSEED=random

93
fabfile.py vendored Normal file
View file

@ -0,0 +1,93 @@
"""Automated deployment with Fabric.
To deploy to production:
python3 -m pip install --user vps-deploy
export FABRIC_HOSTS=user@hostname
fab deploy
"""
import os
from fabric import task # type: ignore
from invoke.collection import Collection # type: ignore
from vps_deploy import django_fabric2 as df2 # type: ignore
hosts = os.environ['FABRIC_HOSTS'].split(',')
def install_essentials(c):
# ImageMagick (convert) and Inkscape required for generating badges.
c.run('sudo apt-get install -yy git python3-dev python3-venv python3-wheel build-essential python3-cairocffi python3-psycopg2 postgresql uwsgi-emperor uwsgi-plugin-python3 memcached netcat-openbsd nginx certbot libpq-dev libmemcached-dev libxml2-dev libxslt-dev xmlsec1 imagemagick inkscape cronic')
@task(hosts=hosts)
def deploy(c):
install_essentials(c)
df2.transfer_files_git(c)
df2.init(c)
if not c.run(f'test -e {c.env.virtualenv}', warn=True):
c.sudo(f'mkdir -p $(dirname {c.env.virtualenv})')
c.sudo(f'chown {c.user} $(dirname {c.env.virtualenv})')
c.run('{env.python} -m venv --system-site-packages {env.virtualenv}'.format(env=c.env))
with c.cd(c.env.project_dir):
c.run('{env.virtualenv}/bin/python -m pip install -c constraints.txt -r requirements.txt'.format(env=c.env))
# Fixes "AttributeError: install_layout". See:
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1003252
# https://github.com/pypa/setuptools/issues/3278
c.run('SETUPTOOLS_USE_DISTUTILS=stdlib {env.virtualenv}/bin/python -m pip install -c constraints.txt -r vendored_requirements.txt'.format(env=c.env))
df2.prepare_django(c, fail_level='ERROR')
df2.fix_permissions(
c,
read=['pinaxcon', 'vendor', 'static'],
# For speaker photos and attaching supporting docs to a proposal (select
# "view details" after submitting).
read_write=['pinaxcon/site_media/media'],
)
df2.reload_uwsgi(c)
df2.flush_memcached(c)
df2.update_nginx(c)
df2.install_scheduled_jobs(
c,
periodic_jobs=[
'deploy/cron/cron.daily',
],
)
df2.check_site_online(c)
# The "ns" appears to be a magic name.
ns = Collection(
deploy,
task(df2.download_postgres_db, hosts=hosts),
task(df2.mirror_postgres_db, hosts=hosts),
task(df2.mirror_media, hosts=hosts),
task(df2.django_shell, hosts=hosts),
task(df2.bash, hosts=hosts),
)
ns.configure({
# Built-in Fabric config.
'run': {
'echo': True,
# Needed so local commands work. Can also use FABRIC_RUN_REPLACE_ENV.
'replace_env': False,
},
# Our custom project config.
'env': {
'branch': 'fossy2024',
'app_user': 'www-data',
'db_name': 'symposion',
'project_dir': '/srv/symposion_app',
'media_dir': 'media',
'virtualenv': '/srv/venvs/symposion-django-cp311',
'site_name': 'symposion',
'requirements': 'requirements.txt',
'settings': 'pinaxcon.settings',
'uwsgi_conf': 'deploy/uwsgi.ini',
'nginx_conf': 'deploy/nginx.conf',
'python': '/usr/bin/python3.11',
'url': 'https://2024.fossy.us/',
'domain': '2024.fossy.us',
},
})

View file

@ -3,10 +3,10 @@
"model": "symposion_conference.conference", "model": "symposion_conference.conference",
"pk": 1, "pk": 1,
"fields": { "fields": {
"title": "Everything Open 2023", "title": "FOSSY 2023",
"start_date": "2023-03-14", "start_date": "2023-07-13",
"end_date": "2023-03-16", "end_date": "2023-07-16",
"timezone": "Australia/Melbourne" "timezone": "US/Pacific"
} }
} }
] ]

View file

@ -3,8 +3,8 @@
"model": "sites.site", "model": "sites.site",
"pk": 1, "pk": 1,
"fields": { "fields": {
"domain": "2023.everythingopen.au", "domain": "2023.fossy.us",
"name": "Everything Open 2023" "name": "FOSSY 2023"
} }
} }
] ]

View file

@ -131,7 +131,7 @@
"model": "sitetree.treeitem", "model": "sitetree.treeitem",
"pk": 6, "pk": 6,
"fields": { "fields": {
"title": "About Everything Open", "title": "About FOSSY",
"hint": "", "hint": "",
"url": "/about/", "url": "/about/",
"urlaspattern": false, "urlaspattern": false,

View file

@ -3,7 +3,6 @@ AUTHENTICATION_BACKENDS = [
'symposion.teams.backends.TeamPermissionsBackend', 'symposion.teams.backends.TeamPermissionsBackend',
'django.contrib.auth.backends.ModelBackend', 'django.contrib.auth.backends.ModelBackend',
] ]
LOGIN_URL='/accounts/login'
ROOT_URLCONF = "pinaxcon.devmode_urls" ROOT_URLCONF = "pinaxcon.devmode_urls"

View file

@ -21,10 +21,22 @@ class CategoryAdmin(admin.ModelAdmin):
models_to_register = [ models_to_register = [
models.TalkProposal, models.AIAndMachineLearningProposal,
models.TutorialProposal, models.DiversityEquityAndInclusionProposal,
models.FOSSAndARM64Proposal,
models.FOSSFundingandEconomicsProposal,
models.FOSSInDailyLifeProposal,
models.FOSSInEducationProposal,
models.LicensingAndLegalIssuesProposal,
models.MobileDeviceUserFreedomProposal,
models.ReproducibilityProposal,
models.RightToRepairProposal,
models.ScienceOfCommunityProposal,
models.MemberProjectsProposal,
models.SupportingUserGroupsProposal,
models.XMPPProposal,
models.WildCardProposal,
] ]
for model in models_to_register: for model in models_to_register:
admin.site.register(model, CategoryAdmin, admin.site.register(model, CategoryAdmin,
list_display = [ list_display = [

View file

@ -8,24 +8,31 @@ from pinaxcon.proposals import models
DEFAULT_FIELDS = [ DEFAULT_FIELDS = [
"title", "title",
"primary_topic", # "primary_topic",
"target_audience", "target_audience",
"experience_level", "experience_level",
"abstract", "abstract",
"private_abstract", "private_abstract",
"content_warning", # "content_warning",
"technical_requirements", "technical_requirements",
"project", # "project",
"project_url", # "project_url",
"video_url", # "video_url",
"require_approval", "require_approval",
"recording_release", "recording_release",
"materials_release", "materials_release",
"indicate_use_of_proprietary_software",
] ]
TALK_FORMAT_FIELDS = copy.copy(DEFAULT_FIELDS)
TALK_FORMAT_FIELDS.insert(2, "talk_format")
class ProposalForm(forms.ModelForm): class ProposalForm(forms.ModelForm):
required_css_class = 'label-required' required_css_class = 'label-required'
indicate_use_of_proprietary_software = forms.BooleanField(
help_text="Attendees expect to see only FOSS presented at all FOSSY talks. I affirm that I will clearly mark any proprietary and/or trade secret software on talk slides, in any printed materially and will verbally indicate any non-FOSS mentioned in my talk.")
def clean_description(self): def clean_description(self):
value = self.cleaned_data["description"] value = self.cleaned_data["description"]
@ -48,3 +55,109 @@ class TutorialProposalForm(ProposalForm):
class Meta: class Meta:
model = models.TutorialProposal model = models.TutorialProposal
fields = copy.copy(DEFAULT_FIELDS) fields = copy.copy(DEFAULT_FIELDS)
class MiniconfProposalForm(ProposalForm):
pass
class AIAndMachineLearningProposalForm(MiniconfProposalForm):
class Meta:
model = models.AIAndMachineLearningProposal
fields = TALK_FORMAT_FIELDS
class DiversityEquityAndInclusionProposalForm(MiniconfProposalForm):
class Meta:
model = models.DiversityEquityAndInclusionProposal
fields = TALK_FORMAT_FIELDS
class FOSSAndARM64ProposalForm(MiniconfProposalForm):
class Meta:
model = models.FOSSAndARM64Proposal
fields = TALK_FORMAT_FIELDS
class FOSSFundingandEconomicsProposalForm(MiniconfProposalForm):
class Meta:
model = models.FOSSFundingandEconomicsProposal
fields = TALK_FORMAT_FIELDS
class FOSSInDailyLifeProposalForm(MiniconfProposalForm):
class Meta:
model = models.FOSSInDailyLifeProposal
fields = TALK_FORMAT_FIELDS
class FOSSInEducationProposalForm(MiniconfProposalForm):
class Meta:
model = models.FOSSInEducationProposal
fields = TALK_FORMAT_FIELDS
class KeynotePanelProposalForm(MiniconfProposalForm):
class Meta:
model = models.KeynotePanelProposal
fields = TALK_FORMAT_FIELDS
class LicensingAndLegalIssuesProposalForm(MiniconfProposalForm):
class Meta:
model = models.LicensingAndLegalIssuesProposal
fields = TALK_FORMAT_FIELDS
class MobileDeviceUserFreedomProposalForm(MiniconfProposalForm):
class Meta:
model = models.MobileDeviceUserFreedomProposal
fields = TALK_FORMAT_FIELDS
class ReproducibilityProposalForm(MiniconfProposalForm):
class Meta:
model = models.ReproducibilityProposal
fields = TALK_FORMAT_FIELDS
class RightToRepairProposalForm(MiniconfProposalForm):
class Meta:
model = models.RightToRepairProposal
fields = TALK_FORMAT_FIELDS
class SeleniumProposalForm(MiniconfProposalForm):
class Meta:
model = models.SeleniumProposal
fields = TALK_FORMAT_FIELDS
class ScienceOfCommunityProposalForm(MiniconfProposalForm):
class Meta:
model = models.ScienceOfCommunityProposal
fields = TALK_FORMAT_FIELDS
class MemberProjectsProposalForm(MiniconfProposalForm):
class Meta:
model = models.MemberProjectsProposal
fields = TALK_FORMAT_FIELDS
class SupportingUserGroupsProposalForm(MiniconfProposalForm):
class Meta:
model = models.SupportingUserGroupsProposal
fields = TALK_FORMAT_FIELDS
class XMPPProposalForm(MiniconfProposalForm):
class Meta:
model = models.XMPPProposal
fields = TALK_FORMAT_FIELDS
class WildCardProposalForm(MiniconfProposalForm):
class Meta:
model = models.WildCardProposal
fields = TALK_FORMAT_FIELDS

View file

@ -0,0 +1,55 @@
# Generated by Django 2.2.28 on 2023-04-15 04:51
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0004_auto_20221208_0102'),
]
operations = [
migrations.CreateModel(
name='CopyleftComplianceProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Linux Australia to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Linux Australia to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation, as linux.conf.au miniconfs are unfunded community run events.')),
],
options={
'verbose_name': 'Copyleft and Compliance talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='MemberProjectProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Linux Australia to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Linux Australia to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation, as linux.conf.au miniconfs are unfunded community run events.')),
],
options={
'verbose_name': 'SFC Member Project talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
]

View file

@ -0,0 +1,63 @@
# Generated by Django 2.2.28 on 2023-04-15 06:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('proposals', '0005_copyleftcomplianceproposal_memberprojectproposal'),
]
operations = [
migrations.AlterField(
model_name='copyleftcomplianceproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>"),
),
migrations.AlterField(
model_name='copyleftcomplianceproposal',
name='recording_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence."),
),
migrations.AlterField(
model_name='copyleftcomplianceproposal',
name='ticket_acknowledgement',
field=models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.'),
),
migrations.AlterField(
model_name='memberprojectproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>"),
),
migrations.AlterField(
model_name='memberprojectproposal',
name='recording_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence."),
),
migrations.AlterField(
model_name='memberprojectproposal',
name='ticket_acknowledgement',
field=models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.'),
),
migrations.AlterField(
model_name='talkproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>"),
),
migrations.AlterField(
model_name='talkproposal',
name='recording_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence."),
),
migrations.AlterField(
model_name='tutorialproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>"),
),
migrations.AlterField(
model_name='tutorialproposal',
name='recording_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence."),
),
]

View file

@ -0,0 +1,285 @@
# Generated by Django 2.2.28 on 2023-04-20 07:43
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0006_auto_20230414_2356'),
]
operations = [
migrations.CreateModel(
name='AArch64ARM64Proposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'AArch64/ARM64 Servers and Open Source- The Who, What, Why, and How proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='BSDUnixProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'BSD Unix proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='CommunityProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Community: Open Source in Practice proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='ContainerDaysProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Container Days proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='DiversityEquityInclusionProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Diversity Equity and Inclusion and FOSS proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='FOSSAtPlayProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'FOSS at Play: Games, creative development, and open technology proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='FOSSForEducationProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'FOSS For Education proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='FOSSInDailyLifeProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'FOSS in Daily Life proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='OpenSourcAIDataProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Open Source AI + Data proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='OpenWorkProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Issues in Open Work; Common Challenges and Best Practices in the Open Source Industry, Open Scholarship, and Government proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='ScienceOfCommunityProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Science of Community proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='SustainableOpenSourceBusinessProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Sustainable Open Source Business/ Software Worker Coops proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='XMPPProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'XMPP proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.AlterField(
model_name='copyleftcomplianceproposal',
name='talk_format',
field=models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='memberprojectproposal',
name='talk_format',
field=models.IntegerField(choices=[(2, 'Short Presentation (15 or 20 min)'), (3, 'Long Presentation (45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
]

View file

@ -0,0 +1,98 @@
# Generated by Django 2.2.28 on 2023-04-20 09:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('proposals', '0007_auto_20230420_0043'),
]
operations = [
migrations.AlterField(
model_name='aarch64arm64proposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='bsdunixproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='communityproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='containerdaysproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='copyleftcomplianceproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='diversityequityinclusionproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='fossatplayproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='fossforeducationproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='fossindailylifeproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='memberprojectproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='opensourcaidataproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='openworkproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='scienceofcommunityproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='sustainableopensourcebusinessproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='talkproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='tutorialproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
migrations.AlterField(
model_name='xmppproposal',
name='primary_topic',
field=models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True),
),
]

View file

@ -0,0 +1,114 @@
# Generated by Django 2.2.28 on 2023-04-21 08:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0008_auto_20230420_0241'),
]
operations = [
migrations.CreateModel(
name='SoftwareWorkerCoopsProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Software Worker Co-ops',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.AlterModelOptions(
name='sustainableopensourcebusinessproposal',
options={'verbose_name': 'Sustainable Open Source Business'},
),
migrations.AlterField(
model_name='aarch64arm64proposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='bsdunixproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='communityproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='containerdaysproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='copyleftcomplianceproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='diversityequityinclusionproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='fossatplayproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='fossforeducationproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='fossindailylifeproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='memberprojectproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='opensourcaidataproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='openworkproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='scienceofcommunityproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='sustainableopensourcebusinessproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
migrations.AlterField(
model_name='xmppproposal',
name='talk_format',
field=models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.'),
),
]

View file

@ -0,0 +1,43 @@
# Generated by Django 2.2.28 on 2023-04-23 23:20
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0009_auto_20230421_0139'),
]
operations = [
migrations.CreateModel(
name='WildCardProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Wild card',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.AlterModelOptions(
name='softwareworkercoopsproposal',
options={'verbose_name': 'Software Worker Co-ops proposal'},
),
migrations.AlterModelOptions(
name='sustainableopensourcebusinessproposal',
options={'verbose_name': 'Sustainable Open Source Business proposal'},
),
]

View file

@ -0,0 +1,130 @@
# Generated by Django 2.2.28 on 2023-04-24 21:49
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0010_auto_20230423_1620'),
]
operations = [
migrations.CreateModel(
name='SecurityProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Security',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.AlterField(
model_name='aarch64arm64proposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='bsdunixproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='communityproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='containerdaysproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='copyleftcomplianceproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='diversityequityinclusionproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='fossatplayproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='fossforeducationproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='fossindailylifeproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='memberprojectproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='opensourcaidataproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='openworkproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='scienceofcommunityproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='softwareworkercoopsproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='sustainableopensourcebusinessproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='talkproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='tutorialproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='wildcardproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
migrations.AlterField(
model_name='xmppproposal',
name='materials_release',
field=models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>"),
),
]

View file

@ -0,0 +1,35 @@
# Generated by Django 2.2.28 on 2023-05-05 13:05
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0011_auto_20230424_1449'),
]
operations = [
migrations.CreateModel(
name='RightToRepairProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Right to Repair',
},
bases=('symposion_proposals.proposalbase',),
),
]

View file

@ -0,0 +1,218 @@
# Generated by Django 2.2.28 on 2024-05-15 05:00
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_schedule', '0009_presentation_videos'),
('symposion_proposals', '0003_auto_20170702_2250'),
('symposion_speakers', '0012_auto_20230420_0018'),
('symposion_reviews', '0001_initial'),
('proposals', '0012_righttorepairproposal'),
]
operations = [
migrations.CreateModel(
name='FOSSFundingandEconomicsProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'FOSS Funding and Economics talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='MobileDeviceUserFreedomProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Mobile Device User Freedom talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='ReproducibilityProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Reproducability talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='SupportingUserGroupsProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Supporting User Groups talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.RenameModel(
old_name='OpenSourcAIDataProposal',
new_name='AIAndMachineLearningProposal',
),
migrations.RenameModel(
old_name='DiversityEquityInclusionProposal',
new_name='DiversityEquityAndInclusionProposal',
),
migrations.RenameModel(
old_name='AArch64ARM64Proposal',
new_name='FOSSAndARM64Proposal',
),
migrations.RenameModel(
old_name='FOSSForEducationProposal',
new_name='FOSSInEducationProposal',
),
migrations.RenameModel(
old_name='CopyleftComplianceProposal',
new_name='LicensingAndLegalIssuesProposal',
),
migrations.RenameModel(
old_name='MemberProjectProposal',
new_name='MemberProjectsProposal',
),
migrations.RemoveField(
model_name='communityproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='containerdaysproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='fossatplayproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='openworkproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='securityproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='softwareworkercoopsproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='sustainableopensourcebusinessproposal',
name='proposalbase_ptr',
),
migrations.AlterModelOptions(
name='aiandmachinelearningproposal',
options={'verbose_name': 'AI and Machine Learning talk proposal'},
),
migrations.AlterModelOptions(
name='diversityequityandinclusionproposal',
options={'verbose_name': 'Diversity Equity and Inclusion and FOSS talk proposal'},
),
migrations.AlterModelOptions(
name='fossandarm64proposal',
options={'verbose_name': 'FOSS and ARM64; from the Cloud to the Edge talk proposal'},
),
migrations.AlterModelOptions(
name='fossindailylifeproposal',
options={'verbose_name': 'FOSS in Daily Life talk proposal'},
),
migrations.AlterModelOptions(
name='fossineducationproposal',
options={'verbose_name': 'FOSS in Education talk proposal'},
),
migrations.AlterModelOptions(
name='licensingandlegalissuesproposal',
options={'verbose_name': 'Licensing and Legal Issues talk proposal'},
),
migrations.AlterModelOptions(
name='memberprojectsproposal',
options={'verbose_name': 'SFC Member Projects talk proposal'},
),
migrations.AlterModelOptions(
name='righttorepairproposal',
options={'verbose_name': 'Right to Repair talk proposal'},
),
migrations.AlterModelOptions(
name='scienceofcommunityproposal',
options={'verbose_name': 'Science of Community talk proposal'},
),
migrations.AlterModelOptions(
name='wildcardproposal',
options={'verbose_name': 'Wild card talk proposal'},
),
migrations.AlterModelOptions(
name='xmppproposal',
options={'verbose_name': 'XMPP talk proposal'},
),
migrations.DeleteModel(
name='BSDUnixProposal',
),
migrations.DeleteModel(
name='CommunityProposal',
),
migrations.DeleteModel(
name='ContainerDaysProposal',
),
migrations.DeleteModel(
name='FOSSAtPlayProposal',
),
migrations.DeleteModel(
name='OpenWorkProposal',
),
migrations.DeleteModel(
name='SecurityProposal',
),
migrations.DeleteModel(
name='SoftwareWorkerCoopsProposal',
),
migrations.DeleteModel(
name='SustainableOpenSourceBusinessProposal',
),
]

View file

@ -0,0 +1,35 @@
# Generated by Django 2.2.28 on 2024-05-23 05:11
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0013_auto_20240515_0500'),
]
operations = [
migrations.CreateModel(
name='KeynotePanelProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Keynote panel talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
]

View file

@ -0,0 +1,35 @@
# Generated by Django 2.2.28 on 2024-05-28 06:09
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
('proposals', '0014_keynotepanelproposal'),
]
operations = [
migrations.CreateModel(
name='SeleniumProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, 'Other')], help_text='What is the primary topic area for your session?', null=True)),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')),
('content_warning_html', models.TextField(blank=True)),
('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Long Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')),
('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation.')),
],
options={
'verbose_name': 'Selenium talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
]

View file

@ -68,7 +68,7 @@ class Proposal(ProposalBase):
recording_release = models.BooleanField( recording_release = models.BooleanField(
default=True, default=True,
help_text="I allow Linux Australia to release any recordings of " help_text="I allow Software Freedom Conservancy to release any recordings of "
"presentations covered by this proposal, on YouTube under the " "presentations covered by this proposal, on YouTube under the "
"standard YouTube licence, and on other platforms under the " "standard YouTube licence, and on other platforms under the "
"Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International " "Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International "
@ -78,16 +78,17 @@ class Proposal(ProposalBase):
materials_release = models.BooleanField( materials_release = models.BooleanField(
default=True, default=True,
help_text="I allow Linux Australia to release any other material " help_text="I allow Software Freedom Conservancy to release any other material "
"(such as slides) from presentations covered by this proposal, under " "(such as slides) from presentations covered by this proposal, under "
"the <a " "the <a "
"href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> " "href='https://creativecommons.org/licenses/by-sa/4.0/'> "
"Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>" "Creative Commons Attribution-ShareAlike 4.0 International</a>"
) )
primary_topic = models.IntegerField( primary_topic = models.IntegerField(
choices=PROPOSAL_TOPIC, choices=PROPOSAL_TOPIC,
help_text="What is the primary topic area for your session?" help_text="What is the primary topic area for your session?",
null=True,
) )
experience_level = models.IntegerField( experience_level = models.IntegerField(
@ -127,3 +128,118 @@ class TutorialProposal(Proposal):
class Meta: class Meta:
verbose_name = "tutorial proposal" verbose_name = "tutorial proposal"
class MiniconfSessionProposal(Proposal):
FORMAT_SHORT_PRESENTATION = 1
FORMAT_MEDIUM_PRESENTATION = 2
FORMAT_LONG_PRESENTATION = 3
FORMAT_DEMONSTRATION = 4
FORMAT_OTHER = 5
TALK_FORMATS = [
(FORMAT_SHORT_PRESENTATION, "Lightning Talk (5-10 min)"),
(FORMAT_MEDIUM_PRESENTATION, "Short Presentation (20-25 min)"),
(FORMAT_LONG_PRESENTATION, "Long Presentation (40-45 min)"),
]
talk_format = models.IntegerField(
choices=TALK_FORMATS,
default=FORMAT_LONG_PRESENTATION,
help_text="Please indicate your preferred talk length in the private abstract field below."
)
ticket_acknowledgement = models.BooleanField(
default=False,
help_text="I understand that I will be required to purchase a conference ticket "
"and arrange my own travel and accommodation."
)
class Meta:
abstract = True
class AIAndMachineLearningProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "AI and Machine Learning talk proposal"
class DiversityEquityAndInclusionProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Diversity Equity and Inclusion and FOSS talk proposal"
class FOSSAndARM64Proposal(MiniconfSessionProposal):
class Meta:
verbose_name = "FOSS and ARM64; from the Cloud to the Edge talk proposal"
class FOSSFundingandEconomicsProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "FOSS Funding and Economics talk proposal"
class FOSSInDailyLifeProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "FOSS in Daily Life talk proposal"
class FOSSInEducationProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "FOSS in Education talk proposal"
class KeynotePanelProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Keynote panel talk proposal"
class LicensingAndLegalIssuesProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Licensing and Legal Issues talk proposal"
class MobileDeviceUserFreedomProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Mobile Device User Freedom talk proposal"
class ReproducibilityProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Reproducability talk proposal"
class RightToRepairProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Right to Repair talk proposal"
class ScienceOfCommunityProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Science of Community talk proposal"
class SeleniumProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Selenium talk proposal"
class MemberProjectsProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "SFC Member Projects talk proposal"
class SupportingUserGroupsProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Supporting User Groups talk proposal"
class XMPPProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "XMPP talk proposal"
class WildCardProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Wild card talk proposal"

View file

@ -28,6 +28,8 @@ class ProfileForm(forms.ModelForm):
'lca_announce', 'lca_announce',
'lca_chat', 'lca_chat',
'future_conference', 'future_conference',
'linux_australia',
'past_lca',
] ]
widgets = { widgets = {
'past_lca': forms.widgets.CheckboxSelectMultiple 'past_lca': forms.widgets.CheckboxSelectMultiple

View file

@ -0,0 +1,33 @@
# Generated by Django 2.2.28 on 2023-04-15 06:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pinaxcon_registrasion', '0015_auto_20221208_0102'),
]
operations = [
migrations.AlterField(
model_name='attendeeprofile',
name='address_line_1',
field=models.CharField(blank=True, help_text='This address, if provided, will appear on your invoices.', max_length=1024, verbose_name='Address line 1'),
),
migrations.AlterField(
model_name='attendeeprofile',
name='children',
field=models.CharField(blank=True, help_text="This is a family friendly conference and provides free child-care for pre-school children from 6 months up to 5 years. We hope to also provide a programme for older children and will let you know closer to the conference. If you're wanting to bring your children, please let us know their age(s) so we can ensure we have enough spaces available.", max_length=256, verbose_name='Child Ages and Information'),
),
migrations.AlterField(
model_name='attendeeprofile',
name='free_text_1',
field=models.CharField(blank=True, help_text="A line of free text that will appear on your badge. Use this for your Mastodon or Twitter handle, IRC nick, your preferred pronouns or anything else you'd like people to see on your badge.", max_length=64, verbose_name='Free text line 1'),
),
migrations.AlterField(
model_name='attendeeprofile',
name='lca_announce',
field=models.BooleanField(blank=True, default=False, help_text='Select to be subscribed to the low-traffic lca-announce mailing list', verbose_name='Subscribe to lca-announce list'),
),
]

View file

@ -0,0 +1,34 @@
# Generated by Django 2.2.28 on 2023-04-20 07:18
from django.db import migrations, models
import django_countries.fields
class Migration(migrations.Migration):
dependencies = [
('pinaxcon_registrasion', '0016_auto_20230414_2356'),
]
operations = [
migrations.AlterField(
model_name='attendeeprofile',
name='country',
field=django_countries.fields.CountryField(default='US', max_length=2, verbose_name='Country'),
),
migrations.AlterField(
model_name='attendeeprofile',
name='linux_australia',
field=models.BooleanField(blank=True, default=False, help_text="Select this field to register for free <a href='http://www.linux.org.au/'>Linux Australia</a> membership.", verbose_name='Linux Australia membership'),
),
migrations.AlterField(
model_name='attendeeprofile',
name='of_legal_age',
field=models.BooleanField(blank=True, help_text='Being under 18 will not stop you from attending the conference.', verbose_name='Are you over 18?'),
),
migrations.AlterField(
model_name='attendeeprofile',
name='state',
field=models.CharField(blank=True, max_length=256, verbose_name='State/Territory/Province'),
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 2.2.28 on 2023-05-02 03:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pinaxcon_registrasion', '0017_auto_20230420_0018'),
]
operations = [
migrations.AlterField(
model_name='attendeeprofile',
name='dietary_restrictions',
field=models.CharField(blank=True, help_text='eg. vegan, kosher, gluten free, keto, paleo, etc', max_length=256, verbose_name='Food allergies, intolerances, or dietary restrictions'),
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 2.2.28 on 2024-05-06 00:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pinaxcon_registrasion', '0018_auto_20230501_2052'),
]
operations = [
migrations.AddField(
model_name='attendeeprofile',
name='sfc_sustainer',
field=models.BooleanField(blank=True, default=False, help_text='Financial support from <a href="https://sfconservancy.org/sustainer/" target="_blank">Sustainers</a> helps Conservancy\'s work in a strategic, long-term way.', verbose_name='Are you an SFC Sustainer?'),
),
]

View file

@ -135,24 +135,23 @@ class AttendeeProfile(rego.AttendeeProfileBase):
) )
country = CountryField( country = CountryField(
verbose_name="Country", verbose_name="Country",
default="AU", default="US",
) )
state = models.CharField( state = models.CharField(
max_length=256, max_length=256,
verbose_name="State/Territory/Province", verbose_name="State/Territory/Province",
help_text="If your Country is Australia, you must list a state.",
blank=True, blank=True,
) )
of_legal_age = models.BooleanField( of_legal_age = models.BooleanField(
verbose_name="Are you over 18?", verbose_name="Are you over 18?",
help_text="Being under 18 will not stop you from attending the " help_text="Being under 18 will not stop you from attending the "
"conference. We need to know whether you are over 18 to " "conference.",
"allow us to cater for you at venues that serve alcohol.",
blank=True, blank=True,
) )
dietary_restrictions = models.CharField( dietary_restrictions = models.CharField(
verbose_name="Food allergies, intolerances, or dietary restrictions", verbose_name="Food allergies, intolerances, or dietary restrictions",
help_text="eg. vegan, kosher, gluten free, keto, paleo, etc",
max_length=256, max_length=256,
blank=True, blank=True,
) )
@ -171,7 +170,7 @@ class AttendeeProfile(rego.AttendeeProfileBase):
children = models.CharField( children = models.CharField(
verbose_name="Child Ages and Information", verbose_name="Child Ages and Information",
max_length=256, max_length=256,
help_text="Everything Open is a family friendly conference and provides " help_text="This is a family friendly conference and provides "
"free child-care for pre-school children from 6 months up to 5 years. We " "free child-care for pre-school children from 6 months up to 5 years. We "
"hope to also provide a programme for older children and will let you " "hope to also provide a programme for older children and will let you "
"know closer to the conference. If you're wanting to bring your children, " "know closer to the conference. If you're wanting to bring your children, "
@ -186,6 +185,7 @@ class AttendeeProfile(rego.AttendeeProfileBase):
"<a href='http://www.linux.org.au/'>Linux Australia</a> " "<a href='http://www.linux.org.au/'>Linux Australia</a> "
"membership.", "membership.",
blank=True, blank=True,
default=False,
) )
lca_announce = models.BooleanField( lca_announce = models.BooleanField(
@ -220,6 +220,14 @@ class AttendeeProfile(rego.AttendeeProfileBase):
blank=True, blank=True,
) )
sfc_sustainer = models.BooleanField(
verbose_name="Are you an SFC Sustainer?",
help_text="Financial support from <a href=\"https://sfconservancy.org/sustainer/\" target=\"_blank\">Sustainers</a> "
"helps Conservancy's work in a strategic, long-term way.",
blank=True,
default=False,
)
def first_name(self): def first_name(self):
return wrap(self.name, 15, break_long_words=False)[0] return wrap(self.name, 15, break_long_words=False)[0]

View file

@ -16,7 +16,6 @@ PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir
PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__)) PACKAGE_ROOT = os.path.abspath(os.path.dirname(__file__))
DJANGO_ROOT = os.path.abspath(os.path.dirname(django.__file__)) DJANGO_ROOT = os.path.abspath(os.path.dirname(django.__file__))
BASE_DIR = PACKAGE_ROOT BASE_DIR = PACKAGE_ROOT
sys.path.append(os.path.join(PROJECT_ROOT, 'vendor'))
### USER SETTINGS ### USER SETTINGS
@ -117,22 +116,23 @@ if DEV_MODE and DEV_MODE == "LAPTOP":
else: else:
CACHES = { CACHES = {
'default': { 'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': 'unique-snowflake', 'LOCATION': '127.0.0.1:11211',
} },
} }
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '*'] ALLOWED_HOSTS = ['127.0.0.1', 'localhost', '*']
TIME_ZONE = "Australia/Sydney" TIME_ZONE = "US/Pacific"
DATE_FORMAT = "j F Y" DATE_FORMAT = "F j Y"
LANGUAGE_CODE = "en-au" LANGUAGE_CODE = "en-us"
SITE_ID = int(os.environ.get("SITE_ID", 1)) SITE_ID = int(os.environ.get("SITE_ID", 1))
USE_I18N = True USE_I18N = True
USE_L10N = True USE_L10N = True
USE_TZ = True USE_TZ = False # Work around Django 2.2 incompatibility with psycopg >=
# 2.9. Needed since Python 3.11 doesn't support psycogp < 2.9.
MEDIA_ROOT = os.environ.get("MEDIA_ROOT", os.path.join(PACKAGE_ROOT, "site_media", "media")) MEDIA_ROOT = os.environ.get("MEDIA_ROOT", os.path.join(PACKAGE_ROOT, "site_media", "media"))
MEDIA_URL = "/site_media/media/" MEDIA_URL = "/site_media/media/"
@ -170,6 +170,7 @@ TEMPLATES = [
"django.template.context_processors.request", "django.template.context_processors.request",
"django.contrib.messages.context_processors.messages", "django.contrib.messages.context_processors.messages",
"pinax_theme_bootstrap.context_processors.theme", "pinax_theme_bootstrap.context_processors.theme",
"account.context_processors.account",
"symposion.reviews.context_processors.reviews", "symposion.reviews.context_processors.reviews",
"django_settings_export.settings_export", "django_settings_export.settings_export",
], ],
@ -178,11 +179,14 @@ TEMPLATES = [
] ]
MIDDLEWARE = [ MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware", "whitenoise.middleware.WhiteNoiseMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware", "django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware", "django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware",
"account.middleware.LocaleMiddleware",
"account.middleware.TimezoneMiddleware",
"djangosaml2.middleware.SamlSessionMiddleware", "djangosaml2.middleware.SamlSessionMiddleware",
"django.contrib.messages.middleware.MessageMiddleware", "django.contrib.messages.middleware.MessageMiddleware",
"debug_toolbar.middleware.DebugToolbarMiddleware", "debug_toolbar.middleware.DebugToolbarMiddleware",
@ -267,6 +271,8 @@ INSTALLED_APPS = [
"waffle", "waffle",
"crispy_forms", "crispy_forms",
"account",
] ]
CRISPY_TEMPLATE_PACK = "bootstrap4" CRISPY_TEMPLATE_PACK = "bootstrap4"
@ -321,7 +327,6 @@ LOGGING = {
'level': 'ERROR', 'level': 'ERROR',
'filters': ['require_debug_false'], 'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler', 'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}, },
'djdt_log': { 'djdt_log': {
'level': 'DEBUG', 'level': 'DEBUG',
@ -332,7 +337,7 @@ LOGGING = {
'loggers': { 'loggers': {
'django.request': { 'django.request': {
'handlers': ['mail_admins'], 'handlers': ['mail_admins'],
'level': 'DEBUG', 'level': 'ERROR',
'propagate': True, 'propagate': True,
}, },
'symposion.request': { 'symposion.request': {
@ -340,10 +345,15 @@ LOGGING = {
'level': 'DEBUG', 'level': 'DEBUG',
'propagate': True, 'propagate': True,
}, },
'xmlschema': {
'handlers': ['console'],
'level': 'WARNING',
'propagate': False,
},
}, },
'root': { 'root': {
'handlers': ['console', 'djdt_log'], 'handlers': ['console', 'djdt_log'],
'level': 'DEBUG' 'level': 'INFO'
}, },
} }
FIXTURE_DIRS = [ FIXTURE_DIRS = [
@ -356,21 +366,36 @@ AUTHENTICATION_BACKENDS = [
'djangosaml2.backends.Saml2Backend', 'djangosaml2.backends.Saml2Backend',
] ]
LOGIN_URL = '/saml2/login/' LOGIN_URL = '/account/login/'
SESSION_EXPIRE_AT_BROWSER_CLOSE = True SESSION_EXPIRE_AT_BROWSER_CLOSE = True
CONFERENCE_ID = 1 CONFERENCE_ID = 3
PROPOSAL_FORMS = { PROPOSAL_FORMS = {
"talk": "pinaxcon.proposals.forms.TalkProposalForm", "ai-and-machine-learning": "pinaxcon.proposals.forms.AIAndMachineLearningProposalForm",
"tutorial": "pinaxcon.proposals.forms.TutorialProposalForm", "diversity-equity-and-inclusion": "pinaxcon.proposals.forms.DiversityEquityAndInclusionProposalForm",
"foss-and-arm64": "pinaxcon.proposals.forms.FOSSAndARM64ProposalForm",
"foss-funding-and-economics": "pinaxcon.proposals.forms.FOSSFundingandEconomicsProposalForm",
"foss-in-daily-life": "pinaxcon.proposals.forms.FOSSInDailyLifeProposalForm",
"foss-in-education": "pinaxcon.proposals.forms.FOSSInEducationProposalForm",
"keynote-panel": "pinaxcon.proposals.forms.KeynotePanelProposalForm",
"licensing-and-legal-issues": "pinaxcon.proposals.forms.LicensingAndLegalIssuesProposalForm",
"mobile-device-user-freedom": "pinaxcon.proposals.forms.MobileDeviceUserFreedomProposalForm",
"reproducibility": "pinaxcon.proposals.forms.ReproducibilityProposalForm",
"right-to-repair": "pinaxcon.proposals.forms.RightToRepairProposalForm",
"selenium": "pinaxcon.proposals.forms.SeleniumProposalForm",
"science-of-community": "pinaxcon.proposals.forms.ScienceOfCommunityProposalForm",
"member-projects": "pinaxcon.proposals.forms.MemberProjectsProposalForm",
"supporting-user-groups": "pinaxcon.proposals.forms.SupportingUserGroupsProposalForm",
"xmpp": "pinaxcon.proposals.forms.XMPPProposalForm",
"wild-card": "pinaxcon.proposals.forms.WildCardProposalForm",
} }
MAIN_CONFERENCE_PROPOSAL_KINDS = ("Talk",) MAIN_CONFERENCE_PROPOSAL_KINDS = ("Talk",)
# Registrasion bits: # Registrasion bits:
ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile" ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile"
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm" ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"
INVOICE_CURRENCY = "AUD" INVOICE_CURRENCY = "USD"
GST_RATE = Decimal('0.1') GST_RATE = Decimal('0')
TICKET_PRODUCT_CATEGORY = 1 TICKET_PRODUCT_CATEGORY = 1
TERMS_PRODUCT_CATEGORY = 2 TERMS_PRODUCT_CATEGORY = 2
ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm" ATTENDEE_PROFILE_FORM = "pinaxcon.registrasion.forms.ProfileForm"
@ -513,12 +538,12 @@ class PenguinDinnerCat(Category):
return t return t
CONFERENCE_NAME = os.environ.get('CONFERENCE_NAME', 'Everything Open') CONFERENCE_NAME = os.environ.get('CONFERENCE_NAME', 'FOSSY')
CONFERENCE_NAME_SHORT = os.environ.get('CONFERENCE_NAME_SHORT', 'EO') CONFERENCE_NAME_SHORT = os.environ.get('CONFERENCE_NAME_SHORT', 'FOSSY')
CONFERENCE_EMAIL = os.environ.get('CONFERENCE_EMAIL', DEFAULT_FROM_EMAIL) CONFERENCE_EMAIL = os.environ.get('CONFERENCE_EMAIL', DEFAULT_FROM_EMAIL)
CONF_TZINFO = pytz.timezone(TIME_ZONE) CONF_TZINFO = pytz.timezone(TIME_ZONE)
CONF_START = CONF_TZINFO.localize(datetime(2023, 3, 14)) CONF_START = CONF_TZINFO.localize(datetime(2024, 8, 1))
CONF_END = CONF_TZINFO.localize(datetime(2023, 3, 16)) CONF_END = CONF_TZINFO.localize(datetime(2024, 8, 4))
CONF_MINICONF_END = CONF_TZINFO.localize(datetime(2023, 3, 14, 23, 59)) CONF_MINICONF_END = CONF_TZINFO.localize(datetime(2023, 3, 14, 23, 59))
EARLY_BIRD_DEADLINE = CONF_TZINFO.localize(datetime(2023, 1, 28)) EARLY_BIRD_DEADLINE = CONF_TZINFO.localize(datetime(2023, 1, 28))
PENGUIN_DINNER_TICKET_DATE = date(2023, 3, 15) PENGUIN_DINNER_TICKET_DATE = date(2023, 3, 15)
@ -580,3 +605,31 @@ VENUELESS_URL = os.environ.get('VENUELESS_URL', None)
VENUELESS_AUDIENCE = os.environ.get('VENUELESS_AUDIENCE', "venueless") VENUELESS_AUDIENCE = os.environ.get('VENUELESS_AUDIENCE', "venueless")
VENUELESS_TOKEN_ISSUER = os.environ.get('VENUELESS_TOKEN_ISSUER', "any") VENUELESS_TOKEN_ISSUER = os.environ.get('VENUELESS_TOKEN_ISSUER', "any")
VENUELESS_SECRET = os.environ.get('VENUELESS_SECRET', SECRET_KEY) VENUELESS_SECRET = os.environ.get('VENUELESS_SECRET', SECRET_KEY)
ACCOUNT_SIGNUP_REDIRECT_URL = '/dashboard/'
ACCOUNT_LOGIN_REDIRECT_URL = '/dashboard/'
ADMINS = [('', email) for email in os.environ.get('DJANGO_ADMINS', '').split(',') if email]
SERVER_EMAIL = DEFAULT_FROM_EMAIL
if not DEBUG:
# Django recommended security settings.
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
SECURE_SSL_REDIRECT = True
SECURE_BROWSER_XSS_FILTER = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = 'DENY'
SILENCED_SYSTEM_CHECKS = [
# HSTS is handled by Nginx.
'security.W004',
# Don't want to preload HSTS at this stage.
'security.W021']
THEME_CONTACT_EMAIL = CONFERENCE_EMAIL

View file

@ -0,0 +1,12 @@
{% extends "site_base.html" %}
{% load i18n %}
{% block head_title %}{% trans "Server Error" %}{% endblock %}
{% block content %}
<header class="jumbotron subhead" id="overview">
<h1>{% trans "Something went wrong" %}</h1>
<p class="lead">{% trans "We're sorry but a server error has occurred. We've been notified and will look into it as soon as possible." %}</p>
</header>
{% endblock %}

View file

@ -0,0 +1,20 @@
{% extends "site_base.html" %}
{% load i18n %}
{% block head_title %}{% trans "Confirm Email" %}{% endblock %}
{% block content %}
<div class="row">
<div class="col-md-5">
<form method="post" action="{% url "account_confirm_email" key=confirmation.key %}">
<legend>{% trans "Confirm Email" %}</legend>
<fieldset>
{% csrf_token %}
<p>{% blocktrans with email=confirmation.email_address.email %}Confirm email address <b>{{ email }}</b>?{% endblocktrans %}</p>
<button type="submit" class="btn btn-primary">{% trans "Confirm" %}</button>
</fieldset>
</form>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,12 @@
{% extends "site_base.html" %}
{% load i18n %}
{% block head_title %}{% trans "Confirm your email address" %}{% endblock %}
{% block content %}
<h2>{% trans "Confirm your email address" %}</h2>
<p>{% blocktrans %}We have sent you an email to <b>{{ email }}</b> for verification. Follow the link provided to finalize the signup process. If you do not receive it within a few minutes, contact us at <a href="mailto:{{ THEME_CONTACT_EMAIL }}">{{ THEME_CONTACT_EMAIL }}</a>.{% endblocktrans %}</p>
<p><a href="{{ success_url }}">{% trans "Go back" %}</a></p>
{% endblock %}

View file

@ -0,0 +1,10 @@
{% extends "site_base.html" %}
{% load i18n %}
{% block head_title %}{% trans "Email confirmed" %}{% endblock %}
{% block content %}
<h1>{% trans "Email confirmed" %}</h1>
<p>{% blocktrans with email=confirmation.email_address.email %}You have confirmed <b>{{ email }}</b>{% endblocktrans %}</p>
{% endblock %}

View file

@ -0,0 +1,43 @@
{% extends "site_base.html" %}
{% load account_tags %}
{% load i18n %}
{% load bootstrap %}
{% block head_title %}{% trans "Log in" %}{% endblock %}
{% block content %}
<div class="row">
<div class="col-md-4">
<form method="POST" action="{% url "account_login" %}" autocapitalize="off" {% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
<legend>{% trans "Log in to an existing account" %}</legend>
{% csrf_token %}
{{ form|bootstrap }}
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
{% endif %}
<button type="submit" class="btn btn-primary">{% trans "Log in" %}</button>
<a href="{% url "account_password_reset" %}" class="btn btn-link">{% trans "Forgot your password?" %}</a>
</form>
{% if ACCOUNT_OPEN_SIGNUP %}
<p class="login-signup">
<small>
{% trans "Don't have an account?" %} <strong><a href="{% urlnext 'account_signup' %}">{% trans "Sign up" %}</a></strong>
</small>
</p>
{% endif %}
</div>
<div class="col-md-4">
{% include "account/_login_sidebar.html" %}
</div>
</div>
{% endblock %}
{% block scripts %}
{{ block.super }}
<script type="text/javascript">
$(document).ready(function() {
$('#id_username').focus();
});
</script>
{% endblock %}

View file

@ -0,0 +1,20 @@
{% extends "site_base.html" %}
{% load i18n %}
{% block head_title %}{% trans "Log out" %}{% endblock %}
{% block content %}
<div class="row">
<div class="col-md-5">
<form method="POST" action="{% url "account_logout" %}">
<legend>{% trans "Log out" %}</legend>
<fieldset>
{% csrf_token %}
<p>{% trans "Are you sure you want to log out?" %}</p>
<button type="submit" class="btn btn-primary">{% trans "Log out" %}</button>
</fieldset>
</form>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,36 @@
{% extends "site_base.html" %}
{% load i18n %}
{% load bootstrap %}
{% load account_tags %}
{% block head_title %}{% trans "Password reset" %}{% endblock %}
{% user_display request.user as user_display %}
{% block content %}
<div class="row">
<div class="col-md-8">
<form method="POST" action="">
<legend>{% trans "Password reset" %}</legend>
<p class="lead">{% trans "Forgotten your password? Enter your email address below, and we'll send you an email allowing you to reset it." %}</p>
<fieldset class="row">
<div class="col-md-5">
{% csrf_token %}
{{ form|bootstrap }}
<button type="submit" class="btn btn-primary">
{% trans "Reset my password" %}
</button>
</div>
</fieldset>
</form>
</div>
</div>
<p>{% blocktrans %}If you have any trouble resetting your password, contact us at <a href="mailto:{{ THEME_CONTACT_EMAIL }}">{{ THEME_CONTACT_EMAIL }}</a>.{% endblocktrans %}</p>
{% endblock %}
{% block extra_body %}
<script>
$("#id_email").focus();
</script>
{% endblock %}

View file

@ -0,0 +1,27 @@
{% extends "site_base.html" %}
{% load i18n %}
{% load account_tags %}
{% block head_title %}{% trans "Password reset sent" %}{% endblock %}
{% block content %}
<h1>{% trans "Password reset sent" %}</h1>
{% if not resend %}
<p>{% blocktrans %}We have sent you an email. If you do not receive it within a few minutes, try resending or contact us at <a href="mailto:{{ THEME_CONTACT_EMAIL }}">{{ THEME_CONTACT_EMAIL }}</a>.{% endblocktrans %}</p>
<div class="row">
<div class="col-md-5">
<form method="POST" action="{% url "account_password_reset" %}">
{% csrf_token %}
{% for field in form %}
{{ field.as_hidden }}
{% endfor %}
<button type="submit" name="resend" class="btn btn-primary">{% trans "Resend" %}</button>
</form>
</div>
</div>
{% else %}
<p>{% blocktrans %}We have resent the password email. If you do not receive it within a few minutes, contact us at <a href="mailto:{{ THEME_CONTACT_EMAIL }}">{{ THEME_CONTACT_EMAIL }}</a>.{% endblocktrans %}</p>
{% endif %}
{% endblock %}

View file

@ -0,0 +1,21 @@
{% extends "site_base.html" %}
{% load i18n %}
{% load bootstrap %}
{% block head_title %}{% trans "Set your new password" %}{% endblock %}
{% block content %}
<div class="row">
<div class="col-md-5">
<form method="POST" action="{% url "account_password_reset_token" uidb36=uidb36 token=token %}">
<legend>{% trans "Set your new password" %}</legend>
<fieldset>
{% csrf_token %}
{{ form|bootstrap }}
<button type="submit" class="btn btn-primary">{% trans "Save" %}</button>
</fieldset>
</form>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,11 @@
{% extends "site_base.html" %}
{% load i18n %}
{% block head_title %}{% trans "Bad token" %}{% endblock %}
{% block content %}
<h1>{% trans "Bad token" %}</h1>
{% url "account_password_reset" as url %}
<p>{% blocktrans %}The password reset link was invalid, possibly because it has already been used. Please request a <a href="{{ url }}">new password reset</a>.{% endblocktrans %}</p>
{% endblock %}

View file

@ -0,0 +1,41 @@
{% extends "site_base.html" %}
{% load account_tags %}
{% load i18n %}
{% load bootstrap %}
{% block head_title %}Sign up{% endblock %}
{% block page_title %}Sign up{% endblock %}
{% block alert %}
{% endblock %}
{% block content %}
<div class="row">
<div class="col-md-4">
<form id="signup_form" method="post" action="{% url "account_signup" %}" autocapitalize="off" {% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
{% csrf_token %}
{{ form|bootstrap }}
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
{% endif %}
<button type="submit" class="btn btn-primary">{% trans "Sign up" %}</button>
</form>
<p class="login-signup">
<small>
{% trans "Already have an account?" %} <strong><a href="{% urlnext 'account_login' %}">{% trans "Log in" %}</a></strong>
</small>
</p>
</div>
<div class="col-md-4">
{% include "account/_signup_sidebar.html" %}
</div>
</div>
{% endblock %} <!-- block content -->
{% block scripts_extra %}
<script type="text/javascript">
$(document).ready(function() {
$('#id_username').focus();
});
</script>
{% endblock %}

View file

@ -0,0 +1,14 @@
{% extends "site_base.html" %}
{% load i18n %}
{% block head_title %}{% trans "Sign up" %}{% endblock %}
{% block content %}
<h1>{% trans "This site is in private beta" %}</h1>
<p>{% blocktrans %}If you have signup code you can enter it below.{% endblocktrans %}</p>
<form method="get" action="">
<div><input type="text" name="code" placeholder="{% trans 'Your signup code...' %}" /></div>
<div><input type="submit" class="btn btn-primary"></div>
</form>
{% endblock %}

View file

@ -4,8 +4,7 @@
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-md-1"></div> <div class="col-12 content text-page"{% if flatpage.url != '/' %} style="max-width: 45rem"{% endif %}>
<div class="col-12 col-md-10 content text-page">
{{ flatpage.content }} {{ flatpage.content }}
</div> </div>
</div> </div>

View file

@ -1,11 +1,48 @@
{% extends "site_base.html" %} {% extends "site_base.html" %}
{% load i18n static %}
{% load i18n %} {# NOTE: This template is not used due to flatpages. #}
{% block head_title %}{% trans "Welcome" %}{% endblock %} {% block meta_desc %}FOSSY (Free and Open Source Yearly) is a 4 day community-oriented conference focused on the creation and impact of free and open source software. Join us in Portland, OR - August 14th 2024 at Portland State University.{% endblock %}
{% block og_desc %}FOSSY (Free and Open Source Yearly) is a 4 day community-oriented conference focused on the creation and impact of free and open source software. Join us in Portland, OR - August 14th 2024 at Portland State University.{% endblock %}
{% block head_title %}FOSSY 2024: The first Free and Open Source Software Yearly conference{% endblock %}
{% block body_class %}home{% endblock %} {% block body_class %}home{% endblock %}
{% block body %} {% block content %}
{{ page.body }} <header class="pt2-ns pb4">
{% endblock %} <div class="flex-ns center">
<div class="mr4 dark-green sans-serif" style="flex-grow: 1">
<h1 class="f-subheadline f-headline-ns b lh-solid tracked-tight mv0">FOSSY 2024</h1>
<h2 class="f3 f2-ns b lh-solid mt0 mb3">August 14th 2024 — Portland, OR</h2>
<h3 class="f4 f4-ns b lh-title mv2 mv3-ns">The first Free and Open Source Software Yearly conference</h3>
</div>
<div class="lh-solid mt4 mt0-ns" style="font-size: 10rem; max-width: 250px;"><img class="db" src="{% static 'img/conservancy_logo_tall_mono.svg' %}" style="max-height: 180px" alt="Software Freedom Conservancy"></div>
</div>
<div class="mt4 mt0-ns"><a href="/attend/tickets/" class="mr2"><button type="button" class="btn btn-primary mb2">Get your ticket!</button></a>
<a href="/call-for-proposals/" class="mr2"><button type="button" class="btn btn-primary mb2">Propose a talk</button></a>
<a href="https://lists.sfconservancy.org/mailman/listinfo/fossy-announce"><button type="button" class="btn btn-secondary mb2">Subscribe for updates</button></a></div>
</header>
<section id="content">
<h1 class="f3 mt0 mb4">FOSS is back in Portland, OR at Portland State University!</h1>
<div class="flex-ns">
<div class="mw6">
<p class="f4 mt0">Software Freedom Conservancy is so proud to announce that we are hosting a community oriented conference this coming summer. FOSSY (Free and Open Source Yearly) is focused on the creation and impact of free and open source software, uplifting contributors of all experience.</p>
<p>We are mindful of having a safe environment for all. In this new time of conferences, we will be focused on COVID safety and making sure all attendees feel safe participating as much as they feel comfortable (we will have a detailed policy published in the coming weeks).</p>
<p>As this is the first year we are running a conference of this scale, we plan to have 15 tracks for talks over 4 days. With tracks for community building, development and legal and licensing issues, our conference will provide ample learning and networking opportunities for contributors of all levels of experience. We also plan to involve significant community participation in the content of our tracks.</p>
<p>As we look to the future of conferences, we are excited to focus on using free software to run a conference and will seek to help reduce the amount of proprietary software that is treated as default.</p>
</div>
<div>
<figure class="fr pa0 mt4 mt2-ns mr0 ml0 ml4-ns mb4">
<img src="{% static 'img/psu-smsu.jpg' %}" alt="Aerial photograph of the Portland State University">
<figcaption class="tc mt2">Portland State University (CC-BY 3.0)</figcaption>
</figure>
</div>
</div>
</section>
{% endblock content %}

View file

@ -1,11 +1,13 @@
{% load sitetree %} {% load sitetree %}
{% load static %} {% load static %}
<nav class="navbar navbar-expand-lg navbar-light bg-dawn-sea"> <nav class="navbar navbar-expand-lg navbar-dark" style="background: rgb(19,119,82); background: linear-gradient(124deg, rgba(19,119,82,1) 0%, rgba(19,106,119,1) 100%); margin-bottom: 1rem">
<div class="container"> <div class="container">
<a class="navbar-brand" href="/"> <h2 class="sans-serif f2 f1-ns b lh-solid tracked-tight mv0 mr3">
<img src="{% static 'img/eo2023.svg' %}" alt="Everything Open 2023 logo" height="56px"> <a class="washed-yellow hover-washed-yellow" href="/" style="text-decoration: none">
FOSSY 2024
</a> </a>
</h2>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>

View file

@ -1,9 +1,9 @@
{% load registrasion_tags %} {% load registrasion_tags %}
{% load lca2018_tags %} {% load lca2018_tags %}
<h2>Tax Invoice/Statement</h2> <h2>Invoice/Statement</h2>
<h3>Linux Australia</h3> <h3>Software Freedom Conservancy</h3>
<h4>ABN 56 987 117 479</h4> {# <h4>ABN 56 987 117 479</h4> #}
<p> <p>
Enquiries: please e-mail <a href="mailto:{{ settings.CONFERENCE_EMAIL }}">{{ settings.CONFERENCE_EMAIL }}</a> Enquiries: please e-mail <a href="mailto:{{ settings.CONFERENCE_EMAIL }}">{{ settings.CONFERENCE_EMAIL }}</a>
@ -23,7 +23,7 @@
{{ invoice.recipient|linebreaksbr}} {{ invoice.recipient|linebreaksbr}}
</div> </div>
<p>This invoice has been issued as a result of an application to attend {% conference_name %}. All amounts are in Australian Dollars (AUD).</p> <p>This invoice has been issued as a result of an application to attend {% conference_name %}.</p>
<table class="table table-striped my-4"> <table class="table table-striped my-4">
<thead> <thead>
@ -46,10 +46,12 @@
<tr><th colspan="4"></th></tr> <tr><th colspan="4"></th></tr>
{% if invoice.value|gst %}
<tr> <tr>
<th colspan="3">Includes 10% Australian Goods and Services Tax</th> <th colspan="3">Includes 10% Australian Goods and Services Tax</th>
<td class="text-right">${{ invoice.value|gst}}</td> <td class="text-right">${{ invoice.value|gst}}</td>
</tr> </tr>
{% endif %}
<tr> <tr>
<th colspan="3">Total</th> <th colspan="3">Total</th>
@ -80,11 +82,10 @@
<hr /> <hr />
<p>{% conference_name %} is a project of Linux Australia, Inc.</p> <p>{% conference_name %} is a project of Software Freedom Conservancy Inc.</p>
<p> <p>
GPO Box 4788 <br /> 137 MONTAGUE ST STE 380 <br />
Sydney NSW 2001 <br /> Brooklyn, NY 11201-3548 <br />
Australia <br /> {# ABN 56 987 117 479 <br /> #}
ABN 56 987 117 479 <br />
<p> <p>

View file

@ -96,8 +96,7 @@
<path d="M250.66,374.21V399H247V374.21Z" fill="#36a852"/> <path d="M250.66,374.21V399H247V374.21Z" fill="#36a852"/>
<path d="M265.49,393.87l2.88,1.92a8.4,8.4,0,0,1-7,3.75,8.26,8.26,0,0,1-8.38-8.45c0-5,3.61-8.45,8-8.45s6.53,3.49,7.23,5.38l.39,1-11.3,4.67a4.3,4.3,0,0,0,4.1,2.56A4.82,4.82,0,0,0,265.49,393.87Zm-8.87-3,7.56-3.13a3.28,3.28,0,0,0-3.14-1.79A4.63,4.63,0,0,0,256.62,390.83Z" fill="#ea4535"/> <path d="M265.49,393.87l2.88,1.92a8.4,8.4,0,0,1-7,3.75,8.26,8.26,0,0,1-8.38-8.45c0-5,3.61-8.45,8-8.45s6.53,3.49,7.23,5.38l.39,1-11.3,4.67a4.3,4.3,0,0,0,4.1,2.56A4.82,4.82,0,0,0,265.49,393.87Zm-8.87-3,7.56-3.13a3.28,3.28,0,0,0-3.14-1.79A4.63,4.63,0,0,0,256.62,390.83Z" fill="#ea4535"/>
<rect x="160.95" y="373.04" width="112" height="36" fill="none"/> <rect x="160.95" y="373.04" width="112" height="36" fill="none"/>
<text transform="translate(84.43 102.23)" font-size="15" fill="#231f20" font-family="SourceSansPro-Regular, Source Sans Pro">Janua<tspan x="38.69" y="0" letter-spacing="0.02em">r</tspan> <text transform="translate(84.43 102.23)" font-size="15" fill="#231f20" font-family="SourceSansPro-Regular, Source Sans Pro">August 14 2024
<tspan x="44.26" y="0">y 14 - 16 2023</tspan>
</text> </text>
<g id="Layer_2" data-name="Layer 2"> <g id="Layer_2" data-name="Layer 2">
<g id="emperor"> <g id="emperor">

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 116 KiB

View file

@ -1 +1 @@
{% load i18n %}Invoice {{ invoice.id }} from Linux Australia {% load i18n %}Invoice {{ invoice.id }} from Software Freedom Conservancy

View file

@ -1 +1 @@
{% load i18n %}{{ invoice.get_status_display }} -- Invoice {{ invoice.id }} from Linux Australia {% load i18n %}{{ invoice.get_status_display }} -- Invoice {{ invoice.id }} from Software Freedom Conservancy

View file

@ -3,7 +3,7 @@
{% load lca2018_tags %} {% load lca2018_tags %}
{% load static %} {% load static %}
{% block head_title %}Tax Invoice/Statement #{{ invoice.id }}{% endblock %} {% block head_title %}Invoice/Statement #{{ invoice.id }}{% endblock %}
{% block page_title %}{% conference_name %}{% endblock %} {% block page_title %}{% conference_name %}{% endblock %}
{% block proposals_body %} {% block proposals_body %}

View file

@ -70,9 +70,8 @@
<p>Pay your invoice with your Visa, Mastercard, or American Express credit or debit card. Card payments are processed by <a href="https://stripe.com">Stripe</a>.</p> <p>Pay your invoice with your Visa, Mastercard, or American Express credit or debit card. Card payments are processed by <a href="https://stripe.com">Stripe</a>.</p>
<p> <p>
No data on this form is retained by {% conference_name %}, rather it is No data or credit card details on this form are retained by {% conference_name %}, rather it is
sent to Stripe. In particular, credit card details are not sent sent directly to Stripe. You must allow JavaScript from <code>js.stripe.com</code> and <code>stripe.network</code> to complete payment.
to Linux Australia. You must allow JavaScript from <code>js.stripe.com</code> and <code>stripe.network</code> to complete payment.
</p> </p>
<p>You have <strong>${{ invoice.balance_due }}</strong> remaining to pay on this invoice.</p> <p>You have <strong>${{ invoice.balance_due }}</strong> remaining to pay on this invoice.</p>

View file

@ -12,27 +12,30 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="description" content=""> <meta name="description" content="{% block meta_desc %}{% endblock %}">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ head_title }}</title> <title>{{ head_title }}</title>
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<link rel="icon" href="{% static 'img/favicon.ico' %}" />
<!-- Cards --> <!-- Cards -->
<meta property="og:title" content="{{ head_title }}"> <meta property="og:title" content="{{ head_title }}">
<meta property="og:description" content="Everything Open 2023 - March 14-16 2023, Melbourne, Australia" /> <meta property="og:description" content="{% block og_desc %}{% endblock %}" />
<meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}{{ request.path }}"> <meta property="og:url" content="{{ request.scheme }}://{{ request.get_host }}{{ request.path }}">
<meta name="twitter:site" content="@_everythingopen"> <meta name="twitter:site" content="@conservancy">
<meta name="twitter:image:alt" content="{{ head_title }}" /> <meta name="twitter:image:alt" content="{{ head_title }}" />
<meta name="twitter:card" content="summary"> <meta name="twitter:card" content="summary">
<meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}/media/img/card/eo-badge.ba30d338.png" /> <meta name="twitter:image" content="{{ request.scheme }}://{{ request.get_host }}{% static 'img/conservancy_logo_tall_mono.png' %}" />
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}/media/img/card/eo-badge.ba30d338.png" /> <meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}{% static 'img/conservancy_logo_tall_mono.png' %}" />
<meta property="og:image:width" content="400" /> <meta property="og:image:width" content="400" />
<meta property="og:image:height" content="400" /> <meta property="og:image:height" content="400" />
{% block styles %} {% block styles %}
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous">
<link rel="stylesheet" href="https://unpkg.com/tachyons@4.12.0/css/tachyons.min.css">
<link href="{% sass_src 'scss/app.scss' %}" rel="stylesheet" type="text/css" /> <link href="{% sass_src 'scss/app.scss' %}" rel="stylesheet" type="text/css" />
{% block extra_style %}{% endblock %} {% block extra_style %}{% endblock %}
{% endblock %} {% endblock %}
@ -119,30 +122,27 @@
<footer class="footer mt-4 d-print-none"> <footer class="footer mt-4 d-print-none">
<div class="container py-4"> <div class="container py-4">
<!-- <div class="row">
<div class="col-md-12 pb-12 text-center" style="margin-top: 0px;margin-bottom: 0px;border-bottom-style: solid;border-bottom-width: 0px;padding-bottom: 20px;">Wifi: FOSSY <i>(see Registration for older wifi)</i><br/>PIN: outreachy1000</div>
</div> -->
<div class="row"> <div class="row">
<div class="col-md-4 pb-4"> <div class="col-md-4 pb-4">
<strong>Everything Open 2023</strong> <br> <strong>FOSSY 2024</strong> <br>
March 14-16 2023 <br> August 14th 2024 <br>
Naarm (Melbourne), Australia <br> Portland, OR<br>
Timezone: AEDT - UTC+11 <br> Timezone: PDT - UTC-7 <br>
<a href="mailto:contact@everythingopen.au" alt="Email"><i class="bi-envelope-fill"></i></a>&nbsp;&nbsp;<a
href="https://twitter.com/_everythingopen" alt="Twitter"><i class="bi-twitter"></i></a>&nbsp;&nbsp;<a
href="https://www.linkedin.com/showcase/everythingopen/" alt="LinkedIn"><i class="bi-linkedin"></i></a>
<a href="mailto:{{ settings.CONFERENCE_EMAIL }}" alt="Email"><i class="far fa-envelope"></i></a>&nbsp;&nbsp;<a <a href="mailto:{{ settings.CONFERENCE_EMAIL }}" alt="Email"><i class="far fa-envelope"></i></a>&nbsp;&nbsp;<a
href="https://twitter.com/_everythingopen" alt="Twitter"><i class="fab fa-twitter"></i></a>&nbsp;&nbsp;<a href="https://twitter.com/conservancy" alt="Twitter"><i class="fab fa-twitter"></i></a>&nbsp;&nbsp;<a
href="https://www.facebook.com/EverythingOpenConference" alt="Facebook"><i class="fab fa-facebook"></i></a>&nbsp;&nbsp;<a href="https://social.sfconservancy.org/conservancy" alt="Mastodon"><i class="fab fa-mastodon"></i></a>
href="https://www.linkedin.com/showcase/everythingopen/" alt="LinkedIn"><i class="fab fa-linkedin"></i></a>
</div> </div>
<div class="col-md-4 pb-4 text-center"> <div class="col-md-4 pb-4 text-center">
<a href="https://linux.org.au"><img src="{% static 'img/la_logo.svg' %}" alt="Linux Australia logo" class="footer-image"></a> <a href="https://sfconservancy.org"><img src="{% static 'img/conservancy_logo.svg' %}" alt="Software Freedom Conservancy logo" class="footer-image"></a>
</div> </div>
<div class="col-md-4 pb-4 text-right"> <div class="col-md-4 pb-4 text-right">
<small> <small>
<a href="#">Back to top</a><br> <a href="#">Back to top</a><br>
&copy; 2022 Everything Open and <a href="http://linux.org.au/">Linux Australia</a><br> &copy; 2024 <a href="https://sfconservancy.org/">Software Freedom Conservancy</a><br>
Linux is a registered trademark of Linus Torvalds <br> <a href="/credits/">Credits</a>
<a href="/colophon/">Colophon</a>
</small> </small>
</div> </div>
</div> </div>

View file

@ -72,7 +72,7 @@
<h3>Account Management</h3> <h3>Account Management</h3>
<p>If you would like to change your registered email address or password, you can use our self-service account management portal</p> <p>If you would like to change your registered email address or password, you can use our self-service account management portal</p>
<div> <div>
<a class="btn btn-primary" role="button" href="https://login.linux.conf.au/manage/">Account Management</a> <a class="btn btn-primary" role="button" href="{% url "account_settings" %}">Account Management</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -23,7 +23,7 @@
<fieldset> <fieldset>
{% include "_form_snippet.html" with form=add_speaker_form %} {% include "_form_snippet.html" with form=add_speaker_form %}
<input type="submit" value="Add speaker" class="btn btn-primary"/> <input type="submit" value="Add speaker" class="btn btn-primary"/>
<a href="{% url "proposal_edit" proposal.pk %}" class="btn btn-light">{% trans 'Cancel' %}</a> <a href="{% url "proposal_edit" proposal.pk %}" class="btn btn-light">{% trans 'Continue editing proposal' %}</a>
</fieldset> </fieldset>
</form> </form>
{% endblock %} {% endblock %}

View file

@ -22,7 +22,7 @@
<td>{{ proposal.number }}</td> <td>{{ proposal.number }}</td>
<td> <td>
<a href="{% url "review_detail" proposal.pk %}"> <a href="{% url "review_detail" proposal.pk %}">
<small><strong>{{ proposal.speaker }}</strong></small> <small><strong>{{ proposal.speaker }} &lt;{{ proposal.speaker.email }}&gt;</strong></small>
<br /> <br />
{{ proposal.title }} {{ proposal.title }}
</a> </a>

View file

@ -54,6 +54,26 @@
{% autoescape off %} {% autoescape off %}
<div class="abstract pb-4"><p>{{ presentation.abstract_html|safe|clean_text|urlize }}</p></div> <div class="abstract pb-4"><p>{{ presentation.abstract_html|safe|clean_text|urlize }}</p></div>
{% endautoescape %} {% endautoescape %}
{% if presentation.videos_split %}
<h2 class="mt-4">Videos</h4>
{% for v in presentation.youtube_videos %}
<iframe width="560" height="315" src="{{ v }}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
{% endfor %}
{% if v.other_videos %}
<video controls style="max-width: 640px">
{% for video in presentation.other_videos %}
<source src="{{ video }}">
{% endfor %}
</video>
{% endif %}
<p style="margin-top: 1rem">Available sources:</p>
<ul>
{% for video in presentation.videos_split %}
<li>{{ video|urlize }}</li>
{% endfor %}
</ul>
{% endif %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -1,6 +1,9 @@
from account.forms import LoginUsernameForm
from account.views import LoginView
import debug_toolbar import debug_toolbar
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.core.exceptions import ValidationError
from django.views.generic import RedirectView from django.views.generic import RedirectView
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django.urls import include, path from django.urls import include, path
@ -11,7 +14,26 @@ from django.contrib import admin
import symposion.views import symposion.views
class CustomLoginForm(LoginUsernameForm):
def clean(self):
# To use account.forms.LoginEmailForm, we need to enforce unique
# emails. Since we probably already have duplicate emails in the system,
# we'll defer that to next year.
try:
super().clean()
except ValidationError as e:
if '@' in self.cleaned_data['username']:
raise ValidationError(
f'{e.message} Please login with your username, rather than your email.'
)
else:
raise
urlpatterns = [ urlpatterns = [
# Trialling homepage via flatpages.
# path('', TemplateView.as_view(template_name="homepage.html")),
path('saml2/', include('djangosaml2.urls')), path('saml2/', include('djangosaml2.urls')),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
@ -24,6 +46,9 @@ urlpatterns = [
path("teams/", include("symposion.teams.urls")), path("teams/", include("symposion.teams.urls")),
path('raffle/', include("pinaxcon.raffle.urls")), path('raffle/', include("pinaxcon.raffle.urls")),
path("account/login/", LoginView.as_view(form_class=CustomLoginForm, template_name='account/login.html'), name="account_login"),
path("account/", include("account.urls")),
# Required by registrasion # Required by registrasion
path('tickets/payments/', include('registripe.urls')), path('tickets/payments/', include('registripe.urls')),
path('tickets/', include('registrasion.urls')), path('tickets/', include('registrasion.urls')),

View file

@ -4,7 +4,7 @@ pinax-eventlog[django-lts]==5.1.0
django-formset-js==0.5.0 django-formset-js==0.5.0
whitenoise==5.2.0 whitenoise==5.2.0
dj-database-url==0.5.0 dj-database-url==0.5.0
pylibmc==1.6.1 pylibmc==1.6.3
django-debug-toolbar==3.1.1 django-debug-toolbar==3.1.1
django-bootstrap-form==3.4 django-bootstrap-form==3.4
django-settings-export~=1.2.1 django-settings-export~=1.2.1
@ -14,7 +14,7 @@ django-gapc-storage==0.5.2
django-waffle==2.0.0 django-waffle==2.0.0
# database # database
mysqlclient==2.0.1 # psycopg2<2.9 # For Django 2.2 to avoid "AssertionError: database connection isn't set to UTC"
# For testing # For testing
django-nose==1.4.7 django-nose==1.4.7
@ -28,7 +28,7 @@ django-reversion==3.0.8
django-sitetree==1.16.0 django-sitetree==1.16.0
django-taggit==1.3.0 django-taggit==1.3.0
django-timezone-field==4.1.2 django-timezone-field==4.1.2
easy-thumbnails==2.7.0 easy-thumbnails==2.8.5
bleach==3.2.1 bleach==3.2.1
pytz>=2020.1 pytz>=2020.1
django-ical==1.7.1 django-ical==1.7.1
@ -50,3 +50,4 @@ django-sass-processor==0.8.2
django-compressor==2.4 django-compressor==2.4
django-crispy-forms==1.9.2 django-crispy-forms==1.9.2
django-user-accounts==3.2.0

View file

@ -42,6 +42,7 @@ $red: #dc3545 !default;
$orange: #fd7e14 !default; $orange: #fd7e14 !default;
$yellow: #ffc107 !default; $yellow: #ffc107 !default;
$green: #28a745 !default; $green: #28a745 !default;
$green2: #137752 !default;
$teal: #20c997 !default; $teal: #20c997 !default;
$cyan: #17a2b8 !default; $cyan: #17a2b8 !default;
@ -66,7 +67,7 @@ $colors: map-merge(
$colors $colors
); );
$primary: $blue !default; $primary: $green2 !default;
$secondary: $gray-600 !default; $secondary: $gray-600 !default;
$success: $green !default; $success: $green !default;
$info: $cyan !default; $info: $cyan !default;

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

BIN
static/src/img/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
static/src/img/psu-smsu.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View file

@ -8,6 +8,7 @@ $dawn-sea: rgb(0, 177, 197);
$blaze : rgb(250, 166, 26); $blaze : rgb(250, 166, 26);
$dusk-sea : rgb(0, 113, 144); $dusk-sea : rgb(0, 113, 144);
$noon-sea : rgb(0, 141, 162); $noon-sea : rgb(0, 141, 162);
$washed-yellow: #fffceb;
body { body {
@ -17,7 +18,6 @@ body {
h1, .h1, h1, .h1,
h2, .h2, h2, .h2,
h3, .h3 { h3, .h3 {
font-family: 'Montserrat', sans-serif;
font-weight: 300; font-weight: 300;
} }
@ -53,10 +53,11 @@ h3, .h3 {
.navbar-nav .nav-link { .navbar-nav .nav-link {
font-size: 1.2rem; font-size: 1.2rem;
color: white !important;
} }
.footer { .footer {
border-top: 1px solid $dawn-sea; border-top: 1px solid $green2;
} }
.footer-logo { .footer-logo {
@ -101,6 +102,10 @@ h3, .h3 {
} }
} }
.calendar th.time {
white-space: nowrap;
}
/* END LCA BRAND */ /* END LCA BRAND */
.messagelist { .messagelist {

View file

@ -0,0 +1,38 @@
# Generated by Django 2.2.28 on 2023-04-24 21:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('registrasion', '0008_auto_20170930_1843'),
]
operations = [
migrations.AlterField(
model_name='category',
name='required',
field=models.BooleanField(blank=True, help_text='If enabled, a user must select an item from this category.'),
),
migrations.AlterField(
model_name='speakerdiscount',
name='is_copresenter',
field=models.BooleanField(blank=True, help_text='This condition is met if the user is a copresenter of a presentation.'),
),
migrations.AlterField(
model_name='speakerdiscount',
name='is_presenter',
field=models.BooleanField(blank=True, help_text='This condition is met if the user is the primary presenter of a presentation.'),
),
migrations.AlterField(
model_name='speakerflag',
name='is_copresenter',
field=models.BooleanField(blank=True, help_text='This condition is met if the user is a copresenter of a presentation.'),
),
migrations.AlterField(
model_name='speakerflag',
name='is_presenter',
field=models.BooleanField(blank=True, help_text='This condition is met if the user is the primary presenter of a presentation.'),
),
]

View file

@ -1,6 +1,8 @@
import csv import csv
import datetime
from django.contrib.auth.decorators import user_passes_test from django.contrib.auth.decorators import login_required, user_passes_test
from django.db import connection
from django.shortcuts import render from django.shortcuts import render
from django.http import HttpResponse from django.http import HttpResponse
from django.urls import reverse from django.urls import reverse
@ -365,3 +367,33 @@ def get_all_reports():
''' Returns all the views that have been registered with @report ''' ''' Returns all the views that have been registered with @report '''
return list(_all_report_views) return list(_all_report_views)
@login_required
@user_passes_test(lambda u: u.is_staff)
def attendees_report(request):
query = """
select prof.name, email, prod.name as ticket, company, free_text_1, free_text_2, country, of_legal_age, dietary_restrictions, accessibility_requirements, gender
from registrasion_invoice i
inner join registrasion_cart c on i.cart_id = c.id
inner join registrasion_productitem pi on c.id = pi.cart_id
inner join registrasion_product prod on pi.product_id = prod.id
inner join auth_user u on i.user_id = u.id
inner join registrasion_attendee a on a.user_id = u.id
inner join registrasion_attendeeprofilebase b on b.attendee_id = a.id
left outer join pinaxcon_registrasion_attendeeprofile prof on b.id = prof.attendeeprofilebase_ptr_id
where prod.category_id = 1
and i.status = 2
"""
response = HttpResponse(content_type='text/csv')
filename = 'attendees_report-{}.csv'.format(
datetime.datetime.now().strftime('%Y-%m-%d'),
)
response['Content-Disposition'] = f'attachment; filename={filename}'
writer = csv.writer(response)
with connection.cursor() as cursor:
cursor.execute(query)
writer.writerow([i[0] for i in cursor.description])
for row in cursor.fetchall():
writer.writerow(row)
return response

View file

@ -565,7 +565,7 @@ def attendee(request, form, user_id=None):
try: try:
attendee = people.Attendee.objects.get(user__id=user_id) attendee = people.Attendee.objects.get(user__id=user_id)
except people.DoesNotExist: except people.Attendee.DoesNotExist:
return reports return reports
profile_data = [] profile_data = []

View file

@ -2,6 +2,7 @@ from .reporting import views as rv
from django.conf.urls import include from django.conf.urls import include
from django.conf.urls import url from django.conf.urls import url
from django.urls import path
from .views import ( from .views import (
amend_registration, amend_registration,
@ -24,6 +25,7 @@ from .views import (
review, review,
voucher_code, voucher_code,
) )
from .reporting.reports import attendees_report
public = [ public = [
@ -85,6 +87,7 @@ reports = [
rv.speaker_registrations, rv.speaker_registrations,
name="speaker_registrations", name="speaker_registrations",
), ),
path("attendees/", attendees_report, name="attendees_report"),
] ]

View file

@ -347,8 +347,7 @@ def _guided_registration_profile_and_voucher(request):
profile_section = GuidedRegistrationSection( profile_section = GuidedRegistrationSection(
title="Profile and Personal Information", title="Profile and Personal Information",
form=profile_form, form=profile_form,
description=("<div class=\"text-info\"><em>You can come back and edit these details any time before " description=("<div class=\"text-info\"><em>You can come back and edit these details</em></div>"),
"March 10 2023.</em></div>"),
) )
return [voucher_section, profile_section] return [voucher_section, profile_section]

View file

@ -1,3 +1,3 @@
django-nested-admin==3.3.2 django-nested-admin==3.3.2
#symposion==1.0b2.dev3 #symposion==1.0b2.dev3
lxml==4.6.1 #lxml==4.6.1

3
vendor/symposion/pyproject.toml vendored Normal file
View file

@ -0,0 +1,3 @@
[build-system]
requires = ["setuptools>=42"]
build-backend = "setuptools.build_meta"

3
vendor/symposion/setup.cfg vendored Normal file
View file

@ -0,0 +1,3 @@
[metadata]
name = symposion
version = attr: symposion.__version__

3
vendor/symposion/setup.py vendored Normal file
View file

@ -0,0 +1,3 @@
import setuptools
setuptools.setup()

Some files were not shown because too many files have changed in this diff Show more