Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions ietf/community/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from ietf.doc.models import DocEvent, Document
from ietf.doc.utils_search import prepare_document_table
from ietf.person.utils import lookup_persons
from ietf.utils.decorators import ignore_view_kwargs
from ietf.utils.http import is_ajax
from ietf.utils.response import permission_denied

Expand Down Expand Up @@ -70,6 +71,7 @@ def view_list(request, email_or_name=None):
})

@login_required
@ignore_view_kwargs("group_type")
def manage_list(request, email_or_name=None, acronym=None):
# we need to be a bit careful because clist may not exist in the
# database so we can't call related stuff on it yet
Expand Down Expand Up @@ -209,6 +211,7 @@ def untrack_document(request, name, email_or_name=None, acronym=None):
})


@ignore_view_kwargs("group_type")
def export_to_csv(request, email_or_name=None, acronym=None):
try:
clist = lookup_community_list(request, email_or_name, acronym)
Expand Down Expand Up @@ -253,6 +256,7 @@ def export_to_csv(request, email_or_name=None, acronym=None):

return response

@ignore_view_kwargs("group_type")
def feed(request, email_or_name=None, acronym=None):
try:
clist = lookup_community_list(request, email_or_name, acronym)
Expand Down Expand Up @@ -292,6 +296,7 @@ def feed(request, email_or_name=None, acronym=None):


@login_required
@ignore_view_kwargs("group_type")
def subscription(request, email_or_name=None, acronym=None):
try:
clist = lookup_community_list(request, email_or_name, acronym)
Expand Down
3 changes: 3 additions & 0 deletions ietf/doc/views_material.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@
from ietf.doc.utils import add_state_change_event, check_common_doc_name_rules
from ietf.group.models import Group
from ietf.group.utils import can_manage_materials
from ietf.utils.decorators import ignore_view_kwargs
from ietf.utils.response import permission_denied

@login_required
@ignore_view_kwargs("group_type")
def choose_material_type(request, acronym):
group = get_object_or_404(Group, acronym=acronym)
if not group.features.has_nonsession_materials:
Expand Down Expand Up @@ -91,6 +93,7 @@ def clean_name(self):
return name

@login_required
@ignore_view_kwargs("group_type")
def edit_material(request, name=None, acronym=None, action=None, doc_type=None):
# the materials process is not very developed, so at the moment we
# handle everything through the same view/form
Expand Down
2 changes: 1 addition & 1 deletion ietf/group/milestones.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ def save_milestone_form(f):
can_change_uses_milestone_dates=can_change_uses_milestone_dates))

@login_required
def reset_charter_milestones(request, group_type, acronym):
def reset_charter_milestones(request, acronym, group_type=None):
"""Reset charter milestones to the currently in-use milestones."""
group = get_group_or_404(acronym, group_type)
if not group.features.has_milestones:
Expand Down
7 changes: 5 additions & 2 deletions ietf/group/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@
from ietf.mailtrigger.utils import gather_address_lists
from ietf.mailtrigger.models import Recipient
from ietf.settings import MAILING_LIST_INFO_URL
from ietf.utils.decorators import ignore_view_kwargs
from ietf.utils.response import permission_denied
from ietf.utils.text import strip_suffix
from ietf.utils import markdown
Expand Down Expand Up @@ -2158,7 +2159,8 @@ def appeals(request, acronym, group_type=None):
),
)

def appeal_artifact(request, acronym, artifact_id, group_type=None):
@ignore_view_kwargs("group_type")
def appeal_artifact(request, acronym, artifact_id):
artifact = get_object_or_404(AppealArtifact, pk=artifact_id)
if artifact.is_markdown():
artifact_html = markdown.markdown(artifact.bits.tobytes().decode("utf-8"))
Expand All @@ -2177,7 +2179,8 @@ def appeal_artifact(request, acronym, artifact_id, group_type=None):
)

@role_required("Secretariat")
def appeal_artifact_markdown(request, acronym, artifact_id, group_type=None):
@ignore_view_kwargs("group_type")
def appeal_artifact_markdown(request, acronym, artifact_id):
artifact = get_object_or_404(AppealArtifact, pk=artifact_id)
if artifact.is_markdown():
return HttpResponse(artifact.bits, content_type=artifact.content_type)
Expand Down
27 changes: 27 additions & 0 deletions ietf/utils/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,30 @@ def memoize(func):
# we cannot set up the cache here.
return decorate(func, _memoize)


def ignore_view_kwargs(*args):
"""Ignore the specified kwargs if they are present

Usage:
@ignore_view_kwargs("ignore_arg1", "ignore_arg2")
def my_view(request, good_arg, ignore_arg1, ignore_arg2):
...

This will allow my_view() to be used in url() paths that have zero, one, or both of
ignore_arg1 and ignore_arg2 captured. These will be ignored, while good_arg will still
be captured as usual.
"""
kwargs_to_ignore = args

def decorate(view):
@wraps(view)
def wrapped(*args, **kwargs):
for kwarg in kwargs_to_ignore:
kwargs.pop(kwarg, None)
return view(*args, **kwargs)

return wrapped

return decorate