Skip to content

Repository files navigation

Шаблон проекта для экзаменационной работы

Версия шаблона

1.0

Разворачивание проекта из шаблона

Установите зависимости:

В колледже:

pip install --no-index --find-links=D:\dependencies -r D:\dependencies\requirements.txt

Разверните проект из шаблона:

В колледже:

python -m cookiecutter 'http://gogs.wsr.ru:3000/grab/cookiecutter-django-pkgh.git' --config-file D:\dependencies\config.yaml --no-input

Вне колледжа:

python -m cookiecutter gh:Tmpgmv/cookiecutter-django-pkgh --config-file D:\dependencies\config.yaml --no-input

Комментарий

При работе Cookiecutter синтаксис Jinja кофликтует с синтаксисом Django Template Language. Поэтому все html-файлы исключены из поля зрения Cookiecutter.

Однако, переменные переданы в контекст через context processors, что позволило отобразить данные в шаблонах.

cookiecutter.json

student_full_name_rus - ФИО студента. Необходимо для документации проекта (README.md).

surname_initials_lat - ФИО студента латиницей. Нужен только для формирования student_slug.

db_username - Пользователь БД. См. secret.py.

db_password - Пароль пользователя БД. См. secret.py.

project_name_rus - Наименование проекта на русском языке. Может применяться в шаблонах (см. context_processors.py). Если надо что-то в кавычках: project_name_rus: "ООО \"Аэропорт Таймыр\"" .

project_name_lat - Наименование проекта на латинице. Применяется только в cookiecutter.json для формирования project_slug.

project_slug - Слаг проекта. Применяется в структуре каталогов проката. А также как часть имени БД. См. secret.py.

project_description - Описание проекта. Может применяться в шаблонах (см. context_processors.py). Также попадает в документацию проекта (README.md).

main_background_color - Цвет. Скорее всего, будет обозначен в приложении к заданию.

aux_background_color - Цвет. Скорее всего, будет обозначен в приложении к заданию.

attention_color - Цвет. Скорее всего, будет обозначен в приложении к заданию.

custom_user - Нужно ли расширять модель пользователя.

login_required - Нужно ли выполнять вход (не каждый год задание требует авторизации).

student_slug - Слаг студента. Применяется как часть имени БД. См. secret.py.

tests_required - Требуются ли тесты. Не каждый год они нужны. Если тесты сгенерирвать, они станут частью проекта. И за их работоспособность придется отвечать.

Сброс миграций

1. Остановите Django сервер (Ctrl+C)

2. Удалите все миграции

Под Windows: запустить delete_migrations.bat.

Под Linux:

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete

3. Удалите БД:

Если используется PostgreSQL

dropdb your_db_name
createdb your_db_name

Если используется SQLite

rm db.sqlite3

4. Создайте новые миграции

python manage.py makemigrations

5. Примените их

python manage.py migrate

Сброс последовательностей

DO $$
DECLARE
    r RECORD;
    max_id BIGINT;
    seq_name TEXT;
BEGIN
    -- Loop through all columns that have an owned sequence (serial / identity / nextval)
    FOR r IN 
        SELECT 
            tc.table_schema,
            tc.table_name,
            tc.column_name,
            pg_get_serial_sequence(quote_ident(tc.table_schema) || '.' || quote_ident(tc.table_name), tc.column_name) AS sequence_name
        FROM information_schema.columns tc
        WHERE tc.table_schema NOT IN ('pg_catalog', 'information_schema') -- Skip system schemas
          AND pg_get_serial_sequence(quote_ident(tc.table_schema) || '.' || quote_ident(tc.table_name), tc.column_name) IS NOT NULL
    LOOP
        -- Get the current MAX value from the table safely
        EXECUTE format('SELECT COALESCE(MAX(%I), 0) FROM %I.%I', 
                       r.column_name, r.table_schema, r.table_name) INTO max_id;

        -- If the table has rows, update the sequence to point to the MAX(id)
        -- The next nextval() call will automatically return MAX(id) + 1
        IF max_id > 0 THEN
            EXECUTE format('SELECT setval(%L, %s, true)', r.sequence_name, max_id);
        ELSE
            -- If the table is completely empty, reset the sequence to start at 1
            EXECUTE format('SELECT setval(%L, 1, false)', r.sequence_name);
        END IF;
    END LOOP;
