Skip to content

Commit 3bfb6dc

Browse files
committed
Added support data for a tentative new material document type, add a upload/edit/revise page for uploading and revising group materials, still missing a couple of details and tests
- Legacy-Id: 7776
1 parent f9407c5 commit 3bfb6dc

8 files changed

Lines changed: 693 additions & 18 deletions

File tree

ietf/doc/migrations/0019_create_material_states.py

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

ietf/doc/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ def get_file_path(self):
8585
return settings.CONFLICT_REVIEW_PATH
8686
elif self.type_id == "statchg":
8787
return settings.STATUS_CHANGE_PATH
88+
elif self.type_id == "material":
89+
return settings.MATERIALS_PATH
8890
else:
8991
raise NotImplemented
9092

ietf/group/edit.py

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99
from django.shortcuts import render, get_object_or_404, redirect
1010
from django.http import HttpResponseForbidden, Http404
1111
from django.utils.html import mark_safe
12+
from django.utils.text import slugify
1213
from django.http import Http404, HttpResponse
1314
from django.contrib.auth.decorators import login_required
1415

1516
import debug # pyflakes:ignore
1617

17-
from ietf.doc.models import DocAlias, DocTagName, Document, State, save_document_in_history
18+
from ietf.doc.models import Document, DocAlias, DocTagName, DocTypeName, DocEvent, State, save_document_in_history
1819
from ietf.doc.utils import get_tags_for_stream_id
1920
from ietf.group.models import ( Group, Role, GroupEvent, GroupHistory, GroupStateName,
2021
GroupStateTransitions, GroupTypeName, GroupURL, ChangeStateGroupEvent )
@@ -456,18 +457,95 @@ def customize_workflow(request, group_type, acronym):
456457
'tags': tags,
457458
})
458459

460+
class UploadMaterialForm(forms.Form):
461+
title = forms.CharField(max_length=Document._meta.get_field("title").max_length)
462+
state = forms.ModelChoiceField(State.objects.filter(type="material"), empty_label=None)
463+
material = forms.FileField(label='File', help_text="PDF or text file (ASCII/UTF-8)")
464+
465+
def __init__(self, *args, **kwargs):
466+
action = kwargs.pop("action")
467+
doc = kwargs.pop("doc", None)
468+
469+
super(UploadMaterialForm, self).__init__(*args, **kwargs)
470+
471+
if action == "new":
472+
self.fields["state"].widget = forms.HiddenInput()
473+
self.fields["state"].queryset = self.fields["state"].queryset.filter(slug="active")
474+
else:
475+
self.fields["title"].initial = doc.title
476+
self.fields["state"].initial = doc.get_state().pk if doc.get_state() else None
477+
478+
if action == "edit":
479+
del self.fields["material"]
480+
481+
459482
@login_required
460-
def upload_materials(request, acronym, group_type=None):
483+
def edit_material(request, acronym, action="new", name=None, group_type=None):
461484
group = get_group_or_404(acronym, group_type)
462485
if not group.features.has_materials:
463486
raise Http404
464487

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

468-
# FIXME: fill in
491+
existing = None
492+
if name and action != "new":
493+
existing = get_object_or_404(Document, type="material", name=name)
494+
495+
if request.method == 'POST':
496+
form = UploadMaterialForm(request.POST, request.FILES, action=action, doc=existing)
497+
498+
if form.is_valid():
499+
if action == "new":
500+
d = Document()
501+
d.type = DocTypeName.objects.get(slug="material")
502+
d.group = group
503+
d.rev = "01"
504+
else:
505+
d = existing
506+
507+
d.title = form.cleaned_data["title"]
508+
d.time = datetime.datetime.now()
509+
510+
if not d.name:
511+
d.name = "material-%s-%s" % (d.group.acronym, slugify(d.title))
512+
i = 2
513+
while True:
514+
if not Document.objects.filter(name=d.name).exists():
515+
break
516+
d.name = "material-%s-%s-%s" % (d.group.acronym, slugify(d.title), i)
517+
i += 1
518+
519+
if "material" in form.fields:
520+
if action != "new":
521+
d.rev = "%02d" % (int(d.rev) + 1)
522+
523+
f = form.cleaned_data["material"]
524+
file_ext = os.path.splitext(f.name)[1]
525+
526+
with open(os.path.join(d.get_file_path(), d.name + "-" + d.rev + file_ext), 'wb+') as dest:
527+
for chunk in f.chunks():
528+
dest.write(chunk)
529+
530+
d.save()
531+
532+
# FIXME: missing edit title event
533+
534+
# FIXME: missing changed state event
535+
d.set_state(form.cleaned_data["state"])
536+
537+
# FIXME: wrong, should be new revision event
538+
DocEvent.objects.create(doc=d,
539+
by=request.user.person,
540+
type='uploaded',
541+
desc="Uploaded material")
542+
543+
return redirect("group_materials", acronym=group.acronym)
544+
else:
545+
form = UploadMaterialForm(action=action, doc=existing)
469546

