260 lines
9.7 KiB
Python
260 lines
9.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
|
|
import re
|
|
from django.db import migrations, models
|
|
|
|
def port_rules_to_typed_system(apps, schema_editor):
|
|
SearchRule = apps.get_model("community", "SearchRule")
|
|
State = apps.get_model("doc", "State")
|
|
Group = apps.get_model("group", "Group")
|
|
Person = apps.get_model("person", "Person")
|
|
|
|
draft_active = State.objects.get(type="draft", slug="active")
|
|
draft_rfc = State.objects.get(type="draft", slug="rfc")
|
|
|
|
def try_to_uniquify_person(rule, person_qs):
|
|
if rule.community_list.user and len(person_qs) > 1:
|
|
user_specific_qs = person_qs.filter(user=rule.community_list.user)
|
|
if len(user_specific_qs) > 0 and len(user_specific_qs) < len(person_qs):
|
|
return user_specific_qs
|
|
|
|
return person_qs
|
|
|
|
|
|
for rule in SearchRule.objects.all():
|
|
handled = False
|
|
|
|
if rule.rule_type in ['wg_asociated', 'area_asociated', 'wg_asociated_rfc', 'area_asociated_rfc']:
|
|
try:
|
|
rule.group = Group.objects.get(acronym=rule.value)
|
|
|
|
if rule.rule_type in ['wg_asociated_rfc', 'area_asociated_rfc']:
|
|
rule.state = draft_rfc
|
|
else:
|
|
rule.state = draft_active
|
|
handled = True
|
|
except Group.DoesNotExist:
|
|
pass
|
|
|
|
|
|
elif rule.rule_type in ['in_iab_state', 'in_iana_state', 'in_iesg_state', 'in_irtf_state', 'in_ise_state', 'in_rfcEdit_state', 'in_wg_state']:
|
|
state_types = {
|
|
'in_iab_state': 'draft-stream-iab',
|
|
'in_iana_state': 'draft-iana-review',
|
|
'in_iesg_state': 'draft-iesg',
|
|
'in_irtf_state': 'draft-stream-irtf',
|
|
'in_ise_state': 'draft-stream-ise',
|
|
'in_rfcEdit_state': 'draft-rfceditor',
|
|
'in_wg_state': 'draft-stream-ietf',
|
|
}
|
|
|
|
try:
|
|
rule.state = State.objects.get(type=state_types[rule.rule_type], slug=rule.value)
|
|
handled = True
|
|
except State.DoesNotExist:
|
|
pass
|
|
|
|
|
|
elif rule.rule_type in ["author", "author_rfc"]:
|
|
found_persons = list(try_to_uniquify_person(rule, Person.objects.filter(email__documentauthor__id__gte=1).filter(name__icontains=rule.value).distinct()))
|
|
|
|
if found_persons:
|
|
rule.person = found_persons[0]
|
|
rule.state = draft_active
|
|
|
|
for p in found_persons[1:]:
|
|
SearchRule.objects.create(
|
|
community_list=rule.community_list,
|
|
rule_type=rule.rule_type,
|
|
state=rule.state,
|
|
person=p,
|
|
)
|
|
#print "created", rule.rule_type, p.name
|
|
|
|
handled = True
|
|
|
|
elif rule.rule_type == "ad_responsible":
|
|
try:
|
|
rule.person = Person.objects.get(id=rule.value)
|
|
rule.state = draft_active
|
|
handled = True
|
|
except Person.DoesNotExist:
|
|
pass
|
|
|
|
|
|
elif rule.rule_type == "shepherd":
|
|
found_persons = list(try_to_uniquify_person(rule, Person.objects.filter(email__shepherd_document_set__type="draft").filter(name__icontains=rule.value).distinct()))
|
|
|
|
if found_persons:
|
|
rule.person = found_persons[0]
|
|
rule.state = draft_active
|
|
|
|
for p in found_persons[1:]:
|
|
SearchRule.objects.create(
|
|
community_list=rule.community_list,
|
|
rule_type=rule.rule_type,
|
|
state=rule.state,
|
|
person=p,
|
|
)
|
|
#print "created", rule.rule_type, p.name
|
|
|
|
handled = True
|
|
|
|
elif rule.rule_type == "with_text":
|
|
rule.state = draft_active
|
|
|
|
if rule.value:
|
|
rule.text = rule.value
|
|
handled = True
|
|
|
|
if handled:
|
|
rule.save()
|
|
else:
|
|
rule.delete()
|
|
#print "NOT HANDLED", rule.pk, rule.rule_type, rule.value
|
|
|
|
def delete_extra_person_rules(apps, schema_editor):
|
|
SearchRule = apps.get_model("community", "SearchRule")
|
|
SearchRule.objects.exclude(person=None).filter(value="").delete()
|
|
|
|
RENAMED_RULES = [
|
|
('wg_asociated', 'group'),
|
|
('area_asociated', 'area'),
|
|
('wg_asociated_rfc', 'group_rfc'),
|
|
('area_asociated_rfc', 'area_rfc'),
|
|
|
|
('in_iab_state', 'state_iab'),
|
|
('in_iana_state', 'state_iana'),
|
|
('in_iesg_state', 'state_iesg'),
|
|
('in_irtf_state', 'state_irtf'),
|
|
('in_ise_state', 'state_ise'),
|
|
('in_rfcEdit_state', 'state_rfceditor'),
|
|
('in_wg_state', 'state_ietf'),
|
|
|
|
('ad_responsible', 'ad'),
|
|
|
|
('with_text', 'name_contains'),
|
|
]
|
|
|
|
def rename_rule_type_forwards(apps, schema_editor):
|
|
SearchRule = apps.get_model("community", "SearchRule")
|
|
|
|
renamings = dict(RENAMED_RULES)
|
|
|
|
for r in SearchRule.objects.all():
|
|
if r.rule_type in renamings:
|
|
r.rule_type = renamings[r.rule_type]
|
|
r.save()
|
|
|
|
def rename_rule_type_backwards(apps, schema_editor):
|
|
SearchRule = apps.get_model("community", "SearchRule")
|
|
|
|
renamings = dict((to, fro) for fro, to in RENAMED_RULES)
|
|
|
|
for r in SearchRule.objects.all():
|
|
if r.rule_type in renamings:
|
|
r.rule_type = renamings[r.rule_type]
|
|
r.save()
|
|
|
|
def get_rid_of_empty_lists(apps, schema_editor):
|
|
CommunityList = apps.get_model("community", "CommunityList")
|
|
|
|
for cl in CommunityList.objects.filter(added_docs=None, searchrule=None, emailsubscription=None):
|
|
cl.delete()
|
|
|
|
def move_email_subscriptions_to_preregistered_email(apps, schema_editor):
|
|
EmailSubscription = apps.get_model("community", "EmailSubscription")
|
|
Email = apps.get_model("person", "Email")
|
|
Person = apps.get_model("person", "Person")
|
|
|
|
for e in EmailSubscription.objects.all():
|
|
email_obj = None
|
|
try:
|
|
email_obj = Email.objects.get(address=e.email)
|
|
except Email.DoesNotExist:
|
|
if e.community_list.user:
|
|
person = Person.objects.filter(user=e.community_list.user).first()
|
|
|
|
#print "creating", e.email, person.ascii
|
|
# we'll register it on the user, on the assumption
|
|
# that the user and the subscriber is the same person
|
|
email_obj = Email.objects.create(
|
|
address=e.email,
|
|
person=person,
|
|
)
|
|
|
|
if not email_obj:
|
|
print "deleting", e.email
|
|
e.delete()
|
|
|
|
def fill_in_notify_on(apps, schema_editor):
|
|
EmailSubscription = apps.get_model("community", "EmailSubscription")
|
|
|
|
EmailSubscription.objects.filter(significant=False).update(notify_on="all")
|
|
EmailSubscription.objects.filter(significant=True).update(notify_on="significant")
|
|
|
|
def add_group_community_lists(apps, schema_editor):
|
|
Group = apps.get_model("group", "Group")
|
|
DocAlias = apps.get_model("doc", "DocAlias")
|
|
State = apps.get_model("doc", "State")
|
|
CommunityList = apps.get_model("community", "CommunityList")
|
|
SearchRule = apps.get_model("community", "SearchRule")
|
|
|
|
active_state = State.objects.get(slug="active", type="draft")
|
|
rfc_state = State.objects.get(slug="rfc", type="draft")
|
|
|
|
draft_aliases = DocAlias.objects.filter(name__startswith="draft")
|
|
|
|
for g in Group.objects.filter(type__in=("rg", "wg")):
|
|
clist = CommunityList.objects.filter(group=g).first()
|
|
if clist:
|
|
SearchRule.objects.get_or_create(community_list=clist, rule_type="group", group=g, state=active_state)
|
|
SearchRule.objects.get_or_create(community_list=clist, rule_type="group_rfc", group=g, state=rfc_state)
|
|
r, _ = SearchRule.objects.get_or_create(community_list=clist, rule_type="name_contains", text=r"^draft-[^-]+-%s-" % g.acronym, state=active_state)
|
|
|
|
# do the matching manually in Python to speed up the operation
|
|
#r.name_contains_index = Document.objects.filter(docalias__name__regex=r.text)
|
|
name_re = re.compile(r.text)
|
|
r.name_contains_index = [ a.document_id for a in draft_aliases if name_re.match(a.name) ]
|
|
|
|
else:
|
|
clist = CommunityList.objects.create(group=g)
|
|
SearchRule.objects.create(community_list=clist, rule_type="group", group=g, state=active_state)
|
|
SearchRule.objects.create(community_list=clist, rule_type="group_rfc", group=g, state=rfc_state)
|
|
r = SearchRule.objects.create(community_list=clist, rule_type="name_contains", text=r"^draft-[^-]+-%s-" % g.acronym, state=active_state)
|
|
name_re = re.compile(r.text)
|
|
r.name_contains_index = [ a.document_id for a in draft_aliases if name_re.match(a.name) ]
|
|
|
|
def noop(apps, schema_editor):
|
|
pass
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
('community', '0003_cleanup'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.RunPython(port_rules_to_typed_system, delete_extra_person_rules),
|
|
migrations.RunPython(rename_rule_type_forwards, rename_rule_type_backwards),
|
|
migrations.RunPython(move_email_subscriptions_to_preregistered_email, noop),
|
|
migrations.RunPython(get_rid_of_empty_lists, noop),
|
|
migrations.RunPython(fill_in_notify_on, noop),
|
|
migrations.RunPython(add_group_community_lists, noop),
|
|
migrations.RemoveField(
|
|
model_name='searchrule',
|
|
name='value',
|
|
),
|
|
migrations.AlterField(
|
|
model_name='emailsubscription',
|
|
name='email',
|
|
field=models.ForeignKey(to='person.Email'),
|
|
preserve_default=True,
|
|
),
|
|
migrations.RemoveField(
|
|
model_name='emailsubscription',
|
|
name='significant',
|
|
),
|
|
]
|