Skip to content

Commit 03fc411

Browse files
committed
Added route checking before add to route to prevent duplication
1 parent dd7e393 commit 03fc411

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

rest_framework_extensions/routers.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ class ExtendedActionLinkRouterMixin(object):
6565
_routs = routes[2:4] + routes[:2] # first routes should be dynamic (because of urlpatterns position matters)
6666
# left self.routs for backward
6767

68+
def route_is_in(self, target_route, route_list):
69+
for route in route_list:
70+
if route.url == target_route.name and route.name == target_route.name and route.mapping == target_route.mapping and route.initkwargs == target_route.initkwargs:
71+
return True
72+
return False
73+
6874
def get_routes(self, viewset):
6975
"""
7076
Augment `self.routes` with any dynamically generated routes.
@@ -80,20 +86,27 @@ def get_routes(self, viewset):
8086
if self.is_dynamic_route(route):
8187
# Dynamic routes (@list_route or @detail_route decorator)
8288
if self.is_list_dynamic_route(route):
83-
ret += self.get_dynamic_routes_instances(
89+
temporary_route_list = self.get_dynamic_routes_instances(
8490
viewset,
8591
route,
8692
self._filter_by_list_dynamic_routes(dynamic_routes)
8793
)
94+
for temporary_route in temporary_route_list:
95+
if not self.route_is_in(temporary_route, ret):
96+
ret.append(temporary_route)
8897
else:
89-
ret += self.get_dynamic_routes_instances(
98+
temporary_route_list = self.get_dynamic_routes_instances(
9099
viewset,
91100
route,
92101
self._filter_by_detail_dynamic_routes(dynamic_routes)
93102
)
103+
for temporary_route in temporary_route_list:
104+
if not self.route_is_in(temporary_route, ret):
105+
ret.append(temporary_route)
94106
else:
95107
# Standard route
96-
ret.append(route)
108+
if route not in ret:
109+
ret.append(route)
97110

98111
return ret
99112

0 commit comments

Comments
 (0)