470-
return render(request, 'group/materials.html',
471-
construct_group_menu_context(request, group, "materials", group_type, {
472-
"materials": materials,
473-
}))
547+
return render(request, 'group/edit_material.html', {
548+
'group': group,
549+
'form': form,
550+
'action': action,
551+
})

ietf/group/info.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import os
3636
import itertools
3737
from tempfile import mkstemp
38+
import glob
3839

3940
from django.shortcuts import get_object_or_404, render
4041
from django.template.loader import render_to_string
@@ -258,7 +259,7 @@ def concluded_groups(request):
258259
dict(group_types=group_types))
259260

260261
def get_group_materials(group):
261-
return Document.objects.filter(group=group).exclude(states__slug="deleted")#.exclude(session=None).exclude(type="charter")
262+
return Document.objects.filter(group=group, type="material", session=None).exclude(states__slug="inactive")
262263

263264
def construct_group_menu_context(request, group, selected, group_type, others):
264265
"""Return context with info for the group menu filled in."""
@@ -294,9 +295,9 @@ def construct_group_menu_context(request, group, selected, group_type, others):
294295
actions.append((u"Add or edit milestones", urlreverse("group_edit_milestones", kwargs=kwargs)))
295296

296297
if group.features.has_materials and can_manage_materials(request.user, group):
297-
actions.append((u"Upload materials", urlreverse("group_upload_materials", kwargs=kwargs)))
298+
actions.append((u"Upload material", urlreverse("group_new_material", kwargs=kwargs)))
298299

299-
if group.state_id != "conclude" and can_manage:
300+
if group.type_id in ("rg", "wg") and group.state_id != "conclude" and can_manage:
300301
actions.append((u"Edit group", urlreverse("group_edit", kwargs=kwargs)))
301302

302303
if group.features.customize_workflow and (is_chair or can_manage):
@@ -446,10 +447,18 @@ def materials(request, acronym, group_type=None):
446447
raise Http404
447448

448449
materials = get_group_materials(group).order_by("-time")
450+
for d in materials:
451+
extension = ""
452+
globs = glob.glob(d.get_file_path() + d.name + "-" + d.rev + ".*")
453+
if globs:
454+
extension = os.path.splitext(globs[0])[1]
455+
456+
d.full_url = d.href() + extension
449457

450458
return render(request, 'group/materials.html',
451459
construct_group_menu_context(request, group, "materials", group_type, {
452460
"materials": materials,
461+
"can_manage_materials": can_manage_materials(request.user, group)
453462
}))
454463

455464
def nodename(name):

ietf/group/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
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'),
1515
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/$', 'ietf.group.info.materials', None, "group_materials"),
16-
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/materials/upload/$', 'ietf.group.edit.upload_materials', None, "group_upload_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"),
1719
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/deps/dot/$', 'ietf.group.info.dependencies_dot'),
1820
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/deps/pdf/$', 'ietf.group.info.dependencies_pdf'),
1921
(r'^(?P<acronym>[a-zA-Z0-9-._]+)/init-charter/', 'ietf.group.edit.submit_initial_charter'),

0 commit comments

Comments
 (0)