Use BOF consistently.

- Legacy-Id: 19212
This commit is contained in:
Robert Sparks 2021-07-14 17:33:14 +00:00
parent 885fe35d48
commit 805d1f4a7e
23 changed files with 74 additions and 70 deletions

View file

@ -8,12 +8,12 @@ def forward(apps, schema_editor):
StateType = apps.get_model('doc', 'StateType')
State = apps.get_model('doc', 'State')
StateType.objects.create(slug='bofreq', label='Bof Request State')
proposed = State.objects.create(type_id='bofreq', slug='proposed', name='Proposed', used=True, desc='The bof request is proposed', order=0)
approved = State.objects.create(type_id='bofreq', slug='approved', name='Approved', used=True, desc='The bof request is approved', order=1)
declined = State.objects.create(type_id='bofreq', slug='declined', name='Declined', used=True, desc='The bof request is declined', order=2)
replaced = State.objects.create(type_id='bofreq', slug='replaced', name='Replaced', used=True, desc='The bof request is proposed', order=3)
abandoned = State.objects.create(type_id='bofreq', slug='abandoned', name='Abandoned', used=True, desc='The bof request is abandoned', order=4)
StateType.objects.create(slug='bofreq', label='BOF Request State')
proposed = State.objects.create(type_id='bofreq', slug='proposed', name='Proposed', used=True, desc='The BOF request is proposed', order=0)
approved = State.objects.create(type_id='bofreq', slug='approved', name='Approved', used=True, desc='The BOF request is approved', order=1)
declined = State.objects.create(type_id='bofreq', slug='declined', name='Declined', used=True, desc='The BOF request is declined', order=2)
replaced = State.objects.create(type_id='bofreq', slug='replaced', name='Replaced', used=True, desc='The BOF request is proposed', order=3)
abandoned = State.objects.create(type_id='bofreq', slug='abandoned', name='Abandoned', used=True, desc='The BOF request is abandoned', order=4)
proposed.next_states.set([approved,declined,replaced,abandoned])

View file

@ -1349,9 +1349,9 @@ class EditedAuthorsDocEvent(DocEvent):
basis = models.CharField(help_text="What is the source or reasoning for the changes to the author list",max_length=255)
class BofreqEditorDocEvent(DocEvent):
""" Capture the proponents of a Bof Request."""
""" Capture the proponents of a BOF Request."""
editors = models.ManyToManyField('person.Person', blank=True)
class BofreqResponsibleDocEvent(DocEvent):
""" Capture the responsible leadership (IAB and IESG members) for a BoF Request """
""" Capture the responsible leadership (IAB and IESG members) for a BOF Request """
responsible = models.ManyToManyField('person.Person', blank=True)

View file

@ -46,7 +46,7 @@ This test section has some text.
def test_show_bof_requests(self):
url = urlreverse('ietf.doc.views_bofreq.bof_requests')
r = self.client.get(url)
self.assertContains(r, 'There are currently no BoF Requests', status_code=200)
self.assertContains(r, 'There are currently no BOF Requests', status_code=200)
states = State.objects.filter(type_id='bofreq')
self.assertTrue(states.count()>0)
reqs = BofreqFactory.create_batch(states.count())

View file

@ -275,7 +275,7 @@ class EditCharterTests(TestCase):
login_testing_unauthorized(self, "secretary", url)
response=self.client.get(url)
self.assertEqual(response.status_code,200)
response = self.client.post(url,{'comment':'Testing Abandoning a Bof Charter'})
response = self.client.post(url,{'comment':'Testing Abandoning a BOF Charter'})
self.assertEqual(response.status_code,302)
charter = Document.objects.get(pk=charter.pk)
self.assertEqual(charter.group.state_id,'abandon')

View file

