示例#1
0
def do_undefer_ballot(request, doc):
    '''
    Helper function to perform undefer of ballot.  Takes the Request object, for use in 
    logging, and the Document object.
    '''
    login = request.user.person
    telechat_date = TelechatDate.objects.active().order_by("date")[0].date
    save_document_in_history(doc)

    new_state = doc.get_state()
    prev_tags = new_tags = []

    if doc.type_id == 'draft':
        new_state = State.objects.get(used=True, type="draft-iesg", slug='iesg-eva')
        prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
    elif doc.type_id in ['conflrev','statchg']:
        new_state = State.objects.get(used=True, type=doc.type_id, slug='iesgeval')

    prev_state = doc.get_state(new_state.type_id if new_state else None)

    doc.set_state(new_state)
    doc.tags.remove(*prev_tags)

    e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags)
    
    doc.time = (e and e.time) or datetime.datetime.now()
    doc.save()

    update_telechat(request, doc, login, telechat_date)
    email_state_changed(request, doc, e.desc)
    email_ballot_undeferred(request, doc, login.plain_name(), telechat_date)
示例#2
0
文件: tests.py 项目: ekr/ietfdb
 def test_doc_detail_draft(self):
     draft = make_test_data()
     d = get_next_telechat_date()
     date = d.strftime('%Y-%m-%d')
     by = Person.objects.get(name="(System)")
     update_telechat(None, draft, by, date)
     url = reverse('ietf.secr.telechat.views.doc_detail',
                   kwargs={
                       'date': date,
                       'name': draft.name
                   })
     self.client.login(username="******", password="******")
     response = self.client.get(url)
     self.assertEqual(response.status_code, 200)
     q = PyQuery(response.content)
     self.assertEqual(
         q("#telechat-positions-table").find("th:contains('Yes')").length,
         1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('No Objection')").length, 1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('Discuss')").length, 1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('Abstain')").length, 1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('Recuse')").length, 1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('No Record')").length, 1)
示例#3
0
def start_rfc_status_change(request,name):
    """Start the RFC status change review process, setting the initial shepherding AD, and possibly putting the review on a telechat."""

    if name:
       if not re.match("(?i)rfc[0-9]{1,4}",name):
           raise Http404
       seed_rfc = get_object_or_404(Document, type="draft", docalias__name=name)

    login = request.user.person

    relation_slugs = DocRelationshipName.objects.filter(slug__in=STATUSCHANGE_RELATIONS)

    if request.method == 'POST':
        form = StartStatusChangeForm(request.POST)
        if form.is_valid():
            
            iesg_group = Group.objects.get(acronym='iesg')

            status_change=Document( type_id = "statchg",
                                    name = 'status-change-'+form.cleaned_data['document_name'],
                                    title = form.cleaned_data['title'],
                                    rev = "00",
                                    ad = form.cleaned_data['ad'],
                                    notify = form.cleaned_data['notify'],
                                    stream_id = 'ietf',
                                    group = iesg_group,
                                  )
            status_change.save()
            status_change.set_state(form.cleaned_data['create_in_state'])

            DocAlias.objects.create( name= 'status-change-'+form.cleaned_data['document_name'], document=status_change )
            
            for key in form.cleaned_data['relations']:
                status_change.relateddocument_set.create(target=DocAlias.objects.get(name=key),
                                                         relationship_id=form.cleaned_data['relations'][key])


            tc_date = form.cleaned_data['telechat_date']
            if tc_date:
                update_telechat(request, status_change, login, tc_date)

            return HttpResponseRedirect(status_change.get_absolute_url())
    else: 
        init = {}
        if name:
           init['title'] = "%s to CHANGETHIS" % seed_rfc.title
           init['document_name'] = "%s-to-CHANGETHIS" % seed_rfc.canonical_name()
           relations={}
           relations[seed_rfc.canonical_name()]=None
           init['relations'] = relations
        form = StartStatusChangeForm(initial=init)

    return render_to_response('doc/status_change/start.html',
                              {'form':   form,
                               'relation_slugs': relation_slugs,
                              },
                              context_instance = RequestContext(request))
