Disabled changing of acronym, charter lookup by DocAlias, changes to group proxy model so it gets the correct charter
- Legacy-Id: 3355
This commit is contained in:
parent
b73c5358e7
commit
2ed5c356d4
|
@ -183,6 +183,9 @@ class InternetDraft(models.Model):
|
|||
return "<%s>" % (self.filename_with_rev())
|
||||
def filename_with_rev(self):
|
||||
return "%s-%s.txt" % (self.filename, self.revision_display())
|
||||
def name(self):
|
||||
# small hack to make model forward-compatible with new schema
|
||||
return self.filename
|
||||
def group_acronym(self):
|
||||
return self.group.acronym
|
||||
def group_ml_archive(self):
|
||||
|
@ -255,11 +258,11 @@ class PersonOrOrgInfo(models.Model):
|
|||
date_created = models.DateField(auto_now_add=True, null=True)
|
||||
created_by = models.CharField(blank=True, null=True, max_length=8)
|
||||
address_type = models.CharField(blank=True, null=True, max_length=4)
|
||||
def save(self):
|
||||
def save(self, **kwargs):
|
||||
self.first_name_key = self.first_name.upper()
|
||||
self.middle_initial_key = self.middle_initial.upper()
|
||||
self.last_name_key = self.last_name.upper()
|
||||
super(PersonOrOrgInfo, self).save()
|
||||
super(PersonOrOrgInfo, self).save(**kwargs)
|
||||
def __str__(self):
|
||||
# For django.VERSION 0.96
|
||||
if self.first_name == '' and self.last_name == '':
|
||||
|
@ -273,16 +276,12 @@ class PersonOrOrgInfo(models.Model):
|
|||
def email(self, priority=1, type=None):
|
||||
name = unicode(self)
|
||||
email = ''
|
||||
types = type and [ type ] or [ "INET", "Prim", None ]
|
||||
for type in types:
|
||||
try:
|
||||
if type:
|
||||
email = self.emailaddress_set.get(priority=priority, type=type).address
|
||||
else:
|
||||
email = self.emailaddress_set.get(priority=priority).address
|
||||
break
|
||||
except (EmailAddress.DoesNotExist, AssertionError):
|
||||
pass
|
||||
addresses = self.emailaddress_set.filter(address__contains="@").order_by('priority')
|
||||
if addresses:
|
||||
email = addresses[0].address
|
||||
for a in addresses:
|
||||
if a.priority == priority:
|
||||
email = a.address
|
||||
return (name, email)
|
||||
# Added by Sunny Lee to display person's affiliation - 5/26/2007
|
||||
def affiliation(self, priority=1):
|
||||
|
@ -410,6 +409,9 @@ class Rfc(models.Model):
|
|||
return "%s.txt" % ( self.filename() )
|
||||
def filename(self):
|
||||
return "rfc%d" % ( self.rfc_number )
|
||||
def name(self):
|
||||
# small hack to make model forward-compatible with new schema
|
||||
return self.filename()
|
||||
def revision(self):
|
||||
return "RFC"
|
||||
def revision_display(self):
|
||||
|
@ -1137,6 +1139,23 @@ class DocumentWrapper(object):
|
|||
def __init__(self, document):
|
||||
self.document = document
|
||||
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
InternetDraftOld = InternetDraft
|
||||
IDInternalOld = IDInternal
|
||||
RfcOld = Rfc
|
||||
BallotInfoOld = BallotInfo
|
||||
IDStateOld = IDState
|
||||
IDSubStateOld = IDSubState
|
||||
AreaOld = Area
|
||||
AcronymOld = Acronym
|
||||
IESGLoginOld = IESGLogin
|
||||
IETFWGOld = IETFWG
|
||||
IRTFOld = IRTF
|
||||
from redesign.doc.proxy import InternetDraft, IDInternal, BallotInfo, Rfc
|
||||
from redesign.name.proxy import IDState, IDSubState
|
||||
from redesign.group.proxy import Area, Acronym, IETFWG, IRTF
|
||||
from redesign.person.proxy import IESGLogin
|
||||
|
||||
|
||||
# changes done by convert-096.py:changed maxlength to max_length
|
||||
# removed core
|
||||
|
|
|
@ -54,23 +54,13 @@ Create WG record
|
|||
<tr>
|
||||
<th>{{ field.label_tag }}:</th>
|
||||
<td>{{ field }}
|
||||
{% ifequal field.name "acronym" %}
|
||||
{% ifequal field.errors "error" %}
|
||||
<ul><li>Acronym already in use.</label></li></ul>
|
||||
{% endifequal %}
|
||||
{% ifequal field.errors "warning" %}
|
||||
<ul><li>Acronym previously used. Use anyway? <label><input type="checkbox" name="confirm_acronym" /></label></li></ul>
|
||||
{% endifequal %}
|
||||
{% endifequal %}
|
||||
{% ifequal field.name "ad" %}
|
||||
{% if user|in_group:"Area_Director" %}
|
||||
<label><input type="checkbox" name="ad" value="{{ login.pk }}" /> Assign to me</label>
|
||||
{% endif %}
|
||||
{% endifequal %}
|
||||
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
|
||||
{% ifnotequal field.name "acronym" %}
|
||||
{{ field.errors }}
|
||||
{% endifnotequal %}
|
||||
{{ field.errors }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
|
@ -38,11 +38,11 @@ class WgUrlTestCase(SimpleUrlTestCase):
|
|||
class WgFileTestCase(django.test.TestCase):
|
||||
def testFileExistence(self):
|
||||
print " Testing if WG charter texts exist locally"
|
||||
fpath = os.path.join(settings.CHARTER_PATH, "charter-ietf-example-01.txt")
|
||||
fpath = os.path.join(settings.CHARTER_PATH, "charter-ietf-core-01.txt")
|
||||
if not os.path.exists(fpath):
|
||||
print "\nERROR: exampe charter text not found in "+settings.CHARTER_PATH
|
||||
print "\nERROR: charter text not found in "+settings.CHARTER_PATH
|
||||
print "Needed for testing WG record pages."
|
||||
print "Remember to set CHARTER_PATH in settings_local.py\n"
|
||||
print "Remember to set CHARTER_PATH in settings.py\n"
|
||||
else:
|
||||
print "OK (seem to exist)"
|
||||
|
||||
|
|
|
@ -3,15 +3,15 @@ import re
|
|||
|
||||
from datetime import datetime
|
||||
from group.models import GroupEvent
|
||||
from doc.models import Document
|
||||
from doc.models import Document, DocAlias, DocHistory, RelatedDocument, DocumentAuthor
|
||||
from ietf.utils.history import find_history_active_at
|
||||
|
||||
def set_or_create_charter(wg):
|
||||
try:
|
||||
charter = Document.objects.get(name="charter-ietf-" + wg.acronym)
|
||||
charter = Document.objects.get(docalias__name="charter-ietf-%s" % wg.acronym)
|
||||
except Document.DoesNotExist:
|
||||
charter = Document.objects.create(
|
||||
name="charter-ietf-%s" % wg.acronym,
|
||||
name="charter-ietf-" + wg.acronym,
|
||||
time=datetime.now(),
|
||||
type_id="charter",
|
||||
title=wg.name,
|
||||
|
@ -19,10 +19,60 @@ def set_or_create_charter(wg):
|
|||
abstract=wg.name,
|
||||
rev="",
|
||||
)
|
||||
wg.charter = charter
|
||||
wg.save()
|
||||
# Create an alias as well
|
||||
DocAlias.objects.create(
|
||||
name = charter.name,
|
||||
document = charter
|
||||
)
|
||||
if wg.charter != charter:
|
||||
wg.charter = charter
|
||||
wg.save()
|
||||
return charter
|
||||
|
||||
def save_charter_in_history(charter):
|
||||
'''This is a modified save_document_in_history that save the name
|
||||
as charter-ietf-wgacronym with wgacronym being the current Group
|
||||
acronym. The charter Document may have an old name which is no longer
|
||||
in use'''
|
||||
def get_model_fields_as_dict(obj):
|
||||
return dict((field.name, getattr(obj, field.name))
|
||||
for field in obj._meta.fields
|
||||
if field is not obj._meta.pk)
|
||||
|
||||
# copy fields
|
||||
fields = get_model_fields_as_dict(charter)
|
||||
fields["doc"] = charter
|
||||
fields["name"] = 'charter-ietf-%s' % charter.chartered_group.acronym
|
||||
|
||||
chist = DocHistory(**fields)
|
||||
chist.save()
|
||||
|
||||
# copy many to many
|
||||
for field in charter._meta.many_to_many:
|
||||
if not field.rel.through:
|
||||
# just add the attributes
|
||||
rel = getattr(chist, field.name)
|
||||
for item in getattr(charter, field.name).all():
|
||||
rel.add(item)
|
||||
|
||||
# copy remaining tricky many to many
|
||||
def transfer_fields(obj, HistModel):
|
||||
mfields = get_model_fields_as_dict(item)
|
||||
# map charter -> chist
|
||||
for k, v in mfields.iteritems():
|
||||
if v == charter:
|
||||
mfields[k] = chist
|
||||
HistModel.objects.create(**mfields)
|
||||
|
||||
for item in RelatedDocument.objects.filter(source=charter):
|
||||
transfer_fields(item, RelatedDocHistory)
|
||||
|
||||
for item in DocumentAuthor.objects.filter(document=charter):
|
||||
transfer_fields(item, DocHistoryAuthor)
|
||||
|
||||
return chist
|
||||
|
||||
|
||||
def add_wg_comment(request, wg, text, ballot=None):
|
||||
if request:
|
||||
login = request.user.get_profile()
|
||||
|
@ -86,7 +136,19 @@ def get_charter_for_revision(charter, r):
|
|||
if l != []:
|
||||
return l[0]
|
||||
else:
|
||||
return charter
|
||||
# Get the lastest history entry
|
||||
l = list(charter.history_set.all().order_by('-time'))
|
||||
if l != []:
|
||||
class FakeHistory(object):
|
||||
def __init__(self, name, rev, time):
|
||||
self.name = name
|
||||
self.rev = rev
|
||||
self.time = time
|
||||
|
||||
return FakeHistory(l[0].name, charter.rev, charter.time)
|
||||
else:
|
||||
# no history, just return charter
|
||||
return charter
|
||||
|
||||
def get_group_for_revision(wg, r):
|
||||
if r == None:
|
||||
|
@ -118,6 +180,12 @@ def next_revision(rev):
|
|||
else:
|
||||
return "%s-00" % (m.group('major'))
|
||||
|
||||
def approved_revision(rev):
|
||||
if rev == "":
|
||||
return ""
|
||||
m = re.match(r"(?P<major>[0-9][0-9])(-(?P<minor>[0-9][0-9]))?", rev)
|
||||
return m.group('major')
|
||||
|
||||
def next_approved_revision(rev):
|
||||
if rev == "":
|
||||
return "01"
|
||||
|
|
|
@ -22,7 +22,7 @@ from mails import email_secretariat
|
|||
from utils import *
|
||||
from group.models import Group, GroupHistory, GroupEvent, save_group_in_history
|
||||
from name.models import GroupBallotPositionName, CharterDocStateName, GroupStateName
|
||||
from doc.models import Document, DocEvent, GroupBallotPositionDocEvent, save_document_in_history, WriteupDocEvent
|
||||
from doc.models import Document, DocEvent, GroupBallotPositionDocEvent, WriteupDocEvent
|
||||
|
||||
def default_action_text(wg, doc, user):
|
||||
e = WriteupDocEvent(doc=doc, by=user)
|
||||
|
@ -100,7 +100,7 @@ def edit_position(request, name):
|
|||
else:
|
||||
raise Http404
|
||||
|
||||
doc = get_object_or_404(Document, name=wg.charter.name)
|
||||
doc = set_or_create_charter(wg)
|
||||
started_process = doc.latest_event(type="started_iesg_process")
|
||||
|
||||
ad = login = request.user.get_profile()
|
||||
|
@ -230,7 +230,7 @@ def send_ballot_comment(request, name):
|
|||
else:
|
||||
raise Http404
|
||||
|
||||
doc = wg.charter
|
||||
doc = set_or_create_charter(wg)
|
||||
started_process = doc.latest_event(type="started_iesg_process")
|
||||
if not started_process:
|
||||
raise Http404()
|
||||
|
@ -319,7 +319,7 @@ def announcement_text(request, name, ann):
|
|||
else:
|
||||
raise Http404
|
||||
|
||||
doc = wg.charter
|
||||
doc = set_or_create_charter(wg)
|
||||
|
||||
login = request.user.get_profile()
|
||||
|
||||
|
@ -370,7 +370,7 @@ def approve_ballot(request, name):
|
|||
else:
|
||||
raise Http404
|
||||
|
||||
doc = wg.charter
|
||||
doc = set_or_create_charter(wg)
|
||||
|
||||
login = request.user.get_profile()
|
||||
|
||||
|
@ -384,7 +384,7 @@ def approve_ballot(request, name):
|
|||
new_state = GroupStateName.objects.get(slug="active")
|
||||
new_charter_state = CharterDocStateName.objects.get(slug="approved")
|
||||
|
||||
save_document_in_history(doc)
|
||||
save_charter_in_history(doc)
|
||||
save_group_in_history(wg)
|
||||
|
||||
prev_state = wg.state
|
||||
|
|
|
@ -9,12 +9,12 @@ from django import forms
|
|||
from django.forms.util import ErrorList
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
|
||||
from utils import log_state_changed, log_group_state_changed, log_info_changed, update_telechat, add_wg_comment, set_or_create_charter
|
||||
from utils import log_state_changed, log_group_state_changed, log_info_changed, update_telechat, add_wg_comment, set_or_create_charter, save_charter_in_history
|
||||
from mails import email_secretariat
|
||||
from ietf.ietfauth.decorators import group_required
|
||||
from ietf.iesg.models import TelechatDates
|
||||
|
||||
from doc.models import Document, DocHistory, DocEvent, save_document_in_history, TelechatDocEvent, InitialReviewDocEvent
|
||||
from doc.models import Document, DocHistory, DocAlias, DocEvent, TelechatDocEvent, InitialReviewDocEvent
|
||||
from name.models import CharterDocStateName, GroupStateName, GroupTypeName, DocTypeName, RoleName
|
||||
from person.models import Person, Email
|
||||
from group.models import Group, GroupEvent, GroupHistory, GroupURL, Role, RoleHistory, save_group_in_history
|
||||
|
@ -73,7 +73,7 @@ def change_state(request, name):
|
|||
if charter_state != charter.charter_state:
|
||||
# Charter state changed
|
||||
change = True
|
||||
save_document_in_history(charter)
|
||||
save_charter_in_history(charter)
|
||||
|
||||
prev = charter.charter_state
|
||||
charter.charter_state = charter_state
|
||||
|
@ -158,7 +158,6 @@ def change_state(request, name):
|
|||
class EditInfoForm(forms.Form):
|
||||
name = forms.CharField(max_length=255, label="WG Name", required=True)
|
||||
acronym = forms.CharField(max_length=8, label="WG Acronym", required=True)
|
||||
confirm_acronym = forms.BooleanField(widget=forms.HiddenInput, required=False, initial=True)
|
||||
chairs = forms.CharField(max_length=255, label="WG Chairs", help_text="Type in a name", required=False)
|
||||
secretaries = forms.CharField(max_length=255, label="WG Secretaries", help_text="Type in a name", required=False)
|
||||
techadv = forms.CharField(max_length=255, label="WG Technical Advisors", help_text="Type in a name", required=False)
|
||||
|
@ -172,6 +171,7 @@ class EditInfoForm(forms.Form):
|
|||
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.cur_acronym = kwargs.pop('cur_acronym')
|
||||
super(self.__class__, self).__init__(*args, **kwargs)
|
||||
|
||||
# fix up ad field
|
||||
|
@ -194,17 +194,20 @@ class EditInfoForm(forms.Form):
|
|||
|
||||
self.fields['telechat_date'].choices = choices
|
||||
|
||||
def not_valid_acronym(value):
|
||||
try:
|
||||
Group.objects.get(acronym=value)
|
||||
except ObjectDoesNotExist:
|
||||
gh = GroupHistory.objects.filter(acronym=value)
|
||||
if gh:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
def clean_acronym(self):
|
||||
acronym = self.cleaned_data['acronym']
|
||||
if self.cur_acronym and acronym != self.cur_acronym:
|
||||
try:
|
||||
Group.objects.get(acronym=acronym)
|
||||
except ObjectDoesNotExist:
|
||||
gh = GroupHistory.objects.filter(acronym=acronym)
|
||||
if gh:
|
||||
raise forms.ValidationError("Acronym used in a previous WG. Please pick another.")
|
||||
else:
|
||||
return acronym
|
||||
raise forms.ValidationError("Acronym used in a previous WG. Please pick another.")
|
||||
return acronym
|
||||
|
||||
@group_required('Area_Director','Secretariat')
|
||||
def edit_info(request, name=None):
|
||||
"""Edit or create a WG, notifying parties as
|
||||
|
@ -228,152 +231,127 @@ def edit_info(request, name=None):
|
|||
initial_telechat_date = None
|
||||
|
||||
if request.method == 'POST':
|
||||
form = EditInfoForm(request.POST, initial=dict(telechat_date=initial_telechat_date))
|
||||
|
||||
form = EditInfoForm(request.POST, initial=dict(telechat_date=initial_telechat_date), cur_acronym=wg.acronym if wg else None)
|
||||
if form.is_valid():
|
||||
if (new_wg or form.cleaned_data['acronym'] != wg.acronym) and not_valid_acronym(form.cleaned_data['acronym']) and not form.cleaned_data['confirm_acronym']:
|
||||
try:
|
||||
Group.objects.get(acronym=form.cleaned_data['acronym'])
|
||||
form._errors['acronym'] = "error"
|
||||
except ObjectDoesNotExist:
|
||||
form._errors['acronym'] = "warning"
|
||||
r = form.cleaned_data
|
||||
if not new_wg:
|
||||
gh = save_group_in_history(wg)
|
||||
else:
|
||||
r = form.cleaned_data
|
||||
|
||||
if not new_wg:
|
||||
gh = save_group_in_history(wg)
|
||||
else:
|
||||
# Create WG
|
||||
wg = Group(name=r["name"],
|
||||
acronym=r["acronym"],
|
||||
type=GroupTypeName.objects.get(name="WG"),
|
||||
state=GroupStateName.objects.get(name="Proposed"))
|
||||
wg.save()
|
||||
|
||||
e = GroupEvent(group=wg, type="proposed")
|
||||
e.time = datetime.now()
|
||||
e.by = login
|
||||
e.desc = "Proposed group"
|
||||
e.save()
|
||||
if not wg.charter:
|
||||
# Create adjoined charter
|
||||
charter = set_or_create_charter(wg)
|
||||
charter.charter_state = CharterDocStateName.objects.get(slug="infrev")
|
||||
charter.save()
|
||||
|
||||
e = DocEvent(doc=charter, type="started_iesg_process")
|
||||
e.time = datetime.now()
|
||||
e.by = login
|
||||
e.desc = "Started IESG process on charter"
|
||||
e.save()
|
||||
|
||||
wg.charter = charter
|
||||
wg.save()
|
||||
|
||||
changes = []
|
||||
|
||||
def desc(attr, new, old):
|
||||
entry = "%(attr)s has been changed to <b>%(new)s</b> from <b>%(old)s</b>"
|
||||
if new_wg:
|
||||
entry = "%(attr)s has been changed to <b>%(new)s</b>"
|
||||
|
||||
return entry % dict(attr=attr, new=new, old=old)
|
||||
|
||||
def get_model_fields_as_dict(obj):
|
||||
return dict((field.name, getattr(obj, field.name))
|
||||
for field in obj._meta.fields
|
||||
if field is not obj._meta.pk)
|
||||
|
||||
def diff(attr, name):
|
||||
v = getattr(wg, attr)
|
||||
if r[attr] != v:
|
||||
changes.append(desc(name, r[attr], v))
|
||||
setattr(wg, attr, r[attr])
|
||||
if attr == "acronym":
|
||||
c = wg.charter
|
||||
save_document_in_history(c)
|
||||
# copy fields
|
||||
fields = get_model_fields_as_dict(c)
|
||||
fields["name"] = "charter-ietf-%s" % (r[attr])
|
||||
new_c = Document(**fields)
|
||||
new_c.save()
|
||||
# Set WG charter to new one
|
||||
wg.charter = new_c
|
||||
wg.save()
|
||||
# Move history
|
||||
for h in c.history_set.all():
|
||||
h.doc = new_c
|
||||
h.save()
|
||||
# Move events
|
||||
for e in c.docevent_set.all():
|
||||
e.doc = new_c
|
||||
e.save()
|
||||
# And remove the previous charter entry
|
||||
#c.delete()
|
||||
|
||||
# update the attributes, keeping track of what we're doing
|
||||
diff('name', "Name")
|
||||
diff('acronym', "Acronym")
|
||||
diff('ad', "Shepherding AD")
|
||||
diff('parent', "IETF Area")
|
||||
diff('list_email', "Mailing list email")
|
||||
diff('list_subscribe', "Mailing list subscribe address")
|
||||
diff('list_archive', "Mailing list archive")
|
||||
diff('comments', "Comment")
|
||||
|
||||
def get_sorted_string(attr, splitter):
|
||||
if splitter == '\n':
|
||||
out = sorted(r[attr].splitlines())
|
||||
else:
|
||||
out = sorted(r[attr].split(splitter))
|
||||
if out == ['']:
|
||||
out = []
|
||||
return out
|
||||
|
||||
# update roles
|
||||
for attr_role in [('chairs', 'Chair'), ('secretaries', 'Secretary'), ('techadv', 'Tech Advisor')]:
|
||||
attr = attr_role[0]
|
||||
rname = attr_role[1]
|
||||
new = get_sorted_string(attr, ",")
|
||||
old = [x.email.address for x in wg.role_set.filter(name__name=rname).order_by('email__address')]
|
||||
if new != old:
|
||||
# Remove old roles and save them in history
|
||||
for role in wg.role_set.filter(name__name=rname):
|
||||
role.delete()
|
||||
# Add new ones
|
||||
rolename = RoleName.objects.get(name=rname)
|
||||
for e in new:
|
||||
email = Email.objects.get(address=e)
|
||||
role = Role(name=rolename, email=email, group=wg)
|
||||
role.save()
|
||||
|
||||
# update urls
|
||||
new_urls = get_sorted_string('urls', '\n')
|
||||
old_urls = [x.url + " (" + x.name + ")" for x in wg.groupurl_set.order_by('url')]
|
||||
if new_urls != old_urls:
|
||||
# Remove old urls
|
||||
for u in wg.groupurl_set.all():
|
||||
u.delete()
|
||||
# Add new ones
|
||||
for u in [u for u in new_urls if u != ""]:
|
||||
m = re.search('(?P<url>.+) \((?P<name>.+)\)', u)
|
||||
url = GroupURL(url=m.group('url'), name=m.group('name'), group=wg)
|
||||
url.save()
|
||||
|
||||
wg.time = datetime.now()
|
||||
|
||||
if changes and not new_wg:
|
||||
for c in changes:
|
||||
log_info_changed(request, wg, login, c)
|
||||
|
||||
update_telechat(request, wg.charter, login, r['telechat_date'])
|
||||
|
||||
# Create WG
|
||||
wg = Group(name=r["name"],
|
||||
acronym=r["acronym"],
|
||||
type=GroupTypeName.objects.get(name="WG"),
|
||||
state=GroupStateName.objects.get(name="Proposed"))
|
||||
wg.save()
|
||||
|
||||
e = GroupEvent(group=wg, type="proposed")
|
||||
e.time = datetime.now()
|
||||
e.by = login
|
||||
e.desc = "Proposed group"
|
||||
e.save()
|
||||
if not wg.charter:
|
||||
# Create adjoined charter
|
||||
charter = set_or_create_charter(wg)
|
||||
charter.charter_state = CharterDocStateName.objects.get(slug="infrev")
|
||||
charter.save()
|
||||
|
||||
e = DocEvent(doc=charter, type="started_iesg_process")
|
||||
e.time = datetime.now()
|
||||
e.by = login
|
||||
e.desc = "Started IESG process on charter"
|
||||
e.save()
|
||||
|
||||
changes = []
|
||||
|
||||
def desc(attr, new, old):
|
||||
entry = "%(attr)s has been changed to <b>%(new)s</b> from <b>%(old)s</b>"
|
||||
if new_wg:
|
||||
return redirect('wg_change_state', name=wg.acronym)
|
||||
entry = "%(attr)s has been changed to <b>%(new)s</b>"
|
||||
|
||||
return entry % dict(attr=attr, new=new, old=old)
|
||||
|
||||
def get_model_fields_as_dict(obj):
|
||||
return dict((field.name, getattr(obj, field.name))
|
||||
for field in obj._meta.fields
|
||||
if field is not obj._meta.pk)
|
||||
|
||||
def diff(attr, name):
|
||||
v = getattr(wg, attr)
|
||||
if r[attr] != v:
|
||||
changes.append(desc(name, r[attr], v))
|
||||
setattr(wg, attr, r[attr])
|
||||
if attr == "acronym":
|
||||
c = wg.charter
|
||||
save_charter_in_history(c)
|
||||
# and add a DocAlias
|
||||
DocAlias.objects.create(
|
||||
name = "charter-ietf-%s" % r['acronym'],
|
||||
document = charter
|
||||
)
|
||||
|
||||
# update the attributes, keeping track of what we're doing
|
||||
diff('name', "Name")
|
||||
diff('acronym', "Acronym")
|
||||
diff('ad', "Shepherding AD")
|
||||
diff('parent', "IETF Area")
|
||||
diff('list_email', "Mailing list email")
|
||||
diff('list_subscribe', "Mailing list subscribe address")
|
||||
diff('list_archive', "Mailing list archive")
|
||||
diff('comments', "Comment")
|
||||
|
||||
def get_sorted_string(attr, splitter):
|
||||
if splitter == '\n':
|
||||
out = sorted(r[attr].splitlines())
|
||||
else:
|
||||
return redirect('wg_view_record', name=wg.acronym)
|
||||
else:
|
||||
out = sorted(r[attr].split(splitter))
|
||||
if out == ['']:
|
||||
out = []
|
||||
return out
|
||||
|
||||
# update roles
|
||||
for attr_role in [('chairs', 'Chair'), ('secretaries', 'Secretary'), ('techadv', 'Tech Advisor')]:
|
||||
attr = attr_role[0]
|
||||
rname = attr_role[1]
|
||||
new = get_sorted_string(attr, ",")
|
||||
old = [x.email.address for x in wg.role_set.filter(name__name=rname).order_by('email__address')]
|
||||
if new != old:
|
||||
# Remove old roles and save them in history
|
||||
for role in wg.role_set.filter(name__name=rname):
|
||||
role.delete()
|
||||
# Add new ones
|
||||
rolename = RoleName.objects.get(name=rname)
|
||||
for e in new:
|
||||
email = Email.objects.get(address=e)
|
||||
role = Role(name=rolename, email=email, group=wg)
|
||||
role.save()
|
||||
|
||||
# update urls
|
||||
new_urls = get_sorted_string('urls', '\n')
|
||||
old_urls = [x.url + " (" + x.name + ")" for x in wg.groupurl_set.order_by('url')]
|
||||
if new_urls != old_urls:
|
||||
# Remove old urls
|
||||
for u in wg.groupurl_set.all():
|
||||
u.delete()
|
||||
# Add new ones
|
||||
for u in [u for u in new_urls if u != ""]:
|
||||
m = re.search('(?P<url>.+) \((?P<name>.+)\)', u)
|
||||
url = GroupURL(url=m.group('url'), name=m.group('name'), group=wg)
|
||||
url.save()
|
||||
|
||||
wg.time = datetime.now()
|
||||
|
||||
if changes and not new_wg:
|
||||
for c in changes:
|
||||
log_info_changed(request, wg, login, c)
|
||||
|
||||
update_telechat(request, wg.charter, login, r['telechat_date'])
|
||||
|
||||
wg.save()
|
||||
if new_wg:
|
||||
return redirect('wg_change_state', name=wg.acronym)
|
||||
else:
|
||||
return redirect('wg_view_record', name=wg.acronym)
|
||||
else: # form.is_valid()
|
||||
if not new_wg:
|
||||
init = dict(name=wg.name,
|
||||
acronym=wg.acronym,
|
||||
|
@ -393,7 +371,7 @@ def edit_info(request, name=None):
|
|||
else:
|
||||
init = dict(ad=login.id,
|
||||
)
|
||||
form = EditInfoForm(initial=init)
|
||||
form = EditInfoForm(initial=init, cur_acronym=wg.acronym if wg else None)
|
||||
|
||||
return render_to_response('wgrecord/edit_info.html',
|
||||
dict(wg=wg,
|
||||
|
|
|
@ -11,9 +11,9 @@ from django.utils import simplejson as json
|
|||
from django.utils.decorators import decorator_from_middleware
|
||||
from django.middleware.gzip import GZipMiddleware
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from redesign.doc.models import Document, DocHistory, GroupBallotPositionDocEvent, WriteupDocEvent
|
||||
from redesign.group.models import Group, GroupHistory
|
||||
from redesign.person.models import Person
|
||||
from doc.models import GroupBallotPositionDocEvent, WriteupDocEvent
|
||||
from group.models import Group, GroupHistory
|
||||
from person.models import Person
|
||||
from wgrecord import markup_txt
|
||||
from django.conf import settings
|
||||
|
||||
|
@ -48,13 +48,13 @@ def wg_main(request, name, rev, tab):
|
|||
raise Http404
|
||||
|
||||
if not wg.charter:
|
||||
create_empty_charter(wg)
|
||||
set_or_create_charter(wg)
|
||||
|
||||
if rev != None:
|
||||
charter = get_charter_for_revision(wg.charter, rev)
|
||||
ch = get_charter_for_revision(wg.charter, rev)
|
||||
gh = get_group_for_revision(wg, rev)
|
||||
else:
|
||||
charter = get_charter_for_revision(wg.charter, wg.charter.rev)
|
||||
ch = get_charter_for_revision(wg.charter, wg.charter.rev)
|
||||
gh = get_group_for_revision(wg, wg.charter.rev)
|
||||
|
||||
info = {}
|
||||
|
@ -77,10 +77,11 @@ def wg_main(request, name, rev, tab):
|
|||
info['secr'] = [x.email.person.name for x in wg.role_set.filter(name__slug="secr")]
|
||||
info['techadv'] = [x.email.person.name for x in wg.role_set.filter(name__slug="techadv")]
|
||||
|
||||
if charter:
|
||||
if ch:
|
||||
file_path = wg.charter.get_file_path() # Get from wg.charter
|
||||
content = _get_html(
|
||||
str(charter.name)+"-"+str(charter.rev)+",html",
|
||||
os.path.join(charter.get_file_path(), charter.name+"-"+charter.rev+".txt"))
|
||||
str(ch.name)+"-"+str(ch.rev)+",html",
|
||||
os.path.join(file_path, ch.name+"-"+ch.rev+".txt"))
|
||||
active_ads = list(Person.objects.filter(email__role__name="ad",
|
||||
email__role__group__type="area",
|
||||
email__role__group__state="active").distinct())
|
||||
|
@ -109,19 +110,19 @@ def wg_main(request, name, rev, tab):
|
|||
else:
|
||||
content = ""
|
||||
|
||||
versions = _get_versions(wg.charter) # Important: wg.charter not charter
|
||||
versions = _get_versions(wg.charter) # Important: wg.charter not ch
|
||||
history = _get_history(wg)
|
||||
|
||||
if history:
|
||||
info['last_update'] = history[0]['date']
|
||||
|
||||
charter_text_url = charter.get_txt_url()
|
||||
charter_text_url = wg.charter.get_txt_url()
|
||||
|
||||
template = "wgrecord/record_tab_%s" % tab
|
||||
return render_to_response(template + ".html",
|
||||
{'content':content,
|
||||
'charter':charter, 'info':info, 'wg':wg, 'tab':tab,
|
||||
'rev': rev if rev else charter.rev, 'gh': gh,
|
||||
'charter':ch, 'info':info, 'wg':wg, 'tab':tab,
|
||||
'rev': rev if rev else ch.rev, 'gh': gh,
|
||||
'snapshot': rev, 'charter_text_url': charter_text_url,
|
||||
'history': history, 'versions': versions,
|
||||
},
|
||||
|
@ -182,7 +183,8 @@ def _get_versions(charter, include_replaced=True):
|
|||
if d.rev != charter.rev:
|
||||
ov.append({"name":d.name, "rev":d.rev, "date":d.time})
|
||||
if charter.rev != "":
|
||||
ov.append({"name": charter.name, "rev": charter.rev, "date":charter.time})
|
||||
d = get_charter_for_revision(charter, charter.rev)
|
||||
ov.append({"name": d.name, "rev": d.rev, "date":d.time})
|
||||
return ov
|
||||
|
||||
def wg_ballot(request, name):
|
||||
|
@ -195,7 +197,7 @@ def wg_ballot(request, name):
|
|||
else:
|
||||
raise Http404
|
||||
|
||||
doc = wg.charter
|
||||
doc = set_or_create_charter(wg)
|
||||
|
||||
if not doc:
|
||||
raise Http404
|
||||
|
|
|
@ -101,14 +101,14 @@ def search_query(query_original, sort_by=None):
|
|||
elif by == "area":
|
||||
results = results.filter(parent=query["area"])
|
||||
elif by == "anyfield":
|
||||
q_objs = Q()
|
||||
q_objs |= Q(acronym__icontains=query['anyfield'])
|
||||
q_objs |= Q(state__name__icontains=query['anyfield'])
|
||||
q_objs |= Q(charter__charter_state__name__icontains=query['anyfield'])
|
||||
q_objs |= Q(ad__name__icontains=query['anyfield'])
|
||||
q_objs |= Q(parent__name__icontains=query['anyfield'])
|
||||
q_objs |= Q(history_set__acronym__icontains=query['anyfield'])
|
||||
results = list(results.filter(*q_objs))
|
||||
q_obj = Q()
|
||||
q_obj |= Q(acronym__icontains=query['anyfield'])
|
||||
q_obj |= Q(state__name__icontains=query['anyfield'])
|
||||
q_obj |= Q(charter__charter_state__name__icontains=query['anyfield'])
|
||||
q_obj |= Q(ad__name__icontains=query['anyfield'])
|
||||
q_obj |= Q(parent__name__icontains=query['anyfield'])
|
||||
q_obj |= Q(history_set__acronym__icontains=query['anyfield'])
|
||||
results = list(results.filter(q_obj))
|
||||
# Search charter texts
|
||||
m = re.compile(query['anyfield'], re.IGNORECASE)
|
||||
if query['name']:
|
||||
|
|
|
@ -10,22 +10,21 @@ from django.template import RequestContext
|
|||
|
||||
from ietf.ietfauth.decorators import group_required
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from group.models import save_group_in_history
|
||||
from doc.models import Document, DocHistory, DocEvent, save_document_in_history
|
||||
from redesign.group.models import Group
|
||||
from group.models import Group, save_group_in_history
|
||||
from doc.models import Document, DocHistory, DocEvent
|
||||
|
||||
from django.conf import settings
|
||||
from utils import next_revision, set_or_create_charter
|
||||
from utils import next_revision, set_or_create_charter, save_charter_in_history
|
||||
|
||||
class UploadForm(forms.Form):
|
||||
txt = forms.FileField(label=".txt format", required=True)
|
||||
|
||||
def save(self, wg):
|
||||
def save(self, wg, rev):
|
||||
for ext in ['txt']:
|
||||
fd = self.cleaned_data[ext]
|
||||
if not fd:
|
||||
continue
|
||||
filename = os.path.join(settings.CHARTER_PATH, 'charter-ietf-%s-%s.%s' % (wg.acronym, next_revision(wg.charter.rev), ext))
|
||||
filename = os.path.join(settings.CHARTER_PATH, 'charter-ietf-%s-%s.%s' % (wg.acronym, rev, ext))
|
||||
destination = open(filename, 'wb+')
|
||||
for chunk in fd.chunks():
|
||||
destination.write(chunk)
|
||||
|
@ -50,7 +49,7 @@ def submit(request, name):
|
|||
if request.method == 'POST':
|
||||
form = UploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
save_document_in_history(charter)
|
||||
save_charter_in_history(charter)
|
||||
# Also save group history so we can search for it
|
||||
save_group_in_history(wg)
|
||||
|
||||
|
@ -64,7 +63,7 @@ def submit(request, name):
|
|||
e.save()
|
||||
|
||||
# Save file on disk
|
||||
form.save(wg)
|
||||
form.save(wg, charter.rev)
|
||||
|
||||
charter.time = datetime.now()
|
||||
charter.save()
|
||||
|
|
|
@ -98,7 +98,7 @@ class Document(DocumentInfo):
|
|||
def get_absolute_url(self):
|
||||
name = self.name
|
||||
if self.type_id == "charter":
|
||||
return urlreverse('record_view', kwargs={ 'name': self.group.acronym })
|
||||
return urlreverse('wg_view_record', kwargs={ 'name': self.group.acronym })
|
||||
else:
|
||||
if self.state == "rfc":
|
||||
aliases = self.docalias_set.filter(name__startswith="rfc")
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
from redesign.proxy_utils import TranslatingManager
|
||||
|
||||
from models import *
|
||||
from doc.models import Document # for charter text
|
||||
from ietf.wgrecord.utils import get_charter_for_revision, approved_revision
|
||||
|
||||
class Acronym(Group):
|
||||
class LazyIndividualSubmitter(object):
|
||||
|
@ -192,12 +194,23 @@ class IETFWG(Group):
|
|||
from django.conf import settings
|
||||
# get file path from settings. Syntesize file name from path, acronym, and suffix
|
||||
try:
|
||||
filename = os.path.join(settings.IETFWG_DESCRIPTIONS_PATH, self.acronym) + ".desc.txt"
|
||||
# Try getting charter from new charter tool
|
||||
charter = Document.objects.get(docalias__name="charter-ietf-%s" % self.acronym)
|
||||
ch = get_charter_for_revision(charter, charter.rev)
|
||||
name = ch.name
|
||||
rev = approved_revision(ch.rev)
|
||||
filename = os.path.join(charter.get_file_path(), "%s-%s.txt" % (name, rev))
|
||||
desc_file = open(filename)
|
||||
desc = desc_file.read()
|
||||
except BaseException:
|
||||
desc = 'Error Loading Work Group Description'
|
||||
return desc
|
||||
return desc
|
||||
except:
|
||||
try:
|
||||
filename = os.path.join(settings.IETFWG_DESCRIPTIONS_PATH, self.acronym) + ".desc.txt"
|
||||
desc_file = open(filename)
|
||||
desc = desc_file.read()
|
||||
except BaseException:
|
||||
desc = 'Error Loading Work Group Description'
|
||||
return desc
|
||||
|
||||
def additional_urls(self):
|
||||
return self.groupurl_set.all().order_by("name")
|
||||
|
|
|
@ -20,6 +20,8 @@ from redesign.importing.utils import old_person_to_person
|
|||
from ietf.idtracker.models import AreaGroup, IETFWG, Area, AreaGroup, Acronym, AreaWGURL, IRTF, ChairsHistory, Role, AreaDirector
|
||||
from ietf.liaisons.models import SDOs
|
||||
|
||||
from ietf.wgrecord.utils import set_or_create_charter
|
||||
|
||||
# imports IETFWG, Area, AreaGroup, Acronym, IRTF, AreaWGURL, SDOs
|
||||
|
||||
# also creates nomcom groups
|
||||
|
@ -254,19 +256,10 @@ for o in IETFWG.objects.all().order_by("pk"):
|
|||
l = ""
|
||||
group.list_archive = l
|
||||
|
||||
try:
|
||||
charter = Document.objects.get(name="charter-ietf-" + o.group_acronym.acronym)
|
||||
except Document.DoesNotExist:
|
||||
charter = Document(type = name(DocTypeName, "charter", "Charter"),
|
||||
title = o.group_acronym.name,
|
||||
abstract= o.group_acronym.name,
|
||||
name="charter-ietf-" + o.group_acronym.acronym,
|
||||
)
|
||||
charter.rev = "01"
|
||||
charter.charter_state = name(CharterDocStateName, slug="approved", name="Approved", desc="The WG is approved by the IESG.")
|
||||
charter.group = group
|
||||
charter.save()
|
||||
group.charter = charter
|
||||
charter = set_or_create_charter(group)
|
||||
charter.rev = "01"
|
||||
charter.charter_state = name(CharterDocStateName, slug="approved", name="Approved", desc="The WG is approved by the IESG.")
|
||||
charter.save()
|
||||
|
||||
group.comments = o.comments.strip() if o.comments else ""
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ authorized_role = name(RoleName, "auth", "Authorized Individual")
|
|||
|
||||
# SDOAuthorizedIndividual
|
||||
for o in SDOAuthorizedIndividual.objects.all().order_by("pk"):
|
||||
print "importing SDOAuthorizedIndividual", o.pk, o.sdo, o.person
|
||||
print "importing SDOAuthorizedIndividual", o.pk, unicode(o.sdo).encode("utf-8"), unicode(o.person).encode("utf-8")
|
||||
|
||||
group = Group.objects.get(name=o.sdo.sdo_name, type="sdo")
|
||||
email = get_or_create_email(o, create_fake=False)
|
||||
|
@ -55,7 +55,7 @@ for o in SDOAuthorizedIndividual.objects.all().order_by("pk"):
|
|||
|
||||
# LiaisonManagers
|
||||
for o in LiaisonManagers.objects.all().order_by("pk"):
|
||||
print "importing LiaisonManagers", o.pk, o.sdo, o.person
|
||||
print "importing LiaisonManagers", o.pk, unicode(o.sdo).encode("utf-8"), unicode(o.person).encode("utf-8")
|
||||
|
||||
group = Group.objects.get(name=o.sdo.sdo_name, type="sdo")
|
||||
email = Email.objects.get(address__iexact=o.person.email(priority=o.email_priority)[1])
|
||||
|
@ -80,13 +80,10 @@ for o in OldRole.objects.all().order_by('pk'):
|
|||
acronym = "ietf"
|
||||
role = adm_director_role
|
||||
|
||||
try:
|
||||
group = Group.objects.get(acronym=acronym)
|
||||
email = get_or_create_email(o, create_fake=False)
|
||||
|
||||
Role.objects.get_or_create(name=role, group=group, email=email)
|
||||
except:
|
||||
pass #FIXME this fails for group RSOC
|
||||
group = Group.objects.get(acronym=acronym)
|
||||
email = get_or_create_email(o, create_fake=False)
|
||||
|
||||
Role.objects.get_or_create(name=role, group=group, email=email)
|
||||
|
||||
# WGEditor
|
||||
for o in WGEditor.objects.all():
|
||||
|
@ -264,6 +261,7 @@ for o in IESGHistory.objects.all().order_by('meeting__start_date', 'pk'):
|
|||
state=existing.state,
|
||||
type=existing.type,
|
||||
parent=existing.parent,
|
||||
iesg_state=existing.iesg_state,
|
||||
ad=existing.ad,
|
||||
list_email=existing.list_email,
|
||||
list_subscribe=existing.list_subscribe,
|
||||
|
|
Loading…
Reference in a new issue