refactor: Purge old migrations and update ci to build on a clean schema (#5431)

* refactor: Remove all existing migrations

* refactor: Create clean set of migrations

* chore: Skip check_statetype_slugs when DB is not yet populated

* fix: Do not cache active_groups_menu on module import

* fix: Do not patch timezone awareness out of oidc-provider

* refactor: Migrate to create postgres schema, only use pgloader for data

* ci: Use migration scripts from feat/pg-migrations branch

* Revert "ci: Use migration scripts from feat/pg-migrations branch"

This reverts commit c82f64c614241ccede4865a50d494725c8a47c15.

* ci: Run check before migrate

* fix: Remove redundant migration caused by merge error

* chore: Add casts/ALTER TABLEs to eliminate pgloader errors/warnings

* chore: Change schema name to match docker image assumptions

* chore: Clear out schema so we get a clean start in case of a retry
This commit is contained in:
Jennifer Richards 2023-03-28 06:06:07 -03:00 committed by GitHub
parent b0c76416cd
commit 6b826fd985
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
400 changed files with 1457 additions and 18065 deletions

View file

@ -23,52 +23,127 @@ echo "Waiting for DB containers to come online..."
/usr/local/bin/wait-for db:3306 -- echo "MariaDB ready"
/usr/local/bin/wait-for pgdb:5432 -- echo "PostgreSQL ready"
# Alter search path
psql -U django -h pgdb -d ietf -v ON_ERROR_STOP=1 -c '\x' -c 'ALTER USER django set search_path=ietf_utf8,django,public;'
# Set up schema and alter search path
psql -U django -h pgdb -d ietf -v ON_ERROR_STOP=1 -c '\x' \
-c 'DROP SCHEMA IF EXISTS ietf_utf8 CASCADE;' \
-c 'CREATE SCHEMA ietf_utf8;' \
-c 'ALTER DATABASE ietf SET search_path=ietf_utf8,public;' \
-c 'ALTER USER django set search_path=ietf_utf8,django,public;' \
-c 'CREATE EXTENSION citext WITH SCHEMA ietf_utf8;'
# Copy settings files
cp ./docker/configs/settings_local.py ./ietf/settings_local.py
cp ./docker/configs/settings_mysqldb.py ./ietf/settings_mysqldb.py
cp ./docker/configs/settings_postgresqldb.py ./ietf/settings_postgresqldb.py
# Switch to MySQL config
cat ./ietf/settings_local.py | sed 's/from ietf.settings_postgresqldb import DATABASES/from ietf.settings_mysqldb import DATABASES/' > /tmp/settings_local.py && mv /tmp/settings_local.py ./ietf/settings_local.py
# Initial checks
echo "Running initial checks..."
/usr/local/bin/python ./ietf/manage.py check --settings=settings_local
# The mysql database is always freshly build container from the
# image build of last-night's dump when this script is run
# The first run of migrations will run anything merged from main that
# that hasn't been released, and the few pre-engine-shift migrations
# that the feat/postgres branch adds. It is guaranteed to fail at
# utils.migrations.0004_pause_to_change_database_engines (where it
# fails on purpose, hence the `|| true` so we may proceed
/usr/local/bin/python ./ietf/manage.py migrate --settings=settings_local || true
# Switch to PostgreSQL config
cat ./ietf/settings_local.py | sed 's/from ietf.settings_mysqldb import DATABASES/from ietf.settings_postgresqldb import DATABASES/' > /tmp/settings_local.py && mv /tmp/settings_local.py ./ietf/settings_local.py
#cat ./ietf/settings_local.py | sed 's/from ietf.settings_mysqldb import DATABASES/from ietf.settings_postgresqldb import DATABASES/' > /tmp/settings_local.py && mv /tmp/settings_local.py ./ietf/settings_local.py
cat ./ietf/settings_postgresqldb.py | sed "s/'db'/'pgdb'/" > /tmp/settings_postgresqldb.py && mv /tmp/settings_postgresqldb.py ./ietf/settings_postgresqldb.py
# Now transfer the migrated database from mysql to postgres unless that's already happened.
# Migrate empty schema into postgres database
/usr/local/bin/python ./ietf/manage.py check --settings=settings_local
/usr/local/bin/python ./ietf/manage.py migrate --settings=settings_local
# Now transfer data from mysql to postgres
echo "Transferring migrated database from MySQL to PostgreSQL..."
EMPTY_CHECK=`psql -U django -h pgdb -d ietf -c "\dt" 2>&1`
if echo ${EMPTY_CHECK} | grep -q "Did not find any relations."; then
cat << EOF > transforms.lisp
; transform functions for IETF datatracker conversion
(in-package :pgloader.transforms)
(defun integer-to-interval (dt)
"Convert microseconds to a postgres interval value"
(multiple-value-bind (totsec useconds) (floor (parse-integer dt) 1000000)
(multiple-value-bind (totmin seconds) (floor totsec 60)
(multiple-value-bind (tothours minutes) (floor totmin 60)
(multiple-value-bind (totdays hours) (floor tothours 24)
(multiple-value-bind (totmonths days) (floor totdays 30)
(multiple-value-bind (years months) (floor totmonths 12)
(format nil "~a years ~a months ~a days ~a hours ~a minutes ~a seconds ~a microseconds"
years months days hours minutes seconds useconds))))))))
EOF
cat << EOF > cast.load
LOAD DATABASE
FROM mysql://django:RkTkDPFnKpko@db/ietf_utf8
INTO postgresql://django:RkTkDPFnKpko@pgdb/ietf
WITH workers = 3, concurrency = 1, batch size = 1MB, batch rows = 1000
CAST type varchar to text drop typemod;
WITH workers = 3, concurrency = 1, batch size = 1MB, batch rows = 1000,
data only, truncate, include no drop, create no tables, create no indexes, reset sequences
EXCLUDING TABLE NAMES MATCHING
'django_migrations',
'community_communitylist_added_ids',
'community_documentchangedates',
'community_expectedchange',
'community_listnotification',
'community_rule_cached_ids',
'draft_versions_mirror',
'iesg_wgaction',
'ietfworkflows_annotationtag',
'ietfworkflows_statedescription',
'ietfworkflows_stream',
'ietfworkflows_wgworkflow',
'ipr_iprselecttype',
'ipr_iprlicensing',
'request_profiler_profilingrecord',
'request_profiler_ruleset',
'south_migrationhistory',
'submit_idapproveddetail',
'workflows_state',
'workflows_state_transitions',
'workflows_transition',
'workflows_workflow'
CAST TYPE int with extra auto_increment TO integer,
TYPE int TO integer,
COLUMN django_admin_log.action_flag TO smallint,
COLUMN meeting_session_materials.order TO smallint,
COLUMN community_emailsubscription.email_id TO text,
COLUMN doc_dochistory.shepherd_id TO text,
COLUMN doc_document.shepherd_id TO text,
COLUMN doc_documentauthor.email_id TO text,
COLUMN doc_dochistoryauthor.email_id TO text,
COLUMN group_role.email_id TO text,
COLUMN group_rolehistory.email_id TO text,
COLUMN liaisons_liaisonstatement.from_contact_id TO text,
COLUMN nomcom_nominee.email_id TO text,
COLUMN person_email.address TO text,
COLUMN person_historicalemail.address TO text,
COLUMN review_historicalreviewassignment.reviewer_id TO text,
COLUMN review_reviewassignment.reviewer_id TO text,
COLUMN meeting_session.requested_duration TO interval USING integer-to-interval,
COLUMN meeting_timeslot.duration TO interval USING integer-to-interval,
COLUMN meeting_meeting.idsubmit_cutoff_time_utc TO interval USING integer-to-interval,
COLUMN meeting_meeting.idsubmit_cutoff_warning_days TO interval USING integer-to-interval
BEFORE LOAD DO
-- must change person_email before any tables with FK constraints to address
\$\$ ALTER TABLE person_email ALTER COLUMN address TYPE text; \$\$,
\$\$ ALTER TABLE community_emailsubscription ALTER COLUMN email_id TYPE text; \$\$,
\$\$ ALTER TABLE doc_dochistory ALTER COLUMN shepherd_id TYPE text; \$\$,
\$\$ ALTER TABLE doc_document ALTER COLUMN shepherd_id TYPE text; \$\$,
\$\$ ALTER TABLE doc_documentauthor ALTER COLUMN email_id TYPE text; \$\$,
\$\$ ALTER TABLE doc_dochistoryauthor ALTER COLUMN email_id TYPE text; \$\$,
\$\$ ALTER TABLE group_role ALTER COLUMN email_id TYPE text; \$\$,
\$\$ ALTER TABLE group_rolehistory ALTER COLUMN email_id TYPE text; \$\$,
\$\$ ALTER TABLE liaisons_liaisonstatement ALTER COLUMN from_contact_id TYPE text; \$\$,
\$\$ ALTER TABLE nomcom_nominee ALTER COLUMN email_id TYPE text; \$\$,
\$\$ ALTER TABLE person_historicalemail ALTER COLUMN address TYPE text; \$\$,
\$\$ ALTER TABLE review_historicalreviewassignment ALTER COLUMN reviewer_id TYPE text; \$\$,
\$\$ ALTER TABLE review_reviewassignment ALTER COLUMN reviewer_id TYPE text; \$\$
AFTER LOAD DO
\$\$ ALTER TABLE community_emailsubscription ALTER COLUMN email_id TYPE citext; \$\$,
\$\$ ALTER TABLE doc_dochistory ALTER COLUMN shepherd_id TYPE citext; \$\$,
\$\$ ALTER TABLE doc_document ALTER COLUMN shepherd_id TYPE citext; \$\$,
\$\$ ALTER TABLE doc_documentauthor ALTER COLUMN email_id TYPE citext; \$\$,
\$\$ ALTER TABLE doc_dochistoryauthor ALTER COLUMN email_id TYPE citext; \$\$,
\$\$ ALTER TABLE group_role ALTER COLUMN email_id TYPE citext; \$\$,
\$\$ ALTER TABLE group_rolehistory ALTER COLUMN email_id TYPE citext; \$\$,
\$\$ ALTER TABLE liaisons_liaisonstatement ALTER COLUMN from_contact_id TYPE citext; \$\$,
\$\$ ALTER TABLE nomcom_nominee ALTER COLUMN email_id TYPE citext; \$\$,
\$\$ ALTER TABLE person_historicalemail ALTER COLUMN address TYPE citext; \$\$,
\$\$ ALTER TABLE review_historicalreviewassignment ALTER COLUMN reviewer_id TYPE citext; \$\$,
\$\$ ALTER TABLE review_reviewassignment ALTER COLUMN reviewer_id TYPE citext; \$\$,
-- must change person_email after any tables with FK constraints to address
\$\$ ALTER TABLE person_email ALTER COLUMN address TYPE citext; \$\$
;
EOF
pgloader --verbose --logfile=ietf_pgloader.run --summary=ietf_pgloader.summary cast.load
rm cast.load
/usr/local/bin/python ./ietf/manage.py migrate --settings=settings_local
else
echo "The postgres database is in an unexpected state"
echo ${EMPTY_CHECK}
fi
pgloader --verbose --logfile=ietf_pgloader.run --summary=ietf_pgloader.summary --load-lisp-file transforms.lisp cast.load
rm cast.load transforms.lisp
# Create export dump
echo "Creating export dump..."

View file

@ -1,9 +1,4 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.10 on 2018-02-20 10:52
from typing import List, Tuple # pyflakes:ignore
# Generated by Django 2.2.28 on 2023-03-20 19:22
from django.db import migrations, models
import django.db.models.deletion
@ -15,7 +10,7 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
] # type: List[Tuple[str]]
]
operations = [
migrations.CreateModel(
@ -35,7 +30,7 @@ class Migration(migrations.Migration):
name='SearchRule',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rule_type', models.CharField(choices=[('group', 'All I-Ds associated with a particular group'), ('area', 'All I-Ds associated with all groups in a particular Area'), ('group_rfc', 'All RFCs associated with a particular group'), ('area_rfc', 'All RFCs associated with all groups in a particular Area'), ('state_iab', 'All I-Ds that are in a particular IAB state'), ('state_iana', 'All I-Ds that are in a particular IANA state'), ('state_iesg', 'All I-Ds that are in a particular IESG state'), ('state_irtf', 'All I-Ds that are in a particular IRTF state'), ('state_ise', 'All I-Ds that are in a particular ISE state'), ('state_rfceditor', 'All I-Ds that are in a particular RFC Editor state'), ('state_ietf', 'All I-Ds that are in a particular Working Group state'), ('author', 'All I-Ds with a particular author'), ('author_rfc', 'All RFCs with a particular author'), ('ad', 'All I-Ds with a particular responsible AD'), ('shepherd', 'All I-Ds with a particular document shepherd'), ('name_contains', 'All I-Ds with particular text/regular expression in the name')], max_length=30)),
('rule_type', models.CharField(choices=[('group', 'All I-Ds associated with a particular group'), ('area', 'All I-Ds associated with all groups in a particular Area'), ('group_rfc', 'All RFCs associated with a particular group'), ('area_rfc', 'All RFCs associated with all groups in a particular Area'), ('group_exp', 'All expired I-Ds of a particular group'), ('state_iab', 'All I-Ds that are in a particular IAB state'), ('state_iana', 'All I-Ds that are in a particular IANA state'), ('state_iesg', 'All I-Ds that are in a particular IESG state'), ('state_irtf', 'All I-Ds that are in a particular IRTF state'), ('state_ise', 'All I-Ds that are in a particular ISE state'), ('state_rfceditor', 'All I-Ds that are in a particular RFC Editor state'), ('state_ietf', 'All I-Ds that are in a particular Working Group state'), ('author', 'All I-Ds with a particular author'), ('author_rfc', 'All RFCs with a particular author'), ('ad', 'All I-Ds with a particular responsible AD'), ('shepherd', 'All I-Ds with a particular document shepherd'), ('name_contains', 'All I-Ds with particular text/regular expression in the name')], max_length=30)),
('text', models.CharField(blank=True, default='', max_length=255, verbose_name='Text/RegExp')),
('community_list', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='community.CommunityList')),
],

View file

@ -1,7 +1,4 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.10 on 2018-02-20 10:52
# Generated by Django 2.2.28 on 2023-03-20 19:22
from django.conf import settings
from django.db import migrations, models
@ -14,11 +11,11 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('doc', '0001_initial'),
('group', '0001_initial'),
('person', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('community', '0001_initial'),
('person', '0001_initial'),
('group', '0001_initial'),
('doc', '0001_initial'),
]
operations = [

View file

@ -1,44 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-21 14:23
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('community', '0002_auto_20180220_1052'),
]
operations = [
migrations.CreateModel(
name='CommunityListDocs',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('communitylist', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='community.CommunityList')),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id')),
],
),
migrations.AddField(
model_name='communitylist',
name='added_docs2',
field=models.ManyToManyField(related_name='communitylists', through='community.CommunityListDocs', to='doc.Document'),
),
migrations.CreateModel(
name='SearchRuleDocs',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id')),
('searchrule', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='community.SearchRule')),
],
),
migrations.AddField(
model_name='searchrule',
name='name_contains_index2',
field=models.ManyToManyField(related_name='searchrules', through='community.SearchRuleDocs', to='doc.Document'),
),
]

View file

@ -1,56 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-21 14:27
import sys
from tqdm import tqdm
from django.db import migrations
def forward(apps, schema_editor):
Document = apps.get_model('doc','Document')
CommunityList = apps.get_model('community', 'CommunityList')
CommunityListDocs = apps.get_model('community', 'CommunityListDocs')
SearchRule = apps.get_model('community', 'SearchRule')
SearchRuleDocs = apps.get_model('community', 'SearchRuleDocs')
# Document id fixup ------------------------------------------------------------
objs = Document.objects.in_bulk()
nameid = { o.name: o.id for id, o in objs.items() }
sys.stderr.write('\n')
sys.stderr.write(' %s.%s:\n' % (CommunityList.__name__, 'added_docs'))
count = 0
for l in tqdm(CommunityList.objects.all()):
for d in l.added_docs.all():
count += 1
CommunityListDocs.objects.get_or_create(communitylist=l, document_id=nameid[d.name])
sys.stderr.write(' %s CommunityListDocs objects created\n' % (count, ))
sys.stderr.write(' %s.%s:\n' % (SearchRule.__name__, 'name_contains_index'))
count = 0
for r in tqdm(SearchRule.objects.all()):
for d in r.name_contains_index.all():
count += 1
SearchRuleDocs.objects.get_or_create(searchrule=r, document_id=nameid[d.name])
sys.stderr.write(' %s SearchRuleDocs objects created\n' % (count, ))
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('community', '0003_add_communitylist_docs2_m2m'),
('doc', '0014_set_document_docalias_id'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,32 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-22 08:15
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('community', '0004_set_document_m2m_keys'),
]
# The implementation of AlterField in Django 1.11 applies
# 'ALTER TABLE <table> MODIFY <field> ...;' in order to fix foregn keys
# to the altered field, but as it seems does _not_ fix up m2m
# intermediary tables in an equivalent manner, so here we remove and
# then recreate the m2m tables so they will have the appropriate field
# types.
operations = [
# Remove fields
migrations.RemoveField(
model_name='communitylist',
name='added_docs',
),
migrations.RemoveField(
model_name='searchrule',
name='name_contains_index',
),
]

View file

@ -1,34 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-22 08:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('community', '0005_1_del_docs_m2m_table'),
]
# The implementation of AlterField in Django 1.11 applies
# 'ALTER TABLE <table> MODIFY <field> ...;' in order to fix foregn keys
# to the altered field, but as it seems does _not_ fix up m2m
# intermediary tables in an equivalent manner, so here we remove and
# then recreate the m2m tables so they will have the appropriate field
# types.
operations = [
# Add fields back (will create the m2m tables with the right field types)
migrations.AddField(
model_name='communitylist',
name='added_docs',
field=models.ManyToManyField(to='doc.Document'),
),
migrations.AddField(
model_name='searchrule',
name='name_contains_index',
field=models.ManyToManyField(to='doc.Document'),
),
]

View file

@ -1,57 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-27 05:56
from django.db import migrations
import sys, time
from tqdm import tqdm
def forward(apps, schema_editor):
CommunityList = apps.get_model('community', 'CommunityList')
CommunityListDocs = apps.get_model('community', 'CommunityListDocs')
SearchRule = apps.get_model('community', 'SearchRule')
SearchRuleDocs = apps.get_model('community', 'SearchRuleDocs')
# Document id fixup ------------------------------------------------------------
sys.stderr.write('\n')
sys.stderr.write(' %s.%s:\n' % (CommunityList.__name__, 'added_docs'))
for l in tqdm(CommunityList.objects.all()):
l.added_docs.set([ d.document for d in CommunityListDocs.objects.filter(communitylist=l) ])
sys.stderr.write(' %s.%s:\n' % (SearchRule.__name__, 'name_contains_index'))
for r in tqdm(SearchRule.objects.all()):
r.name_contains_index.set([ d.document for d in SearchRuleDocs.objects.filter(searchrule=r) ])
def reverse(apps, schema_editor):
pass
def timestamp(apps, schema_editor):
sys.stderr.write('\n %s' % time.strftime('%Y-%m-%d %H:%M:%S'))
class Migration(migrations.Migration):
dependencies = [
('community', '0005_2_add_docs_m2m_table'),
]
operations = [
#migrations.RunPython(forward, reverse),
# Alternative:
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO community_communitylist_added_docs SELECT * FROM community_communitylistdocs;",
""),
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO community_searchrule_name_contains_index SELECT * FROM community_searchruledocs;",
""),
migrations.RunPython(timestamp, timestamp),
]

View file

@ -1,46 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-30 03:06
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('community', '0006_copy_docs_m2m_table'),
]
operations = [
migrations.RemoveField(
model_name='communitylistdocs',
name='communitylist',
),
migrations.RemoveField(
model_name='communitylistdocs',
name='document',
),
migrations.RemoveField(
model_name='searchruledocs',
name='document',
),
migrations.RemoveField(
model_name='searchruledocs',
name='searchrule',
),
migrations.RemoveField(
model_name='communitylist',
name='added_docs2',
),
migrations.RemoveField(
model_name='searchrule',
name='name_contains_index2',
),
migrations.DeleteModel(
name='CommunityListDocs',
),
migrations.DeleteModel(
name='SearchRuleDocs',
),
]

View file