示例#4
0
def defer_ballot(request, name):
    """Signal post-pone of ballot, notifying relevant parties."""
    doc = get_object_or_404(Document, docalias__name=name)
    if doc.type_id not in ('draft','conflrev','statchg'):
        raise Http404()
    interesting_state = dict(draft='draft-iesg',conflrev='conflrev',statchg='statchg')
    state = doc.get_state(interesting_state[doc.type_id])
    if not state or state.slug=='defer' or not doc.telechat_date():
        raise Http404()

    login = request.user.person
    telechat_date = TelechatDate.objects.active().order_by("date")[1].date

    if request.method == 'POST':
        save_document_in_history(doc)

        new_state = doc.get_state()
        prev_tags = new_tags = []

        if doc.type_id == 'draft':
            new_state = State.objects.get(used=True, type="draft-iesg", slug='defer')
            prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
        elif doc.type_id in ['conflrev','statchg']:
            new_state = State.objects.get(used=True, type=doc.type_id, slug='defer')

        prev_state = doc.get_state(new_state.type_id if new_state else None)

        doc.set_state(new_state)
        doc.tags.remove(*prev_tags)

        e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags)
        
        doc.time = (e and e.time) or datetime.datetime.now()
        doc.save()

        email_state_changed(request, doc, e.desc)

        update_telechat(request, doc, login, telechat_date)
        email_ballot_deferred(request, doc, login.plain_name(), telechat_date)

        return HttpResponseRedirect(doc.get_absolute_url())
  
    return render_to_response('doc/ballot/defer_ballot.html',
                              dict(doc=doc,
                                   telechat_date=telechat_date,
                                   back_url=doc.get_absolute_url()),
                              context_instance=RequestContext(request))
示例#5
0
文件: views_doc.py 项目: algby/ietfdb
def telechat_date(request, name):
    doc = get_object_or_404(Document, name=name)
    login = request.user.person

    e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
    initial_returning_item = bool(e and e.returning_item)

    prompts = []
    if e and doc.type.slug != 'charter':
        if e.telechat_date==datetime.date.today():
            prompts.append( "This document is currently scheduled for today's telechat. "
                           +"Please set the returning item bit carefully.")

        elif e.telechat_date<datetime.date.today() and has_same_ballot(doc,e.telechat_date):
            initial_returning_item = True
            prompts.append(  "This document appears to have been on a previous telechat with the same ballot, "
                            +"so the returning item bit has been set. Clear it if that is not appropriate.")

        else:
            pass

    initial = dict(telechat_date=e.telechat_date if e else None,
                   returning_item = initial_returning_item,
                  )
    if request.method == "POST":
        form = TelechatForm(request.POST, initial=initial)

        if form.is_valid():
            if doc.type.slug=='charter':
                cleaned_returning_item = None
            else:
                cleaned_returning_item = form.cleaned_data['returning_item']
            update_telechat(request, doc, login, form.cleaned_data['telechat_date'],cleaned_returning_item)
            return redirect('doc_view', name=doc.name)
    else:
        form = TelechatForm(initial=initial)
        if doc.type.slug=='charter':
            del form.fields['returning_item']

    return render_to_response('doc/edit_telechat_date.html',
                              dict(doc=doc,
                                   form=form,
                                   user=request.user,
                                   prompts=prompts,
                                   login=login),
                              context_instance=RequestContext(request))
