Skip to content

Commit 74a02be

Browse files
committed
Create new branch from trunk@r11921, and merge review-tracker-r11360 into it
- Legacy-Id: 11923
2 parents 14607c9 + 1f7d487 commit 74a02be

61 files changed

Lines changed: 4757 additions & 399 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ietf/api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ def to_simple_html(self, data, options):
7979
_root, _name = _app.split('.', 1)
8080
if _root == 'ietf':
8181
if not '.' in _name:
82+
if _name in _module_dict:
83+
continue
8284

8385
_api = Api(api_name=_name)
8486
_module_dict[_name] = _api

ietf/doc/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,10 @@ class DocReminder(models.Model):
682682
("rfc_editor_received_announcement", "Announcement was received by RFC Editor"),
683683
("requested_publication", "Publication at RFC Editor requested"),
684684
("sync_from_rfc_editor", "Received updated information from RFC Editor"),
685+
686+
# review
687+
("requested_review", "Requested review"),
688+
("changed_review_request", "Changed review request"),
685689
]
686690

687691
class DocEvent(models.Model):

ietf/doc/tests_review.py

Lines changed: 540 additions & 0 deletions
Large diffs are not rendered by default.

ietf/doc/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/emailposition/$' % settings.URL_REGEXPS, views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
7575
(r'^%(name)s/(?:%(rev)s/)?doc.json$' % settings.URL_REGEXPS, views_doc.document_json),
7676
(r'^%(name)s/ballotpopup/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.ballot_popup),
77+
url(r'^(?P<name>[A-Za-z0-9._+-]+)/reviewrequest/', include("ietf.doc.urls_review")),
7778

7879
url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='doc_email', permanent=False),name='doc_specific_email_aliases'),
7980

ietf/doc/urls_review.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from django.conf.urls import patterns, url
2+
from ietf.doc import views_review
3+
4+
urlpatterns = patterns('',
5+
url(r'^$', views_review.request_review),
6+
url(r'^(?P<request_id>[0-9]+)/$', views_review.review_request),
7+
url(r'^(?P<request_id>[0-9]+)/close/$', views_review.close_request),
8+
url(r'^(?P<request_id>[0-9]+)/assignreviewer/$', views_review.assign_reviewer),
9+
url(r'^(?P<request_id>[0-9]+)/rejectreviewerassignment/$', views_review.reject_reviewer_assignment),
10+
url(r'^(?P<request_id>[0-9]+)/complete/$', views_review.complete_review),
11+
url(r'^(?P<request_id>[0-9]+)/searchmailarchive/$', views_review.search_mail_archive),
12+
)
13+

ietf/doc/utils.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import urllib
44
import math
55
import datetime
6+
from collections import defaultdict
67

78
from django.conf import settings
89
from django.db.models.query import EmptyQuerySet
@@ -109,7 +110,6 @@ def can_adopt_draft(user, doc):
109110
group__state="active",
110111
person__user=user).exists())
111112

112-
113113
def two_thirds_rule( recused=0 ):
114114
# For standards-track, need positions from 2/3 of the non-recused current IESG.
115115
active = Role.objects.filter(name="ad",group__type="area",group__state="active").count()
@@ -587,6 +587,39 @@ def uppercase_std_abbreviated_name(name):
587587
else:
588588
return name
589589

590+
def extract_complete_replaces_ancestor_mapping_for_docs(names):
591+
"""Return dict mapping all replaced by relationships of the
592+
replacement ancestors to docs. So if x is directly replaced by y
593+
and y is in names or replaced by something in names, x in
594+
replaces[y]."""
595+
596+
replaces = defaultdict(set)
597+
598+
checked = set()
599+
front = names
600+
while True:
601+
if not front:
602+
break
603+
604+
relations = RelatedDocument.objects.filter(
605+
source__in=front, relationship="replaces"
606+
).select_related("target").values_list("source", "target__document")
607+
608+
if not relations:
609+
break
610+
611+
checked.update(front)
612+
613+
front = []
614+
for source_doc, target_doc in relations:
615+
replaces[source_doc].add(target_doc)
616+
617+
if target_doc not in checked:
618+
front.append(target_doc)
619+
620+
return replaces
621+
622+
590623
def crawl_history(doc):
591624
# return document history data for inclusion in doc.json (used by timeline)
592625
def get_ancestors(doc):

ietf/doc/views_charter.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -344,14 +344,6 @@ def clean_content(self):
344344
def clean_txt(self):
345345
return get_cleaned_text_file_content(self.cleaned_data["txt"])
346346

347-
def save(self, group, rev):
348-
filename = os.path.join(settings.CHARTER_PATH, '%s-%s.txt' % (group.charter.canonical_name(), rev))
349-
with open(filename, 'wb') as destination:
350-
if self.cleaned_data['txt']:
351-
destination.write(self.cleaned_data['txt'])
352-
else:
353-
destination.write(self.cleaned_data['content'].encode("utf-8"))
354-
355347
@login_required
356348
def submit(request, name, option=None):
357349
if not name.startswith('charter-'):
@@ -417,7 +409,12 @@ def submit(request, name, option=None):
417409
events.append(e)
418410