@ -1,18 +0,0 @@
# Generated by Django 2.2.28 on 2022-06-30 05:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('community', '0007_remove_docs2_m2m'),
]
operations = [
migrations.AlterField(
model_name='searchrule',
name='rule_type',
field=models.CharField(choices=[('group', 'All I-Ds associated with a particular group'), ('area', 'All I-Ds associated with all groups in a particular Area'), ('group_rfc', 'All RFCs associated with a particular group'), ('area_rfc', 'All RFCs associated with all groups in a particular Area'), ('group_exp', 'All expired I-Ds of a particular group'), ('state_iab', 'All I-Ds that are in a particular IAB state'), ('state_iana', 'All I-Ds that are in a particular IANA state'), ('state_iesg', 'All I-Ds that are in a particular IESG state'), ('state_irtf', 'All I-Ds that are in a particular IRTF state'), ('state_ise', 'All I-Ds that are in a particular ISE state'), ('state_rfceditor', 'All I-Ds that are in a particular RFC Editor state'), ('state_ietf', 'All I-Ds that are in a particular Working Group state'), ('author', 'All I-Ds with a particular author'), ('author_rfc', 'All RFCs with a particular author'), ('ad', 'All I-Ds with a particular responsible AD'), ('shepherd', 'All I-Ds with a particular document shepherd'), ('name_contains', 'All I-Ds with particular text/regular expression in the name')], max_length=30),
),
]

View file