示例#6
0
文件: tests.py 项目: ekr/ietfdb
 def test_doc_detail_charter(self):
     make_test_data()
     by = Person.objects.get(name="(System)")
     charter = Document.objects.filter(type='charter').first()
     charter.set_state(
         State.objects.get(used=True, slug="intrev", type="charter"))
     last_week = datetime.date.today() - datetime.timedelta(days=7)
     BallotDocEvent.objects.create(type='created_ballot',
                                   by=by,
                                   doc=charter,
                                   rev=charter.rev,
                                   ballot_type=BallotType.objects.get(
                                       doc_type=charter.type,
                                       slug='r-extrev'),
                                   time=last_week)
     d = get_next_telechat_date()
     date = d.strftime('%Y-%m-%d')
     update_telechat(None, charter, by, date)
     url = reverse('ietf.secr.telechat.views.doc_detail',
                   kwargs={
                       'date': date,
                       'name': charter.name
                   })
     self.client.login(username="******", password="******")
     response = self.client.get(url)
     self.assertEqual(response.status_code, 200)
     q = PyQuery(response.content)
     self.assertEqual(
         q("#telechat-positions-table").find("th:contains('Yes')").length,
         1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('No Objection')").length, 1)
     self.assertEqual(
         q("#telechat-positions-table").find("th:contains('Block')").length,
         1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('Abstain')").length, 1)
     self.assertEqual(
         q("#telechat-positions-table").find(
             "th:contains('No Record')").length, 1)
示例#7
0
def handle_reschedule_form(request, doc, dates, status):
    initial = dict(telechat_date=doc.telechat_date())

    formargs = dict(telechat_dates=dates,
                    prefix="%s" % doc.name,
                    initial=initial)
    if request.method == 'POST':
        form = RescheduleForm(request.POST, **formargs)
        if form.is_valid():
            update_telechat(request, doc, request.user.person,
                            form.cleaned_data['telechat_date'],
                            False if form.cleaned_data['clear_returning_item'] else None)
            doc.time = datetime.datetime.now()
            doc.save()

            status["changed"] = True
    else:
        form = RescheduleForm(**formargs)

    form.show_clear = doc.returning_item()
    return form
示例#8
0
def start_review_as_secretariat(request, name):
    """Start the conflict review process, setting the initial shepherding AD, and possibly putting the review on a telechat."""

    doc_to_review = start_review_sanity_check(request, name)

    login = request.user.person

    if request.method == 'POST':
        form = StartReviewForm(request.POST)
        if form.is_valid():
            conflict_review = build_conflict_review_document(login = login,
                                                             doc_to_review = doc_to_review, 
                                                             ad = form.cleaned_data['ad'],
                                                             notify = form.cleaned_data['notify'],
                                                             create_in_state = form.cleaned_data['create_in_state']
                                                            )

            tc_date = form.cleaned_data['telechat_date']
            if tc_date:
                update_telechat(request, conflict_review, login, tc_date)

            send_conflict_review_started_email(request, conflict_review)

            return HttpResponseRedirect(conflict_review.get_absolute_url())
    else: 
        notify_addresses = build_notify_addresses(doc_to_review)
        init = { 
                "ad" : Role.objects.filter(group__acronym='ietf',name='chair')[0].person.id,
                "notify" : u', '.join(notify_addresses),
               }
        form = StartReviewForm(initial=init)

    return render_to_response('doc/conflict_review/start.html',
                              {'form':   form,
                               'doc_to_review': doc_to_review,
                              },
                              context_instance = RequestContext(request))
示例#9
0
def start_review_as_secretariat(request, name):
    """Start the conflict review process, setting the initial shepherding AD, and possibly putting the review on a telechat."""

    doc_to_review = start_review_sanity_check(request, name)

    login = request.user.person

    if request.method == 'POST':
        form = StartReviewForm(request.POST)
        if form.is_valid():
            conflict_review = build_conflict_review_document(login = login,
                                                             doc_to_review = doc_to_review, 
                                                             ad = form.cleaned_data['ad'],
                                                             notify = form.cleaned_data['notify'],
                                                             create_in_state = form.cleaned_data['create_in_state']
                                                            )

            tc_date = form.cleaned_data['telechat_date']
            if tc_date:
                update_telechat(request, conflict_review, login, tc_date)

            send_conflict_review_started_email(request, conflict_review)

            return HttpResponseRedirect(conflict_review.get_absolute_url())
    else: 
        notify_addresses = build_notify_addresses(doc_to_review)
        init = { 
                "ad" : Role.objects.filter(group__acronym='ietf',name='chair')[0].person.id,
                "notify" : u', '.join(notify_addresses),
               }
        form = StartReviewForm(initial=init)

    return render(request, 'doc/conflict_review/start.html',
                              {'form':   form,
                               'doc_to_review': doc_to_review,
                              },
                          )
示例#10
0
def do_undefer_ballot(request, doc):
    '''
    Helper function to perform undefer of ballot.  Takes the Request object, for use in 
    logging, and the Document object.
    '''
    by = request.user.person
    telechat_date = TelechatDate.objects.active().order_by("date")[0].date

    new_state = doc.get_state()
    prev_tags = []
    new_tags = []

    if doc.type_id == 'draft':
        new_state = State.objects.get(used=True,
                                      type="draft-iesg",
                                      slug='iesg-eva')
        prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
    elif doc.type_id in ['conflrev', 'statchg']:
        new_state = State.objects.get(used=True,
                                      type=doc.type_id,
                                      slug='iesgeval')

    prev_state = doc.get_state(new_state.type_id if new_state else None)

    doc.set_state(new_state)
    doc.tags.remove(*prev_tags)

    events = []
    state_change_event = add_state_change_event(doc,
                                                by,
                                                prev_state,
                                                new_state,
                                                prev_tags=prev_tags,
                                                new_tags=new_tags)
    if state_change_event:
        events.append(state_change_event)

    e = update_telechat(request, doc, by, telechat_date)
    if e:
        events.append(e)

    if events:
        doc.save_with_history(events)

    email_ballot_undeferred(request, doc, by.plain_name(), telechat_date)
示例#11
0
def handle_reschedule_form(request, doc, dates, status):
    initial = dict(telechat_date=doc.telechat_date())

    formargs = dict(telechat_dates=dates,
                    prefix="%s" % doc.name,
                    initial=initial)
    if request.method == 'POST':
        form = RescheduleForm(request.POST, **formargs)
        if form.is_valid():
            e = update_telechat(
                request, doc, request.user.person,
                form.cleaned_data['telechat_date'],
                False if form.cleaned_data['clear_returning_item'] else None)
            if e:
                doc.save_with_history([e])

            status["changed"] = True
    else:
        form = RescheduleForm(**formargs)

    form.show_clear = doc.returning_item()
    return form
示例#12
0
def defer_ballot(request, name):
    """Signal post-pone of ballot, notifying relevant parties."""
    doc = get_object_or_404(Document, docalias__name=name)
    if doc.type_id not in ('draft', 'conflrev', 'statchg'):
        raise Http404
    interesting_state = dict(draft='draft-iesg',
                             conflrev='conflrev',
                             statchg='statchg')
    state = doc.get_state(interesting_state[doc.type_id])
    if not state or state.slug == 'defer' or not doc.telechat_date():
        raise Http404

    login = request.user.person
    telechat_date = TelechatDate.objects.active().order_by("date")[1].date

    if request.method == 'POST':
        new_state = doc.get_state()
        prev_tags = []
        new_tags = []

        if doc.type_id == 'draft':
            new_state = State.objects.get(used=True,
                                          type="draft-iesg",
                                          slug='defer')
            prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS)
        elif doc.type_id in ['conflrev', 'statchg']:
            new_state = State.objects.get(used=True,
                                          type=doc.type_id,
                                          slug='defer')

        prev_state = doc.get_state(new_state.type_id if new_state else None)

        doc.set_state(new_state)
        doc.tags.remove(*prev_tags)

        events = []

        state_change_event = add_state_change_event(doc,
                                                    login,
                                                    prev_state,
                                                    new_state,
                                                    prev_tags=prev_tags,
                                                    new_tags=new_tags)
        if state_change_event:
            events.append(state_change_event)

        e = update_telechat(request, doc, login, telechat_date)
        if e:
            events.append(e)

        doc.save_with_history(events)

        email_ballot_deferred(request, doc, login.plain_name(), telechat_date)

        return HttpResponseRedirect(doc.get_absolute_url())

    return render(
        request, 'doc/ballot/defer_ballot.html',
        dict(doc=doc,
             telechat_date=telechat_date,
             back_url=doc.get_absolute_url()))
示例#13
0
def start_rfc_status_change(request, name):
    """Start the RFC status change review process, setting the initial shepherding AD, and possibly putting the review on a telechat."""

    if name:
        if not re.match("(?i)rfc[0-9]{1,4}", name):
            raise Http404
        seed_rfc = get_object_or_404(Document,
                                     type="draft",
                                     docalias__name=name)

    login = request.user.person

    relation_slugs = DocRelationshipName.objects.filter(
        slug__in=STATUSCHANGE_RELATIONS)

    if request.method == 'POST':
        form = StartStatusChangeForm(request.POST)
        if form.is_valid():

            iesg_group = Group.objects.get(acronym='iesg')

            status_change = Document.objects.create(
                type_id="statchg",
                name='status-change-' + form.cleaned_data['document_name'],
                title=form.cleaned_data['title'],
                rev="00",
                ad=form.cleaned_data['ad'],
                notify=form.cleaned_data['notify'],
                stream_id='ietf',
                group=iesg_group,
            )
            status_change.set_state(form.cleaned_data['create_in_state'])

            DocAlias.objects.create(name='status-change-' +
                                    form.cleaned_data['document_name'],
                                    document=status_change)

            for key in form.cleaned_data['relations']:
                status_change.relateddocument_set.create(
                    target=DocAlias.objects.get(name=key),
                    relationship_id=form.cleaned_data['relations'][key])

            tc_date = form.cleaned_data['telechat_date']
            if tc_date:
                update_telechat(request, status_change, login, tc_date)

            return HttpResponseRedirect(status_change.get_absolute_url())
    else:
        init = {}
        if name:
            init['title'] = "%s to CHANGETHIS" % seed_rfc.title
            init[
                'document_name'] = "%s-to-CHANGETHIS" % seed_rfc.canonical_name(
                )
            relations = {}
            relations[seed_rfc.canonical_name()] = None
            init['relations'] = relations
        form = StartStatusChangeForm(initial=init)

    return render(
        request,
        'doc/status_change/start.html',
        {
            'form': form,
            'relation_slugs': relation_slugs,
        },
    )