Skip to content

Commit 544cd70

Browse files
committed
Drop the material doc type, instead present a choice of doc types for uploading materials (currently only slides) and use that, introduce a DOCUMENT_PATH_PATTERN setting for storing the files and only look in proceedings/ for documents that are actually meeting related
- Legacy-Id: 7802
1 parent 97e6ceb commit 544cd70

File tree

12 files changed

+126
-628
lines changed

12 files changed

+126
-628
lines changed

ietf/doc/migrations/0019_create_material_states.py

Lines changed: 0 additions & 373 deletions
This file was deleted.

ietf/doc/models.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ def file_extension(self):
7474
return ext.lstrip(".").lower()
7575

7676
def get_file_path(self):
77+
7778
if self.type_id == "draft":
7879
return settings.INTERNET_DRAFT_PATH
79-
elif self.type_id in ("agenda", "minutes", "slides"):
80+
elif self.type_id in ("agenda", "minutes", "slides") and self.meeting_related():
8081
meeting = self.name.split("-")[1]
8182
return os.path.join(settings.AGENDA_PATH, meeting, self.type_id) + "/"
8283
elif self.type_id == "charter":
@@ -85,21 +86,27 @@ def get_file_path(self):
8586
return settings.CONFLICT_REVIEW_PATH
8687
elif self.type_id == "statchg":
8788
return settings.STATUS_CHANGE_PATH
88-
elif self.type_id == "material":
89-
return settings.MATERIALS_PATH
9089
else:
91-
raise NotImplemented
90+
return settings.DOCUMENT_PATH_PATTERN.format(doc=self)
9291

9392
def href(self):
93+
meeting_related = self.meeting_related()
94+
95+
settings_var = settings.DOC_HREFS
96+
if meeting_related:
97+
settings_var = settings.MEETING_DOC_HREFS
98+
9499
try:
95-
format = settings.DOC_HREFS[self.type_id]
100+
format = settings_var[self.type_id]
96101
except KeyError:
97102
if len(self.external_url):
98103
return self.external_url
99104
return None
105+
100106
meeting = None
101-
if self.type_id in ("agenda", "minutes", "slides"):
107+
if meeting_related:
102108
meeting = self.name.split("-")[1]
109+
103110
return format.format(doc=self,meeting=meeting)
104111

105112
def set_state(self, state):
@@ -163,6 +170,11 @@ def active_ballot(self):
163170
else:
164171
return None
165172

173+
def meeting_related(self):
174+
return(self.type_id in ("agenda", "minutes", "slides") and (
175+
self.name.split("-")[1] == "interim"
176+
or self.session_set.exists()))
177+
166178
class Meta:
167179
abstract = True
168180

ietf/group/edit.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
from ietf.doc.utils import get_tags_for_stream_id, add_state_change_event
2121
from ietf.group.models import ( Group, Role, GroupEvent, GroupHistory, GroupStateName,
2222
GroupStateTransitions, GroupTypeName, GroupURL, ChangeStateGroupEvent )
23-
from ietf.group.utils import (save_group_in_history, can_manage_group_type, can_manage_materials,
24-
get_group_or_404)
23+
from ietf.group.utils import save_group_in_history, can_manage_group_type, can_manage_materials
24+
from ietf.group.utils import get_group_or_404
2525
from ietf.ietfauth.utils import has_role
2626
from ietf.person.forms import EmailsField
2727
from ietf.person.models import Person, Email
@@ -458,17 +458,28 @@ def customize_workflow(request, group_type, acronym):
458458
'tags': tags,
459459
})
460460

461+
@login_required
462+
def choose_material_type(request, acronym, group_type=None):
463+
group = get_group_or_404(acronym, group_type)
464+
if not group.features.has_materials:
465+
raise Http404
466+
467+
return render(request, 'group/choose_material_type.html', {
468+
'group': group,
469+
'material_types': DocTypeName.objects.filter(slug__in=group.features.material_types),
470+
})
471+
472+
461473
class UploadMaterialForm(forms.Form):
462474
title = forms.CharField(max_length=Document._meta.get_field("title").max_length)
463-
state = forms.ModelChoiceField(State.objects.filter(type="material"), empty_label=None)
475+
state = forms.ModelChoiceField(State.objects.all(), empty_label=None)
464476
material = forms.FileField(label='File', help_text="PDF or text file (ASCII/UTF-8)")
465477