@ -1,30 +0,0 @@
# Generated by Django 2.2.28 on 2022-06-30 23:15
from django.db import migrations
def forward(apps, schema_editor):
SearchRule = apps.get_model('community', 'SearchRule')
CommunityList = apps.get_model('community', 'CommunityList')
Group = apps.get_model('group', 'Group')
State = apps.get_model('doc', 'State')
for group in Group.objects.filter(type_id__in=['wg','rg'], state_id='active'):
com_list = CommunityList.objects.filter(group=group).first()
if com_list is not None:
SearchRule.objects.create(community_list=com_list, rule_type="group_exp", group=group, state=State.objects.get(slug="expired", type="draft"),)
def reverse(apps, schema_editor):
SearchRule = apps.get_model('community', 'SearchRule')
SearchRule.objects.filter(rule_type='group_exp').delete()
class Migration(migrations.Migration):
dependencies = [
('community', '0008_add_group_exp_rule'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,21 +0,0 @@
# Generated by Django 2.2.28 on 2022-11-05 11:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('community', '0009_add_group_exp_rule_to_groups'),
]
operations = [
migrations.RunSQL(
sql="alter table community_communitylist_added_docs modify document_id int unsigned not null;",
reverse_sql="alter table community_communitylist_added_docs modify document_id varchar(255) not null;"
),
migrations.RunSQL(
sql="alter table community_searchrule_name_contains_index modify document_id int unsigned not null;",
reverse_sql="alter table community_searchrule_name_contains_index modify document_id varchar(255) not null;"
),
]

View file

@ -1,9 +1,4 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.10 on 2018-02-20 10:52
from typing import List, Tuple # pyflakes:ignore
# Generated by Django 2.2.28 on 2023-03-20 19:22
from django.db import migrations, models
@ -13,7 +8,7 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
] # type: List[Tuple[str]]
]
operations = [
migrations.CreateModel(

View file

@ -1,7 +1,4 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.10 on 2018-02-20 10:52
# Generated by Django 2.2.28 on 2023-03-20 19:22
from django.db import migrations
import django.db.models.deletion
@ -13,9 +10,9 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('dbtemplate', '0001_initial'),
('group', '0001_initial'),
('name', '0001_initial'),
('dbtemplate', '0001_initial'),
]
operations = [

View file

@ -1,119 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-05 11:39
from django.db import migrations
def forward(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate', 'DBTemplate')
DBTemplate.objects.filter(id=186).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please treat these comments just
like any other last call comments.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document: {{ assignment.review_request.doc.name }}-??
Reviewer: {{ assignment.reviewer.person.plain_name }}
Review Date: {{ today }}
IETF LC End Date: {% if assignment.review_request.doc.most_recent_ietflc %}{{ assignment.review_request.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
IESG Telechat date: {{ assignment.review_request.doc.telechat_date|default:'Not scheduled for a telechat' }}
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
""")
DBTemplate.objects.filter(id=187).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please wait for direction from your
document shepherd or AD before posting a new version of the draft.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document: {{ assignment.review_request.doc.name }}-??
Reviewer: {{ assignment.reviewer.person.plain_name }}
Review Date: {{ today }}
IETF LC End Date: {% if assignment.review_req.doc.most_recent_ietflc %}{{ assignment.review_request.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
IESG Telechat date: {{ assignment.review_request.doc.telechat_date|default:'Not scheduled for a telechat' }}
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
""")
def reverse(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate','DBTemplate')
DBTemplate.objects.filter(id=186).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please treat these comments just
like any other last call comments.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document: {{ review_req.doc.name }}-??
Reviewer: {{ review_req.reviewer.person.plain_name }}
Review Date: {{ today }}
IETF LC End Date: {% if review_req.doc.most_recent_ietflc %}{{ review_req.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
IESG Telechat date: {{ review_req.doc.telechat_date|default:'Not scheduled for a telechat' }}
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
""")
DBTemplate.objects.filter(id=187).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please wait for direction from your
document shepherd or AD before posting a new version of the draft.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document: {{ review_req.doc.name }}-??
Reviewer: {{ review_req.reviewer.person.plain_name }}
Review Date: {{ today }}
IETF LC End Date: {% if review_req.doc.most_recent_ietflc %}{{ review_req.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
IESG Telechat date: {{ review_req.doc.telechat_date|default:'Not scheduled for a telechat' }}
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
""")
class Migration(migrations.Migration):
dependencies = [
('dbtemplate', '0002_auto_20180220_1052'),
('doc','0011_reviewassignmentdocevent'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,290 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-13 13:41
from django.db import migrations
def forward(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate','DBTemplate')
DBTemplate.objects.filter(pk=182).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request..requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request..doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=183).update(content="""{% autoescape off %}Subject: Review Assignments
Hi all,
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer Type LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{r.review_request.type.name|ljust:"10"}}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% if r.earlier_review_mark %} {{ r.earlier_review_mark }}{% endif %}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}
The LC and Telechat review templates are included below:
-------------------------------------------------------
-- Begin LC Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please treat these comments just
like any other last call comments.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End LC Template --
-- Begin Telechat Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please wait for direction from your
document shepherd or AD before posting a new version of the draft.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End Telechat Template --
{% endautoescape %}
""")
DBTemplate.objects.filter(pk=184).update(content="""{% autoescape off %}Subject: Assignments
Review instructions and related resources are at:
http://tools.ietf.org/area/sec/trac/wiki/SecDirReview{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }}{{ r.earlier_review|yesno:'R, , ' }}{% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=185).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
Review instructions and related resources are at:
<https://trac.ietf.org/trac/ops/wiki/Directorates>
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
def reverse(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate','DBTemplate')
DBTemplate.objects.filter(pk=182).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
The following reviewers have assignments:{% for r in review_requests %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=183).update(content="""{% autoescape off %}Subject: Review Assignments
Hi all,
The following reviewers have assignments:{% for r in review_requests %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer Type LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{r.type.name|ljust:"10"}}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}{% if r.earlier_review_mark %} {{ r.earlier_review_mark }}{% endif %}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}
The LC and Telechat review templates are included below:
-------------------------------------------------------
-- Begin LC Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please treat these comments just
like any other last call comments.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End LC Template --
-- Begin Telechat Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please wait for direction from your
document shepherd or AD before posting a new version of the draft.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End Telechat Template --
{% endautoescape %}
""")
DBTemplate.objects.filter(pk=184).update(content="""{% autoescape off %}Subject: Assignments
Review instructions and related resources are at:
http://tools.ietf.org/area/sec/trac/wiki/SecDirReview{% for r in review_requests %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }}{{ r.earlier_review|yesno:'R, , ' }}{% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=185).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
Review instructions and related resources are at:
<https://trac.ietf.org/trac/ops/wiki/Directorates>
The following reviewers have assignments:{% for r in review_requests %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
class Migration(migrations.Migration):
dependencies = [
('dbtemplate', '0003_adjust_review_templates'),
]
operations = [
migrations.RunPython(forward,reverse),
]

View file

@ -1,281 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-03-13 13:41
from django.db import migrations
def forward(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate','DBTemplate')
DBTemplate.objects.filter(pk=182).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc.name }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %} {{ r.earlier_reviews }}{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=183).update(content="""{% autoescape off %}Subject: Review Assignments
Hi all,
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer Type LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{r.review_request.type.name|ljust:"10"}}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc.name }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% if r.earlier_reviews %} {{ r.earlier_reviews }}{% endif %}{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}
The LC and Telechat review templates are included below:
-------------------------------------------------------
-- Begin LC Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please treat these comments just
like any other last call comments.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End LC Template --
-- Begin Telechat Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please wait for direction from your
document shepherd or AD before posting a new version of the draft.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End Telechat Template --
{% endautoescape %}
""")
DBTemplate.objects.filter(pk=184).update(content="""{% autoescape off %}Subject: Assignments
Review instructions and related resources are at:
http://tools.ietf.org/area/sec/trac/wiki/SecDirReview{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }}{{ r.earlier_review|yesno:'R, , ' }}{% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc.name }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=185).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
Review instructions and related resources are at:
<https://trac.ietf.org/trac/ops/wiki/Directorates>
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc.name }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %} {{ r.earlier_reviews }}{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
def reverse(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate','DBTemplate')
DBTemplate.objects.filter(pk=182).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request..requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request..doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=183).update(content="""{% autoescape off %}Subject: Review Assignments
Hi all,
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer Type LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{r.review_request.type.name|ljust:"10"}}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc.name }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% if r.earlier_review_mark %} {{ r.earlier_review_mark }}{% endif %}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}
The LC and Telechat review templates are included below:
-------------------------------------------------------
-- Begin LC Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please treat these comments just
like any other last call comments.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End LC Template --
-- Begin Telechat Template --
I am the assigned Gen-ART reviewer for this draft. The General Area
Review Team (Gen-ART) reviews all IETF documents being processed
by the IESG for the IETF Chair. Please wait for direction from your
document shepherd or AD before posting a new version of the draft.
For more information, please see the FAQ at
<https://trac.ietf.org/trac/gen/wiki/GenArtfaq>.
Document:
Reviewer:
Review Date:
IETF LC End Date:
IESG Telechat date: (if known)
Summary:
Major issues:
Minor issues:
Nits/editorial comments:
-- End Telechat Template --
{% endautoescape %}
""")
DBTemplate.objects.filter(pk=184).update(content="""{% autoescape off %}Subject: Assignments
Review instructions and related resources are at:
http://tools.ietf.org/area/sec/trac/wiki/SecDirReview{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }}{{ r.earlier_review|yesno:'R, , ' }}{% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc.name }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
DBTemplate.objects.filter(pk=185).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
Review instructions and related resources are at:
<https://trac.ietf.org/trac/ops/wiki/Directorates>
The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
{{r.section}}
{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc.name }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
* Other revision previously reviewed
** This revision already reviewed
{% if rotation_list %}Next in the reviewer rotation:
{% for p in rotation_list %} {{ p }}
{% endfor %}{% endif %}{% endautoescape %}
""")
class Migration(migrations.Migration):
dependencies = [
('dbtemplate', '0004_adjust_assignment_email_summary_templates'),
]
operations = [
migrations.RunPython(forward,reverse),
]

View file

@ -1,33 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
from django.db import migrations
def forward(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate', 'DBTemplate')
DBTemplate.objects.create(path='/group/defaults/email/review_assigned.txt', type_id='django',
content="""{{ assigner.ascii }} has assigned you as a reviewer for this document.
{% if prev_team_reviews %}This team has completed other reviews of this document:{% endif %}{% for assignment in prev_team_reviews %}
- {{ assignment.completed_on }} {{ assignment.reviewer.person.ascii }} -{% if assignment.reviewed_rev %}{{ assignment.reviewed_rev }}{% else %}{{ assignment.review_request.requested_rev }}{% endif %} {{ assignment.result.name }}
{% endfor %}
""")
def reverse(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate', 'DBTemplate')
DBTemplate.objects.get(path='/group/defaults/email/review_assigned.txt').delete()
class Migration(migrations.Migration):
dependencies = [
('dbtemplate', '0005_adjust_assignment_email_summary_templates_2526'),
]
operations = [
migrations.RunPython(forward,reverse),
]

View file

@ -1,38 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.26 on 2019-11-19 11:47
from django.db import migrations
def forward(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate','DBTemplate')
qs = DBTemplate.objects.filter(path='/group/defaults/email/review_assigned.txt')
qs.update(content="""{{ assigner.ascii }} has assigned {{ reviewer.person.ascii }} as a reviewer for this document.
{% if prev_team_reviews %}This team has completed other reviews of this document:{% endif %}{% for assignment in prev_team_reviews %}
- {{ assignment.completed_on }} {{ assignment.reviewer.person.ascii }} -{% if assignment.reviewed_rev %}{{ assignment.reviewed_rev }}{% else %}{{ assignment.review_request.requested_rev }}{% endif %} {{ assignment.result.name }}
{% endfor %}
""")
qs.update(title="Default template for review assignment email")
def reverse(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate','DBTemplate')
qs = DBTemplate.objects.filter(path='/group/defaults/email/review_assigned.txt')
qs.update(content="""{{ assigner.ascii }} has assigned you as a reviewer for this document.
{% if prev_team_reviews %}This team has completed other reviews of this document:{% endif %}{% for assignment in prev_team_reviews %}
- {{ assignment.completed_on }} {{ assignment.reviewer.person.ascii }} -{% if assignment.reviewed_rev %}{{ assignment.reviewed_rev }}{% else %}{{ assignment.review_request.requested_rev }}{% endif %} {{ assignment.result.name }}
{% endfor %}
""")
class Migration(migrations.Migration):
dependencies = [
('dbtemplate', '0006_add_review_assigned_template'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,32 +0,0 @@
# Copyright The IETF Trust 2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.27 on 2020-01-07 09:25
from django.db import migrations
def forward(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate', 'DBTemplate')
DBTemplate.objects.create(path='/nomcom/defaults/iesg_requirements', type_id='rst', title='Generic IESG requirements',
content="""=============================
IESG MEMBER DESIRED EXPERTISE
=============================
Place this year's Generic IESG Member Desired Expertise here.
This template uses reStructured text for formatting. Feel free to use it (to change the above header for example).
""")
def reverse(apps, schema_editor):
DBTemplate = apps.get_model('dbtemplate', 'DBTemplate')
DBTemplate.objects.filter(path='/nomcom/defaults/iesg_requirements').delete()
class Migration(migrations.Migration):
dependencies = [
('dbtemplate', '0007_adjust_review_assigned'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,12 +1,9 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.10 on 2018-02-20 10:52
# Generated by Django 2.2.28 on 2023-03-20 19:22
import datetime
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import ietf.utils.models
@ -39,13 +36,14 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('json', models.TextField(help_text='Deleted object in JSON format, with attribute names chosen to be suitable for passing into the relevant create method.')),
('time', models.DateTimeField(default=datetime.datetime.now)),
('time', models.DateTimeField(default=django.utils.timezone.now)),
],
),
migrations.CreateModel(
name='DocAlias',
fields=[
('name', models.CharField(max_length=255, primary_key=True, serialize=False)),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, unique=True)),
],
options={
'verbose_name': 'document alias',
@ -56,8 +54,8 @@ class Migration(migrations.Migration):
name='DocEvent',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(db_index=True, default=datetime.datetime.now, help_text='When the event happened')),
('type', models.CharField(choices=[(b'new_revision', b'Added new revision'), (b'new_submission', b'Uploaded new revision'), (b'changed_document', b'Changed document metadata'), (b'added_comment', b'Added comment'), (b'added_message', b'Added message'), (b'edited_authors', b'Edited the documents author list'), (b'deleted', b'Deleted document'), (b'changed_state', b'Changed state'), (b'changed_stream', b'Changed document stream'), (b'expired_document', b'Expired document'), (b'extended_expiry', b'Extended expiry of document'), (b'requested_resurrect', b'Requested resurrect'), (b'completed_resurrect', b'Completed resurrect'), (b'changed_consensus', b'Changed consensus'), (b'published_rfc', b'Published RFC'), (b'added_suggested_replaces', b'Added suggested replacement relationships'), (b'reviewed_suggested_replaces', b'Reviewed suggested replacement relationships'), (b'changed_group', b'Changed group'), (b'changed_protocol_writeup', b'Changed protocol writeup'), (b'changed_charter_milestone', b'Changed charter milestone'), (b'initial_review', b'Set initial review time'), (b'changed_review_announcement', b'Changed WG Review text'), (b'changed_action_announcement', b'Changed WG Action text'), (b'started_iesg_process', b'Started IESG process on document'), (b'created_ballot', b'Created ballot'), (b'closed_ballot', b'Closed ballot'), (b'sent_ballot_announcement', b'Sent ballot announcement'), (b'changed_ballot_position', b'Changed ballot position'), (b'changed_ballot_approval_text', b'Changed ballot approval text'), (b'changed_ballot_writeup_text', b'Changed ballot writeup text'), (b'changed_rfc_editor_note_text', b'Changed RFC Editor Note text'), (b'changed_last_call_text', b'Changed last call text'), (b'requested_last_call', b'Requested last call'), (b'sent_last_call', b'Sent last call'), (b'scheduled_for_telechat', b'Scheduled for telechat'), (b'iesg_approved', b'IESG approved document (no problem)'), (b'iesg_disapproved', b'IESG disapproved document (do not publish)'), (b'approved_in_minute', b'Approved in minute'), (b'iana_review', b'IANA review comment'), (b'rfc_in_iana_registry', b'RFC is in IANA registry'), (b'rfc_editor_received_announcement', b'Announcement was received by RFC Editor'), (b'requested_publication', b'Publication at RFC Editor requested'), (b'sync_from_rfc_editor', b'Received updated information from RFC Editor'), (b'requested_review', b'Requested review'), (b'assigned_review_request', b'Assigned review request'), (b'closed_review_request', b'Closed review request'), (b'downref_approved', b'Downref approved')], max_length=50)),
('time', models.DateTimeField(db_index=True, default=django.utils.timezone.now, help_text='When the event happened')),
('type', models.CharField(choices=[('new_revision', 'Added new revision'), ('new_submission', 'Uploaded new revision'), ('changed_document', 'Changed document metadata'), ('added_comment', 'Added comment'), ('added_message', 'Added message'), ('edited_authors', 'Edited the documents author list'), ('deleted', 'Deleted document'), ('changed_state', 'Changed state'), ('changed_stream', 'Changed document stream'), ('expired_document', 'Expired document'), ('extended_expiry', 'Extended expiry of document'), ('requested_resurrect', 'Requested resurrect'), ('completed_resurrect', 'Completed resurrect'), ('changed_consensus', 'Changed consensus'), ('published_rfc', 'Published RFC'), ('added_suggested_replaces', 'Added suggested replacement relationships'), ('reviewed_suggested_replaces', 'Reviewed suggested replacement relationships'), ('changed_action_holders', 'Changed action holders for document'), ('changed_group', 'Changed group'), ('changed_protocol_writeup', 'Changed protocol writeup'), ('changed_charter_milestone', 'Changed charter milestone'), ('initial_review', 'Set initial review time'), ('changed_review_announcement', 'Changed WG Review text'), ('changed_action_announcement', 'Changed WG Action text'), ('started_iesg_process', 'Started IESG process on document'), ('created_ballot', 'Created ballot'), ('closed_ballot', 'Closed ballot'), ('sent_ballot_announcement', 'Sent ballot announcement'), ('changed_ballot_position', 'Changed ballot position'), ('changed_ballot_approval_text', 'Changed ballot approval text'), ('changed_ballot_writeup_text', 'Changed ballot writeup text'), ('changed_rfc_editor_note_text', 'Changed RFC Editor Note text'), ('changed_last_call_text', 'Changed last call text'), ('requested_last_call', 'Requested last call'), ('sent_last_call', 'Sent last call'), ('scheduled_for_telechat', 'Scheduled for telechat'), ('iesg_approved', 'IESG approved document (no problem)'), ('iesg_disapproved', 'IESG disapproved document (do not publish)'), ('approved_in_minute', 'Approved in minute'), ('iana_review', 'IANA review comment'), ('rfc_in_iana_registry', 'RFC is in IANA registry'), ('rfc_editor_received_announcement', 'Announcement was received by RFC Editor'), ('requested_publication', 'Publication at RFC Editor requested'), ('sync_from_rfc_editor', 'Received updated information from RFC Editor'), ('requested_review', 'Requested review'), ('assigned_review_request', 'Assigned review request'), ('closed_review_request', 'Closed review request'), ('closed_review_assignment', 'Closed review assignment'), ('downref_approved', 'Downref approved'), ('posted_related_ipr', 'Posted related IPR'), ('removed_related_ipr', 'Removed related IPR'), ('changed_editors', 'Changed BOF Request editors')], max_length=50)),
('rev', models.CharField(blank=True, max_length=16, null=True, verbose_name='revision')),
('desc', models.TextField()),
],
@ -65,11 +63,22 @@ class Migration(migrations.Migration):
'ordering': ['-time', '-id'],
},
),
migrations.CreateModel(
name='DocExtResource',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('display_name', models.CharField(blank=True, default='', max_length=255)),
('value', models.CharField(max_length=2083)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='DocHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(default=datetime.datetime.now)),
('time', models.DateTimeField(default=django.utils.timezone.now)),
('title', models.CharField(max_length=255, validators=[django.core.validators.RegexValidator(message='Please enter a string without control characters.', regex='^[^\x00-\x1f]*$')])),
('abstract', models.TextField(blank=True)),
('rev', models.CharField(blank=True, max_length=16, verbose_name='revision')),
@ -77,8 +86,9 @@ class Migration(migrations.Migration):
('words', models.IntegerField(blank=True, null=True)),
('order', models.IntegerField(blank=True, default=1)),
('expires', models.DateTimeField(blank=True, null=True)),
('notify', models.CharField(blank=True, max_length=255)),
('notify', models.TextField(blank=True, max_length=1023)),
('external_url', models.URLField(blank=True)),
('uploaded_filename', models.TextField(blank=True)),
('note', models.TextField(blank=True)),
('internal_comments', models.TextField(blank=True)),
('name', models.CharField(max_length=255)),
@ -112,7 +122,8 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Document',
fields=[
('time', models.DateTimeField(default=datetime.datetime.now)),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(default=django.utils.timezone.now)),
('title', models.CharField(max_length=255, validators=[django.core.validators.RegexValidator(message='Please enter a string without control characters.', regex='^[^\x00-\x1f]*$')])),
('abstract', models.TextField(blank=True)),
('rev', models.CharField(blank=True, max_length=16, verbose_name='revision')),
@ -120,77 +131,17 @@ class Migration(migrations.Migration):
('words', models.IntegerField(blank=True, null=True)),
('order', models.IntegerField(blank=True, default=1)),
('expires', models.DateTimeField(blank=True, null=True)),
('notify', models.CharField(blank=True, max_length=255)),
('notify', models.TextField(blank=True, max_length=1023)),
('external_url', models.URLField(blank=True)),
('uploaded_filename', models.TextField(blank=True)),
('note', models.TextField(blank=True)),
('internal_comments', models.TextField(blank=True)),
('name', models.CharField(max_length=255, primary_key=True, serialize=False, validators=[django.core.validators.RegexValidator(b'^[-a-z0-9]+$', b'Provide a valid document name consisting of lowercase letters, numbers and hyphens.', b'invalid')])),
('ad', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ad_document_set', to='person.Person', verbose_name='area director')),
('formal_languages', models.ManyToManyField(blank=True, help_text='Formal languages used in document', to='name.FormalLanguageName')),
('name', models.CharField(max_length=255, unique=True, validators=[django.core.validators.RegexValidator('^[-a-z0-9]+$', 'Provide a valid document name consisting of lowercase letters, numbers and hyphens.', 'invalid')])),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='DocumentAuthor',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('affiliation', models.CharField(blank=True, help_text='Organization/company used by author for submission', max_length=100)),
('country', models.CharField(blank=True, help_text='Country used by author for submission', max_length=255)),
('order', models.IntegerField(default=1)),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('email', ietf.utils.models.ForeignKey(blank=True, help_text='Email address used by author for submission', null=True, on_delete=django.db.models.deletion.CASCADE, to='person.Email')),
('person', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
],
options={
'ordering': ['document', 'order'],
'abstract': False,
},
),
migrations.CreateModel(
name='DocumentURL',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('desc', models.CharField(blank=True, default='', max_length=255)),
('url', models.URLField(max_length=512)),
('doc', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('tag', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.DocUrlTagName')),
],
),
migrations.CreateModel(
name='RelatedDocHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('relationship', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.DocRelationshipName')),
('source', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.DocHistory')),
('target', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reversely_related_document_history_set', to='doc.DocAlias')),
],
),
migrations.CreateModel(
name='RelatedDocument',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('relationship', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.DocRelationshipName')),
('source', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('target', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.DocAlias')),
],
),
migrations.CreateModel(
name='State',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('slug', models.SlugField()),
('name', models.CharField(max_length=255)),
('used', models.BooleanField(default=True)),
('desc', models.TextField(blank=True)),
('order', models.IntegerField(default=0)),
('next_states', models.ManyToManyField(blank=True, related_name='previous_states', to='doc.State')),
],
options={
'ordering': ['type', 'order'],
},
),
migrations.CreateModel(
name='StateType',
fields=[
@ -221,6 +172,21 @@ class Migration(migrations.Migration):
('discuss_time', models.DateTimeField(blank=True, help_text='Time discuss text was written', null=True)),
('comment', models.TextField(blank=True, help_text='Optional comment')),
('comment_time', models.DateTimeField(blank=True, help_text='Time optional comment was written', null=True)),
('send_email', models.BooleanField(default=None, null=True)),
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='BofreqEditorDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='BofreqResponsibleDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
],
bases=('doc.docevent',),
),
@ -228,7 +194,7 @@ class Migration(migrations.Migration):
name='ConsensusDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
('consensus', models.NullBooleanField(default=None)),
('consensus', models.BooleanField(default=None, null=True)),
],
bases=('doc.docevent',),
),
@ -240,6 +206,13 @@ class Migration(migrations.Migration):
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='IanaExpertDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='InitialReviewDocEvent',
fields=[
@ -263,6 +236,13 @@ class Migration(migrations.Migration):
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='ReviewAssignmentDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='ReviewRequestDocEvent',
fields=[
@ -301,9 +281,88 @@ class Migration(migrations.Migration):
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='State',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('slug', models.SlugField()),
('name', models.CharField(max_length=255)),
('used', models.BooleanField(default=True)),
('desc', models.TextField(blank=True)),
('order', models.IntegerField(default=0)),
('next_states', models.ManyToManyField(blank=True, related_name='previous_states', to='doc.State')),
('type', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.StateType')),
],
options={
'ordering': ['type', 'order'],
},
),
migrations.CreateModel(
name='RelatedDocument',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('relationship', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.DocRelationshipName')),
('source', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('target', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.DocAlias')),
],
),
migrations.CreateModel(
name='RelatedDocHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('relationship', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.DocRelationshipName')),
('source', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.DocHistory')),
('target', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reversely_related_document_history_set', to='doc.DocAlias')),
],
),
migrations.CreateModel(
name='DocumentURL',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('desc', models.CharField(blank=True, default='', max_length=255)),
('url', models.URLField(max_length=2083)),
('doc', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('tag', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.DocUrlTagName')),
],
),
migrations.CreateModel(
name='DocumentAuthor',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('affiliation', models.CharField(blank=True, help_text='Organization/company used by author for submission', max_length=100)),
('country', models.CharField(blank=True, help_text='Country used by author for submission', max_length=255)),
('order', models.IntegerField(default=1)),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('email', ietf.utils.models.ForeignKey(blank=True, help_text='Email address used by author for submission', null=True, on_delete=django.db.models.deletion.CASCADE, to='person.Email')),
('person', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
],
options={
'ordering': ['document', 'order'],
'abstract': False,
},
),
migrations.CreateModel(
name='DocumentActionHolder',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time_added', models.DateTimeField(default=django.utils.timezone.now)),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('person', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
],
),
migrations.AddField(
model_name='state',
name='type',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.StateType'),
model_name='document',
name='action_holders',
field=models.ManyToManyField(blank=True, through='doc.DocumentActionHolder', to='person.Person'),
),
migrations.AddField(
model_name='document',
name='ad',
field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ad_document_set', to='person.Person', verbose_name='area director'),
),
migrations.AddField(
model_name='document',
name='formal_languages',
field=models.ManyToManyField(blank=True, help_text='Formal languages used in document', to='name.FormalLanguageName'),
),
]

View file

@ -1,7 +1,4 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.10 on 2018-02-20 10:52
# Generated by Django 2.2.28 on 2023-03-20 19:22
from django.db import migrations, models
import django.db.models.deletion
@ -13,14 +10,14 @@ class Migration(migrations.Migration):
initial = True
dependencies = [
('review', '0001_initial'),
('contenttypes', '0002_remove_content_type_name'),
('name', '0001_initial'),
('submit', '0001_initial'),
('person', '0001_initial'),
('message', '0001_initial'),
('doc', '0001_initial'),
('name', '0001_initial'),
('person', '0001_initial'),
('review', '0001_initial'),
('group', '0001_initial'),
('contenttypes', '0002_remove_content_type_name'),
('submit', '0001_initial'),
('doc', '0001_initial'),
]
operations = [
@ -144,6 +141,16 @@ class Migration(migrations.Migration):
name='type',
field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.DocTypeName'),
),
migrations.AddField(
model_name='docextresource',
name='doc',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AddField(
model_name='docextresource',
name='name',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.ExtResourceName'),
),
migrations.AddField(
model_name='docevent',
name='by',
@ -156,8 +163,8 @@ class Migration(migrations.Migration):
),
migrations.AddField(
model_name='docalias',
name='document',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
name='docs',
field=models.ManyToManyField(related_name='docalias', to='doc.Document'),
),
migrations.AddField(
model_name='deletedevent',
@ -179,6 +186,14 @@ class Migration(migrations.Migration):
name='positions',
field=models.ManyToManyField(blank=True, to='name.BallotPositionName'),
),
migrations.CreateModel(
name='IRSGBallotDocEvent',
fields=[
('ballotdocevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.BallotDocEvent')),
('duedate', models.DateTimeField(blank=True, null=True)),
],
bases=('doc.ballotdocevent',),
),
migrations.AddField(
model_name='submissiondocevent',
name='submission',
@ -205,15 +220,55 @@ class Migration(migrations.Migration):
field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.ReviewRequestStateName'),
),
migrations.AddField(
model_name='ballotpositiondocevent',
name='ad',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person'),
model_name='reviewassignmentdocevent',
name='review_assignment',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='review.ReviewAssignment'),
),
migrations.AddField(
model_name='reviewassignmentdocevent',
name='state',
field=ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.ReviewAssignmentStateName'),
),
migrations.AddIndex(
model_name='documentauthor',
index=models.Index(fields=['document', 'order'], name='doc_documen_documen_7fabe2_idx'),
),
migrations.AddConstraint(
model_name='documentactionholder',
constraint=models.UniqueConstraint(fields=('document', 'person'), name='unique_action_holder'),
),
migrations.AddIndex(
model_name='dochistoryauthor',
index=models.Index(fields=['document', 'order'], name='doc_dochist_documen_7e2441_idx'),
),
migrations.AddIndex(
model_name='docevent',
index=models.Index(fields=['type', 'doc'], name='doc_doceven_type_43e53e_idx'),
),
migrations.AddIndex(
model_name='docevent',
index=models.Index(fields=['-time', '-id'], name='doc_doceven_time_1a258f_idx'),
),
migrations.AddField(
model_name='bofreqresponsibledocevent',
name='responsible',
field=models.ManyToManyField(blank=True, to='person.Person'),
),
migrations.AddField(
model_name='bofreqeditordocevent',
name='editors',
field=models.ManyToManyField(blank=True, to='person.Person'),
),
migrations.AddField(
model_name='ballotpositiondocevent',
name='ballot',
field=ietf.utils.models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.BallotDocEvent'),
),
migrations.AddField(
model_name='ballotpositiondocevent',
name='balloter',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person'),
),
migrations.AddField(
model_name='ballotpositiondocevent',
name='pos',

View file

@ -1,20 +0,0 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.11 on 2018-04-01 12:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0002_auto_20180220_1052'),
]
operations = [
migrations.AddIndex(
model_name='docevent',
index=models.Index(fields=['type', 'doc'], name='doc_doceven_type_43e53e_idx'),
),
]

View file

@ -1,30 +0,0 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.13 on 2018-05-03 11:50
from django.db import migrations
def forward(apps, schema_editor):
State = apps.get_model('doc','State')
for type_id in ('draft-stream-iab','draft-stream-ise','draft-stream-irtf'):
State.objects.create(type_id=type_id,
slug='repl',
name='Replaced',
desc='Replaced',
)
def reverse(apps, schema_editor):
State = apps.get_model('doc','State')
State.objects.filter(type_id__in=('draft-stream-iab','draft-stream-ise','draft-stream-irtf'), slug='repl').delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0003_auto_20180401_1231'),
]
operations = [
migrations.RunPython(forward,reverse)
]

View file

@ -1,112 +0,0 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.13 on 2018-05-03 12:16
from django.db import migrations
def forward(apps, schema_editor):
Document = apps.get_model('doc','Document')
State = apps.get_model('doc','State')
iab_active = State.objects.get(type_id='draft-stream-iab',slug='active')
iab_replaced = State.objects.get(type_id='draft-stream-iab',slug='repl')
irtf_active = State.objects.get(type_id='draft-stream-irtf',slug='active')
irtf_candidate = State.objects.get(type_id='draft-stream-irtf',slug='candidat')
irtf_replaced = State.objects.get(type_id='draft-stream-irtf',slug='repl')
irtf_dead = State.objects.get(type_id='draft-stream-irtf',slug='dead')
doc = Document.objects.get(name='draft-flanagan-rfc-preservation')
doc.states.remove(iab_active)
doc.states.add(iab_replaced)
doc = Document.objects.get(name='draft-trammell-semi-report')
doc.states.remove(iab_active)
doc.states.add(iab_replaced)
doc = Document.objects.get(name='draft-nir-cfrg-chacha20-poly1305')
doc.states.remove(irtf_candidate)
doc.states.add(irtf_replaced)
doc = Document.objects.get(name='draft-ladd-spake2')
doc.states.remove(irtf_candidate)
doc.states.add(irtf_replaced)
doc = Document.objects.get(name='draft-lee-nfvrg-resource-management-service-chain')
doc.states.remove(irtf_candidate)
doc.states.add(irtf_replaced)
doc = Document.objects.get(name='draft-keranen-t2trg-rest-iot')
doc.states.remove(irtf_candidate)
doc.states.add(irtf_replaced)
doc = Document.objects.get(name='draft-josefsson-argon2')
doc.states.remove(irtf_active)
doc.states.add(irtf_replaced)
doc = Document.objects.get(name='draft-tenoever-hrpc-research')
doc.states.remove(irtf_active)
doc.states.add(irtf_replaced)
doc = Document.objects.get(name='draft-kutscher-icnrg-challenges')
doc.states.remove(irtf_dead)
doc.states.add(irtf_replaced)
def reverse(apps, schema_editor):
Document = apps.get_model('doc','Document')
State = apps.get_model('doc','State')
iab_active = State.objects.get(type_id='draft-stream-iab',slug='active')
iab_replaced = State.objects.get(type_id='draft-stream-iab',slug='repl')
irtf_active = State.objects.get(type_id='draft-stream-irtf',slug='active')
irtf_candidate = State.objects.get(type_id='draft-stream-irtf',slug='candidat')
irtf_replaced = State.objects.get(type_id='draft-stream-irtf',slug='repl')
irtf_dead = State.objects.get(type_id='draft-stream-irtf',slug='dead')
doc = Document.objects.get(name='draft-flanagan-rfc-preservation')
doc.states.add(iab_active)
doc.states.remove(iab_replaced)
doc = Document.objects.get(name='draft-trammell-semi-report')
doc.states.add(iab_active)
doc.states.remove(iab_replaced)
doc = Document.objects.get(name='draft-nir-cfrg-chacha20-poly1305')
doc.states.add(irtf_candidate)
doc.states.remove(irtf_replaced)
doc = Document.objects.get(name='draft-ladd-spake2')
doc.states.add(irtf_candidate)
doc.states.remove(irtf_replaced)
doc = Document.objects.get(name='draft-lee-nfvrg-resource-management-service-chain')
doc.states.add(irtf_candidate)
doc.states.remove(irtf_replaced)
doc = Document.objects.get(name='draft-keranen-t2trg-rest-iot')
doc.states.add(irtf_candidate)
doc.states.remove(irtf_replaced)
doc = Document.objects.get(name='draft-josefsson-argon2')
doc.states.add(irtf_active)
doc.states.remove(irtf_replaced)
doc = Document.objects.get(name='draft-tenoever-hrpc-research')
doc.states.add(irtf_active)
doc.states.remove(irtf_replaced)
doc = Document.objects.get(name='draft-kutscher-icnrg-challenges')
doc.states.add(irtf_dead)
doc.states.remove(irtf_replaced)
class Migration(migrations.Migration):
dependencies = [
('doc', '0004_add_draft_stream_replaced_states'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,21 +0,0 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.15 on 2018-10-03 06:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0005_fix_replaced_iab_irtf_stream_docs'),
]
operations = [
migrations.AddField(
model_name='ballotpositiondocevent',
name='send_email',
field=models.NullBooleanField(default=None),
),
]

View file

@ -1,51 +0,0 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2018-11-04 10:56
from tqdm import tqdm
from django.db import migrations
def forward(apps, schema_editor):
State = apps.get_model('doc','State')
Document = apps.get_model('doc','Document')
DocHistory = apps.get_model('doc','DocHistory')
idexists = State.objects.create(
type_id = 'draft-iesg',
slug = 'idexists',
name = 'I-D Exists',
used = True,
desc = 'The IESG has not started processing this draft, or has stopped processing it without publicastion.',
order = 0,
)
idexists.next_states.set(State.objects.filter(type='draft-iesg',slug__in=['pub-req','watching']))
#for doc in tqdm(Document.objects.filter(type='draft'):
# if not doc.states.filter(type='draft-iesg').exists():
# doc.states.add(idexists)
# for dh in doc.history_set.all():
# if not dh.states.filter(type='draft-iesg').exists():
# dh.states.add(idexists)
for doc in tqdm(Document.objects.filter(type_id='draft').exclude(states__type_id='draft-iesg')):
doc.states.add(idexists)
for history in tqdm(DocHistory.objects.filter(type_id='draft').exclude(states__type_id='draft-iesg')):
history.states.add(idexists)
def reverse(apps, schema_editor):
State = apps.get_model('doc','State')
State.objects.filter(slug='idexists').delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0006_ballotpositiondocevent_send_email'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,26 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.17 on 2018-12-28 13:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0007_idexists'),
]
operations = [
migrations.AddField(
model_name='dochistory',
name='uploaded_filename',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='document',
name='uploaded_filename',
field=models.TextField(blank=True),
),
]

View file

@ -1,49 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.17 on 2018-12-28 13:33
from django.db import migrations
from django.db.models import F
def forward(apps, schema_editor):
Document = apps.get_model('doc','Document')
Document.objects.exclude(type_id__in=('review','recording')).update(uploaded_filename = F('external_url'))
Document.objects.exclude(type_id__in=('review','recording')).update(external_url="")
Document.objects.filter(name='slides-100-edu-sessf-patents-at-ietf-an-overview-of-bcp79bis').update(uploaded_filename='slides-100-edu-sessf-patents-at-ietf-an-overview-of-bcp79bis-00.pdf')
DocHistory = apps.get_model('doc','DocHistory')
DocHistory.objects.exclude(type_id__in=('review','recording')).update(uploaded_filename = F('external_url'))
DocHistory.objects.exclude(type_id__in=('review','recording')).update(external_url="")
DocHistory.objects.filter(uploaded_filename='https://www.ietf.org/proceedings/97/slides/slides-97-edu-sessb-local-version-of-newcomers-training-in-korean-00.pdf').update(uploaded_filename='slides-97-edu-sessb-local-version-of-newcomers-training-in-korean-00.pdf')
DocHistory.objects.filter(uploaded_filename='http://materials-98-codec-opus-newvectors-00.tar.gz').update(uploaded_filename='materials-98-codec-opus-newvectors-00.tar.gz')
DocHistory.objects.filter(uploaded_filename='http://materials-98-codec-opus-update-00.patch').update(uploaded_filename='materials-98-codec-opus-update-00.patch')
DocHistory.objects.filter(uploaded_filename='http://slides-100-edu-sessf-patents-at-ietf-an-overview-of-bcp79bis-00.pdf').update(uploaded_filename='slides-100-edu-sessf-patents-at-ietf-an-overview-of-bcp79bis-00.pdf')
DocHistory.objects.filter(uploaded_filename='http://bluesheets-97-6man-201611150930-00.pdf/').update(uploaded_filename='bluesheets-97-6man-201611150930-00.pdf')
DocHistory.objects.filter(uploaded_filename='http://agenda-interim-2017-stir-01-stir-01-01.txt').update(uploaded_filename='agenda-interim-2017-stir-01-stir-01-01.txt')
DocHistory.objects.filter(uploaded_filename='http://agenda-interim-2017-icnrg-02-icnrg-01-05.html').update(uploaded_filename='agenda-interim-2017-icnrg-02-icnrg-01-05.html')
def reverse(apps, schema_editor):
Document = apps.get_model('doc','Document')
Document.objects.exclude(type_id__in=('review','recording')).update(external_url = F('uploaded_filename'))
Document.objects.exclude(type_id__in=('review','recording')).update(uploaded_filename="")
DocHistory = apps.get_model('doc','DocHistory')
DocHistory.objects.exclude(type_id__in=('review','recording')).update(external_url = F('uploaded_filename'))
DocHistory.objects.exclude(type_id__in=('review','recording')).update(uploaded_filename="")
class Migration(migrations.Migration):
dependencies = [
('doc', '0008_add_uploaded_filename'),
('review', '0008_remove_reviewrequest_old_id'),
('meeting', '0011_auto_20190114_0550'),
]
operations = [
migrations.RunPython(forward,reverse),
]

View file

@ -1,21 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-02-25 13:02
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0009_move_non_url_externalurls_to_uploaded_filename'),
]
operations = [
migrations.AlterField(
model_name='documenturl',
name='url',
field=models.URLField(max_length=2083),
),
]

View file

@ -1,29 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.18 on 2019-01-11 11:22
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('review', '0009_refactor_review_request'),
('name', '0005_reviewassignmentstatename'),
('doc', '0010_auto_20190225_1302'),
]
operations = [
migrations.CreateModel(
name='ReviewAssignmentDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
('review_assignment', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='review.ReviewAssignment')),
('state', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.ReviewAssignmentStateName')),
],
bases=('doc.docevent',),
),
]

View file

@ -1,24 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-01 04:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0011_reviewassignmentdocevent'),
# present to facilitate migration to just before review.0010:
('name', '0006_adjust_statenames'),
('dbtemplate', '0004_adjust_assignment_email_summary_templates'),
]
operations = [
migrations.AlterField(
model_name='docevent',
name='type',
field=models.CharField(choices=[('new_revision', 'Added new revision'), ('new_submission', 'Uploaded new revision'), ('changed_document', 'Changed document metadata'), ('added_comment', 'Added comment'), ('added_message', 'Added message'), ('edited_authors', 'Edited the documents author list'), ('deleted', 'Deleted document'), ('changed_state', 'Changed state'), ('changed_stream', 'Changed document stream'), ('expired_document', 'Expired document'), ('extended_expiry', 'Extended expiry of document'), ('requested_resurrect', 'Requested resurrect'), ('completed_resurrect', 'Completed resurrect'), ('changed_consensus', 'Changed consensus'), ('published_rfc', 'Published RFC'), ('added_suggested_replaces', 'Added suggested replacement relationships'), ('reviewed_suggested_replaces', 'Reviewed suggested replacement relationships'), ('changed_group', 'Changed group'), ('changed_protocol_writeup', 'Changed protocol writeup'), ('changed_charter_milestone', 'Changed charter milestone'), ('initial_review', 'Set initial review time'), ('changed_review_announcement', 'Changed WG Review text'), ('changed_action_announcement', 'Changed WG Action text'), ('started_iesg_process', 'Started IESG process on document'), ('created_ballot', 'Created ballot'), ('closed_ballot', 'Closed ballot'), ('sent_ballot_announcement', 'Sent ballot announcement'), ('changed_ballot_position', 'Changed ballot position'), ('changed_ballot_approval_text', 'Changed ballot approval text'), ('changed_ballot_writeup_text', 'Changed ballot writeup text'), ('changed_rfc_editor_note_text', 'Changed RFC Editor Note text'), ('changed_last_call_text', 'Changed last call text'), ('requested_last_call', 'Requested last call'), ('sent_last_call', 'Sent last call'), ('scheduled_for_telechat', 'Scheduled for telechat'), ('iesg_approved', 'IESG approved document (no problem)'), ('iesg_disapproved', 'IESG disapproved document (do not publish)'), ('approved_in_minute', 'Approved in minute'), ('iana_review', 'IANA review comment'), ('rfc_in_iana_registry', 'RFC is in IANA registry'), ('rfc_editor_received_announcement', 'Announcement was received by RFC Editor'), ('requested_publication', 'Publication at RFC Editor requested'), ('sync_from_rfc_editor', 'Received updated information from RFC Editor'), ('requested_review', 'Requested review'), ('assigned_review_request', 'Assigned review request'), ('closed_review_request', 'Closed review request'), ('closed_review_assignment', 'Closed review assignment'), ('downref_approved', 'Downref approved')], max_length=50),
),
]

View file

@ -1,26 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-08 08:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0012_add_event_type_closed_review_assignment'),
]
operations = [
migrations.AddField(
model_name='docalias',
name='id',
field=models.IntegerField(default=0),
),
migrations.AddField(
model_name='document',
name='id',
field=models.IntegerField(default=0),
),
]

View file

@ -1,36 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-08 08:42
import sys
from tqdm import tqdm
from django.db import migrations
def forward(apps, schema_editor):
Document = apps.get_model('doc','Document')
sys.stderr.write('\n')
for i, d in enumerate(tqdm(Document.objects.all()), start=1):
d.id = i
d.save()
DocAlias = apps.get_model('doc','DocAlias')
for i, d in enumerate(tqdm(DocAlias.objects.all()), start=1):
d.id = i
d.save()
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('doc', '0013_add_document_docalias_id'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,122 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-08 10:29
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('doc', '0014_set_document_docalias_id'),
]
operations = [
# Fix name and id fields first
migrations.AlterField(
model_name='docalias',
name='name',
field=models.CharField(max_length=255, unique=True),
),
migrations.AlterField(
model_name='docalias',
name='id',
field=models.IntegerField(primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='document',
name='name',
field=models.CharField(max_length=255, unique=True, validators=[django.core.validators.RegexValidator('^[-a-z0-9]+$', 'Provide a valid document name consisting of lowercase letters, numbers and hyphens.', 'invalid')]),
),
migrations.AlterField(
model_name='document',
name='id',
field=models.IntegerField(primary_key=True, serialize=False),
),
# Then remaining fields
migrations.AddField(
model_name='docalias',
name='document2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id'),
),
migrations.AddField(
model_name='dochistory',
name='doc2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='history_set', to='doc.Document', to_field=b'id'),
),
migrations.AddField(
model_name='documentauthor',
name='document2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id'),
),
migrations.AddField(
model_name='documenturl',
name='doc2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id'),
),
migrations.AddField(
model_name='relateddochistory',
name='target2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reversely_related_document_history_set', to='doc.DocAlias', to_field=b'id'),
),
migrations.AddField(
model_name='relateddocument',
name='source2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id'),
),
migrations.AddField(
model_name='relateddocument',
name='target2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.DocAlias', to_field=b'id'),
),
migrations.AddField(
model_name='docevent',
name='doc2',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field='id'),
),
migrations.AlterField(
model_name='docalias',
name='document',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_docalias', to='doc.Document', to_field=b'name'),
),
migrations.AlterField(
model_name='dochistory',
name='doc',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_hist', to='doc.Document', to_field=b'name'),
),
migrations.AlterField(
model_name='documentauthor',
name='document',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_doc_auth', to='doc.Document', to_field=b'name'),
),
migrations.AlterField(
model_name='documenturl',
name='doc',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_doc_url', to='doc.Document', to_field=b'name'),
),
migrations.AlterField(
model_name='relateddochistory',
name='target',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_hist_target', to='doc.DocAlias', to_field=b'name'),
),
migrations.AlterField(
model_name='relateddocument',
name='source',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_rel_source', to='doc.Document', to_field=b'name'),
),
migrations.AlterField(
model_name='relateddocument',
name='target',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_rel_target', to='doc.DocAlias', to_field=b'name'),
),
migrations.AlterField(
model_name='docevent',
name='doc',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='old_docevent', to='doc.Document', to_field=b'name'),
),
]

View file

@ -1,94 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-28 12:42
import sys, time
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
def timestamp(apps, schema_editor):
sys.stderr.write('\n %s' % time.strftime('%Y-%m-%d %H:%M:%S'))
class Migration(migrations.Migration):
dependencies = [
('name', '0006_adjust_statenames'),
('doc', '0015_1_add_fk_to_document_id'),
]
operations = [
migrations.CreateModel(
name='DocumentLanguages',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field='name', related_name='doclanguages')),
('formallanguagename', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.FormalLanguageName')),
],
),
migrations.CreateModel(
name='DocumentStates',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field='name', related_name='docstates')),
('state', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.State')),
],
),
migrations.CreateModel(
name='DocumentTags',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field='name', related_name='doctags')),
('doctagname', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.DocTagName')),
],
),
migrations.AddField(
model_name='document',
name='formal_languages2',
field=models.ManyToManyField(blank=True, related_name='languagedocs', through='doc.DocumentLanguages', to='name.FormalLanguageName'),
),
migrations.AddField(
model_name='document',
name='states2',
field=models.ManyToManyField(blank=True, related_name='statedocs', through='doc.DocumentStates', to='doc.State'),
),
migrations.AddField(
model_name='document',
name='tags2',
field=models.ManyToManyField(blank=True, related_name='tagdocs', through='doc.DocumentTags', to='name.DocTagName'),
),
# Here we copy the content of the existing implicit m2m tables for
# the Document m2m fields into the explicit through tables, in order
# to be able to later set the correct id from name
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO doc_documentlanguages SELECT * FROM doc_document_formal_languages;",
""),
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO doc_documentstates SELECT * FROM doc_document_states;",
""),
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO doc_documenttags SELECT * FROM doc_document_tags;",
""),
migrations.RunPython(timestamp, timestamp),
migrations.AddField(
model_name='documentlanguages',
name='document2',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field='id', null=True, default=None),
),
migrations.AddField(
model_name='documentstates',
name='document2',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field='id', null=True, default=None), ),
migrations.AddField(
model_name='documenttags',
name='document2',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field='id', null=True, default=None),
),
]

View file

@ -1,113 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-08 14:04
import sys
from tqdm import tqdm
from django.db import migrations
def forward(apps, schema_editor):
def add_id_fk(o, a, nameid):
n = getattr(o, a+'_id')
if n:
i = nameid[n]
if not isinstance(i, int):
raise ValueError("Inappropriate value: %s: nameid[%s]: %s" % (o.__class__.__name__, n, i))
if getattr(o, a+'2_id') != i:
setattr(o, a+'2_id', i)
o.save()
DocAlias = apps.get_model('doc','DocAlias')
DocEvent = apps.get_model('doc', 'DocEvent')
DocHistory = apps.get_model('doc', 'DocHistory')
Document = apps.get_model('doc', 'Document')
DocumentAuthor = apps.get_model('doc', 'DocumentAuthor')
DocumentLanguages = apps.get_model('doc', 'DocumentLanguages')
DocumentStates = apps.get_model('doc', 'DocumentStates')
DocumentTags = apps.get_model('doc', 'DocumentTags')
DocumentURL = apps.get_model('doc', 'DocumentURL')
Group = apps.get_model('group', 'Group')
IprDocRel = apps.get_model('ipr', 'IprDocRel')
LiaisonStatementAttachment = apps.get_model('liaisons', 'LiaisonStatementAttachment')
RelatedDocHistory = apps.get_model('doc', 'RelatedDocHistory')
RelatedDocument = apps.get_model('doc', 'RelatedDocument')
ReviewAssignment = apps.get_model('review', 'ReviewAssignment')
ReviewRequest = apps.get_model('review', 'ReviewRequest')
ReviewWish = apps.get_model('review', 'ReviewWish')
SessionPresentation = apps.get_model('meeting', 'SessionPresentation')
Submission = apps.get_model('submit', 'Submission')
# Document id fixup ------------------------------------------------------------
objs = Document.objects.in_bulk()
nameid = { o.name: o.id for id, o in objs.items() }
sys.stderr.write('\n')
sys.stderr.write('Setting Document FKs:\n')
for C, a in [
( DocAlias , 'document'),
( DocEvent , 'doc'),
( DocHistory , 'doc'),
( DocumentAuthor , 'document'),
( DocumentLanguages , 'document'),
( DocumentStates , 'document'),
( DocumentTags , 'document'),
( DocumentURL , 'doc'),
( Group , 'charter'),
( LiaisonStatementAttachment , 'document'),
( RelatedDocument , 'source'),
( ReviewAssignment , 'review'),
( ReviewRequest , 'doc'),
( ReviewRequest , 'unused_review'),
( ReviewWish , 'doc'),
( SessionPresentation , 'document'),
( Submission , 'draft'),
]:
sys.stderr.write(' %s.%s:\n' % (C.__name__, a))
for o in tqdm(C.objects.all()):
add_id_fk(o, a, nameid)
# DocAlias id fixup ------------------------------------------------------------
sys.stderr.write('\n')
objs = DocAlias.objects.in_bulk()
nameid = { o.name: o.id for id, o in objs.items() }
sys.stderr.write('Setting DocAlias FKs:\n')
for C, a in [
( IprDocRel , 'document'),
( RelatedDocument , 'target'),
( RelatedDocHistory , 'target'),
]:
sys.stderr.write(' %s.%s:\n' % (C.__name__, a))
for o in tqdm(C.objects.all()):
add_id_fk(o, a, nameid)
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('community', '0004_set_document_m2m_keys'),
('doc', '0015_2_add_doc_document_m2m_fields'),
('group', '0014_set_document_m2m_keys'),
('ipr', '0003_add_ipdocrel_document2_fk'),
('liaisons', '0003_liaison_document2_fk'),
('meeting', '0015_sessionpresentation_document2_fk'),
('message', '0003_set_document_m2m_keys'),
('review', '0011_review_document2_fk'),
('submit', '0002_submission_document2_fk'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,26 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-09 05:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0016_set_document_docalias_fk'),
]
operations = [
migrations.AlterField(
model_name='docalias',
name='id',
field=models.AutoField(primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='document',
name='id',
field=models.AutoField(primary_key=True, serialize=False),
),
]

View file

@ -1,125 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-20 09:53
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('doc', '0017_make_document_id_primary_key'),
]
operations = [
migrations.AlterModelOptions(
name='documentauthor',
options={'ordering': ['document2', 'order']},
),
migrations.RemoveIndex(
model_name='docevent',
name='doc_doceven_type_43e53e_idx',
),
migrations.RemoveField(
model_name='docalias',
name='document',
),
migrations.RemoveField(
model_name='docevent',
name='doc',
),
migrations.RemoveField(
model_name='dochistory',
name='doc',
),
migrations.RemoveField(
model_name='documentauthor',
name='document',
),
migrations.RemoveField(
model_name='documenturl',
name='doc',
),
migrations.RemoveField(
model_name='relateddochistory',
name='target',
),
migrations.RemoveField(
model_name='relateddocument',
name='source',
),
migrations.RemoveField(
model_name='relateddocument',
name='target',
),
migrations.AddIndex(
model_name='docevent',
index=models.Index(fields=['type', 'doc2'], name='doc_doceven_type_ac7748_idx'),
),
# The following 9 migrations are related to the m2m fields on Document
# Remove the intermediary model field pointing to Document.name
migrations.RemoveField(
model_name='documentlanguages',
name='document',
),
migrations.RemoveField(
model_name='documentstates',
name='document',
),
migrations.RemoveField(
model_name='documenttags',
name='document',
),
# Rename the intermediary model field pointing to Document.id, to
# match the implicit m2m table
migrations.RenameField(
model_name='documentlanguages',
old_name='document2',
new_name='document',
),
migrations.RenameField(
model_name='documentstates',
old_name='document2',
new_name='document',
),
migrations.RenameField(
model_name='documenttags',
old_name='document2',
new_name='document',
),
# Alter the fields to point to Document.pk instead of Document.name
migrations.AlterField(
model_name='documentlanguages',
name='document',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AlterField(
model_name='documentstates',
name='document',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AlterField(
model_name='documenttags',
name='document',
field=ietf.utils.models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
# Remove the implicit m2m tables which point to Document.name
migrations.RemoveField(
model_name='document',
name='formal_languages',
),
migrations.RemoveField(
model_name='document',
name='states',
),
migrations.RemoveField(
model_name='document',
name='tags',
),
# Next (in a separate migration, in order to commit the above before
# we proceed) we'll create the implicit m2m tables again, this time
# pointing to Document.id since that's now the primary key.
]

View file

@ -1,84 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-21 05:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0018_remove_old_document_field'),
]
operations = [
migrations.AlterModelOptions(
name='documentauthor',
options={'ordering': ['document', 'order']},
),
migrations.RemoveIndex(
model_name='docevent',
name='doc_doceven_type_ac7748_idx',
),
migrations.RenameField(
model_name='docalias',
old_name='document2',
new_name='document',
),
migrations.RenameField(
model_name='docevent',
old_name='doc2',
new_name='doc',
),
migrations.RenameField(
model_name='dochistory',
old_name='doc2',
new_name='doc',
),
migrations.RenameField(
model_name='documentauthor',
old_name='document2',
new_name='document',
),
migrations.RenameField(
model_name='documenturl',
old_name='doc2',
new_name='doc',
),
migrations.RenameField(
model_name='relateddochistory',
old_name='target2',
new_name='target',
),
migrations.RenameField(
model_name='relateddocument',
old_name='source2',
new_name='source',
),
migrations.RenameField(
model_name='relateddocument',
old_name='target2',
new_name='target',
),
migrations.AddIndex(
model_name='docevent',
index=models.Index(fields=['type', 'doc'], name='doc_doceven_type_43e53e_idx'),
),
# Add back the m2m field we removed in 0018_...
migrations.AddField(
model_name='document',
name='formal_languages',
field=models.ManyToManyField(blank=True, help_text='Formal languages used in document', to='name.FormalLanguageName'),
),
migrations.AddField(
model_name='document',
name='states',
field=models.ManyToManyField(blank=True, to='doc.State'),
),
migrations.AddField(
model_name='document',
name='tags',
field=models.ManyToManyField(blank=True, to='name.DocTagName'),
),
]

View file

@ -1,34 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-21 05:31
import sys, time
from django.db import migrations
def timestamp(apps, schema_editor):
sys.stderr.write('\n %s' % time.strftime('%Y-%m-%d %H:%M:%S'))
class Migration(migrations.Migration):
dependencies = [
('doc', '0019_rename_field_document2'),
]
operations = [
# Copy the doc IDs from the explicit m2m table to the implicit table
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO doc_document_formal_languages SELECT id,document_id,formallanguagename_id FROM doc_documentlanguages;",
""),
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO doc_document_states SELECT id,document_id,state_id FROM doc_documentstates;",
""),
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO doc_document_tags SELECT id,document_id,doctagname_id FROM doc_documenttags;",
""),
migrations.RunPython(timestamp, timestamp),
]

View file

@ -1,63 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-30 03:36
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('doc', '0020_copy_docs_m2m_table'),
]
operations = [
# Get rid of the explicit m2m tables which we needed only to be
# able to convert from Document.name to Document.id
migrations.RemoveField(
model_name='documentlanguages',
name='document',
),
migrations.RemoveField(
model_name='documentlanguages',
name='formallanguagename',
),
migrations.RemoveField(
model_name='documentstates',
name='document',
),
migrations.RemoveField(
model_name='documentstates',
name='state',
),
migrations.RemoveField(
model_name='documenttags',
name='doctagname',
),
migrations.RemoveField(
model_name='documenttags',
name='document',
),
migrations.RemoveField(
model_name='document',
name='formal_languages2',
),
migrations.RemoveField(
model_name='document',
name='states2',
),
migrations.RemoveField(
model_name='document',
name='tags2',
),
migrations.DeleteModel(
name='DocumentLanguages',
),
migrations.DeleteModel(
name='DocumentStates',
),
migrations.DeleteModel(
name='DocumentTags',
),
]

View file

@ -1,68 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-06-10 03:47
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('doc', '0021_remove_docs2_m2m'),
]
operations = [
migrations.AlterField(
model_name='docalias',
name='document',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AlterField(
model_name='docalias',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='docevent',
name='doc',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AlterField(
model_name='dochistory',
name='doc',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='history_set', to='doc.Document'),
),
migrations.AlterField(
model_name='document',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='documentauthor',
name='document',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AlterField(
model_name='documenturl',
name='doc',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AlterField(
model_name='relateddochistory',
name='target',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reversely_related_document_history_set', to='doc.DocAlias'),
),
migrations.AlterField(
model_name='relateddocument',
name='source',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document'),
),
migrations.AlterField(
model_name='relateddocument',
name='target',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.DocAlias'),
),
]

View file

@ -1,43 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-06-10 04:36
import sys
from tqdm import tqdm
from django.db import migrations, models
def forward(apps, schema_editor):
DocAlias = apps.get_model('doc','DocAlias')
sys.stderr.write('\n')
for a in tqdm(DocAlias.objects.all()):
a.docs.add(a.document)
def reverse(apps, schema_editor):
DocAlias = apps.get_model('doc','DocAlias')
sys.stderr.write('\n')
for a in tqdm(DocAlias.objects.all()):
a.document = a.document
a.save()
class Migration(migrations.Migration):
dependencies = [
('doc', '0022_document_primary_key_cleanup'),
]
operations = [
migrations.AddField(
model_name='docalias',
name='docs',
field=models.ManyToManyField(related_name='docalias', to='doc.Document'),
),
migrations.RunPython(forward, reverse),
migrations.RemoveField(
model_name='docalias',
name='document',
),
]

View file

@ -1,59 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.23 on 2019-08-07 12:07
from django.db import migrations
def forward(apps, schema_editor):
StateType = apps.get_model('doc','StateType')
State = apps.get_model('doc','State')
StateType.objects.create(slug='draft-iana-experts',label='IANA Experts State')
State.objects.create(type_id='draft-iana-experts',
slug='need-experts',
name='Need IANA Expert(s)',
used=True,
desc='One or more registries need experts assigned',
order=0
)
State.objects.create(type_id='draft-iana-experts',
slug='reviews-assigned',
name='Reviews assigned',
used=True,
desc='One or more expert reviews have been assigned',
order=1
)
State.objects.create(type_id='draft-iana-experts',
slug='expert-issues',
name='Issues identified',
used=True,
desc='Some expert reviewers have identified issues',
order=2
)
State.objects.create(type_id='draft-iana-experts',
slug='reviewers-ok',
name='Expert Reviews OK',
used=True,
desc='All expert reviews have been completed with no blocking issues',
order=2
)
def reverse(apps, schema_editor):
StateType = apps.get_model('doc','StateType')
State = apps.get_model('doc','State')
State.objects.filter(type_id='draft-iana-experts', slug__in=('need-experts','reviews-assigned','reviews-complete')).delete()
StateType.objects.filter(slug='draft-iana-experts').delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0023_one_to_many_docalias'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,24 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.23 on 2019-08-07 12:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('doc', '0024_iana_experts'),
]
operations = [
migrations.CreateModel(
name='IanaExpertDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
],
bases=('doc.docevent',),
),
]

View file

@ -1,24 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
from django.db import migrations
def forward(apps, schema_editor):
State = apps.get_model('doc','State')
State.objects.get_or_create(type_id='draft-rfceditor', slug='tooling-issue', name='TI',
desc='Tooling Issue; an update is needed to one or more of the tools in the publication pipeline before this document can be published')
def reverse(apps, schema_editor):
State = apps.get_model('doc','State')
State.objects.filter(type_id='draft-rfceditor', slug='tooling-issue').delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0025_ianaexpertdocevent'),
]
operations = [
migrations.RunPython(forward,reverse)
]

View file

@ -1,62 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.22 on 2019-08-03 10:09
from django.db import migrations
# forward, reverse initially copied from migration 0004
def forward(apps, schema_editor):
State = apps.get_model('doc','State')
State.objects.create(type_id='draft-stream-irtf',
slug='irsg_review',
name='IRSG Review',
desc='IRSG Review',
used=True,
)
BallotPositionName = apps.get_model('name','BallotPositionName')
# desc, used, order, and blocking all have suitable defaults
BallotPositionName.objects.create(slug="moretime",
name="Need More Time",
)
BallotPositionName.objects.create(slug="notready",
name="Not Ready",
)
# Create a new ballot type for IRSG ballot
# include positions for the ballot type
BallotType = apps.get_model('doc','BallotType')
bt = BallotType.objects.create(doc_type_id="draft",
slug="irsg-approve",
name="IRSG Approve",
question="Is this draft ready for publication in the IRTF stream?",
)
bt.positions.set(['yes','noobj','recuse','notready','moretime'])
def reverse(apps, schema_editor):
State = apps.get_model('doc','State')
State.objects.filter(type_id__in=('draft-stream-irtf',), slug='irsg_review').delete()
Position = apps.get_model('name','BallotPositionName')
for pos in ("moretime", "notready"):
Position.objects.filter(slug=pos).delete()
IRSGBallot = apps.get_model('doc','BallotType')
IRSGBallot.objects.filter(slug="irsg-approve").delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0026_add_draft_rfceditor_state'),
('name', '0007_fix_m2m_slug_id_length'),
]
operations = [
migrations.RunPython(forward,reverse),
migrations.RenameField(
model_name='ballotpositiondocevent',
old_name='ad',
new_name='balloter',
),
]

View file

@ -1,25 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2019-10-10 10:37
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('doc', '0027_add_irsg_doc_positions'),
]
operations = [
migrations.CreateModel(
name='IRSGBallotDocEvent',
fields=[
('ballotdocevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.BallotDocEvent')),
('duedate', models.DateTimeField(blank=True, null=True)),
],
bases=('doc.ballotdocevent',),
),
]

View file

@ -1,21 +0,0 @@
# Copyright The IETF Trust 2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.27 on 2020-01-17 11:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0028_irsgballotdocevent'),
]
operations = [
migrations.AlterField(
model_name='docevent',
name='type',
field=models.CharField(choices=[('new_revision', 'Added new revision'), ('new_submission', 'Uploaded new revision'), ('changed_document', 'Changed document metadata'), ('added_comment', 'Added comment'), ('added_message', 'Added message'), ('edited_authors', 'Edited the documents author list'), ('deleted', 'Deleted document'), ('changed_state', 'Changed state'), ('changed_stream', 'Changed document stream'), ('expired_document', 'Expired document'), ('extended_expiry', 'Extended expiry of document'), ('requested_resurrect', 'Requested resurrect'), ('completed_resurrect', 'Completed resurrect'), ('changed_consensus', 'Changed consensus'), ('published_rfc', 'Published RFC'), ('added_suggested_replaces', 'Added suggested replacement relationships'), ('reviewed_suggested_replaces', 'Reviewed suggested replacement relationships'), ('changed_group', 'Changed group'), ('changed_protocol_writeup', 'Changed protocol writeup'), ('changed_charter_milestone', 'Changed charter milestone'), ('initial_review', 'Set initial review time'), ('changed_review_announcement', 'Changed WG Review text'), ('changed_action_announcement', 'Changed WG Action text'), ('started_iesg_process', 'Started IESG process on document'), ('created_ballot', 'Created ballot'), ('closed_ballot', 'Closed ballot'), ('sent_ballot_announcement', 'Sent ballot announcement'), ('changed_ballot_position', 'Changed ballot position'), ('changed_ballot_approval_text', 'Changed ballot approval text'), ('changed_ballot_writeup_text', 'Changed ballot writeup text'), ('changed_rfc_editor_note_text', 'Changed RFC Editor Note text'), ('changed_last_call_text', 'Changed last call text'), ('requested_last_call', 'Requested last call'), ('sent_last_call', 'Sent last call'), ('scheduled_for_telechat', 'Scheduled for telechat'), ('iesg_approved', 'IESG approved document (no problem)'), ('iesg_disapproved', 'IESG disapproved document (do not publish)'), ('approved_in_minute', 'Approved in minute'), ('iana_review', 'IANA review comment'), ('rfc_in_iana_registry', 'RFC is in IANA registry'), ('rfc_editor_received_announcement', 'Announcement was received by RFC Editor'), ('requested_publication', 'Publication at RFC Editor requested'), ('sync_from_rfc_editor', 'Received updated information from RFC Editor'), ('requested_review', 'Requested review'), ('assigned_review_request', 'Assigned review request'), ('closed_review_request', 'Closed review request'), ('closed_review_assignment', 'Closed review assignment'), ('downref_approved', 'Downref approved'), ('posted_related_ipr', 'Posted related IPR'), ('removed_related_ipr', 'Removed related IPR')], max_length=50),
),
]

View file

@ -1,37 +0,0 @@
# Copyright The IETF Trust 2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-21 14:27
from __future__ import absolute_import, print_function, unicode_literals
import re
from django.conf import settings
from django.db import migrations
def forward(apps, schema_editor):
Document = apps.get_model('doc', 'Document')
print('')
for d in Document.objects.filter(external_url__contains="/b'"):
match = re.search("^(%s/arch/msg/[^/]+/)b'([^']+)'$" % settings.MAILING_LIST_ARCHIVE_URL, d.external_url)
if match:
d.external_url = "%s%s" % (match.group(1), match.group(2))
d.save()
print('Fixed url #%s: %s' % (d.id, d.external_url))
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('doc', '0029_add_ipr_event_types'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,42 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright The IETF Trust 2020, All Rights Reserved
# Generated by Django 1.11.28 on 2020-03-03 13:54
from __future__ import unicode_literals
from django.db import migrations
def forward(apps, schema_editor):
Person = apps.get_model('person', 'Person')
Document = apps.get_model('doc','Document')
State = apps.get_model('doc','State')
BallotDocEvent = apps.get_model('doc','BallotDocEvent')
replaced_state = State.objects.create(type_id='charter', slug='replaced', name='Replaced', used=True, desc="This charter's group was replaced.", order = 0)
by = Person.objects.get(name='(System)')
for doc in Document.objects.filter(type_id='charter',states__type_id='charter',states__slug__in=['intrev','extrev'],group__state='replaced'):
doc.states.remove(*list(doc.states.filter(type_id='charter')))
doc.states.add(replaced_state)
ballot = BallotDocEvent.objects.filter(doc=doc, type__in=('created_ballot', 'closed_ballot')).order_by('-time', '-id').first()
if ballot and ballot.type == 'created_ballot':
e = BallotDocEvent(type="closed_ballot", doc=doc, rev=doc.rev, by=by)
e.ballot_type = ballot.ballot_type
e.desc = 'Closed "%s" ballot' % e.ballot_type.name
e.save()
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('doc', '0030_fix_bytes_mailarch_url'),
('person', '0009_auto_20190118_0725'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,23 +0,0 @@
# Generated by Django 2.1.15 on 2020-06-24 13:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0031_set_state_for_charters_of_replaced_groups'),
]
operations = [
migrations.AlterField(
model_name='ballotpositiondocevent',
name='send_email',
field=models.BooleanField(default=None, null=True),
),
migrations.AlterField(
model_name='consensusdocevent',
name='consensus',
field=models.BooleanField(default=None, null=True),
),
]

View file

@ -1,67 +0,0 @@
# Copyright The IETF Trust 2020, All Rights Reserved
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
from django.db.models import OuterRef, Subquery
from re import match
def forward(apps, schema_editor):
"""Add DocumentURLs for docs in the Auth48 state
Checks the latest StateDocEvent; if it is in the auth48 state and the
event desc has an AUTH48 link, creates an auth48 DocumentURL for that doc.
"""
Document = apps.get_model('doc', 'Document')
StateDocEvent = apps.get_model('doc', 'StateDocEvent')
DocumentURL = apps.get_model('doc', 'DocumentURL')
# Regex - extracts auth48 URL as first match group
pattern = r'RFC Editor state changed to <a href="(.*)"><b>AUTH48.*</b></a>.*'
# To avoid 100k queries, set up a subquery to find the latest StateDocEvent for each doc...
latest_events = StateDocEvent.objects.filter(doc=OuterRef('pk')).order_by('-time', '-id')
# ... then annotate the doc list with that and select only those in the auth48 state...
auth48_docs = Document.objects.annotate(
current_state_slug=Subquery(latest_events.values('state__slug')[:1])
).filter(current_state_slug='auth48')
# ... and add an auth48 DocumentURL if one is found.
for doc in auth48_docs:
# Retrieve the full StateDocEvent. Results in a query per doc, but
# only for the few few in the auth48 state.
sde = StateDocEvent.objects.filter(doc=doc).order_by('-time', '-id').first()
urlmatch = match(pattern, sde.desc) # Auth48 URL is usually in the event desc
if urlmatch is not None:
DocumentURL.objects.create(doc=doc, tag_id='auth48', url=urlmatch[1])
# Validate the migration using a different approach to find auth48 docs.
# This is slower than above, but still avoids querying for every Document.
auth48_events = StateDocEvent.objects.filter(state__slug='auth48')
for a48_event in auth48_events:
doc = a48_event.doc
latest_sde = StateDocEvent.objects.filter(doc=doc).order_by('-time', '-id').first()
if latest_sde.state and latest_sde.state.slug == 'auth48' and match(pattern, latest_sde.desc) is not None:
# Currently in the auth48 state with a URL
assert doc.documenturl_set.filter(tag_id='auth48').count() == 1
else:
# Either no longer in auth48 state or had no URL
assert doc.documenturl_set.filter(tag_id='auth48').count() == 0
def reverse(apps, schema_editor):
"""Remove any auth48 DocumentURLs - these did not exist before"""
DocumentURL = apps.get_model('doc', 'DocumentURL')
DocumentURL.objects.filter(tag_id='auth48').delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0032_auto_20200624_1332'),
('name', '0013_add_auth48_docurltagname'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-04-15 10:20
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('name', '0014_extres'),
('doc', '0033_populate_auth48_urls'),
]
operations = [
migrations.CreateModel(
name='DocExtResource',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('display_name', models.CharField(blank=True, default='', max_length=255)),
('value', models.CharField(max_length=2083)),
('doc', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.ExtResourceName')),
],
),
]

View file

@ -1,125 +0,0 @@
# Copyright The IETF Trust 2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-03-19 13:06
from __future__ import unicode_literals
import re
import debug # pyflakes:ignore
from collections import OrderedDict, Counter
from io import StringIO
from django.db import migrations
from ietf.utils.validators import validate_external_resource_value
from django.core.exceptions import ValidationError
name_map = {
"Issue.*": "tracker",
".*FAQ.*": "faq",
".*Area Web Page": "webpage",
".*Wiki": "wiki",
"Home Page": "webpage",
"Slack.*": "slack",
"Additional .* Web Page": "webpage",
"Additional .* Page": "webpage",
"Yang catalog entry.*": "yc_entry",
"Yang impact analysis.*": "yc_impact",
"GitHub": "github_repo",
"Github page": "github_repo",
"GitHub repo.*": "github_repo",
"Github repository.*": "github_repo",
"GitHub org.*": "github_org",
"GitHub User.*": "github_username",
"GitLab User": "gitlab_username",
"GitLab User Name": "gitlab_username",
}
url_map = OrderedDict({
"https?://github\\.com": "github_repo",
"https://git.sr.ht/": "repo",
"https://todo.sr.ht/": "tracker",
"https?://trac\\.ietf\\.org/.*/wiki": "wiki",
"ietf\\.org.*/trac/wiki": "wiki",
"trac.*wiki": "wiki",
"www\\.ietf\\.org/mailman" : None,
"www\\.ietf\\.org/mail-archive" : None,
"mailarchive\\.ietf\\.org" : None,
"ietf\\.org/logs": "jabber_log",
"ietf\\.org/jabber/logs": "jabber_log",
"xmpp:.*?join": "jabber_room",
"bell-labs\\.com": None,
"html\\.charters": None,
"datatracker\\.ietf\\.org": None,
})
def forward(apps, schema_editor):
DocExtResource = apps.get_model('doc', 'DocExtResource')
ExtResourceName = apps.get_model('name', 'ExtResourceName')
DocumentUrl = apps.get_model('doc', 'DocumentUrl')
stats = Counter()
stats_file = StringIO()
for doc_url in DocumentUrl.objects.all():
doc_url.url = doc_url.url.strip()
match_found = False
for regext,slug in name_map.items():
if re.fullmatch(regext, doc_url.desc):
match_found = True
stats['mapped'] += 1
name = ExtResourceName.objects.get(slug=slug)
try:
validate_external_resource_value(name, doc_url.url)
DocExtResource.objects.create(doc=doc_url.doc, name_id=slug, value=doc_url.url, display_name=doc_url.desc)
except ValidationError as e: # pyflakes:ignore
print("Failed validation:", doc_url.url, e, file=stats_file)
stats['failed_validation'] +=1
break
if not match_found:
for regext, slug in url_map.items():
if re.search(regext, doc_url.url):
match_found = True
if slug:
stats['mapped'] +=1
name = ExtResourceName.objects.get(slug=slug)
# Munge the URL if it's the first github repo match
# Remove "/tree/master" substring if it exists
# Remove trailing "/issues" substring if it exists
# Remove "/blob/master/.*" pattern if present
if regext == "https?://github\\.com":
doc_url.url = doc_url.url.replace("/tree/master","")
doc_url.url = re.sub('/issues$', '', doc_url.url)
doc_url.url = re.sub('/blob/master.*$', '', doc_url.url)
try:
validate_external_resource_value(name, doc_url.url)
DocExtResource.objects.create(doc=doc_url.doc, name=name, value=doc_url.url, display_name=doc_url.desc)
except ValidationError as e: # pyflakes:ignore
print("Failed validation:", doc_url.url, e, file=stats_file)
stats['failed_validation'] +=1
else:
stats['ignored'] +=1
break
if not match_found:
print("Not Mapped:", doc_url.desc, doc_url.tag.slug, doc_url.doc.name, doc_url.url, file=stats_file)
stats['not_mapped'] += 1
print('')
print(stats_file.getvalue())
print (stats)
def reverse(apps, schema_editor):
DocExtResource = apps.get_model('doc', 'DocExtResource')
DocExtResource.objects.all().delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0034_extres'),
('name', '0015_populate_extres'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,34 +0,0 @@
# Copyright The IETF Trust 2020, All Rights Reserved
from urllib.parse import urlparse
from django.db import migrations
def categorize(url):
# This will categorize a few urls pointing into files in a repo as a repo, but that's better than calling them an org
element_count = len(urlparse(url).path.strip('/').split('/'))
if element_count < 1:
print("Bad github resource:",url)
return 'github_org' if element_count == 1 else 'github_repo'
def forward(apps, schema_editor):
DocExtResource = apps.get_model('doc','DocExtResource')
for resource in DocExtResource.objects.filter(name__slug__in=('github_org','github_repo')):
category = categorize(resource.value)
if resource.name_id != category:
resource.name_id = category
resource.save()
def reverse(apps, schema_editor):
# Intentionally don't try to return to former worse state
pass
class Migration(migrations.Migration):
dependencies = [
('doc', '0035_populate_docextresources'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,29 +0,0 @@
# Generated by Django 2.2.16 on 2020-09-22 07:58
from django.db import migrations
def forward(apps, schema_editor):
Document = apps.get_model('doc', 'Document')
DocAlias = apps.get_model('doc', 'DocAlias')
docs_without_alias = Document.objects.filter(docalias__isnull=True)
bad_aliases = DocAlias.objects.filter(name__in=docs_without_alias.values_list('name'))
bad_aliases.delete()
for doc in docs_without_alias:
DocAlias.objects.create(name=doc.name).docs.add(doc)
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('doc', '0036_orgs_vs_repos'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,17 +0,0 @@
# Generated by Django 2.2.17 on 2020-11-09 04:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0037_clean_up_missing_docaliases'),
]
operations = [
migrations.AddIndex(
model_name='docevent',
index=models.Index(fields=['-time', '-id'], name='doc_doceven_time_1a258f_idx'),
),
]

View file

@ -1,21 +0,0 @@
# Generated by Django 2.2.17 on 2020-11-09 04:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0038_auto_20201109_0429'),
]
operations = [
migrations.AddIndex(
model_name='dochistoryauthor',
index=models.Index(fields=['document', 'order'], name='doc_dochist_documen_7e2441_idx'),
),
migrations.AddIndex(
model_name='documentauthor',
index=models.Index(fields=['document', 'order'], name='doc_documen_documen_7fabe2_idx'),
),
]

View file

@ -1,19 +0,0 @@
# Generated by Django 2.2.17 on 2021-01-15 12:50
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('group', '0040_lengthen_used_roles_fields'), # only needed for schema vs data ordering
('doc', '0039_auto_20201109_0439'),
]
operations = [
migrations.AlterField(
model_name='docevent',
name='type',
field=models.CharField(choices=[('new_revision', 'Added new revision'), ('new_submission', 'Uploaded new revision'), ('changed_document', 'Changed document metadata'), ('added_comment', 'Added comment'), ('added_message', 'Added message'), ('edited_authors', 'Edited the documents author list'), ('deleted', 'Deleted document'), ('changed_state', 'Changed state'), ('changed_stream', 'Changed document stream'), ('expired_document', 'Expired document'), ('extended_expiry', 'Extended expiry of document'), ('requested_resurrect', 'Requested resurrect'), ('completed_resurrect', 'Completed resurrect'), ('changed_consensus', 'Changed consensus'), ('published_rfc', 'Published RFC'), ('added_suggested_replaces', 'Added suggested replacement relationships'), ('reviewed_suggested_replaces', 'Reviewed suggested replacement relationships'), ('changed_action_holders', 'Changed action holders for document'), ('changed_group', 'Changed group'), ('changed_protocol_writeup', 'Changed protocol writeup'), ('changed_charter_milestone', 'Changed charter milestone'), ('initial_review', 'Set initial review time'), ('changed_review_announcement', 'Changed WG Review text'), ('changed_action_announcement', 'Changed WG Action text'), ('started_iesg_process', 'Started IESG process on document'), ('created_ballot', 'Created ballot'), ('closed_ballot', 'Closed ballot'), ('sent_ballot_announcement', 'Sent ballot announcement'), ('changed_ballot_position', 'Changed ballot position'), ('changed_ballot_approval_text', 'Changed ballot approval text'), ('changed_ballot_writeup_text', 'Changed ballot writeup text'), ('changed_rfc_editor_note_text', 'Changed RFC Editor Note text'), ('changed_last_call_text', 'Changed last call text'), ('requested_last_call', 'Requested last call'), ('sent_last_call', 'Sent last call'), ('scheduled_for_telechat', 'Scheduled for telechat'), ('iesg_approved', 'IESG approved document (no problem)'), ('iesg_disapproved', 'IESG disapproved document (do not publish)'), ('approved_in_minute', 'Approved in minute'), ('iana_review', 'IANA review comment'), ('rfc_in_iana_registry', 'RFC is in IANA registry'), ('rfc_editor_received_announcement', 'Announcement was received by RFC Editor'), ('requested_publication', 'Publication at RFC Editor requested'), ('sync_from_rfc_editor', 'Received updated information from RFC Editor'), ('requested_review', 'Requested review'), ('assigned_review_request', 'Assigned review request'), ('closed_review_request', 'Closed review request'), ('closed_review_assignment', 'Closed review assignment'), ('downref_approved', 'Downref approved'), ('posted_related_ipr', 'Posted related IPR'), ('removed_related_ipr', 'Removed related IPR')], max_length=50),
),
]

View file

@ -1,35 +0,0 @@
# Generated by Django 2.2.17 on 2021-01-15 12:50
import datetime
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('person', '0018_auto_20201109_0439'),
('doc', '0040_add_changed_action_holders_docevent_type'),
]
operations = [
migrations.CreateModel(
name='DocumentActionHolder',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time_added', models.DateTimeField(default=datetime.datetime.now)),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
('person', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
],
),
migrations.AddField(
model_name='document',
name='action_holders',
field=models.ManyToManyField(blank=True, through='doc.DocumentActionHolder', to='person.Person'),
),
migrations.AddConstraint(
model_name='documentactionholder',
constraint=models.UniqueConstraint(fields=('document', 'person'), name='unique_action_holder'),
),
]

View file

@ -1,36 +0,0 @@
# Copyright The IETF Trust 2021 All Rights Reserved
# Generated by Django 2.2.23 on 2021-05-21 13:29
from django.db import migrations
def forward(apps, schema_editor):
StateType = apps.get_model('doc', 'StateType')
State = apps.get_model('doc', 'State')
StateType.objects.create(slug='bofreq', label='BOF Request State')
proposed = State.objects.create(type_id='bofreq', slug='proposed', name='Proposed', used=True, desc='The BOF request is proposed', order=0)
approved = State.objects.create(type_id='bofreq', slug='approved', name='Approved', used=True, desc='The BOF request is approved', order=1)
declined = State.objects.create(type_id='bofreq', slug='declined', name='Declined', used=True, desc='The BOF request is declined', order=2)
replaced = State.objects.create(type_id='bofreq', slug='replaced', name='Replaced', used=True, desc='The BOF request is proposed', order=3)
abandoned = State.objects.create(type_id='bofreq', slug='abandoned', name='Abandoned', used=True, desc='The BOF request is abandoned', order=4)
proposed.next_states.set([approved,declined,replaced,abandoned])
def reverse(apps, schema_editor):
StateType = apps.get_model('doc', 'StateType')
State = apps.get_model('doc', 'State')
State.objects.filter(type_id='bofreq').delete()
StateType.objects.filter(slug='bofreq').delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0041_add_documentactionholder'),
('name', '0027_add_bofrequest'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,36 +0,0 @@
# Generated by Django 2.2.24 on 2021-07-06 13:34
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('person', '0019_auto_20210604_1443'),
('doc', '0042_bofreq_states'),
]
operations = [
migrations.AlterField(
model_name='docevent',
name='type',
field=models.CharField(choices=[('new_revision', 'Added new revision'), ('new_submission', 'Uploaded new revision'), ('changed_document', 'Changed document metadata'), ('added_comment', 'Added comment'), ('added_message', 'Added message'), ('edited_authors', 'Edited the documents author list'), ('deleted', 'Deleted document'), ('changed_state', 'Changed state'), ('changed_stream', 'Changed document stream'), ('expired_document', 'Expired document'), ('extended_expiry', 'Extended expiry of document'), ('requested_resurrect', 'Requested resurrect'), ('completed_resurrect', 'Completed resurrect'), ('changed_consensus', 'Changed consensus'), ('published_rfc', 'Published RFC'), ('added_suggested_replaces', 'Added suggested replacement relationships'), ('reviewed_suggested_replaces', 'Reviewed suggested replacement relationships'), ('changed_action_holders', 'Changed action holders for document'), ('changed_group', 'Changed group'), ('changed_protocol_writeup', 'Changed protocol writeup'), ('changed_charter_milestone', 'Changed charter milestone'), ('initial_review', 'Set initial review time'), ('changed_review_announcement', 'Changed WG Review text'), ('changed_action_announcement', 'Changed WG Action text'), ('started_iesg_process', 'Started IESG process on document'), ('created_ballot', 'Created ballot'), ('closed_ballot', 'Closed ballot'), ('sent_ballot_announcement', 'Sent ballot announcement'), ('changed_ballot_position', 'Changed ballot position'), ('changed_ballot_approval_text', 'Changed ballot approval text'), ('changed_ballot_writeup_text', 'Changed ballot writeup text'), ('changed_rfc_editor_note_text', 'Changed RFC Editor Note text'), ('changed_last_call_text', 'Changed last call text'), ('requested_last_call', 'Requested last call'), ('sent_last_call', 'Sent last call'), ('scheduled_for_telechat', 'Scheduled for telechat'), ('iesg_approved', 'IESG approved document (no problem)'), ('iesg_disapproved', 'IESG disapproved document (do not publish)'), ('approved_in_minute', 'Approved in minute'), ('iana_review', 'IANA review comment'), ('rfc_in_iana_registry', 'RFC is in IANA registry'), ('rfc_editor_received_announcement', 'Announcement was received by RFC Editor'), ('requested_publication', 'Publication at RFC Editor requested'), ('sync_from_rfc_editor', 'Received updated information from RFC Editor'), ('requested_review', 'Requested review'), ('assigned_review_request', 'Assigned review request'), ('closed_review_request', 'Closed review request'), ('closed_review_assignment', 'Closed review assignment'), ('downref_approved', 'Downref approved'), ('posted_related_ipr', 'Posted related IPR'), ('removed_related_ipr', 'Removed related IPR'), ('changed_editors', 'Changed BOF Request editors')], max_length=50),
),
migrations.CreateModel(
name='BofreqResponsibleDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
('responsible', models.ManyToManyField(blank=True, to='person.Person')),
],
bases=('doc.docevent',),
),
migrations.CreateModel(
name='BofreqEditorDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
('editors', models.ManyToManyField(blank=True, to='person.Person')),
],
bases=('doc.docevent',),
),
]

View file

@ -1,34 +0,0 @@
# Copyright The IETF Trust 2021 All Rights Reserved
# Generated by Django 2.2.23 on 2021-05-21 13:29
from django.db import migrations
def forward(apps, schema_editor):
StateType = apps.get_model('doc', 'StateType')
State = apps.get_model('doc', 'State')
StateType.objects.create(slug='procmaterials', label='Proceedings Materials State')
active = State.objects.create(type_id='procmaterials', slug='active', name='Active', used=True, desc='The material is active', order=0)
removed = State.objects.create(type_id='procmaterials', slug='removed', name='Removed', used=True, desc='The material is removed', order=1)
active.next_states.set([removed])
removed.next_states.set([active])
def reverse(apps, schema_editor):
StateType = apps.get_model('doc', 'StateType')
State = apps.get_model('doc', 'State')
State.objects.filter(type_id='procmaterials').delete()
StateType.objects.filter(slug='procmaterials').delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0043_bofreq_docevents'),
('name', '0031_add_procmaterials'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,34 +0,0 @@
# Copyright The IETF Trust 2022, All Rights Reserved
from django.db import migrations
def forward(apps, schema_editor):
StateType = apps.get_model("doc", "StateType")
State = apps.get_model("doc", "State")
for slug in ("chatlog", "polls"):
StateType.objects.create(slug=slug, label="State")
for state_slug in ("active", "deleted"):
State.objects.create(
type_id = slug,
slug = state_slug,
name = state_slug.capitalize(),
used = True,
desc = "",
order = 0,
)
def reverse(apps, schema_editor):
StateType = apps.get_model("doc", "StateType")
State = apps.get_model("doc", "State")
State.objects.filter(type_id__in=("chatlog", "polls")).delete()
StateType.objects.filter(slug__in=("chatlog", "polls")).delete()
class Migration(migrations.Migration):
dependencies = [
('doc', '0044_procmaterials_states'),
('name', '0045_polls_and_chatlogs'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,39 +0,0 @@
# Generated by Django 2.2.28 on 2022-07-12 11:24
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('doc', '0045_docstates_chatlogs_polls'),
]
operations = [
migrations.AlterField(
model_name='deletedevent',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='docevent',
name='time',
field=models.DateTimeField(db_index=True, default=django.utils.timezone.now, help_text='When the event happened'),
),
migrations.AlterField(
model_name='dochistory',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='document',
name='time',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='documentactionholder',
name='time_added',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View file

@ -1,61 +0,0 @@
# Generated by Django 2.2.28 on 2022-08-31 20:26
import datetime
import json
from zoneinfo import ZoneInfo
from django.db import migrations
TZ_BEFORE = ZoneInfo('PST8PDT')
def forward(apps, schema_editor):
DeletedEvent = apps.get_model('doc', 'DeletedEvent')
for deleted_event in DeletedEvent.objects.all():
fields = json.loads(deleted_event.json)
replacements = {}
for k, v in fields.items():
if isinstance(v, str):
try:
dt = datetime.datetime.strptime(v, '%Y-%m-%d %H:%M:%S')
except:
pass
else:
replacements[k] = dt.replace(tzinfo=TZ_BEFORE).astimezone(datetime.timezone.utc).isoformat()
if len(replacements) > 0:
fields.update(replacements)
deleted_event.json = json.dumps(fields)
deleted_event.save()
def reverse(apps, schema_editor):
DeletedEvent = apps.get_model('doc', 'DeletedEvent')
for deleted_event in DeletedEvent.objects.all():
fields = json.loads(deleted_event.json)
replacements = {}
for k, v in fields.items():
if isinstance(v, str) and 'T' in v:
try:
dt = datetime.datetime.fromisoformat(v)
except:
pass
else:
replacements[k] = dt.astimezone(TZ_BEFORE).replace(tzinfo=None).strftime('%Y-%m-%d %H:%M:%S')
if len(replacements) > 0:
fields.update(replacements)
deleted_event.json = json.dumps(fields)
deleted_event.save()
class Migration(migrations.Migration):
dependencies = [
('doc', '0046_use_timezone_now_for_doc_models'),
('utils', '0003_pause_to_change_use_tz'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,23 +0,0 @@
# Generated by Django 2.2.28 on 2022-12-05 17:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0047_tzaware_deletedevents'),
]
operations = [
migrations.AlterField(
model_name='dochistory',
name='notify',
field=models.TextField(blank=True, max_length=1023),
),
migrations.AlterField(
model_name='document',
name='notify',
field=models.TextField(blank=True, max_length=1023),
),
]

View file

@ -1,51 +0,0 @@
# Copyright The IETF Trust 2022, All Rights Reserved
# -*- coding: utf-8 -*-
from django.db import migrations
def forward(apps, schema_editor):
State = apps.get_model("doc", "State")
State.objects.create(
type_id="draft-stream-editorial",
slug="rsab_review",
name="RSAB Review",
desc="RSAB Review",
used=True,
)
BallotPositionName = apps.get_model("name", "BallotPositionName")
BallotPositionName.objects.create(slug="concern", name="Concern", blocking=True)
BallotType = apps.get_model("doc", "BallotType")
bt = BallotType.objects.create(
doc_type_id="draft",
slug="rsab-approve",
name="RSAB Approve",
question="Is this draft ready for publication in the Editorial stream?",
)
bt.positions.set(
["yes", "concern", "recuse"]
) # See RFC9280 section 3.2.2 list item 9.
def reverse(apps, schema_editor):
State = apps.get_model("doc", "State")
State.objects.filter(type_id="draft-stream-editorial", slug="rsab_review").delete()
Position = apps.get_model("name", "BallotPositionName")
Position.objects.filter(slug="concern").delete()
BallotType = apps.get_model("doc", "BallotType")
BallotType.objects.filter(slug="irsg-approve").delete()
class Migration(migrations.Migration):
dependencies = [
("doc", "0048_allow_longer_notify"),
("name", "0045_polls_and_chatlogs"),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,43 +0,0 @@
# Copyright The IETF Trust 2022, All Rights Reserved
from django.db import migrations
def forward(apps, schema_editor):
State = apps.get_model("doc", "State")
StateType = apps.get_model("doc", "StateType")
StateType.objects.create(
slug="draft-stream-editorial", label="Editorial stream state"
)
for slug, name, order in (
("repl", "Replaced editorial stream document", 0),
("active", "Active editorial stream document", 2),
("rsabpoll", "Editorial stream document under RSAB review", 3),
("pub", "Published RFC", 4),
("dead", "Dead editorial stream document", 5),
):
State.objects.create(
type_id="draft-stream-editorial",
slug=slug,
name=name,
order=order,
used=True,
)
State.objects.filter(type_id="draft-stream-editorial", slug="rsab_review").delete()
def reverse(apps, schema_editor):
State = apps.get_model("doc", "State")
StateType = apps.get_model("doc", "StateType")
State.objects.filter(type_id="draft-stream-editorial").delete()
StateType.objects.filter(slug="draft-stream-editorial").delete()
# Intentionally not trying to return broken rsab_review State object
class Migration(migrations.Migration):
dependencies = [
("doc", "0049_add_rsab_doc_positions"),
]
operations = [migrations.RunPython(forward, reverse)]

View file

@ -6,6 +6,8 @@ import datetime
import logging
import io
import os
import django.db
import rfc2html
from pathlib import Path
@ -56,7 +58,13 @@ class StateType(models.Model):
@checks.register('db-consistency')
def check_statetype_slugs(app_configs, **kwargs):
errors = []
try:
state_type_slugs = [ t.slug for t in StateType.objects.all() ]
except django.db.ProgrammingError:
# When running initial migrations on an empty DB, attempting to retrieve StateType will raise a
# ProgrammingError. Until Django 3, there is no option to skip the checks.
return []
else:
for type in DocTypeName.objects.all():
if not type.slug in state_type_slugs:
errors.append(checks.Error(

View file

@ -8,20 +8,16 @@ from ietf.name.models import GroupTypeName
register = template.Library()
parents = GroupTypeName.objects.filter(
slug__in=["ag", "area", "rag", "team", "dir", "program"]
)
@register.simple_tag
def active_groups_menu(flavor):
parents = GroupTypeName.objects.filter(slug__in=["ag", "area", "rag", "team", "dir", "program"])
others = []
for group in Group.objects.filter(acronym__in=("rsoc",), state_id="active"):
group.menu_url = reverse("ietf.group.views.group_home", kwargs=dict(acronym=group.acronym)) # type: ignore
# could use group.about_url() instead
others.append(group)
@register.simple_tag
def active_groups_menu(flavor):
global parents, others
for p in parents:
p.menu_url = "/%s/" % p.slug
return render_to_string(

View file

@ -1,12 +1,13 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.10 on 2018-02-20 10:52
# Generated by Django 2.2.28 on 2023-03-20 19:22
import datetime
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import ietf.name.models
import ietf.utils.db
import ietf.utils.models
import ietf.utils.validators
import jsonfield.fields
class Migration(migrations.Migration):
@ -24,13 +25,16 @@ class Migration(migrations.Migration):
name='Group',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(default=datetime.datetime.now)),
('time', models.DateTimeField(default=django.utils.timezone.now)),
('name', models.CharField(max_length=80)),
('description', models.TextField(blank=True)),
('list_email', models.CharField(blank=True, max_length=64)),
('list_subscribe', models.CharField(blank=True, max_length=255)),
('list_archive', models.CharField(blank=True, max_length=255)),
('comments', models.TextField(blank=True)),
('meeting_seen_as_area', models.BooleanField(default=False, help_text='For meeting scheduling, should be considered an area meeting, even if the type is WG')),
('used_roles', jsonfield.fields.JSONField(blank=True, default=[], help_text="Leave an empty list to get the group_type's default used roles", max_length=256)),
('uses_milestone_dates', models.BooleanField(default=True)),
('acronym', models.SlugField(max_length=40, unique=True)),
('charter', ietf.utils.models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chartered_group', to='doc.Document')),
('parent', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
@ -47,9 +51,11 @@ class Migration(migrations.Migration):
name='GroupEvent',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(default=datetime.datetime.now, help_text='When the event happened')),
('time', models.DateTimeField(default=django.utils.timezone.now, help_text='When the event happened')),
('type', models.CharField(choices=[('changed_state', 'Changed state'), ('added_comment', 'Added comment'), ('info_changed', 'Changed metadata'), ('requested_close', 'Requested closing group'), ('changed_milestone', 'Changed milestone'), ('sent_notification', 'Sent notification'), ('status_update', 'Status update')], max_length=50)),
('desc', models.TextField()),
('by', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
],
options={
'ordering': ['-time', 'id'],
@ -59,13 +65,16 @@ class Migration(migrations.Migration):
name='GroupHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.DateTimeField(default=datetime.datetime.now)),
('time', models.DateTimeField(default=django.utils.timezone.now)),
('name', models.CharField(max_length=80)),
('description', models.TextField(blank=True)),
('list_email', models.CharField(blank=True, max_length=64)),
('list_subscribe', models.CharField(blank=True, max_length=255)),
('list_archive', models.CharField(blank=True, max_length=255)),
('comments', models.TextField(blank=True)),
('meeting_seen_as_area', models.BooleanField(default=False, help_text='For meeting scheduling, should be considered an area meeting, even if the type is WG')),
('used_roles', jsonfield.fields.JSONField(blank=True, default=[], help_text="Leave an empty list to get the group_type's default used roles", max_length=256)),
('uses_milestone_dates', models.BooleanField(default=True)),
('acronym', models.CharField(max_length=40)),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='history_set', to='group.Group')),
('parent', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
@ -83,7 +92,8 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('desc', models.CharField(max_length=500, verbose_name='Description')),
('due', models.DateField()),
('due', models.DateField(blank=True, null=True)),
('order', models.IntegerField(blank=True, null=True)),
('resolved', models.CharField(blank=True, help_text='Explanation of why milestone is resolved (usually "Done"), or empty if still due.', max_length=50)),
('time', models.DateTimeField(auto_now=True)),
('docs', models.ManyToManyField(blank=True, to='doc.Document')),
@ -91,58 +101,16 @@ class Migration(migrations.Migration):
('state', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.GroupMilestoneStateName')),
],
options={
'ordering': ['due', 'id'],
'ordering': ['order', 'due', 'id'],
'abstract': False,
},
),
migrations.CreateModel(
name='GroupMilestoneHistory',
name='ChangeStateGroupEvent',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('desc', models.CharField(max_length=500, verbose_name='Description')),
('due', models.DateField()),
('resolved', models.CharField(blank=True, help_text='Explanation of why milestone is resolved (usually "Done"), or empty if still due.', max_length=50)),
('time', models.DateTimeField()),
('docs', models.ManyToManyField(blank=True, to='doc.Document')),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
('milestone', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='history_set', to='group.GroupMilestone')),
('state', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.GroupMilestoneStateName')),
('groupevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='group.GroupEvent')),
],
options={
'ordering': ['due', 'id'],
'abstract': False,
},
),
migrations.CreateModel(
name='GroupStateTransitions',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
('next_states', models.ManyToManyField(related_name='previous_groupstatetransitions_states', to='doc.State')),
('state', ietf.utils.models.ForeignKey(help_text='State for which the next states should be overridden', on_delete=django.db.models.deletion.CASCADE, to='doc.State')),
],
),
migrations.CreateModel(
name='GroupURL',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('url', models.URLField()),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
],
),
migrations.CreateModel(
name='Role',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', ietf.utils.models.ForeignKey(help_text='Email address used by person for this role.', on_delete=django.db.models.deletion.CASCADE, to='person.Email')),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
('name', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.RoleName')),
('person', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
],
options={
'ordering': ['name_id'],
},
bases=('group.groupevent',),
),
migrations.CreateModel(
name='RoleHistory',
@ -158,12 +126,101 @@ class Migration(migrations.Migration):
},
),
migrations.CreateModel(
name='ChangeStateGroupEvent',
name='Role',
fields=[
('groupevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='group.GroupEvent')),
('state', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.GroupStateName')),
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('email', ietf.utils.models.ForeignKey(help_text='Email address used by person for this role.', on_delete=django.db.models.deletion.CASCADE, to='person.Email')),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
('name', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.RoleName')),
('person', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
],
options={
'ordering': ['name_id'],
},
),
migrations.CreateModel(
name='GroupURL',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('url', models.URLField()),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
],
),
migrations.CreateModel(
name='GroupStateTransitions',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
('next_states', models.ManyToManyField(related_name='previous_groupstatetransitions_states', to='doc.State')),
('state', ietf.utils.models.ForeignKey(help_text='State for which the next states should be overridden', on_delete=django.db.models.deletion.CASCADE, to='doc.State')),
],
),
migrations.CreateModel(
name='GroupMilestoneHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('desc', models.CharField(max_length=500, verbose_name='Description')),
('due', models.DateField(blank=True, null=True)),
('order', models.IntegerField(blank=True, null=True)),
('resolved', models.CharField(blank=True, help_text='Explanation of why milestone is resolved (usually "Done"), or empty if still due.', max_length=50)),
('time', models.DateTimeField()),
('docs', models.ManyToManyField(blank=True, to='doc.Document')),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
('milestone', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='history_set', to='group.GroupMilestone')),
('state', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.GroupMilestoneStateName')),
],
options={
'ordering': ['order', 'due', 'id'],
'abstract': False,
},
),
migrations.CreateModel(
name='GroupFeatures',
fields=[
('type', ietf.utils.models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='features', serialize=False, to='name.GroupTypeName')),
('need_parent', models.BooleanField(default=False, help_text='Does this group type require a parent group?', verbose_name='Need Parent')),
('default_parent', models.CharField(blank=True, default='', help_text='Default parent group acronym for this group type', max_length=40, verbose_name='Default Parent')),
('has_milestones', models.BooleanField(default=False, verbose_name='Milestones')),
('has_chartering_process', models.BooleanField(default=False, verbose_name='Chartering')),
('has_documents', models.BooleanField(default=False, verbose_name='Documents')),
('has_session_materials', models.BooleanField(default=False, verbose_name='Sess Matrl.')),
('has_nonsession_materials', models.BooleanField(default=False, verbose_name='Other Matrl.')),
('has_meetings', models.BooleanField(default=False, verbose_name='Meetings')),
('has_reviews', models.BooleanField(default=False, verbose_name='Reviews')),
('has_default_chat', models.BooleanField(default=False, verbose_name='Chat')),
('acts_like_wg', models.BooleanField(default=False, verbose_name='WG-Like')),
('create_wiki', models.BooleanField(default=False, verbose_name='Wiki')),
('custom_group_roles', models.BooleanField(default=False, verbose_name='Cust. Roles')),
('customize_workflow', models.BooleanField(default=False, verbose_name='Workflow')),
('is_schedulable', models.BooleanField(default=False, verbose_name='Schedulable')),
('show_on_agenda', models.BooleanField(default=False, verbose_name='On Agenda')),
('req_subm_approval', models.BooleanField(default=False, verbose_name='Subm. Approval')),
('about_page', models.CharField(default='ietf.group.views.group_about', max_length=64)),
('default_tab', models.CharField(default='ietf.group.views.group_about', max_length=64)),
('material_types', ietf.utils.db.IETFJSONField(default=['slides'], max_length=64)),
('default_used_roles', ietf.utils.db.IETFJSONField(default=[], max_length=256)),
('admin_roles', ietf.utils.db.IETFJSONField(default=['chair'], max_length=64)),
('docman_roles', ietf.utils.db.IETFJSONField(default=['ad', 'chair', 'delegate', 'secr'], max_length=128)),
('groupman_roles', ietf.utils.db.IETFJSONField(default=['ad', 'chair'], max_length=128)),
('groupman_authroles', ietf.utils.db.IETFJSONField(default=['Secretariat'], max_length=128)),
('matman_roles', ietf.utils.db.IETFJSONField(default=['ad', 'chair', 'delegate', 'secr'], max_length=128)),
('role_order', ietf.utils.db.IETFJSONField(default=['chair', 'secr', 'member'], help_text='The order in which roles are shown, for instance on photo pages. Enter valid JSON.', max_length=128)),
('session_purposes', ietf.utils.db.IETFJSONField(default=[], help_text='Allowed session purposes for this group type', max_length=256, validators=[ietf.utils.validators.JSONForeignKeyListValidator(ietf.name.models.SessionPurposeName)])),
('agenda_filter_type', models.ForeignKey(default='none', on_delete=django.db.models.deletion.PROTECT, to='name.AgendaFilterTypeName')),
('agenda_type', models.ForeignKey(default='ietf', null=True, on_delete=django.db.models.deletion.CASCADE, to='name.AgendaTypeName')),
('parent_types', models.ManyToManyField(blank=True, help_text='Group types allowed as parent of this group type', related_name='child_features', to='name.GroupTypeName')),
],
),
migrations.CreateModel(
name='GroupExtResource',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('display_name', models.CharField(blank=True, default='', max_length=255)),
('value', models.CharField(max_length=2083)),
('group', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group')),
('name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.ExtResourceName')),
],
bases=('group.groupevent',),
),
migrations.CreateModel(
name='MilestoneGroupEvent',
@ -173,14 +230,13 @@ class Migration(migrations.Migration):
],
bases=('group.groupevent',),
),
migrations.AddField(
migrations.AddIndex(
model_name='groupevent',
name='by',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Person'),
index=models.Index(fields=['-time', '-id'], name='group_group_time_ee7c7c_idx'),
),
migrations.AddField(
model_name='groupevent',
name='group',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.Group'),
model_name='changestategroupevent',
name='state',
field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.GroupStateName'),
),
]

View file

@ -1,77 +0,0 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.13 on 2018-07-10 15:58
import django.core.validators
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
import debug # pyflakes:ignore
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('name', '0002_agendatypename'),
('group', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='GroupFeatures',
fields=[
('type', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='name.GroupTypeName', related_name='features')),
('has_milestones', models.BooleanField(default=False, verbose_name='Milestones')),
('has_chartering_process', models.BooleanField(default=False, verbose_name='Chartering')),
('has_documents', models.BooleanField(default=False, verbose_name='Documents')),
('has_dependencies', models.BooleanField(default=False, verbose_name='Dependencies')),
('has_nonsession_materials', models.BooleanField(default=False, verbose_name='Materials')),
('has_meetings', models.BooleanField(default=False, verbose_name='Meetings')),
('has_reviews', models.BooleanField(default=False, verbose_name='Reviews')),
('has_default_jabber', models.BooleanField(default=False, verbose_name='Jabber')),
('customize_workflow', models.BooleanField(default=False, verbose_name='Workflow')),
('about_page', models.CharField(default='ietf.group.views.group_about', max_length=64)),
('default_tab', models.CharField(default='ietf.group.views.group_about', max_length=64)),
('material_types', models.CharField(default='slides', max_length=64, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of material types', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')])),
# type: ignore
('admin_roles', models.CharField(default='chair', max_length=64, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of role slugs', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')])),
('agenda_type', models.ForeignKey(default='ietf', null=True, on_delete=django.db.models.deletion.CASCADE, to='name.AgendaTypeName')),
],
),
migrations.CreateModel(
name='HistoricalGroupFeatures',
fields=[
('has_milestones', models.BooleanField(default=False, verbose_name='Milestones')),
('has_chartering_process', models.BooleanField(default=False, verbose_name='Chartering')),
('has_documents', models.BooleanField(default=False, verbose_name='Documents')),
('has_dependencies', models.BooleanField(default=False, verbose_name='Dependencies')),
('has_nonsession_materials', models.BooleanField(default=False, verbose_name='Materials')),
('has_meetings', models.BooleanField(default=False, verbose_name='Meetings')),
('has_reviews', models.BooleanField(default=False, verbose_name='Reviews')),
('has_default_jabber', models.BooleanField(default=False, verbose_name='Jabber')),
('customize_workflow', models.BooleanField(default=False, verbose_name='Workflow')),
('about_page', models.CharField(default='ietf.group.views.group_about', max_length=64)),
('default_tab', models.CharField(default='ietf.group.views.group_about', max_length=64)),
('material_types', models.CharField(default='slides', max_length=64, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of material types', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')])),
('admin_roles', models.CharField(default='chair', max_length=64, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of role slugs', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')])),
('history_id', models.AutoField(primary_key=True, serialize=False)),
('history_change_reason', models.CharField(max_length=100, null=True)),
('history_date', models.DateTimeField()),
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
('agenda_type', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='name.AgendaTypeName')),
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
('type', ietf.utils.models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='name.GroupTypeName')),
],
options={
'ordering': ('-history_date', '-history_id'),
'get_latest_by': 'history_date',
'verbose_name': 'historical group features',
},
),
]

View file

@ -1,299 +0,0 @@
# Copyright The IETF Trust 2018-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.13 on 2018-07-10 15:58
from django.conf import settings
from django.db import migrations
import debug # pyflakes:ignore
from ietf.review.utils import active_review_teams
group_type_features = {
'ag': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': True,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'area': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'dir': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair,secr',
'agenda_type': None,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'review': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair,secr',
'agenda_type': None,
'customize_workflow': False,
'default_tab': 'ietf.group.views.review_requests',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': True,
'material_types': 'slides'},
'iab': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': True,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'ietf': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': True,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'individ': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': None,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'irtf': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'isoc': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': None,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'nomcom': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'side',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'program': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'lead',
'agenda_type': None,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': True,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': True,
'has_reviews': False,
'material_types': 'slides'},
'rfcedtyp': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'side',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'rg': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': True,
'default_tab': 'ietf.group.views.group_documents',
'has_chartering_process': True,
'has_default_jabber': True,
'has_dependencies': True,
'has_documents': True,
'has_meetings': True,
'has_nonsession_materials': False,
'has_milestones': True,
'has_reviews': False,
'material_types': 'slides'},
'sdo': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': None,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': False,
'has_nonsession_materials': False,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'team': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'has_chartering_process': False,
'has_default_jabber': False,
'has_dependencies': False,
'has_documents': False,
'has_meetings': True,
'has_nonsession_materials': True,
'has_milestones': False,
'has_reviews': False,
'material_types': 'slides'},
'wg': {
'about_page': 'ietf.group.views.group_about',
'admin_roles': 'chair',
'agenda_type': 'ietf',
'customize_workflow': True,
'default_tab': 'ietf.group.views.group_documents',
'has_chartering_process': True,
'has_default_jabber': True,
'has_dependencies': True,
'has_documents': True,
'has_meetings': True,
'has_nonsession_materials': False,
'has_milestones': True,
'has_reviews': False,
'material_types': 'slides'},
}
def forward(apps, schema_editor):
Group = apps.get_model('group', 'Group')
GroupTypeName = apps.get_model('name', 'GroupTypeName')
GroupFeatures = apps.get_model('group', 'GroupFeatures')
AgendaTypeName = apps.get_model('name', 'AgendaTypeName')
for type in group_type_features:
features = group_type_features[type]
features['type_id'] = type
if features['agenda_type']:
features['agenda_type'] = AgendaTypeName.objects.get(slug=features['agenda_type'])
GroupFeatures.objects.create(**features)
dir = GroupTypeName.objects.get(slug='dir')
review = GroupTypeName.objects.create(slug='review', name='Directorate (with reviews)', desc='', used=True, order=0)
review_teams = [ g.acronym for g in active_review_teams() ]
for group in Group.objects.filter(type=dir):
if group.acronym in review_teams:
group.type = review
group.save()
def reverse(apps, schema_editor):
Group = apps.get_model('group', 'Group')
GroupFeatures = apps.get_model('group', 'GroupFeatures')
GroupTypeName = apps.get_model('name', 'GroupTypeName')
dir = GroupTypeName.objects.get(slug='dir')
review = GroupTypeName.objects.get(slug='review')
for group in Group.objects.filter(type=review):
group.type = dir
group.save()
for entry in GroupFeatures.objects.all():
entry.delete()
review.delete()
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('group', '0002_groupfeatures_historicalgroupfeatures'),
('name', '0003_agendatypename_data'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,111 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2019-01-10 07:51
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('group', '0003_groupfeatures_data'),
]
operations = [
migrations.AddField(
model_name='groupfeatures',
name='acts_like_wg',
field=models.BooleanField(default=False, verbose_name='WG-Like'),
),
migrations.AddField(
model_name='groupfeatures',
name='create_wiki',
field=models.BooleanField(default=False, verbose_name='Wiki'),
),
migrations.AddField(
model_name='groupfeatures',
name='custom_group_roles',
field=models.BooleanField(default=False, verbose_name='Group Roles'),
),
migrations.AddField(
model_name='groupfeatures',
name='has_session_materials',
field=models.BooleanField(default=False, verbose_name='Materials'),
),
migrations.AddField(
model_name='groupfeatures',
name='is_schedulable',
field=models.BooleanField(default=False, verbose_name='Schedulable'),
),
migrations.AddField(
model_name='groupfeatures',
name='role_order',
field=models.CharField(default='chair,secr,member', help_text='The order in which roles are shown, for instance on photo pages', max_length=128, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of role slugs', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')]),
# type: ignore
),
migrations.AddField(
model_name='groupfeatures',
name='show_on_agenda',
field=models.BooleanField(default=False, verbose_name='On Agenda'),
),
migrations.AddField(
model_name='groupfeatures',
name='req_subm_approval',
field=models.BooleanField(default=False, verbose_name='Subm. Approval'),
),
migrations.AddField(
model_name='groupfeatures',
name='matman_roles',
field=models.CharField(default='ad,chair,delegate,secr', max_length=64, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of role slugs', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')]),
# type: ignore
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='acts_like_wg',
field=models.BooleanField(default=False, verbose_name='WG-Like'),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='create_wiki',
field=models.BooleanField(default=False, verbose_name='Wiki'),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='custom_group_roles',
field=models.BooleanField(default=False, verbose_name='Group Roles'),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='has_session_materials',
field=models.BooleanField(default=False, verbose_name='Materials'),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='is_schedulable',
field=models.BooleanField(default=False, verbose_name='Schedulable'),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='role_order',
field=models.CharField(default='chair,secr,member', help_text='The order in which roles are shown, for instance on photo pages', max_length=128, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of role slugs', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')]),
# type: ignore
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='show_on_agenda',
field=models.BooleanField(default=False, verbose_name='On Agenda'),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='req_subm_approval',
field=models.BooleanField(default=False, verbose_name='Subm. Approval'),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='matman_roles',
field=models.CharField(default='ad,chair,delegate,secr', max_length=64, validators=[django.core.validators.RegexValidator(code=b'invalid', message=b'Enter a comma-separated list of role slugs', regex=b'[a-z0-9_-]+(,[a-z0-9_-]+)*')]),
# type: ignore
),
]

View file

@ -1,49 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2019-01-09 09:02
import json
import re
from django.db import migrations
import debug # pyflakes:ignore
def forward(apps, schema_editor):
GroupFeatures = apps.get_model('group', 'GroupFeatures')
for f in GroupFeatures.objects.all():
for a in ['material_types', 'admin_roles', 'matman_roles', 'role_order']:
v = getattr(f, a, None)
if v != None:
v = re.sub(r'[][\\"\' ]+', '', v)
v = v.split(',')
v = json.dumps(v)
setattr(f, a, v)
f.save()
# This migration changes existing data fields in an incompatible manner, and
# would not be interleavable if we hadn't added compatibility code in
# Group.features() beforehand. With that patched in, we permit interleaving.
forward.interleavable = True # type: ignore # https://github.com/python/mypy/issues/2087
def reverse(apps, schema_editor):
GroupFeatures = apps.get_model('group', 'GroupFeatures')
for f in GroupFeatures.objects.all():
for a in ['material_types', 'admin_roles', 'matman_roles', 'role_order']:
v = getattr(f, a, None)
if v != None:
v = getattr(f, a)
v = json.loads(v)
v = ','.join(v)
setattr(f, a, v)
f.save()
class Migration(migrations.Migration):
dependencies = [
('group', '0004_add_group_feature_fields'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,107 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2019-01-16 05:53
from django.db import migrations, models
import jsonfield.fields
class Migration(migrations.Migration):
dependencies = [
('group', '0005_group_features_list_data_to_json'),
]
operations = [
migrations.AddField(
model_name='groupfeatures',
name='docman_roles',
field=jsonfield.fields.JSONField(default=['ad', 'chair', 'delegate', 'secr'], max_length=128),
),
migrations.AddField(
model_name='groupfeatures',
name='groupman_roles',
field=jsonfield.fields.JSONField(default=['ad', 'chair'], max_length=128),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='docman_roles',
field=jsonfield.fields.JSONField(default=['ad', 'chair', 'delegate', 'secr'], max_length=128),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='groupman_roles',
field=jsonfield.fields.JSONField(default=['ad', 'chair'], max_length=128),
),
migrations.AlterField(
model_name='groupfeatures',
name='admin_roles',
field=jsonfield.fields.JSONField(default=['chair'], max_length=64),
),
migrations.AlterField(
model_name='groupfeatures',
name='custom_group_roles',
field=models.BooleanField(default=False, verbose_name='Cust. Roles'),
),
migrations.AlterField(
model_name='groupfeatures',
name='has_nonsession_materials',
field=models.BooleanField(default=False, verbose_name='Other Matrl.'),
),
migrations.AlterField(
model_name='groupfeatures',
name='has_session_materials',
field=models.BooleanField(default=False, verbose_name='Sess Matrl.'),
),
migrations.AlterField(
model_name='groupfeatures',
name='material_types',
field=jsonfield.fields.JSONField(default=['slides'], max_length=64),
),
migrations.AlterField(
model_name='groupfeatures',
name='matman_roles',
field=jsonfield.fields.JSONField(default=['ad', 'chair', 'delegate', 'secr'], max_length=128),
),
migrations.AlterField(
model_name='groupfeatures',
name='role_order',
field=jsonfield.fields.JSONField(default=['chair', 'secr', 'member'], help_text='The order in which roles are shown, for instance on photo pages. Enter valid JSON.', max_length=128),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='admin_roles',
field=jsonfield.fields.JSONField(default=['chair'], max_length=64),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='custom_group_roles',
field=models.BooleanField(default=False, verbose_name='Cust. Roles'),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='has_nonsession_materials',
field=models.BooleanField(default=False, verbose_name='Other Matrl.'),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='has_session_materials',
field=models.BooleanField(default=False, verbose_name='Sess Matrl.'),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='material_types',
field=jsonfield.fields.JSONField(default=['slides'], max_length=64),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='matman_roles',
field=jsonfield.fields.JSONField(default=['ad', 'chair', 'delegate', 'secr'], max_length=128),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='role_order',
field=jsonfield.fields.JSONField(default=['chair', 'secr', 'member'], help_text='The order in which roles are shown, for instance on photo pages. Enter valid JSON.', max_length=128),
),
]

View file

@ -1,244 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2019-01-09 09:02
from django.db import migrations
import debug # pyflakes:ignore
group_type_features = {
'ag': {
'custom_group_roles': True,
'has_session_materials': True,
'acts_like_wg': True,
'create_wiki': True,
'is_schedulable': True,
'req_subm_approval': True,
'show_on_agenda': True,
'docman_roles': ['chair', 'delegate', 'secr'],
'groupman_roles': ['ad', 'chair', 'delegate'],
'matman_roles': ['ad', 'chair', 'delegate', 'secr'],
'role_order': ['chair', 'secr'],
},
'area': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': True,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': ['ad', 'delegate', 'secr'],
'groupman_roles': ['ad',],
'matman_roles': ['ad', 'chair', 'delegate', 'secr'],
'role_order': ['chair', 'secr'],
},
'dir': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': True,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': [],
'groupman_roles': ['ad', 'secr', ],
'matman_roles': ['ad', 'chair', 'delegate', 'secr'],
'role_order': ['chair', 'secr'],
},
'review': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': True,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': ['secr'],
'groupman_roles': ['ad', 'secr'],
'matman_roles': ['ad', 'secr'],
'role_order': ['chair', 'secr'],
},
'iab': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': True,
'docman_roles': ['chair'],
'groupman_roles': [],
'matman_roles': ['chair', 'delegate'],
'role_order': ['chair', 'secr'],
},
'ietf': {
'custom_group_roles': True,
'has_session_materials': True,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': ['chair', ],
'groupman_roles': ['chair', 'delegate'],
'matman_roles': ['chair', 'delegate'],
'role_order': ['chair', 'secr'],
},
'individ': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': False,
'show_on_agenda': False,
'docman_roles': ['auth'],
'groupman_roles': [],
'matman_roles': [],
'role_order': ['chair', 'secr'],
},
'irtf': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': [],
'groupman_roles': ['chair', 'delegate'],
'matman_roles': ['chair', 'delegate', 'secr'],
'role_order': ['chair', 'secr'],
},
'isoc': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': [],
'groupman_roles': ['chair', ],
'matman_roles': ['chair', 'secr'],
'role_order': ['chair', 'secr'],
},
'nomcom': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': True,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': [],
'groupman_roles': ['chair', 'advisor'],
'matman_roles': ['chair'],
'role_order': ['chair', 'member', 'advisor'],
},
'program': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': False,
'show_on_agenda': False,
'docman_roles': ['chair', 'secr'],
'groupman_roles': ['chair', 'secr'],
'matman_roles': ['chair', 'secr'],
'role_order': ['chair', 'secr'],
},
'rfcedtyp': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': [],
'groupman_roles': [],
'matman_roles': [],
'role_order': ['chair', 'secr'],
},
'rg': {
'custom_group_roles': False,
'has_session_materials': True,
'acts_like_wg': True,
'create_wiki': True,
'is_schedulable': True,
'req_subm_approval': True,
'show_on_agenda': True,
'docman_roles': ['chair', 'delegate', 'secr'],
'groupman_roles': ['chair', 'secr'],
'matman_roles': ['chair', 'secr'],
'role_order': ['chair', 'secr'],
},
'sdo': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': False,
'is_schedulable': False,
'req_subm_approval': True,
'show_on_agenda': False,
'docman_roles': ['liaiman', 'matman'],
'groupman_roles': [],
'matman_roles': [],
'role_order': ['liaiman'],
},
'team': {
'custom_group_roles': True,
'has_session_materials': False,
'acts_like_wg': False,
'create_wiki': True,
'is_schedulable': False,
'req_subm_approval': False,
'show_on_agenda': False,
'docman_roles': [],
'groupman_roles': ['chair', ],
'matman_roles': [],
'role_order': ['chair', 'member', 'matman'],
},
'wg': {
'custom_group_roles': False,
'has_session_materials': True,
'acts_like_wg': True,
'create_wiki': True,
'is_schedulable': True,
'req_subm_approval': True,
'show_on_agenda': True,
'docman_roles': ['chair', 'delegate', 'secr'],
'groupman_roles': ['ad', 'chair', 'delegate', 'secr'],
'matman_roles': ['ad', 'chair', 'delegate', 'secr'],
'role_order': ['chair', 'secr', 'delegate'],
},
}
def forward(apps, schema_editor):
GroupFeatures = apps.get_model('group', 'GroupFeatures')
for type in group_type_features:
features = group_type_features[type]
gf = GroupFeatures.objects.get(type=type)
for k,v in features.items():
setattr(gf, k, v)
gf.save()
# This migration does not remove or change any previous fields, and executes
# swirftly, so we permit it to be interleaved with schema migrations
forward.interleavable = True # type: ignore # https://github.com/python/mypy/issues/2087
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('group', '0006_group_features_lists_to_jsonfield')
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,27 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2019-01-19 10:08
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('group', '0007_new_group_features_data'),
]
operations = [
migrations.AlterField(
model_name='groupfeatures',
name='type',
field=ietf.utils.models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='features', serialize=False, to='name.GroupTypeName'),
),
migrations.AlterField(
model_name='historicalgroupfeatures',
name='type',
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='name.GroupTypeName'),
),
]

View file

@ -1,22 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.18 on 2019-01-22 10:12
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('group', '0008_group_features_onetoone'),
]
operations = [
migrations.AlterField(
model_name='historicalgroupfeatures',
name='agenda_type',
field=models.ForeignKey(blank=True, db_constraint=False, default='ietf', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='name.AgendaTypeName'),
),
]

View file

@ -1,156 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.16 on 2019-01-09 09:02
from django.db import migrations
import debug # pyflakes:ignore
group_type_features = {
'adhoc': {
'grouptypename': {
"slug": 'adhoc',
"desc": 'Ad Hoc schedulable Group Type, for instance HotRfc',
"name": "Ad Hoc",
"order": 0,
"used": True,
"verbose_name": "Ad Hoc Group Type",
},
'groupfeatures': {
'about_page': 'ietf.group.views.group_about',
'acts_like_wg': False,
'admin_roles': '["chair"]',
'agenda_type_id': 'ietf',
'create_wiki': True,
'custom_group_roles': False,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'docman_roles': '["chair"]',
'groupman_roles': '["chair","delegate"]',
'has_chartering_process': False,
'has_default_jabber': True,
'has_documents': False,
'has_dependencies': False,
'has_meetings': True,
'has_milestones': False,
'has_nonsession_materials': False,
'has_reviews': False,
'has_session_materials': True,
'is_schedulable': True,
'material_types': '["slides"]',
'matman_roles': '["chair","delegate"]',
'req_subm_approval': True,
'role_order': '["chair","delegate"]',
'show_on_agenda': True,
},
},
'iesg': {
'grouptypename': {
"slug": 'iesg',
"desc": '',
"name": "IESG",
"order": 0,
"used": True,
"verbose_name": "Internet Engineering Steering Group"
},
'groupfeatures': {
'about_page': 'ietf.group.views.group_about',
'acts_like_wg': False,
'admin_roles': '["chair"]',
'agenda_type_id': None,
'create_wiki': False,
'custom_group_roles': True,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'docman_roles': '["chair"]',
'groupman_roles': '["chair","delegate"]',
'has_chartering_process': False,
'has_default_jabber': False,
'has_documents': False,
'has_dependencies': False,
'has_meetings': False,
'has_milestones': False,
'has_nonsession_materials': False,
'has_reviews': False,
'has_session_materials': False,
'is_schedulable': False,
'material_types': '[]',
'matman_roles': '["chair","delegate"]',
'req_subm_approval': True,
'role_order': '["chair","secr"]',
'show_on_agenda': False
},
},
'ise': {
'grouptypename': {
"slug": 'ise',
"desc": '',
"name": "ISE",
"order": 0,
"used": True,
"verbose_name": "Independent Stream Editor",
},
'groupfeatures': {
'about_page': 'ietf.group.views.group_about',
'acts_like_wg': False,
'admin_roles': '["chair","lead"]',
'agenda_type_id': None,
'create_wiki': False,
'custom_group_roles': True,
'customize_workflow': False,
'default_tab': 'ietf.group.views.group_about',
'docman_roles': '["chair"]',
'groupman_roles': '["chair","delegate"]',
'has_chartering_process': False,
'has_default_jabber': False,
'has_documents': False,
'has_dependencies': False,
'has_meetings': False,
'has_milestones': False,
'has_nonsession_materials': False,
'has_reviews': False,
'has_session_materials': False,
'is_schedulable': False,
'material_types': '[]',
'matman_roles': '["chair","delegate"]',
'req_subm_approval': True,
'role_order': '["chair"]',
'show_on_agenda': False
},
},
}
def forward(apps, schema_editor):
GroupTypeName = apps.get_model('name', 'GroupTypeName')
GroupFeatures = apps.get_model('group', 'GroupFeatures')
for slug in group_type_features:
typename = group_type_features[slug]['grouptypename']
gt, _ = GroupTypeName.objects.get_or_create(slug=slug)
for k,v in typename.items():
setattr(gt, k, v)
gt.save()
#
features = group_type_features[slug]['groupfeatures']
gf, _ = GroupFeatures.objects.get_or_create(type_id=slug)
for k,v in features.items():
setattr(gf, k, v)
gf.save()
# This migration does not remove or change any previous fields, and executes
# swirftly, so we permit it to be interleaved with schema migrations
forward.interleavable = True # type: ignore # https://github.com/python/mypy/issues/2087
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('group', '0009_auto_20190122_1012'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,24 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-02-25 13:02
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('group', '0010_add_group_types'),
]
operations = [
migrations.RemoveField(
model_name='groupfeatures',
name='has_dependencies',
),
migrations.RemoveField(
model_name='historicalgroupfeatures',
name='has_dependencies',
),
]

File diff suppressed because it is too large Load diff

View file

@ -1,53 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-02-25 13:02
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
class Migration(migrations.Migration):
dependencies = [
('group', '0012_add_old_nomcom_announcements'),
]
operations = [
migrations.CreateModel(
name='GroupMilestoneDocs',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id')),
('groupmilestone', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.GroupMilestone')),
],
),
migrations.CreateModel(
name='GroupMilestoneHistoryDocs',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('document', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='doc.Document', to_field=b'id')),
('groupmilestonehistory', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='group.GroupMilestoneHistory')),
],
),
migrations.AddField(
model_name='group',
name='charter2',
field=ietf.utils.models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chartered_group', to='doc.Document', to_field='id'),
),
migrations.AlterField(
model_name='group',
name='charter',
field=ietf.utils.models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='old_group', to='doc.Document', to_field='name'),
),
migrations.AddField(
model_name='groupmilestone',
name='docs2',
field=models.ManyToManyField(blank=True, related_name='groupmilestones', through='group.GroupMilestoneDocs', to='doc.Document'),
),
migrations.AddField(
model_name='groupmilestonehistory',
name='docs2',
field=models.ManyToManyField(blank=True, related_name='groupmilestoneshistory', through='group.GroupMilestoneHistoryDocs', to='doc.Document'),
),
]

View file

@ -1,57 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-10 06:48
import sys
from tqdm import tqdm
from django.db import migrations
def forward(apps, schema_editor):
Document = apps.get_model('doc','Document')
GroupMilestone = apps.get_model('group', 'GroupMilestone')
GroupMilestoneDocs = apps.get_model('group', 'GroupMilestoneDocs')
GroupMilestoneHistory = apps.get_model('group', 'GroupMilestoneHistory')
GroupMilestoneHistoryDocs = apps.get_model('group', 'GroupMilestoneHistoryDocs')
# Document id fixup ------------------------------------------------------------
objs = Document.objects.in_bulk()
nameid = { o.name: o.id for id, o in objs.items() }
sys.stderr.write('\n')
sys.stderr.write(' %s.%s:\n' % (GroupMilestone.__name__, 'docs'))
count = 0
for m in tqdm(GroupMilestone.objects.all()):
for d in m.docs.all():
count += 1
GroupMilestoneDocs.objects.get_or_create(groupmilestone=m, document_id=nameid[d.name])
sys.stderr.write(' %s GroupMilestoneDocs objects created\n' % (count, ))
sys.stderr.write(' %s.%s:\n' % (GroupMilestoneHistory.__name__, 'docs'))
count = 0
for m in tqdm(GroupMilestoneHistory.objects.all()):
for d in m.docs.all():
count += 1
GroupMilestoneHistoryDocs.objects.get_or_create(GroupMilestoneHistory=m, document_id=nameid[d.name])
sys.stderr.write(' %s GroupMilestoneHistoryDocs objects created\n' % (count, ))
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('group', '0013_add_groupmilestone_docs2_m2m'),
('doc', '0014_set_document_docalias_id'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,41 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-22 08:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('group', '0014_set_document_m2m_keys'),
]
# The implementation of AlterField in Django 1.11 applies
# 'ALTER TABLE <table> MODIFY <field> ...;' in order to fix foregn keys
# to the altered field, but as it seems does _not_ fix up m2m
# intermediary tables in an equivalent manner, so here we remove and
# then recreate the m2m tables so they will have the appropriate field
# types.
operations = [
migrations.RemoveField(
model_name='groupmilestone',
name='docs',
),
migrations.RemoveField(
model_name='groupmilestonehistory',
name='docs',
),
migrations.AddField(
model_name='groupmilestone',
name='docs',
field=models.ManyToManyField(to='doc.Document'),
),
migrations.AddField(
model_name='groupmilestonehistory',
name='docs',
field=models.ManyToManyField(to='doc.Document'),
),
]

View file

@ -1,41 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-22 08:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('group', '0015_1_del_docs_m2m_table'),
]
# The implementation of AlterField in Django 1.11 applies
# 'ALTER TABLE <table> MODIFY <field> ...;' in order to fix foregn keys
# to the altered field, but as it seems does _not_ fix up m2m
# intermediary tables in an equivalent manner, so here we remove and
# then recreate the m2m tables so they will have the appropriate field
# types.
operations = [
migrations.RemoveField(
model_name='groupmilestone',
name='docs',
),
migrations.RemoveField(
model_name='groupmilestonehistory',
name='docs',
),
migrations.AddField(
model_name='groupmilestone',
name='docs',
field=models.ManyToManyField(blank=True, to='doc.Document'),
),
migrations.AddField(
model_name='groupmilestonehistory',
name='docs',
field=models.ManyToManyField(blank=True, to='doc.Document'),
),
]

View file

@ -1,58 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-27 05:57
import sys, time
from tqdm import tqdm
from django.db import migrations
def forward(apps, schema_editor):
GroupMilestone = apps.get_model('group', 'GroupMilestone')
GroupMilestoneDocs = apps.get_model('group', 'GroupMilestoneDocs')
GroupMilestoneHistory = apps.get_model('group', 'GroupMilestoneHistory')
GroupMilestoneHistoryDocs = apps.get_model('group', 'GroupMilestoneHistoryDocs')
# Document id fixup ------------------------------------------------------------
sys.stderr.write('\n')
sys.stderr.write(' %s.%s:\n' % (GroupMilestone.__name__, 'docs'))
for m in tqdm(GroupMilestone.objects.all()):
m.docs.set([ d.document for d in GroupMilestoneDocs.objects.filter(groupmilestone=m) ])
sys.stderr.write(' %s.%s:\n' % (GroupMilestoneHistory.__name__, 'docs'))
for m in tqdm(GroupMilestoneHistory.objects.all()):
m.docs.set([ d.document for d in GroupMilestoneHistoryDocs.objects.filter(groupmilestonehistory=m) ])
def reverse(apps, schema_editor):
pass
def timestamp(apps, schema_editor):
sys.stderr.write('\n %s' % time.strftime('%Y-%m-%d %H:%M:%S'))
class Migration(migrations.Migration):
dependencies = [
('group', '0015_2_add_docs_m2m_table'),
]
operations = [
#migrations.RunPython(forward, reverse),
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO group_groupmilestone_docs SELECT * FROM group_groupmilestonedocs;",
""
),
migrations.RunPython(timestamp, timestamp),
migrations.RunSQL(
"INSERT INTO group_groupmilestonehistory_docs SELECT * FROM group_groupmilestonehistorydocs;",
""
),
migrations.RunPython(timestamp, timestamp),
]

View file

@ -1,46 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-30 03:23
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('group', '0016_copy_docs_m2m_table'),
]
operations = [
migrations.RemoveField(
model_name='groupmilestonedocs',
name='document',
),
migrations.RemoveField(
model_name='groupmilestonedocs',
name='groupmilestone',
),
migrations.RemoveField(
model_name='groupmilestonehistorydocs',
name='document',
),
migrations.RemoveField(
model_name='groupmilestonehistorydocs',
name='groupmilestonehistory',
),
migrations.RemoveField(
model_name='groupmilestone',
name='docs2',
),
migrations.RemoveField(
model_name='groupmilestonehistory',
name='docs2',
),
migrations.DeleteModel(
name='GroupMilestoneDocs',
),
migrations.DeleteModel(
name='GroupMilestoneHistoryDocs',
),
]

View file

@ -1,20 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-25 06:51
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('group', '0017_remove_docs2_m2m'),
]
operations = [
migrations.RemoveField(
model_name='group',
name='charter',
),
]

View file

@ -1,22 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.20 on 2019-05-25 06:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('doc', '0019_rename_field_document2'),
('group', '0018_remove_old_document_field'),
]
operations = [
migrations.RenameField(
model_name='group',
old_name='charter2',
new_name='charter',
),
]

View file

@ -1,26 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2019-10-30 11:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('group', '0019_rename_field_document2'),
]
operations = [
migrations.AddField(
model_name='group',
name='uses_milestone_dates',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='grouphistory',
name='uses_milestone_dates',
field=models.BooleanField(default=False),
),
]

View file

@ -1,44 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2019-10-30 13:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('group', '0020_add_uses_milestone_dates'),
]
operations = [
migrations.AlterModelOptions(
name='groupmilestone',
options={'ordering': ['order', 'due', 'id']},
),
migrations.AlterModelOptions(
name='groupmilestonehistory',
options={'ordering': ['order', 'due', 'id']},
),
migrations.AddField(
model_name='groupmilestone',
name='order',
field=models.IntegerField(blank=True, null=True),
),
migrations.AddField(
model_name='groupmilestonehistory',
name='order',
field=models.IntegerField(blank=True, null=True),
),
migrations.AlterField(
model_name='groupmilestone',
name='due',
field=models.DateField(blank=True, null=True),
),
migrations.AlterField(
model_name='groupmilestonehistory',
name='due',
field=models.DateField(blank=True, null=True),
),
]

View file

@ -1,30 +0,0 @@
# Copyright The IETF Trust 2019-2020, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.25 on 2019-10-30 11:42
from django.db import migrations
def forward(apps, schema_editor):
Group = apps.get_model('group','Group')
GroupHistory = apps.get_model('group','GroupHistory')
Group.objects.filter(type__features__has_milestones=True).update(uses_milestone_dates=True)
GroupHistory.objects.filter(type__features__has_milestones=True).update(uses_milestone_dates=True)
def reverse(apps, schema_editor):
Group = apps.get_model('group','Group')
GroupHistory = apps.get_model('group','GroupHistory')
Group.objects.filter(type__features__has_milestones=True).update(uses_milestone_dates=False)
GroupHistory.objects.filter(type__features__has_milestones=True).update(uses_milestone_dates=False)
class Migration(migrations.Migration):
dependencies = [
('group', '0021_add_order_to_milestones'),
]
operations = [
migrations.RunPython(forward, reverse)
]

View file

@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright The IETF Trust 2020, All Rights Reserved
# Generated by Django 1.11.28 on 2020-02-11 07:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('group', '0022_populate_uses_milestone_dates'),
]
operations = [
migrations.AlterField(
model_name='group',
name='uses_milestone_dates',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='grouphistory',
name='uses_milestone_dates',
field=models.BooleanField(default=True),
),
]

View file

@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-05-04 13:10
from __future__ import unicode_literals
from django.db import migrations
import jsonfield.fields
class Migration(migrations.Migration):
dependencies = [
('group', '0023_use_milestone_dates_default_to_true'),
]
operations = [
migrations.AddField(
model_name='groupfeatures',
name='groupman_authroles',
field=jsonfield.fields.JSONField(default=['Secretariat'], max_length=128),
),
migrations.AddField(
model_name='historicalgroupfeatures',
name='groupman_authroles',
field=jsonfield.fields.JSONField(default=['Secretariat'], max_length=128),
),
]

View file

@ -1,47 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-05-01 12:54
from __future__ import unicode_literals
from django.db import migrations
authroles_map = {
'adhoc': ['Secretariat'],
'admin': ['Secretariat'],
'ag': ['Secretariat', 'Area Director'],
'area': ['Secretariat'],
'dir': ['Secretariat'],
'iab': ['Secretariat'],
'iana': ['Secretariat'],
'iesg': ['Secretariat'],
'ietf': ['Secretariat'],
'individ': [],
'irtf': ['Secretariat'],
'ise': ['Secretariat'],
'isoc': ['Secretariat'],
'nomcom': ['Secretariat'],
'program': ['Secretariat', 'IAB'],
'review': ['Secretariat'],
'rfcedtyp': ['Secretariat'],
'rg': ['Secretariat', 'IRTF Chair'],
'sdo': ['Secretariat'],
'team': ['Secretariat'],
'wg': ['Secretariat', 'Area Director'],
}
def forward(apps, schema_editor):
GroupFeatures = apps.get_model('group', 'GroupFeatures')
for type_id, authroles in authroles_map.items():
GroupFeatures.objects.filter(type_id=type_id).update(groupman_authroles=authroles)
def reverse(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('group', '0024_add_groupman_authroles'),
]
operations = [
migrations.RunPython(forward, reverse),
]

View file

@ -1,36 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.29 on 2020-05-01 12:54
from __future__ import unicode_literals
from django.db import migrations
def forward(apps, schema_editor):
GroupFeatures = apps.get_model('group', 'GroupFeatures')
program = GroupFeatures.objects.get(type_id='program')
program.has_meetings = True
program.matman_roles = ['lead', 'chair', 'secr']
program.docman_roles = ['lead', 'chair', 'secr']
program.groupman_roles = ['lead', 'chair', 'secr']
program.role_order = ['lead', 'chair', 'secr']
program.save()
def reverse(apps, schema_editor):
GroupFeatures = apps.get_model('group', 'GroupFeatures')
program = GroupFeatures.objects.get(type_id='program')
program.has_meetings = False
program.matman_roles = ['lead', 'secr']
program.docman_roles = ['lead', 'secr']
program.groupman_roles = ['lead', 'secr']
program.role_order = ['lead', 'secr']
program.save()
class Migration(migrations.Migration):
dependencies = [
('group', '0025_populate_groupman_authroles'),
]
operations = [
migrations.RunPython(forward, reverse),
]

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