4646from django .utils .safestring import mark_safe
4747
4848from ietf .doc .views_search import SearchForm , retrieve_search_results
49- from ietf .doc .models import State , DocAlias , RelatedDocument
49+ from ietf .doc .models import Document , State , DocAlias , RelatedDocument
5050from ietf .doc .utils import get_chartering_type
5151from ietf .doc .templatetags .ietf_filters import clean_whitespace
5252from ietf .group .models import Group , Role , ChangeStateGroupEvent
5353from ietf .name .models import GroupTypeName
5454from ietf .group .utils import get_charter_text , can_manage_group_type , milestone_reviewer_for_group_type
55+ from ietf .group .utils import can_manage_materials , get_group_or_404
5556from ietf .utils .pipe import pipe
5657
5758def roles (group , role_name ):
@@ -256,6 +257,9 @@ def concluded_groups(request):
256257 return render (request , 'group/concluded_groups.html' ,
257258 dict (group_types = group_types ))
258259
260+ def get_group_materials (group ):
261+ return Document .objects .filter (group = group ).exclude (states__slug = "deleted" )#.exclude(session=None).exclude(type="charter")
262+
259263def construct_group_menu_context (request , group , selected , group_type , others ):
260264 """Return context with info for the group menu filled in."""
261265 kwargs = dict (acronym = group .acronym )
@@ -264,11 +268,13 @@ def construct_group_menu_context(request, group, selected, group_type, others):
264268
265269 # entries
266270 entries = []
267- if group .features () .has_documents :
271+ if group .features .has_documents :
268272 entries .append (("Documents" , urlreverse ("ietf.group.info.group_documents" , kwargs = kwargs )))
269273 entries .append (("Charter" , urlreverse ("ietf.group.info.group_charter" , kwargs = kwargs )))
274+ if group .features .has_materials and get_group_materials (group ).exists ():
275+ entries .append (("Materials" , urlreverse ("ietf.group.info.materials" , kwargs = kwargs )))
270276 entries .append (("History" , urlreverse ("ietf.group.info.history" , kwargs = kwargs )))
271- if group .features () .has_documents :
277+ if group .features .has_documents :
272278 entries .append (("Dependency Graph" , urlreverse ("ietf.group.info.dependencies_pdf" , kwargs = kwargs )))
273279
274280 if group .list_archive .startswith ("http:" ) or group .list_archive .startswith ("https:" ) or group .list_archive .startswith ("ftp:" ):
@@ -283,14 +289,17 @@ def construct_group_menu_context(request, group, selected, group_type, others):
283289 is_chair = group .has_role (request .user , "chair" )
284290 can_manage = can_manage_group_type (request .user , group .type_id )
285291
286- if group .features () .has_milestones :
292+ if group .features .has_milestones :
287293 if group .state_id != "proposed" and (is_chair or can_manage ):
288294 actions .append ((u"Add or edit milestones" , urlreverse ("group_edit_milestones" , kwargs = kwargs )))
289295
296+ 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+
290299 if group .state_id != "conclude" and can_manage :
291300 actions .append ((u"Edit group" , urlreverse ("group_edit" , kwargs = kwargs )))
292301
293- if group .features () .customize_workflow and (is_chair or can_manage ):
302+ if group .features .customize_workflow and (is_chair or can_manage ):
294303 actions .append ((u"Customize workflow" , urlreverse ("ietf.group.edit.customize_workflow" , kwargs = kwargs )))
295304
296305 if group .state_id in ("active" , "dormant" ) and can_manage :
@@ -341,23 +350,17 @@ def search_for_group_documents(group):
341350
342351 return docs , meta , docs_related , meta_related
343352
344- def get_group_or_404 (acronym , group_type ):
345- """Helper to overcome the schism between group-type prefixed URLs and generic."""
346- possible_groups = Group .objects .all ()
347- if group_type :
348- possible_groups = possible_groups .filter (type = group_type )
349-
350- return get_object_or_404 (possible_groups , acronym = acronym )
351-
352353def group_home (request , acronym , group_type = None ):
353354 group = get_group_or_404 (acronym , group_type )
354355 kwargs = dict (acronym = group .acronym )
355356 if group_type :
356357 kwargs ["group_type" ] = group_type
357- return HttpResponseRedirect (urlreverse (group .features () .default_tab , kwargs = kwargs ))
358+ return HttpResponseRedirect (urlreverse (group .features .default_tab , kwargs = kwargs ))
358359
359360def group_documents (request , acronym , group_type = None ):
360361 group = get_group_or_404 (acronym , group_type )
362+ if not group .features .has_documents :
363+ raise Http404
361364
362365 docs , meta , docs_related , meta_related = search_for_group_documents (group )
363366
@@ -372,6 +375,8 @@ def group_documents(request, acronym, group_type=None):
372375def group_documents_txt (request , acronym , group_type = None ):
373376 """Return tabulator-separated rows with documents for group."""
374377 group = get_group_or_404 (acronym , group_type )
378+ if not group .features .has_documents :
379+ raise Http404
375380
376381 docs , meta , docs_related , meta_related = search_for_group_documents (group )
377382
@@ -393,7 +398,6 @@ def group_documents_txt(request, acronym, group_type=None):
393398
394399 return HttpResponse (u"\n " .join (rows ), content_type = 'text/plain; charset=UTF-8' )
395400
396-
397401def group_charter (request , acronym , group_type = None ):
398402 group = get_group_or_404 (acronym , group_type )
399403
@@ -410,10 +414,10 @@ def group_charter(request, acronym, group_type=None):
410414
411415 can_manage = can_manage_group_type (request .user , group .type_id )
412416
413- if group .features () .has_chartering_process :
417+ if group .features .has_chartering_process :
414418 description = group .charter_text
415419 else :
416- description = group .description or "No description entered yet."
420+ description = group .description or "No description yet."
417421
418422 return render (request , 'group/group_charter.html' ,
419423 construct_group_menu_context (request , group , "charter" , group_type , {
@@ -433,10 +437,21 @@ def history(request, acronym, group_type=None):
433437
434438 return render (request , 'group/history.html' ,
435439 construct_group_menu_context (request , group , "history" , group_type , {
436- "events" : events ,
437- }))
438-
439-
440+ "events" : events ,
441+ }))
442+
443+ def materials (request , acronym , group_type = None ):
444+ group = get_group_or_404 (acronym , group_type )
445+ if not group .features .has_materials :
446+ raise Http404
447+
448+ materials = get_group_materials (group ).order_by ("-time" )
449+
450+ return render (request , 'group/materials.html' ,
451+ construct_group_menu_context (request , group , "materials" , group_type , {
452+ "materials" : materials ,
453+ }))
454+
440455def nodename (name ):
441456 return name .replace ('-' ,'_' )
442457
@@ -556,6 +571,8 @@ def make_dot(group):
556571
557572def dependencies_dot (request , acronym , group_type = None ):
558573 group = get_group_or_404 (acronym , group_type )
574+ if not group .features .has_documents :
575+ raise Http404
559576
560577 return HttpResponse (make_dot (group ),
561578 content_type = 'text/plain; charset=UTF-8'
@@ -564,6 +581,8 @@ def dependencies_dot(request, acronym, group_type=None):
564581@cache_page ( 60 * 60 )
565582def dependencies_pdf (request , acronym , group_type = None ):
566583 group = get_group_or_404 (acronym , group_type )
584+ if not group .features .has_documents :
585+ raise Http404
567586
568587 dothandle ,dotname = mkstemp ()
569588 os .close (dothandle )
0 commit comments