forked from ScoDoc/DocScoDoc
53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
# -*- coding: UTF-8 -*
|
|
|
|
"""
|
|
Create some Postgresql sequences and functions used by ScoDoc
|
|
using raw SQL
|
|
"""
|
|
|
|
from app import db
|
|
|
|
|
|
def create_database_functions():
|
|
"""Create specific SQL functions and sequences"""
|
|
# Important: toujours utiliser IF NOT EXISTS
|
|
# car cette fonction peut être appelée plusieurs fois sur la même db
|
|
db.session.execute(
|
|
"""
|
|
CREATE SEQUENCE IF NOT EXISTS notes_idgen_fcod;
|
|
CREATE OR REPLACE FUNCTION notes_newid_fcod() RETURNS TEXT
|
|
AS $$ SELECT 'FCOD' || to_char(nextval('notes_idgen_fcod'), 'FM999999999'); $$
|
|
LANGUAGE SQL;
|
|
CREATE OR REPLACE FUNCTION notes_newid_ucod() RETURNS TEXT
|
|
AS $$ SELECT 'UCOD' || to_char(nextval('notes_idgen_fcod'), 'FM999999999'); $$
|
|
LANGUAGE SQL;
|
|
|
|
CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
|
|
DECLARE
|
|
statements CURSOR FOR
|
|
SELECT tablename FROM pg_tables
|
|
WHERE tableowner = username AND schemaname = 'public'
|
|
AND tablename <> 'notes_semestres'
|
|
AND tablename <> 'notes_form_modalites';
|
|
BEGIN
|
|
FOR stmt IN statements LOOP
|
|
EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ' CASCADE;';
|
|
END LOOP;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Fonction pour anonymisation:
|
|
-- inspirée par https://www.simononsoftware.com/random-string-in-postgresql/
|
|
CREATE OR REPLACE FUNCTION random_text_md5( integer ) returns text
|
|
LANGUAGE SQL
|
|
AS $$
|
|
select upper( substring( (SELECT string_agg(md5(random()::TEXT), '')
|
|
FROM generate_series(
|
|
1,
|
|
CEIL($1 / 32.)::integer)
|
|
), 1, $1) );
|
|
$$;
|
|
"""
|
|
)
|
|
db.session.commit()
|