|
7 | 7 | from ietf.meeting import ajax |
8 | 8 |
|
9 | 9 | safe_for_all_meeting_types = [ |
10 | | - url(r'^session/(?P<acronym>[A-Za-z0-9_\-\+]+)/$', views.session_details), |
| 10 | + url(r'^session/(?P<acronym>[-a-z0-9]+)/$', views.session_details), |
11 | 11 | url(r'^session/(?P<session_id>\d+)/drafts$', views.add_session_drafts), |
12 | 12 | ] |
13 | 13 |
|
|
69 | 69 | ] |
70 | 70 |
|
71 | 71 | urlpatterns = [ |
| 72 | + # First patterns which start with unique strings |
| 73 | + url(r'^$', views.current_materials), |
72 | 74 | url(r'^ajax/get-utc/$', views.ajax_get_utc), |
73 | | - url(r'^requests.html$', RedirectView.as_view(url='/meeting/requests', permanent=True)), |
74 | | - url(r'^(?P<num>\d+)/requests.html$', RedirectView.as_view(url='/meeting/%(num)s/requests', permanent=True)), |
75 | | - url(r'^(?P<num>[A-Za-z0-9._+-]+)/', include(safe_for_all_meeting_types)), |
76 | | - # The optionals have to go first, otherwise the agenda/(owner)/(name)/ patterns match things they shouldn't |
77 | | - url(r'^(?:(?P<num>\d+)/)?', include(type_ietf_only_patterns_id_optional)), |
78 | | - url(r'^(?P<num>\d+)/', include(type_ietf_only_patterns)), |
79 | | - url(r'^(?P<num>interim-[a-z0-9-]+)/', include(type_ietf_only_patterns)), |
80 | | - url(r'^upcoming/$', views.upcoming), |
81 | | - url(r'^upcoming.ics/$', views.upcoming_ical), |
82 | 75 | url(r'^interim/announce/$', views.interim_announce), |
83 | 76 | url(r'^interim/announce/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_send_announcement), |
84 | 77 | url(r'^interim/request/$', views.interim_request), |
85 | 78 | url(r'^interim/request/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_request_details), |
86 | 79 | url(r'^interim/request/(?P<number>[A-Za-z0-9._+-]+)/edit/$', views.interim_request_edit), |
87 | 80 | url(r'^interim/request/(?P<number>[A-Za-z0-9._+-]+)/cancel/$', views.interim_request_cancel), |
88 | 81 | url(r'^interim/pending/$', views.interim_pending), |
89 | | - url(r'^$', views.current_materials), |
| 82 | + url(r'^requests.html$', RedirectView.as_view(url='/meeting/requests', permanent=True)), |
| 83 | + url(r'^upcoming/$', views.upcoming), |
| 84 | + url(r'^upcoming.ics/$', views.upcoming_ical), |
| 85 | + # Then patterns from more specific to less |
| 86 | + url(r'^(?P<num>interim-[a-z0-9-]+)/', include(type_ietf_only_patterns)), |
| 87 | + url(r'^(?P<num>\d+)/requests.html$', RedirectView.as_view(url='/meeting/%(num)s/requests', permanent=True)), |
| 88 | + # The optionals have to go first of these two, otherwise the agenda/(owner)/(name)/ patterns match things they shouldn't |
| 89 | + url(r'^(?:(?P<num>\d+)/)?', include(type_ietf_only_patterns_id_optional)), |
| 90 | + url(r'^(?P<num>\d+)/', include(type_ietf_only_patterns)), |
| 91 | + # |
| 92 | + url(r'^(?P<num>\d+)/', include(safe_for_all_meeting_types)), |
| 93 | + url(r'^(?P<num>interim-[a-z0-9-]+)/', include(safe_for_all_meeting_types)), |
90 | 94 | ] |
91 | 95 |
|
0 commit comments