From 151ce2b12c8d669837e0b50b06e9828574bbb7cc Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Thu, 14 Apr 2011 15:01:22 +0200 Subject: [PATCH] #1414: http301 for old-style tag urls, #1413: qualified themes links on main, minor fix for search: new style tag path in GET param --- apps/catalogue/forms.py | 2 +- apps/catalogue/models.py | 31 +++-- apps/catalogue/views.py | 4 +- .../templates/catalogue/main_page.html | 112 +++++++++--------- 4 files changed, 79 insertions(+), 70 deletions(-) diff --git a/apps/catalogue/forms.py b/apps/catalogue/forms.py index 6ed6d62c2..fd751965a 100644 --- a/apps/catalogue/forms.py +++ b/apps/catalogue/forms.py @@ -27,7 +27,7 @@ class SearchForm(forms.Form): super(SearchForm, self).__init__(*args, **kwargs) self.fields['q'].widget.attrs['title'] = _('title, author, theme/topic, epoch, kind, genre') #self.fields['q'].widget.attrs['style'] = '' - self.fields['tags'].initial = '/'.join(tag.slug for tag in Tag.get_tag_list(tags)) + self.fields['tags'].initial = '/'.join(tag.url_chunk for tag in Tag.get_tag_list(tags)) class UserSetsForm(forms.Form): diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index 455296217..2b6a2cc2f 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -64,6 +64,9 @@ class Tag(TagBase): gazeta_link = models.CharField(blank=True, max_length=240) wiki_link = models.CharField(blank=True, max_length=240) + class UrlDeprecationWarning(DeprecationWarning): + pass + categories_rev = { 'autor': 'author', 'epoka': 'epoch', @@ -122,19 +125,20 @@ class Tag(TagBase): real_tags = [] ambiguous_slugs = [] category = None + deprecated = False tags_splitted = tags.split('/') - for index, name in enumerate(tags_splitted): - if name in Tag.categories_rev: + for name in tags_splitted: + if category: + real_tags.append(Tag.objects.get(slug=name, category=category)) + category = None + elif name in Tag.categories_rev: category = Tag.categories_rev[name] else: - if category: - real_tags.append(Tag.objects.get(slug=name, category=category)) - category = None - else: - try: - real_tags.append(Tag.objects.exclude(category='book').get(slug=name)) - except Tag.MultipleObjectsReturned, e: - ambiguous_slugs.append(name) + try: + real_tags.append(Tag.objects.exclude(category='book').get(slug=name)) + deprecated = True + except Tag.MultipleObjectsReturned, e: + ambiguous_slugs.append(name) if category: # something strange left off @@ -145,8 +149,11 @@ class Tag(TagBase): e.tags = real_tags e.ambiguous_slugs = ambiguous_slugs raise e - else: - return real_tags + if deprecated: + e = Tag.UrlDeprecationWarning() + e.tags = real_tags + raise e + return real_tags else: return TagBase.get_tag_list(tags) diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 7f1de6d46..84cce7b2c 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -15,7 +15,7 @@ from datetime import datetime from django.conf import settings from django.template import RequestContext from django.shortcuts import render_to_response, get_object_or_404 -from django.http import HttpResponse, HttpResponseRedirect, Http404 +from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect from django.core.urlresolvers import reverse from django.db.models import Q from django.contrib.auth.decorators import login_required, user_passes_test @@ -152,6 +152,8 @@ def tagged_object_list(request, tags=''): raise Http404 except models.Tag.MultipleObjectsReturned, e: return differentiate_tags(request, e.tags, e.ambiguous_slugs) + except models.Tag.UrlDeprecationWarning, e: + return HttpResponsePermanentRedirect(reverse('tagged_object_list', args=['/'.join(tag.url_chunk for tag in e.tags)])) try: if len(tags) > settings.MAX_TAG_LIST: diff --git a/wolnelektury/templates/catalogue/main_page.html b/wolnelektury/templates/catalogue/main_page.html index 410c81157..947675288 100644 --- a/wolnelektury/templates/catalogue/main_page.html +++ b/wolnelektury/templates/catalogue/main_page.html @@ -118,176 +118,176 @@
  1. środowisko miejskie i wiejskie - Miasto, Warszawa, Mieszczanin, Handel, Robotnik, Żyd, Wieś, Sielanka, Chłop, Ogród, Natura, Przestrzeń
  2. + Miasto, Warszawa, Mieszczanin, Handel, Robotnik, Żyd, Wieś, Sielanka, Chłop, Ogród, Natura, Przestrzeń
  3. polityczny obraz świata - Państwo, Obowiązek, Cnota, Obywatel, Patriota, Ojczyzna, Naród, Przywódca, Władza, Urzędnik, Król, Rycerz, Żołnierz, Wojna, Wróg, Zwycięstwo, Walka, Siła, Historia, Powstanie, Śmierć bohaterska, Sława, Rewolucja, Sąd, Zdrada
  4. + Państwo, Obowiązek, Cnota, Obywatel, Patriota, Ojczyzna, Naród, Przywódca, Władza, Urzędnik, Król, Rycerz, Żołnierz, Wojna, Wróg, Zwycięstwo, Walka, Siła, Historia, Powstanie, Śmierć bohaterska, Sława, Rewolucja, Sąd, Zdrada
  5. przyroda - Natura, Żywioły, Ogień, Ziemia, Wiatr, Woda, Wiosna, Lato, Jesień, Zima, Przemijanie, Słońce, Księżyc, Gwiazda, Obłok, Noc, Światło, Góra, Rzeka, Morze, Burza, Deszcz, Błoto, Przyroda nieożywiona, Rośliny, Kwiaty, Ogród, Sielanka, Raj, Jabłko, Drzewo, Zwierzęta, Ptak, Motyl, Kot, Koń, Pies, Wąż, Potwór
  6. + Natura, Żywioły, Ogień, Ziemia, Wiatr, Woda, Wiosna, Lato, Jesień, Zima, Przemijanie, Słońce, Księżyc, Gwiazda, Obłok, Noc, Światło, Góra, Rzeka, Morze, Burza, Deszcz, Błoto, Przyroda nieożywiona, Rośliny, Kwiaty, Ogród, Sielanka, Raj, Jabłko, Drzewo, Zwierzęta, Ptak, Motyl, Kot, Koń, Pies, Wąż, Potwór