@ -46,7 +46,7 @@ class BofreqUploadForm(forms.Form):
content = self.cleaned_data["bofreq_content"].replace("\r", "")
default_content = render_to_string('doc/bofreq/bofreq_template.md',{})
if content==default_content:
raise forms.ValidationError('The example content may not be saved. Edit it as instructed to document this BoF request.')
raise forms.ValidationError('The example content may not be saved. Edit it as instructed to document this BOF request.')
try:
_ = markdown.markdown(content, extensions=['extra'])
except Exception as e:
@ -126,7 +126,7 @@ class NewBofreqForm(BofreqUploadForm):
if name == 'bofreq-':
raise forms.ValidationError('The filename derived from this title is empty. Please include a few descriptive words using ascii or numeric characters')
if Document.objects.filter(name=name).exists():
raise forms.ValidationError('This title produces a filename already used by an existing BoF request')
raise forms.ValidationError('This title produces a filename already used by an existing BOF request')
return title
@login_required

View file

@ -188,11 +188,11 @@ class GroupForm(forms.Form):
if existing and existing.type_id == self.group_type:
if existing.state_id == "bof":
#insert_confirm_field(label="Turn BoF %s into proposed %s and start chartering it" % (existing.acronym, existing.type.name), initial=True)
#insert_confirm_field(label="Turn BOF %s into proposed %s and start chartering it" % (existing.acronym, existing.type.name), initial=True)
if confirmed:
return acronym
else:
raise forms.ValidationError("Warning: Acronym used for an existing BoF (%s)." % existing.acronym)
raise forms.ValidationError("Warning: Acronym used for an existing BOF (%s)." % existing.acronym)
else:
#insert_confirm_field(label="Set state of %s %s to proposed and start chartering it" % (existing.acronym, existing.type.name), initial=False)
if confirmed:
@ -265,7 +265,7 @@ class GroupForm(forms.Form):
state = cleaned_data.get('state', None)
parent = cleaned_data.get('parent', None)
if state and (state.slug in ['bof', ] and 'parent' in self.fields and not parent):
raise forms.ValidationError("You requested the creation of a BoF, but specified no parent area. A parent is required when creating a bof.")
raise forms.ValidationError("You requested the creation of a BOF, but specified no parent area. A parent is required when creating a bof.")
return cleaned_data

View file

@ -561,7 +561,7 @@ class GroupEditTests(TestCase):
q = PyQuery(r.content)
self.assertTrue(len(q('form .has-error')) > 0)
# try elevating BoF to WG
# try elevating BOF to WG
group.state_id = "bof"
group.save()

View file

@ -180,6 +180,8 @@ class IprTests(TestCase):
# find by patent info
r = self.client.get(url + "?submit=patent&patent=%s" % ipr.patent_info)
debug.show('ipr.patent_info')
debug.show('r.content')
self.assertContains(r, ipr.title)
r = self.client.get(url + "?submit=patent&patent=US12345")

View file

@ -366,7 +366,7 @@ class Command(BaseCommand):
attendees=100,
agenda_note="",
requested_duration=datetime.timedelta(seconds=7200), # 2:00:00
comments="""Must not conflict with Transport Area BoFs. """, # this is implicit
comments="""Must not conflict with Transport Area BOFs. """, # this is implicit
remote_instructions="",
)
## session for tsvwg ##
@ -377,7 +377,7 @@ class Command(BaseCommand):
attendees=100,
agenda_note="",
requested_duration=datetime.timedelta(seconds=7200), # 2:00:00
comments="""Must not conflict with Transport Area BoFs. """, # this is implicit
comments="""Must not conflict with Transport Area BOFs. """, # this is implicit
remote_instructions="",
)
c = Constraint.objects.create(meeting=m, source=s.group, name_id='conflict', target_id=1665, ) # intarea
@ -440,7 +440,7 @@ class Command(BaseCommand):
attendees=80,
agenda_note="Joint with ARTAREA",
requested_duration=datetime.timedelta(seconds=7200), # 2:00:00
comments=""" and avoid the same kind of conflicts with other area meetings and any Bofs and potential new ART WGs.""", # this is implicit
comments=""" and avoid the same kind of conflicts with other area meetings and any BOFs and potential new ART WGs.""", # this is implicit
remote_instructions="",
)
s.joint_with_groups.set(Group.objects.filter(acronym='artarea'))
@ -2598,7 +2598,7 @@ class Command(BaseCommand):
attendees=50,
agenda_note="",
requested_duration=datetime.timedelta(seconds=5400), # 1:30:00
comments="""Please avoid collision with any Sec and IoT-related BoFs.""",
comments="""Please avoid collision with any Sec and IoT-related BOFs.""",
remote_instructions="",
)
c = Constraint.objects.create(meeting=m, source=s.group, name_id='conflict', target_id=1187, ) # saag