END $$;

Подготовка документации

python manage.py modelinfo -v 3 --markdown >> temp_modelinfo.md
cat temp_modelinfo.md >> README.md
rm temp_modelinfo.md

Скрипт создания базы данных

pg_dump --schema-only --dbname={{ cookiecutter.student_slug }}_{{ cookiecutter.project_slug }} --username={{ cookiecutter.db_username }} --password --host=localhost > schema.sql

Cкрипт загрузки тестовых данных

pg_dump --data-only --dbname={{ cookiecutter.student_slug }}_{{ cookiecutter.project_slug }} --username={{ cookiecutter.db_username }} --password --host=localhost > data.sql

Посмотреть все триггеры

SELECT trigger_name, event_manipulation, action_statement
FROM information_schema.triggers
WHERE event_object_table = 'maintenance_procedures_maintenanceprocedure';

Если не нужно условие - удалите крайнюю строку.

Показать функции, привязанные к триггерам

SELECT 
    tgname AS trigger_name,
    tgrelid::regclass AS table_name,
    proname AS function_name,
    tgtype::text AS trigger_type
FROM 
    pg_trigger t
JOIN 
    pg_proc p ON t.tgfoid = p.oid
WHERE 
    NOT tgisinternal;

Удалить триггер

DROP TRIGGER IF EXISTS trigger_name ON table_name;

DROP TRIGGER IF EXISTS update_plane_status_on_maintenance
ON maintenance_procedures_maintenanceprocedure;

Выбрать все функции для таблицы

SELECT 
    t.tgname AS trigger_name,
    p.proname AS function_name,
    pg_get_functiondef(p.oid) AS function_definition
FROM 
    pg_trigger t
JOIN 
    pg_proc p ON t.tgfoid = p.oid
WHERE 
    tgrelid = 'maintenance_procedures_maintenanceprocedure'::regclass
    AND NOT tgisinternal;

Выбрать функцию

SELECT 
    proname AS function_name,
    prosrc AS source_code
FROM 
    pg_proc
WHERE 
    proname = 'set_plane_maintenance_status';

Удалить функцию

DROP FUNCTION [IF EXISTS] function_name [ (arg_type [, ...]) ] [CASCADE | RESTRICT];

DROP FUNCTION IF EXISTS set_plane_maintenance_status;

Удалить все функции и все триггеры для таблицы

DO $$
DECLARE
    trig_record RECORD;
    func_name text;
BEGIN
    -- 1. Drop all triggers on the table
    FOR trig_record IN
        SELECT tgname
        FROM pg_trigger
        WHERE tgrelid = 'maintenance_procedures_maintenanceprocedure'::regclass
          AND NOT tgisinternal
    LOOP
        EXECUTE format('DROP TRIGGER IF EXISTS %I ON maintenance_procedures_maintenanceprocedure;', trig_record.tgname);
    END LOOP;

    -- 2. Drop all functions that were used by those triggers
    --    (We drop them with CASCADE to also remove any leftover triggers)
    FOR func_name IN
        SELECT DISTINCT p.proname
        FROM pg_trigger t
        JOIN pg_proc p ON t.tgfoid = p.oid
        WHERE t.tgrelid = 'maintenance_procedures_maintenanceprocedure'::regclass
          AND NOT t.tgisinternal
    LOOP
        -- Drop the function (argument list may be needed if overloaded;
        -- if overloaded, you need to specify argument types. 
        -- This simplified version assumes no overloads or uses a trick with regproc.
        EXECUTE format('DROP FUNCTION IF EXISTS %I CASCADE;', func_name);
    END LOOP;
END;
$$;

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages