From 2ed5c356d426bacb0dbd84c94bf5c7febef95374 Mon Sep 17 00:00:00 2001 From: Martin Qvist Date: Tue, 23 Aug 2011 13:15:16 +0000 Subject: [PATCH] Disabled changing of acronym, charter lookup by DocAlias, changes to group proxy model so it gets the correct charter - Legacy-Id: 3355 --- ietf/idtracker/models.py | 43 +++- ietf/templates/wgrecord/edit_info.html | 12 +- ietf/wgrecord/tests.py | 6 +- ietf/wgrecord/utils.py | 80 ++++++- ietf/wgrecord/views_ballot.py | 12 +- ietf/wgrecord/views_edit.py | 292 ++++++++++++------------- ietf/wgrecord/views_rec.py | 32 +-- ietf/wgrecord/views_search.py | 16 +- ietf/wgrecord/views_submit.py | 15 +- redesign/doc/models.py | 2 +- redesign/group/proxy.py | 21 +- redesign/importing/import-groups.py | 19 +- redesign/importing/import-roles.py | 16 +- 13 files changed, 313 insertions(+), 253 deletions(-) diff --git a/ietf/idtracker/models.py b/ietf/idtracker/models.py index dba05c278..bc32038f0 100644 --- a/ietf/idtracker/models.py +++ b/ietf/idtracker/models.py @@ -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 diff --git a/ietf/templates/wgrecord/edit_info.html b/ietf/templates/wgrecord/edit_info.html index a38849ce6..ac6454ab7 100644 --- a/ietf/templates/wgrecord/edit_info.html +++ b/ietf/templates/wgrecord/edit_info.html @@ -54,23 +54,13 @@ Create WG record {{ field.label_tag }}: {{ field }} - {% ifequal field.name "acronym" %} - {% ifequal field.errors "error" %} - - {% endifequal %} - {% ifequal field.errors "warning" %} - - {% endifequal %} - {% endifequal %} {% ifequal field.name "ad" %} {% if user|in_group:"Area_Director" %} {% endif %} {% endifequal %} {% if field.help_text %}
{{ field.help_text }}
{% endif %} - {% ifnotequal field.name "acronym" %} - {{ field.errors }} - {% endifnotequal %} + {{ field.errors }} {% endfor %} diff --git a/ietf/wgrecord/tests.py b/ietf/wgrecord/tests.py index 7132b1f22..5c877b14f 100644 --- a/ietf/wgrecord/tests.py +++ b/ietf/wgrecord/tests.py @@ -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)" diff --git a/ietf/wgrecord/utils.py b/ietf/wgrecord/utils.py index 385192a43..372e1b07f 100644 --- a/ietf/wgrecord/utils.py +++ b/ietf/wgrecord/utils.py @@ -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[0-9][0-9])(-(?P[0-9][0-9]))?", rev) + return m.group('major') + def next_approved_revision(rev): if rev == "": return "01" diff --git a/ietf/wgrecord/views_ballot.py b/ietf/wgrecord/views_ballot.py index e03f05a12..43f2ad20d 100644 --- a/ietf/wgrecord/views_ballot.py +++ b/ietf/wgrecord/views_ballot.py @@ -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 diff --git a/ietf/wgrecord/views_edit.py b/ietf/wgrecord/views_edit.py index 017bea759..96d5c52f9 100644 --- a/ietf/wgrecord/views_edit.py +++ b/ietf/wgrecord/views_edit.py @@ -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 %(new)s from %(old)s" - if new_wg: - entry = "%(attr)s has been changed to %(new)s" - - 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.+) \((?P.+)\)', 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 %(new)s from %(old)s" if new_wg: - return redirect('wg_change_state', name=wg.acronym) + entry = "%(attr)s has been changed to %(new)s" + + 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.+) \((?P.+)\)', 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, diff --git a/ietf/wgrecord/views_rec.py b/ietf/wgrecord/views_rec.py index a40d1d5a1..cc81b8267 100644 --- a/ietf/wgrecord/views_rec.py +++ b/ietf/wgrecord/views_rec.py @@ -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 diff --git a/ietf/wgrecord/views_search.py b/ietf/wgrecord/views_search.py index 95ea7e4e7..0f84d82e9 100644 --- a/ietf/wgrecord/views_search.py +++ b/ietf/wgrecord/views_search.py @@ -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']: diff --git a/ietf/wgrecord/views_submit.py b/ietf/wgrecord/views_submit.py index b8ae2c566..ecc19aafd 100644 --- a/ietf/wgrecord/views_submit.py +++ b/ietf/wgrecord/views_submit.py @@ -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() diff --git a/redesign/doc/models.py b/redesign/doc/models.py index 19028e00d..bfc24845b 100644 --- a/redesign/doc/models.py +++ b/redesign/doc/models.py @@ -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") diff --git a/redesign/group/proxy.py b/redesign/group/proxy.py index 45b1b9f36..26929e03d 100644 --- a/redesign/group/proxy.py +++ b/redesign/group/proxy.py @@ -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") diff --git a/redesign/importing/import-groups.py b/redesign/importing/import-groups.py index efd513a78..54275bc8d 100755 --- a/redesign/importing/import-groups.py +++ b/redesign/importing/import-groups.py @@ -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 "" diff --git a/redesign/importing/import-roles.py b/redesign/importing/import-roles.py index 96542b8db..cfa9f7741 100755 --- a/redesign/importing/import-roles.py +++ b/redesign/importing/import-roles.py @@ -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,