419411
# Save file on disk
420-
form.save(group, charter.rev)
412+
filename = os.path.join(settings.CHARTER_PATH, '%s-%s.txt' % (charter.canonical_name(), charter.rev))
413+
with open(filename, 'wb') as destination:
414+
if form.cleaned_data['txt']:
415+
destination.write(form.cleaned_data['txt'])
416+
else:
417+
destination.write(form.cleaned_data['content'].encode("utf-8"))
421418

422419
if option in ['initcharter','recharter'] and charter.ad == None:
423420
charter.ad = getattr(group.ad_role(),'person',None)

ietf/doc/views_doc.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
from ietf.doc.utils import ( add_links_in_new_revision_events, augment_events_with_revision,
5151
can_adopt_draft, get_chartering_type, get_document_content, get_tags_for_stream_id,
5252
needed_ballot_positions, nice_consensus, prettify_std_name, update_telechat, has_same_ballot,
53-
get_initial_notify, make_notify_changed_event, crawl_history, default_consensus)
53+
get_initial_notify, make_notify_changed_event, crawl_history, default_consensus )
5454
from ietf.community.utils import augment_docs_with_tracking_info
5555
from ietf.group.models import Role
5656
from ietf.group.utils import can_manage_group, can_manage_materials
@@ -59,10 +59,13 @@
5959
from ietf.person.models import Email
6060
from ietf.utils.history import find_history_active_at
6161
from ietf.doc.forms import TelechatForm, NotifyForm
62-
from ietf.doc.mails import email_comment
62+
from ietf.doc.mails import email_comment
6363
from ietf.mailtrigger.utils import gather_relevant_expansions
6464
from ietf.meeting.models import Session
6565
from ietf.meeting.utils import group_sessions, get_upcoming_manageable_sessions, sort_sessions
66+
from ietf.review.models import ReviewRequest
67+
from ietf.review.utils import can_request_review_of_doc, review_requests_to_list_for_doc
68+
from ietf.review.utils import no_review_from_teams_on_doc
6669

6770
def render_document_top(request, doc, tab, name):
6871
tabs = []
@@ -281,8 +284,8 @@ def document_main(request, name, rev=None):
281284
can_edit_stream_info = is_authorized_in_doc_stream(request.user, doc)
282285
can_edit_shepherd_writeup = can_edit_stream_info or user_is_person(request.user, doc.shepherd and doc.shepherd.person) or has_role(request.user, ["Area Director"])
283286
can_edit_notify = can_edit_shepherd_writeup
284-
can_edit_consensus = False
285287

288+
can_edit_consensus = False
286289
consensus = nice_consensus(default_consensus(doc))
287290
if doc.stream_id == "ietf" and iesg_state:
288291
show_in_states = set(IESG_BALLOT_ACTIVE_STATES)
@@ -296,6 +299,8 @@ def document_main(request, name, rev=None):
296299
e = doc.latest_event(ConsensusDocEvent, type="changed_consensus")
297300
consensus = nice_consensus(e and e.consensus)
298301

302+
can_request_review = can_request_review_of_doc(request.user, doc)
303+
299304
# mailing list search archive
300305
search_archive = "www.ietf.org/mail-archive/web/"
301306
if doc.stream_id == "ietf" and group.type_id == "wg" and group.list_archive:
@@ -355,6 +360,9 @@ def document_main(request, name, rev=None):
355360
published = doc.latest_event(type="published_rfc")
356361
started_iesg_process = doc.latest_event(type="started_iesg_process")
357362

363+
review_requests = review_requests_to_list_for_doc(doc)
364+
no_review_from_teams = no_review_from_teams_on_doc(doc, rev or doc.rev)
365+
358366
return render_to_response("doc/document_draft.html",
359367
dict(doc=doc,
360368
group=group,
@@ -376,6 +384,7 @@ def document_main(request, name, rev=None):
376384
can_edit_consensus=can_edit_consensus,
377385
can_edit_replaces=can_edit_replaces,
378386
can_view_possibly_replaces=can_view_possibly_replaces,
387+
can_request_review=can_request_review,
379388

380389
rfc_number=rfc_number,
381390
draft_name=draft_name,
@@ -414,6 +423,8 @@ def document_main(request, name, rev=None):
414423
search_archive=search_archive,
415424
actions=actions,
416425
presentations=presentations,
426+
review_requests=review_requests,
427+
no_review_from_teams=no_review_from_teams,
417428
),
418429
context_instance=RequestContext(request))
419430

@@ -565,6 +576,29 @@ def document_main(request, name, rev=None):
565576
),
566577
context_instance=RequestContext(request))
567578

579+
580+
if doc.type_id == "review":
581+
basename = "{}.txt".format(doc.name, doc.rev)
582+
pathname = os.path.join(doc.get_file_path(), basename)
583+
content = get_document_content(basename, pathname, split=False)
584+
585+
review_req = ReviewRequest.objects.filter(review=doc.name).first()
586+
587+
other_reviews = []
588+
if review_req:
589+
other_reviews = [r for r in review_requests_to_list_for_doc(review_req.doc) if r != review_req]
590+
591+
return render(request, "doc/document_review.html",
592+
dict(doc=doc,
593+
top=top,
594+
content=content,
595+
revisions=revisions,
596+
latest_rev=latest_rev,
597+
snapshot=snapshot,
598+
review_req=review_req,
599+
other_reviews=other_reviews,
600+
))
601+
568602
raise Http404
569603

570604

0 commit comments

Comments
 (0)