466-
def __init__(self, *args, **kwargs):
467-
action = kwargs.pop("action")
468-
doc = kwargs.pop("doc", None)
469-
478+
def __init__(self, doc_type, action, doc, *args, **kwargs):
470479
super(UploadMaterialForm, self).__init__(*args, **kwargs)
471480

481+
self.fields["state"].queryset = self.fields["state"].queryset.filter(type=doc_type)
482+
472483
if action == "new":
473484
self.fields["state"].widget = forms.HiddenInput()
474485
self.fields["state"].queryset = self.fields["state"].queryset.filter(slug="active")
@@ -482,27 +493,29 @@ def __init__(self, *args, **kwargs):
482493

483494

484495
@login_required
485-
def edit_material(request, acronym, action="new", name=None, group_type=None):
496+
def edit_material(request, acronym, action="new", name=None, doc_type=None, group_type=None):
486497
group = get_group_or_404(acronym, group_type)
487498
if not group.features.has_materials:
488499
raise Http404
489500

490501
if not can_manage_materials(request.user, group):
491502
return HttpResponseForbidden("You don't have permission to access this view")
492503

504+
document_type = get_object_or_404(DocTypeName, slug=doc_type)
505+
493506
existing = None
494507
if name and action != "new":
495508
existing = get_object_or_404(Document, type="material", name=name)
496509

497510
if request.method == 'POST':
498-
form = UploadMaterialForm(request.POST, request.FILES, action=action, doc=existing)
511+
form = UploadMaterialForm(document_type, action, existing, request.POST, request.FILES)
499512

500513
if form.is_valid():
501514
if action == "new":
502515
d = Document()
503-
d.type = DocTypeName.objects.get(slug="material")
516+
d.type = document_type
504517
d.group = group
505-
d.rev = "01"
518+
d.rev = "00"
506519
else:
507520
d = existing
508521

@@ -514,12 +527,12 @@ def edit_material(request, acronym, action="new", name=None, group_type=None):
514527
d.time = datetime.datetime.now()
515528

516529
if not d.name:
517-
d.name = "material-%s-%s" % (d.group.acronym, slugify(d.title))
530+
d.name = "%s-%s-%s" % (d.type_id, d.group.acronym, slugify(d.title))
518531
i = 2
519532
while True:
520533
if not Document.objects.filter(name=d.name).exists():
521534
break
522-
d.name = "material-%s-%s-%s" % (d.group.acronym, slugify(d.title), i)
535+
d.name = "%s-%s-%s-%s" % (d.type_id, d.group.acronym, slugify(d.title), i)
523536
i += 1
524537

525538
if "material" in form.fields:
@@ -555,7 +568,7 @@ def edit_material(request, acronym, action="new", name=None, group_type=None):
555568

556569
return redirect("group_materials", acronym=group.acronym)
557570
else:
558-
form = UploadMaterialForm(action=action, doc=existing)
571+
form = UploadMaterialForm(document_type, action, existing)
559572

