Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

admin_urls.py 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from urllib.parse import parse_qsl, unquote, urlparse, urlunparse
  2. from django import template
  3. from django.contrib.admin.utils import quote
  4. from django.urls import Resolver404, get_script_prefix, resolve
  5. from django.utils.http import urlencode
  6. register = template.Library()
  7. @register.filter
  8. def admin_urlname(value, arg):
  9. return 'admin:%s_%s_%s' % (value.app_label, value.model_name, arg)
  10. @register.filter
  11. def admin_urlquote(value):
  12. return quote(value)
  13. @register.simple_tag(takes_context=True)
  14. def add_preserved_filters(context, url, popup=False, to_field=None):
  15. opts = context.get('opts')
  16. preserved_filters = context.get('preserved_filters')
  17. parsed_url = list(urlparse(url))
  18. parsed_qs = dict(parse_qsl(parsed_url[4]))
  19. merged_qs = {}
  20. if opts and preserved_filters:
  21. preserved_filters = dict(parse_qsl(preserved_filters))
  22. match_url = '/%s' % unquote(url).partition(get_script_prefix())[2]
  23. try:
  24. match = resolve(match_url)
  25. except Resolver404:
  26. pass
  27. else:
  28. current_url = '%s:%s' % (match.app_name, match.url_name)
  29. changelist_url = 'admin:%s_%s_changelist' % (opts.app_label, opts.model_name)
  30. if changelist_url == current_url and '_changelist_filters' in preserved_filters:
  31. preserved_filters = dict(parse_qsl(preserved_filters['_changelist_filters']))
  32. merged_qs.update(preserved_filters)
  33. if popup:
  34. from django.contrib.admin.options import IS_POPUP_VAR
  35. merged_qs[IS_POPUP_VAR] = 1
  36. if to_field:
  37. from django.contrib.admin.options import TO_FIELD_VAR
  38. merged_qs[TO_FIELD_VAR] = to_field
  39. merged_qs.update(parsed_qs)
  40. parsed_url[4] = urlencode(merged_qs)
  41. return urlunparse(parsed_url)