View file

@ -705,24 +705,24 @@ class Session(object):
for other in overlapping_sessions:
if not other:
continue
# BoFs cannot conflict with PRGs
# BOFs cannot conflict with PRGs
if self.is_bof and other.is_prg:
violations.append('{}: BoF overlaps with PRG: {}'
violations.append('{}: BOF overlaps with PRG: {}'
.format(self.group, other.group))
cost += self.business_constraint_costs['bof_overlapping_prg']
# BoFs cannot conflict with any other BoFs
# BOFs cannot conflict with any other BOFs
if self.is_bof and other.is_bof:
violations.append('{}: BoF overlaps with other BoF: {}'
violations.append('{}: BOF overlaps with other BOF: {}'
.format(self.group, other.group))
cost += self.business_constraint_costs['bof_overlapping_bof']
# BoFs cannot conflict with any other WGs in their area
# BOFs cannot conflict with any other WGs in their area
if self.is_bof and self.parent == other.parent:
violations.append('{}: BoF overlaps with other session from same area: {}'
violations.append('{}: BOF overlaps with other session from same area: {}'
.format(self.group, other.group))
cost += self.business_constraint_costs['bof_overlapping_area_wg']
# BoFs cannot conflict with any area-wide meetings (of any area)
# BOFs cannot conflict with any area-wide meetings (of any area)
if self.is_bof and other.is_area_meeting:
violations.append('{}: BoF overlaps with area meeting {}'
violations.append('{}: BOF overlaps with area meeting {}'
.format(self.group, other.group))
cost += self.business_constraint_costs['bof_overlapping_area_meeting']
# Area meetings cannot conflict with anything else in their area

View file

@ -9,22 +9,22 @@ def forward(apps, schema_editor):
BusinessConstraint = apps.get_model("meeting", "BusinessConstraint")
BusinessConstraint.objects.create(
slug="bof_overlapping_prg",
name="BoFs cannot conflict with PRGs",
name="BOFs cannot conflict with PRGs",
penalty=100000,
)
BusinessConstraint.objects.create(
slug="bof_overlapping_bof",
name="BoFs cannot conflict with any other BoFs",
name="BOFs cannot conflict with any other BOFs",
penalty=100000,
)
BusinessConstraint.objects.create(
slug="bof_overlapping_area_wg",
name="BoFs cannot conflict with any other WGs in their area",
name="BOFs cannot conflict with any other WGs in their area",
penalty=100000,
)
BusinessConstraint.objects.create(
slug="bof_overlapping_area_meeting",
name="BoFs cannot conflict with any area-wide meetings (of any area)",
name="BOFs cannot conflict with any area-wide meetings (of any area)",
penalty=10000,
)
BusinessConstraint.objects.create(

View file

@ -752,7 +752,7 @@ class MeetingTests(TestCase):
# Should be a 'non-area events' link showing appropriate types
non_area_labels = [
'BoF', 'EDU', 'Hackathon', 'IEPG', 'IESG', 'IETF', 'Plenary', 'Secretariat', 'Tools',
'BOF', 'EDU', 'Hackathon', 'IEPG', 'IESG', 'IETF', 'Plenary', 'Secretariat', 'Tools',
]
self.assertIn('%s?show=%s' % (ical_url, ','.join(non_area_labels).lower()), content)
@ -1029,7 +1029,7 @@ class EditMeetingScheduleTests(TestCase):
self.assertEqual(time_labels, time_header_labels)
def test_bof_session_tag(self):
"""Sessions for BoF groups should be marked as such"""
"""Sessions for BOF groups should be marked as such"""
meeting = MeetingFactory(type_id='ietf')
non_bof_session = SessionFactory(meeting=meeting)
@ -1044,13 +1044,13 @@ class EditMeetingScheduleTests(TestCase):
q = PyQuery(r.content)
self.assertEqual(len(q('#session{} .bof-tag'.format(non_bof_session.pk))), 0,
'Non-BoF session should not be tagged as a BoF session')
'Non-BOF session should not be tagged as a BOF session')
bof_tags = q('#session{} .bof-tag'.format(bof_session.pk))
self.assertEqual(len(bof_tags), 1,
'BoF session should have one BoF session tag')
self.assertIn('BoF', bof_tags.eq(0).text(),
'BoF tag should contain text "BoF"')
'BOF session should have one BOF session tag')
self.assertIn('BOF', bof_tags.eq(0).text(),
'BOF tag should contain text "BOF"')
def _setup_for_swap_timeslots(self):
"""Create a meeting, rooms, and schedule for swap_timeslots testing

View file

@ -1552,7 +1552,7 @@ def prepare_filter_keywords(tagged_assignments, group_parents):
# Keywords that should appear in 'non-area' column
non_area_labels = [
'BoF', 'EDU', 'Hackathon', 'IEPG', 'IESG', 'IETF', 'Plenary', 'Secretariat', 'Tools',
'BOF', 'EDU', 'Hackathon', 'IEPG', 'IESG', 'IETF', 'Plenary', 'Secretariat', 'Tools',
]
# Remove any unused non-area keywords
non_area_filters = [
@ -4102,7 +4102,7 @@ def request_minutes(request, num=None):
body = render_to_string('meeting/request_minutes.txt', body_context)
initial = {'to': 'wgchairs@ietf.org',
'cc': 'irsg@irtf.org',
'subject': 'Request for IETF WG and Bof Session Minutes',
'subject': 'Request for IETF WG and BOF Session Minutes',
'body': body,
}
form = RequestMinutesForm(initial=initial)

View file

@ -2307,7 +2307,7 @@
},
{
"fields": {
"desc": "The bof request is proposed",
"desc": "The BOF request is proposed",
"name": "Proposed",
"next_states": [
159,
@ -2325,7 +2325,7 @@
},
{
"fields": {
"desc": "The bof request is approved",
"desc": "The BOF request is approved",
"name": "Approved",
"next_states": [],
"order": 1,
@ -2338,7 +2338,7 @@
},
{
"fields": {
"desc": "The bof request is declined",
"desc": "The BOF request is declined",
"name": "Declined",
"next_states": [],
"order": 2,
@ -2351,7 +2351,7 @@
},
{
"fields": {
"desc": "The bof request is proposed",
"desc": "The BOF request is proposed",
"name": "Replaced",
"next_states": [],
"order": 3,
@ -2364,7 +2364,7 @@
},
{
"fields": {
"desc": "The bof request is abandoned",
"desc": "The BOF request is abandoned",
"name": "Abandoned",
"next_states": [],
"order": 4,
@ -2391,7 +2391,7 @@
},
{
"fields": {
"label": "Bof Request State"
"label": "BOF Request State"
},
"model": "doc.statetype",
"pk": "bofreq"
@ -2702,20 +2702,20 @@
"about_page": "ietf.group.views.group_about",
"acts_like_wg": false,
"admin_roles": "[\n \"chair\",\n \"secr\"\n]",
"agenda_type": null,
"agenda_type": "ad",
"create_wiki": true,
"custom_group_roles": true,
"customize_workflow": false,
"default_parent": "",
"default_tab": "ietf.group.views.group_about",
"default_used_roles": "[\n \"ad\",\n \"chair\",\n \"reviewer\",\n \"secr\"\n]",
"docman_roles": "[]",
"docman_roles": "[\n \"chair\"\n]",
"groupman_authroles": "[\n \"Secretariat\"\n]",
"groupman_roles": "[\n \"ad\",\n \"secr\"\n]",
"has_chartering_process": false,
"has_default_jabber": false,
"has_documents": false,
"has_meetings": false,
"has_meetings": true,
"has_milestones": false,
"has_nonsession_materials": false,
"has_reviews": false,
@ -3862,6 +3862,8 @@
"cc": [],
"desc": "Recipients when a document's state is manually edited",
"to": [
"bofreq_editors",
"bofreq_responsible",
"doc_ad",
"doc_affecteddoc_authors",
"doc_affecteddoc_group_chairs",
@ -9917,7 +9919,7 @@
{
"fields": {
"desc": "",
"name": "Bof Request",
"name": "BOF Request",
"order": 0,
"prefix": "bofreq",
"used": true
@ -15483,7 +15485,7 @@
"fields": {
"command": "xym",
"switch": "--version",
"time": "2021-07-05T00:12:20.968",
"time": "2021-07-13T00:12:25.184",
"used": true,
"version": "xym 0.5"
},
@ -15494,7 +15496,7 @@
"fields": {
"command": "pyang",
"switch": "--version",
"time": "2021-07-05T00:12:22.309",
"time": "2021-07-13T00:12:26.721",
"used": true,
"version": "pyang 2.5.0"
},
@ -15505,7 +15507,7 @@
"fields": {
"command": "yanglint",
"switch": "--version",
"time": "2021-07-05T00:12:22.603",
"time": "2021-07-13T00:12:27.015",
"used": true,
"version": "yanglint SO 1.6.7"
},
@ -15516,7 +15518,7 @@
"fields": {
"command": "xml2rfc",
"switch": "--version",
"time": "2021-07-05T00:12:25.333",
"time": "2021-07-13T00:12:29.814",
"used": true,
"version": "xml2rfc 3.9.1"
},

View file

@ -6,7 +6,7 @@ from django.db import migrations
def forward(apps,schema_editor):
DocTypeName = apps.get_model('name','DocTypeName')
DocTypeName.objects.create(prefix='bofreq', slug='bofreq', name="Bof Request", desc="", used=True, order=0)
DocTypeName.objects.create(prefix='bofreq', slug='bofreq', name="BOF Request", desc="", used=True, order=0)
def reverse(apps,schema_editor):
DocTypeName = apps.get_model('name','DocTypeName')

View file

@ -19,7 +19,7 @@ TO_LIST = ('IETF Announcement List <ietf-announce@ietf.org>',
'RFP Announcement List <rfp-announce@ietf.org>',
'The IESG <iesg@ietf.org>',
'Working Group Chairs <wgchairs@ietf.org>',
'BoF Chairs <bofchairs@ietf.org>',
'BOF Chairs <bofchairs@ietf.org>',
'Other...')
# ---------------------------------------------

View file

@ -9,8 +9,11 @@
<h1>BOF Requests</h1>
{% if request.user.is_authenticated %}
<a id="start_button" class="btn btn-primary" href="{% url 'ietf.doc.views_bofreq.new_bof_request' %}">Start New BOF Request</a>
{% endif %}
{% if not reqs %}
<p>There are currently no BoF Requests</p>
<p>There are currently no BOF Requests</p>
{% else %}
{% regroup reqs by get_state_slug as grouped_reqs %}
{% for req_group in grouped_reqs %}
@ -36,7 +39,4 @@
</div>
{% endfor %}
{% endif %}
{% if request.user.is_authenticated %}
<a id="start_button" class="btn btn-primary" href="{% url 'ietf.doc.views_bofreq.new_bof_request' %}">Start New Bof Request</a>
{% endif %}
{% endblock %}

View file

@ -1,14 +1,14 @@
# Name: Exact MPLS Edges (EXAMPLE) (There's an acronym for anything if you really want one ;-)
## Description
Replace this with a few paragraphs describing the BoF request.
Replace this with a few paragraphs describing the BOF request.
Fill in the details below. Keep items in the order they appear here.
## Required Details
- Status: (not) WG Forming
- Responsible AD: name
- BoF proponents: name <email>, name <email> (1-3 people - who are requesting and coordinating discussion for proposal)
- BoF chairs: TBD
- BOF proponents: name <email>, name <email> (1-3 people - who are requesting and coordinating discussion for proposal)
- BOF chairs: TBD
- Number of people expected to attend: 100
- Length of session (1 or 2 hours): 2 hours
- Conflicts (whole Areas and/or WGs)

View file

@ -2,11 +2,11 @@
{# Copyright The IETF Trust 2021, All Rights Reserved #}
{% load origin bootstrap3 static %}
{% block title %}Start a new BoF Request{% endblock %}
{% block title %}Start a new BOF Request{% endblock %}
{% block content %}
{% origin %}
<h1>Start a new BoF Request</h1>
<h1>Start a new BOF Request</h1>
<p>Choose a short descriptive title for your request. Take time to choose a good initial title - it will be used to make the filename for your request's content. The title can be changed later, but the filename will not change.</p>
<p>For example, a request with a title of "A new important bit" will be saved as "bofreq-a-new-important-bit-00.md".</p>

View file

@ -1,7 +1,7 @@
<div id="session{{ session.pk }}" class="session {% if not session.group.parent.scheduling_color %}untoggleable{% endif %} {% if session.parent_acronym %}parent-{{ session.parent_acronym }}{% endif %} {% if session.readonly %}readonly{% endif %}" style="width:{{ session.layout_width }}em;" data-duration="{{ session.requested_duration.total_seconds }}" {% if session.attendees != None %}data-attendees="{{ session.attendees }}"{% endif %}>
<div class="session-label {% if session.group and session.group.is_bof %}bof-session{% endif %}">
{{ session.scheduling_label }}
{% if session.group and session.group.is_bof %}<span class="bof-tag">BoF</span>{% endif %}
{% if session.group and session.group.is_bof %}<span class="bof-tag">BOF</span>{% endif %}
</div>
<div>
@ -32,7 +32,7 @@
{{ session.scheduling_label }}
&middot; {{ session.requested_duration_in_hours }}h
{% if session.group %}
&middot; {% if session.group.is_bof %}BoF{% else %}{{ session.group.type.name }}{% endif %}
&middot; {% if session.group.is_bof %}BOF{% else %}{{ session.group.type.name }}{% endif %}
{% endif %}
{% if session.attendees != None %}
&middot; {{ session.attendees }} <i class="fa fa-user-o"></i>

View file

@ -27,7 +27,7 @@
{% if d.name.slug == 'opensched' %}
To request a Working Group session, use the
<a href="{% url 'ietf.secr.sreq.views.main' %}">IETF Meeting Session Request Tool</a>.
If you are working on a BoF request, it is highly recommended
If you are working on a BOF request, it is highly recommended
to tell the IESG now by sending an email to
<a href="mailto:iesg@ietf.org">iesg@ietf.org</a> to get advance help with the request.
{% endif %}

View file

@ -9,7 +9,7 @@ DESCRIPTION:{{ d.name.desc }}{% if first and d.name.slug == 'openreg' or first a
Register here: https://www.ietf.org/how/meetings/register/{% endif %}{% if d.name.slug == 'opensched' %}\n
To request a Working Group session, use the IETF Meeting Session Request Tool:\n
{{ request.scheme }}://{{ request.get_host}}{% url 'ietf.secr.sreq.views.main' %}\n
If you are working on a BoF request, it is highly recommended to tell the IESG\n
If you are working on a BOF request, it is highly recommended to tell the IESG\n
now by sending an email to iesg@ietf.org to get advance help with the request.{% endif %}{% if d.name.slug == 'cutoffwgreq' %}\n
To request a Working Group session, use the IETF Meeting Session Request Tool:\n
{{ request.scheme }}://{{ request.get_host }}{% url 'ietf.secr.sreq.views.main' %}{% endif %}{% if d.name.slug == 'cutoffbofreq' %}\n

View file

@ -16,6 +16,6 @@ manual posting.
Groups that are missing minutes:{% for group in needs_minutes %}{% ifchanged group.parent %}
{{group.parent.name}}:{% endifchanged %}
{{ group.acronym | upper }}{% if group.state_id == 'bof' %} (BoF){% endif %}{% endfor %}
{{ group.acronym | upper }}{% if group.state_id == 'bof' %} (BOF){% endif %}{% endfor %}
{% endautoescape %}