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, что позволило отобразить данные в шаблонах.
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 - Требуются ли тесты. Не каждый год они нужны. Если тесты сгенерирвать, они станут частью проекта. И за их работоспособность придется отвечать.
Под Windows: запустить delete_migrations.bat.
Под Linux:
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -deleteЕсли используется PostgreSQL
dropdb your_db_name
createdb your_db_nameЕсли используется SQLite
rm db.sqlite3python manage.py makemigrationspython manage.py migrateDO $$
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.mdcat temp_modelinfo.md >> README.mdrm temp_modelinfo.mdpg_dump --schema-only --dbname={{ cookiecutter.student_slug }}_{{ cookiecutter.project_slug }} --username={{ cookiecutter.db_username }} --password --host=localhost > schema.sqlpg_dump --data-only --dbname={{ cookiecutter.student_slug }}_{{ cookiecutter.project_slug }} --username={{ cookiecutter.db_username }} --password --host=localhost > data.sqlSELECT 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;
$$;