Skip to content
Snippets Groups Projects

Registrace

3 files
+ 52
9
Compare changes
  • Side-by-side
  • Inline

Files

  • 2a429238
    Registrace: Změny v DB · 2a429238
    Martin Mareš authored
    - round: přibyly sloupec enroll_mode a enroll_advert
    - participant: přibyl sloupec registered_on
    - part_state: přidán stav "active", zrušeny "invited" a "present"
+ 49
6
-- CREATE ROLE mo_osmo LOGIN PASSWORD 'pass';
-- CREATE DATABASE mo_osmo WITH OWNER=mo_osmo;
-- GRANT mo_osmo TO some_admin;
-- CREATE EXTENSION unaccent;
SET ROLE mo_osmo;
-- Funkce pro odakcentování textu pomocí extension unaccent.
-- Je immutable, takže se dá používat i v indexech.
-- Zdroj: http://stackoverflow.com/questions/11005036/does-postgresql-support-accent-insensitive-collations
CREATE OR REPLACE FUNCTION f_unaccent(text)
RETURNS text AS
$func$
SELECT unaccent('unaccent', $1)
$func$ LANGUAGE sql IMMUTABLE SET search_path = public, pg_temp;
-- Uživatelský účet
CREATE TABLE users (
user_id serial PRIMARY KEY,
@@ -15,7 +25,7 @@ CREATE TABLE users (
is_test boolean NOT NULL DEFAULT false, -- testovací účastník, není vidět ve výsledkovkách
created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_login_at timestamp with time zone DEFAULT NULL,
reset_at timestamp with time zone DEFAULT NULL, -- poslední požadavek na reset hesla
reset_at timestamp with time zone DEFAULT NULL, -- poslední reset/aktivace nebo žádost o ně
password_hash varchar(255) DEFAULT NULL, -- heš hesla (je-li nastaveno)
note text NOT NULL DEFAULT '' -- poznámka viditelná pro orgy
);
@@ -45,6 +55,8 @@ CREATE TABLE places (
);
CREATE INDEX places_parent_index ON places (parent);
-- XXX: Potřebujeme operator class text_pattern_ops, aby index fungoval na prefixové LIKE
CREATE INDEX places_noacc_index ON places ((lower(f_unaccent(name))) text_pattern_ops);
-- Rekurzivní dotaz na nadřazené regiony:
-- WITH RECURSIVE parent_regions(parent, place_id) AS (
@@ -89,6 +101,12 @@ CREATE TYPE score_mode AS ENUM (
'mo' -- jednoznačné pořadí podle pravidel MO
);
CREATE TYPE enroll_mode AS ENUM ( -- režim přihlašování účastníků
'manual', -- přihlašuje organizátor
'register', -- účastník se registruje
'confirm' -- účastník se registruje, ale org ho musí potvrdit
);
CREATE TABLE rounds (
round_id serial PRIMARY KEY,
master_round_id int DEFAULT NULL REFERENCES rounds(round_id),
@@ -109,6 +127,8 @@ CREATE TABLE rounds (
score_successful_limit int DEFAULT NULL, -- bodový limit na označení za úspěšného řešitele
points_step numeric(2,1) NOT NULL DEFAULT 1, -- s jakou přesností jsou přidělovány body (celé aneb 1, 0.5, 0.1)
has_messages boolean NOT NULL DEFAULT false, -- má zprávičky
enroll_mode enroll_mode NOT NULL DEFAULT 'manual', -- režim přihlašování (pro vyšší kola vždy 'manual')
enroll_advert varchar(255) NOT NULL DEFAULT '', -- popis v přihlašovacím formuláři
UNIQUE (year, category, seq, part)
);
@@ -133,17 +153,19 @@ CREATE TABLE participants (
school int NOT NULL REFERENCES places(place_id),
birth_year int NOT NULL,
grade varchar(20) NOT NULL, -- třída ve tvaru "X/Y"
registered_on timestamp with time zone DEFAULT NULL, -- kdy se účastník přihlásil (NULL, pokud ho přihlásil organizátor)
PRIMARY KEY (user_id, year)
);
-- Účast v soutěžním kole
CREATE TYPE part_state AS ENUM (
'registered', -- sám se přihlásil
'invited', -- pozván
'refused', -- odmítl účast
'present', -- soutěžil
'absent', -- bez omluvy nedorazil
'registered', -- sám se přihlásil, čeká na potvrzení organizátorem
-- 'invited', -- pozván (už nepoužíváme)
'active', -- soutěží (přihlášku zadal/potvrdil organizátor)
'refused', -- organizátor odmítl přihlášku
-- 'present', -- soutěžil (už nepoužíváme)
'absent', -- nedorazil
'disqualified' -- diskvalifikovaný
);
@@ -312,3 +334,24 @@ CREATE TABLE messages (
markdown text NOT NULL,
html text NOT NULL
);
-- Požadavky na registraci a změny vlastností účtu
CREATE TYPE reg_req_type AS ENUM (
'register',
'change_email',
'reset_password'
);
CREATE TABLE reg_requests (
reg_id serial PRIMARY KEY,
type reg_req_type NOT NULL,
created_at timestamp with time zone NOT NULL,
expires_at timestamp with time zone NOT NULL,
used_at timestamp with time zone DEFAULT NULL,
email varchar(255) DEFAULT NULL, -- adresa, kterou potvrzujeme
captcha_token varchar(255) DEFAULT NULL, -- token pro fázi 1 registrace
email_token varchar(255) UNIQUE NOT NULL, -- token pro fázi 2 registrace
user_id int DEFAULT NULL REFERENCES users(user_id) ON DELETE CASCADE,
client varchar(255) NOT NULL -- kdo si registraci vyžádal
);
Loading