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:
Martin Qvist 2011-08-23 13:15:16 +00:00
parent b73c5358e7
commit 2ed5c356d4
13 changed files with 313 additions and 253 deletions

View file

@ -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

View file

@ -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 %}

View file

@ -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)"

View file

@ -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"

View file

@ -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

View file

@ -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,

View file

@ -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

View file

@ -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']:

View file

@ -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()

View file

@ -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")

View file

@ -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")

View file

@ -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 ""

View file

@ -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,