{% trans "See more" %}

  1. cielesność - Ciało, Krew, Zdrowie, Choroba, Kaleka
  2. + Ciało, Krew, Zdrowie, Choroba, Kaleka
  3. dom - Dom, Ogród, Przestrzeń, Gospodarz, Gospodyni, Sąsiad, Gość, Bezdomność, Bezpieczeństwo, Niebezpieczeństwo
  4. + Dom, Ogród, Przestrzeń, Gospodarz, Gospodyni, Sąsiad, Gość, Bezdomność, Bezpieczeństwo, Niebezpieczeństwo
  5. działania nieczyste - Szantaż, Zazdrość, Zdrada, Zemsta, Kłamstwo, Fałsz, Pozory, Tajemnica
  6. + Szantaż, Zazdrość, Zdrada, Zemsta, Kłamstwo, Fałsz, Pozory, Tajemnica
  7. dziedzictwo - Dziedzictwo, Obyczaje, Pamięć, Historia, Naród, Krew, Państwo, Obowiązek, Patriota, Ruiny, Dom, Przywódca
  8. + Dziedzictwo, Obyczaje, Pamięć, Historia, Naród, Krew, Państwo, Obowiązek, Patriota, Ruiny, Dom, Przywódca
  9. dźwięk - Cisza, Muzyka, Śpiew, Poezja
  10. + Cisza, Muzyka, Śpiew, Poezja
  11. edukacja - Uczeń, Szkoła, Nauczyciel, Nauczycielka, Nauka, Wiedza, Dzieciństwo, Młodość, Dorosłość
  12. + Uczeń, Szkoła, Nauczyciel, Nauczycielka, Nauka, Wiedza, Dzieciństwo, Młodość, Dorosłość
  13. egzystencja ludzka - Kondycja ludzka, Los, Błądzenie, Bunt, Buntownik, Pielgrzym, Theatrum mundi, Życie jako wędrówka, Życie snem
  14. + Kondycja ludzka, Los, Błądzenie, Bunt, Buntownik, Pielgrzym, Theatrum mundi, Życie jako wędrówka, Życie snem
  15. etapy życia - Dzieciństwo, Młodość, Dorosłość, Panna młoda, Żona, Mąż, Wdowa, Wdowiec, Starość, Czas, Przemijanie, Przemiana, Kondycja ludzka
  16. + Dzieciństwo, Młodość, Dorosłość, Panna młoda, Żona, Mąż, Wdowa, Wdowiec, Starość, Czas, Przemijanie, Przemiana, Kondycja ludzka
  17. fauna - Zwierzęta, Kot, Koń, Motyl, Pies, Ptak, Wąż
  18. + Zwierzęta, Kot, Koń, Motyl, Pies, Ptak, Wąż
  19. flora - Rośliny, Kwiaty, Ogród, Drzewo
  20. + Rośliny, Kwiaty, Ogród, Drzewo
  21. historie miłosne - Miłość, Miłość platoniczna, Miłość romantyczna, Miłość silniejsza niż śmierć, Miłość spełniona, Miłość tragiczna, Kochanek, Kochanek romantyczny, Flirt, Pocałunek, Pożądanie, List, Serce, Łzy, Przysięga, Tęsknota, Wspomnienia, Zdrada, Rozczarowanie, Rozpacz, Małżeństwo, Ślub, Panna młoda, Przyjaźń
  22. + Miłość, Miłość platoniczna, Miłość romantyczna, Miłość silniejsza niż śmierć, Miłość spełniona, Miłość tragiczna, Kochanek, Kochanek romantyczny, Flirt, Pocałunek, Pożądanie, List, Serce, Łzy, Przysięga, Tęsknota, Wspomnienia, Zdrada, Rozczarowanie, Rozpacz, Małżeństwo, Ślub, Panna młoda, Przyjaźń
  23. jedzenie i picie - Głód, Bieda, Chleb, Jedzenie, Uczta, Wino, Alkohol, Pijaństwo
  24. + Głód, Bieda, Chleb, Jedzenie, Uczta, Wino, Alkohol, Pijaństwo
  25. konflikty - Kłótnia, Bijatyka, Siła, Przemoc, Krew, Konflikt, Walka, Wojna, Powstanie, Bunt, Rewolucja
  26. + Kłótnia, Bijatyka, Siła, Przemoc, Krew, Konflikt, Walka, Wojna, Powstanie, Bunt, Rewolucja
  27. momenty graniczne - Narodziny, Śmierć, Przemiana, Zmartwychwstanie
  28. + Narodziny, Śmierć, Przemiana, Zmartwychwstanie
  29. nadużycie władzy - Władza, Przemoc, Strach, Kara
  30. + Władza, Przemoc, Strach, Kara
  31. nacjonalizm - Polak, Niemiec, Rosjanin, Car, Żyd, Naród, Obcy, Wróg, Niebezpieczeństwo
  32. + Polak, Niemiec, Rosjanin, Car, Żyd, Naród, Obcy, Wróg, Niebezpieczeństwo
  33. nastroje melancholijne - Nuda, Melancholia, Ruiny, Wspomnienia, Marzenie, Przemijanie, Tęsknota, Rozpacz, Śmierć, Los, Kondycja ludzka
  34. + Nuda, Melancholia, Ruiny, Wspomnienia, Marzenie, Przemijanie, Tęsknota, Rozpacz, Śmierć, Los, Kondycja ludzka
  35. nastroje rewolucyjne - Rewolucja, Walka klas, Robotnik, Chłop, Pozycja społeczna, Władza, Przemoc, Sprawiedliwość
  36. + Rewolucja, Walka klas, Robotnik, Chłop, Pozycja społeczna, Władza, Przemoc, Sprawiedliwość
  37. podporządkowanie - Sługa, Pan, Praca, Władza, Obyczaje
  38. + Sługa, Pan, Praca, Władza, Obyczaje
  39. pokrewieństwo - Rodzina, Ojciec, Matka, Dziecko, Syn, Córka, Brat, Siostra, Sierota, Dziedzictwo, Obowiązek, Zdrada
  40. + Rodzina, Ojciec, Matka, Dziecko, Syn, Córka, Brat, Siostra, Sierota, Dziedzictwo, Obowiązek, Zdrada
  41. polityczny obraz świata - Państwo, Obowiązek, Cnota, Obywatel, Patriota, Ojczyzna, Naród, Przywódca, Władza, Urzędnik, Król, Rycerz, Żołnierz, Wojna, Wróg, Zwycięstwo, Walka, Siła, Historia, Powstanie, Śmierć bohaterska, Sława, Rewolucja, Sąd, Zdrada
  42. + Państwo, Obowiązek, Cnota, Obywatel, Patriota, Ojczyzna, Naród, Przywódca, Władza, Urzędnik, Król, Rycerz, Żołnierz, Wojna, Wróg, Zwycięstwo, Walka, Siła, Historia, Powstanie, Śmierć bohaterska, Sława, Rewolucja, Sąd, Zdrada
  43. pory roku - Wiosna, Lato, Jesień, Zima, Czas, Przemijanie
  44. + Wiosna, Lato, Jesień, Zima, Czas, Przemijanie
  45. posiadanie - Pieniądz, Handel, Korzyść, Chciwość, Bieda, Bogactwo, Skąpiec, Własność, Złodziej, Żebrak
  46. + Pieniądz, Handel, Korzyść, Chciwość, Bieda, Bogactwo, Skąpiec, Własność, Złodziej, Żebrak
  47. poświęcenie - Poświęcenie, Ofiara, Prometeusz, Miłosierdzie, Chrystus, Zbawienie
  48. + Poświęcenie, Ofiara, Prometeusz, Miłosierdzie, Chrystus, Zbawienie
  49. poznanie - Filozof, Mądrość, Mędrzec, Głupiec, Głupota, Rozum, Wiedza, Prawda, Fałsz
  50. + Filozof, Mądrość, Mędrzec, Głupiec, Głupota, Rozum, Wiedza, Prawda, Fałsz
  51. poznanie alternatywne - Szaleniec, Szaleństwo, Prawda, Pozory, Obraz świata, Serce, Wiedza, Mądrość, Dusza, Duch, Ciało
  52. + Szaleniec, Szaleństwo, Prawda, Pozory, Obraz świata, Serce, Wiedza, Mądrość, Dusza, Duch, Ciało
  53. praca - Praca, Sługa
  54. + Praca, Sługa
  55. przyroda - Natura, Żywioły, Ogień, Ziemia, Wiatr, Woda, Wiosna, Lato, Jesień, Zima, Przemijanie, Słońce, Księżyc, Gwiazda, Obłok, Noc, Światło, Góra, Rzeka, Morze, Burza, Deszcz, Błoto, Przyroda nieożywiona, Rośliny, Kwiaty, Ogród, Sielanka, Raj, Jabłko, Drzewo, Zwierzęta, Ptak, Motyl, Kot, Koń, Pies, Wąż, Potwór
  56. + Natura, Żywioły, Ogień, Ziemia, Wiatr, Woda, Wiosna, Lato, Jesień, Zima, Przemijanie, Słońce, Księżyc, Gwiazda, Obłok, Noc, Światło, Góra, Rzeka, Morze, Burza, Deszcz, Błoto, Przyroda nieożywiona, Rośliny, Kwiaty, Ogród, Sielanka, Raj, Jabłko, Drzewo, Zwierzęta, Ptak, Motyl, Kot, Koń, Pies, Wąż, Potwór
  57. regulacja postępowania - Cnota, Sprawiedliwość, Obowiązek
  58. + Cnota, Sprawiedliwość, Obowiązek
  59. role społeczne - Kobieta, Mężczyzna, Mąż, Żona, Matka, Ojciec, Dziecko, Syn, Córka, Brat, Siostra, Wdowa, Wdowiec, Nauczyciel, Nauczycielka, Uczeń, Poeta, Literat, Lekarz, Sędzia, Król, Przywódca, Żołnierz, Urzędnik, Filozof, Ksiądz
  60. + Kobieta, Mężczyzna, Mąż, Żona, Matka, Ojciec, Dziecko, Syn, Córka, Brat, Siostra, Wdowa, Wdowiec, Nauczyciel, Nauczycielka, Uczeń, Poeta, Literat, Lekarz, Sędzia, Król, Przywódca, Żołnierz, Urzędnik, Filozof, Ksiądz
  61. rycerskie czasy - Zamek, Ruiny, Rycerz, Honor, Wierność, Obowiązek, Walka, Król, Dama
  62. + Zamek, Ruiny, Rycerz, Honor, Wierność, Obowiązek, Walka, Król, Dama
  63. rzeczywistość nadprzyrodzona - Bóg, Chrystus, Matka Boska, Anioł, Szatan, Diabeł, Duch, Dusza, Wampir, Upiór, Czary, Czarownica
  64. + Bóg, Chrystus, Matka Boska, Anioł, Szatan, Diabeł, Duch, Dusza, Wampir, Upiór, Czary, Czarownica
  65. struktura społeczna - Chłop, Mieszczanin, Żyd, Szlachcic, Ksiądz, Robotnik, Król, Przywódca, Pozycja społeczna, Dworek, Obyczaje
  66. + Chłop, Mieszczanin, Żyd, Szlachcic, Ksiądz, Robotnik, Król, Przywódca, Pozycja społeczna, Dworek, Obyczaje
  67. sarmatyzm - Polak, Sarmata, Szlachcic, Przedmurze chrześcijaństwa, Matka Boska, Religia
  68. + Polak, Sarmata, Szlachcic, Przedmurze chrześcijaństwa, Matka Boska, Religia
  69. sprawowanie władzy - Urzędnik, Państwo, Władza, Przemoc, Sąd, Kara, Więzienie
  70. + Urzędnik, Państwo, Władza, Przemoc, Sąd, Kara, Więzienie
  71. śmierć - Śmierć, Danse macabre, Gotycyzm, Grób, Otchłań, Pogrzeb, Samobójstwo, Krew, Trup, Morderstwo, Żałoba, Zmartwychwstanie, Melancholia, Vanitas, Los, Kondycja ludzka
  72. + Śmierć, Danse macabre, Gotycyzm, Grób, Otchłań, Pogrzeb, Samobójstwo, Krew, Trup, Morderstwo, Żałoba, Zmartwychwstanie, Melancholia, Vanitas, Los, Kondycja ludzka
  73. środowisko miejskie i wiejskie - Miasto, Warszawa, Mieszczanin, Handel, Robotnik, Żyd, Wieś, Sielanka, Chłop, Ogród, Natura, Przestrzeń
  74. + Miasto, Warszawa, Mieszczanin, Handel, Robotnik, Żyd, Wieś, Sielanka, Chłop, Ogród, Natura, Przestrzeń
  75. świat w perspektywie etycznej - Kuszenie, Zwątpienie, Wyrzuty sumienia, Wina, Grzech, Kara, Los, Koniec świata, Wieża Babel, Zbawienie, Zaświaty, Czyściec, Raj, Nieśmiertelność, Przysięga, Przekleństwo, Religia, Obrzędy, Modlitwa, Niedziela, Przedmurze chrześcijaństwa, Ksiądz, Pobożność, Świętoszek, Święty, Wierzenia, Zabobony
  76. + Kuszenie, Zwątpienie, Wyrzuty sumienia, Wina, Grzech, Kara, Los, Koniec świata, Wieża Babel, Zbawienie, Zaświaty, Czyściec, Raj, Nieśmiertelność, Przysięga, Przekleństwo, Religia, Obrzędy, Modlitwa, Niedziela, Przedmurze chrześcijaństwa, Ksiądz, Pobożność, Świętoszek, Święty, Wierzenia, Zabobony
  77. świętowanie - Wesele, Uczta, Jedzenie, Pijaństwo, Zabawa, Taniec, Muzyka, Śmiech, Śpiew, Bijatyka, Obyczaje, Wierzenia, Zabobony
  78. + Wesele, Uczta, Jedzenie, Pijaństwo, Zabawa, Taniec, Muzyka, Śmiech, Śpiew, Bijatyka, Obyczaje, Wierzenia, Zabobony
  79. tożsamość pozorna i podwójna - Portret, Lustro, Cień, Sobowtór, Maska, Przebranie, Strój, Przemiana
  80. + Portret, Lustro, Cień, Sobowtór, Maska, Przebranie, Strój, Przemiana
  81. trunki - Alkohol, Wino, Carpe diem, Pijaństwo, Karczma, Obyczaje
  82. + Alkohol, Wino, Carpe diem, Pijaństwo, Karczma, Obyczaje
  83. typy bohaterów - Samotnik, Buntownik, Pielgrzym, Szaleniec, Filozof, Mędrzec, Obcy, Przywódca, Realista, Idealista, Społecznik, Syzyf, Prometeusz, Sługa, Uczeń
  84. + Samotnik, Buntownik, Pielgrzym, Szaleniec, Filozof, Mędrzec, Obcy, Przywódca, Realista, Idealista, Społecznik, Syzyf, Prometeusz, Sługa, Uczeń
  85. ukrywanie/ujawnianie - Tajemnica, Przysięga, Zdrada, Kłamstwo, Fałsz
  86. + Tajemnica, Przysięga, Zdrada, Kłamstwo, Fałsz
  87. upływ czasu - Wspomnienia, Marzenie, Pamięć, Przemijanie, Czas, Śmierć
  88. + Wspomnienia, Marzenie, Pamięć, Przemijanie, Czas, Śmierć
  89. widzenie - Oko, Wzrok, Sen, Marzenie, Wizja, Przeczucie, Duch, Dusza, Proroctwo
  90. + Oko, Wzrok, Sen, Marzenie, Wizja, Przeczucie, Duch, Dusza, Proroctwo
  91. wina i przebaczenie - Grzech, Wina, Wyrzuty sumienia, Syn marnotrawny, Pokora, Przemiana, Miłosierdzie, Zbawienie
  92. + Grzech, Wina, Wyrzuty sumienia, Syn marnotrawny, Pokora, Przemiana, Miłosierdzie, Zbawienie
  93. wizerunki kobiety - Kobieta, Kobieta demoniczna, Kobieta „upadła”, Czarownica, Dama, Próżność, Ciało, Córka, Siostra, Żona, Matka
  94. + Kobieta, Kobieta demoniczna, Kobieta „upadła”, Czarownica, Dama, Próżność, Ciało, Córka, Siostra, Żona, Matka
  95. w kręgu sztuki - Artysta, Sztuka, Literat, Poeta, Poetka, Poezja, Muzyka, Taniec, Śpiew, Teatr, Książka, Słowo, Sława, Nieśmiertelność
  96. + Artysta, Sztuka, Literat, Poeta, Poetka, Poezja, Muzyka, Taniec, Śpiew, Teatr, Książka, Słowo, Sława, Nieśmiertelność
  97. wychodźstwo i uwięzienie - Emigrant, Tęsknota, Obcy, Więzienie, Przemiana, Więzień, Wolność, Niewola, Wygnanie, Zesłaniec, Zbrodnia, Zbrodniarz
  98. + Emigrant, Tęsknota, Obcy, Więzienie, Przemiana, Więzień, Wolność, Niewola, Wygnanie, Zesłaniec, Zbrodnia, Zbrodniarz
  99. zagrożenie - Niebezpieczeństwo, Trucizna, Fałsz, Zdrada, Choroba, Śmierć
  100. + Niebezpieczeństwo, Trucizna, Fałsz, Zdrada, Choroba, Śmierć
  101. zajęcia i zawody - Lekarz, Prawnik, Sędzia, Nauczyciel, Nauczycielka, Literat, Poeta, Poetka, Artysta, Żołnierz, Urzędnik, Sługa, Rycerz
  102. + Lekarz, Prawnik, Sędzia, Nauczyciel, Nauczycielka, Literat, Poeta, Poetka, Artysta, Żołnierz, Urzędnik, Sługa, Rycerz
  103. życie dworskie - Dworzanin, Dwór, Dama, Fircyk, Błazen, Król, Urzędnik, Sługa, Grzeczność, Obyczaje, Pochlebstwo
  104. + Dworzanin, Dwór, Dama, Fircyk, Błazen, Król, Urzędnik, Sługa, Grzeczność, Obyczaje, Pochlebstwo
  105. żywioły - Żywioły, Ogień, Ziemia, Wiatr, Woda, Przestrzeń
  106. + Żywioły, Ogień, Ziemia, Wiatr, Woda, Przestrzeń

{% trans "Hide" %}

-- 2.20.1