560573
return render(request, 'group/edit_material.html', {
561574
'group': group,

ietf/group/features.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class GroupFeatures(object):
88
has_materials = False
99
customize_workflow = False
1010
default_tab = "group_charter"
11+
material_types = ["slides"]
1112

1213
def __init__(self, group):
1314
if group.type_id in ("wg", "rg"):

ietf/group/info.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import itertools
3737
from tempfile import mkstemp
3838
import glob
39+
from collections import OrderedDict
3940

4041
from django.shortcuts import get_object_or_404, render
4142
from django.template.loader import render_to_string
@@ -259,15 +260,15 @@ def concluded_groups(request):
259260
dict(group_types=group_types))
260261

261262
def get_group_materials(group):
262-
return Document.objects.filter(group=group, type="material", session=None).exclude(states__slug="inactive")
263+
return Document.objects.filter(group=group, type__in=group.features.material_types, session=None).exclude(states__slug="inactive")
263264

264265
def construct_group_menu_context(request, group, selected, group_type, others):
265266
"""Return context with info for the group menu filled in."""
266267
kwargs = dict(acronym=group.acronym)
267268
if group_type:
268269
kwargs["group_type"] = group_type
269270

270-
# entries
271+
# menu entries
271272
entries = []
272273
if group.features.has_documents:
273274
entries.append(("Documents", urlreverse("ietf.group.info.group_documents", kwargs=kwargs)))
@@ -295,7 +296,7 @@ def construct_group_menu_context(request, group, selected, group_type, others):
295296
actions.append((u"Add or edit milestones", urlreverse("group_edit_milestones", kwargs=kwargs)))
296297

297298
if group.features.has_materials and can_manage_materials(request.user, group):
298-
actions.append((u"Upload material", urlreverse("group_new_material", kwargs=kwargs)))
299+
actions.append((u"Upload material", urlreverse("group_choose_material_type", kwargs=kwargs)))
299300

300301
if group.type_id in ("rg", "wg") and group.state_id != "conclude" and can_manage:
301302
actions.append((u"Edit group", urlreverse("group_edit", kwargs=kwargs)))
@@ -446,18 +447,23 @@ def materials(request, acronym, group_type=None):
446447
if not group.features.has_materials:
447448
raise Http404
448449

449-
materials = get_group_materials(group).order_by("-time")
450-
for d in materials:
450+
docs = get_group_materials(group).order_by("type", "-time").select_related("type")
451+
doc_types = OrderedDict()
452+
for d in docs:
451453
extension = ""
452454
globs = glob.glob(d.get_file_path() + d.name + "-" + d.rev + ".*")
453455
if globs:
454456
extension = os.path.splitext(globs[0])[1]
455457

456458
d.full_url = d.href() + extension
457459

460+
if d.type not in doc_types:
461+
doc_types[d.type] = []
462+
doc_types[d.type].append(d)
463+
458464
return render(request, 'group/materials.html',
459465
construct_group_menu_context(request, group, "materials", group_type, {
460-
"materials": materials,
466+
"doc_types": doc_types.items(),
461467
"can_manage_materials": can_manage_materials(request.user, group)
462468
}))
463469

ietf/group/urls.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,11 @@
77
(r'^chartering/$', 'ietf.group.info.chartering_groups'),
88
(r'^chartering/create/(?P<group_type>(wg|rg))/$', 'ietf.group.edit.edit', {'action': "charter"}, "group_create"),
99
(r'^concluded/$', 'ietf.group.info.concluded_groups'),
10-
# FIXME: the remainder here is currently duplicated in urls_info.py, need to unify these at some point
10+
# FIXME: the things below are duplicated in urls_info.py, need to unify these at some point
1111
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/$', 'ietf.group.info.group_home', None, "group_home"),
1212
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/documents/$', 'ietf.group.info.group_documents', None, "group_docs"),
1313
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/charter/$', 'ietf.group.info.group_charter', None, 'group_charter'),
1414
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/history/$', 'ietf.group.info.history'),
15-
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/$', 'ietf.group.info.materials', None, "group_materials"),
16-
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/new/$', 'ietf.group.edit.edit_material', { 'action': "new" }, "group_new_material"),
17-
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/(?P<name>material-[^/]+)/edit/$', 'ietf.group.edit.edit_material', { 'action': "edit" }, "group_edit_material"),
18-
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/(?P<name>material-[^/]+)/revise/$', 'ietf.group.edit.edit_material', { 'action': "revise" }, "group_revise_material"),
1915
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/deps/dot/$', 'ietf.group.info.dependencies_dot'),
2016
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/deps/pdf/$', 'ietf.group.info.dependencies_pdf'),
2117
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/init-charter/', 'ietf.group.edit.submit_initial_charter'),
@@ -26,6 +22,12 @@
2622
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/milestones/charter/reset/$', 'ietf.group.milestones.reset_charter_milestones', None, "group_reset_charter_milestones"),
2723
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/ajax/searchdocs/$', 'ietf.group.milestones.ajax_search_docs', None, "group_ajax_search_docs"),
2824
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/workflow/$', 'ietf.group.edit.customize_workflow'),
25+
26+
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/$', 'ietf.group.info.materials', None, "group_materials"),
27+
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/new/$', 'ietf.group.edit.choose_material_type', None, "group_choose_material_type"),
28+
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/new/(?P<doc_type>[\w-]+)/$', 'ietf.group.edit.edit_material', { 'action': "new" }, "group_new_material"),
29+
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/(?P<name>[^/]+)/edit/$', 'ietf.group.edit.edit_material', { 'action': "edit" }, "group_edit_material"),
30+
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/(?P<name>[^/]+)/revise/$', 'ietf.group.edit.edit_material', { 'action': "revise" }, "group_revise_material"),
2931
)
3032

3133

ietf/group/utils.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,3 @@ def get_group_or_404(acronym, group_type):
118118
possible_groups = possible_groups.filter(type=group_type)
119119

120120
return get_object_or_404(possible_groups, acronym=acronym)
121-

0 commit comments

Comments
 (0)