From 948f1886c5ad07ee40875926c1c01908ffb84a21 Mon Sep 17 00:00:00 2001 From: Dan Bader Date: Tue, 31 Mar 2020 17:19:50 -0700 Subject: [PATCH 001/207] Add Real Python Podcast to podcast list --- content/pages/01-introduction/10-best-python-podcasts.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/content/pages/01-introduction/10-best-python-podcasts.markdown b/content/pages/01-introduction/10-best-python-podcasts.markdown index e1776c4ac..c637c26dd 100644 --- a/content/pages/01-introduction/10-best-python-podcasts.markdown +++ b/content/pages/01-introduction/10-best-python-podcasts.markdown @@ -52,6 +52,7 @@ listen and learn. Python subjects. [All episodes are listed on a separate page](http://pgbovine.net/PG-Podcast-summary.htm). +* [The Real Python Podcast](https://realpython.com/podcasts/rpp/) is a weekly podcast with interviews, coding tips, and conversation with guests from the Python community. ## Favorite podcast episodes Here are a list of my favorite episodes from various Python podcasts before From e18324604599e27af4526d75ea5aabcfa100244f Mon Sep 17 00:00:00 2001 From: Michael Herman Date: Wed, 1 Apr 2020 16:47:05 -0500 Subject: [PATCH 002/207] add django + celery resource --- content/pages/04-web-development/28-celery.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/04-web-development/28-celery.markdown b/content/pages/04-web-development/28-celery.markdown index d0c263a83..5a614855c 100644 --- a/content/pages/04-web-development/28-celery.markdown +++ b/content/pages/04-web-development/28-celery.markdown @@ -176,6 +176,9 @@ web framework of your choice. for transient states in your application that are not covered by the default Celery configuration. +* [Asynchronous Tasks with Django and Celery](https://testdriven.io/blog/django-and-celery/) + looks at how to configure Celery to handle long-running tasks in a + Django app. ### Celery deployment resources Celery and its broker run separately from your web and WSGI servers so it From 5beb25beb0c5183ec41a7cdeee8f301bc6937629 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 18 Apr 2020 13:02:49 -0400 Subject: [PATCH 003/207] add web design resource --- content/pages/04-web-development/15-web-design.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index ccffb3f31..4eeed7bf3 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -71,6 +71,11 @@ this short list as my absolute favorites that help developers become Highly recommended especially if you feel you have no design skills but need to learn them. +* [Building dark mode on Stack Overflow](https://stackoverflow.blog/2020/03/31/building-dark-mode-on-stack-overflow/) + explains the thought process and work that the team at Stack Overflow + had to do with colors, styling and the code implementation so they + could offer a dark mode design to their users. + * [A short history of body copy sizes on the Web](https://fvsch.com/body-copy-sizes/) provides a useful examination of how originally the web's typography mirrored what was in traditional print. Eventually, the designs shifted From 3fb7c657080dfc03509bb0c7fa347173bef7bf64 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 18 Apr 2020 13:03:52 -0400 Subject: [PATCH 004/207] update changelog --- content/pages/meta/00-change-log.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 4657ca29d..601d45cd5 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,9 @@ view commit-level changes via the on GitHub. ## 2020 +### April +* Updated the [web design](/web-design.html) page with new resources. + ### March * Added another new blog post on [Exporting pandas DataFrames into SQLite with SQLAlchemy](/blog/export-pandas-dataframes-sqlite-sqlalchemy.html). From 34635fdf31ba2dac2b14bde0cc29a428bf915704 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 23 Apr 2020 10:09:04 -0400 Subject: [PATCH 005/207] update changelog --- content/pages/meta/00-change-log.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 601d45cd5..43bd81e3d 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,9 @@ on GitHub. ## 2020 ### April +* Merge [PR #233](https://github.com/mattmakai/fullstackpython.com/pull/233) and + [PR #235](https://github.com/mattmakai/fullstackpython.com/pull/235) for new + [Celery](/celery.html) and [podcast](/best-python-podcasts.html) resources. * Updated the [web design](/web-design.html) page with new resources. ### March From 7c45dcd67c46a58cd72061edc76be062ba233c0b Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 25 Apr 2020 09:55:32 -0400 Subject: [PATCH 006/207] add new javascript resource --- content/pages/04-web-development/23-javascript.markdown | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/pages/04-web-development/23-javascript.markdown b/content/pages/04-web-development/23-javascript.markdown index 14226cc88..e4910976d 100644 --- a/content/pages/04-web-development/23-javascript.markdown +++ b/content/pages/04-web-development/23-javascript.markdown @@ -65,6 +65,12 @@ Allen Wirfs-Brock for more context on the language's evolution. * [A re-introduction to JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to_JavaScript) by Mozilla walks through the basic syntax and operators. +* [The Cost of Javascript Frameworks](https://timkadlec.com/remembers/2020-04-21-the-cost-of-javascript-frameworks/) + presents a balanced view of how JavaScript libraries and frameworks impact + web performance on both desktop and mobile. The author acknowledges that + these libraries are useful for developers but in extreme cases there are + significant downsides to including so much JavaScript in pages. + * [The State of JavaScript report](https://stateofjs.com/) contains a wealth of data on what libraries developers are using in the JavaScript ecosystem. There are also reports from previous years which show how the From 430272b66e4fbd35a4741d0efb9dff333d715ece Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 25 Apr 2020 10:16:15 -0400 Subject: [PATCH 007/207] new shell resource --- content/pages/02-development-environments/07-shells.markdown | 4 ++++ content/pages/03-data/08-django-orm.markdown | 4 ++++ content/pages/04-web-development/52-twilio.markdown | 3 +++ 3 files changed, 11 insertions(+) diff --git a/content/pages/02-development-environments/07-shells.markdown b/content/pages/02-development-environments/07-shells.markdown index 845728809..aa5ac671f 100644 --- a/content/pages/02-development-environments/07-shells.markdown +++ b/content/pages/02-development-environments/07-shells.markdown @@ -45,3 +45,7 @@ environment named `fullstackpython` within the macOS Terminal application. little tool that shows how input and arguments in the shell break down and are interpreted by commands. The data is pulled from the [Ubuntu](/ubuntu.html) `man` pages. + +* [Shell productivity tips and tricks](https://blog.balthazar-rouberol.com/shell-productivity-tips-and-tricks.html) + covers how to increase your effectiveness on the shell across topics such as + navigating history, autocompletion, and pattern matching. diff --git a/content/pages/03-data/08-django-orm.markdown b/content/pages/03-data/08-django-orm.markdown index 3184e1b70..e8c08aaee 100644 --- a/content/pages/03-data/08-django-orm.markdown +++ b/content/pages/03-data/08-django-orm.markdown @@ -39,6 +39,10 @@ that have been added throughout the project's history. [Django Silk](http://mtford.co.uk/blog/2/) is another inspection tool and has capabilities to do more than just SQL inspection. +* [Django QuerySet Examples (with SQL code included)](https://davit.tech/django-queryset-examples/) + teaches how QuerySets work and shows the corresponding SQL code behind the + Python code you write to use the ORM. + * [Making a specific Django app faster](http://reinout.vanrees.org/weblog/2014/05/06/making-faster.html) is a Django performance blog post with some tips on measuring performance and optimizing based on the measured results. diff --git a/content/pages/04-web-development/52-twilio.markdown b/content/pages/04-web-development/52-twilio.markdown index cf5343826..0eaca245d 100644 --- a/content/pages/04-web-development/52-twilio.markdown +++ b/content/pages/04-web-development/52-twilio.markdown @@ -92,6 +92,9 @@ for fellow developers. walks through using the Python runtime on [AWS Lambda](/aws-lambda.html) and Twilio's APIs for validating phone number information. +* [Receive Flask Error Alerts by Email with Twilio SendGrid](https://www.twilio.com/blog/receive-flask-error-alerts-email-twilio-sendgrid) + shows how to use Twilio to add email error reports to [Flask](/flask.html) + web applications. * [Google Cloud recommends developers use Twilio](https://cloud.google.com/appengine/docs/standard/python/sms/twilio) for communications in their apps and provides a short walkthrough for From f2a08dca9a17867bbdfae4ff8000f8c142749a50 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 May 2020 12:34:41 -0400 Subject: [PATCH 008/207] work on pandas code examples --- .../pandas-example-projects-code.markdown | 63 ++++++++++++++++++ content/pages/meta/00-change-log.markdown | 4 ++ static/img/logos/sentry-light.png | Bin 8610 -> 14141 bytes .../django.html | 2 +- .../pandas.html | 12 ++++ theme/templates/index-sidebar.html | 5 +- theme/templates/page.html | 3 + theme/templates/sponsor.html | 1 + theme/templates/sponsor/sentry.html | 7 ++ 9 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 content/pages/examples/pandas/pandas-example-projects-code.markdown create mode 100644 theme/templates/examples-extensions-descriptions/pandas.html create mode 100644 theme/templates/sponsor/sentry.html diff --git a/content/pages/examples/pandas/pandas-example-projects-code.markdown b/content/pages/examples/pandas/pandas-example-projects-code.markdown new file mode 100644 index 000000000..facc17141 --- /dev/null +++ b/content/pages/examples/pandas/pandas-example-projects-code.markdown @@ -0,0 +1,63 @@ +title: pandas Example Projects and Code +category: page +slug: pandas-code-examples +sortorder: 500090001 +toc: False +sidebartitle: pandas Example Code +meta: Python example projects and code that show how to use the pandas data analysis library. + + +## Projects with pandas Example Code +The following active projects use the [pandas](/pandas.html) data analysis +library in various ways that can show you how to inspect your own data sets +and build your own applications. + + +### 100-pandas-puzzles +[100 pandas puzzles](https://github.com/ajcr/100-pandas-puzzles) is a project with +100 exercises that test knowledge of pandas' functionality. The project contains two +[Jupyter Notebooks](/jupyter-notebook.html), one with +[just the puzzles](https://github.com/ajcr/100-pandas-puzzles/blob/master/100-pandas-puzzles.ipynb) +and the other with +[both puzzles and solutions](https://github.com/ajcr/100-pandas-puzzles/blob/master/100-pandas-puzzles-with-solutions.ipynb). + +The project is provided as open source under the +[MIT license](https://github.com/ajcr/100-pandas-puzzles/blob/master/LICENSE). + + +### data-science-ipython-notebooks +[data-science-ipython-notebooks](https://github.com/donnemartin/data-science-ipython-notebooks) +is a collection of Jupyter Notebooks including a folder with +[pandas code examples](https://github.com/donnemartin/data-science-ipython-notebooks/tree/master/pandas). + +These notebooks are provided as open source under the +[Apache 2.0 license](https://github.com/donnemartin/data-science-ipython-notebooks/blob/master/LICENSE). + + +### pandas-videos +[Python pandas Q&A video series](https://github.com/justmarkham/pandas-videos) contains the +Python code that pairs with +[Kevin Markham's video series on data analysis with pandas](https://www.youtube.com/playlist?list=PL5-da3qGB5ICCsgW1MxlZ0Hq8LL5U3u9y). +The repository contains several Jupyter Notebooks, including ones on +[the top pandas tricks](https://github.com/justmarkham/pandas-videos/blob/master/top_25_pandas_tricks.ipynb), +[merging DataFrames](https://github.com/justmarkham/pandas-videos/blob/master/pandas_merge.ipynb), +and +[using MultiIndex](https://github.com/justmarkham/pandas-videos/blob/master/pandas_multiindex.ipynb). + + +### ved-explore +[ved-explore](https://github.com/joaofig/ved-explore) is a set of open source +Jupyter Notebooks that demonstrate analysis of the +[Vehicle Energy Dataset (VED)](https://arxiv.org/abs/1905.02081). The project +is provided as open source under the +[MIT license](https://github.com/joaofig/ved-explore/blob/master/LICENSE). + + +### viz +[viz](https://github.com/donnemartin/viz) +([project site](https://donnemartin.com/viz/)) +is a collection of interactive Jupyter Notebooks that show metrics +about open source Git repositories stored on GitHub. The code is open source +under the +[Apache 2.0 license](https://github.com/donnemartin/viz/blob/master/LICENSE.md). + diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 43bd81e3d..82b71b324 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -14,6 +14,10 @@ view commit-level changes via the on GitHub. ## 2020 +### May +* Added a new page with the start of + [pandas example code and projects](/pandas-code-examples.html). + ### April * Merge [PR #233](https://github.com/mattmakai/fullstackpython.com/pull/233) and [PR #235](https://github.com/mattmakai/fullstackpython.com/pull/235) for new diff --git a/static/img/logos/sentry-light.png b/static/img/logos/sentry-light.png index 37494b19fb7d3ac254a3ff1796221603a5837cd4..6d974506134c3e381e20eebddf73bb368c901cdd 100644 GIT binary patch literal 14141 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 bKfx&wHIGjORo49eKulgnMY>e-z5o9KNf(i0 literal 8610 zcmd6NXH-+)(svXP5D}y)9i=M8f)HvzL@**s6NFHdA_CHTFA9oMlq$V<0)G$)ArP8~ zfP^X#ASBe#Lz4iZJO}TWyViZyeZRc#TJMMKbF$Z&y=TwNo|!$r9jWs~lkq&)c@PN1 z2z{uo2LheN0PhEM=YY2AYbzRf(7QY|b_anNSWbUu25~`$AdmnEs(#PFXM7Du(w!Zv z`!S7h?)9de6Ts@9Z+T3;s}5p4vrgxt8S)_;cd14p?DnOa582wFira=D+G~WM{$1o< zDn@@ht)z0i{%_Ax%!@bHN4~YSyW{+P{QNY)oP^Qi_u9Y{#GHNxXv3s|M%Cq%DY{es zK&_lWBOpfwwA8kz9e>*p!Uf>{8js5kSds5bvk;g}=#5eSq`f+#^C)$9k{Ux{%XaU#x#iy8Tk2i^2n*RgIOPzWIk zO}!uu)q)E4B}3{r(yQ44HMDYe@}(xnN!>V3g+Zk?vi{Y@l`0J-h6dp>82Vs!5+Kkb zRf9cqDqJJZ(8=;DppI5f%}c3$XWuV0MRr5q0v(#MdeO5?z4xIo=vyxQLZ5b34|W_- z`PbVs0f!ti?_Wjg0xIpNijw2668hK~cWk$~266m|i-TVTfnwMNF`beQ8%=s5=g*!R zhJtA1OiI4pTW9&t3Dxs|Su%^~v>Jz zJ!u%Ci~I@I59I}f@%t-}Pe2ZKJZOEQaI81$s6rYV%uTiT(HXEW9#)O?*r)b%y-a>N z5NtS}yWKV$1sI}$TwYV0803q`OZtX1OGMy&v*d+l=LB`vZZN@f50kx#he%qPQ0IBD&pcAAx zKd=}9x!Da<<*I_CNz_WR*(U`pe+7+47XnkW)l-m56D;%+$6# z<9c^Fn*$#}U z_v(Ri@a;yAFY23LD}lWPFePRL2G|8Nv5iTtE$N}?;I)g*p={c0ltfv>6 zl52vtnkOtIa2G+U#6X{b0Bdm%@yRIRBP*Y!WbG;#^|6FB6wi3`sQ$VaC;pZAZh`;0COR$YYmerWM|6GNUztJuZ*{9k9sBkRUyw+z$&T**@i~q+V zn2LWUa#=k1q?=K|ClIY&rMN=yd^ue~uQ0N$`7BD#JJ!Y$|JJ_v<`f%BDRRaET7(Y1 z&(cwLK0{eY*+XLPq=uk;&M8>VljJFCCw$#OK>g{ySMP*Xs`}=EvUp_O_xcDDs*=+8 zPy58e4i>2$=ae;B|9(8{)QT{*cAZWSp9%%mO$Pi~3d#9_goWC^qAQ_X3U5#=oe$ys zu!#v}_6_OAh0-q3Pt>-1)lste5o3;Ndy`5(7qum~7Z7N!&)V7T#Sng*YfBC+9k8<= z;*6#~ud1%`3_${=mi$AuF{a13{PLGO%%hP8$5b~Efj0&Om~4cKLtmMFNV?5__)qIvzZ=)qf@y* z+p*eE(ZzD+shBi+dVDwSah+dn;Z19K;j?fz3?pOA;lhSLOUKlx0eNTl$3|vPl1f*X zK@5hnH;7m2gv|FSml0A ztd<0gbUS3Y-mX>r<8x0s%$-8j|9oDZ*20K(vBW|CvqnWa=;%W4Q?mvJ>{sV1cEe%C z*`L}%@IWUPoab*hxT50(>&W@1--vXuS z`NyOEAL68&BYf$7xZ>4>E$Cp@%|n#iiIa62+rfx7KSj;|@%5a0Oc&-(-q|?GokWkj z1xeQ-<_{$}RP9i|{Ho$>v~zu?cEZj9p2ag>N=n(n?~A(Y$Y|HOPy^p?m)TteS>kcL zisG5rXBBsC$EYK}74v zw-zgtjA8SKVB6_CNs~^JJSXFArDjj%;n76D=oUlWpb z%hU!LP9g_CD-eCn(h;!((HWs&!(Y^3TC=hubmZwZrr-&DOZ{(^~t;@lIPI9^l%#a@7emRZ8MGl>eR%&9;<{uu?IN)uc5qs_b88i8CT@y>RhzdCPYV=$gtgJ(O zwc#~$dh8a#0(xL(lk(tUGL#K0Z*Psv>n8*4sRdnwfoCVOXocti__~CQi^>(6PKZtvZ5VLG zLn#Tsh>E@�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 y@c91Django is a Python web framework. +Django is a Python web framework. Official Django logo. Trademark Django Software Foundation. diff --git a/theme/templates/examples-extensions-descriptions/pandas.html b/theme/templates/examples-extensions-descriptions/pandas.html new file mode 100644 index 000000000..a032824e3 --- /dev/null +++ b/theme/templates/examples-extensions-descriptions/pandas.html @@ -0,0 +1,12 @@ +pandas is a data analysis library +built in Python. + +pandas data analysis project + +

pandas can be used in a Python script, a +Jupyter Notebook, or even as +part of a web application.

+ +

The following open source projects, ordered alphabetically, are +helpful as example code for how to use pandas in your own applications.

+ diff --git a/theme/templates/index-sidebar.html b/theme/templates/index-sidebar.html index 84b9558ab..ee2e71e2d 100644 --- a/theme/templates/index-sidebar.html +++ b/theme/templates/index-sidebar.html @@ -4,10 +4,11 @@
Full Stack Python is an open book that explains concepts in plain language. -
+
+ {% include "sponsor/sentry.html" %} diff --git a/theme/templates/page.html b/theme/templates/page.html index 570ae6d6f..fcc0ea58d 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -51,6 +51,9 @@

{{ page.title }}

{% include "examples-extensions-descriptions/django.html" %} {% include "code-examples/django.html" %} {% endif %} + {% if page.slug == "pandas-code-examples" %} + {% include "examples-extensions-descriptions/pandas.html" %} + {% endif %} {{ page.content }} {% endif %} {% if page.sortorder[0:2] == "50" %} diff --git a/theme/templates/sponsor.html b/theme/templates/sponsor.html index bc378aee8..6997c5df5 100644 --- a/theme/templates/sponsor.html +++ b/theme/templates/sponsor.html @@ -1,4 +1,5 @@ {% if page.sortorder[0:2] == "01" or page.sortorder[0:2] == "02" or page.sortorder[0:2] == "03" or page.sortorder[0:2] == "04" or page.sortorder[0:2] == "05" or page.sortorder[0:2] == "06" or page.sortorder[0:2] == "50" %} +{% include "sponsor/sentry.html" %} {% include "sponsor/carbon.html" %} {% endif %} {% if false %} diff --git a/theme/templates/sponsor/sentry.html b/theme/templates/sponsor/sentry.html new file mode 100644 index 000000000..a919be8fe --- /dev/null +++ b/theme/templates/sponsor/sentry.html @@ -0,0 +1,7 @@ +
+

Sponsored By

+
+ Sentry logo +

Software errors are inevitable. Chaos is not. Try Sentry for free.

+
+
From 6cca37b1239df82974f809fb7a30d681fb4a916e Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 May 2020 13:15:34 -0400 Subject: [PATCH 009/207] fixing a bunch of broken links --- .../01-introduction/02-python-programming-language.markdown | 2 +- .../02-development-environments/18-source-control.markdown | 4 ---- content/pages/03-data/12-mongodb.markdown | 4 ---- content/pages/examples/django/django-conf-urls-url.markdown | 2 +- content/pages/examples/django/django-forms-datefield.markdown | 2 +- 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/content/pages/01-introduction/02-python-programming-language.markdown b/content/pages/01-introduction/02-python-programming-language.markdown index c99bf04ff..87a44028b 100644 --- a/content/pages/01-introduction/02-python-programming-language.markdown +++ b/content/pages/01-introduction/02-python-programming-language.markdown @@ -153,7 +153,7 @@ the very beginner topics. [comprehensions](http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Comprehensions.html) including code examples and diagrams to explain how they work. -* [Comprehensions in Python the Jedi way](https://gist.github.com/bearfrieze/a746c6f12d8bada03589) +* [Comprehensions in Python the Jedi way](https://gist.github.com/mjhea0/1c0031bd6fcd9263f844) shows off comprehensions with a Star Wars theme to walk through the nuts and bolts. All examples use Python 3.5. diff --git a/content/pages/02-development-environments/18-source-control.markdown b/content/pages/02-development-environments/18-source-control.markdown index 064f9729b..83913183d 100644 --- a/content/pages/02-development-environments/18-source-control.markdown +++ b/content/pages/02-development-environments/18-source-control.markdown @@ -118,10 +118,6 @@ control services are: part of an ongoing deployment guide written by the folks at [Rainforest](https://www.rainforestqa.com/). -* This lighthearted guide to the - [ten astonishments in version control history](http://www.flourish.org/2011/12/astonishments-ten-in-the-history-of-version-control/) - is a fun way to learn how systems developed over the past several decades. - * [A visual guide to version control](http://betterexplained.com/articles/a-visual-guide-to-version-control/) is a detailed article with real-life examples for why version control is necessary in software development. diff --git a/content/pages/03-data/12-mongodb.markdown b/content/pages/03-data/12-mongodb.markdown index 407cb1c30..94826bfd6 100644 --- a/content/pages/03-data/12-mongodb.markdown +++ b/content/pages/03-data/12-mongodb.markdown @@ -120,10 +120,6 @@ configure and start using MongoDB with Python. shows how to use Python to interface with MongoDB via PyMongo and MongoEngine. -* A [Gentle Introduction to MongoDB using Pymongo](http://altons.github.io/python/2013/01/21/gentle-introduction-to-mongodb-using-pymongo/) - reviews a connection configuration file, the basics for data insertion, - aggregation and updating records. - * [How To Set Up Flask with MongoDB and Docker](https://www.digitalocean.com/community/tutorials/how-to-set-up-flask-with-mongodb-and-docker) combines the [Flask](/flask.html) web framework with MongoDB then containerizes the example application with [Docker](/docker.html). diff --git a/content/pages/examples/django/django-conf-urls-url.markdown b/content/pages/examples/django/django-conf-urls-url.markdown index 6540e8fe8..23f28e83c 100644 --- a/content/pages/examples/django/django-conf-urls-url.markdown +++ b/content/pages/examples/django/django-conf-urls-url.markdown @@ -128,7 +128,7 @@ urlpatterns = [ ## Example 3 from register [register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), -[Bootstrap](/bootstrap.html), [PostgreSQL](/postgresql.html) project that is +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is open source under the [GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). This web application makes it easier for people to register as organ donors. diff --git a/content/pages/examples/django/django-forms-datefield.markdown b/content/pages/examples/django/django-forms-datefield.markdown index 0268e90d0..9d97fbfa3 100644 --- a/content/pages/examples/django/django-forms-datefield.markdown +++ b/content/pages/examples/django/django-forms-datefield.markdown @@ -311,7 +311,7 @@ except ImportError: ## Example 4 from register [register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), -[Bootstrap](/bootstrap.html), [PostgreSQL](/postgresql.html) project that is +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is open source under the [GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). This web application makes it easier for people to register as organ donors. From 338e81f31116dc1f3ee431214aa3b4c8e6745ad3 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 1 May 2020 13:18:26 -0400 Subject: [PATCH 010/207] fixing a couple more broken links --- .../01-text-editors-ides.markdown | 2 +- .../02-development-environments/06-jupyter-notebook.markdown | 4 ---- content/pages/05-deployment/19-nginx.markdown | 5 ++--- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/content/pages/02-development-environments/01-text-editors-ides.markdown b/content/pages/02-development-environments/01-text-editors-ides.markdown index 9f23de412..f179ee45d 100644 --- a/content/pages/02-development-environments/01-text-editors-ides.markdown +++ b/content/pages/02-development-environments/01-text-editors-ides.markdown @@ -78,7 +78,7 @@ gathering [code metrics](/code-metrics.html), running free editions for students and open source projects. * [Thonny](http://thonny.org/) is an - [open source](https://bitbucket.org/plas/thonny/src) Python IDE for new + [open source](https://github.com/thonny/thonny) Python IDE for new programmers. The tool bakes in syntax highlighting, code completion, a simple debugger, a beginner-friendly shell and in situ documentation to assist new developers who are just starting to code. diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index 28e795585..ddd5c5efa 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -151,10 +151,6 @@ like advanced interactive visualizations. you will eventually want to handle within your notebooks as you get comfortable in the environment. -* [Hacking my way to a Jupyter notebook powered blog](https://nipunbatra.github.io/blog/2017/Jupyter-powered-blog.html) - explores how the author created a blog using Jupyter but ran into some - issues along the way, along with how to solve those problems. - * [Making Publication Ready Python Notebooks](http://blog.juliusschulz.de/blog/ultimate-ipython-notebook) explores the plugins that the author uses when creating and exporting reports from Jupyter. diff --git a/content/pages/05-deployment/19-nginx.markdown b/content/pages/05-deployment/19-nginx.markdown index 2dd6c3955..afe620d84 100644 --- a/content/pages/05-deployment/19-nginx.markdown +++ b/content/pages/05-deployment/19-nginx.markdown @@ -66,9 +66,8 @@ HTTP(S) configurations. walks throough installing a free SSL certificate from Let's Encrypt to secure HTTP connects to your nginx server via HTTPS. -* The tools [Nginx Config](https://nginxconfig.io/) and - [Cipherlist](https://cipherli.st/) generate strong encryption configurations - and ciphers for Nginx. +* The [Nginx Config](https://nginxconfig.io/) tool can generate strong + encryption configurations and ciphers for Nginx. * [Gixy](https://github.com/yandex/gixy) is a static analyzer for your Nginx configuration and can tell you issues with how you are setup. From e846af31d97623ff972395e7cd1dff8259dad0d9 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 9 May 2020 12:34:27 -0400 Subject: [PATCH 011/207] update web design resources --- .../pages/04-web-development/15-web-design.markdown | 12 ++++++------ content/pages/meta/00-change-log.markdown | 1 + theme/templates/css/carbon.css | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index 4eeed7bf3..81b3ffa07 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -21,6 +21,11 @@ Creating web pages with their own style and interactivity so users can easily accomplish their tasks is a major part of building modern web applications. +## Getting started if you have no "eye" for design + + + + ## Designing for various screen sizes Separating the content from the rules for how to display the content allows devices to render the output differently based on factors such as screen size @@ -50,7 +55,7 @@ this short list as my absolute favorites that help developers become page elements. * [Resilient web design](https://resilientwebdesign.com/) is an incredible - online book that teaches how to create websitess that are accessible to + online book that teaches how to create websites that are accessible to every reader and look great while doing it. * [Design 101 for Developers](https://academy.realm.io/posts/christopher-downer-design-101-for-developers/) @@ -66,11 +71,6 @@ this short list as my absolute favorites that help developers become is a fantastic article from a professional designer on how he thinks about color and uses it for certain effects in his designs. -* The [Bootstrapping Design](http://bootstrappingdesign.com/) book is one of - the clearest and concise resources for learning design that I've ever read. - Highly recommended especially if you feel you have no design skills but - need to learn them. - * [Building dark mode on Stack Overflow](https://stackoverflow.blog/2020/03/31/building-dark-mode-on-stack-overflow/) explains the thought process and work that the team at Stack Overflow had to do with colors, styling and the code implementation so they diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 82b71b324..16b45d942 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,7 @@ on GitHub. ## 2020 ### May +* Tweaked some CSS for the site. * Added a new page with the start of [pandas example code and projects](/pandas-code-examples.html). diff --git a/theme/templates/css/carbon.css b/theme/templates/css/carbon.css index 831d3c73e..85f45fcb3 100644 --- a/theme/templates/css/carbon.css +++ b/theme/templates/css/carbon.css @@ -1 +1 @@ -{% raw %}#carbonads { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, sans-serif; } #carbonads { display: flex; max-width: 330px; background-color: hsl(0, 0%, 98%); box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, .1); } #carbonads a { color: inherit; text-decoration: none; } #carbonads a:hover { color: inherit; } #carbonads span { position: relative; display: block; overflow: hidden; } #carbonads .carbon-wrap { display: flex; } .carbon-img { display: block; margin: 0; line-height: 1; } .carbon-img img { display: block; } .carbon-text { font-size: 13px; padding: 10px; line-height: 1.5; text-align: left; } .carbon-poweredby { display: block; padding: 8px 10px; background: repeating-linear-gradient(-45deg, transparent, transparent 5px, hsla(0, 0%, 0%, .025) 5px, hsla(0, 0%, 0%, .025) 10px) hsla(203, 11%, 95%, .4); text-align: center; text-transform: uppercase; letter-spacing: .5px; font-weight: 600; font-size: 9px; line-height: 1; }{% endraw %} +{% raw %} #carbonads { display: block; overflow: hidden; text-align: center; font-size: 14px; line-height: 1.5; } #carbonads a { color: inherit; border: 0; } #carbonads a:hover { color: inherit; } #carbonads span { display: block; overflow: hidden; } .carbon-img { display: block; margin: 0 auto 8px; line-height: 1; } .carbon-text { display: block; margin-bottom: 8px; } .carbon-poweredby { text-transform: uppercase; display: block; font-size: 10px; font-family: "Helvetica Neue", sans-serif; letter-spacing: 1px; line-height: 1; } @media only screen and (min-width: 320px) and (max-width: 759px) { #carbonads { float: none; margin: 0 auto; max-width: 330px; } #carbonads span { position: relative; } #carbonads>span { max-width: none; } .carbon-img { float: left; margin: 0 1em 0 0; } .carbon-text { float: left; margin-bottom: 20px; text-align: left; max-width: calc(100% - 130px - 1em); } .carbon-poweredby { position: absolute; left: 142px; bottom: 0; display: block; } }{% endraw %} From 7da83e71fcd4e8b25b3ed0e0d4e7fea6e71e2b98 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 9 May 2020 14:10:37 -0400 Subject: [PATCH 012/207] working on web design page --- .../04-web-development/15-web-design.markdown | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/content/pages/04-web-development/15-web-design.markdown b/content/pages/04-web-development/15-web-design.markdown index 81b3ffa07..5093e4823 100644 --- a/content/pages/04-web-development/15-web-design.markdown +++ b/content/pages/04-web-development/15-web-design.markdown @@ -22,8 +22,24 @@ accomplish their tasks is a major part of building modern web applications. ## Getting started if you have no "eye" for design +Design can feel like something "creative" people understand intuitively, +but like all skills design is something that can be learned. Some people +are faster learners in design just like some folks are quicker in +picking up programming. But anyone can learn how to be a better designer +by learning the basic principles and practicing them. +One of the best mental models for basic design is C.R.A.P., which helped me +grasp why some designs look good while others do not. CRAP is an acronym +for: + * Contrast: noticeable differences from one element to another + * Repetition: elements' consistency + * Alignment: order among all elements + * Proximity: placement between elements and how they are organized + +These basic principles all you to start breaking down the problem into +digestible pieces that you can work on rather than feeling like you +"just don't have an eye for design". ## Designing for various screen sizes @@ -118,6 +134,10 @@ this short list as my absolute favorites that help developers become [blog post series on building a browser engine](http://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html) that will show you how to build a simple rendering engine. +* [How to Use C.R.A.P. Design Principles for Better UX](https://vwo.com/blog/crap-design-principles/) + has a good summary of what contrast, repetition, alignment and + proximity means for designing user interfaces. + * [Defining Colors in CSS](https://pineco.de/defining-colors-in-css/) presents how to define color in your [Cascading Style Sheets (CSS)](/cascading-style-sheets.html) and breaks From 286ff19ce3eaebdf7406e25eeef2fc777ee275cb Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 25 May 2020 14:31:21 -0400 Subject: [PATCH 013/207] adding new sentry exception handling blog post --- .../06-jupyter-notebook.markdown | 4 + .../10-powershell.markdown | 6 + .../17-localhost-tunnels.markdown | 6 +- content/pages/03-data/00-data.markdown | 4 + content/pages/03-data/02-postgresql.markdown | 12 + content/pages/03-data/03-mysql.markdown | 4 + content/pages/03-data/16-pandas.markdown | 8 + .../00-web-development.markdown | 6 + .../04-web-development/02-django.markdown | 14 + .../04-web-development/03-flask.markdown | 5 + .../04-web-development/25-vuejs.markdown | 5 + .../04-web-development/35-testing.markdown | 6 + .../45-microservices.markdown | 4 + .../48-api-creation.markdown | 12 + .../04-web-development/52-twilio.markdown | 5 + .../04-web-development/53-stripe.markdown | 5 + .../04-web-development/54-slack.markdown | 4 + .../05-deployment/35-containers.markdown | 5 + .../pages/05-deployment/36-docker.markdown | 4 + .../05-deployment/39-aws-lambda.markdown | 5 + .../pages/06-devops/03-prometheus.markdown | 5 + .../06-devops/06-web-app-performance.markdown | 5 + .../pages/06-devops/18-web-analytics.markdown | 7 +- .../flask/flask-code-examples.markdown | 79 - .../flask-example-projects-code.markdown | 48 + .../flask/flask-extensions-plug-ins.markdown | 53 + .../flask/flask-globals-request.markdown | 630 ++ .../flask-helpers-make-response.markdown | 230 + .../flask/flask-helpers-url-for.markdown | 87 + .../flask/flask-signals-namespace.markdown | 103 + .../flask/flask-views-methodview.markdown | 119 + .../200525-python-exceptions-sentry.markdown | 376 ++ .../flask-core-extensions-code-examples.html | 8 + .../create-new-project-screen.jpg | Bin 0 -> 270443 bytes static/img/200525-sentry/create-project.jpg | Bin 0 -> 155032 bytes .../200525-sentry/detailed-error-report.jpg | Bin 0 -> 263647 bytes .../200525-sentry/exception-in-dashboard.jpg | Bin 0 -> 131633 bytes static/img/200525-sentry/header.jpg | Bin 0 -> 51348 bytes .../python-sentry-quickstart.jpg | Bin 0 -> 230612 bytes static/img/200525-sentry/sentry-email.jpg | Bin 0 -> 139238 bytes .../200525-sentry/sentry-empty-dashboard.jpg | Bin 0 -> 298454 bytes static/img/200525-sentry/sentry-homepage.jpg | Bin 0 -> 246339 bytes ...port-exceptions-python-scripts-sentry.html | 5 + theme/templates/code-examples/django.html | 2 +- theme/templates/code-examples/flask.html | 338 +- theme/templates/code-examples/twilio.html | 5461 +++++++++++++++++ theme/templates/css/page-article.css | 2 +- theme/templates/css/toc.css | 2 +- .../flask.html | 14 + theme/templates/page.html | 4 + 50 files changed, 7609 insertions(+), 93 deletions(-) delete mode 100644 content/pages/examples/flask/flask-code-examples.markdown create mode 100644 content/pages/examples/flask/flask-example-projects-code.markdown create mode 100644 content/pages/examples/flask/flask-extensions-plug-ins.markdown create mode 100644 content/pages/examples/flask/flask-globals-request.markdown create mode 100644 content/pages/examples/flask/flask-helpers-make-response.markdown create mode 100644 content/pages/examples/flask/flask-helpers-url-for.markdown create mode 100644 content/pages/examples/flask/flask-signals-namespace.markdown create mode 100644 content/pages/examples/flask/flask-views-methodview.markdown create mode 100644 content/posts/200525-python-exceptions-sentry.markdown create mode 100755 redirects/flask-core-extensions-code-examples.html create mode 100644 static/img/200525-sentry/create-new-project-screen.jpg create mode 100644 static/img/200525-sentry/create-project.jpg create mode 100644 static/img/200525-sentry/detailed-error-report.jpg create mode 100644 static/img/200525-sentry/exception-in-dashboard.jpg create mode 100644 static/img/200525-sentry/header.jpg create mode 100644 static/img/200525-sentry/python-sentry-quickstart.jpg create mode 100644 static/img/200525-sentry/sentry-email.jpg create mode 100644 static/img/200525-sentry/sentry-empty-dashboard.jpg create mode 100644 static/img/200525-sentry/sentry-homepage.jpg create mode 100644 theme/templates/blog/report-exceptions-python-scripts-sentry.html create mode 100644 theme/templates/code-examples/twilio.html create mode 100644 theme/templates/examples-extensions-descriptions/flask.html diff --git a/content/pages/02-development-environments/06-jupyter-notebook.markdown b/content/pages/02-development-environments/06-jupyter-notebook.markdown index ddd5c5efa..5b2b44a06 100644 --- a/content/pages/02-development-environments/06-jupyter-notebook.markdown +++ b/content/pages/02-development-environments/06-jupyter-notebook.markdown @@ -81,6 +81,10 @@ your own productive workflow. examines the growth of the Jupyter ecosystem and the jump from exploratory analysis notebooks to production notebooks. +* [Jupyter Notebook Best Practices](https://levelup.gitconnected.com/jupyter-notebook-best-practices-fc326eb5cd22) + contains tips for beginners such as learning shortcuts and properly + documenting the analysis you work on. + * [How to Version Control Jupyter Notebooks](https://nextjournal.com/schmudde/how-to-version-control-jupyter) explains how Jupyter Notebooks are stored in JSON, the issues with that format for [source control](/source-control.html) and how to get diff --git a/content/pages/02-development-environments/10-powershell.markdown b/content/pages/02-development-environments/10-powershell.markdown index 6c399fb52..8ff71b563 100644 --- a/content/pages/02-development-environments/10-powershell.markdown +++ b/content/pages/02-development-environments/10-powershell.markdown @@ -55,3 +55,9 @@ of a Python programmer's * [Invoke-Build](https://github.com/nightroman/Invoke-Build) is a build automation tool. There is also extensive documentation on their [wiki](https://github.com/nightroman/Invoke-Build/wiki). + +* [Two months with Powershell on a UNIX](https://code.joejag.com/2020/a-month-with-powershell.html) + examines one developer's experience using PowerShell not on Windows + but on a \*nix [operating system](/operating-systems.html). The author + covers the advantages and disadvantages he found during his experience + and some of the bugs he hopes are fixed in PowerShell 7. diff --git a/content/pages/02-development-environments/17-localhost-tunnels.markdown b/content/pages/02-development-environments/17-localhost-tunnels.markdown index 4cfe9d86e..f82b2c81e 100644 --- a/content/pages/02-development-environments/17-localhost-tunnels.markdown +++ b/content/pages/02-development-environments/17-localhost-tunnels.markdown @@ -23,7 +23,11 @@ experience with to the ones I have not used. * [ngrok](https://ngrok.com/) is the service I use most often. It is easy and worth the small fee to upgrade your account with a few - extra features such as fixed, customizable subdomains. + extra features such as fixed, customizable subdomains. There is + also a + [Python wrapper for ngrok called pyngrok](https://github.com/alexdlaird/pyngrok) + that makes it easy to programmatically access the ngrok client + from Python applications. * [Localtunnel](https://localtunnel.github.io/www/) is a localhost tunnel written in Node.js. diff --git a/content/pages/03-data/00-data.markdown b/content/pages/03-data/00-data.markdown index 2ef2bbdc8..a2c996e10 100644 --- a/content/pages/03-data/00-data.markdown +++ b/content/pages/03-data/00-data.markdown @@ -163,3 +163,7 @@ sets. [Jupyter Notebook](/jupyter-notebook.html) that [Stripe](/stripe.html) for their data analysis across the company. +* [The Definitive Data Scientist Environment Setup](https://davidadrian.cc/definitive-data-scientist-setup/) + explains how to set up both a hardware and software configuration that + is conducive to data science research and analysis. + diff --git a/content/pages/03-data/02-postgresql.markdown b/content/pages/03-data/02-postgresql.markdown index fbe6881f6..60ee8b4b2 100644 --- a/content/pages/03-data/02-postgresql.markdown +++ b/content/pages/03-data/02-postgresql.markdown @@ -175,9 +175,21 @@ for properly handling your data. past five years. It's amazing to see how far this project has come and how it continues to evolve. +* [The Internals of PostgreSQL](http://www.interdb.jp/pg/) is a book + that goes into how PostgreSQL works, including core topics such as + [query processing](http://www.interdb.jp/pg/pgsql03.html), + [concurrency control](http://www.interdb.jp/pg/pgsql05.html) and the + [layout of heap table files](http://www.interdb.jp/pg/pgsql01.html). + * [PostgreSQL Weekly](http://postgresweekly.com/) is a weekly newsletter of PostgreSQL content from around the web. +* [My Favorite PostgreSQL Extensions - Part One](https://severalnines.com/database-blog/my-favorite-postgresql-extensions-part-one) + and + [part two](https://severalnines.com/database-blog/my-favorite-postgresql-extensions-part-two) + are roundups of useful PostgreSQL extensions that augment the + standard PostgreSQL functionality. + * [An introduction to PostgreSQL physical storage](http://rachbelaid.com/introduction-to-postgres-physical-storage/) provides a solid walkthrough of where PostgreSQL files are located on disk, how the files store your data and what mappings are important for diff --git a/content/pages/03-data/03-mysql.markdown b/content/pages/03-data/03-mysql.markdown index 87edda6a3..27c52b9c4 100644 --- a/content/pages/03-data/03-mysql.markdown +++ b/content/pages/03-data/03-mysql.markdown @@ -133,6 +133,10 @@ A handful of the best of these tutorials are listed below. goes into details for why the company Userlike migrated from their MySQL database setup to PostgreSQL. +* [MySQL sharding at Quora](https://www.quora.com/q/quoraengineering/MySQL-sharding-at-Quora) + provides details behind Quora's at-scale infrastructure and + how their MySQL sharding evolved over time. + * [Growing up with MySQL](https://nylas.com/blog/growing-up-with-mysql/) is a story about how one company went through dramatic growth and had to keep up with it by quickly scaling their MySQL database. diff --git a/content/pages/03-data/16-pandas.markdown b/content/pages/03-data/16-pandas.markdown index 14c4b9ed6..8a523ba64 100644 --- a/content/pages/03-data/16-pandas.markdown +++ b/content/pages/03-data/16-pandas.markdown @@ -49,6 +49,10 @@ is a data structures and analysis library. shows how to use the `crosstab` function in pandas so you can summarize and group data. +* [Calculating streaks in pandas](https://joshdevlin.com/blog/calculate-streaks-in-pandas/) + shows how to measure and report on streaks in data, which is where + several events happen in a row consecutively. + * [How to Convert a Python Dictionary to a Pandas DataFrame](https://www.marsja.se/how-to-convert-a-python-dictionary-to-a-pandas-dataframe/) is a straightforward tutorial with example code for loading and adding data stored in a typical Python dictionary into a DataFrame. @@ -118,3 +122,7 @@ is a data structures and analysis library. * [How to use Pandas read_html to Scrape Data from HTML Tables](https://www.marsja.se/how-to-use-pandas-read_html-to-scrape-data-from-html-tables/) has a bunch of great code examples that show how to load data from HTML directly into your DataFrames. + +* [How to download fundamentals data with Python](http://theautomatic.net/2020/05/05/how-to-download-fundamentals-data-with-python/) + shows how to obtain and use financial data, such as balance sheets, + stock prices, and various ratios to perform your own analysis on. diff --git a/content/pages/04-web-development/00-web-development.markdown b/content/pages/04-web-development/00-web-development.markdown index 0aad8182f..29b3fb98b 100644 --- a/content/pages/04-web-development/00-web-development.markdown +++ b/content/pages/04-web-development/00-web-development.markdown @@ -21,6 +21,7 @@ in [1989](http://home.cern/topics/birth-web). Web development is the concept that encompasses all the activities involved with websites and web applications. + ## How does Python fit into web development? Python can be used to build server-side web applications. While a [web framework](/web-frameworks.html) is not required to build web apps, @@ -76,6 +77,11 @@ world. that the visualization unfortunately stops around the beginning of 2013 but it's a good way to explore what happened in the first 24 years. +* [What happens when?](https://github.com/alex/what-happens-when) is an + incredibly detailed answer to the questions "What happens when you + type google.com into your browser's address box and press enter?" that + seems straightforward on the surface until you really dig in. + * [How browsers work](https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/) provides an overview with solid detail on how browsers take the HTML, CSS, JavaScript, images and other files as input and render webpages as diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 927c8d57b..253e9efd9 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -135,12 +135,21 @@ the framework. order to build and deploy a RESTful API powered by Python, Django, and Django REST Framework. +* [User Interaction With Forms](https://www.mattlayman.com/understand-django/user-interaction-forms/) + explains general web form input, how Django handles forms via POST requests, + different types of input such as CharFields, DateFields and EmailFields, + and validating that input. + * This 3-part Django project optimization guide covers a wide range of advanced topics such as [Profiling and Django settings](https://dizballanze.com/django-project-optimization-part-1/), [working with databases](https://dizballanze.com/django-project-optimization-part-2/) and [caching](https://dizballanze.com/django-project-optimization-part-3/). +* [Caching in Django](https://testdriven.io/blog/django-caching/) is a detailed + look at the configuration required for caching and how to measure the + performance improvements once you have it in place. + * [Mental Models for Class Based Views](https://djangodeconstructed.com/2020/01/03/mental-models-for-class-based-views/) provides some comparison points between class based views (CBVs) and function based views and the author's opinions for how you can better @@ -257,6 +266,11 @@ based on [WebSockets](/websockets.html). is a good post to read for figuring out how to use [Gulp](http://gulpjs.com/) for handling front end tools in development and production Django sites. +* [Django Testing Cheat Sheet](https://www.valentinog.com/blog/testing-django/) + covers many common scenarios for Django applications such as testing + POST requests, request headers, authentication, and large numbers of + model fields in the [Django ORM](/django-orm.html). + * [Getting Started with Django Testing](http://howchoo.com/g/mjkwmtu5zdl/getting-started-with-django-testing) will help you stop procrastinating on testing your Django projects if you're uncertain where to begin. diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index 29bc0212a..5991ada50 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -181,6 +181,11 @@ combined with the example real-world projects listed in the next section. [Docker](/docker.html). It shows how to [deploy](/deployment.html) it to an Amazon EC2 instance then scale the services on Amazon EC2 Container Service (ECS). +* [Build a Video Chat Application with Python, JavaScript and Twilio Programmable Video](https://www.twilio.com/blog/build-video-chat-application-python-javascript-twilio-programmable-video) + shows how to use [Twilio](/twilio.html) + [Programmable Video](https://www.twilio.com/video) to build cross-platform + (web, iOS and Android) video into Flask applications. + * [Why and how to handle exceptions in Python Flask](https://opensource.com/article/17/3/python-flask-exceptions) has some great example code and reasons why you should code defensively by anticipating and handling the unhappy path exceptions in your Flask diff --git a/content/pages/04-web-development/25-vuejs.markdown b/content/pages/04-web-development/25-vuejs.markdown index 73c979499..20a22a4d1 100644 --- a/content/pages/04-web-development/25-vuejs.markdown +++ b/content/pages/04-web-development/25-vuejs.markdown @@ -43,6 +43,11 @@ rich apps that run in web browsers. coding you need to do to build a legitimate Vue.js application that uses a [Flask](/flask.html) API on the backend. +* [Building a SaaS using Django and Vue.js](https://www.youtube.com/playlist?list=PLpyspNLjzwBnGesxJOt_0r4xTWR80j7Y3) + shows how to create a software-as-a-service application with a + [Django](/django.html) back end and Vue on the front end via a + series of videos that are each between 10-15 minutes in length. + * [Learn Vue by Building and Deploying a CRUD App](https://testdriven.io/courses/learn-vue/?utm_source=fsp) is an awesome course that walks through the Vue basics and building a whole application and deploying it to diff --git a/content/pages/04-web-development/35-testing.markdown b/content/pages/04-web-development/35-testing.markdown index a69c8f126..1a5e2912e 100644 --- a/content/pages/04-web-development/35-testing.markdown +++ b/content/pages/04-web-development/35-testing.markdown @@ -101,6 +101,12 @@ test runners, coverage reports and related libraries. * [A beginner's guide to Python testing](https://miguelgfierro.com/blog/2018/a-beginners-guide-to-python-testing/) covers test-driven development for unit, integration and smoke tests. +* [Testing a Twilio Interactive Voice Response (IVR) System With Python and pytest](https://www.twilio.com/blog/testing-twilio-ivr-system-python-pytest) + is an incredibly in-depth tutorial on testing a Python-powered IVR + using pytest. There is also a tutorial on + [how to build the IVR before this testing tutorial](https://www.twilio.com/blog/building-interactive-voice-response-ivr-system-python-django-twilio), + although you can just clone it to jump into the testing walkthrough. + * Still confused about the difference between unit, functional and integration tests? Check out this [top answer on Stack Overflow](http://stackoverflow.com/questions/4904096/whats-the-difference-between-unit-functional-acceptance-and-integration-test) diff --git a/content/pages/04-web-development/45-microservices.markdown b/content/pages/04-web-development/45-microservices.markdown index 684dfc20d..bdf34a8b9 100644 --- a/content/pages/04-web-development/45-microservices.markdown +++ b/content/pages/04-web-development/45-microservices.markdown @@ -128,3 +128,7 @@ ease further development and deployment. This approach is called the * [The Hardest Part About Microservices: Your Data](http://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/) presents a data-centric view on how to structure and transport data in a microservices architecture. + +* [Deleting data distributed throughout your microservices architecture](https://blog.twitter.com/engineering/en_us/topics/infrastructure/2020/deleting-data-distributed-throughout-your-microservices-architecture.html) + examines how Twitter handles issues with discoverability, access and erasure + in their microservices-heavy production environment. diff --git a/content/pages/04-web-development/48-api-creation.markdown b/content/pages/04-web-development/48-api-creation.markdown index 74ab28c92..da38541c2 100644 --- a/content/pages/04-web-development/48-api-creation.markdown +++ b/content/pages/04-web-development/48-api-creation.markdown @@ -206,6 +206,13 @@ equivalent of browser testing in the web application world. second as well as the number of concurrent open connections can help keep your API alive during times of heavy traffic. +* [Writing HTTP files to test HTTP APIs](https://renato.athaydes.com/posts/writing-http-files-for-testing.html) + shows how to perform automated testing of APIs using HTTP file formats + provided by + [VS Code REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) + and the + [JetBrains HTTP Client Editor](https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html). + * Serialization is common for transforming objects into web API JSON results. One company found the serialization performance of Django REST framework was lacking so they created @@ -228,6 +235,11 @@ equivalent of browser testing in the web application world. * [Building better API docs](https://engineering.gosquared.com/building-better-api-docs) shows how Square used Swagger with React to create more helpful docs. +* [Best Practices For Creating Useful API Documentation](https://nordicapis.com/best-practices-for-creating-useful-api-documentation/) + covers standard but important topics such as knowing your audience, + ensuring your documentation covers the error codes, and providing + a changelog as well as terms of service. + ## Django REST Framework resources * This multi-part series on diff --git a/content/pages/04-web-development/52-twilio.markdown b/content/pages/04-web-development/52-twilio.markdown index 0eaca245d..9ba51f456 100644 --- a/content/pages/04-web-development/52-twilio.markdown +++ b/content/pages/04-web-development/52-twilio.markdown @@ -106,6 +106,11 @@ for fellow developers. Easypost service. There is also another tutorial on [shipment notifications specifically for Flask](https://www.twilio.com/blog/build-shipment-notification-service-python-flask-twilio-easypost). +* [Build a Video Chat Application with Python, JavaScript and Twilio Programmable Video](https://www.twilio.com/blog/build-video-chat-application-python-javascript-twilio-programmable-video) + shows how to use [Flask](/flask.html) and the + [Twilio Programmable Video API](https://www.twilio.com/docs/video) to + build cross-platform video into new and existing applications. + * This video titled "[We're No Strangers to VoIP: Building the National Rick Astley Hotline)](https://www.youtube.com/watch?v=LgKshQoGh64)" presents a hilarious hack that uses Python and diff --git a/content/pages/04-web-development/53-stripe.markdown b/content/pages/04-web-development/53-stripe.markdown index 03b01c986..9e5a2dd9b 100644 --- a/content/pages/04-web-development/53-stripe.markdown +++ b/content/pages/04-web-development/53-stripe.markdown @@ -18,6 +18,11 @@ for processing payments. ### Stripe tutorials +* [How to Create a Subscription SaaS Application with Django and Stripe](https://www.saaspegasus.com/guides/django-stripe-integrate/) + shows how to build a [Django](/django.html) application with models for + the subscription data in the [Django ORM](/django-orm.html) and create + a pricing page. + * [Switching from Braintree to Stripe](https://www.deekit.com/braintree-to-stripe/) covers one development team's experience with moving payment providers. diff --git a/content/pages/04-web-development/54-slack.markdown b/content/pages/04-web-development/54-slack.markdown index 15931fae1..e9e251609 100644 --- a/content/pages/04-web-development/54-slack.markdown +++ b/content/pages/04-web-development/54-slack.markdown @@ -70,6 +70,10 @@ for programmatically interacting with its messaging service. Slack-provided library for working with the Slack API and [WebSockets](/websockets.html) connection. +* [slackify](https://github.com/Ambro17/slackify) is a lightweight + framework for building bots and the quickstart walks you through + how to create a simple example bot. + * [slack-starterbot](https://github.com/mattmakai/slack-starterbot) * [slack-api-python-examples](https://github.com/mattmakai/slack-api-python-examples) diff --git a/content/pages/05-deployment/35-containers.markdown b/content/pages/05-deployment/35-containers.markdown index 76fb8b62c..f88e53a02 100644 --- a/content/pages/05-deployment/35-containers.markdown +++ b/content/pages/05-deployment/35-containers.markdown @@ -55,6 +55,11 @@ useful. on building jails and other process isolation abstractions into operating systems. +* [Linux containers in a few lines of code](https://zserge.com/posts/containers/) + shows how containers work by providing some code to run a busybox + Docker image but without using docker. It then explains what's + happening under the hood as you run basic commands such as `/bin/sh`. + * [A Practical Introduction to Container Terminology](https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/) has both some solid introductory information on containers as well as a good description of terms such as container host, registry server, diff --git a/content/pages/05-deployment/36-docker.markdown b/content/pages/05-deployment/36-docker.markdown index ed7052dee..8017a95da 100644 --- a/content/pages/05-deployment/36-docker.markdown +++ b/content/pages/05-deployment/36-docker.markdown @@ -36,6 +36,10 @@ on Amazon Web Services, Google Compute Engine, Linode, Rackspace or elsewhere. ## Docker resources +* [Beginners guide to Docker](https://www.learncloudnative.com/blog/2020-04-29-beginners-guide-to-docker/) + explains what it is, the difference between containers and virtual machines, + and then provides a hands-on walkthrough command-driven tutorial. + * [What is Docker and When to Use It](https://www.ctl.io/developers/blog/post/what-is-docker-and-when-to-use-it/) clearly delineates what Docker is and what it isn't. This is a good article for when you're first wrapping your head around Docker conceptually. diff --git a/content/pages/05-deployment/39-aws-lambda.markdown b/content/pages/05-deployment/39-aws-lambda.markdown index ab177e024..fec7e2944 100644 --- a/content/pages/05-deployment/39-aws-lambda.markdown +++ b/content/pages/05-deployment/39-aws-lambda.markdown @@ -80,6 +80,11 @@ has support for both Python 2.7, 3.6 and 3.7. ### General AWS Lambda resources +* [Getting started with serverless on AWS](https://emshea.com/post/serverless-getting-started) + is a wonderful tutorials, example projects and additional resources + guide created by a developer who used all of these bits to learn + AWS services herself. + * [AWS Lambda Serverless Reference Architectures](http://www.allthingsdistributed.com/2016/06/aws-lambda-serverless-reference-architectures.html) provides blueprints with diagrams of common architecture patterns that developers use for their mobile backend, file processing, stream diff --git a/content/pages/06-devops/03-prometheus.markdown b/content/pages/06-devops/03-prometheus.markdown index 54eeddc20..7974550b9 100644 --- a/content/pages/06-devops/03-prometheus.markdown +++ b/content/pages/06-devops/03-prometheus.markdown @@ -16,6 +16,11 @@ and report on Python [web applications](/web-development.html). ### Prometheus resources +* [Prometheus-Basics](https://github.com/yolossn/Prometheus-Basics) + is a newbie's introduction to this tool. It covers what Prometheus + is, the tool's architecture, types of metrics and contains a + walkthrough of how to get it configured. + * This primer on [Prometheus](https://www.kartar.net/2017/10/prometheus/) walks through installation, configuration and metrics collection. diff --git a/content/pages/06-devops/06-web-app-performance.markdown b/content/pages/06-devops/06-web-app-performance.markdown index 4d94e4cbd..faa195727 100644 --- a/content/pages/06-devops/06-web-app-performance.markdown +++ b/content/pages/06-devops/06-web-app-performance.markdown @@ -80,3 +80,8 @@ database queries, page size and many other factors. covers the architecture scaling techniques commonly used to move up in serving users by orders of magnitude, for example from 100 to 1000. +* [Web Performance Recipes with Puppeteer](https://addyosmani.com/blog/puppeteer-recipes/) + digs into tracing through page rendering to measure performance and + how to extract performance metrics from the + [Lighthouse](https://developers.google.com/web/tools/lighthouse/) tool + for further analysis. diff --git a/content/pages/06-devops/18-web-analytics.markdown b/content/pages/06-devops/18-web-analytics.markdown index c51330f04..28c0a58a9 100644 --- a/content/pages/06-devops/18-web-analytics.markdown +++ b/content/pages/06-devops/18-web-analytics.markdown @@ -42,6 +42,9 @@ application before taking some action, such as purchasing your service. Piwik is a solid choice if you cannot use Google Analytics or want to customize your own web analytics platform. +* [Shynet](https://github.com/milesmcc/shynet) is a lightweight, privacy-friendly + cookie-free web analytics application written in Python. + * [Open Web Analytics](http://www.openwebanalytics.com/) is another self-hosted platform that integrates through a JavaScript snippet that tracks users' interactions with the webpage. @@ -59,10 +62,6 @@ application before taking some action, such as purchasing your service. collected into the server side or client side code. MixPanel captures that data and provides metrics and visualizations based on the data. -* [KISSmetrics](https://www.kissmetrics.com/)' analytics provides context - for who is visiting a website and what actions they are taking while on - the site. - * [Heap](https://heapanalytics.com/) is a recently founded analytics service with a free introductory tier to get started. diff --git a/content/pages/examples/flask/flask-code-examples.markdown b/content/pages/examples/flask/flask-code-examples.markdown deleted file mode 100644 index 468e988b5..000000000 --- a/content/pages/examples/flask/flask-code-examples.markdown +++ /dev/null @@ -1,79 +0,0 @@ -title: Flask Core and Extensions Code Examples -category: page -slug: flask-core-extensions-code-examples -sortorder: 500020000 -toc: False -sidebartitle: Flask Core and Extensions Code Examples -meta: Learn how to create Flask applications with easy to copy and paste Python code examples for the Flask web framework. - - -[Flask](/flask.html) is a Python [web framework](/web-frameworks.html). - -Official Flask logo. Flask Artwork License. - - -## Flask Example Projects -Flask's large ecosystem of extensions make it easier for developers to -build common web app features such as authentication, -[database](/databases.html) operations and -[APIs](/application-programming-interfaces.html) even though support -is not built into the core Flask [web framework](/web-frameworks.html). -This design is by choice in contrast to [Django](/django.html)'s -"batteries-included" approach. Either framework's design decision -is a viable approach depending on the needs and requirements of the -application you are building. - -The extensive collection of Flask libraries is a great source for -learning the framework through reading code examples. - -This alphabetically-ordered list of projects provide helpful example -code for building your own web apps. - - -### flask-base -[flask-base](https://github.com/hack4impact/flask-base) -([project documentation](http://hack4impact.github.io/flask-base/)) -is a boilerplate starter application that is pre-configured with -[SQLAlchemy](/sqlalchemy.html), [Redis](/redis.html), user -authentication and other features. - -flask-base's code is open sourced -[under the MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). - - -### FlaskBB -[FlaskBB](https://github.com/flaskbb/flaskbb) -([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based -forum web application. The web app allows users to chat in an open -message board or send private messages in plain text or -[Markdown](/markdown.html). - -FlaskBB is provided as open source -[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). - -FlaskBB's code examples can be found on: - -* [flask redirect](/flask-redirect-examples.html) -* [flask request](/flask-request-examples.html) - - -### Flasky -[Flasky](https://github.com/miguelgrinberg/flasky) is the wonderful -example application by -[Miguel Grinberg](https://github.com/miguelgrinberg) that he builds -while teaching developers how to use [Flask](/flask.html) in -[his books and videos](https://courses.miguelgrinberg.com/). Flasky -is [open sourced under the MIT license](https://github.com/miguelgrinberg/flasky/blob/master/LICENSE). - -Code examples from Flasky are shown on the following pages: - -* [flask_sqlalchemy SQLAlchemy Model](/flask-sqlalchemy-model-examples.html) - - -### newspie -[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news -aggregator created with [Flask](/flask.html) and the -[News API](https://newsapi.org/). - -NewsPie is provided as open source under the -[MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown new file mode 100644 index 000000000..c1e861984 --- /dev/null +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -0,0 +1,48 @@ +title: Flask Example Projects and Code +category: page +slug: flask-code-examples +sortorder: 500020001 +toc: False +sidebartitle: Flask Example Code +meta: Python example projects and code that show how to use the Flask web microframework. + + +## Example Projects with Great Example Code +The following active projects use the [Flask](/flask.html) framework +in various ways. The code within the projects can show you how to build +your own applications. + + +### FlaskBB +[FlaskBB](https://github.com/flaskbb/flaskbb) +([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based +forum web application. The web app allows users to chat in an open +message board or send private messages in plain text or +[Markdown](/markdown.html). + +FlaskBB is provided as open source +[under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). + + +### Flask JSONDash +[Flask JSONDash](https://github.com/christabor/flask_jsondash) is a +configurable web application built in Flask that creates charts and +dashboards from arbitrary API endpoints. Everything for the web app +is configured in JSON. The code is provided as open source under the +[MIT license](https://github.com/christabor/flask_jsondash/blob/master/LICENSE). + + +### Flasky +[Flasky](https://github.com/miguelgrinberg/flasky) is the wonderful +example application by +[Miguel Grinberg](https://github.com/miguelgrinberg) that he builds +while teaching developers how to use [Flask](/flask.html) in +[his books and videos](https://courses.miguelgrinberg.com/). Flasky +is [open sourced under the MIT license](https://github.com/miguelgrinberg/flasky/blob/master/LICENSE). + + +### newspie +[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news +aggregator created with [Flask](/flask.html) and the +[News API](https://newsapi.org/). NewsPie is provided as open source under +the [MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). diff --git a/content/pages/examples/flask/flask-extensions-plug-ins.markdown b/content/pages/examples/flask/flask-extensions-plug-ins.markdown new file mode 100644 index 000000000..73a692e1d --- /dev/null +++ b/content/pages/examples/flask/flask-extensions-plug-ins.markdown @@ -0,0 +1,53 @@ +title: Flask Extensions, Plug-ins and Related Libraries +category: page +slug: flask-extensions-plug-ins-related-libraries +sortorder: 500020000 +toc: False +sidebartitle: Flask Extensions +meta: Python code extensions and plug-in projects that show how to use the Flask web app framework. + + +[Flask](/flask.html) is a Python [web framework](/web-frameworks.html). + +Official Flask logo. Flask Artwork License. + +Flask has a wide range of code libraries and extensions that make the +[web framework](/web-frameworks.html) go from a *micro*framework into +a full-featured web application creation tool. + +Flask's large ecosystem of extensions make it easier for developers to +build common web app features such as authentication, +[database](/databases.html) operations and +[APIs](/application-programming-interfaces.html) even though support +is not built into the core Flask [web framework](/web-frameworks.html). +This design is by choice in contrast to [Django](/django.html)'s +"batteries-included" approach. Either framework's design decision +is a viable approach depending on the needs and requirements of the +application you are building. + +The following projects, ordered alphabetically, can be helpful both +as extensions added to your code base as well as example code for +building your own applications. + + +### flask-base +[flask-base](https://github.com/hack4impact/flask-base) +([project documentation](http://hack4impact.github.io/flask-base/)) +is a boilerplate starter application that is pre-configured with +[SQLAlchemy](/sqlalchemy.html), [Redis](/redis.html), user +authentication and other features. + +flask-base's code is open sourced +[under the MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). + + +### Flask RESTX +[Flask RESTX](https://github.com/python-restx/flask-restx) is an +extension that makes it easier to build +[RESTful APIs](/application-programming-interfaces.html) into +your applications. Flask RESTX aims for minimal configuration to +get basic APIs running for existing applications and it exposes +endpoint documentation using [Swagger](https://swagger.io/). + +Flask RESTX is provided as open source under the +[BSD 3-Clause license](https://github.com/python-restx/flask-restx/blob/master/LICENSE). diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown new file mode 100644 index 000000000..53175e4bd --- /dev/null +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -0,0 +1,630 @@ +title: flask.globals request Python code examples +category: page +slug: flask-globals-request-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.globals request +meta: Python example code for the request function from the flask.globals module of the Flask project. + + +request is a function within the flask.globals module of the Flask project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/flask_sqlalchemy/./__init__.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import functools +import os +import sys +import time +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock + +import sqlalchemy +~~from flask import _app_ctx_stack, abort, current_app, request +from flask.signals import Namespace +from sqlalchemy import event, inspect, orm +from sqlalchemy.engine.url import make_url +from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from flask_sqlalchemy.model import Model +from ._compat import itervalues, string_types, xrange +from .model import DefaultMeta +from . import utils + +__version__ = "3.0.0.dev" + +# the best timer function for the platform +if sys.platform == 'win32': + if sys.version_info >= (3, 3): + _timer = time.perf_counter + else: + _timer = time.clock +else: + _timer = time.time + +_signals = Namespace() + + +## ... source file abbreviated to get to request examples ... + + + be limited to that value. If there is no request or they aren't in the + query, they default to 1 and 20 respectively. If ``count`` is ``False``, + no query to help determine total page count will be run. + + When ``error_out`` is ``True`` (default), the following rules will + cause a 404 response: + + * No items are found and ``page`` is not 1. + * ``page`` is less than 1, or ``per_page`` is negative. + * ``page`` or ``per_page`` are not ints. + + When ``error_out`` is ``False``, ``page`` and ``per_page`` default to + 1 and 20 respectively. + + Returns a :class:`Pagination` object. + """ + + if request: + if page is None: + try: +~~ page = int(request.args.get('page', 1)) + except (TypeError, ValueError): + if error_out: + abort(404) + + page = 1 + + if per_page is None: + try: +~~ per_page = int(request.args.get('per_page', 20)) + except (TypeError, ValueError): + if error_out: + abort(404) + + per_page = 20 + else: + if page is None: + page = 1 + + if per_page is None: + per_page = 20 + + if max_per_page is not None: + per_page = min(per_page, max_per_page) + + + +## ... source file abbreviated to get to request examples ... + + + if page < 1: + if error_out: + abort(404) + else: + page = 1 + + if per_page < 0: + if error_out: + abort(404) + + +## ... source file continues with no further request examples... + + +``` + + +## Example 2 from newspie +[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news +aggregator created with [Flask](/flask.html) and the +[News API](https://newsapi.org/). + +NewsPie is provided as open source under the +[MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). + +[**newspie / news.py**](https://github.com/skamieniarz/newspie/blob/master/././news.py) + +```python +# -*- coding: utf-8 -*- +''' +NewsPie - a minimalistic news aggregator built with Flask and powered by +News API (https://newsapi.org/). + +Created by @skamieniarz (https://github.com/skamieniarz) in 2019. +''' +import configparser +import json +import logging +import os + +import requests +import requests_cache +from dateutil import parser +~~from flask import (Flask, make_response, redirect, render_template, request, + url_for) + +CONFIG = configparser.ConfigParser() +CONFIG.read('config.ini') +API_KEY = os.environ.get('NEWS_API_KEY') +TOP_HEADLINES = CONFIG['ENDPOINTS']['TOP_HEADLINES'] +EVERYTHING = CONFIG['ENDPOINTS']['EVERYTHING'] +PAGE_SIZE = int(CONFIG['VARIOUS']['PAGE_SIZE']) + +CATEGORIES = ('general', 'sports', 'business', 'entertainment', 'health', + 'science', 'technology') +with open('data/countries.json') as json_file: + COUNTRIES = json.load(json_file) + +logging.basicConfig(level=logging.DEBUG) +requests_cache.install_cache(cache_name='news_cache', + backend='sqlite', + expire_after=300) + +APP = Flask(__name__) + + +@APP.route('/', methods=['GET', 'POST']) +def root(): + + +## ... source file abbreviated to get to request examples ... + + + + +@APP.errorhandler(404) +def page_not_found(error): + ''' Not existing pages redirect to the first page of general category. ''' + return redirect(url_for('category', category='general', page=1)) + + +@APP.route('/category/', methods=['GET', 'POST']) +def category(category): + ''' Handles category route. + + Parameters: + - name: category + in: path + description: Name of the news category + - name: page + in: query + description: Number of the page + ''' +~~ page = request.args.get('page', default=1, type=int) + if page < 1: + return redirect(url_for('category', category=category, page=1)) +~~ if request.method == 'POST' and category in CATEGORIES: + return do_post(page, category) + if category in CATEGORIES: + params = {'page': page, 'category': category, 'pageSize': PAGE_SIZE} + country = get_cookie('country') + if country is not None: + params.update({'country': country}) + response = requests.get(TOP_HEADLINES, + params=params, + headers={'Authorization': API_KEY}) + if response.status_code == 200: + pages = count_pages(response.json()) + if page > pages: + page = pages + return redirect(url_for('category', category=category, page=page)) + articles = parse_articles(response.json()) + return render(articles, page, pages, country, category) + elif response.status_code == 401: + return render_template(CONFIG['VARIOUS']['401_TEMPLATE']) + return redirect(url_for('category', category='general', page=page)) + + + + +## ... source file abbreviated to get to request examples ... + + +@APP.route('/search/', methods=['GET', 'POST']) +def search(query): + ''' Handles category route. + + Parameters: + - name: query + in: path + description: Query string to be searched + - name: page + in: query + description: Number of the page + ''' +~~ page = request.args.get('page', default=1, type=int) + if page < 1: + return redirect(url_for('search', query=query, page=1)) + params = { + 'qInTitle': query, + 'sortBy': 'relevancy', + 'page': page, + 'pageSize': PAGE_SIZE + } +~~ if request.method == 'POST': + return do_post(page, category='search', current_query=query) + response = requests.get(EVERYTHING, + params=params, + headers={'Authorization': API_KEY}) + pages = count_pages(response.json()) + if page > pages: + page = pages + return redirect(url_for('search', query=query, page=page)) + articles = parse_articles(response.json()) + return render(articles, + page, + pages, + country=get_cookie('country'), + category='search') + + +def do_post(page, category='general', current_query=None): + ''' Helper method that handles POST request basing on the input. ''' +~~ new_query = request.form.get('search_query') +~~ country = request.form.get('country') +~~ next_page = request.form.get('next_page') +~~ previous_page = request.form.get('previous_page') + if new_query is not None and new_query != '': + return redirect(url_for('search', query=new_query, page=1)) + if country is not None and country != get_cookie('country'): + response = make_response( + redirect(url_for('category', category=category, page=1))) + response.set_cookie('country', country) + return response + if next_page is not None: + page = int(next_page) + 1 + elif previous_page is not None: + page = int(previous_page) - 1 + if category == 'search': + return redirect(url_for('search', query=current_query, page=page)) + return redirect(url_for('category', category=category, page=page)) + + +def parse_articles(response): + ''' Parses articles fetched from News API. + + Returns: + A list of dicts containing publishing date, title, URL and source of + articles. + ''' + parsed_articles = [] + ''' Renders the template with appropriate variables. Up to 12 pages + allowed. ''' + pages = pages if pages <= 12 else 12 + return render_template(CONFIG['VARIOUS']['TEMPLATE'], + articles=articles, + categories=CATEGORIES, + category=category, + countries=COUNTRIES, + country=country, + page=page, + pages=pages) + + +def get_cookie(key): + ''' Helper method that gets cookie's value. + + Returns: + A string with a value of a cookie with provided key. If a key is + missing, None is returned. + ''' +~~ cookie_value = request.cookies.get(key) + return cookie_value + + +if __name__ == '__main__': + APP.run() + + +## ... source file continues with no further request examples... + + +``` + + +## Example 3 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / service.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./service.py) + +```python +"""Automatically generated REST API services from SQLAlchemy +ORM models or a database introspection.""" + +# Third-party imports +~~from flask import request, make_response +import flask +from flask.views import MethodView +from sqlalchemy import asc, desc + +# Application imports +from sandman2.exception import NotFoundException, BadRequestException +from sandman2.model import db +from sandman2.decorators import etag, validate_fields + + +def add_link_headers(response, links): + """Return *response* with the proper link headers set, based on the contents + of *links*. + + :param response: :class:`flask.Response` response object for links to be + added + :param dict links: Dictionary of links to be added + :rtype :class:`flask.Response` : + """ + link_string = '<{}>; rel=self'.format(links['self']) + for link in links.values(): + link_string += ', <{}>; rel=related'.format(link) + response.headers['Link'] = link_string + return response + + +## ... source file abbreviated to get to request examples ... + + + + +def jsonify(resource): + """Return a Flask ``Response`` object containing a + JSON representation of *resource*. + + :param resource: The resource to act as the basis of the response + """ + + response = flask.jsonify(resource.to_dict()) + response = add_link_headers(response, resource.links()) + return response + + +def is_valid_method(model, resource=None): + """Return the error message to be sent to the client if the current + request passes fails any user-defined validation.""" + validation_function_name = 'is_valid_{}'.format( +~~ request.method.lower()) + if hasattr(model, validation_function_name): + return getattr(model, validation_function_name)(request, resource) + +class Service(MethodView): + + """The *Service* class is a generic extension of Flask's *MethodView*, + providing default RESTful functionality for a given ORM resource. + + Each service has an associated *__model__* attribute which represents the + ORM resource it exposes. Services are JSON-only. HTML-based representation + is available through the admin interface. + """ + + #: The sandman2.model.Model-derived class to expose + __model__ = None + + #: The string used to describe the elements when a collection is + #: returned. + __json_collection_name__ = 'resources' + + def delete(self, resource_id): + """Return an HTTP response object resulting from a HTTP DELETE call. + + :param resource_id: The value of the resource's primary key + """ + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().delete(resource) + db.session().commit() + return self._no_content_response() + + @etag + def get(self, resource_id=None): + """Return an HTTP response object resulting from an HTTP GET call. + + If *resource_id* is provided, return just the single resource. + Otherwise, return the full collection. + + :param resource_id: The value of the resource's primary key + """ +~~ if request.path.endswith('meta'): + return self._meta() + + if resource_id is None: + error_message = is_valid_method(self.__model__) + if error_message: + raise BadRequestException(error_message) + +~~ if 'export' in request.args: + return self._export(self._all_resources()) + + return flask.jsonify({ + self.__json_collection_name__: self._all_resources() + }) + else: + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + return jsonify(resource) + + def patch(self, resource_id): + """Return an HTTP response object resulting from an HTTP PATCH call. + + :returns: ``HTTP 200`` if the resource already exists + :returns: ``HTTP 400`` if the request is malformed + :returns: ``HTTP 404`` if the resource is not found + :param resource_id: The value of the resource's primary key + """ + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) +~~ if not request.json: + raise BadRequestException('No JSON data received') +~~ resource.update(request.json) + db.session().merge(resource) + db.session().commit() + return jsonify(resource) + + @validate_fields + def post(self): + """Return the JSON representation of a new resource created through + an HTTP POST call. + + :returns: ``HTTP 201`` if a resource is properly created + :returns: ``HTTP 204`` if the resource already exists + :returns: ``HTTP 400`` if the request is malformed or missing data + """ +~~ resource = self.__model__.query.filter_by(**request.json).first() + if resource: + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + return self._no_content_response() + +~~ resource = self.__model__(**request.json) # pylint: disable=not-callable + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().add(resource) + db.session().commit() + return self._created_response(resource) + + def put(self, resource_id): + """Return the JSON representation of a new resource created or updated + through an HTTP PUT call. + + If resource_id is not provided, it is assumed the primary key field is + included and a totally new resource is created. Otherwise, the existing + resource referred to by *resource_id* is updated with the provided JSON + data. This method is idempotent. + + :returns: ``HTTP 201`` if a new resource is created + :returns: ``HTTP 200`` if a resource is updated + :returns: ``HTTP 400`` if the request is malformed or missing data + """ + resource = self.__model__.query.get(resource_id) + if resource: + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) +~~ resource.update(request.json) + db.session().merge(resource) + db.session().commit() + return jsonify(resource) + +~~ resource = self.__model__(**request.json) # pylint: disable=not-callable + error_message = is_valid_method(self.__model__, resource) + if error_message: + raise BadRequestException(error_message) + db.session().add(resource) + db.session().commit() + return self._created_response(resource) + + def _meta(self): + """Return a description of this resource as reported by the + database.""" + return flask.jsonify(self.__model__.description()) + + def _resource(self, resource_id): + """Return the ``sandman2.model.Model`` instance with the given + *resource_id*. + + :rtype: :class:`sandman2.model.Model` + """ + resource = self.__model__.query.get(resource_id) + if not resource: + raise NotFoundException() + return resource + + def _all_resources(self): + """Return the complete collection of resources as a list of + dictionaries. + + :rtype: :class:`sandman2.model.Model` + """ + queryset = self.__model__.query +~~ args = {k: v for (k, v) in request.args.items() if k not in ('page', 'export')} + limit = None + if args: + filters = [] + order = [] + for key, value in args.items(): + if value.startswith('%'): + filters.append(getattr(self.__model__, key).like(str(value), escape='/')) + elif key == 'sort': + direction = desc if value.startswith('-') else asc + order.append(direction(getattr(self.__model__, value.lstrip('-')))) + elif key == 'limit': + limit = int(value) + elif hasattr(self.__model__, key): + filters.append(getattr(self.__model__, key) == value) + else: + raise BadRequestException('Invalid field [{}]'.format(key)) + queryset = queryset.filter(*filters).order_by(*order) +~~ if 'page' in request.args: +~~ resources = queryset.paginate(page=int(request.args['page']), per_page=limit).items + else: + queryset = queryset.limit(limit) + resources = queryset.all() + return [r.to_dict() for r in resources] + + def _export(self, collection): + """Return a CSV of the resources in *collection*. + + :param list collection: A list of resources represented by dicts + """ + fieldnames = collection[0].keys() + faux_csv = ','.join(fieldnames) + '\r\n' + for resource in collection: + faux_csv += ','.join((str(x) for x in resource.values())) + '\r\n' + response = make_response(faux_csv) + response.mimetype = 'text/csv' + return response + + + @staticmethod + def _no_content_response(): + """Return an HTTP 204 "No Content" response. + + :returns: HTTP Response + + +## ... source file continues with no further request examples... + + +``` + diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown new file mode 100644 index 000000000..c9ffd5d0b --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -0,0 +1,230 @@ +title: flask.helpers make_response Python code examples +category: page +slug: flask-helpers-make-response-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.helpers make_response +meta: Python example code for the make_response function from the flask.helpers module of the Flask project. + + +make_response is a function within the flask.helpers module of the Flask project. + + +## Example 1 from newspie +[NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news +aggregator created with [Flask](/flask.html) and the +[News API](https://newsapi.org/). + +NewsPie is provided as open source under the +[MIT license](https://github.com/skamieniarz/newspie/blob/master/LICENSE). + +[**newspie / news.py**](https://github.com/skamieniarz/newspie/blob/master/././news.py) + +```python +# -*- coding: utf-8 -*- +''' +NewsPie - a minimalistic news aggregator built with Flask and powered by +News API (https://newsapi.org/). + +Created by @skamieniarz (https://github.com/skamieniarz) in 2019. +''' +import configparser +import json +import logging +import os + +import requests +import requests_cache +from dateutil import parser +~~from flask import (Flask, make_response, redirect, render_template, request, + url_for) + +CONFIG = configparser.ConfigParser() +CONFIG.read('config.ini') +API_KEY = os.environ.get('NEWS_API_KEY') +TOP_HEADLINES = CONFIG['ENDPOINTS']['TOP_HEADLINES'] +EVERYTHING = CONFIG['ENDPOINTS']['EVERYTHING'] +PAGE_SIZE = int(CONFIG['VARIOUS']['PAGE_SIZE']) + +CATEGORIES = ('general', 'sports', 'business', 'entertainment', 'health', + 'science', 'technology') +with open('data/countries.json') as json_file: + COUNTRIES = json.load(json_file) + +logging.basicConfig(level=logging.DEBUG) +requests_cache.install_cache(cache_name='news_cache', + backend='sqlite', + expire_after=300) + +APP = Flask(__name__) + + +@APP.route('/', methods=['GET', 'POST']) +def root(): + + +## ... source file abbreviated to get to make_response examples ... + + + if page > pages: + page = pages + return redirect(url_for('search', query=query, page=page)) + articles = parse_articles(response.json()) + return render(articles, + page, + pages, + country=get_cookie('country'), + category='search') + + +def do_post(page, category='general', current_query=None): + ''' Helper method that handles POST request basing on the input. ''' + new_query = request.form.get('search_query') + country = request.form.get('country') + next_page = request.form.get('next_page') + previous_page = request.form.get('previous_page') + if new_query is not None and new_query != '': + return redirect(url_for('search', query=new_query, page=1)) + if country is not None and country != get_cookie('country'): +~~ response = make_response( + redirect(url_for('category', category=category, page=1))) + response.set_cookie('country', country) + return response + if next_page is not None: + page = int(next_page) + 1 + elif previous_page is not None: + page = int(previous_page) - 1 + if category == 'search': + return redirect(url_for('search', query=current_query, page=page)) + return redirect(url_for('category', category=category, page=page)) + + +def parse_articles(response): + ''' Parses articles fetched from News API. + + Returns: + A list of dicts containing publishing date, title, URL and source of + articles. + ''' + parsed_articles = [] + if response.get('status') == 'ok': + for article in response.get('articles'): + parsed_articles.append({ + 'published_at': + + +## ... source file continues with no further make_response examples... + + +``` + + +## Example 2 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / service.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./service.py) + +```python +"""Automatically generated REST API services from SQLAlchemy +ORM models or a database introspection.""" + +# Third-party imports +~~from flask import request, make_response +import flask +from flask.views import MethodView +from sqlalchemy import asc, desc + +# Application imports +from sandman2.exception import NotFoundException, BadRequestException +from sandman2.model import db +from sandman2.decorators import etag, validate_fields + + +def add_link_headers(response, links): + """Return *response* with the proper link headers set, based on the contents + of *links*. + + :param response: :class:`flask.Response` response object for links to be + added + :param dict links: Dictionary of links to be added + :rtype :class:`flask.Response` : + """ + link_string = '<{}>; rel=self'.format(links['self']) + for link in links.values(): + link_string += ', <{}>; rel=related'.format(link) + response.headers['Link'] = link_string + return response + + +## ... source file abbreviated to get to make_response examples ... + + + filters.append(getattr(self.__model__, key) == value) + else: + raise BadRequestException('Invalid field [{}]'.format(key)) + queryset = queryset.filter(*filters).order_by(*order) + if 'page' in request.args: + resources = queryset.paginate(page=int(request.args['page']), per_page=limit).items + else: + queryset = queryset.limit(limit) + resources = queryset.all() + return [r.to_dict() for r in resources] + + def _export(self, collection): + """Return a CSV of the resources in *collection*. + + :param list collection: A list of resources represented by dicts + """ + fieldnames = collection[0].keys() + faux_csv = ','.join(fieldnames) + '\r\n' + for resource in collection: + faux_csv += ','.join((str(x) for x in resource.values())) + '\r\n' +~~ response = make_response(faux_csv) + response.mimetype = 'text/csv' + return response + + + @staticmethod + def _no_content_response(): + """Return an HTTP 204 "No Content" response. + + :returns: HTTP Response + """ +~~ response = make_response() + response.status_code = 204 + return response + + @staticmethod + def _created_response(resource): + """Return an HTTP 201 "Created" response. + + :returns: HTTP Response + """ + response = jsonify(resource) + response.status_code = 201 + return response + + +## ... source file abbreviated to get to make_response examples ... + + + + +## ... source file continues with no further make_response examples... + + +``` + diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown new file mode 100644 index 000000000..69da2f858 --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -0,0 +1,87 @@ +title: flask.helpers url_for Python code examples +category: page +slug: flask-helpers-url-for-examples +sortorder: 500021001 +toc: False +sidebartitle: flask.helpers url_for +meta: Python example code for the url_for function from the flask.helpers module of the Flask project. + + +url_for is a function within the flask.helpers module of the Flask project. + + +## Example 1 from flask-base +[flask-base](https://github.com/hack4impact/flask-base) +([project documentation](http://hack4impact.github.io/flask-base/)) +provides boilerplate code for new [Flask](/flask.html) web apps. +The purpose of the boilerplate is to stitch together disparate +libraries that are commonly used in Flask projects, such as +[Redis](/redis.html) for fast caching and transient data storage, +[SendGrid](https://www.twilio.com/sendgrid) for transactional email, +[SQLAlchemy](/sqlalchemy.html) for persistent data storage through a +[relational database](/databases.html) backend, +[Flask-WTF](https://flask-wtf.readthedocs.io/en/stable/) for form +handling and many others. + +flask-base is provided as open source under the +[MIT license](https://github.com/hack4impact/flask-base/blob/master/LICENSE.md). + +[**flask-base / app / utils.py**](https://github.com/hack4impact/flask-base/blob/master/app/./utils.py) + +```python +~~from flask import url_for +from wtforms.fields import Field +from wtforms.widgets import HiddenInput +from wtforms.compat import text_type + + +def register_template_utils(app): + """Register Jinja 2 helpers (called from __init__.py).""" + + @app.template_test() + def equalto(value, other): + return value == other + + @app.template_global() + def is_hidden_field(field): + from wtforms.fields import HiddenField + return isinstance(field, HiddenField) + + app.add_template_global(index_for_role) + + +def index_for_role(role): +~~ return url_for(role.index) + + + + +## ... source file abbreviated to get to url_for examples ... + + +class CustomSelectField(Field): + widget = HiddenInput() + + def __init__(self, label='', validators=None, multiple=False, + choices=[], allow_custom=True, **kwargs): + super(CustomSelectField, self).__init__(label, validators, **kwargs) + self.multiple = multiple + self.choices = choices + self.allow_custom = allow_custom + + def _value(self): + return text_type(self.data) if self.data is not None else '' + + def process_formdata(self, valuelist): + if valuelist: + self.data = valuelist[1] + self.raw_data = [valuelist[1]] + else: + self.data = '' + + +## ... source file continues with no further url_for examples... + + +``` + diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown new file mode 100644 index 000000000..9996547b9 --- /dev/null +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -0,0 +1,103 @@ +title: flask.signals Namespace Python code examples +category: page +slug: flask-signals-namespace-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.signals Namespace +meta: Python example code for the Namespace class from the flask.signals module of the Flask project. + + +Namespace is a class within the flask.signals module of the Flask project. + + +## Example 1 from flask-sqlalchemy +[flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) +([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) +and +[PyPI information](https://pypi.org/project/Flask-SQLAlchemy/)) is a +[Flask](/flask.html) extension that makes it easier to use +[SQLAlchemy](/sqlalchemy.html) when building Flask apps. flask-sqlalchemy +provides helper functions that reduce the amount of common boilerplate +code that you have to frequently write yourself if you did not use this +library when combining Flask with SQLAlchemy. + +flask-sqlalchemy is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/pallets/flask-sqlalchemy/blob/master/LICENSE.rst). + +[**flask-sqlalchemy / flask_sqlalchemy / __init__.py**](https://github.com/pallets/flask-sqlalchemy/blob/master/flask_sqlalchemy/./__init__.py) + +```python +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import functools +import os +import sys +import time +import warnings +from math import ceil +from operator import itemgetter +from threading import Lock + +import sqlalchemy +from flask import _app_ctx_stack, abort, current_app, request +~~from flask.signals import Namespace +from sqlalchemy import event, inspect, orm +from sqlalchemy.engine.url import make_url +from sqlalchemy.ext.declarative import DeclarativeMeta, declarative_base +from sqlalchemy.orm.exc import UnmappedClassError +from sqlalchemy.orm.session import Session as SessionBase + +from flask_sqlalchemy.model import Model +from ._compat import itervalues, string_types, xrange +from .model import DefaultMeta +from . import utils + +__version__ = "3.0.0.dev" + +# the best timer function for the platform +if sys.platform == 'win32': + if sys.version_info >= (3, 3): + _timer = time.perf_counter + else: + _timer = time.clock +else: + _timer = time.time + +~~_signals = Namespace() +models_committed = _signals.signal('models-committed') + + +## ... source file abbreviated to get to Namespace examples ... + + +before_models_committed = _signals.signal('before-models-committed') + + +def _make_table(db): + def _make_table(*args, **kwargs): + if len(args) > 1 and isinstance(args[1], db.Column): + args = (args[0], db.metadata) + args[1:] + info = kwargs.pop('info', None) or {} + info.setdefault('bind_key', None) + kwargs['info'] = info + return sqlalchemy.Table(*args, **kwargs) + return _make_table + + +def _set_default_query_class(d, cls): + if 'query_class' not in d: + d['query_class'] = cls + + +def _wrap_with_default_query_class(fn, cls): + @functools.wraps(fn) + def newfn(*args, **kwargs): + _set_default_query_class(kwargs, cls) + + +## ... source file continues with no further Namespace examples... + + +``` + diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown new file mode 100644 index 000000000..db1011f2c --- /dev/null +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -0,0 +1,119 @@ +title: flask.views MethodView Python code examples +category: page +slug: flask-views-methodview-examples +sortorder: 500021000 +toc: False +sidebartitle: flask.views MethodView +meta: Python example code for the MethodView class from the flask.views module of the Flask project. + + +MethodView is a class within the flask.views module of the Flask project. + + +## Example 1 from sandman2 +[sandman2](https://github.com/jeffknupp/sandman2) +([project documentation](https://sandman2.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/sandman2/)) +is a code library for automatically generating +[RESTful APIs](/application-programming-interfaces.html) from +existing database schemas. This approach is handy for solving +straightforward situations where you want to put an abstraction +layer between one or more applications and your +[relational database](/databases.html) to prevent or reduce +direct database access. + +The sandman2 project is provided under the +[Apache License 2.0](https://github.com/jeffknupp/sandman2/blob/master/LICENSE). + +[**sandman2 / sandman2 / service.py**](https://github.com/jeffknupp/sandman2/blob/master/sandman2/./service.py) + +```python +"""Automatically generated REST API services from SQLAlchemy +ORM models or a database introspection.""" + +# Third-party imports +from flask import request, make_response +import flask +~~from flask.views import MethodView +from sqlalchemy import asc, desc + +# Application imports +from sandman2.exception import NotFoundException, BadRequestException +from sandman2.model import db +from sandman2.decorators import etag, validate_fields + + +def add_link_headers(response, links): + """Return *response* with the proper link headers set, based on the contents + of *links*. + + :param response: :class:`flask.Response` response object for links to be + added + :param dict links: Dictionary of links to be added + :rtype :class:`flask.Response` : + """ + link_string = '<{}>; rel=self'.format(links['self']) + for link in links.values(): + link_string += ', <{}>; rel=related'.format(link) + response.headers['Link'] = link_string + return response + + + + +## ... source file abbreviated to get to MethodView examples ... + + +def jsonify(resource): + """Return a Flask ``Response`` object containing a + JSON representation of *resource*. + + :param resource: The resource to act as the basis of the response + """ + + response = flask.jsonify(resource.to_dict()) + response = add_link_headers(response, resource.links()) + return response + + +def is_valid_method(model, resource=None): + """Return the error message to be sent to the client if the current + request passes fails any user-defined validation.""" + validation_function_name = 'is_valid_{}'.format( + request.method.lower()) + if hasattr(model, validation_function_name): + return getattr(model, validation_function_name)(request, resource) + +~~class Service(MethodView): + + """The *Service* class is a generic extension of Flask's *MethodView*, + providing default RESTful functionality for a given ORM resource. + + Each service has an associated *__model__* attribute which represents the + ORM resource it exposes. Services are JSON-only. HTML-based representation + is available through the admin interface. + """ + + #: The sandman2.model.Model-derived class to expose + __model__ = None + + #: The string used to describe the elements when a collection is + #: returned. + __json_collection_name__ = 'resources' + + def delete(self, resource_id): + """Return an HTTP response object resulting from a HTTP DELETE call. + + :param resource_id: The value of the resource's primary key + """ + resource = self._resource(resource_id) + error_message = is_valid_method(self.__model__, resource) + if error_message: + + +## ... source file continues with no further MethodView examples... + + +``` + diff --git a/content/posts/200525-python-exceptions-sentry.markdown b/content/posts/200525-python-exceptions-sentry.markdown new file mode 100644 index 000000000..2ff43f88e --- /dev/null +++ b/content/posts/200525-python-exceptions-sentry.markdown @@ -0,0 +1,376 @@ +title: Reporting Exceptions in Python Scripts with Sentry +slug: report-exceptions-python-scripts-sentry +meta: Learn how to catch exceptions in Python scripts and then use Sentry to store and analyze the errors. +category: post +date: 2020-05-25 +modified: 2020-05-25 +newsletter: False +headerimage: /img/200525-sentry/header.jpg +headeralt: Python and Sentry logos. Copyright their respective owners. + + +Python scripts are the glue that keep many applications and their +infrastructure running, but when one of your scripts throws an exception +you may not know about it immediately unless you have a central place to +aggregate the errors. That's where adding [Sentry](https://sentry.io/) +can solved this distributed error logging problem. + +In this tutorial, we'll see how to quickly add Sentry to a new or existing +Python script to report errors into a centralized location for further +[debugging](/debugging.html). + + +## Development environment setup +Make sure you have Python 3 installed. As of right now, +[Python 3.8.3](https://www.python.org/downloads/) is the latest +version of Python. + +During this tutorial we're also going to use: + +* a hosted Sentry instance on [sentry.io](https://sentry.io), which we'll + need an account to access +* the [Sentry Python helper library](https://pypi.org/project/sentry-sdk/) to + send exception data to our Sentry instance + + +Install the above code libraries into a new +[Python virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following commands: + +```bash +python -m venv sentryscript +source sentryscript/bin/activate + +pip install sentry-sdk>=0.14.4 +``` + +Our [development environment](/development-environments.html) is now +ready and we can write some code that will throw exceptions to demonstrate +how to use Sentry. + +Note that all of the code for this tutorial can be found within the +[blog-code-examples](https://github.com/fullstackpython/blog-code-examples) +Git repository on GitHub under the +[python-script-sentry](https://github.com/fullstackpython/blog-code-examples/tree/master/python-script-sentry) +directory. + + +## An Example Script for Loading Python Modules +We'll start by writing a small but useful script that prints out the +names of all modules within a Python package, then add Sentry to it +when it becomes apparent that capturing exceptions would be a +useful addition. + +Create a new file named `module_loader.py` and write the +following lines of code in it to allow us to easily execute it +on the command line. + +```python +import argparse + +def import_submodules(package): + return {} + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("package") + args = parser.parse_args() + + package_to_load = args.package + results = import_submodules(package_to_load) + for r in results: + print(str(r)) +``` + +The above code takes an argument when the script is invoked from the +command line and uses the value as an input into the stub +`import_submodules` function that will contain code to walk the +tree of modules within the package. + +Nextt, add the following highlighted lines of code to use `importlib` and +`pkgutil` to recursively import modules from the package if one is +found that matches the name sent in as the `package` argument. + +```python +import argparse +~~import importlib +~~import pkgutil + + +def import_submodules(package): +~~ """Import all submodules of a module, recursively, including subpackages. + +~~ :param package: package (name or actual module) +~~ :type package: str | module +~~ :rtype: dict[str, types.ModuleType] +~~ """ +~~ if isinstance(package, str): +~~ package = importlib.import_module(package) +~~ results = {} +~~ for loader, name, is_pkg in pkgutil.walk_packages(package.__path__): +~~ full_name = package.__name__ + '.' + name +~~ try: +~~ results[full_name] = importlib.import_module(full_name) +~~ if is_pkg: +~~ results.update(import_submodules(full_name)) +~~ except ModuleNotFoundError as mnfe: +~~ print("module not found: {}".format(full_name)) +~~ except Exception as general_exception: +~~ print(general_exception) +~~ return results + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("package") + args = parser.parse_args() + + package_to_load = args.package + results = import_submodules(package_to_load) + for r in results: + print(str(r)) +``` + +The new code above loops through all packages with the +`walk_package` function in the `pkgutil` standard library +module and tries to import it using the `import_module` on +the package name plus package as a string. If the +result is successful, the function will recursively call +itself to import submodules within the imported package. +If a module is not found, or some other issue occurs, exceptions +are caught so that the script does not fail but instead can +continue processing potential modules. + +Test the full script to see what it prints out with an arbitrary +package on the command line: + +```bash +python module_loader.py importlib +``` + +The above example generates the output: + +```bash +importlib._bootstrap +importlib._bootstrap_external +importlib.abc +importlib.machinery +importlib.resources +importlib.util +``` + +Trying to inspect a package that is not installed will give an error. Use +the script with a package that is not installed in your current environment. + +```bash +python module_loader.py flask +``` + +The above command produces the following traceback due to an expected +`ModuleNotFoundError`. + +``` +Traceback (most recent call last): + File "module_loader.py", line 35, in + results = import_submodules(package_to_load) + File "module_loader.py", line 14, in import_submodules + package = importlib.import_module(package) + File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module + return _bootstrap._gcd_import(name[level:], package, level) + File "", line 1006, in _gcd_import + File "", line 983, in _find_and_load + File "", line 965, in _find_and_load_unlocked +ModuleNotFoundError: No module named 'flask' +``` + +If you install Flask into your current environment the module is found and +the application will go through the list of modules and submodules. + +Our example script is usable but what if we run this code or something similar +on one or more servers that we don't check that often? That's where it would +be helpful to have a way to aggregate one or more scripts' exception output +in a single place. Sentry can help us to accomplish that goal. + + +## Adding Exception Reporting with Sentry +Sentry can either be [self-hosted](https://github.com/getsentry/onpremise) or +used as a cloud service through [Sentry.io](https://sentry.io). In this +tutorial we will use the cloud hosted version because it's faster than +setting up your own server as well as free for smaller projects. + +Go to [Sentry.io's homepage](https://sentry.io). + +Sentry.io homepage where you can sign up for a free account. + +Sign into your account or sign up for a new free account. You will be at +the main account dashboard after logging in or completing the Sentry sign +up process. + +There are no errors logged on our account dashboard yet, which is as +expected because we have not yet connected our account to the Python +script. + +Blank Sentry account dashboard. + +You'll want to create a new Sentry Project just for this application so +click "Projects" in the left sidebar to go to the Projects page. + +Button to create a new Sentry project. + +On the Projects page, click the "Create Project" button in the top right +corner of the page. + +Create a new Sentry project. + +Select Python, give your new Project a name and then press the "Create Project" +button. Our new project is ready to integrate with our Python script. + +We need the unique identifier for our account and project to authorize our +Python code to send errors to this Sentry instance. The easiest way to get +what we need is to go to the +[Python getting started documentation page](https://docs.sentry.io/error-reporting/quickstart/?platform=python) +and scroll down to the "Configure the SDK" section. + +The Sentry docs show you exactly what you need to export to connect to your account. + +Copy the string parameter for the `init` method and +[set it as an environment variable](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html) +rather than exposing it directly in your application code. + +```bash +export SENTRY_DSN='https://yourkeygoeshere.ingest.sentry.io/project-number' +``` + +**Make sure to replace "yourkeygoeshere" with your own unique identifier +and "project-number" with the ID that matches the project you just +created.** + +Check that the `SENTRY_DSN` is set properly in your shell using the `echo` +command: + +```bash +echo $SENTRY_DSN +``` + +Modify the application to send exception information to Sentry now +that we have our unique identifier. Open `module_loader.py` again and +update the following highlighted lines of code. + +```python +import argparse +import importlib +~~import os +import pkgutil +~~import sentry_sdk +~~from sentry_sdk import capture_exception + +~~# find on https://docs.sentry.io/error-reporting/quickstart/?platform=python +~~sentry_sdk.init(dsn=os.getenv('SENTRY_DSN')) + + +def import_submodules(package): + """Import all submodules of a module, recursively, including subpackages. + + :param package: package (name or actual module) + :type package: str | module + :rtype: dict[str, types.ModuleType] + """ + if isinstance(package, str): + package = importlib.import_module(package) + results = {} + for loader, name, is_pkg in pkgutil.walk_packages(package.__path__): + full_name = package.__name__ + '.' + name + try: + results[full_name] = importlib.import_module(full_name) + if is_pkg: + results.update(import_submodules(full_name)) + except ModuleNotFoundError as mnfe: + print("module not found: {}".format(full_name)) +~~ capture_exception(mnfe) + except Exception as general_exception: + print(general_exception) +~~ capture_exception(general_exception) + return results + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("package") + args = parser.parse_args() + + package_to_load = args.package + results = import_submodules(package_to_load) + for r in results: + print(str(r)) +``` + +These new lines of code import the +[Sentry Python SDK](https://github.com/getsentry/sentry-python) and `os` +library (to read system environment variables). The application then +initializes the Sentry SDK with the string found in the `SENTRY_DSN` +environment variable. Down in the `import_submodules` function we +then call the `capture_exception` SDK function whenever a +`ModuleNotFoundException` is thrown or another exception which would +be caught within the broader `Exception` bucket. + +Now that our code is in place, let's test out the new Sentry integration. + + +## Testing the Script and Viewing Exceptions +The easiest way to test out whether the Sentry code is working or not is +to try to import a module that does not exist. Let's say you make a +typo in your command and try to run the script on `importliba` instead +of `importlib` (maybe because you are using an awful Macbook Pro "butterfly" +keyboard instead of a durable keyboard). Try it out and see what happens: + +```bash +python module_loader.py importliba +``` + +The script will run and finish but there will be errors because that +module does not exist. Thanks to our new code, we can view the +errors in Sentry. + +Check the Sentry dashboard to see the error. + +Viewing the first exception in the Sentry dashboard. + +We can also click into the error to learn more about what happened. + +The exception details in the Sentry dashboard. + +You can also receive email reports on the errors that occur so that +you do not have to always stay logged into the dashboard. + +The exception via email. + +With that all configured, we've now got a great base to expand the script +and build better error handling with Sentry as our Python application +becomes more complex. + + +## What's Next? +We just created an example script that outputs all of the modules and +submodules in a package, then added Sentry to it so that it would report +any exceptions back to our central hosted instance. + +That's just a simple introduction to Sentry, so next you'll want to +read one of the following articles to do more with it: + +* [Python Sentry docs](https://docs.sentry.io/platforms/python/) +* [How to use Sentry with Flask](https://docs.sentry.io/platforms/python/flask/) +* [Integrating Sentry into Celery task queues](https://docs.sentry.io/platforms/python/celery/) + +You can also get an idea of what to code next in your Python project by +reading the +[Full Stack Python table of contents page](/table-of-contents.html). + +Questions? Contact me via Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). I'm also on GitHub with +the username [mattmakai](https://github.com/mattmakai). + +Something wrong with this post? Fork +[this page's source on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200525-python-exceptions-sentry.markdown) +and submit a pull request. diff --git a/redirects/flask-core-extensions-code-examples.html b/redirects/flask-core-extensions-code-examples.html new file mode 100755 index 000000000..1a439cb87 --- /dev/null +++ b/redirects/flask-core-extensions-code-examples.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/200525-sentry/create-new-project-screen.jpg b/static/img/200525-sentry/create-new-project-screen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75310353c9dbee4fbd21ac72e2b160ac1129d39e GIT binary patch literal 270443 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
U_ybru10N#H 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�Cp?L5C)HsDZ3?tovuBB_r?XDu8 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') +~~ return mark_safe('\n'.join(output)) + + def render_options(self, choices, selected_choices, name): + selected_choices = set(force_str(v) for v in selected_choices) + output = [] + for option_value, option_label in chain(self.choices, choices): + if isinstance(option_label, (list, tuple)): + for option in option_label: + output.append( + self.render_option(name, selected_choices, *option)) + else: + output.append( + self.render_option(name, selected_choices, + option_value, option_label)) + return '\n'.join(output) + + def render_option(self, name, selected_choices, + option_value, option_label): + option_value = force_str(option_value) + if option_label == BLANK_CHOICE_DASH[0][1]: + option_label = _("All") + data = self.data.copy() + data[name] = option_value + selected = data == self.data or option_value in selected_choices + try: + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 8 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / widgets.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/./widgets.py) + +```python +# widgets.py +import datetime +import re +from itertools import chain + +import django +from django import forms +from django.conf import settings +from django.forms.widgets import FILE_INPUT_CONTRADICTION +from django.template import loader +from django.utils import datetime_safe, formats +from django.utils.dates import MONTHS +from django.utils.encoding import force_str +from django.utils.html import conditional_escape +~~from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ + +from .compat import MULTIVALUE_DICT_TYPES, flatten_contexts + + +from django.forms.utils import to_current_timezone + + +RE_DATE = re.compile(r'(\d{4})-(\d\d?)-(\d\d?)$') + + +__all__ = ( + 'TextInput', 'PasswordInput', 'HiddenInput', 'ClearableFileInput', + 'FileInput', 'DateInput', 'DateTimeInput', 'TimeInput', 'Textarea', + 'CheckboxInput', 'Select', 'NullBooleanSelect', 'SelectMultiple', + 'RadioSelect', 'CheckboxSelectMultiple', 'SearchInput', 'RangeInput', + 'ColorInput', 'EmailInput', 'URLInput', 'PhoneNumberInput', 'NumberInput', + 'IPAddressInput', 'MultiWidget', 'Widget', 'SplitDateTimeWidget', + 'SplitHiddenDateTimeWidget', 'MultipleHiddenInput', 'SelectDateWidget', + 'SlugInput', +) + + +class Widget(forms.Widget): + + +## ... source file abbreviated to get to mark_safe examples ... + + + +class HiddenInput(Input): + template_name = 'floppyforms/hidden.html' + input_type = 'hidden' + + +class MultipleHiddenInput(HiddenInput): + def __init__(self, attrs=None, choices=()): + super(MultipleHiddenInput, self).__init__(attrs) + self.choices = choices + + def render(self, name, value, attrs=None, choices=(), renderer=None): + if value is None: + value = [] + + final_attrs = self.build_attrs(attrs) + id_ = final_attrs.get('id', None) + inputs = [] + for i, v in enumerate(value): + input_attrs = final_attrs.copy() + if id_: + input_attrs['id'] = '%s_%s' % (id_, i) + input_ = HiddenInput() + input_.is_required = self.is_required + inputs.append(input_.render(name, force_str(v), input_attrs, renderer=renderer)) +~~ return mark_safe("\n".join(inputs)) + + def value_from_datadict(self, data, files, name): + if isinstance(data, MULTIVALUE_DICT_TYPES): + return data.getlist(name) + return data.get(name, None) + + +class SlugInput(TextInput): + template_name = 'floppyforms/slug.html' + + def get_context(self, name, value, attrs): + context = super(SlugInput, self).get_context(name, value, attrs) + context['attrs']['pattern'] = r"[-\w]+" + return context + + +class IPAddressInput(TextInput): + template_name = 'floppyforms/ipaddress.html' + + ip_pattern = (r"(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25" + r"[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}") + + def get_context(self, name, value, attrs): + context = super(IPAddressInput, self).get_context(name, value, attrs) + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 9 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import functools +import logging +import tablib +import traceback +from collections import OrderedDict +from copy import deepcopy + +from diff_match_patch import diff_match_patch + +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +~~from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: + from django.core.exceptions import FieldDoesNotExist +else: + from django.db.models.fields import FieldDoesNotExist + + +logger = logging.getLogger(__name__) +logger.addHandler(logging.NullHandler()) + +USE_TRANSACTIONS = getattr(settings, 'IMPORT_EXPORT_USE_TRANSACTIONS', True) +CHUNK_SIZE = getattr(settings, 'IMPORT_EXPORT_CHUNK_SIZE', 1) + + +def get_related_model(field): + if hasattr(field, 'related_model'): + return field.related_model + if field.rel: + + +## ... source file abbreviated to get to mark_safe examples ... + + + if not option.startswith('_')]: + setattr(meta, option, getattr(options, option)) + new_class._meta = meta + + return new_class + + +class Diff: + def __init__(self, resource, instance, new): + self.left = self._export_resource_fields(resource, instance) + self.right = [] + self.new = new + + def compare_with(self, resource, instance, dry_run=False): + self.right = self._export_resource_fields(resource, instance) + + def as_html(self): + data = [] + dmp = diff_match_patch() + for v1, v2 in zip(self.left, self.right): + if v1 != v2 and self.new: + v1 = "" + diff = dmp.diff_main(force_str(v1), force_str(v2)) + dmp.diff_cleanupSemantic(diff) + html = dmp.diff_prettyHtml(diff) +~~ html = mark_safe(html) + data.append(html) + return data + + def _export_resource_fields(self, resource, instance): + return [resource.export_field(f, instance) if instance else "" for f in resource.get_user_visible_fields()] + + +class Resource(metaclass=DeclarativeMetaclass): + + def __init__(self): + self.fields = deepcopy(self.fields) + + self.create_instances = list() + self.update_instances = list() + self.delete_instances = list() + + @classmethod + def get_result_class(self): + return Result + + @classmethod + def get_row_result_class(self): + return RowResult + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 10 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / admin.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./admin.py) + +```python +# admin.py +from django.apps import apps +from django.contrib import admin +from django.http import HttpResponse +from django.shortcuts import redirect +from django.urls import reverse +~~from django.utils.safestring import mark_safe +from django.utils.text import capfirst +from django.utils.translation import ugettext_lazy as _ + + +class InlineActionException(Exception): + pass + + +class ActionNotCallable(InlineActionException): + def __init__(self, model_admin, action, *args, **kwargs): + super().__init__(*args, **kwargs) + self.model_admin = model_admin + self.action = action + + +class BaseInlineActionsMixin: + INLINE_MODEL_ADMIN = 'inline' + MODEL_ADMIN = 'admin' + + inline_actions = [] + + def get_inline_actions(self, request, obj=None): + if self.inline_actions is None: + return [] + + +## ... source file abbreviated to get to mark_safe examples ... + + + css_handler = getattr( + self, 'get_{}_css'.format(action_name), None) + if callable(css_handler): + css_classes = css_handler(obj=obj) + else: + try: + css_classes = action_func.css_classes + except AttributeError: + css_classes = '' + + action_data = [ + self.__class__.__name__.lower(), + self._get_admin_type(), + action_name, + obj._meta.app_label, + obj._meta.model_name, + str(obj.pk), + ] + buttons.append( + ''.format( + '_action__{}'.format('__'.join(action_data)), + description, + css_classes, + ) + ) +~~ return mark_safe('
{}
'.format( + ''.join(buttons) + )) + render_inline_actions.short_description = _("Actions") + render_inline_actions.allow_tags = True + + +class InlineActionsMixin(BaseInlineActionsMixin): + def render_inline_actions(self, obj=None): + html = super().render_inline_actions(obj=obj) +~~ return mark_safe('

{}

'.format(html)) + + render_inline_actions.short_description = _("Actions") + render_inline_actions.allow_tags = True + + def get_fields(self, request, obj=None): + self._request = request + + fields = super().get_fields(request, obj) + if self.inline_actions is not None: # is it explicitly disabled? + fields = list(fields) + if 'render_inline_actions' not in fields: + fields.append('render_inline_actions') + return fields + + +class InlineActionsModelAdminMixin(BaseInlineActionsMixin): + class Media: + css = { + "all": ( + "inline_actions/css/inline_actions.css", + ) + } + + def get_list_display(self, request): + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 11 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / templatetags / jet_tags.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/templatetags/jet_tags.py) + +```python +# jet_tags.py +from __future__ import unicode_literals +import json +import os +from django import template +try: + from django.core.urlresolvers import reverse +except ImportError: # Django 1.11 + from django.urls import reverse + +from django.forms import CheckboxInput, ModelChoiceField, Select, ModelMultipleChoiceField, SelectMultiple +from django.contrib.admin.widgets import RelatedFieldWidgetWrapper +from django.utils.formats import get_format +~~from django.utils.safestring import mark_safe +from django.utils.encoding import smart_text +from jet import settings, VERSION +from jet.models import Bookmark +from jet.utils import get_model_instance_label, get_model_queryset, get_possible_language_codes, \ + get_admin_site, get_menu_items + +try: + from urllib.parse import parse_qsl +except ImportError: + from urlparse import parse_qsl + + +register = template.Library() +assignment_tag = register.assignment_tag if hasattr(register, 'assignment_tag') else register.simple_tag + + +@assignment_tag +def jet_get_date_format(): + return get_format('DATE_INPUT_FORMATS')[0] + + +@assignment_tag +def jet_get_time_format(): + return get_format('TIME_INPUT_FORMATS')[0] + + +## ... source file abbreviated to get to mark_safe examples ... + + + return jet_sibling_object(context, False) + + +@assignment_tag(takes_context=True) +def jet_next_object(context): + return jet_sibling_object(context, True) + + +@assignment_tag(takes_context=True) +def jet_popup_response_data(context): + if context.get('popup_response_data'): + return context['popup_response_data'] + + return json.dumps({ + 'action': context.get('action'), + 'value': context.get('value') or context.get('pk_value'), + 'obj': smart_text(context.get('obj')), + 'new_value': context.get('new_value') + }) + + +@assignment_tag(takes_context=True) +def jet_delete_confirmation_context(context): + if context.get('deletable_objects') is None and context.get('deleted_objects') is None: + return '' +~~ return mark_safe('

') + + +@assignment_tag +def jet_static_translation_urls(): + language_codes = get_possible_language_codes() + + urls = [] + url_templates = [ + 'jet/js/i18n/jquery-ui/datepicker-__LANGUAGE_CODE__.js', + 'jet/js/i18n/jquery-ui-timepicker/jquery.ui.timepicker-__LANGUAGE_CODE__.js', + 'jet/js/i18n/select2/__LANGUAGE_CODE__.js' + ] + + static_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'static') + + for tpl in url_templates: + for language_code in language_codes: + url = tpl.replace('__LANGUAGE_CODE__', language_code) + path = os.path.join(static_dir, url) + + if os.path.exists(path): + urls.append(url) + break + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 12 from django-markdown-view +[django-markdown-view](https://github.com/rgs258/django-markdown-view) +([PyPI package information](https://pypi.org/project/django-markdown-view/)) +is a Django extension for serving [Markdown](/markdown.html) files as +[Django templates](/django-templates.html). The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE). + +[**django-markdown-view / markdown_view / views.py**](https://github.com/rgs258/django-markdown-view/blob/master/markdown_view/./views.py) + +```python +# views.py +import logging + +import markdown +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin +from django.template import Engine, Template, Context +from django.template.loader import render_to_string +~~from django.utils.safestring import mark_safe +from django.views.generic import TemplateView +from markdown_view.constants import ( + DEFAULT_MARKDOWN_VIEW_LOADERS, + DEFAULT_MARKDOWN_VIEW_EXTENSIONS, DEFAULT_MARKDOWN_VIEW_TEMPLATE, + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT, DEFAULT_MARKDOWN_VIEW_EXTRA_CONTEXT, +) + +logger = logging.getLogger(__name__) + + +class MarkdownView(TemplateView): + file_name = None + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + if self.file_name: + engine = Engine(loaders=getattr( + settings, "MARKDOWN_VIEW_LOADERS", DEFAULT_MARKDOWN_VIEW_LOADERS) + ) + template = engine.get_template(self.file_name) + md = markdown.Markdown(extensions=getattr( + settings, + "MARKDOWN_VIEW_EXTENSIONS", + DEFAULT_MARKDOWN_VIEW_EXTENSIONS + )) + template = Template( + "{{% load static %}}{}".format(md.convert(template.source)) + ) + render_context_base = {} + if getattr( + settings, + "MARKDOWN_VIEW_USE_REQUEST_CONTEXT", + DEFAULT_MARKDOWN_VIEW_USE_REQUEST_CONTEXT + ): + render_context_base = context + render_context = Context({ + **render_context_base, + **(getattr( + settings, + "MARKDOWN_VIEW_EXTRA_CONTEXT", + DEFAULT_MARKDOWN_VIEW_EXTRA_CONTEXT + )) + }) + context.update({ +~~ "markdown_content": mark_safe(template.render(render_context)), +~~ "markdown_toc": mark_safe(md.toc), +~~ "page_title": mark_safe(md.toc_tokens[0]['name']), + }) + return context + + template_name = getattr( + settings, + "MARKDOWN_VIEW_TEMPLATE", + DEFAULT_MARKDOWN_VIEW_TEMPLATE + ) + + +class LoggedInMarkdownView(LoginRequiredMixin, MarkdownView): + pass + + +class StaffMarkdownView(UserPassesTestMixin, MarkdownView): + def test_func(self): + return self.request.user.is_active and self.request.user.is_staff + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 13 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / templatetags / mongonaut_tags.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/templatetags/mongonaut_tags.py) + +```python +# mongonaut_tags.py + +from django import template +from django.urls import reverse +~~from django.utils.safestring import mark_safe + +from bson.objectid import ObjectId +from mongoengine import Document +from mongoengine.fields import URLField + +register = template.Library() + + +@register.simple_tag() +def get_document_value(document, key): + value = getattr(document, key) + if isinstance(value, ObjectId): + return value + + if isinstance(document._fields.get(key), URLField): +~~ return mark_safe("""{1}""".format(value, value)) + + if isinstance(value, Document): + app_label = value.__module__.replace(".models", "") + document_name = value._class_name + url = reverse( + "document_detail", + kwargs={'app_label': app_label, 'document_name': document_name, + 'id': value.id}) +~~ return mark_safe("""{1}""".format(url, value)) + + return value + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 14 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / templatetags / pipeline.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/templatetags/pipeline.py) + +```python +# pipeline.py +import logging +import subprocess + +from django.contrib.staticfiles.storage import staticfiles_storage + +from django import template +from django.template.base import Context, VariableDoesNotExist +from django.template.loader import render_to_string +~~from django.utils.safestring import mark_safe + +from ..collector import default_collector +from ..conf import settings +from ..exceptions import CompilerError +from ..packager import Packager, PackageNotFound +from ..utils import guess_type + +logger = logging.getLogger(__name__) + +register = template.Library() + + +class PipelineMixin(object): + request = None + _request_var = None + + @property + def request_var(self): + if not self._request_var: + self._request_var = template.Variable('request') + return self._request_var + + def package_for(self, package_name, package_type): + package = { + + +## ... source file abbreviated to get to mark_safe examples ... + + + 'command': subprocess.list2cmdline(e.command), + 'errors': e.error_output, + }) + + +class StylesheetNode(PipelineMixin, template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + super(StylesheetNode, self).render(context) + package_name = template.Variable(self.name).resolve(context) + + try: + package = self.package_for(package_name, 'css') + except PackageNotFound: + logger.warn("Package %r is unknown. Check PIPELINE['STYLESHEETS'] in your settings.", package_name) + return '' # fail silently, do not return anything if an invalid group is specified + return self.render_compressed(package, package_name, 'css') + + def render_css(self, package, path): + template_name = package.template_name or "pipeline/css.html" + context = package.extra_context + context.update({ + 'type': guess_type(path, 'text/css'), +~~ 'url': mark_safe(staticfiles_storage.url(path)) + }) + return render_to_string(template_name, context) + + def render_individual_css(self, package, paths, **kwargs): + tags = [self.render_css(package, path) for path in paths] + return '\n'.join(tags) + + def render_error_css(self, package_name, e): + return super(StylesheetNode, self).render_error( + 'CSS', package_name, e) + + +class JavascriptNode(PipelineMixin, template.Node): + def __init__(self, name): + self.name = name + + def render(self, context): + super(JavascriptNode, self).render(context) + package_name = template.Variable(self.name).resolve(context) + + try: + package = self.package_for(package_name, 'js') + except PackageNotFound: + logger.warn("Package %r is unknown. Check PIPELINE['JAVASCRIPT'] in your settings.", package_name) + return '' # fail silently, do not return anything if an invalid group is specified + return self.render_compressed(package, package_name, 'js') + + def render_js(self, package, path): + template_name = package.template_name or "pipeline/js.html" + context = package.extra_context + context.update({ + 'type': guess_type(path, 'text/javascript'), +~~ 'url': mark_safe(staticfiles_storage.url(path)) + }) + return render_to_string(template_name, context) + + def render_inline(self, package, js): + context = package.extra_context + context.update({ + 'source': js + }) + return render_to_string("pipeline/inline_js.html", context) + + def render_individual_js(self, package, paths, templates=None): + tags = [self.render_js(package, js) for js in paths] + if templates: + tags.append(self.render_inline(package, templates)) + return '\n'.join(tags) + + def render_error_js(self, package_name, e): + return super(JavascriptNode, self).render_error( + 'JavaScript', package_name, e) + + +@register.tag +def stylesheet(parser, token): + try: + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 15 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / templatetags / rest_framework.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py) + +```python +# rest_framework.py +import re +from collections import OrderedDict + +from django import template +from django.template import loader +from django.urls import NoReverseMatch, reverse +from django.utils.encoding import force_str, iri_to_uri +from django.utils.html import escape, format_html, smart_urlquote +~~from django.utils.safestring import SafeData, mark_safe + +from rest_framework.compat import apply_markdown, pygments_highlight +from rest_framework.renderers import HTMLFormRenderer +from rest_framework.utils.urls import replace_query_param + +register = template.Library() + +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +@register.tag(name='code') +def highlight_code(parser, token): + code = token.split_contents()[-1] + nodelist = parser.parse(('endcode',)) + parser.delete_first_token() + return CodeNode(code, nodelist) + + +class CodeNode(template.Node): + style = 'emacs' + + def __init__(self, lang, code): + self.lang = lang + self.nodelist = code + + +## ... source file abbreviated to get to mark_safe examples ... + + + text = self.nodelist.render(context) + return pygments_highlight(text, self.lang, self.style) + + +@register.filter() +def with_location(fields, location): + return [ + field for field in fields + if field.location == location + ] + + +@register.simple_tag +def form_for_link(link): + import coreschema + properties = OrderedDict([ + (field.name, field.schema or coreschema.String()) + for field in link.fields + ]) + required = [ + field.name + for field in link.fields + if field.required + ] + schema = coreschema.Object(properties=properties, required=required) +~~ return mark_safe(coreschema.render_to_form(schema)) + + +@register.simple_tag +def render_markdown(markdown_text): + if apply_markdown is None: + return markdown_text +~~ return mark_safe(apply_markdown(markdown_text)) + + +@register.simple_tag +def get_pagination_html(pager): + return pager.to_html() + + +@register.simple_tag +def render_form(serializer, template_pack=None): + style = {'template_pack': template_pack} if template_pack else {} + renderer = HTMLFormRenderer() + return renderer.render(serializer.data, None, {'style': style}) + + +@register.simple_tag +def render_field(field, style): + renderer = style.get('renderer', HTMLFormRenderer()) + return renderer.render_field(field, style) + + +@register.simple_tag +def optional_login(request): + try: + login_url = reverse('rest_framework:login') + except NoReverseMatch: + return '' + + snippet = "
  • Log in
  • " + snippet = format_html(snippet, href=login_url, next=escape(request.path)) + +~~ return mark_safe(snippet) + + +@register.simple_tag +def optional_docs_login(request): + try: + login_url = reverse('rest_framework:login') + except NoReverseMatch: + return 'log in' + + snippet = "log in" + snippet = format_html(snippet, href=login_url, next=escape(request.path)) + +~~ return mark_safe(snippet) + + +@register.simple_tag +def optional_logout(request, user): + try: + logout_url = reverse('rest_framework:logout') + except NoReverseMatch: + snippet = format_html('', user=escape(user)) +~~ return mark_safe(snippet) + + snippet = """""" + snippet = format_html(snippet, user=escape(user), href=logout_url, next=escape(request.path)) + +~~ return mark_safe(snippet) + + +@register.simple_tag +def add_query_param(request, key, val): + iri = request.get_full_path() + uri = iri_to_uri(iri) + return escape(replace_query_param(uri, key, val)) + + +@register.filter +def as_string(value): + if value is None: + return '' + return '%s' % value + + +@register.filter +def as_list_of_strings(value): + return [ + '' if (item is None) else ('%s' % item) + for item in value + ] + + +@register.filter +def add_class(value, css_class): + html = str(value) + match = class_re.search(html) + if match: + m = re.search(r'^%s$|^%s\s|\s%s\s|\s%s$' % (css_class, css_class, + css_class, css_class), + match.group(1)) + if not m: +~~ return mark_safe(class_re.sub(match.group(1) + " " + css_class, + html)) + else: +~~ return mark_safe(html.replace('>', ' class="%s">' % css_class, 1)) + return value + + +@register.filter +def format_value(value): + if getattr(value, 'is_hyperlink', False): + name = str(value.obj) +~~ return mark_safe('%s' % (value, escape(name))) + if value is None or isinstance(value, bool): +~~ return mark_safe('%s' % {True: 'true', False: 'false', None: 'null'}[value]) + elif isinstance(value, list): + if any([isinstance(item, (list, dict)) for item in value]): + template = loader.get_template('rest_framework/admin/list_value.html') + else: + template = loader.get_template('rest_framework/admin/simple_list_value.html') + context = {'value': value} + return template.render(context) + elif isinstance(value, dict): + template = loader.get_template('rest_framework/admin/dict_value.html') + context = {'value': value} + return template.render(context) + elif isinstance(value, str): + if ( + (value.startswith('http:') or value.startswith('https:')) and not + re.search(r'\s', value) + ): +~~ return mark_safe('{value}'.format(value=escape(value))) + elif '@' in value and not re.search(r'\s', value): +~~ return mark_safe('{value}'.format(value=escape(value))) + elif '\n' in value: +~~ return mark_safe('
    %s
    ' % escape(value)) + return str(value) + + +@register.filter +def items(value): + if value is None: + return [] + return value.items() + + +@register.filter +def data(value): + return value.data + + +@register.filter +def schema_links(section, sec_key=None): + NESTED_FORMAT = '%s > %s' # this format is used in docs/js/api.js:normalizeKeys + links = section.links + if section.data: + data = section.data.items() + for sub_section_key, sub_section in data: + new_links = schema_links(sub_section, sec_key=sub_section_key) + links.update(new_links) + + +## ... source file abbreviated to get to mark_safe examples ... + + + url = None + nofollow_attr = ' rel="nofollow"' if nofollow else '' + if simple_url_re.match(middle): + url = smart_urlquote_wrapper(middle) + elif simple_url_2_re.match(middle): + url = smart_urlquote_wrapper('http://%s' % middle) + elif ':' not in middle and simple_email_re.match(middle): + local, domain = middle.rsplit('@', 1) + try: + domain = domain.encode('idna').decode('ascii') + except UnicodeError: + continue + url = 'mailto:%s@%s' % (local, domain) + nofollow_attr = '' + + if url: + trimmed = trim_url(middle) + lead, trail = conditional_escape(lead), conditional_escape(trail) + url, trimmed = conditional_escape(url), conditional_escape(trimmed) + middle = '%s' % (url, nofollow_attr, trimmed) + words[i] = '%s%s%s' % (lead, middle, trail) + else: + words[i] = conditional_escape(word) + else: + words[i] = conditional_escape(word) +~~ return mark_safe(''.join(words)) + + +@register.filter +def break_long_headers(header): + if len(header) > 160 and ',' in header: +~~ header = mark_safe('
    ' + ',
    '.join(header.split(','))) + return header + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 16 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / fields.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./fields.py) + +```python +# fields.py +from typing import Optional + +from django import template +from django.template.base import Parser, Token +from django.forms import ChoiceField +~~from django.utils.safestring import mark_safe + +from .compat import TOKEN_BLOCK +from .templatetags.sitetree import sitetree_tree +from .utils import get_tree_model, get_tree_item_model +from .settings import ITEMS_FIELD_ROOT_ID + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +class TreeItemChoiceField(ChoiceField): + template: str = 'admin/sitetree/tree/tree_combo.html' + root_title: str = '---------' + + def __init__( + self, + tree: 'TreeBase' = None, + required: bool = True, + widget=None, + label=None, + + +## ... source file abbreviated to get to mark_safe examples ... + + + if not tree: + return + + if isinstance(tree, MODEL_TREE_CLASS): + tree = tree.alias + + self.tree = tree + self.choices = self._build_choices() + + def _build_choices(self): + tree_token = f'sitetree_tree from "{self.tree}" template "{self.template}"' + + context_kwargs = {'current_app': 'admin'} + context = template.Context(context_kwargs) + context.update({'request': object()}) + + choices_str = sitetree_tree( + Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) + ).render(context) + + tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] + + for line in choices_str.splitlines(): + if line.strip(): + splitted = line.split(':::') +~~ tree_choices.append((splitted[0], mark_safe(splitted[1]))) + + return tree_choices + + def clean(self, value): + if not value: + return None + + try: + return MODEL_TREE_ITEM_CLASS.objects.get(pk=value) + + except MODEL_TREE_ITEM_CLASS.DoesNotExist: + return None + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 17 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / checkboxcolumn.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/checkboxcolumn.py) + +```python +# checkboxcolumn.py +~~from django.utils.safestring import mark_safe + +from django_tables2.utils import Accessor, AttributeDict + +from .base import Column, library + + +@library.register +class CheckBoxColumn(Column): + + def __init__(self, attrs=None, checked=None, **extra): + self.checked = checked + kwargs = {"orderable": False, "attrs": attrs} + kwargs.update(extra) + super().__init__(**kwargs) + + @property + def header(self): + default = {"type": "checkbox"} + general = self.attrs.get("input") + specific = self.attrs.get("th__input") + attrs = AttributeDict(default, **(specific or general or {})) +~~ return mark_safe("" % attrs.as_html()) + + def render(self, value, bound_column, record): + default = {"type": "checkbox", "name": bound_column.name, "value": value} + if self.is_checked(value, record): + default.update({"checked": "checked"}) + + general = self.attrs.get("input") + specific = self.attrs.get("td__input") + attrs = AttributeDict(default, **(specific or general or {})) +~~ return mark_safe("" % attrs.as_html()) + + def is_checked(self, value, record): + if self.checked is None: + return False + if self.checked is True: + return True + + if callable(self.checked): + return bool(self.checked(value, record)) + + checked = Accessor(self.checked) + if checked in record: + return bool(record[checked]) + return False + + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 18 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py + "WikiSlugField", + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +from django.urls import Resolver404, resolve +from django.utils import timezone +~~from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + def __init__(self, *args, **kwargs): + self.allow_unicode = kwargs.pop("allow_unicode", False) + + +## ... source file abbreviated to get to mark_safe examples ... + + + self.check_spam() + return self.cleaned_data + + +class SelectWidgetBootstrap(forms.Select): + + def __init__(self, attrs=None, choices=()): + if attrs is None: + attrs = {"class": ""} + elif "class" not in attrs: + attrs["class"] = "" + attrs["class"] += " form-control" + + super().__init__(attrs, choices) + + +class TextInputPrepend(forms.TextInput): + template_name = "wiki/forms/text.html" + + def __init__(self, *args, **kwargs): + self.prepend = kwargs.pop("prepend", "") + super().__init__(*args, **kwargs) + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) +~~ context["prepend"] = mark_safe(self.prepend) + return context + + +class CreateForm(forms.Form, SpamProtectionMixin): + def __init__(self, request, urlpath_parent, *args, **kwargs): + super().__init__(*args, **kwargs) + self.request = request + self.urlpath_parent = urlpath_parent + + title = forms.CharField(label=_("Title"),) + slug = WikiSlugField( + label=_("Slug"), + help_text=_( + "This will be the address where your article can be found. Use only alphanumeric characters and - or _.
    Note: If you change the slug later on, links pointing to this article are not updated." + ), + max_length=models.URLPath.SLUG_MAX_LENGTH, + ) + content = forms.CharField( + label=_("Contents"), required=False, widget=getEditor().get_widget() + ) # @UndefinedVariable + + summary = forms.CharField( + label=pgettext_lazy("Revision comment", "Summary"), + help_text=_("Write a brief message for the article's history log."), + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 19 from elasticsearch-django +[elasticsearch-django](https://github.com/yunojuno/elasticsearch-django) +([PyPI package information](https://pypi.org/project/elasticsearch-django/)) +is a [Django](/django.html) app for managing +[ElasticSearch](https://github.com/elastic/elasticsearch) indexes +populated by [Django ORM](/django-orm.html) models. The project is +available as open source under the +[MIT license](https://github.com/yunojuno/elasticsearch-django/blob/master/LICENSE). + +[**elasticsearch-django / elasticsearch_django / admin.py**](https://github.com/yunojuno/elasticsearch-django/blob/master/elasticsearch_django/./admin.py) + +```python +# admin.py +import logging + +import simplejson as json # simplejson supports Decimal serialization +from django.contrib import admin +from django.template.defaultfilters import truncatechars, truncatewords +~~from django.utils.safestring import mark_safe + +from .models import SearchQuery + +logger = logging.getLogger(__name__) + + +def pprint(data: dict) -> str: + pretty = json.dumps(data, sort_keys=True, indent=4, separators=(",", ": ")) + html = pretty.replace(" ", " ").replace("\n", "
    ") +~~ return mark_safe("%s" % html) + + +class SearchQueryAdmin(admin.ModelAdmin): + + list_display = ( + "id", + "user", + "search_terms_", + "total_hits", + "returned_", + "min_", + "max_", + "reference", + "executed_at", + ) + list_filter = ("index", "query_type") + search_fields = ("search_terms", "user__first_name", "user__last_name", "reference") + exclude = ("hits", "query", "page") + readonly_fields = ( + "user", + "index", + "search_terms", + "query_type", + "total_hits", + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 20 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / forms.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./forms.py) + +```python +# forms.py +from __future__ import unicode_literals + +import logging +import re +import collections +import datetime + +import django.forms +import django.forms.utils +import django.forms.widgets +import django.core.validators +import django.core.exceptions +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +~~from django.utils.safestring import mark_safe + +import form_utils.forms +import requests +import dateutil.parser +import validate_email + +logger = logging.getLogger(__name__) + + +REGISTRATION_CONFIGURATION_NAME = 'registration_configuration' + +RE_NON_DECIMAL = re.compile(r'[^\d]+') +RE_NON_ALPHA = re.compile('[\W]+') +RE_POSTAL_CODE = re.compile(r'^[0-9]{5}$') +validate_postal_code = django.core.validators.RegexValidator( + RE_POSTAL_CODE, _("Enter a valid postal code consisting 5 numbers."), 'invalid') + + +CHOICES_GENDER = ( + ('M', _('Male')), + ('F', _('Female')), +) + + + + +## ... source file abbreviated to get to mark_safe examples ... + + + + d = { + 'label': label, + } + + if field_type == 'string': + d['required'] = is_required + d['initial'] = initial + if choices and is_editable: + d['help_text'] = help_text + d['choices'] = choices + d['widget'] = django.forms.RadioSelect + field_class = django.forms.ChoiceField + elif field_name == 'email': + d['max_length'] = max_length + d['help_text'] = help_text + field_class = django.forms.EmailField + elif field_name == 'license_id' \ + and 'license_id_formats' in conf: + d['max_length'] = max_length + license_id_formats = '{}{}{}'.format( + _('

    Valid state License IDs should look like: '), + ', '.join(map(unicode, conf['license_id_formats'])), '

    ') + help_text = '{}{}{}'.format('

    ', unicode(help_text), '

    ') + license_id_formats = '{}{}'.format(license_id_formats, help_text) +~~ d['help_text'] = mark_safe(license_id_formats) + field_class = django.forms.CharField + else: + d['max_length'] = max_length + d['help_text'] = help_text + field_class = django.forms.CharField + elif field_type == 'date': + d['required'] = is_required + d['initial'] = initial + d['help_text'] = help_text + if min_value: + d['validators'] = [validate_date_generator(min_value), ] + field_class = django.forms.DateField + elif field_type == 'boolean': + has_booleans = True + d['initial'] = initial + if field_name == 'agree_to_tos': +~~ d['help_text'] = mark_safe(help_text) +~~ d['label'] = mark_safe(label) + else: + d['required'] = False + d['help_text'] = help_text + field_class = django.forms.BooleanField + else: + raise Exception('Unknown field type: {}'.format(field_type)) + + fields[field_name] = field_class(**d) + fieldset[1]['fields'].append(field_name) + + widget = fields[field_name].widget + if not is_editable: + if isinstance(widget, django.forms.Select): + widget.attrs['disabled'] = 'disabled' + else: + widget.attrs['readonly'] = 'readonly' + if field_type == 'date': + widget.attrs['placeholder'] = '__/__/____' + widget.attrs['class'] = 'date' + if field_name == 'phone_number': + widget.attrs['placeholder'] = '(___) ___-____' + widget.attrs['class'] = 'phonenumber' + if field_name == 'ssn': + widget.attrs['placeholder'] = '____' + + +## ... source file continues with no further mark_safe examples... + +``` + + +## Example 21 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / edit_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/edit_handlers.py) + +```python +# edit_handlers.py +from django.template.loader import render_to_string +~~from django.utils.safestring import mark_safe + +from wagtail.admin.edit_handlers import BaseChooserPanel + +from .widgets import AdminSnippetChooser + + +class SnippetChooserPanel(BaseChooserPanel): + object_type_name = 'item' + + def widget_overrides(self): + return {self.field_name: AdminSnippetChooser(model=self.target_model)} + + def render_as_field(self): + instance_obj = self.get_chosen_item() +~~ return mark_safe(render_to_string(self.field_template, { + 'field': self.bound_field, + self.object_type_name: instance_obj, + })) + + def on_model_bound(self): + super().on_model_bound() + self.target_model = self.db_field.remote_field.model + + + +## ... source file continues with no further mark_safe examples... + +``` + diff --git a/content/pages/examples/django/django-utils-safestring-safedata.markdown b/content/pages/examples/django/django-utils-safestring-safedata.markdown new file mode 100644 index 000000000..c271f8d28 --- /dev/null +++ b/content/pages/examples/django/django-utils-safestring-safedata.markdown @@ -0,0 +1,238 @@ +title: django.utils.safestring SafeData Example Code +category: page +slug: django-utils-safestring-safedata-examples +sortorder: 500011484 +toc: False +sidebartitle: django.utils.safestring SafeData +meta: Python example code for the SafeData class from the django.utils.safestring module of the Django project. + + +SafeData is a class within the django.utils.safestring module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +from django.utils.module_loading import import_string +~~from django.utils.safestring import mark_safe, SafeText, SafeData +from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +~~class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): + return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + message = list(error)[0] + errors.append({ + 'message': escape(message) if escape_html else message, + 'code': error.code or '', + }) + return errors + + + +## ... source file continues with no further SafeData examples... + +``` + + +## Example 2 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / templatetags / rest_framework.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/templatetags/rest_framework.py) + +```python +# rest_framework.py +import re +from collections import OrderedDict + +from django import template +from django.template import loader +from django.urls import NoReverseMatch, reverse +from django.utils.encoding import force_str, iri_to_uri +from django.utils.html import escape, format_html, smart_urlquote +~~from django.utils.safestring import SafeData, mark_safe + +from rest_framework.compat import apply_markdown, pygments_highlight +from rest_framework.renderers import HTMLFormRenderer +from rest_framework.utils.urls import replace_query_param + +register = template.Library() + +class_re = re.compile(r'(?<=class=["\'])(.*)(?=["\'])') + + +@register.tag(name='code') +def highlight_code(parser, token): + code = token.split_contents()[-1] + nodelist = parser.parse(('endcode',)) + parser.delete_first_token() + return CodeNode(code, nodelist) + + +class CodeNode(template.Node): + style = 'emacs' + + def __init__(self, lang, code): + self.lang = lang + self.nodelist = code + + +## ... source file continues with no further SafeData examples... + +``` + + +## Example 3 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / base.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/base.py) + +```python +# base.py +from collections import OrderedDict +from itertools import islice + +from django.core.exceptions import ImproperlyConfigured +from django.urls import reverse +from django.utils.html import format_html +~~from django.utils.safestring import SafeData +from django.utils.text import capfirst + +from ..utils import ( + Accessor, + AttributeDict, + OrderBy, + OrderByTuple, + call_with_appropriate, + computed_values, +) + + +class Library: + + def __init__(self): + self.columns = [] + + def register(self, column): + if not hasattr(column, "from_field"): + raise ImproperlyConfigured( + "{} is not a subclass of Column".format(column.__class__.__name__) + ) + self.columns.append(column) + return column + + +## ... source file abbreviated to get to SafeData examples ... + + + def is_ordered(self): + return self.name in (self._table.order_by or ()) + + @property + def orderable(self): + if self.column.orderable is not None: + return self.column.orderable + return self._table.orderable + + @property + def verbose_name(self): + if self.column.verbose_name is not None: + return self.column.verbose_name + + name = self.name.replace("_", " ") + + model = self._table.data.model + if model: + field = Accessor(self.accessor).get_field(model) + if field: + if hasattr(field, "field"): + name = field.field.verbose_name + else: + name = getattr(field, "verbose_name", field.name) + +~~ if isinstance(name, SafeData): + return name + + return capfirst(name) + + @property + def visible(self): + return self.column.visible + + @property + def localize(self): + return self.column.localize + + +class BoundColumns: + + def __init__(self, table, base_columns): + self._table = table + self.columns = OrderedDict() + for name, column in base_columns.items(): + self.columns[name] = bound_column = BoundColumn(table, column, name) + bound_column.render = getattr(table, "render_" + name, column.render) + bound_column.value = getattr( + table, "value_" + name, getattr(table, "render_" + name, column.value) + ) + + +## ... source file continues with no further SafeData examples... + +``` + diff --git a/content/pages/examples/django/django-utils-safestring-safetext.markdown b/content/pages/examples/django/django-utils-safestring-safetext.markdown new file mode 100644 index 000000000..705923248 --- /dev/null +++ b/content/pages/examples/django/django-utils-safestring-safetext.markdown @@ -0,0 +1,107 @@ +title: django.utils.safestring SafeText Example Code +category: page +slug: django-utils-safestring-safetext-examples +sortorder: 500011485 +toc: False +sidebartitle: django.utils.safestring SafeText +meta: Python example code for the SafeText class from the django.utils.safestring module of the Django project. + + +SafeText is a class within the django.utils.safestring module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +from django.utils.module_loading import import_string +~~from django.utils.safestring import mark_safe, SafeText, SafeData +from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): + return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + message = list(error)[0] + errors.append({ + 'message': escape(message) if escape_html else message, + 'code': error.code or '', + }) + return errors + + def as_json(self, escape_html=False): + return json.dumps(self.get_json_data(escape_html)) + + def extend(self, iterable): + for item in iterable: + if not isinstance(item, str): + self.append(item) + return None + + def as_ul(self): + if not self: +~~ return SafeText() + first = self[0] + if isinstance(first, tuple): + error_lists = {'$pristine': [], '$dirty': []} + for e in self: + if e[5] == '$message': + li_format = '
  • ' + else: + li_format = '
  • {3}
  • ' + err_tuple = (e[0], e[3], e[4], force_text(e[5])) + error_lists[e[2]].append(format_html(li_format, *err_tuple)) + dirty_errors, pristine_errors = '', '' + if len(error_lists['$dirty']) > 0: + dirty_errors = format_html( + '
      {2}
    ', # duck typing: !...$untouched + first[0], first[1], mark_safe(''.join(error_lists['$dirty'])) + ) + if len(error_lists['$pristine']) > 0: + pristine_errors = format_html( + '
      {2}
    ', + first[0], first[1], mark_safe(''.join(error_lists['$pristine'])) + ) + return format_html('{}{}', dirty_errors, pristine_errors) + return format_html('
      {0}
    ', + format_html_join('', '
  • {0}
  • ', ((force_text(e),) for e in self))) + + +## ... source file continues with no further SafeText examples... + +``` + diff --git a/content/pages/examples/django/django-utils-termcolors-colorize.markdown b/content/pages/examples/django/django-utils-termcolors-colorize.markdown new file mode 100644 index 000000000..212495b15 --- /dev/null +++ b/content/pages/examples/django/django-utils-termcolors-colorize.markdown @@ -0,0 +1,89 @@ +title: django.utils.termcolors colorize Example Code +category: page +slug: django-utils-termcolors-colorize-examples +sortorder: 500011487 +toc: False +sidebartitle: django.utils.termcolors colorize +meta: Python example code for the colorize callable from the django.utils.termcolors module of the Django project. + + +colorize is a callable within the django.utils.termcolors module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / check.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/check.py) + +```python +# check.py +from contextlib import contextmanager +import inspect +from itertools import chain + +from django.conf import settings +from django.utils.decorators import method_decorator +~~from django.utils.termcolors import colorize +from sekizai.helpers import validate_template + +from cms import constants +from cms.models import AliasPluginModel +from cms.utils.conf import get_cms_setting +from cms.utils.compat.dj import is_installed + + +SUCCESS = 1 +WARNING = 2 +ERROR = 3 +SKIPPED = 4 + +CHECKERS = [] + + +class FileOutputWrapper(object): + def __init__(self, stdout, stderr): + self.stdout = stdout + self.stderr = stderr + self.section_wrapper = FileSectionWrapper + self.errors = 0 + self.successes = 0 + self.warnings = 0 + self.skips = 0 + +~~ def colorize(self, msg, opts=(), **kwargs): +~~ return colorize(msg, opts=opts, **kwargs) + + def write_line(self, message=''): + self.write(u'%s\n' % message) + + def write(self, message): + self.stdout.write(message) + + def write_stderr_line(self, message=''): + self.write_stderr(u'%s\n' % message) + + def write_stderr(self, message): + self.stderr.write(message) + + def success(self, message): + self.successes += 1 + self.write_line(u'%s %s' % (message, self.colorize('[OK]', fg='green', opts=['bold']))) + + def error(self, message): + self.errors += 1 + self.write_stderr_line(u'%s %s' % (message, self.colorize('[ERROR]', fg='red', opts=['bold']))) + + def warn(self, message): + self.warnings += 1 + self.write_stderr_line(u'%s %s' % (message, self.colorize('[WARNING]', fg='yellow', opts=['bold']))) + + +## ... source file continues with no further colorize examples... + +``` + diff --git a/content/pages/examples/django/django-utils-termcolors.markdown b/content/pages/examples/django/django-utils-termcolors.markdown new file mode 100644 index 000000000..6754d5cdf --- /dev/null +++ b/content/pages/examples/django/django-utils-termcolors.markdown @@ -0,0 +1,65 @@ +title: django.utils termcolors Example Code +category: page +slug: django-utils-termcolors-examples +sortorder: 500011420 +toc: False +sidebartitle: django.utils termcolors +meta: Python example code for the termcolors callable from the django.utils module of the Django project. + + +termcolors is a callable within the django.utils module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / management / color.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/color.py) + +```python +# color.py + +from django.core.management import color +~~from django.utils import termcolors + + +def _dummy_style_func(msg): + return msg + + +def no_style(): + style = color.no_style() + for role in ('INFO', 'WARN', 'BOLD', 'URL', 'MODULE', 'MODULE_NAME', 'URL_NAME'): + setattr(style, role, _dummy_style_func) + return style + + +def color_style(): + if color.supports_color(): + style = color.color_style() +~~ style.INFO = termcolors.make_style(fg='green') +~~ style.WARN = termcolors.make_style(fg='yellow') +~~ style.BOLD = termcolors.make_style(opts=('bold',)) +~~ style.URL = termcolors.make_style(fg='green', opts=('bold',)) +~~ style.MODULE = termcolors.make_style(fg='yellow') +~~ style.MODULE_NAME = termcolors.make_style(opts=('bold',)) +~~ style.URL_NAME = termcolors.make_style(fg='red') + else: + style = no_style() + return style + + + +## ... source file continues with no further termcolors examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-capfirst.markdown b/content/pages/examples/django/django-utils-text-capfirst.markdown new file mode 100644 index 000000000..f40a7e5ca --- /dev/null +++ b/content/pages/examples/django/django-utils-text-capfirst.markdown @@ -0,0 +1,990 @@ +title: django.utils.text capfirst Example Code +category: page +slug: django-utils-text-capfirst-examples +sortorder: 500011489 +toc: False +sidebartitle: django.utils.text capfirst +meta: Python example code for the capfirst callable from the django.utils.text module of the Django project. + + +capfirst is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / utils.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./utils.py) + +```python +# utils.py +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import FieldDoesNotExist, FieldError +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.expressions import Expression +from django.db.models.fields.related import ForeignObjectRel, RelatedField +from django.utils import timezone +from django.utils.encoding import force_str +~~from django.utils.text import capfirst +from django.utils.translation import gettext as _ + +from .exceptions import FieldLookupError + + +def deprecate(msg, level_modifier=0): + warnings.warn(msg, MigrationNotice, stacklevel=3 + level_modifier) + + +class MigrationNotice(DeprecationWarning): + url = 'https://django-filter.readthedocs.io/en/master/guide/migration.html' + + def __init__(self, message): + super().__init__('%s See: %s' % (message, self.url)) + + +class RenameAttributesBase(type): + renamed_attributes = () + + def __new__(metacls, name, bases, attrs): + old_names = [r[0] for r in metacls.renamed_attributes] + old_names = [name for name in old_names if name in attrs] + old_attrs = {name: attrs.pop(name) for name in old_names} + + + +## ... source file abbreviated to get to capfirst examples ... + + + names.append(force_str(part.verbose_name)) + + return ' '.join(names) + + +def verbose_lookup_expr(lookup_expr): + from .conf import settings as app_settings + + VERBOSE_LOOKUPS = app_settings.VERBOSE_LOOKUPS or {} + lookups = [ + force_str(VERBOSE_LOOKUPS.get(lookup, _(lookup))) + for lookup in lookup_expr.split(LOOKUP_SEP) + ] + + return ' '.join(lookups) + + +def label_for_filter(model, field_name, lookup_expr, exclude=False): + name = verbose_field_name(model, field_name) + verbose_expression = [_('exclude'), name] if exclude else [name] + + if isinstance(lookup_expr, str): + verbose_expression += [verbose_lookup_expr(lookup_expr)] + + verbose_expression = [force_str(part) for part in verbose_expression if part] +~~ verbose_expression = capfirst(' '.join(verbose_expression)) + + return verbose_expression + + +def translate_validation(error_dict): + from rest_framework.exceptions import ValidationError, ErrorDetail + + exc = OrderedDict( + (key, [ErrorDetail(e.message % (e.params or ()), code=e.code) + for e in error_list]) + for key, error_list in error_dict.as_data().items() + ) + + return ValidationError(exc) + + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 2 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / forms.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./forms.py) + +```python +# forms.py +from django import forms +from django.utils.encoding import smart_text +~~from django.utils.text import capfirst +from django.utils.translation import ugettext_lazy as _ + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import EmptySearchQuerySet, SearchQuerySet +from haystack.utils import get_model_ct +from haystack.utils.app_loading import haystack_get_model + + +def model_choices(using=DEFAULT_ALIAS): + choices = [ +~~ (get_model_ct(m), capfirst(smart_text(m._meta.verbose_name_plural))) + for m in connections[using].get_unified_index().get_indexed_models() + ] + return sorted(choices, key=lambda x: x[1]) + + +class SearchForm(forms.Form): + q = forms.CharField( + required=False, + label=_("Search"), + widget=forms.TextInput(attrs={"type": "search"}), + ) + + def __init__(self, *args, **kwargs): + self.searchqueryset = kwargs.pop("searchqueryset", None) + self.load_all = kwargs.pop("load_all", False) + + if self.searchqueryset is None: + self.searchqueryset = SearchQuerySet() + + super(SearchForm, self).__init__(*args, **kwargs) + + def no_query_found(self): + return EmptySearchQuerySet() + + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 3 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / admin.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./admin.py) + +```python +# admin.py +from django.apps import apps +from django.contrib import admin +from django.http import HttpResponse +from django.shortcuts import redirect +from django.urls import reverse +from django.utils.safestring import mark_safe +~~from django.utils.text import capfirst +from django.utils.translation import ugettext_lazy as _ + + +class InlineActionException(Exception): + pass + + +class ActionNotCallable(InlineActionException): + def __init__(self, model_admin, action, *args, **kwargs): + super().__init__(*args, **kwargs) + self.model_admin = model_admin + self.action = action + + +class BaseInlineActionsMixin: + INLINE_MODEL_ADMIN = 'inline' + MODEL_ADMIN = 'admin' + + inline_actions = [] + + def get_inline_actions(self, request, obj=None): + if self.inline_actions is None: + return [] + + + +## ... source file abbreviated to get to capfirst examples ... + + + + if isinstance(model_admin, admin.options.InlineModelAdmin): + return self.INLINE_MODEL_ADMIN + return self.MODEL_ADMIN + + def render_inline_actions(self, obj=None): # NOQA: C901 + if not (obj and obj.pk): + return '' + + buttons = [] + for action_name in self.get_inline_actions(self._request, obj): + action_func = getattr(self, action_name, None) + if not action_func: + raise RuntimeError( + "Could not find action `{}`".format(action_name)) + + action_name = action_func.__name__ + label_handler = getattr( + self, 'get_{}_label'.format(action_name), None) + if callable(label_handler): + description = label_handler(obj=obj) + else: + try: + description = action_func.short_description + except AttributeError: +~~ description = capfirst(action_name.replace('_', ' ')) + + css_handler = getattr( + self, 'get_{}_css'.format(action_name), None) + if callable(css_handler): + css_classes = css_handler(obj=obj) + else: + try: + css_classes = action_func.css_classes + except AttributeError: + css_classes = '' + + action_data = [ + self.__class__.__name__.lower(), + self._get_admin_type(), + action_name, + obj._meta.app_label, + obj._meta.model_name, + str(obj.pk), + ] + buttons.append( + ''.format( + '_action__{}'.format('__'.join(action_data)), + description, + css_classes, + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 4 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +~~from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + request = context['request'] + + app_dict = {} + for model, model_admin in admin_site._registry.items(): + app_label = model._meta.app_label + try: + has_module_perms = model_admin.has_module_permission(request) + except AttributeError: + has_module_perms = request.user.has_module_perms(app_label) # Fix Django < 1.8 issue + + if has_module_perms: + perms = model_admin.get_model_perms(request) + + if True in perms.values(): + info = (app_label, model._meta.model_name) + model_dict = { +~~ 'name': capfirst(model._meta.verbose_name_plural), + 'object_name': model._meta.object_name, + 'perms': perms, + 'model_name': model._meta.model_name + } + if perms.get('change', False): + try: + model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if perms.get('add', False): + try: + model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if app_label in app_dict: + app_dict[app_label]['models'].append(model_dict) + else: + try: + name = apps.get_app_config(app_label).verbose_name + except NameError: + name = app_label.title() + app_dict[app_label] = { + 'name': name, + 'app_label': app_label, + + +## ... source file abbreviated to get to capfirst examples ... + + + + split = language_code.split('-', 2) + if len(split) == 2: + language_code = '%s-%s' % (split[0].lower(), split[1].upper()) if split[0] != split[1] else split[0] + + language_codes.append(language_code) + + if len(split) == 2: + language_codes.append(split[0].lower()) + + return language_codes + + +def get_original_menu_items(context): + if context.get('user') and user_is_authenticated(context['user']): + pinned_apps = PinnedApplication.objects.filter(user=context['user'].pk).values_list('app_label', flat=True) + else: + pinned_apps = [] + + original_app_list = get_app_list(context) + + return map(lambda app: { + 'app_label': app['app_label'], + 'url': app['app_url'], + 'url_blank': False, +~~ 'label': app.get('name', capfirst(_(app['app_label']))), + 'has_perms': app.get('has_module_perms', False), + 'models': list(map(lambda model: { + 'url': model.get('admin_url'), + 'url_blank': False, + 'name': model['model_name'], + 'object_name': model['object_name'], + 'label': model.get('name', model['object_name']), + 'has_perms': any(model.get('perms', {}).values()), + }, app['models'])), + 'pinned': app['app_label'] in pinned_apps, + 'custom': False + }, original_app_list) + + +def get_menu_item_url(url, original_app_list): + if isinstance(url, dict): + url_type = url.get('type') + + if url_type == 'app': + return original_app_list[url['app_label']]['url'] + elif url_type == 'model': + models = dict(map( + lambda x: (x['name'], x['url']), + original_app_list[url['app_label']]['models'] + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 5 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / utils / field_mapping.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/utils/field_mapping.py) + +```python +# field_mapping.py +import inspect + +from django.core import validators +from django.db import models +~~from django.utils.text import capfirst + +from rest_framework.compat import postgres_fields +from rest_framework.validators import UniqueValidator + +NUMERIC_FIELD_TYPES = ( + models.IntegerField, models.FloatField, models.DecimalField, models.DurationField, +) + + +class ClassLookupDict: + def __init__(self, mapping): + self.mapping = mapping + + def __getitem__(self, key): + if hasattr(key, '_proxy_class'): + base_class = key._proxy_class + else: + base_class = key.__class__ + + for cls in inspect.getmro(base_class): + if cls in self.mapping: + return self.mapping[cls] + raise KeyError('Class %s not found in lookup.' % base_class.__name__) + + def __setitem__(self, key, value): + self.mapping[key] = value + + +def needs_label(model_field, field_name): + default_label = field_name.replace('_', ' ').capitalize() +~~ return capfirst(model_field.verbose_name) != default_label + + +def get_detail_view_name(model): + return '%(model_name)s-detail' % { + 'app_label': model._meta.app_label, + 'model_name': model._meta.object_name.lower() + } + + +def get_field_kwargs(field_name, model_field): + kwargs = {} + validator_kwarg = list(model_field.validators) + + kwargs['model_field'] = model_field + + if model_field.verbose_name and needs_label(model_field, field_name): +~~ kwargs['label'] = capfirst(model_field.verbose_name) + + if model_field.help_text: + kwargs['help_text'] = model_field.help_text + + max_digits = getattr(model_field, 'max_digits', None) + if max_digits is not None: + kwargs['max_digits'] = max_digits + + decimal_places = getattr(model_field, 'decimal_places', None) + if decimal_places is not None: + kwargs['decimal_places'] = decimal_places + + if isinstance(model_field, models.SlugField): + kwargs['allow_unicode'] = model_field.allow_unicode + + if isinstance(model_field, models.TextField) and not model_field.choices or \ + (postgres_fields and isinstance(model_field, postgres_fields.JSONField)): + kwargs['style'] = {'base_template': 'textarea.html'} + + if isinstance(model_field, models.AutoField) or not model_field.editable: + kwargs['read_only'] = True + return kwargs + + if model_field.has_default() or model_field.blank or model_field.null: + + +## ... source file abbreviated to get to capfirst examples ... + + +def get_relation_kwargs(field_name, relation_info): + model_field, related_model, to_many, to_field, has_through_model, reverse = relation_info + kwargs = { + 'queryset': related_model._default_manager, + 'view_name': get_detail_view_name(related_model) + } + + if to_many: + kwargs['many'] = True + + if to_field: + kwargs['to_field'] = to_field + + limit_choices_to = model_field and model_field.get_limit_choices_to() + if limit_choices_to: + if not isinstance(limit_choices_to, models.Q): + limit_choices_to = models.Q(**limit_choices_to) + kwargs['queryset'] = kwargs['queryset'].filter(limit_choices_to) + + if has_through_model: + kwargs['read_only'] = True + kwargs.pop('queryset', None) + + if model_field: + if model_field.verbose_name and needs_label(model_field, field_name): +~~ kwargs['label'] = capfirst(model_field.verbose_name) + help_text = model_field.help_text + if help_text: + kwargs['help_text'] = help_text + if not model_field.editable: + kwargs['read_only'] = True + kwargs.pop('queryset', None) + if kwargs.get('read_only', False): + return kwargs + + if model_field.has_default() or model_field.blank or model_field.null: + kwargs['required'] = False + if model_field.null: + kwargs['allow_null'] = True + if model_field.validators: + kwargs['validators'] = model_field.validators + if getattr(model_field, 'unique', False): + validator = UniqueValidator(queryset=model_field.model._default_manager) + kwargs['validators'] = kwargs.get('validators', []) + [validator] + if to_many and not model_field.blank: + kwargs['allow_empty'] = False + + return kwargs + + + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 6 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / base.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/base.py) + +```python +# base.py +from collections import OrderedDict +from itertools import islice + +from django.core.exceptions import ImproperlyConfigured +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import SafeData +~~from django.utils.text import capfirst + +from ..utils import ( + Accessor, + AttributeDict, + OrderBy, + OrderByTuple, + call_with_appropriate, + computed_values, +) + + +class Library: + + def __init__(self): + self.columns = [] + + def register(self, column): + if not hasattr(column, "from_field"): + raise ImproperlyConfigured( + "{} is not a subclass of Column".format(column.__class__.__name__) + ) + self.columns.append(column) + return column + + def column_for_field(self, field, **kwargs): + if field is None: + return self.columns[0](**kwargs) + + for candidate in reversed(self.columns): + if hasattr(field, "get_related_field"): + verbose_name = field.get_related_field().verbose_name + else: + verbose_name = getattr(field, "verbose_name", field.name) +~~ kwargs["verbose_name"] = capfirst(verbose_name) + column = candidate.from_field(field, **kwargs) + if column is None: + continue + return column + + +library = Library() + + +class LinkTransform: + + viewname = None + accessor = None + attrs = None + + def __init__(self, url=None, accessor=None, attrs=None, reverse_args=None): + self.url = url + self.attrs = attrs + self.accessor = accessor + + if isinstance(reverse_args, (list, tuple)): + viewname, args = reverse_args + reverse_args = {"viewname": viewname} + reverse_args["kwargs" if isinstance(args, dict) else "args"] = args + + +## ... source file abbreviated to get to capfirst examples ... + + + @property + def orderable(self): + if self.column.orderable is not None: + return self.column.orderable + return self._table.orderable + + @property + def verbose_name(self): + if self.column.verbose_name is not None: + return self.column.verbose_name + + name = self.name.replace("_", " ") + + model = self._table.data.model + if model: + field = Accessor(self.accessor).get_field(model) + if field: + if hasattr(field, "field"): + name = field.field.verbose_name + else: + name = getattr(field, "verbose_name", field.name) + + if isinstance(name, SafeData): + return name + +~~ return capfirst(name) + + @property + def visible(self): + return self.column.visible + + @property + def localize(self): + return self.column.localize + + +class BoundColumns: + + def __init__(self, table, base_columns): + self._table = table + self.columns = OrderedDict() + for name, column in base_columns.items(): + self.columns[name] = bound_column = BoundColumn(table, column, name) + bound_column.render = getattr(table, "render_" + name, column.render) + bound_column.value = getattr( + table, "value_" + name, getattr(table, "render_" + name, column.value) + ) + bound_column.order = getattr(table, "order_" + name, column.order) + + def iternames(self): + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 7 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / managers.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./managers.py) + +```python +# managers.py +import uuid +from operator import attrgetter + +from django import VERSION +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.db import connections, models, router +from django.db.models import signals +from django.db.models.fields.related import ( + ManyToManyRel, + OneToOneRel, + RelatedField, + lazy_related_operation, +) +from django.db.models.query_utils import PathInfo +~~from django.utils.text import capfirst +from django.utils.translation import gettext_lazy as _ + +from taggit.forms import TagField +from taggit.models import ( + CommonGenericTaggedItemBase, + GenericUUIDTaggedItemBase, + TaggedItem, +) +from taggit.utils import require_instance_manager + + +class ExtraJoinRestriction: + + contains_aggregate = False + + def __init__(self, alias, col, content_types): + self.alias = alias + self.col = col + self.content_types = content_types + + def as_sql(self, compiler, connection): + qn = compiler.quote_name_unless_alias + if len(self.content_types) == 1: + extra_where = "{}.{} = %s".format(qn(self.alias), qn(self.col)) + + +## ... source file abbreviated to get to capfirst examples ... + + + ) + + if not self.remote_field.model: + self.remote_field.model = self.through._meta.get_field( + "tag" + ).remote_field.model + + if self.use_gfk: + tagged_items = GenericRelation(self.through) + tagged_items.contribute_to_class(cls, "tagged_items") + + for rel in cls._meta.local_many_to_many: + if rel == self or not isinstance(rel, TaggableManager): + continue + if rel.through == self.through: + raise ValueError( + "You can't have two TaggableManagers with the" + " same through model." + ) + + def save_form_data(self, instance, value): + getattr(instance, self.name).set(*value) + + def formfield(self, form_class=TagField, **kwargs): + defaults = { +~~ "label": capfirst(self.verbose_name), + "help_text": self.help_text, + "required": not self.blank, + } + defaults.update(kwargs) + return form_class(**defaults) + + def value_from_object(self, obj): + if obj.pk is None: + return [] + qs = self.through.objects.select_related("tag").filter( + **self.through.lookup_kwargs(obj) + ) + return [ti.tag for ti in qs] + + def m2m_reverse_name(self): + return self.through._meta.get_field("tag").column + + def m2m_reverse_field_name(self): + return self.through._meta.get_field("tag").name + + def m2m_target_field_name(self): + return self.model._meta.pk.name + + def m2m_reverse_target_field_name(self): + + +## ... source file continues with no further capfirst examples... + +``` + + +## Example 8 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py) + +```python +# models.py +import json +import logging +from collections import defaultdict +from io import StringIO +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core import checks +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.handlers.base import BaseHandler +from django.core.handlers.wsgi import WSGIRequest +from django.db import models, transaction +from django.db.models import Case, Q, Value, When +from django.db.models.functions import Concat, Lower, Substr +from django.http import Http404 +from django.http.request import split_domain_port +from django.template.response import TemplateResponse +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.cache import patch_cache_control +from django.utils.functional import cached_property +~~from django.utils.text import capfirst, slugify +from django.utils.translation import gettext_lazy as _ +from modelcluster.models import ( + ClusterableModel, get_all_child_m2m_relations, get_all_child_relations) +from treebeard.mp_tree import MP_Node + +from wagtail.core.query import PageQuerySet, TreeQuerySet +from wagtail.core.signals import page_published, page_unpublished, post_page_move, pre_page_move +from wagtail.core.sites import get_site_for_hostname +from wagtail.core.url_routing import RouteResult +from wagtail.core.utils import WAGTAIL_APPEND_SLASH, camelcase_to_underscore, resolve_model_string +from wagtail.search import index + + +logger = logging.getLogger('wagtail.core') + +PAGE_TEMPLATE_VAR = 'page' + + +class SiteManager(models.Manager): + def get_queryset(self): + return super(SiteManager, self).get_queryset().order_by(Lower("hostname")) + + def get_by_natural_key(self, hostname, port): + return self.get(hostname=hostname, port=port) + + +## ... source file abbreviated to get to capfirst examples ... + + + page_model for page_model in cls.allowed_subpage_models() + if page_model.is_creatable + ] + + @classmethod + def can_exist_under(cls, parent): + return cls in parent.specific_class.allowed_subpage_models() + + @classmethod + def can_create_at(cls, parent): + can_create = cls.is_creatable and cls.can_exist_under(parent) + + if cls.max_count is not None: + can_create = can_create and cls.objects.count() < cls.max_count + + if cls.max_count_per_parent is not None: + can_create = can_create and parent.get_children().type(cls).count() < cls.max_count_per_parent + + return can_create + + def can_move_to(self, parent): + return self.can_exist_under(parent) + + @classmethod + def get_verbose_name(cls): +~~ return capfirst(cls._meta.verbose_name) + + @property + def status_string(self): + if not self.live: + if self.expired: + return _("expired") + elif self.approved_schedule: + return _("scheduled") + else: + return _("draft") + else: + if self.approved_schedule: + return _("live + scheduled") + elif self.has_unpublished_changes: + return _("live + draft") + else: + return _("live") + + @property + def approved_schedule(self): + return self.revisions.exclude(approved_go_live_at__isnull=True).exists() + + def has_unpublished_subtree(self): + return (not self.live) and (not self.get_descendants().filter(live=True).exists()) + + +## ... source file continues with no further capfirst examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-format-lazy.markdown b/content/pages/examples/django/django-utils-text-format-lazy.markdown new file mode 100644 index 000000000..4480fe6c2 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-format-lazy.markdown @@ -0,0 +1,64 @@ +title: django.utils.text format_lazy Example Code +category: page +slug: django-utils-text-format-lazy-examples +sortorder: 500011490 +toc: False +sidebartitle: django.utils.text format_lazy +meta: Python example code for the format_lazy callable from the django.utils.text module of the Django project. + + +format_lazy is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / compatibility.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/compatibility.py) + +```python +# compatibility.py +from __future__ import absolute_import, unicode_literals + +import sys + +from django.utils import six +from django.utils.functional import keep_lazy +~~from django.utils.text import Truncator, format_lazy + + +def string_concat(*strings): +~~ return format_lazy('{}' * len(strings), *strings) + + +def truncate_words(s, num, end_text='...'): + truncate = end_text and ' %s' % end_text or '' + return Truncator(s).words(num, truncate=truncate) + + +truncate_words = keep_lazy(truncate_words, six.text_type) + + +if not six.PY3: + fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def upath(path): + if six.PY2 and not isinstance(path, six.text_type): + return path.decode(fs_encoding) + return path + + +def get_delete_permission(opts): + from django.contrib.auth import get_permission_codename # noqa + return '%s.%s' % (opts.app_label, get_permission_codename('delete', opts)) + + + +## ... source file continues with no further format_lazy examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-get-text-list.markdown b/content/pages/examples/django/django-utils-text-get-text-list.markdown new file mode 100644 index 000000000..ff9b4f286 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-get-text-list.markdown @@ -0,0 +1,128 @@ +title: django.utils.text get_text_list Example Code +category: page +slug: django-utils-text-get-text-list-examples +sortorder: 500011491 +toc: False +sidebartitle: django.utils.text get_text_list +meta: Python example code for the get_text_list callable from the django.utils.text module of the Django project. + + +get_text_list is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / __init__.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/__init__.py) + +```python +# __init__.py +import six +import operator +from functools import update_wrapper +from six.moves import reduce +from typing import Tuple, Dict, Callable # NOQA + +from django.apps import apps +from django.http import HttpResponse, HttpResponseNotFound +from django.conf import settings +from django.db import models +from django.db.models.query import QuerySet +from django.utils.encoding import smart_str +from django.utils.translation import gettext as _ +~~from django.utils.text import get_text_list +from django.contrib import admin + +from django_extensions.admin.widgets import ForeignKeySearchInput + + +class ForeignKeyAutocompleteAdminMixin: + + related_search_fields = {} # type: Dict[str, Tuple[str]] + related_string_functions = {} # type: Dict[str, Callable] + autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) + + def get_urls(self): + from django.urls import path + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + return [ + path('foreignkey_autocomplete/', wrap(self.foreignkey_autocomplete), + name='%s_%s_autocomplete' % (self.model._meta.app_label, self.model._meta.model_name)) + ] + super().get_urls() + + + +## ... source file abbreviated to get to get_text_list examples ... + + + if additional_filter: + queryset = queryset.filter(additional_filter) + + if self.autocomplete_limit: + queryset = queryset[:self.autocomplete_limit] + + data = ''.join([six.u('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except Exception: # FIXME: use stricter exception checking + pass + else: + data = to_string_function(obj) + return HttpResponse(data, content_type='text/plain') + return HttpResponseNotFound() + + def get_related_filter(self, model, request): + return None + + def get_help_text(self, field_name, model_name): + searchable_fields = self.related_search_fields.get(field_name, None) + if searchable_fields: + help_kwargs = { + 'model_name': model_name, +~~ 'field_list': get_text_list(searchable_fields, _('and')), + } + return _('Use the left field to do %(model_name)s lookups in the fields %(field_list)s.') % help_kwargs + return '' + + def formfield_for_dbfield(self, db_field, **kwargs): + if isinstance(db_field, models.ForeignKey) and db_field.name in self.related_search_fields: + help_text = self.get_help_text(db_field.name, db_field.remote_field.model._meta.object_name) + if kwargs.get('help_text'): + help_text = six.u('%s %s' % (kwargs['help_text'], help_text)) + kwargs['widget'] = ForeignKeySearchInput(db_field.remote_field, self.related_search_fields[db_field.name]) + kwargs['help_text'] = help_text + return super().formfield_for_dbfield(db_field, **kwargs) + + +class ForeignKeyAutocompleteAdmin(ForeignKeyAutocompleteAdminMixin, admin.ModelAdmin): + pass + + +class ForeignKeyAutocompleteTabularInline(ForeignKeyAutocompleteAdminMixin, admin.TabularInline): + pass + + +class ForeignKeyAutocompleteStackedInline(ForeignKeyAutocompleteAdminMixin, admin.StackedInline): + pass + + +## ... source file continues with no further get_text_list examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-get-valid-filename.markdown b/content/pages/examples/django/django-utils-text-get-valid-filename.markdown new file mode 100644 index 000000000..ccc590d50 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-get-valid-filename.markdown @@ -0,0 +1,103 @@ +title: django.utils.text get_valid_filename Example Code +category: page +slug: django-utils-text-get-valid-filename-examples +sortorder: 500011492 +toc: False +sidebartitle: django.utils.text get_valid_filename +meta: Python example code for the get_valid_filename callable from the django.utils.text module of the Django project. + + +get_valid_filename is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / files.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/files.py) + +```python +# files.py +from __future__ import absolute_import, unicode_literals + +import os + +from django.http.multipartparser import ( + ChunkIter, SkipFile, StopFutureHandlers, StopUpload, exhaust, +) +from django.template.defaultfilters import slugify as slugify_django +from django.utils.encoding import force_text +~~from django.utils.text import get_valid_filename as get_valid_filename_django + +from unidecode import unidecode + + +class UploadException(Exception): + pass + + +def handle_upload(request): + if not request.method == "POST": + raise UploadException("AJAX request not valid: must be POST") + if request.is_ajax(): + is_raw = True + filename = request.GET.get('qqfile', False) or request.GET.get('filename', False) or '' + + try: + content_length = int(request.META['CONTENT_LENGTH']) + except (IndexError, TypeError, ValueError): + content_length = None + + if content_length < 0: + raise UploadException("Invalid content length: %r" % content_length) + + upload_handlers = request.upload_handlers + + +## ... source file abbreviated to get to get_valid_filename examples ... + + + + for i, handler in enumerate(upload_handlers): + file_obj = handler.file_complete(counters[i]) + if file_obj: + upload = file_obj + break + else: + if len(request.FILES) == 1: + upload, filename, is_raw = handle_request_files_upload(request) + else: + raise UploadException("AJAX request not valid: Bad Upload") + return upload, filename, is_raw + + +def handle_request_files_upload(request): + is_raw = False + upload = list(request.FILES.values())[0] + filename = upload.name + return upload, filename, is_raw + + +def slugify(string): + return slugify_django(unidecode(force_text(string))) + + +~~def get_valid_filename(s): + s = get_valid_filename_django(s) + filename, ext = os.path.splitext(s) + filename = slugify(filename) + ext = slugify(ext) + if ext: + return "%s.%s" % (filename, ext) + else: + return "%s" % (filename,) + + + +## ... source file continues with no further get_valid_filename examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-slugify.markdown b/content/pages/examples/django/django-utils-text-slugify.markdown new file mode 100644 index 000000000..739c0520a --- /dev/null +++ b/content/pages/examples/django/django-utils-text-slugify.markdown @@ -0,0 +1,562 @@ +title: django.utils.text slugify Example Code +category: page +slug: django-utils-text-slugify-examples +sortorder: 500011493 +toc: False +sidebartitle: django.utils.text slugify +meta: Python example code for the slugify callable from the django.utils.text module of the Django project. + + +slugify is a callable within the django.utils.text module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / forms / wizards.py**](https://github.com/divio/django-cms/blob/develop/cms/forms/wizards.py) + +```python +# wizards.py + +from __future__ import unicode_literals + +from django import forms +from django.core.exceptions import ValidationError +from django.db import transaction +~~from django.utils.text import slugify +from django.utils.translation import ( + ugettext, + ugettext_lazy as _, +) + +from cms.admin.forms import AddPageForm +from cms.plugin_pool import plugin_pool +from cms.utils import get_current_site, permissions +from cms.utils.page import get_available_slug +from cms.utils.page_permissions import ( + user_can_add_page, + user_can_add_subpage, +) +from cms.utils.conf import get_cms_setting +from cms.utils.urlutils import static_with_version + +try: + from djangocms_text_ckeditor.widgets import TextEditorWidget + text_widget = TextEditorWidget +except ImportError: + text_widget = forms.Textarea + + +class SlugWidget(forms.widgets.TextInput): + + +## ... source file abbreviated to get to slugify examples ... + + + super(CreateCMSPageForm, self).__init__(*args, **kwargs) + self.fields['title'].help_text = _(u"Provide a title for the new page.") + self.fields['slug'].required = False + self.fields['slug'].widget = SlugWidget() + self.fields['slug'].help_text = _(u"Leave empty for automatic slug, or override as required.") + + @staticmethod + def get_placeholder(page, slot=None): + placeholders = page.get_placeholders() + + if slot: + placeholders = placeholders.filter(slot=slot) + + for ph in placeholders: + if not ph.is_static and ph.is_editable: + return ph + + return None + + def clean(self): + data = self.cleaned_data + + if self._errors: + return data + +~~ slug = data.get('slug') or slugify(data['title']) + + parent_node = data.get('parent_node') + + if parent_node: + base = parent_node.item.get_path(self._language) + path = u'%s/%s' % (base, slug) if base else slug + else: + base = '' + path = slug + + data['slug'] = get_available_slug(self._site, path, self._language, suffix=None) + data['path'] = '%s/%s' % (base, data['slug']) if base else data['slug'] + + if not data['slug']: + raise forms.ValidationError("Please provide a valid slug.") + return data + + def clean_parent_node(self): + if self.page and self.sub_page_form: + parent_page = self.page + elif self.page and self.page.parent_page: + parent_page = self.page.parent_page + else: + parent_page = None + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 2 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 + from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +~~from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + kwargs.setdefault('content_type', 'application/json') + data = json.dumps(data, cls=encoder) + super(JsonResponse, self).__init__(content=data, **kwargs) + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + request = context['request'] + + app_dict = {} + for model, model_admin in admin_site._registry.items(): + + +## ... source file abbreviated to get to slugify examples ... + + + )) + + if name in models: + item = models[name].copy() + + if 'label' in data: + item['label'] = data['label'] + + if 'url' in data: + item['url'] = get_menu_item_url(data['url'], original_app_list) + + if 'url_blank' in data: + item['url_blank'] = data['url_blank'] + + if 'permissions' in data: + item['has_perms'] = item.get('has_perms', True) and context['user'].has_perms(data['permissions']) + + return item + + def get_menu_item_app(data): + app_label = data.get('app_label') + + if not app_label: + if 'label' not in data: + raise Exception('Custom menu items should at least have \'label\' or \'app_label\' key') +~~ app_label = 'custom_%s' % slugify(data['label'], allow_unicode=True) + + if app_label in original_app_list: + item = original_app_list[app_label].copy() + else: + item = {'app_label': app_label, 'has_perms': True} + + if 'label' in data: + item['label'] = data['label'] + + if 'items' in data: + item['items'] = list(map(lambda x: get_menu_item_app_model(app_label, x), data['items'])) + + if 'url' in data: + item['url'] = get_menu_item_url(data['url'], original_app_list) + + if 'url_blank' in data: + item['url_blank'] = data['url_blank'] + + if 'permissions' in data: + item['has_perms'] = item.get('has_perms', True) and context['user'].has_perms(data['permissions']) + + item['pinned'] = item['app_label'] in pinned_apps + + return item + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 3 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / exporters.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./exporters.py) + +```python +# exporters.py +from django.db import DatabaseError +from django.core.serializers.json import DjangoJSONEncoder +import json +import uuid +import string +import sys +from datetime import datetime +PY3 = sys.version_info[0] == 3 +if PY3: + import csv +else: + import unicodecsv as csv + +from django.utils.module_loading import import_string +~~from django.utils.text import slugify +from explorer import app_settings +from six import StringIO, BytesIO + + +def get_exporter_class(format): + class_str = dict(getattr(app_settings, 'EXPLORER_DATA_EXPORTERS'))[format] + return import_string(class_str) + + +class BaseExporter(object): + + name = '' + content_type = '' + file_extension = '' + + def __init__(self, query): + self.query = query + + def get_output(self, **kwargs): + value = self.get_file_output(**kwargs).getvalue() + if PY3: + return value + else: + return str(value) + + +## ... source file abbreviated to get to slugify examples ... + + + + row = 0 + col = 0 + header_style = wb.add_format({'bold': True}) + for header in res.header_strings: + ws.write(row, col, header, header_style) + col += 1 + + row = 1 + col = 0 + for data_row in res.data: + for data in data_row: + if isinstance(data, datetime) or isinstance(data, uuid.UUID): + data = str(data) + if isinstance(data, dict) or isinstance(data, list): + data = json.dumps(data) + ws.write(row, col, data) + col += 1 + row += 1 + col = 0 + + wb.close() + return output + + def _format_title(self): +~~ title = slugify(self.query.title) + return title[:31] + + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 4 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / models.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./models.py) + +```python +# models.py +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db import IntegrityError, models, router, transaction +~~from django.utils.text import slugify +from django.utils.translation import gettext, gettext_lazy as _ + +try: + from unidecode import unidecode +except ImportError: + + def unidecode(tag): + return tag + + +class TagBase(models.Model): + name = models.CharField(verbose_name=_("name"), unique=True, max_length=100) + slug = models.SlugField(verbose_name=_("slug"), unique=True, max_length=100) + + def __str__(self): + return self.name + + def __gt__(self, other): + return self.name.lower() > other.name.lower() + + def __lt__(self, other): + return self.name.lower() < other.name.lower() + + class Meta: + + +## ... source file abbreviated to get to slugify examples ... + + + using = kwargs.get("using") or router.db_for_write( + type(self), instance=self + ) + kwargs["using"] = using + try: + with transaction.atomic(using=using): + res = super().save(*args, **kwargs) + return res + except IntegrityError: + pass + slugs = set( + type(self) + ._default_manager.filter(slug__startswith=self.slug) + .values_list("slug", flat=True) + ) + i = 1 + while True: + slug = self.slugify(self.name, i) + if slug not in slugs: + self.slug = slug + return super().save(*args, **kwargs) + i += 1 + else: + return super().save(*args, **kwargs) + +~~ def slugify(self, tag, i=None): +~~ slug = slugify(unidecode(tag)) + if i is not None: + slug += "_%d" % i + return slug + + +class Tag(TagBase): + class Meta: + verbose_name = _("tag") + verbose_name_plural = _("tags") + app_label = "taggit" + + +class ItemBase(models.Model): + def __str__(self): + return gettext("%(object)s tagged with %(tag)s") % { + "object": self.content_object, + "tag": self.tag, + } + + class Meta: + abstract = True + + @classmethod + def tag_model(cls): + + +## ... source file continues with no further slugify examples... + +``` + + +## Example 5 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/models.py) + +```python +# models.py +import json +import logging +from collections import defaultdict +from io import StringIO +from urllib.parse import urlparse + +from django.conf import settings +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core import checks +from django.core.cache import cache +from django.core.exceptions import ValidationError +from django.core.handlers.base import BaseHandler +from django.core.handlers.wsgi import WSGIRequest +from django.db import models, transaction +from django.db.models import Case, Q, Value, When +from django.db.models.functions import Concat, Lower, Substr +from django.http import Http404 +from django.http.request import split_domain_port +from django.template.response import TemplateResponse +from django.urls import NoReverseMatch, reverse +from django.utils import timezone +from django.utils.cache import patch_cache_control +from django.utils.functional import cached_property +~~from django.utils.text import capfirst, slugify +from django.utils.translation import gettext_lazy as _ +from modelcluster.models import ( + ClusterableModel, get_all_child_m2m_relations, get_all_child_relations) +from treebeard.mp_tree import MP_Node + +from wagtail.core.query import PageQuerySet, TreeQuerySet +from wagtail.core.signals import page_published, page_unpublished, post_page_move, pre_page_move +from wagtail.core.sites import get_site_for_hostname +from wagtail.core.url_routing import RouteResult +from wagtail.core.utils import WAGTAIL_APPEND_SLASH, camelcase_to_underscore, resolve_model_string +from wagtail.search import index + + +logger = logging.getLogger('wagtail.core') + +PAGE_TEMPLATE_VAR = 'page' + + +class SiteManager(models.Manager): + def get_queryset(self): + return super(SiteManager, self).get_queryset().order_by(Lower("hostname")) + + def get_by_natural_key(self, hostname, port): + return self.get(hostname=hostname, port=port) + + +## ... source file abbreviated to get to slugify examples ... + + + def _slug_is_available(slug, parent_page, page=None): + if parent_page is None: + return True + + siblings = parent_page.get_children() + if page: + siblings = siblings.not_page(page) + + return not siblings.filter(slug=slug).exists() + + def _get_autogenerated_slug(self, base_slug): + candidate_slug = base_slug + suffix = 1 + parent_page = self.get_parent() + + while not Page._slug_is_available(candidate_slug, parent_page, self): + suffix += 1 + candidate_slug = "%s-%d" % (base_slug, suffix) + + return candidate_slug + + def full_clean(self, *args, **kwargs): + + if not self.slug: + allow_unicode = getattr(settings, 'WAGTAIL_ALLOW_UNICODE_SLUGS', True) +~~ base_slug = slugify(self.title, allow_unicode=allow_unicode) + + if base_slug: + self.slug = self._get_autogenerated_slug(base_slug) + + if not self.draft_title: + self.draft_title = self.title + + super().full_clean(*args, **kwargs) + + def clean(self): + super().clean() + if not Page._slug_is_available(self.slug, self.get_parent(), self): + raise ValidationError({'slug': _("This slug is already in use")}) + + @transaction.atomic + def save(self, clean=True, **kwargs): + if clean: + self.full_clean() + + update_descendant_url_paths = False + is_new = self.id is None + + if is_new: + self.set_url_path(self.get_parent()) + + +## ... source file continues with no further slugify examples... + +``` + diff --git a/content/pages/examples/django/django-utils-text-truncator.markdown b/content/pages/examples/django/django-utils-text-truncator.markdown new file mode 100644 index 000000000..a0fb92648 --- /dev/null +++ b/content/pages/examples/django/django-utils-text-truncator.markdown @@ -0,0 +1,152 @@ +title: django.utils.text Truncator Example Code +category: page +slug: django-utils-text-truncator-examples +sortorder: 500011488 +toc: False +sidebartitle: django.utils.text Truncator +meta: Python example code for the Truncator class from the django.utils.text module of the Django project. + + +Truncator is a class within the django.utils.text module of the Django project. + + +## Example 1 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / widgets.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/widgets.py) + +```python +# widgets.py +import six +from six.moves import urllib +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.template.loader import render_to_string +from django.templatetags.static import static +from django.urls import reverse +from django.utils.safestring import mark_safe +~~from django.utils.text import Truncator + + +class ForeignKeySearchInput(ForeignKeyRawIdWidget): + + widget_template = None + search_path = None + + def _media(self): + js_files = [ + static('django_extensions/js/jquery.bgiframe.js'), + static('django_extensions/js/jquery.ajaxQueue.js'), + static('django_extensions/js/jquery.autocomplete.js'), + ] + + return forms.Media( + css={'all': (static('django_extensions/css/jquery.autocomplete.css'), )}, + js=js_files, + ) + media = property(_media) + + def label_for_value(self, value): + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) + +~~ return Truncator(obj).words(14, truncate='...') + + def __init__(self, rel, search_fields, attrs=None): + self.search_fields = search_fields + super().__init__(rel, site, attrs) + + def render(self, name, value, attrs=None, renderer=None): + if attrs is None: + attrs = {} + opts = self.rel.model._meta + app_label = opts.app_label + model_name = opts.object_name.lower() + related_url = reverse('admin:%s_%s_changelist' % (app_label, model_name)) + if not self.search_path: + self.search_path = urllib.parse.urljoin(related_url, 'foreignkey_autocomplete/') + params = self.url_parameters() + if params: + url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()]) + else: + url = '' + + if 'class' not in attrs: + attrs['class'] = 'vForeignKeyRawIdAdminField' + output = [forms.TextInput.render(self, name, value, attrs)] + + + +## ... source file continues with no further Truncator examples... + +``` + + +## Example 2 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / utils / compatibility.py**](https://github.com/divio/django-filer/blob/develop/filer/utils/compatibility.py) + +```python +# compatibility.py +from __future__ import absolute_import, unicode_literals + +import sys + +from django.utils import six +from django.utils.functional import keep_lazy +~~from django.utils.text import Truncator, format_lazy + + +def string_concat(*strings): + return format_lazy('{}' * len(strings), *strings) + + +def truncate_words(s, num, end_text='...'): + truncate = end_text and ' %s' % end_text or '' +~~ return Truncator(s).words(num, truncate=truncate) + + +truncate_words = keep_lazy(truncate_words, six.text_type) + + +if not six.PY3: + fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def upath(path): + if six.PY2 and not isinstance(path, six.text_type): + return path.decode(fs_encoding) + return path + + +def get_delete_permission(opts): + from django.contrib.auth import get_permission_codename # noqa + return '%s.%s' % (opts.app_label, get_permission_codename('delete', opts)) + + +try: + from PIL import Image as PILImage # noqa + from PIL import ImageDraw as PILImageDraw # noqa + from PIL import ExifTags as PILExifTags # noqa + + +## ... source file continues with no further Truncator examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-get-current-timezone.markdown b/content/pages/examples/django/django-utils-timezone-get-current-timezone.markdown new file mode 100644 index 000000000..fd87a5d16 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-get-current-timezone.markdown @@ -0,0 +1,79 @@ +title: django.utils.timezone get_current_timezone Example Code +category: page +slug: django-utils-timezone-get-current-timezone-examples +sortorder: 500011494 +toc: False +sidebartitle: django.utils.timezone get_current_timezone +meta: Python example code for the get_current_timezone callable from the django.utils.timezone module of the Django project. + + +get_current_timezone is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / models / imagemodels.py**](https://github.com/divio/django-filer/blob/develop/filer/models/imagemodels.py) + +```python +# imagemodels.py +from __future__ import absolute_import + +import logging +from datetime import datetime + +from django.conf import settings +from django.db import models +~~from django.utils.timezone import get_current_timezone, make_aware, now +from django.utils.translation import ugettext_lazy as _ + +from .abstract import BaseImage + + +logger = logging.getLogger("filer") + + +class Image(BaseImage): + date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, + editable=False) + author = models.CharField(_('author'), max_length=255, null=True, blank=True) + must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False) + must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False) + + class Meta(BaseImage.Meta): + swappable = 'FILER_IMAGE_MODEL' + default_manager_name = 'objects' + + def save(self, *args, **kwargs): + if self.date_taken is None: + try: + exif_date = self.exif.get('DateTimeOriginal', None) + if exif_date is not None: + d, t = exif_date.split(" ") + year, month, day = d.split(':') + hour, minute, second = t.split(':') + if getattr(settings, "USE_TZ", False): +~~ tz = get_current_timezone() + self.date_taken = make_aware(datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)), tz) + else: + self.date_taken = datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except Exception: + pass + if self.date_taken is None: + self.date_taken = now() + super(Image, self).save(*args, **kwargs) + + + +## ... source file continues with no further get_current_timezone examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-make-aware.markdown b/content/pages/examples/django/django-utils-timezone-make-aware.markdown new file mode 100644 index 000000000..7935b8df0 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-make-aware.markdown @@ -0,0 +1,296 @@ +title: django.utils.timezone make_aware Example Code +category: page +slug: django-utils-timezone-make-aware-examples +sortorder: 500011495 +toc: False +sidebartitle: django.utils.timezone make_aware +meta: Python example code for the make_aware callable from the django.utils.timezone module of the Django project. + + +make_aware is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / models / imagemodels.py**](https://github.com/divio/django-filer/blob/develop/filer/models/imagemodels.py) + +```python +# imagemodels.py +from __future__ import absolute_import + +import logging +from datetime import datetime + +from django.conf import settings +from django.db import models +~~from django.utils.timezone import get_current_timezone, make_aware, now +from django.utils.translation import ugettext_lazy as _ + +from .abstract import BaseImage + + +logger = logging.getLogger("filer") + + +class Image(BaseImage): + date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, + editable=False) + author = models.CharField(_('author'), max_length=255, null=True, blank=True) + must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False) + must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False) + + class Meta(BaseImage.Meta): + swappable = 'FILER_IMAGE_MODEL' + default_manager_name = 'objects' + + def save(self, *args, **kwargs): + if self.date_taken is None: + try: + exif_date = self.exif.get('DateTimeOriginal', None) + if exif_date is not None: + d, t = exif_date.split(" ") + year, month, day = d.split(':') + hour, minute, second = t.split(':') + if getattr(settings, "USE_TZ", False): + tz = get_current_timezone() +~~ self.date_taken = make_aware(datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)), tz) + else: + self.date_taken = datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except Exception: + pass + if self.date_taken is None: + self.date_taken = now() + super(Image, self).save(*args, **kwargs) + + + +## ... source file continues with no further make_aware examples... + +``` + + +## Example 2 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / oauth2_validators.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./oauth2_validators.py) + +```python +# oauth2_validators.py +import base64 +import binascii +import http.client +import logging +from collections import OrderedDict +from datetime import datetime, timedelta +from urllib.parse import unquote_plus + +import requests +from django.conf import settings +from django.contrib.auth import authenticate, get_user_model +from django.core.exceptions import ObjectDoesNotExist +from django.db import transaction +from django.db.models import Q +from django.utils import timezone +~~from django.utils.timezone import make_aware +from django.utils.translation import gettext_lazy as _ +from oauthlib.oauth2 import RequestValidator + +from .exceptions import FatalClientError +from .models import ( + AbstractApplication, get_access_token_model, + get_application_model, get_grant_model, get_refresh_token_model +) +from .scopes import get_scopes_backend +from .settings import oauth2_settings + + +log = logging.getLogger("oauth2_provider") + +GRANT_TYPE_MAPPING = { + "authorization_code": (AbstractApplication.GRANT_AUTHORIZATION_CODE, ), + "password": (AbstractApplication.GRANT_PASSWORD, ), + "client_credentials": (AbstractApplication.GRANT_CLIENT_CREDENTIALS, ), + "refresh_token": ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + AbstractApplication.GRANT_PASSWORD, + AbstractApplication.GRANT_CLIENT_CREDENTIALS, + ) +} + + +## ... source file abbreviated to get to make_aware examples ... + + + content = response.json() + except ValueError: + log.exception("Introspection: Failed to parse response as json") + return None + + if "active" in content and content["active"] is True: + if "username" in content: + user, _created = UserModel.objects.get_or_create( + **{UserModel.USERNAME_FIELD: content["username"]} + ) + else: + user = None + + max_caching_time = datetime.now() + timedelta( + seconds=oauth2_settings.RESOURCE_SERVER_TOKEN_CACHING_SECONDS + ) + + if "exp" in content: + expires = datetime.utcfromtimestamp(content["exp"]) + if expires > max_caching_time: + expires = max_caching_time + else: + expires = max_caching_time + + scope = content.get("scope", "") +~~ expires = make_aware(expires) + + access_token, _created = AccessToken.objects.update_or_create( + token=token, + defaults={ + "user": user, + "application": None, + "scope": scope, + "expires": expires, + }) + + return access_token + + def validate_bearer_token(self, token, scopes, request): + if not token: + return False + + introspection_url = oauth2_settings.RESOURCE_SERVER_INTROSPECTION_URL + introspection_token = oauth2_settings.RESOURCE_SERVER_AUTH_TOKEN + introspection_credentials = oauth2_settings.RESOURCE_SERVER_INTROSPECTION_CREDENTIALS + + try: + access_token = AccessToken.objects.select_related("application", "user").get(token=token) + except AccessToken.DoesNotExist: + access_token = None + + +## ... source file continues with no further make_aware examples... + +``` + + +## Example 3 from graphite-web +[Graphite](https://github.com/graphite-project/graphite-web) +([project website](http://graphiteapp.org/), +[documentation](https://graphite.readthedocs.io/en/latest/) and +[PyPI package information](https://pypi.org/project/graphite-web/)) +is a metrics collection and visualization tool, built with both +Python and JavaScript. Metrics are collected by a Node.js application +and displayed using a [Django](/django.html) web application, +called "Graphite-Web", which is one of three core projects under +the Graphite umbrella (the other two are +[Carbon](https://github.com/graphite-project/carbon) and +[Whisper](https://github.com/graphite-project/whisper)). + +Graphite is provided as open sourced under the +[Apache License 2.0](https://github.com/graphite-project/whisper/blob/master/LICENSE). + +[**graphite-web / webapp / graphite / util.py**](https://github.com/graphite-project/graphite-web/blob/master/webapp/graphite/util.py) + +```python +# util.py + +import imp +import io +import json as _json +import socket +import time +import sys +import calendar +import pytz +import six +import traceback + +from datetime import datetime +from functools import wraps +from os.path import splitext, basename + +from django.conf import settings +~~from django.utils.timezone import make_aware + +from graphite.compat import HttpResponse +from graphite.logger import log + +if sys.version_info >= (3, 0): + PY3 = True + import pickle + from io import BytesIO +else: + PY3 = False + import cPickle as pickle + from cStringIO import StringIO as BytesIO + +try: + import msgpack # NOQA +except ImportError: + import graphite.umsgpack as msgpack # NOQA + + +def epoch(dt): + if not dt.tzinfo: + tb = traceback.extract_stack(None, 2) + log.warning('epoch() called with non-timezone-aware datetime in %s at %s:%d' % (tb[0][2], tb[0][0], tb[0][1])) + return calendar.timegm(make_aware(dt, pytz.timezone(settings.TIME_ZONE)).astimezone(pytz.utc).timetuple()) + return calendar.timegm(dt.astimezone(pytz.utc).timetuple()) + + +def epoch_to_dt(timestamp): +~~ return make_aware(datetime.utcfromtimestamp(timestamp), pytz.utc) + + +def timebounds(requestContext): + startTime = int(epoch(requestContext['startTime'])) + endTime = int(epoch(requestContext['endTime'])) + now = int(epoch(requestContext['now'])) + + return (startTime, endTime, now) + + +def is_local_interface(host): + is_ipv6 = False + if ':' not in host: + pass + elif host.count(':') == 1: + host = host.split(':', 1)[0] + else: + is_ipv6 = True + + if host.find('[', 0, 2) != -1: + last_bracket_position = host.rfind(']') + last_colon_position = host.rfind(':') + if last_colon_position > last_bracket_position: + host = host.rsplit(':', 1)[0] + + +## ... source file continues with no further make_aware examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-now.markdown b/content/pages/examples/django/django-utils-timezone-now.markdown new file mode 100644 index 000000000..46a227ee3 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-now.markdown @@ -0,0 +1,825 @@ +title: django.utils.timezone now Example Code +category: page +slug: django-utils-timezone-now-examples +sortorder: 500011496 +toc: False +sidebartitle: django.utils.timezone now +meta: Python example code for the now callable from the django.utils.timezone module of the Django project. + + +now is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/utils.py) + +```python +# utils.py +import unicodedata +from collections import OrderedDict +from datetime import timedelta + +from django.conf import settings +from django.contrib import messages +from django.contrib.auth import update_session_auth_hash +from django.core.exceptions import FieldDoesNotExist, ValidationError +from django.db import models +from django.db.models import Q +from django.http import HttpResponseRedirect +from django.utils.encoding import force_str +from django.utils.http import base36_to_int, int_to_base36, urlencode +~~from django.utils.timezone import now + +from ..exceptions import ImmediateHttpResponse +from ..utils import ( + get_request_param, + get_user_model, + import_callable, + valid_email_or_none, +) +from . import app_settings, signals +from .adapter import get_adapter +from .app_settings import EmailVerificationMethod + + +def _unicode_ci_compare(s1, s2): + norm_s1 = unicodedata.normalize('NFKC', s1).casefold() + norm_s2 = unicodedata.normalize('NFKC', s2).casefold() + return norm_s1 == norm_s2 + + +def get_next_redirect_url(request, redirect_field_name="next"): + redirect_to = get_request_param(request, redirect_field_name) + if not get_adapter(request).is_safe_url(redirect_to): + redirect_to = None + return redirect_to + + +## ... source file abbreviated to get to now examples ... + + + a.user = user + a.save() + EmailAddress.objects.fill_cache_for_user(user, addresses) + if (primary and email and email.lower() != primary.email.lower()): + user_email(user, primary.email) + user.save() + return primary + + +def send_email_confirmation(request, user, signup=False): + from .models import EmailAddress, EmailConfirmation + + cooldown_period = timedelta( + seconds=app_settings.EMAIL_CONFIRMATION_COOLDOWN + ) + + email = user_email(user) + if email: + try: + email_address = EmailAddress.objects.get_for_user(user, email) + if not email_address.verified: + if app_settings.EMAIL_CONFIRMATION_HMAC: + send_email = True + else: + send_email = not EmailConfirmation.objects.filter( +~~ sent__gt=now() - cooldown_period, + email_address=email_address).exists() + if send_email: + email_address.send_confirmation(request, + signup=signup) + else: + send_email = False + except EmailAddress.DoesNotExist: + send_email = True + email_address = EmailAddress.objects.add_email(request, + user, + email, + signup=signup, + confirm=True) + assert email_address + if send_email: + get_adapter(request).add_message( + request, + messages.INFO, + 'account/messages/' + 'email_confirmation_sent.txt', + {'email': email}) + if signup: + get_adapter(request).stash_user(request, user_pk_to_url_str(user)) + + + +## ... source file continues with no further now examples... + +``` + + +## Example 2 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / attempts.py**](https://github.com/jazzband/django-axes/blob/master/axes/./attempts.py) + +```python +# attempts.py +from logging import getLogger + +from django.db.models import QuerySet +~~from django.utils.timezone import datetime, now + +from axes.conf import settings +from axes.models import AccessAttempt +from axes.helpers import get_client_username, get_client_parameters, get_cool_off + +log = getLogger(settings.AXES_LOGGER) + + +def get_cool_off_threshold(attempt_time: datetime = None) -> datetime: + + cool_off = get_cool_off() + if cool_off is None: + raise TypeError( + "Cool off threshold can not be calculated with settings.AXES_COOLOFF_TIME set to None" + ) + + if attempt_time is None: +~~ return now() - cool_off + return attempt_time - cool_off + + +def filter_user_attempts(request, credentials: dict = None) -> QuerySet: + + username = get_client_username(request, credentials) + + filter_kwargs = get_client_parameters( + username, request.axes_ip_address, request.axes_user_agent + ) + + return AccessAttempt.objects.filter(**filter_kwargs) + + +def get_user_attempts(request, credentials: dict = None) -> QuerySet: + + attempts = filter_user_attempts(request, credentials) + + if settings.AXES_COOLOFF_TIME is None: + log.debug( + "AXES: Getting all access attempts from database because no AXES_COOLOFF_TIME is configured" + ) + return attempts + + + +## ... source file continues with no further now examples... + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / views.py**](https://github.com/divio/django-cms/blob/develop/cms/./views.py) + +```python +# views.py + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login +from django.contrib.auth.views import redirect_to_login +from django.http import HttpResponse, HttpResponseRedirect +from django.urls import reverse +from django.utils.cache import patch_cache_control +from django.utils.http import is_safe_url, urlquote +~~from django.utils.timezone import now +from django.utils.translation import get_language_from_request +from django.views.decorators.http import require_POST + +from cms.cache.page import get_page_cache +from cms.exceptions import LanguageError +from cms.forms.login import CMSToolbarLoginForm +from cms.models.pagemodel import TreeNode +from cms.page_rendering import _handle_no_page, render_page, render_object_structure, _render_welcome_page +from cms.toolbar.utils import get_toolbar_from_request +from cms.utils import get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import (get_fallback_languages, get_public_languages, + get_redirect_on_fallback, get_language_list, + get_default_language_for_site, + is_language_prefix_patterns_used) +from cms.utils.page import get_page_from_request +from cms.utils.page_permissions import user_can_change_page + + +def _clean_redirect_url(redirect_url, language): + if (redirect_url and is_language_prefix_patterns_used() and redirect_url[0] == "/" + and not redirect_url.startswith('/%s/' % language)): + redirect_url = "/%s/%s" % (language, redirect_url.lstrip("/")) + return redirect_url + + +def details(request, slug): +~~ response_timestamp = now() + if get_cms_setting("PAGE_CACHE") and ( + not hasattr(request, 'toolbar') or ( + not request.toolbar.edit_mode_active and + not request.toolbar.show_toolbar and + not request.user.is_authenticated + ) + ): + cache_content = get_page_cache(request) + if cache_content is not None: + content, headers, expires_datetime = cache_content + response = HttpResponse(content) + response.xframe_options_exempt = True + response._headers = headers + max_age = int( + (expires_datetime - response_timestamp).total_seconds() + 0.5) + patch_cache_control(response, max_age=max_age) + return response + + site = get_current_site() + page = get_page_from_request(request, use_path=slug) + toolbar = get_toolbar_from_request(request) + tree_nodes = TreeNode.objects.get_for_site(site) + + if not page and not slug and not tree_nodes.exists(): + + +## ... source file continues with no further now examples... + +``` + + +## Example 4 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / nginx / response.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/nginx/response.py) + +```python +# response.py +from datetime import timedelta + +~~from django.utils.timezone import now + +from django_downloadview.response import ProxiedDownloadResponse, content_disposition +from django_downloadview.utils import content_type_to_charset, url_basename + + +class XAccelRedirectResponse(ProxiedDownloadResponse): + "Http response that delegates serving file to Nginx via X-Accel headers." + + def __init__( + self, + redirect_url, + content_type, + basename=None, + expires=None, + with_buffering=None, + limit_rate=None, + attachment=True, + ): + super(XAccelRedirectResponse, self).__init__(content_type=content_type) + if attachment: + self.basename = basename or url_basename(redirect_url, content_type) + self["Content-Disposition"] = content_disposition(self.basename) + self["X-Accel-Redirect"] = redirect_url + self["X-Accel-Charset"] = content_type_to_charset(content_type) + if with_buffering is not None: + self["X-Accel-Buffering"] = with_buffering and "yes" or "no" + if expires: +~~ expire_seconds = timedelta(expires - now()).seconds + self["X-Accel-Expires"] = expire_seconds + elif expires is not None: # We explicitely want it off. + self["X-Accel-Expires"] = "off" + if limit_rate is not None: + self["X-Accel-Limit-Rate"] = limit_rate and "%d" % limit_rate or "off" + + + +## ... source file continues with no further now examples... + +``` + + +## Example 5 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / db / models.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/db/models.py) + +```python +# models.py + +from django.db import models +~~from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ + +from django_extensions.db.fields import AutoSlugField, CreationDateTimeField, ModificationDateTimeField + + +class TimeStampedModel(models.Model): + + created = CreationDateTimeField(_('created')) + modified = ModificationDateTimeField(_('modified')) + + def save(self, **kwargs): + self.update_modified = kwargs.pop('update_modified', getattr(self, 'update_modified', True)) + super().save(**kwargs) + + class Meta: + get_latest_by = 'modified' + abstract = True + + +class TitleDescriptionModel(models.Model): + + title = models.CharField(_('title'), max_length=255) + description = models.TextField(_('description'), blank=True, null=True) + + + +## ... source file abbreviated to get to now examples ... + + + + def inactive(self): + return self.get_queryset().inactive() + + +class ActivatorModel(models.Model): + + INACTIVE_STATUS = 0 + ACTIVE_STATUS = 1 + + STATUS_CHOICES = ( + (INACTIVE_STATUS, _('Inactive')), + (ACTIVE_STATUS, _('Active')), + ) + status = models.IntegerField(_('status'), choices=STATUS_CHOICES, default=ACTIVE_STATUS) + activate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for an immediate activation')) + deactivate_date = models.DateTimeField(blank=True, null=True, help_text=_('keep empty for indefinite activation')) + objects = ActivatorModelManager() + + class Meta: + ordering = ('status', '-activate_date',) + abstract = True + + def save(self, *args, **kwargs): + if not self.activate_date: +~~ self.activate_date = now() + super().save(*args, **kwargs) + + + +## ... source file continues with no further now examples... + +``` + + +## Example 6 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / models / imagemodels.py**](https://github.com/divio/django-filer/blob/develop/filer/models/imagemodels.py) + +```python +# imagemodels.py +from __future__ import absolute_import + +import logging +from datetime import datetime + +from django.conf import settings +from django.db import models +~~from django.utils.timezone import get_current_timezone, make_aware, now +from django.utils.translation import ugettext_lazy as _ + +from .abstract import BaseImage + + +logger = logging.getLogger("filer") + + +class Image(BaseImage): + date_taken = models.DateTimeField(_('date taken'), null=True, blank=True, + editable=False) + author = models.CharField(_('author'), max_length=255, null=True, blank=True) + must_always_publish_author_credit = models.BooleanField(_('must always publish author credit'), default=False) + must_always_publish_copyright = models.BooleanField(_('must always publish copyright'), default=False) + + class Meta(BaseImage.Meta): + swappable = 'FILER_IMAGE_MODEL' + default_manager_name = 'objects' + + def save(self, *args, **kwargs): + if self.date_taken is None: + try: + exif_date = self.exif.get('DateTimeOriginal', None) + if exif_date is not None: + d, t = exif_date.split(" ") + year, month, day = d.split(':') + hour, minute, second = t.split(':') + if getattr(settings, "USE_TZ", False): + tz = get_current_timezone() + self.date_taken = make_aware(datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)), tz) + else: + self.date_taken = datetime( + int(year), int(month), int(day), + int(hour), int(minute), int(second)) + except Exception: + pass + if self.date_taken is None: +~~ self.date_taken = now() + super(Image, self).save(*args, **kwargs) + + + +## ... source file continues with no further now examples... + +``` + + +## Example 7 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / filters.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./filters.py) + +```python +# filters.py +from collections import OrderedDict +from datetime import timedelta + +from django import forms +from django.db.models import Q +from django.db.models.constants import LOOKUP_SEP +from django.forms.utils import pretty_name +from django.utils.itercompat import is_iterable +~~from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ + +from .conf import settings +from .constants import EMPTY_VALUES +from .fields import ( + BaseCSVField, + BaseRangeField, + ChoiceField, + DateRangeField, + DateTimeRangeField, + IsoDateTimeField, + IsoDateTimeRangeField, + LookupChoiceField, + ModelChoiceField, + ModelMultipleChoiceField, + MultipleChoiceField, + RangeField, + TimeRangeField +) +from .utils import get_model_field, label_for_filter + +__all__ = [ + 'AllValuesFilter', + 'AllValuesMultipleFilter', + + +## ... source file abbreviated to get to now examples ... + + + elif value.start is not None: + self.lookup_expr = 'gte' + value = value.start + elif value.stop is not None: + self.lookup_expr = 'lte' + value = value.stop + + return super().filter(qs, value) + + +def _truncate(dt): + return dt.date() + + +class DateRangeFilter(ChoiceFilter): + choices = [ + ('today', _('Today')), + ('yesterday', _('Yesterday')), + ('week', _('Past 7 days')), + ('month', _('This month')), + ('year', _('This year')), + ] + + filters = { + 'today': lambda qs, name: qs.filter(**{ +~~ '%s__year' % name: now().year, +~~ '%s__month' % name: now().month, +~~ '%s__day' % name: now().day + }), + 'yesterday': lambda qs, name: qs.filter(**{ + '%s__year' % name: (now() - timedelta(days=1)).year, + '%s__month' % name: (now() - timedelta(days=1)).month, + '%s__day' % name: (now() - timedelta(days=1)).day, + }), + 'week': lambda qs, name: qs.filter(**{ + '%s__gte' % name: _truncate(now() - timedelta(days=7)), + '%s__lt' % name: _truncate(now() + timedelta(days=1)), + }), + 'month': lambda qs, name: qs.filter(**{ +~~ '%s__year' % name: now().year, +~~ '%s__month' % name: now().month + }), + 'year': lambda qs, name: qs.filter(**{ +~~ '%s__year' % name: now().year, + }), + } + + def __init__(self, choices=None, filters=None, *args, **kwargs): + if choices is not None: + self.choices = choices + if filters is not None: + self.filters = filters + + unique = set([x[0] for x in self.choices]) ^ set(self.filters) + assert not unique, \ + "Keys must be present in both 'choices' and 'filters'. Missing keys: " \ + "'%s'" % ', '.join(sorted(unique)) + + assert not hasattr(self, 'options'), \ + "The 'options' attribute has been replaced by 'choices' and 'filters'. " \ + "See: https://django-filter.readthedocs.io/en/master/guide/migration.html" + + kwargs.setdefault('null_label', None) + super().__init__(choices=self.choices, *args, **kwargs) + + def filter(self, qs, value): + if not value: + return qs + + +## ... source file continues with no further now examples... + +``` + + +## Example 8 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / mixins.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./mixins.py) + +```python +# mixins.py +from django.http import HttpResponse +~~from django.utils.timezone import now +from django.views.generic.edit import FormView + +from .formats import base_formats +from .forms import ExportForm +from .resources import modelresource_factory +from .signals import post_export + + +class ExportViewMixin: + formats = base_formats.DEFAULT_FORMATS + form_class = ExportForm + resource_class = None + + def get_export_formats(self): + return [f for f in self.formats if f().can_export()] + + def get_resource_class(self): + if not self.resource_class: + return modelresource_factory(self.model) + return self.resource_class + + def get_export_resource_class(self): + return self.get_resource_class() + + def get_resource_kwargs(self, request, *args, **kwargs): + return {} + + def get_export_resource_kwargs(self, request, *args, **kwargs): + return self.get_resource_kwargs(request, *args, **kwargs) + + def get_export_data(self, file_format, queryset, *args, **kwargs): + resource_class = self.get_export_resource_class() + data = resource_class(**self.get_export_resource_kwargs(self.request))\ + .export(queryset, *args, **kwargs) + export_data = file_format.export_data(data) + return export_data + + def get_export_filename(self, file_format): +~~ date_str = now().strftime('%Y-%m-%d') + filename = "%s-%s.%s" % (self.model.__name__, + date_str, + file_format.get_extension()) + return filename + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + return context + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs['formats'] = self.get_export_formats() + return kwargs + + +class ExportViewFormMixin(ExportViewMixin, FormView): + def form_valid(self, form): + formats = self.get_export_formats() + file_format = formats[ + int(form.cleaned_data['file_format']) + ]() + if hasattr(self, 'get_filterset'): + queryset = self.get_filterset(self.get_filterset_class()).qs + else: + + +## ... source file continues with no further now examples... + +``` + + +## Example 9 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / fields.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./fields.py) + +```python +# fields.py +import uuid +from django.db import models +from django.conf import settings +from django.core.exceptions import ValidationError +~~from django.utils.timezone import now + +DEFAULT_CHOICES_NAME = 'STATUS' + + +class AutoCreatedField(models.DateTimeField): + + def __init__(self, *args, **kwargs): + kwargs.setdefault('editable', False) + kwargs.setdefault('default', now) + super().__init__(*args, **kwargs) + + +class AutoLastModifiedField(AutoCreatedField): + def get_default(self): + if not hasattr(self, "_default"): + self._default = self._get_default() + return self._default + + def pre_save(self, model_instance, add): +~~ value = now() + if add: + current_value = getattr(model_instance, self.attname, self.get_default()) + if current_value != self.get_default(): + value = getattr(model_instance, self.attname) + else: + for field in model_instance._meta.get_fields(): + if isinstance(field, AutoCreatedField): + value = getattr(model_instance, field.name) + break + setattr(model_instance, self.attname, value) + return value + + +class StatusField(models.CharField): + + def __init__(self, *args, **kwargs): + kwargs.setdefault('max_length', 100) + self.check_for_status = not kwargs.pop('no_check_for_status', False) + self.choices_name = kwargs.pop('choices_name', DEFAULT_CHOICES_NAME) + super().__init__(*args, **kwargs) + + def prepare_class(self, sender, **kwargs): + if not sender._meta.abstract and self.check_for_status: + assert hasattr(sender, self.choices_name), \ + + +## ... source file abbreviated to get to now examples ... + + + monitor = kwargs.pop('monitor', None) + if not monitor: + raise TypeError( + '%s requires a "monitor" argument' % self.__class__.__name__) + self.monitor = monitor + when = kwargs.pop('when', None) + if when is not None: + when = set(when) + self.when = when + super().__init__(*args, **kwargs) + + def contribute_to_class(self, cls, name): + self.monitor_attname = '_monitor_%s' % name + models.signals.post_init.connect(self._save_initial, sender=cls) + super().contribute_to_class(cls, name) + + def get_monitored_value(self, instance): + return getattr(instance, self.monitor) + + def _save_initial(self, sender, instance, **kwargs): + if self.monitor in instance.get_deferred_fields(): + return + setattr(instance, self.monitor_attname, self.get_monitored_value(instance)) + + def pre_save(self, model_instance, add): +~~ value = now() + previous = getattr(model_instance, self.monitor_attname, None) + current = self.get_monitored_value(model_instance) + if previous != current: + if self.when is None or current in self.when: + setattr(model_instance, self.attname, value) + self._save_initial(model_instance.__class__, model_instance) + return super().pre_save(model_instance, add) + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + kwargs['monitor'] = self.monitor + if self.when is not None: + kwargs['when'] = self.when + return name, path, args, kwargs + + +SPLIT_MARKER = getattr(settings, 'SPLIT_MARKER', '') + +SPLIT_DEFAULT_PARAGRAPHS = getattr(settings, 'SPLIT_DEFAULT_PARAGRAPHS', 2) + + +def _excerpt_field_name(name): + return '_%s_excerpt' % name + + + +## ... source file continues with no further now examples... + +``` + diff --git a/content/pages/examples/django/django-utils-timezone-timedelta.markdown b/content/pages/examples/django/django-utils-timezone-timedelta.markdown new file mode 100644 index 000000000..4bd751e05 --- /dev/null +++ b/content/pages/examples/django/django-utils-timezone-timedelta.markdown @@ -0,0 +1,177 @@ +title: django.utils.timezone timedelta Example Code +category: page +slug: django-utils-timezone-timedelta-examples +sortorder: 500011497 +toc: False +sidebartitle: django.utils.timezone timedelta +meta: Python example code for the timedelta callable from the django.utils.timezone module of the Django project. + + +timedelta is a callable within the django.utils.timezone module of the Django project. + + +## Example 1 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / tests / test_handlers.py**](https://github.com/jazzband/django-axes/blob/master/axes/tests/test_handlers.py) + +```python +# test_handlers.py +from unittest.mock import MagicMock, patch + +from django.test import override_settings +from django.urls import reverse +from django.utils import timezone +~~from django.utils.timezone import timedelta + +from axes.conf import settings +from axes.handlers.proxy import AxesProxyHandler +from axes.helpers import get_client_str +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +@override_settings(AXES_HANDLER="axes.handlers.base.AxesHandler") +class AxesHandlerTestCase(AxesTestCase): + def test_base_handler_reset_attempts_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_attempts() + + def test_base_handler_reset_logs_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_logs() + + def test_base_handler_raises_on_undefined_is_allowed_to_authenticate(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.is_allowed(self.request, {}) + + @override_settings(AXES_IP_BLACKLIST=["127.0.0.1"]) + def test_is_allowed_with_blacklisted_ip_address(self): + + +## ... source file abbreviated to get to timedelta examples ... + + + +class AxesHandlerBaseTestCase(AxesTestCase): + def check_whitelist(self, log): + with override_settings( + AXES_NEVER_LOCKOUT_WHITELIST=True, AXES_IP_WHITELIST=[self.ip_address] + ): + AxesProxyHandler.user_login_failed( + sender=None, request=self.request, credentials=self.credentials + ) + client_str = get_client_str( + self.username, self.ip_address, self.user_agent, self.path_info + ) + log.info.assert_called_with( + "AXES: Login failed from whitelisted client %s.", client_str + ) + + def check_empty_request(self, log, handler): + AxesProxyHandler.user_login_failed(sender=None, credentials={}, request=None) + log.error.assert_called_with( + f"AXES: {handler}.user_login_failed does not function without a request." + ) + + +@override_settings( + AXES_HANDLER="axes.handlers.database.AxesDatabaseHandler", +~~ AXES_COOLOFF_TIME=timedelta(seconds=1), + AXES_RESET_ON_SUCCESS=True, +) +class AxesDatabaseHandlerTestCase(AxesHandlerBaseTestCase): + def test_handler_reset_attempts(self): + self.create_attempt() + self.assertEqual(1, AxesProxyHandler.reset_attempts()) + self.assertFalse(AccessAttempt.objects.count()) + + def test_handler_reset_logs(self): + self.create_log() + self.assertEqual(1, AxesProxyHandler.reset_logs()) + self.assertFalse(AccessLog.objects.count()) + + def test_handler_reset_logs_older_than_42_days(self): + self.create_log() + + then = timezone.now() - timezone.timedelta(days=90) + with patch("django.utils.timezone.now", return_value=then): + self.create_log() + + self.assertEqual(AccessLog.objects.count(), 2) + self.assertEqual(1, AxesProxyHandler.reset_logs(age_days=42)) + self.assertEqual(AccessLog.objects.count(), 1) + + + +## ... source file abbreviated to get to timedelta examples ... + + + usernames, + ) in configurations: + with self.settings(**overrides): + with self.subTest( + total_attempts_count=total_attempts_count, + failures_since_start=failures_since_start, + settings=overrides, + ): + self.login(username=usernames[0]) + attempt = AccessAttempt.objects.get(username=usernames[0]) + self.assertEqual(1, attempt.failures_since_start) + + self.login(username=usernames[1]) + attempt = AccessAttempt.objects.get(username=usernames[1]) + self.assertEqual(failures_since_start, attempt.failures_since_start) + + self.assertEqual( + total_attempts_count, AccessAttempt.objects.count() + ) + + AccessAttempt.objects.all().delete() + + +@override_settings( + AXES_HANDLER="axes.handlers.cache.AxesCacheHandler", +~~ AXES_COOLOFF_TIME=timedelta(seconds=1), +) +class AxesCacheHandlerTestCase(AxesHandlerBaseTestCase): + @override_settings(AXES_RESET_ON_SUCCESS=True) + def test_handler(self): + self.check_handler() + + @override_settings(AXES_RESET_ON_SUCCESS=False) + def test_handler_without_reset(self): + self.check_handler() + + @override_settings(AXES_LOCK_OUT_AT_FAILURE=False) + def test_handler_without_lockout(self): + self.check_handler() + + @patch("axes.handlers.cache.log") + def test_empty_request(self, log): + self.check_empty_request(log, "AxesCacheHandler") + + @patch("axes.handlers.cache.log") + def test_whitelist(self, log): + self.check_whitelist(log) + + +@override_settings(AXES_HANDLER="axes.handlers.dummy.AxesDummyHandler") + + +## ... source file continues with no further timedelta examples... + +``` + diff --git a/content/pages/examples/django/django-utils-translation-activate.markdown b/content/pages/examples/django/django-utils-translation-activate.markdown index 1442cd3da..d5af83b0c 100644 --- a/content/pages/examples/django/django-utils-translation-activate.markdown +++ b/content/pages/examples/django/django-utils-translation-activate.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation activate code examples +title: django.utils.translation activate Example Code category: page slug: django-utils-translation-activate-examples -sortorder: 500011494 +sortorder: 500011499 toc: False sidebartitle: django.utils.translation activate -meta: Python example code for the activate function from the django.utils.translation module of the Django project. +meta: Python example code for the activate callable from the django.utils.translation module of the Django project. -activate is a function within the django.utils.translation module of the Django project. +activate is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -60,6 +60,11 @@ class PluginPool(object): ## ... source file abbreviated to get to activate examples ... + def get_text_enabled_plugins(self, placeholder, page): + plugins = set(self.get_all_plugins(placeholder, page)) + plugins.update(self.get_all_plugins(placeholder, page, 'text_only_plugins')) + return sorted((p for p in plugins if p.text_enabled), + key=attrgetter('module', 'name')) def get_plugin(self, name): self.discover_plugins() @@ -160,6 +165,11 @@ def test_items_hook(template_render_tag, template_context, common_tree): ## ... source file abbreviated to get to activate examples ... + register_items_hook(None) # Reset. + + +def test_i18n(build_tree, template_render_tag, template_context): + from sitetree.toolbox import register_i18n_trees build_tree( diff --git a/content/pages/examples/django/django-utils-translation-deactivate-all.markdown b/content/pages/examples/django/django-utils-translation-deactivate-all.markdown index c35b0be19..6f61206bf 100644 --- a/content/pages/examples/django/django-utils-translation-deactivate-all.markdown +++ b/content/pages/examples/django/django-utils-translation-deactivate-all.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation deactivate_all code examples +title: django.utils.translation deactivate_all Example Code category: page slug: django-utils-translation-deactivate-all-examples -sortorder: 500011495 +sortorder: 500011500 toc: False sidebartitle: django.utils.translation deactivate_all -meta: Python example code for the deactivate_all function from the django.utils.translation module of the Django project. +meta: Python example code for the deactivate_all callable from the django.utils.translation module of the Django project. -deactivate_all is a function within the django.utils.translation module of the Django project. +deactivate_all is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -60,6 +60,11 @@ class PluginPool(object): ## ... source file abbreviated to get to deactivate_all examples ... + if allowed_plugins: + plugins = (plugin for plugin in plugins if plugin.__name__ in allowed_plugins) + + if excluded_plugins: + plugins = (plugin for plugin in plugins if plugin.__name__ not in excluded_plugins) if placeholder: plugins = (plugin for plugin in plugins @@ -160,6 +165,11 @@ def test_items_hook(template_render_tag, template_context, common_tree): ## ... source file abbreviated to get to deactivate_all examples ... + + activate('en') + result = template_render_tag('sitetree', 'sitetree_tree from "i18tree"', template_context()) + + assert '/url_default/' in result assert 'My title' in result activate('ru') diff --git a/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown b/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown index 0b7d3d996..103efee74 100644 --- a/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown +++ b/content/pages/examples/django/django-utils-translation-get-language-from-request.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation get_language_from_request code examples +title: django.utils.translation get_language_from_request Example Code category: page slug: django-utils-translation-get-language-from-request-examples -sortorder: 500011497 +sortorder: 500011502 toc: False sidebartitle: django.utils.translation get_language_from_request -meta: Python example code for the get_language_from_request function from the django.utils.translation module of the Django project. +meta: Python example code for the get_language_from_request callable from the django.utils.translation module of the Django project. -get_language_from_request is a function within the django.utils.translation module of the Django project. +get_language_from_request is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-angular @@ -58,6 +58,11 @@ def djng_urls(context, *namespaces): ## ... source file abbreviated to get to get_language_from_request examples ... +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') values = [parser.compile_filter(bit) for bit in bits[1:]] django_nodelist = parser.parse(('endangularjs',)) angular_nodelist = NodeList() @@ -141,6 +146,11 @@ def _clean_redirect_url(redirect_url, language): ## ... source file abbreviated to get to get_language_from_request examples ... + response.xframe_options_exempt = True + response._headers = headers + max_age = int( + (expires_datetime - response_timestamp).total_seconds() + 0.5) + patch_cache_control(response, max_age=max_age) return response site = get_current_site() diff --git a/content/pages/examples/django/django-utils-translation-get-language.markdown b/content/pages/examples/django/django-utils-translation-get-language.markdown index b0cdc386a..1bf9ec1bc 100644 --- a/content/pages/examples/django/django-utils-translation-get-language.markdown +++ b/content/pages/examples/django/django-utils-translation-get-language.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation get_language code examples +title: django.utils.translation get_language Example Code category: page slug: django-utils-translation-get-language-examples -sortorder: 500011496 +sortorder: 500011501 toc: False sidebartitle: django.utils.translation get_language -meta: Python example code for the get_language function from the django.utils.translation module of the Django project. +meta: Python example code for the get_language callable from the django.utils.translation module of the Django project. -get_language is a function within the django.utils.translation module of the Django project. +get_language is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -60,6 +60,11 @@ class PluginPool(object): ## ... source file abbreviated to get to get_language examples ... + + if allowed_plugins: + plugins = (plugin for plugin in plugins if plugin.__name__ in allowed_plugins) + + if excluded_plugins: plugins = (plugin for plugin in plugins if plugin.__name__ not in excluded_plugins) if placeholder: @@ -175,6 +180,11 @@ _I18N_TREES: List[str] = [] ## ... source file abbreviated to get to get_language examples ... + + def get_entry(self, entry_name: str, key) -> Any: + return self.cache[entry_name].get(key, False) + + def update_entry_value(self, entry_name: str, key: str, value: Any): if key not in self.cache[entry_name]: self.cache[entry_name][key] = {} @@ -274,6 +284,11 @@ class UserProfile(models.Model): ## ... source file abbreviated to get to get_language examples ... + preferred_language = models.CharField( + verbose_name=_('preferred language'), + max_length=10, + help_text=_("Select language for the admin"), + default='' ) current_time_zone = models.CharField( diff --git a/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown index dd7ed3bab..c709f84b4 100644 --- a/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-gettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation gettext_lazy code examples +title: django.utils.translation gettext_lazy Example Code category: page slug: django-utils-translation-gettext-lazy-examples -sortorder: 500011499 +sortorder: 500011504 toc: False sidebartitle: django.utils.translation gettext_lazy -meta: Python example code for the gettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the gettext_lazy callable from the django.utils.translation module of the Django project. -gettext_lazy is a function within the django.utils.translation module of the Django project. +gettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from wagtail diff --git a/content/pages/examples/django/django-utils-translation-gettext.markdown b/content/pages/examples/django/django-utils-translation-gettext.markdown index 28b65593e..66705feae 100644 --- a/content/pages/examples/django/django-utils-translation-gettext.markdown +++ b/content/pages/examples/django/django-utils-translation-gettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation gettext code examples +title: django.utils.translation gettext Example Code category: page slug: django-utils-translation-gettext-examples -sortorder: 500011498 +sortorder: 500011503 toc: False sidebartitle: django.utils.translation gettext -meta: Python example code for the gettext function from the django.utils.translation module of the Django project. +meta: Python example code for the gettext callable from the django.utils.translation module of the Django project. -gettext is a function within the django.utils.translation module of the Django project. +gettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-allauth @@ -62,6 +62,11 @@ class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): ## ... source file abbreviated to get to gettext examples ... + username_field = self.fields['username'] + username_field.max_length = get_username_max_length() + username_field.validators.append( + validators.MaxLengthValidator(username_field.max_length)) + username_field.widget.attrs['maxlength'] = str( username_field.max_length) default_field_order = [ @@ -171,6 +176,11 @@ class GuardedModelAdminMixin: ## ... source file abbreviated to get to gettext examples ... + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name return render(request, self.get_obj_perms_manage_template(), context) @@ -216,11 +226,9 @@ class GuardedModelAdminMixin: def get_obj_perms_manage_user_template(self): if 'grappelli' in settings.INSTALLED_APPS: return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template - -## ... source file abbreviated to get to gettext examples ... - - + def get_obj_perms_user_select_form(self, request): return UserManage def get_obj_perms_group_select_form(self, request): @@ -274,9 +282,8 @@ class GuardedModelAdminMixin: ## Example 3 from django-taggit -[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) -([source code](https://github.com/jazzband/django-debug-toolbar) and -[PyPI page](https://pypi.org/project/django-taggit/)) provides a way +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way to create, store, manage and use tags in a [Django](/django.html) project. The code for django-taggit is [open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) @@ -321,6 +328,11 @@ class TagBase(models.Model): ## ... source file abbreviated to get to gettext examples ... + while True: + slug = self.slugify(self.name, i) + if slug not in slugs: + self.slug = slug + return super().save(*args, **kwargs) i += 1 else: return super().save(*args, **kwargs) @@ -393,6 +405,11 @@ The code for django-wiki is provided as open source under the ```python # forms.py + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", "TextInputPrepend", "CreateForm", "DeleteForm", @@ -438,11 +455,10 @@ class WikiSlugField(forms.CharField): def __init__(self, *args, **kwargs): self.allow_unicode = kwargs.pop("allow_unicode", False) if self.allow_unicode: - - -## ... source file abbreviated to get to gettext examples ... - - + self.default_validators = [ + validators.validate_unicode_slug, + validate_slug_numbers, + ] super().__init__(*args, **kwargs) @@ -551,6 +567,11 @@ class SpamProtectionMixin: ## ... source file abbreviated to get to gettext examples ... + if not str(self.presumed_revision) == str(self.initial_revision.id): + newdata = {} + for k, v in data.items(): + newdata[k] = v + newdata["current_revision"] = self.initial_revision.id if provided_content: self.presumed_revision = self.initial_revision.id else: @@ -610,6 +631,11 @@ class SelectWidgetBootstrap(forms.Select): ## ... source file abbreviated to get to gettext examples ... + +class DeleteForm(forms.Form): + def __init__(self, *args, **kwargs): + self.article = kwargs.pop("article") + self.has_children = kwargs.pop("has_children") super().__init__(*args, **kwargs) confirm = forms.BooleanField(required=False, label=_("Yes, I am sure")) @@ -707,6 +733,11 @@ def register_admin_urls(): ## ... source file abbreviated to get to gettext examples ... + reverse('wagtailimages:chooser') + ) + + +@hooks.register('register_rich_text_features') def register_image_feature(features): features.register_embed_type(ImageEmbedHandler) diff --git a/content/pages/examples/django/django-utils-translation-language-session-key.markdown b/content/pages/examples/django/django-utils-translation-language-session-key.markdown index 4d5e63725..12610c6a9 100644 --- a/content/pages/examples/django/django-utils-translation-language-session-key.markdown +++ b/content/pages/examples/django/django-utils-translation-language-session-key.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation LANGUAGE_SESSION_KEY code examples +title: django.utils.translation LANGUAGE_SESSION_KEY Example Code category: page slug: django-utils-translation-language-session-key-examples -sortorder: 500011493 +sortorder: 500011498 toc: False sidebartitle: django.utils.translation LANGUAGE_SESSION_KEY -meta: Python example code for the LANGUAGE_SESSION_KEY class from the django.utils.translation module of the Django project. +meta: Python example code for the LANGUAGE_SESSION_KEY constant from the django.utils.translation module of the Django project. -LANGUAGE_SESSION_KEY is a class within the django.utils.translation module of the Django project. +LANGUAGE_SESSION_KEY is a constant within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -37,7 +37,7 @@ class LanguageCookieMiddleware(MiddlewareMixin): if hasattr(request, 'session') and DJANGO_2_2: ~~ session_language = request.session.get(LANGUAGE_SESSION_KEY, None) if session_language and not session_language == language: -~~ request.session[LANGUAGE_SESSION_KEY] = language + request.session[LANGUAGE_SESSION_KEY] = language request.session.save() if settings.LANGUAGE_COOKIE_NAME in request.COOKIES and \ request.COOKIES[settings.LANGUAGE_COOKIE_NAME] == language: diff --git a/content/pages/examples/django/django-utils-translation-ngettext.markdown b/content/pages/examples/django/django-utils-translation-ngettext.markdown index 1cfcbf7e2..7b58498db 100644 --- a/content/pages/examples/django/django-utils-translation-ngettext.markdown +++ b/content/pages/examples/django/django-utils-translation-ngettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ngettext code examples +title: django.utils.translation ngettext Example Code category: page slug: django-utils-translation-ngettext-examples -sortorder: 500011500 +sortorder: 500011505 toc: False sidebartitle: django.utils.translation ngettext -meta: Python example code for the ngettext function from the django.utils.translation module of the Django project. +meta: Python example code for the ngettext callable from the django.utils.translation module of the Django project. -ngettext is a function within the django.utils.translation module of the Django project. +ngettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-wiki @@ -75,6 +75,11 @@ class ArticleView(ArticleMixin, TemplateView): ## ... source file abbreviated to get to ngettext examples ... + + for descendant in descendants: + descendant.refresh_from_db() + dst_path = descendant.path + src_path = urljoin(old_path, dst_path[root_len:]) src_len = len(src_path) pos = src_path.rfind("/", 0, src_len - 1) slug = src_path[pos + 1 : src_len - 1] @@ -172,6 +177,11 @@ def register_admin_urls(): ## ... source file abbreviated to get to ngettext examples ... + request.user, ['add', 'change', 'delete'] + ) + + +@hooks.register('register_admin_search_area') def register_images_search_area(): return ImagesSearchArea( _('Images'), reverse('wagtailimages:index'), diff --git a/content/pages/examples/django/django-utils-translation-override.markdown b/content/pages/examples/django/django-utils-translation-override.markdown index 701e02c49..677e62844 100644 --- a/content/pages/examples/django/django-utils-translation-override.markdown +++ b/content/pages/examples/django/django-utils-translation-override.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation override code examples +title: django.utils.translation override Example Code category: page slug: django-utils-translation-override-examples -sortorder: 500011501 +sortorder: 500011506 toc: False sidebartitle: django.utils.translation override -meta: Python example code for the override function from the django.utils.translation module of the Django project. +meta: Python example code for the override callable from the django.utils.translation module of the Django project. -override is a function within the django.utils.translation module of the Django project. +override is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -58,6 +58,11 @@ def applications_page_check(request, current_page=None, path=None): ## ... source file abbreviated to get to override examples ... + from cms.models import Title + + included = [] + + title_qs = Title.objects.public().filter(page__node__site=site) hooked_applications = OrderedDict() @@ -154,6 +159,11 @@ def send_mail(subject, message, recipient_list, from_email=None, **kwargs): ## ... source file abbreviated to get to override examples ... + email_recipients = [ + recipient for recipient in recipients + if recipient.email and recipient.pk != excluded_user_id and getattr( + UserProfile.get_for_user(recipient), + notification + '_notifications' ) ] diff --git a/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown index 18758dcf8..d5ef274c0 100644 --- a/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-pgettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation pgettext_lazy code examples +title: django.utils.translation pgettext_lazy Example Code category: page slug: django-utils-translation-pgettext-lazy-examples -sortorder: 500011503 +sortorder: 500011508 toc: False sidebartitle: django.utils.translation pgettext_lazy -meta: Python example code for the pgettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the pgettext_lazy callable from the django.utils.translation module of the Django project. -pgettext_lazy is a function within the django.utils.translation module of the Django project. +pgettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-wiki @@ -30,6 +30,11 @@ The code for django-wiki is provided as open source under the ```python # forms.py + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", "TextInputPrepend", "CreateForm", "DeleteForm", @@ -80,6 +85,11 @@ class WikiSlugField(forms.CharField): ## ... source file abbreviated to get to pgettext_lazy examples ... + slug = WikiSlugField(max_length=models.URLPath.SLUG_MAX_LENGTH) + redirect = forms.BooleanField( + label=_("Redirect pages"), + help_text=_("Create a redirect page for every moved article?"), + required=False, ) def clean(self): @@ -130,6 +140,11 @@ class EditForm(forms.Form, SpamProtectionMixin): ## ... source file abbreviated to get to pgettext_lazy examples ... + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + context["prepend"] = mark_safe(self.prepend) + return context + class CreateForm(forms.Form, SpamProtectionMixin): def __init__(self, request, urlpath_parent, *args, **kwargs): diff --git a/content/pages/examples/django/django-utils-translation-pgettext.markdown b/content/pages/examples/django/django-utils-translation-pgettext.markdown index cc4eac5ee..a548708ad 100644 --- a/content/pages/examples/django/django-utils-translation-pgettext.markdown +++ b/content/pages/examples/django/django-utils-translation-pgettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation pgettext code examples +title: django.utils.translation pgettext Example Code category: page slug: django-utils-translation-pgettext-examples -sortorder: 500011502 +sortorder: 500011507 toc: False sidebartitle: django.utils.translation pgettext -meta: Python example code for the pgettext function from the django.utils.translation module of the Django project. +meta: Python example code for the pgettext callable from the django.utils.translation module of the Django project. -pgettext is a function within the django.utils.translation module of the Django project. +pgettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-allauth @@ -62,6 +62,11 @@ class EmailAwarePasswordResetTokenGenerator(PasswordResetTokenGenerator): ## ... source file abbreviated to get to pgettext examples ... + def __init__(self, *args, **kwargs): + self.request = kwargs.pop('request', None) + super(LoginForm, self).__init__(*args, **kwargs) + if app_settings.AUTHENTICATION_METHOD == AuthenticationMethod.EMAIL: + login_widget = forms.TextInput(attrs={'type': 'email', 'placeholder': _('E-mail address'), 'autofocus': 'autofocus'}) diff --git a/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown index e8b3da9d2..042ab4467 100644 --- a/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-ugettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ugettext_lazy code examples +title: django.utils.translation ugettext_lazy Example Code category: page slug: django-utils-translation-ugettext-lazy-examples -sortorder: 500011505 +sortorder: 500011510 toc: False sidebartitle: django.utils.translation ugettext_lazy -meta: Python example code for the ugettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the ugettext_lazy callable from the django.utils.translation module of the Django project. -ugettext_lazy is a function within the django.utils.translation module of the Django project. +ugettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-filer diff --git a/content/pages/examples/django/django-utils-translation-ugettext.markdown b/content/pages/examples/django/django-utils-translation-ugettext.markdown index 12b70ad87..4d003aaf6 100644 --- a/content/pages/examples/django/django-utils-translation-ugettext.markdown +++ b/content/pages/examples/django/django-utils-translation-ugettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ugettext code examples +title: django.utils.translation ugettext Example Code category: page slug: django-utils-translation-ugettext-examples -sortorder: 500011504 +sortorder: 500011509 toc: False sidebartitle: django.utils.translation ugettext -meta: Python example code for the ugettext function from the django.utils.translation module of the Django project. +meta: Python example code for the ugettext callable from the django.utils.translation module of the Django project. -ugettext is a function within the django.utils.translation module of the Django project. +ugettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-cms @@ -67,6 +67,11 @@ class CMSPluginBaseMetaclass(forms.MediaDefiningClass): ## ... source file abbreviated to get to ugettext examples ... + + def icon_src(self, instance): + return "" + + def icon_alt(self, instance): return "%s - %s" % (force_text(self.name), force_text(instance)) def get_fieldsets(self, request, obj=None): diff --git a/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown b/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown index 322d48bf1..0872e9896 100644 --- a/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown +++ b/content/pages/examples/django/django-utils-translation-ungettext-lazy.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ungettext_lazy code examples +title: django.utils.translation ungettext_lazy Example Code category: page slug: django-utils-translation-ungettext-lazy-examples -sortorder: 500011507 +sortorder: 500011512 toc: False sidebartitle: django.utils.translation ungettext_lazy -meta: Python example code for the ungettext_lazy function from the django.utils.translation module of the Django project. +meta: Python example code for the ungettext_lazy callable from the django.utils.translation module of the Django project. -ungettext_lazy is a function within the django.utils.translation module of the Django project. +ungettext_lazy is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-angular diff --git a/content/pages/examples/django/django-utils-translation-ungettext.markdown b/content/pages/examples/django/django-utils-translation-ungettext.markdown index 2d1e5714d..ed932d381 100644 --- a/content/pages/examples/django/django-utils-translation-ungettext.markdown +++ b/content/pages/examples/django/django-utils-translation-ungettext.markdown @@ -1,13 +1,13 @@ -title: django.utils.translation ungettext code examples +title: django.utils.translation ungettext Example Code category: page slug: django-utils-translation-ungettext-examples -sortorder: 500011506 +sortorder: 500011511 toc: False sidebartitle: django.utils.translation ungettext -meta: Python example code for the ungettext function from the django.utils.translation module of the Django project. +meta: Python example code for the ungettext callable from the django.utils.translation module of the Django project. -ungettext is a function within the django.utils.translation module of the Django project. +ungettext is a callable within the django.utils.translation module of the Django project. ## Example 1 from django-filer @@ -21,6 +21,10 @@ in Django's admin interface. The project's code is available under the ```python # folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os import re from collections import OrderedDict @@ -71,6 +75,11 @@ Image = load_model(FILER_IMAGE_MODEL) ## ... source file abbreviated to get to ungettext examples ... + response = self.response_action(request, files_queryset=file_qs, folders_queryset=folder_qs) + if response: + return response + else: + msg = _("Items must be selected in order to perform " "actions on them. No items have been changed.") self.message_user(request, msg) @@ -177,6 +186,11 @@ class SearchChangeList(ChangeList): ## ... source file abbreviated to get to ungettext examples ... + "model": self.model, + "list_display": list_display, + "list_display_links": self.list_display_links, + "list_filter": self.list_filter, + "date_hierarchy": self.date_hierarchy, "search_fields": self.search_fields, "list_select_related": self.list_select_related, "list_per_page": self.list_per_page, diff --git a/content/pages/examples/django/django-utils-translation.markdown b/content/pages/examples/django/django-utils-translation.markdown index 79d1cc0b3..e74637893 100644 --- a/content/pages/examples/django/django-utils-translation.markdown +++ b/content/pages/examples/django/django-utils-translation.markdown @@ -1,13 +1,13 @@ -title: django.utils translation code examples +title: django.utils translation Example Code category: page slug: django-utils-translation-examples -sortorder: 500011417 +sortorder: 500011422 toc: False sidebartitle: django.utils translation -meta: Python example code for the translation function from the django.utils module of the Django project. +meta: Python example code for the translation callable from the django.utils module of the Django project. -translation is a function within the django.utils module of the Django project. +translation is a callable within the django.utils module of the Django project. ## Example 1 from django-cms @@ -71,6 +71,11 @@ from cms.utils.urlutils import admin_reverse ## ... source file abbreviated to get to translation examples ... + 'has_add_permission': False, + 'window_close_timeout': 10, + } + if cancel_clicked: + context.update({ 'cancel': True, }) return render(request, 'admin/cms/page/plugin/confirm_form.html', context) @@ -172,6 +177,11 @@ class BaseGeometryWidget(forms.Textarea): ## ... source file abbreviated to get to translation examples ... + + if value and value.geom_type.upper() != self.geom_type and self.geom_type != 'GEOMETRY': + value = None + + wkt = '' if value: srid = self.map_srid if value.srid != srid: @@ -271,6 +281,11 @@ from django.contrib.admin.options import IncorrectLookupParameters ## ... source file abbreviated to get to translation examples ... + + ChangeList = model_admin.get_changelist(request) + + change_list_args = [ + request, model, list_display, list_display_links, list_filter, model_admin.date_hierarchy, search_fields, list_select_related, model_admin.list_per_page, model_admin.list_max_show_all, model_admin.list_editable, model_admin] @@ -383,6 +398,11 @@ class Article(models.Model): ## ... source file abbreviated to get to translation examples ... + return self.current_revision.title + obj_name = _("Article without content (%(id)d)") % {"id": self.id} + return str(obj_name) + + class Meta: permissions = ( ("moderate", _("Can edit all articles and lock/unlock/restore")), ("assign", _("Can change ownership of any article")), diff --git a/content/pages/examples/django/django-utils-tree.markdown b/content/pages/examples/django/django-utils-tree.markdown new file mode 100644 index 000000000..c3496e58f --- /dev/null +++ b/content/pages/examples/django/django-utils-tree.markdown @@ -0,0 +1,123 @@ +title: django.utils tree Example Code +category: page +slug: django-utils-tree-examples +sortorder: 500011423 +toc: False +sidebartitle: django.utils tree +meta: Python example code for the tree callable from the django.utils module of the Django project. + + +tree is a callable within the django.utils module of the Django project. + + +## Example 1 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / backends / __init__.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/backends/__init__.py) + +```python +# __init__.py +import copy +from copy import deepcopy +from time import time + +from django.conf import settings +from django.db.models import Q +from django.db.models.base import ModelBase +~~from django.utils import tree +from django.utils.encoding import force_str + +from haystack.constants import VALID_FILTERS, FILTER_SEPARATOR, DEFAULT_ALIAS +from haystack.exceptions import MoreLikeThisError, FacetingError +from haystack.models import SearchResult +from haystack.utils.loading import UnifiedIndex +from haystack.utils import get_model_ct + +VALID_GAPS = ["year", "month", "day", "hour", "minute", "second"] + +SPELLING_SUGGESTION_HAS_NOT_RUN = object() + + +def log_query(func): + + def wrapper(obj, query_string, *args, **kwargs): + start = time() + + try: + return func(obj, query_string, *args, **kwargs) + finally: + stop = time() + + if settings.DEBUG: + + +## ... source file abbreviated to get to tree examples ... + + + if " " in query_string: + query_string = "(%s)" % query_string + + return "NOT %s" % query_string + + def build_exact_query(self, query_string): + return '"%s"' % query_string + + def add_filter(self, query_filter, use_or=False): + if use_or: + connector = SQ.OR + else: + connector = SQ.AND + + if ( + self.query_filter + and query_filter.connector != connector + and len(query_filter) > 1 + ): + self.query_filter.start_subtree(connector) + subtree = True + else: + subtree = False + + for child in query_filter.children: +~~ if isinstance(child, tree.Node): + self.query_filter.start_subtree(connector) + self.add_filter(child) + self.query_filter.end_subtree() + else: + expression, value = child + self.query_filter.add((expression, value), connector) + + connector = query_filter.connector + + if query_filter.negated: + self.query_filter.negate() + + if subtree: + self.query_filter.end_subtree() + + def add_order_by(self, field): + self.order_by.append(field) + + def clear_order_by(self): + self.order_by = [] + + def add_model(self, model): + if not isinstance(model, ModelBase): + raise AttributeError( + + +## ... source file continues with no further tree examples... + +``` + From 1d17eee2ec2bd383c99188cedfa14974e544478d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 07:41:57 -0400 Subject: [PATCH 083/207] working on code example explanations --- .../django-urls-clear-url-caches.markdown | 78 + .../django/django-urls-get-callable.markdown | 58 + .../django/django-urls-get-resolver.markdown | 209 ++ .../django-urls-get-script-prefix.markdown | 124 + .../django/django-urls-include.markdown | 328 ++ .../django/django-urls-re-path.markdown | 359 +++ .../django-urls-register-converter.markdown | 101 + .../django/django-urls-resolve.markdown | 615 ++++ .../django/django-urls-reverse.markdown | 2796 +++++++++++++++++ .../django/django-urls-urlpattern.markdown | 124 + .../django/django-urls-urlresolver.markdown | 98 + .../examples/flask/flask-app-flask.markdown | 2 +- .../examples/flask/flask-app-headers.markdown | 5 +- .../flask/flask-app-immutabledict.markdown | 2 +- .../flask/flask-blueprints-blueprint.markdown | 4 +- .../flask/flask-cli-appgroup.markdown | 2 +- .../flask/flask-cli-dispatchingapp.markdown | 2 +- .../flask/flask-cli-flaskgroup.markdown | 2 +- .../flask/flask-cli-pass-script-info.markdown | 2 +- .../flask/flask-cli-scriptinfo.markdown | 2 +- .../flask/flask-cli-with-appcontext.markdown | 2 +- .../flask-ctx-after-this-request.markdown | 2 +- .../flask/flask-ctx-has-app-context.markdown | 2 +- .../flask-ctx-has-request-context.markdown | 2 +- .../flask/flask-globals-current-app.markdown | 2 +- .../flask/flask-globals-request.markdown | 13 +- .../flask/flask-globals-session.markdown | 13 +- .../flask/flask-helpers-flash.markdown | 9 +- theme/templates/code-examples/django.html | 141 +- 29 files changed, 5079 insertions(+), 20 deletions(-) create mode 100644 content/pages/examples/django/django-urls-clear-url-caches.markdown create mode 100644 content/pages/examples/django/django-urls-get-callable.markdown create mode 100644 content/pages/examples/django/django-urls-get-resolver.markdown create mode 100644 content/pages/examples/django/django-urls-get-script-prefix.markdown create mode 100644 content/pages/examples/django/django-urls-include.markdown create mode 100644 content/pages/examples/django/django-urls-re-path.markdown create mode 100644 content/pages/examples/django/django-urls-register-converter.markdown create mode 100644 content/pages/examples/django/django-urls-resolve.markdown create mode 100644 content/pages/examples/django/django-urls-reverse.markdown create mode 100644 content/pages/examples/django/django-urls-urlpattern.markdown create mode 100644 content/pages/examples/django/django-urls-urlresolver.markdown diff --git a/content/pages/examples/django/django-urls-clear-url-caches.markdown b/content/pages/examples/django/django-urls-clear-url-caches.markdown new file mode 100644 index 000000000..9917fae45 --- /dev/null +++ b/content/pages/examples/django/django-urls-clear-url-caches.markdown @@ -0,0 +1,78 @@ +title: django.urls clear_url_caches Example Code +category: page +slug: django-urls-clear-url-caches-examples +sortorder: 500011402 +toc: False +sidebartitle: django.urls clear_url_caches +meta: Python example code for the clear_url_caches callable from the django.urls module of the Django project. + + +clear_url_caches is a callable within the django.urls module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / signals / apphook.py**](https://github.com/divio/django-cms/blob/develop/cms/signals/apphook.py) + +```python +# apphook.py +import logging +import sys + +from django.core.management import color_style +from django.core.signals import request_finished +~~from django.urls import clear_url_caches + +from cms.utils.apphook_reload import mark_urlconf_as_changed + + +logger = logging.getLogger(__name__) + +DISPATCH_UID = 'cms-restart' + + +def trigger_server_restart(**kwargs): + mark_urlconf_as_changed() + + +def set_restart_trigger(): + request_finished.connect(trigger_restart, dispatch_uid=DISPATCH_UID) + + +def trigger_restart(**kwargs): + from cms.signals import urls_need_reloading + + request_finished.disconnect(trigger_restart, dispatch_uid=DISPATCH_UID) + urls_need_reloading.send(sender=None) + + +def debug_server_restart(**kwargs): + from cms.appresolver import clear_app_resolvers + if 'runserver' in sys.argv or 'server' in sys.argv: + clear_app_resolvers() +~~ clear_url_caches() + import cms.urls + try: + reload(cms.urls) + except NameError: #python3 + from imp import reload + reload(cms.urls) + if not 'test' in sys.argv: + msg = 'Application url changed and urls_need_reloading signal fired. ' \ + 'Please reload the urls.py or restart the server.\n' + styles = color_style() + msg = styles.NOTICE(msg) + sys.stderr.write(msg) + + + +## ... source file continues with no further clear_url_caches examples... + +``` + diff --git a/content/pages/examples/django/django-urls-get-callable.markdown b/content/pages/examples/django/django-urls-get-callable.markdown new file mode 100644 index 000000000..367b6e01d --- /dev/null +++ b/content/pages/examples/django/django-urls-get-callable.markdown @@ -0,0 +1,58 @@ +title: django.urls get_callable Example Code +category: page +slug: django-urls-get-callable-examples +sortorder: 500011403 +toc: False +sidebartitle: django.urls get_callable +meta: Python example code for the get_callable callable from the django.urls module of the Django project. + + +get_callable is a callable within the django.urls module of the Django project. + + +## Example 1 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / editors / __init__.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/editors/__init__.py) + +```python +# __init__.py +~~from django.urls import get_callable +from wiki.conf import settings + +_EditorClass = None +_editor = None + + +def getEditorClass(): + global _EditorClass + if not _EditorClass: +~~ _EditorClass = get_callable(settings.EDITOR) + return _EditorClass + + +def getEditor(): + global _editor + if not _editor: + _editor = getEditorClass()() + return _editor + + + +## ... source file continues with no further get_callable examples... + +``` + diff --git a/content/pages/examples/django/django-urls-get-resolver.markdown b/content/pages/examples/django/django-urls-get-resolver.markdown new file mode 100644 index 000000000..b88d6017f --- /dev/null +++ b/content/pages/examples/django/django-urls-get-resolver.markdown @@ -0,0 +1,209 @@ +title: django.urls get_resolver Example Code +category: page +slug: django-urls-get-resolver-examples +sortorder: 500011404 +toc: False +sidebartitle: django.urls get_resolver +meta: Python example code for the get_resolver callable from the django.urls module of the Django project. + + +get_resolver is a callable within the django.urls module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / i18n.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/i18n.py) + +```python +# i18n.py +from contextlib import contextmanager + +from django.conf import settings +from django.utils import translation +from django.utils.translation import ugettext_lazy as _ +~~from django.urls import get_resolver + +from cms.exceptions import LanguageError +from cms.utils.compat.dj import LocalePrefixPattern +from cms.utils.conf import get_cms_setting, get_site_id + + +@contextmanager +def force_language(new_lang): + old_lang = get_current_language() + if old_lang != new_lang: + translation.activate(new_lang) + yield + translation.activate(old_lang) + + +def get_languages(site_id=None): + site_id = get_site_id(site_id) + result = get_cms_setting('LANGUAGES').get(site_id) + if not result: + result = [] + defaults = get_cms_setting('LANGUAGES').get('default', {}) + for code, name in settings.LANGUAGES: + lang = {'code': code, 'name': _(name)} + lang.update(defaults) + + +## ... source file abbreviated to get to get_resolver examples ... + + + +def get_fallback_languages(language, site_id=None): + try: + language = get_language_object(language, site_id) + except LanguageError: + language = get_languages(site_id)[0] + return language.get('fallbacks', []) + + +def get_redirect_on_fallback(language, site_id=None): + language = get_language_object(language, site_id) + return language.get('redirect_on_fallback', True) + + +def hide_untranslated(language, site_id=None): + obj = get_language_object(language, site_id) + return obj.get('hide_untranslated', True) + + +def is_language_prefix_patterns_used(): + return any( + isinstance( + getattr(url_pattern, 'pattern', url_pattern), + LocalePrefixPattern + ) +~~ for url_pattern in get_resolver(None).url_patterns + ) + + +def is_valid_site_language(language, site_id): + return language in get_language_list(site_id) + + + +## ... source file continues with no further get_resolver examples... + +``` + + +## Example 2 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / admin.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./admin.py) + +```python +# admin.py +from typing import Tuple, Type, Optional + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import admin +from django.contrib import messages +from django.contrib.admin.sites import NotRegistered +from django.http import HttpResponseRedirect, HttpRequest, HttpResponse +~~from django.urls import get_urlconf, get_resolver +from django.utils.translation import gettext_lazy as _ + +from .fields import TreeItemChoiceField +from .settings import MODEL_TREE, MODEL_TREE_ITEM +from .utils import get_tree_model, get_tree_item_model, get_app_n_model + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +SMUGGLER_INSTALLED = 'smuggler' in django_settings.INSTALLED_APPS + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + +_TREE_ADMIN = lambda: TreeAdmin +_ITEM_ADMIN = lambda: TreeItemAdmin + + +def get_model_url_name(model_nfo: Tuple[str, str], page: str, with_namespace: bool = False) -> str: + prefix = '' + if with_namespace: + prefix = 'admin:' + return (f'{prefix}%s_{page}' % '%s_%s' % model_nfo).lower() + + +## ... source file abbreviated to get to get_resolver examples ... + + + elif '_continue' in request.POST: + return response + + return HttpResponseRedirect('') + + def response_add(self, request, obj, post_url_continue=None, **kwargs): + if post_url_continue is None: + post_url_continue = f'../item_{obj.pk}/' + + return self._redirect(request, super().response_add(request, obj, post_url_continue)) + + def response_change(self, request, obj, **kwargs): + return self._redirect(request, super().response_change(request, obj)) + + def get_form(self, request, obj=None, **kwargs): + if obj is not None and obj.parent is not None: + self.previous_parent = obj.parent + + form = super().get_form(request, obj, **kwargs) + form.base_fields['parent'].choices_init(self.tree) + + if not getattr(self, 'known_url_names', False): + self.known_url_names = [] + self.known_url_rules = [] + +~~ resolver = get_resolver(get_urlconf()) + + for ns, (url_prefix, ns_resolver) in resolver.namespace_dict.items(): + if ns != 'admin': + self._stack_known_urls(ns_resolver.reverse_dict, ns) + + self._stack_known_urls(resolver.reverse_dict) + self.known_url_rules = sorted(self.known_url_rules) + + form.known_url_names_hint = _( + 'You are seeing this warning because "URL as Pattern" option is active and pattern entered above ' + 'seems to be invalid. Currently registered URL pattern names and parameters: ') + + form.known_url_names = self.known_url_names + form.known_url_rules = self.known_url_rules + + return form + + def _stack_known_urls(self, reverse_dict, ns=None): + for url_name, url_rules in reverse_dict.items(): + if isinstance(url_name, str): + if ns is not None: + url_name = f'{ns}:{url_name}' + self.known_url_names.append(url_name) + self.known_url_rules.append(f"{url_name} {' '.join(url_rules[0][0][1])}") + + +## ... source file continues with no further get_resolver examples... + +``` + diff --git a/content/pages/examples/django/django-urls-get-script-prefix.markdown b/content/pages/examples/django/django-urls-get-script-prefix.markdown new file mode 100644 index 000000000..375b7cc92 --- /dev/null +++ b/content/pages/examples/django/django-urls-get-script-prefix.markdown @@ -0,0 +1,124 @@ +title: django.urls get_script_prefix Example Code +category: page +slug: django-urls-get-script-prefix-examples +sortorder: 500011405 +toc: False +sidebartitle: django.urls get_script_prefix +meta: Python example code for the get_script_prefix callable from the django.urls module of the Django project. + + +get_script_prefix is a callable within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / relations.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./relations.py) + +```python +# relations.py +import sys +from collections import OrderedDict +from urllib import parse + +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db.models import Manager +from django.db.models.query import QuerySet +~~from django.urls import NoReverseMatch, Resolver404, get_script_prefix, resolve +from django.utils.encoding import smart_str, uri_to_iri +from django.utils.translation import gettext_lazy as _ + +from rest_framework.fields import ( + Field, empty, get_attribute, is_simple_callable, iter_options +) +from rest_framework.reverse import reverse +from rest_framework.settings import api_settings +from rest_framework.utils import html + + +def method_overridden(method_name, klass, instance): + method = getattr(klass, method_name) + default_method = getattr(method, '__func__', method) # Python 3 compat + return default_method is not getattr(instance, method_name).__func__ + + +class ObjectValueError(ValueError): + + +class ObjectTypeError(TypeError): + + +class Hyperlink(str): + + +## ... source file abbreviated to get to get_script_prefix examples ... + + + return queryset.get(**lookup_kwargs) + except ValueError: + exc = ObjectValueError(str(sys.exc_info()[1])) + raise exc.with_traceback(sys.exc_info()[2]) + except TypeError: + exc = ObjectTypeError(str(sys.exc_info()[1])) + raise exc.with_traceback(sys.exc_info()[2]) + + def get_url(self, obj, view_name, request, format): + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + def to_internal_value(self, data): + request = self.context.get('request', None) + try: + http_prefix = data.startswith(('http:', 'https:')) + except AttributeError: + self.fail('incorrect_type', data_type=type(data).__name__) + + if http_prefix: + data = parse.urlparse(data).path +~~ prefix = get_script_prefix() + if data.startswith(prefix): + data = '/' + data[len(prefix):] + + data = uri_to_iri(parse.unquote(data)) + + try: + match = resolve(data) + except Resolver404: + self.fail('no_match') + + try: + expected_viewname = request.versioning_scheme.get_versioned_viewname( + self.view_name, request + ) + except AttributeError: + expected_viewname = self.view_name + + if match.view_name != expected_viewname: + self.fail('incorrect_match') + + try: + return self.get_object(match.view_name, match.args, match.kwargs) + except (ObjectDoesNotExist, ObjectValueError, ObjectTypeError): + self.fail('does_not_exist') + + +## ... source file continues with no further get_script_prefix examples... + +``` + diff --git a/content/pages/examples/django/django-urls-include.markdown b/content/pages/examples/django/django-urls-include.markdown new file mode 100644 index 000000000..30788b92a --- /dev/null +++ b/content/pages/examples/django/django-urls-include.markdown @@ -0,0 +1,328 @@ +title: django.urls include Example Code +category: page +slug: django-urls-include-examples +sortorder: 500011406 +toc: False +sidebartitle: django.urls include +meta: Python example code for the include callable from the django.urls module of the Django project. + + +include is a callable within the django.urls module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / wwwdccn / urls.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/wwwdccn/urls.py) + +```python +# urls.py +from django.conf import settings +from django.conf.urls.static import static +~~from django.urls import path, include + +urlpatterns = [ +~~ path('', include('public_site.urls')), +~~ path('user/', include('user_site.urls')), +~~ path('auth/', include('auth_app.urls')), +~~ path('users/', include('users.urls')), +~~ path('registration/', include('registration.urls')), +~~ path('conferences/', include('conferences.urls')), +~~ path('submissions/', include('submissions.urls')), +~~ path('chair/', include('chair.urls')), +~~ path('chair_mail/', include('chair_mail.urls')), +~~ path('review/', include('review.urls')), +~~ path('gears/', include('gears.urls')), +~~ path('proceedings/', include('proceedings.urls')), +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + +if settings.USE_LOCAL_MEDIA: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + +if settings.USE_DEBUG_TOOLBAR: + import debug_toolbar + urlpatterns = [ +~~ path('__debug__/', include(debug_toolbar.urls)), + + + ] + urlpatterns + + + +## ... source file continues with no further include examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / urls.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./urls.py) + +```python +# urls.py +from importlib import import_module + +~~from django.urls import include, path + +from allauth.socialaccount import providers + +from . import app_settings + + +~~urlpatterns = [path('', include('allauth.account.urls'))] + +if app_settings.SOCIALACCOUNT_ENABLED: +~~ urlpatterns += [path('social/', include('allauth.socialaccount.urls'))] + +provider_urlpatterns = [] +for provider in providers.registry.get_list(): + try: + prov_mod = import_module(provider.get_package() + '.urls') + except ImportError: + continue + prov_urlpatterns = getattr(prov_mod, 'urlpatterns', None) + if prov_urlpatterns: + provider_urlpatterns += prov_urlpatterns +urlpatterns += provider_urlpatterns + + + +## ... source file continues with no further include examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / sites.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./sites.py) + +```python +# sites.py +from django.apps import apps +~~from django.urls import include +from django.urls import re_path +from django.utils.functional import LazyObject +from django.utils.module_loading import import_string +from wiki.conf import settings +from wiki.core.plugins import registry + + +class WikiSite: + + def __init__(self, name="wiki"): + from wiki.views import accounts, article, deleted_list + + self.name = name + + self.root_view = getattr(self, "root_view", article.CreateRootView.as_view()) + self.root_missing_view = getattr( + self, "root_missing_view", article.MissingRootView.as_view() + ) + + self.article_view = getattr(self, "article_view", article.ArticleView.as_view()) + self.article_create_view = getattr( + self, "article_create_view", article.Create.as_view() + ) + self.article_delete_view = getattr( + + +## ... source file abbreviated to get to include examples ... + + + re_path( + r"^_accounts/settings/$", + self.profile_update_view, + name="profile_update", + ), + ] + else: + urlpatterns = [] + return urlpatterns + + def get_revision_urls(self): + urlpatterns = [ + re_path( + r"^change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), + re_path(r"^preview/$", self.article_preview_view, name="preview_revision"), + re_path( + r"^merge/(?P[0-9]+)/preview/$", + self.revision_preview_merge_view, + name="merge_revision_preview", + ), + ] + return [ +~~ re_path(r"^_revision/(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_urls(self): + urlpatterns = [ + re_path(r"^$", self.article_view, name="get"), + re_path(r"^delete/$", self.article_delete_view, name="delete"), + re_path(r"^deleted/$", self.article_deleted_view, name="deleted"), + re_path(r"^edit/$", self.article_edit_view, name="edit"), + re_path(r"^move/$", self.article_move_view, name="move"), + re_path(r"^preview/$", self.article_preview_view, name="preview"), + re_path(r"^history/$", self.article_history_view, name="history"), + re_path(r"^settings/$", self.article_settings_view, name="settings"), + re_path(r"^source/$", self.article_source_view, name="source"), + re_path( + r"^revision/change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), + re_path( + r"^revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), + re_path( + r"^plugin/(?P\w+)/$", self.article_plugin_view, name="plugin" + ), + ] + return [ +~~ re_path(r"^(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_path_urls(self): + urlpatterns = [ + re_path( + r"^(?P.+/|)_create/$", self.article_create_view, name="create" + ), + re_path( + r"^(?P.+/|)_delete/$", self.article_delete_view, name="delete" + ), + re_path( + r"^(?P.+/|)_deleted/$", self.article_deleted_view, name="deleted" + ), + re_path(r"^(?P.+/|)_edit/$", self.article_edit_view, name="edit"), + re_path(r"^(?P.+/|)_move/$", self.article_move_view, name="move"), + re_path( + r"^(?P.+/|)_preview/$", self.article_preview_view, name="preview" + ), + re_path( + r"^(?P.+/|)_history/$", self.article_history_view, name="history" + ), + re_path(r"^(?P.+/|)_dir/$", self.article_dir_view, name="dir"), + re_path(r"^(?P.+/|)_search/$", self.search_view, name="search"), + re_path( + + +## ... source file abbreviated to get to include examples ... + + + name="change_revision", + ), + re_path( + r"^(?P.+/|)_revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), + re_path( + r"^(?P.+/|)_plugin/(?P\w+)/$", + self.article_plugin_view, + name="plugin", + ), + re_path(r"^(?P.+/|)$", self.article_view, name="get"), + ] + return urlpatterns + + def get_plugin_urls(self): + urlpatterns = [] + for plugin in registry.get_plugins().values(): + slug = getattr(plugin, "slug", None) + if slug: + article_urlpatterns = plugin.urlpatterns.get("article", []) + urlpatterns += [ + re_path( + r"^(?P[0-9]+)/plugin/" + slug + "/", +~~ include(article_urlpatterns), + ), + re_path( + r"^(?P.+/|)_plugin/" + slug + "/", +~~ include(article_urlpatterns), + ), + ] + root_urlpatterns = plugin.urlpatterns.get("root", []) + urlpatterns += [ +~~ re_path(r"^_plugin/" + slug + "/", include(root_urlpatterns)), + ] + return urlpatterns + + +class DefaultWikiSite(LazyObject): + def _setup(self): + WikiSiteClass = import_string(apps.get_app_config("wiki").default_site) + self._wrapped = WikiSiteClass() + + +site = DefaultWikiSite() + + + +## ... source file continues with no further include examples... + +``` + + +## Example 4 from drf-action-serializer +[drf-action-serializer](https://github.com/gregschmit/drf-action-serializer) +([PyPI page](https://pypi.org/project/drf-action-serializer/)) +that makes it easier to configure specific serializers to use based on the +client's request action. For example, a list view should have one serializer +whereas the detail view would have a different serializer. + +The project is open source under the +[MIT license](https://github.com/gregschmit/drf-action-serializer/blob/master/LICENSE). + +[**drf-action-serializer / action_serializer / urls.py**](https://github.com/gregschmit/drf-action-serializer/blob/master/action_serializer/./urls.py) + +```python +# urls.py +from django.contrib import admin +~~from django.urls import include, path +from rest_framework.routers import DefaultRouter + +from .sample_group_viewset import GroupViewSet + + +router = DefaultRouter() +router.register("auth/group", GroupViewSet) +router.register("auth/groups", GroupViewSet) + +urlpatterns = [ +~~ path("api/", include(router.urls)), +~~ path("admin/doc/", include("django.contrib.admindocs.urls")), + path("admin/", admin.site.urls), +] + + + +## ... source file continues with no further include examples... + +``` + diff --git a/content/pages/examples/django/django-urls-re-path.markdown b/content/pages/examples/django/django-urls-re-path.markdown new file mode 100644 index 000000000..e150f7d10 --- /dev/null +++ b/content/pages/examples/django/django-urls-re-path.markdown @@ -0,0 +1,359 @@ +title: django.urls re_path Example Code +category: page +slug: django-urls-re-path-examples +sortorder: 500011408 +toc: False +sidebartitle: django.urls re_path +meta: Python example code for the re_path callable from the django.urls module of the Django project. + + +re_path is a callable within the django.urls module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / urls.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/urls.py) + +```python +# urls.py +~~from django.urls import path, re_path + +from . import views + + +urlpatterns = [ + path("signup/", views.signup, name="account_signup"), + path("login/", views.login, name="account_login"), + path("logout/", views.logout, name="account_logout"), + path("password/change/", views.password_change, + name="account_change_password"), + path("password/set/", views.password_set, name="account_set_password"), + path("inactive/", views.account_inactive, name="account_inactive"), + + path("email/", views.email, name="account_email"), + path("confirm-email/", views.email_verification_sent, + name="account_email_verification_sent"), +~~ re_path(r"^confirm-email/(?P[-:\w]+)/$", views.confirm_email, + name="account_confirm_email"), + + path("password/reset/", views.password_reset, + name="account_reset_password"), + path("password/reset/done/", views.password_reset_done, + name="account_reset_password_done"), +~~ re_path(r"^password/reset/key/(?P[0-9A-Za-z]+)-(?P.+)/$", + views.password_reset_from_key, + name="account_reset_password_from_key"), + path("password/reset/key/done/", views.password_reset_from_key_done, + name="account_reset_password_from_key_done"), +] + + + +## ... source file continues with no further re_path examples... + +``` + + +## Example 2 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / urls.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./urls.py) + +```python +# urls.py +~~from django.urls import re_path + +from . import views + + +app_name = "oauth2_provider" + + +base_urlpatterns = [ +~~ re_path(r"^authorize/$", views.AuthorizationView.as_view(), name="authorize"), +~~ re_path(r"^token/$", views.TokenView.as_view(), name="token"), +~~ re_path(r"^revoke_token/$", views.RevokeTokenView.as_view(), name="revoke-token"), +~~ re_path(r"^introspect/$", views.IntrospectTokenView.as_view(), name="introspect"), +] + + +management_urlpatterns = [ +~~ re_path(r"^applications/$", views.ApplicationList.as_view(), name="list"), +~~ re_path(r"^applications/register/$", views.ApplicationRegistration.as_view(), name="register"), +~~ re_path(r"^applications/(?P[\w-]+)/$", views.ApplicationDetail.as_view(), name="detail"), +~~ re_path(r"^applications/(?P[\w-]+)/delete/$", views.ApplicationDelete.as_view(), name="delete"), +~~ re_path(r"^applications/(?P[\w-]+)/update/$", views.ApplicationUpdate.as_view(), name="update"), +~~ re_path(r"^authorized_tokens/$", views.AuthorizedTokensListView.as_view(), name="authorized-token-list"), +~~ re_path(r"^authorized_tokens/(?P[\w-]+)/delete/$", views.AuthorizedTokenDeleteView.as_view(), + name="authorized-token-delete"), +] + + +urlpatterns = base_urlpatterns + management_urlpatterns + + + +## ... source file continues with no further re_path examples... + +``` + + +## Example 3 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / sites.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./sites.py) + +```python +# sites.py +from django.apps import apps +from django.urls import include +~~from django.urls import re_path +from django.utils.functional import LazyObject +from django.utils.module_loading import import_string +from wiki.conf import settings +from wiki.core.plugins import registry + + +class WikiSite: + + def __init__(self, name="wiki"): + from wiki.views import accounts, article, deleted_list + + self.name = name + + self.root_view = getattr(self, "root_view", article.CreateRootView.as_view()) + self.root_missing_view = getattr( + self, "root_missing_view", article.MissingRootView.as_view() + ) + + self.article_view = getattr(self, "article_view", article.ArticleView.as_view()) + self.article_create_view = getattr( + self, "article_create_view", article.Create.as_view() + ) + self.article_delete_view = getattr( + self, "article_delete_view", article.Delete.as_view() + + +## ... source file abbreviated to get to re_path examples ... + + + self.profile_update_view = getattr( + self, "profile_update_view", accounts.Update.as_view() + ) + + self.deleted_list_view = getattr( + self, "deleted_list_view", deleted_list.DeletedListView.as_view() + ) + + def get_urls(self): + urlpatterns = self.get_root_urls() + urlpatterns += self.get_accounts_urls() + urlpatterns += self.get_deleted_list_urls() + urlpatterns += self.get_revision_urls() + urlpatterns += self.get_article_urls() + urlpatterns += self.get_plugin_urls() + + urlpatterns += self.get_article_path_urls() + return urlpatterns + + @property + def urls(self): + return self.get_urls(), "wiki", self.name + + def get_root_urls(self): + urlpatterns = [ +~~ re_path(r"^$", self.article_view, name="root", kwargs={"path": ""}), +~~ re_path(r"^create-root/$", self.root_view, name="root_create"), +~~ re_path(r"^missing-root/$", self.root_missing_view, name="root_missing"), +~~ re_path(r"^_search/$", self.search_view, name="search"), +~~ re_path( + r"^_revision/diff/(?P[0-9]+)/$", + self.article_diff_view, + name="diff", + ), + ] + return urlpatterns + + def get_deleted_list_urls(self): + urlpatterns = [ +~~ re_path("^_admin/$", self.deleted_list_view, name="deleted_list"), + ] + return urlpatterns + + def get_accounts_urls(self): + if settings.ACCOUNT_HANDLING: + urlpatterns = [ +~~ re_path(r"^_accounts/sign-up/$", self.signup_view, name="signup"), +~~ re_path(r"^_accounts/logout/$", self.logout_view, name="logout"), +~~ re_path(r"^_accounts/login/$", self.login_view, name="login"), +~~ re_path( + r"^_accounts/settings/$", + self.profile_update_view, + name="profile_update", + ), + ] + else: + urlpatterns = [] + return urlpatterns + + def get_revision_urls(self): + urlpatterns = [ +~~ re_path( + r"^change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), +~~ re_path(r"^preview/$", self.article_preview_view, name="preview_revision"), +~~ re_path( + r"^merge/(?P[0-9]+)/preview/$", + self.revision_preview_merge_view, + name="merge_revision_preview", + ), + ] + return [ +~~ re_path(r"^_revision/(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_urls(self): + urlpatterns = [ +~~ re_path(r"^$", self.article_view, name="get"), +~~ re_path(r"^delete/$", self.article_delete_view, name="delete"), +~~ re_path(r"^deleted/$", self.article_deleted_view, name="deleted"), +~~ re_path(r"^edit/$", self.article_edit_view, name="edit"), +~~ re_path(r"^move/$", self.article_move_view, name="move"), +~~ re_path(r"^preview/$", self.article_preview_view, name="preview"), +~~ re_path(r"^history/$", self.article_history_view, name="history"), +~~ re_path(r"^settings/$", self.article_settings_view, name="settings"), +~~ re_path(r"^source/$", self.article_source_view, name="source"), +~~ re_path( + r"^revision/change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), +~~ re_path( + r"^revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), +~~ re_path( + r"^plugin/(?P\w+)/$", self.article_plugin_view, name="plugin" + ), + ] + return [ +~~ re_path(r"^(?P[0-9]+)/", include(urlpatterns)), + ] + + def get_article_path_urls(self): + urlpatterns = [ +~~ re_path( + r"^(?P.+/|)_create/$", self.article_create_view, name="create" + ), +~~ re_path( + r"^(?P.+/|)_delete/$", self.article_delete_view, name="delete" + ), +~~ re_path( + r"^(?P.+/|)_deleted/$", self.article_deleted_view, name="deleted" + ), +~~ re_path(r"^(?P.+/|)_edit/$", self.article_edit_view, name="edit"), +~~ re_path(r"^(?P.+/|)_move/$", self.article_move_view, name="move"), +~~ re_path( + r"^(?P.+/|)_preview/$", self.article_preview_view, name="preview" + ), +~~ re_path( + r"^(?P.+/|)_history/$", self.article_history_view, name="history" + ), +~~ re_path(r"^(?P.+/|)_dir/$", self.article_dir_view, name="dir"), +~~ re_path(r"^(?P.+/|)_search/$", self.search_view, name="search"), +~~ re_path( + r"^(?P.+/|)_settings/$", + self.article_settings_view, + name="settings", + ), +~~ re_path( + r"^(?P.+/|)_source/$", self.article_source_view, name="source" + ), +~~ re_path( + r"^(?P.+/|)_revision/change/(?P[0-9]+)/$", + self.revision_change_view, + name="change_revision", + ), +~~ re_path( + r"^(?P.+/|)_revision/merge/(?P[0-9]+)/$", + self.revision_merge_view, + name="merge_revision", + ), +~~ re_path( + r"^(?P.+/|)_plugin/(?P\w+)/$", + self.article_plugin_view, + name="plugin", + ), +~~ re_path(r"^(?P.+/|)$", self.article_view, name="get"), + ] + return urlpatterns + + def get_plugin_urls(self): + urlpatterns = [] + for plugin in registry.get_plugins().values(): + slug = getattr(plugin, "slug", None) + if slug: + article_urlpatterns = plugin.urlpatterns.get("article", []) + urlpatterns += [ +~~ re_path( + r"^(?P[0-9]+)/plugin/" + slug + "/", + include(article_urlpatterns), + ), +~~ re_path( + r"^(?P.+/|)_plugin/" + slug + "/", + include(article_urlpatterns), + ), + ] + root_urlpatterns = plugin.urlpatterns.get("root", []) + urlpatterns += [ +~~ re_path(r"^_plugin/" + slug + "/", include(root_urlpatterns)), + ] + return urlpatterns + + +class DefaultWikiSite(LazyObject): + def _setup(self): + WikiSiteClass = import_string(apps.get_app_config("wiki").default_site) + self._wrapped = WikiSiteClass() + + +site = DefaultWikiSite() + + + +## ... source file continues with no further re_path examples... + +``` + diff --git a/content/pages/examples/django/django-urls-register-converter.markdown b/content/pages/examples/django/django-urls-register-converter.markdown new file mode 100644 index 000000000..652ace426 --- /dev/null +++ b/content/pages/examples/django/django-urls-register-converter.markdown @@ -0,0 +1,101 @@ +title: django.urls register_converter Example Code +category: page +slug: django-urls-register-converter-examples +sortorder: 500011409 +toc: False +sidebartitle: django.urls register_converter +meta: Python example code for the register_converter callable from the django.urls module of the Django project. + + +register_converter is a callable within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / urlpatterns.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./urlpatterns.py) + +```python +# urlpatterns.py +from django.conf.urls import include, url +~~from django.urls import URLResolver, path, register_converter +from django.urls.resolvers import RoutePattern + +from rest_framework.settings import api_settings + + +def _get_format_path_converter(suffix_kwarg, allowed): + if allowed: + if len(allowed) == 1: + allowed_pattern = allowed[0] + else: + allowed_pattern = '(?:%s)' % '|'.join(allowed) + suffix_pattern = r"\.%s/?" % allowed_pattern + else: + suffix_pattern = r"\.[a-z0-9]+/?" + + class FormatSuffixConverter: + regex = suffix_pattern + + def to_python(self, value): + return value.strip('./') + + def to_url(self, value): + return '.' + value + '/' + + + +## ... source file abbreviated to get to register_converter examples ... + + + assert path is not None + assert suffix_route is not None + route = str(urlpattern.pattern).rstrip('$').rstrip('/') + suffix_route + new_pattern = path(route, view, kwargs, name) + else: + new_pattern = url(regex, view, kwargs, name) + + ret.append(new_pattern) + + return ret + + +def format_suffix_patterns(urlpatterns, suffix_required=False, allowed=None): + suffix_kwarg = api_settings.FORMAT_SUFFIX_KWARG + if allowed: + if len(allowed) == 1: + allowed_pattern = allowed[0] + else: + allowed_pattern = '(%s)' % '|'.join(allowed) + suffix_pattern = r'\.(?P<%s>%s)/?$' % (suffix_kwarg, allowed_pattern) + else: + suffix_pattern = r'\.(?P<%s>[a-z0-9]+)/?$' % suffix_kwarg + + if path and register_converter: + converter_name, suffix_converter = _get_format_path_converter(suffix_kwarg, allowed) +~~ register_converter(suffix_converter, converter_name) + + suffix_route = '<%s:%s>' % (converter_name, suffix_kwarg) + else: + suffix_route = None + + return apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_route) + + + +## ... source file continues with no further register_converter examples... + +``` + diff --git a/content/pages/examples/django/django-urls-resolve.markdown b/content/pages/examples/django/django-urls-resolve.markdown new file mode 100644 index 000000000..3b34c1096 --- /dev/null +++ b/content/pages/examples/django/django-urls-resolve.markdown @@ -0,0 +1,615 @@ +title: django.urls resolve Example Code +category: page +slug: django-urls-resolve-examples +sortorder: 500011410 +toc: False +sidebartitle: django.urls resolve +meta: Python example code for the resolve callable from the django.urls module of the Django project. + + +resolve is a callable within the django.urls module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / core / urlresolvers.py**](https://github.com/jrief/django-angular/blob/master/djng/core/urlresolvers.py) + +```python +# urlresolvers.py +from inspect import isclass + +~~from django.urls import (get_resolver, get_urlconf, resolve, reverse, NoReverseMatch) +from django.core.exceptions import ImproperlyConfigured + +try: + from django.utils.module_loading import import_string +except ImportError: + from django.utils.module_loading import import_by_path as import_string + +from djng.views.mixins import JSONResponseMixin + + +def _get_remote_methods_for(view_object, url): + result = {} + for field in dir(view_object): + member = getattr(view_object, field, None) + if callable(member) and hasattr(member, 'allow_rmi'): + config = { + 'url': url, + 'method': getattr(member, 'allow_rmi'), + 'headers': {'DjNg-Remote-Method': field}, + } + result.update({field: config}) + return result + + +def get_all_remote_methods(resolver=None, ns_prefix=''): + if not resolver: + resolver = get_resolver(get_urlconf()) + result = {} + for name in resolver.reverse_dict.keys(): + if not isinstance(name, str): + continue + try: + url = reverse(ns_prefix + name) +~~ resmgr = resolve(url) + ViewClass = import_string('{0}.{1}'.format(resmgr.func.__module__, resmgr.func.__name__)) + if isclass(ViewClass) and issubclass(ViewClass, JSONResponseMixin): + result[name] = _get_remote_methods_for(ViewClass, url) + except (NoReverseMatch, ImproperlyConfigured): + pass + for namespace, ns_pattern in resolver.namespace_dict.items(): + sub_res = get_all_remote_methods(ns_pattern[1], ns_prefix + namespace + ':') + if sub_res: + result[namespace] = sub_res + return result + + +def get_current_remote_methods(view): + if isinstance(view, JSONResponseMixin): + return _get_remote_methods_for(view, view.request.path_info) + + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / page_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./page_rendering.py) + +```python +# page_rendering.py +from django.conf import settings +from django.http import Http404 +from django.shortcuts import render +from django.template.response import TemplateResponse +~~from django.urls import Resolver404, resolve, reverse + +from cms import __version__ +from cms.cache.page import set_page_cache +from cms.models import Page +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request +from cms.utils.page_permissions import user_can_change_page, user_can_view_page + + +def render_page(request, page, current_language, slug): + context = {} + context['lang'] = current_language + context['current_page'] = page + context['has_change_permissions'] = user_can_change_page(request.user, page) + context['has_view_permissions'] = user_can_view_page(request.user, page) + + if not context['has_view_permissions']: + return _handle_no_page(request) + + template = get_page_template_from_request(request) + response = TemplateResponse(request, template, context) + response.add_post_render_callback(set_page_cache) + + xframe_options = page.get_xframe_options() + if xframe_options == Page.X_FRAME_OPTIONS_INHERIT or xframe_options is None: + return response + + response.xframe_options_exempt = True + + if xframe_options == Page.X_FRAME_OPTIONS_ALLOW: + return response + elif xframe_options == Page.X_FRAME_OPTIONS_SAMEORIGIN: + response['X-Frame-Options'] = 'SAMEORIGIN' + elif xframe_options == Page.X_FRAME_OPTIONS_DENY: + response['X-Frame-Options'] = 'DENY' + return response + + +def render_object_structure(request, obj): + context = { + 'object': obj, + 'cms_toolbar': request.toolbar, + } + return render(request, 'cms/toolbar/structure.html', context) + + +def _handle_no_page(request): + try: +~~ resolve('%s$' % request.path) + except Resolver404 as e: + exc = Http404(dict(path=request.path, tried=e.args[0]['tried'])) + raise exc + raise Http404('CMS Page not found: %s' % request.path) + + +def _render_welcome_page(request): + context = { + 'cms_version': __version__, + 'cms_edit_on': get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'), + 'django_debug': settings.DEBUG, + 'next_url': reverse('pages-root'), + } + return TemplateResponse(request, "cms/welcome.html", context) + + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 3 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / request.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/request.py) + +```python +# request.py +from django.http import Http404 +~~from django.urls import resolve +from django.utils.translation import gettext_lazy as _ + +from debug_toolbar.panels import Panel +from debug_toolbar.utils import get_name_from_obj + + +class RequestPanel(Panel): + + template = "debug_toolbar/panels/request.html" + + title = _("Request") + + @property + def nav_subtitle(self): + view_func = self.get_stats().get("view_func", "") + return view_func.rsplit(".", 1)[-1] + + def generate_stats(self, request, response): + self.record_stats( + { + "get": [(k, request.GET.getlist(k)) for k in sorted(request.GET)], + "post": [(k, request.POST.getlist(k)) for k in sorted(request.POST)], + "cookies": [ + (k, request.COOKIES.get(k)) for k in sorted(request.COOKIES) + ], + } + ) + view_info = { + "view_func": _(""), + "view_args": "None", + "view_kwargs": "None", + "view_urlname": "None", + } + try: +~~ match = resolve(request.path) + func, args, kwargs = match + view_info["view_func"] = get_name_from_obj(func) + view_info["view_args"] = args + view_info["view_kwargs"] = kwargs + view_info["view_urlname"] = getattr(match, "url_name", _("")) + except Http404: + pass + self.record_stats(view_info) + + if hasattr(request, "session"): + self.record_stats( + { + "session": [ + (k, request.session.get(k)) + for k in sorted(request.session.keys()) + ] + } + ) + + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 4 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 +~~ from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + + +## ... source file abbreviated to get to resolve examples ... + + + app_dict[app_label] = { + 'name': name, + 'app_label': app_label, + 'app_url': reverse( + 'admin:app_list', + kwargs={'app_label': app_label}, + current_app=admin_site.name, + ), + 'has_module_perms': has_module_perms, + 'models': [model_dict], + } + + app_list = list(app_dict.values()) + + if order: + app_list.sort(key=lambda x: x['name'].lower()) + + for app in app_list: + app['models'].sort(key=lambda x: x['name']) + + return app_list + + +def get_admin_site(context): + try: +~~ current_resolver = resolve(context.get('request').path) +~~ index_resolver = resolve(reverse('%s:index' % current_resolver.namespaces[0])) + + if hasattr(index_resolver.func, 'admin_site'): + return index_resolver.func.admin_site + + for func_closure in index_resolver.func.__closure__: + if isinstance(func_closure.cell_contents, AdminSite): + return func_closure.cell_contents + except: + pass + + return admin.site + + +def get_admin_site_name(context): + return get_admin_site(context).name + + +class LazyDateTimeEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date): + return obj.isoformat() + elif isinstance(obj, Promise): + return force_text(obj) + return self.encode(obj) + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 5 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / relations.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./relations.py) + +```python +# relations.py +import sys +from collections import OrderedDict +from urllib import parse + +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db.models import Manager +from django.db.models.query import QuerySet +~~from django.urls import NoReverseMatch, Resolver404, get_script_prefix, resolve +from django.utils.encoding import smart_str, uri_to_iri +from django.utils.translation import gettext_lazy as _ + +from rest_framework.fields import ( + Field, empty, get_attribute, is_simple_callable, iter_options +) +from rest_framework.reverse import reverse +from rest_framework.settings import api_settings +from rest_framework.utils import html + + +def method_overridden(method_name, klass, instance): + method = getattr(klass, method_name) + default_method = getattr(method, '__func__', method) # Python 3 compat + return default_method is not getattr(instance, method_name).__func__ + + +class ObjectValueError(ValueError): + + +class ObjectTypeError(TypeError): + + +class Hyperlink(str): + + +## ... source file abbreviated to get to resolve examples ... + + + + def get_url(self, obj, view_name, request, format): + if hasattr(obj, 'pk') and obj.pk in (None, ''): + return None + + lookup_value = getattr(obj, self.lookup_field) + kwargs = {self.lookup_url_kwarg: lookup_value} + return self.reverse(view_name, kwargs=kwargs, request=request, format=format) + + def to_internal_value(self, data): + request = self.context.get('request', None) + try: + http_prefix = data.startswith(('http:', 'https:')) + except AttributeError: + self.fail('incorrect_type', data_type=type(data).__name__) + + if http_prefix: + data = parse.urlparse(data).path + prefix = get_script_prefix() + if data.startswith(prefix): + data = '/' + data[len(prefix):] + + data = uri_to_iri(parse.unquote(data)) + + try: +~~ match = resolve(data) + except Resolver404: + self.fail('no_match') + + try: + expected_viewname = request.versioning_scheme.get_versioned_viewname( + self.view_name, request + ) + except AttributeError: + expected_viewname = self.view_name + + if match.view_name != expected_viewname: + self.fail('incorrect_match') + + try: + return self.get_object(match.view_name, match.args, match.kwargs) + except (ObjectDoesNotExist, ObjectValueError, ObjectTypeError): + self.fail('does_not_exist') + + def to_representation(self, value): + assert 'request' in self.context, ( + "`%s` requires the request in the serializer" + " context. Add `context={'request': request}` when instantiating " + "the serializer." % self.__class__.__name__ + ) + + +## ... source file continues with no further resolve examples... + +``` + + +## Example 6 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py + "UserCreationForm", + "UserUpdateForm", + "WikiSlugField", + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +from django.shortcuts import get_object_or_404 +~~from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + + +## ... source file abbreviated to get to resolve examples ... + + + raise forms.ValidationError(gettext("A slug may not begin with an underscore.")) + if slug == "admin": + raise forms.ValidationError(gettext("'admin' is not a permitted slug name.")) + + if settings.URL_CASE_SENSITIVE: + already_existing_slug = models.URLPath.objects.filter(slug=slug, parent=urlpath) + else: + slug = slug.lower() + already_existing_slug = models.URLPath.objects.filter( + slug__iexact=slug, parent=urlpath + ) + if already_existing_slug: + already_urlpath = already_existing_slug[0] + if already_urlpath.article and already_urlpath.article.current_revision.deleted: + raise forms.ValidationError( + gettext('A deleted article with slug "%s" already exists.') + % already_urlpath.slug + ) + else: + raise forms.ValidationError( + gettext('A slug named "%s" already exists.') % already_urlpath.slug + ) + + if settings.CHECK_SLUG_URL_AVAILABLE: + try: +~~ match = resolve(urlpath.path + "/" + slug + "/") + if match.app_name != "wiki": + raise forms.ValidationError( + gettext("This slug conflicts with an existing URL.") + ) + except Resolver404: + pass + + return slug + + +User = get_user_model() +Group = apps.get_model(settings.GROUP_MODEL) + + +class SpamProtectionMixin: + + + revision_model = models.ArticleRevision + + def check_spam(self): # noqa + request = self.request + user = None + ip_address = None + if request.user.is_authenticated: + + +## ... source file continues with no further resolve examples... + +``` + diff --git a/content/pages/examples/django/django-urls-reverse.markdown b/content/pages/examples/django/django-urls-reverse.markdown new file mode 100644 index 000000000..b56cbce5b --- /dev/null +++ b/content/pages/examples/django/django-urls-reverse.markdown @@ -0,0 +1,2796 @@ +title: django.urls reverse Example Code +category: page +slug: django-urls-reverse-examples +sortorder: 500011411 +toc: False +sidebartitle: django.urls reverse +meta: Python example code for the reverse callable from the django.urls module of the Django project. + + +reverse is a callable within the django.urls module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair/forms.py) + +```python +# forms.py +from functools import reduce + +from django import forms +from django.contrib.auth import get_user_model +from django.db import models +from django.db.models import Q, F, Count, Max, Subquery, OuterRef, Value +from django.db.models.functions import Concat +from django.forms import MultipleChoiceField, ChoiceField, Form +~~from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + +from django_countries import countries + +from conferences.models import Conference, ArtifactDescriptor +from gears.widgets import CustomCheckboxSelectMultiple, CustomFileInput +from review.models import Reviewer, Review, ReviewStats +from review.utilities import get_average_score +from submissions.models import Submission, Attachment +from users.models import Profile + +User = get_user_model() + + +def clean_data_to_int(iterable, empty=None): + return [int(x) if x != '' else None for x in iterable] + + +def q_or(disjuncts, default=True): + if disjuncts: + return reduce(lambda acc, d: acc | d, disjuncts) + return Q(pk__isnull=(not default)) # otherwise, check whether PK is null + + + + +## ... source file abbreviated to get to reverse examples ... + + + record[self.ORDER_COLUMN] = order + + if self.ID_COLUMN in columns: + record[self.ID_COLUMN] = sub.pk + + if self.TITLE_COLUMN in columns: + record[self.TITLE_COLUMN] = sub.title + + if self.AUTHORS_COLUMN in columns: + names = [get_user_name(profiles[a.user_id]) for a in authors] + record[self.AUTHORS_COLUMN] = '; '.join(names) + + if self.COUNTRY_COLUMN in columns: + countries_list = [ + profiles[a.user_id].get_country_display() for a in authors] + countries_list = list(set(countries_list)) # remove duplicates + countries_list.sort() + record[self.COUNTRY_COLUMN] = '; '.join(countries_list) + + if self.STYPE_COLUMN in columns: + record[self.STYPE_COLUMN] = ( + sub.stype.get_language_display() if sub.stype else '') + + if self.REVIEW_PAPER_COLUMN in columns: + record[self.REVIEW_PAPER_COLUMN] = request.build_absolute_uri( +~~ reverse('submissions:download-manuscript', args=[sub.pk])) + + if self.REVIEW_SCORE_COLUMN in columns: + score = get_average_score(sub) + score_string = f'{score:.1f}' if score else '-' + record[self.REVIEW_SCORE_COLUMN] = score_string + + if self.STATUS_COLUMN in columns: + record[self.STATUS_COLUMN] = sub.get_status_display() + + if self.TOPICS_COLUMN in columns: + record[self.TOPICS_COLUMN] = '; '.join(sub.topics.values_list( + 'name', flat=True)) + + + result.append(record) + return result + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / adapter.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/adapter.py) + +```python +# adapter.py +from __future__ import absolute_import + +from django.core.exceptions import ValidationError +~~from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from ..account import app_settings as account_settings +from ..account.adapter import get_adapter as get_account_adapter +from ..account.app_settings import EmailVerificationMethod +from ..account.models import EmailAddress +from ..account.utils import user_email, user_field, user_username +from ..utils import ( + deserialize_instance, + email_address_exists, + import_attribute, + serialize_instance, + valid_email_or_none, +) +from . import app_settings + + +class DefaultSocialAccountAdapter(object): + + error_messages = { + 'email_taken': + _("An account already exists with this e-mail address." + " Please sign in to that account first, then connect" + " your %s account.") + + +## ... source file abbreviated to get to reverse examples ... + + + get_account_adapter().save_user(request, u, form) + else: + get_account_adapter().populate_username(request, u) + sociallogin.save(request) + return u + + def populate_user(self, + request, + sociallogin, + data): + username = data.get('username') + first_name = data.get('first_name') + last_name = data.get('last_name') + email = data.get('email') + name = data.get('name') + user = sociallogin.user + user_username(user, username or '') + user_email(user, valid_email_or_none(email) or '') + name_parts = (name or '').partition(' ') + user_field(user, 'first_name', first_name or name_parts[0]) + user_field(user, 'last_name', last_name or name_parts[2]) + return user + + def get_connect_redirect_url(self, request, socialaccount): + assert request.user.is_authenticated +~~ url = reverse('socialaccount_connections') + return url + + def validate_disconnect(self, account, accounts): + if len(accounts) == 1: + if not account.user.has_usable_password(): + raise ValidationError(_("Your account has no password set" + " up.")) + if app_settings.EMAIL_VERIFICATION \ + == EmailVerificationMethod.MANDATORY: + if EmailAddress.objects.filter(user=account.user, + verified=True).count() == 0: + raise ValidationError(_("Your account has no verified" + " e-mail address.")) + + def is_auto_signup_allowed(self, request, sociallogin): + auto_signup = app_settings.AUTO_SIGNUP + if auto_signup: + email = user_email(sociallogin.user) + if email: + if account_settings.UNIQUE_EMAIL: + if email_address_exists(email): + auto_signup = False + elif app_settings.EMAIL_REQUIRED: + auto_signup = False + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 3 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / urls.py**](https://github.com/jrief/django-angular/blob/master/djng/./urls.py) + +```python +# urls.py +import warnings +~~from django.urls import reverse +from django.conf.urls import url +from django.http.response import HttpResponsePermanentRedirect + + +warnings.warn("Reversing URL's using urlpatterns is deprecated. Please use the middleware instead", + DeprecationWarning) + + +def angular_reverse(request, *args, **kwargs): + url_name = request.GET.get('djng_url_name') + url_args = request.GET.getlist('djng_url_args', None) + url_kwargs = {} + + prefix = 'djng_url_kwarg_' + for param in request.GET: + if param.startswith(prefix): + url_kwargs[param[len(prefix):]] = request.GET[param] + +~~ url = reverse(url_name, args=url_args, kwargs=url_kwargs) + return HttpResponsePermanentRedirect(url) + + +urlpatterns = [ + url(r'^reverse/$', angular_reverse), +] + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 4 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / tests / test_handlers.py**](https://github.com/jazzband/django-axes/blob/master/axes/tests/test_handlers.py) + +```python +# test_handlers.py +from unittest.mock import MagicMock, patch + +from django.test import override_settings +~~from django.urls import reverse +from django.utils import timezone +from django.utils.timezone import timedelta + +from axes.conf import settings +from axes.handlers.proxy import AxesProxyHandler +from axes.helpers import get_client_str +from axes.models import AccessAttempt, AccessLog +from axes.tests.base import AxesTestCase + + +@override_settings(AXES_HANDLER="axes.handlers.base.AxesHandler") +class AxesHandlerTestCase(AxesTestCase): + def test_base_handler_reset_attempts_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_attempts() + + def test_base_handler_reset_logs_raises(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.reset_logs() + + def test_base_handler_raises_on_undefined_is_allowed_to_authenticate(self): + with self.assertRaises(NotImplementedError): + AxesProxyHandler.is_allowed(self.request, {}) + + + +## ... source file abbreviated to get to reverse examples ... + + + @override_settings( + AXES_NEVER_LOCKOUT_WHITELIST=True, AXES_IP_WHITELIST=["127.0.0.1"] + ) + def test_is_allowed_with_whitelisted_ip_address(self): + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + @override_settings(AXES_NEVER_LOCKOUT_GET=True) + def test_is_allowed_with_whitelisted_method(self): + self.request.method = "GET" + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + @override_settings(AXES_LOCK_OUT_AT_FAILURE=False) + def test_is_allowed_no_lock_out(self): + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + @override_settings(AXES_ONLY_ADMIN_SITE=True) + def test_only_admin_site(self): + request = MagicMock() + request.path = "/test/" + self.assertTrue(AxesProxyHandler.is_allowed(self.request)) + + def test_is_admin_site(self): + request = MagicMock() + tests = ( # (AXES_ONLY_ADMIN_SITE, URL, Expected) + (True, "/test/", True), +~~ (True, reverse("admin:index"), False), + (False, "/test/", False), +~~ (False, reverse("admin:index"), False), + ) + + for setting_value, url, expected in tests: + with override_settings(AXES_ONLY_ADMIN_SITE=setting_value): + request.path = url + self.assertEqual(AxesProxyHandler().is_admin_site(request), expected) + + @override_settings(ROOT_URLCONF="axes.tests.urls_empty") + @override_settings(AXES_ONLY_ADMIN_SITE=True) + def test_is_admin_site_no_admin_site(self): + request = MagicMock() + request.path = "/admin/" + self.assertTrue(AxesProxyHandler().is_admin_site(self.request)) + + +class AxesProxyHandlerTestCase(AxesTestCase): + def setUp(self): + self.sender = MagicMock() + self.credentials = MagicMock() + self.request = MagicMock() + self.user = MagicMock() + self.instance = MagicMock() + + @patch("axes.handlers.proxy.AxesProxyHandler.implementation", None) + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 5 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / page_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./page_rendering.py) + +```python +# page_rendering.py +from django.conf import settings +from django.http import Http404 +from django.shortcuts import render +from django.template.response import TemplateResponse +~~from django.urls import Resolver404, resolve, reverse + +from cms import __version__ +from cms.cache.page import set_page_cache +from cms.models import Page +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request +from cms.utils.page_permissions import user_can_change_page, user_can_view_page + + +def render_page(request, page, current_language, slug): + context = {} + context['lang'] = current_language + context['current_page'] = page + context['has_change_permissions'] = user_can_change_page(request.user, page) + context['has_view_permissions'] = user_can_view_page(request.user, page) + + if not context['has_view_permissions']: + return _handle_no_page(request) + + template = get_page_template_from_request(request) + response = TemplateResponse(request, template, context) + response.add_post_render_callback(set_page_cache) + + xframe_options = page.get_xframe_options() + + +## ... source file abbreviated to get to reverse examples ... + + + return response + + +def render_object_structure(request, obj): + context = { + 'object': obj, + 'cms_toolbar': request.toolbar, + } + return render(request, 'cms/toolbar/structure.html', context) + + +def _handle_no_page(request): + try: + resolve('%s$' % request.path) + except Resolver404 as e: + exc = Http404(dict(path=request.path, tried=e.args[0]['tried'])) + raise exc + raise Http404('CMS Page not found: %s' % request.path) + + +def _render_welcome_page(request): + context = { + 'cms_version': __version__, + 'cms_edit_on': get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'), + 'django_debug': settings.DEBUG, +~~ 'next_url': reverse('pages-root'), + } + return TemplateResponse(request, "cms/welcome.html", context) + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 6 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / admin / widgets.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/admin/widgets.py) + +```python +# widgets.py +import six +from six.moves import urllib +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.template.loader import render_to_string +from django.templatetags.static import static +~~from django.urls import reverse +from django.utils.safestring import mark_safe +from django.utils.text import Truncator + + +class ForeignKeySearchInput(ForeignKeyRawIdWidget): + + widget_template = None + search_path = None + + def _media(self): + js_files = [ + static('django_extensions/js/jquery.bgiframe.js'), + static('django_extensions/js/jquery.ajaxQueue.js'), + static('django_extensions/js/jquery.autocomplete.js'), + ] + + return forms.Media( + css={'all': (static('django_extensions/css/jquery.autocomplete.css'), )}, + js=js_files, + ) + media = property(_media) + + def label_for_value(self, value): + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) + + return Truncator(obj).words(14, truncate='...') + + def __init__(self, rel, search_fields, attrs=None): + self.search_fields = search_fields + super().__init__(rel, site, attrs) + + def render(self, name, value, attrs=None, renderer=None): + if attrs is None: + attrs = {} + opts = self.rel.model._meta + app_label = opts.app_label + model_name = opts.object_name.lower() +~~ related_url = reverse('admin:%s_%s_changelist' % (app_label, model_name)) + if not self.search_path: + self.search_path = urllib.parse.urljoin(related_url, 'foreignkey_autocomplete/') + params = self.url_parameters() + if params: + url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()]) + else: + url = '' + + if 'class' not in attrs: + attrs['class'] = 'vForeignKeyRawIdAdminField' + output = [forms.TextInput.render(self, name, value, attrs)] + + if value: + label = self.label_for_value(value) + else: + label = six.u('') + + context = { + 'url': url, + 'related_url': related_url, + 'search_path': self.search_path, + 'search_fields': ','.join(self.search_fields), + 'app_label': app_label, + 'model_name': model_name, + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 7 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / fileadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/fileadmin.py) + +```python +# fileadmin.py +from __future__ import absolute_import + +from django import forms +from django.contrib.admin.utils import unquote +from django.http import HttpResponseRedirect +~~from django.urls import reverse +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ + +from .. import settings +from ..models import File +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import AdminContext, admin_url_params_encoded, popup_status + + +class FileAdminChangeFrom(forms.ModelForm): + class Meta(object): + model = File + exclude = () + + +class FileAdmin(PrimitivePermissionAwareModelAdmin): + list_display = ('label',) + list_per_page = 10 + search_fields = ['name', 'original_filename', 'sha1', 'description'] + raw_id_fields = ('owner',) + readonly_fields = ('sha1', 'display_canonical') + + form = FileAdminChangeFrom + + + +## ... source file abbreviated to get to reverse examples ... + + + (_('Advanced'), { + 'fields': ( + 'file', + 'sha1', + 'display_canonical', + ) + extra_advanced_fields, + 'classes': ('collapse',), + }), + ) + extra_fieldsets + if settings.FILER_ENABLE_PERMISSIONS: + fieldsets = fieldsets + ( + (None, { + 'fields': ('is_public',) + }), + ) + return fieldsets + + def response_change(self, request, obj): + if ( + request.POST + and '_continue' not in request.POST + and '_saveasnew' not in request.POST + and '_addanother' not in request.POST + ): + if obj.folder: +~~ url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': obj.folder.id}) + else: +~~ url = reverse( + 'admin:filer-directory_listing-unfiled_images') + url = "{0}{1}".format( + url, + admin_url_params_encoded(request), + ) + return HttpResponseRedirect(url) + return super(FileAdmin, self).response_change(request, obj) + + def render_change_form(self, request, context, add=False, change=False, + form_url='', obj=None): + info = self.model._meta.app_label, self.model._meta.model_name + extra_context = {'show_delete': True, + 'history_url': 'admin:%s_%s_history' % info, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request)} + context.update(extra_context) + return super(FileAdmin, self).render_change_form( + request=request, context=context, add=add, change=change, + form_url=form_url, obj=obj) + + def delete_view(self, request, object_id, extra_context=None): + try: + obj = self.get_queryset(request).get(pk=unquote(object_id)) + parent_folder = obj.folder + except self.model.DoesNotExist: + parent_folder = None + + if request.POST: + super(FileAdmin, self).delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + if parent_folder: +~~ url = reverse('admin:filer-directory_listing', + kwargs={'folder_id': parent_folder.id}) + else: +~~ url = reverse('admin:filer-directory_listing-unfiled_images') + url = "{0}{1}".format( + url, + admin_url_params_encoded(request) + ) + return HttpResponseRedirect(url) + + return super(FileAdmin, self).delete_view( + request=request, object_id=object_id, + extra_context=extra_context) + + def get_model_perms(self, request): + return { + 'add': False, + 'change': False, + 'delete': False, + } + + def display_canonical(self, instance): + canonical = instance.canonical_url + if canonical: + return mark_safe('%s' % (canonical, canonical)) + else: + return '-' + display_canonical.allow_tags = True + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 8 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +from django.shortcuts import get_object_or_404, redirect, render +~~from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + obj_perms_manage_template = \ + + +## ... source file abbreviated to get to reverse examples ... + + + path('/permissions/group-manage//', + view=self.admin_site.admin_view( + self.obj_perms_manage_group_view), + name='%s_%s_permissions_manage_group' % info), + ] + urls = myurls + urls + return urls + + def get_obj_perms_base_context(self, request, obj): + context = self.admin_site.each_context(request) + context.update({ + 'adminform': {'model_admin': self}, + 'media': self.media, + 'object': obj, + 'app_label': self.model._meta.app_label, + 'opts': self.model._meta, + 'original': str(obj), + 'has_change_permission': self.has_change_permission(request, obj), + 'model_perms': get_perms_for_model(obj), + 'title': _("Object permissions"), + }) + return context + + def obj_perms_manage_view(self, request, object_pk): + if not self.has_change_permission(request, None): +~~ post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + from django.contrib.admin.utils import unquote + obj = get_object_or_404(self.get_queryset( + request), pk=unquote(object_pk)) + users_perms = OrderedDict( + sorted( + get_users_with_perms(obj, attach_perms=True, + with_group_users=False).items(), + key=lambda user: getattr( + user[0], get_user_model().USERNAME_FIELD) + ) + ) + + groups_perms = OrderedDict( + sorted( + get_groups_with_perms(obj, attach_perms=True).items(), + key=lambda group: group[0].name + ) + ) + + if request.method == 'POST' and 'submit_manage_user' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if user_form.is_valid(): + user_id = user_form.cleaned_data['user'].pk +~~ url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user_id] + ) + return redirect(url) + elif request.method == 'POST' and 'submit_manage_group' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if group_form.is_valid(): + group_id = group_form.cleaned_data['group'].id +~~ url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group_id] + ) + return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): +~~ post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + user = get_object_or_404(get_user_model(), pk=user_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) +~~ url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): +~~ post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + group = get_object_or_404(Group, id=group_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) +~~ url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_group_template(), context) + + def get_obj_perms_manage_group_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_group.html' + return self.obj_perms_manage_group_template + + def get_obj_perms_manage_group_form(self, request): + return AdminGroupObjectPermissionsForm + + +class GuardedModelAdmin(GuardedModelAdminMixin, admin.ModelAdmin): + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 9 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / admin.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./admin.py) + +```python +# admin.py +from datetime import datetime + +import django +from django import forms +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.contrib.admin.models import ADDITION, CHANGE, DELETION, LogEntry +from django.contrib.auth import get_permission_codename +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied +from django.http import HttpResponse, HttpResponseRedirect +from django.template.response import TemplateResponse +~~from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_str +from django.utils.module_loading import import_string +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.http import require_POST + +from .formats.base_formats import DEFAULT_FORMATS +from .forms import ConfirmImportForm, ExportForm, ImportForm, export_action_form_factory +from .resources import modelresource_factory +from .results import RowResult +from .signals import post_export, post_import +from .tmp_storages import TempFolderStorage + +SKIP_ADMIN_LOG = getattr(settings, 'IMPORT_EXPORT_SKIP_ADMIN_LOG', False) +TMP_STORAGE_CLASS = getattr(settings, 'IMPORT_EXPORT_TMP_STORAGE_CLASS', + TempFolderStorage) + + +if isinstance(TMP_STORAGE_CLASS, str): + TMP_STORAGE_CLASS = import_string(TMP_STORAGE_CLASS) + + +class ImportExportMixinBase: + def get_model_info(self): + + +## ... source file abbreviated to get to reverse examples ... + + + + result = self.process_dataset(dataset, confirm_form, request, *args, **kwargs) + + tmp_storage.remove() + + return self.process_result(result, request) + + def process_dataset(self, dataset, confirm_form, request, *args, **kwargs): + + res_kwargs = self.get_import_resource_kwargs(request, form=confirm_form, *args, **kwargs) + resource = self.get_import_resource_class()(**res_kwargs) + + imp_kwargs = self.get_import_data_kwargs(request, form=confirm_form, *args, **kwargs) + return resource.import_data(dataset, + dry_run=False, + raise_errors=True, + file_name=confirm_form.cleaned_data['original_file_name'], + user=request.user, + **imp_kwargs) + + def process_result(self, result, request): + self.generate_log_entries(result, request) + self.add_success_message(result, request) + post_import.send(sender=None, model=self.model) + +~~ url = reverse('admin:%s_%s_changelist' % self.get_model_info(), + current_app=self.admin_site.name) + return HttpResponseRedirect(url) + + def generate_log_entries(self, result, request): + if not self.get_skip_admin_log(): + logentry_map = { + RowResult.IMPORT_TYPE_NEW: ADDITION, + RowResult.IMPORT_TYPE_UPDATE: CHANGE, + RowResult.IMPORT_TYPE_DELETE: DELETION, + } + content_type_id = ContentType.objects.get_for_model(self.model).pk + for row in result: + if row.import_type != row.IMPORT_TYPE_ERROR and row.import_type != row.IMPORT_TYPE_SKIP: + LogEntry.objects.log_action( + user_id=request.user.pk, + content_type_id=content_type_id, + object_id=row.object_id, + object_repr=row.object_repr, + action_flag=logentry_map[row.import_type], + change_message=_("%s through import_export" % row.import_type), + ) + + def add_success_message(self, result, request): + opts = self.model._meta + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 10 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / actions.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./actions.py) + +```python +# actions.py +from django.contrib import messages +from django.shortcuts import redirect +~~from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + + +class ViewAction: + inline_actions = ['view_action'] + + def view_action(self, request, obj, parent_obj=None): +~~ url = reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + obj._meta.model_name, + ), + args=(obj.pk,) + ) + return redirect(url) + view_action.short_description = _("View") + + +class DeleteAction: + def get_inline_actions(self, request, obj=None): + actions = super().get_inline_actions(request, obj) + if self.has_delete_permission(request, obj): + actions.append('delete_action') + return actions + + def delete_action(self, request, obj, parent_obj=None): + if self.has_delete_permission(request): + obj.delete() + messages.info(request, "`{}` deleted.".format(obj)) + delete_action.short_description = _("Delete") + + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 11 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / utils.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./utils.py) + +```python +# utils.py +import datetime +import json +from django.template import Context +from django.utils import translation +from jet import settings +from jet.models import PinnedApplication + +try: + from django.apps.registry import apps +except ImportError: + try: + from django.apps import apps # Fix Django 1.7 import issue + except ImportError: + pass +from django.core.serializers.json import DjangoJSONEncoder +from django.http import HttpResponse +try: + from django.core.urlresolvers import reverse, resolve, NoReverseMatch +except ImportError: # Django 1.11 +~~ from django.urls import reverse, resolve, NoReverseMatch + +from django.contrib.admin import AdminSite +from django.utils.encoding import smart_text +from django.utils.text import capfirst +from django.contrib import messages +from django.utils.encoding import force_text +from django.utils.functional import Promise +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ +from django.utils.text import slugify + +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict # Python 2.6 + + +class JsonResponse(HttpResponse): + + def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs): + if safe and not isinstance(data, dict): + raise TypeError('In order to allow non-dict objects to be ' + 'serialized set the safe parameter to False') + + +## ... source file abbreviated to get to reverse examples ... + + +def get_app_list(context, order=True): + admin_site = get_admin_site(context) + request = context['request'] + + app_dict = {} + for model, model_admin in admin_site._registry.items(): + app_label = model._meta.app_label + try: + has_module_perms = model_admin.has_module_permission(request) + except AttributeError: + has_module_perms = request.user.has_module_perms(app_label) # Fix Django < 1.8 issue + + if has_module_perms: + perms = model_admin.get_model_perms(request) + + if True in perms.values(): + info = (app_label, model._meta.model_name) + model_dict = { + 'name': capfirst(model._meta.verbose_name_plural), + 'object_name': model._meta.object_name, + 'perms': perms, + 'model_name': model._meta.model_name + } + if perms.get('change', False): + try: +~~ model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if perms.get('add', False): + try: +~~ model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=admin_site.name) + except NoReverseMatch: + pass + if app_label in app_dict: + app_dict[app_label]['models'].append(model_dict) + else: + try: + name = apps.get_app_config(app_label).verbose_name + except NameError: + name = app_label.title() + app_dict[app_label] = { + 'name': name, + 'app_label': app_label, +~~ 'app_url': reverse( + 'admin:app_list', + kwargs={'app_label': app_label}, + current_app=admin_site.name, + ), + 'has_module_perms': has_module_perms, + 'models': [model_dict], + } + + app_list = list(app_dict.values()) + + if order: + app_list.sort(key=lambda x: x['name'].lower()) + + for app in app_list: + app['models'].sort(key=lambda x: x['name']) + + return app_list + + +def get_admin_site(context): + try: + current_resolver = resolve(context.get('request').path) + index_resolver = resolve(reverse('%s:index' % current_resolver.namespaces[0])) + + + +## ... source file abbreviated to get to reverse examples ... + + + return instance.related_label() + return smart_text(instance) + + +class SuccessMessageMixin(object): + success_message = '' + + def form_valid(self, form): + response = super(SuccessMessageMixin, self).form_valid(form) + success_message = self.get_success_message(form.cleaned_data) + if success_message: + messages.success(self.request, success_message) + return response + + def get_success_message(self, cleaned_data): + return self.success_message % cleaned_data + + +def get_model_queryset(admin_site, model, request, preserved_filters=None): + model_admin = admin_site._registry.get(model) + + if model_admin is None: + return + + try: +~~ changelist_url = reverse('%s:%s_%s_changelist' % ( + admin_site.name, + model._meta.app_label, + model._meta.model_name + )) + except NoReverseMatch: + return + + changelist_filters = None + + if preserved_filters: + changelist_filters = preserved_filters.get('_changelist_filters') + + if changelist_filters: + changelist_url += '?' + changelist_filters + + if model_admin: + queryset = model_admin.get_queryset(request) + else: + queryset = model.objects + + list_display = model_admin.get_list_display(request) + list_display_links = model_admin.get_list_display_links(request, list_display) + list_filter = model_admin.get_list_filter(request) + search_fields = model_admin.get_search_fields(request) \ + + +## ... source file abbreviated to get to reverse examples ... + + + 'url': model.get('admin_url'), + 'url_blank': False, + 'name': model['model_name'], + 'object_name': model['object_name'], + 'label': model.get('name', model['object_name']), + 'has_perms': any(model.get('perms', {}).values()), + }, app['models'])), + 'pinned': app['app_label'] in pinned_apps, + 'custom': False + }, original_app_list) + + +def get_menu_item_url(url, original_app_list): + if isinstance(url, dict): + url_type = url.get('type') + + if url_type == 'app': + return original_app_list[url['app_label']]['url'] + elif url_type == 'model': + models = dict(map( + lambda x: (x['name'], x['url']), + original_app_list[url['app_label']]['models'] + )) + return models[url['model']] + elif url_type == 'reverse': +~~ return reverse(url['name'], args=url.get('args'), kwargs=url.get('kwargs')) + elif isinstance(url, str): + return url + + +def get_menu_items(context): + pinned_apps = PinnedApplication.objects.filter(user=context['user'].pk).values_list('app_label', flat=True) + original_app_list = OrderedDict(map(lambda app: (app['app_label'], app), get_original_menu_items(context))) + custom_app_list = settings.JET_SIDE_MENU_ITEMS + custom_app_list_deprecated = settings.JET_SIDE_MENU_CUSTOM_APPS + + if custom_app_list not in (None, False): + if isinstance(custom_app_list, dict): + admin_site = get_admin_site(context) + custom_app_list = custom_app_list.get(admin_site.name, []) + + app_list = [] + + def get_menu_item_app_model(app_label, data): + item = {'has_perms': True} + + if 'name' in data: + parts = data['name'].split('.', 2) + + if len(parts) > 1: + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 12 from django-loginas +[django-loginas](https://github.com/skorokithakis/django-loginas) +([PyPI package information](https://pypi.org/project/django-loginas/)) +is [Django](/django.html) code library for admins to log into an application +as another user, typically for debugging purposes. + +django-loginas is open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE). + +[**django-loginas / loginas / tests / tests.py**](https://github.com/skorokithakis/django-loginas/blob/master/loginas/tests/tests.py) + +```python +# tests.py +from __future__ import absolute_import, print_function, unicode_literals + +import unittest +from datetime import timedelta + +import django +from django.conf import settings as django_settings +from django.contrib.auth.models import User +from django.contrib.messages.storage.cookie import CookieStorage +from django.core.exceptions import ImproperlyConfigured, PermissionDenied +from django.test import Client, TestCase +from django.test.utils import override_settings as override_settings_orig +from django.utils import timezone +from loginas import settings as la_settings + +try: + from django.core.urlresolvers import reverse +except ImportError: +~~ from django.urls import reverse + +try: + from urllib.parse import urlsplit +except ImportError: + from urlparse import urlsplit # type: ignore + + +try: + import imp + + reload = imp.reload # @ReservedAssignment +except ImportError: + pass + + +class override_settings(override_settings_orig): + + def enable(self): + super(override_settings, self).enable() + from loginas import settings as loginas_settings + + reload(loginas_settings) + + def disable(self): + + +## ... source file abbreviated to get to reverse examples ... + + + raise PermissionDenied("You can't login as target user") + + +class WrongAuthBackend: + + def authenticate(self, *args, **kwargs): + return None + + +class ViewTest(TestCase): + + + def setUp(self): + self.client = Client(enforce_csrf_checks=True) + self.client.get("/") # To get the CSRF token for next request + assert django_settings.CSRF_COOKIE_NAME in self.client.cookies + self.target_user = User.objects.create(username="target") + + def get_csrf_token_payload(self): + return {"csrfmiddlewaretoken": self.client.cookies[django_settings.CSRF_COOKIE_NAME].value} + + def get_target_url(self, target_user=None): + if target_user is None: + target_user = self.target_user + response = self.client.post( +~~ reverse("loginas-user-login", kwargs={"user_id": target_user.id}), data=self.get_csrf_token_payload() + ) + self.assertEqual(response.status_code, 302) + return response + + def assertCurrentUserIs(self, user): + id_ = str(user.id if user is not None else None).encode("utf-8") + r = self.client.post(reverse("current_user"), data=self.get_csrf_token_payload()) + self.assertEqual(r.content, id_) + + def assertLoginError(self, resp, message=None): + self.assertEqual(urlsplit(resp["Location"])[2], "/") + message = message or "You do not have permission to do that." + messages = CookieStorage(resp)._decode(resp.cookies["messages"].value) + self.assertIn((40, message), [(m.level, m.message) for m in messages]) + + def assertLoginSuccess(self, resp, user): + self.assertEqual(urlsplit(resp["Location"])[2], django_settings.LOGIN_REDIRECT_URL) + msg = la_settings.MESSAGE_LOGIN_SWITCH.format(username=user.__dict__[la_settings.USERNAME_FIELD]) + messages = CookieStorage(resp)._decode(resp.cookies["messages"].value) + self.assertIn(msg, "".join([m.message for m in messages])) + + def assertRaisesExact(self, exception, func, *args, **kwargs): + try: + func(*args, **kwargs) + + +## ... source file abbreviated to get to reverse examples ... + + + self.assertCurrentUserIs(user) + + @unittest.skipIf(django.VERSION[:2] < (1, 10), "Django < 1.10 allows to authenticate as inactive user") + def test_auth_backends_user_not_found(self): + superuser = create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + self.assertCurrentUserIs(superuser) + inactive_user = create_user("name", "pass", is_active=False) + with self.settings( + AUTHENTICATION_BACKENDS=("django.contrib.auth.backends.ModelBackend", "tests.WrongAuthBackend") + ): + message = "Could not find an appropriate authentication backend" + self.assertLoginError(self.get_target_url(target_user=inactive_user), message=message) + self.assertCurrentUserIs(superuser) + + @override_settings(CAN_LOGIN_AS=can_login_as_always_raise_permission_denied) + def test_can_login_as_permission_denied(self): + message = "You can't login as target user" + self.assertLoginError(self.get_target_url(), message=message) + + def test_as_anonymous_user(self): + self.assertLoginError(self.get_target_url()) + self.assertCurrentUserIs(None) + + def test_get_405_method_not_allowed(self): +~~ url = reverse("loginas-user-login", kwargs={"user_id": "0"}) + r = self.client.get(url) + self.assertEqual(r.status_code, 405) + + def test_missing_csrf_token_403_forbidden(self): +~~ url = reverse("loginas-user-login", kwargs={"user_id": "0"}) + r = self.client.post(url) + self.assertEqual(r.status_code, 403) + + @override_settings(LOGINAS_REDIRECT_URL="/another-redirect") + def test_loginas_redirect_url(self): + create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + + response = self.client.post( +~~ reverse("loginas-user-login", kwargs={"user_id": self.target_user.id}), data=self.get_csrf_token_payload() + ) + self.assertEqual(response.status_code, 302) + self.assertEqual(urlsplit(response["Location"])[2], "/another-redirect") + + def test_restore_original_user(self): + + original_user = create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + response = self.get_target_url() + self.assertLoginSuccess(response, self.target_user) + +~~ url = reverse("loginas-user-login", kwargs={"user_id": self.target_user.id}) + self.client.get(url) + self.assertCurrentUserIs(self.target_user) + +~~ url = reverse("loginas-logout") + self.client.get(url) + self.assertCurrentUserIs(original_user) + + @override_settings(LOGINAS_LOGOUT_REDIRECT_URL="/another-redirect") + def test_loginas_redirect_url_again(self): + create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + response = self.client.get(reverse("loginas-logout")) + self.assertEqual(response.status_code, 302) + self.assertEqual(urlsplit(response["Location"])[2], "/another-redirect") + + def test_last_login_not_updated(self): + last_login = timezone.now() - timedelta(hours=1) + self.target_user.last_login = last_login + self.target_user.save() + create_user("me", "pass", is_superuser=True, is_staff=True) + self.assertTrue(self.client.login(username="me", password="pass")) + response = self.get_target_url() + self.assertLoginSuccess(response, self.target_user) + self.assertCurrentUserIs(self.target_user) + target_user = User.objects.get(id=self.target_user.id) # refresh from db + self.assertEqual(target_user.last_login, last_login) + + @override_settings(LOGINAS_UPDATE_LAST_LOGIN=True) + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 13 from django-mongonaut +[django-mongonaut](https://github.com/jazzband/django-mongonaut) +([project documentation](https://django-mongonaut.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-mongonaut/)) +provides an introspective interface for working with +[MongoDB](/mongodb.html) via mongoengine. The project has its own new code +to map MongoDB to the [Django](/django.html) Admin interface. + +django-mongonaut's highlighted features include automatic introspection of +mongoengine documents, the ability to constrain who sees what and what +they can do and full control for adding, editing and deleting documents. + +The django-mongonaut project is open sourced under the +[MIT License](https://github.com/jazzband/django-mongonaut/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-mongonaut / mongonaut / views.py**](https://github.com/jazzband/django-mongonaut/blob/master/mongonaut/./views.py) + +```python +# views.py +import math + +from django.contrib import messages +~~from django.urls import reverse +from django.forms import Form +from django.http import HttpResponseForbidden +from django.http import Http404 +from django.utils.functional import cached_property +from django.views.generic.edit import DeletionMixin +from django.views.generic import ListView +from django.views.generic import TemplateView +from django.views.generic.edit import FormView +from mongoengine.fields import EmbeddedDocumentField, ListField + +from mongonaut.forms import MongoModelForm +from mongonaut.mixins import MongonautFormViewMixin +from mongonaut.mixins import MongonautViewMixin +from mongonaut.utils import is_valid_object_id + + +class IndexView(MongonautViewMixin, ListView): + + template_name = "mongonaut/index.html" + queryset = [] + permission = 'has_view_permission' + + def get_queryset(self): + return self.get_mongoadmins() + + +## ... source file abbreviated to get to reverse examples ... + + + context['app_label'] = self.app_label + context['document_name'] = self.document_name + context['keys'] = ['id', ] + context['embedded_documents'] = [] + context['list_fields'] = [] + for key in sorted([x for x in self.document._fields.keys() if x != 'id']): + if isinstance(self.document._fields[key], EmbeddedDocumentField): + context['embedded_documents'].append(key) + continue + if isinstance(self.document._fields[key], ListField): + context['list_fields'].append(key) + continue + context['keys'].append(key) + return context + + +class DocumentEditFormView(MongonautViewMixin, FormView, MongonautFormViewMixin): + + template_name = "mongonaut/document_edit_form.html" + form_class = Form + success_url = '/' + permission = 'has_edit_permission' + + def get_success_url(self): + self.set_mongonaut_base() +~~ return reverse('document_detail_edit_form', kwargs={'app_label': self.app_label, 'document_name': self.document_name, 'id': self.kwargs.get('id')}) + + def get_context_data(self, **kwargs): + context = super(DocumentEditFormView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + + context['document'] = self.document + context['app_label'] = self.app_label + context['document_name'] = self.document_name +~~ context['form_action'] = reverse('document_detail_edit_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name'), + self.kwargs.get('id')]) + + return context + + def get_form(self): #get_form(self, Form) leads to "get_form() missing 1 required positional argument: 'Form'" error." + self.set_mongoadmin() + context = self.set_permissions_in_context({}) + + if not context['has_edit_permission']: + return HttpResponseForbidden("You do not have permissions to edit this content.") + + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + try: + self.document = self.document_type.objects.get(pk=self.ident) + except self.document_type.DoesNotExist: + raise Http404 + self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your changes have been saved.') + else: + self.form = MongoModelForm(model=self.document_type, instance=self.document).get_form() + return self.form + + +class DocumentAddFormView(MongonautViewMixin, FormView, MongonautFormViewMixin): + + template_name = "mongonaut/document_add_form.html" + form_class = Form + success_url = '/' + permission = 'has_add_permission' + + def get_success_url(self): + self.set_mongonaut_base() +~~ return reverse('document_detail', kwargs={'app_label': self.app_label, 'document_name': self.document_name, 'id': str(self.new_document.id)}) + + def get_context_data(self, **kwargs): + context = super(DocumentAddFormView, self).get_context_data(**kwargs) + self.set_mongoadmin() + context = self.set_permissions_in_context(context) + self.document_type = getattr(self.models, self.document_name) + + context['app_label'] = self.app_label + context['document_name'] = self.document_name +~~ context['form_action'] = reverse('document_detail_add_form', args=[self.kwargs.get('app_label'), + self.kwargs.get('document_name')]) + + return context + + def get_form(self): + self.set_mongonaut_base() + self.document_type = getattr(self.models, self.document_name) + self.form = Form() + + if self.request.method == 'POST': + self.form = self.process_post_form('Your new document has been added and saved.') + else: + self.form = MongoModelForm(model=self.document_type).get_form() + return self.form + + +class DocumentDeleteView(DeletionMixin, MongonautViewMixin, TemplateView): + + success_url = "/" + template_name = "mongonaut/document_delete.html" + + def get_success_url(self): + self.set_mongonaut_base() + messages.add_message(self.request, messages.INFO, 'Your document has been deleted.') +~~ return reverse('document_list', kwargs={'app_label': self.app_label, 'document_name': self.document_name}) + + def get_object(self): + self.set_mongoadmin() + self.document_type = getattr(self.models, self.document_name) + self.ident = self.kwargs.get('id') + self.document = self.document_type.objects.get(pk=self.ident) + return self.document + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 14 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / models.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./models.py) + +```python +# models.py +import logging +from datetime import timedelta +from urllib.parse import parse_qsl, urlparse + +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db import models, transaction +~~from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from .generators import generate_client_id, generate_client_secret +from .scopes import get_scopes_backend +from .settings import oauth2_settings +from .validators import RedirectURIValidator, WildcardSet + + +logger = logging.getLogger(__name__) + + +class AbstractApplication(models.Model): + CLIENT_CONFIDENTIAL = "confidential" + CLIENT_PUBLIC = "public" + CLIENT_TYPES = ( + (CLIENT_CONFIDENTIAL, _("Confidential")), + (CLIENT_PUBLIC, _("Public")), + ) + + GRANT_AUTHORIZATION_CODE = "authorization-code" + GRANT_IMPLICIT = "implicit" + GRANT_PASSWORD = "password" + GRANT_CLIENT_CREDENTIALS = "client-credentials" + + +## ... source file abbreviated to get to reverse examples ... + + + + grant_types = ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + AbstractApplication.GRANT_IMPLICIT, + ) + + redirect_uris = self.redirect_uris.strip().split() + allowed_schemes = set(s.lower() for s in self.get_allowed_schemes()) + + if redirect_uris: + validator = RedirectURIValidator(WildcardSet()) + for uri in redirect_uris: + validator(uri) + scheme = urlparse(uri).scheme + if scheme not in allowed_schemes: + raise ValidationError(_( + "Unauthorized redirect scheme: {scheme}" + ).format(scheme=scheme)) + + elif self.authorization_grant_type in grant_types: + raise ValidationError(_( + "redirect_uris cannot be empty with grant_type {grant_type}" + ).format(grant_type=self.authorization_grant_type)) + + def get_absolute_url(self): +~~ return reverse("oauth2_provider:detail", args=[str(self.id)]) + + def get_allowed_schemes(self): + return oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES + + def allows_grant_type(self, *grant_types): + return self.authorization_grant_type in grant_types + + def is_usable(self, request): + return True + + +class ApplicationManager(models.Manager): + def get_by_natural_key(self, client_id): + return self.get(client_id=client_id) + + +class Application(AbstractApplication): + objects = ApplicationManager() + + class Meta(AbstractApplication.Meta): + swappable = "OAUTH2_PROVIDER_APPLICATION_MODEL" + + def natural_key(self): + return (self.client_id,) + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 15 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / reverse.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./reverse.py) + +```python +# reverse.py +from django.urls import NoReverseMatch +~~from django.urls import reverse as django_reverse +from django.utils.functional import lazy + +from rest_framework.settings import api_settings +from rest_framework.utils.urls import replace_query_param + + +def preserve_builtin_query_params(url, request=None): + if request is None: + return url + + overrides = [ + api_settings.URL_FORMAT_OVERRIDE, + ] + + for param in overrides: + if param and (param in request.GET): + value = request.GET[param] + url = replace_query_param(url, param, value) + + return url + + +~~def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + scheme = getattr(request, 'versioning_scheme', None) + if scheme is not None: + try: + url = scheme.reverse(viewname, args, kwargs, request, format, **extra) + except NoReverseMatch: + url = _reverse(viewname, args, kwargs, request, format, **extra) + else: + url = _reverse(viewname, args, kwargs, request, format, **extra) + + return preserve_builtin_query_params(url, request) + + +def _reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): + if format is not None: + kwargs = kwargs or {} + kwargs['format'] = format + url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) + if request: + return request.build_absolute_uri(url) + return url + + +reverse_lazy = lazy(reverse, str) + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 16 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / models.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./models.py) + +```python +# models.py +from __future__ import unicode_literals + +import logging +from time import time +import six + +from django.db import models, DatabaseError +try: +~~ from django.urls import reverse +except ImportError: + from django.core.urlresolvers import reverse + +from django.conf import settings + +from explorer import app_settings +from explorer.utils import ( + passes_blacklist, + swap_params, + extract_params, + shared_dict_update, + get_s3_bucket, + get_params_for_url, + get_valid_connection +) + +MSG_FAILED_BLACKLIST = "Query failed the SQL blacklist: %s" + + +logger = logging.getLogger(__name__) + +@six.python_2_unicode_compatible +class Query(models.Model): + title = models.CharField(max_length=255) + + +## ... source file abbreviated to get to reverse examples ... + + + return swap_params(self.sql, self.available_params()) + + def execute_query_only(self): + return QueryResult(self.final_sql(), get_valid_connection(self.connection)) + + def execute_with_logging(self, executing_user): + ql = self.log(executing_user) + ret = self.execute() + ql.duration = ret.duration + ql.save() + return ret, ql + + def execute(self): + ret = self.execute_query_only() + ret.process() + return ret + + def available_params(self): + + p = extract_params(self.sql) + if self.params: + shared_dict_update(p, self.params) + return p + + def get_absolute_url(self): +~~ return reverse("query_detail", kwargs={'query_id': self.id}) + + @property + def params_for_url(self): + return get_params_for_url(self) + + def log(self, user=None): + if user: + try: + is_anonymous = user.is_anonymous() + except TypeError: + is_anonymous = user.is_anonymous + if is_anonymous: + user = None + ql = QueryLog(sql=self.final_sql(), query_id=self.id, run_by_user=user, connection=self.connection) + ql.save() + return ql + + @property + def shared(self): + return self.id in set(sum(app_settings.EXPLORER_GET_USER_QUERY_VIEWS().values(), [])) + + @property + def snapshots(self): + if app_settings.ENABLE_TASKS: + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 17 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / columns / base.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/columns/base.py) + +```python +# base.py +from collections import OrderedDict +from itertools import islice + +from django.core.exceptions import ImproperlyConfigured +~~from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import SafeData +from django.utils.text import capfirst + +from ..utils import ( + Accessor, + AttributeDict, + OrderBy, + OrderByTuple, + call_with_appropriate, + computed_values, +) + + +class Library: + + def __init__(self): + self.columns = [] + + def register(self, column): + if not hasattr(column, "from_field"): + raise ImproperlyConfigured( + "{} is not a subclass of Column".format(column.__class__.__name__) + ) + + +## ... source file abbreviated to get to reverse examples ... + + + "for linkify=True, '{}' must have a method get_absolute_url".format( + str(context) + ) + ) + return context.get_absolute_url() + + def call_reverse(self, record): + + def resolve_if_accessor(val): + return val.resolve(record) if isinstance(val, Accessor) else val + + params = self.reverse_args.copy() + + params["viewname"] = resolve_if_accessor(params["viewname"]) + if params.get("urlconf", None): + params["urlconf"] = resolve_if_accessor(params["urlconf"]) + if params.get("args", None): + params["args"] = [resolve_if_accessor(a) for a in params["args"]] + if params.get("kwargs", None): + params["kwargs"] = { + key: resolve_if_accessor(val) for key, val in params["kwargs"].items() + } + if params.get("current_app", None): + params["current_app"] = resolve_if_accessor(params["current_app"]) + +~~ return reverse(**params) + + def get_attrs(self, **kwargs): + attrs = AttributeDict(self.attrs or {}) + attrs["href"] = self.compose_url(**kwargs) + + return attrs + + def __call__(self, content, **kwargs): + attrs = self.get_attrs(**kwargs) + if attrs["href"] is None: + return content + + return format_html("{}", attrs.as_html(), content) + + +@library.register +class Column: + + creation_counter = 0 + empty_values = (None, "") + + link = None + + _explicit = False + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 18 from django-webshell +[django-webshell](https://github.com/onrik/django-webshell) is an extension +for executing arbitrary code in the +[Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/), +similar to how you can run code by using the `django manage.py shell` +command from the terminal. + +The django-webshell project is provided as open source under the +[MIT license](https://github.com/onrik/django-webshell/blob/master/LICENSE). + +[**django-webshell / webshell / tests.py**](https://github.com/onrik/django-webshell/blob/master/webshell/./tests.py) + +```python +# tests.py +from django.test import TestCase +from django.conf import settings +from django.contrib.auth import get_user_model +try: + from django.core.urlresolvers import reverse +except ImportError: +~~ from django.urls import reverse + +from webshell.models import Script + +User = get_user_model() + + +class WebshellTestCase(TestCase): + def setUp(self): + self.user = User.objects.create( + username='user', is_staff=True, is_superuser=True) + self.user.set_password('123456') + self.user.save() +~~ self.url = reverse('execute-script') + self.login_url = '%s?next=%s' % (settings.LOGIN_URL, self.url) + + def login(self): + self.assertTrue(self.client.login( + username=self.user.username, password='123456')) + + def test_wrong_method(self): + response = self.client.get(self.url) + self.assertEqual(response.status_code, 405) + + def test_login_required(self): + response = self.client.post(self.url) + self.assertRedirects(response, self.login_url, 302, 404) + + def test_superuser_required(self): + self.user.is_superuser = False + self.user.save() + self.login() + response = self.client.post(self.url) + self.assertRedirects(response, self.login_url, 302, 404) + + def test_success(self): + self.login() + + response = self.client.post(self.url, data={'source': 'print(1)'}) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.content, b'1\n') + + def test_success_exception(self): + self.login() + + response = self.client.post(self.url, data={'source': '[1][1]'}) + self.assertEqual(response.status_code, 200) + self.assertIn(b'IndexError: list index out of range', response.content) + + def test_admin(self): + self.login() + + script = Script.objects.create(name='Test') + + urls = ( +~~ reverse('admin:webshell_script_add'), +~~ reverse('admin:webshell_script_change', args=[script.id]), +~~ reverse('admin:webshell_script_changelist'), + ) + + for url in urls: + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 19 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / decorators.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./decorators.py) + +```python +# decorators.py +from functools import wraps + +from django.http import HttpResponseForbidden +from django.http import HttpResponseNotFound +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +from django.template.loader import render_to_string +~~from django.urls import reverse +from django.utils.http import urlquote +from wiki.conf import settings +from wiki.core.exceptions import NoRootURL + + +def response_forbidden(request, article, urlpath, read_denied=False): + if request.user.is_anonymous: + qs = request.META.get("QUERY_STRING", "") + if qs: + qs = urlquote("?" + qs) + else: + qs = "" + return redirect(settings.LOGIN_URL + "?next=" + request.path + qs) + else: + return HttpResponseForbidden( + render_to_string( + "wiki/permission_denied.html", + context={ + "article": article, + "urlpath": urlpath, + "read_denied": read_denied, + }, + request=request, + ) + + +## ... source file abbreviated to get to reverse examples ... + + + can_write=False, + deleted_contents=False, + not_locked=False, + can_delete=False, + can_moderate=False, + can_create=False, +): + + def wrapper(request, *args, **kwargs): + from . import models + + path = kwargs.pop("path", None) + article_id = kwargs.pop("article_id", None) + + if path is not None: + try: + urlpath = models.URLPath.get_by_path(path, select_related=True) + except NoRootURL: + return redirect("wiki:root_create") + except models.URLPath.DoesNotExist: + try: + pathlist = list(filter(lambda x: x != "", path.split("/"),)) + path = "/".join(pathlist[:-1]) + parent = models.URLPath.get_by_path(path) + return HttpResponseRedirect( +~~ reverse("wiki:create", kwargs={"path": parent.path}) + + "?slug=%s" % pathlist[-1].lower() + ) + except models.URLPath.DoesNotExist: + return HttpResponseNotFound( + render_to_string( + "wiki/error.html", + context={"error_type": "ancestors_missing"}, + request=request, + ) + ) + if urlpath.article: + article = urlpath.article + else: +~~ return_url = reverse("wiki:get", kwargs={"path": urlpath.parent.path}) + urlpath.delete() + return HttpResponseRedirect(return_url) + + elif article_id: + articles = models.Article.objects + + article = get_object_or_404(articles, id=article_id) + try: + urlpath = models.URLPath.objects.get(articles__article=article) + except ( + models.URLPath.DoesNotExist, + models.URLPath.MultipleObjectsReturned, + ): + urlpath = None + + else: + raise TypeError("You should specify either article_id or path") + + if not deleted_contents: + if urlpath: + if urlpath.is_deleted(): # This also checks all ancestors + return redirect("wiki:deleted", path=urlpath.path) + else: + if article.current_revision and article.current_revision.deleted: + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 20 from graphite-web +[Graphite](https://github.com/graphite-project/graphite-web) +([project website](http://graphiteapp.org/), +[documentation](https://graphite.readthedocs.io/en/latest/) and +[PyPI package information](https://pypi.org/project/graphite-web/)) +is a metrics collection and visualization tool, built with both +Python and JavaScript. Metrics are collected by a Node.js application +and displayed using a [Django](/django.html) web application, +called "Graphite-Web", which is one of three core projects under +the Graphite umbrella (the other two are +[Carbon](https://github.com/graphite-project/carbon) and +[Whisper](https://github.com/graphite-project/whisper)). + +Graphite is provided as open sourced under the +[Apache License 2.0](https://github.com/graphite-project/whisper/blob/master/LICENSE). + +[**graphite-web / webapp / tests / test_metrics.py**](https://github.com/graphite-project/graphite-web/blob/master/webapp/tests/test_metrics.py) + +```python +# test_metrics.py +import copy +import os +import shutil +import time + +from mock import patch + +from django.conf import settings +try: +~~ from django.urls import reverse +except ImportError: # Django < 1.10 + from django.core.urlresolvers import reverse +from .base import TestCase + +import whisper + +from graphite.util import unpickle, msgpack, json + + +class MetricsTester(TestCase): + db = os.path.join(settings.WHISPER_DIR, 'test.wsp') + hostcpu = os.path.join(settings.WHISPER_DIR, 'hosts/hostname/cpu.wsp') + + def wipe_whisper(self): + try: + os.remove(self.db) + except OSError: + pass + + def create_whisper_hosts(self, ts=None): + worker1 = self.hostcpu.replace('hostname', 'worker1') + worker2 = self.hostcpu.replace('hostname', 'worker2') + try: + os.makedirs(worker1.replace('cpu.wsp', '')) + os.makedirs(worker2.replace('cpu.wsp', '')) + except OSError: + pass + + whisper.create(worker1, [(1, 60)]) + whisper.create(worker2, [(1, 60)]) + + ts = ts or int(time.time()) + whisper.update(worker1, 1, ts) + whisper.update(worker2, 2, ts) + + def wipe_whisper_hosts(self): + try: + os.remove(self.hostcpu.replace('hostname', 'worker1')) + os.remove(self.hostcpu.replace('hostname', 'worker2')) + shutil.rmtree(self.hostcpu.replace('hostname/cpu.wsp', '')) + except OSError: + pass + + def test_index_json(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_index') + + request = {} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data[0], 'hosts.worker1.cpu') + self.assertEqual(data[1], 'hosts.worker2.cpu') + + + request = {'jsonp': 'callback'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content.split(b"(")[1].strip(b")")) + self.assertEqual(data[0], 'hosts.worker1.cpu') + self.assertEqual(data[1], 'hosts.worker2.cpu') + + def mock_STORE_get_index(self, requestContext=None): + raise Exception('test') + + with patch('graphite.metrics.views.STORE.get_index', mock_STORE_get_index): + request = {} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 500) + data = json.loads(response.content) + self.assertEqual(data, []) + + def test_find_view(self): + ts = int(time.time()) + + self.create_whisper_hosts(ts) + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_find') + + response = self.client.post(url, {}) + self.assertEqual(response.status_code, 400) + self.assertEqual(response.content, b"Bad Request: Missing required parameter 'query'") + + response = self.client.post(url, { + 'query': '*', + 'from': 'now-1h', + 'until': 'now-2h', + }) + self.assertEqual(response.status_code, 400) + self.assertRegex(response.content, b"^Bad Request: Failed to instantiate find query: Invalid interval start=[0-9]+ end=[0-9]+$") + + response = self.client.post(url, { + 'query': '*', + 'wildcards': '123a', + }) + self.assertEqual(response.status_code, 400) + self.assertRegex(response.content, b"^Bad Request: Invalid int value u?'123a' for param wildcards: invalid literal for int\\(\\) with base 10: u?'123a'$") + + response = self.client.post(url, { + 'query': '*', + 'from': 'now-1mmminute', # "mmminute" is misspelled + }) + + +## ... source file abbreviated to get to reverse examples ... + + + + request['query']='hosts.*.cpu' + content = test_find_view_basics(request) + data = json.loads(content.split(b"(")[1].strip(b")")) + self.assertEqual(len(data), 2) + + self.assertEqual(data[0]['path'], 'hosts.worker1.cpu') + self.assertEqual(data[0]['is_leaf'], True) + self.assertEqual(len(data[0]['intervals']), 1) + self.assertIn(int(data[0]['intervals'][0]['end']), [ts, ts - 1]) + + self.assertEqual(data[1]['path'], 'hosts.worker2.cpu') + self.assertEqual(data[1]['is_leaf'], True) + self.assertEqual(len(data[1]['intervals']), 1) + self.assertIn(int(data[1]['intervals'][0]['end']), [ts, ts - 1]) + + request['query']='other' + content = test_find_view_basics(request) + data = json.loads(content.split(b"(")[1].strip(b")")) + self.assertEqual(data, []) + + def test_expand_view(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_expand') + + request = {'query': '*'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['results'], [u'hosts']) + + request = {'query': ''} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['results'], [u'']) + + def test_get_metadata_view(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_get_metadata') + + request = {'metric': 'hosts.worker1.cpu', 'key': 'a'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['hosts.worker1.cpu']['error'], "Unexpected error occurred in CarbonLink.get_metadata(hosts.worker1.cpu, a)") + + def test_set_metadata_view(self): + self.create_whisper_hosts() + self.addCleanup(self.wipe_whisper_hosts) + +~~ url = reverse('metrics_set_metadata') + + request = {'metric': 'hosts.worker1.cpu', 'key': 'a', 'value': 'b'} + response = self.client.get(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['hosts.worker1.cpu']['error'], "Unexpected error occurred in CarbonLink.set_metadata(hosts.worker1.cpu, a)") + + request = {'operations': '[{ "metric": "hosts.worker1.cpu", "key": "a", "value": "b" }]'} + response = self.client.post(url, request) + self.assertEqual(response.status_code, 200) + data = json.loads(response.content) + self.assertEqual(data['hosts.worker1.cpu']['error'], "Unexpected error occurred in bulk CarbonLink.set_metadata(hosts.worker1.cpu)") + + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 21 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / views.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./views.py) + +```python +# views.py +from __future__ import unicode_literals + +import logging +import collections +import datetime +import json +import random + +import dateutil.parser +import django.contrib.messages +~~import django.urls +import django.http +import django.shortcuts +import django.views.generic.edit +import django.forms +import django.utils +from django.core.cache import cache +from django.conf import settings +from formtools.wizard.forms import ManagementForm +from formtools.wizard.storage import get_storage +from formtools.wizard.views import NamedUrlSessionWizardView +from django.utils.translation import ugettext_lazy as _ +from django.utils.safestring import mark_safe + +from axes import utils +import dateutil.parser + +import cobrand.models +import widget.models +import fiftythree.client +import forms + +logger = logging.getLogger(__name__) + +SESSION_REGISTRATION_CONFIGURATION = 'registration_configuration' + + +## ... source file abbreviated to get to reverse examples ... + + + secure=False, httponly=True) + return response + + +class StateLookupView(MinorRestrictedMixin, django.views.generic.edit.FormView): + template_name = 'registration/start.html' + form_class = forms.StateLookupForm + accepts_registration = True + + def get(self, request, *args, **kwargs): + clean_session(request.session) + clean_next_of_kin_email_session(request.session) + setup_external_source_session(request) + if self.request.GET.get('email') and self.request.GET.get('postal_code'): + email = self.request.GET['email'] + postal_code = self.request.GET['postal_code'] + form = self.form_class(data={'email': email, 'postal_code': postal_code}) + if form.is_valid(): + return self.form_valid(form) + else: + return self.form_invalid(form) + return super(StateLookupView, self).get(request, *args, **kwargs) + + def get_success_url(self): + if self.accepts_registration: +~~ return django.urls.reverse( + 'register', kwargs={'step': '1',}) + else: +~~ return django.urls.reverse('unsupported_state') + + def get_initial(self): + initial = self.initial.copy() + if 'email' in self.request.GET: + initial['email'] = self.request.GET['email'] + if 'postal_code' in self.request.GET: + initial['postal_code'] = self.request.GET['postal_code'] + return initial + + def get_context_data(self, **kwargs): + data = super(StateLookupView, self).get_context_data(**kwargs) + data['update'] = self.is_update + if data['update']: + data['page_title'] = _('Update your registration') + else: + data['page_title'] = _('Let’s Begin...') + + return data + + @property + def is_update(self): + return self.kwargs.get('update') is True + + def submit_email(self, data): + + +## ... source file abbreviated to get to reverse examples ... + + +class WaitingListFilmRedirectView(django.views.generic.RedirectView): + def get_redirect_url(self, *args, **kwargs): + return '/?reg_source=waitinglistfilm' + + +class UnsupportedStateView(django.views.generic.TemplateView): + template_name = 'registration/unsupported_state.html' + + def get(self, request, *args, **kwargs): + redirect_url = self.request.session.get(SESSION_REDIRECT_URL) + if not redirect_url: + return django.shortcuts.redirect('start') + context = self.get_context_data(**kwargs) + context['state'] = self.request.session[SESSION_STATE] + context['state_name'] = self.request.session[SESSION_STATE_NAME] + return self.render_to_response(context) + + +class StateRedirectView(django.views.generic.RedirectView): + def get_redirect_url(self, *args, **kwargs): + redirect_url = self.request.session.get(SESSION_REDIRECT_URL) + clean_session(self.request.session) + if redirect_url: + return redirect_url + else: +~~ return django.urls.reverse('start') + + +class RegistrationWizardView(MinorRestrictedMixin, NamedUrlSessionWizardView): + form_list = [forms.StateLookupForm, ] + page_titles = collections.OrderedDict() + page_fieldsets = collections.OrderedDict() + page_explanatory_texts = collections.OrderedDict() + page_count = 0 + configuration = None + api_error_key = 'api_error' + + def check_configuration(self): + if not self.configuration and (SESSION_REGISTRATION_CONFIGURATION not in self.request.session): + return False + else: + return True + + def process_registration_configuration(self): + self.configuration = self.request.session[SESSION_REGISTRATION_CONFIGURATION] + license_id_formats = None + if SESSION_LICENSE_ID_FORMATS in self.request.session: + license_id_formats = self.request.session[SESSION_LICENSE_ID_FORMATS] + + validate_organ_tissue_selection = False + + +## ... source file continues with no further reverse examples... + +``` + + +## Example 22 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / models.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/models.py) + +```python +# models.py +from django.contrib.admin.utils import quote +from django.core import checks +~~from django.urls import reverse + +from wagtail.admin.checks import check_panels_in_model +from wagtail.admin.models import get_object_usage + +SNIPPET_MODELS = [] + + +def get_snippet_models(): + return SNIPPET_MODELS + + +def register_snippet(model): + if model not in SNIPPET_MODELS: + model.get_usage = get_object_usage + model.usage_url = get_snippet_usage_url + SNIPPET_MODELS.append(model) + SNIPPET_MODELS.sort(key=lambda x: x._meta.verbose_name) + + @checks.register('panels') + def modeladmin_model_check(app_configs, **kwargs): + errors = check_panels_in_model(model, 'snippets') + return errors + + return model + + +def get_snippet_usage_url(self): +~~ return reverse('wagtailsnippets:usage', args=( + self._meta.app_label, self._meta.model_name, quote(self.pk))) + + + +## ... source file continues with no further reverse examples... + +``` + diff --git a/content/pages/examples/django/django-urls-urlpattern.markdown b/content/pages/examples/django/django-urls-urlpattern.markdown new file mode 100644 index 000000000..267bba914 --- /dev/null +++ b/content/pages/examples/django/django-urls-urlpattern.markdown @@ -0,0 +1,124 @@ +title: django.urls URLPattern Example Code +category: page +slug: django-urls-urlpattern-examples +sortorder: 500011400 +toc: False +sidebartitle: django.urls URLPattern +meta: Python example code for the URLPattern class from the django.urls module of the Django project. + + +URLPattern is a class within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / schemas / generators.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/schemas/generators.py) + +```python +# generators.py +import re +from importlib import import_module + +from django.conf import settings +from django.contrib.admindocs.views import simplify_regex +from django.core.exceptions import PermissionDenied +from django.http import Http404 +~~from django.urls import URLPattern, URLResolver + +from rest_framework import exceptions +from rest_framework.request import clone_request +from rest_framework.settings import api_settings +from rest_framework.utils.model_meta import _get_pk + + +def get_pk_name(model): + meta = model._meta.concrete_model._meta + return _get_pk(meta).name + + +def is_api_view(callback): + from rest_framework.views import APIView + cls = getattr(callback, 'cls', None) + return (cls is not None) and issubclass(cls, APIView) + + +def endpoint_ordering(endpoint): + path, method, callback = endpoint + method_priority = { + 'GET': 0, + 'POST': 1, + 'PUT': 2, + + +## ... source file abbreviated to get to URLPattern examples ... + + +) + + +class EndpointEnumerator: + def __init__(self, patterns=None, urlconf=None): + if patterns is None: + if urlconf is None: + urlconf = settings.ROOT_URLCONF + + if isinstance(urlconf, str): + urls = import_module(urlconf) + else: + urls = urlconf + patterns = urls.urlpatterns + + self.patterns = patterns + + def get_api_endpoints(self, patterns=None, prefix=''): + if patterns is None: + patterns = self.patterns + + api_endpoints = [] + + for pattern in patterns: + path_regex = prefix + str(pattern.pattern) +~~ if isinstance(pattern, URLPattern): + path = self.get_path_from_regex(path_regex) + callback = pattern.callback + if self.should_include_endpoint(path, callback): + for method in self.get_allowed_methods(callback): + endpoint = (path, method, callback) + api_endpoints.append(endpoint) + + elif isinstance(pattern, URLResolver): + nested_endpoints = self.get_api_endpoints( + patterns=pattern.url_patterns, + prefix=path_regex + ) + api_endpoints.extend(nested_endpoints) + + return sorted(api_endpoints, key=endpoint_ordering) + + def get_path_from_regex(self, path_regex): + + path = simplify_regex(path_regex) + + return re.sub(_PATH_PARAMETER_COMPONENT_RE, r'{\g}', path) + + def should_include_endpoint(self, path, callback): + if not is_api_view(callback): + + +## ... source file continues with no further URLPattern examples... + +``` + diff --git a/content/pages/examples/django/django-urls-urlresolver.markdown b/content/pages/examples/django/django-urls-urlresolver.markdown new file mode 100644 index 000000000..cd80c8c3c --- /dev/null +++ b/content/pages/examples/django/django-urls-urlresolver.markdown @@ -0,0 +1,98 @@ +title: django.urls URLResolver Example Code +category: page +slug: django-urls-urlresolver-examples +sortorder: 500011401 +toc: False +sidebartitle: django.urls URLResolver +meta: Python example code for the URLResolver class from the django.urls module of the Django project. + + +URLResolver is a class within the django.urls module of the Django project. + + +## Example 1 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / urlpatterns.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./urlpatterns.py) + +```python +# urlpatterns.py +from django.conf.urls import include, url +~~from django.urls import URLResolver, path, register_converter +from django.urls.resolvers import RoutePattern + +from rest_framework.settings import api_settings + + +def _get_format_path_converter(suffix_kwarg, allowed): + if allowed: + if len(allowed) == 1: + allowed_pattern = allowed[0] + else: + allowed_pattern = '(?:%s)' % '|'.join(allowed) + suffix_pattern = r"\.%s/?" % allowed_pattern + else: + suffix_pattern = r"\.[a-z0-9]+/?" + + class FormatSuffixConverter: + regex = suffix_pattern + + def to_python(self, value): + return value.strip('./') + + def to_url(self, value): + return '.' + value + '/' + + converter_name = 'drf_format_suffix' + if allowed: + converter_name += '_' + '_'.join(allowed) + + return converter_name, FormatSuffixConverter + + +def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required, suffix_route=None): + ret = [] + for urlpattern in urlpatterns: +~~ if isinstance(urlpattern, URLResolver): + regex = urlpattern.pattern.regex.pattern + namespace = urlpattern.namespace + app_name = urlpattern.app_name + kwargs = urlpattern.default_kwargs + patterns = apply_suffix_patterns(urlpattern.url_patterns, + suffix_pattern, + suffix_required, + suffix_route) + + if isinstance(urlpattern.pattern, RoutePattern): + assert path is not None + route = str(urlpattern.pattern) + new_pattern = path(route, include((patterns, app_name), namespace), kwargs) + else: + new_pattern = url(regex, include((patterns, app_name), namespace), kwargs) + + ret.append(new_pattern) + else: + regex = urlpattern.pattern.regex.pattern.rstrip('$').rstrip('/') + suffix_pattern + view = urlpattern.callback + kwargs = urlpattern.default_args + name = urlpattern.name + if not suffix_required: + ret.append(urlpattern) + + +## ... source file continues with no further URLResolver examples... + +``` + diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index b1cacf751..85fc5a7d8 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the Flask class from the flask.a [Flask](https://github.com/pallets/flask/blob/master/src/flask/app.py) is -a class within the flask.app module of the [Flask](/flask.html) framework +a class within the `flask.app` module of the [Flask](/flask.html) framework that implements the [WSGI application specification](/wsgi-servers.html). This class acts as a central registry for a significant amount of a Flask application's functionality, including URL rounting, diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index ff99441e6..18cc60a3b 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -8,13 +8,14 @@ meta: Example code for understanding how to use the Headers class from the flask [Headers](https://github.com/pallets/flask/blob/master/src/flask/app.py) -is class within the flask.app module of the [Flask](/flask.html) +is class within the `flask.app` module of the [Flask](/flask.html) [web framework](/web-frameworks.html) that is imported from the [datastructures](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/datastructures.py) module of the [Werkzeug](https://palletsprojects.com/p/werkzeug/) project. Headers handles the [HTTP headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) -from requests and responses for Flask web applications. +from [requests](/flask-globals-request-examples.html) and responses for +Flask web applications. ## Example 1 from flask-restx diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 86f4394f4..5521638d2 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -11,7 +11,7 @@ meta: Example code for understanding how to use the ImmutableDict class from the is a class within the flask.app module of the [Flask](/flask.html) framework that is actually imported from the Werkzeug [datastructures module](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/datastructures.py). -The ImmutableDict class wraps a +The `ImmutableDict` class wraps a [standard Python dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) so that values cannot be modified after initially being set. diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 1ceec615e..daec67197 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -11,8 +11,8 @@ A Blueprint in [Flask](/flask.html) is [a "mold" or template for creating parts of web applications](https://stackoverflow.com/questions/24420857/what-are-flask-blueprints-exactly). This [Blueprint](https://github.com/pallets/flask/blob/master/src/flask/blueprints.py) -class within the flask.blueprints module implements that functionality -for Flask web apps. +class within the `flask.blueprints` module implements that functionality +for Flask [web apps](/web-development.html). ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown index 194244886..36d9fe188 100644 --- a/content/pages/examples/flask/flask-cli-appgroup.markdown +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the AppGroup class from the flas [AppGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.cli module of the Flask project. It +is a class within the `flask.cli` module of the Flask project. It works like the [Click Group](https://click.palletsprojects.com/en/7.x/commands/) class and automatically wraps the functions using diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown index 18e556c1b..30ab2e594 100644 --- a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the DispatchingApp class from th [DispatchingApp](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.cli module of the [Flask](/flask.html) project. +is a class within the `flask.cli` module of the [Flask](/flask.html) project. DispatchingApp is a special application that dispatches to a Flask app if it is imported by name in a background thread. diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 0471d96df..4528f6f91 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the FlaskGroup class from the fl [FlaskGroup](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.cli module of the [Flask project](/flask.html). +is a class within the `flask.cli` module of the [Flask project](/flask.html). FlaskGroup is a subclass of [AppGroup](/flask-cli-appgroup-examples.html) that provides for loading more commands from a configured Flask app. Generally, only advanced use cases will need to use this class. diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown index 5a2714c4a..d976323d0 100644 --- a/content/pages/examples/flask/flask-cli-pass-script-info.markdown +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -9,7 +9,7 @@ meta: Python example code that shows how to use the pass_script_info callable fr [pass_script_info](https://github.com/pallets/flask/blob/master/src/flask/cli.py) is simply a decorator around the [ScriptInfo](/flask-cli-scriptinfo-examples.html) -class within this same flask.cli module. +class within this same `flask.cli` module. ## Example 1 from indico diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index 2180a5b34..d348c758f 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -8,7 +8,7 @@ meta: Example code for understanding how to use the ScriptInfo class from the fl [ScriptInfo](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a class within the flask.app module of the [Flask](/flask.html) +is a class within the `flask.cli` module of the [Flask](/flask.html) framework. It is a helper object for Flask application and not usually dealt with directly by developers, instead it is created automatically by the [FlaskGroup](/flask-cli-flaskgroup-examples.html) object. diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index 6f10a698a..c3daf2cc9 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the with_appcontext callable fro [with_appcontext](https://github.com/pallets/flask/blob/master/src/flask/cli.py) -is a [Flask](/flask.html) decorator in the flask.cli module that +is a [Flask](/flask.html) decorator in the `flask.cli` module that wraps a callback to guarantee it will be called with a script's application context. Any callbacks registered with `app.cli` are wrapped with this function by default. diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index 53a0442f0..d662d8a8c 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the after_this_request callable [after_this_request](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) -is a function in the flask.ctx module of the [Flask](/flask.html) +is a function in the `flask.ctx` module of the [Flask](/flask.html) [web framework](/web-frameworks.html). The function's name is strongly descriptive of what it does and it particularly useful for modifying response objects, especially when you want a function other than the diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index 3af9ae9ed..ef7e5208a 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the has_app_context callable fro [has_app_context](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) -is a function in the flask.ctx module that is similar to +is a function in the `flask.ctx` module that is similar to [has_request_context](/flask-ctx-has-request-context-examples.html) but for the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index a0d150579..d88ba4585 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the has_request_context callable [has_request_context](https://github.com/pallets/flask/blob/master/src/flask/ctx.py) -is a function within the flask.ctx module that is useful for +is a function within the `flask.ctx` module that is useful for determining if a [request context](https://flask.palletsprojects.com/en/1.1.x/reqcontext/) is available or not. There is a similar diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 44ff8b057..694ed1551 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -8,7 +8,7 @@ meta: Python example code that shows how to use the current_app callable from th [current_app](https://github.com/pallets/flask/blob/master/src/flask/globals.py) -is function in [Flask](/flask.html)'s flask.globals module and is an +is function in [Flask](/flask.html)'s `flask.globals` module and is an instance of [LocalProxy](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/local.py) from the Werkzeug framework. `current_app` can be used to access data about the diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index cd7d9545e..b3205cf6e 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -7,7 +7,18 @@ sidebartitle: flask.globals request meta: Python example code that shows how to use the request callable from the flask.globals module of the Flask project. -request is a callable within the flask.globals module of the Flask project. +[request](https://github.com/pallets/flask/blob/master/src/flask/globals.py) +is function in [Flask](/flask.html)'s `flask.globals` module and is an +instance of +[LocalProxy](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/local.py) +from the [Werkzeug](https://werkzeug.palletsprojects.com/en/1.0.x/) library. +`request` stores data about the active HTTP request and can be used to access +data about that request. + +Note that `request` is typically imported directly from `flask` instead of +from `flask.globals`, even though it is defined within the `globals` module. +It's the same import, just less characters to type when you import it +from `flask`. ## Example 1 from Braintree Flask app diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 202b4707e..6960f013f 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -7,7 +7,18 @@ sidebartitle: flask.globals session meta: Python example code that shows how to use the session callable from the flask.globals module of the Flask project. -session is a callable within the flask.globals module of the Flask project. +[session](https://github.com/pallets/flask/blob/master/src/flask/globals.py) +is function in the [Flask](/flask.html) `flask.globals` module and is an +instance of +[LocalProxy](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/local.py) +from the [Werkzeug](https://werkzeug.palletsprojects.com/en/1.0.x/) library. +`session` stores data about the user session for the current request and it +can be used to access session data. + +Note that `session` is usually imported directly from `flask` instead of +from `flask.globals`, even though it is defined within the `globals` module. +It's the same function that is imported, but it's less characters to type +when you leave off the `.globals` part. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index 299b5777f..a53c58adb 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -7,7 +7,14 @@ sidebartitle: flask.helpers flash meta: Python example code that shows how to use the flash callable from the flask.helpers module of the Flask project. -flash is a callable within the flask.helpers module of the Flask project. +[flash](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is a function within the `flask.helpers` module of the [Flask](/flask.html) +framework. `flash` passes a string message to the *next* request. The +following request can access it in a template by using the +`get_flashed_messages` function. + +`flash` can also be imported directly from the `flask` module instead +of `flask.helpers` so you will often see that shortcut in example code. ## Example 1 from Braintree Flask app diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index f67cc796e..a58c7399b 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -149,7 +149,18 @@

    django.http HttpResponseRedirect

    django.urls + URLPattern, + URLResolver, + clear_url_caches, + get_callable, + get_resolver, + get_script_prefix, + include, path, + re_path, + register_converter, + resolve, + reverse, reverse_lazy

    django.urls.exceptions @@ -161,7 +172,135 @@

    django.template.response SimpleTemplateResponse, TemplateResponse

    -

    django.utils.timezone

    +

    django.utils + dateformat, + dateparse, + datetime_safe, + formats, + module_loading, + termcolors, + timezone, + translation, + tree +

    +

    django.utils.cache + add_never_cache_headers, + cc_delim_re, + patch_cache_control, + patch_response_headers, + patch_vary_headers +

    +

    django.utils.crypto + constant_time_compare, + get_random_string +

    +

    django.utils.datastructures + MultiValueDict +

    +

    django.utils.dateparse + parse_datetime, + parse_duration +

    +

    django.utils.dates + MONTHS +

    +

    django.utils.datetime_safe + datetime +

    +

    django.utils.decorators + method_decorator +

    +

    django.utils.deprecation + MiddlewareMixin, + RenameMethodsBase +

    +

    django.utils.duration + duration_string +

    +

    django.utils.encoding + DjangoUnicodeDecodeError, + filepath_to_uri, + force_bytes, + force_str, + force_text, + iri_to_uri, + is_protected_type, + smart_bytes, + smart_str, + smart_text, + uri_to_iri +

    +

    django.utils.formats + get_format, + localize_input, + sanitize_separators +

    +

    django.utils.functional + LazyObject, + Promise, + SimpleLazyObject, + keep_lazy, + lazy, + total_ordering, + wraps +

    +

    django.utils.html + conditional_escape, + escape, + escapejs, + format_html, + format_html_join, + mark_safe, + smart_urlquote, + strip_tags +

    +

    django.utils.http + base36_to_int, + http_date, + int_to_base36, + is_safe_url, + unquote, + url_has_allowed_host_and_scheme, + urlencode, + urlquote, + urlunquote +

    +

    django.utils.ipv6 + clean_ipv6_address +

    +

    django.utils.itercompat + is_iterable +

    +

    django.utils.module_loading + autodiscover_modules, + import_string, + module_has_submodule +

    +

    django.utils.numberformat + format +

    +

    django.utils.safestring + SafeData, + SafeText, + mark_safe +

    +

    django.utils.termcolors + colorize +

    +

    django.utils.text + Truncator, + capfirst, + format_lazy, + get_text_list, + get_valid_filename, + slugify +

    +

    django.utils.timezone + get_current_timezone, + make_aware, + now, + timedelta +

    django.utils.translation LANGUAGE_SESSION_KEY, activate, From 4c2da72e30c965f1ba0cbeb86890e5b5ec4262ae Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 08:22:31 -0400 Subject: [PATCH 084/207] adding additional flask example descriptions --- .../flask/flask-globals-current-app.markdown | 4 ++++ .../pages/examples/flask/flask-globals-g.markdown | 3 +++ .../flask/flask-helpers-get-root-path.markdown | 5 ++++- .../flask/flask-helpers-make-response.markdown | 12 +++++++++++- .../examples/flask/flask-helpers-send-file.markdown | 12 +++++++++++- .../examples/flask/flask-helpers-url-for.markdown | 10 +++++++++- 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 694ed1551..6f7ad9d1d 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -15,6 +15,10 @@ from the Werkzeug framework. `current_app` can be used to access data about the running application, including the configuration. This is useful for both developers using the framework and ones building extensions for Flask. +You will often see `current_app` imported directly from `flask` instead +of `flask.globals`. These imports are equivalent because `flask` is simply +importing `current_app` from `flask.globals`. + ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 368ce8453..0824e343f 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -12,6 +12,9 @@ an object for storing data during the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) of a running [Flask](/flask.html) web app. +`g` can also be imported directly from the `flask` module instead +of `flask.globals`, so you will often see that shortcut in example code. + ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown index d58e6a1fa..ca4551848 100644 --- a/content/pages/examples/flask/flask-helpers-get-root-path.markdown +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -7,7 +7,10 @@ sidebartitle: flask.helpers get_root_path meta: Python example code that shows how to use the get_root_path callable from the flask.helpers module of the Flask project. -get_root_path is a callable within the flask.helpers module of the Flask project. +[get_root_path](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is a function within the `flask.helpers` module of the [Flask](/flask.html) +framework. `get_root_path` returns the filesystem path to a package +or the current working directly if the path cannot be found. ## Example 1 from indico diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index 8fdaf6966..bb62836a4 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -7,7 +7,17 @@ sidebartitle: flask.helpers make_response meta: Python example code that shows how to use the make_response callable from the flask.helpers module of the Flask project. -make_response is a callable within the flask.helpers module of the Flask project. +[make_response](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is a function in the `flask.helpers` module of the [Flask](/flask.html) +[web framework](/web-framework.html). `make_response` is for adding additional +HTTP headers to a response within a view's code. Sometimes views do not return +a response object so it's unclear how to add headers to the response, which +is where `make_response` is particularly useful in solving that specific +problem. + +`make_response` can also be imported directly from the `flask` module +instead of `flask.helpers` so you will typically see that shortcut +in example code. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index e3c57445b..e707fb77d 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -7,7 +7,17 @@ sidebartitle: flask.helpers send_file meta: Python example code that shows how to use the send_file callable from the flask.helpers module of the Flask project. -send_file is a callable within the flask.helpers module of the Flask project. +[send_file](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is function in the [Flask](/flask.html) `flask.helpers` module. +`send_file` transfers the contents of a file to the client using the most +efficient method available and configured in the Flask settings. It +attempts to guess the correct mimetype to use but it can also be +explicitly configured. + +Note that `send_file` is usually imported directly from `flask` instead of +from `flask.helpers`, even though it is defined within the `helpers` module. +It's the same function that is imported, but it's less characters to type +when you leave off the `.helpers` part. ## Example 1 from Flask-VueJs-Template diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 1db0ddf96..fbb2b5c31 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -7,7 +7,15 @@ sidebartitle: flask.helpers url_for meta: Python example code that shows how to use the url_for callable from the flask.helpers module of the Flask project. -url_for is a callable within the flask.helpers module of the Flask project. +[url_for](https://github.com/pallets/flask/blob/master/src/flask/helpers.py) +is function in the [Flask](/flask.html) `flask.helpers` module. +`url_for` generates a URL to an endpoint using the method passed in +as an argument. + +Note that `url_for` is typically imported directly from `flask` instead of +from `flask.helpers`, even though it is defined within the `helpers` module. +It is the same function that is imported, but it's less characters to type +when you leave off the `.helpers` part. ## Example 1 from Flask AppBuilder From bf57a4ca08ded8fd354396b8583011c439ba456d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 20:38:46 -0400 Subject: [PATCH 085/207] update flask descriptions --- .../examples/flask/flask-json-jsonencoder.markdown | 7 ++++++- .../pages/examples/flask/flask-json-jsonify.markdown | 12 +++++++++++- .../flask/flask-sessions-badsignature.markdown | 6 +++++- .../flask/flask-sessions-sessioninterface.markdown | 5 ++++- .../flask/flask-sessions-sessionmixin.markdown | 7 ++++++- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index 22f4b9a2f..96cf91c66 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.json JSONEncoder meta: Example code for understanding how to use the JSONEncoder class from the flask.json module of the Flask project. -JSONEncoder is a class within the flask.json module of the Flask project. +[JSONEncoder](https://github.com/pallets/flask/blob/master/src/flask/json/__init__.py) +is a class within the [Flask](/flask.html) project under the `flask.json` +module. `JSONEncoder` is the default [JSON](https://www.json.org/json-en.html) +encoder for Flask and was designed to handle more types than Python's +standard library [json](https://docs.python.org/3/library/json.html) module. + ## Example 1 from Flask-Security-Too diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 70d393c0b..7d782befc 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -7,7 +7,17 @@ sidebartitle: flask.json jsonify meta: Python example code that shows how to use the jsonify callable from the flask.json module of the Flask project. -jsonify is a callable within the flask.json module of the Flask project. +[jsonify](https://github.com/pallets/flask/blob/master/src/flask/json/__init__.py) +is a function in [Flask](/flask.html)'s `flask.json` module. `jsonify` +serializes data to +[JavaScript Object Notation (JSON)](https://www.json.org/json-en.html) format, +wraps it in a +[Response](https://blog.miguelgrinberg.com/post/customizing-the-flask-response-class) +object with the application/json mimetype. + +Note that `jsonify` is sometimes imported directly from the `flask` module +instead of from `flask.json`. It is the same function that is imported, but +there are less characters to type when you leave off the `.json` part. ## Example 1 from Flask AppBuilder diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index b4a85ddc3..2ddacd7f9 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -7,7 +7,11 @@ sidebartitle: flask.sessions BadSignature meta: Example code for understanding how to use the BadSignature class from the flask.sessions module of the Flask project. -BadSignature is a class within the flask.sessions module of the Flask project. +[BadSignature](https://github.com/pallets/flask/blob/master/src/flask/sessions.py) +is a class often imported into [Flask](/flask.html) applications from +the `flask.sessions` module. `BadSignature` is actually defined in the +[itsdangerous](https://github.com/pallets/itsdangerous) project and +imported into Flask sessions for applications to use. ## Example 1 from FlaskBB diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 9cae62575..9ba9138fd 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -7,7 +7,10 @@ sidebartitle: flask.sessions SessionInterface meta: Example code for understanding how to use the SessionInterface class from the flask.sessions module of the Flask project. -SessionInterface is a class within the flask.sessions module of the Flask project. +[SessionInterface](https://github.com/pallets/flask/blob/master/src/flask/sessions.py) +is a class used with [Flask](/flask.html) projects that is defined in +the `flask.sessions` module. `SessionInterface` is the basic interface +that must be implemented to replace the default session interface. ## Example 1 from tedivms-flask diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown index 69c354a97..8cc0cafcd 100644 --- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.sessions SessionMixin meta: Example code for understanding how to use the SessionMixin class from the flask.sessions module of the Flask project. -SessionMixin is a class within the flask.sessions module of the Flask project. +[SessionMixin](https://github.com/pallets/flask/blob/master/src/flask/sessions.py) +is a class used with [Flask](/flask.html) projects that is defined in +the `flask.sessions` module. `SessionMixin` expands a standard +[Python dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) +with [session](https://flask.palletsprojects.com/en/1.1.x/quickstart/#sessions) +attributes. ## Example 1 from Flask-SocketIO From 20af5bfbdd3d30e9647152244f914674cbb44344 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Thu, 9 Jul 2020 20:50:21 -0400 Subject: [PATCH 086/207] adding more django code examples --- .../django-shortcuts-get-list-or-404.markdown | 125 ++ ...jango-shortcuts-get-object-or-404.markdown | 1530 ++++++++++++++ .../django/django-shortcuts-redirect.markdown | 1115 ++++++++++ .../django/django-shortcuts-render.markdown | 1883 +++++++++++++++++ .../django-shortcuts-resolve-url.markdown | 135 ++ theme/templates/code-examples/django.html | 16 +- 6 files changed, 4799 insertions(+), 5 deletions(-) create mode 100644 content/pages/examples/django/django-shortcuts-get-list-or-404.markdown create mode 100644 content/pages/examples/django/django-shortcuts-get-object-or-404.markdown create mode 100644 content/pages/examples/django/django-shortcuts-redirect.markdown create mode 100644 content/pages/examples/django/django-shortcuts-render.markdown create mode 100644 content/pages/examples/django/django-shortcuts-resolve-url.markdown diff --git a/content/pages/examples/django/django-shortcuts-get-list-or-404.markdown b/content/pages/examples/django/django-shortcuts-get-list-or-404.markdown new file mode 100644 index 000000000..70a07e08a --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-get-list-or-404.markdown @@ -0,0 +1,125 @@ +title: django.shortcuts get_list_or_404 Example Code +category: page +slug: django-shortcuts-get-list-or-404-examples +sortorder: 500011345 +toc: False +sidebartitle: django.shortcuts get_list_or_404 +meta: Python example code for the get_list_or_404 callable from the django.shortcuts module of the Django project. + + +get_list_or_404 is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +~~from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations +from cms.admin.forms import PluginAddValidationForm +from cms.constants import SLUG_REGEXP +from cms.exceptions import PluginLimitReached +from cms.models.placeholdermodel import Placeholder +from cms.models.placeholderpluginmodel import PlaceholderReference +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_pool import plugin_pool +from cms.signals import pre_placeholder_operation, post_placeholder_operation +from cms.toolbar.utils import get_plugin_tree_as_json +from cms.utils import copy_plugins, get_current_site +from cms.utils.compat import DJANGO_2_0 + + +## ... source file abbreviated to get to get_list_or_404 examples ... + + + operation=operation, + request=request, + language=self._get_operation_language(request), + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + return token + + def _send_post_placeholder_operation(self, request, operation, token, **kwargs): + if not request.GET.get('cms_path'): + return + + post_placeholder_operation.send( + sender=self.__class__, + operation=operation, + request=request, + language=self._get_operation_language(request), + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + + def _get_plugin_from_id(self, plugin_id): + queryset = CMSPlugin.objects.values_list('plugin_type', flat=True) +~~ plugin_type = get_list_or_404(queryset, pk=plugin_id)[0] + plugin_class = plugin_pool.get_plugin(plugin_type) + real_queryset = plugin_class.get_render_queryset().select_related('parent', 'placeholder') + return get_object_or_404(real_queryset, pk=plugin_id) + + def get_urls(self): + info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name) + pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__)) + url_patterns = [ + pat(r'copy-plugins/$', self.copy_plugins), + pat(r'add-plugin/$', self.add_plugin), + pat(r'edit-plugin/(%s)/$' % SLUG_REGEXP, self.edit_plugin), + pat(r'delete-plugin/(%s)/$' % SLUG_REGEXP, self.delete_plugin), + pat(r'clear-placeholder/(%s)/$' % SLUG_REGEXP, self.clear_placeholder), + pat(r'move-plugin/$', self.move_plugin), + ] + return url_patterns + super(PlaceholderAdminMixin, self).get_urls() + + def has_add_plugin_permission(self, request, placeholder, plugin_type): + return placeholder.has_add_plugin_permission(request.user, plugin_type) + + def has_change_plugin_permission(self, request, plugin): + placeholder = plugin.placeholder + return placeholder.has_change_plugin_permission(request.user, plugin) + + + +## ... source file continues with no further get_list_or_404 examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-get-object-or-404.markdown b/content/pages/examples/django/django-shortcuts-get-object-or-404.markdown new file mode 100644 index 000000000..529114790 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-get-object-or-404.markdown @@ -0,0 +1,1530 @@ +title: django.shortcuts get_object_or_404 Example Code +category: page +slug: django-shortcuts-get-object-or-404-examples +sortorder: 500011346 +toc: False +sidebartitle: django.shortcuts get_object_or_404 +meta: Python example code for the get_object_or_404 callable from the django.shortcuts module of the Django project. + + +get_object_or_404 is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / proceedings / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/proceedings/views.py) + +```python +# views.py +from django.http import JsonResponse +~~from django.shortcuts import render, get_object_or_404 +from django.views.decorators.http import require_POST + +from conferences.utilities import validate_chair_access +from proceedings.forms import UpdateVolumeForm +from proceedings.models import CameraReady + + +@require_POST +def update_volume(request, camera_id): +~~ camera = get_object_or_404(CameraReady, id=camera_id) + validate_chair_access(request.user, camera.submission.conference) + form = UpdateVolumeForm(request.POST, instance=camera) + if form.is_valid(): + form.save() + return JsonResponse(status=200, data={}) + return JsonResponse(status=500, data={}) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / admin / placeholderadmin.py**](https://github.com/divio/django-cms/blob/develop/cms/admin/placeholderadmin.py) + +```python +# placeholderadmin.py +import uuid +import warnings + +from django.conf.urls import url +from django.contrib.admin.helpers import AdminForm +from django.contrib.admin.utils import get_deleted_objects +from django.core.exceptions import PermissionDenied +from django.db import router, transaction +from django.http import ( + HttpResponse, + HttpResponseBadRequest, + HttpResponseForbidden, + HttpResponseNotFound, + HttpResponseRedirect, +) +~~from django.shortcuts import get_list_or_404, get_object_or_404, render +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_text +from django.utils import translation +from django.utils.translation import ugettext as _ +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.views.decorators.http import require_POST + +from six.moves.urllib.parse import parse_qsl, urlparse + +from six import get_unbound_function, get_method_function + +from cms import operations +from cms.admin.forms import PluginAddValidationForm +from cms.constants import SLUG_REGEXP +from cms.exceptions import PluginLimitReached +from cms.models.placeholdermodel import Placeholder +from cms.models.placeholderpluginmodel import PlaceholderReference +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_pool import plugin_pool +from cms.signals import pre_placeholder_operation, post_placeholder_operation +from cms.toolbar.utils import get_plugin_tree_as_json +from cms.utils import copy_plugins, get_current_site +from cms.utils.compat import DJANGO_2_0 + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + return token + + def _send_post_placeholder_operation(self, request, operation, token, **kwargs): + if not request.GET.get('cms_path'): + return + + post_placeholder_operation.send( + sender=self.__class__, + operation=operation, + request=request, + language=self._get_operation_language(request), + token=token, + origin=self._get_operation_origin(request), + **kwargs + ) + + def _get_plugin_from_id(self, plugin_id): + queryset = CMSPlugin.objects.values_list('plugin_type', flat=True) + plugin_type = get_list_or_404(queryset, pk=plugin_id)[0] + plugin_class = plugin_pool.get_plugin(plugin_type) + real_queryset = plugin_class.get_render_queryset().select_related('parent', 'placeholder') +~~ return get_object_or_404(real_queryset, pk=plugin_id) + + def get_urls(self): + info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name) + pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__)) + url_patterns = [ + pat(r'copy-plugins/$', self.copy_plugins), + pat(r'add-plugin/$', self.add_plugin), + pat(r'edit-plugin/(%s)/$' % SLUG_REGEXP, self.edit_plugin), + pat(r'delete-plugin/(%s)/$' % SLUG_REGEXP, self.delete_plugin), + pat(r'clear-placeholder/(%s)/$' % SLUG_REGEXP, self.clear_placeholder), + pat(r'move-plugin/$', self.move_plugin), + ] + return url_patterns + super(PlaceholderAdminMixin, self).get_urls() + + def has_add_plugin_permission(self, request, placeholder, plugin_type): + return placeholder.has_add_plugin_permission(request.user, plugin_type) + + def has_change_plugin_permission(self, request, plugin): + placeholder = plugin.placeholder + return placeholder.has_change_plugin_permission(request.user, plugin) + + def has_delete_plugin_permission(self, request, plugin): + placeholder = plugin.placeholder + return placeholder.has_delete_plugin_permission(request.user, plugin) + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + + plugin = getattr(plugin_instance, 'saved_object', None) + + if plugin: + plugin.placeholder.mark_as_dirty(plugin.language, clear_cache=False) + + if plugin_instance._operation_token: + tree_order = placeholder.get_plugin_tree_order(plugin.parent_id) + self._send_post_placeholder_operation( + request, + operation=operations.ADD_PLUGIN, + token=plugin_instance._operation_token, + plugin=plugin, + placeholder=plugin.placeholder, + tree_order=tree_order, + ) + return response + + @method_decorator(require_POST) + @xframe_options_sameorigin + @transaction.atomic + def copy_plugins(self, request): + source_placeholder_id = request.POST['source_placeholder_id'] + target_language = request.POST['target_language'] + target_placeholder_id = request.POST['target_placeholder_id'] +~~ source_placeholder = get_object_or_404(Placeholder, pk=source_placeholder_id) +~~ target_placeholder = get_object_or_404(Placeholder, pk=target_placeholder_id) + + if not target_language or not target_language in get_language_list(): + return HttpResponseBadRequest(force_text(_("Language must be set to a supported language!"))) + + copy_to_clipboard = target_placeholder.pk == request.toolbar.clipboard.pk + source_plugin_id = request.POST.get('source_plugin_id', None) + + if copy_to_clipboard and source_plugin_id: + new_plugin = self._copy_plugin_to_clipboard( + request, + source_placeholder, + target_placeholder, + ) + new_plugins = [new_plugin] + elif copy_to_clipboard: + new_plugin = self._copy_placeholder_to_clipboard( + request, + source_placeholder, + target_placeholder, + ) + new_plugins = [new_plugin] + else: + new_plugins = self._add_plugins_from_placeholder( + request, + source_placeholder, + target_placeholder, + ) + data = get_plugin_tree_as_json(request, new_plugins) + return HttpResponse(data, content_type='application/json') + + def _copy_plugin_to_clipboard(self, request, source_placeholder, target_placeholder): + source_language = request.POST['source_language'] + source_plugin_id = request.POST.get('source_plugin_id') + target_language = request.POST['target_language'] + +~~ source_plugin = get_object_or_404( + CMSPlugin, + pk=source_plugin_id, + language=source_language, + ) + + old_plugins = ( + CMSPlugin + .get_tree(parent=source_plugin) + .filter(placeholder=source_placeholder) + .order_by('path') + ) + + if not self.has_copy_plugins_permission(request, old_plugins): + message = _('You do not have permission to copy these plugins.') + raise PermissionDenied(force_text(message)) + + target_placeholder.clear() + + plugin_pairs = copy_plugins.copy_plugins_to( + old_plugins, + to_placeholder=target_placeholder, + to_language=target_language, + ) + return plugin_pairs[0][0] + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + + if placeholder != source_placeholder: + try: + template = self.get_placeholder_template(request, placeholder) + has_reached_plugin_limit(placeholder, plugin.plugin_type, + target_language, template=template) + except PluginLimitReached as er: + return HttpResponseBadRequest(er) + + exclude_from_order_check = ['__COPY__', str(plugin.pk)] + ordered_plugin_ids = [int(pk) for pk in order if pk not in exclude_from_order_check] + plugins_in_tree_count = ( + placeholder + .get_plugins(target_language) + .filter(parent=parent_id, pk__in=ordered_plugin_ids) + .count() + ) + + if len(ordered_plugin_ids) != plugins_in_tree_count: + message = _('order parameter references plugins in different trees') + return HttpResponseBadRequest(force_text(message)) + + move_a_plugin = not move_a_copy and not move_to_clipboard + + if parent_id and plugin.parent_id != parent_id: +~~ target_parent = get_object_or_404(CMSPlugin, pk=parent_id) + + if move_a_plugin and target_parent.placeholder_id != placeholder.pk: + return HttpResponseBadRequest(force_text( + _('parent must be in the same placeholder'))) + + if move_a_plugin and target_parent.language != target_language: + return HttpResponseBadRequest(force_text( + _('parent must be in the same language as ' + 'plugin_language'))) + elif parent_id: + target_parent = plugin.parent + else: + target_parent = None + + new_plugin = None + fetch_tree = False + + if move_a_copy and plugin.plugin_type == "PlaceholderPlugin": + new_plugins = self._paste_placeholder( + request, + plugin=plugin, + target_language=target_language, + target_placeholder=placeholder, + tree_order=order, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + return HttpResponseRedirect(admin_reverse('index', current_app=self.admin_site.name)) + + plugin_name = force_text(plugin.get_plugin_class().name) + + if perms_needed or protected: + title = _("Cannot delete %(name)s") % {"name": plugin_name} + else: + title = _("Are you sure?") + context = { + "title": title, + "object_name": plugin_name, + "object": plugin, + "deleted_objects": deleted_objects, + "perms_lacking": perms_needed, + "protected": protected, + "opts": opts, + "app_label": opts.app_label, + } + request.current_app = self.admin_site.name + return TemplateResponse( + request, "admin/cms/page/plugin/delete_confirmation.html", context + ) + + @xframe_options_sameorigin + def clear_placeholder(self, request, placeholder_id): +~~ placeholder = get_object_or_404(Placeholder, pk=placeholder_id) + language = request.GET.get('language') + + if placeholder.pk == request.toolbar.clipboard.pk: + placeholder.clear(language) + return HttpResponseRedirect(admin_reverse('index', current_app=self.admin_site.name)) + + if not self.has_clear_placeholder_permission(request, placeholder, language): + return HttpResponseForbidden(force_text(_("You do not have permission to clear this placeholder"))) + + opts = Placeholder._meta + using = router.db_for_write(Placeholder) + plugins = placeholder.get_plugins_list(language) + + if DJANGO_2_0: + get_deleted_objects_additional_kwargs = { + 'opts': opts, + 'using': using, + 'user': request.user, + } + else: + get_deleted_objects_additional_kwargs = {'request': request} + deleted_objects, __, perms_needed, protected = get_deleted_objects( + plugins, admin_site=self.admin_site, + **get_deleted_objects_additional_kwargs + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / views.py**](https://github.com/divio/django-filer/blob/develop/filer/./views.py) + +```python +# views.py +from __future__ import absolute_import, unicode_literals + +from django.http import Http404 +~~from django.shortcuts import get_object_or_404, redirect + +from .models import File + + +def canonical(request, uploaded_at, file_id): +~~ filer_file = get_object_or_404(File, pk=file_id, is_public=True) + if (not filer_file.file or int(uploaded_at) != filer_file.canonical_time): + raise Http404('No %s matches the given query.' % File._meta.object_name) + return redirect(filer_file.url) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 4 from django-flexible-subscriptions +[django-flexible-subscriptions](https://github.com/studybuffalo/django-flexible-subscriptions) +([project documentation](https://django-flexible-subscriptions.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-flexible-subscriptions/)) +provides boilerplate code for adding subscription and recurrent billing +to [Django](/django.html) web applications. Various payment providers +can be added on the back end to run the transactions. + +The django-flexible-subscriptions project is open sourced under the +[GNU General Public License v3.0](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/LICENSE). + +[**django-flexible-subscriptions / subscriptions / views.py**](https://github.com/studybuffalo/django-flexible-subscriptions/blob/master/subscriptions/./views.py) + +```python +# views.py +from copy import copy + +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth.mixins import ( + LoginRequiredMixin, PermissionRequiredMixin +) +from django.contrib.messages.views import SuccessMessageMixin +from django.forms import HiddenInput +from django.forms.models import inlineformset_factory +from django.http import HttpResponseRedirect +from django.http.response import HttpResponseNotAllowed, HttpResponseNotFound +~~from django.shortcuts import get_object_or_404 +from django.template.response import TemplateResponse +from django.urls import reverse_lazy +from django.utils import timezone + +from subscriptions import models, forms, abstract + + +class DashboardView(PermissionRequiredMixin, abstract.TemplateView): + permission_required = 'subscriptions.subscriptions' + raise_exception = True + template_name = 'subscriptions/dashboard.html' + + +class TagListView(PermissionRequiredMixin, abstract.ListView): + model = models.PlanTag + permission_required = 'subscriptions.subscriptions' + raise_exception = True + context_object_name = 'tags' + template_name = 'subscriptions/tag_list.html' + + +class TagCreateView( + PermissionRequiredMixin, SuccessMessageMixin, abstract.CreateView +): + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + +class PlanListDetailListView(PermissionRequiredMixin, abstract.DetailView): + model = models.PlanList + pk_url_kwarg = 'plan_list_id' + permission_required = 'subscriptions.subscriptions' + raise_exception = True + context_object_name = 'plan_list' + template_name = 'subscriptions/plan_list_detail_list.html' + + +class PlanListDetailCreateView( + PermissionRequiredMixin, SuccessMessageMixin, abstract.CreateView +): + model = models.PlanListDetail + fields = [ + 'plan', 'plan_list', 'html_content', 'subscribe_button_text', 'order' + ] + permission_required = 'subscriptions.subscriptions' + raise_exception = True + success_message = 'Subscription plan successfully added to plan list' + template_name = 'subscriptions/plan_list_detail_create.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + +~~ context['plan_list'] = get_object_or_404( + models.PlanList, id=self.kwargs.get('plan_list_id', None) + ) + + return context + + def get_success_url(self): + return reverse_lazy( + 'dfs_plan_list_detail_list', + kwargs={'plan_list_id': self.kwargs['plan_list_id']}, + ) + + +class PlanListDetailUpdateView( + PermissionRequiredMixin, SuccessMessageMixin, abstract.UpdateView +): + model = models.PlanListDetail + permission_required = 'subscriptions.subscriptions' + raise_exception = True + fields = [ + 'plan', 'plan_list', 'html_content', 'subscribe_button_text', 'order' + ] + success_message = 'Plan list details successfully updated' + pk_url_kwarg = 'plan_list_detail_id' + template_name = 'subscriptions/plan_list_detail_update.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + +~~ context['plan_list'] = get_object_or_404( + models.PlanList, id=self.kwargs.get('plan_list_id', None) + ) + + return context + + def get_success_url(self): + return reverse_lazy( + 'dfs_plan_list_detail_list', + kwargs={'plan_list_id': self.kwargs['plan_list_id']}, + ) + + +class PlanListDetailDeleteView(PermissionRequiredMixin, abstract.DeleteView): + model = models.PlanListDetail + permission_required = 'subscriptions.subscriptions' + raise_exception = True + context_object_name = 'plan_list_detail' + pk_url_kwarg = 'plan_list_detail_id' + success_message = 'Subscription plan successfully removed from plan list' + template_name = 'subscriptions/plan_list_detail_delete.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + +~~ context['plan_list'] = get_object_or_404( + models.PlanList, id=self.kwargs.get('plan_list_id', None) + ) + + return context + + def delete(self, request, *args, **kwargs): + messages.success(self.request, self.success_message) + return super(PlanListDetailDeleteView, self).delete( + request, *args, **kwargs + ) + + def get_success_url(self): + return reverse_lazy( + 'dfs_plan_list_detail_list', + kwargs={'plan_list_id': self.kwargs['plan_list_id']}, + ) + + +class SubscribeList(abstract.TemplateView): + context_object_name = 'plan_list' + template_name = 'subscriptions/subscribe_list.html' + + def get(self, request, *args, **kwargs): + plan_list = models.PlanList.objects.filter(active=True).first() + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + self.get_context_data(plan_list=plan_list, details=details) + ) + + return response + + return HttpResponseNotFound('No subscription plans are available') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context['plan_list'] = kwargs['plan_list'] + context['details'] = kwargs['details'] + + return context + + +class SubscribeView(LoginRequiredMixin, abstract.TemplateView): + confirmation = False + payment_form = forms.PaymentForm + subscription_plan = None + success_url = 'dfs_subscribe_thank_you' + template_preview = 'subscriptions/subscribe_preview.html' + template_confirmation = 'subscriptions/subscribe_confirmation.html' + + def get_object(self): +~~ return get_object_or_404( + models.SubscriptionPlan, id=self.request.POST.get('plan_id', None) + ) + + def get_context_data(self, **kwargs): + context = super(SubscribeView, self).get_context_data(**kwargs) + + context['confirmation'] = self.confirmation + + context['plan'] = self.subscription_plan + + return context + + def get_template_names(self): + conf_templates = [self.template_confirmation] + prev_templates = [self.template_preview] + + return conf_templates if self.confirmation else prev_templates + + def get_success_url(self, **kwargs): + return reverse_lazy(self.success_url, kwargs=kwargs) + + def get(self, request, *args, **kwargs): + return HttpResponseNotAllowed(['POST']) + + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + try: + return models.SubscriptionTransaction.objects.get( + id=self.kwargs['transaction_id'], + user=self.request.user, + ) + except models.SubscriptionTransaction.DoesNotExist: + return None + + def get_context_data(self, **kwargs): + context = super(SubscribeThankYouView, self).get_context_data(**kwargs) + + context[self.context_object_name] = self.get_object() + + return context + + +class SubscribeCancelView(LoginRequiredMixin, abstract.DetailView): + model = models.UserSubscription + context_object_name = 'subscription' + pk_url_kwarg = 'subscription_id' + success_message = 'Subscription successfully cancelled' + success_url = 'dfs_subscribe_user_list' + template_name = 'subscriptions/subscribe_cancel.html' + + def get_object(self, queryset=None): +~~ return get_object_or_404( + self.model, + user=self.request.user, + id=self.kwargs['subscription_id'], + ) + + def get_success_url(self): + return reverse_lazy(self.success_url) + + def post(self, request, *args, **kwargs): # pylint: disable=unused-argument + subscription = self.get_object() + subscription.date_billing_end = copy(subscription.date_billing_next) + subscription.date_billing_next = None + subscription.cancelled = True + subscription.save() + + messages.success(self.request, self.success_message) + + return HttpResponseRedirect(self.get_success_url()) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 5 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +~~from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + ] + urls = myurls + urls + return urls + + def get_obj_perms_base_context(self, request, obj): + context = self.admin_site.each_context(request) + context.update({ + 'adminform': {'model_admin': self}, + 'media': self.media, + 'object': obj, + 'app_label': self.model._meta.app_label, + 'opts': self.model._meta, + 'original': str(obj), + 'has_change_permission': self.has_change_permission(request, obj), + 'model_perms': get_perms_for_model(obj), + 'title': _("Object permissions"), + }) + return context + + def obj_perms_manage_view(self, request, object_pk): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + from django.contrib.admin.utils import unquote +~~ obj = get_object_or_404(self.get_queryset( + request), pk=unquote(object_pk)) + users_perms = OrderedDict( + sorted( + get_users_with_perms(obj, attach_perms=True, + with_group_users=False).items(), + key=lambda user: getattr( + user[0], get_user_model().USERNAME_FIELD) + ) + ) + + groups_perms = OrderedDict( + sorted( + get_groups_with_perms(obj, attach_perms=True).items(), + key=lambda group: group[0].name + ) + ) + + if request.method == 'POST' and 'submit_manage_user' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + +~~ user = get_object_or_404(get_user_model(), pk=user_id) +~~ obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + +~~ group = get_object_or_404(Group, id=group_id) +~~ obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 6 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / generics.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./generics.py) + +```python +# generics.py +from django.core.exceptions import ValidationError +from django.db.models.query import QuerySet +from django.http import Http404 +~~from django.shortcuts import get_object_or_404 as _get_object_or_404 + +from rest_framework import mixins, views +from rest_framework.settings import api_settings + + +~~def get_object_or_404(queryset, *filter_args, **filter_kwargs): + try: + return _get_object_or_404(queryset, *filter_args, **filter_kwargs) + except (TypeError, ValueError, ValidationError): + raise Http404 + + +class GenericAPIView(views.APIView): + queryset = None + serializer_class = None + + lookup_field = 'pk' + lookup_url_kwarg = None + + filter_backends = api_settings.DEFAULT_FILTER_BACKENDS + + pagination_class = api_settings.DEFAULT_PAGINATION_CLASS + + def get_queryset(self): + assert self.queryset is not None, ( + "'%s' should either include a `queryset` attribute, " + "or override the `get_queryset()` method." + % self.__class__.__name__ + ) + + queryset = self.queryset + if isinstance(queryset, QuerySet): + queryset = queryset.all() + return queryset + + def get_object(self): + queryset = self.filter_queryset(self.get_queryset()) + + lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field + + assert lookup_url_kwarg in self.kwargs, ( + 'Expected view %s to be called with a URL keyword argument ' + 'named "%s". Fix your URL conf, or set the `.lookup_field` ' + 'attribute on the view correctly.' % + (self.__class__.__name__, lookup_url_kwarg) + ) + + filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} +~~ obj = get_object_or_404(queryset, **filter_kwargs) + + self.check_object_permissions(self.request, obj) + + return obj + + def get_serializer(self, *args, **kwargs): + serializer_class = self.get_serializer_class() + kwargs.setdefault('context', self.get_serializer_context()) + return serializer_class(*args, **kwargs) + + def get_serializer_class(self): + assert self.serializer_class is not None, ( + "'%s' should either include a `serializer_class` attribute, " + "or override the `get_serializer_class()` method." + % self.__class__.__name__ + ) + + return self.serializer_class + + def get_serializer_context(self): + return { + 'request': self.request, + 'format': self.format_kwarg, + 'view': self + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 7 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +~~from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.views.generic.base import View +from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + +def _export(request, query, download=True): + format = request.GET.get('format', 'csv') + exporter_class = get_exporter_class(format) + query.params = url_get_params(request) + delim = request.GET.get('delim') + exporter = exporter_class(query) + try: + output = exporter.get_output(delim=delim) + except DatabaseError as e: + msg = "Error executing query %s: %s" % (query.title, e) + return HttpResponse(msg, status=500) + response = HttpResponse(output, content_type=exporter.content_type) + if download: + response['Content-Disposition'] = 'attachment; filename="%s"' % ( + exporter.get_filename() + ) + return response + + +class DownloadQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id, *args, **kwargs): +~~ query = get_object_or_404(Query, pk=query_id) + return _export(request, query) + + +class DownloadFromSqlView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def post(self, request, *args, **kwargs): + sql = request.POST.get('sql') + connection = request.POST.get('connection') + query = Query(sql=sql, connection=connection, title='') + ql = query.log(request.user) + query.title = 'Playground - %s' % ql.id + return _export(request, query) + + +class StreamQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id, *args, **kwargs): +~~ query = get_object_or_404(Query, pk=query_id) + return _export(request, query, download=False) + + +class EmailCsvQueryView(PermissionRequiredMixin, View): + + permission_required = 'view_permission' + + def post(self, request, query_id, *args, **kwargs): + if request.is_ajax(): + email = request.POST.get('email', None) + if email: + execute_query.delay(query_id, email) + return JsonResponse({'message': 'message was sent successfully'}) + return JsonResponse({}, status=403) + + +class SchemaView(PermissionRequiredMixin, View): + permission_required = 'change_permission' + + @method_decorator(xframe_options_sameorigin) + def dispatch(self, *args, **kwargs): + return super(SchemaView, self).dispatch(*args, **kwargs) + + def get(self, request, *args, **kwargs): + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + +class CreateQueryView(PermissionRequiredMixin, ExplorerContextMixin, CreateView): + + permission_required = 'change_permission' + + def form_valid(self, form): + form.instance.created_by_user = self.request.user + return super(CreateQueryView, self).form_valid(form) + + form_class = QueryForm + template_name = 'explorer/query.html' + + +class DeleteQueryView(PermissionRequiredMixin, ExplorerContextMixin, DeleteView): + + permission_required = 'change_permission' + model = Query + success_url = reverse_lazy("explorer_index") + + +class PlayQueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'change_permission' + + def get(self, request): + if url_get_query_id(request): +~~ query = get_object_or_404(Query, pk=url_get_query_id(request)) + return self.render_with_sql(request, query, run_query=False) + + if url_get_log_id(request): +~~ log = get_object_or_404(QueryLog, pk=url_get_log_id(request)) + query = Query(sql=log.sql, title="Playground", connection=log.connection) + return self.render_with_sql(request, query) + + return self.render() + + def post(self, request): + sql = request.POST.get('sql') + show = url_get_show(request) + query = Query(sql=sql, title="Playground", connection=request.POST.get('connection')) + passes_blacklist, failing_words = query.passes_blacklist() + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + run_query = not bool(error) if show else False + return self.render_with_sql(request, query, run_query=run_query, error=error) + + def render(self): + return self.render_template('explorer/play.html', {'title': 'Playground', 'form': QueryForm()}) + + def render_with_sql(self, request, query, run_query=True, error=None): + rows = url_get_rows(request) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'play' + form = QueryForm(request.POST if len(request.POST) else None, instance=query) + return self.render_template('explorer/%s.html' % template, query_viewmodel(request.user, + query, + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + show = url_get_show(request) + rows = url_get_rows(request) + vm = query_viewmodel(request.user, query, form=form, run_query=show, rows=rows) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'query' + return self.render_template('explorer/%s.html' % template, vm) + + def post(self, request, query_id): + if not app_settings.EXPLORER_PERMISSION_CHANGE(request.user): + return HttpResponseRedirect( + reverse_lazy('query_detail', kwargs={'query_id': query_id}) + ) + show = url_get_show(request) + query, form = QueryView.get_instance_and_form(request, query_id) + success = form.is_valid() and form.save() + vm = query_viewmodel(request.user, + query, + form=form, + run_query=show, + rows=url_get_rows(request), + message="Query saved." if success else None) + return self.render_template('explorer/query.html', vm) + + @staticmethod + def get_instance_and_form(request, query_id): +~~ query = get_object_or_404(Query, pk=query_id) + query.params = url_get_params(request) + form = QueryForm(request.POST if len(request.POST) else None, instance=query) + return query, form + + +def query_viewmodel(user, query, title=None, form=None, message=None, run_query=True, error=None, rows=app_settings.EXPLORER_DEFAULT_ROWS): + res = None + ql = None + if run_query: + try: + res, ql = query.execute_with_logging(user) + except DatabaseError as e: + error = str(e) + has_valid_results = not error and res and run_query + ret = { + 'tasks_enabled': app_settings.ENABLE_TASKS, + 'params': query.available_params(), + 'title': title, + 'shared': query.shared, + 'query': query, + 'form': form, + 'message': message, + 'error': error, + 'rows': rows, + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 8 from django-taggit +[django-taggit](https://github.com/jazzband/django-taggit/) +([PyPI page](https://pypi.org/project/django-taggit/)) provides a way +to create, store, manage and use tags in a [Django](/django.html) project. +The code for django-taggit is +[open source](https://github.com/jazzband/django-taggit/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-taggit / taggit / views.py**](https://github.com/jazzband/django-taggit/blob/master/taggit/./views.py) + +```python +# views.py +from django.contrib.contenttypes.models import ContentType +~~from django.shortcuts import get_object_or_404 +from django.views.generic.list import ListView + +from taggit.models import Tag, TaggedItem + + +def tagged_object_list(request, slug, queryset, **kwargs): + if callable(queryset): + queryset = queryset() + kwargs["slug"] = slug + tag_list_view = type( + "TagListView", + (TagListMixin, ListView), + {"model": queryset.model, "queryset": queryset}, + ) + return tag_list_view.as_view()(request, **kwargs) + + +class TagListMixin: + tag_suffix = "_tag" + + def dispatch(self, request, *args, **kwargs): + slug = kwargs.pop("slug") +~~ self.tag = get_object_or_404(Tag, slug=slug) + return super().dispatch(request, *args, **kwargs) + + def get_queryset(self, **kwargs): + qs = super().get_queryset(**kwargs) + return qs.filter( + pk__in=TaggedItem.objects.filter( + tag=self.tag, content_type=ContentType.objects.get_for_model(qs.model) + ).values_list("object_id", flat=True) + ) + + def get_template_names(self): + if self.tag_suffix: + self.template_name_suffix = self.tag_suffix + self.template_name_suffix + return super().get_template_names() + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + if "extra_context" not in context: + context["extra_context"] = {} + context["extra_context"]["tag"] = self.tag + return context + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 9 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms.py) + +```python +# forms.py +__all__ = [ + "UserCreationForm", + "UserUpdateForm", + "WikiSlugField", + "SpamProtectionMixin", + "CreateRootForm", + "MoveForm", + "EditForm", + "SelectWidgetBootstrap", + "TextInputPrepend", + "CreateForm", + "DeleteForm", + "PermissionsForm", + "DirFilterForm", + "SearchForm", +] + +from datetime import timedelta + +from django import forms +from django.apps import apps +from django.contrib.auth import get_user_model +from django.core import validators +from django.core.validators import RegexValidator +from django.forms.widgets import HiddenInput +~~from django.shortcuts import get_object_or_404 +from django.urls import Resolver404, resolve +from django.utils import timezone +from django.utils.safestring import mark_safe +from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy +from wiki import models +from wiki.conf import settings +from wiki.core import permissions +from wiki.core.diff import simple_merge +from wiki.core.plugins.base import PluginSettingsFormMixin +from wiki.editors import getEditor + +from .forms_account_handling import UserCreationForm, UserUpdateForm + +validate_slug_numbers = RegexValidator( + r"^[0-9]+$", + _("A 'slug' cannot consist solely of numbers."), + "invalid", + inverse_match=True, +) + + +class WikiSlugField(forms.CharField): + + default_validators = [validators.validate_slug, validate_slug_numbers] + + +## ... source file abbreviated to get to get_object_or_404 examples ... + + + ), + ) + content = forms.CharField( + label=_("Type in some contents"), + help_text=_( + "This is just the initial contents of your article. After creating it, you can use more complex features like adding plugins, meta data, related articles etc..." + ), + required=False, + widget=getEditor().get_widget(), + ) # @UndefinedVariable + + +class MoveForm(forms.Form): + + destination = forms.CharField(label=_("Destination")) + slug = WikiSlugField(max_length=models.URLPath.SLUG_MAX_LENGTH) + redirect = forms.BooleanField( + label=_("Redirect pages"), + help_text=_("Create a redirect page for every moved article?"), + required=False, + ) + + def clean(self): + cd = super().clean() + if cd.get("slug"): +~~ dest_path = get_object_or_404( + models.URLPath, pk=self.cleaned_data["destination"] + ) + cd["slug"] = _clean_slug(cd["slug"], dest_path) + return cd + + +class EditForm(forms.Form, SpamProtectionMixin): + + title = forms.CharField(label=_("Title"),) + content = forms.CharField( + label=_("Contents"), required=False, widget=getEditor().get_widget() + ) # @UndefinedVariable + + summary = forms.CharField( + label=pgettext_lazy("Revision comment", "Summary"), + help_text=_( + "Give a short reason for your edit, which will be stated in the revision log." + ), + required=False, + ) + + current_revision = forms.IntegerField(required=False, widget=forms.HiddenInput()) + + def __init__(self, request, current_revision, *args, **kwargs): + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 10 from gadget-board +[gadget-board](https://github.com/mik4el/gadget-board) is a +[Django](/django.html), +[Django REST Framework (DRF)](/django-rest-framework-drf.html) and +[Angular](/angular.html) web application that is open source under the +[Apache2 license](https://github.com/mik4el/gadget-board/blob/master/LICENSE). + +[**gadget-board / web / gadgets / permissions.py**](https://github.com/mik4el/gadget-board/blob/master/web/gadgets/permissions.py) + +```python +# permissions.py +from rest_framework import permissions +~~from django.shortcuts import get_object_or_404 +from .models import Gadget + + +class CanUserAddGadgetData(permissions.BasePermission): + def has_permission(self, request, view): + if request.method in permissions.SAFE_METHODS: + return True + if request.method == "POST": + if request.user.is_authenticated: +~~ gadget = get_object_or_404(Gadget, slug=view.kwargs['gadget_slug']) + if request.user in gadget.users_can_upload.all(): + return True + return False + + def has_object_permission(self, request, view, obj): + return False + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + + +## Example 11 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / views.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/views.py) + +```python +# views.py +from django.http import Http404, HttpResponse +~~from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse + +from wagtail.core import hooks +from wagtail.core.forms import PasswordViewRestrictionForm +from wagtail.core.models import Page, PageViewRestriction, Site + + +def serve(request, path): + site = Site.find_for_request(request) + if not site: + raise Http404 + + path_components = [component for component in path.split('/') if component] + page, args, kwargs = site.root_page.specific.route(request, path_components) + + for fn in hooks.get_hooks('before_serve_page'): + result = fn(page, request, args, kwargs) + if isinstance(result, HttpResponse): + return result + + return page.serve(request, *args, **kwargs) + + +def authenticate_with_password(request, page_view_restriction_id, page_id): +~~ restriction = get_object_or_404(PageViewRestriction, id=page_view_restriction_id) +~~ page = get_object_or_404(Page, id=page_id).specific + + if request.method == 'POST': + form = PasswordViewRestrictionForm(request.POST, instance=restriction) + if form.is_valid(): + restriction.mark_as_passed(request) + + return redirect(form.cleaned_data['return_url']) + else: + form = PasswordViewRestrictionForm(instance=restriction) + + action_url = reverse('wagtailcore_authenticate_with_password', args=[restriction.id, page.id]) + return page.serve_password_required_response(request, form, action_url) + + + +## ... source file continues with no further get_object_or_404 examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-redirect.markdown b/content/pages/examples/django/django-shortcuts-redirect.markdown new file mode 100644 index 000000000..31d3af0c3 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-redirect.markdown @@ -0,0 +1,1115 @@ +title: django.shortcuts redirect Example Code +category: page +slug: django-shortcuts-redirect-examples +sortorder: 500011347 +toc: False +sidebartitle: django.shortcuts redirect +meta: Python example code for the redirect callable from the django.shortcuts module of the Django project. + + +redirect is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / registration / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/registration/views.py) + +```python +# views.py +from django.contrib.auth import get_user_model +from django.contrib.auth.decorators import login_required +~~from django.shortcuts import render, redirect + +from users.models import generate_avatar +from users.forms import PersonalForm, ProfessionalForm, SubscriptionsForm + +User = get_user_model() + + +@login_required +def personal(request): + profile = request.user.profile + if request.method == 'POST': + form = PersonalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() + profile.avatar = generate_avatar(profile) + profile.save() +~~ return redirect('register-professional') + else: + form = PersonalForm(instance=profile) + return render(request, 'registration/personal.html', { + 'form': form + }) + +@login_required +def professional(request): + profile = request.user.profile + if request.method == 'POST': + form = ProfessionalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() +~~ return redirect('register-subscriptions') + else: + form = ProfessionalForm(instance=profile) + return render(request, 'registration/professional.html', { + 'form': form + }) + + +@login_required +def subscriptions(request): + subscriptions = request.user.subscriptions + if request.method == 'POST': + form = SubscriptionsForm(request.POST, instance=subscriptions) + if form.is_valid(): + form.save() + request.user.has_finished_registration = True + request.user.save() +~~ return redirect('home') + else: + form = SubscriptionsForm(instance=subscriptions) + return render(request, 'registration/subscriptions.html', { + 'form': form + }) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / views.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.contrib.sites.shortcuts import get_current_site +from django.http import ( + Http404, + HttpResponsePermanentRedirect, + HttpResponseRedirect, +) +~~from django.shortcuts import redirect +from django.urls import reverse, reverse_lazy +from django.utils.decorators import method_decorator +from django.views.decorators.debug import sensitive_post_parameters +from django.views.generic.base import TemplateResponseMixin, TemplateView, View +from django.views.generic.edit import FormView + +from ..exceptions import ImmediateHttpResponse +from ..utils import get_form_class, get_request_param +from . import app_settings, signals +from .adapter import get_adapter +from .forms import ( + AddEmailForm, + ChangePasswordForm, + LoginForm, + ResetPasswordForm, + ResetPasswordKeyForm, + SetPasswordForm, + SignupForm, + UserTokenForm, +) +from .models import EmailAddress, EmailConfirmation, EmailConfirmationHMAC +from .utils import ( + complete_signup, + get_login_redirect_url, + + +## ... source file abbreviated to get to redirect examples ... + + + try: + self.object = self.get_object() + if app_settings.CONFIRM_EMAIL_ON_GET: + return self.post(*args, **kwargs) + except Http404: + self.object = None + ctx = self.get_context_data() + return self.render_to_response(ctx) + + def post(self, *args, **kwargs): + self.object = confirmation = self.get_object() + confirmation.confirm(self.request) + get_adapter(self.request).add_message( + self.request, + messages.SUCCESS, + 'account/messages/email_confirmed.txt', + {'email': confirmation.email_address.email}) + if app_settings.LOGIN_ON_EMAIL_CONFIRMATION: + resp = self.login_on_confirm(confirmation) + if resp is not None: + return resp + redirect_url = self.get_redirect_url() + if not redirect_url: + ctx = self.get_context_data() + return self.render_to_response(ctx) +~~ return redirect(redirect_url) + + def login_on_confirm(self, confirmation): + user_pk = None + user_pk_str = get_adapter(self.request).unstash_user(self.request) + if user_pk_str: + user_pk = url_str_to_user_pk(user_pk_str) + user = confirmation.email_address.user + if user_pk == user.pk and self.request.user.is_anonymous: + return perform_login(self.request, + user, + app_settings.EmailVerificationMethod.NONE, + redirect_url=self.get_redirect_url) + + return None + + def get_object(self, queryset=None): + key = self.kwargs['key'] + emailconfirmation = EmailConfirmationHMAC.from_key(key) + if not emailconfirmation: + if queryset is None: + queryset = self.get_queryset() + try: + emailconfirmation = queryset.get(key=key.lower()) + except EmailConfirmation.DoesNotExist: + + +## ... source file abbreviated to get to redirect examples ... + + + return get_form_class(app_settings.FORMS, + 'reset_password_from_key', + self.form_class) + + def dispatch(self, request, uidb36, key, **kwargs): + self.request = request + self.key = key + + if self.key == INTERNAL_RESET_URL_KEY: + self.key = self.request.session.get(INTERNAL_RESET_SESSION_KEY, '') + token_form = UserTokenForm( + data={'uidb36': uidb36, 'key': self.key}) + if token_form.is_valid(): + self.reset_user = token_form.reset_user + return super(PasswordResetFromKeyView, self).dispatch(request, + uidb36, + self.key, + **kwargs) + else: + token_form = UserTokenForm( + data={'uidb36': uidb36, 'key': self.key}) + if token_form.is_valid(): + self.request.session[INTERNAL_RESET_SESSION_KEY] = self.key + redirect_url = self.request.path.replace( + self.key, INTERNAL_RESET_URL_KEY) +~~ return redirect(redirect_url) + + self.reset_user = None + response = self.render_to_response( + self.get_context_data(token_fail=True) + ) + return _ajax_response(self.request, response, form=token_form) + + def get_context_data(self, **kwargs): + ret = super(PasswordResetFromKeyView, self).get_context_data(**kwargs) + ret['action_url'] = reverse( + 'account_reset_password_from_key', + kwargs={'uidb36': self.kwargs['uidb36'], + 'key': self.kwargs['key']}) + return ret + + def get_form_kwargs(self): + kwargs = super(PasswordResetFromKeyView, self).get_form_kwargs() + kwargs["user"] = self.reset_user + kwargs["temp_key"] = self.key + return kwargs + + def form_valid(self, form): + form.save() + get_adapter(self.request).add_message( + + +## ... source file abbreviated to get to redirect examples ... + + + + return super(PasswordResetFromKeyView, self).form_valid(form) + + +password_reset_from_key = PasswordResetFromKeyView.as_view() + + +class PasswordResetFromKeyDoneView(TemplateView): + template_name = ( + "account/password_reset_from_key_done." + + app_settings.TEMPLATE_EXTENSION) + + +password_reset_from_key_done = PasswordResetFromKeyDoneView.as_view() + + +class LogoutView(TemplateResponseMixin, View): + + template_name = "account/logout." + app_settings.TEMPLATE_EXTENSION + redirect_field_name = "next" + + def get(self, *args, **kwargs): + if app_settings.LOGOUT_ON_GET: + return self.post(*args, **kwargs) + if not self.request.user.is_authenticated: +~~ response = redirect(self.get_redirect_url()) + return _ajax_response(self.request, response) + ctx = self.get_context_data() + response = self.render_to_response(ctx) + return _ajax_response(self.request, response) + + def post(self, *args, **kwargs): + url = self.get_redirect_url() + if self.request.user.is_authenticated: + self.logout() +~~ response = redirect(url) + return _ajax_response(self.request, response) + + def logout(self): + adapter = get_adapter(self.request) + adapter.add_message( + self.request, + messages.SUCCESS, + 'account/messages/logged_out.txt') + adapter.logout(self.request) + + def get_context_data(self, **kwargs): + ctx = kwargs + redirect_field_value = get_request_param(self.request, + self.redirect_field_name) + ctx.update({ + "redirect_field_name": self.redirect_field_name, + "redirect_field_value": redirect_field_value}) + return ctx + + def get_redirect_url(self): + return ( + get_next_redirect_url( + self.request, + self.redirect_field_name) or get_adapter( + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 3 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / helpers.py**](https://github.com/jazzband/django-axes/blob/master/axes/./helpers.py) + +```python +# helpers.py +from datetime import timedelta +from hashlib import md5 +from logging import getLogger +from string import Template +from typing import Callable, Optional, Type, Union +from urllib.parse import urlencode + +from django.core.cache import caches, BaseCache +from django.http import HttpRequest, HttpResponse, JsonResponse, QueryDict +~~from django.shortcuts import render, redirect +from django.utils.module_loading import import_string + +import ipware.ip + +from axes.conf import settings +from axes.models import AccessBase + +log = getLogger(__name__) + + +def get_cache() -> BaseCache: + + return caches[getattr(settings, "AXES_CACHE", "default")] + + +def get_cache_timeout() -> Optional[int]: + + cool_off = get_cool_off() + if cool_off is None: + return None + return int(cool_off.total_seconds()) + + +def get_cool_off() -> Optional[timedelta]: + + +## ... source file abbreviated to get to redirect examples ... + + + "failure_limit": get_failure_limit(request, credentials), + "username": get_client_username(request, credentials) or "", + } + + cool_off = get_cool_off() + if cool_off: + context.update( + { + "cooloff_time": get_cool_off_iso8601( + cool_off + ), # differing old name is kept for backwards compatibility + "cooloff_timedelta": cool_off, + } + ) + + if request.is_ajax(): + return JsonResponse(context, status=status) + + if settings.AXES_LOCKOUT_TEMPLATE: + return render(request, settings.AXES_LOCKOUT_TEMPLATE, context, status=status) + + if settings.AXES_LOCKOUT_URL: + lockout_url = settings.AXES_LOCKOUT_URL + query_string = urlencode({"username": context["username"]}) + url = "{}?{}".format(lockout_url, query_string) +~~ return redirect(url) + + return HttpResponse(get_lockout_message(), status=status) + + +def is_ip_address_in_whitelist(ip_address: str) -> bool: + if not settings.AXES_IP_WHITELIST: + return False + + return ip_address in settings.AXES_IP_WHITELIST + + +def is_ip_address_in_blacklist(ip_address: str) -> bool: + if not settings.AXES_IP_BLACKLIST: + return False + + return ip_address in settings.AXES_IP_BLACKLIST + + +def is_client_ip_address_whitelisted(request): + + if settings.AXES_NEVER_LOCKOUT_WHITELIST and is_ip_address_in_whitelist( + request.axes_ip_address + ): + return True + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 4 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / views.py**](https://github.com/divio/django-filer/blob/develop/filer/./views.py) + +```python +# views.py +from __future__ import absolute_import, unicode_literals + +from django.http import Http404 +~~from django.shortcuts import get_object_or_404, redirect + +from .models import File + + +def canonical(request, uploaded_at, file_id): + filer_file = get_object_or_404(File, pk=file_id, is_public=True) + if (not filer_file.file or int(uploaded_at) != filer_file.canonical_time): + raise Http404('No %s matches the given query.' % File._meta.object_name) +~~ return redirect(filer_file.url) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 5 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +~~from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + + +## ... source file abbreviated to get to redirect examples ... + + + view=self.admin_site.admin_view( + self.obj_perms_manage_group_view), + name='%s_%s_permissions_manage_group' % info), + ] + urls = myurls + urls + return urls + + def get_obj_perms_base_context(self, request, obj): + context = self.admin_site.each_context(request) + context.update({ + 'adminform': {'model_admin': self}, + 'media': self.media, + 'object': obj, + 'app_label': self.model._meta.app_label, + 'opts': self.model._meta, + 'original': str(obj), + 'has_change_permission': self.has_change_permission(request, obj), + 'model_perms': get_perms_for_model(obj), + 'title': _("Object permissions"), + }) + return context + + def obj_perms_manage_view(self, request, object_pk): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) +~~ return redirect(post_url) + + from django.contrib.admin.utils import unquote + obj = get_object_or_404(self.get_queryset( + request), pk=unquote(object_pk)) + users_perms = OrderedDict( + sorted( + get_users_with_perms(obj, attach_perms=True, + with_group_users=False).items(), + key=lambda user: getattr( + user[0], get_user_model().USERNAME_FIELD) + ) + ) + + groups_perms = OrderedDict( + sorted( + get_groups_with_perms(obj, attach_perms=True).items(), + key=lambda group: group[0].name + ) + ) + + if request.method == 'POST' and 'submit_manage_user' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if user_form.is_valid(): + user_id = user_form.cleaned_data['user'].pk + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user_id] + ) +~~ return redirect(url) + elif request.method == 'POST' and 'submit_manage_group' in request.POST: + user_form = self.get_obj_perms_user_select_form( + request)(request.POST) + group_form = self.get_obj_perms_group_select_form( + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if group_form.is_valid(): + group_id = group_form.cleaned_data['group'].id + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group_id] + ) +~~ return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) +~~ return redirect(post_url) + + user = get_object_or_404(get_user_model(), pk=user_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) +~~ return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) +~~ return redirect(post_url) + + group = get_object_or_404(Group, id=group_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) +~~ return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + + return render(request, self.get_obj_perms_manage_group_template(), context) + + def get_obj_perms_manage_group_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_group.html' + return self.obj_perms_manage_group_template + + def get_obj_perms_manage_group_form(self, request): + return AdminGroupObjectPermissionsForm + + +class GuardedModelAdmin(GuardedModelAdminMixin, admin.ModelAdmin): + + +class UserManage(forms.Form): + user = forms.CharField(label=_("User identification"), + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 6 from django-inline-actions +[django-inline-actions](https://github.com/escaped/django-inline-actions) +([PyPI package information](https://pypi.org/project/django-inline-actions/)) +is an extension that adds actions to the [Django](/django.html) +Admin InlineModelAdmin and ModelAdmin changelists. The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/escaped/django-inline-actions/blob/master/LICENSE). + +[**django-inline-actions / inline_actions / actions.py**](https://github.com/escaped/django-inline-actions/blob/master/inline_actions/./actions.py) + +```python +# actions.py +from django.contrib import messages +~~from django.shortcuts import redirect +from django.urls import reverse +from django.utils.translation import ugettext_lazy as _ + + +class ViewAction: + inline_actions = ['view_action'] + + def view_action(self, request, obj, parent_obj=None): + url = reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + obj._meta.model_name, + ), + args=(obj.pk,) + ) +~~ return redirect(url) + view_action.short_description = _("View") + + +class DeleteAction: + def get_inline_actions(self, request, obj=None): + actions = super().get_inline_actions(request, obj) + if self.has_delete_permission(request, obj): + actions.append('delete_action') + return actions + + def delete_action(self, request, obj, parent_obj=None): + if self.has_delete_permission(request): + obj.delete() + messages.info(request, "`{}` deleted.".format(obj)) + delete_action.short_description = _("Delete") + + +class DefaultActionsMixin(ViewAction, + DeleteAction): + inline_actions = [] + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 7 from django-loginas +[django-loginas](https://github.com/skorokithakis/django-loginas) +([PyPI package information](https://pypi.org/project/django-loginas/)) +is [Django](/django.html) code library for admins to log into an application +as another user, typically for debugging purposes. + +django-loginas is open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE). + +[**django-loginas / loginas / views.py**](https://github.com/skorokithakis/django-loginas/blob/master/loginas/./views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.admin.utils import unquote +from django.core.exceptions import ImproperlyConfigured, PermissionDenied +~~from django.shortcuts import redirect +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.csrf import csrf_protect +from django.views.decorators.http import require_POST + +from . import settings as la_settings +from .utils import login_as, restore_original_login + +try: + from importlib import import_module +except ImportError: + from django.utils.importlib import import_module # type: ignore + + +try: + from django.contrib.auth import get_user_model + + User = get_user_model() +except ImportError: + from django.contrib.auth.models import User # type: ignore + + +def _load_module(path): + + i = path.rfind(".") + + +## ... source file abbreviated to get to redirect examples ... + + + can_login_as = getattr(mod, attr) + except AttributeError: + raise ImproperlyConfigured("Module {0} does not define a {1} " "function.".format(module, attr)) + return can_login_as + + +@csrf_protect +@require_POST +def user_login(request, user_id): + user = User.objects.get(pk=unquote(user_id)) + + if isinstance(la_settings.CAN_LOGIN_AS, str): + can_login_as = _load_module(la_settings.CAN_LOGIN_AS) + elif hasattr(la_settings.CAN_LOGIN_AS, "__call__"): + can_login_as = la_settings.CAN_LOGIN_AS + else: + raise ImproperlyConfigured("The CAN_LOGIN_AS setting is neither a valid module nor callable.") + no_permission_error = None + try: + if not can_login_as(request, user): + no_permission_error = _("You do not have permission to do that.") + except PermissionDenied as e: + no_permission_error = str(e) + if no_permission_error is not None: + messages.error(request, no_permission_error, extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) +~~ return redirect(request.META.get("HTTP_REFERER", "/")) + + try: + login_as(user, request) + except ImproperlyConfigured as e: + messages.error(request, str(e), extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) +~~ return redirect(request.META.get("HTTP_REFERER", "/")) + +~~ return redirect(la_settings.LOGIN_REDIRECT) + + +def user_logout(request): + restore_original_login(request) + +~~ return redirect(la_settings.LOGOUT_REDIRECT) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 8 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / decorators.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./decorators.py) + +```python +# decorators.py +from functools import wraps + +from django.http import HttpResponseForbidden +from django.http import HttpResponseNotFound +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +~~from django.shortcuts import redirect +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.http import urlquote +from wiki.conf import settings +from wiki.core.exceptions import NoRootURL + + +def response_forbidden(request, article, urlpath, read_denied=False): + if request.user.is_anonymous: + qs = request.META.get("QUERY_STRING", "") + if qs: + qs = urlquote("?" + qs) + else: + qs = "" +~~ return redirect(settings.LOGIN_URL + "?next=" + request.path + qs) + else: + return HttpResponseForbidden( + render_to_string( + "wiki/permission_denied.html", + context={ + "article": article, + "urlpath": urlpath, + "read_denied": read_denied, + }, + request=request, + ) + ) + + +def get_article( # noqa: max-complexity=23 + func=None, + can_read=True, + can_write=False, + deleted_contents=False, + not_locked=False, + can_delete=False, + can_moderate=False, + can_create=False, +): + + def wrapper(request, *args, **kwargs): + from . import models + + path = kwargs.pop("path", None) + article_id = kwargs.pop("article_id", None) + + if path is not None: + try: + urlpath = models.URLPath.get_by_path(path, select_related=True) + except NoRootURL: +~~ return redirect("wiki:root_create") + except models.URLPath.DoesNotExist: + try: + pathlist = list(filter(lambda x: x != "", path.split("/"),)) + path = "/".join(pathlist[:-1]) + parent = models.URLPath.get_by_path(path) + return HttpResponseRedirect( + reverse("wiki:create", kwargs={"path": parent.path}) + + "?slug=%s" % pathlist[-1].lower() + ) + except models.URLPath.DoesNotExist: + return HttpResponseNotFound( + render_to_string( + "wiki/error.html", + context={"error_type": "ancestors_missing"}, + request=request, + ) + ) + if urlpath.article: + article = urlpath.article + else: + return_url = reverse("wiki:get", kwargs={"path": urlpath.parent.path}) + urlpath.delete() + return HttpResponseRedirect(return_url) + + elif article_id: + articles = models.Article.objects + + article = get_object_or_404(articles, id=article_id) + try: + urlpath = models.URLPath.objects.get(articles__article=article) + except ( + models.URLPath.DoesNotExist, + models.URLPath.MultipleObjectsReturned, + ): + urlpath = None + + else: + raise TypeError("You should specify either article_id or path") + + if not deleted_contents: + if urlpath: + if urlpath.is_deleted(): # This also checks all ancestors +~~ return redirect("wiki:deleted", path=urlpath.path) + else: + if article.current_revision and article.current_revision.deleted: +~~ return redirect("wiki:deleted", article_id=article.id) + + if article.current_revision.locked and not_locked: + return response_forbidden(request, article, urlpath) + + if can_read and not article.can_read(request.user): + return response_forbidden(request, article, urlpath, read_denied=True) + + if (can_write or can_create) and not article.can_write(request.user): + return response_forbidden(request, article, urlpath) + + if can_create and not ( + request.user.is_authenticated or settings.ANONYMOUS_CREATE + ): + return response_forbidden(request, article, urlpath) + + if can_delete and not article.can_delete(request.user): + return response_forbidden(request, article, urlpath) + + if can_moderate and not article.can_moderate(request.user): + return response_forbidden(request, article, urlpath) + + kwargs["urlpath"] = urlpath + + return func(request, article, *args, **kwargs) + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 9 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / middleware.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./middleware.py) + +```python +# middleware.py +import django.middleware.locale +~~import django.shortcuts +from django.utils import translation +from django.utils.deprecation import MiddlewareMixin + + +class RequestLocaleMiddleware(MiddlewareMixin): + def process_view(self, request, view_func, view_args, view_kwargs): + if request.method == 'GET': + language = request.GET.get('lang') + if language: + translation.activate(language) + request.session[translation.LANGUAGE_SESSION_KEY] = translation.get_language() + query = request.GET.copy() + del query['lang'] + path = '?'.join([request.path, query.urlencode()]) +~~ return django.shortcuts.redirect(path) + + + +## ... source file continues with no further redirect examples... + +``` + + +## Example 10 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / core / views.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/core/views.py) + +```python +# views.py +from django.http import Http404, HttpResponse +~~from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse + +from wagtail.core import hooks +from wagtail.core.forms import PasswordViewRestrictionForm +from wagtail.core.models import Page, PageViewRestriction, Site + + +def serve(request, path): + site = Site.find_for_request(request) + if not site: + raise Http404 + + path_components = [component for component in path.split('/') if component] + page, args, kwargs = site.root_page.specific.route(request, path_components) + + for fn in hooks.get_hooks('before_serve_page'): + result = fn(page, request, args, kwargs) + if isinstance(result, HttpResponse): + return result + + return page.serve(request, *args, **kwargs) + + +def authenticate_with_password(request, page_view_restriction_id, page_id): + restriction = get_object_or_404(PageViewRestriction, id=page_view_restriction_id) + page = get_object_or_404(Page, id=page_id).specific + + if request.method == 'POST': + form = PasswordViewRestrictionForm(request.POST, instance=restriction) + if form.is_valid(): + restriction.mark_as_passed(request) + +~~ return redirect(form.cleaned_data['return_url']) + else: + form = PasswordViewRestrictionForm(instance=restriction) + + action_url = reverse('wagtailcore_authenticate_with_password', args=[restriction.id, page.id]) + return page.serve_password_required_response(request, form, action_url) + + + +## ... source file continues with no further redirect examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-render.markdown b/content/pages/examples/django/django-shortcuts-render.markdown new file mode 100644 index 000000000..7b5d2d193 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-render.markdown @@ -0,0 +1,1883 @@ +title: django.shortcuts render Example Code +category: page +slug: django-shortcuts-render-examples +sortorder: 500011348 +toc: False +sidebartitle: django.shortcuts render +meta: Python example code for the render callable from the django.shortcuts module of the Django project. + + +render is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / registration / views.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/registration/views.py) + +```python +# views.py +from django.contrib.auth import get_user_model +from django.contrib.auth.decorators import login_required +~~from django.shortcuts import render, redirect + +from users.models import generate_avatar +from users.forms import PersonalForm, ProfessionalForm, SubscriptionsForm + +User = get_user_model() + + +@login_required +def personal(request): + profile = request.user.profile + if request.method == 'POST': + form = PersonalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() + profile.avatar = generate_avatar(profile) + profile.save() + return redirect('register-professional') + else: + form = PersonalForm(instance=profile) +~~ return render(request, 'registration/personal.html', { + 'form': form + }) + +@login_required +def professional(request): + profile = request.user.profile + if request.method == 'POST': + form = ProfessionalForm(request.POST, instance=profile) + if form.is_valid(): + form.save() + return redirect('register-subscriptions') + else: + form = ProfessionalForm(instance=profile) +~~ return render(request, 'registration/professional.html', { + 'form': form + }) + + +@login_required +def subscriptions(request): + subscriptions = request.user.subscriptions + if request.method == 'POST': + form = SubscriptionsForm(request.POST, instance=subscriptions) + if form.is_valid(): + form.save() + request.user.has_finished_registration = True + request.user.save() + return redirect('home') + else: + form = SubscriptionsForm(instance=subscriptions) +~~ return render(request, 'registration/subscriptions.html', { + 'form': form + }) + + + +## ... source file continues with no further render examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / helpers.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/helpers.py) + +```python +# helpers.py +from django.contrib import messages +from django.forms import ValidationError +from django.http import HttpResponseRedirect +~~from django.shortcuts import render +from django.urls import reverse + +from allauth.account import app_settings as account_settings +from allauth.account.adapter import get_adapter as get_account_adapter +from allauth.account.utils import complete_signup, perform_login, user_username +from allauth.exceptions import ImmediateHttpResponse + +from . import app_settings, signals +from .adapter import get_adapter +from .models import SocialLogin +from .providers.base import AuthError, AuthProcess + + +def _process_signup(request, sociallogin): + auto_signup = get_adapter(request).is_auto_signup_allowed( + request, + sociallogin) + if not auto_signup: + request.session['socialaccount_sociallogin'] = sociallogin.serialize() + url = reverse('socialaccount_signup') + ret = HttpResponseRedirect(url) + else: + if account_settings.USER_MODEL_USERNAME_FIELD: + username = user_username(sociallogin.user) + try: + get_account_adapter(request).clean_username(username) + except ValidationError: + user_username(sociallogin.user, '') + if not get_adapter(request).is_open_for_signup( + request, + sociallogin): +~~ return render( + request, + "account/signup_closed." + + account_settings.TEMPLATE_EXTENSION) + get_adapter(request).save_user(request, sociallogin, form=None) + ret = complete_social_signup(request, sociallogin) + return ret + + +def _login_social_account(request, sociallogin): + return perform_login(request, sociallogin.user, + email_verification=app_settings.EMAIL_VERIFICATION, + redirect_url=sociallogin.get_redirect_url(request), + signal_kwargs={"sociallogin": sociallogin}) + + +def render_authentication_error(request, + provider_id, + error=AuthError.UNKNOWN, + exception=None, + extra_context=None): + try: + if extra_context is None: + extra_context = {} + get_adapter(request).authentication_error( + request, + provider_id, + error=error, + exception=exception, + extra_context=extra_context) + except ImmediateHttpResponse as e: + return e.response + if error == AuthError.CANCELLED: + return HttpResponseRedirect(reverse('socialaccount_login_cancelled')) + context = { + 'auth_error': { + 'provider': provider_id, + 'code': error, + 'exception': exception + } + } + context.update(extra_context) +~~ return render( + request, + "socialaccount/authentication_error." + + account_settings.TEMPLATE_EXTENSION, + context + ) + + +def _add_social_account(request, sociallogin): + if request.user.is_anonymous: + return HttpResponseRedirect(reverse('socialaccount_connections')) + level = messages.INFO + message = 'socialaccount/messages/account_connected.txt' + action = None + if sociallogin.is_existing: + if sociallogin.user != request.user: + level = messages.ERROR + message = 'socialaccount/messages/account_connected_other.txt' + else: + action = 'updated' + message = 'socialaccount/messages/account_connected_updated.txt' + signals.social_account_updated.send( + sender=SocialLogin, + request=request, + sociallogin=sociallogin) + + +## ... source file continues with no further render examples... + +``` + + +## Example 3 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / helpers.py**](https://github.com/jazzband/django-axes/blob/master/axes/./helpers.py) + +```python +# helpers.py +from datetime import timedelta +from hashlib import md5 +from logging import getLogger +from string import Template +from typing import Callable, Optional, Type, Union +from urllib.parse import urlencode + +from django.core.cache import caches, BaseCache +from django.http import HttpRequest, HttpResponse, JsonResponse, QueryDict +~~from django.shortcuts import render, redirect +from django.utils.module_loading import import_string + +import ipware.ip + +from axes.conf import settings +from axes.models import AccessBase + +log = getLogger(__name__) + + +def get_cache() -> BaseCache: + + return caches[getattr(settings, "AXES_CACHE", "default")] + + +def get_cache_timeout() -> Optional[int]: + + cool_off = get_cool_off() + if cool_off is None: + return None + return int(cool_off.total_seconds()) + + +def get_cool_off() -> Optional[timedelta]: + + +## ... source file abbreviated to get to render examples ... + + + raise TypeError( + "settings.AXES_LOCKOUT_CALLABLE needs to be a string, callable, or None." + ) + + status = 403 + context = { + "failure_limit": get_failure_limit(request, credentials), + "username": get_client_username(request, credentials) or "", + } + + cool_off = get_cool_off() + if cool_off: + context.update( + { + "cooloff_time": get_cool_off_iso8601( + cool_off + ), # differing old name is kept for backwards compatibility + "cooloff_timedelta": cool_off, + } + ) + + if request.is_ajax(): + return JsonResponse(context, status=status) + + if settings.AXES_LOCKOUT_TEMPLATE: +~~ return render(request, settings.AXES_LOCKOUT_TEMPLATE, context, status=status) + + if settings.AXES_LOCKOUT_URL: + lockout_url = settings.AXES_LOCKOUT_URL + query_string = urlencode({"username": context["username"]}) + url = "{}?{}".format(lockout_url, query_string) + return redirect(url) + + return HttpResponse(get_lockout_message(), status=status) + + +def is_ip_address_in_whitelist(ip_address: str) -> bool: + if not settings.AXES_IP_WHITELIST: + return False + + return ip_address in settings.AXES_IP_WHITELIST + + +def is_ip_address_in_blacklist(ip_address: str) -> bool: + if not settings.AXES_IP_BLACKLIST: + return False + + return ip_address in settings.AXES_IP_BLACKLIST + + + + +## ... source file continues with no further render examples... + +``` + + +## Example 4 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / page_rendering.py**](https://github.com/divio/django-cms/blob/develop/cms/./page_rendering.py) + +```python +# page_rendering.py +from django.conf import settings +from django.http import Http404 +~~from django.shortcuts import render +from django.template.response import TemplateResponse +from django.urls import Resolver404, resolve, reverse + +from cms import __version__ +from cms.cache.page import set_page_cache +from cms.models import Page +from cms.utils.conf import get_cms_setting +from cms.utils.page import get_page_template_from_request +from cms.utils.page_permissions import user_can_change_page, user_can_view_page + + +def render_page(request, page, current_language, slug): + context = {} + context['lang'] = current_language + context['current_page'] = page + context['has_change_permissions'] = user_can_change_page(request.user, page) + context['has_view_permissions'] = user_can_view_page(request.user, page) + + if not context['has_view_permissions']: + return _handle_no_page(request) + + template = get_page_template_from_request(request) + response = TemplateResponse(request, template, context) + response.add_post_render_callback(set_page_cache) + + xframe_options = page.get_xframe_options() + if xframe_options == Page.X_FRAME_OPTIONS_INHERIT or xframe_options is None: + return response + + response.xframe_options_exempt = True + + if xframe_options == Page.X_FRAME_OPTIONS_ALLOW: + return response + elif xframe_options == Page.X_FRAME_OPTIONS_SAMEORIGIN: + response['X-Frame-Options'] = 'SAMEORIGIN' + elif xframe_options == Page.X_FRAME_OPTIONS_DENY: + response['X-Frame-Options'] = 'DENY' + return response + + +def render_object_structure(request, obj): + context = { + 'object': obj, + 'cms_toolbar': request.toolbar, + } +~~ return render(request, 'cms/toolbar/structure.html', context) + + +def _handle_no_page(request): + try: + resolve('%s$' % request.path) + except Resolver404 as e: + exc = Http404(dict(path=request.path, tried=e.args[0]['tried'])) + raise exc + raise Http404('CMS Page not found: %s' % request.path) + + +def _render_welcome_page(request): + context = { + 'cms_version': __version__, + 'cms_edit_on': get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON'), + 'django_debug': settings.DEBUG, + 'next_url': reverse('pages-root'), + } + return TemplateResponse(request, "cms/welcome.html", context) + + + +## ... source file continues with no further render examples... + +``` + + +## Example 5 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / folderadmin.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/folderadmin.py) + +```python +# folderadmin.py +from __future__ import absolute_import, division, unicode_literals + +import itertools +import os +import re +from collections import OrderedDict + +from django import forms +from django.conf import settings as django_settings +from django.conf.urls import url +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import capfirst, quote, unquote +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.db import models, router +from django.http import HttpResponse, HttpResponseRedirect +~~from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.encoding import force_text +from django.utils.html import escape +from django.utils.http import urlquote, urlunquote +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext as _ +from django.utils.translation import ugettext_lazy, ungettext + +from .. import settings +from ..models import ( + File, Folder, FolderPermission, FolderRoot, ImagesWithMissingData, + UnsortedImages, tools, +) +from ..settings import FILER_IMAGE_MODEL, FILER_PAGINATE_BY +from ..thumbnail_processors import normalize_subject_location +from ..utils.compatibility import get_delete_permission +from ..utils.filer_easy_thumbnails import FilerActionThumbnailer +from ..utils.loader import load_model +from . import views +from .forms import CopyFilesAndFoldersForm, RenameFilesForm, ResizeImagesForm +from .patched.admin_utils import get_deleted_objects +from .permissions import PrimitivePermissionAwareModelAdmin +from .tools import ( + AdminContext, admin_url_params_encoded, check_files_edit_permissions, + + +## ... source file abbreviated to get to render examples ... + + + 'virtual_items': virtual_items, + 'uploader_connections': settings.FILER_UPLOADER_CONNECTIONS, + 'permissions': permissions, + 'permstest': userperms_for_request(folder, request), + 'current_url': request.path, + 'title': _('Directory listing for %(folder_name)s') % {'folder_name': folder.name}, + 'search_string': ' '.join(search_terms), + 'q': urlquote(q), + 'show_result_count': show_result_count, + 'folder_children': folder_children, + 'folder_files': folder_files, + 'limit_search_to_folder': limit_search_to_folder, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + 'root_path': reverse('admin:index'), + 'action_form': action_form, + 'actions_on_top': self.actions_on_top, + 'actions_on_bottom': self.actions_on_bottom, + 'actions_selection_counter': self.actions_selection_counter, + 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(paginated_items.object_list)}, + 'selection_note_all': selection_note_all % {'total_count': paginator.count}, + 'media': self.media, + 'enable_permissions': settings.FILER_ENABLE_PERMISSIONS, + 'can_make_folder': request.user.is_superuser or (folder.is_root and settings.FILER_ALLOW_REGULAR_USERS_TO_ADD_ROOT_FOLDERS) or permissions.get("has_add_children_permission"), + }) +~~ return render(request, self.directory_listing_template, context) + + def filter_folder(self, qs, terms=()): + def construct_search(field_name): + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + for term in terms: + filters = models.Q() + for filter_ in self.search_fields: + filters |= models.Q(**{construct_search(filter_): term}) + for filter_ in self.get_owner_filter_lookups(): + filters |= models.Q(**{filter_: term}) + qs = qs.filter(filters) + return qs + + def filter_file(self, qs, terms=()): + for term in terms: + filters = (models.Q(name__icontains=term) + + +## ... source file abbreviated to get to render examples ... + + + return None + + if all_perms_needed or all_protected: + title = _("Cannot delete files and/or folders") + else: + title = _("Are you sure?") + + context = self.admin_site.each_context(request) + context.update({ + "title": title, + "instance": current_folder, + "breadcrumbs_action": _("Delete files and/or folders"), + "deletable_objects": all_deletable_objects, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": all_perms_needed, + "protected": all_protected, + "opts": opts, + 'is_popup': popup_status(request), + 'filer_admin_context': AdminContext(request), + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render( + request, + "admin/filer/delete_selected_files_confirmation.html", + context + ) + + delete_files_or_folders.short_description = ugettext_lazy( + "Delete selected files and/or folders") + + def _format_callback(self, obj, user, admin_site, perms_needed): + has_admin = obj.__class__ in admin_site._registry + opts = obj._meta + if has_admin: + admin_url = reverse('%s:%s_%s_change' + % (admin_site.name, + opts.app_label, + opts.object_name.lower()), + None, (quote(obj._get_pk_val()),)) + p = get_delete_permission(opts) + if not user.has_perm(p): + perms_needed.add(opts.verbose_name) + return mark_safe('%s: %s' % + (escape(capfirst(opts.verbose_name)), + admin_url, + escape(obj))) + + +## ... source file abbreviated to get to render examples ... + + + "destination") % ", ".join(conflicting_names)) + elif n: + self._move_files_and_folders_impl(files_queryset, folders_queryset, destination) + self.message_user(request, _("Successfully moved %(count)d files and/or folders to folder '%(destination)s'.") % { + "count": n, + "destination": destination, + }) + return None + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Move files and/or folders"), + "instance": current_folder, + "breadcrumbs_action": _("Move files and/or folders"), + "to_move": to_move, + "destination_folders": folders, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_move_destination.html", context) + + move_files_and_folders.short_description = ugettext_lazy("Move selected files and/or folders") + + def _rename_file(self, file_obj, form_data, counter, global_counter): + original_basename, original_extension = os.path.splitext(file_obj.original_filename) + if file_obj.name: + current_basename, current_extension = os.path.splitext(file_obj.name) + else: + current_basename = "" + current_extension = "" + file_obj.name = form_data['rename_format'] % { + 'original_filename': file_obj.original_filename, + 'original_basename': original_basename, + 'original_extension': original_extension, + 'current_filename': file_obj.name or "", + 'current_basename': current_basename, + 'current_extension': current_extension, + 'current_folder': getattr(file_obj.folder, 'name', ''), + 'counter': counter + 1, # 1-based + 'global_counter': global_counter + 1, # 1-based + } + file_obj.save() + + def _rename_files(self, files, form_data, global_counter): + + +## ... source file abbreviated to get to render examples ... + + + if files_queryset.count() + folders_queryset.count(): + n = self._rename_files_impl(files_queryset, folders_queryset, form.cleaned_data, 0) + self.message_user(request, _("Successfully renamed %(count)d files.") % { + "count": n, + }) + return None + else: + form = RenameFilesForm() + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Rename files"), + "instance": current_folder, + "breadcrumbs_action": _("Rename files"), + "to_rename": to_rename, + "rename_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_rename_format.html", context) + + rename_files.short_description = ugettext_lazy("Rename files") + + def _generate_new_filename(self, filename, suffix): + basename, extension = os.path.splitext(filename) + return basename + suffix + extension + + def _copy_file(self, file_obj, destination, suffix, overwrite): + if overwrite: + raise NotImplementedError + + + filename = self._generate_new_filename(file_obj.file.name, suffix) + + file_obj.pk = None + file_obj.id = None + file_obj.save() + file_obj.folder = destination + file_obj._file_data_changed_hint = False # no need to update size, sha1, etc. + file_obj.file = file_obj._copy_file(filename) + file_obj.original_filename = self._generate_new_filename(file_obj.original_filename, suffix) + file_obj.save() + + def _copy_files(self, files, destination, suffix, overwrite): + + +## ... source file abbreviated to get to render examples ... + + + selected_destination_folder = int(request.POST.get('destination', 0)) + except ValueError: + if current_folder: + selected_destination_folder = current_folder.pk + else: + selected_destination_folder = 0 + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Copy files and/or folders"), + "instance": current_folder, + "breadcrumbs_action": _("Copy files and/or folders"), + "to_copy": to_copy, + "destination_folders": folders, + "selected_destination_folder": selected_destination_folder, + "copy_form": form, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_copy_destination.html", context) + + copy_files_and_folders.short_description = ugettext_lazy("Copy selected files and/or folders") + + def _check_resize_perms(self, request, files_queryset, folders_queryset): + try: + check_files_read_permissions(request, files_queryset) + check_folder_read_permissions(request, folders_queryset) + check_files_edit_permissions(request, files_queryset) + except PermissionDenied: + return True + return False + + def _list_folders_to_resize(self, request, folders): + for fo in folders: + children = list(self._list_folders_to_resize(request, fo.children.all())) + children.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(fo.files) if isinstance(f, Image)]) + if children: + yield self._format_callback(fo, request.user, self.admin_site, set()) + yield children + + def _list_all_to_resize(self, request, files_queryset, folders_queryset): + to_resize = list(self._list_folders_to_resize(request, folders_queryset)) + to_resize.extend([self._format_callback(f, request.user, self.admin_site, set()) for f in sorted(files_queryset) if isinstance(f, Image)]) + return to_resize + + +## ... source file abbreviated to get to render examples ... + + + form.cleaned_data['upscale'] = form.cleaned_data['thumbnail_option'].upscale + if files_queryset.count() + folders_queryset.count(): + n = self._resize_images_impl(files_queryset, folders_queryset, form.cleaned_data) + self.message_user(request, _("Successfully resized %(count)d images.") % {"count": n, }) + return None + else: + form = ResizeImagesForm() + + context = self.admin_site.each_context(request) + context.update({ + "title": _("Resize images"), + "instance": current_folder, + "breadcrumbs_action": _("Resize images"), + "to_resize": to_resize, + "resize_form": form, + "cmsplugin_enabled": 'cmsplugin_filer_image' in django_settings.INSTALLED_APPS, + "files_queryset": files_queryset, + "folders_queryset": folders_queryset, + "perms_lacking": perms_needed, + "opts": opts, + "root_path": reverse('admin:index'), + "app_label": app_label, + "action_checkbox_name": helpers.ACTION_CHECKBOX_NAME, + }) + +~~ return render(request, "admin/filer/folder/choose_images_resize_options.html", context) + + resize_images.short_description = ugettext_lazy("Resize selected images") + + + +## ... source file continues with no further render examples... + +``` + + +## Example 6 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / admin.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./admin.py) + +```python +# admin.py +from collections import OrderedDict + +from django import forms +from django.conf import settings +from django.contrib import admin, messages +from django.contrib.admin.widgets import FilteredSelectMultiple +from django.contrib.auth import get_user_model +~~from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse, path +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import gettext +from guardian.forms import GroupObjectPermissionsForm, UserObjectPermissionsForm +from django.contrib.auth.models import Group +from guardian.shortcuts import (get_group_perms, get_groups_with_perms, get_perms_for_model, get_user_perms, + get_users_with_perms) + + +class AdminUserObjectPermissionsForm(UserObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class AdminGroupObjectPermissionsForm(GroupObjectPermissionsForm): + + def get_obj_perms_field_widget(self): + return FilteredSelectMultiple(_("Permissions"), False) + + +class GuardedModelAdminMixin: + change_form_template = \ + 'admin/guardian/model/change_form.html' + + +## ... source file abbreviated to get to render examples ... + + + request)(request.POST) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + if group_form.is_valid(): + group_id = group_form.cleaned_data['group'].id + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group_id] + ) + return redirect(url) + else: + user_form = self.get_obj_perms_user_select_form(request)() + group_form = self.get_obj_perms_group_select_form(request)() + + context = self.get_obj_perms_base_context(request, obj) + context['users_perms'] = users_perms + context['groups_perms'] = groups_perms + context['user_form'] = user_form + context['group_form'] = group_form + + request.current_app = self.admin_site.name + +~~ return render(request, self.get_obj_perms_manage_template(), context) + + def get_obj_perms_manage_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage.html' + return self.obj_perms_manage_template + + def obj_perms_manage_user_view(self, request, object_pk, user_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + user = get_object_or_404(get_user_model(), pk=user_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_user_form(request) + form = form_class(user, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_user' % info, + args=[obj.pk, user.pk] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['user_obj'] = user + context['user_perms'] = get_user_perms(user, obj) + context['form'] = form + + request.current_app = self.admin_site.name + +~~ return render(request, self.get_obj_perms_manage_user_template(), context) + + def get_obj_perms_manage_user_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_user.html' + return self.obj_perms_manage_user_template + + def get_obj_perms_user_select_form(self, request): + return UserManage + + def get_obj_perms_group_select_form(self, request): + return GroupManage + + def get_obj_perms_manage_user_form(self, request): + return AdminUserObjectPermissionsForm + + def obj_perms_manage_group_view(self, request, object_pk, group_id): + if not self.has_change_permission(request, None): + post_url = reverse('admin:index', current_app=self.admin_site.name) + return redirect(post_url) + + group = get_object_or_404(Group, id=group_id) + obj = get_object_or_404(self.get_queryset(request), pk=object_pk) + form_class = self.get_obj_perms_manage_group_form(request) + form = form_class(group, obj, request.POST or None) + + if request.method == 'POST' and form.is_valid(): + form.save_obj_perms() + msg = gettext("Permissions saved.") + messages.success(request, msg) + info = ( + self.admin_site.name, + self.model._meta.app_label, + self.model._meta.model_name, + ) + url = reverse( + '%s:%s_%s_permissions_manage_group' % info, + args=[obj.pk, group.id] + ) + return redirect(url) + + context = self.get_obj_perms_base_context(request, obj) + context['group_obj'] = group + context['group_perms'] = get_group_perms(group, obj) + context['form'] = form + + request.current_app = self.admin_site.name + +~~ return render(request, self.get_obj_perms_manage_group_template(), context) + + def get_obj_perms_manage_group_template(self): + if 'grappelli' in settings.INSTALLED_APPS: + return 'admin/guardian/contrib/grappelli/obj_perms_manage_group.html' + return self.obj_perms_manage_group_template + + def get_obj_perms_manage_group_form(self, request): + return AdminGroupObjectPermissionsForm + + +class GuardedModelAdmin(GuardedModelAdminMixin, admin.ModelAdmin): + + +class UserManage(forms.Form): + user = forms.CharField(label=_("User identification"), + max_length=200, + error_messages={'does_not_exist': _( + "This user does not exist")}, + help_text=_( + 'Enter a value compatible with User.USERNAME_FIELD') + ) + + def clean_user(self): + identification = self.cleaned_data['user'] + + +## ... source file continues with no further render examples... + +``` + + +## Example 7 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / admin.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./admin.py) + +```python +# admin.py +from django.contrib.admin.options import ModelAdmin, csrf_protect_m +from django.contrib.admin.views.main import SEARCH_VAR, ChangeList +from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +~~from django.shortcuts import render +from django.utils.encoding import force_str +from django.utils.translation import ungettext + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import SearchQuerySet +from haystack.utils import get_model_ct_tuple + + +class SearchChangeList(ChangeList): + def __init__(self, **kwargs): + self.haystack_connection = kwargs.pop("haystack_connection", DEFAULT_ALIAS) + super(SearchChangeList, self).__init__(**kwargs) + + def get_results(self, request): + if SEARCH_VAR not in request.GET: + return super(SearchChangeList, self).get_results(request) + + sqs = ( + SearchQuerySet(self.haystack_connection) + .models(self.model) + .auto_query(request.GET[SEARCH_VAR]) + .load_all() + ) + + +## ... source file abbreviated to get to render examples ... + + + "%(total_count)s selected", + "All %(total_count)s selected", + changelist.result_count, + ) + + context = { + "module_name": force_str(self.model._meta.verbose_name_plural), + "selection_note": selection_note % {"count": len(changelist.result_list)}, + "selection_note_all": selection_note_all + % {"total_count": changelist.result_count}, + "title": changelist.title, + "is_popup": changelist.is_popup, + "cl": changelist, + "media": media, + "has_add_permission": self.has_add_permission(request), + "opts": changelist.opts, + "app_label": self.model._meta.app_label, + "action_form": action_form, + "actions_on_top": self.actions_on_top, + "actions_on_bottom": self.actions_on_bottom, + "actions_selection_counter": getattr(self, "actions_selection_counter", 0), + } + context.update(extra_context or {}) + request.current_app = self.admin_site.name + app_name, model_name = get_model_ct_tuple(self.model) +~~ return render( + request, + self.change_list_template + or [ + "admin/%s/%s/change_list.html" % (app_name, model_name), + "admin/%s/change_list.html" % app_name, + "admin/change_list.html", + ], + context, + ) + + +class SearchModelAdmin(SearchModelAdminMixin, ModelAdmin): + pass + + + +## ... source file continues with no further render examples... + +``` + + +## Example 8 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / views / base.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/views/base.py) + +```python +# base.py +import json +import logging +import urllib.parse + +from django.contrib.auth.mixins import LoginRequiredMixin +from django.http import HttpResponse, JsonResponse +~~from django.shortcuts import render +from django.urls import reverse +from django.utils import timezone +from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_exempt +from django.views.decorators.debug import sensitive_post_parameters +from django.views.generic import FormView, View + +from ..exceptions import OAuthToolkitError +from ..forms import AllowForm +from ..http import OAuth2ResponseRedirect +from ..models import get_access_token_model, get_application_model +from ..scopes import get_scopes_backend +from ..settings import oauth2_settings +from ..signals import app_authorized +from .mixins import OAuthLibMixin + + +log = logging.getLogger("oauth2_provider") + + +class BaseAuthorizationView(LoginRequiredMixin, OAuthLibMixin, View): + + def dispatch(self, request, *args, **kwargs): + self.oauth2_data = {} + + +## ... source file abbreviated to get to render examples ... + + + return self.error_response(error, application) + + return self.render_to_response(self.get_context_data(**kwargs)) + + def redirect(self, redirect_to, application, token=None): + + if not redirect_to.startswith("urn:ietf:wg:oauth:2.0:oob"): + return super().redirect(redirect_to, application) + + parsed_redirect = urllib.parse.urlparse(redirect_to) + code = urllib.parse.parse_qs(parsed_redirect.query)["code"][0] + + if redirect_to.startswith("urn:ietf:wg:oauth:2.0:oob:auto"): + + response = { + "access_token": code, + "token_uri": redirect_to, + "client_id": application.client_id, + "client_secret": application.client_secret, + "revoke_uri": reverse("oauth2_provider:revoke-token"), + } + + return JsonResponse(response) + + else: +~~ return render( + request=self.request, + template_name="oauth2_provider/authorized-oob.html", + context={ + "code": code, + }, + ) + + +@method_decorator(csrf_exempt, name="dispatch") +class TokenView(OAuthLibMixin, View): + server_class = oauth2_settings.OAUTH2_SERVER_CLASS + validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS + oauthlib_backend_class = oauth2_settings.OAUTH2_BACKEND_CLASS + + @method_decorator(sensitive_post_parameters("password")) + def post(self, request, *args, **kwargs): + url, headers, body, status = self.create_token_response(request) + if status == 200: + access_token = json.loads(body).get("access_token") + if access_token is not None: + token = get_access_token_model().objects.get( + token=access_token) + app_authorized.send( + sender=self, request=request, + + +## ... source file continues with no further render examples... + +``` + + +## Example 9 from django-sql-explorer +[django-sql-explorer](https://github.com/groveco/django-sql-explorer) +([PyPI page](https://pypi.org/project/django-sql-explorer/0.2/)), +also referred to as "SQL Explorer", +is a code library for the [Django](/django.html) Admin that allows +approved, authenticated users to view and execute direct database SQL +queries. The tool keeps track of executed queries so users can share them +with each other, as well as export results to downloadable formats. +django-sql-explorer is provided as open source under the +[MIT license](https://github.com/groveco/django-sql-explorer/blob/master/LICENSE). + +[**django-sql-explorer / explorer / views.py**](https://github.com/groveco/django-sql-explorer/blob/master/explorer/./views.py) + +```python +# views.py +import re +import six +from collections import Counter + +try: + from django.urls import reverse_lazy +except ImportError: + from django.core.urlresolvers import reverse_lazy + +import django +from django.db import DatabaseError +from django.db.models import Count +from django.forms.models import model_to_dict +from django.http import HttpResponse, JsonResponse, HttpResponseRedirect, Http404 +~~from django.shortcuts import get_object_or_404, render +from django.views.decorators.http import require_POST +from django.utils.decorators import method_decorator +from django.views.generic import ListView +from django.views.generic.base import View +from django.views.generic.edit import CreateView, DeleteView +from django.views.decorators.clickjacking import xframe_options_sameorigin +from django.core.exceptions import ImproperlyConfigured +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.views import LoginView + +from explorer import app_settings +from explorer.connections import connections +from explorer.exporters import get_exporter_class +from explorer.forms import QueryForm +from explorer.models import Query, QueryLog, MSG_FAILED_BLACKLIST +from explorer.tasks import execute_query +from explorer.utils import ( + url_get_rows, + url_get_query_id, + url_get_log_id, + url_get_params, + safe_login_prompt, + fmt_sql, + allowed_query_pks, + url_get_show, + url_get_fullscreen +) + +from explorer.schema import schema_info +from explorer import permissions + + +class ExplorerContextMixin(object): + + def gen_ctx(self): + return {'can_view': app_settings.EXPLORER_PERMISSION_VIEW(self.request.user), + 'can_change': app_settings.EXPLORER_PERMISSION_CHANGE(self.request.user)} + + def get_context_data(self, **kwargs): + ctx = super(ExplorerContextMixin, self).get_context_data(**kwargs) + ctx.update(self.gen_ctx()) + return ctx + + def render_template(self, template, ctx): + ctx.update(self.gen_ctx()) +~~ return render(self.request, template, ctx) + + +class PermissionRequiredMixin(object): + + permission_required = None + + def get_permission_required(self): + if self.permission_required is None: + raise ImproperlyConfigured( + '{0} is missing the permission_required attribute. Define {0}.permission_required, or override ' + '{0}.get_permission_required().'.format(self.__class__.__name__) + ) + return self.permission_required + + def has_permission(self, request, *args, **kwargs): + perms = self.get_permission_required() + handler = getattr(permissions, perms) # TODO: fix the case when the perms is + return handler(request, *args, **kwargs) + + def handle_no_permission(self, request): + return SafeLoginView.as_view( + extra_context={'title': 'Log in', REDIRECT_FIELD_NAME: request.get_full_path()})(request) + + def dispatch(self, request, *args, **kwargs): + + +## ... source file abbreviated to get to render examples ... + + + + permission_required = 'view_permission' + + def post(self, request, query_id, *args, **kwargs): + if request.is_ajax(): + email = request.POST.get('email', None) + if email: + execute_query.delay(query_id, email) + return JsonResponse({'message': 'message was sent successfully'}) + return JsonResponse({}, status=403) + + +class SchemaView(PermissionRequiredMixin, View): + permission_required = 'change_permission' + + @method_decorator(xframe_options_sameorigin) + def dispatch(self, *args, **kwargs): + return super(SchemaView, self).dispatch(*args, **kwargs) + + def get(self, request, *args, **kwargs): + connection = kwargs.get('connection') + if connection not in connections: + raise Http404 + schema = schema_info(connection) + if schema: +~~ return render(None, 'explorer/schema.html', + {'schema': schema_info(connection)}) + else: +~~ return render(None, 'explorer/schema_building.html') + + +@require_POST +def format_sql(request): + sql = request.POST.get('sql', '') + formatted = fmt_sql(sql) + return JsonResponse({"formatted": formatted}) + + +class ListQueryView(PermissionRequiredMixin, ExplorerContextMixin, ListView): + + permission_required = 'view_permission_list' + + def recently_viewed(self): + qll = QueryLog.objects.filter(run_by_user=self.request.user, query_id__isnull=False).order_by( + '-run_at').select_related('query') + ret = [] + tracker = [] + for ql in qll: + if len(ret) == app_settings.EXPLORER_RECENT_QUERY_COUNT: + break + + if ql.query_id not in tracker: + ret.append(ql) + + +## ... source file abbreviated to get to render examples ... + + +class PlayQueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'change_permission' + + def get(self, request): + if url_get_query_id(request): + query = get_object_or_404(Query, pk=url_get_query_id(request)) + return self.render_with_sql(request, query, run_query=False) + + if url_get_log_id(request): + log = get_object_or_404(QueryLog, pk=url_get_log_id(request)) + query = Query(sql=log.sql, title="Playground", connection=log.connection) + return self.render_with_sql(request, query) + + return self.render() + + def post(self, request): + sql = request.POST.get('sql') + show = url_get_show(request) + query = Query(sql=sql, title="Playground", connection=request.POST.get('connection')) + passes_blacklist, failing_words = query.passes_blacklist() + error = MSG_FAILED_BLACKLIST % ', '.join(failing_words) if not passes_blacklist else None + run_query = not bool(error) if show else False + return self.render_with_sql(request, query, run_query=run_query, error=error) + +~~ def render(self): + return self.render_template('explorer/play.html', {'title': 'Playground', 'form': QueryForm()}) + + def render_with_sql(self, request, query, run_query=True, error=None): + rows = url_get_rows(request) + fullscreen = url_get_fullscreen(request) + template = 'fullscreen' if fullscreen else 'play' + form = QueryForm(request.POST if len(request.POST) else None, instance=query) + return self.render_template('explorer/%s.html' % template, query_viewmodel(request.user, + query, + title="Playground", + run_query=run_query, + error=error, + rows=rows, + form=form)) + + +class QueryView(PermissionRequiredMixin, ExplorerContextMixin, View): + + permission_required = 'view_permission' + + def get(self, request, query_id): + query, form = QueryView.get_instance_and_form(request, query_id) + query.save() # updates the modified date + show = url_get_show(request) + + +## ... source file continues with no further render examples... + +``` + + +## Example 10 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / views / accounts.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/views/accounts.py) + +```python +# accounts.py +from django.conf import settings as django_settings +from django.contrib import messages +from django.contrib.auth import get_user_model +from django.contrib.auth import login as auth_login +from django.contrib.auth import logout as auth_logout +from django.contrib.auth.forms import AuthenticationForm +from django.shortcuts import get_object_or_404 +from django.shortcuts import redirect +~~from django.shortcuts import render +from django.urls import reverse +from django.utils.translation import gettext as _ +from django.views.generic import CreateView +from django.views.generic import FormView +from django.views.generic import UpdateView +from django.views.generic import View +from wiki import forms +from wiki.conf import settings + +User = get_user_model() + + +class Signup(CreateView): + model = User + form_class = forms.UserCreationForm + template_name = "wiki/accounts/signup.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_anonymous and not request.user.is_superuser: + return redirect("wiki:root") + if not settings.ACCOUNT_HANDLING: + return redirect(settings.SIGNUP_URL) + if not request.user.is_superuser and not settings.ACCOUNT_SIGNUP_ALLOWED: + c = {"error_msg": _("Account signup is only allowed for administrators.")} +~~ return render(request, "wiki/error.html", context=c) + + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["honeypot_class"] = context["form"].honeypot_class + context["honeypot_jsfunction"] = context["form"].honeypot_jsfunction + return context + + def get_success_url(self, *args): + messages.success( + self.request, _("You are now signed up... and now you can sign in!") + ) + return reverse("wiki:login") + + +class Logout(View): + def dispatch(self, request, *args, **kwargs): + if not settings.ACCOUNT_HANDLING: + return redirect(settings.LOGOUT_URL) + return super().dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + auth_logout(request) + + +## ... source file continues with no further render examples... + +``` + + +## Example 11 from dmd-interpreter +[dmd-interpreter](https://github.com/mitchalexbailey/dmd-interpreter) +([running web app](http://www.dmd.nl/DOVE)) +is a Python tool to aggregate clinically relevant information related +to variants in the DMD gene and display that [data](/data.html) to a user +with a [Django](/django.html) web application. + +[**dmd-interpreter / interpreter / views.py**](https://github.com/mitchalexbailey/dmd-interpreter/blob/master/interpreter/./views.py) + +```python +# views.py +~~from django.shortcuts import get_object_or_404, render +from django.http import HttpResponseRedirect, HttpResponse +from django.template import RequestContext, loader +from django.core.urlresolvers import reverse +from .forms import IndexForm, ACMGForm + +from interpreter_functions import * +import os,sys +import subprocess +import csv +import re +import pprint + +interpreter_dir = os.path.dirname(__file__) + +def index(request): + if request.method == "POST": + user = request.POST.get('user', None) +~~ return render(request, 'index.html') + + +def results(request): + if request.method == 'POST': + mut = request.POST.get('mutation', None) + + ucsc_info = [12, 'NM_004006', 'chrX', '-', 31137344, 33229673, 31140035, 33229429, 79, '31137344,31144758,31152218,31164407,31165391,31187559,31190464,31191655,31196048,31196785,31198486,31200854,31222077,31224698,31227614,31241163,31279071,31341714,31366672,31462597,31496222,31497099,31514904,31525397,31645789,31676106,31697491,31747747,31792076,31838091,31854834,31893307,31947712,31950196,31986455,32235032,32305645,32328198,32360216,32361250,32364059,32366522,32380904,32382698,32383136,32398626,32404426,32407617,32408187,32429868,32456357,32459296,32466572,32472778,32481555,32482702,32486614,32490280,32503035,32509393,32519871,32536124,32563275,32583818,32591646,32591861,32613873,32632419,32662248,32663080,32715986,32717228,32827609,32834584,32841411,32862899,32867844,33038255,33229398,', '31140047,31144790,31152311,31164531,31165635,31187718,31190530,31191721,31196087,31196922,31198598,31201021,31222235,31224784,31227816,31241238,31279133,31341775,31366751,31462744,31496491,31497220,31515061,31525570,31645979,31676261,31697703,31747865,31792309,31838200,31854939,31893490,31947862,31950344,31986631,32235180,32305818,32328393,32360399,32361403,32364197,32366645,32381075,32382827,32383316,32398797,32404582,32407791,32408298,32430030,32456507,32459431,32466755,32472949,32481711,32482816,32486827,32490426,32503216,32509635,32519959,32536248,32563451,32583998,32591754,32591963,32613993,32632570,32662430,32663269,32716115,32717410,32827728,32834757,32841504,32862977,32867937,33038317,33229673,', 0, 'DMD', 'cmpl', 'cmpl', '0,1,1,0,2,2,2,2,2,0,2,0,1,2,1,1,2,1,0,0,1,0,2,0,2,0,1,0,1,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,1,0,'] + + + + f = open(os.path.join(interpreter_dir, "rescue_esesites.txt")) + ese_sites = [] + for line in f: + temp = '' + for char in line: + if char != "\n": + temp += char + temp = ''.join(temp) + ese_sites += [temp] + f.close() + + f = open(os.path.join(interpreter_dir, "esssites.txt")) + ess_sites = [] + for line in f: + + +## ... source file abbreviated to get to render examples ... + + + provean = 'Not missense' + metasvm = 'Not missense' + nsfp_score = '' + nsfp_message = '' + cv = '' + consequence = '' + consequence_statement = '' + ese_message = '' + esefinder = '' + rescueese = '' + ess_message = '' + splice_message = '' + splice_message2 = '' + motif_message = '' + ds = '' + splice_result = [] + long_aa_change = [] + readthrough_elig = "Not eligible" + + ex_input = exoninput(mut) + mutype, search = type_inp(mut, ex_input) + num_list, intron_list = parse(mut, mutype, exon_positions, ex_input) + + + if mutype == "Invalid mutation" and len(num_list) == 0: +~~ return render(request, 'index.html',{'success':False}) + else: + pass + + + for num in num_list: + if int(num) > 3685*3 and not ex_input: #AA length *3 + past_max = True + elif int(num) > len_ref: + past_max = True + else: + pass + + + intron_only = intron_count(intron_list, num_list) + + + if (mutype == "Deletion" or mutype == "Duplication") and "c." not in mut and len(num_list) > 0 and not ex_input and "Nucleotide" not in mut: + if max(num_list) < 80 and not ex_input: + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + num_list = re.findall("\d+", mut) + g.write("""

    You entered: '""") + g.write(mut) + g.write("""'


    Did you mean...

    '""") + temp = '' + temp += mutype + if len(num_list) == 1: + temp += " of exon " + temp += str(num_list[0]) + if len(num_list) > 1: + temp += " of exons " + temp += str(min(num_list)) + temp += "-" + temp += str(max(num_list)) + g.write(temp) + g.write("""'?


    {% csrf_token %}{% csrf_token %}
    """) + g.closed +~~ return render(request, 'index.html', {'triage':True}) + + + + if past_max or mutype == "Invalid mutation": + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + g.write("""

    You entered: '""") + g.write(mut) + g.write("""'

    Did you mean...
    """) + + if past_max: + g.write(("""

    A smaller number?


    You entered: %s""" % str(max(num_list))) + """
    Which is larger than the length of the DMD, Dp427m coding sequence (11055 nt)

    Please enter your revised mutation below, or return to the previous page to try the "Exon deletion selector" feature.

    {% csrf_token %}

    """) + + if mutype == "Invalid mutation" and not past_max and len(num_list)>0:# and not ex_input: + tridel = "Deletion of Nucleotide(s) " + tridelex = "Deletion of Exon(s) " + tridup = "Duplication of Nucleotide(s) " + tridupex = "Duplication of Exon(s) " + triins = "Insertion at Nucleotide position(s) " + tridelins = "Deletion/Insertion at Nucleotide position(s) " + tripoint = "Point mutation at Nucleotide position(s) " + if len(num_list) == 1: + tridel += str(num_list[0]) + tridup += str(num_list[0]) + tridelex += str(num_list[0]) + + +## ... source file abbreviated to get to render examples ... + + + + g.write("
    ") + + g.write("
    ") + + g.write("
    ") + + g.write("
    """) + + g.closed +~~ return render(request, 'index.html', {'triage':True}) + + if mutype != "Invalid mutation" and len(num_list) == 0 and not intron_only: + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + g.write("""

    You entered: '""") + g.write(mut) + g.write("'



    This mutation type (") + g.write(mutype) + g.write(""") requires a position to be interpreted.



    Please complete the mutation in the box below, or return to the previous page to try the "Exon deletion selector" feature.

    {% csrf_token %}
    *Note that the symbol '>' denotes point mutation*

    """) + g.closed +~~ return render(request, 'index.html', {'triage':True}) + + if not past_max and mutype != "Invalid mutation": # and len(num_list) != 0: + if intron_only: + missense = False + nonsense = False + silent = True + frame_shift = False + length_mutation, pm_change, pm_pre = get_length(mut, mutype, num_list, mut, ex_input, reference_cdna) + positions_in_genomic1, positions_in_genomic2, positions_in_genomic3 = cdna2gen(num_list, exon_positions, genomic_positions1, genomic_positions2, genomic_positions3, intron_list) + ghgvs, ghgvs19 = HGVS(positions_in_genomic2, positions_in_genomic3, mutype, search, length_mutation, ex_input, [[],[]], pm_change, pm_pre, True) + + + if mutype == "Point mutation" and len(pm_pre) == 0: + if mutype == "Point mutation" or mutype == "Deletion/Insertion": + if len(num_list) == 1: + pm_pre = genomic_dna[min(positions_in_genomic1)] + if len(num_list)>1: + pm_pre = genomic_dna[min(positions_in_genomic1):max(positions_in_genomic1)] + else: + if len(num_list) == 1: + pm_change = genomic_dna[min(positions_in_genomic1)] + if len(num_list)>1 and length_mutation < 4: + pm_change = genomic_dna[min(positions_in_genomic1):max(positions_in_genomic1)] + cDNA, mut_genomic_dna = alter_cDNA(reference_cdna, num_list, positions_in_genomic1, length_mutation, mutype, pm_change, genomic_dna, intron_only) + + +## ... source file abbreviated to get to render examples ... + + + if mutype == "Deletion" or mutype == "Duplication": + if len(num_list) == 1: + pm_change = genomic_dna[min(positions_in_genomic1)] + if len(num_list)>1 and length_mutation < 4: + pm_change = genomic_dna[min(positions_in_genomic1)-1:max(positions_in_genomic1)] + cDNA, mut_genomic_dna = alter_cDNA(reference_cdna, num_list, positions_in_genomic1, length_mutation, mutype, pm_change, genomic_dna, intron_only) + if ("Insertion" in mutype or mutype == "Point mutation") and len(pm_change) == 0: + with open(os.path.join(interpreter_dir, 'templates/triage.html'), 'w') as g: + g.write("""

    You entered: '""") + g.write(mut) + g.write("""'

    This mutation type requires that you input the inserted nucleotides (i.e. an A, T, G, C or combination thereof).



    Please add the inserted bases in the box below, or return to the previous page to try the "Exon deletion selector" feature.

    {% csrf_token %}

    """) + g.closed +~~ return render(request, 'index.html', {'triage':True}) + frame_shift = frame(length_mutation, mutype, num_list) + exon_numbers = [] + exon_ints = [] + if (mutype == "Deletion" or mutype == "Duplication"): + exon_numbers, part = exons(num_list, exon_positions, ex_input, mut, part) + if len(exon_numbers) != 0: + for item in exon_numbers: + exon_ints += [int(item)] + temp = str(exon_numbers[0]), "-", str(exon_numbers[len(exon_numbers)-1]) + temp = ''.join(temp) + standard_hgvs, catcher = HGVS(num_list, num_list, mutype, search, length_mutation, ex_input, intron_list, pm_change, pm_pre) + mv_results = myVariantSearch(standard_hgvs) + CV = ClinVar(mv_results, standard_hgvs) + aa_ref = translate(reference_cdna[244:]) + nsfp_results, path_pred = gen_point(positions_in_genomic1, complement(pm_change), intron_only, length_mutation, NSFP) + + if mutype == "Deletion" and len(num_list) != 0: + cDNA, mut_genomic_dna = alter_cDNA(reference_cdna, num_list, positions_in_genomic1, length_mutation, mutype, pm_change, genomic_dna, intron_only) + aa_seq = translate(cDNA[244:]) + if frame_shift == False: + aa_length = (length_mutation)/3 + i = 0 + filler = '' + while i < aa_length: + + +## ... source file abbreviated to get to render examples ... + + + + + if len(posskip)>0 and frame_shift: + if part == True: + posskip = [] + if part and ex_input: + print part + posskip = [] + posskip += ["This variant includes a partial exon deletion."] + elif not frame_shift: + posskip = [] + posskip += ["There is no frameshift predicted."] + elif length_mutation < 32: + posskip = [] + posskip += ["This variant type (missense; nonsense; small insertion, deletion, indel; or splice-affecting) has not been clinically tested in DMD with exon skip therapy."] + elif len(posskip) == 0 and length_mutation >= 32: + posskip += ["There are no theoretical exon skips predicted to apply to this mutation."] + + if nonsense and not frame_shift: + readthrough_elig = "Eligible" + else: + pass + + + else: +~~ return render(request, 'index.html',{'success':False}) + + + if mutype != "Deletion" and mutype != "Deletion/Insertion" and mutype != "Duplication" and not intron_only: + temp_cdna = "",cDNA[0:min(num_list)+243],"",cDNA[min(num_list)+243:min(num_list)+243+length_mutation],"",cDNA[max(num_list)+243+length_mutation:len(cDNA)],"" + if mutype == "Point mutation (insertion)": + temp_cdna = "",cDNA[0:max(num_list)+244],"",cDNA[max(num_list)+244:max(num_list)+244+length_mutation],"",cDNA[max(num_list)+244+length_mutation:len(cDNA)],"" + if mutype == "Duplication" and not intron_only: + temp_cdna = "",cDNA[0:min(num_list)+244],"",cDNA[min(num_list)+244:min(num_list)+244+(length_mutation)],"",cDNA[min(num_list)+244+(length_mutation):min(num_list)+244+(length_mutation*2)],"",cDNA[min(num_list)+244+(length_mutation*2):len(cDNA)],"" + if mutype == "Insertion" and not intron_only: + temp_cdna = "",cDNA[0:min(num_list)+243],"",cDNA[min(num_list)+244:min(num_list)+244+length_mutation],"",cDNA[max(num_list)+244+length_mutation:len(cDNA)],"" + if mutype == "Deletion" and not intron_only: + fill = '' + i = 0 + while i",fill,"",cDNA[min(num_list)+244:len(cDNA)],"" + if intron_only: + temp_refcdna = "",reference_cdna,"" + temp_cdna = temp_refcdna + refcdna_for_print = ''.join(temp_refcdna) + if mutype == "Deletion/Insertion" and not intron_only: + i = 0 + fill = '' + + +## ... source file abbreviated to get to render examples ... + + + standard_hgvs_search = ''.join(standard_hgvs_search) + leiden_link ="https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public%22#object_id=VariantOnTranscriptUnique%2CVariantOnGenome&id=DMD&order=VariantOnTranscript%2FDNA%2CASC&skip[chromosome]=chromosome&skip[allele_]=allele_&skip[transcriptid]=transcriptid&search_transcriptid=00000024&skip[owner_countryid]=owner_countryid&FRMatchType_CustomVL_VOTunique_VOG_DMD=1&FRMatchType_CustomVL_VOTunique_VOG_DMD=2&FRMatchType_CustomVL_VOTunique_VOG_DMD=3&FRReplaceAll_CustomVL_VOTunique_VOG_DMD=1&=Preview&=Cancel&=Submit&search_VariantOnTranscript/DNA="+standard_hgvs_search + iframe = "" + elif length_mutation > 30 and mutype != "Deletion/Insertion": + leiden_link = "https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public%22#object_id=VariantOnTranscriptUnique%2CVariantOnGenome&id=DMD&order=VariantOnTranscript%2FDNA%2CASC&skip[chromosome]=chromosome&skip[allele_]=allele_&skip[transcriptid]=transcriptid&search_transcriptid=00000024&skip[owner_countryid]=owner_countryid&FRMatchType_CustomVL_VOTunique_VOG_DMD=1&FRMatchType_CustomVL_VOTunique_VOG_DMD=2&FRMatchType_CustomVL_VOTunique_VOG_DMD=3&FRReplaceAll_CustomVL_VOTunique_VOG_DMD=1&=Preview&=Cancel&=Submit&search_VariantOnTranscript/DNA="+search_nums+"%20"+search + iframe = "" + elif length_mutation < 30 and mutype != "Point mutation": + leiden_link = "https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public%22#object_id=VariantOnTranscriptUnique%2CVariantOnGenome&id=DMD&order=VariantOnTranscript%2FDNA%2CASC&skip[chromosome]=chromosome&skip[allele_]=allele_&skip[transcriptid]=transcriptid&search_transcriptid=00000024&skip[owner_countryid]=owner_countryid&FRMatchType_CustomVL_VOTunique_VOG_DMD=1&FRMatchType_CustomVL_VOTunique_VOG_DMD=2&FRMatchType_CustomVL_VOTunique_VOG_DMD=3&FRReplaceAll_CustomVL_VOTunique_VOG_DMD=1&=Preview&=Cancel&=Submit&search_VariantOnTranscript/DNA="+standard_hgvs_search + iframe = "" + else: + leiden_link = "https://databases.lovd.nl/shared/variants/DMD/unique?search_var_status=%3D%22Marked%22%7C%3D%22Public" + iframe = "" + + if nsfp_score == '': + nsfp_score = 'N/A' + else: + pass + + try: + mv_results = mv_results[0] + mv_results_formatted = pprint.pformat(mv_results, indent=4) + mv_disable = False + except: + mv_results_formatted = "No myVariantInfo results available" + mv_disable = True +~~ return render(request, 'main.html', + {'user_inp':mut, + 'mutype':mutype, + 'hgvs':standard_hgvs, + 'ghgvs':ghgvs, + 'ghgvs19':ghgvs19, + 'length_mutation':length_mutation, + 'exons': exon_numbers, + 'domains':ds, + 'therapy':therapy, + 'insilico_message':insilico_message, + 'splice_message':splice_message, + 'ese_message':ese_message, + 'consequence':consequence, + 'consequence_message':consequence_statement, + 'cv':cv, + 'leiden_link':leiden_link, + 'leiden_frame':iframe, + 'cdna_for_print':cdna_for_print, #full mutated sequence + 'cdna_print_preview':cdna_print_preview, #partial mutated + 'refcdna_for_print':refcdna_for_print, #full wt cdna + 'refcdna_print_preview':refcdna_print_preview, #wt preview + 'readthrough_elig':readthrough_elig, + 'posskip':posskip, #list of skips (empty if there are none) + 'sift':sift, + + +## ... source file continues with no further render examples... + +``` + diff --git a/content/pages/examples/django/django-shortcuts-resolve-url.markdown b/content/pages/examples/django/django-shortcuts-resolve-url.markdown new file mode 100644 index 000000000..b090f13f9 --- /dev/null +++ b/content/pages/examples/django/django-shortcuts-resolve-url.markdown @@ -0,0 +1,135 @@ +title: django.shortcuts resolve_url Example Code +category: page +slug: django-shortcuts-resolve-url-examples +sortorder: 500011349 +toc: False +sidebartitle: django.shortcuts resolve_url +meta: Python example code for the resolve_url callable from the django.shortcuts module of the Django project. + + +resolve_url is a callable within the django.shortcuts module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / account / adapter.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/account/adapter.py) + +```python +# adapter.py +from __future__ import unicode_literals + +import hashlib +import json +import time +import warnings + +from django import forms +from django.conf import settings +from django.contrib import messages +from django.contrib.auth import ( + authenticate, + get_backends, + login as django_login, + logout as django_logout, +) +from django.contrib.auth.models import AbstractUser +from django.contrib.auth.password_validation import validate_password +from django.contrib.sites.shortcuts import get_current_site +from django.core.cache import cache +from django.core.mail import EmailMessage, EmailMultiAlternatives +from django.http import HttpResponse, HttpResponseRedirect +~~from django.shortcuts import resolve_url +from django.template import TemplateDoesNotExist +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +from ..utils import ( + build_absolute_uri, + email_address_exists, + generate_unique_username, + get_user_model, + import_attribute, +) +from . import app_settings + + +class DefaultAccountAdapter(object): + + error_messages = { + 'username_blacklisted': + _('Username can not be used. Please use other username.'), + 'username_taken': + AbstractUser._meta.get_field('username').error_messages['unique'], + + +## ... source file abbreviated to get to resolve_url examples ... + + + from_email, + [email]) + if 'html' in bodies: + msg.attach_alternative(bodies['html'], 'text/html') + else: + msg = EmailMessage(subject, + bodies['html'], + from_email, + [email]) + msg.content_subtype = 'html' # Main content is now text/html + return msg + + def send_mail(self, template_prefix, email, context): + msg = self.render_mail(template_prefix, email, context) + msg.send() + + def get_login_redirect_url(self, request): + assert request.user.is_authenticated + url = getattr(settings, "LOGIN_REDIRECT_URLNAME", None) + if url: + warnings.warn("LOGIN_REDIRECT_URLNAME is deprecated, simply" + " use LOGIN_REDIRECT_URL with a URL name", + DeprecationWarning) + else: + url = settings.LOGIN_REDIRECT_URL +~~ return resolve_url(url) + + def get_logout_redirect_url(self, request): +~~ return resolve_url(app_settings.LOGOUT_REDIRECT_URL) + + def get_email_confirmation_redirect_url(self, request): + if request.user.is_authenticated: + if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL: + return \ + app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL + else: + return self.get_login_redirect_url(request) + else: + return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL + + def is_open_for_signup(self, request): + return True + + def new_user(self, request): + user = get_user_model()() + return user + + def populate_username(self, request, user): + from .utils import user_username, user_email, user_field + first_name = user_field(user, 'first_name') + last_name = user_field(user, 'last_name') + email = user_email(user) + username = user_username(user) + + +## ... source file continues with no further resolve_url examples... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index a58c7399b..83b1b7f64 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -148,6 +148,17 @@

    django.http HttpResponsePermanentRedirect, HttpResponseRedirect

    +

    django.shortcuts + get_list_or_404, + get_object_or_404, + redirect, + render, + resolve_url +

    +

    django.template.response + SimpleTemplateResponse, + TemplateResponse +

    django.urls URLPattern, URLResolver, @@ -167,11 +178,6 @@

    django.urls.exceptions NoReverseMatch, Resolver404

    -

    django.utils.html format_html

    -

    django.template.response - SimpleTemplateResponse, - TemplateResponse -

    django.utils dateformat, dateparse, From 483f320769aed270c572cfe47630220e6bd30b72 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 08:59:04 -0400 Subject: [PATCH 087/207] updating descriptions --- .../flask-signals-got-request-exception.markdown | 6 +++++- .../examples/flask/flask-signals-namespace.markdown | 11 ++++++++++- .../flask/flask-templating-render-template.markdown | 11 ++++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 5cdf42512..64bfb260a 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -7,7 +7,11 @@ sidebartitle: flask.signals got_request_exception meta: Python example code that shows how to use the got_request_exception callable from the flask.signals module of the Flask project. -got_request_exception is a callable within the flask.signals module of the Flask project. +[got_request_exception](https://github.com/pallets/flask/blob/master/src/flask/signals.py) +is a signal defined in the [Flask](/flask.html) project's +`flask.signals` module that interrupts the WSGI flow when there is an +issue with the HTTP request. It can also be thrown by your own +view functions if there is an error and you want to raise it via a signal. ## Example 1 from flask-restx diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index 1e185442e..f2d968994 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -7,7 +7,16 @@ sidebartitle: flask.signals Namespace meta: Example code for understanding how to use the Namespace class from the flask.signals module of the Flask project. -Namespace is a class within the flask.signals module of the Flask project. +[Namespace](https://github.com/pallets/flask/blob/master/src/flask/signals.py) +is a class used within the `flask.signals` module, but it is +actually imported from the +[Blinker project](https://github.com/jek/blinker). Blinker +is a fast dispatching system for event subscriptions, also known as +"signals". [Flask](/flask.html) uses this library instead of +implementing its own event subscription signaling model. +[Namespace is defined within Blinker](https://github.com/jek/blinker/blob/master/blinker/base.py) +as a mapping of signal names to signals, and it serves the +same purpose in the Flask project. ## Example 1 from flask-login diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index bf2a668c6..cb0ef43aa 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -7,7 +7,16 @@ sidebartitle: flask.templating render_template meta: Python example code that shows how to use the render_template callable from the flask.templating module of the Flask project. -render_template is a callable within the flask.templating module of the Flask project. +[render_template](https://github.com/pallets/flask/blob/master/src/flask/templating.py) +is a [Flask](/flask.html) function from the `flask.templating` package. +`render_template` is used to generate output from a +[template file based on the Jinja2 engine](/template-engines.html) +that is found in the application's templates folder. + +Note that `render_template` is typically imported directly from the `flask` +package instead of from `flask.templating`. It is the same function that is +imported, but there are less characters to type when you leave off +the `.templating` part. ## Example 1 from Braintree Flask app From 93f09a59020ebcefea559296c0e34485a679e9f1 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 11:10:18 -0400 Subject: [PATCH 088/207] update flask examples descriptions --- ...ask-templating-render-template-string.markdown | 15 ++++++++++++++- .../flask-templating-render-template.markdown | 5 +++++ .../flask/flask-views-methodview.markdown | 7 ++++++- .../examples/flask/flask-views-view.markdown | 8 +++++++- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 6006f3831..4144332d8 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -7,7 +7,20 @@ sidebartitle: flask.templating render_template_string meta: Python example code that shows how to use the render_template_string callable from the flask.templating module of the Flask project. -render_template_string is a callable within the flask.templating module of the Flask project. +[render_template_string](https://github.com/pallets/flask/blob/master/src/flask/templating.py) +is a [Flask](/flask.html) function from the `flask.templating` package. +`render_template` is used to generate output from a string +that is passed in rather than from a file in the templates folder. + +Note that `render_template_string` is sometimes imported from the `flask` +package instead of from `flask.templating`. It is the same function that is +imported, but there are less characters to type when you leave off +the `.templating` part. +Understanding the following concepts are useful when coding projects that use `render_template_string`: + + +* [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) +* [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) ## Example 1 from Flask-User diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index cb0ef43aa..dd2c6261c 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -17,6 +17,11 @@ Note that `render_template` is typically imported directly from the `flask` package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. +Understanding the following concepts are useful when coding projects that use `render_template`: + + +* [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) +* [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) ## Example 1 from Braintree Flask app diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 7be8d78df..f6e60536c 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -7,7 +7,12 @@ sidebartitle: flask.views MethodView meta: Example code for understanding how to use the MethodView class from the flask.views module of the Flask project. -MethodView is a class within the flask.views module of the Flask project. +[MethodView](https://github.com/pallets/flask/blob/master/src/flask/views.py) +is a class within the `flask.views` module of the [Flask](/flask.html) +project. `MethodView` is a +[Python Metaclass](https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python) +that determines the methods, such as GET, POST, PUT, etc, that +a view defines. ## Example 1 from FlaskBB diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index d00a9cc54..8d60497ff 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -7,7 +7,13 @@ sidebartitle: flask.views View meta: Example code for understanding how to use the View class from the flask.views module of the Flask project. -View is a class within the flask.views module of the Flask project. +[View](https://github.com/pallets/flask/blob/master/src/flask/views.py) +is a class within the `flask.views` module of the [Flask](/flask.html) +project. `View` provides an alternative way to use view functions +by subclassing this class and implementing `dispatch_request` +for the routing system. This is typically only used in more advanced +situations such as extending the Flask source code, rather than +a standard way of interacting with the framework. ## Example 1 from FlaskBB From 37b15c48eb7034e5ee29cbc2dfece204970edc2d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 12:37:12 -0400 Subject: [PATCH 089/207] adding related links to appropriate code examples --- content/pages/examples/flask/flask-app-badrequest.markdown | 6 ++++++ content/pages/examples/flask/flask-app-flask.markdown | 6 ++++++ content/pages/examples/flask/flask-app-headers.markdown | 6 ++++++ .../pages/examples/flask/flask-app-immutabledict.markdown | 6 ++++++ .../flask/flask-templating-render-template-string.markdown | 4 +++- .../flask/flask-templating-render-template.markdown | 4 +++- .../examples/flask/flask-views-http-method-funcs.markdown | 6 ++++++ .../pages/examples/flask/flask-views-methodview.markdown | 6 ++++++ content/pages/examples/flask/flask-views-view.markdown | 6 ++++++ 9 files changed, 48 insertions(+), 2 deletions(-) diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index ab24d4b57..8eab8d041 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -16,6 +16,12 @@ at runtime when an that accepts POSTs. +These topics are also useful while reading the `BadRequest` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 85fc5a7d8..599b6e5d0 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -15,6 +15,12 @@ application's functionality, including URL rounting, [template configurations](/template-engines.html), and handling view functions. +These subjects go along with the `Flask` code examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from Braintree Flask app [Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) demonstrates how to incorporate this payment provider's diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index 18cc60a3b..ca2b56bbb 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -18,6 +18,12 @@ from [requests](/flask-globals-request-examples.html) and responses for Flask web applications. +These topics are also useful while reading the `Headers` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 5521638d2..bebe63460 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -16,6 +16,12 @@ The `ImmutableDict` class wraps a so that values cannot be modified after initially being set. +These subjects go along with the `ImmutableDict` code examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts + + ## Example 1 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 4144332d8..7a3d30660 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -16,11 +16,13 @@ Note that `render_template_string` is sometimes imported from the `flask` package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. -Understanding the following concepts are useful when coding projects that use `render_template_string`: +These topics are also useful while reading the `render_template_string` examples: + * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) +* [Cascading Style Sheets (CSS)](/cascading-style-sheets.html) and [web design](/web-design.html) ## Example 1 from Flask-User diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index dd2c6261c..113b4ddd4 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -17,11 +17,13 @@ Note that `render_template` is typically imported directly from the `flask` package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. -Understanding the following concepts are useful when coding projects that use `render_template`: +These topics are also useful while reading the `render_template` examples: + * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) +* [Cascading Style Sheets (CSS)](/cascading-style-sheets.html) and [web design](/web-design.html) ## Example 1 from Braintree Flask app diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index d53bed7cb..882f5e562 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -15,6 +15,12 @@ which is useful for checking if an HTTP method is valid by comparing it against the items in this set. +These topics are also useful while reading the `http_method_funcs` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) + + ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index f6e60536c..3bf523565 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -15,6 +15,12 @@ that determines the methods, such as GET, POST, PUT, etc, that a view defines. +These topics are also useful while reading the `MethodView` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) + + ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index 8d60497ff..d966b24b8 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -16,6 +16,12 @@ situations such as extending the Flask source code, rather than a standard way of interacting with the framework. +You should read up on these subjects along with these `View` examples: + +* [web development](/web-development.html) and [web design](/web-design.html) +* [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) + + ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based From 6a85e116867af3b4487d3f597fcf47bd8ddb0456 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 21:18:38 -0400 Subject: [PATCH 090/207] new django example code --- ...ib-staticfiles-finders-basefinder.markdown | 100 ++++++++ ...icfiles-finders-basestoragefinder.markdown | 72 ++++++ ...-contrib-staticfiles-finders-find.markdown | 107 ++++++++ ...b-staticfiles-finders-get-finders.markdown | 78 ++++++ ...jango-contrib-staticfiles-finders.markdown | 232 ++++++++++++++++++ ...files-handlers-staticfileshandler.markdown | 107 ++++++++ ...-storage-cachedstaticfilesstorage.markdown | 110 +++++++++ ...ticfiles-storage-hashedfilesmixin.markdown | 57 +++++ ...torage-manifeststaticfilesstorage.markdown | 102 ++++++++ ...files-storage-staticfiles-storage.markdown | 197 +++++++++++++++ ...cfiles-storage-staticfilesstorage.markdown | 118 +++++++++ ...jango-contrib-staticfiles-storage.markdown | 143 +++++++++++ ...taticfiles-utils-matches-patterns.markdown | 121 +++++++++ theme/templates/code-examples/django.html | 17 ++ 14 files changed, 1561 insertions(+) create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-finders.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-storage.markdown create mode 100644 content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown new file mode 100644 index 000000000..92766a9a8 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-basefinder.markdown @@ -0,0 +1,100 @@ +title: django.contrib.staticfiles.finders BaseFinder Example Code +category: page +slug: django-contrib-staticfiles-finders-basefinder-examples +sortorder: 500011067 +toc: False +sidebartitle: django.contrib.staticfiles.finders BaseFinder +meta: Python example code for the BaseFinder class from the django.contrib.staticfiles.finders module of the Django project. + + +BaseFinder is a class within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / finders.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./finders.py) + +```python +# finders.py +from itertools import chain + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.contrib.staticfiles.finders import BaseFinder, BaseStorageFinder, find, \ + AppDirectoriesFinder as DjangoAppDirectoriesFinder, FileSystemFinder as DjangoFileSystemFinder +from django.utils._os import safe_join +from os.path import normpath + +from pipeline.conf import settings + + +class PipelineFinder(BaseStorageFinder): + storage = staticfiles_storage + + def find(self, path, all=False): + if not settings.PIPELINE_ENABLED: + return super(PipelineFinder, self).find(path, all) + else: + return [] + + def list(self, ignore_patterns): + return [] + + +~~class ManifestFinder(BaseFinder): + def find(self, path, all=False): + matches = [] + for elem in chain(settings.STYLESHEETS.values(), settings.JAVASCRIPT.values()): + if normpath(elem['output_filename']) == normpath(path): + match = safe_join(settings.PIPELINE_ROOT, path) + if not all: + return match + matches.append(match) + return matches + + def list(self, *args): + return [] + + +~~class CachedFileFinder(BaseFinder): + def find(self, path, all=False): + try: + start, _, extn = path.rsplit('.', 2) + except ValueError: + return [] + path = '.'.join((start, extn)) + return find(path, all=all) or [] + + def list(self, *args): + return [] + + +class PatternFilterMixin(object): + ignore_patterns = [] + + def get_ignored_patterns(self): + return list(set(self.ignore_patterns)) + + def list(self, ignore_patterns): + if ignore_patterns: + ignore_patterns = ignore_patterns + self.get_ignored_patterns() + return super(PatternFilterMixin, self).list(ignore_patterns) + + + + +## ... source file continues with no further BaseFinder examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown new file mode 100644 index 000000000..799b108ed --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-basestoragefinder.markdown @@ -0,0 +1,72 @@ +title: django.contrib.staticfiles.finders BaseStorageFinder Example Code +category: page +slug: django-contrib-staticfiles-finders-basestoragefinder-examples +sortorder: 500011068 +toc: False +sidebartitle: django.contrib.staticfiles.finders BaseStorageFinder +meta: Python example code for the BaseStorageFinder class from the django.contrib.staticfiles.finders module of the Django project. + + +BaseStorageFinder is a class within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / finders.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./finders.py) + +```python +# finders.py +from itertools import chain + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.contrib.staticfiles.finders import BaseFinder, BaseStorageFinder, find, \ + AppDirectoriesFinder as DjangoAppDirectoriesFinder, FileSystemFinder as DjangoFileSystemFinder +from django.utils._os import safe_join +from os.path import normpath + +from pipeline.conf import settings + + +~~class PipelineFinder(BaseStorageFinder): + storage = staticfiles_storage + + def find(self, path, all=False): + if not settings.PIPELINE_ENABLED: + return super(PipelineFinder, self).find(path, all) + else: + return [] + + def list(self, ignore_patterns): + return [] + + +class ManifestFinder(BaseFinder): + def find(self, path, all=False): + matches = [] + for elem in chain(settings.STYLESHEETS.values(), settings.JAVASCRIPT.values()): + if normpath(elem['output_filename']) == normpath(path): + match = safe_join(settings.PIPELINE_ROOT, path) + if not all: + return match + matches.append(match) + return matches + + def list(self, *args): + + +## ... source file continues with no further BaseStorageFinder examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown new file mode 100644 index 000000000..c30f933a5 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-find.markdown @@ -0,0 +1,107 @@ +title: django.contrib.staticfiles.finders find Example Code +category: page +slug: django-contrib-staticfiles-finders-find-examples +sortorder: 500011069 +toc: False +sidebartitle: django.contrib.staticfiles.finders find +meta: Python example code for the find callable from the django.contrib.staticfiles.finders module of the Django project. + + +find is a callable within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / finders.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./finders.py) + +```python +# finders.py +from itertools import chain + +from django.contrib.staticfiles.storage import staticfiles_storage +~~from django.contrib.staticfiles.finders import BaseFinder, BaseStorageFinder, find, \ + AppDirectoriesFinder as DjangoAppDirectoriesFinder, FileSystemFinder as DjangoFileSystemFinder +from django.utils._os import safe_join +from os.path import normpath + +from pipeline.conf import settings + + +class PipelineFinder(BaseStorageFinder): + storage = staticfiles_storage + +~~ def find(self, path, all=False): + if not settings.PIPELINE_ENABLED: + return super(PipelineFinder, self).find(path, all) + else: + return [] + + def list(self, ignore_patterns): + return [] + + +class ManifestFinder(BaseFinder): +~~ def find(self, path, all=False): + matches = [] + for elem in chain(settings.STYLESHEETS.values(), settings.JAVASCRIPT.values()): + if normpath(elem['output_filename']) == normpath(path): + match = safe_join(settings.PIPELINE_ROOT, path) + if not all: + return match + matches.append(match) + return matches + + def list(self, *args): + return [] + + +class CachedFileFinder(BaseFinder): +~~ def find(self, path, all=False): + try: + start, _, extn = path.rsplit('.', 2) + except ValueError: + return [] + path = '.'.join((start, extn)) +~~ return find(path, all=all) or [] + + def list(self, *args): + return [] + + +class PatternFilterMixin(object): + ignore_patterns = [] + + def get_ignored_patterns(self): + return list(set(self.ignore_patterns)) + + def list(self, ignore_patterns): + if ignore_patterns: + ignore_patterns = ignore_patterns + self.get_ignored_patterns() + return super(PatternFilterMixin, self).list(ignore_patterns) + + +class AppDirectoriesFinder(PatternFilterMixin, DjangoAppDirectoriesFinder): + ignore_patterns = [ + '*.js', + '*.css', + '*.less', + '*.scss', + '*.styl', + + +## ... source file continues with no further find examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown new file mode 100644 index 000000000..fbc7b0457 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders-get-finders.markdown @@ -0,0 +1,78 @@ +title: django.contrib.staticfiles.finders get_finders Example Code +category: page +slug: django-contrib-staticfiles-finders-get-finders-examples +sortorder: 500011070 +toc: False +sidebartitle: django.contrib.staticfiles.finders get_finders +meta: Python example code for the get_finders callable from the django.contrib.staticfiles.finders module of the Django project. + + +get_finders is a callable within the django.contrib.staticfiles.finders module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / manifest.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./manifest.py) + +```python +# manifest.py +import os + +from django.conf.settings import settings as django_settings +~~from django.contrib.staticfiles.finders import get_finders +from django.contrib.staticfiles.storage import staticfiles_storage + +from pipeline.conf import settings + +from manifesto import Manifest + +from pipeline.packager import Packager + + +class PipelineManifest(Manifest): + def __init__(self): + self.packager = Packager() + self.packages = self.collect_packages() +~~ self.finders = get_finders() + self.package_files = [] + + def collect_packages(self): + packages = [] + for package_name in self.packager.packages['css']: + package = self.packager.package_for('css', package_name) + if package.manifest: + packages.append(package) + for package_name in self.packager.packages['js']: + package = self.packager.package_for('js', package_name) + if package.manifest: + packages.append(package) + return packages + + def cache(self): + + if settings.PIPELINE_ENABLED: + for package in self.packages: + path = package.output_filename + self.package_files.append(path) + yield staticfiles_storage.url(path) + else: + for package in self.packages: + for path in self.packager.compile(package.paths): + + +## ... source file continues with no further get_finders examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-finders.markdown b/content/pages/examples/django/django-contrib-staticfiles-finders.markdown new file mode 100644 index 000000000..f86f42dcd --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-finders.markdown @@ -0,0 +1,232 @@ +title: django.contrib.staticfiles finders Example Code +category: page +slug: django-contrib-staticfiles-finders-examples +sortorder: 500011065 +toc: False +sidebartitle: django.contrib.staticfiles finders +meta: Python example code for the finders callable from the django.contrib.staticfiles module of the Django project. + + +finders is a callable within the django.contrib.staticfiles module of the Django project. + + +## Example 1 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / staticfiles.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/staticfiles.py) + +```python +# staticfiles.py +from collections import OrderedDict +from os.path import join, normpath + +from django.conf import settings +~~from django.contrib.staticfiles import finders, storage +from django.core.files.storage import get_storage_class +from django.utils.functional import LazyObject +from django.utils.translation import gettext_lazy as _, ngettext as __ + +from debug_toolbar import panels +from debug_toolbar.utils import ThreadCollector + +try: + import threading +except ImportError: + threading = None + + +class StaticFile: + + def __init__(self, path): + self.path = path + + def __str__(self): + return self.path + + def real_path(self): +~~ return finders.find(self.path) + + def url(self): + return storage.staticfiles_storage.url(self.path) + + +class FileCollector(ThreadCollector): + def collect(self, path, thread=None): + if path.endswith("/"): + return + super().collect(StaticFile(path), thread) + + +collector = FileCollector() + + +class DebugConfiguredStorage(LazyObject): + + def _setup(self): + + configured_storage_cls = get_storage_class(settings.STATICFILES_STORAGE) + + class DebugStaticFilesStorage(configured_storage_cls): + def __init__(self, collector, *args, **kwargs): + super().__init__(*args, **kwargs) + + +## ... source file abbreviated to get to finders examples ... + + + return __("%(num_used)s file used", "%(num_used)s files used", num_used) % { + "num_used": num_used + } + + def process_request(self, request): + collector.clear_collection() + return super().process_request(request) + + def generate_stats(self, request, response): + used_paths = collector.get_collection() + self._paths[threading.currentThread()] = used_paths + + self.record_stats( + { + "num_found": self.num_found, + "num_used": self.num_used, + "staticfiles": used_paths, + "staticfiles_apps": self.get_staticfiles_apps(), + "staticfiles_dirs": self.get_staticfiles_dirs(), + "staticfiles_finders": self.get_staticfiles_finders(), + } + ) + + def get_staticfiles_finders(self): + finders_mapping = OrderedDict() +~~ for finder in finders.get_finders(): + for path, finder_storage in finder.list([]): + if getattr(finder_storage, "prefix", None): + prefixed_path = join(finder_storage.prefix, path) + else: + prefixed_path = path + finder_cls = finder.__class__ + finder_path = ".".join([finder_cls.__module__, finder_cls.__name__]) + real_path = finder_storage.path(path) + payload = (prefixed_path, real_path) + finders_mapping.setdefault(finder_path, []).append(payload) + self.num_found += 1 + return finders_mapping + + def get_staticfiles_dirs(self): + dirs = [] +~~ for finder in finders.get_finders(): +~~ if isinstance(finder, finders.FileSystemFinder): + dirs.extend(finder.locations) + return [(prefix, normpath(dir)) for prefix, dir in dirs] + + def get_staticfiles_apps(self): + apps = [] +~~ for finder in finders.get_finders(): +~~ if isinstance(finder, finders.AppDirectoriesFinder): + for app in finder.apps: + if app not in apps: + apps.append(app) + return apps + + + +## ... source file continues with no further finders examples... + +``` + + +## Example 2 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / collector.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./collector.py) + +```python +# collector.py +import os + +from collections import OrderedDict + +import django +~~from django.contrib.staticfiles import finders +from django.contrib.staticfiles.storage import staticfiles_storage + +from pipeline.finders import PipelineFinder + + +class Collector(object): + request = None + + def __init__(self, storage=None): + if storage is None: + storage = staticfiles_storage + self.storage = storage + + def _get_modified_time(self, storage, prefixed_path): + if django.VERSION[:2] >= (1, 10): + return storage.get_modified_time(prefixed_path) + return storage.modified_time(prefixed_path) + + def clear(self, path=""): + dirs, files = self.storage.listdir(path) + for f in files: + fpath = os.path.join(path, f) + self.storage.delete(fpath) + for d in dirs: + self.clear(os.path.join(path, d)) + + def collect(self, request=None, files=[]): + if self.request and self.request is request: + return + self.request = request + found_files = OrderedDict() +~~ for finder in finders.get_finders(): + if isinstance(finder, PipelineFinder): + continue + for path, storage in finder.list(['CVS', '.*', '*-']): + if getattr(storage, 'prefix', None): + prefixed_path = os.path.join(storage.prefix, path) + else: + prefixed_path = path + + if (prefixed_path not in found_files and + (not files or prefixed_path in files)): + found_files[prefixed_path] = (storage, path) + self.copy_file(path, prefixed_path, storage) + + if files and len(files) == len(found_files): + break + + return found_files.keys() + + def copy_file(self, path, prefixed_path, source_storage): + if not self.delete_file(path, prefixed_path, source_storage): + return + with source_storage.open(path) as source_file: + self.storage.save(prefixed_path, source_file) + + + +## ... source file continues with no further finders examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown b/content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown new file mode 100644 index 000000000..b9aaa6a9e --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-handlers-staticfileshandler.markdown @@ -0,0 +1,107 @@ +title: django.contrib.staticfiles.handlers StaticFilesHandler Example Code +category: page +slug: django-contrib-staticfiles-handlers-staticfileshandler-examples +sortorder: 500011071 +toc: False +sidebartitle: django.contrib.staticfiles.handlers StaticFilesHandler +meta: Python example code for the StaticFilesHandler class from the django.contrib.staticfiles.handlers module of the Django project. + + +StaticFilesHandler is a class within the django.contrib.staticfiles.handlers module of the Django project. + + +## Example 1 from django-webtest +[django-webtest](https://github.com/django-webtest/django-webtest) +([PyPI package information](https://pypi.org/project/django-webtest/)) +is a [Django](/django.html) extension that makes it easier to use +[WebTest](http://docs.pylonsproject.org/projects/webtest/) with +your projects. + +The project is open sourced under the +[MIT license](https://github.com/django-webtest/django-webtest/blob/master/LICENSE.txt). + +[**django-webtest / django_webtest / __init__.py**](https://github.com/django-webtest/django-webtest/blob/master/django_webtest/./__init__.py) + +```python +# __init__.py +import copy + +from django.conf import settings +from django.test.signals import template_rendered +from django.core.handlers.wsgi import WSGIHandler +from django.test import TestCase, TransactionTestCase +from django.test.client import store_rendered_templates + +from functools import partial + +try: + from importlib import import_module +except ImportError: + from django.utils.importlib import import_module + +from django.core import signals +try: + from django.db import close_old_connections +except ImportError: + from django.db import close_connection + close_old_connections = None +try: + from django.core.servers.basehttp import ( + AdminMediaHandler as StaticFilesHandler) +except ImportError: +~~ from django.contrib.staticfiles.handlers import StaticFilesHandler + +from webtest import TestApp +try: + from webtest.utils import NoDefault +except ImportError: + NoDefault = '' + +from django_webtest.response import DjangoWebtestResponse +from django_webtest.compat import to_string, to_wsgi_safe_string + + +_notgiven = object() + + +class DjangoTestApp(TestApp): + response_class = DjangoWebtestResponse + + def __init__(self, *args, **kwargs): + extra_environ = (kwargs.get('extra_environ') or {}).copy() + extra_environ.setdefault('HTTP_HOST', 'testserver') + kwargs['extra_environ'] = extra_environ + super(DjangoTestApp, self).__init__(self.get_wsgi_handler(), *args, **kwargs) + + def get_wsgi_handler(self): +~~ return StaticFilesHandler(WSGIHandler()) + + def set_user(self, user): + if user is None and 'WEBTEST_USER' in self.extra_environ: + del self.extra_environ['WEBTEST_USER'] + if user is not None: + self.extra_environ = self._update_environ(self.extra_environ, user) + + def _update_environ(self, environ, user=_notgiven): + environ = environ or {} + + if user is not _notgiven: + if user is None: + environ['WEBTEST_USER'] = '' + else: + username = _get_username(user) + environ['WEBTEST_USER'] = to_wsgi_safe_string(username) + + return environ + + def do_request(self, req, status, expect_errors): + if close_old_connections is not None: # Django 1.6+ + signals.request_started.disconnect(close_old_connections) + signals.request_finished.disconnect(close_old_connections) + else: # Django < 1.6 + + +## ... source file continues with no further StaticFilesHandler examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown new file mode 100644 index 000000000..62d79de7f --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-cachedstaticfilesstorage.markdown @@ -0,0 +1,110 @@ +title: django.contrib.staticfiles.storage CachedStaticFilesStorage Example Code +category: page +slug: django-contrib-staticfiles-storage-cachedstaticfilesstorage-examples +sortorder: 500011072 +toc: False +sidebartitle: django.contrib.staticfiles.storage CachedStaticFilesStorage +meta: Python example code for the CachedStaticFilesStorage class from the django.contrib.staticfiles.storage module of the Django project. + + +CachedStaticFilesStorage is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +~~from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + + +## ... source file abbreviated to get to CachedStaticFilesStorage examples ... + + + for path in paths: + if path: + if not matches_patterns(path, self.gzip_patterns): + continue + original_file = self.open(path) + gzipped_path = f"{path}.gz" + if self.exists(gzipped_path): + self.delete(gzipped_path) + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +~~class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +class NonPackagingPipelineCachedStorage(NonPackagingMixin, PipelineCachedStorage): + pass + + +class PipelineManifestStorage(PipelineMixin, ManifestStaticFilesStorage): + pass + + +class NonPackagingPipelineManifestStorage(NonPackagingMixin, ManifestStaticFilesStorage): + pass + + + +## ... source file continues with no further CachedStaticFilesStorage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown new file mode 100644 index 000000000..ca526d574 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-hashedfilesmixin.markdown @@ -0,0 +1,57 @@ +title: django.contrib.staticfiles.storage HashedFilesMixin Example Code +category: page +slug: django-contrib-staticfiles-storage-hashedfilesmixin-examples +sortorder: 500011073 +toc: False +sidebartitle: django.contrib.staticfiles.storage HashedFilesMixin +meta: Python example code for the HashedFilesMixin class from the django.contrib.staticfiles.storage module of the Django project. + + +HashedFilesMixin is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / staticfiles.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/staticfiles.py) + +```python +# staticfiles.py +import hashlib + +from django.conf import settings +~~from django.contrib.staticfiles.storage import HashedFilesMixin +from django.core.files.storage import get_storage_class +from django.templatetags.static import static + +from wagtail import __version__ + + +try: + use_version_strings = settings.WAGTAILADMIN_STATIC_FILE_VERSION_STRINGS +except AttributeError: + + if settings.DEBUG: + use_version_strings = True + else: + storage = get_storage_class(settings.STATICFILES_STORAGE) + use_version_strings = not issubclass(storage, HashedFilesMixin) + + +if use_version_strings: + VERSION_HASH = hashlib.sha1( + (__version__ + settings.SECRET_KEY).encode('utf-8') + ).hexdigest()[:8] +else: + VERSION_HASH = None + + + +## ... source file continues with no further HashedFilesMixin examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown new file mode 100644 index 000000000..d920d3c9f --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-manifeststaticfilesstorage.markdown @@ -0,0 +1,102 @@ +title: django.contrib.staticfiles.storage ManifestStaticFilesStorage Example Code +category: page +slug: django-contrib-staticfiles-storage-manifeststaticfilesstorage-examples +sortorder: 500011074 +toc: False +sidebartitle: django.contrib.staticfiles.storage ManifestStaticFilesStorage +meta: Python example code for the ManifestStaticFilesStorage class from the django.contrib.staticfiles.storage module of the Django project. + + +ManifestStaticFilesStorage is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +~~from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + + +## ... source file abbreviated to get to ManifestStaticFilesStorage examples ... + + + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +class NonPackagingPipelineCachedStorage(NonPackagingMixin, PipelineCachedStorage): + pass + + +~~class PipelineManifestStorage(PipelineMixin, ManifestStaticFilesStorage): + pass + + +~~class NonPackagingPipelineManifestStorage(NonPackagingMixin, ManifestStaticFilesStorage): + pass + + + +## ... source file continues with no further ManifestStaticFilesStorage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown new file mode 100644 index 000000000..ae20ee1a5 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfiles-storage.markdown @@ -0,0 +1,197 @@ +title: django.contrib.staticfiles.storage staticfiles_storage Example Code +category: page +slug: django-contrib-staticfiles-storage-staticfiles-storage-examples +sortorder: 500011076 +toc: False +sidebartitle: django.contrib.staticfiles.storage staticfiles_storage +meta: Python example code for the staticfiles_storage callable from the django.contrib.staticfiles.storage module of the Django project. + + +staticfiles_storage is a callable within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / fields.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/fields.py) + +```python +# fields.py +import re +import mimetypes + +from django.conf import settings +~~from django.contrib.staticfiles.storage import staticfiles_storage +from django.core import signing +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.files.storage import default_storage +from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile +from django.urls import reverse_lazy +from django.forms import fields, models as model_fields, widgets +from django.utils.html import format_html +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe +from django.utils.translation import ugettext_lazy as _, ungettext_lazy + +from djng import app_settings +from .widgets import DropFileWidget, DropImageWidget + + +class DefaultFieldMixin(object): + render_label = True + + def has_subwidgets(self): + return False + + def get_potential_errors(self): + return self.get_input_required_errors() + + + +## ... source file abbreviated to get to staticfiles_storage examples ... + + + +class FileField(FileFieldMixin, fields.FileField): + storage = app_settings.upload_storage + signer = signing.Signer() + + def __init__(self, *args, **kwargs): + accept = kwargs.pop('accept', '*/*') + fileupload_url = kwargs.pop('fileupload_url', reverse_lazy('fileupload')) + area_label = kwargs.pop('area_label', _("Drop file here or click to upload")) + attrs = { + 'accept': accept, + 'ngf-pattern': accept, + } + kwargs.update(widget=DropFileWidget(area_label, fileupload_url, attrs=attrs)) + super(FileField, self).__init__(*args, **kwargs) + + @classmethod + def preview(cls, file_obj): + available_name = cls.storage.get_available_name(file_obj.name) + temp_name = cls.storage.save(available_name, file_obj) + extension = mimetypes.guess_extension(file_obj.content_type) + if extension: + extension = extension[1:] + else: + extension = '_blank' +~~ icon_url = staticfiles_storage.url('djng/icons/{}.png'.format(extension)) + return { + 'url': 'url({})'.format(icon_url), + 'temp_name': cls.signer.sign(temp_name), + 'file_name': file_obj.name, + 'file_size': file_obj.size, + 'charset': file_obj.charset, + 'content_type': file_obj.content_type, + 'content_type_extra': file_obj.content_type_extra, + } + + +class ImageField(FileFieldMixin, fields.ImageField): + storage = app_settings.upload_storage + signer = signing.Signer() + + def __init__(self, *args, **kwargs): + if 'easy_thumbnails' not in settings.INSTALLED_APPS: + raise ImproperlyConfigured("'djng.forms.fields.ImageField' requires 'easy-thubnails' to be installed") + accept = kwargs.pop('accept', 'image/*') + fileupload_url = kwargs.pop('fileupload_url', reverse_lazy('fileupload')) + area_label = kwargs.pop('area_label', _("Drop image here or click to upload")) + attrs = { + 'accept': accept, + 'ngf-pattern': accept, + + +## ... source file continues with no further staticfiles_storage examples... + +``` + + +## Example 2 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / manifest.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./manifest.py) + +```python +# manifest.py +import os + +from django.conf.settings import settings as django_settings +from django.contrib.staticfiles.finders import get_finders +~~from django.contrib.staticfiles.storage import staticfiles_storage + +from pipeline.conf import settings + +from manifesto import Manifest + +from pipeline.packager import Packager + + +class PipelineManifest(Manifest): + def __init__(self): + self.packager = Packager() + self.packages = self.collect_packages() + self.finders = get_finders() + self.package_files = [] + + def collect_packages(self): + packages = [] + for package_name in self.packager.packages['css']: + package = self.packager.package_for('css', package_name) + if package.manifest: + packages.append(package) + for package_name in self.packager.packages['js']: + package = self.packager.package_for('js', package_name) + if package.manifest: + packages.append(package) + return packages + + def cache(self): + + if settings.PIPELINE_ENABLED: + for package in self.packages: + path = package.output_filename + self.package_files.append(path) +~~ yield staticfiles_storage.url(path) + else: + for package in self.packages: + for path in self.packager.compile(package.paths): + self.package_files.append(path) +~~ yield staticfiles_storage.url(path) + + ignore_patterns = getattr(django_settings, "STATICFILES_IGNORE_PATTERNS", None) + for finder in self.finders: + for path, storage in finder.list(ignore_patterns): + if getattr(storage, 'prefix', None): + prefixed_path = os.path.join(storage.prefix, path) + else: + prefixed_path = path + + if prefixed_path not in self.package_files: + + self.package_files.append(prefixed_path) +~~ yield staticfiles_storage.url(prefixed_path) + + + +## ... source file continues with no further staticfiles_storage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown new file mode 100644 index 000000000..0562d9564 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage-staticfilesstorage.markdown @@ -0,0 +1,118 @@ +title: django.contrib.staticfiles.storage StaticFilesStorage Example Code +category: page +slug: django-contrib-staticfiles-storage-staticfilesstorage-examples +sortorder: 500011075 +toc: False +sidebartitle: django.contrib.staticfiles.storage StaticFilesStorage +meta: Python example code for the StaticFilesStorage class from the django.contrib.staticfiles.storage module of the Django project. + + +StaticFilesStorage is a class within the django.contrib.staticfiles.storage module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +~~from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + + +## ... source file abbreviated to get to StaticFilesStorage examples ... + + + for name, hashed_name, processed in super_class.post_process(paths.copy(), dry_run, **options): + if hashed_name != name: + paths[hashed_name] = (self, hashed_name) + yield name, hashed_name, processed + + if dry_run: + return + + for path in paths: + if path: + if not matches_patterns(path, self.gzip_patterns): + continue + original_file = self.open(path) + gzipped_path = f"{path}.gz" + if self.exists(gzipped_path): + self.delete(gzipped_path) + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +~~class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +class NonPackagingPipelineCachedStorage(NonPackagingMixin, PipelineCachedStorage): + pass + + +class PipelineManifestStorage(PipelineMixin, ManifestStaticFilesStorage): + pass + + +class NonPackagingPipelineManifestStorage(NonPackagingMixin, ManifestStaticFilesStorage): + pass + + + +## ... source file continues with no further StaticFilesStorage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-storage.markdown b/content/pages/examples/django/django-contrib-staticfiles-storage.markdown new file mode 100644 index 000000000..9ea16df48 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-storage.markdown @@ -0,0 +1,143 @@ +title: django.contrib.staticfiles storage Example Code +category: page +slug: django-contrib-staticfiles-storage-examples +sortorder: 500011066 +toc: False +sidebartitle: django.contrib.staticfiles storage +meta: Python example code for the storage callable from the django.contrib.staticfiles module of the Django project. + + +storage is a callable within the django.contrib.staticfiles module of the Django project. + + +## Example 1 from django-debug-toolbar +[django-debug-toolbar](https://github.com/jazzband/django-debug-toolbar) +([project documentation](https://github.com/jazzband/django-debug-toolbar) +and [PyPI page](https://pypi.org/project/django-debug-toolbar/)) +grants a developer detailed request-response cycle information while +developing a [Django](/django.html) web application. +The code for django-debug-toolbar is +[open source](https://github.com/jazzband/django-debug-toolbar/blob/master/LICENSE) +and maintained by the developer community group known as +[Jazzband](https://jazzband.co/). + +[**django-debug-toolbar / debug_toolbar / panels / staticfiles.py**](https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/panels/staticfiles.py) + +```python +# staticfiles.py +from collections import OrderedDict +from os.path import join, normpath + +from django.conf import settings +~~from django.contrib.staticfiles import finders, storage +from django.core.files.storage import get_storage_class +from django.utils.functional import LazyObject +from django.utils.translation import gettext_lazy as _, ngettext as __ + +from debug_toolbar import panels +from debug_toolbar.utils import ThreadCollector + +try: + import threading +except ImportError: + threading = None + + +class StaticFile: + + def __init__(self, path): + self.path = path + + def __str__(self): + return self.path + + def real_path(self): + return finders.find(self.path) + + def url(self): +~~ return storage.staticfiles_storage.url(self.path) + + +class FileCollector(ThreadCollector): + def collect(self, path, thread=None): + if path.endswith("/"): + return + super().collect(StaticFile(path), thread) + + +collector = FileCollector() + + +class DebugConfiguredStorage(LazyObject): + + def _setup(self): + + configured_storage_cls = get_storage_class(settings.STATICFILES_STORAGE) + + class DebugStaticFilesStorage(configured_storage_cls): + def __init__(self, collector, *args, **kwargs): + super().__init__(*args, **kwargs) + self.collector = collector + + def url(self, path): + self.collector.collect(path) + return super().url(path) + + self._wrapped = DebugStaticFilesStorage(collector) + + +~~_original_storage = storage.staticfiles_storage + + +class StaticFilesPanel(panels.Panel): + + name = "Static files" + template = "debug_toolbar/panels/staticfiles.html" + + @property + def title(self): + return _("Static files (%(num_found)s found, %(num_used)s used)") % { + "num_found": self.num_found, + "num_used": self.num_used, + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.num_found = 0 + self._paths = {} + + def enable_instrumentation(self): +~~ storage.staticfiles_storage = DebugConfiguredStorage() + + def disable_instrumentation(self): +~~ storage.staticfiles_storage = _original_storage + + @property + def num_used(self): + return len(self._paths[threading.currentThread()]) + + nav_title = _("Static files") + + @property + def nav_subtitle(self): + num_used = self.num_used + return __("%(num_used)s file used", "%(num_used)s files used", num_used) % { + "num_used": num_used + } + + def process_request(self, request): + collector.clear_collection() + return super().process_request(request) + + def generate_stats(self, request, response): + used_paths = collector.get_collection() + self._paths[threading.currentThread()] = used_paths + + self.record_stats( + { + + +## ... source file continues with no further storage examples... + +``` + diff --git a/content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown b/content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown new file mode 100644 index 000000000..47c78f231 --- /dev/null +++ b/content/pages/examples/django/django-contrib-staticfiles-utils-matches-patterns.markdown @@ -0,0 +1,121 @@ +title: django.contrib.staticfiles.utils matches_patterns Example Code +category: page +slug: django-contrib-staticfiles-utils-matches-patterns-examples +sortorder: 500011077 +toc: False +sidebartitle: django.contrib.staticfiles.utils matches_patterns +meta: Python example code for the matches_patterns callable from the django.contrib.staticfiles.utils module of the Django project. + + +matches_patterns is a callable within the django.contrib.staticfiles.utils module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / storage.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./storage.py) + +```python +# storage.py +import gzip + +from io import BytesIO + +from django.contrib.staticfiles.storage import CachedStaticFilesStorage, ManifestStaticFilesStorage, StaticFilesStorage +~~from django.contrib.staticfiles.utils import matches_patterns + +from django.core.files.base import File + + +class PipelineMixin(object): + packing = True + + def post_process(self, paths, dry_run=False, **options): + if dry_run: + return + + from pipeline.packager import Packager + packager = Packager(storage=self) + for package_name in packager.packages['css']: + package = packager.package_for('css', package_name) + output_file = package.output_filename + if self.packing: + packager.pack_stylesheets(package) + paths[output_file] = (self, output_file) + yield output_file, output_file, True + for package_name in packager.packages['js']: + package = packager.package_for('js', package_name) + output_file = package.output_filename + if self.packing: + + +## ... source file abbreviated to get to matches_patterns examples ... + + + +class GZIPMixin(object): + gzip_patterns = ("*.css", "*.js") + + def _compress(self, original_file): + content = BytesIO() + gzip_file = gzip.GzipFile(mode='wb', fileobj=content) + gzip_file.write(original_file.read()) + gzip_file.close() + content.seek(0) + return File(content) + + def post_process(self, paths, dry_run=False, **options): + super_class = super(GZIPMixin, self) + if hasattr(super_class, 'post_process'): + for name, hashed_name, processed in super_class.post_process(paths.copy(), dry_run, **options): + if hashed_name != name: + paths[hashed_name] = (self, hashed_name) + yield name, hashed_name, processed + + if dry_run: + return + + for path in paths: + if path: +~~ if not matches_patterns(path, self.gzip_patterns): + continue + original_file = self.open(path) + gzipped_path = f"{path}.gz" + if self.exists(gzipped_path): + self.delete(gzipped_path) + gzipped_file = self._compress(original_file) + gzipped_path = self.save(gzipped_path, gzipped_file) + yield gzipped_path, gzipped_path, True + + +class NonPackagingMixin(object): + packing = False + + +class PipelineStorage(PipelineMixin, StaticFilesStorage): + pass + + +class NonPackagingPipelineStorage(NonPackagingMixin, PipelineStorage): + pass + + +class PipelineCachedStorage(PipelineMixin, CachedStaticFilesStorage): + pass + + +## ... source file continues with no further matches_patterns examples... + +``` + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 83b1b7f64..917bf49e9 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -32,6 +32,23 @@

    django.contrib.auth decorators login_required, hashers make_password

    +

    django.contrib.staticfiles + finders, + .finders BaseFinder, + .finders BaseStorageFinder, + .finders find, + .finders get_finders + .handlers StaticFilesHandler + storage + .storage CachedStaticFilesStorage, + .storage HashedFilesMixin, + .storage ManifestStaticFilesStorage, + .storage StaticFilesStorage, + .storage staticfiles_storage + .utils matches_patterns +

    +

    django.contrib.staticfiles.utils +

    django.core cache, checks, From bbbdbaf1d4577bba29f76f8fa48ddb91d71cb45a Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 10 Jul 2020 21:25:50 -0400 Subject: [PATCH 091/207] fix typo in toc --- theme/templates/code-examples/django.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 917bf49e9..795915387 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -47,8 +47,6 @@

    django.contrib.staticfiles .storage staticfiles_storage .utils matches_patterns

    -

    django.contrib.staticfiles.utils -

    django.core cache, checks, From 3c03d83d818516e3e4eacdb1d54d7c71e1bc7a53 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 11 Jul 2020 06:56:57 -0400 Subject: [PATCH 092/207] add new django extension --- .../django/django-extensions-plug-ins.markdown | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index 709511183..da2f727e7 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -470,6 +470,17 @@ The project is open sourced under the [Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). +### django-rq +[django-rq](https://github.com/rq/django-rq) +([PyPI package information](https://pypi.org/project/django-rq/)) +is an [RQ](/redis-queue-rq.html)-based [task queue](/task-queues.html) +that integrates with [Django](/django.html) as an app. This project +is useful when you need a lightweight task queue and do not want +to go through configuring [Celery](/celery.html) in your project. +django-rq is open sourced under the +[MIT license](https://github.com/rq/django-rq/blob/master/LICENSE.txt). + + ### django-simple-task [django-simple-task](https://github.com/ericls/django-simple-task) ([project documentation](https://django-simple-task.readthedocs.io/) From 270ea642324a51dc7de7d2525c1c041010b54878 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 11 Jul 2020 14:41:03 -0400 Subject: [PATCH 093/207] adding example code to django page --- content/pages/03-data/06-sqlalchemy.markdown | 2 +- .../04-web-development/02-django.markdown | 76 +- .../04-web-development/03-flask.markdown | 2 +- ...ore-exceptions-disallowedredirect.markdown | 64 + ...core-exceptions-fielddoesnotexist.markdown | 972 ++++++++ ...django-core-exceptions-fielderror.markdown | 371 +++ ...e-exceptions-improperlyconfigured.markdown | 2 +- ...core-exceptions-middlewarenotused.markdown | 122 + ...-core-exceptions-non-field-errors.markdown | 158 ++ ...ore-exceptions-objectdoesnotexist.markdown | 969 ++++++++ ...-core-exceptions-permissiondenied.markdown | 1120 +++++++++ ...xceptions-suspiciousfileoperation.markdown | 73 + ...xceptions-suspiciousmultipartform.markdown | 56 + ...o-core-exceptions-validationerror.markdown | 2128 +++++++++++++++++ ...-core-exceptions-improperlyconfigured.html | 8 + theme/templates/code-examples/django.html | 31 +- theme/templates/page.html | 3 + 17 files changed, 6095 insertions(+), 62 deletions(-) create mode 100644 content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-fielderror.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-non-field-errors.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-permissiondenied.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown create mode 100644 content/pages/examples/django/django-core-exceptions-validationerror.markdown create mode 100644 redirects/django-core-exceptions-improperlyconfigured.html diff --git a/content/pages/03-data/06-sqlalchemy.markdown b/content/pages/03-data/06-sqlalchemy.markdown index 32e914cb7..f4c9abf9d 100644 --- a/content/pages/03-data/06-sqlalchemy.markdown +++ b/content/pages/03-data/06-sqlalchemy.markdown @@ -222,7 +222,7 @@ implementations. based on various developers' experiences. -### Open source code for using SQLAlchemy +## Open source code for learning SQLAlchemy Many open source projects rely on SQLAlchemy. A great way to learn how to properly work with this tool is to read the code that shows how those projects use SQLAlchemy. This section alphabetically lists diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 253e9efd9..06ee0deee 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -21,7 +21,7 @@ For example, [template engine](/django-templates.html), an [object-relational mapper](/object-relational-mappers-orms.html) (ORM), and [database schema migrations](https://docs.djangoproject.com/en/dev/topics/migrations/) -(as of version 1.7) are all included with the [Django framework](https://pypi.org/project/Django/). +are all included with the [Django framework](https://pypi.org/project/Django/). Compare that included functionality to the Flask framework which requires a separate library such as [Flask-Login](https://flask-login.readthedocs.org/en/latest/) @@ -315,33 +315,6 @@ to handle these files properly. shows how to configure Django to load and serve up static and media files, public and private, via an Amazon S3 bucket. -## Open source Django example projects -* [Browser calls with Django and Twilio](https://www.twilio.com/docs/howto/walkthrough/browser-calls/python/django) - shows how to build a web app with Django and - [Twilio Client](https://www.twilio.com/client) to turn a user's web - browser into a full-fledged phone. Pretty awesome! - -* [Txt 2 React](https://github.com/mattmakai/txt2react) is a full Django web - app that allows audiences to text in during a presentation with feedback - or questions. - -* [Openduty](https://github.com/ustream/openduty) is a website status checking - and alert system similar to PagerDuty. - -* [Courtside](https://github.com/myusuf3/courtside) is a pick up sports web - application written and maintained by the author of PyCoder's Weekly. - -* These two Django Interactive Voice Response (IVR) system web application - repositories [part 1](https://github.com/phalt/twilio-django-part-1) and - [part 2](https://github.com/phalt/twilio-django-part-2) show you how to - build a really cool Django application. There's also an accompanying - [blog post](https://www.twilio.com/blog/2014/07/build-an-ivr-system-with-twilio-and-django.html) - with detailed explanations of each step. - -* [Taiga](https://github.com/taigaio/taiga-back) is a project management - tool built with Django as the backend and AngularJS as the front end. - - ## Django project templates Project templates, not to be confused with a [template engine](/template-engines.html), generate boilerplate code for @@ -349,7 +322,7 @@ a base Django project plus optional libraries that are often used when developing web applications. * [Caktus Group's Django project template](https://github.com/caktus/django-project-template) - is Django 1.6+ ready. + is Django 2.2+ ready. * [Cookiecutter Django](https://github.com/pydanny/cookiecutter-django) is a project template from Daniel Greenfeld, for use with Audrey Roy's @@ -364,25 +337,36 @@ developing web applications. template from Mozilla that is compatible with cookiecutter. -## Django learning checklist -1. [Install Django](https://docs.djangoproject.com/en/dev/topics/install/) on - your local development machine. +## Open source Django example projects +Reading open source code can be useful when you are trying to figure +out how to build your own projects. This is a short list of some +real-world example applications, and many more can be found on the +[Django example projects and code](/django-code-examples.html) page. -1. Work through the initial - ["polls" tutorial](https://docs.djangoproject.com/en/dev/intro/tutorial01/). - -1. Build a few more simple applications using the tutorial resources found - in the "Django resources" section. +* [Browser calls with Django and Twilio](https://www.twilio.com/docs/howto/walkthrough/browser-calls/python/django) + shows how to build a web app with Django and + [Twilio Client](https://www.twilio.com/client) to turn a user's web + browser into a full-fledged phone. Pretty awesome! -1. Start coding your own Django project with help from the - [official documentation](https://docs.djangoproject.com/en/dev/) and - resource links below. You'll make plenty of mistakes which is critical - on your path to learning the right way to build applications. +* [Openduty](https://github.com/ustream/openduty) is a website status checking + and alert system similar to PagerDuty. -1. Read [2 Scoops of Django](http://www.amazon.com/Two-Scoops-Django-Best-Practices/dp/0981467342) - to understand Django good practices and learn better ways of building - Django web applications. +* [Courtside](https://github.com/myusuf3/courtside) is a pick up sports web + application written and maintained by the author of PyCoder's Weekly. + +* These two Django Interactive Voice Response (IVR) system web application + repositories [part 1](https://github.com/phalt/twilio-django-part-1) and + [part 2](https://github.com/phalt/twilio-django-part-2) show you how to + build a really cool Django application. There's also an accompanying + [blog post](https://www.twilio.com/blog/2014/07/build-an-ivr-system-with-twilio-and-django.html) + with detailed explanations of each step. + +* [Taiga](https://github.com/taigaio/taiga-back) is a project management + tool built with Django as the backend and AngularJS as the front end. -1. Move on to the [deployment section](/deployment.html) to get your Django - project on the web. +## Open source code to learn Django +There are many open source projects that rely on Django. +One of the best ways to learn how to use this framework is to read +how other projects use it in real-world code. This section lists +these code examples by class and method in Django's code base. diff --git a/content/pages/04-web-development/03-flask.markdown b/content/pages/04-web-development/03-flask.markdown index ddcc54b97..18c708e54 100644 --- a/content/pages/04-web-development/03-flask.markdown +++ b/content/pages/04-web-development/03-flask.markdown @@ -337,7 +337,7 @@ ways to structure your code. in the JavaScript world. -### Open source code for using Flask +## Open source code for learning Flask There are many open source projects that rely on Flask to operate. One of the best ways to learn how to use this framework is to read how other projects use it in real-world code. This section lists diff --git a/content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown b/content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown new file mode 100644 index 000000000..6ad7cc979 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-disallowedredirect.markdown @@ -0,0 +1,64 @@ +title: django.core.exceptions DisallowedRedirect Example Code +category: page +slug: django-core-exceptions-disallowedredirect-examples +sortorder: 500011098 +toc: False +sidebartitle: django.core.exceptions DisallowedRedirect +meta: Python example code for the DisallowedRedirect class from the django.core.exceptions module of the Django project. + + +DisallowedRedirect is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / http.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./http.py) + +```python +# http.py +from urllib.parse import urlparse + +~~from django.core.exceptions import DisallowedRedirect +from django.http import HttpResponse +from django.utils.encoding import iri_to_uri + + +class OAuth2ResponseRedirect(HttpResponse): + status_code = 302 + + def __init__(self, redirect_to, allowed_schemes, *args, **kwargs): + super().__init__(*args, **kwargs) + self["Location"] = iri_to_uri(redirect_to) + self.allowed_schemes = allowed_schemes + self.validate_redirect(redirect_to) + + @property + def url(self): + return self["Location"] + + def validate_redirect(self, redirect_to): + parsed = urlparse(str(redirect_to)) + if not parsed.scheme: +~~ raise DisallowedRedirect("OAuth2 redirects require a URI scheme.") + if parsed.scheme not in self.allowed_schemes: +~~ raise DisallowedRedirect( + "Redirect to scheme {!r} is not permitted".format(parsed.scheme) + ) + + + +## ... source file continues with no further DisallowedRedirect examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown b/content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown new file mode 100644 index 000000000..fda98d83f --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-fielddoesnotexist.markdown @@ -0,0 +1,972 @@ +title: django.core.exceptions FieldDoesNotExist Example Code +category: page +slug: django-core-exceptions-fielddoesnotexist-examples +sortorder: 500011099 +toc: False +sidebartitle: django.core.exceptions FieldDoesNotExist +meta: Python example code for the FieldDoesNotExist class from the django.core.exceptions module of the Django project. + + +FieldDoesNotExist is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / models.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/models.py) + +```python +# models.py +from __future__ import unicode_literals + +import json +import ast + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import FieldDoesNotExist +from django.db import models, DEFAULT_DB_ALIAS +from django.db.models import QuerySet, Q +from django.utils import formats, timezone +from django.utils.encoding import python_2_unicode_compatible, smart_text +from django.utils.six import iteritems, integer_types +from django.utils.translation import ugettext_lazy as _ + +from jsonfield.fields import JSONField +from dateutil import parser +from dateutil.tz import gettz + + +class LogEntryManager(models.Manager): + + def log_create(self, instance, **kwargs): + changes = kwargs.get('changes', None) + pk = self._get_pk_value(instance) + + if changes is not None: + kwargs.setdefault('content_type', ContentType.objects.get_for_model(instance)) + kwargs.setdefault('object_pk', pk) + kwargs.setdefault('object_repr', smart_text(instance)) + + if isinstance(pk, integer_types): + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + @property + def changes_str(self, colon=': ', arrow=smart_text(' \u2192 '), separator='; '): + substrings = [] + + for field, values in iteritems(self.changes_dict): + substring = smart_text('{field_name:s}{colon:s}{old:s}{arrow:s}{new:s}').format( + field_name=field, + colon=colon, + old=values[0], + arrow=arrow, + new=values[1], + ) + substrings.append(substring) + + return separator.join(substrings) + + @property + def changes_display_dict(self): + from auditlog.registry import auditlog + model = self.content_type.model_class() + model_fields = auditlog.get_model_fields(model._meta.model) + changes_display_dict = {} + for field_name, values in iteritems(self.changes_dict): + try: + field = model._meta.get_field(field_name) +~~ except FieldDoesNotExist: + changes_display_dict[field_name] = values + continue + values_display = [] + choices_dict = None + if hasattr(field, 'choices') and len(field.choices) > 0: + choices_dict = dict(field.choices) + if hasattr(field, 'base_field') and getattr(field.base_field, 'choices', False): + choices_dict = dict(field.base_field.choices) + + if choices_dict: + for value in values: + try: + value = ast.literal_eval(value) + if type(value) is [].__class__: + values_display.append(', '.join([choices_dict.get(val, 'None') for val in value])) + else: + values_display.append(choices_dict.get(value, 'None')) + except ValueError: + values_display.append(choices_dict.get(value, 'None')) + except: + values_display.append(choices_dict.get(value, 'None')) + else: + try: + field_type = field.get_internal_type() + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 2 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / utils.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/./utils.py) + +```python +# utils.py +import base64 +import importlib +import json +import random +import re +import string +import unicodedata +from collections import OrderedDict +from urllib.parse import urlsplit + +import django +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +~~from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.serializers.json import DjangoJSONEncoder +from django.core.validators import ValidationError, validate_email +from django.db.models import FileField +from django.db.models.fields import ( + BinaryField, + DateField, + DateTimeField, + EmailField, + TimeField, +) +from django.utils import dateparse +from django.utils.encoding import force_bytes, force_str + + +MAX_USERNAME_SUFFIX_LENGTH = 7 +USERNAME_SUFFIX_CHARS = ( + [string.digits] * 4 + + [string.ascii_letters] * (MAX_USERNAME_SUFFIX_LENGTH - 4)) + + +def _generate_unique_username_base(txts, regex=None): + from .account.adapter import get_adapter + adapter = get_adapter() + username = None + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + else: + ret = path_or_callable + return ret + + +SERIALIZED_DB_FIELD_PREFIX = '_db_' + + +def serialize_instance(instance): + data = {} + for k, v in instance.__dict__.items(): + if k.startswith('_') or callable(v): + continue + try: + field = instance._meta.get_field(k) + if isinstance(field, BinaryField): + v = force_str(base64.b64encode(v)) + elif isinstance(field, FileField): + if v and not isinstance(v, str): + v = v.name + try: + json.dumps(v, cls=DjangoJSONEncoder) + except TypeError: + v = field.get_prep_value(v) + k = SERIALIZED_DB_FIELD_PREFIX + k +~~ except FieldDoesNotExist: + pass + data[k] = v + return json.loads(json.dumps(data, cls=DjangoJSONEncoder)) + + +def deserialize_instance(model, data): + ret = model() + for k, v in data.items(): + is_db_value = False + if k.startswith(SERIALIZED_DB_FIELD_PREFIX): + k = k[len(SERIALIZED_DB_FIELD_PREFIX):] + is_db_value = True + if v is not None: + try: + f = model._meta.get_field(k) + if isinstance(f, DateTimeField): + v = dateparse.parse_datetime(v) + elif isinstance(f, TimeField): + v = dateparse.parse_time(v) + elif isinstance(f, DateField): + v = dateparse.parse_date(v) + elif isinstance(f, BinaryField): + v = force_bytes( + base64.b64decode( + force_bytes(v))) + elif is_db_value: + try: + if django.VERSION < (3, 0): + v = f.from_db_value(v, None, None, None) + else: + v = f.from_db_value(v, None, None) + except Exception: + raise ImproperlyConfigured( + "Unable to auto serialize field '{}', custom" + " serialization override required".format(k) + ) +~~ except FieldDoesNotExist: + pass + setattr(ret, k, v) + return ret + + +def set_form_field_order(form, field_order): + if field_order is None: + return + fields = OrderedDict() + for key in field_order: + try: + fields[key] = form.fields.pop(key) + except KeyError: # ignore unknown fields + pass + fields.update(form.fields) # add remaining fields in original order + form.fields = fields + + +def build_absolute_uri(request, location, protocol=None): + from .account import app_settings as account_settings + + if request is None: + site = Site.objects.get_current() + bits = urlsplit(location) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 3 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / utils.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./utils.py) + +```python +# utils.py +import warnings +from collections import OrderedDict + +from django.conf import settings +~~from django.core.exceptions import FieldDoesNotExist, FieldError +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.expressions import Expression +from django.db.models.fields.related import ForeignObjectRel, RelatedField +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.text import capfirst +from django.utils.translation import gettext as _ + +from .exceptions import FieldLookupError + + +def deprecate(msg, level_modifier=0): + warnings.warn(msg, MigrationNotice, stacklevel=3 + level_modifier) + + +class MigrationNotice(DeprecationWarning): + url = 'https://django-filter.readthedocs.io/en/master/guide/migration.html' + + def __init__(self, message): + super().__init__('%s See: %s' % (message, self.url)) + + +class RenameAttributesBase(type): + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + + +def get_all_model_fields(model): + opts = model._meta + + return [ + f.name for f in sorted(opts.fields + opts.many_to_many) + if not isinstance(f, models.AutoField) and + not (getattr(f.remote_field, 'parent_link', False)) + ] + + +def get_model_field(model, field_name): + fields = get_field_parts(model, field_name) + return fields[-1] if fields else None + + +def get_field_parts(model, field_name): + parts = field_name.split(LOOKUP_SEP) + opts = model._meta + fields = [] + + for name in parts: + try: + field = opts.get_field(name) +~~ except FieldDoesNotExist: + return None + + fields.append(field) + if isinstance(field, RelatedField): + opts = field.remote_field.model._meta + elif isinstance(field, ForeignObjectRel): + opts = field.related_model._meta + + return fields + + +def resolve_field(model_field, lookup_expr): + query = model_field.model._default_manager.all().query + lhs = Expression(model_field) + lookups = lookup_expr.split(LOOKUP_SEP) + + assert len(lookups) > 0 + + try: + while lookups: + name = lookups[0] + args = (lhs, name) + if len(lookups) == 1: + final_lookup = lhs.get_lookup(name) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 4 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / managers.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./managers.py) + +```python +# managers.py +~~from django.core.exceptions import FieldDoesNotExist +from django.db import models +from django.db.models import Q +from guardian.core import ObjectPermissionChecker +from guardian.ctypes import get_content_type +from guardian.exceptions import ObjectNotPersisted +from django.contrib.auth.models import Permission + +import warnings + + +class BaseObjectPermissionManager(models.Manager): + + @property + def user_or_group_field(self): + try: + self.model._meta.get_field('user') + return 'user' +~~ except FieldDoesNotExist: + return 'group' + + def is_generic(self): + try: + self.model._meta.get_field('object_pk') + return True +~~ except FieldDoesNotExist: + return False + + def assign_perm(self, perm, user_or_group, obj): + if getattr(obj, 'pk', None) is None: + raise ObjectNotPersisted("Object %s needs to be persisted first" + % obj) + ctype = get_content_type(obj) + if not isinstance(perm, Permission): + permission = Permission.objects.get(content_type=ctype, codename=perm) + else: + permission = perm + + kwargs = {'permission': permission, self.user_or_group_field: user_or_group} + if self.is_generic(): + kwargs['content_type'] = ctype + kwargs['object_pk'] = obj.pk + else: + kwargs['content_object'] = obj + obj_perm, _ = self.get_or_create(**kwargs) + return obj_perm + + def bulk_assign_perm(self, perm, user_or_group, queryset): + if isinstance(queryset, list): + ctype = get_content_type(queryset[0]) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 5 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import django +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: +~~ from django.core.exceptions import FieldDoesNotExist +else: + from django.db.models.fields import FieldDoesNotExist + + +logger = logging.getLogger(__name__) +logger.addHandler(logging.NullHandler()) + +USE_TRANSACTIONS = getattr(settings, 'IMPORT_EXPORT_USE_TRANSACTIONS', True) +CHUNK_SIZE = getattr(settings, 'IMPORT_EXPORT_CHUNK_SIZE', 1) + + +def get_related_model(field): + if hasattr(field, 'related_model'): + return field.related_model + if field.rel: + return field.rel.to + + +class ResourceOptions: + + model = None + fields = None + + exclude = None + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + continue + + field = new_class.field_from_django_field(f.name, f, + readonly=False) + field_list.append((f.name, field, )) + + new_class.fields.update(OrderedDict(field_list)) + + if opts.fields is not None: + field_list = [] + for field_name in opts.fields: + if field_name in declared_fields: + continue + if field_name.find('__') == -1: + continue + + model = opts.model + attrs = field_name.split('__') + for i, attr in enumerate(attrs): + verbose_path = ".".join([opts.model.__name__] + attrs[0:i+1]) + + try: + f = model._meta.get_field(attr) +~~ except FieldDoesNotExist as e: + logger.debug(e, exc_info=e) +~~ raise FieldDoesNotExist( + "%s: %s has no field named '%s'" % + (verbose_path, model.__name__, attr)) + + if i < len(attrs) - 1: + if isinstance(f, ForeignObjectRel): + model = get_related_model(f) + else: + if get_related_model(f) is None: + raise KeyError( + '%s is not a relation' % verbose_path) + model = get_related_model(f) + + if isinstance(f, ForeignObjectRel): + f = f.field + + field = new_class.field_from_django_field(field_name, f, + readonly=True) + field_list.append((field_name, field)) + + new_class.fields.update(OrderedDict(field_list)) + + return new_class + + + continue + if f.name in declared_fields: + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 6 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / serializers.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./serializers.py) + +```python +# serializers.py +import copy +import inspect +import traceback +from collections import OrderedDict, defaultdict +from collections.abc import Mapping + +~~from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.core.exceptions import ValidationError as DjangoValidationError +from django.db import models +from django.db.models.fields import Field as DjangoModelField +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +from rest_framework.compat import postgres_fields +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.fields import get_error_detail, set_value +from rest_framework.settings import api_settings +from rest_framework.utils import html, model_meta, representation +from rest_framework.utils.field_mapping import ( + ClassLookupDict, get_field_kwargs, get_nested_relation_kwargs, + get_relation_kwargs, get_url_kwargs +) +from rest_framework.utils.serializer_helpers import ( + BindingDict, BoundField, JSONBoundField, NestedBoundField, ReturnDict, + ReturnList +) +from rest_framework.validators import ( + UniqueForDateValidator, UniqueForMonthValidator, UniqueForYearValidator, + UniqueTogetherValidator +) + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + extra_kwargs[key] = value + + return extra_kwargs, hidden_fields + + def _get_model_fields(self, field_names, declared_fields, extra_kwargs): + model = getattr(self.Meta, 'model') + model_fields = {} + + for field_name in field_names: + if field_name in declared_fields: + field = declared_fields[field_name] + source = field.source or field_name + else: + try: + source = extra_kwargs[field_name]['source'] + except KeyError: + source = field_name + + if '.' in source or source == '*': + continue + + try: + field = model._meta.get_field(source) + if isinstance(field, DjangoModelField): + model_fields[source] = field +~~ except FieldDoesNotExist: + pass + + return model_fields + + + def get_validators(self): + validators = getattr(getattr(self, 'Meta', None), 'validators', None) + if validators is not None: + return list(validators) + + return ( + self.get_unique_together_validators() + + self.get_unique_for_date_validators() + ) + + def get_unique_together_validators(self): + model_class_inheritance_tree = ( + [self.Meta.model] + + list(self.Meta.model._meta.parents) + ) + + field_sources = OrderedDict( + (field.field_name, field.source) for field in self._writable_fields + if (field.source != '*') and ('.' not in field.source) + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 7 from django-tables2 +[django-tables2](https://github.com/jieter/django-tables2) +([projection documentation](https://django-tables2.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-tables2/)) +is a code library for [Django](/django.html) that simplifies creating and +displaying tables in [Django templates](/django-templates.html), +especially with more advanced features such as pagination and sorting. +The project and its code are +[available as open source](https://github.com/jieter/django-tables2/blob/master/LICENSE). + +[**django-tables2 / django_tables2 / utils.py**](https://github.com/jieter/django-tables2/blob/master/django_tables2/./utils.py) + +```python +# utils.py +import inspect +import warnings +from collections import OrderedDict +from functools import total_ordering +from itertools import chain + +~~from django.core.exceptions import FieldDoesNotExist +from django.db import models +from django.utils.html import format_html_join + + +class Sequence(list): + + def expand(self, columns): + ellipses = self.count("...") + if ellipses > 1: + raise ValueError("'...' must be used at most once in a sequence.") + elif ellipses == 0: + self.append("...") + + columns = list(columns) # take a copy and exhaust the generator + head = [] + tail = [] + target = head # start by adding things to the head + for name in self: + if name == "...": + target = tail + continue + target.append(name) + if name in columns: + columns.pop(columns.index(name)) + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + if safe and getattr(current, "alters_data", False): + raise ValueError(self.ALTERS_DATA_ERROR_FMT.format(method=repr(current))) + if not getattr(current, "do_not_call_in_templates", False): + current = current() + if current is None: + break + return current + except Exception: + if not quiet: + raise + + @property + def bits(self): + if self == "": + return () + return self.split(self.SEPARATOR) + + def get_field(self, model): + if not hasattr(model, "_meta"): + return + + field = None + for bit in self.bits: + try: + field = model._meta.get_field(bit) +~~ except FieldDoesNotExist: + break + + if hasattr(field, "remote_field"): + rel = getattr(field, "remote_field", None) + model = getattr(rel, "model", model) + + return field + + def penultimate(self, context, quiet=True): + path, _, remainder = self.rpartition(self.SEPARATOR) + return A(path).resolve(context, quiet=quiet), remainder + + +A = Accessor # alias + + +class AttributeDict(OrderedDict): + + blacklist = ("th", "td", "_ordering", "thead", "tbody", "tfoot") + + def _iteritems(self): + for key, v in self.items(): + value = v() if callable(v) else v + if key not in self.blacklist and value is not None: + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 8 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / forms_account_handling.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/./forms_account_handling.py) + +```python +# forms_account_handling.py +import random +import string + +import django.contrib.auth.models +from django import forms +from django.contrib.auth import get_user_model +from django.contrib.auth.forms import UserCreationForm +~~from django.core.exceptions import FieldDoesNotExist +from django.db.models.fields import CharField +from django.db.models.fields import EmailField +from django.utils.translation import gettext_lazy as _ +from wiki.conf import settings + + +def _get_field(model, field): + try: + return model._meta.get_field(field) +~~ except FieldDoesNotExist: + return + + +User = get_user_model() + + +def check_user_field(user_model): + return isinstance(_get_field(user_model, user_model.USERNAME_FIELD), CharField) + + +def check_email_field(user_model): + return isinstance( + _get_field(user_model, user_model.get_email_field_name()), EmailField + ) + + +CustomUser = ( + User + if ( + settings.ACCOUNT_HANDLING and check_user_field(User) and check_email_field(User) + ) + else django.contrib.auth.models.User +) + + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + + +## Example 9 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / edit_handlers.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/edit_handlers.py) + +```python +# edit_handlers.py +import functools +import re + +from django import forms +~~from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured +from django.db.models.fields import CharField, TextField +from django.forms.formsets import DELETION_FIELD_NAME, ORDERING_FIELD_NAME +from django.forms.models import fields_for_model +from django.template.loader import render_to_string +from django.utils.functional import cached_property +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy +from taggit.managers import TaggableManager + +from wagtail.admin import compare, widgets +from wagtail.core.fields import RichTextField +from wagtail.core.models import Page +from wagtail.core.utils import camelcase_to_underscore, resolve_model_string +from wagtail.utils.decorators import cached_classmethod + +from .forms.models import ( # NOQA + DIRECT_FORM_FIELD_OVERRIDES, FORM_FIELD_OVERRIDES, WagtailAdminModelForm, formfield_for_dbfield) +from .forms.pages import WagtailAdminPageForm + + +def widget_with_script(widget, script): + return mark_safe('{0}'.format(widget, script)) + + + + +## ... source file abbreviated to get to FieldDoesNotExist examples ... + + + def get_comparison_class(self): + widget_override = self.widget_overrides().get(self.field_name, None) + if widget_override and widget_override.is_hidden: + return + + try: + field = self.db_field + + if field.choices: + return compare.ChoiceFieldComparison + + if field.is_relation: + if isinstance(field, TaggableManager): + return compare.TagsFieldComparison + elif field.many_to_many: + return compare.M2MFieldComparison + + return compare.ForeignObjectComparison + + if isinstance(field, RichTextField): + return compare.RichTextFieldComparison + + if isinstance(field, (CharField, TextField)): + return compare.TextFieldComparison + +~~ except FieldDoesNotExist: + pass + + return compare.FieldComparison + + def get_comparison(self): + comparator_class = self.get_comparison_class() + + if comparator_class: + try: + return [functools.partial(comparator_class, self.db_field)] +~~ except FieldDoesNotExist: + return [] + return [] + + @cached_property + def db_field(self): + try: + model = self.model + except AttributeError: + raise ImproperlyConfigured("%r must be bound to a model before calling db_field" % self) + + return model._meta.get_field(self.field_name) + + def on_form_bound(self): + self.bound_field = self.form[self.field_name] + self.heading = self.heading or self.bound_field.label + self.help_text = self.bound_field.help_text + + def __repr__(self): + return "<%s '%s' with model=%s instance=%s request=%s form=%s>" % ( + self.__class__.__name__, self.field_name, + self.model, self.instance, self.request, self.form.__class__.__name__) + + +class RichTextFieldPanel(FieldPanel): + + +## ... source file continues with no further FieldDoesNotExist examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-fielderror.markdown b/content/pages/examples/django/django-core-exceptions-fielderror.markdown new file mode 100644 index 000000000..e9ea93104 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-fielderror.markdown @@ -0,0 +1,371 @@ +title: django.core.exceptions FieldError Example Code +category: page +slug: django-core-exceptions-fielderror-examples +sortorder: 500011100 +toc: False +sidebartitle: django.core.exceptions FieldError +meta: Python example code for the FieldError class from the django.core.exceptions module of the Django project. + + +FieldError is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / api.py**](https://github.com/divio/django-cms/blob/develop/cms/./api.py) + +```python +# api.py +import datetime + +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +~~from django.core.exceptions import FieldError +from django.core.exceptions import PermissionDenied +from django.core.exceptions import ValidationError +from django.db import transaction +from django.template.defaultfilters import slugify +from django.template.loader import get_template +from django.utils.translation import activate + +from six import string_types + +from cms import constants +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from cms.constants import TEMPLATE_INHERITANCE_MAGIC +from cms.models.pagemodel import Page +from cms.models.permissionmodels import (PageUser, PagePermission, GlobalPagePermission, + ACCESS_PAGE_AND_DESCENDANTS) +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.models.titlemodels import Title +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool +from cms.utils import copy_plugins, get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_list + + +## ... source file abbreviated to get to FieldError examples ... + + + + if navigation_extenders: + raw_menus = menu_pool.get_menus_by_attribute("cms_enabled", True) + menus = [menu[0] for menu in raw_menus] + assert navigation_extenders in menus + + accepted_limitations = (constants.VISIBILITY_ALL, constants.VISIBILITY_USERS, constants.VISIBILITY_ANONYMOUS) + assert limit_visibility_in_menu in accepted_limitations + + assert position in ('last-child', 'first-child', 'left', 'right') + target_node = parent.node if parent else None + + if apphook: + application_urls = _verify_apphook(apphook, apphook_namespace) + else: + application_urls = None + + if created_by and isinstance(created_by, get_user_model()): + _thread_locals.user = created_by + created_by = getattr(created_by, get_user_model().USERNAME_FIELD) + else: + _thread_locals.user = None + + if reverse_id: + if Page.objects.drafts().filter(reverse_id=reverse_id, node__site=site).exists(): +~~ raise FieldError('A page with the reverse_id="%s" already exist.' % reverse_id) + + page = Page( + created_by=created_by, + changed_by=created_by, + publication_date=publication_date, + publication_end_date=publication_end_date, + in_navigation=in_navigation, + soft_root=soft_root, + reverse_id=reverse_id, + navigation_extenders=navigation_extenders, + template=template, + application_urls=application_urls, + application_namespace=apphook_namespace, + login_required=login_required, + limit_visibility_in_menu=limit_visibility_in_menu, + xframe_options=xframe_options, + ) + page.set_tree_node(site=site, target=target_node, position=position) + page.save() + page.rescan_placeholders() + + create_title( + language=language, + title=title, + + +## ... source file continues with no further FieldError examples... + +``` + + +## Example 2 from django-filter +[django-filter](https://github.com/carltongibson/django-filter) +([project documentation](https://django-filter.readthedocs.io/en/master/) +and +[PyPI page](https://pypi.org/project/django-filter/2.2.0/)) +makes it easier to filter down querysets from the +[Django ORM](/django-orm.html) by providing common bits of boilerplate +code. django-filter is provided as +[open source](https://github.com/carltongibson/django-filter/blob/master/LICENSE). + +[**django-filter / django_filters / utils.py**](https://github.com/carltongibson/django-filter/blob/master/django_filters/./utils.py) + +```python +# utils.py +import warnings +from collections import OrderedDict + +from django.conf import settings +~~from django.core.exceptions import FieldDoesNotExist, FieldError +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.expressions import Expression +from django.db.models.fields.related import ForeignObjectRel, RelatedField +from django.utils import timezone +from django.utils.encoding import force_str +from django.utils.text import capfirst +from django.utils.translation import gettext as _ + +from .exceptions import FieldLookupError + + +def deprecate(msg, level_modifier=0): + warnings.warn(msg, MigrationNotice, stacklevel=3 + level_modifier) + + +class MigrationNotice(DeprecationWarning): + url = 'https://django-filter.readthedocs.io/en/master/guide/migration.html' + + def __init__(self, message): + super().__init__('%s See: %s' % (message, self.url)) + + +class RenameAttributesBase(type): + + +## ... source file abbreviated to get to FieldError examples ... + + + elif isinstance(field, ForeignObjectRel): + opts = field.related_model._meta + + return fields + + +def resolve_field(model_field, lookup_expr): + query = model_field.model._default_manager.all().query + lhs = Expression(model_field) + lookups = lookup_expr.split(LOOKUP_SEP) + + assert len(lookups) > 0 + + try: + while lookups: + name = lookups[0] + args = (lhs, name) + if len(lookups) == 1: + final_lookup = lhs.get_lookup(name) + if not final_lookup: + lhs = query.try_transform(*args) + final_lookup = lhs.get_lookup('exact') + return lhs.output_field, final_lookup.lookup_name + lhs = query.try_transform(*args) + lookups = lookups[1:] +~~ except FieldError as e: + raise FieldLookupError(model_field, lookup_expr) from e + + +def handle_timezone(value, is_dst=None): + if settings.USE_TZ and timezone.is_naive(value): + return timezone.make_aware(value, timezone.get_current_timezone(), is_dst) + elif not settings.USE_TZ and timezone.is_aware(value): + return timezone.make_naive(value, timezone.utc) + return value + + +def verbose_field_name(model, field_name): + if field_name is None: + return '[invalid name]' + + parts = get_field_parts(model, field_name) + if not parts: + return '[invalid name]' + + names = [] + for part in parts: + if isinstance(part, ForeignObjectRel): + if part.related_name: + names.append(part.related_name.replace('_', ' ')) + + +## ... source file continues with no further FieldError examples... + +``` + + +## Example 3 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / tracker.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./tracker.py) + +```python +# tracker.py +from copy import deepcopy +from functools import wraps + +import django +~~from django.core.exceptions import FieldError +from django.db import models +from django.db.models.fields.files import FileDescriptor +from django.db.models.query_utils import DeferredAttribute + + +class DescriptorMixin: + tracker_instance = None + + def __get__(self, instance, owner): + if instance is None: + return self + was_deferred = False + field_name = self._get_field_name() + if field_name in instance._deferred_fields: + instance._deferred_fields.remove(field_name) + was_deferred = True + value = super().__get__(instance, owner) + if was_deferred: + self.tracker_instance.saved_data[field_name] = deepcopy(value) + return value + + def _get_field_name(self): + return self.field_name + + + +## ... source file abbreviated to get to FieldError examples ... + + + else: + self.saved_data.update(**self.current(fields=fields)) + + for field, field_value in self.saved_data.items(): + self.saved_data[field] = deepcopy(field_value) + + def current(self, fields=None): + if fields is None: + deferred_fields = self.deferred_fields + if deferred_fields: + fields = [ + field for field in self.fields + if field not in deferred_fields + ] + else: + fields = self.fields + + return {f: self.get_field_value(f) for f in fields} + + def has_changed(self, field): + if field in self.fields: + if field in self.deferred_fields and field not in self.instance.__dict__: + return False + return self.previous(field) != self.get_field_value(field) + else: +~~ raise FieldError('field "%s" not tracked' % field) + + def previous(self, field): + + if self.instance.pk and field in self.deferred_fields and field not in self.saved_data: + + if field not in self.instance.__dict__: + self.get_field_value(field) + + else: + current_value = self.get_field_value(field) + self.instance.refresh_from_db(fields=[field]) + self.saved_data[field] = deepcopy(self.get_field_value(field)) + setattr(self.instance, self.field_map[field], current_value) + + return self.saved_data.get(field) + + def changed(self): + return { + field: self.previous(field) + for field in self.fields + if self.has_changed(field) + } + + def init_deferred_fields(self): + + +## ... source file abbreviated to get to FieldError examples ... + + + field for field in update_fields if + field in self.fields + ) + getattr(instance, self.attname).set_saved_fields( + fields=fields + ) + return ret + + setattr(model, method, inner) + + def __get__(self, instance, owner): + if instance is None: + return self + else: + return getattr(instance, self.attname) + + +class ModelInstanceTracker(FieldInstanceTracker): + + def has_changed(self, field): + if not self.instance.pk: + return True + elif field in self.saved_data: + return self.previous(field) != self.get_field_value(field) + else: +~~ raise FieldError('field "%s" not tracked' % field) + + def changed(self): + if not self.instance.pk: + return {} + saved = self.saved_data.items() + current = self.current() + return {k: v for k, v in saved if v != current[k]} + + +class ModelTracker(FieldTracker): + tracker_class = ModelInstanceTracker + + def get_field_map(self, cls): + return {field: field for field in self.fields} + + + +## ... source file continues with no further FieldError examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown b/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown index d38b11d7a..8b4c0bcb0 100644 --- a/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown +++ b/content/pages/examples/django/django-core-exceptions-improperlyconfigured.markdown @@ -1,6 +1,6 @@ title: django.core.exceptions ImproperlyConfigured Example Code category: page -slug: django-core-exceptions-improperlyconfigured +slug: django-core-exceptions-improperlyconfigured-examples sortorder: 500012505 toc: False sidebartitle: django.core.exceptions ImproperlyConfigured diff --git a/content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown b/content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown new file mode 100644 index 000000000..d93d2e380 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-middlewarenotused.markdown @@ -0,0 +1,122 @@ +title: django.core.exceptions MiddlewareNotUsed Example Code +category: page +slug: django-core-exceptions-middlewarenotused-examples +sortorder: 500011102 +toc: False +sidebartitle: django.core.exceptions MiddlewareNotUsed +meta: Python example code for the MiddlewareNotUsed class from the django.core.exceptions module of the Django project. + + +MiddlewareNotUsed is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / middleware.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/./middleware.py) + +```python +# middleware.py +~~from django.core.exceptions import MiddlewareNotUsed +from django.utils.encoding import DjangoUnicodeDecodeError +from django.utils.html import strip_spaces_between_tags as minify_html + +from pipeline.conf import settings + +from django.utils.deprecation import MiddlewareMixin + + +class MinifyHTMLMiddleware(MiddlewareMixin): + def __init__(self, *args, **kwargs): + super(MinifyHTMLMiddleware, self).__init__(*args, **kwargs) + if not settings.PIPELINE_ENABLED: +~~ raise MiddlewareNotUsed + + def process_response(self, request, response): + if response.has_header('Content-Type') and 'text/html' in response['Content-Type']: + try: + response.content = minify_html(response.content.decode('utf-8').strip()) + response['Content-Length'] = str(len(response.content)) + except DjangoUnicodeDecodeError: + pass + return response + + + +## ... source file continues with no further MiddlewareNotUsed examples... + +``` + + +## Example 2 from django-user-visit +[django-user-visit](https://github.com/yunojuno/django-user-visit) +([PyPI package information](https://pypi.org/project/django-user-visit/)) +is a [Django](/django.html) app and +[middleware](https://docs.djangoproject.com/en/stable/topics/http/middleware/) +for tracking daily user visits to your web application. The goal +is to record per user per day instead of for every request a user +sends to the application. The project is provided as open source +under the +[MIT license](https://github.com/yunojuno/django-user-visit/blob/master/LICENSE). + +[**django-user-visit / user_visit / middleware.py**](https://github.com/yunojuno/django-user-visit/blob/master/user_visit/./middleware.py) + +```python +# middleware.py +import logging +import typing + +import django.db +~~from django.core.exceptions import MiddlewareNotUsed +from django.http import HttpRequest, HttpResponse +from django.utils import timezone + +from user_visit.models import UserVisit + +from .settings import RECORDING_DISABLED + +logger = logging.getLogger(__name__) + +SESSION_KEY = "user_visit.hash" + + +class UserVisitMiddleware: + + def __init__(self, get_response: typing.Callable) -> None: + if RECORDING_DISABLED: +~~ raise MiddlewareNotUsed("UserVisit recording has been disabled") + self.get_response = get_response + + def __call__(self, request: HttpRequest) -> typing.Optional[HttpResponse]: + if request.user.is_anonymous: + return self.get_response(request) + + uv = UserVisit.objects.build(request, timezone.now()) + if request.session.get(SESSION_KEY, "") == uv.hash: + return self.get_response(request) + + try: + uv.save() + except django.db.IntegrityError: + logger.warning("Unable to record user visit - duplicate request hash") + else: + request.session[SESSION_KEY] = uv.hash + return self.get_response(request) + + + +## ... source file continues with no further MiddlewareNotUsed examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-non-field-errors.markdown b/content/pages/examples/django/django-core-exceptions-non-field-errors.markdown new file mode 100644 index 000000000..0421e6dd7 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-non-field-errors.markdown @@ -0,0 +1,158 @@ +title: django.core.exceptions NON_FIELD_ERRORS Example Code +category: page +slug: django-core-exceptions-non-field-errors-examples +sortorder: 500011103 +toc: False +sidebartitle: django.core.exceptions NON_FIELD_ERRORS +meta: Python example code for the NON_FIELD_ERRORS constant from the django.core.exceptions module of the Django project. + + +NON_FIELD_ERRORS is a constant within the django.core.exceptions module of the Django project. + + +## Example 1 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / results.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./results.py) + +```python +# results.py +from collections import OrderedDict +from tablib import Dataset + +~~from django.core.exceptions import NON_FIELD_ERRORS + + +class Error: + def __init__(self, error, traceback=None, row=None): + self.error = error + self.traceback = traceback + self.row = row + + +class RowResult: + IMPORT_TYPE_UPDATE = 'update' + IMPORT_TYPE_NEW = 'new' + IMPORT_TYPE_DELETE = 'delete' + IMPORT_TYPE_SKIP = 'skip' + IMPORT_TYPE_ERROR = 'error' + IMPORT_TYPE_INVALID = 'invalid' + + valid_import_types = frozenset([ + IMPORT_TYPE_NEW, + IMPORT_TYPE_UPDATE, + IMPORT_TYPE_DELETE, + IMPORT_TYPE_SKIP, + ]) + + + +## ... source file abbreviated to get to NON_FIELD_ERRORS examples ... + + + self.diff = None + self.import_type = None + self.raw_values = {} + + +class InvalidRow: + + def __init__(self, number, validation_error, values): + self.number = number + self.error = validation_error + self.values = values + try: + self.error_dict = validation_error.message_dict + except AttributeError: + self.error_dict = {NON_FIELD_ERRORS: validation_error.messages} + + @property + def field_specific_errors(self): + return { + key: value for key, value in self.error_dict.items() + if key != NON_FIELD_ERRORS + } + + @property + def non_field_specific_errors(self): +~~ return self.error_dict.get(NON_FIELD_ERRORS, []) + + @property + def error_count(self): + count = 0 + for error_list in self.error_dict.values(): + count += len(error_list) + return count + + +class Result: + def __init__(self, *args, **kwargs): + super().__init__() + self.base_errors = [] + self.diff_headers = [] + self.rows = [] # RowResults + self.invalid_rows = [] # InvalidRow + self.failed_dataset = Dataset() + self.totals = OrderedDict([(RowResult.IMPORT_TYPE_NEW, 0), + (RowResult.IMPORT_TYPE_UPDATE, 0), + (RowResult.IMPORT_TYPE_DELETE, 0), + (RowResult.IMPORT_TYPE_SKIP, 0), + (RowResult.IMPORT_TYPE_ERROR, 0), + (RowResult.IMPORT_TYPE_INVALID, 0)]) + self.total_rows = 0 + + +## ... source file continues with no further NON_FIELD_ERRORS examples... + +``` + + +## Example 2 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / messages.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/messages.py) + +```python +# messages.py +from django.contrib import messages +~~from django.core.exceptions import NON_FIELD_ERRORS +from django.template.loader import render_to_string +from django.utils.html import format_html, format_html_join + + +def render(message, buttons, detail=''): + return render_to_string('wagtailadmin/shared/messages.html', { + 'message': message, + 'buttons': buttons, + 'detail': detail, + }) + + +def debug(request, message, buttons=None, extra_tags=''): + return messages.debug(request, render(message, buttons), extra_tags=extra_tags) + + +def info(request, message, buttons=None, extra_tags=''): + return messages.info(request, render(message, buttons), extra_tags=extra_tags) + + +def success(request, message, buttons=None, extra_tags=''): + return messages.success(request, render(message, buttons), extra_tags=extra_tags) + + + + +## ... source file continues with no further NON_FIELD_ERRORS examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown b/content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown new file mode 100644 index 000000000..755ef4441 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-objectdoesnotexist.markdown @@ -0,0 +1,969 @@ +title: django.core.exceptions ObjectDoesNotExist Example Code +category: page +slug: django-core-exceptions-objectdoesnotexist-examples +sortorder: 500011104 +toc: False +sidebartitle: django.core.exceptions ObjectDoesNotExist +meta: Python example code for the ObjectDoesNotExist class from the django.core.exceptions module of the Django project. + + +ObjectDoesNotExist is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog / diff.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog/diff.py) + +```python +# diff.py +from __future__ import unicode_literals + +from django.conf import settings +~~from django.core.exceptions import ObjectDoesNotExist +from django.db.models import Model, NOT_PROVIDED, DateTimeField +from django.utils import timezone +from django.utils.encoding import smart_text + + +def track_field(field): + from auditlog.models import LogEntry + if field.many_to_many: + return False + + if getattr(field, 'remote_field', None) is not None and field.remote_field.model == LogEntry: + return False + + elif getattr(field, 'rel', None) is not None and field.rel.to == LogEntry: + return False + + return True + + +def get_fields_in_model(instance): + assert isinstance(instance, Model) + + use_api = hasattr(instance._meta, 'get_fields') and callable(instance._meta.get_fields) + + if use_api: + return [f for f in instance._meta.get_fields() if track_field(f)] + return instance._meta.fields + + +def get_field_value(obj, field): + if isinstance(field, DateTimeField): + try: + value = field.to_python(getattr(obj, field.name, None)) + if value is not None and settings.USE_TZ and not timezone.is_naive(value): + value = timezone.make_naive(value, timezone=timezone.utc) +~~ except ObjectDoesNotExist: + value = field.default if field.default is not NOT_PROVIDED else None + else: + try: + value = smart_text(getattr(obj, field.name, None)) +~~ except ObjectDoesNotExist: + value = field.default if field.default is not NOT_PROVIDED else None + + return value + + +def model_instance_diff(old, new): + from auditlog.registry import auditlog + + if not(old is None or isinstance(old, Model)): + raise TypeError("The supplied old instance is not a valid model instance.") + if not(new is None or isinstance(new, Model)): + raise TypeError("The supplied new instance is not a valid model instance.") + + diff = {} + + if old is not None and new is not None: + fields = set(old._meta.fields + new._meta.fields) + model_fields = auditlog.get_model_fields(new._meta.model) + elif old is not None: + fields = set(get_fields_in_model(old)) + model_fields = auditlog.get_model_fields(old._meta.model) + elif new is not None: + fields = set(get_fields_in_model(new)) + model_fields = auditlog.get_model_fields(new._meta.model) + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / test_utils / testcases.py**](https://github.com/divio/django-cms/blob/develop/cms/test_utils/testcases.py) + +```python +# testcases.py +import json +import sys +import warnings + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser, Permission +from django.contrib.sites.models import Site +from django.core.cache import cache +~~from django.core.exceptions import ObjectDoesNotExist +from django.forms.models import model_to_dict +from django.template import engines +from django.template.context import Context +from django.test import testcases +from django.test.client import RequestFactory +from django.urls import reverse +from django.utils.http import urlencode +from django.utils.timezone import now +from django.utils.translation import activate +from menus.menu_pool import menu_pool + +from six.moves.urllib.parse import unquote, urljoin + +from cms.api import create_page +from cms.constants import ( + PUBLISHER_STATE_DEFAULT, + PUBLISHER_STATE_DIRTY, + PUBLISHER_STATE_PENDING, +) +from cms.plugin_rendering import ContentRenderer, StructureRenderer +from cms.models import Page +from cms.models.permissionmodels import ( + GlobalPagePermission, + PagePermission, + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + page_data['pagepermission_set-2-TOTAL_FORMS'] = 0 + page_data['pagepermission_set-2-INITIAL_FORMS'] = 0 + page_data['pagepermission_set-2-MAX_NUM_FORMS'] = 0 + return page_data + + def print_page_structure(self, qs): + for page in qs.order_by('path'): + ident = " " * page.level + print(u"%s%s (%s), path: %s, depth: %s, numchild: %s" % (ident, page, + page.pk, page.path, page.depth, page.numchild)) + + def print_node_structure(self, nodes, *extra): + def _rec(nodes, level=0): + ident = level * ' ' + for node in nodes: + raw_attrs = [(bit, getattr(node, bit, node.attr.get(bit, "unknown"))) for bit in extra] + attrs = ', '.join(['%s: %r' % data for data in raw_attrs]) + print(u"%s%s: %s" % (ident, node.title, attrs)) + _rec(node.children, level + 1) + + _rec(nodes) + + def assertObjectExist(self, qs, **filter): + try: + return qs.get(**filter) +~~ except ObjectDoesNotExist: + pass + raise self.failureException("ObjectDoesNotExist raised for filter %s" % filter) + + def assertObjectDoesNotExist(self, qs, **filter): + try: + qs.get(**filter) +~~ except ObjectDoesNotExist: + return + raise self.failureException("ObjectDoesNotExist not raised for filter %s" % filter) + + def copy_page(self, page, target_page, position=0, target_site=None): + from cms.utils.page import get_available_slug + + if target_site is None: + target_site = target_page.node.site + + data = { + 'position': position, + 'target': target_page.pk, + 'source_site': page.node.site_id, + 'copy_permissions': 'on', + 'copy_moderation': 'on', + } + source_translation = page.title_set.all()[0] + parent_translation = target_page.title_set.all()[0] + language = source_translation.language + copied_page_path = source_translation.get_path_for_base(parent_translation.path) + new_page_slug = get_available_slug(target_site, copied_page_path, language) + + with self.settings(SITE_ID=target_site.pk): + response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data) + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 3 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / fields / folder.py**](https://github.com/divio/django-filer/blob/develop/filer/fields/folder.py) + +```python +# folder.py +from __future__ import absolute_import + +import warnings + +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +~~from django.core.exceptions import ObjectDoesNotExist +from django.db import models +from django.template.loader import render_to_string +from django.urls import reverse +from django.utils.http import urlencode +from django.utils.safestring import mark_safe + +from ..models import Folder +from ..utils.compatibility import truncate_words +from ..utils.model_label import get_model_label + + +class AdminFolderWidget(ForeignKeyRawIdWidget): + choices = None + input_type = 'hidden' + is_hidden = False + + def render(self, name, value, attrs=None, renderer=None): + obj = self.obj_for_value(value) + css_id = attrs.get('id') + css_id_folder = "%s_folder" % css_id + css_id_description_txt = "%s_description_txt" % css_id + if attrs is None: + attrs = {} + related_url = None + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + context = { + 'hidden_input': hidden_input, + 'lookup_url': '%s%s' % (related_url, url), + 'lookup_name': name, + 'span_id': css_id_description_txt, + 'object': obj, + 'clear_id': '%s_clear' % css_id, + 'descid': css_id_description_txt, + 'noimg': 'filer/icons/nofile_32x32.png', + 'foldid': css_id_folder, + 'id': css_id, + } + html = render_to_string('admin/filer/widgets/admin_folder.html', context) + return mark_safe(html) + + def label_for_value(self, value): + obj = self.obj_for_value(value) + return ' %s' % truncate_words(obj, 14) + + def obj_for_value(self, value): + if not value: + return None + try: + key = self.rel.get_related_field().name + obj = self.rel.model._default_manager.get(**{key: value}) +~~ except ObjectDoesNotExist: + obj = None + return obj + + class Media(object): + js = ( + 'filer/js/addons/popup_handling.js', + ) + + +class AdminFolderFormField(forms.ModelChoiceField): + widget = AdminFolderWidget + + def __init__(self, rel, queryset, to_field_name, *args, **kwargs): + self.rel = rel + self.queryset = queryset + self.limit_choices_to = kwargs.pop('limit_choices_to', None) + self.to_field_name = to_field_name + self.max_value = None + self.min_value = None + kwargs.pop('widget', None) + forms.Field.__init__(self, widget=self.widget(rel, site), *args, **kwargs) + + def widget_attrs(self, widget): + widget.required = self.required + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 4 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / utils.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./utils.py) + +```python +# utils.py +import logging +import os +from itertools import chain + +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME, get_user_model +from django.contrib.auth.models import AnonymousUser, Group +~~from django.core.exceptions import ObjectDoesNotExist, PermissionDenied +from django.db.models import Model, QuerySet +from django.http import HttpResponseForbidden, HttpResponseNotFound +from django.shortcuts import render +from guardian.conf import settings as guardian_settings +from guardian.ctypes import get_content_type +from guardian.exceptions import NotUserNorGroup + +logger = logging.getLogger(__name__) +abspath = lambda *p: os.path.abspath(os.path.join(*p)) + + +def get_anonymous_user(): + User = get_user_model() + lookup = {User.USERNAME_FIELD: guardian_settings.ANONYMOUS_USER_NAME} + return User.objects.get(**lookup) + + +def get_identity(identity): + if isinstance(identity, AnonymousUser): + identity = get_anonymous_user() + + if isinstance(identity, QuerySet): + identity_model_type = identity.model + if identity_model_type == get_user_model(): + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + redirect_field_name = redirect_field_name or REDIRECT_FIELD_NAME + + + has_permissions = False + if accept_global_perms: + has_permissions = all(request.user.has_perm(perm) for perm in perms) + if not has_permissions: + has_permissions = all(request.user.has_perm(perm, obj) + for perm in perms) + + if not has_permissions: + if return_403: + if guardian_settings.RENDER_403: + response = render(request, guardian_settings.TEMPLATE_403) + response.status_code = 403 + return response + elif guardian_settings.RAISE_403: + raise PermissionDenied + return HttpResponseForbidden() + if return_404: + if guardian_settings.RENDER_404: + response = render(request, guardian_settings.TEMPLATE_404) + response.status_code = 404 + return response + elif guardian_settings.RAISE_404: +~~ raise ObjectDoesNotExist + return HttpResponseNotFound() + else: + from django.contrib.auth.views import redirect_to_login + return redirect_to_login(request.get_full_path(), + login_url, + redirect_field_name) + + +from django.apps import apps as django_apps +from django.core.exceptions import ImproperlyConfigured + +def get_obj_perm_model_by_conf(setting_name): + try: + setting_value = getattr(guardian_settings, setting_name) + return django_apps.get_model(setting_value, require_ready=False) + except ValueError as e: + raise ImproperlyConfigured("{} must be of the form 'app_label.model_name'".format(setting_value)) from e + except LookupError as e: + raise ImproperlyConfigured( + "{} refers to model '{}' that has not been installed".format(setting_name, setting_value) + ) from e + + +def clean_orphan_obj_perms(): + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 5 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / models.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./models.py) + +```python +# models.py + +~~from django.core.exceptions import ObjectDoesNotExist +from django.utils.encoding import force_str +from django.utils.text import capfirst + +from haystack.constants import DEFAULT_ALIAS +from haystack.exceptions import NotHandled, SpatialError +from haystack.utils import log as logging +from haystack.utils.app_loading import haystack_get_model + +try: + from geopy import distance as geopy_distance +except ImportError: + geopy_distance = None + + +class SearchResult(object): + + def __init__(self, app_label, model_name, pk, score, **kwargs): + self.app_label, self.model_name = app_label, model_name + self.pk = pk + self.score = score + self._object = None + self._model = None + self._verbose_name = None + self._additional_fields = [] + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + return self.__dict__.get(attr, None) + + def _get_searchindex(self): + from haystack import connections + + return connections[DEFAULT_ALIAS].get_unified_index().get_index(self.model) + + searchindex = property(_get_searchindex) + + def _get_object(self): + if self._object is None: + if self.model is None: + self.log.error("Model could not be found for SearchResult '%s'.", self) + return None + + try: + try: + self._object = self.searchindex.read_queryset().get(pk=self.pk) + except NotHandled: + self.log.warning( + "Model '%s.%s' not handled by the routers.", + self.app_label, + self.model_name, + ) + self._object = self.model._default_manager.get(pk=self.pk) +~~ except ObjectDoesNotExist: + self.log.error( + "Object could not be found in database for SearchResult '%s'.", self + ) + self._object = None + + return self._object + + def _set_object(self, obj): + self._object = obj + + object = property(_get_object, _set_object) + + def _get_model(self): + if self._model is None: + try: + self._model = haystack_get_model(self.app_label, self.model_name) + except LookupError: + pass + + return self._model + + def _set_model(self, obj): + self._model = obj + + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 6 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / fields.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./fields.py) + +```python +# fields.py +~~from django.core.exceptions import ObjectDoesNotExist +from django.db.models.fields import NOT_PROVIDED +from django.db.models.manager import Manager + +from . import widgets + + +class Field: + empty_values = [None, ''] + + def __init__(self, attribute=None, column_name=None, widget=None, + default=NOT_PROVIDED, readonly=False, saves_null_values=True): + self.attribute = attribute + self.default = default + self.column_name = column_name + if not widget: + widget = widgets.Widget() + self.widget = widget + self.readonly = readonly + self.saves_null_values = saves_null_values + + def __repr__(self): + path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__) + column_name = getattr(self, 'column_name', None) + if column_name is not None: + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + try: + value = data[self.column_name] + except KeyError: + raise KeyError("Column '%s' not found in dataset. Available " + "columns are: %s" % (self.column_name, list(data))) + + value = self.widget.clean(value, row=data) + + if value in self.empty_values and self.default != NOT_PROVIDED: + if callable(self.default): + return self.default() + return self.default + + return value + + def get_value(self, obj): + if self.attribute is None: + return None + + attrs = self.attribute.split('__') + value = obj + + for attr in attrs: + try: + value = getattr(value, attr, None) +~~ except (ValueError, ObjectDoesNotExist): + return None + if value is None: + return None + + if callable(value) and not isinstance(value, Manager): + value = value() + return value + + def save(self, obj, data, is_m2m=False): + if not self.readonly: + attrs = self.attribute.split('__') + for attr in attrs[:-1]: + obj = getattr(obj, attr, None) + cleaned = self.clean(data) + if cleaned is not None or self.saves_null_values: + if not is_m2m: + setattr(obj, attrs[-1], cleaned) + else: + getattr(obj, attrs[-1]).set(cleaned) + + def export(self, obj): + value = self.get_value(obj) + if value is None: + return "" + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 7 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / managers.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./managers.py) + +```python +# managers.py +import django +~~from django.core.exceptions import ObjectDoesNotExist +from django.db import connection +from django.db import models +from django.db.models.constants import LOOKUP_SEP +from django.db.models.fields.related import OneToOneField, OneToOneRel +from django.db.models.query import ModelIterable +from django.db.models.query import QuerySet +from django.db.models.sql.datastructures import Join + + +class InheritanceIterable(ModelIterable): + def __iter__(self): + queryset = self.queryset + iter = ModelIterable(queryset) + if getattr(queryset, 'subclasses', False): + extras = tuple(queryset.query.extra.keys()) + subclasses = sorted(queryset.subclasses, key=len, reverse=True) + for obj in iter: + sub_obj = None + for s in subclasses: + sub_obj = queryset._get_sub_obj_recurse(obj, s) + if sub_obj: + break + if not sub_obj: + sub_obj = obj + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + def _get_ancestors_path(self, model, levels=None): + if not issubclass(model, self.model): + raise ValueError( + "{!r} is not a subclass of {!r}".format(model, self.model)) + + ancestry = [] + parent_link = model._meta.get_ancestor_link(self.model) + if levels: + levels -= 1 + while parent_link is not None: + related = parent_link.remote_field + ancestry.insert(0, related.get_accessor_name()) + if levels or levels is None: + parent_model = related.model + parent_link = parent_model._meta.get_ancestor_link( + self.model) + else: + parent_link = None + return LOOKUP_SEP.join(ancestry) + + def _get_sub_obj_recurse(self, obj, s): + rel, _, s = s.partition(LOOKUP_SEP) + + try: + node = getattr(obj, rel) +~~ except ObjectDoesNotExist: + return None + if s: + child = self._get_sub_obj_recurse(node, s) + return child + else: + return node + + def get_subclass(self, *args, **kwargs): + return self.select_subclasses().get(*args, **kwargs) + + +class InheritanceQuerySet(InheritanceQuerySetMixin, QuerySet): + def instance_of(self, *models): + + + + where_queries = [] + for model in models: + where_queries.append('(' + ' AND '.join([ + '"{}"."{}" IS NOT NULL'.format( + model._meta.db_table, + field.attname, # Should this be something else? + ) for field in model._meta.parents.values() + ]) + ')') + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 8 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / oauth2_validators.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./oauth2_validators.py) + +```python +# oauth2_validators.py +import base64 +import binascii +import http.client +import logging +from collections import OrderedDict +from datetime import datetime, timedelta +from urllib.parse import unquote_plus + +import requests +from django.conf import settings +from django.contrib.auth import authenticate, get_user_model +~~from django.core.exceptions import ObjectDoesNotExist +from django.db import transaction +from django.db.models import Q +from django.utils import timezone +from django.utils.timezone import make_aware +from django.utils.translation import gettext_lazy as _ +from oauthlib.oauth2 import RequestValidator + +from .exceptions import FatalClientError +from .models import ( + AbstractApplication, get_access_token_model, + get_application_model, get_grant_model, get_refresh_token_model +) +from .scopes import get_scopes_backend +from .settings import oauth2_settings + + +log = logging.getLogger("oauth2_provider") + +GRANT_TYPE_MAPPING = { + "authorization_code": (AbstractApplication.GRANT_AUTHORIZATION_CODE, ), + "password": (AbstractApplication.GRANT_PASSWORD, ), + "client_credentials": (AbstractApplication.GRANT_CLIENT_CREDENTIALS, ), + "refresh_token": ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + scope=" ".join(request.scopes), + code_challenge=request.code_challenge or "", + code_challenge_method=request.code_challenge_method or "" + ) + + def _create_refresh_token(self, request, refresh_token_code, access_token): + return RefreshToken.objects.create( + user=request.user, + token=refresh_token_code, + application=request.client, + access_token=access_token + ) + + def revoke_token(self, token, token_type_hint, request, *args, **kwargs): + if token_type_hint not in ["access_token", "refresh_token"]: + token_type_hint = None + + token_types = { + "access_token": AccessToken, + "refresh_token": RefreshToken, + } + + token_type = token_types.get(token_type_hint, AccessToken) + try: + token_type.objects.get(token=token).revoke() +~~ except ObjectDoesNotExist: + for other_type in [_t for _t in token_types.values() if _t != token_type]: + list(map(lambda t: t.revoke(), other_type.objects.filter(token=token))) + + def validate_user(self, username, password, client, request, *args, **kwargs): + u = authenticate(username=username, password=password) + if u is not None and u.is_active: + request.user = u + return True + return False + + def get_original_scopes(self, refresh_token, request, *args, **kwargs): + rt = request.refresh_token_instance + if not rt.access_token_id: + return AccessToken.objects.get(source_refresh_token_id=rt.id).scope + + return rt.access_token.scope + + def validate_refresh_token(self, refresh_token, client, request, *args, **kwargs): + + null_or_recent = Q(revoked__isnull=True) | Q( + revoked__gt=timezone.now() - timedelta( + seconds=oauth2_settings.REFRESH_TOKEN_GRACE_PERIOD_SECONDS + ) + ) + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + + +## Example 9 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +~~from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError + + +## ... source file abbreviated to get to ObjectDoesNotExist examples ... + + + if inspect.isbuiltin(obj): + raise BuiltinSignatureError( + 'Built-in function signatures are not inspectable. ' + 'Wrap the function call in a simple, pure Python function.') + + if not (inspect.isfunction(obj) or inspect.ismethod(obj) or isinstance(obj, functools.partial)): + return False + + sig = inspect.signature(obj) + params = sig.parameters.values() + return all( + param.kind == param.VAR_POSITIONAL or + param.kind == param.VAR_KEYWORD or + param.default != param.empty + for param in params + ) + + +def get_attribute(instance, attrs): + for attr in attrs: + try: + if isinstance(instance, Mapping): + instance = instance[attr] + else: + instance = getattr(instance, attr) +~~ except ObjectDoesNotExist: + return None + if is_simple_callable(instance): + try: + instance = instance() + except (AttributeError, KeyError) as exc: + raise ValueError('Exception raised in callable attribute "{}"; original exception was: {}'.format(attr, exc)) + + return instance + + +def set_value(dictionary, keys, value): + if not keys: + dictionary.update(value) + return + + for key in keys[:-1]: + if key not in dictionary: + dictionary[key] = {} + dictionary = dictionary[key] + + dictionary[keys[-1]] = value + + +def to_choices_dict(choices): + + +## ... source file continues with no further ObjectDoesNotExist examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-permissiondenied.markdown b/content/pages/examples/django/django-core-exceptions-permissiondenied.markdown new file mode 100644 index 000000000..e741da531 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-permissiondenied.markdown @@ -0,0 +1,1120 @@ +title: django.core.exceptions PermissionDenied Example Code +category: page +slug: django-core-exceptions-permissiondenied-examples +sortorder: 500011105 +toc: False +sidebartitle: django.core.exceptions PermissionDenied +meta: Python example code for the PermissionDenied class from the django.core.exceptions module of the Django project. + + +PermissionDenied is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / models.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/models.py) + +```python +# models.py +from __future__ import absolute_import + +from django.contrib.auth import authenticate +from django.contrib.sites.models import Site +from django.contrib.sites.shortcuts import get_current_site +~~from django.core.exceptions import PermissionDenied +from django.db import models +from django.utils.crypto import get_random_string +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + +import allauth.app_settings +from allauth.account.models import EmailAddress +from allauth.account.utils import get_next_redirect_url, setup_user_email +from allauth.utils import get_user_model + +from ..utils import get_request_param +from . import app_settings, providers +from .adapter import get_adapter +from .fields import JSONField + + +class SocialAppManager(models.Manager): + def get_current(self, provider, request=None): + cache = {} + if request: + cache = getattr(request, '_socialapp_cache', {}) + request._socialapp_cache = cache + app = cache.get(provider) + if not app: + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + def get_redirect_url(self, request): + url = self.state.get('next') + return url + + @classmethod + def state_from_request(cls, request): + state = {} + next_url = get_next_redirect_url(request) + if next_url: + state['next'] = next_url + state['process'] = get_request_param(request, 'process', 'login') + state['scope'] = get_request_param(request, 'scope', '') + state['auth_params'] = get_request_param(request, 'auth_params', '') + return state + + @classmethod + def stash_state(cls, request): + state = cls.state_from_request(request) + verifier = get_random_string() + request.session['socialaccount_state'] = (state, verifier) + return verifier + + @classmethod + def unstash_state(cls, request): + if 'socialaccount_state' not in request.session: +~~ raise PermissionDenied() + state, verifier = request.session.pop('socialaccount_state') + return state + + @classmethod + def verify_and_unstash_state(cls, request, verifier): + if 'socialaccount_state' not in request.session: +~~ raise PermissionDenied() + state, verifier2 = request.session.pop('socialaccount_state') + if verifier != verifier2: +~~ raise PermissionDenied() + return state + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 2 from django-axes +[django-axes](https://github.com/jazzband/django-axes/) +([project documentation](https://django-axes.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-axes/) +is a code library for [Django](/django.html) projects to track failed +login attempts against a web application. The goal of the project is +to make it easier for you to stop people and scripts from hacking your +Django-powered website. + +The code for django-axes is +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) +and maintained by the group of developers known as +[Jazzband](https://jazzband.co/). + +[**django-axes / axes / exceptions.py**](https://github.com/jazzband/django-axes/blob/master/axes/./exceptions.py) + +```python +# exceptions.py +~~from django.core.exceptions import PermissionDenied + + +~~class AxesBackendPermissionDenied(PermissionDenied): + + +class AxesBackendRequestParameterRequired(ValueError): + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 3 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / api.py**](https://github.com/divio/django-cms/blob/develop/cms/./api.py) + +```python +# api.py +import datetime + +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +from django.core.exceptions import FieldError +~~from django.core.exceptions import PermissionDenied +from django.core.exceptions import ValidationError +from django.db import transaction +from django.template.defaultfilters import slugify +from django.template.loader import get_template +from django.utils.translation import activate + +from six import string_types + +from cms import constants +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from cms.constants import TEMPLATE_INHERITANCE_MAGIC +from cms.models.pagemodel import Page +from cms.models.permissionmodels import (PageUser, PagePermission, GlobalPagePermission, + ACCESS_PAGE_AND_DESCENDANTS) +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.models.titlemodels import Title +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool +from cms.utils import copy_plugins, get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_list +from cms.utils.page import get_available_slug + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + 'can_add': can_add or grant_all, + 'can_change': can_change or grant_all, + 'can_delete': can_delete or grant_all, + 'can_change_advanced_settings': can_change_advanced_settings or grant_all, + 'can_publish': can_publish or grant_all, + 'can_change_permissions': can_change_permissions or grant_all, + 'can_move_page': can_move_page or grant_all, + 'can_view': can_view or grant_all, + } + + page_permission = PagePermission(page=page, user=user, + grant_on=grant_on, **data) + page_permission.save() + if global_permission: + page_permission = GlobalPagePermission( + user=user, can_recover_page=can_recover_page, **data) + page_permission.save() + page_permission.sites.add(get_current_site()) + return page_permission + + +def publish_page(page, user, language): + page = page.reload() + + if not page.has_publish_permission(user): +~~ raise PermissionDenied() + with current_user(user.get_username()): + page.publish(language) + return page.reload() + + +def publish_pages(include_unpublished=False, language=None, site=None): + qs = Page.objects.drafts() + + if not include_unpublished: + qs = qs.filter(title_set__published=True).distinct() + + if site: + qs = qs.filter(node__site=site) + + output_language = None + for i, page in enumerate(qs): + add = True + titles = page.title_set + if not include_unpublished: + titles = titles.filter(published=True) + for lang in titles.values_list("language", flat=True): + if language is None or lang == language: + if not output_language: + output_language = lang + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 4 from django-downloadview +[django-downloadview](https://github.com/benoitbryon/django-downloadview) +([project documentation](https://django-downloadview.readthedocs.io/en/1.9/) +and +[PyPI package information](https://pypi.org/project/django-downloadview/)) +is a [Django](/django.html) extension for serving downloads through your +web application. While typically you would use a web server to handle +[static content](/static-content.html), sometimes you need to control +file access, such as requiring a user to register before downloading a +PDF. In that situations, django-downloadview is a handy library to avoid +boilerplate code for common scenarios. + +[**django-downloadview / django_downloadview / decorators.py**](https://github.com/benoitbryon/django-downloadview/blob/master/django_downloadview/./decorators.py) + +```python +# decorators.py + +from functools import wraps + +from django.conf import settings +~~from django.core.exceptions import PermissionDenied +from django.core.signing import BadSignature, SignatureExpired, TimestampSigner + + +class DownloadDecorator(object): + + def __init__(self, middleware_factory): + self.middleware_factory = middleware_factory + + def __call__(self, view_func, *middleware_args, **middleware_kwargs): + + def decorated(request, *view_args, **view_kwargs): + response = view_func(request, *view_args, **view_kwargs) + middleware = self.middleware_factory(*middleware_args, **middleware_kwargs) + return middleware.process_response(request, response) + + return decorated + + +def _signature_is_valid(request): + + signer = TimestampSigner() + signature = request.GET.get("X-Signature") + expiration = getattr(settings, "DOWNLOADVIEW_URL_EXPIRATION", None) + + try: + signature_path = signer.unsign(signature, max_age=expiration) + except SignatureExpired as e: +~~ raise PermissionDenied("Signature expired") from e + except BadSignature as e: +~~ raise PermissionDenied("Signature invalid") from e + except Exception as e: +~~ raise PermissionDenied("Signature error") from e + + if request.path != signature_path: +~~ raise PermissionDenied("Signature mismatch") + + +def signature_required(function): + + @wraps(function) + def decorator(request, *args, **kwargs): + _signature_is_valid(request) + return function(request, *args, **kwargs) + + return decorator + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 5 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / tools.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/tools.py) + +```python +# tools.py +from __future__ import absolute_import, unicode_literals + +from django.contrib.admin.options import IS_POPUP_VAR +~~from django.core.exceptions import PermissionDenied +from django.utils.http import urlencode + + +ALLOWED_PICK_TYPES = ('folder', 'file') + + +def check_files_edit_permissions(request, files): + for f in files: + if not f.has_edit_permission(request): +~~ raise PermissionDenied + + +def check_folder_edit_permissions(request, folders): + for f in folders: + if not f.has_edit_permission(request): +~~ raise PermissionDenied + check_files_edit_permissions(request, f.files) + check_folder_edit_permissions(request, f.children.all()) + + +def check_files_read_permissions(request, files): + for f in files: + if not f.has_read_permission(request): +~~ raise PermissionDenied + + +def check_folder_read_permissions(request, folders): + for f in folders: + if not f.has_read_permission(request): +~~ raise PermissionDenied + check_files_read_permissions(request, f.files) + check_folder_read_permissions(request, f.children.all()) + + +def userperms_for_request(item, request): + r = [] + ps = ['read', 'edit', 'add_children'] + for p in ps: + attr = "has_%s_permission" % p + if hasattr(item, attr): + x = getattr(item, attr)(request) + if x: + r.append(p) + return r + + +def popup_status(request): + return ( + IS_POPUP_VAR in request.GET + or 'pop' in request.GET + or IS_POPUP_VAR in request.POST + or 'pop' in request.POST + ) + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 6 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / mixins.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/./mixins.py) + +```python +# mixins.py +from collections.abc import Iterable + +from django.conf import settings +from django.contrib.auth.decorators import login_required, REDIRECT_FIELD_NAME +~~from django.core.exceptions import ImproperlyConfigured, PermissionDenied +from guardian.utils import get_user_obj_perms_model +UserObjectPermission = get_user_obj_perms_model() +from guardian.utils import get_40x_or_None, get_anonymous_user +from guardian.shortcuts import get_objects_for_user + + +class LoginRequiredMixin: + redirect_field_name = REDIRECT_FIELD_NAME + login_url = settings.LOGIN_URL + + def dispatch(self, request, *args, **kwargs): + return login_required(redirect_field_name=self.redirect_field_name, + login_url=self.login_url)( + super().dispatch + )(request, *args, **kwargs) + + +class PermissionRequiredMixin: + login_url = settings.LOGIN_URL + permission_required = None + redirect_field_name = REDIRECT_FIELD_NAME + return_403 = False + return_404 = False + raise_exception = False + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + % self.permission_required) + return perms + + def get_permission_object(self): + if hasattr(self, 'permission_object'): + return self.permission_object + return (hasattr(self, 'get_object') and self.get_object() or + getattr(self, 'object', None)) + + def check_permissions(self, request): + obj = self.get_permission_object() + + forbidden = get_40x_or_None(request, + perms=self.get_required_permissions( + request), + obj=obj, + login_url=self.login_url, + redirect_field_name=self.redirect_field_name, + return_403=self.return_403, + return_404=self.return_404, + accept_global_perms=self.accept_global_perms + ) + if forbidden: + self.on_permission_check_fail(request, forbidden, obj=obj) + if forbidden and self.raise_exception: +~~ raise PermissionDenied() + return forbidden + + def on_permission_check_fail(self, request, response, obj=None): + + def dispatch(self, request, *args, **kwargs): + self.request = request + self.args = args + self.kwargs = kwargs + response = self.check_permissions(request) + if response: + return response + return super().dispatch(request, *args, **kwargs) + + +class GuardianUserMixin: + + @staticmethod + def get_anonymous(): + return get_anonymous_user() + + def add_obj_perm(self, perm, obj): + return UserObjectPermission.objects.assign_perm(perm, self, obj) + + def del_obj_perm(self, perm, obj): + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 7 from django-haystack +[django-haystack](https://github.com/django-haystack/django-haystack) +([project website](http://haystacksearch.org/) and +[PyPI page](https://pypi.org/project/django-haystack/)) +is a search abstraction layer that separates the Python search code +in a [Django](/django.html) web application from the search engine +implementation that it runs on, such as +[Apache Solr](http://lucene.apache.org/solr/), +[Elasticsearch](https://www.elastic.co/) +or [Whoosh](https://whoosh.readthedocs.io/en/latest/intro.html). + +The django-haystack project is open source under the +[BSD license](https://github.com/django-haystack/django-haystack/blob/master/LICENSE). + +[**django-haystack / haystack / admin.py**](https://github.com/django-haystack/django-haystack/blob/master/haystack/./admin.py) + +```python +# admin.py +from django.contrib.admin.options import ModelAdmin, csrf_protect_m +from django.contrib.admin.views.main import SEARCH_VAR, ChangeList +~~from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +from django.shortcuts import render +from django.utils.encoding import force_str +from django.utils.translation import ungettext + +from haystack import connections +from haystack.constants import DEFAULT_ALIAS +from haystack.query import SearchQuerySet +from haystack.utils import get_model_ct_tuple + + +class SearchChangeList(ChangeList): + def __init__(self, **kwargs): + self.haystack_connection = kwargs.pop("haystack_connection", DEFAULT_ALIAS) + super(SearchChangeList, self).__init__(**kwargs) + + def get_results(self, request): + if SEARCH_VAR not in request.GET: + return super(SearchChangeList, self).get_results(request) + + sqs = ( + SearchQuerySet(self.haystack_connection) + .models(self.model) + .auto_query(request.GET[SEARCH_VAR]) + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + ) + + can_show_all = result_count <= self.list_max_show_all + multi_page = result_count > self.list_per_page + + try: + result_list = paginator.page(self.page_num + 1).object_list + result_list = [result.object for result in result_list] + except InvalidPage: + result_list = () + + self.result_count = result_count + self.full_result_count = full_result_count + self.result_list = result_list + self.can_show_all = can_show_all + self.multi_page = multi_page + self.paginator = paginator + + +class SearchModelAdminMixin(object): + haystack_connection = DEFAULT_ALIAS + + @csrf_protect_m + def changelist_view(self, request, extra_context=None): + if not self.has_change_permission(request, None): +~~ raise PermissionDenied + + if SEARCH_VAR not in request.GET: + return super(SearchModelAdminMixin, self).changelist_view( + request, extra_context + ) + + indexed_models = ( + connections[self.haystack_connection] + .get_unified_index() + .get_indexed_models() + ) + + if self.model not in indexed_models: + return super(SearchModelAdminMixin, self).changelist_view( + request, extra_context + ) + + list_display = list(self.list_display) + + kwargs = { + "haystack_connection": self.haystack_connection, + "request": request, + "model": self.model, + "list_display": list_display, + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 8 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / admin.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./admin.py) + +```python +# admin.py +from datetime import datetime + +import django +from django import forms +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.contrib.admin.models import ADDITION, CHANGE, DELETION, LogEntry +from django.contrib.auth import get_permission_codename +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import PermissionDenied +from django.http import HttpResponse, HttpResponseRedirect +from django.template.response import TemplateResponse +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.utils.encoding import force_str +from django.utils.module_loading import import_string +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.http import require_POST + +from .formats.base_formats import DEFAULT_FORMATS +from .forms import ConfirmImportForm, ExportForm, ImportForm, export_action_form_factory +from .resources import modelresource_factory +from .results import RowResult +from .signals import post_export, post_import +from .tmp_storages import TempFolderStorage + +SKIP_ADMIN_LOG = getattr(settings, 'IMPORT_EXPORT_SKIP_ADMIN_LOG', False) +TMP_STORAGE_CLASS = getattr(settings, 'IMPORT_EXPORT_TMP_STORAGE_CLASS', + TempFolderStorage) + + +if isinstance(TMP_STORAGE_CLASS, str): + TMP_STORAGE_CLASS = import_string(TMP_STORAGE_CLASS) + + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + name='%s_%s_import' % info), + ] + return my_urls + urls + + def get_resource_kwargs(self, request, *args, **kwargs): + return {} + + def get_import_resource_kwargs(self, request, *args, **kwargs): + return self.get_resource_kwargs(request, *args, **kwargs) + + def get_resource_class(self): + if not self.resource_class: + return modelresource_factory(self.model) + else: + return self.resource_class + + def get_import_resource_class(self): + return self.get_resource_class() + + def get_import_formats(self): + return [f for f in self.formats if f().can_import()] + + @method_decorator(require_POST) + def process_import(self, request, *args, **kwargs): + if not self.has_import_permission(request): +~~ raise PermissionDenied + + form_type = self.get_confirm_import_form() + confirm_form = form_type(request.POST) + if confirm_form.is_valid(): + import_formats = self.get_import_formats() + input_format = import_formats[ + int(confirm_form.cleaned_data['input_format']) + ]() + tmp_storage = self.get_tmp_storage_class()(name=confirm_form.cleaned_data['import_file_name']) + data = tmp_storage.read(input_format.get_read_mode()) + if not input_format.is_binary() and self.from_encoding: + data = force_str(data, self.from_encoding) + dataset = input_format.create_dataset(data) + + result = self.process_dataset(dataset, confirm_form, request, *args, **kwargs) + + tmp_storage.remove() + + return self.process_result(result, request) + + def process_dataset(self, dataset, confirm_form, request, *args, **kwargs): + + res_kwargs = self.get_import_resource_kwargs(request, form=confirm_form, *args, **kwargs) + resource = self.get_import_resource_class()(**res_kwargs) + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + + def get_confirm_import_form(self): + return ConfirmImportForm + + def get_form_kwargs(self, form, *args, **kwargs): + return kwargs + + def get_import_data_kwargs(self, request, *args, **kwargs): + form = kwargs.get('form') + if form: + kwargs.pop('form') + return kwargs + return {} + + def write_to_tmp_storage(self, import_file, input_format): + tmp_storage = self.get_tmp_storage_class()() + data = bytes() + for chunk in import_file.chunks(): + data += chunk + + tmp_storage.save(data, input_format.get_read_mode()) + return tmp_storage + + def import_action(self, request, *args, **kwargs): + if not self.has_import_permission(request): +~~ raise PermissionDenied + + context = self.get_import_context_data() + + import_formats = self.get_import_formats() + form_type = self.get_import_form() + form_kwargs = self.get_form_kwargs(form_type, *args, **kwargs) + form = form_type(import_formats, + request.POST or None, + request.FILES or None, + **form_kwargs) + + if request.POST and form.is_valid(): + input_format = import_formats[ + int(form.cleaned_data['input_format']) + ]() + import_file = form.cleaned_data['import_file'] + tmp_storage = self.write_to_tmp_storage(import_file, input_format) + + try: + data = tmp_storage.read(input_format.get_read_mode()) + if not input_format.is_binary() and self.from_encoding: + data = force_str(data, self.from_encoding) + dataset = input_format.create_dataset(data) + except UnicodeDecodeError as e: + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + + ChangeList = self.get_changelist(request) + changelist_kwargs = { + 'request': request, + 'model': self.model, + 'list_display': list_display, + 'list_display_links': list_display_links, + 'list_filter': list_filter, + 'date_hierarchy': self.date_hierarchy, + 'search_fields': search_fields, + 'list_select_related': self.list_select_related, + 'list_per_page': self.list_per_page, + 'list_max_show_all': self.list_max_show_all, + 'list_editable': self.list_editable, + 'model_admin': self, + } + if django.VERSION >= (2, 1): + changelist_kwargs['sortable_by'] = self.sortable_by + cl = ChangeList(**changelist_kwargs) + + return cl.get_queryset(request) + + def get_export_data(self, file_format, queryset, *args, **kwargs): + request = kwargs.pop("request") + if not self.has_export_permission(request): +~~ raise PermissionDenied + + resource_class = self.get_export_resource_class() + data = resource_class(**self.get_export_resource_kwargs(request)).export(queryset, *args, **kwargs) + export_data = file_format.export_data(data) + return export_data + + def get_export_context_data(self, **kwargs): + return self.get_context_data(**kwargs) + + def get_context_data(self, **kwargs): + return {} + + def export_action(self, request, *args, **kwargs): + if not self.has_export_permission(request): +~~ raise PermissionDenied + + formats = self.get_export_formats() + form = ExportForm(formats, request.POST or None) + if form.is_valid(): + file_format = formats[ + int(form.cleaned_data['file_format']) + ]() + + queryset = self.get_export_queryset(request) + export_data = self.get_export_data(file_format, queryset, request=request) + content_type = file_format.get_content_type() + response = HttpResponse(export_data, content_type=content_type) + response['Content-Disposition'] = 'attachment; filename="%s"' % ( + self.get_export_filename(request, queryset, file_format), + ) + + post_export.send(sender=None, model=self.model) + return response + + context = self.get_export_context_data() + + context.update(self.admin_site.each_context(request)) + + context['title'] = _("Export") + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 9 from django-loginas +[django-loginas](https://github.com/skorokithakis/django-loginas) +([PyPI package information](https://pypi.org/project/django-loginas/)) +is [Django](/django.html) code library for admins to log into an application +as another user, typically for debugging purposes. + +django-loginas is open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/skorokithakis/django-loginas/blob/master/LICENSE). + +[**django-loginas / loginas / views.py**](https://github.com/skorokithakis/django-loginas/blob/master/loginas/./views.py) + +```python +# views.py +from django.contrib import messages +from django.contrib.admin.utils import unquote +~~from django.core.exceptions import ImproperlyConfigured, PermissionDenied +from django.shortcuts import redirect +from django.utils.translation import gettext_lazy as _ +from django.views.decorators.csrf import csrf_protect +from django.views.decorators.http import require_POST + +from . import settings as la_settings +from .utils import login_as, restore_original_login + +try: + from importlib import import_module +except ImportError: + from django.utils.importlib import import_module # type: ignore + + +try: + from django.contrib.auth import get_user_model + + User = get_user_model() +except ImportError: + from django.contrib.auth.models import User # type: ignore + + +def _load_module(path): + + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + except ValueError: + raise ImproperlyConfigured("Error importing CAN_LOGIN_AS" " function. Is CAN_LOGIN_AS a" " string?") + + try: + can_login_as = getattr(mod, attr) + except AttributeError: + raise ImproperlyConfigured("Module {0} does not define a {1} " "function.".format(module, attr)) + return can_login_as + + +@csrf_protect +@require_POST +def user_login(request, user_id): + user = User.objects.get(pk=unquote(user_id)) + + if isinstance(la_settings.CAN_LOGIN_AS, str): + can_login_as = _load_module(la_settings.CAN_LOGIN_AS) + elif hasattr(la_settings.CAN_LOGIN_AS, "__call__"): + can_login_as = la_settings.CAN_LOGIN_AS + else: + raise ImproperlyConfigured("The CAN_LOGIN_AS setting is neither a valid module nor callable.") + no_permission_error = None + try: + if not can_login_as(request, user): + no_permission_error = _("You do not have permission to do that.") +~~ except PermissionDenied as e: + no_permission_error = str(e) + if no_permission_error is not None: + messages.error(request, no_permission_error, extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) + return redirect(request.META.get("HTTP_REFERER", "/")) + + try: + login_as(user, request) + except ImproperlyConfigured as e: + messages.error(request, str(e), extra_tags=la_settings.MESSAGE_EXTRA_TAGS, fail_silently=True) + return redirect(request.META.get("HTTP_REFERER", "/")) + + return redirect(la_settings.LOGIN_REDIRECT) + + +def user_logout(request): + restore_original_login(request) + + return redirect(la_settings.LOGOUT_REDIRECT) + + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 10 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / metadata.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./metadata.py) + +```python +# metadata.py +from collections import OrderedDict + +~~from django.core.exceptions import PermissionDenied +from django.http import Http404 +from django.utils.encoding import force_str + +from rest_framework import exceptions, serializers +from rest_framework.request import clone_request +from rest_framework.utils.field_mapping import ClassLookupDict + + +class BaseMetadata: + def determine_metadata(self, request, view): + raise NotImplementedError(".determine_metadata() must be overridden.") + + +class SimpleMetadata(BaseMetadata): + label_lookup = ClassLookupDict({ + serializers.Field: 'field', + serializers.BooleanField: 'boolean', + serializers.NullBooleanField: 'boolean', + serializers.CharField: 'string', + serializers.UUIDField: 'string', + serializers.URLField: 'url', + serializers.EmailField: 'email', + serializers.RegexField: 'regex', + serializers.SlugField: 'slug', + + +## ... source file continues with no further PermissionDenied examples... + +``` + + +## Example 11 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / admin / auth.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/admin/auth.py) + +```python +# auth.py +import types +from functools import wraps + +import l18n + +from django.contrib.auth import get_user_model +from django.contrib.auth.views import redirect_to_login as auth_redirect_to_login +~~from django.core.exceptions import PermissionDenied +from django.db.models import Q +from django.shortcuts import redirect +from django.urls import reverse +from django.utils.timezone import activate as activate_tz +from django.utils.translation import gettext as _ +from django.utils.translation import override + +from wagtail.admin import messages +from wagtail.core.models import GroupPagePermission + + +def users_with_page_permission(page, permission_type, include_superusers=True): + User = get_user_model() + + ancestors_and_self = list(page.get_ancestors()) + [page] + perm = GroupPagePermission.objects.filter(permission_type=permission_type, page__in=ancestors_and_self) + q = Q(groups__page_permissions__in=perm) + + if include_superusers: + q |= Q(is_superuser=True) + + return User.objects.filter(is_active=True).filter(q).distinct() + + +def permission_denied(request): + if request.is_ajax(): +~~ raise PermissionDenied + + from wagtail.admin import messages + + messages.error(request, _('Sorry, you do not have permission to access this area.')) + return redirect('wagtailadmin_home') + + +def user_passes_test(test): + def decorator(view_func): + + @wraps(view_func) + def wrapped_view_func(request, *args, **kwargs): + if test(request.user): + return view_func(request, *args, **kwargs) + else: + return permission_denied(request) + + return wrapped_view_func + + return decorator + + +def permission_required(permission_name): + def test(user): + + +## ... source file abbreviated to get to PermissionDenied examples ... + + + return user_passes_test(test) + + def require_any(self, *actions): + def test(user): + return self.policy.user_has_any_permission(user, actions) + + return user_passes_test(test) + + +def user_has_any_page_permission(user): + if not user.is_active: + return False + + if user.is_superuser: + return True + + if GroupPagePermission.objects.filter(group__in=user.groups.all()).exists(): + return True + + + return False + + +def reject_request(request): + if request.is_ajax(): +~~ raise PermissionDenied + + return auth_redirect_to_login( + request.get_full_path(), login_url=reverse('wagtailadmin_login')) + + +def require_admin_access(view_func): + def decorated_view(request, *args, **kwargs): + + user = request.user + + if user.is_anonymous: + return reject_request(request) + + if user.has_perms(['wagtailadmin.access_admin']): + preferred_language = None + if hasattr(user, 'wagtail_userprofile'): + preferred_language = user.wagtail_userprofile.get_preferred_language() + l18n.set_language(preferred_language) + time_zone = user.wagtail_userprofile.get_current_time_zone() + activate_tz(time_zone) + if preferred_language: + with override(preferred_language): + response = view_func(request, *args, **kwargs) + if hasattr(response, "render"): + + +## ... source file continues with no further PermissionDenied examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown b/content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown new file mode 100644 index 000000000..a660aef52 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-suspiciousfileoperation.markdown @@ -0,0 +1,73 @@ +title: django.core.exceptions SuspiciousFileOperation Example Code +category: page +slug: django-core-exceptions-suspiciousfileoperation-examples +sortorder: 500011106 +toc: False +sidebartitle: django.core.exceptions SuspiciousFileOperation +meta: Python example code for the SuspiciousFileOperation class from the django.core.exceptions module of the Django project. + + +SuspiciousFileOperation is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-markdown-view +[django-markdown-view](https://github.com/rgs258/django-markdown-view) +([PyPI package information](https://pypi.org/project/django-markdown-view/)) +is a Django extension for serving [Markdown](/markdown.html) files as +[Django templates](/django-templates.html). The project is open +sourced under the +[BSD 3-Clause "New" or "Revised" license](https://github.com/rgs258/django-markdown-view/blob/master/LICENSE). + +[**django-markdown-view / markdown_view / loaders.py**](https://github.com/rgs258/django-markdown-view/blob/master/markdown_view/./loaders.py) + +```python +# loaders.py +from django.conf import settings +~~from django.core.exceptions import SuspiciousFileOperation +from django.template import Origin +from django.template.loaders.filesystem import Loader as FilesystemLoader +from django.template.utils import get_app_template_dirs +from django.utils._os import safe_join + + +class MarkdownLoader(FilesystemLoader): + + def get_dirs(self): + base_dir = getattr( + settings, + "MARKDOWN_VIEW_BASE_DIR", + getattr( + settings, + "BASE_DIR", + None) + ) + dirs = [*get_app_template_dirs('')] + if base_dir: + dirs.extend([base_dir]) + return dirs + + def get_template_sources(self, template_name): + if template_name.endswith('.md'): + template_split = template_name.split("/") + template_split.reverse() + template_app_dir = template_split.pop() + template_split.reverse() + for template_dir in self.get_dirs(): + if template_dir.endswith(template_app_dir): + try: + name = safe_join(template_dir, *template_split) +~~ except SuspiciousFileOperation: + continue + + yield Origin( + name=name, + template_name=template_name, + loader=self, + ) + + + +## ... source file continues with no further SuspiciousFileOperation examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown b/content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown new file mode 100644 index 000000000..c1ce0e7a4 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-suspiciousmultipartform.markdown @@ -0,0 +1,56 @@ +title: django.core.exceptions SuspiciousMultipartForm Example Code +category: page +slug: django-core-exceptions-suspiciousmultipartform-examples +sortorder: 500011107 +toc: False +sidebartitle: django.core.exceptions SuspiciousMultipartForm +meta: Python example code for the SuspiciousMultipartForm class from the django.core.exceptions module of the Django project. + + +SuspiciousMultipartForm is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / views / upload.py**](https://github.com/jrief/django-angular/blob/master/djng/views/upload.py) + +```python +# upload.py +~~from django.core.exceptions import SuspiciousMultipartForm +from django.core import signing +from django.views.generic import View +from django.http import JsonResponse + +from djng import app_settings +from djng.forms.fields import FileField, ImageField + + +class FileUploadView(View): + storage = app_settings.upload_storage + thumbnail_size = app_settings.THUMBNAIL_OPTIONS + signer = signing.Signer() + + def post(self, request, *args, **kwargs): + if request.POST.get('filetype') == 'file': + field = FileField + elif request.POST.get('filetype') == 'image': + field = ImageField + else: +~~ raise SuspiciousMultipartForm("Missing attribute 'filetype' in form data.") + data = {} + for name, file_obj in request.FILES.items(): + data[name] = field.preview(file_obj) + return JsonResponse(data) + + + +## ... source file continues with no further SuspiciousMultipartForm examples... + +``` + diff --git a/content/pages/examples/django/django-core-exceptions-validationerror.markdown b/content/pages/examples/django/django-core-exceptions-validationerror.markdown new file mode 100644 index 000000000..8c255d787 --- /dev/null +++ b/content/pages/examples/django/django-core-exceptions-validationerror.markdown @@ -0,0 +1,2128 @@ +title: django.core.exceptions ValidationError Example Code +category: page +slug: django-core-exceptions-validationerror-examples +sortorder: 500011108 +toc: False +sidebartitle: django.core.exceptions ValidationError +meta: Python example code for the ValidationError class from the django.core.exceptions module of the Django project. + + +ValidationError is a class within the django.core.exceptions module of the Django project. + + +## Example 1 from AuditLog +[Auditlog](https://github.com/jjkester/django-auditlog) +([project documentation](https://django-auditlog.readthedocs.io/en/latest/)) +is a [Django](/django.html) app that logs changes to Python objects, +similar to the Django admin's logs but with more details and +output formats. Auditlog's source code is provided as open source under the +[MIT license](https://github.com/jjkester/django-auditlog/blob/master/LICENSE). + +[**AuditLog / src / auditlog_tests / tests.py**](https://github.com/jjkester/django-auditlog/blob/master/src/auditlog_tests/tests.py) + +```python +# tests.py +import datetime +import django +from django.conf import settings +from django.contrib import auth +from django.contrib.auth.models import User, AnonymousUser +~~from django.core.exceptions import ValidationError +from django.db.models.signals import pre_save +from django.http import HttpResponse +from django.test import TestCase, RequestFactory +from django.utils import dateformat, formats, timezone +from dateutil.tz import gettz + +from auditlog.middleware import AuditlogMiddleware +from auditlog.models import LogEntry +from auditlog.registry import auditlog +from auditlog_tests.models import SimpleModel, AltPrimaryKeyModel, UUIDPrimaryKeyModel, \ + ProxyModel, SimpleIncludeModel, SimpleExcludeModel, SimpleMappingModel, RelatedModel, \ + ManyRelatedModel, AdditionalDataIncludedModel, DateTimeFieldModel, ChoicesFieldModel, \ + CharfieldTextfieldModel, PostgresArrayFieldModel, NoDeleteHistoryModel +from auditlog import compat + + +class SimpleModelTest(TestCase): + def setUp(self): + self.obj = SimpleModel.objects.create(text='I am not difficult.') + + def test_create(self): + obj = self.obj + + self.assertTrue(obj.history.count() == 1, msg="There is one log entry") + + +## ... source file abbreviated to get to ValidationError examples ... + + + def test_request(self): + request = self.factory.get('/') + request.user = self.user + self.middleware.process_request(request) + + self.assertTrue(pre_save.has_listeners(LogEntry)) + + self.middleware.process_exception(request, None) + + def test_response(self): + request = self.factory.get('/') + request.user = self.user + + self.middleware.process_request(request) + self.assertTrue(pre_save.has_listeners(LogEntry)) # The signal should be present before trying to disconnect it. + self.middleware.process_response(request, HttpResponse()) + + self.assertFalse(pre_save.has_listeners(LogEntry)) + + def test_exception(self): + request = self.factory.get('/') + request.user = self.user + + self.middleware.process_request(request) + self.assertTrue(pre_save.has_listeners(LogEntry)) # The signal should be present before trying to disconnect it. +~~ self.middleware.process_exception(request, ValidationError("Test")) + + self.assertFalse(pre_save.has_listeners(LogEntry)) + + +class SimpeIncludeModelTest(TestCase): + + def test_register_include_fields(self): + sim = SimpleIncludeModel(label='Include model', text='Looong text') + sim.save() + self.assertTrue(sim.history.count() == 1, msg="There is one log entry") + + sim.label = 'Changed label' + sim.save() + self.assertTrue(sim.history.count() == 2, msg="There are two log entries") + + sim.text = 'Short text' + sim.save() + self.assertTrue(sim.history.count() == 2, msg="There are two log entries") + + +class SimpeExcludeModelTest(TestCase): + + def test_register_exclude_fields(self): + sem = SimpleExcludeModel(label='Exclude model', text='Looong text') + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 2 from dccnsys +[dccnsys](https://github.com/dccnconf/dccnsys) is a conference registration +system built with [Django](/django.html). The code is open source under the +[MIT license](https://github.com/dccnconf/dccnsys/blob/master/LICENSE). + +[**dccnsys / wwwdccn / chair_mail / forms.py**](https://github.com/dccnconf/dccnsys/blob/master/wwwdccn/chair_mail/forms.py) + +```python +# forms.py +from django import forms +from django.conf import settings +~~from django.core.exceptions import ValidationError +from django.core.mail import send_mail +from django.template import Template, Context +from django.utils import timezone +from html2text import html2text +from markdown import markdown + +from chair_mail.context import get_conference_context, get_user_context, \ + get_submission_context +from chair_mail.mailing_lists import find_list +from chair_mail.utility import get_object_model +from submissions.models import Submission +from users.models import User +from .models import EmailFrame, MSG_TYPE_USER, MSG_TYPE_SUBMISSION, \ + SystemNotification + + +def parse_mailing_lists(names_string, separator=','): + names = names_string.split(separator) + names = [name for name in names if name.strip()] + return [find_list(name) for name in names] + + +def parse_objects(obj_class, pks_string, separator=','): + int_pks = [s for s in pks_string.split(separator) if s.strip()] + + +## ... source file abbreviated to get to ValidationError examples ... + + + from_email=settings.DEFAULT_FROM_EMAIL, + recipient_list=[user.email], + html_message=html, + ) + + +class MessageForm(forms.Form): + subject = forms.CharField() + body = forms.CharField(widget=forms.Textarea(), required=False) + lists = forms.CharField( + required=False, max_length=1000, widget=forms.HiddenInput) + objects = forms.CharField( + required=False, max_length=10000, widget=forms.HiddenInput) + + def __init__(self, *args, msg_type=None, **kwargs): + super().__init__(*args, **kwargs) + self.msg_type = msg_type + self.object_type = get_object_model(msg_type) + self.cleaned_lists = [] + self.cleaned_objects = [] + + def clean_lists(self): + _lists = parse_mailing_lists(self.cleaned_data['lists']) + for ml in _lists: + if ml.type != self.msg_type: +~~ raise ValidationError( + f'unexpected {ml.type} mailing list {ml.name}') + self.cleaned_lists = _lists + return self.cleaned_data['lists'] + + def clean_objects(self): + self.cleaned_objects = parse_objects( + self.object_type, self.cleaned_data['objects'], ',') + return self.cleaned_data['objects'] + + def clean(self): + if not self.cleaned_lists and not self.cleaned_objects: +~~ raise ValidationError('You must specify at least one recipient') + return self.cleaned_data + + +class PreviewMessageForm(forms.Form): + subject = forms.CharField( + required=False, + widget=forms.TextInput(attrs={ + 'hidden': True + }) + ) + + body = forms.CharField( + required=False, + widget=forms.Textarea(attrs={ + 'hidden': True + }) + ) + + def get_context(self, conference): + raise NotImplementedError + + def render_html(self, conference): + ctx_data = self.get_context(conference) + context = Context(ctx_data, autoescape=False) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 3 from django-allauth +[django-allauth](https://github.com/pennersr/django-allauth) +([project website](https://www.intenct.nl/projects/django-allauth/)) is a +[Django](/django.html) library for easily adding local and social authentication +flows to Django projects. It is open source under the +[MIT License](https://github.com/pennersr/django-allauth/blob/master/LICENSE). + + +[**django-allauth / allauth / socialaccount / fields.py**](https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/fields.py) + +```python +# fields.py +import json + +import django +~~from django.core.exceptions import ValidationError +from django.db import models + + +class JSONField(models.TextField): + if django.VERSION < (3, 0): + def from_db_value(self, value, expression, connection, context): + return self.to_python(value) + else: + def from_db_value(self, value, expression, connection): + return self.to_python(value) + + def to_python(self, value): + if self.blank and not value: + return None + if isinstance(value, str): + try: + return json.loads(value) + except Exception as e: +~~ raise ValidationError(str(e)) + else: + return value + + def validate(self, value, model_instance): + if isinstance(value, str): + super(JSONField, self).validate(value, model_instance) + try: + json.loads(value) + except Exception as e: +~~ raise ValidationError(str(e)) + + def get_prep_value(self, value): + try: + return json.dumps(value) + except Exception as e: +~~ raise ValidationError(str(e)) + + def value_from_object(self, obj): + val = super(JSONField, self).value_from_object(obj) + return self.get_prep_value(val) + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 4 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / forms / angular_base.py**](https://github.com/jrief/django-angular/blob/master/djng/forms/angular_base.py) + +```python +# angular_base.py +from base64 import b64encode +from collections import UserList +import json +import warnings + +from django.forms import forms +from django.http import QueryDict +from django.utils.html import format_html, format_html_join, escape, conditional_escape +from django.utils.encoding import force_text +from django.utils.module_loading import import_string +from django.utils.safestring import mark_safe, SafeText, SafeData +~~from django.core.exceptions import ValidationError, ImproperlyConfigured + +from .fields import DefaultFieldMixin + + +class SafeTuple(SafeData, tuple): + + +class TupleErrorList(UserList, list): + def __init__(self, initlist=None, error_class=None): + super(TupleErrorList, self).__init__(initlist) + + if error_class is None: + self.error_class = 'errorlist' + else: + self.error_class = 'errorlist {}'.format(error_class) + + def as_data(self): +~~ return ValidationError(self.data).error_list + + def get_json_data(self, escape_html=False): + errors = [] + for error in self.as_data(): + message = list(error)[0] + errors.append({ + 'message': escape(message) if escape_html else message, + 'code': error.code or '', + }) + return errors + + def as_json(self, escape_html=False): + return json.dumps(self.get_json_data(escape_html)) + + def extend(self, iterable): + for item in iterable: + if not isinstance(item, str): + self.append(item) + return None + + def as_ul(self): + if not self: + return SafeText() + first = self[0] + + +## ... source file abbreviated to get to ValidationError examples ... + + + return '' + if isinstance(self[0], tuple): + return '\n'.join(['* %s' % force_text(e[5]) for e in self if bool(e[5])]) + return '\n'.join(['* %s' % force_text(e) for e in self]) + + def __str__(self): + return self.as_ul() + + def __repr__(self): + if self and isinstance(self[0], tuple): + return repr([force_text(e[5]) for e in self]) + return repr([force_text(e) for e in self]) + + def __contains__(self, item): + return item in list(self) + + def __eq__(self, other): + return list(self) == other + + def __ne__(self, other): + return list(self) != other + + def __getitem__(self, i): + error = self.data[i] + if isinstance(error, tuple): +~~ if isinstance(error[5], ValidationError): + error[5] = list(error[5])[0] + return error +~~ if isinstance(error, ValidationError): + return list(error)[0] + return force_text(error) + + +class NgWidgetMixin(object): + def get_context(self, name, value, attrs): + context = super(NgWidgetMixin, self).get_context(name, value, attrs) + if callable(getattr(self._field, 'update_widget_rendering_context', None)): + self._field.update_widget_rendering_context(context) + return context + + +class NgBoundField(forms.BoundField): + @property + def errors(self): + if not hasattr(self, '_errors_cache'): + self._errors_cache = self.form.get_field_errors(self) + return self._errors_cache + + def css_classes(self, extra_classes=None): + if hasattr(extra_classes, 'split'): + extra_classes = extra_classes.split() + extra_classes = set(extra_classes or []) + field_css_classes = getattr(self.form, 'field_css_classes', None) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 5 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / api.py**](https://github.com/divio/django-cms/blob/develop/cms/./api.py) + +```python +# api.py +import datetime + +from django.contrib.auth import get_user_model +from django.contrib.sites.models import Site +from django.core.exceptions import FieldError +from django.core.exceptions import PermissionDenied +~~from django.core.exceptions import ValidationError +from django.db import transaction +from django.template.defaultfilters import slugify +from django.template.loader import get_template +from django.utils.translation import activate + +from six import string_types + +from cms import constants +from cms.app_base import CMSApp +from cms.apphook_pool import apphook_pool +from cms.constants import TEMPLATE_INHERITANCE_MAGIC +from cms.models.pagemodel import Page +from cms.models.permissionmodels import (PageUser, PagePermission, GlobalPagePermission, + ACCESS_PAGE_AND_DESCENDANTS) +from cms.models.placeholdermodel import Placeholder +from cms.models.pluginmodel import CMSPlugin +from cms.models.titlemodels import Title +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool +from cms.utils import copy_plugins, get_current_site +from cms.utils.conf import get_cms_setting +from cms.utils.i18n import get_language_list +from cms.utils.page import get_available_slug +from cms.utils.permissions import _thread_locals, current_user + + +## ... source file abbreviated to get to ValidationError examples ... + + + + + + +def _verify_apphook(apphook, namespace): + apphook_pool.discover_apps() + if isinstance(apphook, CMSApp): + try: + assert apphook.__class__ in [app.__class__ for app in apphook_pool.apps.values()] + except AssertionError: + print(apphook_pool.apps.values()) + raise + apphook_name = apphook.__class__.__name__ + elif hasattr(apphook, '__module__') and issubclass(apphook, CMSApp): + return apphook.__name__ + elif isinstance(apphook, string_types): + try: + assert apphook in apphook_pool.apps + except AssertionError: + print(apphook_pool.apps.values()) + raise + apphook_name = apphook + else: + raise TypeError("apphook must be string or CMSApp instance") + if apphook_pool.apps[apphook_name].app_name and not namespace: +~~ raise ValidationError('apphook with app_name must define a namespace') + return apphook_name + + +def _verify_plugin_type(plugin_type): + if (hasattr(plugin_type, '__module__') and + issubclass(plugin_type, CMSPluginBase)): + plugin_model = plugin_type.model + assert plugin_type in plugin_pool.plugins.values() + plugin_type = plugin_type.__name__ + elif isinstance(plugin_type, string_types): + try: + plugin_model = plugin_pool.get_plugin(plugin_type).model + except KeyError: + raise TypeError( + 'plugin_type must be CMSPluginBase subclass or string' + ) + else: + raise TypeError('plugin_type must be CMSPluginBase subclass or string') + return plugin_model, plugin_type + + + +@transaction.atomic +def create_page(title, template, language, menu_title=None, slug=None, + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 6 from django-extensions +[django-extensions](https://github.com/django-extensions/django-extensions) +([project documentation](https://django-extensions.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-extensions/)) +is a [Django](/django.html) project that adds a bunch of additional +useful commands to the `manage.py` interface. This +[GoDjango video](https://www.youtube.com/watch?v=1F6G3ONhr4k) provides a +quick overview of what you get when you install it into your Python +environment. + +The django-extensions project is open sourced under the +[MIT license](https://github.com/django-extensions/django-extensions/blob/master/LICENSE). + +[**django-extensions / django_extensions / validators.py**](https://github.com/django-extensions/django-extensions/blob/master/django_extensions/./validators.py) + +```python +# validators.py +import unicodedata +import binascii + + +~~from django.core.exceptions import ValidationError +from django.utils.deconstruct import deconstructible +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + + +@deconstructible +class NoControlCharactersValidator: + message = _("Control Characters like new lines or tabs are not allowed.") + code = "no_control_characters" + whitelist = None + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + if whitelist: + self.whitelist = whitelist + + def __call__(self, value): + value = force_str(value) + whitelist = self.whitelist + category = unicodedata.category + for character in value: + if whitelist and character in whitelist: + continue + if category(character)[0] == "C": + params = {'value': value, 'whitelist': whitelist} +~~ raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoControlCharactersValidator) and + (self.whitelist == other.whitelist) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class NoWhitespaceValidator: + message = _("Leading and Trailing whitespaces are not allowed.") + code = "no_whitespace" + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): + value = force_str(value) + if value != value.strip(): + params = {'value': value} +~~ raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoWhitespaceValidator) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class HexValidator: + messages = { + 'invalid': _("Only a hex string is allowed."), + 'length': _("Invalid length. Must be %(length)d characters."), + 'min_length': _("Ensure that there are more than %(min)s characters."), + 'max_length': _("Ensure that there are no more than %(max)s characters."), + } + code = "hex_only" + + def __init__(self, length=None, min_length=None, max_length=None, message=None, code=None): + self.length = length + self.min_length = min_length + self.max_length = max_length + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): + value = force_str(value) + if self.length and len(value) != self.length: +~~ raise ValidationError(self.messages['length'], code='hex_only_length', params={'length': self.length}) + if self.min_length and len(value) < self.min_length: +~~ raise ValidationError(self.messages['min_length'], code='hex_only_min_length', params={'min': self.min_length}) + if self.max_length and len(value) < self.max_length: +~~ raise ValidationError(self.messages['max_length'], code='hex_only_max_length', params={'max': self.max_length}) + + try: + binascii.unhexlify(value) + except (TypeError, binascii.Error): +~~ raise ValidationError(self.messages['invalid'], code='hex_only') + + def __eq__(self, other): + return ( + isinstance(other, HexValidator) and + (self.message == other.message) and + (self.code == other.code) + ) + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 7 from django-filer +[django-filer](https://github.com/divio/django-filer) +([project documentation](https://django-filer.readthedocs.io/en/latest/)) +is a file management library for uploading and organizing files and images +in Django's admin interface. The project's code is available under the +[BSD 3-Clause "New" or "Revised" open source license](https://github.com/divio/django-filer/blob/develop/LICENSE.txt). + +[**django-filer / filer / admin / forms.py**](https://github.com/divio/django-filer/blob/develop/filer/admin/forms.py) + +```python +# forms.py +from __future__ import absolute_import + +from django import forms +from django.conf import settings +from django.contrib.admin import widgets +~~from django.core.exceptions import ValidationError +from django.db import models +from django.utils.translation import ugettext as _ + +from ..models import ThumbnailOption +from ..utils.files import get_valid_filename + + +class AsPWithHelpMixin(object): + def as_p_with_help(self): + "Returns this form rendered as HTML

    s with help text formated for admin." + return self._html_output( + normal_row='%(label)s %(field)s

    %(help_text)s', + error_row='%s', + row_ender='

    ', + help_text_html='

    %s

    ', + errors_on_separate_row=True) + + +class CopyFilesAndFoldersForm(forms.Form, AsPWithHelpMixin): + suffix = forms.CharField(required=False, help_text=_("Suffix which will be appended to filenames of copied files.")) + + def clean_suffix(self): + valid = get_valid_filename(self.cleaned_data['suffix']) + if valid != self.cleaned_data['suffix']: + + +## ... source file abbreviated to get to ValidationError examples ... + + + } + except KeyError as e: + raise forms.ValidationError(_('Unknown rename format value key "%(key)s".') % {'key': e.args[0]}) + except Exception as e: + raise forms.ValidationError(_('Invalid rename format: %(error)s.') % {'error': e}) + return self.cleaned_data['rename_format'] + + +class ResizeImagesForm(forms.Form, AsPWithHelpMixin): + if 'cmsplugin_filer_image' in settings.INSTALLED_APPS: + thumbnail_option = models.ForeignKey( + ThumbnailOption, + null=True, + blank=True, + verbose_name=_("thumbnail option"), + on_delete=models.CASCADE, + ).formfield() + width = models.PositiveIntegerField(_("width"), null=True, blank=True).formfield(widget=widgets.AdminIntegerFieldWidget) + height = models.PositiveIntegerField(_("height"), null=True, blank=True).formfield(widget=widgets.AdminIntegerFieldWidget) + crop = models.BooleanField(_("crop"), default=True).formfield() + upscale = models.BooleanField(_("upscale"), default=True).formfield() + + def clean(self): + if not (self.cleaned_data.get('thumbnail_option') or ((self.cleaned_data.get('width') or 0) + (self.cleaned_data.get('height') or 0))): + if 'cmsplugin_filer_image' in settings.INSTALLED_APPS: +~~ raise ValidationError(_('Thumbnail option or resize parameters must be choosen.')) + else: +~~ raise ValidationError(_('Resize parameters must be choosen.')) + return self.cleaned_data + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 8 from django-guardian +[django-guardian](https://github.com/django-guardian/django-guardian) +([project documentation](https://django-guardian.readthedocs.io/en/stable/) +and +[PyPI page](https://pypi.org/project/django-guardian/)) +provides per-object permissions in [Django](/django.html) projects +by enhancing the existing authentication backend. The project's code +is open source under the +[MIT license](https://github.com/django-guardian/django-guardian/blob/devel/LICENSE). + +[**django-guardian / guardian / models / models.py**](https://github.com/django-guardian/django-guardian/blob/devel/guardian/models/models.py) + +```python +# models.py +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import ValidationError +from django.db import models +from django.utils.translation import gettext_lazy as _ +from guardian.compat import user_model_label +from guardian.ctypes import get_content_type +from guardian.managers import GroupObjectPermissionManager, UserObjectPermissionManager + + +class BaseObjectPermission(models.Model): + permission = models.ForeignKey(Permission, on_delete=models.CASCADE) + + class Meta: + abstract = True + + def __str__(self): + return '{} | {} | {}'.format( + str(self.content_object), + str(getattr(self, 'user', False) or self.group), + str(self.permission.codename)) + + def save(self, *args, **kwargs): + content_type = get_content_type(self.content_object) + if content_type != self.permission.content_type: +~~ raise ValidationError("Cannot persist permission not designed for " + "this class (permission's type is %r and object's type is %r)" + % (self.permission.content_type, content_type)) + return super().save(*args, **kwargs) + + +class BaseGenericObjectPermission(models.Model): + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_pk = models.CharField(_('object ID'), max_length=255) + content_object = GenericForeignKey(fk_field='object_pk') + + class Meta: + abstract = True + indexes = [ + models.Index(fields=['content_type', 'object_pk']), + ] + + +class UserObjectPermissionBase(BaseObjectPermission): + user = models.ForeignKey(user_model_label, on_delete=models.CASCADE) + + objects = UserObjectPermissionManager() + + class Meta: + abstract = True + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 9 from django-import-export +[django-import-export](https://github.com/django-import-export/django-import-export) +([documentation](https://django-import-export.readthedocs.io/en/latest/) +and [PyPI page](https://pypi.org/project/django-import-export/)) +is a [Django](/django.html) code library for importing and exporting data +from the Django Admin. The tool supports many export and import formats +such as CSV, JSON and YAML. django-import-export is open source under the +[BSD 2-Clause "Simplified" License](https://github.com/django-import-export/django-import-export/blob/master/LICENSE). + +[**django-import-export / import_export / resources.py**](https://github.com/django-import-export/django-import-export/blob/master/import_export/./resources.py) + +```python +# resources.py +import functools +import logging +import tablib +import traceback +from collections import OrderedDict +from copy import deepcopy + +from diff_match_patch import diff_match_patch + +import django +from django.conf import settings +~~from django.core.exceptions import ImproperlyConfigured, ValidationError +from django.core.management.color import no_style +from django.core.paginator import Paginator +from django.db import DEFAULT_DB_ALIAS, connections +from django.db.models.fields.related import ForeignObjectRel +from django.db.models.query import QuerySet +from django.db.transaction import ( + TransactionManagementError, + atomic, + savepoint, + savepoint_commit, + savepoint_rollback +) +from django.utils.encoding import force_str +from django.utils.safestring import mark_safe + +from . import widgets +from .fields import Field +from .instance_loaders import ModelInstanceLoader +from .results import Error, Result, RowResult +from .utils import atomic_if_using_transaction + +if django.VERSION[0] >= 3: + from django.core.exceptions import FieldDoesNotExist +else: + + +## ... source file abbreviated to get to ValidationError examples ... + + + else: + delete_ids = [o.pk for o in self.delete_instances] + self._meta.model.objects.filter(pk__in=delete_ids).delete() + except Exception as e: + logger.exception(e) + if raise_errors: + raise e + finally: + self.delete_instances.clear() + + def validate_instance(self, instance, import_validation_errors=None, validate_unique=True): + if import_validation_errors is None: + errors = {} + else: + errors = import_validation_errors.copy() + if self._meta.clean_model_instances: + try: + instance.full_clean( + exclude=errors.keys(), + validate_unique=validate_unique, + ) +~~ except ValidationError as e: + errors = e.update_error_dict(errors) + + if errors: +~~ raise ValidationError(errors) + + def save_instance(self, instance, using_transactions=True, dry_run=False): + self.before_save_instance(instance, using_transactions, dry_run) + if self._meta.use_bulk: + if instance.pk: + self.update_instances.append(instance) + else: + self.create_instances.append(instance) + else: + if not using_transactions and dry_run: + pass + else: + instance.save() + self.after_save_instance(instance, using_transactions, dry_run) + + def before_save_instance(self, instance, using_transactions, dry_run): + pass + + def after_save_instance(self, instance, using_transactions, dry_run): + pass + + def delete_instance(self, instance, using_transactions=True, dry_run=False): + self.before_delete_instance(instance, dry_run) + if self._meta.use_bulk: + + +## ... source file abbreviated to get to ValidationError examples ... + + + else: + instance.delete() + self.after_delete_instance(instance, dry_run) + + def before_delete_instance(self, instance, dry_run): + pass + + def after_delete_instance(self, instance, dry_run): + pass + + def import_field(self, field, obj, data, is_m2m=False): + if field.attribute and field.column_name in data: + field.save(obj, data, is_m2m) + + def get_import_fields(self): + return self.get_fields() + + def import_obj(self, obj, data, dry_run): + errors = {} + for field in self.get_import_fields(): + if isinstance(field.widget, widgets.ManyToManyWidget): + continue + try: + self.import_field(field, obj, data) + except ValueError as e: +~~ errors[field.attribute] = ValidationError( + force_str(e), code="invalid") + if errors: +~~ raise ValidationError(errors) + + def save_m2m(self, obj, data, using_transactions, dry_run): + if (not using_transactions and dry_run) or self._meta.use_bulk: + pass + else: + for field in self.get_import_fields(): + if not isinstance(field.widget, widgets.ManyToManyWidget): + continue + self.import_field(field, obj, data, True) + + def for_delete(self, row, instance): + return False + + def skip_row(self, instance, original): + if not self._meta.skip_unchanged or self._meta.skip_diff: + return False + for field in self.get_import_fields(): + try: + if list(field.get_value(instance).all()) != list(field.get_value(original).all()): + return False + except AttributeError: + if field.get_value(instance) != field.get_value(original): + return False + return True + try: + if len(self.delete_instances) > 0: + if not using_transactions and dry_run: + pass + + +## ... source file abbreviated to get to ValidationError examples ... + + + self.before_import_row(row, **kwargs) + instance, new = self.get_or_init_instance(instance_loader, row) + self.after_import_instance(instance, new, **kwargs) + if new: + row_result.import_type = RowResult.IMPORT_TYPE_NEW + else: + row_result.import_type = RowResult.IMPORT_TYPE_UPDATE + row_result.new_record = new + if not skip_diff: + original = deepcopy(instance) + diff = self.get_diff_class()(self, original, new) + if self.for_delete(row, instance): + if new: + row_result.import_type = RowResult.IMPORT_TYPE_SKIP + if not skip_diff: + diff.compare_with(self, None, dry_run) + else: + row_result.import_type = RowResult.IMPORT_TYPE_DELETE + self.delete_instance(instance, using_transactions, dry_run) + if not skip_diff: + diff.compare_with(self, None, dry_run) + else: + import_validation_errors = {} + try: + self.import_obj(instance, row, dry_run) +~~ except ValidationError as e: + import_validation_errors = e.update_error_dict(import_validation_errors) + if self.skip_row(instance, original): + row_result.import_type = RowResult.IMPORT_TYPE_SKIP + else: + self.validate_instance(instance, import_validation_errors) + self.save_instance(instance, using_transactions, dry_run) + self.save_m2m(instance, row, using_transactions, dry_run) + row_result.object_id = instance.pk + row_result.object_repr = force_str(instance) + if not skip_diff: + diff.compare_with(self, instance, dry_run) + + if not skip_diff: + row_result.diff = diff.as_html() + self.after_import_row(row, row_result, **kwargs) + +~~ except ValidationError as e: + row_result.import_type = RowResult.IMPORT_TYPE_INVALID + row_result.validation_error = e + except Exception as e: + row_result.import_type = RowResult.IMPORT_TYPE_ERROR + if not isinstance(e, TransactionManagementError): + logger.debug(e, exc_info=e) + tb_info = traceback.format_exc() + row_result.errors.append(self.get_error_result_class()(e, tb_info, row)) + + if self._meta.use_bulk: + if len(self.create_instances) == self._meta.batch_size: + self.bulk_create(using_transactions, dry_run, raise_errors, batch_size=self._meta.batch_size) + if len(self.update_instances) == self._meta.batch_size: + self.bulk_update(using_transactions, dry_run, raise_errors, batch_size=self._meta.batch_size) + if len(self.delete_instances) == self._meta.batch_size: + self.bulk_delete(using_transactions, dry_run, raise_errors) + + return row_result + + def import_data(self, dataset, dry_run=False, raise_errors=False, + use_transactions=None, collect_failed_rows=False, **kwargs): + + if use_transactions is None: + use_transactions = self.get_use_transactions() + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 10 from django-jet +[django-jet](https://github.com/geex-arts/django-jet) +([project documentation](https://jet.readthedocs.io/en/latest/), +[PyPI project page](https://pypi.org/project/django-jet/) and +[more information](http://jet.geex-arts.com/)) +is a fancy [Django](/django.html) Admin panel replacement. + +The django-jet project is open source under the +[GNU Affero General Public License v3.0](https://github.com/geex-arts/django-jet/blob/dev/LICENSE). + +[**django-jet / jet / forms.py**](https://github.com/geex-arts/django-jet/blob/dev/jet/./forms.py) + +```python +# forms.py +import json +from django import forms +from django.contrib.auth.models import Permission +from django.contrib.contenttypes.models import ContentType +~~from django.core.exceptions import ValidationError +from django.db.models import Q +import operator + +from jet.models import Bookmark, PinnedApplication +from jet.utils import get_model_instance_label, user_is_authenticated +from functools import reduce + +try: + from django.apps import apps + get_model = apps.get_model +except ImportError: + from django.db.models.loading import get_model + + +class AddBookmarkForm(forms.ModelForm): + def __init__(self, request, *args, **kwargs): + self.request = request + super(AddBookmarkForm, self).__init__(*args, **kwargs) + + class Meta: + model = Bookmark + fields = ['url', 'title'] + + def clean(self): + data = super(AddBookmarkForm, self).clean() + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + if not self.request.user.has_perm('jet.change_bookmark'): +~~ raise ValidationError('error') + return data + + def save(self, commit=True): + self.instance.user = self.request.user.pk + return super(AddBookmarkForm, self).save(commit) + + +class RemoveBookmarkForm(forms.ModelForm): + def __init__(self, request, *args, **kwargs): + self.request = request + super(RemoveBookmarkForm, self).__init__(*args, **kwargs) + + class Meta: + model = Bookmark + fields = [] + + def clean(self): + data = super(RemoveBookmarkForm, self).clean() + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + if self.instance.user != self.request.user.pk: +~~ raise ValidationError('error') + return data + + def save(self, commit=True): + if commit: + self.instance.delete() + + +class ToggleApplicationPinForm(forms.ModelForm): + def __init__(self, request, *args, **kwargs): + self.request = request + super(ToggleApplicationPinForm, self).__init__(*args, **kwargs) + + class Meta: + model = PinnedApplication + fields = ['app_label'] + + def clean(self): + data = super(ToggleApplicationPinForm, self).clean() + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + return data + + def save(self, commit=True): + if commit: + try: + pinned_app = PinnedApplication.objects.get( + app_label=self.cleaned_data['app_label'], + user=self.request.user.pk + ) + pinned_app.delete() + return False + except PinnedApplication.DoesNotExist: + PinnedApplication.objects.create( + app_label=self.cleaned_data['app_label'], + user=self.request.user.pk + ) + return True + + +class ModelLookupForm(forms.Form): + app_label = forms.CharField() + model = forms.CharField() + q = forms.CharField(required=False) + page = forms.IntegerField(required=False) + page_size = forms.IntegerField(required=False, min_value=1, max_value=1000) + object_id = forms.IntegerField(required=False) + model_cls = None + + def __init__(self, request, *args, **kwargs): + self.request = request + super(ModelLookupForm, self).__init__(*args, **kwargs) + + def clean(self): + data = super(ModelLookupForm, self).clean() + + if not user_is_authenticated(self.request.user) or not self.request.user.is_staff: +~~ raise ValidationError('error') + + try: + self.model_cls = get_model(data['app_label'], data['model']) + except: +~~ raise ValidationError('error') + + content_type = ContentType.objects.get_for_model(self.model_cls) + permission = Permission.objects.filter(content_type=content_type, codename__startswith='change_').first() + + if not self.request.user.has_perm('{}.{}'.format(data['app_label'], permission.codename)): +~~ raise ValidationError('error') + + return data + + def lookup(self): + qs = self.model_cls.objects + + if self.cleaned_data['q']: + if getattr(self.model_cls, 'autocomplete_search_fields', None): + search_fields = self.model_cls.autocomplete_search_fields() + filter_data = [Q((field + '__icontains', self.cleaned_data['q'])) for field in search_fields] + qs = qs.filter(reduce(operator.or_, filter_data)).distinct() + else: + qs = qs.none() + + limit = self.cleaned_data['page_size'] or 100 + page = self.cleaned_data['page'] or 1 + offset = (page - 1) * limit + + items = list(map( + lambda instance: {'id': instance.pk, 'text': get_model_instance_label(instance)}, + qs.all()[offset:offset + limit] + )) + total = qs.count() + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 11 from django-model-utils +[django-model-utils](https://github.com/jazzband/django-model-utils) +([project documentation](https://django-model-utils.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-model-utils/)) +provides useful mixins and utilities for working with +[Django ORM](/django-orm.html) models in your projects. + +The django-model-utils project is open sourced under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/jazzband/django-model-utils/blob/master/LICENSE.txt). + +[**django-model-utils / model_utils / fields.py**](https://github.com/jazzband/django-model-utils/blob/master/model_utils/./fields.py) + +```python +# fields.py +import uuid +from django.db import models +from django.conf import settings +~~from django.core.exceptions import ValidationError +from django.utils.timezone import now + +DEFAULT_CHOICES_NAME = 'STATUS' + + +class AutoCreatedField(models.DateTimeField): + + def __init__(self, *args, **kwargs): + kwargs.setdefault('editable', False) + kwargs.setdefault('default', now) + super().__init__(*args, **kwargs) + + +class AutoLastModifiedField(AutoCreatedField): + def get_default(self): + if not hasattr(self, "_default"): + self._default = self._get_default() + return self._default + + def pre_save(self, model_instance, add): + value = now() + if add: + current_value = getattr(model_instance, self.attname, self.get_default()) + if current_value != self.get_default(): + + +## ... source file abbreviated to get to ValidationError examples ... + + + excerpt = get_excerpt(value.content) + setattr(model_instance, _excerpt_field_name(self.attname), excerpt) + return value.content + + def value_to_string(self, obj): + value = self.value_from_object(obj) + return value.content + + def get_prep_value(self, value): + try: + return value.content + except AttributeError: + return value + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + kwargs['no_excerpt_field'] = True + return name, path, args, kwargs + + +class UUIDField(models.UUIDField): + + def __init__(self, primary_key=True, version=4, editable=False, *args, **kwargs): + + if version == 2: +~~ raise ValidationError( + 'UUID version 2 is not supported.') + + if version < 1 or version > 5: +~~ raise ValidationError( + 'UUID version is not valid.') + + if version == 1: + default = uuid.uuid1 + elif version == 3: + default = uuid.uuid3 + elif version == 4: + default = uuid.uuid4 + elif version == 5: + default = uuid.uuid5 + + kwargs.setdefault('primary_key', primary_key) + kwargs.setdefault('editable', editable) + kwargs.setdefault('default', default) + super().__init__(*args, **kwargs) + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 12 from django-oauth-toolkit +[django-oauth-toolkit](https://github.com/jazzband/django-oauth-toolkit) +([project website](http://dot.evonove.it/) and +[PyPI package information](https://pypi.org/project/django-oauth-toolkit/1.2.0/)) +is a code library for adding and handling [OAuth2](https://oauth.net/) +flows within your [Django](/django.html) web application and +[API](/application-programming-interfaces.html). + +The django-oauth-toolkit project is open sourced under the +[FreeBSD license](https://github.com/jazzband/django-oauth-toolkit/blob/master/LICENSE) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-oauth-toolkit / oauth2_provider / models.py**](https://github.com/jazzband/django-oauth-toolkit/blob/master/oauth2_provider/./models.py) + +```python +# models.py +import logging +from datetime import timedelta +from urllib.parse import parse_qsl, urlparse + +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db import models, transaction +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + +from .generators import generate_client_id, generate_client_secret +from .scopes import get_scopes_backend +from .settings import oauth2_settings +from .validators import RedirectURIValidator, WildcardSet + + +logger = logging.getLogger(__name__) + + +class AbstractApplication(models.Model): + CLIENT_CONFIDENTIAL = "confidential" + CLIENT_PUBLIC = "public" + CLIENT_TYPES = ( + (CLIENT_CONFIDENTIAL, _("Confidential")), + (CLIENT_PUBLIC, _("Public")), + ) + + GRANT_AUTHORIZATION_CODE = "authorization-code" + GRANT_IMPLICIT = "implicit" + GRANT_PASSWORD = "password" + GRANT_CLIENT_CREDENTIALS = "client-credentials" + GRANT_TYPES = ( + (GRANT_AUTHORIZATION_CODE, _("Authorization code")), + + +## ... source file abbreviated to get to ValidationError examples ... + + + + assert False, ( + "If you are using implicit, authorization_code" + "or all-in-one grant_type, you must define " + "redirect_uris field in your Application model" + ) + + def redirect_uri_allowed(self, uri): + parsed_uri = urlparse(uri) + uqs_set = set(parse_qsl(parsed_uri.query)) + for allowed_uri in self.redirect_uris.split(): + parsed_allowed_uri = urlparse(allowed_uri) + + if (parsed_allowed_uri.scheme == parsed_uri.scheme and + parsed_allowed_uri.netloc == parsed_uri.netloc and + parsed_allowed_uri.path == parsed_uri.path): + + aqs_set = set(parse_qsl(parsed_allowed_uri.query)) + + if aqs_set.issubset(uqs_set): + return True + + return False + + def clean(self): +~~ from django.core.exceptions import ValidationError + + grant_types = ( + AbstractApplication.GRANT_AUTHORIZATION_CODE, + AbstractApplication.GRANT_IMPLICIT, + ) + + redirect_uris = self.redirect_uris.strip().split() + allowed_schemes = set(s.lower() for s in self.get_allowed_schemes()) + + if redirect_uris: + validator = RedirectURIValidator(WildcardSet()) + for uri in redirect_uris: + validator(uri) + scheme = urlparse(uri).scheme + if scheme not in allowed_schemes: +~~ raise ValidationError(_( + "Unauthorized redirect scheme: {scheme}" + ).format(scheme=scheme)) + + elif self.authorization_grant_type in grant_types: +~~ raise ValidationError(_( + "redirect_uris cannot be empty with grant_type {grant_type}" + ).format(grant_type=self.authorization_grant_type)) + + def get_absolute_url(self): + return reverse("oauth2_provider:detail", args=[str(self.id)]) + + def get_allowed_schemes(self): + return oauth2_settings.ALLOWED_REDIRECT_URI_SCHEMES + + def allows_grant_type(self, *grant_types): + return self.authorization_grant_type in grant_types + + def is_usable(self, request): + return True + + +class ApplicationManager(models.Manager): + def get_by_natural_key(self, client_id): + return self.get(client_id=client_id) + + +class Application(AbstractApplication): + objects = ApplicationManager() + + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 13 from django-rest-framework +[Django REST Framework](https://github.com/encode/django-rest-framework) +([project homepage and documentation](https://www.django-rest-framework.org/), +[PyPI package information](https://pypi.org/project/djangorestframework/) +and [more resources on Full Stack Python](/django-rest-framework-drf.html)), +often abbreviated as "DRF", is a popular [Django](/django.html) extension +for building [web APIs](/application-programming-interfaces.html). +The project has fantastic documentation and a wonderful +[quickstart](https://www.django-rest-framework.org/tutorial/quickstart/) +that serve as examples of how to make it easier for newcomers +to get started. + +The project is open sourced under the +[Encode OSS Ltd. license](https://github.com/encode/django-rest-framework/blob/master/LICENSE.md). + +[**django-rest-framework / rest_framework / fields.py**](https://github.com/encode/django-rest-framework/blob/master/rest_framework/./fields.py) + +```python +# fields.py +import copy +import datetime +import decimal +import functools +import inspect +import re +import uuid +import warnings +from collections import OrderedDict +from collections.abc import Mapping + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +~~from django.core.exceptions import ValidationError as DjangoValidationError +from django.core.validators import ( + EmailValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator, ProhibitNullCharactersValidator, RegexValidator, + URLValidator, ip_address_validators +) +from django.forms import FilePathField as DjangoFilePathField +from django.forms import ImageField as DjangoImageField +from django.utils import timezone +from django.utils.dateparse import ( + parse_date, parse_datetime, parse_duration, parse_time +) +from django.utils.duration import duration_string +from django.utils.encoding import is_protected_type, smart_str +from django.utils.formats import localize_input, sanitize_separators +from django.utils.ipv6 import clean_ipv6_address +from django.utils.timezone import utc +from django.utils.translation import gettext_lazy as _ +from pytz.exceptions import InvalidTimeError + +from rest_framework import ( + ISO_8601, RemovedInDRF313Warning, RemovedInDRF314Warning +) +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework.settings import api_settings + + +## ... source file abbreviated to get to ValidationError examples ... + + + def run_validators(self, value): + errors = [] + for validator in self.validators: + if hasattr(validator, 'set_context'): + warnings.warn( + "Method `set_context` on validators is deprecated and will " + "no longer be called starting with 3.13. Instead set " + "`requires_context = True` on the class, and accept the " + "context as an additional argument.", + RemovedInDRF313Warning, stacklevel=2 + ) + validator.set_context(self) + + try: + if getattr(validator, 'requires_context', False): + validator(value, self) + else: + validator(value) +~~ except ValidationError as exc: + if isinstance(exc.detail, dict): + raise + errors.extend(exc.detail) + except DjangoValidationError as exc: + errors.extend(get_error_detail(exc)) + if errors: +~~ raise ValidationError(errors) + + def to_internal_value(self, data): + raise NotImplementedError( + '{cls}.to_internal_value() must be implemented for field ' + '{field_name}. If you do not need to support write operations ' + 'you probably want to subclass `ReadOnlyField` instead.'.format( + cls=self.__class__.__name__, + field_name=self.field_name, + ) + ) + + def to_representation(self, value): + raise NotImplementedError( + '{cls}.to_representation() must be implemented for field {field_name}.'.format( + cls=self.__class__.__name__, + field_name=self.field_name, + ) + ) + + def fail(self, key, **kwargs): + try: + msg = self.error_messages[key] + except KeyError: + class_name = self.__class__.__name__ + msg = MISSING_ERROR_MESSAGE.format(class_name=class_name, key=key) + raise AssertionError(msg) + message_string = msg.format(**kwargs) +~~ raise ValidationError(message_string, code=key) + + @property + def root(self): + root = self + while root.parent is not None: + root = root.parent + return root + + @property + def context(self): + return getattr(self.root, '_context', {}) + + def __new__(cls, *args, **kwargs): + instance = super().__new__(cls) + instance._args = args + instance._kwargs = kwargs + return instance + + def __deepcopy__(self, memo): + args = [ + copy.deepcopy(item) if not isinstance(item, REGEX_TYPE) else item + for item in self._args + ] + kwargs = { + + +## ... source file abbreviated to get to ValidationError examples ... + + + + def to_internal_value(self, data): + if html.is_html_input(data): + data = html.parse_html_list(data, default=[]) + if isinstance(data, (str, Mapping)) or not hasattr(data, '__iter__'): + self.fail('not_a_list', input_type=type(data).__name__) + if not self.allow_empty and len(data) == 0: + self.fail('empty') + return self.run_child_validation(data) + + def to_representation(self, data): + return [self.child.to_representation(item) if item is not None else None for item in data] + + def run_child_validation(self, data): + result = [] + errors = OrderedDict() + + for idx, item in enumerate(data): + try: + result.append(self.child.run_validation(item)) +~~ except ValidationError as e: + errors[idx] = e.detail + + if not errors: + return result +~~ raise ValidationError(errors) + + +class DictField(Field): + child = _UnvalidatedField() + initial = {} + default_error_messages = { + 'not_a_dict': _('Expected a dictionary of items but got type "{input_type}".'), + 'empty': _('This dictionary may not be empty.'), + } + + def __init__(self, *args, **kwargs): + self.child = kwargs.pop('child', copy.deepcopy(self.child)) + self.allow_empty = kwargs.pop('allow_empty', True) + + assert not inspect.isclass(self.child), '`child` has not been instantiated.' + assert self.child.source is None, ( + "The `source` argument is not meaningful when applied to a `child=` field. " + "Remove `source=` from the field declaration." + ) + + super().__init__(*args, **kwargs) + self.child.bind(field_name='', parent=self) + + def get_value(self, dictionary): + + +## ... source file abbreviated to get to ValidationError examples ... + + + if not self.allow_empty and len(data) == 0: + self.fail('empty') + + return self.run_child_validation(data) + + def to_representation(self, value): + return { + str(key): self.child.to_representation(val) if val is not None else None + for key, val in value.items() + } + + def run_child_validation(self, data): + result = {} + errors = OrderedDict() + + for key, value in data.items(): + key = str(key) + + try: + result[key] = self.child.run_validation(value) +~~ except ValidationError as e: + errors[key] = e.detail + + if not errors: + return result +~~ raise ValidationError(errors) + + +class HStoreField(DictField): + child = CharField(allow_blank=True, allow_null=True) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert isinstance(self.child, CharField), ( + "The `child` argument must be an instance of `CharField`, " + "as the hstore extension stores values as strings." + ) + + +class JSONField(Field): + default_error_messages = { + 'invalid': _('Value must be valid JSON.') + } + + def __init__(self, *args, **kwargs): + self.binary = kwargs.pop('binary', False) + self.encoder = kwargs.pop('encoder', None) + super().__init__(*args, **kwargs) + + def get_value(self, dictionary): + (is_empty_value, data) = self.validate_empty_values(data) + if is_empty_value: + return data + value = self.to_internal_value(data) + self.run_validators(value) + return value + + + +## ... source file abbreviated to get to ValidationError examples ... + + + if len(val) > 0: + return val + return html.parse_html_list(dictionary, prefix=self.field_name, default=empty) + + return dictionary.get(self.field_name, empty) + + +## ... source file abbreviated to get to ValidationError examples ... + + + def to_internal_value(self, data): + if html.is_html_input(data): + data = html.parse_html_dict(data) + if not isinstance(data, dict): + self.fail('not_a_dict', input_type=type(data).__name__) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 14 from django-wiki +[django-wiki](https://github.com/django-wiki/django-wiki) +([project documentation](https://django-wiki.readthedocs.io/en/master/), +[demo](https://demo.django-wiki.org/), +and [PyPI page](https://pypi.org/project/django-wiki/)) +is a wiki system code library for [Django](/django.html) +projects that makes it easier to create user-editable content. +The project aims to provide necessary core features and then +have an easy plugin format for additional features, rather than +having every exhaustive feature built into the core system. +django-wiki is a rewrite of an earlier now-defunct project +named [django-simplewiki](https://code.google.com/p/django-simple-wiki/). + +The code for django-wiki is provided as open source under the +[GNU General Public License 3.0](https://github.com/django-wiki/django-wiki/blob/master/COPYING). + +[**django-wiki / src/wiki / models / urlpath.py**](https://github.com/django-wiki/django-wiki/blob/master/src/wiki/models/urlpath.py) + +```python +# urlpath.py +import logging +import warnings + +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +~~from django.core.exceptions import ValidationError +from django.db import models +from django.db import transaction +from django.db.models.signals import post_save +from django.db.models.signals import pre_delete +from django.urls import reverse +from django.utils.translation import gettext +from django.utils.translation import gettext_lazy as _ +from mptt.fields import TreeForeignKey +from mptt.models import MPTTModel +from wiki import managers +from wiki.conf import settings +from wiki.core.exceptions import MultipleRootURLs +from wiki.core.exceptions import NoRootURL +from wiki.decorators import disable_signal_for_loaddata +from wiki.models.article import Article +from wiki.models.article import ArticleForObject +from wiki.models.article import ArticleRevision + +__all__ = [ + "URLPath", +] + + +log = logging.getLogger(__name__) + + +## ... source file abbreviated to get to ValidationError examples ... + + + raise NoRootURL("You need to create a root article on site '%s'" % site) + if no_paths > 1: + raise MultipleRootURLs("Somehow you have multiple roots on %s" % site) + return root_nodes[0] + + class MPTTMeta: + pass + + def __str__(self): + path = self.path + return path if path else gettext("(root)") + + def delete(self, *args, **kwargs): + assert not ( + self.parent and self.get_children() + ), "You cannot delete a root article with children." + super().delete(*args, **kwargs) + + class Meta: + verbose_name = _("URL path") + verbose_name_plural = _("URL paths") + unique_together = ("site", "parent", "slug") + + def clean(self, *args, **kwargs): + if self.slug and not self.parent: +~~ raise ValidationError( + _("Sorry but you cannot have a root article with a slug.") + ) + if not self.slug and self.parent: +~~ raise ValidationError(_("A non-root note must always have a slug.")) + if not self.parent: + if URLPath.objects.root_nodes().filter(site=self.site).exclude(id=self.id): +~~ raise ValidationError( + _("There is already a root node on %s") % self.site + ) + + @classmethod + def get_by_path(cls, path, select_related=False): + + + path = path.lstrip("/") + path = path.rstrip("/") + + if not path: + return cls.root() + + slugs = path.split("/") + level = 1 + parent = cls.root() + for slug in slugs: + if settings.URL_CASE_SENSITIVE: + child = parent.get_children().select_related_common().get(slug=slug) + child.cached_ancestors = parent.cached_ancestors + [parent] + parent = child + else: + child = ( + parent.get_children().select_related_common().get(slug__iexact=slug) + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 15 from register +[register](https://github.com/ORGAN-IZE/register) is a [Django](/django.html), +[Bootstrap](/bootstrap-css.html), [PostgreSQL](/postgresql.html) project that is +open source under the +[GNU General Public License v3.0](https://github.com/ORGAN-IZE/register/blob/master/LICENSE). +This web application makes it easier for people to register as organ donors. +You can see the application live at +[https://register.organize.org/](https://register.organize.org/). + +[**register / registration / forms.py**](https://github.com/ORGAN-IZE/register/blob/master/registration/./forms.py) + +```python +# forms.py +from __future__ import unicode_literals + +import logging +import re +import collections +import datetime + +import django.forms +import django.forms.utils +import django.forms.widgets +import django.core.validators +~~import django.core.exceptions +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.utils.safestring import mark_safe + +import form_utils.forms +import requests +import dateutil.parser +import validate_email + +logger = logging.getLogger(__name__) + + +REGISTRATION_CONFIGURATION_NAME = 'registration_configuration' + +RE_NON_DECIMAL = re.compile(r'[^\d]+') +RE_NON_ALPHA = re.compile('[\W]+') +RE_POSTAL_CODE = re.compile(r'^[0-9]{5}$') +validate_postal_code = django.core.validators.RegexValidator( + RE_POSTAL_CODE, _("Enter a valid postal code consisting 5 numbers."), 'invalid') + + +CHOICES_GENDER = ( + ('M', _('Male')), + ('F', _('Female')), +) + + +class MultiEmailField(django.forms.CharField): + message = _('Enter valid email addresses.') + code = 'invalid' + widget = django.forms.widgets.TextInput + + def to_python(self, value): + "Normalize data to a list of strings." + if not value: + return [] + return [v.strip() for v in re.findall(validate_email.ADDR_SPEC, value)] + + def validate(self, value): + "Check if value consists only of valid emails." + + super(MultiEmailField, self).validate(value) + try: + for email in value: + django.core.validators.validate_email(email) + except django.core.exceptions.ValidationError: +~~ raise django.core.exceptions.ValidationError(self.message, code=self.code) + + + + + +class StateLookupForm(django.forms.Form): + email = django.forms.EmailField(label=_('Email'), help_text=_('so we can send you confirmation of your registration')) + postal_code = django.forms.CharField( + label=_('Postal Code'), + max_length=5, min_length=5, validators=[validate_postal_code], + help_text=_('to determine which series of state-based questions we will ask next')) + + def clean_email(self): + email = self.cleaned_data['email'] + if settings.DISABLE_EMAIL_VALIDATION: + logger.warning('Email validation disabled: DISABLE_EMAIL_VALIDATION ' + 'is set') + return email + if not hasattr(settings, 'MAILGUN_PUBLIC_API_KEY'): + logger.warning( + 'Cannot validate email: MAILGUN_PUBLIC_API_KEY not set') + return email + r = requests.get( + 'https://api.mailgun.net/v2/address/validate', + + +## ... source file continues with no further ValidationError examples... + +``` + + +## Example 16 from wagtail +[wagtail](https://github.com/wagtail/wagtail) +([project website](https://wagtail.io/)) is a fantastic +[Django](/django.html)-based CMS with code that is open source +under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/wagtail/wagtail/blob/master/LICENSE). + +[**wagtail / wagtail / snippets / tests.py**](https://github.com/wagtail/wagtail/blob/master/wagtail/snippets/tests.py) + +```python +# tests.py +import json + +from django.contrib.admin.utils import quote +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AnonymousUser, Permission +from django.core import checks +~~from django.core.exceptions import ValidationError +from django.core.files.base import ContentFile +from django.core.files.uploadedfile import SimpleUploadedFile +from django.http import HttpRequest, HttpResponse +from django.test import RequestFactory, TestCase +from django.test.utils import override_settings +from django.urls import reverse +from taggit.models import Tag + +from wagtail.admin.edit_handlers import FieldPanel +from wagtail.admin.forms import WagtailAdminModelForm +from wagtail.core.models import Page +from wagtail.snippets.blocks import SnippetChooserBlock +from wagtail.snippets.edit_handlers import SnippetChooserPanel +from wagtail.snippets.models import SNIPPET_MODELS, register_snippet +from wagtail.snippets.views.snippets import get_snippet_edit_handler +from wagtail.tests.snippets.forms import FancySnippetForm +from wagtail.tests.snippets.models import ( + AlphaSnippet, FancySnippet, FileUploadSnippet, RegisterDecorator, RegisterFunction, + SearchableSnippet, StandardSnippet, StandardSnippetWithCustomPrimaryKey, ZuluSnippet) +from wagtail.tests.testapp.models import ( + Advert, AdvertWithCustomPrimaryKey, AdvertWithCustomUUIDPrimaryKey, AdvertWithTabbedInterface, + SnippetChooserModel, SnippetChooserModelWithCustomPrimaryKey) +from wagtail.tests.utils import WagtailTestUtils + + + +## ... source file abbreviated to get to ValidationError examples ... + + + self.assertInHTML('', empty_form_html) + self.assertIn('createSnippetChooser("advert", "tests/advert");', empty_form_html) + + test_advert = Advert.objects.get(text='test_advert') + test_advert_form_html = block.render_form(test_advert, 'advert') + expected_html = '' % test_advert.id + self.assertInHTML(expected_html, test_advert_form_html) + self.assertIn("pick an advert, any advert", test_advert_form_html) + + def test_form_response(self): + block = SnippetChooserBlock(Advert) + test_advert = Advert.objects.get(text='test_advert') + + value = block.value_from_datadict({'advert': str(test_advert.id)}, {}, 'advert') + self.assertEqual(value, test_advert) + + empty_value = block.value_from_datadict({'advert': ''}, {}, 'advert') + self.assertEqual(empty_value, None) + + def test_clean(self): + required_block = SnippetChooserBlock(Advert) + nonrequired_block = SnippetChooserBlock(Advert, required=False) + test_advert = Advert.objects.get(text='test_advert') + + self.assertEqual(required_block.clean(test_advert), test_advert) +~~ with self.assertRaises(ValidationError): + required_block.clean(None) + + self.assertEqual(nonrequired_block.clean(test_advert), test_advert) + self.assertEqual(nonrequired_block.clean(None), None) + + +class TestSnippetListViewWithCustomPrimaryKey(TestCase, WagtailTestUtils): + def setUp(self): + self.login() + + self.snippet_a = StandardSnippetWithCustomPrimaryKey.objects.create(snippet_id="snippet/01", text="Hello") + self.snippet_b = StandardSnippetWithCustomPrimaryKey.objects.create(snippet_id="snippet/02", text="Hello") + self.snippet_c = StandardSnippetWithCustomPrimaryKey.objects.create(snippet_id="snippet/03", text="Hello") + + def get(self, params={}): + return self.client.get(reverse('wagtailsnippets:list', + args=('snippetstests', 'standardsnippetwithcustomprimarykey')), + params) + + def test_simple(self): + response = self.get() + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'wagtailsnippets/snippets/type_index.html') + + + +## ... source file abbreviated to get to ValidationError examples ... + + + self.assertInHTML('', empty_form_html) + self.assertIn('createSnippetChooser("advertwithcustomprimarykey", "tests/advertwithcustomprimarykey");', empty_form_html) + + test_advert = AdvertWithCustomPrimaryKey.objects.get(pk='advert/01') + test_advert_form_html = block.render_form(test_advert, 'advertwithcustomprimarykey') + expected_html = '' % test_advert.pk + self.assertInHTML(expected_html, test_advert_form_html) + self.assertIn("pick an advert, any advert", test_advert_form_html) + + def test_form_response(self): + block = SnippetChooserBlock(AdvertWithCustomPrimaryKey) + test_advert = AdvertWithCustomPrimaryKey.objects.get(pk='advert/01') + + value = block.value_from_datadict({'advertwithcustomprimarykey': str(test_advert.pk)}, {}, 'advertwithcustomprimarykey') + self.assertEqual(value, test_advert) + + empty_value = block.value_from_datadict({'advertwithcustomprimarykey': ''}, {}, 'advertwithcustomprimarykey') + self.assertEqual(empty_value, None) + + def test_clean(self): + required_block = SnippetChooserBlock(AdvertWithCustomPrimaryKey) + nonrequired_block = SnippetChooserBlock(AdvertWithCustomPrimaryKey, required=False) + test_advert = AdvertWithCustomPrimaryKey.objects.get(pk='advert/01') + + self.assertEqual(required_block.clean(test_advert), test_advert) +~~ with self.assertRaises(ValidationError): + required_block.clean(None) + + self.assertEqual(nonrequired_block.clean(test_advert), test_advert) + self.assertEqual(nonrequired_block.clean(None), None) + + +class TestSnippetChooserPanelWithCustomPrimaryKey(TestCase, WagtailTestUtils): + fixtures = ['test.json'] + + def setUp(self): + self.request = RequestFactory().get('/') + user = AnonymousUser() # technically, Anonymous users cannot access the admin + self.request.user = user + + model = SnippetChooserModelWithCustomPrimaryKey + self.advert_text = 'Test advert text' + test_snippet = model.objects.create( + advertwithcustomprimarykey=AdvertWithCustomPrimaryKey.objects.create( + advert_id="advert/02", + text=self.advert_text + ) + ) + + self.edit_handler = get_snippet_edit_handler(model) + + +## ... source file continues with no further ValidationError examples... + +``` + diff --git a/redirects/django-core-exceptions-improperlyconfigured.html b/redirects/django-core-exceptions-improperlyconfigured.html new file mode 100644 index 000000000..2dd308b2d --- /dev/null +++ b/redirects/django-core-exceptions-improperlyconfigured.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 795915387..59d77eb82 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -61,6 +61,19 @@

    django.core signing, validators

    +

    django.core.exceptions + DisallowedRedirect, + FieldDoesNotExist, + FieldError, + ImproperlyConfigured, + MiddlewareNotUsed, + NON_FIELD_ERRORS, + ObjectDoesNotExist, + PermissionDenied, + SuspiciousFileOperation, + SuspiciousMultipartForm, + ValidationError +

    django.db DEFAULT_DB_ALIAS, DataError, @@ -344,19 +357,11 @@

    django.utils.version

    django.views csrf -

    -

    django.views.debug - get_default_exception_reporter_filter -

    -

    django.views.decorators.csrf - csrf_exempt -

    -

    django.views.decorators.debug - sensitive_post_parameters -

    -

    django.views.decorators.http - require_GET, - require_POST + .debug get_default_exception_reporter_filter + .decorators.csrf csrf_exempt + .decorators.debug sensitive_post_parameters + .decorators.http require_GET, + .decorators.http require_POST

    django.views.generic CreateView, diff --git a/theme/templates/page.html b/theme/templates/page.html index 13c2f904d..19aed5b20 100644 --- a/theme/templates/page.html +++ b/theme/templates/page.html @@ -63,6 +63,9 @@

    {{ page.title }}

    {% include "examples-extensions-descriptions/pandas.html" %} {% endif %} {{ page.content }} + {% if page.slug == "django" %} + {% include "code-examples/django.html" %} + {% endif %} {% if page.slug == "flask" %} {% include "code-examples/flask.html" %} {% endif %} From a0329875ea8c3aa284b1a20cb212d27b8fdb1e46 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 12 Jul 2020 16:23:09 -0400 Subject: [PATCH 094/207] adding additional django template examples --- .../django-template-base-context.markdown | 67 +++++ ...go-template-base-filterexpression.markdown | 98 +++++++ .../django/django-template-base-node.markdown | 86 +++++++ .../django-template-base-nodelist.markdown | 103 ++++++++ .../django-template-base-parser.markdown | 114 +++++++++ .../django-template-base-template.markdown | 131 ++++++++++ ...template-base-templatesyntaxerror.markdown | 241 ++++++++++++++++++ .../django-template-base-textnode.markdown | 101 ++++++++ ...django-template-base-token-kwargs.markdown | 122 +++++++++ .../django-template-base-token.markdown | 114 +++++++++ .../django-template-base-tokentype.markdown | 63 +++++ ...emplate-base-variabledoesnotexist.markdown | 111 ++++++++ ...django-template-base-variablenode.markdown | 155 +++++++++++ ...kdown-django-3-0-django-markdown-view.html | 1 + theme/templates/code-examples/django.html | 15 ++ 15 files changed, 1522 insertions(+) create mode 100644 content/pages/examples/django/django-template-base-context.markdown create mode 100644 content/pages/examples/django/django-template-base-filterexpression.markdown create mode 100644 content/pages/examples/django/django-template-base-node.markdown create mode 100644 content/pages/examples/django/django-template-base-nodelist.markdown create mode 100644 content/pages/examples/django/django-template-base-parser.markdown create mode 100644 content/pages/examples/django/django-template-base-template.markdown create mode 100644 content/pages/examples/django/django-template-base-templatesyntaxerror.markdown create mode 100644 content/pages/examples/django/django-template-base-textnode.markdown create mode 100644 content/pages/examples/django/django-template-base-token-kwargs.markdown create mode 100644 content/pages/examples/django/django-template-base-token.markdown create mode 100644 content/pages/examples/django/django-template-base-tokentype.markdown create mode 100644 content/pages/examples/django/django-template-base-variabledoesnotexist.markdown create mode 100644 content/pages/examples/django/django-template-base-variablenode.markdown diff --git a/content/pages/examples/django/django-template-base-context.markdown b/content/pages/examples/django/django-template-base-context.markdown new file mode 100644 index 000000000..98338234d --- /dev/null +++ b/content/pages/examples/django/django-template-base-context.markdown @@ -0,0 +1,67 @@ +title: django.template.base Context Example Code +category: page +slug: django-template-base-context-examples +sortorder: 500011363 +toc: False +sidebartitle: django.template.base Context +meta: Python example code for the Context class from the django.template.base module of the Django project. + + +Context is a class within the django.template.base module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / templatetags / pipeline.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/templatetags/pipeline.py) + +```python +# pipeline.py +import logging +import subprocess + +from django.contrib.staticfiles.storage import staticfiles_storage + +from django import template +~~from django.template.base import Context, VariableDoesNotExist +from django.template.loader import render_to_string +from django.utils.safestring import mark_safe + +from ..collector import default_collector +from ..conf import settings +from ..exceptions import CompilerError +from ..packager import Packager, PackageNotFound +from ..utils import guess_type + +logger = logging.getLogger(__name__) + +register = template.Library() + + +class PipelineMixin(object): + request = None + _request_var = None + + @property + def request_var(self): + if not self._request_var: + self._request_var = template.Variable('request') + return self._request_var + + + +## ... source file continues with no further Context examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-filterexpression.markdown b/content/pages/examples/django/django-template-base-filterexpression.markdown new file mode 100644 index 000000000..aa466b309 --- /dev/null +++ b/content/pages/examples/django/django-template-base-filterexpression.markdown @@ -0,0 +1,98 @@ +title: django.template.base FilterExpression Example Code +category: page +slug: django-template-base-filterexpression-examples +sortorder: 500011364 +toc: False +sidebartitle: django.template.base FilterExpression +meta: Python example code for the FilterExpression class from the django.template.base module of the Django project. + + +FilterExpression is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / templatetags / sitetree.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/templatetags/sitetree.py) + +```python +# sitetree.py +from django import template +~~from django.template.base import FilterExpression +from django.template.loader import get_template + +from ..sitetreeapp import get_sitetree + +register = template.Library() + + +@register.tag +def sitetree_tree(parser, token): + tokens = token.split_contents() + use_template = detect_clause(parser, 'template', tokens) + tokens_num = len(tokens) + + if tokens_num in (3, 5): + tree_alias = parser.compile_filter(tokens[2]) + return sitetree_treeNode(tree_alias, use_template) + else: + raise template.TemplateSyntaxError( + '%r tag requires two arguments. E.g. {%% sitetree_tree from "mytree" %%}.' % tokens[0]) + + +@register.tag +def sitetree_children(parser, token): + tokens = token.split_contents() + + +## ... source file abbreviated to get to FilterExpression examples ... + + + + def get_value(self, context): + return get_sitetree().get_current_page_attr('description', self.item, context) + + +class sitetree_page_hintNode(SimpleNode): + + def get_value(self, context): + return get_sitetree().get_current_page_attr('hint', self.item, context) + + +def detect_clause(parser, clause_name, tokens): + if clause_name in tokens: + t_index = tokens.index(clause_name) + clause_value = parser.compile_filter(tokens[t_index + 1]) + del tokens[t_index:t_index + 2] + else: + clause_value = None + return clause_value + + +def render(context, tree_items, use_template): + context.push() + context['sitetree_items'] = tree_items + +~~ if isinstance(use_template, FilterExpression): + use_template = use_template.resolve(context) + + content = get_template(use_template).render(context.flatten()) + context.pop() + + return content + + + +## ... source file continues with no further FilterExpression examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-node.markdown b/content/pages/examples/django/django-template-base-node.markdown new file mode 100644 index 000000000..a7557b13a --- /dev/null +++ b/content/pages/examples/django/django-template-base-node.markdown @@ -0,0 +1,86 @@ +title: django.template.base Node Example Code +category: page +slug: django-template-base-node-examples +sortorder: 500011365 +toc: False +sidebartitle: django.template.base Node +meta: Python example code for the Node class from the django.template.base module of the Django project. + + +Node is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + +~~class AngularJsNode(Node): + def __init__(self, django_nodelist, angular_nodelist, variable): + self.django_nodelist = django_nodelist + self.angular_nodelist = angular_nodelist + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) + angular_nodelist = NodeList() + for node in django_nodelist: + if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + + +## ... source file continues with no further Node examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-nodelist.markdown b/content/pages/examples/django/django-template-base-nodelist.markdown new file mode 100644 index 000000000..c178a8121 --- /dev/null +++ b/content/pages/examples/django/django-template-base-nodelist.markdown @@ -0,0 +1,103 @@ +title: django.template.base NodeList Example Code +category: page +slug: django-template-base-nodelist-examples +sortorder: 500011366 +toc: False +sidebartitle: django.template.base NodeList +meta: Python example code for the NodeList class from the django.template.base module of the Django project. + + +NodeList is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + +class AngularJsNode(Node): + def __init__(self, django_nodelist, angular_nodelist, variable): + self.django_nodelist = django_nodelist + self.angular_nodelist = angular_nodelist + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) +~~ angular_nodelist = NodeList() + for node in django_nodelist: + if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + if part.isdigit(): + token += '[%s]' % part + else: + token += '.%s' % part + node = TextNode('{{ %s }}' % token) + angular_nodelist.append(node) + parser.delete_first_token() + return AngularJsNode(django_nodelist, angular_nodelist, values[0]) + + +@register.simple_tag(name='djng_locale_script', takes_context=True) +def djng_locale_script(context, default_language='en'): + language = get_language_from_request(context['request']) + if not language: + language = default_language + return format_html('angular-locale_{}.js', language.lower()) + + + +## ... source file continues with no further NodeList examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-parser.markdown b/content/pages/examples/django/django-template-base-parser.markdown new file mode 100644 index 000000000..a3e3fdbe2 --- /dev/null +++ b/content/pages/examples/django/django-template-base-parser.markdown @@ -0,0 +1,114 @@ +title: django.template.base Parser Example Code +category: page +slug: django-template-base-parser-examples +sortorder: 500011367 +toc: False +sidebartitle: django.template.base Parser +meta: Python example code for the Parser class from the django.template.base module of the Django project. + + +Parser is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / fields.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./fields.py) + +```python +# fields.py +from typing import Optional + +from django import template +~~from django.template.base import Parser, Token +from django.forms import ChoiceField +from django.utils.safestring import mark_safe + +from .compat import TOKEN_BLOCK +from .templatetags.sitetree import sitetree_tree +from .utils import get_tree_model, get_tree_item_model +from .settings import ITEMS_FIELD_ROOT_ID + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +class TreeItemChoiceField(ChoiceField): + template: str = 'admin/sitetree/tree/tree_combo.html' + root_title: str = '---------' + + def __init__( + self, + tree: 'TreeBase' = None, + required: bool = True, + + +## ... source file abbreviated to get to Parser examples ... + + + super().__init__( + required=required, widget=widget, label=label, initial=initial, + help_text=help_text, *args, **kwargs) + + self.tree = None + self.choices_init(tree) + + def choices_init(self, tree: Optional['TreeBase']): + if not tree: + return + + if isinstance(tree, MODEL_TREE_CLASS): + tree = tree.alias + + self.tree = tree + self.choices = self._build_choices() + + def _build_choices(self): + tree_token = f'sitetree_tree from "{self.tree}" template "{self.template}"' + + context_kwargs = {'current_app': 'admin'} + context = template.Context(context_kwargs) + context.update({'request': object()}) + + choices_str = sitetree_tree( +~~ Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) + ).render(context) + + tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] + + for line in choices_str.splitlines(): + if line.strip(): + splitted = line.split(':::') + tree_choices.append((splitted[0], mark_safe(splitted[1]))) + + return tree_choices + + def clean(self, value): + if not value: + return None + + try: + return MODEL_TREE_ITEM_CLASS.objects.get(pk=value) + + except MODEL_TREE_ITEM_CLASS.DoesNotExist: + return None + + + +## ... source file continues with no further Parser examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-template.markdown b/content/pages/examples/django/django-template-base-template.markdown new file mode 100644 index 000000000..70cb7dca7 --- /dev/null +++ b/content/pages/examples/django/django-template-base-template.markdown @@ -0,0 +1,131 @@ +title: django.template.base Template Example Code +category: page +slug: django-template-base-template-examples +sortorder: 500011368 +toc: False +sidebartitle: django.template.base Template +meta: Python example code for the Template class from the django.template.base module of the Django project. + + +Template is a class within the django.template.base module of the Django project. + + +## Example 1 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / tests / test_static_placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/tests/test_static_placeholder.py) + +```python +# test_static_placeholder.py + +from django.contrib.admin.sites import site +from django.template import Context +~~from django.template.base import Template + +from six import text_type + +from cms.api import add_plugin +from cms.models import StaticPlaceholder, Placeholder, UserSettings +from cms.tests.test_plugins import PluginsTestBaseCase +from cms.utils.urlutils import admin_reverse + + +class StaticPlaceholderTestCase(PluginsTestBaseCase): + @property + def admin_class(self): + return site._registry[StaticPlaceholder] + + def fill_placeholder(self, placeholder=None): + if placeholder is None: + placeholder = Placeholder(slot=u"some_slot") + placeholder.save() # a good idea, if not strictly necessary + + + plugin_1 = add_plugin(placeholder, u"TextPlugin", u"en", + body=u"01", + ) + plugin_1.save() + + + plugin_2 = add_plugin(placeholder, u"TextPlugin", u"en", + body=u"02", + ) + plugin_1 = self.reload(plugin_1) + plugin_2.parent = plugin_1 + plugin_2.save() + return placeholder + + def get_admin(self): + usr = self._create_user("admin", True, True) + return usr + + def test_template_creation(self): + self.assertObjectDoesNotExist(StaticPlaceholder.objects.all(), code='foobar') + self.assertObjectDoesNotExist(Placeholder.objects.all(), slot='foobar') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" %}') + t.render(self.get_context('/')) + self.assertObjectExist(StaticPlaceholder.objects.all(), code='foobar', + creation_method=StaticPlaceholder.CREATION_BY_TEMPLATE) + self.assertEqual(Placeholder.objects.filter(slot='foobar').count(), 2) + + def test_empty(self): + self.assertObjectDoesNotExist(StaticPlaceholder.objects.all(), code='foobar') + self.assertObjectDoesNotExist(Placeholder.objects.all(), slot='foobar') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" or %}No Content{% endstatic_placeholder %}') + rendered = t.render(self.get_context('/')) + self.assertIn("No Content", rendered) + +~~ t = Template('{% load cms_tags %}{% static_placeholder "" %}') + rendered = t.render(self.get_context('/')) + self.assertEqual("", rendered) + +~~ t = Template('{% load cms_tags %}{% static_placeholder code or %}No Content{% endstatic_placeholder %}') + rendered = t.render(Context({'code': StaticPlaceholder.objects.all()[0]})) + self.assertIn("No Content", rendered) + + for p in Placeholder.objects.all(): + add_plugin(p, 'TextPlugin', 'en', body='test') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" or %}No Content{% endstatic_placeholder %}') + rendered = t.render(self.get_context('/')) + self.assertNotIn("No Content", rendered) + self.assertEqual(StaticPlaceholder.objects.filter(site_id__isnull=True, code='foobar').count(), 1) + + def test_local(self): + self.assertObjectDoesNotExist(StaticPlaceholder.objects.all(), code='foobar') + self.assertObjectDoesNotExist(Placeholder.objects.all(), slot='foobar') +~~ t = Template('{% load cms_tags %}{% static_placeholder "foobar" site or %}No Content{% endstatic_placeholder %}') + rendered = t.render(self.get_context('/')) + self.assertIn("No Content", rendered) + for p in Placeholder.objects.all(): + add_plugin(p, 'TextPlugin', 'en', body='test') + rendered = t.render(self.get_context('/')) + self.assertNotIn("No Content", rendered) + self.assertEqual(StaticPlaceholder.objects.filter(site_id__isnull=False, code='foobar').count(), 1) + + def test_publish_stack(self): + static_placeholder = StaticPlaceholder.objects.create(name='foo', code='bar', site_id=1) + self.fill_placeholder(static_placeholder.draft) + static_placeholder.dirty = True + static_placeholder.save() + self.assertEqual(static_placeholder.draft.cmsplugin_set.all().count(), 2) + self.assertEqual(static_placeholder.public.cmsplugin_set.all().count(), 0) + with self.login_user_context(self.get_superuser()): + response = self.client.post('%s?statics=%s' % (admin_reverse("cms_page_publish_page", args=[1, 'en']), static_placeholder.pk)) + self.assertEqual(response.status_code, 302) + + def test_permissions(self): + static_placeholder = StaticPlaceholder.objects.create(name='foo', code='bar', site_id=1) + request = self.get_request() + + request.user = self._create_user('user_a', is_staff=True, is_superuser=False, permissions=['change_staticplaceholder']) + + +## ... source file continues with no further Template examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown b/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown new file mode 100644 index 000000000..4dd549d7c --- /dev/null +++ b/content/pages/examples/django/django-template-base-templatesyntaxerror.markdown @@ -0,0 +1,241 @@ +title: django.template.base TemplateSyntaxError Example Code +category: page +slug: django-template-base-templatesyntaxerror-examples +sortorder: 500011369 +toc: False +sidebartitle: django.template.base TemplateSyntaxError +meta: Python example code for the TemplateSyntaxError class from the django.template.base module of the Django project. + + +TemplateSyntaxError is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / tests / test_templatetags.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/tests/test_templatetags.py) + +```python +# test_templatetags.py +import pytest +~~from django.template.base import TemplateSyntaxError +from django.utils.translation import activate, deactivate_all + +from sitetree.exceptions import SiteTreeError +from sitetree.settings import ALIAS_THIS_ANCESTOR_CHILDREN, ALIAS_THIS_CHILDREN, ALIAS_THIS_PARENT_SIBLINGS, \ + ALIAS_THIS_SIBLINGS, ALIAS_TRUNK + + +def test_items_hook(template_render_tag, template_context, common_tree): + + from sitetree.toolbox import register_items_hook + + with pytest.raises(SiteTreeError): + register_items_hook(lambda: []) + + def my_processor(tree_items, tree_sender): + for item in tree_items: + item.hint = f'hooked_hint_{item.title}' + return tree_items + + register_items_hook(my_processor) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', template_context()) + + assert 'hooked_hint_Darwin' in result + assert 'hooked_hint_Australia' in result + + +## ... source file abbreviated to get to TemplateSyntaxError examples ... + + +def test_urlpattern_resolve(monkeypatch, template_render_tag, template_context, common_tree): + + monkeypatch.setattr('sitetree.sitetreeapp.UNRESOLVED_ITEM_MARKER', 'UNKNOWN') + + context = template_context() + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/australia_var/"' in result + assert 'href="UNKNOWN" >China' in result + + context = template_context({'australia_var': 33}) + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert 'href="/contacts/australia/33/"' in result + + context = template_context({'australia_var': 'пробапера'}) # non-ascii + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/contacts/australia/%D0%BF%D1%80%D0%BE%D0%B1%D0%B0%D0%BF%D0%B5%D1%80%D0%B0/"' in result + + +def test_sitetree_tree(template_render_tag, template_context, common_tree): + + context = template_context() + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_tree "mytree"', context) + + assert template_render_tag('sitetree', 'sitetree_tree from "notree"', context) == '\n' + + result = template_render_tag('sitetree', 'sitetree_tree from "mytree"', context) + + assert '"/articles/cats/ugly/"' in result + assert '"/contacts/russia/postal/"' not in result # insitetree False + assert '"/users/ordinary/"' in result + assert '"/users/hidden/"' not in result + + +def test_sitetree_children(template_render_tag, template_context, common_tree): + + context = template_context({ + 'parent_item': common_tree['/users/'] + }) + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_children', context) + + result = template_render_tag( + 'sitetree', 'sitetree_children of parent_item for sitetree template "sitetree/tree.html"', context) + + assert '"/users/moderators/"' in result + assert '"/users/"' not in result + assert '"/users/hidden/"' not in result + + +def test_sitetree_breadcrumbs(template_render_tag, template_context, common_tree): + + result = template_render_tag('sitetree', 'sitetree_breadcrumbs from "notree"', template_context()) # non-existing tree + + assert result.strip() == '
      \n\t\n
    ' + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_breadcrumbs') + + result = template_render_tag('sitetree', 'sitetree_breadcrumbs from "mytree"', template_context()) + + assert result.strip() == '
      \n\t\n
    ' + + context = template_context(request='/contacts/russia/web/private/') + result = template_render_tag('sitetree', 'sitetree_breadcrumbs from "mytree"', context) + + assert '"/contacts/russia/web/"' in result + assert '"/contacts/russia/"' in result + assert '"/contacts/"' not in result # inbreadcrumbs False + assert '"/home/"' in result + + +def check_page_attr_tag(realm, value, settings, monkeypatch, template_render_tag, template_context): + +~~ with pytest.raises(TemplateSyntaxError): # Invalid tag arguments. + template_render_tag('sitetree', f'sitetree_page_{realm}') + + context = template_context(request='/contacts/russia/') + result = template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"', context) + + assert result == value + + result = template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree" as somevar', context) + + assert result == '' + assert context.get('somevar') == value + + settings.DEBUG = True + + with pytest.raises(SiteTreeError) as e: + template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"') + + assert 'django.core.context_processors.request' in f'{e.value}' + + context = template_context(request='/unknown_url/') + + with pytest.raises(SiteTreeError) as e: + template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"', context) + + assert 'Unable to resolve current sitetree item' in f'{e.value}' + + monkeypatch.setattr('sitetree.sitetreeapp.RAISE_ITEMS_ERRORS_ON_DEBUG', False) + result = template_render_tag('sitetree', f'sitetree_page_{realm} from "mytree"', context) + + assert result == '' + + +def test_sitetree_page_title(settings, monkeypatch, template_render_tag, template_context, common_tree): + check_page_attr_tag('title', 'Russia', settings, monkeypatch, template_render_tag, template_context) + + +def test_sitetree_page_hint(settings, monkeypatch, template_render_tag, template_context, common_tree): + check_page_attr_tag('hint', 'The place', settings, monkeypatch, template_render_tag, template_context) + + +def test_sitetree_page_description(settings, monkeypatch, template_render_tag, template_context, common_tree): + check_page_attr_tag( + 'description', 'Russian Federation', settings, monkeypatch, template_render_tag, template_context) + + +def test_sitetree_url(template_render_tag, template_context, common_tree): + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_url') + + target_url = '/contacts/russia/' + + tree_item = common_tree[target_url] + context = template_context({'item_var': tree_item}) + + result = template_render_tag('sitetree', 'sitetree_url for item_var', context) + + assert result == target_url + + result = template_render_tag('sitetree', 'sitetree_url for item_var as somevar', context) + assert result == '' + assert context.get('somevar') == target_url + + +def test_sitetree_menu(template_render_tag, template_context, common_tree): + + result = template_render_tag( + 'sitetree', f'sitetree_menu from "notree" include "{ALIAS_TRUNK}"', template_context()) # non-existing tree + + assert result.strip() == '
      \n\t\n
    ' + +~~ with pytest.raises(TemplateSyntaxError): + template_render_tag('sitetree', 'sitetree_menu') + + item_ruweb = common_tree['/contacts/russia/web/'] + + context = template_context(request='/') + result = template_render_tag('sitetree', f'sitetree_menu from "mytree" include "{item_ruweb.alias}"', context) + + assert '"/contacts/russia/web/"' not in result + assert '"/contacts/russia/web/public/"' in result + assert '"/contacts/russia/web/private/"' in result + + result = template_render_tag('sitetree', f'sitetree_menu from "mytree" include "{item_ruweb.id}"', context) + + assert '"/contacts/russia/web/"' not in result + assert '"/contacts/russia/web/public/"' in result + assert '"/contacts/russia/web/private/"' in result + + context = template_context(request='/contacts/russia/web/') + result = template_render_tag('sitetree', f'sitetree_menu from "mytree" include "{ALIAS_TRUNK}"', context) + + assert '"/users/moderators/"' in result + assert '"/articles/cats/ugly/"' in result + assert '"/home/"' in result + assert '"/users/ordinary/"' in result + + +## ... source file continues with no further TemplateSyntaxError examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-textnode.markdown b/content/pages/examples/django/django-template-base-textnode.markdown new file mode 100644 index 000000000..e47a68846 --- /dev/null +++ b/content/pages/examples/django/django-template-base-textnode.markdown @@ -0,0 +1,101 @@ +title: django.template.base TextNode Example Code +category: page +slug: django-template-base-textnode-examples +sortorder: 500011370 +toc: False +sidebartitle: django.template.base TextNode +meta: Python example code for the TextNode class from the django.template.base module of the Django project. + + +TextNode is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + + +## ... source file abbreviated to get to TextNode examples ... + + + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) + angular_nodelist = NodeList() + for node in django_nodelist: + if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + if part.isdigit(): + token += '[%s]' % part + else: + token += '.%s' % part +~~ node = TextNode('{{ %s }}' % token) + angular_nodelist.append(node) + parser.delete_first_token() + return AngularJsNode(django_nodelist, angular_nodelist, values[0]) + + +@register.simple_tag(name='djng_locale_script', takes_context=True) +def djng_locale_script(context, default_language='en'): + language = get_language_from_request(context['request']) + if not language: + language = default_language + return format_html('angular-locale_{}.js', language.lower()) + + + +## ... source file continues with no further TextNode examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-token-kwargs.markdown b/content/pages/examples/django/django-template-base-token-kwargs.markdown new file mode 100644 index 000000000..ecafe2225 --- /dev/null +++ b/content/pages/examples/django/django-template-base-token-kwargs.markdown @@ -0,0 +1,122 @@ +title: django.template.base token_kwargs Example Code +category: page +slug: django-template-base-token-kwargs-examples +sortorder: 500011375 +toc: False +sidebartitle: django.template.base token_kwargs +meta: Python example code for the token_kwargs callable from the django.template.base module of the Django project. + + +token_kwargs is a callable within the django.template.base module of the Django project. + + +## Example 1 from django-floppyforms +[django-floppyforms](https://github.com/jazzband/django-floppyforms) +([project documentation](https://django-floppyforms.readthedocs.io/en/latest/) +and +[PyPI page](https://pypi.org/project/django-floppyforms/)) +is a [Django](/django.html) code library for better control +over rendering HTML forms in your [templates](/template-engines.html). + +The django-floppyforms code is provided as +[open source](https://github.com/jazzband/django-floppyforms/blob/master/LICENSE) +and maintained by the collaborative developer community group +[Jazzband](https://jazzband.co/). + +[**django-floppyforms / floppyforms / templatetags / floppyforms.py**](https://github.com/jazzband/django-floppyforms/blob/master/floppyforms/templatetags/floppyforms.py) + +```python +# floppyforms.py +from collections import defaultdict +from contextlib import contextmanager + +import django +from django.conf import settings +from django.template import (Library, Node, Variable, + TemplateSyntaxError, VariableDoesNotExist) +~~from django.template.base import token_kwargs +from django.utils.functional import empty + +from ..compat import get_template + + +from django.forms.utils import ErrorList + + +register = Library() + + +def is_formset(var): + significant_attributes = ('forms', 'management_form') + return all(hasattr(var, attr) for attr in significant_attributes) + + +def is_form(var): + significant_attributes = ('is_bound', 'data', 'fields') + return all(hasattr(var, attr) for attr in significant_attributes) + + +def is_bound_field(var): + significant_attributes = ('as_widget', 'as_hidden', 'is_hidden') + return all(hasattr(var, attr) for attr in significant_attributes) + + +## ... source file abbreviated to get to token_kwargs examples ... + + + + @classmethod + def parse_using(cls, tagname, parser, bits, options): + if bits: + if bits[0] == 'using': + bits.pop(0) + if len(bits): + if bits[0] in ('with', 'only'): + raise TemplateSyntaxError( + '%s: you must provide one template after ' + '"using" and before "with" or "only".' % + tagname) + options['using'] = Variable(bits.pop(0)) + else: + raise TemplateSyntaxError('%s: expected a template name ' + 'after "using".' % tagname) + elif not cls.optional_using_parameter: + raise TemplateSyntaxError('Unknown argument for %s tag: %r.' % + (tagname, bits[0])) + + @classmethod + def parse_with(cls, tagname, parser, bits, options): + if bits: + if bits[0] == 'with': + bits.pop(0) +~~ arguments = token_kwargs(bits, parser, support_legacy=False) + if not arguments: + raise TemplateSyntaxError('"with" in %s tag needs at ' + 'least one keyword argument.' % + tagname) + options['with'] = arguments + elif bits[0] not in ('only',) and not cls.optional_with_parameter: + raise TemplateSyntaxError('Unknown argument for %s tag: %r.' % + (tagname, bits[0])) + + if bits: + if cls.accept_only_parameter and bits[0] == 'only': + bits.pop(0) + options['only'] = True + + @classmethod + def parse_for(cls, tagname, parser, bits, options): + if bits: + if bits[0] == 'for': + bits.pop(0) + if len(bits): + options['for'] = Variable(bits.pop(0)) + else: + raise TemplateSyntaxError('%s: expected an argument ' + 'after "for".' % tagname) + + +## ... source file continues with no further token_kwargs examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-token.markdown b/content/pages/examples/django/django-template-base-token.markdown new file mode 100644 index 000000000..6c9da8eaa --- /dev/null +++ b/content/pages/examples/django/django-template-base-token.markdown @@ -0,0 +1,114 @@ +title: django.template.base Token Example Code +category: page +slug: django-template-base-token-examples +sortorder: 500011371 +toc: False +sidebartitle: django.template.base Token +meta: Python example code for the Token class from the django.template.base module of the Django project. + + +Token is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / fields.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./fields.py) + +```python +# fields.py +from typing import Optional + +from django import template +~~from django.template.base import Parser, Token +from django.forms import ChoiceField +from django.utils.safestring import mark_safe + +from .compat import TOKEN_BLOCK +from .templatetags.sitetree import sitetree_tree +from .utils import get_tree_model, get_tree_item_model +from .settings import ITEMS_FIELD_ROOT_ID + +if False: # pragma: nocover + from .models import TreeItemBase, TreeBase # noqa + + +MODEL_TREE_CLASS = get_tree_model() +MODEL_TREE_ITEM_CLASS = get_tree_item_model() + + +class TreeItemChoiceField(ChoiceField): + template: str = 'admin/sitetree/tree/tree_combo.html' + root_title: str = '---------' + + def __init__( + self, + tree: 'TreeBase' = None, + required: bool = True, + + +## ... source file abbreviated to get to Token examples ... + + + super().__init__( + required=required, widget=widget, label=label, initial=initial, + help_text=help_text, *args, **kwargs) + + self.tree = None + self.choices_init(tree) + + def choices_init(self, tree: Optional['TreeBase']): + if not tree: + return + + if isinstance(tree, MODEL_TREE_CLASS): + tree = tree.alias + + self.tree = tree + self.choices = self._build_choices() + + def _build_choices(self): + tree_token = f'sitetree_tree from "{self.tree}" template "{self.template}"' + + context_kwargs = {'current_app': 'admin'} + context = template.Context(context_kwargs) + context.update({'request': object()}) + + choices_str = sitetree_tree( +~~ Parser(None), Token(token_type=TOKEN_BLOCK, contents=tree_token) + ).render(context) + + tree_choices = [(ITEMS_FIELD_ROOT_ID, self.root_title)] + + for line in choices_str.splitlines(): + if line.strip(): + splitted = line.split(':::') + tree_choices.append((splitted[0], mark_safe(splitted[1]))) + + return tree_choices + + def clean(self, value): + if not value: + return None + + try: + return MODEL_TREE_ITEM_CLASS.objects.get(pk=value) + + except MODEL_TREE_ITEM_CLASS.DoesNotExist: + return None + + + +## ... source file continues with no further Token examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-tokentype.markdown b/content/pages/examples/django/django-template-base-tokentype.markdown new file mode 100644 index 000000000..ff8af3738 --- /dev/null +++ b/content/pages/examples/django/django-template-base-tokentype.markdown @@ -0,0 +1,63 @@ +title: django.template.base TokenType Example Code +category: page +slug: django-template-base-tokentype-examples +sortorder: 500011372 +toc: False +sidebartitle: django.template.base TokenType +meta: Python example code for the TokenType class from the django.template.base module of the Django project. + + +TokenType is a class within the django.template.base module of the Django project. + + +## Example 1 from django-sitetree +[django-sitetree](https://github.com/idlesign/django-sitetree) +([project documentation](https://django-sitetree.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-sitetree/)) +is a [Django](/django.html) extension that makes it easier for +developers to add site trees, menus and breadcrumb navigation elements +to their web applications. + +The django-sitetree project is provided as open source under the +[BSD 3-Clause "New" or "Revised" License](https://github.com/idlesign/django-sitetree/blob/master/LICENSE). + +[**django-sitetree / sitetree / compat.py**](https://github.com/idlesign/django-sitetree/blob/master/sitetree/./compat.py) + +```python +# compat.py +from typing import Callable + +try: +~~ from django.template.base import TokenType +~~ TOKEN_BLOCK = TokenType.BLOCK +~~ TOKEN_TEXT = TokenType.TEXT +~~ TOKEN_VAR = TokenType.VAR +except ImportError: + from django.template.base import TOKEN_BLOCK, TOKEN_TEXT, TOKEN_VAR + + +class CommandOption: + + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + + +def options_getter(command_options): + def get_options(option_func: Callable = None): + from optparse import make_option + + func = option_func or make_option + options = tuple([func(*option.args, **option.kwargs) for option in command_options]) + + return [] if option_func is None else options + + return get_options + + + +## ... source file continues with no further TokenType examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown b/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown new file mode 100644 index 000000000..cd6ea6d80 --- /dev/null +++ b/content/pages/examples/django/django-template-base-variabledoesnotexist.markdown @@ -0,0 +1,111 @@ +title: django.template.base VariableDoesNotExist Example Code +category: page +slug: django-template-base-variabledoesnotexist-examples +sortorder: 500011373 +toc: False +sidebartitle: django.template.base VariableDoesNotExist +meta: Python example code for the VariableDoesNotExist class from the django.template.base module of the Django project. + + +VariableDoesNotExist is a class within the django.template.base module of the Django project. + + +## Example 1 from django-pipeline +[django-pipeline](https://github.com/jazzband/django-pipeline) +([project documentation](https://django-pipeline.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/django-pipeline/)) +is a code library for handling and compressing +[static content assets](/static-content.html) when handling requests in +[Django](/django.html) web applications. + +The django-pipeline project is open sourced under the +[MIT License](https://github.com/jazzband/django-pipeline/blob/master/LICENSE.txt) +and it is maintained by the developer community group +[Jazzband](https://jazzband.co/). + +[**django-pipeline / pipeline / templatetags / pipeline.py**](https://github.com/jazzband/django-pipeline/blob/master/pipeline/templatetags/pipeline.py) + +```python +# pipeline.py +import logging +import subprocess + +from django.contrib.staticfiles.storage import staticfiles_storage + +from django import template +~~from django.template.base import Context, VariableDoesNotExist +from django.template.loader import render_to_string +from django.utils.safestring import mark_safe + +from ..collector import default_collector +from ..conf import settings +from ..exceptions import CompilerError +from ..packager import Packager, PackageNotFound +from ..utils import guess_type + +logger = logging.getLogger(__name__) + +register = template.Library() + + +class PipelineMixin(object): + request = None + _request_var = None + + @property + def request_var(self): + if not self._request_var: + self._request_var = template.Variable('request') + return self._request_var + + def package_for(self, package_name, package_type): + package = { + 'js': getattr(settings, 'JAVASCRIPT', {}).get(package_name, {}), + 'css': getattr(settings, 'STYLESHEETS', {}).get(package_name, {}), + }[package_type] + + if package: + package = {package_name: package} + + packager = { + 'js': Packager(css_packages={}, js_packages=package), + 'css': Packager(css_packages=package, js_packages={}), + }[package_type] + + return packager.package_for(package_type, package_name) + + def render(self, context): + try: + self.request = self.request_var.resolve(context) +~~ except VariableDoesNotExist: + pass + + def render_compressed(self, package, package_name, package_type): + if settings.PIPELINE_ENABLED: + return self.render_compressed_output(package, package_name, + package_type) + else: + return self.render_compressed_sources(package, package_name, + package_type) + + def render_compressed_output(self, package, package_name, package_type): + method = getattr(self, f'render_{package_type}') + + return method(package, package.output_filename) + + def render_compressed_sources(self, package, package_name, package_type): + if settings.PIPELINE_COLLECTOR_ENABLED: + default_collector.collect(self.request) + + packager = Packager() + method = getattr(self, f'render_individual_{package_type}') + + try: + paths = packager.compile(package.paths) + + +## ... source file continues with no further VariableDoesNotExist examples... + +``` + diff --git a/content/pages/examples/django/django-template-base-variablenode.markdown b/content/pages/examples/django/django-template-base-variablenode.markdown new file mode 100644 index 000000000..8a0e361a0 --- /dev/null +++ b/content/pages/examples/django/django-template-base-variablenode.markdown @@ -0,0 +1,155 @@ +title: django.template.base VariableNode Example Code +category: page +slug: django-template-base-variablenode-examples +sortorder: 500011374 +toc: False +sidebartitle: django.template.base VariableNode +meta: Python example code for the VariableNode class from the django.template.base module of the Django project. + + +VariableNode is a class within the django.template.base module of the Django project. + + +## Example 1 from django-angular +[django-angular](https://github.com/jrief/django-angular) +([project examples website](https://django-angular.awesto.com/classic_form/)) +is a library with helper code to make it easier to use +[Angular](/angular.html) as the front-end to [Django](/django.html) projects. +The code for django-angular is +[open source under the MIT license](https://github.com/jrief/django-angular/blob/master/LICENSE.txt). + +[**django-angular / djng / templatetags / djng_tags.py**](https://github.com/jrief/django-angular/blob/master/djng/templatetags/djng_tags.py) + +```python +# djng_tags.py +import json + +from django.template import Library +~~from django.template.base import Node, NodeList, TextNode, VariableNode +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import get_language_from_request + +from djng.core.urlresolvers import get_all_remote_methods, get_current_remote_methods + + +register = Library() + + +@register.simple_tag(name='djng_all_rmi') +def djng_all_rmi(): + return mark_safe(json.dumps(get_all_remote_methods())) + + +@register.simple_tag(name='djng_current_rmi', takes_context=True) +def djng_current_rmi(context): + return mark_safe(json.dumps(get_current_remote_methods(context.get('view')))) + + +@register.simple_tag(name='load_djng_urls', takes_context=True) +def djng_urls(context, *namespaces): + raise DeprecationWarning( + "load_djng_urls templatetag is deprecated and has been removed from this version of django-angular." + "Please refer to documentation for updated way to manage django urls in angular.") + + +class AngularJsNode(Node): + def __init__(self, django_nodelist, angular_nodelist, variable): + self.django_nodelist = django_nodelist + self.angular_nodelist = angular_nodelist + self.variable = variable + + def render(self, context): + if self.variable.resolve(context): + return self.angular_nodelist.render(context) + return self.django_nodelist.render(context) + + +@register.tag +def angularjs(parser, token): + bits = token.contents.split() + if len(bits) < 2: + bits.append('1') + values = [parser.compile_filter(bit) for bit in bits[1:]] + django_nodelist = parser.parse(('endangularjs',)) + angular_nodelist = NodeList() + for node in django_nodelist: +~~ if isinstance(node, VariableNode): + tokens = node.filter_expression.token.split('.') + token = tokens[0] + for part in tokens[1:]: + if part.isdigit(): + token += '[%s]' % part + else: + token += '.%s' % part + node = TextNode('{{ %s }}' % token) + angular_nodelist.append(node) + parser.delete_first_token() + return AngularJsNode(django_nodelist, angular_nodelist, values[0]) + + +@register.simple_tag(name='djng_locale_script', takes_context=True) +def djng_locale_script(context, default_language='en'): + language = get_language_from_request(context['request']) + if not language: + language = default_language + return format_html('angular-locale_{}.js', language.lower()) + + + +## ... source file continues with no further VariableNode examples... + +``` + + +## Example 2 from django-cms +[django-cms](https://github.com/divio/django-cms) +([project website](https://www.django-cms.org/en/)) is a Python-based +content management system (CMS) [library](https://pypi.org/project/django-cms/) +for use with Django web apps that is open sourced under the +[BSD 3-Clause "New"](https://github.com/divio/django-cms/blob/develop/LICENSE) +license. + +[**django-cms / cms / utils / placeholder.py**](https://github.com/divio/django-cms/blob/develop/cms/utils/placeholder.py) + +```python +# placeholder.py +import operator +import warnings +from collections import OrderedDict + +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.db.models.query_utils import Q +from django.template import TemplateSyntaxError, NodeList, Variable, Context, Template, engines +~~from django.template.base import VariableNode +from django.template.loader import get_template +from django.template.loader_tags import BlockNode, ExtendsNode, IncludeNode + +from six import string_types + +from sekizai.helpers import get_varname + +from cms.exceptions import DuplicatePlaceholderWarning +from cms.utils.conf import get_cms_setting + + +def _get_nodelist(tpl): + if hasattr(tpl, 'template'): + return tpl.template.nodelist + else: + return tpl.nodelist + + +def get_context(): + if engines is not None: + context = Context() + context.template = Template('') + return context + else: + + +## ... source file continues with no further VariableNode examples... + +``` + diff --git a/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html b/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html index 80bb0c4a2..831ec665a 100644 --- a/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html +++ b/theme/templates/blog/render-markdown-django-3-0-django-markdown-view.html @@ -1,3 +1,4 @@ + Learning Programming Web development Django diff --git a/theme/templates/code-examples/django.html b/theme/templates/code-examples/django.html index 59d77eb82..7b6c539bf 100644 --- a/theme/templates/code-examples/django.html +++ b/theme/templates/code-examples/django.html @@ -183,6 +183,21 @@

    django.shortcuts render, resolve_url

    +

    django.template.base + Context, + FilterExpression, + Node, + NodeList, + Parser, + Template, + TemplateSyntaxError, + TextNode, + Token, + TokenType, + VariableDoesNotExist, + VariableNode, + token_kwargs +

    django.template.response SimpleTemplateResponse, TemplateResponse From 3c67d084be202a9461ad3fd0cba83255b68fa49c Mon Sep 17 00:00:00 2001 From: Samuel Huang Date: Sun, 12 Jul 2020 18:27:43 -0700 Subject: [PATCH 095/207] Add Chowist to Django example projects --- content/pages/04-web-development/02-django.markdown | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/pages/04-web-development/02-django.markdown b/content/pages/04-web-development/02-django.markdown index 06ee0deee..79add9f0e 100644 --- a/content/pages/04-web-development/02-django.markdown +++ b/content/pages/04-web-development/02-django.markdown @@ -364,6 +364,10 @@ real-world example applications, and many more can be found on the * [Taiga](https://github.com/taigaio/taiga-back) is a project management tool built with Django as the backend and AngularJS as the front end. +* [Chowist](https://github.com/huangsam/chowist) is a web application + that replicates core features of Yelp and adds a couple more bells + and whistles. + ## Open source code to learn Django There are many open source projects that rely on Django. From 042bc4ce0ba522e82fd7df1edcba669c6baec458 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sat, 18 Jul 2020 14:39:22 -0400 Subject: [PATCH 096/207] update makefile to combine sed's --- Makefile | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 930fc187a..a7371bed8 100644 --- a/Makefile +++ b/Makefile @@ -12,31 +12,7 @@ run: prod: run rm -rf generated/updated_site/pages/ - sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[0-9]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html - sed -i '' 's/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html + sed -i '' 's/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.~*=&;/-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g; s/\(.[0-9]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9()_]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_.]*\)<\/span>/\1/g; s/\(.[a-zA-Z0-9 ()_]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 ()_,&;:#{}]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*!%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^\\\;:+#{}~*@`!?%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /\\\()_,.&$^;:+#{}|=~*@`!?%-]*\)<\/span>/\1/g; s/\(.[][a-zA-Z0-9 /()_,.&^;:+#{}*@`!%-]*\)<\/span>/\1/g; s/<\/span>//g; s/<\/span>//g' generated/updated_site/*.html generated/updated_site/blog/*.html bookbuild: From 71829a2f3b2852ff3c333bf7881545bbc6e4581c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jul 2020 13:10:35 -0400 Subject: [PATCH 097/207] add new post on django-user-visit --- ...daily-user-data-django-user-visit.markdown | 389 ++++++++++++++++++ .../django-admin-dashboard.png | Bin 0 -> 198073 bytes .../django-admin-django-user-visit.png | Bin 0 -> 268931 bytes .../django-admin-login.png | Bin 0 -> 117029 bytes .../django-success.png | Bin 0 -> 101527 bytes .../django-user-visit-details.png | Bin 0 -> 286730 bytes .../user-visit-record.png | Bin 0 -> 189507 bytes ...ack-daily-user-data-django-user-visit.html | 4 + 8 files changed, 393 insertions(+) create mode 100644 content/posts/200719-track-daily-user-data-django-user-visit.markdown create mode 100644 static/img/200719-django-user-visit/django-admin-dashboard.png create mode 100644 static/img/200719-django-user-visit/django-admin-django-user-visit.png create mode 100644 static/img/200719-django-user-visit/django-admin-login.png create mode 100644 static/img/200719-django-user-visit/django-success.png create mode 100644 static/img/200719-django-user-visit/django-user-visit-details.png create mode 100644 static/img/200719-django-user-visit/user-visit-record.png create mode 100644 theme/templates/blog/track-daily-user-data-django-user-visit.html diff --git a/content/posts/200719-track-daily-user-data-django-user-visit.markdown b/content/posts/200719-track-daily-user-data-django-user-visit.markdown new file mode 100644 index 000000000..c08b23529 --- /dev/null +++ b/content/posts/200719-track-daily-user-data-django-user-visit.markdown @@ -0,0 +1,389 @@ +title: Tracking Daily User Data in Django with django-user-visit +slug: track-daily-user-data-django-user-visit +meta: Learn how to easily track daily user visits and related data in Django projects with django-user-visit. +category: post +date: 2020-07-19 +modified: 2020-07-19 +newsletter: False +headerimage: /img/headers/django.jpg +headeralt: Logos for the implementations used in this blog post. Copyright their respective owners. + + +It can be tedious to figure out what data to track, create data models +and build [middleware](https://docs.djangoproject.com/en/stable/topics/http/middleware/) for your [Django](/django.html) project if you just want to +collect some basic information about clients that connect to your web application +. Fortunately, the library [django-user-visit](https://github.com/yunojuno/django-user-visit) +is a handy Django project that quickly handles all +of this complexity for you. In this tutorial, we'll learn +how to use django-user-visit in a new Django project +to add daily visit data tracking to Django projects. + +When we're done, we can view information like the following in the Django Admin: + +Django Admin with django-user-visit information + + + +## Project Requirements +Ensure you have Python 3 installed, because Python 2 reached its +end-of-life at the beginning of 2020 and is no longer supported. +Preferrably, you should have +[Python 3.7 or greater installed](https://www.python.org/downloads/) +in your [development environment](/development-environments.html). +This tutorial will also use: + +We will use the following dependencies to complete this +tutorial: + +* [Django](/django.html) [web framework](/web-frameworks.html), + [version 3.0.8](https://www.djangoproject.com/download/) +* [django-user-visit](https://github.com/yunojuno/django-user-visit), + [version 0.4](https://pypi.org/project/django-user-visit/) + +All code in this blog post is available open source under the MIT license +on GitHub under the +[track-daily-user-data-django-user-visit directory of the blog-code-examples repository](https://github.com/fullstackpython/blog-code-examples). +Use the source code as you desire for your own projects. + + +## Development environment set up +Change into the directory where you keep your Python +[virtual environments](/virtual-environments-virtualenvs-venvs.html). +Create a new virtualenv for this project using the following +command. + +Start the Django project by creating a new +[virtual environment](/virtual-environments-virtualenvs-venvs.html) +using the following command. I recommend using a separate directory +such as `~/venvs/` (the tilde is a shortcut for your user's `home` +directory) so that you always know where all your virtualenvs are +located. + +```bash +python3 -m venv ~/venvs/djuservisit +``` + +Activate the virtualenv with the `activate` shell script: + +```bash +source ~/venvs/djuservisit/bin/activate +``` + +After the above command is executed, the command prompt will +change so that the name of the virtualenv is prepended to the +original command prompt format, so if your prompt is simply +`$`, it will now look like the following: + +```bash +(djuservisit) $ +``` + +Remember, you have to activate your virtualenv in every new terminal +window where you want to use dependencies in the virtualenv. + +We can now install the [Django](https://pypi.org/project/Django/) +package into the activated but otherwise empty virtualenv. + +``` +pip install django==3.0.8 django-user-visit==0.4 +``` + +Look for output similar to the following to confirm the appropriate +packages were installed correctly from PyPI. + +``` +(djuservisit) $ pip install django==3.0.8 django-user-visit==0.4 +Collecting django==3.0.8 + Using cached https://files.pythonhosted.org/packages/ca/ab/5e004afa025a6fb640c6e983d4983e6507421ff01be224da79ab7de7a21f/Django-3.0.8-py3-none-any.whl +Collecting django-user-visit==0.4 + Downloading https://files.pythonhosted.org/packages/23/ef/d3ec22c3a897192e267389d6ee59ce1858f5ede262b078f93211aff110e7/django_user_visit-0.4-py3-none-any.whl +Collecting sqlparse>=0.2.2 (from django==3.0.8) + Using cached https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl +Collecting asgiref~=3.2 (from django==3.0.8) + Using cached https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl +Collecting pytz (from django==3.0.8) + Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl +Collecting user-agents<3.0,>=2.1 (from django-user-visit==0.4) + Using cached https://files.pythonhosted.org/packages/1b/be/82e4d20a7716d8e5de98b948edcecff9bb237e6718c3831bd92794fe9821/user-agents-2.1.tar.gz +Collecting ua-parser>=0.9.0 (from user-agents<3.0,>=2.1->django-user-visit==0.4) + Using cached https://files.pythonhosted.org/packages/9d/22/4d16b08db329fd440eed366d35e4dd7195c9babb4ecac5218f28081522a2/ua_parser-0.10.0-py2.py3-none-any.whl +Installing collected packages: sqlparse, asgiref, pytz, django, ua-parser, user-agents, django-user-visit + Running setup.py install for user-agents ... done +Successfully installed asgiref-3.2.10 django-3.0.8 django-user-visit-0.4 pytz-2020.1 sqlparse-0.3.1 ua-parser-0.10.0 user-agents-2.1 + +``` + +Our dependencies are installed so we can now create our +project and start coding. + + +## Creating the application +We have everything we need to start building our application. + +We can use the [Django](/django.html) `django-admin` tool to create +the boilerplate code structure to get our project started. +Change into the directory where you develop your applications. For +example, I typically use `/Users/matt/devel/py/` for all of my +Python projects. Then run the following command to start a Django +project named `djuservisit`: + +``` +django-admin.py startproject djuservisit +``` + +Note that in this tutorial we are using the same name for both the +virtualenv and the Django project directory, but they can be +different names if you prefer that for organizing your own projects. + +The `django-admin` command creates a directory named `djuservisit` +along with several subdirectories that you should be familiar with +if you have previously worked with Django. + +Change directories into the new project. + +``` +cd djuservisit +``` + +Open `djuservisit/djuservisit/settings.py`. Add the `user_visits` +app and its middleware to `settings.py` by inserting the two +highlighted lines: + +```python +# djuservisit/djuservisit/settings.py +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +~~ 'user_visit', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +~~ 'user_visit.middleware.UserVisitMiddleware', +] +``` + +Make sure you change the default `DEBUG` and `SECRET_KEY` +values in `settings.py` before you deploy any code to production. Secure +your app properly with the information from the Django +[production deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/) +so that you do not add your project to the list of hacked applications +on the web. + +Save and close `settings.py`. + +Create a [Django superuser](https://docs.djangoproject.com/en/stable/ref/django-admin/) +so you can access the Django Admin. Go to the base directory of this project +and use the `manage.py` file with the following command: + +``` +python manage.py createsuperuser +``` + +Follow the prompts and enter values for the username, email address and +password that you want your local Django superuser to have. Next, we'll +test out how this library works when a user visits a page created by +our Django web app. + + +## Testing django-user-visit +Let's test out our bare-bones application. Execute the development server +with the following command: + +```bash +python manage.py runserver +``` + +The Django development server should start up with no issues. + +``` +Watching for file changes with StatReloader +Performing system checks... + +System check identified no issues (0 silenced). +July 19, 2020 - 13:01:41 +Django version 3.0.8, using settings 'djuservisit.settings' +Starting development server at http://127.0.0.1:8000/ +Quit the server with CONTROL-C. +``` + +Open a web browser and go to "http://localhost:8000". + +Default Django page. + +That's the default page provided by Django in the absence of any other URLs +to serve at the root URL, but it works for our purposes. + +Go to the Django Admin by changing the URL in your browser to +"http://localhost:8000/admin". The Django Admin login page will appear. + +Django admin default login screen. + +Enter the username and password of the superuser you just created with +the `manage.py` command to log in. Next, you will see the Django admin +dashboard. + +Django admin dashboard. + +The "User visit log" has already been added to the Admin. Click on +the "User visits" link. + +django-user-visit list in the Django admin dashboard. + +The list of all users that have visited by day will show up. + +django-user-visit details page in the Django admin. + +Click on any of the visits to see more detailed data about the record, +just like you would with any Django Admin extension. + +That library was pretty easy to install for the information that it +aggregates for you. Next, let's take a closer look at the +[Django ORM](/django-orm.html) model that powers this library. + + +## Inspecting the django-user-visit model +We confirmed that django-user-visit is properly installed. Let's take a closer +look at the model the library provides to store the user data. + +Take a look at the source code for +[django-user-visit/user_visit/models.py](https://github.com/yunojuno/django-user-visit/blob/master/user_visit/models.py) +on GitHub. Below is an excerpt with the relevant lines of that source file. +I've highlighted a few lines that will be discussed below the code excerpt. + +```python +## ... source code abbreviated ... + +class UserVisit(models.Model): + """ + Record of a user visiting the site on a given day. + This is used for tracking and reporting - knowing the volume of visitors + to the site, and being able to report on someone's interaction with the site. + We record minimal info required to identify user sessions, plus changes in + IP and device. This is useful in identifying suspicious activity (multiple + logins from different locations). + Also helpful in identifying support issues (as getting useful browser data + out of users can be very difficult over live chat). + """ + +~~ user = models.ForeignKey( +~~ settings.AUTH_USER_MODEL, related_name="user_visits", on_delete=models.CASCADE +~~ ) + timestamp = models.DateTimeField( + help_text="The time at which the first visit of the day was recorded", + default=timezone.now, + ) + session_key = models.CharField(help_text="Django session identifier", max_length=40) + remote_addr = models.CharField( + help_text=( + "Client IP address (from X-Forwarded-For HTTP header, " + "or REMOTE_ADDR request property)" + ), + max_length=100, + blank=True, + ) +~~ ua_string = models.TextField( +~~ "User agent (raw)", help_text="Client User-Agent HTTP header", blank=True, +~~ ) + uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + hash = models.CharField( + max_length=32, + help_text="MD5 hash generated from request properties", + unique=True, + ) + created_at = models.DateTimeField( + help_text="The time at which the database record was created (!=timestamp)", + auto_now_add=True, + ) + + objects = UserVisitManager() + + class Meta: + get_latest_by = "timestamp" + + def __str__(self) -> str: + return f"{self.user} visited the site on {self.timestamp}" + + def __repr__(self) -> str: + return f"" + + def save(self, *args: Any, **kwargs: Any) -> None: + """Set hash property and save object.""" +~~ self.hash = self.md5().hexdigest() + super().save(*args, **kwargs) + + @property + def user_agent(self) -> user_agents.parsers.UserAgent: + """Return UserAgent object from the raw user_agent string.""" + return user_agents.parsers.parse(self.ua_string) + + @property + def date(self) -> datetime.date: + """Extract the date of the visit from the timestamp.""" + return self.timestamp.date() + + # see https://github.com/python/typeshed/issues/2928 re. return type + def md5(self) -> hashlib._Hash: + """Generate MD5 hash used to identify duplicate visits.""" +~~ h = hashlib.md5(str(self.user.id).encode()) # noqa: S303 + h.update(self.date.isoformat().encode()) + h.update(self.session_key.encode()) + h.update(self.remote_addr.encode()) + h.update(self.ua_string.encode()) + return h + +``` + +A few things to note based on the highlighted above: + +* The `UserVisit` model matches up with the + [Django user model](https://docs.djangoproject.com/en/stable/ref/contrib/auth/) + using the `user = models.ForeignKey...` line +* The code uses the `save` function to ensure the some of the fields + are automatically populated, such as the `hash` property using the + `hashlib` module +* This library has a dependency on the + [user_agents library](https://pypi.org/project/user-agents/) to parse the + [User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) + of the browser the client is using + +Reading the source code for libraries like django-user-visit is helpful +not only to know what it is doing under the covers, but also to learn new +ways to code your own applications. + +Take a look at the [Django code examples](/django-code-examples.html) and +[Django extensions](/django-extensions-plug-ins-related-libraries.html) pages +to see more projects with good Python example code that you can learn from. + + +## Additional resources +We just finished building an app that tracks daily user visits with the +django-user-visit library. + +Next, try out some of these other related [Django](/django.html) tutorials: + +* [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) +* [How to Add Maps to Django Web App Projects with Mapbox](/blog/maps-django-web-applications-projects-mapbox.html) +* [Monitoring Django Projects with Rollbar](/blog/monitor-django-projects-web-apps-rollbar.html) + +Questions? Let me know via +[a GitHub issue ticket on the Full Stack Python repository](https://github.com/mattmakai/fullstackpython.com/issues), +on Twitter +[@fullstackpython](https://twitter.com/fullstackpython) +or [@mattmakai](https://twitter.com/mattmakai). +If you see an issue or error in this tutorial, please +[fork the source repository on GitHub](https://github.com/mattmakai/fullstackpython.com/blob/master/content/posts/200719-track-daily-user-data-django-user-visit.markdown) +and submit a pull request with the fix. + diff --git a/static/img/200719-django-user-visit/django-admin-dashboard.png b/static/img/200719-django-user-visit/django-admin-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..e958c6ead6e7047c8004dd4a30e436ce337147ab GIT binary patch literal 198073 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

    %i14ebrZhP$4FWRSNkSjgU^dN^ zx?R)}`4tovi1(#wXX}yTm{9xkdk@SP%}C!rJUrFt<=`{uhiIwn*kOyQ!ggct-SUu& zynJ_*3i^;YP$HOBQ`x8+?v62I^uTG?9WR$Z}ydB|) zRaZvt4KAscO)C$Yn<5_xV@L1xj(>vVX*g+YxpdYQ4hxUv?X8wp0{39MfsptYs%cD_$|k3o}_fPu)+tF=Vi5q!iTX^rDzOj-LLI#zYV5Y=7Fs zd6{&zNyyo{lftEnfgKui*Hfrl(YX->5ko`iOYSjYAe|&}c3XzUnU`y_-pYrzW$(9F z5^WIX2OUkw=~CU=+ubcfvp!4DCjLH~L-@~PKKm!omSnMF^1teW*x-tErkU$6L+UtCV!}RcqG#%A?^&& zLObKxZu~)olYOf#Wj*^?#;-P*+aB!4$H(`&&i;jOg(DSA1syDg(ypvLBVrX4(ViAi2|}x5UgqSDRLHj$ z>&zfQ`%*&{S6)*xiMiP09JmA>(qUw7-x$Tip$;l-RPTN#x@-tH=zZdUOa*Azf+s6O zLisr(X>Z*W{{)b{PeL*Id}_jH9=W1(sbw0y z{VE@c-`c@cKP}6)Is;5JD5*_FexL7&dRAUZov2VCt4MM?noN~Pf0-HgQ(%?v@A>P& zkgt0c!iquPe>{cLbLoLa3w((2uPf5+$>D~o&2UDWGr&zSn(qp$HyQ96+^Sa0h*InZ z-l2PiP4TeMI(f+xp+T7DR*rXm2i;h_^!34yUNmonW2jb-x13@{dwM_b;6zt(+>mjS zO|-mHvgqX!l;qX|^d=r1B)VVWB|ew7y^cLoL9b1;WZ!MH;_XH8=qvW9aT%7u!rDZa z+^~~v9tRr?gb(1esvNhF_Oz;mZmF{bW=4Vca`Vs55j)*N*cUw@$T7?YBrl2cZz;9d z3QO@DWHO`T`#~e&WI7-YWim=*>3*U}wpf_Mh1vrzux>2Rr+6EjC*A$J88jYC5h!Hc zfaGfCuAG>Pio6|YdOTZ_lM&&4zZQztZ9*rrX~=hBojoXrq?5@5!wp2=&85b0ZLjkv z(BiO3BPJanOu_oW5{(BDmvIwt2@PjL7&gMTgLlKq2KAm`*F}(myPwcP-hZ+2fWQbU zPA%nvg?C~y$X~UR%1d--gTRDezN4` zJOZoykJOTAhTm(wTkNM!P-S0nT8YUv)9-e55y7E8pbz+-&B@NLDI-5_c7K^+Ag(Xc z_fkMBe|z#Po-u#00MS0-K%;3@h~eZU&}7tPtvhQbN=#?hdI+d;K%RE|3H8DY>DcDtvCzIV1Z(P8I0bhnoeBNlqV^N_SvoH2g z{`V;j@vH~9GWSA1!xVhmpFfD8apVrLQifPWL`1aH*{wBFBAJ^0L`DicYgW_x$dxxh zwVLD?Yt#7$+IH}~+Sy;Tan#wATGva}Ta-@qlZUzJL}qj5r1i_V%SqSuF0idecIe~= z^p5oopF}dw_UUk-`Jy~n$dPuM>pVQZfaVeoR%^+5O-(f&<-V|6g5p&%@zEBnpL2fHh$sJMMx%| zEsBWz&=UE*+3put0CL&b0$goBf-NBbGOzaDkQ?mcpbs&RK6JX1ls4PvhPkgy+twTV z9WB-w<|OJJU<5(O2JWMw{LOpRh0WEwHTKUo6PPwBCP_zFT;Ej&<4z1B9$~3Prj$}9 z72Wg?`JzuYW$TY3?&n4}YQL z{CVw(2?`J)x;kWF&#w`L^pNc7 zc-m`2?kM=(dl^+Z`)*X&Ff)?Cw3Va|oDtUSbZ_kUe^=!J&hcd2(h@#Av>ZiMF@By^ zZ3THZigjB9;Ern(ZaRBh1Xndmapt=1Zh<7EWP2+aBF^=9XXJ>n#X43Q11-BOOGHon`~ak=`nvx{g0 zOs9CCZ)4@S(FGi0y)9HI-qr-~{4RjO)MiFaB+bV|eiFSDMXZ}B6+NSE$mw`BPR~}p zw=ajFZfE@P;Z-lly1H92j*{o20q_YJH}qhVtq5HuMc<)KVai^bPk%0l8 z145p^e*_kcG#~WkW@1t}*cRHYmS-*Fqfuud+M(L<#jPH_{IatNzbwYxTq*itx6-QR zHgyTx={VVjqhh|UwO}CfN zT=3e^NFU5hnbyA^H+~5*VzqiJPQ3^588G-1HsKE= z9h@>)jjuEe1fE@x9-O~3WMeU%h^^}wdt;2vbJb#DVh}C%WSBamyvp4qI#ZTq zK~CoN!MQ$QeG9%+`Bes}Mv|J&hBc;~{B7}>O}S#|iy|Z2^2*d+zBKgU_M$SfCmRmL z-;HthmQ~PTh0J_RuRDiGyCb&qMha`Vm2T2-DQ(RU6DrgHM4g&Xah{oS2$T{mRRua5 z4?Bw*35ubnN7=Adj)+|cE1f%LO_UC|>B`$aOjw?^tj4425KjWr&WwoDv$M!cf$!?P z5!iTX_4|4@(h{9?uWSsH^r=)L-*=K=$VfkXSBEk1qU`YwTtb88@-g4wqld)!&+Kx- znMY0q*kMu%U6@ZPL|90M8KP^Dq4oFOfF>N;mC;3C37Q--ZawCIsCzY&KQ8zjRt=rk z)mE#rDcqjqOD?GJb`=GsRaSDf?Uz@$eY1HC?%NKwfh%bCopParg+Vh>j3FppO_8jr zPqF3O4#iU<$1lf0>zQBI%v*&G<3=L91;Mej6+CLOy+xOzcWMeRaxz)ebGhW4@rOtc zYt-u?3zUYdicKX+8+*Su7W&E;>3F8ReIpt6m%bZJr~8EFR+TOCjphjDfM-5@FLvUh z2}=9G2^quKF=hkZUOY~Er`zb2f1zeYRc`j2zUzLWqaO2yK$k@|y$G(~VxNeYwXnDI zhY+joM_*_N#4=#F{k-AfkK;d8AD|AIf3xzG=z&B&y#;I-PeYP1GoJ~0dQUimt#>C!PM_)zLhd6Iw{ZAgd8k~PdJ7yh{c;&aG168a;3XqX-e0+l+x1ZUz3N+?=Tig1MaBd7(g`!qijpeWE{oAO zLA^t4H2noBoZ4pj;3v3W71QXqSBt#DOsNg|2!M@Ve$4M1y*m(JiRQHyjj*AF;4}j4 zlHdWND1*I~p&JSF5sl6G)o*#69AgYd`^D@B=>k~oNk{+X1z@+_Ts6zY@LJeWH>T0e z!bf$z``#SfEGZ`C4G#`O(hQ2cYUS}>iE)yDL&#B`fgOXm`SMtBwh!n z(C%QWn7TA>cNU*Sock=+5{bnH5)+K(Xn+Xb*O4#(^4J%o*`3}|8%K4F$5XUrFF?Jd zv$HeDZ2|W>U1JL3_o*IE&h}!*Usbl%(9zuVO)hrJN&s_*^wIVpxUW<^xv`(-pX=X+ zXCra}i5WGWED(RBkNN0cgvc+;K`pt>xBxGjQ}ABB>CNYu2wF$7XbgcXvghRAjur2^ zY3tfI`ag@_H@-d_0sLXy$@9z?R)H0Yq}t>az~o=1Hqt)qd+}1Vh;c3KUV9t6nbYF3 zvQe4h=JFa>PLWHP0Vog5R1^5MjvXmIJ+EFajDq|erMFX4-Th`R#k=yHO~bY0x6vIa z3E{XSgpeNwF-*b^yz%Yiz=Za!yrj&myoCMb+@z(0+|(uU2L^Xn?eLb1FW5;2tOW62 zlF_pXoD+w0W{jV53sH=EK9C8Rt6m4;@WhYvbf_M8A&i8iM3{m7O|;Is2NcXbNe63P zH)s15HTwrO0rwS_gQt^WW_C3TaM?TIv7M(O>B3J9U!JzE8ignHKFv&HOgBLnxTLCm zMK7tZfG0p^66;%6Mf{Xg;U^}&@@GXVVQaSE;mL;z9sD&M&fU}-Ws=1telpLf!M^03-VeiVTRMH>+OT%lbx>t?6ws0f`xvGXdHE6U4b zTOW5coc<}#>gR~mquF69-$DHeFf3%cjOTWJjUs z&BZ{y6I7NI=JzlK7?C5mr;|+tx~zkG6y7v+FsSWS+05#!e=Y);<*Q5=#sL|vRI|7| zSDZWU&H)dyQzOi)kh8w=?(17uuRas;oMx9QaRd5lvvx7ur{tegA(oT#(`Mk@u8@R7@Ae7WewA$nM#A&EQv9H*UfudRVRF6M#Gs zq5IK{LZ)fiDNH@Z*-U)_c?tHs*Kpw{r=s3lV(=v%&W$2?PYe*z$Y#hBAcO+I{Bsye_2_`dp^l6G&}+b?z9gd%x-T4VP;$fnNI zZR&SHQeWcY)TMD9EBQi6Vy`vn{wVvCZGa$#o;kyJiAh?5)gH_C>nRqTAFWj{y$~TR zPs+-E{Xi?Srirg>M#6iHEhk!^2AoJ~@N}M-{-bXFwEc+x=|&$GmZbUa@4DMx5t_6r zSsB}tCF!E6diZ(c*W^PA(GhinHp1E4a%haPAH2NMGoLvb6Pvcr%*;^LSOidLxenaX zGcc%`ISJZ->d~zkUdA^b3&^8jE0QGm>LWzwoHMT^tF)=?`c;Vva+J7j`pjbZyYlZ7 zW~{^KQPVcWd|WasD$Q^1$Bvv7uoG&X?_ZP#@alY!`7*c&?Yqu@pz>~IabZ-VDpAc8 zd_5&`uKH8PDeEOGTcoq;$~>^q96Y`G`enEh0Q7!)BBL;mvckc81&AKI0zTBPpYS!n4_dS6(84(9!Si)XzI$%2xnZUXkzB`7BEP7UNi4IuVWSz5+OEjZ4Y9KO~>U+(@a?Zy9k7@KwCMoK^sU`eR}nhjb@sJ^*&u z#*0RuZ>IHhe#CHVS#haQ%@TgAW$g^WVBvbN{pZjMF>H;y8nz_*TJE_&EJnO(b)Cletb$=WeTSGZ{O}=AX`ERF)U<9l9}chrbO{Jc$;(1vk%5t^ZcR})=C5| zGuyT}Q%hgYrt`B7aNA|`71QeS8#324VVerKQ=WpU^T4VVO1^D4Jgpib8k_I+eKR8O zMlwvhF>rti0k@1@Yh;qK_Z;l(!);KG>y5i#ExhU;P@}@Pzu8No(-;VKF--kLjJ*QR zZtvvbs^cTCZLm`WSV(fDM_~@C@#+PYJ+)pH`n~ETv52 z&&fM63%^QJij)H0HBKgSR=2)MBu=`BTS7rD*4*TT!cf|lRy;H1=*bsX$_pL>!``ST z^ZsW{ugy%yQ@Il=D`_Y(9)EBgl+!I`8rjcb0vvfM`4n69-ITdn66=lj1)wF=mltQq zje`vDCxDtvy;A+t6RJuyweMGRP@AEiY(Q`&dvu0C7nPay(9ny_H_^_m?d?7kf<@K_ zF=)lJvo1oapKzxl4&0mUl_Uuup+a%!MXaw!PVBI735XmOV!S+$$=Pd?x0#Ff&7?`{ zJh6ht@k|5j3#B`~6*z>k)gnnD%IUAUR-)m2{80beA6VWa#L!ai-3zs|Ptggy^=2k_ zNqOYFMwLF#hZj-X6>gKC25yEZ z1~vMp;1TcPNs9?5aEG_>thHlyD@}xAGGP^2y5{F954O7J(i~fU>~NkxABmk1iOZOY zcK+N>UtCl)a!}J#ed-f%YWFLiUL@?Ud@D58-_lHka+hTAk&m`^s#t6-bUck0(&s2D zDy9cN6^pfJ`h;Dwo7=x30&pg}smEreR=_3k)%Yf(R1_VJ+d6`q8b}EHVQBT^n~Z?p zwUg*xQIep=f=IXwo8nTPSy<=U80S9mz`W*aQ?GLZ!mA_oOq-!+><|2UdM7rf7hr1H6 zx6O`le@cFr;7GTTD8@{>2(0uclxG)O0ew&SHP7kKEGw(3Ld4bcQ9>$?U^&R>YcoY? z;5$zK8UA{kaXsB;H_>fSGfz+_VE0{<|Giinid(eVFiozkZ5f-)1X_%=7{3UdFmj%> z602F4x}bOPii@RQ&Hjg%N#w<%DuplwNzW8p|IFNKr|07~;78{pIY>@DO0(YdEA=HgIVI;@SfnRgf%ElT@W|rFu6= zA{2z*0NQcL{2~=ZQ~@-qVAMW8)iZm>59kBPNCG2=66J#~#9H9cree0Q4!`QLYSOSP zn?yl-I)O*?0}6fy%gvHqh`)i5Pr*w^C{QIajD5ThG6Zni*p~r(C^fCln(u=>pQ_k3 z-x-!uWK`4zUH+E{@VSB_iiwicvhJ?}7C|r9+AhiwJ~EI*+#}Xy^cmevT`Dtd(}WXa znJ7a)C|Hd5hO?8fr*BAhy6)f~MPZ`RPrYi+N%~^Sh@HY#y5Sezr#E(KMPSq^oRfCV zlx*7Zr1q+iZzKxS0Xums|98FnfiS5;g3a^cXtauSidN-1d=U{%p)6GCaz|78eX#A1 z*U?gUBYDvkw&hLtB#+MeUW-q=I4#$jNG=R`{`p(>A@Sqk zmTQ0+Z=loFuQu1Li9n*>*%vCs->Zo!rF~TV3<`#wQn?>UPK%xnKHPpjjBp;^Og7hT z@sAN>aR12FY5}J3tO${t_$DJ4zX~(ACw~~pJ*|D{ysejbxPy&oyen!Cytpu;%GwZB z&1w2PDKJ=LP3**XyIAca(vY-Q#t^y#2t8Pg)h zOSDXKzF{R+x?%obY4h{ugR8Qifbr#%j5x!%9fi{VFT9mcE?2`1BCx*@J(lNu%pd+L zG(=hJZH}PBB2%tH*6+yoI8k&WVhk7*K|bBz1WhYRD214s)nCy~uf039TjPAIur-VO z5kTGyKc632Kk!g-_>}(5)BgYshKS7#*7X?yXCNmc8=YZ_=6LOLu=a66m6A2{-5>c> zE$-Vw;P7A06e=Zc3ZCgN_=XL__-o`-d8up#Wz7Xi&i%%Q(q0pzD?AzKW#`bQ;=95i zq`nM~(>#y!8N89JmBMyj<`bb0d1Ux#rbONHV1?F>wSETi5D6( z4})f6yy%`6iNMZX4vI4^2H>Zg(gEShf6VhAOYeSwb6#;i5>^2VCN1(|^M>M5qGdHv z`n>!DB?$O2I;&|ia{6fHmdcKr9KRi)`Fo&Ol044gBTKV`viQ0v16#qTx?qJ4o4qYu$$5 z3Etm-WQoQ&Fx#BE$8Rv68kI@s)>0gee*y4pM|F zAP3F<_pa|J`t8k?ZF}$zT6VkploHhVzLB1t~NTR21yR`lCXJ*s;#~{m{T8;r+H#jQ(peg!)`k1&l8uFkcOP-X1g^WUD47f zSN>e2q!#tQ5THoNR;gE{RJg~{ub}RZVs*8E`?}$C-NojrmI!z^grXB}H(o_6g^nJtW*l4U zh|8ujsm9jMj!kx^^DFEGKiH$8X&DoIm@koXl9KC_ybS4vN}W1`I5Vyv5gqQEOSF){NNRQ3dfXk{q~s<7A(R} zPs1hmb)JBk@y81lTf}Jc*^L0Vi1uefm5YxI`t6kbwi9vw7feEl)|4;{MOG>|C#jZ? zGLJ60;2`xFo$N-t%}(N94k&{opiqj*;p%$GQDwCleT8;SLg^w~S#@QqN_EeNP<2W5 z{roWH6$xY0sD;unN$P0iOKzf-vht(jT&J-&+-))tB5(0YA7z~``TcVbX;0BW$ywr?-LJdtjH z;~K2khsAg?#z1pJ{exv$L1zV7ORUEY3CcP1^t0298QKM-|q_OmkfQZp;0 zzHGnr^0&$okrKAkd$HbjieI!M{vjuAE#SdW;t?pQHuds^#@M*CbQ&=bWWU)pj;y^T z;JAuHvJ2yc&My9fUqEh-`D`ag5KQwBHSEaj4eBSQxqaaf3zOw+py+w1YpkChWE}R( zaUm(KN5!G_57`IGo|Aql3r>TQetxATvuW3=zns(8X^+fa3exFB*wKG90?G}?(z4b} zXJR#kNW}aSJq0`%U5+eKNa=OkrAS=PYqi5d$RBv3Qb9a&PjSUbT+fDzf-I0zc!?-; z{pz+`pUJcHUbufnT{#oVTk6$S4y9E8fFI=>F%NA>tf_?iVy#K0VQ|LlQr~YdB3QB= zrkQP@lV5n?@8Dzp3E6>r5^!zp!z!tgE4p$8${r}>QCWi6qrqoSb{&cY81p)ag8Z(> zl!dUVqdjc%_c6dvOJ^Q6V|=R;NmYA8LeE{XO7M6V?OD9(9f$Nr6QyTS!~Bahg91k0 zVb+}MKiQ(L^S{C+MB~_b+HdzOpjSVYq|Ob7*VnyZc;Uwj4}ix>HLib0DBaZ+t7@x2Zg~Kt0yqVo5Sp|yxpJbQ3vv@N5%YI3}C?m&bc=(OSyKLs(Uu;j? z!&olzo7=U|eg|K$Ot2amw`w!Wp@od$$%mU*Co)NXD-q2NaZS>TdY!~FdVLD}>Gk!y z@Wec9uvTnmoCzo~XNs1Z=-bxQh$^ot_CFaV7 zocV=mV}*p%Odq&y>P?-R&ub1(iE`J-;FElh0UJyxMh+7s+{W^lDd|IW)RmTYqm8ZN zJg3Cz;D=zFlDA)e@XM@u@7NnUX16&@R69cc(vbOt=+jClBRv&qa`JHqOe1tSO#FG8 zn0D&jlbZ{py?V=4Z1daj`1D;%QW_TV zNL%xpRKs_gA9)7^UKXi;?i?J5;CPhb*7+M{c%zz|-k{NZv=rwnM1cs#)b;XF_HZ!9 z#n8HR{t;_z@*vVPK0f~Qf(ZzuJNmu3m%H)mF>w}nxWR1){RfWUlLv<7RNkmc0HxNIXKXb2d%+!0# za*h)@o+f>A6Di?k#}6Mq0OFUZ+LwxvRcaL@e@WZ1MQ5Yp z8f!uqL3~38<%;JC%km3CuSR^aN>tuB6}9g9%fD7s!HYUyW&J5qADRjl^>w0YSPhoL zZK$u-n5r<~vO-r-q1``@m2EaO8EPBszxlEH;*q@@1Tr>)Q=Pc>L@69h8v5Ryh&Ytw z^YM4-2zKB9ZuU*_IEnkl!fi zM^&m4udmTxA7wc6eN{&win+C?ZlNnZtE2NZXhqFpX3J{kXcMc8;ckYiLkkO$3vJ!V zU}c^UNdjGz7)o?(7|U?_G3JNr$;iqTC;89i6$$=Bw#?Q@0cY=n%`f7Fye;ovwOb(8{C;JK(K#qZ z)c=MPj4tGaBxcR&Cu+^o56TfY!|037IFop^Ezyd2f*R&%&>m|9ExeXIyjapB$u2xx z{ktgpFFSZ?eRQ@T-%J#|bV$&p+|>3RbXE1MM6xf-s=AC*!;3nIE!~Y67syhcn^Vgx zPsZTAifO5_B$$F1FiG;aGH&@C)2|Lo($)jx^u)qJK= z2i`cnbup&f(pa|mJLdd<+1mdme2neOCKmZDPJ#_6);JFQ@`Z`y4AIdinJE2erG+sc zq<{WPqKt==gx4U>C%B)1gV}&B;=KQet)NVk15NG){R_Dj=TRrA&#B?<@354QSU)7Z zuJ=6mVb^If2y({Xxk!7VCthy_hG&V=(@HI{-ld>y-iseQDF0Cgd-M;~<5NBUE6djZ ziATDj=zdd5eNMngzSEgkems6J+6h>h#hia?e^haD4;;j&;Vt{Bq+;L_DbLChMSiom zv0*lZ@sW9Cn>kc*_$hf+=WD{_4?%uiAl)VXE*PMMFFBu zOwgFag1e9r(vJp}jBMOqg;Vo#XdjtCSsS(gmHD~t+g?@)Y;5e*_;?Lxj4;0{U$Ypg zIxKYh7%Jn*AJQn7e`1;+%rST|#3U47jtJQ?{;59+NZCeqvgj~_zN(zOYK1RcIxzI! zWd{;JO(`GWBK9;Z^y+kQm!BQS;FF>LQ}-_&`z0P{YTpH1O+AsWDKJ7l9CfAHjeWP8 z^OeOym&JNPPj5JAtDrEC)a{)V<$ZtO^SbLey-dbrevy@=GSjeVKe60^qc7q@8K3 z+t7`LTZw?K#k3896D2rlwB43s4{JN86E|y+BUt}d2&^C4wPlvAPR;#NJDZ>oP(2-n zZ1$1T77LxZ@hS8tTt4TVo4XP7Isclh)Ezp0QrAuE2k5e-ILJSDh6?!U#4~!~fx`yw z-76)c&!KCGy+Z$1zq|z`(Ehrs=ezn&TSyHEKuN}#qpl)#==W=eubUuk6j3*O>vRjf zfHo@Gsyo_%j0Y@`VsT{TYT$$Jb|+uIT$w&1vu@2qP}`+W7ty$g?&jd_ScU^f?uFbiNsEfQ6%!Y${d^)af z3hqC7wfY(Pl5<1C!tR}nLXmfM`+MAZ(+B4_joo*-ce!Ubcfef#R;d}pj1MKiqx(-` zNC>PD(jBb>oVyj~1E%7%tQ#XG>Sn_R3M_8@piY2czwQ{Qz+F?EcqV*q4q*dAjh@t@ z&q10x_1ov%;|L}iI=plDVUCwn+jF-9|FeV6OhDXBnbSLnZr(6B=zd0G1_A8^#u1!% zPs7Ho!~kS!0|$jEeS*Lm1m$)P0S+?yeCyUJZw)zfQrLyK*?q~KQ}Y!vb63}2aO0O- zI^Aiq0~;^_bzQj&+|MkH3j!tQuHHL};GGY;psp)97qa|AADFkkb9v+ERoRIfMGC;j zL3QM=ih;UKKUC6C>EIk*xJSA6Jm7orxkQj>9dfeO>6hbH*R)(-b&F4-JBBEJK+N}u zZYhb&{41mzD$wtIZ{6ya$ngnE{<&jL`ZMB~sBQvQD;nDI%e{UR)NJUC6$3z$;B(09 z+%=@rt*Q$7u`QtsTQnS$Az6$7nd%vn)eP`tLcllmH^A&+dG++p>7HLU zfmN=xj$jqd&a0{O6Zl@( z^7E;kxj}5RY=XE{ILy!gwi`bW48B3EA)qEwR6FZRpzTwW8CzpISl7Az8GOJSq_ao> z4yyrC88=(e@T`Mx8i6qZ>gy$Osk8?m5m0Ni_0rmgpB_AH?o3QuWMDUTVL`_`gO}=f zJnDm`NL3FobK0fz+~(dFt~4+JzZU|DNvWCSL4mY2d;NR&NGH0ywGy*TwgIQ?IK<8M znt0yS4gz{nxChe9W3f(pP6K7DXbtw#iGJN1p}i=jrYd_Z(ioWYqO>&#EN{Ypnl^!sjti7OrJnQRexBfx$eE)-g?cfj;cd+!?mEli4Aw_g~ z>AyREKSVvMeCK7$@85I%P$6MK_L#`) z?D1><)f}3C*Ma}7pJQ>*BCJ4X2Ve!IpRfP*ZxaT#4*X6&SUmFYiCrtP)F$z$1mTP5R|}k0Dx}9DUfF$K?2~E zpdssyP2F1uzkvUGTc^;AE^$4&ylU3iMt7eMBa$2$$4L4Z#8d^o@*#p@q;#?SUZw0|T~Nf6jY zaDKXmxG}wvEXGRPtI3ekQ&P9Mb^4CD8SpMV1x|&{#r+fpY~MTG>UjISAy*q0T)Vlt zy}A~8SSvZOZR?iUj!K1&pZPmlD9*{xDXzZ+p*o}l-~qBPoSyFdvy?`9oJC+JX6!MK zaK6~{qsxmmfeL^!opf69X8gK4twn(n2KaOGIlRkZV4vw$Gj=e9b_#_zAmmqtHh0KU z_&Hzp)JrU+%tZd_IlK!#ez+$&fJ_`NDFj$-o+CX3@C-$A;&8$+%3_a%3_iA2TDJzk zRpPp>yeeyR`wMMua(R|Q=`T*|&Pj5yobm}DBt$EMHuM&sYU3(fC*}*?}5BpyPbdmM{_d>cN*>qaM&Eu z$A=@$yWbhwIdkTx3yceZpNE~_+QOB_&;Gf;GmE*nP=$45=UUvt)<72=R@fa!fUKLn zu5}U%ppAtIiWc4?t}_jU4}APb_=E*jGwhH@Xm~WwIo0_~wKjoKOP@GUSq71EvU)Q&n|PHMr6zms<=ZM3mF zd$%b-{h>DJ^*_5i2q;`*rCE=XuCk;KWOp) zw`t3K#SrsP9CzYiG0Ote2|a&^5e)0-(mdyRhHBao1?l7w`sueN=%>lPNF5n}P%RXUl_ z@4l>D^YhI^x>SRVqga6_(Cf_4`$x+PU$h!%13td}T>rT3NPCsS@f=d3Ywwyp!;zRb z=J*lh=qYMIaH)f1XQfTdEz-3rbYVny;CLWSy#(XJymXCmwNI*8S&!>QwfDhaQfu_@ zBMw~kD5Afx%ieNSiOBB#tD#@93tlS229&9OKb~6Bxb;WiKa0FA$of{C!cwa6j=?QG zaoq&@sp&g$P=a81{B5GK)_e4RbhZua5HA+q!U3LiBQrT{{YtuXS6_t)?v-5gkTT4i zbe8O$Rkum^k8xLNTP@;IZx70exkzo}4>oh0O2??`=v@133^c>4Dq>rno{V2(KFeR+ z3b^u>&O`nXIxgfp#u~X$i$jX@x4aMg+gPBPMvql_Ow3(f#6s5?Ak{HE`%Wx}v?w=L z!PZW#arisBZP;&X>OtZFZ>FCcVz5dIw5NIkre5l?1=!drE^}f>4OVou5ptQ8oh&o{ zw_btvWp5fue!$Dta>w4cKBJMK&=F&dh>b<}OxBT=;KG7RVlcq9m7uSMxB!Mi#eFdPDe=!yb=)oItY!VWmJ%mhe{aS1HYN1=l zvQ?#F!j8LEl6lYDLO9s%n*$F+_DiKBMtOy}K;+ zytVj!c$gYbMT_~f1Tlu)@Hp|sLQ*np3^wM^b`dRzx9ZInS+j?MDU{76z_mBC_{_fZAuv5%IZBhAAhqrqtr)EE+!3lKe!(?UI=Eit^ zS7`R5W2Vl%apisDjEyVnPd%2(2={N3JL*++3e;_?U5Pl5TNL`OSVoY)wRGr>^Wo1!=SvSn zl=l_#LzyrzOBT)ej3Lk6oWa;#uCqzbFCnPjy6k&9!%V5@Ct4Rqr%H4Y$Lz&{DB$%l z2951&xSfwx;Iqh%)MhW0phY$!&QHc~>wh-C>m{bKzgBB3#n4V~#n(y_Uu~~+jBQY@ zoa<>35?IsET!z^h^ayvH6;Xu)#O?LH%kQUy?8b+>wsLB_FFa0)za*j6XHAtiM>pbE zNW_~<`LI9)PHc!P2>e&F2&fT7pH}$s+X=d93kwAPHiQ2LsQhjvrPr(_!kl>$@@%r! z?qVm+)n3J0Al3vs_}L1HdN4*|_PpBo*ObD$O8hK=&c3Iljbi67FfwSb_FOsbq>Xa# z54Uis6D^g(M6nDN@Gr^ms{@Xl27}$do2>bYD zJ|s!|^^!C0>@8@t+4N(*MO$Hhkg`MLD>?c1I2A8W7e4`-xdyglY#XC2=XL1Nm2;l; z_-T{IT17SFbtc;|H8=%7pLI=I6L;t>q5r+`aqj4kP?`1`jpMxrW}KB-Hfs9uqA&47 z*#-4F#Ya;mvf*6OO=ftcMY4BaTTj|=eEFPhiN1sJrE$-Xtm>-*^h!Pmnn)J->+N~7 zE-)R~gcUbwUo3BIN@c;i>Y60ii20o^e5oa+j#c=MRURJ0{!9;RAN?&(3=B|2 z19v@&D1U+t5TM5%3;9rhOEWGnli)i4?6>KsG{L})0{v9W#l$N1tIMb>{fAC%+ktH) z(o%bQsq1yKwQv2F+{BMSH_cbfU!l&zG(c`9=O;b9u|XlnQs%z{6>>0P(I4D4isOb_ z1s2J_$1S{7QO7a_9q|CLyys{2-NVK%l(>f4&ib`27wN8IV(rCJ_jQ2h!wlq6zd6Uh zEkfa-WU}Rhe>2lqy7%oqTck=qfZMIkpu1lEaJjDii)OFz3QH=rrJEp#=AOf)E|1P7nN4w}Jvmz}B)_HI!en{-|%UVHFCzb?FDr z70Ct*3M7%mZP-1#6Q(%Xt3rj;@__rs@=ykd(3a>|TszrUzuMN&zT)%*vqN+7lMZiz zc#9$HiF`4FIIFebYVZC|`&}(Z*v_&#r@V+$qNFrPCRgXOUKMUY{X;%m8*|**@H}bj zcbt8=5}H@+3-Gw-*DkSCXT)U)sCoJFd32CArfWeCLe^MQM2-L=>1^)u5fd3=`=@TD zJDU4^EaLx-z&m}hPQ2IoB^2Fgy*a(ty3ptAVIjSz5{~N!pnw_#JkKKLGmUB7d`HN5 zM=@<3JFOJT!qAze-y4ddAiGL^&EK66J0@nGRsQ^l8bP{5P*YiZH{qf3)oU+P3x9F{ zO!nZ5`*R9mQCYs3#bL3Hm0=KL9H&@hAsGWvz@$k1-lN#6@}Qro*lhf>MB2fcFwJ+r zO4F)4y1J5oMS9f5Nw~xoV2JT5mRd(Pbd|y$ZP-+m0b=vV)rH69X-NWT#-H}^Hqclc zD`vP?KDRK>p9&=OnpwhIK6ucx#(K(wRUXQ7AL6?{7iBAc_E8A@%b%|d4e+f=HQD%! zz|-H#oO)>mKlXN$eanjxPFD%l`1cix)MGQDmhZK{#BP5z{{iL!N&fP*c5FY>(qWu>GdZa(RZ&~Dj%X=n9>g0Y*bQlzGy2>8e>`KuI4 z9Di&+T`t;8T6M~U63*?Y&~Z^a0~wczZu(;^{%BuBZ2-ioF(PFPV$o8`CUlzvZP>i> zUG0^8J-;2LSo`8tyApkjZW|LW>Vw-K>XMGz^)4nn9=|&1`#=Z_@lOAabxGTc6`k#g z>_{hd;VyVM6knzwTf8aIh!J8?m)JOfw&c^m7uBobXlzq#bQ@I4-}_lNTGbXE>NoWA z)vri(FnyhZnMJ>OaSqTx@1jzBMWY@J?|<&fy$DWnS5A&o#rTwp;~}9PqgnuCKe&h%hhbiA(Npx?3huG_mFkjXfEh-5nz> zA}}y?BSYg5L;SfP+z)^6U?0b|_rBIz=ef?$%a{kArrWWyn_PDif|WRgCwTKrKR^H9 zi}fg)?IfFOSzISn19 z_8V`XQqnWB9h=+XAWKHCDkK}|PoFNHprl(@Rj^DyFOu&45;vmONpfn)4hzAQ_GmXSJigplScbhepH2Vzh?USOaZOjg)%<$hSX!zr zf3WO@*F}wk`jgE7{)sC2S0y!PxllXSHtlon$75ijo!4KPYKy-g33LkEW!V-JPey|`6Jh5P^Itja~p)yiKU{eqI6^=-+VE0Mf$G*sBo^}qb< zXtR#m+|~tgRL@&XaLcjz&S-EvMvw_3JzS?BG9xBO957 z8-VetiwmfkVQ|;rI#oqe|IkzZoC2JQ08_+Yn-(&8+FZAra9K4N(-rd@?wqrq`~5?N zkU$gev4fr1d)QOKFFy6IIWBn-JI}P|rhP1~m-Uw~-hrCHTd*hvvBS(kq33Ghcq{W#0Kb+e#Oy=d&$g*F31I)DTsp|ADRuTtSu2nCb;3dmnYY}_HHBF-zeWfJGnn;7(yRIr*5-qg z4Tu%-RMpdAZcS_WENSu8b!J+Wdk`L-hCqp81%B(am?S7kGta6u7Bj~Uri!HJ=SWi) zGnH&-mx+s6-Kew@Fvyy-YTcDSYxsUM673)ONk6^{fh5y7`k3a%QykEqP}$FMjuJ&Wo($x`W58{$e*&s zr`9i6G&rxK?Tb}4Np;=pdcpn7+61=km{}@6Qm9bG>RRDO*5wbWj#^HM4G4Vc$!m~+F{!-FfUT!!;j1tYJW!W;7_E24^!MjiVKk2j~2|5i%2s=I4+<3 z+=W+gi<`)Ml&zLOb+MC}?a!up(`0Q?NFGiUvoin5n1a9D!Y!K$Ia9bu($JewZ;GoV z1fknGuLJpduP0Ohyv0A1F17!3QoEF}7K&7>o~~az1kTfum=Vx4wg(tT zdh+*Xw15V<3-hOS-OSU4lPP^|?ta&$_;qlT{d9>aCx@005gu$oZ4DFVx9kLf&+N)< z60g2=JhOp+bVw=re$O-F>0=Xla@2zyN3S^d*Um~h=IwM=J-v*?RBaDYt9wJn4^bo*f^UpE9JEcCB6RUEu zK(8QPnT5w`bQJE5E^mc}dO{DDldrlMOw-V6k7m_%&ZLafmlOV1dC?OX7aC%2IKAlP z{-<&N{Y{n#{z%@jH^{A^W_cyt;S_}boDfUv&ok`c^)U!zHucL*nn@Z$c3S$}oeC&r z@V*J-Glq4{0x%HwRtmoxHm=bAVDBgu5m1%YcxhZoxkaWLKvqLmuhc#2*-D0hVuj7{kgo$>P!fj<~IFx7f)NKCXdjjLI2KtFz} zOB$c7`&4Wc{Jpnyv$$RKwuAidi;7R@du+e$+X8wpzdgk|+gfLUGZGP=jF{gkzuZ>B z*^)x+jN`+B?zn>>IiN>j_MK z*)i5;+6ADBXSN>ty(_|3TMvk_dzSm!#wj4lb)(eIk8wrqYXk;{AM?dg$AYCa=iop0 zdPe4K5mCCyt>kqc%5oQ{#t(#yRg6vuhf>Mqe&Jxd-M~+x+tSyg=3n%wRJbP(D{A#g z>vA5kk9=Kn@AdE2HFps^6@?$A#EKtaKbDK|AALBNC1ui67HO(wo`#hFXqNgT`E-K` z@sFA}{>+W#x5sil^Q%Twt-vA;AA%YDe%eua`W-*+#e{fc5>T9PoWQn}z&fW|DYJ{l z)gtP&>0FeHL*#JdSDvE@Sfs)s8)!38-D|qOKx_cC5$5(dVvPHA_AXUKm8X%3g&@@6I7)2W*P1rXA&E%@Q!Dd zUnBq>(0hNON;l_5PWl+l%7nY!`+ae8Ao1Q?J&7n~Q^VaZ@3H2t9}~-wQD0WYI93sO zHt$j)l&5y3FIesZ!gEYx+=0zjvSQHB+;lb**f;F6wNyi4*)`ndRTqY7eVC&GhYz?T zEMFqV2UwXAB_tOx@_z!rDz@oy{OzM*&uU%a2K+NS{1)wrVR)zG{bLUqNeLEgz~#*$ zW4{MOWy~!quGTcZTl4`1&_QfBHqa)}8(6vqX058>kKf;XbeNvt0r-h1{Y3oNtQT9I z&D1O9MDcAqCKa7vvkJ2c(Jj^m|y6HPzp`WO*491y9S+Hc%LoC)o-6RBRQ(BA0uJ3 z#suc+;O-Zx@}^`9I;_M6mcs{);U~8i6to-4oa}I6YU9p~e!(L-NUV;KQ?q*>*hLxJ z2qvjqE?#p4kr04=#YVp4rz}Lj2t56#+3v2DwI-caANuU2Aks9Z#pWe&#ywOw9;a9f z`wlJ7I@-KMsbMNn)T_;ufSI*N_Dx34bX3dyEnOy-Gh6GKaZL=+ z4jVn7+zYBoN~NcMHNGXC|L90)j@@5exEHugA?mqjObm?MU6dJz2v@w1*R%!(MaA2u>NmAtWeA$^DqKC&Z7m=6gt%5f!S_h-Z_cq^ddGG4xSow|RpS*JESN^+{lJaBCSvS3S` zw@8PCD0ivPmLb_HlX?7L9D_O*1l?z)EFK3Tr;VoASl8X^iHwVC@a)!fy~U+pD%GE)G56-|2}w&k+-w2P*8aFWp3l$4 zs#P)FUA$AY9bcS6pt4KjGac0d&47J()&Va-p8kyMRqR=sjk=3dKn7x^y`ituL5!EN zJ>*UGQoHDq5otw#+1$?#ZS3DcN1^R`Sp56!0EYsoO;CcFr*+c5Nq6#DhK0Y8+Dx7* zo7F*yq$*xS{oNwu_p|jE$?kP$rGKoA#FKI+$ynH#ZP00&CaA4P3^R)b618o$@DYI@KfpZC$&_ zk$Lp-55R&JT?YYYT@|&~mh#ujDDNMY4d2J(w%wpjJ%`I*A^EwBwse|RF+5c>qEmDe zE>bYQoev+NDN8Y@0C4)>L+n%l%b!BS|2ez!cYpSMFq@q6Taf*PLbl(6Zu?f4Pm@1X z9K(duOPiKF^xPeRM%P%3hS3_LMf=ygEpQLHR6VnaRO+ricQ})&nW47pZ?`Z;= zuYmaLkWc*|WkQ}rnn7+aj{KK^hCl#2W}U(v(6)y+I#dHPnJVj+YoBKgslt&5MgPJr zj8Gv0-d(hL0)s4R*QFPcg;@`uei@t%-)RN;-YLKBmOSuyDAO%R>hhR|;nPTJ;`o*- z-^F|l>k34&lc)>KE&<;+UVv!6$-BjrCNG?g8lb9l1ez9q4hak7K?d#rZB37&F$oh5 z-LlyDrTY|DHKD4n zw^q>CnRXZ~=_FiU{whTlv#@YTer4OU0-l3(UvFXs#AIixZ-&i)kC~RJgLL25w^vWe zi8^GB%R0p`-Tu+QT%JC>?oJsd{=%$YrqWuJZnk!%sG4f2Ij%%zwDtVNt+)^77irDB zg@w_^z{{L^@(j`lQg5{SoP||Q%?b%Dfi3cNQ-1Keb+)K8(GZz@o?7POl~Wj;oA;@; ztQ(u>uT}bsdU;vMWHrjlMt5Rb!t`JPKmn8^pRT>LO*}I8xa`f(heuGp_LOOhw@Ts2 zF^PBxrP?d}0`&5L-C}bq;B&KK&{*aDS2=MxJe1k8KmG)J-9niD)ciV8)PPJ+Kr#C< zdCmW@KdR`hY2y`MvT=cmAfK16W|HUcZ>~g4;KAIHf?=S9tvaYUrAUr&Q0VO)AD|Hh z2%2Rzt(_vUF98hY+D)~MP+8oUe>0q0NWMFzj*JMK;a!oRSot(|zY?_VH9Fj9KAcNo zLNoN$z_6n{YNM7sJZ)vgL-LRU8PT?(7u&}pihgF+vx0Ln_0K`Oxm_nSK7cNEhv%p1 z`L!{2oJz=srMYO#GCSWJy8it+cF&<^NKTjW(EWwyPftxMt9d8Xp;!CfEY^nP1qd;x z)bsI-Td+>A|LvDdS7HN>D93LZ`Z^sqZQ03A^mJ*6S`2Kx%EJ62xH1WXoj3x(vr1`i zzTbHC@<>Y9=nFkQxI5|2ai2!ORtLOP-_OmW^b-u{UC%7)gDDq(;m`+8;mO^EU2$*c zIbKX=tsjbw{YpGBJ{?lS&i4yhC+CFI+++ZrXQbc#i@=Qh_?NLFWMV}(ZF`I)TDIui zeV;8JkO)283Gt%s13kGZI=07TuwxQPb(&TAW*2Jmf(8i`OjSHbX=A$t^F&92y$|{M z#>RbZeu`Ms*%#ej*QQ&l6wIFr%TaIqy4I509&5haf&yELd;X1!L0nzx$J<8^mhnf? zGgX0X#l^o!5~rZ?ULj%F-dIJ>!}>VC-iXVwA5lCGy)N!ZXoA6f@G-xNY*jfo+cx~) zwbIEHCd&Xj@vW$;n8^F2T6{LHtuH@>zbEdi@QNH1qbY5(jfb6ZKY9pNH!87ai9sL@ zw}+l?{LcLBc<=kqR65{YX0|t3O`lBb{(q{N%YCLQqMLr$$z}r~PBW8GmTQ?dOTuKC zt)V*MA(f7hxl^-z{hy>aQnRFU$~v&c7S@+NcFTW6u?LH(OSf5mZpFX5a<{F9y;+)^ALeWYYamr3HyEMh>wN%I-?s4#U3-b;Ad1Tw zRCk{ID66Dvbi2^?5x+poMVM;JRo0+iFW6+~=&SyCOv{UXOS4$#=dK!*^Yl#^XUw%<@#k4dS){WL ze!=Y3V5z*%qdMP^;zgOg*Ydc}dYD46ywS+Ur504~NPa2|sBseEW^g*yU^*~4a<6SS z|JfX~^17d{jYE~QGA;n99CRM>P;EI;IZwGR(zDyIC1r+_H0Ab%*`CWw;Qsv+tYyZ( zZq`npkH4lMxe%ZH{A(=En!oB(e1WfIV@}OAITo%Q*An=49K^{q9AfEDI;eCF87mvU zDpU$rHw+&J^UfWHv)NLrP-hGm-8>hW+pB@Pl!}UpRB=;% zljWb7BwBh|O;a4YEwZd`Ex&OaF#W84suZsTF25ea{{ZYLo{y9I$;N7zO5V+FtMDr& zZ;`;<6-ZXtK$xaziyMZA>bZ+yac`qO^XM=V+#x&5f6OOtf!|;ESZnD3(K$b})&;P> zv$b;5V*c%jOJXb#65O>!;feA;$EKFeAvX)i4@vEXEiQecHnw(1VQw1kO+u!>ARC0+ z3l#a2QsL65s69dr^W17Ph*%AUrMY+BFZMX`=j2sFwFhYFoukD|uwmIk~+`Tplon@(i%A6*u?|KgVa{8GK?)F$6(8c_cnKA>KY@xeU(C*FCag-a?WD6y<+x!4vFiZAGo zK0FI)9mLZLu|*|4(bzYNu*w@_5Ua0f&kR!c9~w_j$8?r?Hz@ zZNP{_O}mxRS|P(AFhDboCA54!$I8gSXen|B)*u6LNU)09ZTRn2fP(g^Z|`pk2~(^h zM9kSS>_e}0Z!nlQ?C0JuHz2|P)9DKq^ib))74G7^dv5>v#a~u7F?7~|B&HeW_kjPmFJ(mxTz{0O4{&w{ zO+B5Hc~VV~J?`Y>ltICbWSQjmw5FE3{|Cz+qJB4)B}#i%`3R?$@naVD(FuLc9q_yG z?Z$3mUNwtner>7wW!SCK6xMFMi zo3p)}pVFprk+WE?Twa!3_6D@MqFNEof0;yLtniD=d)%(m6I_Y@-U|%8oX;3-`1+Mp zabkBZ;^0vw;#Cop`9J%H=C0ad*FW_^B+1cao1dziM}FY?1Cygvx6A8U0{n-4#GH2( zq#sSa4)`FxFb*VuX_}y(u@EBa_&T_g`xPsM7?6}5mx)iCyr5B4F}t3xwrNy9>8YzV z_rqW{s2@n~DQ76#L?I z!5qK&(_Zl+QJA@2Uz12PPjZTm z=9{b+S;bgT`g-PE87Vv+yO0maOkxs2`Wn8UXT9+h*tT<6C~?Sz6vdFiYi=-)6I@)# zhbW&H)NAKJ{N&oH10_KuPtTee_PxmXEpmZ2h2%UV^t*2Zs4q=h} zsYcFfnXJ&F&gVtV{d-})+e`{k4Z3*0Sf70o@NR90olmTPdpyr-dMK&k==M&|BuVl! z#T2!`e|CL16mwvy*~MA2K(pIo>KNagNbK027#A`hU}7mB?cq#>r%%1W5{lc`40dt8zU}P=NKA6)slsg^82TKl17t z+_&)u+4(JtLo)S0gTv&uZR*EK_gmCj2!l}F=B`wu(FIx`n$kDoj&TxEjdWwRRPcvg zu+i=oEX@(0c>~?ww2gk?T*QT;p!}#{o;MDes$~$ypr!Ro9CmHcTf2c5Tx@Z(W#O6Z z^5jsjJm#X)s^qo`=c36hq+!3csbtSRHKDQCS7x&WiCwW(b!L z0;{zB5S%_jA)2DbkJbUIDmNW6uW};@R^_a>KnwdZbRST0MJ~BCEMp&nT4Bwc`(jmv zQuA?XJU@p+w{oe}=1fFXRI4b(HCY!N@BQ4up=$*)8Q(}@gI<46bnNGa zfe91DSF%l99JGH#Eim4fhx!w*#2ox{&1@o13;jIcdYP<}xuFNdr=aV5_SViUrM@LK z<KSqbMxtnwdYHEV7Z#xV7M4CJQzd-KfQI`R;3M)VPpJE-=79B8kVT zm#*8N+vD;l19nNzs9EXJK<&Ex=fcHyzWudu31U_)Amj6#8dLCIB(1>eGeVJm099UFr{44ZFh57V*K356l)cC?$5>DoQBSoMvG;G2}hx zDsJaArti~q1(SDWb=a-62=3^|MB1865)?hRNN zzh(1y$@B}o-M74;0{(A!fRM{h!c$l0EWsJ~&yj02c>rh|ouyyl$_aagmA91l)%~2T z9$K}W=iF`?7jvtPcTsSg#co_!&I@{bki$y|xoV;g^falHZW_6_2|def^!YApN(kYo zp_=N3b9irCp~yr2b8^M>CrlBH0VX!yGF!Efr3E|te`Pnd|J1Ie zg7Tlh?Cc5-sYd?h!lU~N*(v3rZssL3%NDjwR<}PW`|=tCQx2?%rY@nO|Hvchon-vq zjlECU*kZNFJJ@aj4AGbUqKQmnE$;@+1sP#@+eS0;7b`7`} zmMVTjgb%p`D0yA0wBdy2!+zdhZg@NREyz3i11pgxRXt3UNX|(hv5<3_ zPcSFW!i@c>Id9Apaje=UFWJ!xrN95KbYBx4)ymuA*Y-&yeeU}>lV3?ImN5An6U;`O zcPOFX)QV+C^S@d{VA;Z3aBQIhjQM}>x~z6;hvI~?Q{vn>4a;GF;s5g|$a6w@nj+(Z zs^fROYW_5%=Au2)dwpb=W(FhkZ2hWqr%14~}OzUgQc+7LaCgH)^-YkmgX1`+)6NF1lZm7PMS|-*s zszD-8VjwPg*8M-Y(DG@PY+K{ww8@QHJts^$MRG0QB!jDj-uLrvKJ-}1d%yRn^58wp zpbOVpreDnMoNLW|bKbHm@gB&Stb5{Ss^eYz+K)I)3590e2YG+u*>fkK7t4(i@*wqo z*Uj(D=+;f-NR>E}U*7g4f+<_vAB?T7V~(Xcofp|eDF4#MI_X6f!nWKG>!-WVN#2_y zd5Ps0RcP=X@6qe;xrZz-0==sp|7eh^R@Ou)k=`8pc!WSklE)iSvcmuN%8}{yF(}CB3!yC^0ow>q#V1Wz;P#wwpx8+>sAk9!+)NVO(h*q1FcWs z@ae}QB>bv&FC_QH8|uEqTkNOeN>n*bmEtGvIX;e?{q7%$${Qg7SNF(01;K9@TXZ~d zwI0&~cfKTJNqPNa$4@hN9hqC4a>+*-Ll%tP0H$3-6Y{R5xl(Q!;}(s?&+Aql+0qn8 zIZ8m7oflx$dAz5;;#~uCGm4*HwYDxUG_H*Sr#&k#D?=FgA5ekY4rzWPY!%TN0vAgVz^aIDZ$91>r5n&YF!cHWu;#?FUY*K z!g{wxcW{!Ph7!Mr=C5fMTTT-MOsblY^du{hwsD(-odK7#7X04U@_w79ztlW>UNAoK zT=I_%0cC=!WhF)bizYf&E~Dtn)9>gcaxr6}_gl6oR8pQOF+M+PsC$P!=Jd{e^p~mo zD*M)J{!^mMGwt)9+uc9Jn4>uhyZjDFb=9(-+cE4v4#}j%zmGi44Y4il00rFRe z=GfjU>*vJN*0hX?W^NiA;Sil~w|{ZHb1!$leRDauU%U<#h^8EJU1ggzGt74dfI^zg zLZ92!M^G3LY~ZE)}5)pNhsF^ zy5Kk_5NvM)w3>HO;#7nlog1sK*vW-;wy|KY)0TEao?&X9CO;6ceae#V{|fZlzuZPk zf)R$3S&o1QIV9x%&o|6f{-PC%&&6{^#&!xJE;XbfDn~W9ikxKHAs<{0DU|JUj2RzW z_4E{Z#u4ic&-JE)S!XGfZ!fcA`h03xZ9G;Ssy)_=us=BG3tU% zd=q(g(ia8`W(fwU)#@UWIdo0EMQ? zZ+jLs1OIi)#Y}QA9|cU;SWZ1kP2{v;-Z>xbbpXDiSqpD>0R;<&v)pWyb-TOh1W?I_ z+6+3gJ?9ycO`w$`u$s;{NTjE`Q`rh6X!S6U%%M8@GlZhk`LCIQWB)sec4Wr)e)FZT zPTf#;l!0>3yC*IZ?=?51^R^UrMV$lMpxYn8B8>V+cpPHtGxKE*#Yh1S(c>)wi=WRW zKKGoyWmaLVQWKGuSeH^o_ztKAV10pEoI#-M=6EpDP`P0E`dquv3Sk!o8*w_}#a7HZSK z4h#40B5k8GgQzyk3@mB%-%+9$m}-X1|LDooVmt4*%S{G*MismWaO zOC=3z7`jw=KICaR1WVYHTW8o&I|NiAXm#ui+-1! z*%F7A$GjM@K56PVxSBXg9~*1PkY|V$xtuMX{f6?ZHU%FSP}(vL{i7f~gG^PcRD|+WFrZUKc1Tmj(9b>Yk8>1`Rm0{>#GDW2 zT`y+{Mz$ZCvmK6}sIwC3=(!l_i3I!OJiISNa+4>mH0}wr_6q>dhKE%3h99+DyGTsI z?j+sBkJ?PQjOv#Ko>;?bmKBIjwNBKVzJA2g%y^=r?~%xW*#?$ObIZ4{P_MB*s~>n& zqg7`iW3+nRh3mq4zwE7^ed6C)XDEi|sCPa%Kk;#c(e^)|v=iG$OY3Y}FOJO`av}T5 zymGec#X(X>6`*jK^-B^Dp6~7Jwan7Q|E7$enaLfFFzlu}4C%sHs@S)b=!ZPwV}7n5 zavBL+Ffa)LQxvstMly0Y%o}D~g0z`-q7bO&yz!y*k2%e-RuPhmFe-KNmOxfjZ;MY- zC=%h;tI2-fhSXcZ&<`&sbd(NGnJxS%RD}CGyrBcxUgsP8XU-7*%9<0fbUc;CC$Ukt z!Pq?`rWpbvf#8t@Kl1vwL>C04WK;_j=C`v=oGIM9_W#Ij$3d`o&+#>MHk z<9JvfJY2b;;Di2pLSrrd3`Dt#uPEJ@1Qu6KRy4(w) z&db8>YfTamf=G=j|I5rstrTM-;5+zQzzl=(0Ycu`+3;(riFbNNJQ;At2N^TLQ@0+j z2{D+p5xe=^$c=fi%M@ImD5{+mx|0=PramN6H>&qaDS@Uo@JK%@NP#S`pP(*CD&V$=Oexa zaP^L%e;_>j{1rWZ-~V|h-QMtvC2A09c}Sp6HW-HD0)O~VPM5Uec@(CASeg9?G6pck zwGq?(AN+;*A0xiET5rPaGI90^YpGk)H-44`P(@3-2=gs3+HSCGdrZ!^|F~dHc3Agx zFM+?Ux9>N=-dNBfW4OtEAAWl}O}7f2w||!%&=MBy6BAMa@v^Zti=gC(*?DFNL}=~; z*$2r6Gc)rV5+>-`-SVVuP{8$FF)epMBBqN)xWgxsKF7gmCDL?)^|D$qg87fa-hGU8 zj2#}h@-K5pRQ)WxYEHJYe6eShy#`%?GR+QCw+#}HMN4q(+_$Xf-yPVjFM%*b(N@-q z+;OGs^)|4*w6fcUssGMz&zMO9t%_akm`0DC^rO?R_~4Vh(=Xa8&{utBo^pZAAQILm ztL0^rn#|jk$^vHOy;PSuuRI$X2jvN>V}6Sg3M>@A;FL^|orkA+k9W*J7@D*)467)4 zt#R?U#A298)3Yz6NN7#aO3b)^vv2fW<+mr)gMDg}B16x9JiT4K6qyze`81-PC$pfP zC&h}j)Noyz@N!W6DIqH@J3c{gV$DgP{bVdvSui6T%19M!7d^&oTaVpYi`f8)lDk&) zh7D*;6W^V;B+0_11!L8x78127RX&pQyh4*WW}=>#f}b+U)x~4kMxO4z*)y(;rHPW6jN-7{J`)yZvuK zT#4Z?;v?d%pia*RJagu#*|iaRNez%DmT(4#D?*nC4ajdISDeOW^ZU}r(M}{sRTD+x zOHZFO!Ye?`BbUn_>ufRaLNhs=h9%7UOQy)$Q$hT~d@(DA&+4AF_onIcW=&7hZoJS5 zb6t}YnIaQ+u{L+wqdzx3dV~yTh#fJRqt74ZFv-{-*@R>tRjNSO7820YbooyCS2ME0 zU13S>{be~d4{jkQ7u~-NB2n6!SM79uD0pRFvXBphp2KR#idjzkD)^`mdO%gC8NSul z+eEg%`rCxHu7b^Y6LflJeY<>%>6B(|un74l)qaCcJs@5T^cQj*f^IZC#kJ&g39njd zo8Df&2{ntR@_Dw7TM@2BxdFx2Os<~=L{hOYVFsQ%7$w-LwT}co@74%fUDVInJ>d3} ze{4gEJ;<8EH3iAr3AO)w8ptqPt(_$^E0_yh$TMqwZ1AHaEUtP|EphZIOmTJf$TO#z zlk$fdvCD_zhkZ~}><#~pUMgK8dZ)7a%FCac9f9@tyP4p;pe6RWD-O4m#Cy~+#Mooh z%pwe+jg`87$Is2z&9l}2``7sz$eb+uqT#R>#~`lj#v|`Q=Cfl7d|6Dad3tE)qf`hr zOsx>S<&wO$u#oE{D7)Q~6kYOtiKh~KN9p`%f9<0K^Wbau!?%q!i-wP^G*i~v>$E0i z9mRAJ;IC#xC)hcU$XORSNU1{ZCPl{i(L|bN3=T^aoc~UbGZSBfZAYuxJDi?G4Kw>< zAw=$-rH1eND4mLen3pu<<(>Wapc~8HZJX44dBDq$&pDgQxDlrnY-*S1ygndb0XUhh z?%ql_Xr+s&Rv8EMrJuSXGbGj9Lxth*Jxip~JyzxE#3I@IgiOc&#xmxf80yJovg;N7 z+$oRXy?KIt?KxOPYva0ohC5jo^#P78rJS&`P`bCme)bMy?Y}kvKn4NZTC2OqG+mEzgby)P-usoAv<{QEj3VY6=Ry zB5M{5*YWI4M;#eXA^u%GP+h?2ZGzK=@L_USmQ6nNIpIBJZ2cFW{ImG2GpVO%7`1^a z)HoA&ckJmUZ(bDi7w|xKwGEk(K+p2D*s&B zhVhqH1%wx?&1jH%OEu5;0GzaNIb7fedXyEIDvunsj2C=Q+^ZwG4KU-vVBF%H4IqGx!XRyZY0BBuCiRzFhbYo(V zjaVf9w)ASOxGwbW*mL5)35uShL#Y1}2W7e9{S^=xuH8vLsDo0<)2z>Z`$yTTOR1uv zT~Cq%>2(RTR4iGFrYUP}QTrqI0Bm(dHLg5Z@o<<5_duCAX`kSa-;v&*S}|bG%9@ou zJ~&YQn$$8=V#_(-hH)>{)+{$2Ru69bbU~^6_|p#f@4jmZyq1=cp4wi$%$9{)*3~ns z|5@#Q-bOzyvgl3Z%|0qu7;EI#5tuRW#I3pOFt`VLM-U}zG*9Akc`FdXRELb*vG?Og zG_+e0JO3@0ad09W;c%FbUl+D*Fw!SP_9UuEm}{EM{BlG6FoqDq-l7c1_dhK19(pwh z|HFY5p(0uiVvBru;)zB?41&6u)X!z>YZw9^HIGg?|7MI$@vW8ls==or`)bBv4-+u3 z)Pp9&HXF|N;mig5*-m`x$M$=@^|&#Aw!M`AA~?QDvVg)XO{*AN z*r&kV)^yjc1+6qv7h&@oKd=$Km{%cDL?J)x)=V_HuT=a`XRDKhzQ+K-Qs?TfSA^VH zm<%$yi^z;euzcVl2H*aviXlUjSAQ`2XexfI#?0#$Bm-P~#{o6*TRa^Z z$s5lnv)&QZYNafl3}`et_xoz#?u5vCXH`YCd`4)0nuGbIgv!iN&fM(PMj6CzlyrG* znWFG31ai)7seQB~ard?DC~r6IOHjCH>FY7S9XWuZOpBn8Ewxf~v<7#_yEuVvQx!-c z`K((@hb2Gg9Wz}b$6dGx@wR=#GRN|nL8uH0%$?B|5Vj8i`wWMd+hggZqD)a={?` zIJGO^r)4_x0grsWF&`6WUKW>GdTH2HArp$Xo9GAO8Fdm=VO=$Mz?#~?c zNDdz7gsQfN4+F< zD|@TT!%rW(1WY@aZ%MmwJz!BRSOu%umOK2zmI1qp+4(BCruegs-V>_;YNGrpArxzf z-M4J-9R=IANBimfmtYo2LM8DJ`*B|rR>VFB%j#YEt%GnHAia0N7TLVO zsV%78AqDw;rlwS&_5@fJ5X|mg4E4;}|A6$*#~)RQh|m6x7ga*eoIYriDaEcd9NiOR z9S~IJWighUd?ABVPJBXY;IOVtX2Ii;o4@2-e;Q!(w>5ay&?wzeKIG+!YdM|5>($W< zyZQrV%Db_V)%3?QQoOP>J2uufT~BFW(@%Cwndc^=JJC7!=QcjAi@2wOfs94lAtGgDd10OiWrq@AUsIbaBNw~G?zC^fe+pdJb`B^q5Y}$WCD-T{-Cm-`V zYp5~JqF>kFM~CjIG~})n6mIE%G$VREx>3_>>QGwOu_AQs*+W1O9uV#kSsN&DE>-|HcNDiU_|Snl%xY-;VYz~ z+1|RE4F`56`*f=Se6fS=;W$|A7BKs<8fCR~!Xv~8c*}T}0&&#(YZ}XNRWMMCg4x^! zzmi9lDv}NS>p5LA-gTDP-%XZm!bkMqo(!4>?Gl!Tk+L&O2Qmk@Qh(&Ihvs~hAvmVf zpBEqdm(yGu8f|RRoL>XHj?bO+5LJ4WgQRNKa* zJUT*JlORdzS2PNrKOQBtqq8N1YUhBgJ+*I6KqWlG@4nQOHVxArhKmQ^tWQgPkrSBb zN3B?EQ4$m@_-rZd4A0-i@o zR28#(4{2cQ7EP&O#q8EE3A%Qoqd$plJW(cS8OMyH{7|H$1}19GB-)RMdnqhXCmSoad@Q=_r;wp3 zC+asoANEXs9XNyzYVggrY2BgZ{Jv?iCe{x2A9TCbgj(VwDy^svH$sAb2Vd@vUVb^L z_1v#6jvr^~BlHnT4Y!nXQzN4XXX#da z7I^jZJKNC6iuhq_|_(`&4F?~7xMoI`>L=gqi|i38hRYM2N=3hI)`qC2I&q7 z0a1`{hGysxq`M_Wx?81FS~{eL+?;csvoFrG_t}^0?qC1SyT12(10&J};mv)a^dla_ z{kX(JV(Mto=y-?zuJ2J(tot${jE}T>!IE_4HsJ?W1-F>v7<}EBE1M&@F1NF4F-M_u zUQm*$Mh0!c@99W+sUQOT4hoZt*1q5TyuMu3e0)3 zxC`N)FFF29ksAH}E%3Y@8wI!`DEYC>&uP}{kesQlv8np}sqUIO(2aO^HutmP<*JjX zQPZ+dFNW%CekmtqFr9a3dqQaF^{;(upT<&WP;+ySb>UQ6^rn+{5-M zxx>463N4KQhyKs~u&C&yd`2SK9~hzhzFR+5ut&dz+OrOXiwrtQzeP9}l($WQv$~!X zBk6YraYm=xWI))1L0ED^f3V+y9uS0<#3;&D)K{t(l!!&4SqKqEuwqkjy(Uv^Y(GWh zkb;^sC|Uwvk_m(SStp?lR@R*pV9{Foz+#>Fw_sM=W_*e?Q_B4)8|$ZI)q>kM`6`r; zzr#t$wiEq<2V_0JKxC2Pj}i-UJnoPoVT3?yg#nthdBqo@R1j%c`}}C{B@cy_)S){N z!Nb-?I)`UPlHLa{m#Y$Wmrs>I3Ji3^&^`EL(K<+`B^fz2zc`}j;ZbNi;-`DJGKJ

    oy3L;^>k8>=~W5m|$me466A7Wtn?v18j=FV}@g)HvqQ~3^S%6j9`S-h9F3@ z{l}g4JC}4Ss6i=*)1gPf3cuU=znxZM&*l(gVr5+tpzwwiU?fC@SrP6S1a`C3YkNgA zinCP^g(2yUYB9`Y{yMjh;S=1t5W-UE#61}M87^mQXAog*4R>JYX>s7&z+ixob1NTx zF|EI{Pp}S(nd~4G`~)xLU`rSCAo>-t`4Zy8F<$`=G8U*aSw-b_XmLN@r(d_=1K7xU zO4OfNlX2beZg&~7sCP?TshgM^WB=mFv5Tya5=qee8rnMs@j&Yq6vE($_S9o-Q&l;D zp|P6*Rn(J116NKsqoMRxlFN*X$+2hi@A+W1FTTHLu}g&USxV~~mwwttr;B@yWnJ5= zM&2Ml&*VF2Ky!>Ckt5fp34F>VGOOwW|F`HPGH46^5pp6OkJOZ&Lb} zi~jJ@$zp5rc%QZvEmOwl;u`CxIAC)`;TRh(SWOYsw3vGKcw|+7DsMppww}Y1B*`M3e-Jk&(#nN7l z*d$I#ESR#iawF;sEsMPJZZ?e{W*l_$^EA#I4Z{iMR+~AL1-%mKa&}RUqQvWAkO-pC zgiTayL=;*d`J6Z!n@3+D(QjQ7dTg0)@bZB36h;1 zWb3(#PHi_O2;XCGT(rc|;{NE8v}TSkuehHs9TV?Q@L<< z7k7rm*5=aS!J~jHJ&dcje^CX}UXG3O@~(~Z75FhbfI%ait|!7=pSX=U7Qk}WXta8h zA!U(gUG?b7KX?4H%>aC;g4GJjkc7*gPChC6#hXFy@+s|+PZkWsu8Wn_=Mnr%wQ~`F zUy{|xzblz$NG4H|`&8IBH2do<^5<@GZ*E)dwHDS(Oop5fy`Pwd_Ipbh895Y-ZHkmN zZDOateG2*(2;h*>)bWw1o39Kwtg0eI4gH+?TJG^;oO=k~qs7W4$(#jk_kI+To}_z2 zfrX3vY*Lju^e)S`@$h)y~=S4BW2tmo?SNEj?q)iQQX4+HookQ z$KcGr?ZsB@+Us7E+HP4hEIfQIOoO6~7Ro6M(D>mrnvz;f%1qWrnT2AF+D5Q~I`Ob| zD9znP3!1Q@A-4rs{QdZQ)!)#2BjgT=VTObrP0Nv^uzS->pBxiV*YHV#L6m^J+GD$f^Aa8;(w8n|y#`1`ZX|x8GwS?wE%hYCrIS{MfwY}T zrIPj83$Ho(l57vP8zc(!bBDW4!>^kf7=*5LgB-S zQfpw2PYYqj$uqU-ef*Z@wERg&&$vO+wrF4&lQ}BSf49arwJ>Q{fVztS`LLy}KasR1 zd2cAJtHml;L|jiux39O8omv6JPjJ-I@l(dfOP&E2_H`nIDqCFOzSsYnl^A>4#0?DS znSldG%}a4g0zDk7Hu{~K@0f;y_%Fv1QB%%O{Ng4wE4kb?{#PQ0@jjzmq3cmWk~-aj z^}mvA)IXFa2Lis4{i{LuNU><&$b;#{d+I|8IQA(s4+~}KtpW%1%_`Aj!Pc7FY-oLQ z2nMBjYm(HWjisi1ku!z#Q7+?m&p}A>q#7xctF^N0ch~@@*Yv?eNTM0MEJa6(_*T>S zk1diC0wOP8(gB#mN+G2nZ@sirdKWMw0&)%pYZkWkh>-8e{pp?O3pLexZ z-RaS&bY8X1pr-D|skCTi3s=8+m9dbXVj=j8|gY**S`3d$>vJz0RB&et|lz z=*!H&i&s*rn1V^Y3jd}ePdG*sR7#`(Z9Zy3Or+9qi!0T@eB9yNY)pvwd+Cfc=_aV9 z3|gdAEKJlv!M;|i)SpL!3l26842J+;k;#`<&lusS-UR8wafW!VDLIY_>Q$-tT~N-L zakt3XYC?k!U-s+R5Sl4UjY!W6E)Jj<6fY>K2MO`x?*FAdq&Ya6wFjNq^Wnp zd?(cu8B(8O^d$A8GK&t~2qvf-Po@q$=t!R7+xh0>fh5i+4PEy0L+?97h5@E9+6Pw7=u|IE8_5I(6ld%h_1Q3d7cV@k&=!+imw=-{Tf-K*@l_h|9cPD&m8L8u@G6S``OKs%`{F{eCVtEVCwRnjN-&RVn zM3`NG8FmHzxeJs2YXJUFc>Y5e@*+16xd}BT?y2UL{dIUqCgyXAxVP0%LgC&1;8svs zwV$vUXNrt(6UY!`#mMuF8$AcpVqxPZFnE^~VeD?y!bQ?2RD4x|iZYMNb-9B`)p<$+ zUh(Mm)8+U{-WBmy%F6CN!V$!2cc0y#@Zwf&{L3&yX{GmF4N!zhsd~38I{oDz9X}6$ ziz;yl3tb&vBX88?z(7Yywj7|W>TcA!zg~&&HK)$U++YNDocJ3~tzQG7Dp1XkcCQvC z|MxY}U+?|E!?!(k>mrQov*b93$mzg@^>xGiMV;-0YfI2DGhP({uD65_(iD=OMH_b3 z?)iH2sydQ>cQRxiw#xQ;P>yUyWO`D(q-T}}d6r*SJK9y2-=@2|xB?a&D^0#j>VXYt z*K74aC_0Tx=%?jk=KDWvBL3Bj;?{XqSIJ!M=A?RS4=^~HM8k4j34mbM5AloE!a2IU7N>S?&&uJ_B7 zl~kfqQd9N3ksrbe87_V={8An(!!1K!r>CUc!=3Xy^$Mbrx+(7m@bJYZV58cAA$?D zA@`_u56QJI1OrRk-skM=IqtMLWYf%qtHlbFTYzv7J^QhCU;l)Py!xfV>e$K~B;6yozXu?to7JPy6ul@~h>Rus8k)i{S)`LNv^XpDqIvGE%%99g zSG3v|b+$1osoC{!c}rzN^xR?rP_h=8?Z)$EQKKz(_S9j0mmgXk7t>h)IRAXOVX%U# zB~ci2?4=}ej+uBsx_{w5ecT3Y_t^x(s+XqG+DNW&x?N!HW^UB z#bpoB84j~$T49>*yX% zk9#DU%B=-lfjV}e=8^p0cgZ*^E^bhZ`0)-zws(uZKVt~HZ<5^-QSm^zqV$5JZ`bgYrlBJ z_x`-=mVri_51Q0T`0|m4UFvTgQAP%SO12<@qR7s&cec;<6e|nr<*3B`=OtYnYg~Z( zy9x>$C*N<`sC9e8?RBo%J!Nqw6LIS{HsVq2?;sQ~KodX>!Ne zF>oxk+I3d!guCJ19g-=OqliBYU`FQu2LG&`NfEM|eSJD{Ci4Xn_fz3PYKk1L*!NC{ zu)2BF4tj}IxQzE*1q}Ylut&xXx{*-bIA&3DwGC)7ZTknI6*3dNk5npqT%goFKpXk? zl^Y6$O`xiu!2<3UNF^8_4Fp?uM?8!0tZOB!R!gOyOUOKZi1%ZC>T&-KUKXRSpGQtk z@k*NrDL>hL_ur=&Fdk?rkD`(gnUx%~805J9hYox{pZP;d-EWceSr3~T9seFZ@(=P${^J}Z9S__UFvzsLUb#uJS+CGnl0lM)8h%FjR0 zShPwvtk;sI$_-{9th6n{}COG*rL9d zlBWMzlhkOMKwPN9LMpgP3z2t?i3SY{(q)6Z+m-rWVr^$U*mQs#m<2POTYZ>YpG%V7 z8>t?r&2%FUF?;9v0}Y5mxkJRs$E^G;mvypKrU0qdkhhIvog^ zvIHhzt58U7C~B=EXpG62a=>r1SzJ=RyI0-YsxU_g^)k}QIp?g=LI6-Loa8rO$@+G8 zReiba#8UnxG&d6uf8iz>YOM3WaVz|n)CRk6(=H?CxnltdE;%pjK=U0VMQs2Qa|P0q z!t=xLogfO?@9NgcC3JO9-^q%7pgun&z!b5dAP#QPbn4%EA&iYWn_uMyR&^5AW1r*R zOa5N1o|Hx~Q;s+Jlt~>C>tJTsSZ2VquD>q7GQoLD&XMAQpHrELjNciW(ey{%!r9sK z_yctMn}A!GGglu{p#BZy_|Ua2G_9&A6%|!Gbosjgni<(GeCP&FUJRGvulJ(p^{4Ax z5t|VZ7#UQ+P%Or77-V?RnsZ80I9As4Q4NRsA&5xnKTXCaGB@jvpv|vs@};ueXsGoy zQ;cv#{Ch4t**hmUJm2JB+D?TJN8QxAooL?AuQ9=O99mxtK|*dU3+_+hzxl39CWkNg z>Hv*)PT#V=;0BFg`lV4`nt);1LfVx8#cuHX`|Du1Wu1YPGF$R6>@BOpd?{O~US@g* zy?#;uD6WqIUHKgv{^tzC#^0iX`>l03D4_o5F~%AdK!J<=&|mnb)%z!IM(~t*z~{d% z$kkl4us|tMMYb!YzdEBues$25Fi7F0D8WcofFbiJg1)xddQ5V5NSF*QKlHmFZi5_x zOj&B$$X_>eItbYGx>HFjgluAXZ2i8vJ;Q_YVaE&rz*VM;WL_?GzYr$c$^`-~0Y$=1 zPbWp6w$2_(td&b`0u!M58stPJ$2t6_{^woT*3J4+SBl11c&BL@gs+JV4-+?w&dW-{ z4j6EH%qTtnSk8K7v`jXs3kHOvwA26`jh7SGkLe6fM@xQu&U0^XXF)s*u=3j=>ufj(^u651LsS8n zLrB~%ILQb>Es7)WbM3>R^X4Y^3?z{0H*feyjh66-JhBLsU+n0xNV^?5+ov7;yxtEd zxmRr0q6hBq0Gryqo8*thwaa(1(2=SLyrrXF`Xr3pm9SG2BaJkbse>%wjAi9=lXdaf zi-FGjN#gT@lC^~VObnJ8Z+7CQu~RUs3}xqMpNM*kudmJN9?S*9aTpCPj+0}n#tB! zkZC}H)kf&E1z0i70z8KP=Sv}DxPD>&bncv!o|kt4v4ZQi9nS4qC{LiV41F-?uW-2# z|D)uDL^c(O)TPx*lSNGAc5PQi*wIY-yFjZYTapKV3$!;Vdp%^a=^=un-7pNkl}v~i zLWpaYt`(Lr-Gk=_!d*NQ#^1`x;uB@$ZzClYRQ{;NG+CN)ROjsS4U<8PLWZ}D)t-Vc zW@h8&~@ zc{k?zoMMwjc`2sP>QAue^aIYjJ_?o@=NP3Zf|hJ=lxEp!?{6TS2{|wEtgRn>v$FgH zyHbC^>(-x*RBo2P!g_PyDU3 zzCkDU=`9H34^Yba4jE5WBsGCZ_NVJao4<2vVDSe}pBCSL;UdQEpJ#+jCCb!_OANOs zFapY)&Qp)jAKmL0NwosN2SL-M@ksK(JA=DUHwBv-QOa;h+vPT|5Ci^S=?&kDCx0 zVkBl`3Z98q^=x#4X&s30upmdYW>J@}4vY_DbdZ@4&JY%c>W#ru_BI)cNGz)H(;8J? z(u{pS4sZ{kBU~R3KINGrofIGMvvUtw8!KRFU!r|xp!Xt%X$c%3YL))H#nfd$)1Sb*R0JmE zj5w!aMp0Uy-;lMkF%Vg7wOJo0qp?;wBE;=7Aw*~;>w*ulepzQ9IX)lVNjde*(9Cp4 z`(nu)ey6&)&J0_AbCvpz6k_!{D~cKrraepl<8PYa5dOVO(_r0LKhxE9wMMEz0%wbo zG+$r)@binJuPoNsW#_j%H#coY_A6G2@8!_huApcdsbnM>q3(MoDLI=5xAOXLL;N1E zF!nM$>xuT+RU@QS>6NT?vVMOQZ9N;uLjj50+^?9>n^Jv31Sq~q$2wOcRHVYiy4soO z1$QHZ!JC|vc^x0N@AusQEjz*Eu_NkZ)vkiFp<(0*jc}C_)9gZJRr($)H?hw@cTzXQ z&U<4cwlj!TwjP(N6OFjDxFkP2zm~=_?c14uAG;Wz1M15={8@VWSY3$zXjDKzD7B!V%7seOtVFX!?lM4P@V$FeLr$q-l4EI(k zTPZW8;xfNQ*h*r$k>)XK+*dN`il&hm61MijG*&4c_9rmsXy2zDIRn&tYbWWL z7{-P#)QD{EJrJzuZXm#_8>Vlyq>hD`bWemyKV4AcoXp&r!g9Ur6(&~qT0bm;Z!qy+ zI5vOmIA^&RM{=i@qM;-7mM}Q3G(_}9g0bA5b zAGWP070q}E?x#$3)qYs7B2|=v7fsNIY~P#fI_i=2z~~Pt?v~7t5Zn`E$)%?-{!fpm z+ZqIaq!C0jnPfDlIQnDBYd@M*1{Sac`%xI5L7%@(&{_0vBK=c8Dd-sVbd2~e$2F=Qdg_+t!LB6p!!?+qEEDCcy z7m1q&q^RMZizce;QfB+|CfQFqVItm5s+aJ)TIE)3B#tt>&8;8}X)YNsb|Og3^BRPl z@M|7%2Uax&di9IQCkfR!1_iJT>8hd=H=de=Z2f(k;|Lwsp&!Ff+A4$zhrRoiA)ht& z0tHT|AgOBU0Qwd6R-~|^K_<2ea|h(#aUy$D^rUO$k|Z^#gKxtc&bE!grzE9{!(2Gh zkVT*fQVa~!y>wry$w@Mgxjb%YJl~ON9;(vk=9{%nSwe;#7?b(ZHMb~Rkii>kY6*R= zO4n4gwQ*B~IR%W{fuG}Z&nzp?hWfJEnq|lvI4~D09ky2HgFv?-lxPxd6|q?(Pb&mJ zQH0kOU*yLlIDSWs`zxPVjJN;o%Ss->C&(a=&boH{QV+&CG!9MFQs!z|hadqSlyR;# z*++qI%)^vl?JWI?X^|TJh9}1@TvwA_p$T5~`n)0k;-Pp%!%CD3EsDx*SeN~K+gJ0X z@Kdu#7*}2uM8EMvAdy?*48q9ucDAz}odjL% zg-B6(!>Oq-1&L!ZWES)OCu&ZL!5rMBwt)tW6L|I}?d~ty&?&O0IST+|M2g4?v&Y_> zIpO;ZV-D_b`^=}SX<$PQ7^8I*HKTeEyIUqcZb2r^w zdm_A%yQjFRlQP{an)|Xpeys4Zi|Y9brj{v$hz)K4j>c#Z_r3?W8s;}YA#@rNtw zmC>fd_A|djSm|_*$8l3LnJ9BsDCt~EMfzX@X4#;)Dd8Y3_^Flf{MdM3c*&+|H6B4q znmlr(!bsU#{$ud6kf7<+j-YfN#K3gzy}{eMR^ai;4z$Q3^DJrtxp23$=xUjF6_}9p zKhck41d;NqQ3>nIT!P6ydH96U+Oao*-r&`@>$e%3g`^Vo~C_ZA3UaF^svtNHzJb_uzjF&)J(E;{pu_{^7 z_~5p7O_-U17=NJsL*-;&_gOkJXkn0(V8a0lD^c#PS|cPMj@ zYK&=1JBoI`je0jhmlTx6)QYlr!L*zMpP~8b`yAMpmg}2h7D5%Av3f|_gd0UZdM*wH zDnn5vmVQ8QGa6d%!e50YpYL_4i(9kk+FSpcjah46gslDO)F>VZANEGP3*7sXQFq=` zZQN?R`sRQkQb@oO3FC{wxdcmG3HLGmcG7uMTe8WI&AtU)DoPp zaF-$;H8rCwC@77p*u*TyE3$~rq8zN3(e2DsU`u%$>xm;)7v zxO(5HvUXhi*igtYXZ{25CBWh%h}o~uY$wDZIR{awm`LoY_BSnJEUag_E?+r;({3m< z*-Ln8kq)p{QA+=T ztLN6B20Gy%*(LP3S;;Urx{%PKqQEYxj2EJNEr-kzD6TPX%%&0pG&WW~%!-Ap`^$;~ zdmb{c$h?UncIFhQfPc`eg{tjYqE27mQ(;q?CR|W_wmO744Jk~Rl>1Ffne29C=pm=G zZLylk_9ZVoSBIKDd{&|yQsbmvjk+*zBK;e2lU66Nd_l*+ej5Q<6(YB&wvWibsD{$^ z;LmU;m(b^XOLm=VLjIP*T?GW9K4n7liPj8jB$Fcz2vQR@lLhK)v$ejVbpN#*&9rfR z`~5i!m^i_D8ZeV05Tl`j>C$7tKFZUl?POmQ1Ak-bo{2=N54F6wJvY;F+!lxv-uapP z)C%BfHzxvEqI*i5cU2_1&lPfIBwHt4gsQ`X=|O(HKs4crPVXBD!QX6x(|2@DpAy78 zyMoO?r}V|uMo*`4Q=N+P%+DV%*9acqEYihH!@RXkB0j(xa^v(m;rAoy>%57iQIfUq z`Z<|Euq1B9iS^Pja!anjB7xk9wOq*lpZ(jsaa`vi*+ajnfVcuTS?XEt|6$lbiS1&f z?-~~dsjRX#2De+K3>((LIsgg$MibKLJzm&$61|cii=nm}@WFv^X@{cz>I2fk@X0l z+{jV$i3Od->rk|p=DAvnst`n!e|3m66Wb;v3==>c+6}<+Bi|Z&NH$Ap>aP)!Q1+hq z4T~DmNb-NhjFITd65Y@a05>rww{uNbgU2k7R=}6c?}gk{*N&lRp{yesTsl}vMEW7^ zrvptge0IvIzSqY#Y=^%Rwe4*5WwJPEQR@jXQpw_(>YnCXl1Nz24905#EJG{M@*P;K z9Fl3L>+u$&thy@AZ5YmnXZ^JbGhU^jid327amd58?2Jl6m!kpbAEm5=>45`5-;N>Y zou;@o;vjMvfm&Lo7qAz{r_s8IK=kuWK$2ozSQWL4)_Ph*Lv}&GmTl3?dTyZiQ;S?j zfV+WdOtW&A14L@A%ijBRvc4cTKHR+R%t+qd^Lv2g@I*|gmRdwR9GOnNE=sQ%?2Ne4 z#0^&G>RF6cQA(~^^U7GhpI&lz_D%1J_HwCmO)^^xsBmn0xzFA`4|dz;Ul{+yKfWg_ zV>lzdz1vg?$wCgwf&>b*G6M$4$%DLYYQ0+5bsZ+PMhj6uUx${4|hQypoaaxE{U?VLB84591u(?~f!5G1eM4 z#0Jk^4Dkyt&3Nm0v8GMHjL`=jc|1QskpF!xH3n(rB3NI*mpqpn#&FxoDcd`r{rOr87nFc*T|oYK zsjT^0(buR%i&U#zxa+eqZjWqu1lXE9f9nO|Ra!3T_)zNDrBB|@Z>B`B`>RQO%Rv62 zV4(fJs7}0MriID4kiMQ_RU~6HGd)B*hePJc&_^wbL#Rq`tNU}+JHIP=DRXU0Jw#m}hX==2n z_3hCgf!jha%<;QSa{{hRfHfV79J$}!;O%Kfke^~fG3B@tzc3x8gs>y-fS!n?sGk#* z*Q+mxOMu?wZ0b70TIDdOF2?8d(a?i&#DW#jwi*jU%|4CbvejQMtwlBX6(<3#9`ZBK zPYE(etB%A^?Q|VZEb7|6V&5Ic`5v#rsakMx(6s@ zb}STnaGA{tKoQaG=tS0X$VX~+vG9ZO<+{1aC=$~AUIp%?j+{TFL>jHwLd z6?hMaD0IPax-s7=vkmb@YwJs%p3O43EWWaP^dLVvS~DjY(b`}D&tl`lAHi`ut(;>X`E)97K}Om7UVvIy?^VOL-9 z6V%75NN$|OcS7+bC|~57%x$r9b2_ILddKp7zQMUGTHNl)u1lQ`@m;{lD&^}ZqQ(YI z3x|Ymb!7k3OttK^l9_UYR1-hP@SsL^isYO9|8#@@hcY9Gejyn0yop~dtJlj2g;_m< zq1j?fr2q-v;*r=kJ)rd!O%-C#(CydH1;(uS=@GAlK(fcMJM6LNhMVOn91OSZ)fjU) zmW{!4dY@Rkn@3$yfx`Y`Yo3$X=H`H{5I{Cp=8>hn;(jQ)(lM#Mywxc96qz#K&nLkz z?SDi2no;5~bPIe>u7ndbABp_sOvp%O5tL)%VeAAB%qBPu<4a7d6oxTG7wgi?8iqR! zGM$Z5Mr(%S<)-B>XW{i1S_}K%X1CYxQcZK<@?&N5=RD98NdCr`i1Bsxf%|S(JKWIM z+nCk08!t0`ior@|aw?~1e>~kl+}7o(7R682yMoV!*ep-UJxF<~!t1B%23(L2QK}ij zta>yzD-vPNj&ns46xQDgD0Hmz%I1?zzn8qEtREgR{Tic&{A{Q@#Ux3AN{k&QdBu9T zIfXGW;1pVp(?$0Cl%&+;;p$TRyjccsBjoJc*VvtM7gk>pG>bTTi*D~$cfH_yYm>4* z^w(Q>u{|EP1;1~G{0j2?KE3&3H{*JA)WjqC#PCf9g#Wnf$qJVI@GO9M2LWupYnw`F z7m^CV>BB%iHW0(a%hNa#^eay%)9Moa{cr&UTo9bu?kmHIIzN}FinCz00p|rJ1jcqe z%_C?vM+kEfI#K#kDbz|vH*OD1L7Y4{a=!;~4RbGvW|x{>C-{QL$PV&sq8Ur+f6Y|h z)=VwT$O_I+_`1ub=^aKl_ZS}glm#?(rW+#9>Zp@mUCcq{BifhCQ-V?5EuO!t?cCwa zx~4|gEH{$=^Q>I58tV|g8Z{9e!zEl{`q#qPWp+%K3$~({4*xS11#{qsCAd`uZ^5IQ zXbe-S>BwQ>-dE$BAPi8!JBd$tNqr4y<-+WFIj?3)i zvPYAD44!YL^x9d|D@vk+NrZ0K!WO0Zu@xw1t5`FJ9q|@wuS+>(g{0X)8Bu)374%=z z>)oDskzwlsN?VmBuZFu8r^6}_F@slI#OyX?P+e6W17F#N`7g3#l6B z0*fgBtI#aV;h>ijuUH7r=8q#zlJy0THP?U5o9amu&Hk-`yrdg9HU4fAJXOO6OrCXG zWw@rdUP)TJi4pr@n=~!Z%$iRK_djqoE02UQPbQD7B0TtbLF*Gdk^^5)`e9h_FbrcM z?QASxj$EW7JL`VVi|*@M-OR3Tx*rgGK!6hMCpQiW(}A57nAqAEqlfRK#ach6snVp; zn}u8I0sx$%9vYjNPo^zb$RR@Tt0Kt2Ncc*G^~@Q41|=azV?Gx;+2HDh;8m;#7sZIR z>rTo@EN0xWR;ie{*9?cZ^^s`?W`N$2WtF*CR~WeerW-#TiGxn^iLTw4ZE=CXa)a>T zTBTA;jY5QrN-Lb3ik6hcL23PbCtSP!N3}|I{52-hx$qVLzNPo?o#}Z%Xp}6AcG06% z@^-p_)pC{;5qqgavY^0ms*g*Hv0lKFr1duYi50I)7^a>ySH1 zPRYAp?r`Hq^$C9ZLpt>dMU~`;V*`vcEHm$ohihUpnT$Ue9skI*2a){QUvj56GXp=s z88rIyehCn?etMf0ig9Uv26h;dQP;U)eThwq{AtX&_gBv;StEWgh0?Z(H1lr#^{Rq$If(&t>W zm)tF+Nrap<=T%5*KH(y2Qd?J!CcpXv>qy_b2OfTW9#?Z?mb3kMN#z?xE2kD7iYigT zJ}aF<2lSxP_A8(K$ukl@B}`JwU9HCK?wspl49G-(mE13Z>J9OS4Q*fj?|1Nx4@Y@PZ^_<~V@!o_ z*|S7^vBW+9$sA`WGysSHE5)*)4B?F!7Z$k9{Gk5d$?gABAJIkqa#<`M6J_@y+tJW} z+^ek8IYlg#KN=0L;GDDBO@E^Vv$X)^`O6j0d$(b&=a$BF`{7GG^gdz;#3{wJSh$Hi z{+j0f7e@J&hDO4jqf?se$vIB7pIf}_d_DHmjJ-N5u#@9;#RIh__Sf3eu9GWeqLE|C zCHg1V8MoFaZNjZ?QM>hs2?3zjt<=Y!c(}94`A+dm1a>tp@xL7%*Mua%p=dw@&P{bQpTRwKK3odw(18@B>Llbc3F0B?|K{e$(7%D{Tq z2d}T~--=XI<&Z(kJ+aD%Ctyjz4;i=+7!`p)>rXL1>EQO$O#{yfWWS0d<=d^<++(dt z=ic7?x-yEFmZ^CoQuHY0G>YY>7o+x=&QN$iCMAgEK4sc!v!&3m{yB$JqnV1!Ue*5lC)mNdnjBpq#s*qwGeDg^?JY5*&cBT*7p18$l@;+FXmNjOuWH~sWB50*q5M9 zgUBRex*m^2WcM%;4@`usvy1ZN6q3~CqV*h#;)^g!akE-#X3#CWo3f3OR02cnjuepQe0=L1s5IO#T_e-4 z4&@|1_Ad$raO5`)NV-^kC}F1arY&P-?~5aw+1+n8vc-aX39QhRX8fIDKLFNj@aek< zXtE*(R+vZd&T}gV+t;R_SO|(<0%{5E;^YujzCi8mEABoBJ|vn}{JVUI-`u4;GP?{Q z$gler8u--@dTK%$NmAoqtNqw<&@vVNJgl_1_5*b!?Ck>o+SU-RXkVpo5xF`cG@*l@ zb5R0!9;kSG`(dwVa&I@zwJ?02?&{L&G%U2yXa?)@!1Ff0H+clVGwyysoyD_zcA<^z zu`gZA+erHEs3BK>2#z@GbHW1p1g0$y*$;&?xjPLSp#yIf^$zv>XhDSOEuH&|pJ)VU zc_uJpUJn#fcWTA=XLk^@apQ3wxwn6N8yrMQ{6TdC<(i)C*hy5;3IaC4vK-zIK`Q5s z6Lf6usz}qZ6?)Lu83Ruz6iqbmdI(GK2{qEng{63vDDGz5``XcG0-1CRl zmKNjur>wbLu6_=DGJFPAcp5YH-=J}a_b}Dv1I#}$)9c#`1pG6CteBHvy=UKOaZ4W9 zuLt$3#Cf>696i`N$i+}{I`=Z<;lz1m>s0Q`6R8dP_v43WXL}1jCY`t+1ou*`ZvDmm zxI(ppkL1(H%4vq_wx9(x+zkla-zbvQ>WE}vdY`_o|q`SV|uk3py;EKGGxhe zG$qgEIz~~I^5_5N$pGoII z!u@@t8Xt9DUz^2u-s!)hJQrc(7q1Cr5SdI2I`gz^t8^YE>IvV|I1^Wxqoqn6)1-_E zTJ@6bznvSI!2~k7aZ#H;-l2F~U+NtSTXLc^9nWHfh z7p)D<;BWJeNc=XF%^-O@DY{|}Vr3C!UNc6P7rq>2mYA;rD17QZ2|!-@%*^w>p&(Ss znGEFkh~~jW^60QZg9VyB5H6{m_`!L-Qm@l-7q;~35^l`^lno-+wsA&PbQYxxeyPQ~ zPq|StBy(7%rTcb`Uead=?|BjWZp*{K4EZc)IAB?VDDB4sp3(r6stAua0OJ#>SoWP* zf-Np!DGl=c3y?N%A7K$fd@z%1`dL3`?MnsGsOpkKmT>C5^_XjD&nDKFaIm>oPeSi) zmm;8a8?yo+#K*_}gOEci0k?~fCGf4L61&URdpzyvF~yYmNw?qaRG~vl#TSakWB@Vo zmeQd4f78W^3nn}4n_t^);G!j%2=-J{G*`8>+Rw!dCmsg_ z*LO0Ujah!axql&DFMVq>A;dl~M@X71Aq)f3=lU_L?nHbAS@R8sTxR69!YHgZJLqT_ zkp<<6plm857BTN@6=km)qM42GEqdZYj2|I-e=jUv{h4o;Hi;p%0evV9wl@8W$}4bl zeJQmc9yN2_6gqUDgc8ZP$U^RRKUkT@LAJ(~Aq-7mxzItQz0To*jVqi7eM|z7N7cU9 z)?zt>qn=jC*m0hlu<-T2uCxeTe<~I)p1kVCj`!cC1B8Q^j_I_zhn z8|E3<`P?E&geb2(Kj@^aG_!nU>FI=onM5DMwSBke&;bZnoaxAp6o+tss*8Rx(h#UPk zi`Me#HSHIs5?6A#zvSioN>t@;T1i4}8EjQavVE)+!lvga9VNwy<^Uo1>$OgSAo3n4l!9~|!)x4$=3DCl)$Gw`bc z_`@DZv>3fy3j6RrhPy6$ofgi2_5aXb__l@Ixm=>I(og}MeN=Sa#7a+4kjj$?n8TJ! zN#X8{c6-xE!uairTVWMM=ul~ ze6J^@gzKtRoo^4CCQ_CZ7OZK4(9SiTO&9B+>}v+HdFkVizv}JKuq*?BkQY2s_$%X6}U&@CyuPDpS#?Z?1r z3l#4G<0R@j#=8Bec^GnZA8!axu7L&Nh{4PEuii=MK6gYCfzfZeu;lyT@5W;Z%@)^G6e4fUt59* z>emTY=h=+nNrqZ(0PtAs2tF9k>;=Y+TSI$rojMwC#1?6T**6>9Tjae_79)g3>MEBj ziRb1!d2saAtB91E>NH*$?`TAg2j^GIj0`VvEELw_(qbi=&-c29BD{u{^t}*{HwOFr zS?2Gm+P(A9@_xM3{a&hN!a(ur{8VWySD=#jXIK9>_=%2?qg-Uinnd$k5R7ytXkNk8 z=&}A56$=$Q2qx8pmzyPK#?gORrii)LC8N9=6>@#+(Cz`>@4wHWA%4+cOjcIzkdiV; zVS_Y~{nXuJ%JM1=auLwmVWp+#roJBdHP;b0rhZ^?Hc(jV2PcS7n5)yYSwAkf-xwZ` zKpX2eHI86^w{K(Q&l;*%8RaY6neV51QS#yDar91oC~!#sfT$OU+5Dv7m0D*tELAxU#K#+_rjHdf#UJE04r(f-|-F zNa+;57BZiTTEF{k+RONa;Z^X7SfqC2pU-cGB#bGAnw@IrT-qGdt%i^@aPK>!Sr8~i z>6m(Dgx~&-`9Iiu@1Ul;Z*TOGqM$TEln&BGih%SkNbkKP1VOqG0)&nrNbgcZ=pAC{ z9i>HDBE5su2%$*taPvFwJ?H(sbLKve|J<2-XU;#F%zSt9-D|DSs(bIXmy^2Apmfjfr#OB|s`-Fg-Ei}C`38OJMg3$n??NffrYnbrC3eK)5;RE*y`O&ObPdm| zw5bO(lkltz&-PopMv2j{*nIkuX`GIHZbO9#Kb4M%x@Kbly|B%6Nrzj%7GB$Fh)5BT z|B|Q5vP`#&DtyQ#HnjS{&YP_3Y*_hMDo;_Mz_S!kRz^fe@^9^~Z%O$k;%8J~QA4mI0ia+-UNvv~#AaS5TyuajL zHp-m|45>Q)ObE!^3J*_a_9Y8~0H=-{Ddk;qGxex9My0g#?-Ttp02VY(>BYT@<)u2# zk%!VH2W`QI@p|D5mWlzD;xsS-^C$fx(_{zz1hw=^lo zx3_N122#p*W%hT1{N})O!9u?NSGKg#l_17 z%=@gdvtO#v;>fm`1~ge3P-x9?u(}#k#9Mr8pgLYh6EE z04wE|mF6gP*gvgtX9LxH?AA|!OyS@U<926}t6*=a$vr|c4f=(HtXQ$6`?~kLYnm^Z z29rFG?u@@JO@DcJi`wo`is1CPF#tRO4X?XXkU|=qo*GQ-Dir)(VTll5ZlzfYtS!Eu zBAP%%C(>g=+W2Kj!tm1xQcd6!UxCUIPg2_GkBDI~n{GTjmxff`$SWRS?v3O48y_+9 zomrQKgEUApIU$Y;CjoU_fIVXd;{NCmw1MHyiBDggf87$lySXyg*1t)s{-PT_LC%mP4Pxcsx6)K ziXDsph~v_i=;5d5|QzQ5832r`PrswnCr8DfrpddjiR& z_oOXCgzmp0FU6gB28~s^)Km8F63vV>)`%rZ6r3Qgp;w^G$!pPl@`XUoVs(UZgCCK( z{?42Aw?%w{y&+kfZX%*54IR6G66}(Cu-i{w%7I_L?|noFq+^!7yL#5~MMUd50SXuZ zJ-tsGqPNXTIoaRSEca?g?eg#o-kUsTtea>Cj>);7hH3zSD9f6-b%7ZCVu5~*S*qhT*MDQd@DlIqZDp z!^{2f5`Rl#*U;s&HD`msS~GjO7IUaCWky8u2IKmA9p$P28_o-P`~htO)ws>1R)Lnc z_GNs=YhSIyXv1ZX1ex*jFkfhVz~c6{&2Y}n&hL!wj?|2kxZB2A^AcrxmJ$zxX^m^7 z4cuk`B|Z4f^r~EHE55c~;gmjKZVo+~L}e>E0U;lV-E5SSeY#(Hgz^o%X~!|66k(+Q zgpTr~Dc2=VyZB)z{+%Hs5~3;=8TNE#eVTiBp$OmW@znVT^NF%Pps8a-4`UHgHvd-K z`EbLuBk3$j$ku24LXptiW!@5#SDo>X@7w^&DDZOlnL7Q?x9$=)9(`!qV3YA>QKZSW z?K!ND{H|BV@i4Emfr)#rJH6GKlY^?@?1$xR1yAk`*TVS;%q;R<2W>}4Q0_MwT-h9( znr{uRXVmDd)!|g9fT)d7FgattRmty_&23oqxkV>!kIAA8gA>I zb&sANE}9sgKOHYBwyC0z`_wNDbmgC48SURWyLYEhU#^YI?JM6MvOa-F$1UCdo}V|( z|Ir-lcxG;Wa(pK_h;k>qC7T6wtG?C!)~{;V*hbj`RCjPx&|N6-2i5HzmZJFcY; zvytQLCdv!h85)pYQs48?!67hEztU_?hZ-ZJgoV{LF5k&3p5+otBHJ?R23^xlA}S#I z9+?E$8QKcg%kQ3CX1|*Zp;$9%p3J+y`VldsNj_fGH!DcpgCiJmD1k_GfxC6Hf%=v` z8OQz4h_ZX=J_Ge7`L|xsY~w2D|7uN@@dJ+?*)Hm&C4d0#oia}Cp9l4 zve2u!pA-Z_Mo#5ujTs54hLVYG?w};l)~(@H-`-$}g%Lo9XGEGPTRJ%J zeD=!` zcUknC4hfUqi+1+m+E2)g+mw&KpQlC+ZR5_ZO4==k*a{;ycAy#YC)APmhLigwcBn8v z;zK^1kZ;gp`u|c1jRXws74w9?C7SP+^Nhw*>1O)yJDp#NS?=gflUM<_+BbV0R4yu$ z{;%e{fzEeEcn296;)X}G7GmoK?(_AesT$=l+)P)dF?GHZ^m`*o$w{>N*XJ(ZZG1fmj7!2_dt1} zvyk+tx5R|;VXMg#Y2rYAOfF+JSf9f8{!mS6@+ih_FX7h*McVEp{&j{osoA^NGZ? zW@|H5l4$A!qCMPt9Xm?Y70V~}UdD_?0@(KjPTr6j;dtfdhprfdRKcu#&Jyg(Pf3Ep$Izfi2weo*rj z8Y=hU!4W2PP~d4qlZ0`xbw>ukmC@^?6yhUBHjHtDu`i=g1SwbUI>I>ABQT_tf@}lqt z8@fC~me|+|`Z|}wmq|O->xzPgthB@n)B?(6{<%B&6C^AT@$E4_VL|!`5B04KL9G`V zdwq=|d-@=E4OZ?i#C)zqrEA5ObRx5Y2Q-wK=RT{80Vt;irdK3-RK+4&ksZ4Q)iV8~DDIvoKx3i>+WV|~wT<4KnZY`ZK|1H5Q z&LMZHwC8H*;vRp^+(#DHuVQJ8lJ?^cXW{o|Uq}JS_!=bIiZ(36_&b=!h+-NGcod&+ zR9N#N=ADNn10F&{WR{}ww;JY(jzPIQcc9A;Yo%VZ>4b6GLtktI1BB*) z&U40A=D^w0q8~%=R~@H&r2@v%_(_f7UEM_;)*Iz==`=%w`TFXa_fusK?B|DDzs)0| zbm)n%MGF&;j~CoE__vs%6sakUc+=nU`m4wP(opw!CkI5o^ zo0Gbx7Zq=MXf@iV(lQIU>KF0+Eb zUmKy!Lq%bD>TUaK_}78rw6a(EWzUx`1EyJL@yFb!=8Jz(Yw`6YY$q+5FENw0)3U?Q ztmVj*$q9DNTwqk#gPrJ$9H2dpDGan~h)e7<%3#Xocr%K4DTJ?Dud1}aNoXF}~ z-G9$f)FSFimVA6x??!aDOyA6BuTT0%kg}$OB4bcXsfDyur%GafkEZxR#H$Ae#*ws$ z@Mw2|?HR((=9a}L?wWab@egKPfM#nyo0ZFIe4o8~;GWA@BkMiPS1` z%Gs(7me^B`Kdjynu=#?QWuX$O0b7R3_35 z_0QT_sl?Y?#~!2<>6xyFjs@y2l8D(R6spgOF*fIxTUT?piR{%w-|p-$u_IT z%(^!*W0m?lLxeAT%sCn8tm_PGOD6UI@XfK$eWeR5Guz|GZF9Z5{H9-B*55fL7U$dU zauLtLj(1lP4J+bBLV_sA@G;)~Zja(&HRQPEh1)tHjsCjU%&p zhYo++H1GdDFKU2S`kuT?gH2LqouT`+Js@X{53N3$9&Yl6wSb15)9m{5QoTQUP5@RT} z$Y`X4UbCz;p7dWN-_gCFPeN!2*S4mn@V7J^`Z7Q)XhxPbQE1Yn6tfmCO6Gav`<dg)H$L&AM-x7rE@VoSOkSY-V(nXRl?NNa6SVsfY0swt zMJuqcQmI1M7$t8(Pw0=tce*&Eef>4E8DTFR^q;AI92nU9JT(~I`l_gOgcbk@%a6uA z=jJIls?M5Zry%o<#q*jRA(d>pN)CQRu(UGm(e}t4R~Uk4vKCtK)MJVAI4U@i+AVo$ z-jENrN1R-M_Q&>~;Uxdj_hw#@`Et#Vse6cVsoGcWgcD=531Dz4NDR6)x=?=Pf3cJO z=KO-#VvF%TQQ1iqErvB9D1D8o?G2%S3ptlOUE12$K$TE|Q6s*4n>?+17C_fY{|Gb4L4?Ml=5b^4#vIoey@wcfF(l`kahQ0U6RFNCU1*1x*$U=oIu9fW2+ zw8<}sh3hOFJU<(M?kCR%>r*=Cc8UL%nHnP|4}~PDLxqTnEUq5?)kRA9o<2P~yf<9y zu$H+;ZaFfH@xjKy#0-5+ZI97_Y#i&iXXI~ZgaZOzMuxGK7q{#EdM>CH_Wf8et8i?C zCpkB~?f_{C23n=lRUag_8EQFn`6l7?77-;tb~9(54%)qZZdPVFfs;RaC?Q{j?_~FK ztJRo!{GIaz_#bzcV$Vm&Jh&s>x-N*;k@mf|&p6j|o9c;BRbcHrs^G-C^{kZ^yZcqC zOkFVh)le^P$iw=n%~)blp^gnEEC07GVTwO*xpATjekYo^y{D(L(JX7&$0Rcuo_{aT z``SHx#YE;tb;3hs%g})E=NQ0cC1U+__L~7TMvYU0SE{Vp_k(vaA?fPXdTO*vIo&`4 zJ<|76NXENX{Dvnig|iiYZ!QgvzszZ~wFFou>ux?P&l}Gw!NWfqpdx$9ELUzrX`y}S z;C!lcUo#GmxYl*zaYw@U--pE32YTZYLc{mjSbKc$&TL-pL$uTPleg~noPG4rHh$k| z`|9blN5%=V%lB*)D8DP+?u8PR-CJgPw8oS4ke5BtHjyN$FZmvh!9uOTY!PnZr@Cq0 zbL6maSyxjX(>SHP!Rx2$=0rC`Uks|4UZqT4uvD6s9DR84?Qn!((_n#QP89P)uKexW z;FRO8hvSS-xYTlIdlDS`b)*h{$JXoWqMr+Cbo`c2Bp@?LD)9Rme;xH=>PK99lXl}% z>)7kJ9#k~P5T#!n>PMjCYD?^%BFqZ}J*(;43b6lKQaBgcoZzi-gp*j3(NIh5APrw? zXyiuuUOB^ROsnr*HPIj&a6|m>e9aDNZ9e3o;QpKTE1){};Cm~~gKM_qH|hS4nzc0? zL!%t0d{t?*FZQ0(`WLo`KBai*^`i9N%^QmFUwVNN`wkzpBpap7>$P-aRD|vHSnDT( z+fqnh7tK%`o+YPo-PqGsH(L+};S^;y+nxA|W3BnjWS)sR`3romgW zB+XTlD~q5#+4VyGqw~hO4+c%$uV<=8qt9h=Cgi84RH@%T>(1W#xMcPvrx4H~D9Hl1 z4$71x@^i2cqpLhJ$a`S|U6%8DpF(UtNMuIjc@IT=+CO5i0nOXnD*W&LV*hIc+kZCr zxfvn&#gSYfpDmhr<_nk=ET_WhlgRZ~& z2|@zrE4@1K4rmD_Sgl`3l0~wDs-$ZgzcSBh-utc+=D1=fBhn(Hu1mY8{R4c{BqO}X zlJbhoz$kr1mh4kRO@afh3$sHxu0r<0`8SW#@HaCcqXIlOuhQ7_=GCeic0SpU?z&kw z-?b(vPf`ongOs77NuQ?s5^VXtH(Uji%5(E;!bH4Q{6Zoe9t@70_;ALyC8FcqbUdc= z*&_*ezFpJl$G`Ezc@+&8XLnsp#v7kpXM=6uPZK@Dd=?Y_*qPXUp4xM-p`Q%66e#hk zBcP~ph2oY=hk*Un(*5zFCAm`MqixH4t1B%bZyTjb^1dj@JX2DxM>o9wT5|E$#-lZ=Ipfit z11kTIwmd=Q&UugA^DOqi>;)~7rZU=mf1>eDuUx?LE8p`Dvoe{dS*ksu#*Ze>2KDB; z)^2)-lVW}tF=#`cn#7@p;YACQeeiCn1{x)XTGA?=yey;H-Y@Q~@5^d_Nnn~2d>_s2 zyu#HdJ5$|#da zKwb4EBAbv}r-C{v#tA<)K4``d*Zy({vMjNN6a|xPTDreJ1Hv~05(+>=WXC=BC;L+P; zK724I_d;MWOWGisECFVt`MA;dJIrXj{KWsoDF?@lEkN$C@t$Dv*65zb7v^G<>vsq0 z^q+rnCy2NAikgh^6L!*i zpNik^c_BFI?`M$3 zT>V@5huQb=)gdnw?w=4A zuslP~ksU*z`yXwgUSyJ)xo3%HyU+bpuL}vcq?ToQ39aF!Hiy=37REWW8~V3rgLk60 zMKK(w!%k^brS$k0r(8m0Ym>>dHp zt_`_64vy+DI#EilW$m|Jzd!hVXbEn`HhiCj{?+weOC)T7nC+&Rcr4D;YTxf z*5Z(^d=B#0h=Hs1)b7V+->57N=$Ue^Ep6~kiXNWef8~gLl8i4b@^gAWpX_xyR~hal zQOEY$PsPa)qtI-i<+({<*=ti%-y(_*%dri%r`)^F7qVi3O#6-kUwB_jaQt9D{Jf04 z1^mU}h}(*`7Pvir?J<5u;2}`Jzvt-LMr@CF1DFo{btq#`adMbzD;walN&U#xc?GIg~P2NhT?MgIsH zOLkd_-EVlKX}Zm2YnZS}l^MUs7@SbMOQalDnzr0y-mg@d945$Ry)IjXZrpo4XmL23 z(n5)`&8-crNPC3a$bX-Ll#?Bj<`v`S3WpmS$bI{MFZA6>1c)RJ=SIfQ8^_MXVDU1@ z!034X{-U1u)4z;mUGa%+fzhV2`OE(sEgS1prymZa^r;(vGWeiF{wdD!*yFo71!x? z-h2l@^WY%h^sMFHg*0c`zM9dH@{>g|Hi+-;6-miQ6?xEfgVW7HqI=krc6u-fSDSW1p@wzuy6rHp9=+H@%nyhAF@ zUnV(4<79aw;yLJl9av32`0x%Mne1PG_c5J-@2hz>7&IKDyYM^eCcz(cgL{$hKNJ+| z%JEgXE6D9h%*pW#>+REkf^5P(3!S3~@Al8iE)z02=yJK&LCRBBt43&un)L1G^Yi#$ z;F5%F)}#L01@VP51uO7`-f{di&EyCC8Qea3sk^=xsKe)MiUItI#v(-e*2VSlHNwejOg$EAzD5=^I<=-JIL>j=3Yl zQBA^MztsZJYqqgj9yNnUSIa-z)RL<^TkMGQK<`d7YEC4l;?516F3}5M;o(R;(^hg1 z&*AvBDb}4#ibmmKiBA8Ou#!EDakKX#hRqHv+i*7HYqUEMz1Xdi4`B2p+cUmYF#@P;Ky8Slzh!3P>!a ziCByIOqSQ#=L987PUV}6*pGyHt|x=1vbJGs6g%@r{>Wz|0ohqFE2kih#SujnfesOO zLK?FvI44Ked?H0(+_cB*SvC~E6vsEtJ8vx+&^2upNOm#1x$Tk#v)y52J zc)S1n7rcJ)E%-*wBgTt#mLt9v*sUp@FEoiPl}H>a8q!<_UrF|^6+5;`JDE$h z#=niOI1nuGPzY4CUxxtwN$CV-WVF)I_J-@f{drWs?`x_=C3df5pB+{7R;8z*y)0@0 zs)$UhsL9&Etf51}I<<}`t?2s8%W~c*ozb5L*Gtz@ho{z4bYuE;kE?Fs{#v_3r^~rl z^E)|vgWKCxw)xHH;MUX4tF0P)zp+Jdtncnig!ZlQuN&_EsWW3?Y0)5rHxf|p8e)kO zmg!{Hkl0?!UwVFUm4-$;xl8XRPE|NLTDor<2A0A4%+uT5P^as;ZL8CkSyif8>mXhv z2w3|q^;|;i`Mu%YTZTIG_YLJagKG**1*K5`&Y6vUF>A{ItKIXlU9fYz ziGth zh7BikZr{P^gHz0FUTcn?qZ?&DQ#jYSF5cO!R1?vHb~^gbI<2-zsO^sF+m>5cAI);b z7VLx81wEL*)nz9XEkt=r#ecM zY#pAeUfMCcwL|rXKUT7{^VgoTJ?_`)w`wt5vRa~@*v#3Yir#=^dxz+bV7?sfLh zv{9Fp)1%mNF3d{4Up46YvLdRbBiR(&6|P-Z3${L1PlRqBYoAP4Rq$nBa;lnI+HcyR z)4i!0O_rX&EPZ|=Sh1JdDd<~#G_)mA0Ly}!^j*{dWlY5Bz)$=S;Z8YhV66sVQ+m(HIq9rNy#u#nbgZc+?QAtLsAEE{BUPRlZWW)2jKUM9E5C0mOlqL~sNFv%mFBp(y zx3{s{&8Jya6;9O#!z7m`)Zy*dTC0H?SRI$#e3~YL@qO z%vA*v)d!a5NPTC#GbA7w1FHtLa)4;unp_TyJPfonYkur1o&V^7O*EVBc4x_2qH9))C$7V-R(!(uacD-LX9# z4cBHnLBmy-Kjr}z=B87rdrAz#fgJV7Nhzlsw;h89#{sF~>tim_c5Lf=r!l8N8;2?* zp>C*r`z*?Nw;JMSw+_hQxYgA)#|nATiB2lb*Rqk|78bb?)9+<^u6^3xLK48cdK$Ep z8Z5$cWmZ}=Rn_TAH${w|omX;#Nl%p*{FC-#WkW;|CPPiC@6oV}bJ1Ow^ymoTy>oD2 zyST8H&{ly`)H6!8ko>$cMefi@wr4!L1Oj#`W%lIC>6`ql$OZDz>T2OK4b zXie2i*E+i@)~sT+ON%+tJg&75LOdYI7G%0c6S8@fPndF9J#ze4oVJP8>8umqZE?(x zS*fAu0OC%}UMnn_Q=JIUcaX13COJ-@$4CW)!6IjLpU+RY-S%+Zp+dv3SgXT5@S?k|b);Uau^Oln z$dhcz()hyauqxVj?5UW^CZnb=my0;y?aYoctnOlycx`U|n|D$^U z2NhqV`DAfM38+uk@d}l4)HcV{xV85Dhm#%pfdOSAogb?BI=!4H%5z=@43r=J)=M7s zuFm>wDe%^R`=nrsS7TV~2k4N!IOw|9Zu4463gWfsYm%A0G~96Mr8dSp$E{Xz=rp5$ zR9@e)s4wk=E>Q`n80D*8V!a+?qb=G29*jiqo0dLosmI=g_0ORA*N`7_!Prf$qTMb7 zV39Hr4!YwF`XF{KQwaN7VOFZxd1<4YM$2L1v(45tl&Y5GT$V5-33FI6+b2KbG}e&a z!oF}a-E#!rbIZBu4ECd z0lO6n#aCAM|7?Q6U#T83VKL#F>GgZY?jX~1CtJl~5|mZABW#i3!JzBwspHmy8By6Z zI@Q#80L7@7t%qe%VrO2@_k%#=MuJXpDi1Rw+8O0yAbm4ODL6{%mYs7lj}6cQP7WO^ zVvUL%#HgM64=G05O8mxRfyKr59-kB|VYPi?edIyHc3?x0 z#q%~LrdE<;T=Ljo%QVSKs)4=J$=Nq>XS(i65V(^0lAjTwcc7D6#ew_Fz!O!a>M%2q zbL8LPBMpTOg_J{+1Z#@d=<|#1B2=y)Pw=0`{GlxWm-gW8r3o~%ud`UywMgOjUyP^bh~-wSUiqU_92GKg8a@ z{>a!KOY~$$T-={eN*0G4^=}mY6Mrjf{~}bzs4FS`Q%3r~No2YcY5(_B{vS^#O@gta zE-v^3hxVWIKGN954BvP9pr9psS~iQ>YIQiB-m;?SXmF^UUfeW?YhWU;A3cel^VBah z)2n#oTw65>Tc6|VT6c+Vvqof>?JhZ0?lQR){;*3WNz@Ub0Z7LT)1Clb%n#W zmvg5G@Dc~Lsv>m$i%mbh?RjWIGpKU~--z+mFy9K_4x z=e91q&5Y;^F2v#rgegsgdwVZ@EX55kh$nWXr43hC(LTFpK6K?4aDMijRt>}!@X@Mg zwQj7#gx8IQh$h|hIE&bwmsT-5Z6AWovuUlhA z)WR-6&rGlVk{A?oorT2oeS(8_G(d1DDj+7H9CWcgdPHYN6f2 zIGEa3)E`Uq^@#xjVot#^AV|E1i^lQplqa2Lr=#<6En2%hsuLj1m&$Th;TkvvCeEq$ z?W8O5LKp((4Xa=$RSm7sIFL)ZQCVC;i{`!~?D>TI3KbliH*5i*Eln*gd41KGG5r#_ zemUlsS6s2^)a7*M+n?T*@o3zKxb~P)%c+uT&Dxg}q?Nhnm2({neL|=@uV}>4$iw|w zRDfqpe0P;mXR$N`uoSQj15!!_!8`Ox_Mi754mB4tSM*`zo%b~0Ro_FFG~BCC-E$G& zbBMjKTFx9HGMB$7F||>U@|~*5-9Q9&NNy~qtR89{!y5tqF)sV_JJNj(c}M^w z7OE{aW?0qm)-$6kcxLw|Wkc}vm|t;nqW2_GG#=OkjNcJwtT?`@1c>l!>`!#W>9wnh zoMJEGj2U}WaDy=wk2RSp7N@jILt<9+W%M1k&=)Pu<$yk8*s~L$-!>MqCz>u%Wer$< zpIU~wTG0cVu7$!?8&`Xp z3{lIsCsfiTL17yV8i2`(R!ybUa>$%n)o^EPWJNS}Id22va3i(Ov>bj>nUASxDC;ma zx~@z&E?+Gh23$(^A+TfvoX46m0hJ91RFuwsKy<(gST(>%ri1fdi+qVDTm$XS1ofk{ zs*8_`FDkR-hgWUR1A0$dI?5}mhXVlqplqsDU~iK?BIbIvc@+RbL>fjNrelRP;l9=P zzH)9JaePA;Z)vo>>N8~^Q_;D#g|%N1nW!DmVQE#h^rQi*oi`o>5JDcuxj7n{$BZ-s z09i-_tgP&EJLjYnk4wE!>&8<;v2*%XJ1`XQmYzuCtd(-W*jc%oX$eLOhWHJyUIgv` zI`eU%(C$2$A= z5I?%cUa!Wo>N3&d+0F~G6K^x~h`CjtiDL;xB?K{u;j(9czSGyUZOfod5mE1WZzKMA zU$XDqTnY9K4d+2pqbOJ50hK3*;uegn<>)B)Hmr--znHHUNBn9lYwDbpQd|J*1x@%d zFt*0Vy63d+QmslxOzmJm?KT0HPbd(h;O#vWymM~CP{h)r)y81_F(L{iZdBISgK~_& zUNv_egPZON$FHYvT^PVt#7v=grKfrkSU{hiri)Kj4ZH8|0V=(h9J8=|KpK=EHZ8hL zNXL1%$48wu$HAN8x9C=Zh+e9x-gM0!#|q>o|2(YB!adF%>f_nz7z1NzFv3WB#ppm} zS}hR9^9-~bhU+Q%_);w2^zNsuw%@zstYDdJZK0`u5 z`tJT1y=(i%P2(L{%NA9+UgWX6RMljN7vkJ_s?oKbL2nQo8FQm(E}$HnqjM+fK| z#YO@pgim4v{CB*WgV^FV#>V^!z>`63LDbPGAUX6Bfdv^N@1ie| z-!K4>g(#o&8|I$`#T_?YRO-68O^}THai0R)wk*)@bQpefSizhPlxoV;GWOJ--a@iL zx^)r6AJ_z9fX$+g#ryI_Q83@2-Er(;EV@&W1)X5S`7B*Y0bn&7E;Wg02DGoNqFaEy z`ey?vrVhB2s1tvSpndW$Mw$66m`^UQQ}F7b z1-glwEn2m03baAY+=_WMY_gX>fB}61mJ~+R?5TX;!qP*1$F5)B;yVF!g?G01~z{bn@9S}m)H6|Vt z%in=)IT7u+>=B2y!epkZ8fglQQ9FSkrPF9YpJ@E@@%b;R(?MCr5RX|%RolT zRUo}Vn-^-S+@-g90kltbX@rp~#$co?c&dxUJ1_gdE6sDO@ahF1XSFZGr6D>V&W}8n zZqa}ml&{t~nsqLe(9D(Zfsgh%B#z@)+~fW;hWwKP5&18ZW~5|BG7| zN7tUw^v_e6+)!-BK>z;Tt3RGs$iMO=&`BQU|6}H}RnVUNpS=M7+o1oy67@fX{O_Fc z{~Iv-ABp^rM6jmu{|yWFKhXMjX#JRK&M?HYlnfDanykCGx4G#61^#g<(hE;n_Wr4( z#sDGzg?@o&$4e>BxI+|B940i5UI(Nu#rfHI8ey zJImw$CW!y;F+&m`|LPCwVVn-PD^y}+SO~I61%FCnH9zu3XF|G{-VNf9C2qf#{Z`p+rMH5^6A`05*_l; zs3eV}TASXeqqStM;>*2GnFSz9%3*iDd2_P_>e~2x5?e}$PKsyn+lIfiM`jyK{W1?Q zf>}ZgVJ1?gf$~>hJk|$}s@wve(|b)@Z_WczJa`%nm^md>R~z_Hd~q<*GM($9Z-=?zp?sOtZ@P}_X-ym7v&_5IWv@DNZpkYdzs6b zngSH`dInk)N-FK6ZNA9lpv^q?m1p`rs#rZE>158W^QFURp-#w8`<3d}T~(`_gS4^H zBDJy0#nXJa{lPyI~zO#^)^e3036c$HPaKw!v%3B9V z1B^TT!SL;BL^SO>dL=J{LA7z-L#-J#Wf2shBD?l+6nzqkR1R5@Vxp(U7-hBJ;GT`Eh8;7KjC$h-4$ zVO=QL_ZX7oH!rLUtioU`n#3aW+Taa@YLyuRFxz{;W)0$r$o& zF1ivbrqs)g&hc|q3D#jA*+(#@QG_lUCw(f9o^x&88O3U`j+d-Brm}VbGt+Sh*-Noy zW21d0_Ui57u!t7pK^*g4GZZy zxh6Kwx6#?k7Vt%-5ZO7czl zRTL(1>TTAjbc(TCbRDX|7AM*M;@U6Wl~@6T;=?aG3=os{Fe@~J8k(=rXDE?o?_=f1 zjz7sxu6XgfB)S5hjKP+~AY^%vnCh0T^1`)vtUd}r{138J4-#ink8%N$M)@P|2>LYa zO(N+Bv*m+)oo#J78Wl#_@v5@gNf8)**nYM$+;@1Z4r|g*=q9`Zs-Ig%&%TVHpl_RO zk;dpwIWSnsH?BHzU;DJX4>QQ`X!JTo9+Je&K;)11uNWE~EGM2T!cY~9YNz{DASb;T z*o^zGk+*(~>XBMg(J^&kR_R@UE(=_DW>(BmZh)%AKKnNL<}>Ukdmf zHKn&H&-4bIW*-&MTk5CC=A{>}z$puW?d57R;-?pqMq^Y9;|TC0Z0m^wxkH~D*Np?? z7EQJ`$Vb#9Lw2DMoYYVLbvm+PsmrF&4j}-8Q-E^ywIciRvy3qLX*I zneUj)e)9`k&yNNG|0FN}YW(DX`5Zhp(O)2ac}h0kQsCN%mHL;mM|I0XN$y|G?RBAKE=HW#H?O^?(_6_pzGs19W#%YJWy5{8ubUFkv#qK znSk11VKraM1?&sV6}_NaFRM?DvDV0F)K#w~(4xRHtH>Q|iD7+4&R`-7%!2n4M0mzF znHp&JWRPtTfm?NeTe2GR0E^6(%n4C7`$OJEZ*Ph!Ud)*2{38%sJO; z%sN(7jV}7_S*%DxR|0N^1W~M27AnRqeAp;NAJ{sSAy`r=2OIU98MHLqP2Tnl0*%ks zwSKM!Me{Ta0k+2$%anw}qjQ(Hd)!2SsZ-{g{a9naGI72E4e~Umh@~(U zVXynuS*n0_h!1B9RSbz>ozuaE=qddc!|QvHK@AzxTM8{non6FZGv|@O>bKfEdRzy5 zQul5cFbw_X{m#CM8*6B%#Wtm}BsMkG_G-OTxzo@;i6p;x7xb>R~+aPE&mmY&8`Q0>LN@2K#4n>Sk9|Muea?7 zf6Th55I$EmJUf)RJxm(U4WH`RsNYOO-_}4xS6Ls_TX^)dZDL~_6D&%zRCN=Q*z0f; z$eBF^1>>uQ66oD?e`!_y3E%_l#<)>-v5# zDEpn?KHdKCz$bV7$v0s$#X6Cx0bQbO+#I?^q41f&K+6G982NC_n& zaJKh3=PBd8-}m_Oe0av#AHotEob$g%YDTVtxb1;`LQ-1QxDUHjh9t0N zdL1L<;LkW8e6)I8B#Q!2m_%{M+2>!qJUz^P^oxdoZ9RsmRqK=lpl)V|-T~cho}+hB zb&)2GRI8O?%zN=j#q{Hi&0~=?;CX^*!L+K8I)f4pcU^pYO@}Ow7cCMgzJpI$b3OW{ z`5Z*d0=*0o{}~>{f%H_mr2M z@v*FD0DUch&}xCleF^FopJJru!`%Z@?}7Z9Wwg7^1YO|6Dd3Vat%0oGq}HRw-5^Fl zOW+rgQrt=|u108Xke4J|Vs~+0+oM>MlA}ahKL5xMz2(bKP=_j>9PLE)ae7b1?oxl& z2-$;YQ{?x?Z*#&|G6{Vy0Uo+6$rugj!PK%sQVVt6C27$vNvvJ4dzJCzH=}x>#L*x( zRfqh{JS-|M+#iX$u;8~~`xD=5R13Dz4gQs7do6*2S=O9YLWEi6`{gW)-%<6wB)#f) z^j6eAQ%(zaZe7UY5KN)Ww~2xT3DSDogR(PQ{hlK_D)4%azhP=@*wgI#r{m%;qe8Q$ z?NM)Xl&^x?`R#dIO9X6h)oj#RBKE0=<=+|9$!a@nhyfW`GF>{uV(YIfbe#8 zXfhb6M3VY^3Y_#CU5HcJYs zD-&uo>!8y#c59%jU#6J%O!qqX@f>&0c%;$m7~lm6^_YfX6G%b;lD42asDkAE7)Mf#kZ%A=tRtS{oK$JmP3mw7X85x=6ulc- zyqk%TMO^C^36r#N8&V9&#x)=Q4pTIX1Ih+o^qAq-s|FMZO59{^-wvlTNb*7eAvY;u zp%xinI$1*k`Kh{bD+>ji@6(+?YW8(PeTB-R2tI=r z;D#)1?&pEr28aUmM}NaeL5kUc9ONTA-Q4}75gEsDkLL95rO&b+=b&R2z27007SMcL^aS>-F=1R?Fr zqy+^!FhL&Nr5YZB0?H9j!BT@UQaJh*AW(+-mVUH^jWnDr2Ojf50;wdze5!D+mH7H+ zys~(wAmOQ+a!XPfcCZ3&FhP%<)iyuL%i(T5FLDRN;l9G-yPx5b$XS6(&XPDZuyvCI zT^EoR>d%#akjU~5^(DvZ?nLt;N-{s%)|sO*3Hp=Tx>{7+!(aw@9Dd~HSxWQvC)suW zg)HnR`!JE_fQGVc?pH=1{;&m$BUyM+ zKAF7dL2p(H7J|0%>#?hMO#LpSS#qryT5X=o{^p-kvlOU*`qU{>$1N_{Tr@ZBV>K~~ zg$*^8wQ#%rP^ALb_f+0BE^(_gP+Cv*c2sfYFQ3nQhUIox{J-Vef%^aa&Srz z+%pI(Ze>~2_bmJDFj&J+tJZj1Aoh7)1H%A80Y07aI$&vrc<@a*R)U!=@@MO#@8=e@=03sQ-c39aLF1%4*JD%e#WjgZiiiv`+!} z$lR-JNb|)XV9{Go9zu#48z0n-6ZVqgD}vxN#> zfbP{43}`=%ki&gclclv^7KqL~PFHs(H(3TWfAV6`6^~|_Y`7a>xN!HxsdgfdH?pvG z`L~V-F~Jw7rn;|Bj2tMP*O$wSDI3;77e6Ip;V=ZadhmunA`(0B?JZptI-N&e5y#V& zXr6-RMvQ5K-G4#})%f@*OVW$w7DgHGv;p;}VHPGy>1PnEWHP+Bcz9P(F<}*VrC4S? zGROAW7~M5tepy2ajm#Q?Y++8bRC<{n&_E%tlj@HOSN@w)%a=`bj@p=)JAL}|K`duc zzp@stH7Bae=1l<}zcn9Eb2{-IyE8uqG+ZVQzBfp$s%C$GS^YtW>a|i8wQFGG&s!br zz2sfESgU)93_6}~#CAY_Ul>Es-B!yF<-%Ys1;m!PPqw&w&A?r{Iw@niMtK@3hAfbD z_-dh7C5HCBzxW;InZ?0 zc^&(sx;U04%5&fW5+{#FV)`)G&`)e-$5+W zpBHiPom*rU)LvLhIQ%#+Sz*ji=p86TbCVF6?UsLFEQncM%@>@p4W*^7wfp+t#obk( zl>`kEKI%V7ScB{~W2?3SGFitPQrIGs-Z|uK2InGeMqq~Vu78uMeJOX*@dK@DL#!t1 zr;ge)7r)6#@af)=!vrJT+;Uwj)k#`#%d$UJnh;DU!mmclhxT_@b9bx!uBvzi$MYlh)MQ`BkK^W{4cK`8t@K4`%A@f1acZKZOE!?15gbMi5cE1Er`2$0M!AvF+>dbdXf(7)BPV#^!3q<1Q z39J4mR3QMt`Q2_BRttYOH3ss}Fa>?DFt^s8a?zD+7WQ4T@Onm8eZoJvX=Y7htG|k{ z&Jy4uovcW6o?OVAhPz_1Pj(#k*+APX2F^FIn3>f+Ow}i#>m}}kZjydx3po7`&NNcH zXR@yya2b9FweUfrFhC{GC;EoEC7G{QB8^cZP)~6b$~AG=l=}XcC|})L-E05>vI#em z+4*t5_kMxV4uRwb*3|p<-m6RZTh!(5d8$88FJbA}?nnx~(VA|w-j=&;>lPp}*^}DE zYg?){kPsKV`>Bbwir*Iuod77~jaEt6j?e@+!V#W`aIs8fDKx}z$z<{?gvjLoN7cgr z0qotIIrp&ZY)-NdOZ+)~3^ypyj^;9TB9YJ-ypYZlHBOv>YPZ05-@YV_fovoHgc^1qAi)V| zFRj}FrRhU&15iIJ1{5eLXqjo$(rC;RoJ8JaPE_W6st;;7avp?DXOu8>%4gLU2yq@G zozAoKmY)l~+#>=>GILi`dq-Im4ScatkJbVGuwUkD7SyJFY3&5;4A4G+^eSo~uNL=u zFC0@gMY~o0P?d;h4WjTw(h>g)hx{X4L&I`DqC)gn+rXO^CGeA>ew)#>tkrkkit>%% z`QfUP>8PT`b`x(Hm%{D8s2IODb{4p8ynGz`E{Utt*W&4Gr`&sY_v%`kd3nGTL;o_BHw`pdS+j5P!pZpX4@R1*hP6t-ilJGuN&Ru?eE!=J&=bZ^D=Xm2$rw6Bod z(I-dCy~HKd&q~XHMJ!JkhpyN7M+vCmM4u{NFcv?gE~=q;yoHQkEpC_HJAj#vdMRL1 z-fRv7OJwpM0FUBs=JBEdFQIViJ_z|IoF_Ex^b5&)6AXfZKbE7?LlP>heu zt`12~Z^g&RmaQ@6VTT2L`v(U8gwp?tltXJ_!z*P;=}-Fzw(bSyE!RMI36%WJx2u2G z7w|Lf%lV`?Ic@2D=u|Xp3>8Yd?xSn;`ZO~B`poZlk~x6CB{c2&ou2RsS|)(8*9&e} zy|!+X!)dvDQK*>#jCsvY$Vz+biNMt_{fP~IYp_cxF6lE{G2S`f85Nt{uxy~$_O{7( z_!|3V&KGvm)7RqU8sg*P0jg39q-ap+>=>D%wUO*)9n6I$z%2)!c)lW)uv@5wC|Y}$ zqX644YJ4H9Vs925*e|_|swd%EEs^pMIT1ew?U$b2hsqKsR(55+;xxY(jKKBpXnfLV zSzhW(F#=vm#}SReV(czlN?I#jygo&w?Qh<*H;=9*muK=zNk3L&IstZOFd%=SQP5`L z^Q1aMD}Tobg3EPIhns8E0x2BkKKPa9-Q79fQb@v9f!Dz+yoxPEqRC1uqR1*IrS%e*F}P zywbVRB3h(3gndlIslPF8pPx3?;C(oDyk@KDr{ldnct3L+h}aS#6`r$Na$9YltA+Ws z@yI4k`Ko{bR8t;trS{;e|8$3}Car3v?|cMb&km8C83TWtag5NOrInw?044bLDt}QI z^v5@G4Yc-l4`z`@;PFx1+EQA+zXeBu)y+}+<)Un)g3Miu3ORZ5O7^<#q?>4mPK3{& z1xw9;NN8R^HFW{D`eL*`(tKc<$bXeHAmO<1SaxWnZ)ZiqHN~m+#bL}0ythU&@>lg*3xV+Xxv7H$TGgI{r7ZWGo?3D{K8{r;|n?9$zPO_x4pcCwE$gQb2lsABx4 zi9LWP`}+XE*B=vwU+A*%r{-j|(VP@$xddhnzGXE}MirDh5-L5%Uxg*`zMbP$czSz@oVy8f_t7XDq6sz0R5ex}Jc7mdv~CJowB<^Cje=qwJNOnl8vVgFUX zyDAJq{wpmG08k-_d@VMojb-$Yxm`?vr8riq>27NaJ7A^2iG!p+4)?!|9FKWb$1pNp z2S_C}RXT%i>YS(Rdj9lb7#G|Q*l`-Zq3@~aNHE%#K2+HNh`%tcbwiyXke`F^@oA-- zc{Q(o{P{@oHXtImgVawG! zUK}`%S-BdDb5d`|Con1<4N1AnZg<`8EqeyOH&V4!<0H&zolTNIT!<(9!L~#DPC)3Y z;kRC6^wFBrz3QDYXW#$9arlo#^1W6Nz2K?tI&E477k@mv`mKNA*gqI5VId7j9VCXH z1%VD!)Gq!>t&qPm27G8ap>8HAzjLaaeAs-nC@T70+U=I@eV>DlY%dGl)8Q;1oB`~` zl8-I67wOC9j;4N66Pos8R2|$rVCT}sn*djpmh1GaloCogj&(#xvS#7BHQ#&p;?nzPOZ=c9B z3{n}qu6F*V-LgGxVywc(+8r{KwJP<>=flQa9{Sv2EsNHNkavrYnO}_>50_H-nsLvU zzyXwQt$;XG^6=hTAU&D|9&o&a&i})v@>TILP(}?|P zYdMgy{f{}6Q7d`Wnoq3RWSzD3;Hhs*0{>!-uUxap?;Z4szivw0@9IfZOP~oF;~}-f z67?6Aut4+r&pIARHOobmaRv~3AK0;80Xdlg`K?8j#vArDR{-x=`2rBU*W-cy2e8M| z4}pkl;I)JCPK892KXd#Qlx&t;!uvtg=Zxu)>c+?p8GyzQ0|9U^v={Xulhbtf;(gZA z#XkUr3~;GLRH!FF6;YuVK`JW=_PDpIn2=#84)rr9&3$GkeZSfwcC7k*^k(g}*W}&i z!#)?0?k6VSmlgKwE34w;^sTbp079ZV)If^FNHg{eIN@GAqgCV5x&{zgAlE`b9~00$ zHxfcUztc;irc+T1yy_s`ZaqA~& z7T$MGz%>0+=)hTh7AfRW`eH|*@cF>|e$tfSD-~=`mJh^lnB;Z2C4v!zn+_%Y+P2Qe&?L-P1|wcp%}CEte0ULHo={Z2JoeXm*GFf!L8D z^q%x0l|LKOJ};2-vgd0IEsXRyNPqQ8(*$i)%65ED*s}<^dk=s4!vbH zOFrInIq~|CyrlmG$-;vAoxNw9?wiN^tiU`%75DhgotyUmfa3Uhlw?2i$EskWJSrpO z;(+>&L?9Q2_ME5X%Zt}kurJLicpO#W|FfZ{%rZtgkE5ospSnM5!4ir(m_M5XWMAde zT))v0fZ{5Vhu|UY`C*^}!N^N{yIiyS!*VC!ID3x0u)V4Wisfg1YAHCVgv}-nG3c`{ zFJOSwR({D>{6PUFBh3Sq^V+hmJsYFsVaIwCRPU*Wa=nEGekicib-EWY^7&0(WpL4} z!rs%Oplp~P$|skzx>`xUrt9$Q5m{Usv7629BuSATy}y&mh~S5~emw`e{`?LuLcLp2 z90A-)b=@BT*i2!NUijd7wAGnkT8k^9`a3+D1$+vCHa$Qr3RwuqUJ|fZa|WLs#-+Yl zAPzS>2y*Gk22tBBj-J-H0A*9Rsr!K^-fE#kxN6hkH7A>VY}1kiAtzo_a0kd|qE%TT zK00dpLsj!`{>=?#dNb}|GNtu|vfZrxEg}6J=-ld!v^TtUew)p8a<|b(3w$(phb;+y zMOKeL5@i2mEb{)4HeNHr)o}1VR6-d9!>B)mjzkME77c(=dP5oM>zR>bd05$1-=p1p zMR|Rx^}m`~zCr0nounWqg^r^|&%je+-H+7Rz-&Kb_~E4ZI2l9R#OQ62`&G6BBD8AY z4(-Zd@EXwr^pQVSS+D!lbiQ=}w$-Rir<>CO zDhPh48ysF{fGx;j0<9Gc{7LtFjSp&SM-Dsd;_6k1-9d{QR+YXhnPENsj~W#EER6i= z-3Q4D8I|8-WO+d!Mz41E>SBw0qA{G%sXH#E8vTE&wCYdXgh|8xIFKqvmc2;s==XQ) zPVTMy&Oi$cmSk_f&Xtp$E-_70ziOL*Bvb8x)@2STRf7(#*G-#m zL<2KiI2+PheI_o>U;mvSVl`WWU@oMivakOXIwV0*!IstU9`S!wYrH{_c0H|2UB_q9Wk4vy}3FA#OF)=%-TjJEQka z-C7LOj4Tb7b?ct>Wl}Qd4?WGjk^0=~FivM^k#{4~+*{J4aKIHW&-hop+8tRyn}+39 zS%uACm3#iF-hCGFB~+)9Au;GLJcs}16ie+lXLH1ShKuOS%KzN4|CwX|^S=D=jrM=D>;Ge6{>LW&|8jlFaJf|Go0in{OdgAxCCZ)uH^MPN zw|)-C!!!P~ndZNK3aWk#x|wjIbMFKha^qru;cK&xbw^A_=dunQs|_Vx!9gt zlcJw|(dL7^PIv$J(M~YZjmAPWQNA@sa1@Rxi&;-L#Z4eb?irOS<9nPPW?Rhj2n~x7B0M896mR?b)x!!VT zfVH!1Z^xF?;59cQh9vf|e-7T>*w!HR%n@7Pxm6#tK@2GJh#-2TP99CDV2Q>?%ka*2 zK=8$KZ4+oHo*E#P;>KJ$+hi=Nkj_zfpe@{ZQ=!Zwbvc4GN@^R}nzC%O8LkI69UJ!HTBk+#B9>QmqIDn~lj}toA&vElnPr(GyCY-P zWua3E7BL1j1M-PVfO3i$%mXfrWbWMbOU>HnE_&}h7heIGw&ID&FG1d{Dx=k z9Wn^6A|L1WdJN^@hI}j10ciBzTwLC^vZPdDOBB+p%36u96-V1)(s^YH9fwVD z$5o8fRZLAo|M*O#BX#e9ys*Q@PL#8OKsbgi+Z#TYtsaPJE{~2oFGX7#b`IOt5vTAJ zGnK2IJ_$HBz)P|UWg}hN3{&nNBtDoc_ zy@?buoU3mt-f)pKF<&b^IZxwb&UrACalF&+aQq4Ki~ps*=zLg3+3;Yly;-M>W@ke{ z5tdB^Mjcs#b6Ym`H#1;6#UMuV9Tltn#MKAyRt<_gq*~y@U#YEAc}PHzqeyRS98k#V z^yw_>7gOkvN)s}45&^_qJUs)sA*_~ih8*85J7xA^O$tVnjS*WWaw;5rwZ4v6Uq?>M z2%-*R&4{`-?xX)6JKs{#Z`lSb(9A8g;Ap)uOsHD^U11+1?t5|sgO-gQdZaeWsF+oC z?u+etK;#;xVQwv&c)=NjCHH6}y5C@`Y-bf`usko-d9bqQvpZF^<3D<=u~jjH&|em_ zOtWmh1`Nk?YCufE(2{c*jxa1yuYr&%G|}?4NI<87Mku!3_<3Ln!Bsu-0%YS?L|Q+TKzutAI<((2cqfV z^kqN4A*BJiBuz!fy4|8?@8`#}oaRR#J3B5F8(}ns3`^{&r(OhFiF7NFXJ4I<3)n_` zo1!6U_@2Vo>f8`$;OTfx51q!y<2RGXcnoEk93-PsYfIoZeN2U==Nr_FaW{IvpiPxa zQ-y8ChE!90k|J-IVpg4Hk2Rd0oS}wTPk>7<7d*z-V07*?990DTLSjqZOq#rUI*+*T z*2r5RBsdZ>ch6MpRaDlmKkI_ zThG@rf$FP5YOqKR7%)r>1+`R6hZ7@#N7#|iP*r#c^L{ehrycDH)kx+V0gAw zu|*%nte!G9QM8J_S)zG2MtGV0VKaO45z#vScqG!Py|lS@kHaMS*?KE?X?BMJ%s5-7 zpqkjT04f0t)qCF3RaF6z#{l8iO7MhQ6uNPMzRMgc;Xi-FyL|3aVJzP(C#!m3hDT3rd$0WQz z?ilYBL*o84S~|@|RI-+>m0x~@_A*wuF6EL|qX>=D#^LK#0$&;zUSoqV4DWUBsTEgJ zD-hyLsl~XOS4}~O5*o5ufh}VIn{95c_3|mRM?-rabN94WJPYX@;HuM|Xni;KRZOAw z^`ww}XNQ}*bs<{;>|~E+r~47qFS$l|3d1?5_=bq!NWPCIF-|!b_b=`pfAKQ&W6`M% z_Se^&J~Y9WkC{>Nmu@tYG6N%n+&orZCg{%f+9R2;b3Kn?T;tf~41Y&VolTjSX*d*V zdfDO~$!y&cTItm~)_JTwpxxYaOcqxOq(NdgW+MyP>ktO@NLxE^C?gg?lIM*US`zx* z${bSoBJX$jAWdSZX*92QloRTU&@@ZzE2EKw)|kEIGxzDa+}DW_Q2T*p%|kYu8xQO* z*kdIj#l-3S>CC_crhML^_Gm zAou*5)$@73F8yciV33L_oRf84Dil!O=##{e>W#vU$&q-|tCp~yD zs8yUnFV^+n_%T6Sy!T$oK`vqcE{XattUxpZumXwL=lC}e@?V$sUI-A^>lj^Mc>TY& z2><8U{@W+x)<24W7A`hQ0518fZ@o05{qW{NnKK{j-->s>`9i)5Xk$|0_u2m%kl?|< z;N4)d^=yB4RlwDcVg3mJVN)jlY8Zcp%Vq=&KDv0ayZzrh*?)i6%LD#sFt*P8c=xwR z>C0ypVDM(snj+`_@(%wKL=pnjS;-`uhkrfzjs#%v_*E}=v44Nv|1F&SzfUQ#2x=k8 zP9J=70#fJp8Z9}r^75RbB`KdreT5UG5{WVlGqdCI+kxby%*<+W#G0FR-%T#X{=$2h zy1d?uqVWMs($b-ckvM;~Kbx_U8MN1ReTDorV9{o-dGsHjd!fSNhE^}z;8qfS*-?7b>mTo~m zSEG+*3&V6AT#p2F+wkL~6{}?5BhCFM*j%Vt0vg2HH=IN-(fO#Z9 zBDN}-dyppF5wNCJ+h}ysn6YPL&HT!h5UOM6zpfP{HrC!!N|rdBMFnlSLr-NM;f2mv?I9lQyHkqqrqL`oLlAMbmo-Ul_gTvymu@nDvy?qx$^FWtCzS6)!4S z^FoENMdOAgD{0SHO7fuwdRl(r887`4@q|G86+x=&*-Vf;J)&{KCOaAX7k~zWGNm+ zE&7uU2GV9y{^)`4r#-|FuGd>!a%E<*mtB9?OfG48r1fXY^XmtiOM&p=;X~O%7u*8` zpCG3M5*?9Sf0EO53|9S^uQeO*4=FwI&JsV&Ncer~|I;|IA^w=^@A8A(DD*&JM!;tA zzS^W?gHFS7i!Y%mh3iLPQ@`4IYM`Xy`(vh3MY-1X-}1vt>{{wc)5qEk2Qez(TW?P8 zZ7Rp?HwT=>BWQ%J>5z}-$&{gJkL7%O>5q?S|8WT% zow48fsHcv05P7$3TJB>{Ud6Zw1b#)!L!ZI%LSE`sd0J}NnH@VBNmKs9uh@dKY59pF zTKODJ9`Hl;I(6^G`T)=AX8TuVew(p=`DwN335m-R^fmD@xPg|VTF=e+sNrYQzAKz6 zc4@=ISG~JPb8+Rlqy*)l)TaBl`SLjGJ8SJ{IqSgp^EHo8Cj1!xk&Y2OIZ?wUR6jN; zbqAXMmQ&A+pTDH=e*OEM>pu=J(5Nh_daFon1Rj5Vb;S(c+L7l|#EJBn+rKCEusKea6y59zao6ibA z`o`qw=;78;lOJ8n(=0Oy6_Uguh7+x_4{ma|^-J~QyBc%pvN+0Q*DD$2~Kqg#LOa;k#sH&=FC zV^rz5wtbyq>&bKMKodkP&%t?88zlqF##0}DY$*%>pl2|bAy`Lp*^nzOs3oZdpMbW z_FC+|jfh6!xL5_Bw!UgDbxv~HJ^Z+g-3q23HC(u4Y@90O`gMe+8Pe)(y|?ndeJ>PK z%HTu?Icsc(O_%3^@^PQ>cOY7(HT#E9eLIF0aL@br6mEVZuM}FAdMCv^^dQJI298zU zGZMa2c4n-bM)SridD(=A-IK-dpdU$o`|5N~PS(*dk-L?x9+EI=}`B@F`%Rx$B=w5zfeOAzS?-Kf75c&b-oK>iR60JW2mVNh3YVFWNC>`gYD>oh z;q5xfW6~W&lTgCJDKFa!_rNo`P0+fBq=VlRRD<;u7$-)#F z_=5zd!X5-)F5BsfV-Y65R=T!%j;EBTEeaiEIQv{yj$)&>?Yk)6@Fz;I%6bt~AmFGh5sD&7NOvL|H#Rch~7l zzRJG7VILI_n>%kR!?gr#d7H$r$+>iz!biV}e|<01UfB{XJScg5b~e~G=L;hGNrsdz z>n|Tf8C|k=(iJ!3mzq*zLqlKN-TmZBG~sL3&bMcq&rovLKVR#UIgpumuvLV&n>D-i zFr|oBdu#5O27g`&-p-seIlv1=eUssNeU125g5I($>4$qy?Xr&r>pvPdhI+X?GJnKh zg$Dn+Cq6Hy^D$Y=Kkuepu!cIA&xIR2^kD5BrObjAPw}cap6>kyUuvNkf8Hb)Aie|$ zU4-7?u~PS~QYh@bp{(6T4X^Mxp>Jt~jLF50JUeLq)hxmy244z<*1Y!gpq{z984 zyIdtgP;Y(0PYxUA%rDaQOk8L``ZTri?ZK^(ps-hD-7P;gw{V$u`M3BVR%RiY6*J0@ z&i>W$i~r8g?fiL_t(!B?u|C>O-?NGDcU1Z2GV2syifqvg@%esPB=3~ddHN*x zpV=~AL5f|Kxr8NzdSq&0zuvs^*>32i>G60mJz2%7hVktiR`TLpfNkJ-;4&TEw=*Ya zV^y}d^dUxRGPoWy<=>$ybiURT9VO*&10ul6Id`xIR`nfQ=UJS?QL3Bia=bzcp9suF z>9APkD`%RbJh&iBq09)U(L^Vn`72pTT~X3A8^IwJh=$NzXtk1*XK)ncSR7hU_wHiI zn~N6C0d{b<`#?MLQ>(&W`PYnt&Kvs|l+`5-8wVt{7_u4b@bD}%*4Vroj@95r;D*dPklQ-AqdA(7^HO^v;)RfLt#R`!RB805to^BI(CUmv92=XY^`^a z(X;Y(UoKvZ*ob$USzz#DPThr>R(J{tRRpA|JN53#)V*+_YIoy> znN=?YP+?>izaLMH)Sw%uO4qGjNa zFIY}Z_CN~43mgjQ++sW)Uw)G9!N*WL%0=r?KVTcQuO{oCd-iffzXrgddw#7TP40&bHhS*RdN=+NM92PPc8GzFn_OAx)2L zE^bOnBX4FMi+xrE`u3D|m0New2eAiAfu`~Z6aI=R` z!7(>^Z=UXZwrN=vRkUJT)tYtTWmtZa348zOzA5*)JIohe3XppfQ7V=YCMDd1o?bfa z_@=qBo#~VUp^rvpI9NwwRVPs}rd%{{;y%#Q}vk+T`E=y79SNMh`wd@%-zFF!% z2VKiY_E*+(QNy1o^ABBf-f>&n;n4>-x38$+)98r_D0}5x9+N&Rq_g27u~JNy26@j~ z${Q{;~wDWLdhA-iAX(_<@@iG?RMCvLC$*G5f) z*$TehMop6!%uFjP1XIxq!C5n0hr+w->%$Kt&e!6w+}M?dRT)3KesJT?;h{*l`q;D` zYw$U@T+=K_>UY=X#t;t6CW7AuiYXQMqM>H&UHt`z&jZ|VccBBqGfc{1I{u-}uCuU; z7m7%;cXv1FQJF2*7`1skxL<#Varrd1mQR}}nYE7C(wFv5=@on@vA07~G2GJTeD*kF zx_p}~D;_5QwNYy?WPbSMf>-SUVgV^~&#!B^Plt&=jqt6^M5{Nkne_I)$i-d`HvHg- zrt2Wfw_?{c8-Gk#`fi$iUi5|VH-B|-Tt3VDNG8;NK8UOtSgu$O4f~x@UuhF2U-#0W z{LM}Koc!}e_Rm+`E>N`-Y)8W-=8Mx*1|zaq((5i8@HL6U!Z%_uH?uMz{%;4&C2>92 zJ6uXRkFBl^r7pIF2cSf@E`Jl~+4@ewv1z?}_o%p{g(>5gq$Mw>j`$e-BMY@oOYD~% zm3M$>iOg*L{Y+6g|C3a?-$B#&ryyko!5z;R)u1PII!TE}W4NC8zq3-JY~l64Pgf+M zy(nst6)lS(o?z`#x=5x|JaQ{BKRdEdm|onuSd44iYun&UzMIwcrKoswz@54K$RI`Oe%AgyNuBRZP8&PE zFGXIu2hjx-Tz)EA(Vyw~s%m&*&&^P0N@Do-{Zi5e-Ey`CsA6m=hvR6z^p!U53(mg} z-!nId7#CF3xRoa;e*vtNPa-+>nzX5Im=nqFDQfEsJd||ft&sw|A5pPoI3Z3kqH957GUsDC(xO=CQ~88X5r$bRgW zmPok)S-w^7zKqLS~>jpkOmO;E>Q9mA*(r#?WbMHXAv9uXh{RFZhF4j zOBT#*{(Gm&m{%KWI=U-G8RdBmWmoz`I@YS0IW>u`Rc~hJ|>*K+#tWHg&*=6p=PI3jp{|54(?4j&1 zrd)n1ZsS(*l-oR=^;jjTwl6#K_dmySq34d@C`ylZ>3Jz$@3*a0n{K;C$thQ_9h_V+ zv)nw;nHTuMU;NO8F8H4R+?=A<6Pet-b9<3dw&?**Z}W9c;&c4m_gT`_ii!oeq{DUB zEq#9sYdP)i8aQ{neVF!b>*bIAp_ZrT)y}Pnx!m31jy;zZE50AS>v~1kW*yY?d`wbN zHOyRajQ4boS9*tIdDLw$U(^j{fsezFrNo>DaoR~26qjSx(U)TdQysS0tLi$>=~Cq{ z(i5Cl&uEf*CfjM5p~VbL9D_RVu_ZEBGUqzP z-oLfT34MQBQCW&8C(eQuvR1|LHvD{iTeA^QIe2m;mi1CcmEBi6#Win^-DcH7?M8?C z9Y%&*0!MJWjyPAeeLTz7s~~7y7vsiC{-0P!E}9(H)DbMf?tC#+H>I9ve2Jn zPfOF_W@XY2-wyfkkC>hdw-ysl*m(U(#PnCq^Uwmyv)Pwy*^4is@g8kP{xP79dA{7A z=iIE@m37rZ^(wgLQ(67*dhJ}euLKDfZ`X6YYt}e=&8dWeIrMdNqO)bI-aFn~A4no{ zxTV6fyt|WjdSRrB7_M{YdAioMJu$-g@K&BKu3a3{H7b6rrgXr!#`@z$( zPx|9tsNRKj5qX|JE~#uOx>Nl+?cD<-&+$;{r5j?S##%M+!q0DwowluNAHG;=)8M0w zcH?>q4T|zgj=%GqGq}#BWYvxp40G@JAw=XkSa7)zL2i5*$%4H{32zC%rd;SYs4GrG z6Eb(9aG5FLs;_>I|66E&f4gyx(P2+k9o{uTU|YivS~bZOh}!BsAew+|E}td=jxCU*M!UqJpt$caVljMz=^vgzQ*(VbKr&pt0j!_bWY)SI1QJmpXbN-9en8e@9vj^{weHWve#ZU zjbY<&4jqhP_A|0 z(H);JgjSB<#*V-*is}N=k@emEY_d0%8E?g1d;QHv{%w!TAiKZijq(n&F3r}>dtRaU zuAB`~-tOk4;n+K9a<|AnTVXn`KJ%LT3ehm$Ni`3C^KRE$Uj7Et>1P)Ui8iwLm8I$R zr6VFjW?l@yTD)ky@6x9hKFYz+*xY3#%ni-o?r*1T#@0S3|4k>$fbh39szouxa@Xem})iHUVvg7Ze@ z9^Xt|k?DoxRCYXNL&(9#M!w2B;vzNDH~4)IkcZ^uIp@M-CBy)Iy6keXwnYudPi*n( zpxIK%I9paz8_klkAT9F;f8p%=r{8xtI`8sJMqyoGv2^w$Q=%t|S!ZvZULSAfyP&;i zZtefk2f<7bqKuhANJLAbcSeas1c?xx2%`5+^w9~? zONbz%_ug9&qJ+_VH+rwX+kSt0zt7%pp6{{$yN|`LU*ZE1gZC+NQR`jjQ ze}CUtQnaIwU7Nv|H*f)FI#-C9;lcjMZ)ws(_cXnjN%m;*i5DI=5==>3F&+#pS`D$r zX&DpoG!r|EBKDw}|G3GrIXH5g>Ydh1bJ8KlIZVG-Kb+Lp$*@M2B%$c7maa?=-#|`Y zLH@zM_NHstE#L6uaY}U5o~qwVhe@GN=qHS)z@q#pr(e_{HL72Nc26(t8|xOE4}8@g ziZ*sj?Umr_?62~uv)DliW3=eJ+|@IM-;)|b8EA;2KXtV>oM$3cm4(TewyGBOhf6a}JfHf6J1U=h_g!K&kfRUk zxomvHO+|`FOZHU#S*^7+OS|mtm)U}SbhoXl*){&#wYUB5A8W4^Qfy|Q)^?}GRsA)U z`ip9p$8p`leiYs}mH9C?N;qG$vW#dK^gqallP>(MWg`1JO6(nC6{2{+d?8*_?{IM< zH5q&ehFzStNe|bQYRL)s(L+DJcJ+;$KXojMbgxx-={1ZiA8tCJ9zA)69%x*($3e6}aYhY~;?TK8v*s>bRKeQwe_{m_kiz+1!rF1(N6 zYpWk4hDd`C%wt6d!BV(&HW|c6g?IBO`&A(P_y!0@h;x0 z*f3_^TG{w4wXqab4PyJ(T4-I7j9fu`!up&^(M)dwN|Gri+>}Ssm%a5dh|hul^%7!) z1PM0eNO93`qM_X|={r5C%p}FkBNBg##`r4PP7N?Lf3z{`uh2k9emg)3k`wG(y~{JJ zIMUg~h9L0ZWAQ5{KR2Dej=4Cn7G99tRw%yQiL&4B{QlHOJXB64R^g6*w=mB{TFk;ABQw==%%m=bU!prIJujQ?$ln?+jOYrloFQKA`4%`QLG#}ra|QNf{hN*wLD%P z!{Y4@^CLC}B3bNor=ljkn~8N3ethOWm3}-uYB>&=vhU#x2@qIYeN?HneTqkf^4e6>wUWH@9$P=%bPv!Y}EaU|5e!yROfUCK;`|u$rlci@b!klVg-8`a=V;OlFn5mZ$IO+_jnwcQnP|KX>&P1)qxh8dO`*r+*8X3A9YOeGfsE&y%z8)TDluG8UZuq?^uPoBm zd4H8Rz;OCP8YD$QM+9+pLie4wdCQs9$XW_I%PEH6`2AaM6^Trtp<;-vHh0?URX;^J zI4#~r8qJ?N6jhnBj^;Z6f%PaPv1*!@fb@p0{{GQs_evs;g00E7Q@iSG z*`V)MBrBfBY|L2_0k`fu5nFbZnFtQ94q4^FNUx&0tdCN3KK#K6*3Z?jKp(q;#{HKx zOdaqXcHAgndHX9*9iQpEtJBOL>N;B+F5>UGQa8XyHy^z6sAKl7a_Mf;+>Nm&@pPzc zd{;V6t4KG>nWQnBUJ~%==m(ga^>>KYCO1+Vv8MKb@yy|X+dh<`<+hm6@#!7RT+^9R zL7~Ow@+``mqTq*?2MHo!z5#1e^F~?sh^G44LUmAB1QDb+TChQz*Cm=U|4F(p59=md z&-m$rh@eqb@FOAo*(m{N+5_zIUYaWq8(D zkxx$@o*;;Mri!_P*@Z|gp{JH;Ra%;egl_>yH7(MDh3#3$Qk%y1{jH_B^j^3=Wi!Z) z!`iDUJ0#mo>Q(4Z?J27;qfy-u->bAG z{N!cf>9c-@l+mB?sdl_+>O;$H8;S~W7N=94?+-x1e5d_V+H;3T)cc;drLAk#_mu_o z1$_CytXV9Ko*+#HW`pQ-oNq43Gnifp{`ED z%BJfiI|QEb8s%<>R|F7^ks)_SbH<}dbEse7!yZO;`$Kz$mxV1}$z|xNFJJQV$Mj5j zSs>N;$7NFYdy_>Qavy0+L@b!KldVC{Vcx?DFd|`o5;$dCgG2q&YZoE`R%9^2s(3 zRp`3qva{Wt0b=_jRxZxK9-)pY0)gR<8UC(_SgSndd z29k_>$iM*khJUm{ft1YXVoXr5^%F2~V?1S2GPJge_P~Lz{;_v*tCrV`$N)N_;2Kw^u zfkvvjP6%7Y$SI?W@FL~cEgxX#40H(wU0FQnU+sHIHaTB*EVI z5H6wCX=9~^wB~ul3gB-;)e%;j4B>H$&5yg**vFf>ad`<`Kdx@ro7tEzdbBgGQ+h$_ z*^gGFaYXJ@uCEUL9N#!$UeBvb1z7Vgr3HQ}vMl{5-YR2DfqQrtn)wkVuDMS)2{c(a zPbyhRH}x*gQ+P-HtOngk5Ffj>0cRq&`*9?QS9N_Vn1fx4Pr2U+&QBBSUB27zoau!2 zX;s6-iIm3OK6VHg;l2cIT^=h-QdViv~@GsF&%6|jClZanN5J~c~LBWs9D{hiOe#QbumO4}_;SeMgy za#$NEQ=c;oie=~}JT44iPcG+2x;R@GiM>4pJr)j7A4}09u=xgbhVQ_MUIOHI>b!19de;FZ7&R0u(vE>qakv2|c}NBn zXKyRXzZV(kG2k$Udz0gmzAg6b=RFKG{`@6;F|CTt{BzbrMtgGRFh;k|y>_XK7b`bS zcWjremfosTQ06d`c+2H>Nvm-7=ol_nQ|Btik{Yd%)vcc*un(>W(doT!QgA%T}U0OE!y#g&TuT}VRVye9+8wX1nJo8qD zz5`!F{w+i_V~Rf*)G17^UARRVZ|n4PUsT4)H!sk~wVEq!;&Qe&usp4r7sXY5{080y zHazi{cYQZImMeGvx;uN>BD-}rP_m>Cy7SWPbt*Rp+nb=v%<=XM*tV5*=bcU2X9E76 z1lAykCW1;i93uUGwmQ$hGT^b<(Dasm9hdu^+j{fD_ar_qIcTdF{a_r44k$u&fi9U= z(rNWlG|q|wp?dztdZ<>pd&4EQ2H-jv*v)C_mPYy4%zo1V?W3yCUjt;4Qp zujMeomAGd6q!osI{U1U?V)4vlbku|<3Yb`Ck?3(!G<%#G-XzFm0W&a z@+Njy&AE1mdvHu7^Chf*V$tK~&SPitT1%q-uQD#xrAqGWD&MV>F1Kk@GNg0&U3=uH z@RU_uans*7$W(1TlsVPYK>MFIpyezvLKAe*J~OqtK-ZDIk^V#n=mmms_8 z^l*w!b-x@XfAbcEQIq1}4iy4E)~s1ktiQeq31KBxwJfHJwJ6kY5WPiufL&^w=n{BU zKQ__m10`ImE@>yY5}-OMDnR^q$}SAMg9wW-A|dWx`hnSAz$}YvX*d*$@s~_Ur=gmR zKJz(cy)~y-yiRSFD8{9;=IyI=8R3!}tOAX%K?s{@Zz-vuvTZkynQVS`hWuit-sgk< zQq-uti);~}fMDA9%$#A`D`aK&FynX0PFn(!_}nBkrA(;I{3h`&g&(tcD?NK9{pN1E zJ*@uoHZ0W}?f1G~QjD{*@O?0GCfK^vQSSybdY5z#=K{uR)ztLmQS4YiFE#C2slBzl z0bWhfl`$LjJTeECeb0uJqLL{~!!O_nB%iX)Di^Jy1yAIUH1u~Mh4B|nxnc9(U6>prGqq^x4`iD@ zscsLqTE?U->PCqJM|v8C(@VxuxoFm&lae!;1xln`vex4^HZ4@AO+m1z@b_2X*DO8kjkRN4D4oXw0lt;$X71|&VC#f<@Amx5p#&VLtE1bJGxXjO6q4M<(Rd#6P9@#%bb@Wvzu2V=rZ zzVHw2Y`52XwTj@mCkO_|2T!hk@cgh($-QXZY8+TLt0G?3w%b_+MkoE>VTk4uP^zVr z|2`ndpM*Q$N%vv$cx%69G{CIR9aN}YY}$Gh#kpjex?{rh2ffFNpU~+Be!WOT9Wj{; zj^2w>%e>$MF{B9cAo8Fk2%s_k@gU zBjjKODx_)m2$&v~`_|rKIiT>V+SueHv6lQ;S(%L@WvkRKJI8axfs$X=*%~^<_+Gz$ z3wv`=)27r_?^g+GZiB@bACJ98f_9z^4O!Y1QOo_u)+NFT&xJglpqO^SWZ{GUxT$0x z5?`G4iSP*JUbbgzBRs+=7RkP*O{NEqF0HibSB26M++APLrEF&A#3Bd7G>Rf4ypvhu z6Bwme?S~u{DNuIYh9%dv65;k1G68athw|~V(Go+2`PKPe?AbF>rbK4N#2}4Ly!!!ND^7tR+DAo8tp3Q8TIwQwIOoWfz`c)42S-6Yqw-sJ{otUFs$K z+1k#I!d~}h;a(n$HO1+Yi7WR`4v)v;w(P$P+d~lnb)qu83RWI^d6lgG*$bPq-fM#;C-j;@FR{9Gbbjx5Uxy%i zIn_?R#4QBb^yFykx2Epk*r+`rq%y|&O+IBxaZb^Y(|M=N`=VZsa`g?R4AjG+;j_?n zLRX4>?(|zlnZSIY&a(d3kzv)U#>~*rwbgG$Zd0+A6YnT5@9)~*;uLcmpG_yt=SGl3 z%A42QO7+M}Jm#4yxN{zC{@Dlgb)cZ-wL8g2^I&8B<6mlebwij@%Xv4FLkF2eEq*>v ztygg@eC{vO3eqNp-iS3!mAg#d>HWC>c01cfZvd7WrMGDr2)MOdLLg?rvaNa|X8SAZ zUr}BO+eWprhpQ{*BWIcquOx;(?O;2q1*{fv?qrLaCfyq`rei*c+mq0e$Eo=V?GIj2 zH&?O$XuU-YiC8I_7=e7daM&0#|IH!ljU^gg&B}`5+||F@z;=+ZFxL6QXVsQn3EqgQMIa)HZzPG`xOUHVOs1BP3ZcRsRlOz##wYiO2Nh z+=#l%`HXjy#a4r>$=p+$>Ac-D%;pf!>X9G=v8i!nfnGk3oBUa$CqAT$dr7%LtZ#lQ zs+yoshT14uXD`HuCmKcLE^^HC!zC4CT7(|qmF(qz9_Qe2`^!Z&41q3POl&TTzt|Cc zgrB~VyaK7O49Gun)!t0d&HcB2fGic(B}v27mDQq;3c+~bm(u`G&fSii_X)k+&kjdZ zL^9rc*v9|Tv2~wQ{;vAtNa!*ddSRBIymXlSDRS{`wdZ>5G9p z8#P^D?6-aJl#ovRp%?_!IyldlU`v6rm8on~HjP*ub@;Jhdl2fKK;v2FSd;Ofi{~l5 zul%?sguw@SGKzi&;7!-5h});IPCk9DC_#`uz6b zoTV{LI*u%W9{FKBbU-6DBi(r|l}`vd4tg(8Cz+OR7F{}S6N~n09VQUQ{OTXD%6UQE zhSn_|3?$}c!nPoT-jpIWj%JhOhkfMD$0HpJ#=E^`Dw~q^g)zz8mwcYn3d4l9QT1ER zJD**(QcOcrPT(M!+-a+=A1$;xYJEcPZf&BL6vKq+waVe=(L!7M4J<7w7tc9b^%FJt zWx52Gl3ec`m1a^emX8?yWdhKPFBKR^S9s)Ef+x4rWbx|Nr)y}Ls>-~laa7>##C4P9 z-sC*X>H6V34L&wDHewB=-0=k3aYd8%^!$*eF+rc?XChyp2SBGHnC(9p(Xsp@6Iwi3 z<7k>!dlCCVh7~*Dllb{oG%)c_`8_1?FSA#4e*chpGqyj_bA$W{Rux33!|cCFP1-d{ zQZVg&PGRX6{t|`)1IYbbzZA)|RhS$qpZL&K(P>MJOYUg<#@F@Cqmm1!@pkI=Q-$B5%X8KGZ;sPwJh#7B-Rc+`8f%lu9T_SE zyQfXJw=Zlmn~JsE)Y+-J=Q&@?H_V6G(|UB`mgyN*k?|qCY`oE<*FMISWjNG)aCxf3`==%W10v{dA!`* z{A7300kH1_eDCYt(F-}0(hIGfPp_Z(l(-deJTNnrmc~d8eHj~jQv;Y{Zvf`oMF4)M zNnT!_N%FnR8``8rSLSEaq|8KpyP?Yf+$!i|mdvxzetmcp@Ytk3J6{&tTJOBN(RPJq zDt8s)`b7;)dxt&1+T;xSVE6V;clBSism6YZ&pTX?Wdl5A{ix1UBr}p@qBGZ^`!~kO z9^a+z9HAnsb>^ScG5RygT7-xm5=P1J;k*;TVGn%hg&XvDC>40hGhwc;?zdNxX$C>zTqq zlxfzt>Z;|LDa4{uW>ierH|7Hycc9svYCEEFti)56zguQvF-5Ck3fzhB?VEfjr%P%E zhkL&*b1XK|du8DryC=}THuhSaUp-#$3Z4{E*eR(<7SFC$ z2zyxxxYv{T*EnF_Hy+On%T7avfAl5`VQQu?EWls5>uD`2oBT=X$6(bEY{ubRbBsi1 z+{_x?m#s@Hv^B!F{ynq2K8fPR_(U8#gYn7h^1mC1n0k!udgOB7lqxz`t7iDxlXtu` zk}=c(^#n{6nPT4JPjU?h#MAo$z`S&)&zJbjJ0su@ZIrJc-^(QQ?3rcMqx~}7YW|eq zSjN2d@Q02J)5EwWw`|KO3uwn3#Wl~rofExUp4-z1DN#bQ3FweC)qX|rJAQhh3?(M@=^u+ zPyX_>{Bt;jH1zryPW#iczx#H=^s$lO)Qj}LhC)Tg+QaC_VOpvbR!M-x>ft=Y6?(IB zo>b^yNW}-Vx<9B`ks{*y4)5tITt<)Ro?W3=C5{9+r+jImMbuQdK6q@N;h^Y;>2!Ua zn(=V^`T?9B9OQ2EK;(89<4}4=hj#(RT5L=Vppp+UF47 z3>Pcf%Is-#iDa`ExV?OL1V42(oT@n;D&pdlQ%|pcn=afibv%uV{t_Jix~RM= zLT+G(q^BRkMW{_i(hKhjww_?&;G?hYX#w2TnYWss0pJ!=I92D`@m{anx|Jql8sP#Q z%U<`#&mIZNZcRZ4udcgH9&HrqodV;z|<1AgD2(`sUIrn=jW%# zfJM664aRH(_S1)j5)AD3hNLuoe&*!lY^Rfj=@DnPwY8-+@E>Z{?C>A#aQ6hCNspP0 z0kN0jEN+``SlY&?fudbJwH6&fFt3+-XnjuCf$t}<>{n+u`>4Lc^tJKt-@j)m$GNtE z=tef*%*#AYH!?h2sU@@^Ab-{*T0g^RYO+3@r}r!bA_k6VJD^$Suc#9Z{!7UF|3{A- zY2h%e0ot^z|J+6XRqx4CV#W5pWn6((2kL)ZVM37LA}-F3DvoNGMI4SM9SI;kIj_EN z04BF#zrEvd^hlZ`0VMKpipQx*B9CcIo@UiU&?i(ra;cp?H+C!QZYUL=2(ZT0 z8DcoJXwr{DX!$tM`~Yv({CIn|>GfEE!=_MkQtIV?mIUgdek-WvdJAKKy6-C`@|wQ^ zYuRJQe)Bs52DjsY`TK3;edLVZ1QONk=&M{%clZVc_QL=`2F1g*?*(JP$xsaNSUFMS z9N03F{w|R_G!EVd!H1(1MNI~?6v-TRqD1vu;c?HC__@(7v6^>59^lbh0KI((SbM)+ z_H$;&Ks5u+>;b77kG3@61i)yr0l`qi3g1&8Y-Z(}e@Q(K5Q;XgP2AOJQFc(bZ3)+% zHY%U&m4xpFMUQ%g8BuX_{CCK_Q@gslxEhB1s7wRPe14JSXC>JLDI^Q>>{I!@BUxT) za1VRmLZ@x}ljmnI#FY6pl47)&7wU1Wmk1d3tC<2zfLN2@Cbe(6#);ZVbe?G>AD@5TY{^F7I?m~nzX+MeR zi^8H7#$x~@Dh5gw+fO6&ykt@HB}Yh}EMYq>jsnk>FXO-k5FQ)H-tjo|pF?R@om z0D!eb3oxK3F+XdCUBW;11CV5kYja{Ll}ZlvVx|pF%}TE0=bkzjYp*fww3avL(lO%| z;|&+%4X&kM-lpjJPlHev0QYxAGVVJoSM#vv<+7*0EtR&DUOA}{It#PA*gd(~Fq&5} zMUyUP&x+AyQ_Tl0qdxBg=Fr@w*N*P*M?8+V^70CVkguY-WJMdqj+>5Jme~qwAEMf> zJ?;JaY9WjFL}dHKu4>%@n{87VBFKyZFc_Z^Lof{xw%aQ!Dd}ld+Z82RoN@}yhdgRd zNPK80?~rFGG#K`WHBgI%eG68H<@Emk--xYN4gOHf#*=lg$?&H1!5g6Kp06NNsZ`!0nUPfoR4az>3bP(!0-3I zdaXr?*m$5_%a2@u%ab9PeWk=sekgjg2D&4;%&yiOF4;g1;IN)lF)`#l#4g19n=I6s z=~!|S0C;u-M)rE-cb|1;a++eW?;^Hf<;@MT+AjApG^C!{4m@GO(_wJkD1xD@X1s~L zQT`raw#a;v={ubF#!v~kEUk}5v>cPK<0-Gj1a-Ou{DXY0YnhF?FGO#;EHQ{y+ou(WxgGIAhA|a;I_yHY7#%N{u6%=+a&{cwCSMRa3eTs{Sc2`E;F^$Ui&y+q~orHnf2?v6|Q#zkoW8pol=9 z1eYn}CF3V*#O;BXaA;67xvwM;C3IBXe68@Ch`yEb%Q|13O*8mP0RH`i5Ffe4L&d9o z#aTLgl%4MfLTf^AW?V5~EmVU&evL54YU=Y%SV@7qXNa3Whr2B>Hi?RZ=YCd!ur9WIQt{8Qp37)2T=BQo6qP9zo`OvlT=$+lek;ET`0L z5qiU0WkJQ@!JE7L_I?(r9$;Yzgs6x-3Csllj8LYOq-+0xx*rq{o&>W8f|Lyn4fQ5o zYg$WhUl}l*sl|;KxMNJ4@J%K!0j{NJq0vn;;q4EyQaL33(cnGU*ew6N#IYaXrA&<% zWBv5){dU_kjAtRh;b83{yw`_%*`~?uIFu!ZFurDC6Lvr@3;pG$sWAFc0_lpa$~_QB z{2bk^Y!c%z$hLKiY4`T(o^b#tvMBu*pIgJ_K|uiOSuPK{X!zRlAAP(t@6(q->8qj1 z_UF^FGbCW+^H?uF-Ioe~cgvA8d9V+k^#iiXB#nLJd{KfsexGsSKd)IIV7#SgR1EM| zan^@63n)wrIYO7?iGWpT~3)JLs_P`pDDHe2FyQ=B$Yxk=mk zpz+dPP=8@C9WO7G#=gA)^L9S0GRmv1ok($Biig!Af4s$`eFU? zoUMuIm@8^Is?k^+1BA}IT)HaC zB&gffz=ja(YQ-*n`dT&my z>jZK;*qL$dmgqcN0gS`uye5f7pA$g>7p7V1Pl;0**oN!2kTUl|OeQ#v1SGlI>7+TV z!@xq;bUTA7bt!9o?rAf8N)c#fHQQW;jg9GszLO2o`r=^-tSAfx*ilTemi}=ju~z9i z94mRh=lr{HJOmckm5hcB_%5;;w1*G^$F}JpkR|feVC-25FWJ&yYCJfBH>rFG9a0Nd4#|^~oejFzxE*|2%W4J*f!%^DP(^wa4(4f8 zSf!MjgA%|Cuwe-&??NV>)rl%w@M~*}!Au3cn-aM5sjC4fAtc2dwMRzZEKaKH;l>@e zHhct){63Fcr+aq@A z&r8S^g}G7H*-^*wRwU(y=ZIOQewlL4AXQNwBSQI`97Qmsm$Ng!OB=$sD3 zHq#YpBQzvA${f7N3>YzY`t!l0aLpj4m?McMl?ER2SRDG zyYNH8PBy2C(`}YmuMS}*rP-dKZ{D9mWgBL0Cg(AApYzZ9GBrPK*Fw^R#J~m-?ZMf|YvR1zsB}hxD#!L`cI*riT3%mOBo{(| zfP`-XYz7~eBYp+8fdxqnNhEM0r6_#qQE^}@YbcfyMU*d5Jl`0(-@Ap*$kDxh2KTQt zb9ay|BRZb$K08(%L{Gp~U_wG}A_UcG>yg?DBa!M{k(Af8EhL=U@ev^(kkVH zPeK$K$DgXGNx2Nt+52QH=AL2@l4>s#&5=$k0A?>@j7gvVJ;Gnk&kJ@ z;CBVDD?)&qRS2X~Egaj{X<@_yU_)4^c&iizG`;Hun6d77E?BRjiVrDUDoY{xHc92V zKpRkQQY(A%{JzZ%Vm|%w88xI$VHPPF+9|+(?`h0~C+!;sLCoxL0y}oiML1s6w^$yl z(NSS%TmdZhGDY__6%sQ zpfd=>PB}gaHQT|1P}nNK%QRH{?EOHY&KX=4g>q*UOPxDe;XHeC0EI8Q-hsll5o*sTkjO0m*&Xcgg2(3qVl)QF)_aP))5;8z=@mKBye<{-C>J{GWfeA}KLzc3%>RjhtQl~Yg z;iW9e)L%=>F^Pvu;FaSjr{;qR9s>P8Ki+UdGAA!qFYBI@M${=W$tpy;jNN{;b zLg3{;=wP2-=O1TEOjgX`XhQTac4He#0U1IdL-P#a-Bo{@syKj;PG9A1vmHv%~qYK|~R45^3XDHl6N@tRDh5B|@+_{V`w1qj-* z<^tZ}@y0l)U&E2(d^G+FpTbu^+qD+C1D?C-E4u}hw^F{;>8-FHaVuXKZqY653_#us zZ~(;sbs)qSLDxqaw=F=V1&-Qo#z!Q0;Sh{ngXO_xS?TEr6e^p+osj-`9FRuMPxtRg zJoE7c$pZH&lJYw&Jx#=$&R1dRN7*bvZgTL8LyWZDC!|}@A=wcxk=C2{vD_^VfRs?~ zad8SGtyxJAZWiWB0YpUKofqLn%>}c^AE&qZ85o}yxo01Q>+u?{m&EwWWu(w#TlqC{}hx01)K2esH)m<8d{^^z1M;`8bVN>yK2Pl|dIQqZX zpSXMhsb@ZbyxlmkQ$e``QurHyCDbkXIPMy+=WuzlJPu&3VneG3iwrtu7`;D@Th#o_ zubd;2dh7#YC3=Rw<@^p%N3WH!>+&PdbR<8G6q^b6K5}Ih=;O(W$Yd}h&cN&hI>zB# z@8;V>;rCzoK6Koim|=uOq0)WT76JNE=~2Vg1zi8v^CLYS8DHN})-h)Q2Wr-ef~1*; zbdsAx^Vua4z9Oj4D?&kOG(`TpNBAsb+s&lSNyqVrZtotT>;dSSwGhCgdg%X=IHVpG z(`v0;1uu0zP7A>JD^7zqtVJm*bQY4b6cXQ2XfM{x(DpBy+uUV&&ddwPi8@?{+<172Wof9V`h?6WR z;>}s?`>slfIDe#_br^O7>naq*Dh(jo z610Fcix;T5!SSF-h{<;_C=xsL;`*UFyw>S5auBaHoSm!a0qID+h`2dCC+Gedpl#3& zRBK%Yu4B4&PHezX__4SZ(jAu-kTD99f!>3|?^mz!`XSy_NLYr`*-4)#v=_eN+~+z) zuIvh@Ya&1lT~lEtKJT|MTykYtGrExI)3-i6exagb0Bmuw?hA|zMW*>xcTsxaO1e#N zG!Yh9)Dm3?KkhSXAJe?g-5v}hz71&Z#b;X$VyN^b!G>MfbiYEDkLa@Q3hRNLkU^WiTkvOD^Zac#NvZyQM6q-TB+)-vMCL5Qcn61L?1-DKnTA(MDWVmr|s1@2vxZhpJ_?|2O|Jk+1KRFI9pnLSf=viSV<%=3%`u=M ztAtoe>gwv*VVtP1{IPxb9pE|GjNoFl$_9X%Bc2!Mk|q)!L!i}*-v(X)z+YlXgqbXs zvbniAe>e(1@>Y8Ob#m^{`XFP_Rt6PA{RnXnA^#8kBQkoMkemGcXmgVM{0pZU9F-vI z?!xccLGS2$@JxH0GAARZQ#19Z!RF<(M*Z&08$gqhF_kl?kc zhbN50&eTn})`e|)52RE7bYou-)_wsrGa}i)*Uad#kxjsHGW6G?TewUd&*Fim5=s*( zSnwq3?&x*y>BlZfivYukBtQGEtN_`~BLtcI>0m19yC?RlN=gvl`$z=@-Z&1KFxc#t z7QPp8GkCxTkeGBzJTFE(N#+t6E>>hEG<_TWUK*er!L7o;<0=vI_*y|90Mtbza4{IO zJU)Ht0N#Yzo%R@s4mJ{;Gh>sQbOVy3n6nrQ!IeP=w^4M^sf9oH$U>+x)W&#z#VYL7IaSr%h6oqqY{`JhlgsGQ`C1b%U9xw9pV~=Py2LAWT|RKpfOS4KaBx>J)h$> zpmjxRD^2f)1WCi)>Am?7d=U5#5;WEppGf%&r9Wva+k&9S7kP*F)Gx{ZQ0DxP^P*D; zA?!Jv2Mu&x7<{Qi55m#d)@1jp@@seHHR|1}A}>Q$Bsd$+ZB(;;*W%!bn$e8Em)eaLiQdJ|Cj5l~r7cdZ5T40Gvml2MF%IcTwS}wZR(4Etp!>To9Y2 z9ZmXvMjH&>7!XL#;!mLsij?#8=f_V|*!Nly0_keI?MT<`4?LX=IPH{0I|1VuX2ZGa z<-iz4dxY;iQpE+B259!UC4C<HWA#ng&rz=(rxK@=+vp}I?%>{ zU2=P~2CyPS0@%}85O*eRy4fX?e8C_%H6%qp8oJTwixS%w*LG z&KwtS>r+%JfR;~z)vm9sGhEraKRNsA{)fB7Pl26xPHaEe0HzD#`TZZmu>Ug8bdn_( zANrs+|C56E7gahLF3tH+8?l$tc)4Hw^s(KG@N7Pc!$1cWW#y0NAGW_H2m3p?tZ^!5 z!Uy1?H23o4=KZZQf$$@t8Lg=1t&n~?!*G$SQNe)}MYxb+0*i<0T=^_@Y$6(&1--~X zvAXhC$6m*v{+r&n++akv?lsv+KQy@udZFuWOausoqPiV1wjd)gZ<~vmfgKdV2N!Q9 zLkeZ^fAPpoEKjUaq^D+Vlzdj^a4m&D9qMA4Gz{HK zg`#n$=?~z_Qn;<>jh21TR#}oO=;JNAlLQlfsoQSG7Gb*0{3{I5S~Zq^GM!<%{-*7C zkLe!M$0D9%R9=oWSos2*0=56%?VrIs1ExYM_BP&|{jYHOR|A*ryW~!6xNSTKc~8RleMy=B+?tRxM@oj&Jywi zNX|RUJXxO&lr z`x1{x3M=%BXh%_epEh+=pJly3Mk+8g>Eii=rcJe4m$R;X#fP`bFYbxC@|>UB0V1k& z+C(TR{J~x*qt@#);FAP|-xz@&q4(Vnx7A~r|84Q{Usv&V`#pZb|29bZFA>DcAmv6g zicbhz**E64Md?f3{?8=-n&6KG8S9HFmQQpnOGVu4p|q>K3MVHnYtp0&qoMW#<90f$ z^Mt29D%CuO4cr=N^Bnr+y)uQ0A0nxuvS)Tb@)AWyUJ9*!9p`;@bTIVvtjR;=&~|+d zXaYCR!W+xjum)!J?y>##7Rd5pwVexBFUwB-bxiKBiDqd;<2vMZX{o}~b)Ka)TJ!M9 z5rZ#Z%}E{W+WAZ0(y3S`WVzSh5DE{^J{g)SBjI!6`NFAy%e+c3K9Lo8_U<&Y~8FR(!HG4r}`r*HPpa1(Z ztA*>Ezku#4{u>eTPZ|CHeCf3qLO}f~Pt_-R@rOR$pWo^~KS&rI(AW>7(@+N{dH=Pu z{Z|*jNkA{}iVF~r_<#N)zYHNAf1%jCGn?t}oZm_UK{%Vgy)KSdMavIg6W0n`&3xEN zS1`5Q3uFCOwg1CS#XqS>!Re^VWHPMXWax(p|NSj^eF^%|Z5y#y`FybxKTiQE{^OU<))95aW0Z#eY@)KtZi3Ym9)Cea z1GV-V9D(P?SUqh9^ z@i2=lh17~6B4Q%5jl#>}qRP7Ntlg*Db4M9viEQSxyJf0xG~bfT-YoRyH76}QGsqH+ z4A*okbvz>)FFK@TV_ns6bMNZ{zYiH|Y6-4QOepE(8=kEH()*5GbM|}Yr%(e6`5?)K zZ<%Iv6D47PeOmwXT72(%;59|5T;{MtQ>@sf<#wWWQS-2QesOY*gT`_(>F{^c_)yx3 zj*3Nz42pFl5@Xr_Ty_a?z_ro+>}agc)}pv7@v3jEV%5a;(6WR$z+*CuVLSibn~DuP z3IP!@*GP8tiqYqEB541E_5R}a(KmrkneR37l24+}HZoES9mcab6>;Tu$oPuwqmo%G z;_IBswCuWdFgPtPqXnWz5^U`6_YNuAkvmF1iN*!zOUf%wwM`eNn~%0Gqdt*(q)NdB zl`=l!upMv@ea?vu{WNYS(`KVlI!qPCT4#qEHO<&(X!R&e@uSQ)wx@9^L^sUGUhc#8ScJe%PW^XV}A z;mqTQR0NnJ3^9k}r-ybu7^RVjX zw20!y$WKxGA11v0esV=zeaoMy)H}-k;6%#8`Fa1ZjSSEt0{A?xW)C-6i>TUU?Q4$E zp3@hV7so}byoFM(>ofXa6lxA#a=ds|t6Wn*m9ZE0URKYAv0(CLb)MBO%NlW_X9x_m zHv;<3F7_@jBr>93KA)1R>#4e^|7uZx3xk&^KxuO}Z&z<{;LbCpXuNKDV1H!P(IoI6 zuCiV&PXY7R8s6lK@H=u?<{UTQuY2yluu~HZocr9yHazy7LsT&Bb=6Pxs(!{bGtxua zv&*I*8;(R*&=$u}Y7WN?1{*sDC-TPRK+fkFhHg*XwA$&Zm#JT0D6xG;Z=fk^O>j6| zJ>F}0MSArtnq?Y_UR8?VD8*35YWy5nk!zJ^OIcz}8!?f^S#RMq56XWqA?Iu3c8|6=4>8)zo8=nyMCuvy}gBD`BYZ%l?Gl zRQ@NfZ~YsF-TR zCn5&mtowiDIBb^Z(+6W*w?roE?H5lDlaG=uw1g-$Fe&bbvtE-M9pQb2RZjs2B(w9v z@h(rdB{(+cVT;j~$}Aw@u}Bvpsw2ab>ZB z^J@LhIX>xEO9eVj{GoLE5R=a!0wdwiQ zd{BVVOSIKh%l}8&SwOY5rVG1R3x#5#xD{Gli@QSwEyb<41}z?-xI=-qI20=s*Wm8% z1PJbK!Grwi%-p$iI_J!PhqZv6wX(BzK6$@apEr!@J`3@CbF&xNYC{?M+A-x2E%A^W z6m7Yx5@FN}?mc*J-sXxi8*s>1R1PG5s^*k0=hS`9>$~R<1*$pS^`B3w>1?ig8v!5d zeXcAS3Vel1v#_5GD>OUS0J^S&?)MgJP6q65imO^^-`_5^#skCT66z zbF2c1K+l5HwF!Jkj;*5XwoXUq5blc8{K1pUFDt;YO`zOtVFlE2m{i-c>e|Awm{^Os zDC7`#ob%?q-e|+q`j+(dM(S`a(1H^Fs>z&ARK_PW@;#p+-)t|0F0CJ!HT<8BMQo&; z57t3WCr}6G0%#S~8&*x?@(zNnzMF9n4y~@R(|0O6JDlOMHk|&na6WqPO5dD4JCIMR zQv-^Oq!=6a$>vL5HOelUM0mO3&%Ek`^Inf{uvX31rMes(uNF2Kzb>sXKNL-_vdAfd zeME=fuS!`mz;O#(wrt4}Q{BTP?Qt~ty@rPQi_T77(~0j#UKUCR z{6=!!r&Ds2O>+AcJ6F|O^Z6yvgF&CllhuPtMOE9XBKGF)=9aV5=7Xhzn&$JvbB5QH zPk+WBJ2f?na2oqUpw?3G^Ga(r!O22js66gzgt|@_1~S{g&qidH}T z<3a4CdauXH;k5ttY3VbsI%t7yNj`W;kyvEKkyFzUi?w97niQ~TCQ|dhJXI;EYw;D40RPb!CRqymlxQqe&*`UaJv+0 zY*Tjs3O;kN4$g6j-*>@NCcDqLNXs>!R?1}umr;c6A*j_rX0giRMXTYWBJc~^hYyj) z{GRUaZC;34I`O^_YL;Bs1^3?suV?yAx%6fmo@c<6%7;iY#2GRzIV!GN$031=?E8@)9Ap&e4k`$4P=KgD?Zhyz zkDidyP+@86UH21|TcJS`)vjr@3PLClratqvU}|Pf#s7-QUYXBHm*M38cH2Rx)H1oT z)In$K;#R5-dMpLkZe9VW`9&ToCa%;!nwxA^@Ep8@HJJl%qf&Xj8mk$ZDx)K}fb;!A zv)^M~z$G!2z|jHDDg_Cs{;_Al&zgld!HYKVi}yO~Z;7+_C2@wn;4Jf##lw76G6sLZ z)jsm$;`&~6b11P^*X)C`^oKO#125>$^a~2d;R~;!3!y8AFU56jsISIHXKOG=E%|7e zUa)fvupL-8y61Wr>ok4E=zeN^@;MfFb0gzavU3ehHYIvN!12Kw>s=LFn1WBy!ogb) z8v?>axkYF2^g2Wb(|7h^ME`5qZ=s$|=V^&G*JEY-XGiX!aa8eUHx~>rbnatshGYL? zh{Np|$H2zt^mVS%dM`6*c`H#{&>4VO@902&Y!(4Vt>&9Qj^|IV?6lK|y zrF?FO1Q3nPjxd0G93_hPx0f_~%tbBMHtieP@iTtu(Ym69)~-Y=8e}k)OR;nt05w`# zH&A^8DVd91$c?}nv+q-$z5HQn7>U25{XMHjE!s={xwQvdZ-3XS|98nOrQjj-&E&ib z0&8rKzZo8yF4*&(HOo9aetS}}IcU3~F2!7Te!y>cj<75Sk z4w}Z5Oy2;D_}rRo@{8LYst}$m=b%t`qdku}k}%rA@5uxdzKbmL0m!fqr)N0xpQO3) zldFhU2i?*wgVs1m>!jXke|+B7rZYeZ#nX`zBU~lwLDR1BD6lP`cu@D_`7}ud(y7=|P zBDM2aIM|0VlS|Zp0^{EAXp1|mMPNP@_Os;{xo;4l92xpK78n(u45%4K8r6P~wy31= zrc&94FC!-HBeVg@A*#!rQbxYn%UR^%5Bk;PdNU!s@rnYlk=!V!@KM`i*tdyp!fDhU z{dypkC=9-dYj^#F5yf+vta_;Yrp(Rb%B-OYMtwI=STAgH`#o1bz7Xm(wxVKndoy7` zXsEBx4w_2CIo~aLyV&szmULFIxzO?o23~7CC!B?yP6nq*sVRuOEIQ~uO!E&&uxKcE z$MLSQV5KvqGX{BpzI($rU>!0N2Jm(#hVpAOob7NbpAVFXXlTh>-j%O70X!IK>qW?`-1tHCH`DC)g_|v#lueyaDYqRt{K+?1Z@5EHmdH*1t)k==wF6>g2 zq~2(ed^t1WO^C)IWTaDMgmqtD3{Y|gN z@vWK=$Cy4H=yc|50+;(2F3k!(jF?#m>pz;vim#Uj+aO01=lA9`F&~hW!YSxy`~uA2 zz`Qp}Wj|fSRs=c)5sOLlwwbEep!& zS|4N9adNJHYg=S}%s1R^kFLkegP6m9Pm^Par@|83uU9Lo2YE_LkR*Bsj%klpn;QdI zA4TgvcM5K~U8*TK7Y#g7a80<}^1*|`nZ6X>ei`h?rWLkAPugXfn64|K0gmB(<~3!^ zjJ>9%86pH9(anN(*9h{eD>EOSf%9IZEqA>`ULIB)BE#M004-qj=0|cLD^{__Ch}#9 zHC-;aA1u7YX;1aq9Ufj)@g%%E+d6hZ8tdO+w3KS%o7KyYz$X5)akr()A(y}5lMYYH?V<5q7WXSdqWM~g?+ zG-qjX(dUUQ_Rj9maQUX?7N*@2Npjpn%<}0D1DhexNL!MD_3C9jj=o(6GRp9Hk3{X| zg_v--b8yt^WEIqYbseCmcm3}{`G5M(_^T1-)DGR@?Da!)`CN@mES;ZkOT^>}sBc%l zPHNWY_NXVy&RD5(?LgfXb7wD37wFxI5cfap z%mFJbeP2z^Wpo#OrnT9&_d+}}_3m`Ag45^&m1}K!U<7>5F1_`EC*x6vHzuEJ1A&** zOBGAmH4^|e&vea}JEI5>i39lLJiL0ib)ELQ_G@0%nSu*zsYfkW#TCZ>?*DAsf9&V) zsp5v6F5$Lnz8!g3I%2p-*?o%>PZZ8)4YJcsQBH zuZ&<(r>fZoC+#f>J-ggkTkFB$ibj#m7u0J|EVR|DirG)O`mj$X^UT&Zt&cVoomXfV z9xe3ydX;nb3X_Y}RiLXmKiOBCH^S6sqY@*R8rUr%qB=H;3LGRe-DKk3@4lnW0Z-@f zEHU=)lz>ICt2Q^IYR7d+7Q2?_$WO~;`0C#>sTie&Cq!wyH>?#Q%i%R|nwLxvI*xHp z2-mt4))N7e>sMSI4~1#-MVlr12S*!A-939QBQs6zX;yz30=YKHS?;nlK5APHKi)XF z#izy#i~UQtOatcMR_sSoi^Q$@+^IHf?!?bMx%2SwBPkt5Vd&hDoQyO-&MURENJ8F> z*7fkHFh@!1Vqw;wz>cqUOi5N5*bO{ii`V+el449D6)VP^#XvO%Xh_)z5N0Vq--Mer z@V(yg9&Z9NDdg|q)B--NA1wmbkaS;-WyBW|DwKjjnfj^eN zYd@vnEA`CP%kBQte9KjZ2m)NAD~|@ak5A!m9w%`KDoq=0 zsw=IPa+}V60c&93Xfm!>uFG=|_Lt3a2LX^mdvAO|%sid?PLJn_zBq%^sT&Dp1+E3m zk;}ffr$HR3E|(Ih@gu}|IV-%>YFA%Z$g3e4Qks^Pqn20QD_1$F@gstGTE$t1emZLl zd==X~ZQ}HUXJdK8Y4stEP~5Ywyb27MD)r_JV^Es$Vp~dA_3?oniu??MtIMvLS49@X zu|*#;oEkoMcJDX!!w5jNKHCu8R;F3WO(A8{M(`ZFk$uD&yD4({XP0E9$-tE0Mg|4& zQT)1=85WB)hA?Z&y=g)zecwh-E92ND{fyV9!jc~u-Q$Fy^TWUluu|)Y5scxznO{cV z4(Y`naLyH76<{=bJv#b`E$Ve;t>HV}4^i8jfrZh_P$rys?V8F@Eybic#_Mn%KBgP7~tfk+37+y5d zcElet)wkiqLB`1|N)6>L=|HbTp18errk{Q65Vdytq6y#iSn}GDuf@6M#|OMVK3(&+ ztb1w6dv^venAnJJbAN{%p>1K+)c0xKpS4}W)H1ZrE75qVf&+b8?l=YghL4s^665pT zU^lAPD@n0oR%>Rtu3BxOZn|aIr41JZmu`ozKw!{Ljh(O4fR6RWwOzQzN(>*bF^>q* zWRiVPTDa&`@G)5P#j}^Vj&qP!*0tS9?wkj1_$ZHnMx#z2fd7;X;1D!b(!B5 zFD6B3UCO)CCf@+q&cedm_oEy3Hiq_ZSjKT-WBo6Mu;Vid^BqQ!hJa~xGfzz8q0K4(zf&YOTQe;Ew z3p@F<^9@bFp>$$RNN53%f1rf0hI#R}@tz=>m?hYXr;wGsq;_J8-KXbTOJ}o)OM_nW z8ME@@^q#c(o@*hA{fxecBTdusGMU5ffPZcRLXZR*Dq>>2VhKmCqob~*VS*{}_NRRCqI7t^bnQTN}5JkHLE&5T3Y&fa{1 zPEQRSoMCqdP|r_@p?Jy*SGo_kx*)x)4Ez#RzIe?#C3NTd?y=}3c(`;hMR_C`u=$ie zXJ{z(%Qi^FFg3TD32vaU%uMJ4q%`ulO?DTnBV5<<3EJ4HLJ#k&5IzN&tYi_wK9J1> zRK9M;35nM3y)kjn+OoI>adr~6cW9#@WNjdAS!jL8KtI0H*}t%6iI^?tbIpv^2L_*Y zQ)8CNN_>{vhXsQH9t|IQwL#~J>ovk$7&r@@m;jcKZfaF44^9nhecZf znij_$_RmX1DCZcZR5GvfxzECaX9O^ui8y@!M#X>F^EDSudA&Mew* znjyK|(Sr!uDeSsZwv0UyDm`d1)HT$PxvR4xD^BJm^eShm^gAo?dXZnE`@0kZpkK~N zsvG%$uFDrILm81J!(L(btLxU{;FQ2)-RX@k*BK`GzJ74)5^iv9YpzY7qxd>nVD;tJ z1?L8Qapt0n zlNcQFMcPD%VT%Aj|5T$&JFnnz_ACwBhPfQW$x=fb1&m-==Z#s7IV?f7=PEMr@D11< zALLzeM&mBI>DD__F6y75ps|vT>YC@lNU~7WX)EwvgcQTpv)eu@@+GDgQ{wD9ClqlsqTI#ylgx` zvOYYDW(aFvH?_B%yUg_*zvXGB^W?i?3|Hdf$O8Yk{l-=&JDZOM>a~4N>5~^40HHIU z(ebh*4_!fyZfT`abiS;;PaV@Om?&KQ?DI9u9|o!grw-?$A9JmZ*;~gezS_eXj-Q$^ z%36nQ2d{@$YvsRC#d%M6j_(6W%eM8LSB~kgh8tGC~%~z$qOl=Fv|M+K6)R;c)2Q zSi#>D)!fUMR|t{IPtAH|dYn{rK#ry$T6ucc-i>D+i8?G|Gzb{nuO-pca>J@WCqnB> z$O~x0|FN=aie7;XRHbn}ki5=k)%PubLM1JIvyL9V9~cJ2`JVCdXJ~W~YG^bAub|(T z<7OH8F5-Nfy~}|gO9Z%_!V8{1A|1H;HNX@tg30j?#oLG&>d}I341V|pPG8rNuNS#u zv&DL)4Rj;&E3Z#!g#5l4n6>5dE2I%P^NaB4ocSs z@)*<`H^V-63Rt-%=PuHo+mM&LyXFIaqNVAdzxc_Dg|HcT(^fpSPQ`k!#fz4a_+g zB751GGDNm221uhcdd-n4LSG&yJJTm3d{`CqE345>5e4w<<(&OT_Lr?b)Q}yoiY0~} zQqno5^_3vPfpkhu-y{omq#*O>86ypZImt+u>AS8=pWK;^Cdn|PljU+gUFH=rLMWRp z7|cSdOt=>Ab^@PjHn~@Gofgk(M6m2$Eaz*3tTYWy595s4AGO)v*W68eZ6OLZsZqpy zuAK)Kbhgx!ixN)TK^`EG&p0hY=hIc@O6 zcxjANY7RLl`A2lSpC0>C;FEfe8YMb2MdIZ!`_>NjG%dd-3_|>ZB36CkX(3EV#9(`J z_|$Snyt;2@93EX*8H;9xGyC1;>_eh?!Mm9+_XaCC+5${c z40w~bHlAV@U0j|FGH@=Br~!g$SveP;ZrM% zB_&Hc1J89tuo{|j(RtKeGm8jJ8LIM*)W0MdUOvxiT3=_{VFKW=PJ81XgJ-|kUc2im zLn01`>QO}t=i=?s{q2Msa38TuNTy6)!6AJ76^;>KLwRr%$e65-gK-9A4&^bM&0fnc zj0hDN|G^^QM?nU9WVZw@eo3fIwOMp&7Bz6(ypy~!ltZ%Ri_S-Zo7F#Vvq{5akw5l} zor#lO$(R&Moi=f8HN@&2Y^^MlI`R#bI*R7ISW5QsdFn+}J7Dj+&VnIZ4Sy}n-}X@r5v zoi6iTP_69`MGsO_GBMz$>fZEoF;=0^!qDwpg8Wx*!eF)hfc-hU%q-dD z!^VbPYSFvh+|hpG4bt&jUJW62onVh$h*x}M>yvmT8=@t9N*$w%&Ou8dr2UN_RgvGs zMmUF1N|FU1`^>oD#?)h$Ugk#A&J0n2W%#jp7P<+GCZ=y((lG+H-B5t~J-paDWX=i- z^wC2*MHM%2AlqCUhxNAvpD>KiqMTmblptd+@AI3-H@&EqG3pSr+29vm3z|00rU9Sp-xYqjF--=R8Ih%u}&n|J_Pnce31C>+?39!)URw;Z!6 z9<^EdLI7)X>MgyqC@hxva^`D_ub_JpLt@OiD9t7pMJ`t|Aw7`9F|dPE7-k}1#1VIaGo20Qb{;{?h@$)rCf~X*l z7OzHxt)*-sMh}zK?kJxCp|K6+WmR&Cy}l>o+VZWbK#&5oYLnW7zSHnWXwO(IU{4#` zh9}iH-nL4?&e}bBu8Z~3khFjOY_N4=VVmFPf_r8oG==%R!qK3~fez7;DVPScmWYZZ zN(&%Yb7Y?bW-z~BK)xu{HQc-`&MsaKftL= z9`5;VSU*h(u~~o7O)}S1&427ZL`ZMmXn9>kq#$GG<{9`>s7y194Vd0bbsv-!}QZCnNnP<#}Rkw!ED zy;;p06nkfL*KR*1@7)B@^|4R1O6K}HJ;&I;!B@t6VQlj@>l43ErO}G2~D>VJj$faT=A!Ozx`v zuGD(vR$Sq^3ai_daGG0!VU4<0HjH6>D+iXn325YoUDb*l>(?{Wr>v6D@jU?-&F=v4 z;hn19qGWby-(JdZRaz<`H67KP@73aTw;O<{9ACamwFnLLN+vgc9XQyj@IKxO`Gsis zn@u95pocbypJww-jl&7Df1ELhfWjs8#Te?v4Z|Pwqn1v2L=b!U=wNJV`$?T{nRqLX zSZgRG(NBXwNXI&_lPB+UNj#xu(o*eC0#!OFxs_LEQL)nf#ZEj0x^LIbU5-qt1Gtg0 z8eqSw7jdRov}8X}-%nS^h;^$E)2K{*_@m(Yl->xW18-i!5Lu4pzbq3+aef^1XVt z38Wtynp5c!FbIN<+z5Bq(G0}BV~0K1Q{56CPv7KKz75^K-fdNYUzsJkBhZ7(?{r0N z(dnXktkZ{IcFe^-5mJ7q7hDi@A*HJ;zC>t|Wz04tYM%YPCfcqWvL9XbSM?qUkJH~` zIv$t}{!c2Aid4ky*M{NyiRu)(Lz7!iuGCeIcns{0YCn|;d>(GDJi5C1wz0(EG)`qm z6_(rZjDLwx#GYK&+*2TZRPplo8sxnTvts_EGwA3XW18JXS7=2av+*3SfaM5NY)-PQ zF`4nQ+NX4y_7Y@qe^WJbrC`y7xx>#w&Z)&mOLP22$Jywj;~`}BeemVoqWIWnG8=|d zf(|@awjOsO<1=9`xg+w=-K`L}8<*G;=9}ccO4lVv+bLOgyNcq(>2+i8Iuwtwf7p2{9~iZ7 zB(TxAyK|?;!-y=+Bj~+j_1$+V)qA>nXaWtf%%@J?m=oXsEuJJ!hSU_X z%VJqPOY#+SSJ%mj>r&;Pfl_qbkdTlEVsHLnJ=k*sLK+et<(8$sqK*hQJb-s#3jXts ze@0YseVydRC9|BcZpit%?YZi@H;L<#0Dr4n;Ah8B{zySttlYS{KB$uWuMa-Ngmk+j zQoyg4_-_yT*CiEyPc1xULF6Kw6~h0bp8B`^!#})i(RzUxEv?R%J^5>u8Tk!_r`mYF6{rZPp@c*0CU(+Ox zNTx-4H(a+!`di5G|8R4P8e&nTs-@)1|JgSCvq|~qta}h5X2)adcFN+vFD)v>4-qb? zO5OZg1qP>WioC!0=coSb1>19ELqkKNcdnBfe>oKhX22NV!(FTXck+~EPc=9i^dHtMb8h#o?Xp{+N5u%p@SvBWi;A+iRaI$lNB zRAC|djT4%nUU5pNB9>OR~l1G*$AdEvEikcKn387;MoA##4TaPaNynqXiw9R~3) zxpEp<9fmvI@z;R11bp^C>P+>Pdy}O!S2#6z|Jan;U2`zM-7j2Na%zP)4Gj%lSb;pkE@!7#%6u-w#n4|&nzK#P_n4q z)|A1a4OtR|>e1%@UP|-A3{RTz4%@2uL5r*T8JfZ2(49^ZZKdv(gFW<)v|2uwv|yO5 zXQuJ6c<0O+&ER5FQO!xiT~LS$G<4|HPav%5!)m|2b~v(|(M=!Ee*#{+s_^7?A!F2D20pxBp%kups&-Z?m+$SNpHWX=EHxW;ii^P}B9B>iK^dWb+ur z31N=+BmYm1=D!f{|B&1Wl@1}Q(_FfF^#4*U{kf1wC{W>u6GAYYL+$H-Jv*n|zs~PU zq2l8|k!}B3)VF9o|8;%`{LKGX@%n$d{+^2$vS*1h^_TO?CW>5CR7C%TiG^h^+bM%y zvfnvZ-hzT?%t49lFz}<@#GlFTn$N$^*k_9(XL^6J)LQV+al~duUGt`YaJ|o1uT%X| z;lUQ*M6UDx{g+*)K=r}FK?_UETHLx~(LWuIl+9lQJ#6>6?l;`kh!aL-=2MC$A;I$@ zKAJnz+eEh~?#!k`)eh-eJ_B5ssTDO)w}S)I;Z=~Ct4u9B8}gGUPxet(DwGWII(hF7 zzuy{-V3+Xl@;*#OqM@b5C3GoI*bb22g!x7?P7{5(uTC^xpGNd`P*zs{R8zx$x(_Ad zDNUd9ZGgJL;!zL0w2N{>0SyWV{T@`wJ3`n0#XoaE(Cum+3_^@WM4qhw_ND*+l3(MO!bG>NO7hX`X(d%~U+nC_fN1!? zQQ<~dkyCUg_$K*N-?(X_(zF}bsTJ2JB9kVJkjT5fbzQTzwUsbcDDo^zCngFH2^sf% z^3%>nQUNGJ!)j*)+QZ2F6qUptE5goe1(Y;ie-Ve zjn&|;Vog}SqPA(^Q>$`5koTJ>J5k5?4Uc(nPe&}f_p8wg5w(o0>`IF-3bEiv1`j<4 zG*X3xH8frdqZB53ac!^-$xHd{4%jL7mz0!jL)_sLn?Rxs*(+}mF9d3 zh~BT^RJl>K5w$JHQM zqLFL!zX0!ESY7yF z;Dz#016P#rzP`MSkbafMheW}z>sKDegeu(7K`rtEL%{NN6h(5j0kb2Uu(qGl?X_ix zoXirODlNJ}RO{$sX$84xG(`N9xVE--{R2iCnzsGJxmtiKosz7HG6V0O$S8cYSg*d+ z3+{qNDO{rmYIh`9<%qs_YdWPSNRcdoEjA9_Aqqj;y$psn*Ev-!ZVybLknO%B!QHG! zxd><_N;na_tfVBeqoX5-*Y!sYzDB9DT?h^W{_pB;Wo2dG&stpr!jjsAx6=t(M??H! zmv<^PYjOR?>ZODLt?Py+ySwSlGbop3fBfj5S~*KMzpPEmgHXO$n|Y0p60vLi@|6K` zHI;C&1y_J9){b?!y5$R;Lh<>sX5vM+Q<>}p2UjIi3h%27YYumlw0;1gcbV3h5{hE{ zZ^!FU!Y7=1b!{hfCEz_NX_5}!Q_ASRE>p$#j*t#JtyDWZ+vQFE^-1T;t3{&KbRo>6 zZLQVgGO}X+)w}Ws1~20w6B(ku4OM`8~TLlRd4~X=9(JIoC}VfzJ)q< za#SV}6@*dvNDunjJrh2E$PJ;8+n$Yn20S^eW0gF)u({7LzJwQ8A8q&=HR!(&^Lpx> zkoGm8OyFmN2ptZLJw3n#5R10)(~xcLJzAq`r*tB2mgmJr%Cd?S%@H>4cZO)H$3_g` z*RNkYP)7aYuAOd==ZXvv2XYY1?akLiBxBW{@$gjX)pR(rC~@KjzS_?ufmi3Z_8lFL z<}v_yR7%$XP_wJzci%05!a|5W-I;SF>)e9~MjOvX3CJNrNPX9m}0`#Sp$l=dx&WoDzo=)(y3y zjI!l`yJOPb>bTm!8xCuw^twK7)Mu|6)HM9;fS^%SqP32HflOmm?gplOyy@}X5K{|#YJrUAJ=t)Yln-`W{<-P zDZgzaK+Van&u0VLbQ8FOY@AleD*&7kI%Z}qn7Rzki)_PO+~kco6k^_U7#U;Z<9gG4 z9&|>cVQx20gR2P%#N?|qr{h0R+CKR6{CtG7=$G~Yl|*^< z{7LnBXk_IiFqK$2k)EavtA4;Zh?4TryI|_PRb9Du-Q#|kXm#_L(ZW}Y1RMqKv4AN6 zXl}-N$|3*SO{4~!lKD5^LxT`1!%&&V2;GU{s}y_aRC-mEz2dlyQ=}RchG6S0d&o1t zvwDVz>h3358mE?q><9licbA3ogheBGx@Grh&*{NW6!%SM&4dtt2tNjx;IMfZ9y)yp z%H3Fc8=^=R_{D)e6Er@F9$q&jK8Ys%>a1HCylfC7dKMoN(tq$iVC{;6y`;@YvumQWO)rbRr>2Mt6k;jw$ix4#gbE_}sAn8;Va8LqLMMs26=o5NLPEBY#r;5i!o zqU@Fcr7N%89!v8u#9_ZjWF!F+`BX{EG@--ghTnUjg*Z677Ed$gzLDUj>;XkVY2ftBk*q| zh(;U+A5QaB@+#1*iZ*WdW8^4X5$z22+fr1dVTh(23;Uii3ihc4s47^M7Nay8^qtZK z*vG;$qF9kGgFKK=3rSnGA(>=!8#8sz%#@ycoDEkS$p_>jTq>nf!wOEDL!Agt@FuEg zNyEuw?<0Sz4+wbXzTw)|^0v<6HQ|oD^4YGz{p{og0%QoSs|cE~JYq0{l&uphi1mLB|q7SHz5q<9u64yj4Ti zN?dJFG(Z=M1fG`_slZ#iyRoo0!gY>hvZlE-?DP~qy7ic3E*r)}6P)0qm9=Y-09eP! zh`0%agA*;TXvSoel{M1i9sJzj$Ef7_moFNE(IlXlw74`Q(@YiX<#k0{#_U+k2W>RUwJ$`Mi{wD-Ao!qK*IaORdKiTC9knVZ+Hs4kb6u!m_jzXP$gO?j_PM4+va z;5+SQ;m=2RIl0g4V0Ze*9!H|>r;`aE{GQFz6oFi{PcV?NH|)3#C2QSHSBz3Bvr%EF zHW&4oeO0XjcIw(;p=pBBR2e{J-OkNWchxxj{h1Ky#7T&Wli3hZpj)I&K4H=zQX8PE zEZ;q%^fS}}=#K1U>H58d^6e)dzDR}0p#q#ntkEoY7i7!nbGqh!BPfhK5{jjlCMW1ZOt<=@1nYI(ChdY7)azWV|*l2!g6tM`vg4wE*4Y z#FLYgxy4nkVc}Ioo=zcY_fmT)n&-i}B)w0u-JYH}{VQM{9k{mK`Y|sW-;PS*cT1KLpvmpAqbU%48nwnpGa&frwa#q7 z8LdcIK3=2RaE1Uck|6Z@ZgBu#%p_JN1Mm}>>U*VKeFd_`^{T9<0O&gwEU{&$V0 z!3mXt?eTfwjzQr`iccT~NMs}~ZaBpfN5gKg8wn7vD?&r$I+Pg3cTQk98ihRPSW4V3 zKZn03GC7RLWHZ{XT2hS2{q|;IvS|;kktdpA1E1)un>W*DpIn*_)N+s&r~^Hs z%~rV14|Kd1$#?Z3z$@d+$oYx79D~9VO$10~5IrF$wQ22LiL6hNTW~jiC~zDD%k0NG zUumAyd`HgVb^3wa+mSJf=&O;EZ{YivNce{oTAN9qjSP+*SQaY*(Isb&}1EdtCu((NJEmA zE8d0q@zRbnJ?D6}TPOyr5m_a>(q&(p{>>XjMMNt;p_E5dY34J(;Mk!+hUX{u-{M4f zmlqitiA2uURC~x$f@$TVYIqOpcG)11%{0%UP*>R`*B2gCb!)M2Q*x<2WD(6#a#Iq5 zpY?8$SRk4cC}K&MC=y7hgmicp={J(b>$#A`#>R>d%M$21fC!N15xC`IrPBoI5~)2} zH1Si94$g|`wH85xmpBTAaWwQn8d*d%9xN+78yP)22-YGRnubmEx|i3Sd16Wmxh{g6 zK9oF$=scw-03O73AOJ>^aCKd4Jc#oA5}BCE1im_s_L(~iZOcYbvx)Q%qUl1C5G}F* zjAgdJ)o%aY8|Vv*M_Ay8OO40OUoADgmU=rccXpHQRn73D5=SfZnlOypwU0OMjBX&; zB5qq27za&vj<7ET9D-u!D~_PMMAL-N#QtjuuPQYcx@H9nc~Oq;fu%Qxsga1PoIMW% z;3gko{D=2%$axbWS!$l)xTaCtmcj(5PL5(8moa%jg56kSw#mZ z!O8Z`jTV<33zDES6bS8tvdb(>8pKwxXcRWg|}IGc!*_$$`qR8iWB#tGQR7(7Y4I9PaAy+zh~_dwkhh@%AWM z%Jgz#WZ_cTg^l+qWjB=uu-yU1dpd}-7?SNKDu;yg`X1IJcH9BJ?cud+gy0+m3hkw- zO1m8Tsa+bis(@f=WS@-|LKAjunmqFgk)ha?OZ_;afz62zcHU+=an5Zt?P61QM(cBN zehZzy8|=HhvIR=fdY?>VUZ%P)^o4}A=mOX~rDc~!BR!AD&QXXz6NEc&jQ*SvhH#7~ z+f`M;DiF2GCCz1M6?<1#Z5!U#Fdr+bjqD_ zbae1C))^Wgq{7DR(iN)?_`~>*LAs9Z%?6bDkK+nMLim9)06N8%XrEJKqBoH=%;&)w zkgdoNKZdAiBbIYd1eet|ebs0SyyRm$cYjzJ3RW-FToxu#Ns(3={ly;c{=6<5O}Q^w z<4|am?nmztvZC1==FadwQzHif$zBW$Smk*M+R6yl4H0AYBB^Ig_QwPrY+p+3~7C60AHVm3M%Cpc(6h=?Rrj)fd<=HTOvD{2p z*wQ26#o3`xIMNem(*?KSn&Z_XMjHGj z=fXz%R!sX}-2)uZ8zR=5i0+lA@k!DGvL@k2mqCZ%&EpYA)vgcMEy)Tkc!z6mKvxS| znbX0@pNl*(OIxKS+T&I^y&lCfNAJ*Uzgw)M-An>uX! zlJXvO)YrSw>YNSmn5(+S^}b#!pyT+-^Xz^1X>69}QI|&{*yYE%+46#QuJO&0?{~g* z9h)YY&oH|adwwHzPQ{)6tIdYXyfP5Z8}&uow8)@m&TUG{RfjSYR9AE~D|QltzU~Aqq>OE0(@~6$#Fr(~GqK$KG3qMb+=^;)%* zv>+)U&45V9Fros|NQW?VcMJ{E(w#$hH$x1}{1(sq?!BMwe$F}XpXd5rhd<_G&6=6D z);B)=xo_@+K9rIxzvcTR_KVZDy!{qF5&OCIn^k-5aTI*TT#G#|qttf0FT0ve&vr6B zr{QZ1WVdT)*ICFy?tvMOfDEfwW(18kWhrrfAoLA$pX z^Z>c=i%(}4k%-6rIm`5L$6Yy3I5pKg}8>q5AEhw?THB3;7wA-(&0%3VfW z-#3MN{?}}zuir_P+{Xl`4ftX`3NT~&Xas_}CO%{eaF4Dp!M}BPve9VO+k9`f{`E-9 zfDJyE%t1c@@BO1PNv8HSwbF-0o*iB-1GguIHJfbAw^NzZaM@)CiHnZjW)}PDGU0~D zt`}rCH1tK8&#?>`SqS<{QvVR309;U~s}xyA+!PisV_h^xT>I`RE57l}@`EXHSPXbj zfmmAQeG^ZK!5lO0*Y;pqzZ2>)k=Ha(dHK$JS4=Q~P@@x`Ac6T0>%|n^r_izjcQ^rA!Hn(`)&bxFHERuM`U&ezf{cY@Q@L}oj2gC~T zKD$F8EIjhl<)Vok_YzmZh;&78)yARxukPOV9{DsC!&8!gS9u?_F!;Rjs($i!X#HON zyDPkZ{{c>2@~rmpgJ^OHZO&j>@0T#Q84K(0TmvQ#!*^m0cv)xyUdqqBpvjrsIQ%dx zk)o=t&HIK7LoTyM@{qk#bm%sxCi1ML{{wCd&gBB8&O9Z z#8Du(+cJZeACw1uTpIlA8JFxZ(5FZMw`j_ee{^S&y;9%57PCiB5l1?_J7@v(S4ygE zyRQl_Ubt1pY*cekDwg8T#il|>au3-XPw2wOyQAU?wJ!hKnnvXI(Eg z(_wLE>rX~Vy>2cX9D%>f=D3O0(2b%%8((=Wm&EOKi6^QY0}{-}H&iQ|R(%iP^N(km zKi*Yan?8F8>+F>kx?4^HMm)qzLC%P*y&FsazDv_+rbOpss(ZS~>Op4JYaOn9%iVNQ z+$@2`;_!na|6r{0^LB!kYkUw3^dH+mx4`hu#Jykno$gzPl8*Qw=$0mhbt*rsu%g%^ zloLX{auUn}GS~(1l+)nvhw1QMj0aVdsqMmrhVzpo{O`dT)=ZAf7sct^21Om6Tt!%m za+{trg>;vg@0*OjZqdLKSW|PoT^Rq2sunL~p1CN$Lm{v7_HDU_TT@6mtV@yPHCX%< z6*E8Jp&Hi?0C?om#2p{;#EjudckMn8s4+D_!tpVco=YM%Hd|}Y zz`_8reOr22;yZbp?)LKt3_}~9} zN3C9VTQ22>)87%-tTB2=aNJlkV&+Qc#8%|wtx29aONxjO8s#IPh>8lbLV%Eq&lKq+ z{K_NWUv3A|mvdXLX3l+;8eCPwxW0X2F!}bA0h1^jpPfAM-Bam$eRe@lnu66nXnFyi z*Hm*sM*M&I68RUGeTnYWm`_7lE3X8%k!}$PGssR@i@ZvscP~YEF$@?^d*ld_Tp=#d&XJa)|2k!K8sf!UPN3 zGtTT69-VY#){CJxo%@(>XUY9w-*@qnmnKaTP?mvkJf3<_?9n3D)j}(_f!(}<+- zuOzy~>X7^=1HPk`GooPH%EL}%9kNT#$vAVBUzvwQ|Gjy-An0UAGIu`fyO`RhZo zq<99dIgMK4RDVbv5J|r#!7ov?Foux4!o(k2SmlLGiG;ggS=EJj>_l) zTqpXof3cia{uE}xGCtfHkRm>vWUHUXKAkZY{ldjXWemyBs^5j1B$=QZz+8&B;O3K# zF78CdM*}Wnq{PHu0J7v^9@8_SfFPE2V>jHk_27+BEyK2Jo^{1U;fng10i@&K?Tm*X z(ARu~w=EuFj_KYXmhhqsbnf4ax3_?6^`>-0zstn2&yu>S5| zNpT;SF2y?ap}SF-Pr$(Q;eTKOIG8OO-}Y^+>5}BbOx2Cr2!EisOBj=E_`0UntEwD} zbhU|z{~ucCO;)l;~DfB2ARzFZT-PTPBt%me90bTU5iRM!+n* zNcIl}1&(D>r7NRJtpa9?KUl*6#Ul`Vmfd{EB0{iMxgfazk>%N3nBW-_{^IUS$*f0V zB=pt`K$ty-@#9WZ(}TpA69=Kj6CpR~WhyZ=SQpwTi7Iw7WF#w^3=nW8oj+gv7^(ir zY@uQ8+OzRIUG^gb@`s zsJ!Hwjk0bX-+rNUUG3Kh_rIsxJ=vo;W<=#oZ12`^-U!!fZ7ajGFPbPNhtmA%Y*q!Q;=i z=;K4ba}~9!5i=IBi-!E+KbW1D(>6D@3pC2O%u|okwD}dnHs0iqCWL*%sERr!=Tq5f zj67_5<2RO|n$^i?PB76`EYC`2%=nm3_iZ7aX{v}P)#tNk3k?ZHFX@SCIA+Vq0|{xQ z=O}cA#;3oL!V2v(V?uJ#Dg0lv@BdqXWPY1?eh>1B^Gm#Ovw9G9T00DI}Hy!7A7$r~P})8bYLn{f7(w>w4@G9&plktVzVt87-#Sc_EjB z;yaBW?vdot98~As=Re?Nu_7use1mmxPR^%I`X2Yo@xrLUyG?EP7sl?o_ieCYTjA;z zRK~PxKws*hL!NEx$rgsx7g~vi_In(tD*f?l%!{DcDItvioM(hq-`Z$wSITwU(?M3v z@)kFbM8X-1{d$`DW69Pr z29@&8XEAv&P1fXKvF$alx~}flZGQZl?E{vI`u-LytttEFBiX9!Gqsg?#4>xYMEeP) za_dj)_nahu6pAvOUr_D_8^lb2S{i#31p57LTW^$S#b&oV7W*+ z^JiRT310-EG&D6=T3?7VX}Pnfo-!jxkDP;Hi|nxglIM4NVmCdn^Oaa06JKJ`;L#w! zK)4~fSR#hoFp>1PSW`dGm98OMW?@fttGhL`c*nNwEF2k!wIfp>Q3*Z*N4<56@?o+l z)_ljKx^Bw3WMZ>LEG-A)_U`X}Li&sAX?x8KwyV*S?Xhx*Y|`ZZo|`i^C$-3JNRO_n zXE|kAeu@cFZN4QYwB<|Mk&1acZRV$&;zN|KdI;w}%7|%A^CcIEjfjl^R-3Njtcaa( zVG`)(IksQ15GD+-KFr8>>P61Iv(ps>x1}6sVH{|7GwmRIiyW`P_V+r1S*n}3OtCV{ zifwC|w(vQW)2=B$6ycY^l2)Ec#I=XYxEBXq>hjavsxvwH? z#EBm`Ba9i76?)aJqkO7f$qVyn(1=ZQA0QOOpGDk~By#V|DX^9>ekvw#p65-z{X-W! zvGfbxWBdCSM;WVA#*u|6G94@UBd2EiL6rtP&029Q#<9XO`_YMaHm^+?4|S-?9vb~> zk)yh3_<2MB{6^VsP%KvA?OH<8l~Mi}(e2e>bW&;ET$bN-E%br{InKZ6;?my|WZz;l zJJEEh0WP`Ez5XQ07~l}islRE%N;0LQ_}pfKdu{TYXKYs9OK&B2cVXZAv;hEdSq=C5%Y=mv z4_V_xl3m9qtq0Jo=^=&d)H5zFu3r6d!%KUTHqkn|A0HJRrIaN|1WH1=>h?b$&9>H& z-~iFN9({IBPUovMZNIB;0l2PA#=m&s6+oU?U`zw=ifl@j&LQX+w@u|EK3_~!6gF-q z0Eqs!C!VkSB+zL4@aRat0WjD^N{FgIz>J$SBkGXYq07rx<1uw1ZCqS304We2^v~S$ zy|#59|9sZER|*QxQ#8}5znHszR1$vlckLS=8m?Ie5?oTX+@DePV0A?`mZ>imzgr>0 z-;4rfXQ|JwH-g8Wa#|aeH)eP8_JBssBao`CmwR1gj`&=2?P>zLA`k-ObKEtlK?6^c4!DIB2&bHBttpU9SeYf^qO)(&_6se$J zqE0#cd26)c-)nb&B7iDTGVd30Y0A0jb%o>xorIO=e*RCJ(-gmH1V&cT;P3Grq}OGM zEUe-&Eo+yV3cwSz5-cIl4`xEA-!+E|3K*vBe{nOmL6;bvzVO8Ox4C*DZhH2t-j#Z) zsOx(#%y`?!t-!6|ZJ8K7q-T*JPCEhbKJM z#?5b@IzA?opsVlt@Q>FG`Irh>l^V2&#Zwf)Lt;B=sSPr`S|s&X*?yi_CvRQJ1Jxzt z$M_d~;eK>iP%wj1S^N#0-fG3^Z^?3L@3vRu ze8G}dM(sFs#4^V;t+uUKG@A&1Sf^kLrg(2k*}zd;>?iqc^Ul%F#jjv*HNEVJ_jpb$ zLBcvZAv6iFvLL7Q`WcV{1$25xl>~^8X9Kr>A2cXSJ{IX zda&pswELjiW6WHhaUh7Wf!DbybL@hUuj-PJ`(8>+`uwwo{JByCcNLvlXAU)>`Q>0n zicoC1?t(_><84w>(n78tWjonzW}laUkK!l^^T8uG259ppsvVfUj??IclwXl>^L(Y0 zmLZ{2isf$NleJefGxNoZk>OI#_e%E-L=pD#;@qyPtTSW`=Xlye%l5=t)WB5u}ra_X(SdVqoQ*zJlwb%Xfh znRcKK0LH^RZfD5AI|yN(wAblo^rFcGBzb}|IITxT-R#a8+4J>|IMtIW`Ih3g=0el9 zj`@|Hy9Y&$=-P@h((W<4mZBuRAP=t-l7>S>RAnSUtR=S}LtRh@cArhvv@h)yddB!>@+VHgoQAbIBYr6Uy4T8w3YRKag^oT)gAE z9pLZZ9{JskA{sm!nLoYggwQuMR=V+gxUO`{+C;Q$TZyK)8sG5t^Y^^u#+Ob9RL3RQ z1bX=kYsy#drpD-BUVYX>Wp*~)3$KFl+GOlNdNw8RR?Lq1?G)ZDV<|AbvH;7p!S4=y z*v5oCTeWNjBJ-NHpy1+fApU6hO`kaCh<43ydl<;$&`XPVLG2?q5(i!D#}Pv6GDhVy zG2pf*u0Xr*(%Y@Gy9VoiMgXwJCAuwYwTTVa9( zB9J=S9@{vC(^aDDZ)_P!@4}F&gl0hWx`q=)^YB1@Gx8eS@0m#@d|Ejb=TMc$Y8U z?aTtnq$+^Y?}f5F33W;6Q>lYLPP@Ci?E#W+kr$*LGK2~w+bX|a9)!@-x5OR@6L)`C zH`O%tm}3o~68yk$O@3GdXAJ=4&{f7nz=?hL#a`_m2&gaZSTTV#O$$X!;9f$pI$G>Y zl-!dRd4@6lvyh)_sx#+kOpbPMI7fH=my(j3Up6R+b#R_QB4%n6!onmU49Urr+LThO z@lPrt2p)S>evsEylanKRP|D~icVjrP>6885OtjwPx4or%dmePOZlYdv^3f&vhjExF zv!pnOz8`L(Xt#pa@y4{3y~66%c%p`(lc~fC&yBKmWIS;Gs+)Yj@c6UVS41*`I&j#rbJ!leo4$5a4D?5O7wE_XxZosSkJAb zcdlmGEI6msMc?xcMfERC#yY9N$-4i_R>1^DqP8+)5{-@_oX9>5-!BqiKBISz(HNiF z>L92z38kXH&=W>I_85$@s6D8D;=B->0(Ug2sK;cTYDZw4(5{Ug_(eaD_oEZxDekqs zqGpn3T1BMj4#a~-t?w8{mUBOCg0pC$vh6{wHxnN*QW%QHIT!SPY%mK~g%u`kH#=N1 z?*z(PGmh~&%t6yrmv1PqqR^4luMY_R`n>leKC!8^g6#~Lem=-mYmG1}A_`}7cdZDx z>T|hdM9(3&1i%&I90u0p!TIHsvaBp7JEV?_I99szMj4YG$|cNiY>LUR=tWu9)ixSM z^qc`6!|n(?8-Gm0k+L`{tygF_n>$oX%dT|pTs&TI1}fflG#|irXu*EO9l^FfjqYNr z?T3<2szS49*P1A-KyrAM3pHnaiEA=^U8`bF8GUPFt{Wj|75Z&4l!IF=M^8>)UAeR&BkqaU z+Z{n~r*X&eb5sfpe*rZbl#h9xuY2m2n?(d4SxM=7x>X`pi;5S}9&1E|LaYO1Nu8+m zD@|9qoL_So@4aXJ$Aq@N7bg@FLy*2WzLr(dt6Yv_)0>TJq?LWb&c@k4D=d0tP;K3L zHhtMC@S!}~HYL*7S?DB9ZU5TIXG}|c(TrzSqJTrd-G_I4aCHeAN{4o})xqY9l;&lS z4I#KUYch;S^PbvI=>=L%rmiCx81m-BTKVv6yire$dRcEe&6fd2eEM1pmO)%@nYhvy zU6(~Am>^UY?x=--sYAcmI6%cdK5Of!O{GK{V64ItQ*&W`p9(c)T|}Vi1DMWKxeS)~ zarrFco^#k|s)U2`*uvX22jn$_NVtcdfpuPS`1+CDkLR@vuisFzD}7sLR&h5iUhF-u zNqZ2{t}6B;pOE7p!&%CN-F2)Iy!MN&L{z!CRAiqO<2^k4gdA4CCPzkl=r(#mVj~K> zl^i^lsOKmyx?gsuS=Px%Fu!$BcZh8Piq=M^1qcT&AbiR*x>uy}L!cuU_~m@glT}`2 z?8IXmDrJbq&5hJRPF#o+tWVM)&f}2wuWS6zEgq6Ck%Sqd$7Ftdyf(PC$H8>PV>S~F zMxy*+WiZi`T<|G$N2Da5r3cbmXqLyu3TN*J&CYtEbNI(F5;T^hb~ykARlB&T@hOMC z-Iq&4Hp0Wk9(dK|YmA?vR!_WfjK@36crLqS@mCv!iWTUNF_B9{FZBL*a&QG^5M$98 zihf*|Vqe)y0cu4raB&q6D+@ARdY^h>VzOf{QG4La0b^=S9h=5lq!|Asrp@{gty@Qe zQAVF-UxjKJPwkL?54c3fj|Z&2@i;A6+7Y7*7ar~i?4R5+#36q9FA7!IarMz^Vm761X;mqU8Ap#H23hMv`!L| zF|P(1+UBtNFU0i(H}k~dOhsMpYaO%3b|B`m{QlIatsR(M{hU|zNAeT<|Pw=ah*d_Q*{ z%rh`QIh0j$_F^?z^B6ls}n;qh-O}@r?g2<&ef~|Q{q)~`I9|6=e8}X9* zT7kC*>n^%0`HdBq%>lN4p`~KzI%)Qu4i|AF%=sqO(X*FybcgR$r2>_T*eXN&Kz*}r zO_u1|`ENv=>e&`Kcil6umU_*ee6eYot4D+!?Z3TDREOeJ&9a}PXE2bTUMQ{@gb1hL zqv?-+81(slOHLiQ>sBQtIsZFh&(y=NxmD65`3%O*gw>F7MX zEQem^=<}OKUiHTm9-9ta!e-0syLAZJ^zE;>c22np;Np5m{xRj z5MP`l`~oD0T3}1sgc*>Z?1Wrz8{2jbYe$nVy6%F1a4~1CpfozIQ!x1G^}>$ri*xo< zF{nu(=1USA>X%Q}*|R0{v%?ka%e44?rqFExA88Vm!8uy@j|y|j;(_+ojbli0uTE>L zVXyiEslytqSGk7{*X-MPTy;cPO1Pt*tIuJU7=%KdvaE-XHE$ssU~Y_jl?eH)R8xt@ z^j1CDD=;}xr>@R@_C1#_=P>+YGrkY?6Ll3@)5q?q0knk|vQwnL3vE{bSsxnIG=kXo z)9NKvN{k~ew(2f2rL;N^7AX$imMa@5&vF6Mwa`i_S2DwcC027W>eo`)hWp2$CHkH4A^f|6J~pUNk10T}%k5eqJ%SVh^x z#U6pZ6!sAmL{RjeTxhuX0ct2 zi-BZxy}A_tY&TuUciCZjbw5MmmEj~3?tWvVQ(4($mG%Q=)IZTe-uf zXZ$1$Gs~uouJa4`r6s~~g zC8&>QMW=b~w^`IpQ-v{NE-lek;+)40XwEC0>E`}$tvNL!(<;ml4FXoXM!zYRJdG|y!_R`s}Q$eYWnJlm_#t?TE<_=!C7 z!@n=?2T;3Pfe$E~?>5l#ct0YQ5T+r_-w(tR2P!Qp5O$4X8mn(>oeLnyGFSz`Kacvv z{aV)Hn>g&^?VBnYlP&h7{!y**iX0evFup-}D-TpsaM6xhuPWmZqVHAL#SuCOxpC+T zw%Xa(32H$?97ap{#RRCaa2N(+u#X$faq0h%*zC6ZUVXi?aTu;&9Hl?qP}7Qh0A8e* zd60EquxE@3QT@K-?CzB-XZg4v4fMVLQX6DD#(M5;?eUdEaEsf&t*J|_UW4=XM%ej} zg6RWHe%1VA!w|QI`h!@*DYuR~RG8iDQ@oFFJpJa-d2r@P<&Tu8?JDw5#W z0lW2Bp}oyjT9P^W)3T+kpwj^PC#Z_6rL?2%Jv&rHqOe!GK6KPD7Jbm$;1$O(?L|8! z?&{gk&P&_lIaT{{KOXNm=0>;|620#yKB4b2Ln_H_YHFI2t72)H0~|VK=1R;I9H*C5 z(ArcnA-AmNCeZKph?&;r?pHu*ve;2cby`}hQq;gO%vU@Zz%=|J;a-iEE(HB9P5h4vjB0uTbhTebM^gg29|X0X6L4K$YqZEtEZk%dA`ZDSEY7%SK>0eY}TF+K}-MsH+ni|NhB~Z2Id-{O6<{*GZ_p$hlhaAAhUAG>V3z zJSy-ojdOlc!Mn(p#~wajlmkVy2QI-Ockp)VU!2Wk?6^do)%sm*XrT5OX4#GsWX!hD zPzsreY`@IBvgDED6$5kBr}cBvmzJlzu0r2?qqS5_m2~YYd`|)kEY39fwrucSU~?EG7DEO*UNFQ{xm+9j(}EpgtKZME8)5MYkD_gMdItlk}QC; zj=7VHrDo?!+;j7v%V+)r9+8CbbaPPXKep(9?NccR4fg}>_J&+OlvdS7dzhopHdaY{ zzfq$qto{W)qvl?A*_y#ytH3dENp;}3PGC{D^Wxcp^To(L=LO2=5KFjmvn&M3k#GVm zeuEe4>Jd4c-;*qXoXi^o1G;E^L?gd8z1LgCKh4wm;_G|ZZk_&%^%jFeB(eE~>$By* zmf@fO9g}+Zlp5acb2il5{%QTgAB*Q}dVg=NZb3r|&wHVOfIE}(;i&^pCz+5Yb1t_p z)Nja>Rsq3l$&*5$hYta?!qwD!>dd))=^?oug82#(hEK;jR?o=(x!xu0$QVA2B+T7+ zkowo{{P`bXQLc-(vbIOTbP8XuRg`S&yjw4uyS@Y$BU*1W7N*2n%y_+NXo7CsO#d>N z%JHusH6&x%?v60u{mZWUuLm1Ay-l*HQlG6jYhftO+Dr@C)4%_f^2kAmX!cqEw||?H z>o54R0j7Wo_Qt=@*7cd02fs)pj5lg*7Y6VBb9Vpo1l|UZ!{!24n>Bv-^M7;u|8kfd zdJmWc6Rx0*hyRoX|8>{@%fo?$+c*p-nUzg?|KrQ7n_%4zyO_W;sriq=`Cnb;nCT{# zT>S=^oBZGR*55t%f4_GT3(N@!*&NIH&q?`@!Ts&}_40tOvU8{I!T#U;?!P^zH;75% zMowrwcV^)K>Bs+ZEeX2^*UN48j>C(;OxFMQg8vs!i+A%ZZ(NI5%<8I{wT(@AU0q!Z zguPw%_b2oAdRpwVX8{@(w`FK6SXdOA}}VLw&Ychd z((!W)-3_TInxliYBuT~JO8nz5QvZ6hQmg|q`Oby%jsE{sG&sk%Zu-0>VcB?Wr98>J^isDP!L`#_O0A{oYUIEqWHxZKp!`KImKh9?fH7l$@j*@#Kbjg zWo1R5O5tjAb2C3Dr!ycRARqWsxVmpZsCdV4Z<#RNZ{_XpcX)ln7cdF@lzhX+ zS-9;Cm84vCk{X!w&198*8hEyDQX|oCXCLR6&ds7219w(eax$_zcGzC4eTmj49U&E4 zMU9}_-o~!m@61wNvP$UOmj9@o|BSa?vsGAjadClU&?zi2Zmiv{VeeVUOt39oU0p>6 zC{|zC)BT5N{s_!P7r2G=Z)BJ^=;8i=6yYS0b~B~F81UP!UQ5Djimd9<@w^RrGq6(9 zL05L2nrOHfE%N=T=F-e%uZWz)PCbE~&X|{(!@!u!evAztA0Oj#8eOhvI=ID`fH6Ii z9OSf@ASsJS&RGs5?ddd<6{8}`|9H8TBvSux>Ik@1Ib0%%S5_Z_{zi%oFk@R;TkimM zVkOvkWD^1n2f;)(s%?pmIP!#9@Y6YHWBtWuUZ!c2@U&?8NQ5r@+!=)y<383=_i!@zyxwlR+B=17h+(9MbfSI&?%%kr#;KUU$E*Oiu*_8?+%)9=v9 zWPjQ}Mi$xW*+*xg3IL7Pp9aJDUW@Ls{0z5AJ7?+`qPSbOBk;y+w`5VQydU0X?Z*j&JJPJP=udi6dwJNsGX}UF%t@}zOp37|BBYpK;84)*yI{QV!r zp@(rMjmy=7g@sPXKQ=&~GQTgOo5v>AN*H&%wE?KYOEGkCaPVMw5|V){%yT1S zD|eF^#kQSZ6dfJiqhh{ z-_Y*DCwoylg6A|IkUj!5O?=TVtXp-db#3@EVEQ?7xMKNe%fUQhwRq0MK5eM9bYSOQ z$L6+y-tTHYS^V0DC$#%+{+o2UKD<*Uk*}0K|En)i1l$$LirmAX_xQn6yg+ZYHcq#r z42cvoZmB5d@(2#pECRq4x;UvpG(tm6uYXu%{rLEbLIylyU=#zCv`+wS*CqhwtMhL4 zny=|R5UIBUkdW}blU37XCIQ$0o7QiCFiNB`1j8qwN2|Tp*)K$4bK>T$_W17 z&5C35YZK*s=g{W&GYp@8-uT0!`*@<08D`T#;}CRpoFz`608Mn6bwe%?LaP*Tv9ZtJ z7#iADPJax9EZ`a9baaN`j$a}guXMB5)mKM9XuOb*`b5HC10Xy|{*p_{z+4nzaBs%H zpSx}%LKXpsbWf=^nxYhOWEjbP+^%Ka)E*RrdVlmG{|I)u%#66DLF=PW^38qT`|dWo z;dy}A$%y*hAg7fmt*MxX<0lEcmTEYg**gRR)9;{H<4~|T`XE$lfaML*ki!fVbA|jK z>e>2Q>_nsX3W-3l(^*;q#a3BR+=b+0B@pJkKcN9AZ=z}z!etjbop#t+szaX?5k^G~ zU4_F)b%3HiG|BG4ehVQpmye02`o*e1qh$oM@_o|OZ~_vXq38P0tCP;*g);yGBU;~S zRP)+@okiRvc)-l-cirGLy*A#6c3OP3x__-Z@`@USZ+97+X5XT+$NEiGc;93S6aSeM z)A75K`%_5xVe$M(+my9~Z0YVK?s;Z$iN7&3yj&y)qc6`H9n(H3$tIBVmR`TZsF%7Q zBq^6m0u-?m`s{~%W~E0>bV$Bqo>gATF%E?@O8HJyj2l?vip>Cegi-Ejg$pY5HI>8) zxWU@y2d256>D&>yq}Sz;1PhOP-!eYd+^arlr`|bR3au=H>{v76XGo~5dX@C4SLvUT z<*~4qJ8Wdc_|6ZDU$%%(z%ZBQ9@`}y+W<;}Q8xN00(RNz1q2Y|a_Mu_225l0&7Pa} z;JkRKDWVqkDgmj(rnF>pJoj)`4qmHEhRfobqa;iWZRmJ z%y-COJI|J7%3HdV?Ta+OE1+9SpK#@F?F1jy{pWU(5GPaNme#bL#h_39e)?kxU=HXp zMsruYE>aRKx@Rw6Jn;E=UDk#g$pVo^6W6ZBTPwaG(>xkkifE>Y&c5X zn*iF?$uBIbc{zYiy3js$ZC=R5adDk?{&Bi*O_8Js?(8KXO6}HByDp6g&{16f*XqsI zIP)aR=nv{RTL4ImSGLS!`d$TvuAHIoY)q^{>9~@(Cl=?=-v$AV>#s$2%89(DN=#&N z-digA6fcvsNIy64D{pU?Q8#7q@tHl0uKa4c%-cwDF*HF7#?{V=4`b7^{4-lgQ(=?H z-z(LB(QsPN)uW~Gv-5GaWv7VG7Z9*r{Z2E@RmC}CGWSP!8tZ2`tCt^$Y-XoT&Alyc zoZ3UWp*OV}aTSU->MiPk)TxhI>BvV1=!q88RAA22!PTxNngc(ICdTA<8|%(zAjWp5 zS$CE4KkY;Bn-7z_q;m(-!u;8AfX;v6uhQtV4sp2VA5-*_jFi~QBw=v^b_P{~rd=c+ zQK;WMyWqz8!L(zki#2Jm_yx48=?g>m!n4+G>A zDs4)x@dp>`KEDRk#(e-QGUZh$mLM*}hCxxog_Sn{Q#(wKpK?uQ()lg=vrik8r1(^P zRvI`*7NYvt_mopX0I}Wbp!hfLZ2!7zTtKF`GQA zXS&C_f@Ws<*988Vw3-^>+u`9$x%HpT0adwRF0uD+`PX;G^7K!`QiLE9HulcP4YkXn z#}37&TVpD1@@p0ONmw!m^%nO5L?5rJj_@Z6k{OR@#NQII3(2_>zHq!%X?@ae3xMl4z;naI;RO6l!c8lGee@cOh&uEWgrK0x`&{!&|BEOUem@F=Wm0@mlCB{x7i*Z) zK^r-uABsNWE^HsKSk4pzCXft#fco*F`Q8Fuu3iSuqATt<0&4!Jj+$-kz0bwoeAEm1 zeKk|CT>E2P39CZCpOLt6z0M`%@X?-UE%f)j8GYnz>kedU7ksHD<)le?1XJs=WN@)9 z)hif$pd|eMVB-OE02Cvow=0TWib%F8iK1#yjAYjzGQ#afBc2zGr8q_MdT7WLw=6qX zWxMDKuv#RkXV_;S{g8tU^J%_uKkQ^~Q8NiWQ?u(9bBvreE|xtSjPYy_rKgW(j|hy` zzmB-30oC#Ffs^G3<@*b%cZwcstS>yo&Y*LhzgfEyt=s&}!g{<=X|}l!SgJ(PQ+vxV zJO}DX)(0H`<bgX0y6}|Zsg-i?FuSIW5lt+(V!;~k*D(*PMD?P%=4E?*7&l1A4K!>_pNxt!@l(QMfIZYxpFU94HQ~j&B$d?FGK4rGitnl$cINR^)QgKLPgR3|77w3PS#}C&It4(M+^%f0KSp^@ zL0>OQBmZM_s{pp+t>d<%iQmrvwxa}*ifMc|XKfGYVlZ^72zq5*yOEjD{LvIp8a9Nf zEMaPDYR0nk5Jv{pC>jn^vRm@Pace2WKF(uBhV)Y`j%oA#O}4mY7J8a*hcY*XfjkQs z=auE9YybQ8CrJu(3Sg43!3SXR%Z1S973gILv|QP9k(l3ceSkZxams$vL@L^Fv*JX0a?bb<4MW zV4#}k-qD!nFjGyTN;H--ZY%^KWyBLFw!g=(?^2G;SRskEB4jy-O#JSMQ~bh;Yg@lt zdZRz&?|gACY~!<+nxFnum0>-AQ`GXn+f=@Zj)Q|N=7G9M?^|$)m~(t@+;e8pr6RABJe7O$ zn%^}#S*r6VUK!qb?V!WzdEu_l@D!dK$vXYZ8(%O3~6eNgPrk8MvPsybl- zR6R4ka{%H7lYi>MwQTpWhH}feXAnzupJZ3`J1jY?ymyND(w0v(O?7G#^zLSHx&5qXxotv=9zry_JF=rj{4-3uv2E2E%!$wwtW|2h5n#kNehathcsJace zqu+&{H=5z+1DmS_jzj$a9NC{Y$iI1q_Z;d?^2`D#2?=ZqqUf_FexTT$=&7p0iKd*q zCbYa~0ssj#zxG243Jd%C05gSq0w^7@HbhO0D|VMb4kKXrYooHHPK))V$^IRklq?#= zEy6X0HF89Ezu)s#svdOQF8p|oq9ZE zbKsuIrfxu?+?__d(>-swQAvL}f0vOvBjb?7b;#lJa!tHafvbMR0Fbu>1|}9D`+NYt z%I}pHuDrhMf)6A2pQ+c+FLNJcoN|$CYOsOxzNW9SKYcpDdA2DAS(lOZ=U-=IZfCx8&Rvq>2tCA+@=s0`8nvo^PPpytJxFD>~mUB>` zlxf8H055Z| zG->Fu*D;Nbn$k@sv5tcddU`eu)*BffTMbG|!E_RAl{xBJQ)|=q%r8r{gxE>@YPf+ zt(qdy6N6*X__B7B-;*5glJS<$xyDc!KC|S&{mZ}3&_6Q9Gh`|Zk9-|!#N-5o*^VFF z;;d=JVycEOE-oS!HsBZPaad1uo+*0xd>%2&_6u<&^oiwl#!t+y?_>X&%JJMFkA4R) zLMkL%WF{vY`VwXM%;<**K@)c9yQ1l}bGo`b+>6E2F1AIqy@2EbrT^pJXgY zZ|9lJJV#_&%aaQMK04TaFK%VznP!HgGPu(`^fY*>^^_E*y3?XJo%*x!eF~_?&+`;| zzxVl35?_|!8=Ev9my6mwip3Nz=$tSNA8!NH=H9WJR#08txkr1yML@qFY0%Z(-BQ2! zL&Sp%C9{kJ1X6P)4x!3-a&Ptr|I@JG<_5Cx1VN`g>VM;qi9P&~jwN?NSa&fL4J+F3 zZ@8f%7SU!s)qS=vj#KjXk;;0ceOVB_9woP>f)q4l<4!*15jJ1ovY z2_xDQg+3urXnWAK%8ajW}_qmwo=(kExC=H@9=TPhEttG!xH;_a4_Ckhcw1 zj*j-~Kd=BU=E5l~dYls-{xaXkt*b27 zZ*AW=ZXDF-6?xGt#w**;xUu7e6ihVO^IzL>e83A_5yYB|xdQU>%!afP{|e;`%6T_` zu~ByTJ^Jvcjdv$VLK!>s;rf65wjfLo)$k#7{9{PbigvZ4(C_Ip2}3f$VkSpJFRInQ zvjhLJe1CfyF`()rN4C0}^7ly9Z=d_u;gtfAUBS4+L<#=KU-^F*`M+_vR3_3~wy*^d zwE{f;qT*v~%LXw^)vo#VQ>`2Zp(btUnk3PXortwX!OjLN@(x8hW<=|jJw3t_2KG!G zC+qm-Idv)~6zclJ1}0irq_xT-tph#J=rf^l3j2IlF(KH5KvJMbV(3x_x&%D!!fUWik7xx=_I04v zb?UUX$%``jnL8BdnAeJq4jkNnyoVjvJ94;jBI=i_tP*wvlN9zw4HEh~3i3_^AjTdi zdtKFneiI<1a#E;+JlubL2{g$BS4dJ2&QYFTygC*_oV#*Pa>9ex!X4z`z=uv1kiE`g z<3cChC-?_CG`b$(&hxhZ&hrhuI>Tw^{*2I*x4MP!xIC1hGAs}h;Zfo5pac(HivXv+ zIMfjxYe<9FB!L4Vixp==yAf+k_CI7l7Flnmae$QF@%0tpolasQdB_cpkb^nC>|0 zgw$o$!!3wUZ)qz7@ zQe8Bd4iJu9=R&i(Ym4^N9nPKo!eh~O%7^Z&R%ZDVg=r3xg-<#HJM3Y$usT0r_T$$b zO6@KL;r(#s&=mfSwUDcD@RAUqn@V>~Y9|EX{%cF-I~73TdVlB9#gAEI%rY>Vx^v6b z6P%L*bRE|AMMuCha=L*G#tn2m&1gHUgO+CGPbw@MDalF5M)A-IW-jIP?xq)Vf!|8>gLC6i%e3ElEaj%b{duk}1hHbUs{`K_z&cCNi zzuP@l)BEDMYDbOlCQ*TxhC?hs*n>%$?Hue5)fUh7bMEtuj^f_Ui|Gd@6jE%g97T`L zq|JOp+s;`m!7CSuz9{UL6G_Pur^;xaN(QFAoeWF8p**$2Ew<*i9uQ2D0eq8bj?nUW?fwdAgS%G@L;Yx zcp%YPOcAl4lw5m6%Mx*)7k%jBD}GMYeclU@HAvZ%Q%!-5`NC9PHcY@sTEX5!G2k$~ zV}Dov`WF_hQY)m1o&Bi!3!+1yWP0adj2I|?P$Y_!&3*$`T(<1}fWi6o*+zV5VatWj z>vTv)!=r+xk?NC_vYw3%=l%!IK&sL~SWvGwofMA{Q`*zn$JbDO(o_aW>Za#TK2;DY zp_TrM>cLO^u_L1}{>s4HPR)TtIDPBF_>iBWen}qPs;)MglY;d|G-;3pipAu-g6_P~ z1@*}qk(y!uZ-U#-UUyGwEI=?PC9#genDOa2k|w0$W&Is%Yask9S52Pa-M_T={7s?% z+^$n{zgWZ1O(MQ542c13JStD-*X|FE_1Q{*4;bw>!Pkf0(+3BsEhtgjEp~o;iC&?` zAebrj!Tk>G9Id58H-EO33Td{CuxkDs`O^1_eRGFo*&bEgk!(~pv;Zq8e#jUgW&I*G zecG}ayY8%tkH;FAm9-_Qy5w;>sh7oJxSpw5Z+8w*%m|Nfv<;;=M}0}8DI zLD6RRjS)geV(l-zb34uO%pWaj^1-cXP|xj?3=jS+$69R@dkwFd17}(lKugW@*v+q` zfc!F+nrfwvlls*|{KTp!pmr7!%(r44p^6{IyLI~`RRwVD!Hg@ydsT%Dd}qxaDcBeG z^R5VZ`-;fn($netd)@`7rHInhQ4^!O-ef~K1wIjnnO1^z zKt_6N7_G4lgQ?zYGEO5$=})z{HS$L3$tXkbX}CSZ?FJWX-+7o0J$lB#reLqrxPlJ=IsEClyJfU6`U05 z7quDXv_HQFeUaNA!=zG&R<^*RJ*#`8=cntmr%@9xGrwyD2IWtzHsn5S;u)5PA{=>{ zJ{QR|1fi0UTwBj{Tq_`#gzl^h^#SiZ?i(R_AB_`a2)d!-wy~*amN_S4=eWl02&)&V zg-x#)SkcaGq&GLc@Pbt$Hl3#$Qrwfo#xp~yeV&!xCl3+(&Ob&QU*AZpUpAp2_U;b5 zMNVC6BWvv!}HY{_u_BHZcJBTrM+gG}<12cOQwlLy%By0ZU z;U!m_f<~H6USy}{G$-rT329yXw6FGN;gnKmB)&jIiiI_K7%UojJC}o$m9;G1m=iPT z<#s5zUtctaSRcEyu0A~&_1Y7j3Y8@*4W@lwwL1sJ3^CueY*eRWDYh9cCn1{_EwzWz ztX`z*+Pb$(y&0Rc<4>xcJF&l>N>yxL*dQ@6}2 zPxMl{Lf5uanX!s#j!tNTKNN4drkc2xn%95@z}(96JpBrG*`$)UuA0$kOKmIZT-l<) zHQ3g>?F4XNCI}s$Gt2JJ3cGeEGu~Uj6io{nlzv{2`Y56>?^Se+kmAwdvKv8C_y%{~ z>Km~Rfj~dEimiE*r>q~shrEhbi*<+fq@6<~OaqBSm`2omGecg}00-fuScU9M+V_&J zK+++`f?#{lfwi$~fmqc`_;PKIf8S_-OG2Yw|M(dxvr?Hvr{T022Q1Cy`&_9~nC5wI zZit^RoP<%oqC?gpwY z*u*zT5?h*Vjb%_{a<8dus`Xw;ScrCQ7wh?IB*W#*jhyu`)s`_>a2}uTK;*RdD8UkU zzq8w+nuHB*+Z%$N_1>y9JOqY_zDvKUrj9O!OT+zaRC0Ov+6dH8cMC^t%O$Ei2^38f z+t6#Mn*Q8XDhvT-GDVDmNJlJR|68Y~F;(d@Qt~6Vbg1QA%)yS0CVh5yfC-6`O@D0+ z=vmH0fLwf@hAgTa$yv5CAuyiT+oZ(%Q_D+^MYC6-V`^M$yKLq+;$g#^`TQW`1NeILeG$$)v&d4kOFVe`*EJ zk0u*bJ=BW*8ZANcccgnRoaxCU0E6Snv0!8_4c+?kmVx z((-9Mvnlcwn}7HiNV2Kr^+aZW6lPjcwSlg=lh7FSP#kG4Lwa@kzNN(gY-AB;*;odg zP~Y&&NHS~V3-o;pB-!{;P*wQwGbM+2a?=SdwHsjME9qcraITz9@~8l$+_eAeo80T^ zRs*HB!2sZjHp=YY*VUpH=_H!ux$OnHHGD>(SG~e^ySegS<%|J5ik;C1Mvz@LeG*2} z?b)}c{#+FcGglb?I%DI%!)ZYt{IC&W`*l#QuzHD#Y6hD2zsI&MmH#pkTOkN0zFI!usf3bO1#z>&~+w8{mz~E1!T-AWIP8rCdWn2eB=#_0A3{c1~4_K$Q0GQLNVz z`=rici7V;px`NmR{?~FjV&z_{*`oYaZ{JvFvZ;gs?60Nr?uBl=*zn9Ct~%YIgOFkj zj^ig>tv2#83v2&%1*>gjVL$Y#ikMfKGL^}#m|GzaDL7dXg_+%Vfny7`6qE|~ zK8{50Zk|)Jkt4ISWZc}vrRbOw+g&v!I5#Zw)AOf1kxMlGTn1G@ZRJ|dNj>ux)dx0E z_7324&tjyj>Jo47qUKCPe9VweLiyWL(mfJ!lEpa`pR}>B_p|}1<9>@loZ<0&;_TYz z9JF+g%|tsV0$MC28Z4zvB|rGVt3PwOwPXweui-1*H3|v(NRhw2{Q{$@y{p)f0Ynd4 zkScRNd`FQd;ptAzpUzRHeNWLmx3+LKiT_B~+W|hvukA#l*an~UBlu?#QOZ7^!z`?{ z@#wv_=o@Ip&|M(PtX$$W*VwH+s_4P+9NsLMTG5C!0POQhneP_B4_9p)-@Zx~5PFHn zDcJ_5CYe$ufk4YPwps%uA=&ljjH!jXDwG?4xz~Ksac7?i zPR3e7V>72YkIBYUkm$=#&odi_pphE>!Bi?F2iXf7w9c@#Vy&`#c2A_`Hjsf$3ED0m ze#rCY1?>}I&`-j=&6~)l=6Q|7t6>QiiUI>8r?z`m7Q&$=1zefJjG zSyBh|28e2kdT7r1CAL97e1L7i@=HJ_Cg$@#T(t$e89laQooN>ojPwe=v#;gvU(k5V zwdL_8$WKLh<$KRpwsp~!{kUq60PgV^5$|+d9-C%{?w+UH;A=94&~gQ`pGs6h0}F>d z_6%U5%7{C0Y~tKrcd|N5oR;;i&W!X8EXZ)TU0@zlD=y_d-y&tSKiDepidpl68?RLR zPP`>!173;#P!j&u0=Y825(l3L^|0XK!lNzD`}b_^l5;!;h8{|AOAvl8BOG5iVgfDN zXs)HRnv*kF+;9ZFO06yOQoQn}89z_*$JKwPaZ^`*g-?&XukUAj7T%QO`S{faLg_CG zuPgh;He-EQQf*>_X^58ubmxsL(P-Y!rH=-&ERK;g83LtC#nz@%8eZU}UYC!0)*SxkDSKfO?E$4%cpzRs1{%SidpN z9Cz$6K|(EFF(TtxvFt%co5W+Oq!*954WrN=9HxFWnn&JYXIvi7J5o;$3Zp{hJ|e}wiBico(QW3Q{;$T$f$UvVh8MmH!Uano2^Aoq}T`$ni za=-nLFFe(|2Up$dO{o`BnY*A+Wz|##c_at=Wv+_WG&nPy<~5X^ILLwByR9r5y;5r% zc}dwofdgm#^b53Io;eTAeTjTgtp@cexjXhGVxIj=+D;!lZoWuhyU!1rdVUd7+;ka@M#eihia1y4 z;#jv<1PXMPP87s`@a5Kw#CXbCL%B0Dfn~ZiIUF2IAlV&+|P79u}DE8L8_=KfrXXE+4w_!{1x=JKL@? z(mwCknHug+5}&ZGX~&P}s$|=C&s@=+ud{$OS~|tyEso>gBY<;bZEn0T9|)v`&KJ2I zel;YyYm+dWdW$FmF(44QV<(p4y#0O}kjeS26hH6SSM!&26ix3XsIK>9G&B3lk90D{<_p;jbg4>Fu=#m3U!sg~4= zvs6HHMM-|FZJ#2!#&0e>tx4mC+FtX?D(tL>&zgyd5Oti^{3Ed`B6chH^0dFSv=r_f7Py8y6~|Tpq`Qnez8ymM z4u)#blgh@C$O0k45DKoo*a^wnvj;4Xv5mO}r#HaCB9QUQ7S)nA?Eqlt*@Lys6}h~c zs=-4|S#+D`&kvQ3BRX~=08G(sGJ4h@WfL$Mb~6TXpImmN(xEsN@pM=FY|lruyUF_S zls8j3mGSSR?tTYNe_D`~a*`rKLuN;&4{s>2af^x(_~~PBvoGv!33QfNQkMtX3O3bv zA&X}}7*-NHQ;DW*4}9IrT>8j{vd)1YvI9mrV5huYXz%T`Nc;I1jETC9d-k^TS_K>R zAR>MAwyA%9w=^fCNu`{jUV9hw6RRV^1fkS+0#@4Rz3*MR&g!Me_UyOSkh66zu~Hhv zuT+dKsdTurKHwXWmNMvG(}Fbph>(_kve1^1AoWh>Vn!H%C{E!-D8_NZ%<7<&^*I#S z6_cd1Xck98M&6A3>BQGu>oZxj??^(PlZ)hKFCUSwi%N)z7ugxPY9?Q?$L~5F7ZiOb zXeXMswGZ2lvZWSfnZ&(*Fmu}~UbWD&ZASE!Azbtu=XDHC7>z`uxUtUd3DX6iI3erh zS|V{6(Q5gq7wpR3TqE4AHy_%BY`U}9wY#Dm2O;Lv&TEnS51r7*vECVH* zE=Z8Ub=IA~S}s`S^ynPEb*}fZ_p9C8wb9X5Uy1%A^8q%Z3kn>iH7sh6ahO;}`dY+5 z6}yA}){JpJ9;8peXQk}fa-4yOQ8$^6<|7r?EMWf5o!O~otR-(@W2Ml-hSqQpVJo4$MaA+W_KjhBb;A+EM416|nV|grb{D91W=Kv$!wnE;Z1EQZ@=rxZz#s z_*o+l^|V{lF=w4ce4{{H<+2G0BXDQFJ$V~} z8nPc>Zh$K7(TV8>ATjlH`Y*Fosmvl}wDbZEDR3hqqWMre?n=yd0lY!VjBZ@IV??a( zrRz6GIGvr1$T+)$@K9w2wQVPnw07<|2wS1iGMF@A+QhPyadV_UWC*1OGfA(D1Dc*~ z+S6_t)R-Awfxe5$1@Io&kJ@z66OIxJ$Li-is9&$g0$xnl*I!7FpHn!es#{X zC~Z=fnxaJgru9UhtJ}_O2+;mTaF9~f{s>9$07xz!VN)LM8AuBrJkqe>q0PA)cm;2wm8_b%qD^*nKmtfNI|?2AVchZ_`hLnO67e(+SYG8MHl zwM&Y`0P4d5fw?ZQIq)tQMUm~MCrcu4D?7vBVNJq`b4EG$c8Y4Bnq)dgJlQ+1 zOTZBSXtfIDRcUxal>S>Zve=T)z|gQDBZKkSC-myS>R$xL&(5x978O15CUv=%O!w!{ zr1)M_ySPk036pw4axEGp_`KmJn6(x9F062#B;>u%MAjGqAkK$YaEnA(x@l2qa!!lF z{{F1ClQ5d%i~2L!gqYyG&1d0_yuz_Jma~2^U7hti#M&X<3xzK=_*OgLOnT5vieS*o1Q}Ehl<3(<`N5NOrHp7xk%@i# zxV)qjB@60+--%@BCj0&+*Y^ktwWkjd(l?g`Z#!QhAWJE{cOxaX3;K`B$e6rlK9nv_OYKlpZwn_H|+g0 z6O)OE3eNrC3dvI+eA8-`H#hfB1-iFtTN7No=f?vm;RCE1I(byIo7xv@? zC)%UOi@%!x-1@rclCM0=9NyH1aNMd9|LOS{W+kFB!GPW~TI@TSS**~lpL2TqAZd6g zT8Ig~K*h~#fZZ@&c4h&-nygUmegx(^6!J`5gU-(J<5~JTTh7~wVUgh7%2Lj8aUYe9 z{@EX^%R6nzWdQ!4`CbSz)7*GCMl@E)d5Sl)gaMKJSl9($*a@D1Q%BL%Pe#c3M7Z)JRpKH z+ca6oW<(ocd3LU%*tg156p{z5ndlYAbD~T42%;IdD#@perZJj0iX$7&y}ia@&~W}zOC3f)zY2m5We-X>`# z%pt%>XA3Olgv$ zi7Fx(I4j2Ivn_~KL?|L3hGl_k?xI^xjq&xD$KmFa-QCMo2*IGvtU@pn;HK+Et5k0U zj9iRtsa&6o28hB+PlzFvFT>D^wB6$sMkVdEjkt*_JjZ5!=|hm~~2t zmRb~Zc;tz55?=6@HbmR3M{Oxs_vnE_!id0nT<(MN@r8Mh?p$?2I`7qb@Y5L*+2 z5&V~Gf@k-359bzL66O|-T8e$Qy+kSZm+jh+qhYg^72&gw@&CaS1DVl3XLsSdi}ske z@L*s+ZbW>&e|UCrZf~x*FiXN}l^i*bTBMT3h*ZVc)p&^OPI`#1JC8GaiiO2FB-oRO zBfm45K2eW0$2ub8{oCgZM3ij zudc^q(Rkg%YZzwD2(eo1XoXwHihc8`ME%+;>tRk)Z5Prq-RdbE&&Wuy( zC3f}$J%Yu~wX+2J^vJVj6Jq(q(--}ysunk#E{+b08=l?b`;t)l2Uu1n_yf8BAI|*G1jM6BM%X;s{09z$Mr#!n*TdhEp}$4rJbi8=U&?t_nVv0WwaegAQBc~fGf&B8Y}w6XChO+c~X_g?A5=PB%J^N;N&3&T~1e|lDjksEi93Y9J~VEua3}Y=eoAd!Mvj!1$&9d~<)>eU7Y%&Kd<`6TX88yf zc6=FJ!lU8?R52w$oWI#G5~^^0r?6)(zdH1urhHx-Zcqw@eZ5^UTLG2smnBn&jIFKP z5Y#xI$aSd~OjI#nNnS1rn{H#coMS5KpyVf`;wKR%zhB>SoK?bio{f7*i!ekKfGZjRAO zR83PF82g0xMIPnWmTJd_9~dfgC7mG#cxog}Yc0#Mw1p%nt^myGu`;KzKA4U3n>DI_ zBFnSc^JqS{aIjUfSu#cG=3XE4`(_2Zz{b$LglT^G=QWsNy;p6C*pmgm27a+m!U7X+ z#B|X)w(|mmZ|80>rYm@oCu=RFbW98g5ds-I(zJ$q()owh#~g?8S%MdyLtHd^1G3~F zV%hi^`+n@RZg~sWNZ;X)-;N~a`-yr(<})u%#a}TuzI>edc=SI~5dUKkC-A}a7nLm3 zU``#-w6e|{87a&yq8$DpXSfPxJbCAxMSwoo8|F&5F=ARsjX$6=W4X<%tVB}L(c?^r z?j6PH6*bMtY>=s51{~DkT9Gj>^OE`UMY*im)ymVJ2wU)WL#(Uundk`)WgHK%Em}~f zA^$wHr`|K@DjQ(jr=iK8l1+c*U`7A(#&15&qnzY@Bn4gJBy^sbQ!j(pFqB5w)_Ob( zP7Lujy!53JbR2LuaeH=BA}@AdcS*Bfb_E2fW2@lyEk%fzj&%CFkao$7%o>vevnm7Q z*pyU@!Tw|7Ry7+!rDi=bN?Pb%aIOiC+qS?sBYn+oV00oo-u2oVUvd%sV_)%|`M_vu z*AA$nYf7dGY=A!po}+!jtLbW@6VLTv$P`ljwvgyuw4Pr?Dj#iG8NGn9P!8+3COqk| zcjUjtfr8HXCGPHN7ilFnY;k~mrcf@i+OXKDJOE@MCPaF(ED)@{GKn%VoBG?Ga)7xq zkS^r)nwDnhVK~7lWz1{~rV^aq+6tIHTAv*uHi0E8syPei zUz-q$(cCulu9uxeEWV4O%^qkb*oMEt`E+D!7Wkcz_%A5z;^~CNX&Z;NiRtOBT|VZZ ztii!+VH3jJ!d`TfkBjXfAFww%)-331*eT05m2@~)tVMFMAEIL-vcrW%yuSxpGAkHZ zOUhltxau;cZ>A-FZ#=1~-8tyvKWctm_Q%>?q2YlLwSJxlCqfM#wL~76!QULEfClA(WWzZhlp3xjgifr&C!tkSKcDNSWH@MBn|Tz z6N`Yiv;X4yp7H#VBcW*xRztbOX1K3kgWtKa^(Abx!t8`0p}v@FT6i+G;)!YfY5njj zJXFMW^~))hNPZb^$>#0|p9r&YT-()l__GYYYiipWi%(Tt9DJ?^dCW#shb$2NhRYVC z-c1g><#xpr(yS;I)pxh9>ZvxO$;8#tD&fkiFjU&Keon5vt){kff{97BK3$!C49zg= zA#+9Pjg3{%#7=$c@+|R31F!YS5jfWs`r=_RKsajWfzN%w&_F6`PeNDbOmT4W*feKm zFwg$^C%EtJ$h9A6%%R30@aTia+YL>HWH_uU(=J4Or^gXj$1}b=bvv|8WtegH!^#J{ zMfA(C&UNKQRcfej&FU?ns8$Y$7NqaHAIu)Gx>lE3Y^rPe75H6t_crb9a|jWzxDa4g zQMZUaHO7p-7C9BUZG-+`dEl%UM$E5&wKvayd*VRe!nFd~hI(%%HlcRU@%%!>RQ{El z?{@EgYq~KOxsEa?*jQ3ll8YjK0z`qIMGwMlOK+TMU7KTFHcZ)3z!A~pn_1Z&tX<@< zCZp+14v-x{p>mZvq~_3Mn8{&XqS2_DS$GLTe59Koh9|%CRshZ}gvP2KBhrJQ;VmnZ zbuTO{uhEdrwGEhMVq~=WOhk~Oci{^+=B_2&{LG97Xnoz^>+M0+nBDU?=bS=GavRZVt+Y=v*im`B+9Iw5>+yl;?+Rkp)jqMBBV?NRVGF&yCBYAju?AaD26;zdDtQI`?Io(v; zy6XmjCj~3+-uhjZlzGU`>L`glfm|QVqw0ZD|GlfhLnbH@H z{B~pCAAwI-LIS3st@}(R!_Vvzz$+y?dvS(zLn~tQD5t3+nd@tmm0^fr&8)}Fd8w7! z)NX5s*?ZuBdXoESnFm2Qja+Y}T_SkA8p_v$N@kc{p4N8$?|1zH>&BEA9=T zFev@uY_HW#j2#WE8E}HeWrhyPQg)LFzp6c2MPLS7HoT3R`Xl-KF1am?ejG8a-K|Py z%^RvW7MF%zCR6+R0{h$@Dmy#g8AkI#g#$BgMCC!jaPj$1DxzCWI1YE`1JzdgEMkUV@X zuROc^(oxXJg#e;brsX(Skv%jiXwU2#SG=h0N1~7i)mb+JULZEOhdF&cbn>veOQR>+ zfHMPsaS4Z%%+Pz;l0zysAvai7*j|nvVUF6QxvdT7)ob5=zXV*HI9ZJhGPs}|^T7bi z=%`o&x?67&vHI4fB_QTx3EEDz&Cn4rkl$_z(V0#JMGMS3X~SyNuCi`uTCH+1E}B^Q zN;41|`zeZv#U~i<&KxDhTxC~}Rk}x87TV|rb)>%hC=}txLK$^8r`_M{hOUk~F+IOw zwT-pIrU;TDvcJIhJ_TJxVXX#WL){oFO)T}XFV6G+sVDzcXd2;-NU+* zkrH~rR)Tk;cIrVH_)*;bF{DK*XP>IP#&>3@?ig$$Uw})ZY>?A4#?uqE8%XmHQA<*J ziiMcr;a5IG_GovG3vDv_g=H#Jp7=w@Mo01$vp$nt3f0Ijgz{?m^Q1*$xqWQlg(qF5 zN6+ew=0`rsz$6(h06iNr)9QzK8JkH|YpwJMM80C&(`?Fk2Exw^HotcMV-hNuk|*4ow#3=+0n%y|7$9{jqrYYZvN zFiJ9jQzW0e_ab0=^%8ZN(~haJoxV9*`wMwoau-@goIZ1uXXSLQ%~EnG7s4%U>Z!l% z<-Ml^3#2c)6q`-T55YuN?-z;MNiPX^i}F)JyJ8u4$W;+C(n%$%m&wcYDiR1 zOUDEw*sm36yZE@-_F!?1m~dPBNuzPkz5J9gUn7J%I(%Tsm)6TfVDe28TvapR2)Dm% z=q{RXdD$8ng!j3Pvp}ZkG=f3dJ(%xaLrUT%h;=F_>8bBvPNpXqC)SZ> z53#4&t{)~3kJ*eJp;lx9h^6>ts7qIk4S*(r$XNd}v_N|g5>q2;7MQR`1Z4`N2{V|eRrG(CuKUk77vWMYhDvOYS$?* z#>B;CI{Lb#e!|VIU}a-hs<|C|T&U&2O_A)bTLZ;Z0`|}L$r#6(yRZGWiM%4-5mR{r zprJt~gAl-(vl?%G7Z&7DU#hCosbgrBH$G{o_LXQFhdY6{~c;b<1SMH2!LkW}Ol63}i_t~6#Bv|d1 zT(L(WKr`x^fTmxh0Y`v>Y)u zapt%Mh-gnILFgyWymjikI1Nwg{5JounWQUOFf^R{<^4c=`;ed4sk0N-!BYDek+ga- zmkN;!%Mr1|OIs(=M?;BDN4b_bdZ33iG( zGkm}bR>jh~zB;)W5umV(siwQ;AAlI;^N!@W_LW;v$FYy9V?+eieu^VA&0RKUz@P%L z;HsSn%7D*CZEoVd9bnbETsR=xYWm~FBV4%YEenzDy+{u8VX}3je8%b<%ZzrKT!}&t zy#!3o?-2g3f1CcoGR^xNxG$@m(B93mxtA#TK>Fh(tE8eALr%w|?2GyUNNbe&Fl6$c zOCJD^SZ>ocv`B2oLi3xH-PV?SiVpg3W<@LB={n_)JhPr zR!%r*AbXb9#<1(B_?oa~Ga{|`zF$qiWdB}P#$%hWL@UQ{M_-4+^JPF}x_Lt~47k>z z3~INWa3XqOu5hj+7Zofq|2lQVIPLL|X$dzM1H!NS5x5x!MX!`S8hE@T|gz?6gZc?mkW$3kjNFVU=##%4~ygxGs)Sh{FGh(tb z?*84+{ExnAbcH)-mvDV^C}{BhFi&CqjQuCS$x~93n<}+{U8%frqq3eL3wj}S}Bg;OkKYT zraQPor?=VL0T@SFBuM2O1m{2pHJo6!LyI}cUAZ3po+9B;zjCMnrw0cb^+sHfp(JtY z5&BclB$x7=S}>Zz?h%cH!!X%|h{!#o8O@&Q$u|g=;TR6?O zA$>#G4G3+Bd0~Cn`#Q8#Ygaku;&PC?MA|hO(voLMkBr59GfOz;y(=CRcS?5H^KF06 zAE5unA||GctVKNi*8M%}>1Na(C*X*`Nf@%P&jvEBA)gEgM{$s_qT8#mUze#~B{eY{ zHmd)G0)MOy)Ct)-*bM&sBn%t}$uV5U_J=iT1I81S559a&>ysOJ%Peb$eM!T*rDd;CT^K zpVRtiM5En6R?q$ks# zsK)EPOBeJJgUjYYM59hM`5bocM&jW7WS=R|+E)ZLca5H;vhT_ZziMEZxV)v5QTj9d z$_U~;Z@82$+3yp=%q*vV7*)deaTUx z_h&xw0gp|_YvS>+-P1{J?8jB@+6CDaYj3VA;u=-~qggr70v-AL2Th$$Luk2%AZ>Bu7o(a=lHpbeRaOQ6zk4+x}*VRre1xYH?%-0eD!WMf@vY2`hgP`cI`uI}1ybCBtvf88j`W9nn_h?`pTkW+#k zOZ*ox9Hn*vfS90{sJG&*Xy9E##a`)l zgf@D&HpaS2REE=k$mwJhIZGJPi3c?Z(WdkDWvc1fri}?9{!d_P=Gtj$0Q$0RI-;G0fn*R^#iv(tJ6B?b1En zjfA`$^ABztv~F?kzC9<8IQX~yKp#3R7sLDW65N&%!|t|WG_%n(#Jeq|AinP+eO+@$ zLgcQ4&Hd44d%-Bqv82D~a>lz!>T(w?R^HT+5^`6f2Zy8uvg(O%f~(M^h|>JDBpf)1 z++lpDY0z-r8lt?+KglzC5M>+`re#3=}E zhG9Trr<&ai;Ll4?inKy6Hn9gdEz&V{5EvQiCP$Jg* z4@YfKMde1yoWxO9ExG007<_LCM|1tz_nXVdVs%li%(I*Yr?mn;T8gHVnL)9RS_K)C z`zSXQ*$o_<-QG0hMBUxzb;N5`TCh=&3zBD?((BP1BPZa%kt@NdcGII;-vrCgp7za` zNjtg*j-<7z&S3QjzTCUJ7OSFt3?2T06KHN-nBhViDSDsnIzGGrC}=#Pf7my)tX?KS z8D=ONqI_^zJSfRNT>(V4ksYUZ7UXzW=IR>5qWr0&#I~WiC{f=su>z&X|3I=K5IwJ5X6fM(Y}ky|Fn>~F3Hj`T|Lz}tQ<4y7E1JupATRYMf#W( zgRgIZ?~QIgHVrM*Xv`uMJ8Y){Z`E1xGl>{aR(e-uhTWsE$Zs!tnTmtxXNu_B!#5VM zDu^`5n&tE&lQHZamuCpChNbE5dVo0|w^csU_Z`QyY$W9<*_q4o(2wf489DNLO+}Sc zgVhv@60^g^!W#Zd(ZmBs_)8T#`qI2J42WO%cskJRYXfpiKwEP64c$jFRr7#0n(AI9 zA5hlaiEEuNBW=+`BGxSTL2b1XIWT>zz7SQYYT~BW#7P8> z2)&K1>uVzIsxoUhtQz9M@$r`vwy2awv~}H`nyo#QREw%FnGH%Romd2YIH{8yXEL;U z8{|53*YF84gxcLOCyA}-R=X@m;0YeG1^`vGUqJ^uR%2qLb2_Y4hy3Hn;b(6wp8%Vj z?aFi7c-Zcs4T?NuYIIwV)(62Q!7JX<4gBNK*}_3 zrfJ(K2h!B)TWf2QiLRSGBAYF(w0jUv`o)B74bP*5)5fK6+ zNRd#JXhM;qNEbsANF;O-LI^FvP;cCOSJ_?e|N3|z%+n-a=9`%_r_Gu3o8g{JvrDoJ z^G}_!TQX`j?!E@Tmn?np%BX~PgSI0W`k2=w{M z^3%yF*s{Ae59oRFIrSRFem+G`3^dKvmI-C=_j2CCEsG@^4{l1Bl7#Q<%;u}`)Glv{ zN~p`GEwz0Oe+w`Qk~2Sb7G42&Bu(Tcw{t+dlX=qtpMWV1Kd$M!h09TmE~n~DHSD0-D|hl_+iNh zw6k*Xy!)a#2NBb{p#4iWw$r9>Z7qwJlZ=XphW9*HEHHGEXR(cEouOzceq2xGhL@?P zq(rjXj8txF+x!s;3PBsXD;C2H6=|^)yN_3*uxP!4IRBZ-mA>ABs{9iYT}ddAvYNd9 zL%!Xf^AC^(m7Tj^(S``!D*1I>AJDzhNjJ~PxPFZg5#BmmCrc5w^n8X2k-6!0c>9t% zyO|yIF7@So|2UdM{unEHoJn8uk3@V(Eu{eQgBc@Dz(;UvmPmY$6u8bzn|T$GZicKkC|MnYC3wXf(TLaUbUE7s7UBG! zg=JXPc1e_F>2b(Gr^+;rTI+rBQwR0ch#$To9|UeyUH*SYpo> z0DHHU)8%uoT0bP6j-&TmO9+uBIA;iXJ>ijND|a!{)%7~3AhzMQW#_59kJS$(DFm3< z+zw;C5L5ZUD_IFzIw){Q{5o9x7~+J*+Dg4`AG2F=&&YK{-t9e+RzAJCI0PuSPIX|& zqSv$m$V9r~gd~fBShi>Ynr>OwW;prU#!~+J?+0A7?e=$C(IS=3vu0IB<7z?TxvBoB zBI;sVTjr??bDf|PSq-5twSZtNht+}HI!A%pnyDI>_UnDjWlu>|V9)Jc9p?R2=N=WF zxIEd|A3u%rd%0ra2rh5yc4d%b zkqBDYB=}CCuLFR1fI`0G_f8m}A&>czO;YvJHH|!mb39#2%jRq!f2uLLM}0RJ=u9$R z0Z%vA%jNjT3i`et?Xr$SkIt7hz&(1Fq01j)i~RAhqyHDGx@2kj< z+^zK`s_M5SoCw9qN(XoI`!KfS?bTjj*KxF5?F4vVDbCuvZ0F8y9VL~$iR@=QfEDJ; zGOXuRca{r7d1XKrk7B-Ys&?1AAoakH66*yYZ`8zJF5?lecGT1FR}Zf|bbtTONhQ2N z#Oid5&EmwFivfCJcgS?ZD2Hln^XU|zrFV`IUg4YvYAFhA|6irepYZtWn90T-jK ztqk&va-w+S$TN_@r8>u@h&aJwtOs?s##prUiDqlaYo?xE0wJjF!A?t5Kw(0L z51PlI+Qq(>0=dlZ?N4(5?PD5$`N10fMz14F0V(-m#`!Q02hCZ$%OwILT|7OO?K5WLHw z^S`%V1s*-zr-(D)dR}E^kC*>^smm{&<=Gx7gPlng_I%8fsEn@kM4<{kD&!Zu&x^d_ zr9+fDHCMq_^6>ztb+8O_N9?jI>znmlXY(|3o{)4rw#6GznqSyn{&;KjevM@sykDZg z+jks$Y$`p!#sT0H;|jvf_)x>kCc>AJ?JL{#Kx+%a``q!5_t<209pFDk@!)o0si7wD zc*Ak-IdCBc`4&#l97bY>jen!NQa0DOr#wtUE?kl-01+9ccU(b`5SqP&caoFw@1AjBzgqo4e!F`a0kqjAw+J*6=`K2+dFKiMP4zoxPBZjWvhiwe2|U9DenmFpwX)-J-dBtg0YLC{Pi;htsfP94=)-< zJHj7oMvtlV7^rvdw|dq@qMOC?EQE$GI|?3&zr+@OG}@`HeNU!tjg^$%&9L>@cc!hY|aIRO>&Ba^8N~h zds;A6H;$27LRVForGbL@HlOPijhI{2{HT%FMn#Nq7C$;+G98M+51?X& zAz{E-Y8}6?OIaF_+0$to?4RCvmZ;AxNUDsz(9TGtzmBVxJChuOINKm@S&q@40XNzK=z7D_PF9rKBHy=#HHLEqHh~ z8!`vw`XP9?;f41K#l>}DVLnnqhfdk(g(WZ+Rx=0RF$mRQ5wupQT?Wdn3N{2z}6PUmlW^|_HR#fY!l!WOQ zGncx<{L5zZw6iA}$$Gnt25 zxgcg(%GoAzaVG3N#iZt}L;3(WbUJ{VInRhTL5Wo>Upe$_b}G;YY1Ad@k*b2J?76P0 z`!;@z)J{pHW(pv4d35v<#Uw()V1P;aEDTG}Jh%!2y7#}Byl)}+1(d~9g|Xu>THgID zLVbS2hL+b5?A4m+{#|QR!Rh4A{@NJWQ4QZ7QDN1Q&FejdAI#K&<$x4?lB(RA+&cSA z&{Q2^jf>E!VFnZ_jI}l?GwGz8SbXkXp0r@96R=-^tjW9a_G2X`mhmNXqZaS#c-Jo~ zIhNDkA5E(ZSVKx$9+y**Yq|wMeHqFQ_Yl7(+IV#d-xq|K+;kWR(CHns?=wc~LSa zOH?(zOvBVp==Ievl0d$A1}C0lGaTd9{a|w)c6tyUgCLn?h8g*RZKuN*Ckd*)P34<| zP;m`ozLYOx=Ebqpc+$GH#QIQo2Pa2zH{9z(HHFaZRbA!w3AMkvKP^xQ>gMS(GcI;5 zf8M4Cg+uz(KX*eJTN^AuC^MG?p;GXLb?=+M9%;qz?@{5ck%+$IDra;7HTf)YvLL(z z5`=N1Hm-yPudUvA6~vfyw`?aP@==3#+aI`*8Wi;dDv9#NzEQWD!n(C%FUhPJt9?3+ zf4?xC!8V9)3dSMR-CSnx<2sA4l(5%sA+%Kk?jkc)^d1@rY&RabH!3k-WhC}BrhK0k zJ53+U3CTAW(_dZhayDyo}?|?B_Q)({H&!!k%!J>@{6p5r%_?fV-ue)Zet&+8n8GtJNH3?6BeF`v%U@d zC)#QH*q*KM2gU)AEr5&*F#+pl@W+cdfSkr}fSiBhu^3jHJ0nKSks;DaYx>6rp^5wolgB=xv1?{jK+T>gQLsq&+_@1<(12!V6etdEyZZtU``GXa0093ZtENv>Yo zXL{!6s}z5$@~f3!6x)EG{-F*2{0gbny~QXQqF6U@ZbVj5Rz7m_q-jP*hL1yC^1mhI zrp$u}53=IpgG8I<{#X%*r|S(~>%5%Tb)K zYL=gB{X`)**QOuFW*Zdq;If0=IGeSI-JsfW{kT=oNo0j_elJElp9x! zd?m`sR6!osIlQ4U`relx`a43``&+j@H&OqunfzX-5yeq!H({J36@Hq&*LHEbrK++0J==-0hZx1If z`bT?0_0LbC7bj>mv^eWG`}6cY#OaoI*yN83*S?c}onWo|P4_B4hZjkyh=)HbBf8Sx zVp-SboPB{$)jeS&_dn#Q(-KzZ|XqcaGMZ aHNNoCa>!Z*JZ2N;b6(&0Eb_Et)PDibF$y~X literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-admin-django-user-visit.png b/static/img/200719-django-user-visit/django-admin-django-user-visit.png new file mode 100644 index 0000000000000000000000000000000000000000..3c92961a9b167af72777a8efe6bde0ea8cfeaee3 GIT binary patch literal 268931 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

    n4v?JAY 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 J-nM-De*kcUW>o+H literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-admin-login.png b/static/img/200719-django-user-visit/django-admin-login.png new file mode 100644 index 0000000000000000000000000000000000000000..b117dcb42d94c386096116dd4e87484c670930d2 GIT binary patch literal 117029 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 literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-success.png b/static/img/200719-django-user-visit/django-success.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2d54c5db1d38e9ddb15e6571ee681b2b977128 GIT binary patch literal 101527 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�S%J7eq-A1-TEcZ#!I*ke=L>|H`T8}Bt&*= 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 literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/django-user-visit-details.png b/static/img/200719-django-user-visit/django-user-visit-details.png new file mode 100644 index 0000000000000000000000000000000000000000..2055153c545ee7c71b622f6a2f08854808a5bf67 GIT binary patch literal 286730 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≥QUB> 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

  • }G5#H}s*Au4Zf%+k| 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%0AYILz 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 literal 0 HcmV?d00001 diff --git a/static/img/200719-django-user-visit/user-visit-record.png b/static/img/200719-django-user-visit/user-visit-record.png new file mode 100644 index 0000000000000000000000000000000000000000..21373c410f351c07c4fabcf9e51ac7336196928a GIT binary patch literal 189507 zcmb4r1yCH!k}$!86Es+`;O?%A2Y2_t;_mLQ!7aE$fZ*;9!GpWAxG(aPC;wet-FNjq zYKooh=^pE`whdR1lR!qmLx6yQK$emOC_zBLJ3v4{Ys167K{hWj=O7^7NdZMg6{JK( zi4`1dzXGjHAt0#YjSUPwNYPOZ85$ZG42{!LBRIG!g@r{a8Tj^eO%V5W4HA!hPfgX) z*}z5HfKus!$XD!cv_y&`eyn8}s<;o4MHr(jU~S#a&%mosB4eJ*hp75CyJbTB3>U_l zfEXc-i;Ju5XSI8o0EyNLHH1wK$%8PI4P{g;`Ws*9gd83WuOTZL#~SDTRwg+i37y`3 z4>>e1CGtUD!blVZ^G+aTHj@Bm(9Re`6fwmP5`_ZmTY=g)KlA;kfRVhh>!=Sf5(ZR- zG;VvJj}NJEKjMC5V)E-D$a{1|@YN$^q#IC?a}_iTi7CB zOo^bNd=a5~8$@Bk#lr32n0$<>1}#ML-^d41Ik^!N8Bh3Z`oe|>$`dwP9c z?-#nVWo05LfrdC-)7NW-Vsd?(TOCsksjsrK5HxRjcnIisunuyrtFWaj4P zW@KVvWMQFy!=QI`w{bFbqqlJ+`)4Kpt_NW1XzT#Aa{}7h5dW#y(8$)=iJz48PecFz z@1Om20)G9kmTVmVHLSM*GX5!HWM*Ju{NKn--GF~V_NU~ZWd9h~KbzzGQyGtvsiUox z^PgU++5nvdSor?Y#{UHWS112TCGP+x4Qm}n@0iYW@@Dg09u>c{Ih*#W_CWt z|F!6UCDr&ZQWj>8xAy;w^uHDTiUoAKJM=%0!K)!Sa;Ol?>-R!y(H=3b&H_qhB_Bo;avj%P7nRwrhS9p?@ffigNUCYG94nv=WoX^wT}P!A{(Ui z$B-LRtm)bGBeU0_8QSdXe-~Q^1Dv}oP|t5?v6fA+TE($+b$p;Cj!RG=F0NlY?3li! z+Tm(`uqplEsW8AOmn<4e+XVJtQ!~m(8BPN=$_!L-rDestvB}x@G-@VqJNNYNz$E-9 z8@lT~U?T{_;Y*Xd-mgvnII>1!X_wu;p(Zi*-O&eXL+*C;_{}UCoN`RSPKyBkZd3}d zRCjm&F&(N02_5-6IDh;{>u-)cR;-?K7PS(m;Ih*EpV#X8e7q@*V8ov9_HlR>5 znH?k|w~@)yR@WiX`R!A?==_M^*VggxY_f}twz{lcIz)W7UT}hV%c!<1Ys0-RmZ0jF|k$eP$?XBp*j^Jm0l71~pen z8A|=PAg^ZcjYpQ#_wo||88`lYY%oCjYLSFyLCh?uB=QQ{+HjhhXAlM)5U~BdNCe<+{tisGCi1Pc&vVI=NN{%f64XqAiG0d&Za{ffn95eRgj%c?4ky4 z_X9|~5f)5N-JyV{YND-HQL%_lX**d#*6LuCDGRMrjjc`K?tDaA4`qmLK&t!FCq}D(=;ESfJ zF3X)7i*?expv1_+Vr&E!%INpx)&lKb?>|d!%NTVyWHrfTA_VZ@teT)Fky+QWexs~) zl2GO0HSbU54wUv*hNEMcxv|^WJPT*pFy?oMhHa@R1#?|g+c82VOnWOS}rkxrC=wViLe;*<%r>SV4f;~<| z7nWs~KYtZPN@gtah{qNYHT+~OJW1A*X1I7seT-kfm#;ei$zYtIrwl!-0imjYiMDf| z^$X~>lCnBwggMmYwgr&(GcROz+Vd=ZEn^IqT!qK{@nIJA@Dlt8@C?%wSLdT^>eMdY zm9z#?9_{T&49|Pl)avA*o=tp7d4)=M z@)V1iL3Lxvy31iz#Lv=%ExM{yo0H-$OBD7rMF%Q^6yM{ZCRSQuD-#7|@4~7r@h1%7 z$$!0kK4SB+Flrf7y9g4*pY|xewyqt-6dtm73AJ_*U5|#`@0cM*Ggq_hL?>-yE6nz) zV`>sA@LsiY->OLZKnSD$V{pT2aDU(hf9LR%ZV!4GhCydV2}9?u%9V;s#ay+IP&S`u zp^(NVn+~ngoDhNiu2jZuB6t06<)L$?s`O7iEice;_u1}M3ih$@@lTQM*+DK@opicS z&w9&5TdwYEV9<1}OAI=P(2#vB&jlRzg(H#Q6?=)jP)PkMiM-dkq>oy|k7FmRNl;Ve z?@a%ud@1Rw%nEC7_Ri!8z!7(bV|C-aD4#QOxn_bH5k> z?fvs})ErIJkgH37h3GH;A{N{UKARbo!CgeD+F2O0W8)~h~@bygog?inaiE(CbTWodYCGd5d7WX{XtgtT{o= zR48(+G@jJ1O0?c|(^ohBjf3sZ`f)X$Sc9-FzuVfYyf04h03!%guT#R>dB988y$ekQ zEK~xo>MuX$sxlEsz>Ux+g-=G=HzO`9dFd^x4z!gIm=$oT>v9cE4A+F{CTPr1@z!XX zkg)H@BJ)#5#B3WKC2lq9`PTsFLfp_;T(HUIiYyM7{PD~#N8THg(}}3&L0QPBd63ao ziAgy0iaY|#wS0HW`f|Ev0EGt90bsj$%kTUiO!#;^`HdAf3Y}bZ=G&tu+_Q~NE6cVB zew}zxJ5-UbccSEkfQ_04>HK?u1)7Ag33T$j!wq+>y}ar0{1Bt_HDbwEa@N2iSz!seDFhbbr0kTzT zjc9ZARd3!J=B{-xZqQ+;)2$*%KUE!UX5Pw8OK86G+i1EwJEPctT1Q%J7`(yHugi9P zeu>nU&T$!5s*E@`ZCYsyygcHx+?~t)$tR3`LnS3jPON|b+{*G;aROelZlUeFCQ-lh?2Zp@;+QUk?j zygr9Is(0O(*;+C3Yt1q32E*Ol-M1D?`}n&GW;vr+wrvR*Q-G~)w`RP_JCuHQoV!TE zu0E7&pMSttR;1uxR`)dYdi<5%|+aLqf0hn1%bM$}Gwei@h3eUVUHn)1M=(ToP}SXP&SgUo>TlR zt^7#|=0=%tzTtLsCg;mJPpoa{86G=e;&6F!QKjZaR}*Y{@BPXF_Vs#X$WqS65y(o~ zuhgn`Jc8P<@;m0tp3{JJF8#bOz{P4ni0Ndmq<@OX516)GQ2C@Sw%w=KAfSBe{p`5d zF^JXu>88sE@LI)kUH#hgmD%&Gqug{RhTkJLnqDo0Q1BqtYOPtF!FNlxbGLfcJ&jFH zCVuly@QldTOw7*xd71ihc(N|D)pU%z7`G$ISa%Eo0d?fA4rdtSQ_P*i5a;x<=j)4Q zTa2?!+vPapVbYvzfC^9j+Ptl*@7+Q`{C49UYGS z1AJbbb~&=p$tBNdpjTrAQw@H1wHc!rc(a(6Cy*QQcrvzNwhzl%WpMm6C%awSTY~5l zT6R8I<+mU6rRibj!T?+or#4g0`Y-0yChx|&#kk`o)3p09`tDE9yO-N5);`C^W8x?W zG{w*TuU^hXPG`Zz$9Gz+{!CD$F|tcJjU5>ld+~Kd^W9fz_~IF0ST6%^xJ#tv$>K5Q z<=hv4w{2!VndxKmjUe1-IUcHVPTLfTwO8@^gK4~=&u+=O4?EhmM){+HHlshD_G+|u zi<@P3nrko$9j`(zdr}dz`upd*y~6~2r`ET}`RY#Gjvo{cY(t8E`NcuaYbfUdXm;GT zPE>8sC6al(J`pT5X^cPtG~7(?Ewk&QJ)%yI|5Kv=nPm=ZuBE;c^ z@edeJY@%TudIu{b>fxBXa3!1|3lN(R6O;99&&ixevuL)2$k9e~HAKaDH*{PgxZ+}V z_vE$HRWK)vAK6!}mA()!36o*T@o`y2Ki!OeouDzSPT^SZ1nRFqzH^RSFIeHQXhAK0 z6P{GbBCJ>xnKQvqmBwF4wz@<&XSho*=c8K0y^N2^cwhz)N#Ei2p>XgZ5S&XMZbyB2 zXE>zGLm~ML+1fBE{;`uw^HWLp>jqmA)RQva6}8aJ=_(qvW<#o_>uYtIIs&E&06G;e zq>5bx3!a#X(@Hx3?Gb-!WBD_}uWGu4;m5v@%|?vTR@H`Ce*}Pd%uS7K>5FcbN(DCQ zca17Z^sAnoM?F$x0>29YIYF4YK~v~ga~ceM{~c9XPyi~Dq7d2~-0gCU#hxBJ{^zHC z{e61ZNUpe+y-i#E4416&%?>!rFaf()0p|&6?z?)F37Y=-QKP5GtZ%%3Db;Lnk^Jyk z_BovI!ID~B+|{d0oV&pMoR$80xGky5e2Gf1(zEOV8J84Aqb&lTn7nBZ7<7Y1>T-gTt_K-KulVhkWm_*q8)Eev8rj^#-@3#c1tG zYf`NGd^AZeP?>eswOM8jaY^yW)wTW%71rpeIa2j8n#6EgE@H+=pxq^QAZZ@5i zZ5tj#e=tTmNX@goZGFTo2SpJm$O}9U-_(9u>S7P79a&0|JPNUxOnyCEXl5zU*5)pi zRZi=0OIii#>2chX4=YP>00@5I5@K9)B4kn5x<$8aq^qC(*3}!WY`sl;up_P(5<{wN zhsK^O>yy%QV3(?lH(zq@a9%IgWo4WSP|t7i_i1xoXa7*??QsV_yc~}bEb!ibbkOT$ zxI9qZFWWf8Z=6|ZTu1xl#lA{*;BQ_K$)j8Sy5M;_!<8?&abI2kf-^F@KpLLR{8Yg9 zu<80LXR~aRl`eG|5MefNyGqSz?(1?onj9&2NGpz97{+Qj{s2FrdgQggj|CsAqKj836WYS)G zUrijzeok;*Ek0#`@tvX+c;II2AtYy3u_K+MT4RP^n=@H^f{?r}r4kDsLd|-O0*3}{ z$iGx-egccN(Pkd=-t|;g`=|7&s-bY_ExpM!Un~SF9WfW~?^0D}5(!7FbT3}Vj#k?y z!EAMAp}h%yhkcoxgF43y0p5&J5Ek+}*rDL-yGD*WU0=zVFc1n+*=J^!DDxVBn zpRlWl)vVz-VR;^8XIX#{2yw;K7Tne}05zItSMeo&C_a0`3 z+sl6=WP)ww?y&8@Ph*?1i4P)9DHy2rT?`JCIcyKow*v^MLJgp(-RQK#$arwX&V<~h zK$82)C0AO8=%iB{EyULs>|umV#q@}PBq~|a>lm4J>tppk|0@l9*!kBY()VTs$R~lh zwvuM7X5M*=;{sCg+mYjyXp zTn|L9KL^+EyjCdwN_FSI9o+Q|hPOc6sN%)t_~A2Gy@#oAdcw(y2zRkOVYSTRR7*%l z|H*Uf6Nz^&K@W;=jwI=nXr|u~q_4YaJUXWkF|#7!>;gZpeAbz}L!da3-4bo1YXZpg zYWK-^j73q*#dNov%(*UVdI&vwrVRHYv`%0?zG(My2Ji8dW7)t?Y1u@U5aceprfGkC z%GbFN){!(DawmPo<7C&UQeAUS<7B1dW#K)TT%z1szt(qK>B{I8R zUN>#J6TH9uAghbvqkH#Wq=HUCf^3>ihovcHJv}S^a5M~2{gK}Bl&=88valoT^vt;b zqYQf<01iuw3pBPy=!~R`A`8!%Ij@k<{#1o>BQ#&=-ZJq#a(Pm`K5Ds5QJ(Kvjc%g@ z9&4@j>Q&3)ZHFSXm^S4CBT&-k(R1BBh?DnZ9rO+@Om$eu#(hv9HnRI|vbOo^$e6vP0sj9>yNA&(yWFX@C5p6X7xR zfTr;!nnLq*&KmT#&4*N#VgOKM&O|>mF?M%Lq?el#_3-gU;`J>_XR|_$FchUtb<#(_0O5d`cI0Zu8p3aDMfXf zEpx038zr4*TbO13_xpS)yP-07^ zAV40t_zHBw(6J=014=Ow)jfrgXAZV2VLC&BrM2z0_+oVh<@19zJZ+Rj$slT%J7mt= zm6gjj^n#+NsaS9WgTYyS%VzFqV zpS*RMZpLzOw8B(kf4AB{OKEm7vsjV9#Ul#?-?l8j#o^009xLN79|1VjQc1HUEqNNc z1vY8zRw>tX(uP|V=j90MM}>W*jx$$z<@BBRv#=rkJ?!1yxD7r)x+xq_S##TO;`8vP zNyfC&<*-#L7bj;0&TKqV^t*A>$%`wjLCuC6`$T zSmG$t9s?qp(X8=ETt`g*(4ULfC##7_*~UZXNiOe#0%A=3V#AzYK>=wJg*MRF$>1|n zNX&e>UkW{H3xR6lTbwH{9!(!3aQ*;yd$B3&TX5p`5}6a>Oeg}+b-`;n8$`wqIPyDy zJmf%QhcqS}LQ66NiWl*HpF)dMBTbDKXl|A2zFcHnLwB)5A{7=&g}msQVuN@1rN4fa zx!Rie)M1p>CTL%T{)N~yw3>u{Qdr^GOVQTGnOV+^Cvnt= zK~MeB7W)3q{F54&a7-$}l6x}Vh2>CW?CRKzy!bB`zsq!Z-mI>hel^ZH`up#ir%;5nmN!rHUdxv8>G_;lqoa{* zIAI9rBNPmXUcH&sF-De&>S}lR*4@d=yM2Yjr{<)Ri~%Z)@fyG@YlYRDP_0}91%VtK z4JSiz*a6;V`pn^{gVdW=n%2lYYe^&;7a=jTpQ#jLK&KUCK$Ank74_^P+9tG)AuxOm z)x>vD;MLJPT2D#hP4})&Y(b5@+%BkvZFRX~{IcY=6)L{xBgPh^kes`%T9AmQpQ}=0 zOh!NWY!QqrS$B06v1Lf$y}S}ncpSqQV7AajtSB0Ddk?;iUj9o3q8%T)9~5ppC#=iu zlg&!CsH|p_N3|50QoBWkwz)#5T3g4WF0+AF0$KYh_D%W7(w7C9qz-FuetKn(*oS`5 zkJIUu8{Vyo!m7r2@8e1Bdi5DgH=mS-UBvm5xyEwD-95)PGUa?Plh+nV``%nK@8{)g zx}nSO*-$9_zdzFu`;*K`Up-c>yE|S%cDA{6bQId?|Md3V@^GYkX|~X4@qE^(ZY#8H zmr$*sGAqqr28L<*IpN@6gPx{;oS88yVPkzsf4@vbim-v~7KX{gQEBTM>1@6&`y|96 zll8m#vEc~{Cx?VE-7QA!`O`iFv+X$?Pea9>=vdIK#HXi&G^m%yUsY5$gJYk|pRq1g!DBpj^(o!h{tLOI z?d8+19wddG__E|o9fxBmSH1~x|I`2|8;l$;IQEeIh$A_sU9XpuwfWxo(Xs^-(D|M+ z0O{ytWT~23t&J=^b>jYEKb;kC__V@H)^ywOv{*}{HGNK&eMqzg|nVJt>}J9A?B^Zb)c&=wFTsEV7(7qWgR!Qc_;Q{RLX~+1T~=q< zxbFk6LP_8sbfq!&E{t4cwR*x>x>lemX&*JL8oMB9wQv7QsnAwA#b`x+Y}cxQZeZPA zpepgNtkqo?;s!wRFAgsq*{`2gx)m{k63I3Km|@C}11 zZBv>$US(J5aF7GG>+*n5rdjNl@BrFL-x?ts{z+fJA)<;9bA^QU@;6PJMQ0%!cf*c_ z4m*x>Z19#d_?rG4Ak345^KA|uE5ShUnowrWeNi*(`sJiztx5$6H&VS*(|Ee9Pdz3< zStaV~K6Lb%P-zd0w)@T~8vVI-*2Z$mD-J9x*ilM z^6#}woy1!RAO*#^HjVe(N5qizmj)pV3W@`+JC$N5_C)Cd^<#?k5aRocYqSfUH!alV z$~ex@XrsQ-(#u;vBnQ!A>RL3+L{FLw3{bO_LG2bK4qfz&UI+D)>jRR}Yml3LL7Leq z@y~OXb4=r5A#tbVI*5HlgT-p{m<4bb^_!H=-J3g_N)<^? zTMwMLW%I>_ytXINc6+D+=jwy&9qOk|vw%FiWMPPlt(3&fR*|X&nNo%n#@?xTRnlsQfh<6eD7>tXbPCw&Cnw$!EISmeV zi+2UN`^v3P)GEU$9iTQa5_%=H<{Z)p`FHi=k;)VEhhilxKD(slzS+t)`jQtvleXy; z0Yl<0zecbiFEo@A!zpU_)CfQF;q&%miIHbMb{~;j&SvYsz!ON(Xg3Q(d_`XHB{!<$ zp$YQuvXU(tm9Sc_m*JB^D=mzUfjPxW4}EhqA;MPbq>_emfsujRIZ~3S{~aIm8lRal_?NCCT{RTvqfeme zdNJo{CtYE}_)@&eyB|DIx`%Nj96}=)@Z25^RU~MV_jm*WtWO1^izkwYo1S03gA^FC zm$o-5P`~=;Sr7-kXs=f$M#@)KPfWlbeb+ZjZ@#D)!1H+ZL$CG=6kKlNSD)cJxuFrk zOG&_OdEJ!9->E5IhKHt;tZ`5~W1IOVIB-kgY%x$uwz_+#kx(-Uulbd35eOhab0k(8 z&cyO3Om4`k)riSrk+9*ljU(?Y#WCJz zCtH|MDgqCX5Ngkaa(A#z5C~@Bs-1l3d@bpHTiJ!z3CirU{b@8xsf`Zp zQSL8+ekkV(phw#El0$v$%GCqaov6nR)r~slJbm4?2Bsz^n9#0Vf>IcxSeML03#-=X zZ?XL4 z&K;m*Tk_jXXfT-qA-s+V#Z9K&=b@Ed6=U&4qUGcPqwMj#5{aJw;j3$mlgMXpmo>XRh-N)OrsV-o!LhiM&X>g# z#Jf-X8n8UD>+JSPc{}Z&SRhry-F%5RBdmw+S_c;=g|oCrb@x$gRL3vd;PhE0ajLUi z@(+>`o#nK%WKiEBaP!d>$ZExSTDBIkQI%%Rdlc)e@Xx>_OD~B7iT1z1)CfdL!sJd^ z&j{?8BScGD1&RW;FqHw*ut!AH`es21m4*dr;Xi#V7%3`;lisY9uTgqMkVPUG^C$r* zUN#4fQw57@t+{1woV2o;Q&KT7tqsn#yDb741&!`;E&ql>Gow{crT#mqGY$8>*?ruI%YqIPNs zez9u&Bn6JIXv_EWA5WH6_Mx5y?TZ=8#Ptb1p4^Vl9Ixn{C*1f21FiYizr8hjinH|X zBt_TGIO6GucO<35;?uiA0D16&#Nj9TDrP$h@iDzMdTunM#pVCMswMXHWv>C7hiu{7?4e_ zlRGk*#^2cszVl?rgMG3*0eAx6r3g-HQ`nh^7R;1tLOpzK8Ek$TEJLO+?NOiE`xweW z>KtS#S!ws0p`Uux>+v%Y%*H;@IjHm9DCXA`OAr5GHKKYDVQ$|d1vI}Tq0^vDZnfF? z9%$eqh6>66F9ybVy;Zl)NLGjoqS#rT5YEd$ktR&UBMbexWu&-sj061i?6^OgGt@L_ zlVoPgw{AOv0H6|9L9#?UY!k4F(EjcK4paUtrkrxWbj-8ggVoO!+g~quvFUbKB}>zw z*$gblY3-&t4Oh*ELnUHSl(5;@6lD*gD|_F z_bqW*;l;44>0i8$wC^SxbT1}dy1T0yfe{kit;6wUR4k>M(heqy(vn;|b z8ODaFNV>F>*^MGIU2XsZI0Tvz6fB3z>7Tr}KK->7bkZ}8T_<&930F&!j7fR1$di(f zBQ1Zqkredao9ts-L_|PxYm(Xil#+il^b-xvpwe7+EiXud(aWh-1}0Y=W*Ln82dsc4 zkVw89-;E=lE_DRST7e`uH(5u zM^G6Zf1CTDh)Y}`1Ra2PWL~ArDkYGLtH%~2`FOvb`FVgk!W>SOMxBM4_T(Zg6#^Y% zI;D#nG+AnKY~E~qfN`;hJ2yO>WzIDb{& z|BCD#Id&V0szV#A@0h(_Yv+19`;#4R_QBibOzw0tuF6`q#OW6x7k(avREFwc~sU@>%%vf*}%Y1l(Yk)uycP@XpD}YkVrWY@HVRgohx%8 zQ(b|WFk{}8_hIvgLD>M!Sk)k=t=b6h)fiqNBON7k#k z1{<}ytW!3~*Rrsw75YaWPb{M7aXWcLcHZ!qf*Ya)$H`-VP&g z^PI`swu-i}ub3&N7*Ou@!>Q9H;0xH8LSq&>uPK05O5%kd*_}&yZq5kOYRg*MxZA6Q z{I(_s*4ZWtA}-X`(!s=}z;BtBd4WRbwX_mv>rC_vd*4gL_fez&QWqxqeFr+(#6+qw zd2TLORdM~~w(T>Lzv$kCPB;E^7*UPO=#(Rc>^vqT8k^7;qhP$-h$_Llcz1j&`3Bk^ z#_7zHkrB>#0E3TJL*>_GG|6k56uR|^b1sf{ngiG>C~M+E=|mpY9q?i{=e+kZQ6;D( z0&53!#!_I*8_Q+febf#~X#gX5@y)YdD!EBx0kIfu{rl^DoK2y}oJO?Y#)nleK43mQ zPtm9=#g{}Jn`VVmT=w5wH@=zpOYiZ3q45HywsKYWL1z0zapSzVO&O^yzQOL{=O+SL zPGjwaOQ+H?N$KJ5SyX~4ZRJxf2D%l=@f$!+5*c=TdL5m}q@hV!qqz4m zu~6JI=MFeC9}d$U_TKF0GF~5xooy}il%ss^ca0z+!rV?5Bq^w+R8`#)u+9lEzS2+6 ziez2;2*{GTyS=UnN`YbR$93~VhGuenKK+QUr4hOgDRQ<*bK?K>a-FdNEFVx$elNdP zHRaPXLMb@O63o7Ab1rX5^(Sd4aV=LKeqjJj#3Aow91Q@%&8y+ZtW?j&HirJVR%C?9nv&J zo%e+!yTzs;+pkH;Hh{KKAMx{hXVM22X9#aN;Be>M}$_5FWF) zXyn)eNA*1kLnnpT;eazY`&OuZ*2JLh& zb*rl|r|Az+v~i&3W;%YzQ8t=!R=nKpr^cn>c71mCI|QviE~~LQ^|jY>n0cQ8uH3DG zw8ftR1ilZoX?#4nibCiTVSCc`ZZ{~gJstH$dG8mxeuZ$YXhY_zH0>Mm|D}i1Ju6x& zn`;L7z+g!)r+!u}LrqZoX=$WO`T^E)gPWe-Pg9qV>eSLt-d4@JkL7`qpMJcrYp~FY ze(W#FRO@AMX#On8GP&M*7>>} z;uosNQQ+Ttl9N*rN1Kzr{qkn>6>(i`_C9V|knt?c6Y20aVU?=Xcx(_xkv| zG--^=UzDv%se*;^<$|9(vo8F?o<*L_j|+JUkEOxrWgv7n?pY)2j9F3f@=YTUcLnFd zi7tR9wex15RSR`jk7nAkzvY=!p1%2=YTmhkLwD2veWIS6rzODaKJl&|_P7_s=tFl1 zWZ!MhU}U003x+_sr>r709N6cVeNa>qJt6>@o#XUx@Aqc{T~ z9PpsIY`u8JCO`{frvk5R7>h8@8yn)U@g1i79a|kRI{BT=f!to?E{kz%ML9V@0Ght2 zQ+$0I@0V{#+OW)1Ni+cW^XW~zslx1yr$C;@WY@EHX_Vt9uZvNsB8vh?RO$#~*zUGh zm!igV$U8y+sXZRBrxA(L^W@p~kH634#OMlNYrT2F6a#vx$!%@@ zSF7$tpo`vu(mT{Xq(44cQmPI&GiR6>>|C+EkBjZcLz6Kj3LU#I4a}dOqU+mZJ9643 zpP1RMFf7nj+$?j5@oC{@O?BG zDJ^+qK}H`+yaJ1YfeBj?xW5|Y8t9fX(Mrk|UT&TFk9v}{`6n!@rQdN#C!WQeXj~Nr zR2Q{KVLCty`OLabYUWU>cdRb~wuLN`JWRQ;+wt5nhqiGRzCGac8xF-h28VKW*V1Qu z=F0?nvpCnk{!;81zqUDPE{gsviM+c^)F|~=;V>JMUp6SQ99DeoWzy=$u;vzqjo#c* zSS*D2(;DoG9UC>(^>f3wE@oK0Ba;l_`e4y$yGr3bUps8R9zMY-3O=rL^q;ic1Pksg zX7CJ&rZi4BJ}swuQ~65to`6G^ays0KR~~!3+*N{!j6WS29$^#l(b2MtjaoBKsGDV6 z(N#IO9elNZven+1m>OqW6^}`A>(?Bd@4vhxK^`A$Mm-KYwVxuZDj`Nop8Yk1yP3*A zDeu@g%I$r0fWH{3a-xvQycBTu5vXEd@GwKL5b60f^aW~w8xBF$4Xv^iuoZPafZ#xo zVnq;li|ae8;CyVkOvXNrGVReO$jqnMTi`AuI}*h?_N!p_Lv4Ab;a)CEUnaQYAOgu-!U}J-Ko35;og)SRjX{$beO((VN3RMITJ(d%trJ6(H)~bA35r>rMx9`$K_<>8ep)r#HHs9z+Ys*49tpi9Up+zT zmoo4E`!2N7JwciRVFW_`)))QPq~hvN^b475lVP+9F^<;LW_?uA0#GEfOrsOyiRh^9 zbdqW+bXc-nw4rxv?r=($Ik|`e@WgqXY<2ntA{!neW>3lq`qk@dtU#+KHV5T z%ItY+Nl4DiI8wgin(te;>hKD*96wzso=ckCD{3hxUK$Ejr(;_NU*+$dsPi_BLRPML zTzVuzLhZiZ$znWM>$1DfZGsv`Q{OR|k^ueI#?9y-?c7CD zEASSMFT{MFaJ}HQHq}-;7bGX~dx$NX@F$TSs>4(50Zzv1FwjTlQ6ixjKS{VQ(x_+c zAb_s>?haXiV#sEWJ`13gkb{lWSN5wiM~ACbhcmQ=`%dom7%!H=#Bu~I8ApNK_Rhnn z6J0hziR1Pk+Gp=A?+*D+3hq?=#T%LrvRp_8AHwU@rS>1eW1FsCYi+4a=1wW}BNlbk zzE5EB%d3c^Tb2Ig_rgszzhB*pbE&!}CZ>m2cimV8&s^Y#qNH){g~ zLHB0QRU-~JaQ*vUH}{YaJ2VU49J2j5XihM-2HU|ycsaW5T?7#aLQVQts4cT0{!6_t z@;9mE{Mas|#q`iq@^4bz{jy8*{}H=J#S0m2q0T%-<8q34$|M?FrV^9zbB9Z_p1Spf z=fIHyAbk%`s#Jw%lF2Ie&ri80a9Ob?eMSLL`ofCN20TF))GX>UFyNf{dKBgG1ngU0 zrzhOJk4MBSn*Zf#n$hL%+os7bD;A(afAD(oHS9xz9 z`ia%=T(~c$Y<`N9aiuqq@eXk1*vGi>b7l^8BR%6Q?d;sDpJfD7+ZakcAHfx9i>6?# z>Fc(hoeF6OfQLZcY6}DlIu|897N&Mmx^vJHKi4 z`Ew8xYc%+b+EZ@{z25EZBqL6}d;CyJax`QVy@xK{=kGFVahfZ?D~9Q~jvpD@5(Z^O z5(oe0r}dcOdO}?j1~n+!=I_ZsfDU&g%5-UlX}__=pDkha98RZ|Rr8A5u>`2`tHW$i z&1ZQ6@56r1`{5M14|>ygUBZic;ah5K`-u-~6ma+RO>6{_**!isd@=_==<_W&-+gzU zZlUrBvh{}N*K4*b^^<3E6fbbQkD7BxAgc^Kvq!Th7K27Yx6Xdb&9zO6TP_^GdyDzG zky+eLmoN!;`-)bC3zCtd zT{bQ8?^GPlEE3iDsxw-d0+JR#W((;3wvL2ufuj}sl%Rg&Q&Jr8*)qvFM{rc}U2wZ4 zu^rC`Pb(2JWVnO$oG=21Xwm!KWrmSKB#pDR=O@OS)ngr!zw$kMgZmqcZM<+|538n2 zhloQ;Bnsg&UVj>&sk8ngO>kL2M|8gU%*v@YAd`*z+p2_Xsb0avY{1Sr7J7K)0=WAS zMpeS>7jV`NX-E&5mC}$b>w14Kc7?HHkBllGjh-E2u&XZ{0xS0k3lG^geuj8rqv)q( zsIAyeOE`2$9+S>NPk-;~M%oe3eWZrcE?yE;0~0!YJ_ME`N3z=iXUY1o7>w z$P(5#Xt%vtGsw`q`J5i{(tfsue9=)8-2<}u-~SdBU-8Ezl`Fp0W<45-IoSYy$=t6w zE*!@J3MR|ciTwMw06M0JNcXYcb5$*r5P*)qj=DxBn#RO@4B~iZ(;DqxW&NzWk4*0c zxs6>oG&G?tTSihq`glGfb~*Qi`Ji%!4#@B$(Hg|!=N#?AZe_d6EC+pjH=SYNqjkLC z)M%1L@cC?_VjFu)NC>@@elfv7iG1$YKA=Lp@8Qiuy^WVu)@PbKs)RV&@|5$g2Oe@YVAOjlRDQ1j0YJfY-dDGc*ly;l zoQss_D@4Hlh0OliVkg`q08FqTMD~C3R~AB1*xYEEEl%_hZD{52fxoSQp41vP8hQl( z-2^CKkhHM-{@`vJj70e(E??o4?{hEM;@PS@7d5_%_Xta4_2a> zqgVWf0oz2o>9q%UNB8Hv&qaKhvnW3J5qA5?pX$Hih%<6decs^vGzBbwxaV;E{yh(! zl~_rPsrAjL{xU^*VfZb2@(VlH?!|=}T2-4seN|Le%274fPDg(C-JJgMM|6ZfS|$M2 z1&$`P_iJnnD3wV`CpF|{=au+qu9GZ(*$;eq_S@rP}r%@wKM%#FgSoi#gZOeA|XMOy5GtlDF+4E-MU!_ao*a|k>bwO>*ScByNXSJ!oyBVX3978S51SuktO6>D z@-aD8x|6Lp);xRYwK1cHvO|;GLHCmAjLRQ|Lxv`DW&Tirfun7a4{f}8*6f&XKJ8U= znA~s<7=rDHhwXx$dUFXeW&IN$-TFRbtGm6o=5n^rDXpcYg{PUdKugDv`4%^J7Z3F3 z0cDa#RvVBX{zF|Rv6}xdGVyqHDa+m=i{}EJzXxb{dp7HS*@qfE)}%=yA*?upXr}uk z@c*&*mQihPTibAg^`rZ(C`iPBtdjmzBX7F??ja!9lNFuwR8AX{4>SzTxv=oL?P_6ws1IFa=N~JX%;7v05H! zAFRUOK=gCw`pbRXKlXQ_lu6CJEZ#Q~5+30|6q1+MdwQd;Aw8+TaAj-hY=B3zmrm3B z3Y6C{{AMOX3&Lk!yOGi81;=|e*^0X(WomW&BM))6wI2r8uU)`87;2)kjgwN6xM2df zZr~B|O|Vnj){3uTQ{FhpkuiKD+NFj}lvDQO7+nY@?U%6enH8Ou+uY<8adq@0tvcFw zf*-Py6P>3=KYYRuCNA|LkXn7+I4rw|f1lYgc+VM@$XvOe(wqMpuAI~Q>!$TxTXsdy z`RKuNVO5SX0OyP>tQ$a{yPT5~ezx918qNjS42X(}azO=!C)E|*UsWX8Jyu+B(7abV zV_-n7J6u2?{Y-2`;)nNNR+#<`<{~6p8H-{;@Kc_7H9T|5-Qei;le^R${LHk(0hL;f zJ1nAdzi~62gC?Zg9gy})k74QP>z!N$*Sz@fiuaa=Fzjx8g!LQMZ6`TNDZ2&=>C8-%jSzVQJt{Xb--*Y!VQ)AB zU$IJ-7oafwRFA{4;m6)<3W>IFL^MACotL?K5b`i9-1mQC#|lw^Yu}cQE}ed0s~4GS zUHa8uBO*+yz-=$8)_uEYJGTx6GQfp-qh?%hM}f3)u{OS^wEQz1Z+8!e~i z(%k8PK&Bh#sG1R@U#OmyZG2n7m8t=S-zD& zdFV-sn%rC#axJRM4v$FR{$=`YiIVx-+*cQzs>kaO7P;GAx6;8o>eAu+90hEZy_F=D6{T+?K1_$!E zYg)y4-#VZFj$CmluzRLE?s4=E>F@u#JMw3BsZff{D3*s0?*8SWmH%Wac0_9GHWqFN zTRKzu`#ATHR-Nkol)PvA_ULM&%OLUV^`C28xV~IP$9m;bH$Jar>jjsMr0{6{C4E+TRlc9xGPp zQv6T5~38&FlXwu7CM}`^!Bu(%k(`h_Wf{v}{KowBv8Fgq8dk${Wsb z#lH~nKapW?!Y}vSmumZW8_)k#=#XEKX#c-VF3UH~@0*OZUvD<3?rVd-U0lpVoyT3> z^A{&Lz!BlxlpNiUiL;@vHC=zGxBGIul-BfTQz}n>=vFyg#f^~6p6<;vjlg>kDS9~N zbEAtb4BN)f3HsPXK}*jjT1_VFPom%}rZ$;xK;H;@#X&t=7vkUcD&T8?urB_XQV}z_ zn4{ZbSIRl?^MW(~#2GP0-E@hmhg)o;Ud?AAS^bgx&AKw~W(@L13)~!`4x~PMWoRV0 z2T%ASlPM>97w<9l;75d3EFNa(@)}w|zYTKu)7%OF$#$Hna+8o!Y}l!oDa;92QH0ay zNJ~-^A;9LyV!ooFA8hL~I<|ExZsh$XXi#3SP5Ru)uG|I7G(=W^(r1gLNO|}o`VrI=e%2qA(l0>^)J}aGN{?jrJ{cA;4 zZs{VuLdSJm&G;9Z1wl_vB(^DQ%o^q&pFSlyem~sCHiT5{|Mt+-J@lL;tG@N*K~etf zFrxGHK37lebl}n+a|P+d&4%D7-$@5a{T1X-56ep|^^MwWx5o>Lg37-ZZz5aVOEAKm`t*gk6d#yF>9Y7;O<*v_$rg7T_q7@;lkpo-5;(`BxCXc80#% zUpj#xUEE=g-nV2L?|d@W!DCadil|E~`}RH>ki8%J`uUr;)CY5+pMsCnzJ@N*(<&k4 zYx~JoF@b_}du*l?`SI<^Z9YJV*vT$k8@Trjt~Dkds zG|`$up=;XrrbbUGBQUOZjCFGJ+L{v41?kbiYry@klR;&n-b4`MXQ|e_*D`>1qU13w zHMi#~;2GaCY97##ee3Px7Xe_?mZNP7%)YDPmyU4cP{#1$?AId(O@-=mN>VtJaB`@~ zXBO*;8qb)Tl2}JlS|OKO5f@e`Jb=U`Sau{Zvx$qs@D?M}Q+2b)*J=!hnPs0?8_j0h zrMR)@6}ujsVK2~eNYa4X=YBrZx6^HIg16BCZq8p%&j0c@xmd8cfPb)9j~wOkO25y6 zL9lKEv%52%Y>H87`5@-IfhJV*HtUJp4#y!sWD6SVX~v84m>2CS%0usbLagS}rl~d| zX2y!`WGy{&hJgf+ZOZ4FjWFvC+cyk58k=5ajK)xW(3ygQq-;tiOR`7@F*i>~wf0yD zY|_F&Tr)LVx=tjV*FJiX>U?+~gHuYY$Oi5=axiMkOBNl~bNtXPVy5$Ly!3F&SXnNk z;aKS-V!PqaJ#v|b;aoQ-szUE|T6n~^aYbNr38E3@ummy6>32(y`2=b}Z28fDu494a zcf!10Lxo~&?@V`qu03ZlGiq^rS3+tDIepOek2>mKM12?B`L;CQM7NK45M|t%<29Oh z_vei{mB!+wx~^7Q(hmlQ16I?xR3XY-J2mg5Y@%13W?C=Op|?wRAGr@XkA>4sEb{xF zo=ez3_=oDhUVRd52xv;1FMMC4fy@}a6Os1$Ov5JYt}s!g`5eH}Ekj0(qVNVlVhAid z9cVYk4GbW}_*Q*jmarC~t59^h5qg%CRDh2@rM6RR`qE*L4--U*{js>)H=m=Psh$UcJ zmXx_Shw)1Ezohpy%6hzYR<&=IqicBQbcaONw!QYI=mRHdI#3LR3{Kc3UdEXuP!`Xs z%6~vM{jIV6#vrX2y7bkf$^D1hWm&{emV+OD{{$T7BSOq7zwMqFa+ajW#}4ukSl)6Y z>NRx8xP5~?Ne=Li=NJnMQrYQWjp5F+HaC4^$vI-*9d#VBYDM+N+%&r_gg7hv0S%0p znY3Ssr*hDW4xu3jBJ;`tU5f8~Fxr~u_4W!I*Lh$GF z6q=}H2ZJpbh}BNs8!l8y^W)}JKi`UzoN(ehOD*Q3+q`97&98~i?Ag9pBCZNueMS2v zG~UQF_2Ru-*&U9_qtV;1I4sR&)0v@74hPf9$mEos0^_kS9&Jko^#xy7Gy`wdS>$y*lOTc@wS z-5eMtr)QgzjaAga39();hlZsH=Gcr2YrUyq8ln+qiTe3qv?<+Thtc_`PIgQ?kHqU~ zL4He|cgNhy6K4 zpY+IZ+gpv4S@x3$DU)wl#Mfs&JvUX`kRRAzi{Px2YiCB9llP}=3hVFRTqher;Z?ym z3)fSA9A27c*Xb{DdXqSgw$p{3*{t^tU@Onqa3-QgzA3EWUb>D;hpl3(*5vg{ThRxp zU>yfbqZj?$55tI6>bKYT{a-t2SnQPOB-_wqMl$O**9}6Bc`@E!%kprq{-%W!9*)h% zBpM9I3%TaTEkYQw5RNlXswW)djWg)bioj5YwR^|M~zDs|@g;4)`f8NpzC zwn0ZGyr%*Mq{rPA=Y>~T9P^9>U z6A5}wZ^2(x>62FLTbfg!aurT@ipdYHT^TtpBkXof(fYejO5TUPWXLNtN^qKY`riBC zUJtKECuAjMXd(f2W*q`(cHO-s{xtM%Jw+bZ#h-hsrLVvGGtI>{HHI9*$7FZ&(J#%n zeZM~b2a4E4H20LfK^AE!5oW1r_YB)+69rC7&3r)A)ossAd86m-T%E@YO}`1Blh@I^jIf*%(gn9# z%svZ>62yVX<}`KGmX6vMkNQWFdD6EQK3bgoTHC(Vq&#CId1*2c43o5GdyY#J4Cl^}27b@(m)rR8Ve=ST!xab{j z;mJL$EN2V4ZYCk)IKam@*knMq>m?zY8)I&FOR^qb@HAyn>@-MHjt`nU0?jS7};5s3T{ z!p9>>?&ZrZ>e~!b*K!ixNb^ZB`OKOjx;X&^n>o(q|8&aQFP}6>r2Os zW1K;hj_W{N@Ho%^&{~# zFzKQhB=9FYqjZ<`1uFRNox(K^pI~#E^-LJ|-HipsiNo9W>%>`w!lPnS?tj-TVg6O% zx?TSL^yVry2~Mit;d~y>1K$}_oWBGYJ{@70DTPi|MxS(4CjyrDuea9TJ!Qc>+UgE; zIpy8VUdp1iOPx@k0N%hW2bwKlN0{rYS3Ia>GD+W1 zxz2vkJnFItdQK_~|CN%@Y4f9hBvz}KoDFuPRC6l<+P85Zd!|Enz-~G9(D#c@iPN_} z{za`iAJ1@J5;!cuPj2=Q+R(Ypnmcv1=91*UlVs|WA~|EAH5n%0kw~hXO@}|_7Aeg2 znfd8OWr#&GeX)HifB!m19hJM(tNnXWB>7DdlF-zME&m|jFUA2{b2_0&T)M-Cgk3bq zS`mvP(0Sb8EN4eiqRu+v*IlO-W1StxT3C!r($6AnSW*R}k#QS~}` zXyHe?FL!gSgJVYl-i`qTIE(ygEn{p=&+mh=ibX%x#ewsMh#~#x!~F8w*oB3eCf6^W z!=~I*RGaPTlzqpiDrKKZd4y?~c-~c$x}pS!V7dBBj67n`ik~dUUjA1fO62*(gB-TrZH=Mq17|kiR zEw4rr+**8n=RxbPs+eLF)zKcGZ7 ziCSVW`}`BNJ}@Vkx1miBOW*AdoWf|b7pCC0^`&|RL2Vsrmef5B7OnDMT3A=;uoZyq zTVB+g;`E!aZBYf50D0+P+|Gq5!P;n;VE8cOYVeYeMVpJ0$lsy4E>ZrtWD`4IQ7cGs z6*jnyKcD_a*rExr`omHXo4B7Ya;>+!NP!=u~c@ z-n{PuAh$9Aoq7D-?!CnGH@u*uyO_vr@>ezB7V#Nr`qIvivUIM2uX7_5hn_?II>&KP z4%qkY4s237juEb4nN8|eq+BUm8sd6;WuD3AaHPqBA%Z8v6 zJ>Z>okTXKiWA)XTZ*ni65GbbUn$iChv^pmvLWq8BnQ(J49L7P}Vxe7AzwyYHHDu-^ z=fMvMx*p@n#@4n9%wm#QsO27!GB>_+r1dlyIhzFl>g~SbypiadIp+}`W?ByJq;|<& zv0Py7nmJZO($3$hXC@spss-1#a_+jzzLflWlc&X+^j)13z8b%y?FPOYAitW{1!L(q z7&v!jl#Ld=rj$k*u~~t4XmP}JaO0514V%lI zMGL)}ICIdV;@Qph>)KYKC!v+W!MD(GK*+O&XY~OjN1YZ(Ke~p23ETZ00i)RkqB;m# z^@!w@{(7~VdkNA$j@YbvS^R7+%^a-tJM4QMa?uGxMOn0m$9v87;`pm7-R-c4qV;gdLOn@et4q~_kv3Hjzp$;K_j z8?>;hivxylP=Z6l*??&Tk9e8jQ@$3f?X5!wS|6OQMHjgF&5*lanRsk-NNJ_72h`$5 zDk7r-JkKb%CeLOABX4e7vRW&4;BmDML)xjc*!7jVcs1AAsF8|g0wYb)^P|!8&8;B* z5!<)`-6`8d^l8Z?@mbm~VA~b?*UdRbG2D)zXtMGMcO4>^RY{41oZx^eH9_0A#izA` zq_)DJ8O~qkohkfuSuc%$H@In$CZl)k#0HGW*cR&-ey_f8`Re@`8Pe14<<=tpNt-`l zz$8c;V>8lhkaC+TlkDd(-RAu$&l|^a@^7R*klatRz7np_cjIB=?Gg$q5jYFD3W?1x zYz33zjGA@0h5(+RbeWIk%zPs(Th6zH6aggxvIDOT!*h9%lX)L51XzsU}wSgB}IET zS~pC#hTcK=aWqmwv&^OC;%u`jWn~VN@svMN7>(JkSt^floU+=Nyid7*`!?H)+v>jD z*A@3*;hCgIy9?>fT*!10WJ0oNXBw#O;~)%~W`ejZgJGyqr+Zf~@O1!tnr(q>)OV)g zxi+*6XFbW;!1OlXL5_NvwAK67P@0nAMrg{oWj*JFgJ>e9`hGU3Y|Ge6b1(LrWg`1^ z#olMC7eQ|OE7CUzU42YPrRlPXsiG}tC>X2dN9!I*itKH<`}6SwIp++-w+>MVbQ!F4 zr*b^ZdXQbFpPS3ypZFBDc6S|A1suzNBZ-kjMx=N3@E>@cp(fK=2+O)FWQcs>84JXc zQT@Uz@mB2bU2v~aG{i0iY1-dS5Gys!Kbls}zA1q@X12+LM1M4D}>zq9TRV4vwZK8QPJ6Pg#HDTscGzexuiQrN9g;ZY&B zSMUW)I+)8f$CjD-qzGX`y={J`0`5qsCzWCLOo6V5fmPF_7$>@*eef=fDFgk+wMt?2 zya2PPviDSAG85ru)oA5aK(Egs5GZi{d06TT-A|4}eO3)`pf-av1LQ+?P`^oZ6R(2D z#OKzG0xoc4OZtp4vZp2{h7@+)GZ`aZb4gPSAtWcq;0``yyiXT6Wp&hS}-0rcRg;}UStto?qK%b!vSlpsVj<&b-=JFVy)QE zi|!HQ$2}Ld^Y^Nqac!Jmp{8O*P=QEwlyxES0%KZdqzvK9MYXA!X_udHy;uZ=K8dNd z1Sm_QZ`dJwCZ0G~EAVQJgR!vmb-SM`Uu3$4B_wYNn9SHzA)GNHfN?)<-ohL)Z0FA~ zvbc3!EzYvP4gU@<9sxO{RPZ&NfBA6N*nDT@Em13!&3?ec^%3Wr{zG)YAl@+70rL1g7eOq#cJhoQ_5)rAN#Wc4LDpADC z-7RUwv5)EnI;4BFm_7tk* ztirPm>l^?RTJYBOV?ZHt`-0`s9w@-mX7S_;Ho{-4_@d{c((^IG2Uy%z^u9b`DJgb1G$1=JbczLk;Ws2@!jcH&rlUW zU;IFn-lKh*^3hUKoXXx?eUUe-tzc$C$*-1u<@xygLgO|Ij9{i{t01IE#%UU8pk;5F zE~qNbBcW#!%q2N|HfxClFG^0QsMMTmuOsi*(+~Hg6tJ8 zwCl%V=dp;4L?#x4Z-DD06mNza+ggB99ia(UHbqwxMfA&4x|iY!do7z!PfW`&sZJ@G z(R9kk$^G&@?OMtMh8mKHAffTWx$?#d3iIR`P~8F#KVjyJgwN9&8Ecdc!vSQeD&$?> zNOgKa_AB`pXF03-lp8wlhBwYJ&du%2KjQ-sB`l5Q9t_AYJMLoW8&1fcF%D@8QK67G zP)RV%zYDBZK9#d|E_VVL7HN8jahmxP`yfzJGvDBKUnN6jQ1{>se_Vud`}m&am_ZXc zzz#n;PK5fe_}zJ>Tda@+(_o5Vby2_VQ)u}Ki`QjRIwVar72XVY-@6V{kQBVIc2b%M zj;qx*`0T%~<5#=4U2d2!pqnm43Wm;Kq`+T`F{MaeqNc1&e`d%(|BI4@R?=IK*8COf(s#p7nJ?wl?z zo4mP|Q|RZnHXj~8c-e;GmPUt+mrwo!{!dE9wj@<;YV^b1NXq9vq&5$rYdFgnU|vYFlD)k2KN1+IV{gGUuKOQg1-t3R6JdYpCubLfHtA#trQe(bpS77nKEr? zs9i4h*T+c*;!}KKR*9V7pEeziphFFH9YfhQ?bT&TdTFbFFkh;Rrf)k7zTyRqRh=nj z>R-&Bq?orD_rYEOQoLqfUQB@7*ohPX5+JDAIB|WfdF2hxQH^>Xg)oZ-GzN`ek-=FL zWv5?q5L~DwG^8o_n2D%&M7E?kfH#syQ!VQ6T8V)^ZV0bv{k(953i5&BPjP3Np! zgTxA&g9A;bt+ardfXikn6Zdn(G$AxI7~UR=M?U5QHR^U73;qP(T!8^?it~k#7B6s% z+)c`B&fT5N9xDxofu#74jn!Qd&iohoATF;{ncVa z988CRd?luo#uMdf;Bn5~{j~+NMqP@ZaTZp*hl;ipDs4yGhwtH^XN5rJzzVJDB0WF0 zA9flEs;Qqiz-@#)+Yj8WEsn*h(VNal!v%kQ@B$eHPi%~z7P2-55H-?p2i_V0n_SLiX%yG3lmsDQ?dJnOhIN0O@c8s7HNdFb4&CBc+_ z9SSrlhfRN2x#>Q(t8!dxQ?Gby69tKHil799xeyjgmE=Z;`FGt`2*j9Jpw1Y~rADom^|c4}B(DLgu(2i`TV^~v&+ei25i^g|x7 z9(%G>#7^bofAH>yM_i=dNc7nfLx#qD1*Xor7>sx&x-FD(loOMoC(t?1y8RrN;;wZe z)c?rt1pChhg`4+P3xUIkItK1hMU0?tfST`>hmFk@^)1V$>mpTyK)L|Wo*&XZ3A`@d z5%GOEs@KMpJ*R8@uRcAIpRsL%pO|(f+x2+FNI~wG&4~51>?ztn@OnHXpUuG{@SFl# zsWsOIy=ICW$I|*l2Gb{q$73?Y)-JdQDxMKd-;ITZHEoZb_-L3Rp=U*Vls~oJ$@YK~ z;KOM^>K8fb8Q`f+f7QAWyj!ahRdOJg=Hi}$*fS%*+cK9ho%`iE)%%I}OlCYi*`LS* zlo9r!Z3oq(?A6n1qo@*+6{m8L>8^jDmm*UA7PN2dGlzY@r1Pe<-Q8D@@yDv;TN1d6M4Wf`a!3&TOSg(1VMm`7cTwqBH^L_vCth z+#?iwq2&4;j)2GP2-mKPp>`Su4yV~+xFznT;?2|#*y)F{87xk2^B9wH0>dU9Dy{8H z_t4E+83CDNk05*mv8cde?tH#zy;j>OgMDa+Z#=Q6W_jet=CBQ=cmB2$NhMeMXJ+M` z5t2^Z(M)CTPzD4sRJ)H&NI<%NAnLi>i?FJXDa2xiVp&Ath@}duokWm|)M4{u3dDYT0NZ-HPz|rpS{kK_#0HamJFMCSLp_W4l|F9F`Ju zyT-+d+sC%ZNP5j5xxj^@i=b$tvgU01#|2zQX8G=_w$QhYp4FGydm18nan`=GAYRyI zkZxPho(=Wee@oW>Px=<}{ze#Al;yI_gJ#*#>-IgPXF@{27|#R}d4TN!K86;RG7q`L zPtETi?Qu6oe+>$o&>yPmQuN(3LcxM&86l?%KTVMf>HC>Es_BwX8?Z_mIY1IM0fSr??-{qw}fv zYDYa*ZSTj&m8LK`qz^lCKo1GUyt|0f4KMfc+fcRBHLA)S(pB%r^1GUaT6{+}Vqz>_ zY6c>RnWAx?AK;QZP*yrY~o;lzD;qAq3sdVc}g1fxvtG)heC`Qb<+W zqCI@4AJK=F&!cLR>nYJ9{Z;6X9RPiv_mvhhKwi9S)9ls(yr(&Q zJTfz@_v@T-2@m)Wna)sSH$f^kqOgSIet|Iu7{I9t;bRhLVV3B`t1`w2$vJ3SZ0h1e zAlSJZ%gb2Z?vk`C!{W2l?3|on~~P zc^yjUYy|G+3=pb?bTD@pcq)&8Lmw`-#q-xK?d znDEl6a}x6Q4aq}uZ%TRKr>+_MiGez^*YpP3sC>bv$Yyb;is$HySrc7Ti}{+g$VY8X zRm4Y6raS>Z^k@w7L5=>vys@QZ0CMf3ZlHqYk%+=po4_>TKshm|2dcJyJd)@rWksd& z^U8wrN!ntPUupnHwrrSo3S0`}D0$V|3$&eT?IBO#jb~Ee)m9P@<4au%UmiD!VPdt~MYv<$QEb?;HEv7}UqKQ5paZ$j*yi%o$ZZm(Xt9*KD1SBEd?%dcYS)`R12ms?xzp$K#lk?py+f<{6sPc z|6>U~2?(NJz=&G(u7Ge*;C2B>d_NBDHeloMhyV`q7KV|T}L`;>znTBwv zJFtm!q%o0nI1aGW@5Itc)o;(+krN1IbCO7oshhN3eS|=#Kz^Q#czQXluKTUuh_*_K z^H}sqq!%=FI8^F;;tUn~`YmI(Nyp(Vad5WIL@eaauM);FUE#K*rIqlzO=0A=;2G@F zhE<s z_^#JPGsrg}Lv1B#ox}6wvC7SCE6M_BGj*P$bnll5&a-}u=8JMqB}OAy?07%r?w8RY zPiE#VR(uwMgaj6nFRJL*0yVELqB67KG3~9s5*{`mdUl1R=?F`@n+P)tk=n>pA2U(q z>QdhlaIzIZaWj55n@h`Vn->fPh?fIt2=j_UgrH~}frWcu#m|8^p?%!_XQ$;AridRK zn3rlpa>iBVoT)pekEn0i^I9jaFK8W|ik1^PD&^&yt`!b=9X}XQ_o0U8HnVnTC%h*G zJw~d}*9ram&Y4WggC_J zRkdpWFaaHS1RfBapgNK671^gF9M6~!ck%}QXO0!zE*8?|2eql_K4GEvZ+2;Qo@!Ns zn)E@c5nQ5>oPk!4w0!;T1FZn@{ShA^_niie_-JYl5-vRLUo&laq7RXxra#Bn^|Ps4Gn2i0U69t! zik{(PE-UN-m&zGUawaVSk71;x>KU!7HlI#q_fykhGO1Lb%Xpd%t|}z`b87%ljEC!WAN6cqL;o{Uo(2hxo|p_X#`1M4Fe#tnHb) zUWV3%<8!FOb+(cBmr57M%GA{s%+sB|+TDJM(P}Duw`}03+CYJ0 z&5%B5wj4@KoA$ zS%4RM)d1LMYEGY1UtTtZ5s6r@0OeI6eFk*K$TQh``ZKt0;T7~5CPhafeRZ%Z(nGfZ zv=)uIfUFcnOU2-svOQ68GlEgDR! z+?-2otR{3-o+_cHU^#lx!+EipI(P;FD)^9m=xMQn^td-BT6cdWE*~x*%gi_C5Ebgc ztz~V`@~l$JqijvDK7mYCu;@R^J2Kp(su>b#Q7k8>td$tuH{4SuL~Rj2c<~*YLdYn? z$5|AE7MCdzbLmo@3F6M3D>9n1?FS7Yf>^9i>jnVT3V;S~yRh_4_(M&^fJ52)xRQ)d z+_kHx#h7{H*b}%?54d^!)FGk9%Qm@JWUSE?-bdGoEj3sjiZ!%6(a#0Hs;cm)lST@% zqa|j%)w(LAIZS!?78GL*ymN%ToxMU%6sbNw!XwT}o3)y40Iw7m!~7{ij=GreHbBWTEdoYhOgUEoSW)qlkl1bSk0!lO0o*M zLW1b=m+jt;!TDAam7i9WjIsP9g_Z-K+zcoSw64om`IqzNZ$6zp>!D3>N+FHK%S{Uy z*j-aVsstv5Hdqs+T%?j_;?@15BGQ?k0~=LJ;7Trs^5>5|`$lQ(8W>CUGLgOd>w0y% z_T>q8`nZIS38&w9rJo_-%V>yR^=*&Ay-T`xcriO;csx$S#Hl|v^-wwoc%JE#Kj5+CHiz)a)PPU4T7J;0(2&b94<2iR4<3Nr)rO!ckD;8WJ0c6tR-tAhZDlYt zrqtlBxLZu8IBPhYOks}94>MDk*Nk8z{upV0bxH{-Wjrx=++wEQPMwaA#VGvBZF+52 z1Q72~;K!f^gEu40h6XpIR9&^E1!U5&w^9)PFrZa)A3svgnYK3e@_0dfh%1%!+lAMB z3rupH<8bsg^jat}(T~+UE%dotx?(vP9>rB_8CW%Shsy=G+0y})Ygd0yAjD|%hjAYD za*hqOA-geS{91HV1_}|_6@BVBk5^??kY#nA1cTc<@l3rKfaTom5Ff)!%r#zkn!3au zQ)oUzf^dF~!qwj%h7AU0oQ>x$99-ntcE2Hh7Im#5z-zJwhCv4GIyzsEwwF1cRD^IK zr2)=l-qX5l^jnSZ)|(%*Eyz*E2O`_CQMZ$6)n664Ix%n|a-@Rqx1-fOOL^C7GI1Yb zdlt>C_fITs5-eEQp!g)djFxCnq>Jxv+R?a>7;*VHA6Put8CId$q4N*nc|q3>i0C)>2C{t(dP?g`1Pj2wk9_SPG5aA!bRX zM#n%>iK%&#^T)P7*qR0yogD1n8z9of;=n&->;zh65HkK8?@~nT#8*p#gEcsyF!j)ka zmW1c3A{d^H!fbO4K2m`CfsMM-?ls<}_!FAab170&hPO97gaZzb4M%rh`z50EsT50+rW(d zvO5{aNRGT=_Ey3L{YAisUR)DCrsJENW5AoQQ$mm&yZ^yU)Kk` zyY`Dk5JC%7m|C?d=dzv#s~~E7*0b`ppUP#ly9Iqm>1(4*e#)co5eaHLO_~UYwx&;Y z7LiV$;MAXbB%5V>yGn)rQy(oXuwNmfL9eR@DYtsvY;g>fLDZVK}=~OGS*-IZf9i zfTQb=PShfU;ISpiXm-ruPYxLw&KSJ$zNscspqm zbPnQ?pb~*_7U;4_Bq%b)aI?A^67dvab*hxgq4*4`jY~`6aeDz3Vl7y zi#s$U(}XKUASuI)U3#yD-7j-WDWi1z7#^hQy(`hfnAGbeZq{RA#UA#p&!AgLcizn|4H0 z%}u5&Ni{U{y;{|dQqp^CjRs?VAvSIQa1RbCXHKDc?(?}9TV58Z8;yETd;5i_+MfUC z9>JWQ;OWuvUONB28J%tD*Y0P6K_8!{@^{{3^^+TTQQ1H$2|eBX39H*=EeWzRi91u{ z7};6ZpW(Png?#HdAI6&Hc4@0-<7PU(yr|#l__H9zL2}9|lhj{9l=>_FZR6m{G{BbkkyUT8$MxWRiNhpU1_riHvejIl5T3mW2 z+UC{k-E2_cL)hEx`sk$7KMdZ(u*30KB+p}HVaVh0ckh;}hQX8ltq~D!dI}Mg=-!nj zWhSqS;v4u0C2S$9C-b0deRA|wo4;Z@ef)3TFI*?!ojm#Tu@t`xn?LQhLH7!_cS z@<;X?4g_$~mtusV-zYOwS9YzJeKw7IFWoQmK)$?47o={NDCBA4XKr3?EkI(|jAv-= zgaJ5L=?whO26j(No`geL%S#YMLc)K*YNEJrb^Zau<2*uWRl%h74BP@Tx7bbySes9Q z>;PotFqat{gM=IJrEziXGsiq89(8#2)puQWouDLR=YXxC7%J9<$Q7_4(9`eZ%SPcc zY;Vqqe($0)#VK9f9Lk;9JvtL(-D8|>yYo{u)xsY8SJj$&9N{ZPGeJUky0#eqF#lis z-M_vvPY?dAlSYVlQ;M;(aEIRyTII`k^Q6{mUazcW*K2J_fq_0arI`7T)BeCT6}k4I z$6CWxPeV8q7egA!;<4d!jc~eoj^c0m65PH_!Bf+_98<^eFKzh0ptv0m7gvP+8gJ^K zl!5<1UPS{|fKR#X&i)HCe@#WHyOTqO&si^)z5%BI72TMV|^*Y)9S(p6Z=Z9Qk)%J8I=}-L3A1Tl; z!9IHTNj>!My~#hOoe~kOZn#*I{z3Eq#Ce!k-Xd7lFPZg}|Kt1qxGDnj4Q|G$?6wGz z|G~1pJ;vHirTYx^f2Sa`4a=?nW$gbl_WvP`ZLhkpP5$pT`?RFpseVq^xnU{HeY>3#^ir6wNynf4PfYmV43~)M$B+zJJP}tzW`8nY{wx?_LR86CtQ%5`Fl}~h zyEwK+LcO^9IO~m}VjktVB4K4p^yL4=NX4RYZ8HKqMbQ0xeY1_AjBb14-Bvw)i?>y0 zsOCfyuQ~9;NDam=b;07-%zsZ`$T!X?CT%sb{jcs=5}u+=2D>kuDmrdjF9cvXx67JQ z>hx_=kk9sN`2UT$z&GvIi6*)bEE5kVEhEKmH)m9y8UNzs<=LKD-JIvl=V#>I&-hh0 zrT!vg_-CT9_@2Ds#}}f${Vs+p*_~+#1-#=Km$s@=HBpkcT_ZAXcSuA3`RKoK`d_@D z7!GdFSEle4!r;AW>uE-(XT)-hT|6~emjCHP|7|4X8<*>hQ+;h`;nQRK84F+tu@mTQ zw;q!wq)2(gomkVM@X3D>&C_SN9O>RKeRe9l5|U2)4?pB^stGT>39-el{fFwtwg0kq zb2p;2fa9sP1S4mI+2-0dLOkr1##Cu8Y)q<|r?ySgAQf4Sa{qc;;n3iV)qhFClHTKz zi65%}(h}R{&tzYp3nHr#4&rk;&*^vnb)i&`F zLh}tfHKS^4je`Ns23QIDI&Wdxt^ykOTF=5>o~Nbbzgm_eVr}0T(*kmq`^|0lqBE|} z?L-o0yXP^jm|En8-#j|K3cCiiK2N7NeLdJt!H}s@rfhVWb=w^I{E4 zy>qp*BkX7b&1s7p!e+2|I11#B6gyDFUJKO9wBIT+n)da>8!geuT@@;?g?9lXIk`ib#Ah2+^OoDcCun-!HHw}8=mbyT!tx@p88`XdVR;P*C5W!D4iJs5_|$f;Jxz-KL9 zS*-}q`+N~!@}bwPo5D%Af`q07I(aaTL~zpl^oiw1yt~m-yl!cp({^k^O`DGi;oYh~ z)BR9()#Dy6LPChEpOIJpAA4^dR#msX4GV6N76BEcr9>K(Zd5uX1f->;q>+XV0xI1g zu~7+;lF)0C_~!Dw?|FacJLkdY&+omy^N$yoE;nbya)-!hNj&439YTN8`QqE`Ob~nXu&+xlqA9nH(CoIrPpF5P&0o%^U($s(oP>`_O%* zIc*o4Je+W`R5wnrAGyV z#azXf<9xOHV%29nVE?KD2dhvxZ-_sIZ~<;CPBan^{#sD zL#GSKuFkd0uD&>dW6h~K>)mvfd?^&Tl|lPhMoRAcHg8$@%LQ-%T13k>D9Z`{Cn4!y zGHL)_NWfibMRm9R{?QeK2a%m&lT4)@5Xw|E^d)&xkY<=$v6Fwd-K3@Q7oaO6)jUNQ#Uevz8}Q}L zM=8?v@G3c;4;zHbw&L)ubw4AeL0*pSa$P9Npgvh_WyoRVnYI<}07rh{qwmXRjT$_6 zo59IFn3^KF;B9~+8S(sn$VnuzWyKFt{RgM%r_H%{?`qjSmrPdlt!r)(nBZI~vZWle z>y@1^u0FSL`OJUZBL8MpTWN!Og`UR#UXG^q&)XL7loeN!wZq3fax7@KXj6%<(=WT9 zL}J0i{rPUGNlx}=G|aDL$zn0#axe9@Zlc49d7@u$aT14|uQ z3BR@(>akKPZOlz_7~|sfeTiCmhBBy~S=~!HZEQO^^W3G*MO%wZ&+}!XRIWO-+6mx$ z{mhayZeFKr`SN@blF0Yvc$brZVG&sv>CjQy*#hJe0yATL$F)!qLHiWS1}--cGvBOY5BU#1M$ui=Y{_nNFZjh9L91^9cJ1}?Aa=Bc}|wTwgtQI zedWac=AzyBrL{z)g<0b!#CCnuEZ?u>0xyC;}E2Z$F@Jfp~Se6Mh`;ccQdWc{q{i z-$Vf?aoQ5NSw0vhxXQ1V7-o^o!UIIWWJE#K-jCF5b)y9P0Ta5x25kG-Wk)Rni^rt< zpI#HU$raQjwafFyjG*xl(Q4pHgs$EDK(L|`mM~?DIMw9Ytk@mV^%poC%g0ueuzGUe z+omo>>4HJ$xYc#Enf-E4{<6;@VDa6!%Vy;$KF=_57!j4au={S@WQ0Mggs^b++Rf$M z%Yovm{x@`Rx)!g{pmWV$IQwcZp{&H5+QwX-*)b4u?fr-Q zjbU$SNl#02@y2oiP%g@8>9aZ*HZE=g23f{@a2`0Q>V>+=xe4xs21mf!l9S)ayNvXX z@KV=H^lZ$fh9-G~Y{RkJ&$LQcL$jLZhBp-A88#M>_r{AKZ)oe#f3mM$86WG}RG2F>!S<|kbBCrn>6^Md4zU}?^!&K+uFeQs^YAf1{DPpi_36ZqdBbza?6{L2VY=zb~*;= zsm<&yR$Fa47dCcd2sUC9!L!lobB$3-gl;fQuP@9TtA#ey(-TIpR(*M4csw7SlRs+h z6ZVwKUc##O@>u9Hja2(9bBM5SCPFvBou-xzJ*qjcbZK%gl`F6Xyu|k$fC4f+^POOT zWX?GsulITYR2Ph@M?G~PPLMzY$F!EGXqfgR*A_ha6&%#r8AyY~o9-c_wAo2%8b&jZ zxI9LTdPW=QOJ0-BVPyHyb^^BV((B}*CAmhYT>u`dEs9}iH1-N!RL+t2?4zzly0_V7 zNB0S%uSo)BIesaiuZ?GSS>B@zyQ-x$bp3!gyQ~B2e5cssw0OMGChZfupUx z|6MiG66}%L>`?)Z^KZ*k>xZ~5>!)%$Z;d6tywf>fQC&~YM3@u5op3T9H6Ab3oJh;D z2j%nY(-Nh{r_b*^)nNMQ>|klTyn*h0!lS>{7e>I`s}5n>V=wN!bJ%PCO{XrixArYG z(E-DTUp|`phJXU&d>6&qU>eltMQg>A?(5F8*y~{^J=POM4WTA2Q=wB~5wMqYuT~ga z9zMUWi5I|THjvplY;og)(vPI)nSNmGukC42h`17icYYYfMOL4dSI6b_dH{rP?suc* z;fI~?a2C=yH3Q51>IehLWt^GjJrc`2xn%0NCtu1;Te_+4YCGz=@S`6rfo3cA4<}Mq z&%Eet>Q9fmJhW9wcRwAY-%nq5Z)_)76dS3U7+VPu9`{d^?e(SK=U>%MJ>8v;)|rr# z^6c@~-uuEPLJ}K#VpI|n0Xw3${qP@jtpBs=YUWUQ$&(Y$Ui!aj!AcMFtKd83w*+O( z0pZGZVcZ>Kth|G>Dm3j#GW~lVwE3Va&Semtk3PC>GhK>mpw{T`>Y57M4j# zkAAeIS~O*Fd2i_A!mKI)T_#Is?{g`ZliQu;hzj? z>WB6ovN*L!KfBKE+(B;nGOr@pz%f#Le$2MZ!qPome8h@9Wpax@Vb#dx2C1EbSx;u*IB`9uIx zzT~H(4p3$PE{2Dce3PTTg8!DGq*+GGJ*H^*aHd5fQOu+34gF{&@x z=eTGsCMRy8=OM2K$8R)N zO5R%DuFgV^<4=Y=1tSAgS5Q5yUs1xGJfJ!|pcWKA{XwXqg5#iM?3h1U&9M}x7<&CR zaD>+(c#U=V<0Yu~UW>n%n0iK*B#*FrmM?L+=Y3O94Il_|*^+dAUBtx*gt0rYY`O#v zWlB2jm=(k&V>&IEgDg5G>&v+h%Fqs;^Of=Wb;SgY%S235z>&l0OV!xNq!jDs<}%^L z=nrGQ_35t`Yp#FW3`+i9i}83UdGh2ub+AletLFNAKH}WG`sc{%X*=zq}4NDujR#o*r>%-oy(Jw!t``cb{VTdZaqOQEm^b+l|&u9Ve3#y%UHfqW@e_+6=}_> zcjpQOgoHecmRUIP(n6u0+h3+FbL3DE3Cx!B#DtPUM{2iWbpxX+&dcXBJwqU#Ub?sxUpZ_ zP^pI~e*OH)`Qms{-W31wmYyOe%bY0s7bgG?R4-1eFUu>R&-sR8-92upNIq)mNHXgG zR-Vxm*%dC3%^3GB&t0F(@WLwsyyNnuKc}cZ!w%Jkx=ljr%Yt(t-{Xm@i?yzcO!K@J z+Vu|JMGTp5DBD0tmgKX0qbVAkIfC;9c3@2;km zNQ=C2ixn;6bZn8Au5h!Lq`oB<|q;M=L^Voakh98Xj=x2D$6jYu})I9g&ZC!FlFFs}i_oT;|Q4 zH~SlnmNa)i90XkKl9S8K2fCvD6|yE%#Yl@gQc2I;cTmFOT##SjSw!zL35k=t*+B$} z4(j8`ZUa(A@&9u+{M(7HTZUrPl_)SC7eBC`l4DmUeWKQcITN#SE<1RzbM1^G>NEPB znnhv%2-fuvj8X^wE#MjIHv)t*;m{*bJM%g(FdkK;tc0gb)sbim$Io%(Ip)npaUou=^p5H=P_kp2K8t69wS~zsgp#`P_&# z12kSbvu&7#ZagHy2V7K|136K!ab8O57fItoyQtkxzMOGQ-~FY#4QvUgtA$zjDy%{E zwf9M2y5N%$ZNf$GE%RTNehKw8dm2XHdu^XzbWEPfLgiC$wlny&Kr*pPHT=DN>L-CT zO43qZax<#|EA=6O< z8kP+)wk(DCrz#_sW?Z~zEr;QE#$xQU@t_1*w`rMUO_=|lk!{Mw_1v?WCR&p{p`0{7 z>r><$RCLBHkCTJaEpbC~eGx=iq1!olF5Rd^dz!B)X$OSEx4r1Yp3VTwm0-z|zFR)A zpS=T!sdE0kZn52t9DLJ|CtjRy0H@%vlc}CRf>!E!RD081;jUYqb}``U9o~nNtUkS~ zrM!~+uy8{ueW*$3Vtc@_f~^!f_VK(Uq**HM9>!TlyY2lFPpb&Jebsly3Ku48l{;`V zY$1>sO%6mY#8RPX+9==D=A3YxEn=!Vn`e=aXPpJ1n5h*XpL?ns1_Je$*DS7>B%9x$-gChyq6|4ZhKeWxhH(&vlRR8 z=;Vb1L|8jBM}JsEc(|9hD+lQV^3}3fl|x}~4q()RHBWepyXeK5)?l;4VOg#J8^r|;i#|tS&u;Za7K~BWa4z5W} zK|o3c5hraI6<20q2T2yae_OSi01;N}uKh<4>=is6?ur7$>fIC^dX7m^0ot|vF2VIa z0~(%-quD0LP|lO>U=Phs?%4pg-c>)?B>#T8yoFHX51de?#l^=Wgb=~NM?WmIqQDj# zVtyAG_tY7oeC<%$snhaeJMpk0je3gKUOggZASLMQ{+h8+`J8K_X}Y=z9*Hdotmt?% zP-IE-9PWO~13_uuNp|RlE!V2R?ZwlW!XEx_+3}x=Qx_G@;GH+bQlpYA>yo}2Ne&WZ zQ+w=DQPd`Q;lMos5qqvnV&o5(yJUArHh+l^uoV6PZ zD&b{@I>>#BFW7}>zihlkSh8I-z-uMrUBku*E#SbkjN0_LJf*1*N;Vk3x3(3($e(uB zuXC=#=l1+uD&&cbS%R5vlk(vq#O`7jNv4Kk5#vw7c9X~PNy2Ns+#B0o;Hoao1bZ!f z;wR^*dGE8V`7&qlMMhsTm9OQ|j4oq^#qOapN&NHn|N9TRH7JSTjE~xM+jN-+Dg*Hr z6;aU2qTVsex|voO%=aOcxR0!{YaUJokaonX_~&fvbbHO z72UGx*hV8vA(l4hsMG|LFnACOvre|XWVx7OkwRuQO&|S^*ez>)m=R&H=Qxm`*#CwK zi4NH9C^Zyk5`=@>5vIST4^z_-2*D7PzeprvGQ%8 z^8)n=wP9zP;C}kAcItKCXYTX&VIh2L?Om@hZY+Ujn>4s$aJB#lICQ%Gr%O<2m0`C7R?I zoG&rYlByyb;PERR#_m3bQ~Em(#cuGP$o%^Q_~+l~O5T!~oB*0^b+WQ?;~MA0_}w97#fxHaAm|X=|bj!bjAQFK;@ToD-9o>=IQVQoNi(D zBu^{Z04-D=@RSy;PuTSXRKo%(o5FPc4Hn)ndSM~;R0b0oev5|bL-JY*&g`$sF-Jr= zC3P(KLTAEgwh*Y`C4*fE;`lZz^2a?IrKEDju+<1H5z;3W;J694aG^Oe0ws_+hcWeQ zLp>>1jsmI9ukmfi=|~iq`C6-2xzz}j;g~EHxg;KE+ukqFKYu#})TAne4L);6eZDzI z`0>Tdh8xx(#}wCFQ9DxB=REiy^6|ftp8v?!tdHRV0aifPy=P=-YK~cHhj)`2zX{x! z^6t@>ik!J?VT!l*)gB>Vo=;wCg;~sWU7mHhY*5sH_^p>ztQU=DFS3JopIlL-347KY zA)`}EM4jQw^Zx+nEYmED`9=Yn0qg^S*l!>BDlNl8L%%BNH%}PHgh6?F9Vjtv%)iqC zM5{jwW*6&p1@M+-P}5en#fsRE+}-h%x6G64PhZXu4l;XrywgG~B*rRf4`SeBCQrJ6 z-^v0Cqtyn?n^SnmJgB+9QWfVJvP-^@I1K5{gCogQb<}Y-ux)KPzYQ{00GYOI2b|Oq zhEeLN6|3*6Auv;`FhEH>q zyn7=;(S$d`+N+*5M({hU0Sro;>&}!f!_`nYEnklvF56=ZeL^lSb zK!Nx|%^&U}w7;*@0*_bCJsJBeNt53Tn7$1bP+_s!{Kt=lBSCA`#ZE2z^IErnb&YVM z$ll=3mwKXuOLI|`w64Va(CTy@QGmVIa+H_-&zIIfPGB|fbml)q04@b<1u*aV7F&@1 z*$~I73ob>?tW}QwYryfp(kr1h5}c%dv?wUx&zG`-ORo>;ewY4dYW}MquyTMQZ`wjb z{Lhv^tQc@9k{N41&6RluTAi;du*Yr{Wl>#KwEyE%P-VcSo{wWz{*b=F$JR4|7<3#R z2>sI@_;0uh>;5-f{~NCV&948=uK&%h|2KjGc^KEN{VYX@)lU}%ib;QB#4slcYkJP(`u(Ba{`NSxv$wSu z*B~zT(%9c_jOF!6F+>6?$-U~B79gbEAX?K#QqmzXkaOhQ8ql?9 zMkOKRVH>1%Ik*cVTsBHUDSa$83~GrH3y6A&9m|ee1~w~eo+;1kBPQ-wq6*f0Sd?iZ z3~~7WsGWC%P26SavtJYd?1dGFm77fRPOVCf?QMQ`nHML6)yxos*a`{sU0jneWEiT_ z6hv?Twv*I+fPQ1U2tS~|m?1Caap&7A4kKql5~sOPL%`LUr_rHN9fst0@|so6+sOZ> zic!tZfN5^ub$9Y)pg0QLS=XxNF2_cWR-kpTP1@mK3A72_k;F2vJc#*3kzusBfWW&@ zsJhtCiJlD>s)9V6RW^wS1!KdF38FA8=HlinI)bXhw$7Bbhje|CvkC=Y}T<)&QSKiDRIC5KOjecU07+^f(+N_&M zRe=VSS~P19Ji8B{!LV0!f>@)fYVZq21IS7n$=#2p!zcnHN^KX5a;}bZ zVO@4`X3~D`(~rgSvpSmg3y!sgTwG$TU})66XMWg3Vk_eW zC_4?)CM)c@=58GHGl^kfgl+?0Scg4XOlpFT!Bf<;=F4pf)WC?8sF$YgL1jY5Mqa#- zr8^Sq=a(z5v>rt{3{Cz zJ2PONoxY1Bu-CoQBJZ9DvM8BF?y~_G@WZp{jyRY#iQ^P}etgsYt2;s$1kn zWaYs~24ut4kJ^V{gVSkGQIQ`@fKM{#2iy2k9dFJa66uDW5|2jGk*=%&y=f_^nve^I zuHWQW0FIo`4jp$Zm!2B#_p4fZOq?xnMMH5+PWqBYgcO8u&glFENC8pUTw}Rz9?g_~ z5fE821{`JcAk2w7T0>(YF<^1^n)^=%?O)l8cae~#qlA%j!er^@@exN)_!@e`RKyCe zY;V-SnbzO zLAo`zdpR*j7HR`z&mwhaXYA=7<|(lHE9!SK&~v7b6vr)=?s|}qVB(r^)IS~>tQvR& zWqK38r^66o-USIar=QwMAo0LuV;P7&8$9Drz^Yu~pi86(vSZCdo-U7lRSy+ln?r!m z$I4P{1KPOGWKui~_(p1S&E>DYp$mXw zcs;^T`kg*OzOxwrnY+Nzl=pf$pr(xMYs0D+3^hYk07od1R`G5J$Pg39zg&=EcfJaDxIWie&0bwRd6~unX!-s1rPUjP zTkx=DA#iH6O423t$$1R7X}^HZSBGyY2D9mgfXZY94gn7hun#sPAZK64TDWjf1VmlU zD`MI=6#(%eM(B+FSlC-b?Ywix!JNbFkp5x=?GM$8ncKTeTfd#J zLyn`P6E8qFLNF(0Q%bbv=lKVwU;i8F9DuucvnlN%J8N z3)11AMX&Bdj%_B;>tuEeIu$gFMocrb{bQba*5EO20U_`Q_RLEtn?uR&jcj-dofwDV zaObrjK*%nrtj+`+;Me-BfO1NXD|skFUidLN3wfDX{E;VQG;;V1omdvEPZ#esk$bp; zecd?#a6nOlJ?KS>v~*k5mc&iz-wAivo1 z>ueF26oT04G|R47z_;c;L4%^5rk+8Tpdqw1yJY60;nzUUd-x5Z%Pni676w&UyR+H} zSPP_jHz0E}&-6R|)_zqTEyzR48KyD|(#?k}45{VMBV-+*k>1~k?Khf{U#Q5i|CvNjBc%x zDG>jNZLH85#o)(=?}LnA;?Rht0UMYAbW+4wz4zWST#A6{QZIc)HQ4(u;rqO$2=Y-_ zN3Uvgsq>J5b5as}xVtjD>xwM(kAJF}LIZ_Ge37EkRT=H~wYtqH3xSJlb2pZ^t^^nV zAd|hJE_B?NlB8Eg_;03_h!R}->`}fq^?w5L|3VX@ihx3pq9Ba-&omo{D7ZA>wb2d9 zD>B9Zy3t+$wu!u^vH$Y|jNXAuiGH=?g#F99{?iR1gn!6)(OXNwEb!lDf6RDWIo6}Ythy^%x6pM#46 z3a)oA6vh9%fM?*+m|God6n~Bv5nNE&p=Bip{doZa(4|zLhDH7yFaHhL|H}e4iu9e7 zoN^OTMs2@5ZKwNV?l6j};a$z-uo7paYN~l0i*f03uyI}H<9)X?N4VE5T#={GVb_gV z8DehZr*beX1WaS4r5)~GH1={#CcNt85f}amTVV8hh4bzGH&3ru&yG*C@)w-_hQ|{P zZ#YC-3UqC>+o`Imc$67WJFTo26DSBHq5SEOq;!l&aXT(1-{}^e=#xB=F&_N!k3h+q z0FuCEQ=S)p{B&pmuX~VDZ5}PRt+xEF&llFmV-5Mrrp46s{co*C_GOK55Urb&0MFlB zjSRG!)Qowx+kfl!NMaH;|4L@bp-cN)s{!{$IH=LCkR;>p+)0c_CP>$LKJCr#&;98+ z{eF~5Z0KM$G1*c2Du3hA3d3ocbScEct11%X|K4h7!D{aH_S^@08mvaY>}8P3pTiP-;HLsl0FF*}oNfNzYGPnuH8QGgKOX)ug24w0hu;BV zCaI$>FZZ`rb1xjM=D$JzALHo%yFvem77mPHk7Z)nQ`oSFe?06qfUT^a9s=uN#G_+i zKtgs?yK3XXM?g${lWjhS0_K_S+RzWZp5m*DfJ0YP{(r~1PATNX3^0>X7il927y zlbA;)idpMb!1Xu{SVkr%feb#!nT8K~b??yORi+G@(V!&HE;5BXPrB~P2JUksK&i;U zy1;MoVo*&hN1dnWr`uvB;$v{e-r}b!4{o=U<+N?SOHk#jxKx5}=}{}-!|@>#aDJ!q zLY)R`7WC2EJ?8<{c|F8fRnJ0Q`+DS-CB5QBz3}E6G z(fuMM|9JzrDe*EuxmKYE8pUpcdgSeyD`;?lAv5IRAB>mTV?u)+mPQKAA{W}yHRfxC z1c4j%ruA3?-&^K2BgN?LeonpiC#?IeOt4g}dygLAp7o^4##zk?~K1PfgdGFPAN zSj|VOz8EeBte+p~c-s7|-xQ=$)H?wPFb%^|RAO^nx?zn%Q&){V24bX#>?MwgP{+z zY(J}kKef{8^8C;b5FJcwz^yc$TaUw#jaMQVa0u9p>^w_^+W|W0N_+i!IL|P0z0mDj z+v7Gf4XsHq(Xtfrov#XS)a>K}n~;^_3^Z3|?wo7b{dzikXj$0*B7>bIn`xgO+(hT4 zo)l@Q+$%KC?ai3 zqxcOeL_PB+Oo4rLFIc~45A;GZz;LlhxLM=vdL*sM;b@R=8B%SKk!Ws^IqJqY%fiv; z`?7i|R*#c_PgoG@*`EGDm-wJS##1WYrjf`P=B4}qCf3e1=?b4h&wGHoWd$b3_yWHu z(}uAI#>@~H_8?mBu#U_r=8N?KiECIl#Qpr_Cj|~|Rtt4q@(EzH$eBy$!dO=`^L>G* zn4(Di%)cfqTwbu$(KfQnpq(2;Q9baN-ap`@f&xl@Y1Lf{*4s(J{h6@?toAxG_ zfGvMt`xv;fbg=H23}mWvgL2;gX8K^){Lp||)9p8zWt-$8L@4rcon6fT4wKYC>_A}hi|Q#aOwg*8iHpEM3>@%lBcZH_d(utPGkS<}1}HNF zqoWmQZT125TS_OK#DG2tYC7?uz!400gNr`%1XgMGDmo3AbPTSVDDIOHZMpHGZmf%^ zH840*8)LqV<{RW{MV}O9Mcf<16n9>}{;U>Afyr(&#p-&rB^uHINL<{*{7jTuPJ+A? zt8uilX-h^VHZU^5EuO$wNL~02=mMPZ1+*WxIUwt&K|dr8#FJ7AQ*WHj-i4FVmy0^M zILnVhCh+!|Trf?-ugdMT(Sxh!VvRvWm>}=b)+Pp=HwD82uR(;85B>6)0=M{xaRoHJ zqnp&v>J)`jqk>SdcS$Jh z^vQ<6kw`|0n4zmjHQbu2-8S(^yfFTfn08JiougejbFt^&6%gHijR3iQXF%2>#LY|Q zcD*mQf80_I$Ymyn$~homN@IPaD8DAnxwR*FC&g=|3i$9!_Ub{F#vduNAcoxUgx^9e zB0kK5J67JZ=3}2}-y()|r1a;OT)39i)!l{6c~ML&tfo4LzfoST`(|>mw%8-2&Nb zEjkxF(KF*Jg88l}!!JtcnmeC^_d;QiP-ci>%p_5o^XQxqbG^}|2%)$Q!Uo~SnaB|< z35^tStTOR9C@eC25oBQ+?Xm~trw@k@+X4)7B)^AiqYFAN#2U|3{}@x!{Ay7&oGLXX z_C4;f!qhB3b#u}SlbKLE~SJgLh)|*J2RL=t5 zpQ7D=MJ|oBJx;$!HdhuF3XPiyu1$rymNOW)3HXj?Re9`7{f=GoXM^~R;@-#dpv_H{ zn>_z(lnp1M(gjSDb+Ia_wK!GstA$2e>{4Kht2LYgVA zHrc{~2o_~Xf#yk0TNE3ghEPV6O3Kwl3*S)HvR4^VnYUl+{=Cg0f*TRVq_L1K?M6F~ z&Pvft9a&%?exiBS8k4se<~6By&rA4&Iim%&_#u_i@20xz-$ur~yEi}Yk_go|+7!=lP~_WP95 z%8V7q?Z#QD)I3*Za53+aiE&pL7k!vs&H2L`g@KW-N$5;i8nZs_dv9AK8wAbE zo*u@Z>nU9UahXpX!P#ZMt=1SCbt^e5lNdukIXA1M8;8b_Pbz%L0E?d4MB{t-fvuc@Hsu2vl;C8y8A;HGe&S`+pf|2AZQYj)qZwk|fG@NYt zLh4Y%d@5K6`U>N!>4yd*$7j1;^}uF)&%0yEPlof(6;whD8?w<{%(J(&YO%`tUcn#e zXvLjAR`fj~Z^H{&No;vS+u-;mx<#!g_ii+seq#fAaVV8IDlMf+J}3ozObcq0#{dfC zQ8~F3rI`d(MIbVaT_K2j<~{dtrwgs7y3M<50l@Vy1U2HBCw^!B%%@x9SrriAaZoVaK;JxT-@4%TZBNNo~XfSXfF-;h>PfI7!mP5ZuC zfwq4bvIL~BnfLQn8nd4R$9O=KO*VarZvasQK{u|@**1ek9H?u?K$LlmDjfryt&fZC zF?o8h9>*!a|B2l_*Lw|<@usNn%?*4(NIJLf5ejtrj%qqo!_LSEXE$gLA;b;&-XrdS zemC!V2$5G!aDnm=ZJartH*IqxumrqSR%d?a0K&qlB5WPFHAqg4KYWVt@ewA;iwRk# zWReuEj_(3ZC4|xYltVtE*H9))A-9gymi)wS>nQCYMb{w<&PuQjjF#;JMEv7qMiy5O zr5E=$^4H$Rtb@Ts;{2bShuxfH@(*<#NcPVY+nFJ#8fjz+&e0=}h=;`ISCI+5vfz+5 zNlIkZ6Lp>8KaJQ2>6MhuH1>(Kyh1NZcnp7JJQIIuTk;@i1k*I!*@g;7Fym%&M(HSB z5Q&1{u(FePwLzADzCFBuuZcS2DH2L6zU~YUlTzId^>E6wo}SwVNDoxdT3@|Nu<7Jk zB=BO(v+wPpGtpQb$kJzp5#ha#77pU~slkq_qWFq}q)#I4i|K`|h$~^5R#e7_BIbZX z8_^;W!Ze)1lQ-&wh&qrM?fn5`J_9wSk1obR8by$DG{r4s9yH&W0nveLc?ztta!FW7 z7?I3-k`8w;;J7BQs+6mTg>k$rUVvdpYJopyYWAs=T0lFx&dS!k;#)PfH+=$b!wN!T z-+5r7#i;8CKAx#6U_`COA9mqI$=}+PwodOdd$vWH@^*7VrR=juV?&{Itv^gG7lwV< z4WSTkk`_}@Bed4TNe`XZRGUtby+)t6Ni3U{MYis!bLGJ~cyKJXRE}I~CJD!mJ3s70?cWru-C4Kr%V>`B)!i|3V7^0xfs2PMlolzR$Pw%8= z5+MdNecr|!%%wZ!87G5cK*#A}f}}dFRLtIe3MzqhIdcB=^0_eS#x(cXZ!{LCThsNk z;eGTW-m0`(QcO7t{BlAJNi}`Q!{`=?7c44y_`4=TO`%UcZNOIbkxSrB(JHJeG8<$b zkd$`qbFSIEjfN_LgmhL(ndDDH*W9f{(yX8{-e>8DLy8f;?9`~B>G#3W>lxZZy<@*m zv@X3iB*UJ?GY32Fw6A?-=nX6$R2k)Wo=kdlx`XEN^iR^U*oq79?l8S<;DzB5L@P&Q z(G#$%Rh+D3u$7|{g_u4}uk7F)&9v(HCa+QHy#En?4GfLb9)^>^uv4dyE(Fw^ms4h0 z)h3KUv5(0(xdSFIHM$cr%=bvM1m^s#{*EcvI>1l`&d;!Mc-Y3id3nmjt|e{T&yc6d zsfwLW^A`E37kQ^-z->iXAX#%=n(Foq1;f<^H=Ry_nBtDI0jgD1j2HJq7TP(wundGt z!K}c#N#Lm|<6O1=>j(FM6&nz=23wBzV-OWSX$M?D5YJssjq?p6~l zT?DM`++B(AUYX9FIj3~R_>@CWXH^ zLeQ-a40XK4aY=B)#vqtUCE7M6qy-*8-9q7_IdMp@A!@N0wi5XggVs`~uYBcuMx89z zI6=NQZgR+lU@E8Lo!i;Zttp4zg{|a1!SFHU{wU3xXx3$KL_~xU%c2eD_lfQk;EE{R zM7j?fOg@-&Ud5e z7o8V*a%@I2dqf_SYlHR~E6`xoR0;Z;)z#q|{f~&a7AtR(KX^9hDb6rsfCO&e|)e<=3O- zZD5&eJO}18bJzKF(r^I_)9K)-BK?4Yqx@N+>u+^&GnSJtl@$C?tn@uYwJMjV31X0cO%=Bp9 z!Z;TT+2F+esWP)j&@3Y0rF=x3fP8{BGh1emV~c?-X)ne3vZFDAh!#cCAS1=%>$AX* zanUbL(@XeK7l-nVyUhDdCkGumT7Sqc9s)$-2TdrDLi`l*hZR|69SQ#6mwEW}ka!fJ z9v+L-i|;P;+9!bSA$g0>A8}r#{8naS-D$J7V!c0Q0$6#-s+-PF_A!T3l6ocyt7gwg zr7zRcrOCB4Uwo+njw)48pXw1W&2Po@b}W2WS5k=d%% z^CP{3*7F5d*nTb)AR-6!si{pd3m;E!bJXimFg-7X?z^9NG%_3O(YYxUJd?a?y>HxI zVNZ7kyjW8gy>MoHnM`w-$ormZk4w=l)J1oIbeh&v+_k`HQWSF9VID3FA`vws8ja@o zP>fnjsI~5_1oVWZbQo3&f-xM{PB)M_vVr>}7Z4j!{E4fv>=C&YDi6Wv2x*O!l=S9^ z275wYyVsGrILHUAO$BCy*=!|?ApEgY+>Z{u>L#rZ!mU5dKN$cxqC{Z7<%ZW0+QHX8 z8bZ&Mq6dt_k;slm?dMNZaWNL34C{Jh&oCU?6)|rH0~#|1<>8Cwv+wJlBK6~#^8qWl4}7kS!br$6~2EdNsyrJ<~v_hAU*?{)6!eXT~-8{P04* z`RJH94G8@z?;oH{T$;5IZ{rRLp3X;W6_5gIf~Ll}J;GbssZ z>;6GXYl*H#DdB0zgT|ho%}QSlD2$&i=0TKG@VX~&t!r1n*x}&eKv1Z}azB^RZ2*j- zl4jvR7h||JaQ-zogBO~kk{H~ijR_LI$u2zQ3LVJ61V?4mFvVd6%S~ovWYQ?Y0z-p! zxEJGXXLyp=q>9IEq|Kvtznk6h0!Wje|9CDOj)epBVFXmyuQ<1`I zD~v8t$lvoucPnz{1Y*)WR<_1x$~)Y;jzgIO44scOBq(D#uHySRo&k)?Teb^x!5H8M zPBXLk7#cSr{4klMtlT<`ZDW85g2Lag>3g+-%e2vMD(T*Xsh!M#9#IU)@)X}q-Tkr7 zfDefPG?czN<2P!LIcm+>D{$7UC%0^Fu1R)kRoDg=avJyI*zQ!^*H&QaF^o1jpQfJ$ zhhzyT8JcDc4Te5yeAYr{YQAR&Xk3Cu z`BB&h1+)j0^<;#0wFdE(y&&DVw6ogWc=3(PDgdlUHh3M@#17${{-_(tXOo(<& z3AQY--GJ{idkA*-Ds3kaKHy}TzrYW7vO^`;btceos`0ZP8>zu{`>+B=L zph+Bs4$V-+)Sr=^07TI`K=&k@TAJu#Um)Kr8!K}7qZgTK?28dfav$JNVEERS2|(J| zCR;4oo^84j<iGAL`ocGn0`c z%)YnbSpsX7)>$>0$7zYq1HzrldtQEwe|-)=VAY3xI!~N&Z4Fp1o8D_Rz;C;q+g=Au z|4KHx$z62bsNqKZdO}V+bGe6`wS)w;{5?to{2i?g1U_`mPEwZuU|?UrfrF)0X7^#3 zccydFBlNSkBvWFt5#Xv+JHe@R^zICJCnLW9RHa2iCoA1)WthcdGN<0>3)eQuD{Mt_ zR}hBh!2q;~-U1y8z6a~0s>F5*FT6dJX^D~L5AYu;@~g)e3q&nYeESSYL^$2C*~9rh zLlYcYXP!lVA4z+5YStgxO4EqjUOH-JdVt`_PB;B|;08AAuYeRaQ(JlIsXhnod7P;E z;u5l6n|1%whD$&czF%x`G~?x3v3X0Bvl zy1VRR5Tot-Ejyzti8cn^XF@EUG&-=|bvR|oG|VZAT^nYq^8Ns4EXF^6d~9aJ6tBW^si$v^n_cl*-qb$fq^ zrfk$!qzNm?B$`DQ3#?w@!l)@ge}pKik8AuzzwhYGWdFj1JX|b2BsFnf@d3;bw?V`K zJI_j?#|BHLECFO*z0jw3KFGh%rxn-qYfl3l(f(p`x~BR zUZF?)?=Tjgy=`R@>0IIZfeSGJso;d>ycO6r0*cI&0|NI!ZFC{QE)R*7{iT*7M0RbzO-{If5 z6VN5y3b6L(UkcgpX8-4J{L5bhkA>ud*o!;3f6Wp9&;NYyBXBcd&r5OR{H^aAvkaUb zG0T=nNLQ)l|NI3>pP{?{-^Kr@oAv+KJD>C!y#k1F(?IIR#;29}cGL|jh*DOoshW?6 z92|C@REduxTf*u5rtAIuKrh}$$Bu1nSCjTp-?IUcsdR(K4;~kJlgpZK{ zUm!*(_2@EK)uPtlz?E4Y`1`9R=$bd4wP(G2s@Fyqjjx z4w|E8x`y4V5Q50ipugAPkQuV9K7Tktc}OfmlBH3M14*c_ftvmEG=7-Z5sbyIXUM6* zgKYh|M>GCh!@Vq3md0@wMUFa5B~xCq2k`=If1Ol}Ad8t%YQ}o$!zAHCWSI-dI-zoa zpTq`$<-^fD@;h2~zjA?Wf16VPsONeO?{8VFM?hm)a?gQO9w0&v)%$uHJeF$gpNrP8 z3;XHay{gMD%*@h`N_5>0^mw<7^4`CiR`kaE(M=)too9Z2coYH^xxZ{~t99!pu7 zBNa>6_iu_wV?u_%EHYPjeSIcFAud}hQCO%mdJ&dT_WYme@847KLt1c9{CsVphJVsyWlSvncuh#PuSHE=lk z7^njU>{bVups|)d*17S>ZB@DaSorIEzbai0a{&UoyMoKV1xA1Qb_t#`4lH+n7K26% zrnbHiruEjV_xUY12Tc;h8SGl(3xTz*^eLYlZjwWm9W@`9Ku-i<(jK(~z&Q=-k&pUxuisxlGDvQ>D5eiE zW3ZJaZ->|Vq&POi#GJt3);jQ|zfJ-MpD1`fah6OCxG1i>0i<5MeS*uM_v;z4PwB!Z z1~QGa44rCswy)O@A2wNKYc`FnnJhvwk-qF9@|~fqvX$@Kg3f2#P4$59t!FM@!;7Yv zi9yGweFvt1F+I$EA?yZkTr)ETe z=gMoe4tgPP*8ytrxmDXlIiscW;A&W!8>;f?ajHX!1G(GY^Ro+fBdm{`qtNg`O~420 zeV~a#(=h+>lz(z$Bu&vi5n!ueizDePBFrd2c$cU*s}k})VvBpy5Tf-F^4J(eic|t6 zo{dl+Ahqm}*UK+~voOCAI>e!@IS=yo4A!FqDI%+2T zX&5W3btjA^d_$gp`-vmyK6^##g$0WDprO0?l`=bd1vl`|z@{_I40mVanMhYkJK_K| zfbg{^_C75-USbbmdblwnR>=BNNG$P(z^p-dT>_0vuP$MG3^X;e<$CEK%bb5Y>HL4# z`|@xq+qG|&Wek}TAxmW*G9_eKXfn%CDj6~qktrhMB1y)~GY!T{NJ3?vi5`?8WhP`U zGkxdPyZ5`F@BMam|9;2u{eGTiSqYP41%J8l?&vMcw)ohNjA? z%ITC_kecTyMn`rOqe5}lENA~Z_ua1vS5kvAu?7yiowN`#)PM3=kE77?w~1svq{VvE zAPVDKEH4w$5cYsgOt;@;YOhNL0O=(fbhJh<y$y8>(UMvi zd0n&q-i?5nm!&=+_aZz!icO^JI&Qja;slb-@ey3vt%LMBqX?e&D(L#$%igP zqWwx|4N`ldfBr|YA)W@^!u9s3Yo=tEeq z*n=GFJrOoOA2f4EMn)wF45(>)blERHNS|kr@?qmeq`!E=pkFyE8@0{EW7s(=s>FnB zuszmUDZ{m1Pj!a(RT?lLQfWhhJEmBw^Q`gjwFBDG z@x=9ldDDZe;tQohg0qx+^*N#VsP8nu3K^$t?-<-@jD>x;=_ z^`bM%|GB-fH#Uf?r531E&gUlK`{k)FIc}XZ@%piv;1Tc0z!VwAeR>4;wvd%N#AQk6 ztbK2aTE2SXW3QFc zPnFFUTn;ihe^k7=A7;9U844u1XO!ouJ8rnQ9i>U|II`iz?=q0N!N(DmwUsE>6st7*6EI$J1rejfw$d+W*LMQU0P~CJaT9 z3R2pOy)fV9dBMhSOx_UlxJ;QjRKHOaubLo9k&ZNP)jb8~=F4Q5lO3I_lQCm5d_qT+ z=}4jmgq~DuJE|(N+g?e=N<ngfZ&>~B0USuPtO%R%*U$kJDMi5yDdrCcNcfk0v8(-U5q|St(8ha8gaeAh!&fQJW6_MO^n1!0o#@Ard(aIK z!{Izc$DJ!Yny*2u{UNLA21cZDK4Lv5?^$9oW3o| z6LCt}8k))kWToB`usUP97UQJe5-U8yWgS^jHj=Xf1$F>vG@hx&l20*eM84{J$>HY& zgf0Apnv-mHOdF$pk)#=!%BDmCmPZ>`BZT=IvDf@$C~CQ)C}{8a5fR~uRF5m^t9!+D z@hFk@Mv7ZJ-s<&=aWhHsD%)F9u@s#+yCOIHz3OHpCuUDc+}eJ03JneV?@k@}jf@t% z6C#(P=Jb5prKvb=#Zx`>V0-bKnR6Wy?b18Qn0+xBqykIQj+5p6$gU!3NbDy>QH&eG zs@u@n;_2`*0eCtLkL-=FIuvIS^;Cl*+AR}kV^1Z3aN=~-v$5~@r!vRn-EtKykDq4T z%4vhUz_I>gdT-n#Q~qcef^%#;KMfaA#$5kywIQ6-K|=$A& zu*Di)4#Hb8e+g$hDuPBxEv(;n^jo?%Q0@id8~Mwk)CuRZ8;K>{IDL>!$igbhEBa1GYp>e6}nA>%{pyLvUC2YY54 zV>H|U!srx+uFPec`I9O^Y0_J3AQ-8ny?Ix+4bH6^)A_1IbRwmkDe*RMwEOJr8Fg_G0(>w6~9Mzf? z=TA|~jWh0a#jqIW-JW4@x$S}uTvlB6DGxNFjz#jS4j}zUhaYtD-hGs*YA#^4(Ncb8 z0Q3g?&%y^vm^7%Ux#$R{l$c|D8eNeu2T|yUMxMk_3rYYtda5^d&e5dK1@#XlM${8+ zw`DRey>>Mazk!Mrlx~BR>yC>llx~>)UteY7!iLMI`)HLYu;(M(Z&zaaE`hC^gqWpQ z;{Y}$LNy@Bv(Tg!{2OMV)ZYC|t?kW46lmTgPyojJT4!#zBYPIZ)T5yo}2qDW*oP18=zqyMHSUrwlRc-G`Co^W0n5 z@+@M^&(h{(2+J9YLkG;UtfvYyq;Af#6+V1Vt0c*^e%XV{0x9yTGl%y%U%Ey$S{Y@U zt#4>^*EG+TU#iXdQpW=7Eul-e*HF1UydjlxrTDtt%*29*`TS0scjj~aivixe?YLK7 z>&tfb0E<*=K-^Fr#AP$^CQdKaCY+w2+=6;HqtA-cCjBwxoQ>dkztUOK!r=Eu2{aa* zxUarr7b%#UVxt2d0Os2J&a&dU`ms&M29|{R=Xv?m4IsrEai_D5r20hpacHxU5!TQ1 zB6+B*1JJ>Ew0qja?*K(^_T>7y~$mtZjF^W`ea%LcDNdo@7~WYk&R^CzwqVm2#*(;VwU0Bb5CB2j1{L%c8rcO4c>%G5%EG{w?^E@QSmY zIp3?dWnItTr4q4->vZW;lx07oZRid>MmX$FH6r3Nv&5b>Q3m&=eJysMwhQcqpXFw> z!#7IYjJ(hOb}z&erT}Nn{!%ah3l!(ZqM)4;qb48_jC#~7vFb-g6Z%EiN7;T~LH^gS z8n0HFVUT&i(I4SvcsqbtM!Ne!w&yi} zWMBjn;8UoGHJ3YXUH)}T{?q@w??EO&+jFf8e`o^S1BFhL@da&-9jfwwRh0XZ;A%o= z?#UScrzi01hFvX0UejLn>7X4rmw(+gygBT#j|wh{H9Yy(|GC4TG|vL&&*Nde6W;c( zYiGJ@i>{_vaNKQ&$N8`4oZf^Uti|DHynpy$kruMvwT}Jy4q)xSq(hSDk@NLi#*f;+ zUE&VQtN=M*d-CE({%GM4cmzeS=}EtE9H~DN&^gckXTM`VY2Pb*lkjJnX_>8!VqVEJ zJN0UR`;plO>Aled>d#(2{rv&@e?LbZM`8&l{p23nzx|Zoe|bE?6CT~Db0O+m{@_=@ zPbZNP(6S}}qfe*f72xBGGUs=~m;QF0*(LB2?BOjY`J;CLnlAYGTJqD3|N9R7?rZ29 z!7{qX_=)gmUo}D-KJKaYQTJa9cc(uIh#(*~XlAF+{OzkY^1{azc(47@>+6fzgW9Iy zTG!uwxBv0%M&Wfom=^W&Z@+M-HE<7{=w}=+AKT$Gf8WFw;f1;1-gMy)*FYUQd87+C z{>L@`?myRHpKYA55dO0@kUk9S_kWlBzgZXme=qm=m&5Ws=uLg!h(-9uJg{BJeQ>N* z_L{p75A>^?NQapZbK(QRZuwy&0Wl0f(Hv+6!PbXj`Rn~9^QbZb0I1GUry_3*5OXS! zMN%Qi(D3Sm0OZ-swVMLKa#x!7y7el!VU;J^QXZMO#0Y-4p0k~)k-)&Cm27BpF2)YY z`9t&cw}IHI0Y4t59ywUR#iVle%bOb-qoYkxj~Z@MGAcKOaj1YrK?S0;a=%ZK|A!@f zkF+`IfsjHU^1b32nWRB6R09PWJCecVH}NDzyWG+E;sZPlp?h5bd-}~kjI?HzzQjYI zq^1F$BRO~NuScf>!ObiT?4v}07htvLRw0*(xfqzP>S8&2Z(ti7KrIsp)LNn157hQ= zg4r*eK-tRyS|%zqVB1x%2k8pkDEL$}bZ0V`)!%vp=vqL6pMoQ!x!1nG$Me zaWmDio>h#6UsL&%P*|Q2pq-x-17*4$cS9~A>8W5Gu zeQE=4L_LmH+=1?NM67Ws=t?i+>L67h^;pCRIQ9=?9V4v$xefTp*&Xn>gXFBI5MXf@ zKYBVIRM&cdjL`y*?^hK{NKRyJyf^Xgc|5qS8A(l{nrIG`@HEJ(fEtFrwbr5 z!(wEZp+HB7MfB5}4k3%-bc^-^`+;&ZfaGX<;7!{?a8{U08+5m;&0=8PvGi;&hj=!r zzF$hW8ON-O|8UwgQb@MHN#h@g9QT1Nfl_ZIv%UHqUa7z{k50aeHclWhZb0ikp>`$ksq8PiF{zt-q5tH2 za!WLH2kSU5BTTadqN_!*b6ip60r*gGflhpUb}y@(V+J2+f3=94}OvhUFZjBcsn1%q?xkn*uOusSzKGlyV zPh~C%@-aX|!V+Xaopq+p->ZrDgXKj>Gu9N)p9@(jvL17_ErI1x1CmnCxV0hU+-LK1 zObt6pv=^GwYQdFcTg(G)L-zE4umaOXC5Q&8*^d#|+Z%?-E_` zf)_jxfhs#JR0$IKkww5fsUWw zw!NGy!W`l#TdwCW%eUOrF)TlLvGI=5dB9R%Bwh1tmp;-v(ft_xluX z9SXnxxvcITC~89*tfn8YfTAzdzG?f+B`!LDpEy2X!MI&0no&|+4VuFHdB|*Wv?*YO zlA(FOHjbgeIsEZpVi$xTAr2`9mtNG4?2*4O(Fl`*qMhVULSQ>Ks7;7A@AU;RgZpt% zslFMYcfs}v`H&R}E{MmMXcm9`b&4}ooh+XTqfUebck8=Q@L_>o>~XGZC#kNV?%jjj z6r$~NOBzd+D76-yRSm6la1Pz-v3c?gqn_|M58sH^^}f-gvi>Fi6@AZ1Xv8UqUPEqf_A`7Vk|H5>b+6u9XkSpdA2`teZgx zf{hPV=7=ns@`fPEd#;E;t|K3osUrJuu{|8o`^0#b=SMyt^Mp^hoDBVT6W>KWrXY4Y5>4 zV|wD{{iqpo=z8v7VmM@Xcp@g9)DOca^g}6=ld3m}@4Janhg9Kl{d2I8T(&Z1EY!Ga zNG$=|)lM1_Bxc$?rgL#^Lh&an$rV=!qgM9ST4oXVFpZ%iNPU-qwUDKGq}kxRtJ3lHDb@}l(lgmNe z80}B(2s8vtSS&`KZ~z@~^0&TIfGm1g|FcBS8XN}99bXPZh=dt{owSdq+nL4vA{_m* z>fJ9SmmBW$UC0k1*0x__k`Ca_OOP`{Vk7ODEah8X-i-{EQHvJ5W^djl9tk!$z2F1q zWJ6FT?7E6_@c4(I-k=64PT0)6{u*2ad!x{NJ)1q2=VSuWXA~%l)0hejYJk6y(_$BQ z*R;Y=X$L!B2d`Mgrw9d6NbTgvlAY*EeNH7QMF6>a1D-b4jBBF?rJeAO%7jN3m|tiQ zvW%t}Z4@!DzL^%nisZ(IphQrCT4}nA#*VRa8Ft6Ol$&25Ax|;Vl zFeKx$2}?uvPNie;Duwn+H)>QnUCf{&utAuK-R4H)z*~enA%5D?nrZub_t|?S3adB$ zE3!5{bT4wTh><$##HA-fV5htYN$tRrt!m4t22_c!dslXDT_jEq`bd10xJndS@Ciaf zaAd;shvW&2*z0t@csxlJbq-xW9#2Z3LF2Fc*iF)aD9DFnI}mx|^1UD=2aPL#)=>|t z7WPll;7!`4&VjTl1m2e~ETL>91T{f)xL^pYM5d^!28W+o{N_PZKRhi)5+osoNNHo0 zL{YQ>a`Rfsi+(b0_fi-1PPe3`zL}61xpG-tQ>!p^5xC`srzBv*5fn0rz{uS5Vv*Ro zKg@ZmzV5a}K+p+{wh)yhDFKMXBO*CfD*=@`$S0M`OuQemIIg@+9@f*A-xJqn2w^fK zi>y$!1rP9J$VEVA6>sKeDKn*uPNvmYzJpJGxn3Fh>4MYqhO2KT>VB3voBMg#k;!M= z{uBK8Jx8Nb9`;uccoaI)2`xYj@{{>jc_kcvKXfbiSKUODoFS!{O?hSZ^E4B6jU!WE zuDa@ZecgOxn}c@RXHF0f&|yJEYd`Q+w*)o~7>3TWWXb5BgfiX+`?BuZu! zk&DKPhrC9Ba+>Is1JO+yx+|SLwAiamdofBVU`To#Rm=s7sXDys!~wkZ?zg-kw15hw z&nygipG`L=E#YkP)wAi{EqrWPI+ zXiz9>JdCVXIHu|WhfaeKqmaCEK6yaUXmoSxHx7;4kqN`d${poz(f$=g+fUWWsCnYf zQ{gP@)3@N*ybZbH0w~!V#fStqNLaTX=d?RRkvHgk%PG|kYmSoc#Z<_DAnFGHkx1=A zB)9kKNcXSm$=*yn5(){8^T;K1p43p`4pB&|yhr_vP?e6+SNj-)vq9!OC5JR^v+%T2 zQ0Fd-;Vi%e#HY~TPSy3K5~6kK{gbs|YO=r#L(c-z+}J_4VDG6pz~Prm(FUus_a+%N z3!Q&l<9MYm>kk76W{JF{<=^gEF&V6Tork<$&2%3v)<5Qg-yu@#2)o-A+P#t6v2<5s zg=1`vemdncmjw-@L~OnfP!Uh_E;P*~A5^-^F9m#i}(C*cf2&S&MS+C zrt{eT*rRTbMZDZXc0NTy5c0GCxzfTR-WGqI_*#vq6i=v$TyPi3xrOVhv0NFDAoYuV zJp5)}dDF~Eic}NKpp1o+)*BE3&$-aF9mL36Z%P|$qDtT_D6sLSwqUpK(th7 zL-Y#?%Ysr6vW`RwOd1v{K3+2G-9wddlY;gMzY4iJ*A{9^eVmbz4u3XPHvku>Db;&u zwpoPh2OL-A^~y-5Gb~sk@YgJC`%LYD87Ve`*va{o*lS8e7hNnt>}SAE`5tFVt1ix% zk^XXcWX(f6^8tz`vocZLpsaljIKoK7cYBq-bDytCIg=~-Sj)siL;Tu-f^dTWZdQK5 z{xABupKq}wYVO#;Y8sn<~6?#Vte6Txg5GTgSv^f2|q8`Ukc*~F} z-WbDXo3Dh+C(N;{+oHLNV&iS!4Tjp!#nIs@K|jf5PE8O;2t#1P#CwwH(kkyIZK5O z@&(Z+o;-X3g(w7RYWw5>lmi63Odh=wTQsue(S2Kn(0Nktdo57&F-sgS5JFRZ|I3>f zPf_R&<2i;G`t__!lZHov6{EID6fv9ghw!)Y_tAKHotWa1z_nMtxVP&9F*dKt>#rQ! z>Db2Wq1Z)&(WO|$2lLTK)pMf-CWBVN9~3CjE+>IP(}n;K3S}i$0Q;Q-3<{_pJCB57 zx`BI(9jTSrEy#Ld+Zc|TwCFc2^#|$oTb<_}_JvW|)~xYrE7luShlu_58SWneqxnsg zuSG@B#PWz*o5=NQ6|-T;;&ra*rYcur6LvLTzwZ}cxZ*M;_*OR!Ps_7(-YUC4vQNv) zGMu+@8epcdDkf|^;@usOdePS|K-hhbj=bg9Ml0ylH@7rhCwKdiukst9DJAvqgv6A6 zYax$}MI!lenb2WydOy>h*@nuzprz=B>Qu#QjIRvllBnwWWe zLI$^fOzk0&S^qxC_=3gJp8j-{pEbpP+4ZlFkWyW5YCfkJmAFHZ>LUEMCQy=%Y(-(5 zda4E-)lw@S@W0k83m+y_{8UTp6#Ud;ee~tX&cUPjEwE;sQ4H(sZ$1z##9+wm+f?#R z99u_|6}=_5P!8E20SGSG&X+?|7x(eTU)wc$x`l(?p^|vPdZDWU-1HrvCKsDK*DOX% zoy0WvX~l)j949DZ8?WPax=_$aeF!U~#950trDkQv@JPx)97U|maL>2fw{q335>U*a z*VDyy=*sHa5jz!%jix2Aql)LvQAz>+J#NkrvrZNpt4d(+kNOZAv++uQ z$S63R|N5&g$Ll-inr4UKCx3_ubjCgVh|7mHTKCqUd^hdEQ(;0~n}7lhFOp-e>8@7Y z2A8^Mf;x|{e#fW;V@b~AptrEsXF?v=$MZkgDwbfaF&9UDJ}7V5_Slr0Y9f|uqFQ_p zQ!K}6Zq3N7_HqGHc`OCb<+bqd^0_(M;;#8ZIytzo#4wb+vf5p-z2^xXpH5Rpp=FD7 z{V`wgw!--GKzd+Q z{VP-yn(feyMl$>*s+PlawN>KuNaxhQ4ED+TZe7R$^ZprApJv>-d_&`w<|p?{_HTb6 zZD&mcm&#>2a^gdfm17j+8yY>9&X9m9GzT|$r}`lLM#`;?m2f3?0AEvwh?y(`2R+Vp zQ`2|02-_=e(j165$W|M>(sRe~@Yc*B)ApTw#E>xOOeMMD6%@=bF_Clh+Y1nuKQ~W5 zi2!;IzPPYT3ZCukbL{%}X)P$3`;s6w!CdE5Uz_f3tR2X7%KD17a%PL(><5ru%ybli z80ta=$B|RVHm|FcKDoLivH8$aQHi^4Cp~iindZ>OS{Ceh!vA_=M<`2*)HG!!985kH z+g+PUA)@t@uo1KF{)BOlXT>IJuDxxg z=ADxHBlQ9({V##7pJt0nMqx+5?4Pt?yfupFv=({E`)ASG@Z<4ecf14G)Be*<`t{{o zC4uE@m5l3S+__);2ee1HgUDEw3gs~Ee_r4YpdT@*)jqhhR*C8}L4S02@G7V#e_+DZ zurn_9Pf|`I6d-?zcNxpa|Kwrmq(4Bx;P0PDjO=_!{PW8uARB(dxUR>;KUzoc-vb|e z_3OFDg`Jzef2_Jn4V3?<;hZCX=8smw)vrhk@?CIrbtjIqGRJ!vn zU1L8}Dn&v@O#wWK0dn!#*uE-GfnMmk8#sKF18F&`0eUgM_@i(ooJH&aHLLg`Y7SXR zPXHavpm3!Df=#=3Mt{oJ>2u37li3nLu-KkAKy`_dD3e-jZu!KOW(7iA392icwANVjdd}Q`b!`X9lP%O|QPvrHR z{oBBU1t7u-!PI8ZFXt3o?^^?;KMd1KM&1kS_oCn8E#s?-FZMGIcV zo#XYF@0= z{M~xM>!BEb{!5zeAfj>Fg(5#67(6)}u&&WeuT!*SO4J75M98#$R5P)MGfX92w8;B`J3CThb)nNwihn%Y>lG}g`*D64n z{z??EyFeg``Jwwc{G-D@$Kz@LotC$}$eYNrS_JGIb6IY<^;rc7iFM+r6E8O^R_u?6QFBK4ZMU*vM{I5rsJ}?=X#oNcy!K# z<~Buz{HIuT^RBZ%Pm3GGAlz$S?~<8c#fe~M1J~}4oLdnuaqaQCHFdqz9m|tHE=(m; zJVmn;)o8iqWMXYzl~n0=XOw8Ax-ND>HpWc~9j?3n)n1L-E*Z%lxb{;0ZtXtfPWkgw z?5rM+5!$6AgWhAuV&9#Os#kGkQqxpo&$+JoyzcxtwGYBB-WgLFc1J>weHeP#@A{(Q zWA}!fd81yIo7`A`TCce}N8IQ34Y?71177V0B_oCyx=jx--T#b?nU|r1sK^+43O*rHGu3oS?T;BRNiCA*vX5=DO zN3lwdtf7#h%7YAtgfTo43Wy>NDPU_dA~MzDY!);_EEt(arUj%bKq_b}hj@rfuK`w_ zLkhTX<#WKn-J9`(H-AC8(338^5V)JYQ%n_H4ru5-mC#JpaoO{G;v2JkVvn#wV7jU9 ze)9Ua(CP;O&{Uu%fu^@1u_KD2q*6dQF^hzi2ExR+=mMVZ6|#4REE%S-3D3ro%G=Vc z(rChbb)?kycPtJ-`;3ii5U#8i|(JwP#plQEY^r>9FUaV&`X2` zIz5~J2DP#wq}ROi({l+KDJ)-V>~QM61Y-G`=5IAGd_ZnQoBS!|Hey94> zdy-A)U37E6USk%Cua7rY;SUtREjzs_$KG7{Jf1qV5v!)zee{FsbI<3wuN7swkrSZ8 zY*XGEPKq9Q>ql5R7rxgmD!ZKt+^B$1o`4Dtqnq0zg^y_moXp;sJCND&sW9=qRKW2%?d`ZseBbz>Y{b+Tlue&M-E%uwzstui449dKfLL2c0sM zb<{MT*HlV17$%R818&f!_d5UZdKF%bKzs(BLbWfe919ew{DJuhD@%@>KO`O44i*Ln z*I{WHW-4#biT-+1$r%ZJ=-!sEN9`OmI|A$T3VIahjBXZfLEvCCGb6i-DQ4?Yv`JLx zOx$`uZ&A~av)2@R!luK^oxf0C9WowaHvyE|8UV?))M`HQmibb-yLVj^%d{>o8C&@< z%^vZS1|%?#-Qu|D-UbsPgrt@8ilQ01OO6impTVWNw(lU3zd0Jvpq}LT+4MaB1_goN z$fF<)A;)QgPkR&tHhiZg+r}XGGZEz^zOi4&GqcQgZf|YGE%$b<2^(xqs=SU%b;P+xw_>4TdCi-x0e$H(_P7pDDIx+N$^k`Vp zz@e}>{8PwDn^@mWrLVkm#@%`z^a=Zr|hiWa^8W-h++e~pJF`n0R z(OBdhNc1n=mmtKFZb|0~`kae1 zy4ERLG~l9$v|pbRtwD;J@F)#R>N|_y6-ctN4EobYmG*o~8;k<#oM$(a#46&A6G*=* z!YE){UO~z#YNoKjk%uPK5pjFN{E3YUU2FAas6C^83<3n#$ST-#2TxweEUKd=18M$F zrl+=bmjj6~$*le3lUs}CkLTFziq3qwr{qQ!%_^F?o1JmXvQk$3fM|(E>~6B?gND4W zswe4;zsGzNEI2IwTwmZttGK!XZ6UMHfmOe6>;>}Y%_+#Tf9xAE?2R2{228Q}5GI;M z^11%LPxkIx7dEO~E&PTOdq4=l*ex1RbrS?KuK>NbI_OE!M)};RU_S6#QHRUE&O94(AEaYI}CW@!=VQ zEp!NL+}1Uw;KNlCuElsng&a9k!UOrjDcuD^dGdKQdDw4Z^Xr}I(=PU?~z+{OHad@`ip`6d$txyqX!8KGydvw-)y=IPL4*TtRG1u%5U|tSi zbPTQEs`S!2=9o63J#;kEJoEh*fE*UDYi_t5DB zR9lbcB^9_c>CGG@QjNkjnC14E1Ylc;{_?F`RaiS({T>ir32`x@5X;oE^P1UX-3ykmW0n@3=1s?bYS$C1H(1)iPYt zzJmwz<`!{DS4&)uB=L|_@ae&INdd__2cFaIG8My7

    u=cF~Lgp_pgn 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

    m}Z6u+mL_FHq8e+th8y$Ym_B6fixX-;PtXE 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�ZhRT(n#`mEhz)J!wLJd(P zxHqwwow`B|)I&=dQa_-<3N1KNuzs72w%y>~dYGELv?+iKY|6&f@zpcVeQuhc*6fQn z>iKJCZ1zw*;P6#a*aGb3$mJsHyd3zhn-Gq`g0Lkb0JULS9WaC1a1SnC!Oa~-D$c{G z_5++@OI7bWQqikrRe#*_K*$DBo|amk_m!QoyAg zXCeog3!5kX(H#)Lz^Oc2zB}BR7&PrwgIsze#EEj742f4Q)rWN2QciQUrF$M{7`Jja z%{d#boRRL4@~vhn7<@G^h;x6svOo>9%vrZWiJ?snC4(BgrM6_5%#h+YBdhFE^!W!j z8vCkfs>EGDc6Ma_4y!;shEIE7zKaE^&Xl*v6u0f@@91@FtmuAbra`!mDL{|-VMXL1 zXrycMM}pv>J96?r3I3fgO=xddR7-e|#Oxd!wGklZUlySELAx3ZDW%=)xjNg?krcmD z-G$lNuIv-~dTEpPljt7+f7*ZrTAV!(Xz*1Gqle>sf1=&oACBXHK<@I4TbYcLxcQmo zWJ#f}h)lFnPk&>x-dX8SpPW5a<@I1kD#QmL7=AO~&zO48i0b^$3H$-6l|X?k=%svV zliaL$zH5wzH6Qb|Mq=vDZ<{_3})$gpnfk+u#D z)J-KPHb{lD^|$)=%0w>cIsF*Y02=U=PbggkR3sZgrft!JytAzxc)`@>gCvxncz1^2 zVj~YVKf;r0XG&FeU%D_*@Ho8GmD`#lGdPKazn!o%56@uF(f>}qa|l#b+Xky1Om+4`RIa&i9`^`;Uec;cT`!g(lo5)`N;RjChK-?>`9@%yn!u6fls| zQipGa9@FGUZJXWqayyJke}Ya@+rsUbj9yV5;sn-x7>BBV?e1@I43`~G|Mf-cmsFl_ zT~1WVbk3e${hv$Of%J@(I3f0xZ}pK?<2nx-%RStVhl#7Qb=maf^ygH{^xCb$fcJS{ zEZVbd12=TnKHYpAb2%6|s}ur-dKWO<)w(3AB^~jY$tWX-7x)^b2#rL~CnmVq0o|LG z4UvCgyfpV8EG8^8U!U84KCq9WQx z+eRl+#e45Va}ZwF%j|pnJ^TLtm#8^?v5dlh5-IJXcR+$D%~B4U+9HK=a7wcTZ6Hf_hb_p#ePt`k>4+l3B= zhz4uwG12SoSZPiw3nPV)+Zd^wshg#-@vm{S>CQ4=*a!Sy@P-q&!UrUUk+hqD5!jEb zTH#cP2mXn^V`U>=P>qt$1;CzkgryvZsVvVxs|bM-FY1pU1A+FMv!I zFz4=W+rBnY5yVh<;(l;X?=nuFNx;$>Z={xs;4ZO@mnfg4h4`II=J$fe?5XfnnwFcz zbq1|jA#My&v=Q33l)yBZL&^G(_Jv-_Od5thVd;-?- z@y#@34^Fs4pT7x7g#{cCIsx*EmNO4#q2kr0Xo$a$;5g9}blNx>{kCHAj_ELn9&V-| z1DyMU^y4xxNe#zyFz(6#I|!iV5grSXCU=whr+%aU7J!cyOY_Ns=*FZkprn1R!Se)F zd9)m^r_kgxL0EAd%^4TyK_5I--C(wk{tZ9QOGJW+EJA8%YvygC$wk4N#m+LfT4hL|mg z+l5AqocUeL!s77>!e@+R_vCX{zaB+SfNJ$)Wt(<%(9b5=Q7@pr9Tm$?gQw@K=&1$m zrhYt*(t+6!wT6bUCtspJ8UokqxL0ex9g}RBh~bLZ0W;YnIF`(y1F>0Zg1013Un~m( zc*;xBBXAo=#X#I+0y%sf{S*U({Kepicdm%HIKz_dt{wS$WWc50{{~=jnD(vRranAx z+RiGqqgYt6{>_PvKWbCx47C}P>x&QHa1 z#qv|FJ4acxNacwi-(Kh$P~?#WEU%}{-K3ONUGbFJ;qaVYcOY2%3#yrdnB?-S$($9T z{2g#>#c%bR(4@|sO?~2B(&2aJ{4pJvc$r+#GgRC)vpMKiw1ks64JVv1Myki2f*f5(TsBUi5gFTto>;a;9&$v+(>0lVu# z4To3w+9R2KkX4H}csR(v552Ws=mDOJ7)9E3CZmf*Ni4PF#x&psCPZI&sNS1;@k%A* zRxT`PyD+8`@-8*!@^ zaReX-w44SO@0Zv;3x*tAqLaEVjJ==ItiH2PD8qXS#bsE&VAUu6&1p0Kl;IxPZa(Zf zR5CQIoI0@hZ@RU0UnCeqcy)M7eq+X<;Q*9S?&u_?jTy&OBB6=)qP!rAD)BIn8UwaT zunsk%f?%056a8(LvctE{t@1tuUW51vwxh=N{e7bs-skL(y3ik>ZyK`n^jDAy+@lIzt#G~WWJ#8*H6#Q zMvHQPslCuK;$8sji{Lg9Fq35v3Y4)q>iRq^oy)MaaJ2k`)bDCdN9`n}uq2BN9oFjw# z2Q%=Q(kd3p&JJM}ixj!pbLNKUp5Aj@Bx(*XhN~JG7EU)(oK>1K0@2m^38Wgn@Xk@N z*(x$(9;z49q*fz3Cw&i@1*|MW$yiLogUpcgoPLY2aJ{>aF@>51{FVIT8MV^6`l0b1 z!idh_d#x}h&{Q6>b0@MYEEY%6E z{-l+6W&*xV zeP5M-UKI60dAXuY|J$)tbK=;KCOHLm@`h^}env&fF-)EJi8ORZ-`@#7AYn+JsgeiM z0HqOXnM9gP+@#)tvZ}5$1@3K zg(RQF$2Bt4@ftJYFndLcdT+7I@5ZmK-EQ2MRovpGiue&gFr0cgG^f*F$j{kT4~@Pb z;#P$F(dyAcV_Nh67A8j+_@BfPqt_UHraEW+KSyUoZNjUQV)E#{8Dhc_z=Dm#_S-h4 zp^!N9GfUO3w4eEL0&+vj#Mto6`-+`RDz*9OKc$@ce=tAJ448W5Y+YTS7_xSqEIi$` ztj zm=EeJ)Yztvrv--a^PhUY!fW=}>83C~bMs>xEZAyUNBC=)1yxfj_6L+C(r9?jqZZ;Ec`vPjSVC#)QV%0x^ z0?hmGE`Za_eDFced>euP^Z2nC^8-VlI;mVdrIfYHe8*K!$}zL+q(gV;xcbL<%+H46 z?dPzd4Xbl-4i6ul5a_uj$JGj+{s;})J5kEXH6s?C{CnZO5VfC&70Szg&F!2_j-|f0 zt4%ZG?((~LuX?&Luc!ba%wGEJEU_ww8^KTC@Hi(F8@CsCIDGu2{Mpwbxw`uVDOEkYi_DXs+SW zHQ$(=K+*&xqfDMJR=y|8g|G0g0C$W7hh zhu_mo>0W%i@AD#{_HKDTd9iD%!6#d7c?g^astdX-J(iBH3hl~_e<*y}Py6RC>qu|t8Ksn#z=*_d1S$52&r zTP8jRk`SYPb1*!YoNnR?^P|?lTB%vtf3X9@(m-CY=TcMbVUH;MR+|5fY<;0)F~ize zxK~|)clz5!SN$JCzfSXmte-ZQ9unxL^l!C6MMDJ5V_3Q8UWU^}#t;5IGJR~Q`)*2> zn!5MrSeKa613LW%T}9`PrVrk9Idd(Gog3BluD{K(!QEPE=SBL7`a?Bud(O!()%69x z-6u-gQXPPq;0onB`I1O5kbvF=NfN?-=_>)>lGOIcG+r|MS=#&SDWmiZY2B|KcBSbxgn&$|YJSN)CCZ@Anz zG>LfaPI7eJ<*_l}+NqT2PUz1oul?-lARzYq8N}K3;bQBxgV+8Z+b=C;wPqY!gO{d1 z*DrRcy6qUE{CwWM_NK@CWF60)1>@!x3O{@EzQ1mGYvNdB(!=$-EquuvTf!7XU>fI- zKK0|(o)gcL{DXguo-Sxy!QY55cT8Uv;}->Gj<-H^;(>@3T42n|aw6F_HCl3!n}gs9 z_4NKjkto8DhhsWdXAJlsN3MciJE5z=f!x1;!{a&+J~4Z7c<+pf9hJP9a* z{2o2eWRbtF@I4S|fj+_5c|drAMY#`#gXU)deFn}zFx!sAU!eY*2n!&L`vzmEMZ zz2N)PEa}{=^p&TZ_SJZEwmbsO0|BYv)w84)KsO;}E8I4$i=#JbBd1yV3@sL}S)_6C zC}U1tl}85G6rlRiIF$w$Ps(V$+_g~I7lPv+|4DdyPZzNKg*Gs|%eCS~nR@$Q65?LW zk|r?#Nfy5VaER}2K%5yZQqC;DH#fVq9Kd`56j{A7Gt zfVl}ibZhmmxw~KUo}Ax#W)l7VIC(wI7tPS;C<*tZLy|OKEJKpbr?7+H$DKuTVG4)a zhFA9Rb6)ZBS+Cp~Z)t!8IzU@a2V>Ie3aIRbKzfeqm)@VtNr4yoO7;xs?*(_=34>^* z&(8ryiw0j2(9&)tE8)KS0uO9WSdP_0?@?g-od4yMZh7E~xrq;+t<;})?^fEselnqI zCDH7&4(=z5H@rkG3Pe>+3V_}^3ND;H2%x$=ZX09jfq0wHRYV0hf!k@R4KIiuKPj7b z$}tdSiWR{Ue_cP2(8UfejazaYk(9fWXjFbXKOG8y{rc$NbW%7+7)}bsNXFmR! z49!qmJg&}#-ON+hjL;UGoY9eKeu?@%#ScS%L%@!r46zmiQQ~_HVkTc25iw*lL zLylfW&5!DDGkPWS#x3&==h2@-^iYLL#`^= zh+DFhLXue0Cie=0_rr>rlaTy$Mo_8dP_b+#$1l^65Tw$6Uve2MmbC$q;+pV=h)Plr z?nJl(LxPn9lFCcw2WNJ8s1G$MO;Z_;)Q7?lIGKI9Nrg6yYq{gcD2RJCYpDlA2}Cs( zcKiM(5hXMIejf7R0i$4hbGU8TT%X~;&>ztAW}vz86V=fCPz)6?{-o>>e9IWmh2=?Rk}S0jwqVw(D>)9t0Q>8j+PoRX1mV! zmEa5A>IE{|=id$B6+_F?1P<@tQL6^@+q;|P#&nnGFO8QhZb)-{;c?p8%T=QGIC=;t zR0d$UR)XLfG*Uv`52jt6JlXr0A{wGYp10n;nA&}Eb$svRw_)NX>^6?`8Tw_hB!T{* zP$*OeweN<_8Q$zVWI=$Q`BJUGb-swuiz_7`H28E)j%zI3JfX8!+*h%*NZo&7x_Uu%{@8OBr|b;ljava;ob>LDqKu3YX(bC4Qde)3O@>2v>35m z(~!Ac$=5ODNl8#FuP~v(if!lY&O`C-$%PEPc-EY@uI!lP6b>_y78;n--(YS;xL9eHI&7o1|X+z?BWLA$H z03HT02`cBZ#&&U%FAtiVuoC=l?bKmKTfHU_Y=bSYM-E6XTZ?6(A)0@-KHna}_zQHw zWRVrcx>dw8bC2R@HX++l$+%7j#0kA&HV~2RajZqICh?^0VKr`|q6S-qjHYlcR)Eyb2b%9q17=RfS$KrGuo{ zZ?4ZmN97#uwcK+R@)n*$qF51oaXWsi-_c?!(d&IYl)#e8TLR^xJ22{b>c2{gD>BC*hq61R+o>{!G_bU2zYzR3){7qTQ$bCsWQzbQs@IxtJwrrblVQ z)~%2l(I=%1Ep3>*ejjOnW1m>%KM8-rMStneoIQZ1j4xKn%;d_tyCa9bGD@nI)c03> zSv1)8JN}Yzcf}PrR3)$%qRBKUyhQf*wf56pwIYee`2_opj|Oq)t9yeMHhvsFSylO1 zqTJe3?U_?=+mj8a?n`8OdP}VyBaJzcsXgsI42YeUEVu@U`>%OD9Trw>tw;0v4JvHV z1!C09Lnj3x{X)k#j2S1gG*QEgmAr#!qAn3RG|`MGa#=$!EMkjTsl8R&nT^)2bp!f9 zZl{5Q7)$askV1h1sd=rG(t(%q#mEpNcmj^`L-DaO;o-sg$_0H#SShv;h8{F26VO2W z&;7_THY~0xAy~79lG%-(^okewB^fJ^n!aF3neQb-)syJ^7&zqIJ5d$wM#!Oi)cGRb zVaM{8n@HzmcC)(4g;{%xGk?n-kX$_tgcP?eVXTg$XFwp`*z}*oM=jwlfah%&T!Ci! zJbww2CdjpbmGmnJU5*oFLY*{`8*?LgsRCi*^3wy{pG!q~XKejFTCL+Q^p^eGol{ka zmFv`P%FlIwXy|UlRpM)IqbEY9a~=s z*$B2)+FW4wMpLmxRn^mH zsPMPGA+!S-KUt3VF(1r2a?AjHs*gr0*dc8yML&fRJnatPJDbFL;Z@^Sjok&ZW7}GC zqPc^YOsm0@F3rJQ5?I!cEDZ?y?80cFh957t1t(3!XvJIZBLJE( zU8D@jbaJX-k8GWseLQBI&~MTYy~R6)7F}YqfJ)hs?NL+XhJQ97$2sJ z9@Q@oIQEiJ%gK?D)WY{)`Q*z;5%1ndPD_*WFP;1yhJyw7GqP6_h$kKvx}jyfO&dk6 zrBx-r@oO6FqqTsW9M?J}dWE?rbLq03{*~&XAX+kceI<}ndg<@k64feJM#6a-bjIcP z{(Nq+A%*k-z|c zX&$IV@GJB6;Px$xl1PV11M0g)RLF-bH%CJC&M)C&JtT%I(GU2pP#ZI0LVrLPD19+m zqQQ;?c!KFt)o*Ui4i_A2IPu13#VK%_v@7|_(6`2lD7&;72}{6kj|4%o1x@qB0`^7= zF3Cd!Y2;aRfHJBcQ5m5tMe7SOaDThHRBwjZMG8nmxe}AsyFk$B&WG|(ShU^EDF)~71(X$3nNE1&Y(rjqsGyxf5 zsi1Zs#T=z5ORbr@*fOFEShi_nt|K0N2_$MfR0a*g@f&^BHx2Epbl>vR7A-fu_PNnN zTq$lzbX;=TSS(W{%EbTzkDS=dSG*aiDkgm)@4#G7LbITFy(*@nxX)6Z_ny2SnPtqK zjAJ#Wz%(|d9VO$VZo$h2lAfP(bS)3{dhxJr(rQ2s<2I%22VB`Vb75{0osWToI^!FZ za-kMoLmA1o5K~_uF$PtV=Z6c4X61E+QHQ$W1~Z<%9gh}Y*t=k4WAQ1&nGVSidM*yS zD*VxZGVWr1%@f^MDR-n+TX-){DDI6j48IqhmD=3v2ul~)|?6b^Vx9%?!tuIjA>VFc-R_E5X?dTqs>{k_= zG@}vjROA7}#L)0@E`)?YwHUW2|D!UQjwS;P;L#S1H_u96Gk*y+Ao-SE=XS&jsj1(PNj3T%0>TqZQ1LW<1Te z=cX0xcgToYuye|~it5DdM20)i+pCHU0ri6r=g6~v$K6*x=3B7}e=Xa5Fn@;k)~C** z@^E&ON4nQ7^L&{*i^oFnQ|G(>?D+Au@Nsu}>Y^&Paw_Kh)!G>r(;#;z>(7awO6!4V zY3}kl`L_d+(SDap4W{%*-yKuk?_xDOa!>iOY|PWF1J-Gdy8eEH#KH0%{w5@GsiRW& z{Hlg`=QMMqp1)m0`A@=+T3st5i~m44oh0QN@7^X2W~bjIB}TE!c&$DbNn)=CHEOt) zqm9X!`+xD;yWgGJab)l#+%+#!h!pML+? zNYwPd7-K$LhE+}~b1jedIwsoa_Rp=_(i}-i*HSG!KQ`BDOX>nt;^=$S=I6AI)w!OO ziL;`6u#`{*EAa3ey5m8#MpgwTLYz-NCmA0Xgou$;TYKR&y`%3B#_0HqH_IorPv^s+)>TRc&3(-(UKk zReoeDP9vzuHb-ih)o|?7kCZkJeC*ar^ugiw8ovGO9A({+f(03)reEoA(TI@}`{jD_ zXduwgz9uk0gq#^NL;Bdt?Fd;C4m4!(9M))MgC1Kk4KSoU-us0CQ-SUH+7F@2>ArC1 zcK^UEP?gWS;r^4zOkZZ+CG)mo+5uWtJ=OXN8mUB90HtC>#VQGE#T4oT+C*%pXUbLG!b z=?@1v+#WPcOFylVU$n>&AR~REHYJa1)A?qvH&eY@-HDEBE(O#8ZjJ4o&poQ%-v5D zzvBx@cLmnMlMPrA>JAg}F9pK>Z4hs3dOL2-A~^jW2jU`m>!haM`0LrJ=?c6YEe7zdQ;Y_S-$22m|}b- zX_6-ld{7*dEQ-jFWNlU4YqKC|a5Q@AR1Y+{6-KYFE-Od{;JwlY_-WN|WeY4XL{q#z zaU23_Be)^+v?wwhK%Nho^c!`@vWMHC#}ImdwV#jkslloRX%;@(!&~{xKkiqE2l~uS zD6>N$;i-C+BEPnDe&A{4_V0%p>9(sOauEi^bKO1zujsYtO)$|n{7Qp|(uPF#*7lS4 z94^oD^t2DRUOUw1YoC2vT{gz?;JJXmeKV84OcIa&3-=}R2#KV>2FVpg7jqP&Du#Hi zCsS<-z|w+ahL7ulQSvA*8ro>NgZKyR7)MWz#K{m9;KJq%PaDnj81oIR1v7fsk*ipP zbS2{oHy^ldxDJrC-j9vXD*d`TadoUqXVL!G#|2#1RqJ+D>yBNew-+B(H1t2LNIV(s z`@^Nfs2Zbm;8LOT<(WgNW3>nR@^|*-pLrT{D2TP?PU5wlzeE$#l2KjLI(m|ut)xyE zaja4H@Jkf2T5%^Xj2ZYh?JRHLZKO$8~k4%e!>2zj|e2ynkYC z=En=>&QVawx%!Gl7F#}vj?XZeOEXB87_Eo>uvUfSt?3_Q%zgWQDrg-L)mRv|z+mhn z&aMUND0dhQaz(+kY1-1)tC7my`W9;rEPB7E;K{# z7R_b+Ud(?}neBA}c8*@6$WHiXTy>?jTO4(av!~Vc=hc-bTk z2|gJ~80KFG@jzEpB&Na7N!=JB0*cXd65WHeNiJ=KJ<;J4g!>xBe?Abr!ReQ7mHtC? zMcE4Wj-mOav3z}E@r{oOSo(vIzmrs6A9<}Ay!uW@l@5SkKeu(R(h)3EgA|ruK+MIojgm@ftgNc}7SubF{C@^mr^#hvh zsRhE*eL?^F8*(3^D}H3ZB+#2J|E#Zw-Rb6zk8`EQ2PHowZ5<4bb-`1JCb=VosgwPB z?h7Dx%HvM$-L!5RqY6zfP)6cTeW}_BW&zBRC{AG;W!KfOOz*}Du~08DWm}iMf1mwhHxkg4luO^y-mCe!Er86NbnSkHf``=z4N8?9n=Kn zD_Sg@ja0$W$0Qz{LXt#IF+(r<6oZENHp0v<6r47QXG^}K13`ViqHiP#3MZCX4;4n%j*#a zYzHEvwh>YtI3;rzj*QeLL{x-?TzJHm38&{szDJtJg{%EmRZMd63P0exC_oJ;OU0^%W;Km}WBT8)&R!a#(Yf0QAKB-iV`lB|5KN1vtcmxd)`WheW_=WcUW3czOMxOYw|qEvQoGF zNXl?d{AAB)A)m+t_i)=xmp@3`$^bLk)u2@{?pIxOI9YJ1gSN>WVnecSGa29hG~eMH zfpI6BB_78;xlgMYRb;xIlm)!=`KhFjB0kRE-oU3bvlO|mM6E9w>4aPGdiP0+aV0}4_J#1vshsNX@&Qx?pAM-B0p97|YS$|8^0^1VO}u&YY@ zRz(~e-`=C*CUoNch->_*7|ulz&EV=}9~j1E-t`x~DDs;y8!8PFe8{hFfU7I;e`S!~ ztP>UiEG3RZOUSX{#kK1{vOLVwYQw~1wgrC>+HsQAkj_gHUhS6J!-bJ5*abCD2k*)F zrVpO}KKb5j?lGmYQLIMU&vc+i-e-VC%?z2k*GK_g&Aa4<4?LQ9^PIp6@!~&3c7+%8 z6weH$TdMFV4}`Xwldy9;CN3ktz3OxABt}sbX+l|={!v>|IoNQNJ$`6n&JEbP+%63c z*H-g8TgSsh3oot{y(XG~%TxtjOA4ert>6@zB*gM9lgIN0@7!-uZ5(8XoB^CG<3tcYv07J%bR^p6+l;b8xhkw0n3-%^tQX za&`084l}Sbkep&7+MPnx4Y0I$i=jZp52^sz`bY)XPBrWfWP?nnN{c5Q@Wn{}fJF39GJH-nl<%GeM6 zex-#gN&1YdMz`V~;#9yY$DDPa@HhRAgQ4r<=^>y8GN5hr*{h4O0e{&>lLn<*n}>38 zM-nUhfSapNjseV#rwCn2XPh>ofk*6|Ta|Lp!{eBX<`DP|Ug8#4%g4i@yAey0hR|{i zr(We!`zS=YNhntF&N=`5bfvJBHmsWWcmGpe3MEgcT}ie3k}xm)@j*|{$xE`5?}NYv ziUJ^MFT@SgeDz0C+=hgPY+LRYY76-fQcunS*nEh#b;)0k?m*@3Cv#8=LieF2mDwD# zA)(cqt5@bE+g$Gf`C+%!i_<==(nF(m)Is5?b*rF1+fV|6&1<3(_?ZvB)udD#C6>04 zq$k|NL$zWyfEFBLAF$K}9p+X;H}tk?kE6q2l$E5;J)Od0CYiffH08ebZIY{}HpDr{ zwlaRuuP*A|%3y!Wl^|(+S$BL>==!ka#Tn3}9{QhI@KYRo$GHWEXkq64Uz0wOEJYbj zCc<+(^&}t>hIyRF!`(NxfnDiz=ie~o!?2#DpnC0ayo&GyOnZ27@%;P2*Zs@bO79up zVCnGKcXf>we|~O8Z-9QUJr!Y4n8_kYiS!2uCxLJj+q%`ljHT2{c_>~tIB%)xheie4 zS-B3F`*WZ_2(LQ?)?gGJ%7zqOtUa&!v7|@+cyA|sR&M=R>zcnu{Zn_aRf1$Z6Q*8Y z)^%4ghSj4$cu>NA9L`~pr4UN{-I;fG8mG6eRp#vKts+!<>)o*NtgIPie3t&OyY}(m zk8rmK+oV?V!Kfp38d7O60Wvd#VNjCrAO|B$RHq>;FF}&q?8U>!5l^r()vVjVEs$xj z@Zs6xHo72@(g*QE%>MF1ALq5Q@`4dCmgZ=4x330{``Wy{dR4*}oU6aYLmU=&z8m)B zo5DW}z97l`e|Y_XHNKo*TjLgu9R2MaZ#|ST6zX}i+6^Z!bQ>h8PN&~VE?%%|lOqJSyK-Zz$S6PRTI1(rc7*5oAswL!YZ7&f zmo8Mx7i{#gRIVEUXbOXK+S zxLHnB#^l4RlB-+6=Su;})B(uofX%|GHjz>XbC;YojJYq|QkO()#Xrc|GFWBd_Ipgs z9(+=|?Em+a%fONd)ES+)?F}bxIAi}W&fYVuskPf0wr*6K3P@A1A<{)aia@ry0RbV> zjDQdYkxr=66C1s4=^_x35(9)t2_2$@vgtx7(jf>)CzKFElKtK8=bZOB@A=M;_d0(l zE6KW&tb5IS&N0UvV_4H4`?K~up^pPJl?6ZwToHrkgU%k{4FfYk_vv99FpA*oMp@<+ zYHGvA76ne4c+SfgAl@b>R9#s)%v8XSS=(4%$uDTwDagSXEjaHo;*)?Qc1hN!pBc2U zLYGD{>TmA~ovaFS3noAy1xXo#d9Et&>kLkY1gRWeX`?LT1;5`CAgs3}j1=xSjiSRf zbw7{si!>H(lv6mOHRULXV=h%`CzaDi6~g?8kwH3t)`#I#qV7M^aXGjHZHCZqTGIr8 zc#GCT)A|cEAp(dAMNYVHyF;6_PtalcExvLY<~Db1>91$qwN2a{N8EsbP69UnUm zbDt2HI|G@|Q7Q0MVv+r5!1j*J5R76gqU`B{Gi@(M=}Z|q@3gy_*#PtS^vyWqkrfpL z-;&5A7UPtGX$HzLlbP%Jlk{QBK3}H_n?u1w&VZYwTJCTxg{9Z}K}=?!7dZj1kYw_W z&4xv^C5((UpSfX0CBsPBN*j(*mul+iC@Sphm972Th$8{J_XrNPu0r^CI||$ZXagr8 z;bG(L8fSeQ)LVm~1B^Oz0A(i*O7iJ7$Oyuw&+Q5815oQg1JXuB)JO6b4$f45{{=0~ zJSv}aSciY{qdtOyIuT-++Oblfrr|lr7Jb;`-q*i+zDA0F`WzHA9&S3)Kx-vICPW+% zB3)3?LG7x5UTEO} zTL;KFf%c0TdK3ckZ>pIt6|AkpALwRHVn-6pOM#A+^_Sh+I3Rn#79Cmo9s?U3HXoAp z?Y3^Ug;38`+_!dRs}BO+ypwMpl#A~A$2a9Dm3gWf$AZoO;l&@g&+&IZ8~XEKo@=1i z=PiRgF4`$$Ui6#hN~c;Vx;_I8y&=0-7IH*;{dx8iOCM#pD$I8)gUG=@3FJ3 z)&kbs5Yd%H4y15EQtM_OOpxZ;@?>W0IGht3kYt7`bD|}LNv=@l8p#1)tvk!BGIVbW z6fFc4X-9BBeYi5xsv=|h#%bCK`cCguLbKt>ldB!~-;6(A>bYK|{Q%n^J5P>IN~k04 z-P`IKJO0Ad6Ju&zB3-!Kka{|rmL455Q{Rx`Re%?BZkKpI0A0Yq2K}^x9}KAAp3$~o zLxcun!wKEJ*_sC8pkL^N#YZ%qnZctu`LuC^H?pMrPPCFI~fa{g;}m{mKrd%cj+Tdd-|F``uTXHGl^lE zB5f{ZnsYlN|8}g@w;Wy031E*Frs1V8DP?QGP#-FiRPBCHTth7BrAzcOPsTK9@J29| zz>1@-ZscjpQA_Xw5s@JR`zp&HInlq-PYkB52I*p{uR1tV$J%T)6V-DXQAcfz{HEc* zjpxUDk1n$%`qP>f*#7jnZETmKT0PlUXzCdvK|jBgD^}hYb&_3?bL!GZ=aLAYvXWur3vf8pdy?q zank*m^#j}(gIJJC4qmi7?K2FL8T8grxx3}n)hS~3@G_Wtu~eG`LeWgf4xv)ymzpwg z?B48#{<6~j^W@D9=v>=y{M0+~R4+Ynh{T%H@lkGMxjQfzCxIc>77LO_6#g(GZ-F2( z8SBft-<{8Uqex6t+Cm0YhcE?QhW4)29y;T;8PGP1?h6gQ`5f4%rTMe`T{;_y!S)8L zGPVrVgVmbDH;}K<@V1XzbR>{p<;~0=gVs^jSz~)Z`2l59Phjp$nbzG{$L!I>BNkdc z%aL$(?JAZCVw0!`0wlO);qQ}By?e{-P!02gqLtbvXw=5yREbZUvEtSrbB>*7_EOo< zkBzmB3DC={K2Ajns=#thk5D0_x_tA`}r zsAJe&1|yXBhhi%C6Hx@QU<$H4xRh&y*5sPS_Wpg~lP@bM^YKw22uhVL>CWbWE-DRwhb)N&s1Qf%o2CR5S{ov*N>3yU}JT%Z!dJE0gyHnD#4}i%}3RJNAG4r zSz&hd#QBSbW42RT+YJe`87LA4bbuEBKCsA1-rWBWqVs>uEr~CHm%e3^K)gmVK#)E> zRkO@S^)CL?$W0e}z4_rN;K!T*n(|*3M_=%6fyXxg;{ZSfe!W=Zm)`v0Uu&;-gX#3I zF#m7N;6ESRVt)Gd(619fNYsBle~TIRpWDPgZv*|~>S2ZxC}RP))eSXrlXjclyZ?9! zIfxcR3WOZ%M@oc9vd};w)kR#OULO+xH=ycbr`JW9h=F=2X0d9ta!ks@*BZi4_n4=t zU%7KOh!7LkQuac85I7gm6{eV{Rj1eAsBj}YX|2GM!G+P(;hF{c0x$3G0_Jf{M6u>m z=~3reju)$bYQ?dMwX$iW-9st4BbP)Q4A}jBm$P3$dSUDnM*D&E^6{7$T%#&Pd@3VVrhj+sI zWEE7hfGY8Cc;AB?Z!RCtk@Y;|l%DkM;KfAf=L2XG7=!y}4@3Y#dINU8SI^l!z#OOd z`_^<@8+6Q?=1hlD?Z2RTc5Gx?(LBsRs%ulWC>0U5BUSH6vHn@?hZ8g*hSPc|)}lq$ z-z_MdTDZabzPo*Ym3$FzhcVA2%!)T9Bus6X!AHv}>tDqqvrp3T8^l)RdAfto3`CsH zYh4C}!0PYtBy8N7Ax8LFDu?F#R+*B>Z3wL+*g3o$JOGjV`L8R_ zaSqZ;CNmisU{(Cb0=e)z$KGth9C_nE*3G|vLH;KHUzveFD_v!st_!s7-iYM3&skT+ ze&|;a%K9)C5MeM_Az(UkR%I>ssbcH=7s>Ka)uR-L*RwoA%~JashBqFD+^N;?Z=Lq4 zR+H=|-cUFdrZ1yF3J;ZMsEYr5 z!K@d{JWqNW?e|`~y84Yl>4@I7Z*PDcf41H>kXiaFE2^v6 zNF2^2LWnEP-QSUr8S+kVrCRsVQv(JM`Vf0aUbqat`JbBty0vPFSn9q2OwEBKfr5=y zvOE|>09hAqMQcBk+8>|5fJ5lWEDtAQ3GmMDT`%2(f@>~7%`0Dq@F2x+T{x3^Lj)bW zb2X*6J2YtFPG88Nt&l|G^65`VfeE3Ij$-2L08)BKfs#ar-Bel59lngAxy%nk7ZFQp zDr))8P3F?}Ka#VOXO8Dh$>!{Hga;gJjdy(qiO)AsJ7I+1^EZZAHd{8l|MYorbhTjk zIxM!a3EYBU-Pv<1(IQxw9WaMQJgFR@f(VC~)oYx|&sofPbKEZ~Bl`Fx@)tp0iT z>oaH=`z!$=ic4u$1+%E@(VF6gn3PX+yAd*Tonc8&v3_06cf2W3_ewy>eu89lZZuxk zG(YmIXZ&yUkap8dps)A1>&hn90weABX~w&&ms`O(qHC!M-WS4=bmv-Ep?&E|Gm=AN z&;8gmWodgy=RS|6-lcB_W%Q3r=DAvux{7JLH@f5X!PY4eC6REs{Ba`qTkrBhybQD2 zHWjE(`7U})zTF;RRWaE0jGeU|ciltZ=b~usY#UUX7+rt|*5|Un9lejnt>OG@@*eN{ z8?dT2Ln|9__>{knw@We;Jf=D~Ke=0VuCKE~n8j%gANqe6hRm>dH<{(8M|fDh(@Jd4 zVfJCh)4qQ&uhx_)CMUZH7;)b2ddPS_3!1s=z(=$8s#~HV6pf~=?(Qvmy?HsjH~Y_q zDq3Y28}?q4CZ4bjbj9rF-{;ToTCM*e9$j$V7J-qAwm@%~=l5>(W34TgAmkp>axZn# zI}}oMGh}D8TqPC^(*>~+b06cLyP*+y_}tVORYkS3uAMC&wvJfRP`^L=LZ~~Q0}kJW zd}^E7`Xg_+wrXj2$1oSM5ri|Tut&g`ONi)p0n73)nn7TUGxPN_nv_$VG+}A8wrjBN zFj$#bSKF}a=-7SdD(^C5jImxS3VE`|i$JVxO;xjtMRc{`DFh~J+Ip?ja!ixwwK}NU zcf9^S5bB5*Zu#vE*F?lD+lyt45>Gy)!F`DbkBniU!qR5eRo)|pnft1nVE+hH?Q8(s zeNxrLu9MSks1MugK5MMXQ8HL=b-sSEmhdB8{5>dEV9-eWnKmY00uDc4kx<;&;S$z0_qmJFR z5yUAI$~|8RW0fbe#Bis*JaZ7Y3wSZ8qOoZ76wj`8VU$HJ75v!BgZ z`aKFXyhvsysaSQ5)WKi4!Yb;3Y0CA^xfi8-33HzgNViq*xqR>x;5(6f;=rSWFX1cA z3Y}ul#%t`mCO1>kl(Tj`OzYeys-BMpp*y_kSrxG7HfcJWR=%qau3Z19{r`KS_`k>i z{%;N*)D%>`(PcYI34Z?guri-M=QWP=igC%GIWqZTw_3FybMyuW`{sBc{7BVD?dF)~9&>r-{ZKmlra> z9Sw9y4HU7=OLTrT_akLgU+BdF*)_|k0|(pH4)8R+xb*Kx|0{v`Z~yWBJ@8+HKj#gr zxXFY-hvM&th8c3K@EXh~HMvhtX`fw&IN!3C>(tEm#e=kP_aO3D;#40r^5D3TB8lir z*yzq>v$iLX^Kms)p&&1hUVV4DFzNgF6Uowbrp;zW;f1?|vqtJOOLcw(jWU#i8N&^5 zYMrsp&xQ;7*v8E>E{{vqG9}DsVVse;h)?->$)5&NZe#{o zrw#=bpx>4Ben$qf;R@_-w!na$o{5yT4snitlVO8AFYwkYZU-g7_F#neQXhRT|Kate z6$)Xw#b>{x{d^b%CZzv9klOf+_{;mk;kg@2O9Q9?_Wsfxj8c(v*qE^H-fmoLFNwZk zWBYP!2Z$oQqrcqunrIK)*9mxaMUr*6Dft-IBv(Nve|MLbG-xgW$nMXB(%{gn&N79F5Mz=VoQG}r!lRp zpqBWJ-GrK+oC+Vx<^Xw#HyzP3^(1=ClHN`Y23`u>wp3FAw0Rjh8bAi>4@Q_*KTokWwzQ)LbZiFMdW8kfEb0^d5caxfv2~wD zv>znf?+0{`)3z5FTszy$h*==Chgc4KEXF40CkJYgt>-nA0D|S#&gZ`@%X^;y7+Z%8 zPov7!Rnlzgi9NexJ$q=6)-wgo!xOjgN6W}RdezNK;^*p;f=0Ks=|?uVNnXm#@h3nXD?7~{nV>604M zdA`$t+m#cYN7e>D9967j5TWc*IAnNb==oAED7<;lf1#nfK4ZE&OZzfbV-3M$MsDv* z|3ED;K?Rd_{?hX$;=3Nj?Y&SfQRY?UH$kkaK^C%e2UcVGUXuq6#yxkm8|$FUV5{}SHk$?Eah3n7A#-f}<>R114--PaGBh7h5v4GlKKv*LAL#ork$6r-D2v)k5j zBXR1%Hju9HtysoST5>xE2lrR0-erwe4KKJ?!akp>n|(<~LrG`Z_S<_o%S990@QqGF z{cc&=;k{CjrNlO>l5&|>=?C}K7KdNB08}*e6VsMz6s`R7{a4g+xsQZz8TywfSCS}> zQT1}cN90MX_nn66`u5R&@U^KA!^aH;nls(o{1!Wx_IM2MgkN96wX{5Anwk2v>MHur z8-{N(CzI!d2)YH*VdIh--jGXFpX=sjD^*wDptThQHQoKh8600)2L|wk^DRR;5*>40 z*mf=cgdeTMeg*K2Fjh^e!oZ($NzMz8KT?u57l(jK&IEgq( zM3R?D4XSRTw6 z$L5B+(^fxm+3}wSx8*jt|8J}>l65d}NCRT7@CZJK?!WJ}wXYwL%l?{u0)(%l4I0^P zXxn!x%&!!WOq=&0E`0Z%uP2U_$}gi7=x0h<2fv^;jULzjeSlz}LBrrxN!++Vt|ka*j&yc0}`0Fn+%3{iV$D&gMPj z7Tf2W{bKKMw6)8+|3~;774>CwZ8yFzjLx0o4g{dXJG(3n<1FJ)?CSC!(r_a!C9B(D4dj^sxUpt{xOV^4H|JwJD21)5HF6K@ zw{m;1^dFr?!qfO~n~);1YC&MU#Q6% zQj?pG;wpb+bV@xG!+ec5nf_a!F#a_e} zj~eVs$prUT*p-Z>w#$tnR@#b-X=8ew>>%`p$@*wHTU3JWr}{qDS`OPSWN!MGH$xa{V$ExzKI7w}K433ph82VV zU@P?kF0IhGgH+A*qROi;wnG8;lnZjLZn&cegINZPtsUmJ=c=)~#&E9TWyg;HgX;XJ zHqQSX!%*lgIx73>!H)PTKViTJHl0Ae087=Um*is#sQ zh8XV;WCSxhc&T!Sjo%bVPyY9Lje8keY+@0|4lCqU(t~gRLahE19 z0gbGPQ-y!SuM%toAC?jZwi^sOEHZ}JO`8%Kqw~l4%gXdc!)GN#z14VPWf)W3(WKeW z^pIz~rwsYtwDe&jNp?=%#wkGpk1@tL_0}bmOc8&ZRfkgMh&87*w{4|3pMkH;H>`$* z)4=O61HTKB!mTFm$`mp=6z{qvXj9AJomX2PTTJ*`^aKST0vOg?gZBA#Yi~=W*Hq z5|1q$J&rt&9HB!h5~BWEFQCh8lkYCmgY7YOsB3gk1xh@32g(e>&!=eIQS90vxrCo$ zhm1UjP5=itfjCsC0o;G*2MQs+@kb>vOS9fT!$X?UXZld&T$u~n<95VmVm?0(l;qJ; zR(~H@mUC?+e$D-{yJNEhDN&O{waO(y7~#QqMxcB{W2lBWws|&#d4%Epo7;lqVZ0;| z?bcwaY1ia3*p=+M6)`lBGO~#jE(@*W-Q>`&2Z47|x?>`UNEaDfM_s7UQdwnz^gm#- zc9&gGRHzPnul{AW1XAM7f!_`F)K{*Yn6g&b9L6;UEq*w8({YaDyjXMWJ_Du6Rr&3C;w4 z7zoJPE|v$m)&XWN+-ALm<-6s6M(6Iai8`r;n&kw0a-tS}=SUppSN|YMUa=8B$3lHc zp~)!DI`!s&f?o}E4;y})jQuqVv*dCc01gx%aKV@93FP?$(Xa37GKdx|8_SR^#@Mam zuc1oh5=ah6h?U=0;dK}&7<0fE>_Usk;|3SKeb^|>CbJMxpNGfwHw@1edUO+?vs9gq zjg+>b@Y|!PbT)z4CU}g^ot+^$hp|3rIj(TzC0SBSeR`H@z%EExcb8jqpR(Du(a3MW z<#{MJHfTYtK}Q5X=z&rvZdjw}QfJ<6Y&8MKQ%vJA`k&oYSnGq6&Qs^=O+HMP5u17s zx>Qnax~Gr%i9S$pq)Jk5Bx!n1j*dcq11-ygQ{DK9N6tZ&HPiGR=o;js<4d8~b)`-w zjIz?87rt4$BjfqpCjLV~b&>|j*gPkzliNZ97EvZ^E^*ZyCp_a5yTE(4F-7x%AjkX8 z<9n)6Ay3Yp5vk&JNPkmGkAFCCfpytP*ZYbG2UO83AWF+eAD#qILC)@Mq3bn}SDn{?x3*{x-CF(ol5~KV7 zd&&MkM$iL?0uCew9N5e2onkT2P?E*4OCpDwX~qpb+O zDB>6m26v!C+7cnA1HQpg#eR`U5$DG9RrMQ_F*B=|EZ!_uHEL3g-vY$iYLgoZ-Dr!D z3>Ss)8!~aTyZvbqOp)f!@arLE5rWhop9j3uV(U&tH$SOHML5~zocQkSbu@(gp7xWt zHi~Dt-{RAeX9^0~*BDI|w>Cwy>`PMlv=EiA^vpFGVcYVrbHmB@YE4Sblzd_D&ZQ-H zGRF9{@%5qy$%FcmBIf^$^{Bp7Yb==$OSh zfr+~_rJCoy2qU4%-MYp_VO$QHCFo&^V;1*QEGaSrS*pgsfpkVVH0)6tiAi9=&cTjK zmztQx-@I02Tids^xDV^7uTl1QO{uvE=#j4s0FUG>(Sw(Z9==YyNT0z3pjt$f72CWD znaAjJ3N2Y2q}@Xj!A?x*Ms6#kH*#gQ7$NipvF3)Wkh7WbXZH-Pl-OLcO6xaU)SnT9 z95!reJl$;X&3uY6%@&PQyUDU_v&YsL2uQx5+$-Wpvs*I9IPZ&C6xn-vWtuimFW)ja z^hl;jcu+bC+|VE(8H+T!vm2oDPAO4tg5nnn|)4`P`D z^lr>|{Q$Rw$PnIH6mLxBhGPrwVSQgWT)o4LYJ;CAxcuDvS*qm}x5J37*`0$goBO^>vHUrj16xqev2Avq>6+Z?kFiY+ zZaP;7aJMS*w*#v<=L6+Wrz(hS*!B>t%rBe}iYCYy_+6aK*GLaK6%-`wQ zCo{JI+(o(4FfAv~dnn{Wza3dq$G_-Sev7h5{%UVr1?o(@J2r|VDUVb1_(j9_`n!Pp z$GX^<$PAq!MysnvgdB#3OB+<`k!HGT*M*X7hoUeJ>DsWfA{Qqb3xH?oP^#f(>E4e7d_u+K5=UAsCTt8w6)gJ zS5pyRI5E08Wm;J^C_9rnNqP|F7k6XGf6K#dJIk7V#Y!h`d@TLZv9PCgj!VeH*%S@bj(r*0&ax8c)~NriD&oa=tWk zc5=QG8ehsdUDhr;>AsfCy^VMFXNVv5TJ;cYF)bjLsbu1f@YLlI&K&= zaCxjK>g%oAG8eyVUPX~fq(OR#%*+YPO~(9b^Nl^6nm2YJq(bp?th;gQ#Sr|6#j8gZ zUeNK_K<8nCa^W4?%_iF$8<>P`Ys9GlRa_Ykd8090fMpTaXno1xY-OY94iv@&iQJ$-a}(<1CeBm$p5)JmwHk=2fo*ep!-gI# zggeY(adc|o+m8#E(I5|7Vp8`^%Q;o6_5fRP*iJAc_8$&zp}IJ<2L((3sp^M)_20Mce0G9URnfzjMPC& z8Y`JV+-~7x%)SD;ajEUZ6;Nj_dP7X#{X!$zAs|OD-$EV>)qs5~X;Y)kig$iq9m@>b zx>aG{LBwyRE$p&V8EE5QAf7M(?e6TGj!bF=N{QvHrNV9qLL%Bdj>v*BwPp72Y)9=u zFr{v?O)ROqIWks8PJ7rox&wMv9RE^!+c}K6w*X+lh{;`AepUT?@XyMvmHlN#B?S&j zw(vLJ*DrZ%-BuS*2Z3n~Uj*ARnEJ>rz6rU>;C^xuNWV!bf!h5CGZZ-mPcY z3POby(jW107wKP`cX4p74wc>FZ^PT`mzyDVvqN>gTb#5RwBl|~<^UU?wI=%!f#2+<&+Y2L5 zk1=UgG+;<{dD|<}xhi8zh2vE@U*(EN7hGx3FtjcLVTu-ES-y!@LleLN08asd>5!vwGbmZ%b~o)hI9PuUHg? z4s45a1vE}N-T;6?Hg70*Xjq8q$p9jZ7xvveKa%8m#yX0&U3w;=BAODi&H*3k%Mq^i zDoT1fSY$6Vb}GDeURcM#lSX{&r5F9yGn+HqUZp4h`21k*U(>kUFHbOlU^jJ7_rmQ= z*+R2?+cibDUCG+o`r5i5=YHpe-u(gmI>82NItoaPWWQ`b9Gas`LAs|&43zROXQ)OwkT&< zK9{!O@vx?EVVc@}$HPeE{D`KRYXjIPp9iFx;!fPpKh_F~?D58`4**DMAQ@=in`SPU zx_9_Vs;e9LNnV-LNCF47oo|de1bzG;6ZrrC!JeUl)Un&cYagojC0Ytz;wG$Z&`M`u zC!PIGzlMaQ7rZ}nz0me^^zk_vk3YO_{uxJp^+tNOjG-d6@8Va^#VwND&^u*@jm|&b z$NI5IZV0H-3D$2F%$QHM57aT7$;Me_>1Mbq51h+zwQyYb9W%lytPitK_>~0UX?H<_ z@Vl!OWTl!6(XiecdEfL&M@$uyLq7>M*rFwbAYQ?8?D~4Cm(irZaNuefP3JQd@<$fZPVJgt6z1@Fh;t` z=W|bZg{d6gc;DbQTIZfOS{GbdQP+rTupXSK?0wEkXRFcMXuhnENbV5N4aZ1?=1n|Z zoC1A;8T3n+KciX)=J;miPP9>=;X7D~BQ9e6L-m|q_?BX4!EE>J?TR6}oCxcF-}lQ3 z@zld_t~aVrd&tb3B_B3C_o}-ZrTOsD*%?WZz*SlFIqL{2UCqqP*XN$R5A@JRdWM0( zSqIqh2R>gx4=$)-@0mu4P5KkXGteunk!2ICMgp2Dbqc@{Y8;Ol zL;BE6!6I5dD+1**H8MOsx9|lr3Yo^V^2UmDvsFjN7uo0NKC?K^X5^Kanca9zIXvB` zg~I3=Xqeg93C~ps+bL?bw2wY#rcW+;%6r-QERlq|gWw6V*_e$F_;}X!i>7rGQx5GJ z7v#6a1puP9$Jf_ai_zDl_Fjrj zk zwd#1(Za_=vPuTv|<>+C>LfjO_{Eb-e>-qMt(|MbKRw$7)b&B~1bv@3J3TbZO1LF`Q zOlXnQ{eVkNXU^PTdLWX=D0ZD$^=U~{+{_{1ZDs1x9@NCyu zGuNz2rw`Yz!e5*B3e_EXDN1dczln-%W%d)COoOL2)dC1S}$)(K ztcYv_&@~`j_$7=U0z=i3bW7fd^VHN#O&QfVrtl2Qzj^X%X+&E=@4mFVf?j{U5?-aJ zN+8#og*U1u$8vruvXW$kr3ZvHS;7w(ws4U|)1OpdQ5QQLITxR5VKM(_`_?_u(Nu>) zOk%K~tx%?|jN(`6hw66x`Ff|ICyNZZuMR^lVN&d6o_upvUT>s&GhDI&K)$HOt55A^@=ei5^uT@HfMD9)LH0>ZG|Gu65TJLD{xUa2iEc5= z%}L>&VqVZ7%ojc3h$1uu5@*hW4;bbfY>g8&u`x5Fs<6{?7bAWDavT&l8}`*wy1!AD zAi|XIRTDf%dBzu2=rGQi_AF)d9{eQrhFQ#Cizv4zi%*t&<-bm24OLp_9~LH;1_VCY z7zsVAd%dAlD-?`IBF!Azx{>IE zy-JRwWbR>(^^T)lAVB;HXzqz1d##37CH8OGFpqCcz4p~|{bG9#@Dv5<*kXETYuU0G zgenmc?uHv0Y!nM{B)z?onGNgmwL zkymPa_PtBqKR#UP`b@o;MRFTwqQm#tj$&56_W5qb9f|1th%Bzlwui!~7M|P72AM9# zUMpR6s7m{WQkUZ97jo|L`!R8v=1YU~I5l##35|boRQ?eeNxrLVq`sNXhOlBF(|N>l z=t_V|0M%6cYAk3B_W#hK*4Bb9OO}7LOfF5MbSx&YlGF5 zaRdL$B>ONla8{3uuy6Rrl);bYcA@29ZK&hd#`#j{G3j0*-X5oVUF@BI_-z$e@xAUX zZ%eb2nNf7TGUKLlkEGmY_OM=F=D6WCBb~B@ye;9WVu7;1P)itFU-UuZtFhv0he)O`D;(GrS%{qJTymNSz z;3@|NzN-H86ygkZymLcZPQ2ThH}SO5?W=#hmJ70fa*=&YyZ{W#l+@-+H(t8U<05XE zc6bgAi+z;&XikV)L48yxGiqa!yytu0-3mFyyt8((Jfz0sEm68{aKU>Of%SGSub(Yk zN%%`V7XBOiDjQUKr!|d$dK=^=VLbwJig`(;B4|BK^L8rQ_0=R>U9#WLm2*`Cl$Lja zI|Xh`N3JJ=!p&zw>?iQQS{w1O8}x0kHzK17==RZS!Ex8YNGcts`gNg($MHl0$GgWi za0iX#%Q;a^L%EUpcLZLyO)se35q{b7Ehp;3k_oO|^NI{dRC7qG($VNns>-$W4y7F1 ztQu^$Yo|m&&vn?F8LdZ>!Ul4|wZ?q0nv`Rbwb_&XLzDAsYnw~`O&vWQL-P#w-v{mw z$lH~XD<*D2%c3d!W`im+Bh#h*+c=HUb+bW*g{seFQ1eNKpV@W1YWil$B1^-3(F|*a zvl^88ma7|f!W$Ra48vRb{(Q3W-Q`-Ao3YF((^OH;+X6BaSCd?0pM>j11pfEQdAa;a z9;QiUv35z`fbVLTl$`z6s3PGz{0)5L);e8Eu!YFw%$7@=X(K`2h&;z~!K{!;R5GP_ zl9yUsnRJC-g3vrS4QepvUG!bcG`G*A%Nng&MSA?7RL)7a&N-CF>_tQ&(;E+a4%x$H z*^?BpE4YYc>`;rRKewJrhrN}Yq(Q24#)2kfCmR~>=lNawyR(tu61`YQ;zSu^T=lS* zm~PsG#n8s?OSiq<#l~~!f0-tGT zdQo#{p1(tF43Sr6&FHudbc;O&Mk4YMy0AwKDXX_CfP5jk=~Q6vez(2NMkw*k>J!pb zK=$B|_$&LsllV_IUjQyX9NHA36P1e|w9v+p>J3xn#d{UmJ=ZgdWuK{S&uX4Ks~*ee zy25uO)!8=p2gxBNF*#m#IBYBPBf6^PNv`bmxp_cx(=JdRln1Dak->G&)5?F@o?~vDuU69@gnR z|2kfMkePjGZ4{g3~lE%E!qE>aa^BT5SIJnYw?KktCI>c@w0f+1DL5!x+&anz1b`!3K z{SW}Dys3?NC0l`^Vj7Z2*^+%s zNs4QXtCs1$exIL>ps2;b4 zN4xYi^3-G18*O!@2hcY}1*E-9%-L0U_)fUqZISGh53%Lti2wM>-ZMSKL4crXbalW4 zR%eb`8_Myo%XyHTUzb#-*Dr!tt=ZRc9%}cPyt2_#VsbkM7yLC9=HH`7ZP$K>%Dvqc zR37@)IB@Ct@OLs*Deh;BS-5>F>{Tr621JrZkJ6VhFe?h{y2d}Hk{ZJ+>M}%2=p3BZ z7A%s4U}vx1tm+Kwk~ra7b{`+n+%8c`$e%KrMX^Qkv6yr@2o($ zvT7mx0Sg5R=fMct^|P?fkiEwJ2GwDE2t9(S5WIhOhy{fHf8tZ$Ats!iE32v_Xp5{I zfbfX}T(r$N`^fvVp&`&IA|&Mw6%v0AAM=;EjW?I!h!dgL9g)Ivdr1!^@v?2^iJGmi z_wi})EnAyQTfOn@^8sm;h*%7e&dwv}4--!1Ta7m+Va~}nlL|hLjqW|rUE64-DD4la zo({xqaep|1PwL)sL;6MI)91}dy}~eF5kFf#URepw`xsN@nyVd^7foEQyTI_;jwPvg z8E$yFCI>Zxhg|%wvMK;=5eO>9!7?gxr85UF8ALl*FS^{Hv$9<3T`yuE1I=`5;rjP_ z)S%P?nXN15w0*!{m>v4tZP2hs8Au@VIHF}fQmlqH8%~HJ*2!cahW)Eyrrn4%m^p*9 zYKS+9Ht^I)mhQ85nm7ybB%y0zlz2qD>{OZm1Y7*(@-Sv9SM=5&_eQ2YwS0#EK5*`= zIF?P&8XNIthU{$ZSsVU!{#owXhN>#D^9#@OVLVkJIw z-+CB^pP&N{dhcP(FoeuNvn6csf$KEbLTw|FM%(@Q_Ng9l@O!_d53gmiVN+ETo{%UY zvrb%f-Zx~*0H`L0X}2LrLXV2i@{)j}z@qITy5uKkFp8em9OnuqspDwnGg`XtR`bJm z%WLD0T_I-lA79IhJCN~YesxO>hT0MQ**nvF$cy(?y=taohydwbk8@;CHJ;b{T9-Fa z|Fp3Zy6161&BaggbZpk$zPO-2F@6E9k4lWCPbEw<{j%n(#jdu_e6C4V;*E$GR7jRG z#ha$6Xe2KO>+u(0OOOWcpNbZ{uk2A0I=A)%*&`7UY8t#k{GKCQP%_FVc2=0(zr2UG zGnUy!(BFs&0SNXaC~bz>`t|ZfApOf*Wx;)Z01AWK-W2N#G8oT{m{egF3XKNnL<_IVUIn|44QYPA%!6%;C_=pO51=QG7emuW90 zr)C8s!OTS!U+=KiX8==2LT19JsNB`+*3i8x8%66ZzFo^^iI;I>Ty$%uUK_n8nXyHSXszq}*6eSPh*t5_@xMlk&|UVUY0O)ocL(`7 z=IPJA6o6oZc7@GqAZK(y7^-Va5s1b2(p_yk*ZOyB&V#$btw0z$+D3cxC*N)wWjHEd zc)MeA`mA`}+t`F#HHJ;%oD{$d&=eMQ9es53O+pH=C$3~6@3}@-$H^&;cjv7ZDE?&Y zvxcfHo_)vAez3}+%n8&g-(p)!0{`shz6ZxJmmUs$$F^sH%4N+o8b~m=T>|j*qlzlG-FATQjlMzjAu5_QT z8mK`au`?jR_OEik!*ZcO7-G+ebW6x4xIn5!-noUyQ8RfKz*X|S%20>dnvN8wKVGKlyl&2x9q_{iO-jPvS{?Jd{9@f_&S9iz zZ6n#~@wKGRO{P4bT<4Pa{yn19*XhmJT8vCg3^vUnAmq%UJaViR){Ivpd&M+y?op$T z)u5}nUy((TRXJ#V4K58fTjz%azWtGCtgn7~M{;1Nor%(X zkac=Qernh#miUYQ+w{-m>HiCl?>BvZr8c>SW_>SrFaFBm8=J4}sw=DGrfaH_dG5hZ z>R-P8@>O5m0o_}Lv6$n!`RW~620nn$c8O|+H8${F(%pTuy&%*hXk{R^{Fq!=J5sV- zh%Efc{sNiKKy5rEju0vMmHm7q=;UnNk3%$xi3}?fIV77RnSNA{(bk1&BCuwp7z%E% zvvQcX1_(MeeIXF)k$_P53W(q$QaZYmq^?BYf~#n7vm9!w(6>m|T-dT!42sNgB6 zS3;U(@z?ka?Ms0WF7xI)F=~=pVNSEI_TC0U$VawH7a6;RR)>K4GK(#)w<<5Xo%hpa zkq(S09xo(3wsXj=nJ-7z6SH%7xJ6~>9*MWTQwWyK8hx1XtVX&CvsReDDrFSB5s?$( z3b-u3#HXkjT2=OSR&t{Xoj6@AQtaa*q8;I&9Y-Zk7ejqjNA(K6qENiC+i)K1)=SZ( z-+^Abma1WC`Q4e%;X;4P1ZYZb&ry}aT}(PP^=9tjV=xiEKkZ5fbE2o$VHETeglscas4L^R1krTi@FkR!e3 zcB;7S?A0f^sgzPBmrT!UW7#j&b7jqT(u5TV!J8Suajd4bQr-BPA5unnI&)brcKLRe zCQ?i=xo~>Cq43pU$3y)|ysX9g3MTS>-=@nrYOwZE(`4JKJJKqb&rmsn@$+PNY>~T|?cWjQfL2{w4!S$Hf zkF%zkGrr_ElwwLqn$q+7%rtsdMzHdZjYkGDt(0Yo`g$1Ux;_dNpc2|b6@dPnLUX6< z)JPi5oApjX2TvLkKO7*bOXyGJHfzd0LRTr!!7WaT$29Yi3Pu;TRRD&~_hFaU@!pVF&`!I}s5=ktQHP0vTzcGg6f*B1B4v^cI2; z%1Dd!PDl_UO%f3dkYx7${h!_ADZ9t+vu}76a=?9E_jR4+dw#ytl&*uoRsI9q)+i-_1Th?X=3#^sub~R-o=cdYX~w*PA=M3P=RcEFL1+6+6K zr$v4J88+WErnDhu$x|5u=Q4r_EU&Y z+jG@`EkaRLyaN2QsG>No)c+|L`4PcR-93QOc4fx^SF^{8GT z?gMI{7kbu;%S4RjfOPy9Fh9jAwXF5Wkh@6VGjb-&ab4jh({XLCk1Ybtxy>}Ez%E~u zc7+Kt^JQe)Qt1R9{q#FtwM7O#6+M%2u9RsydFpQx|h=Wb|q`#2V?4HsIjnW=Ti($Ry^ zB-XQ7LV`!Yog9}7A(kzm*2^-%B3PyjRecbbWO%V433-;@xAfthPL>4X%@Czd#Fl)A ziV|?!zTzVHYCX`(p}B#eF5Ft}?N$3R+_Lx%5K7U}aixMxo+grjzLDa%#;fsLK*c1h z`XwBHm)*g2M{Yz@^44xOWz{}!s@zp9aL4A)LNUEo4vE^`rOXqjpS-Tbhk*l9;+i6eAeRjEyB2 zxVhBLu1e7(`^a&NQX|Kkf9i~(Z02HR5PiJi*((q3c7Bp&BBWgds%6^|qk00@Zk^vJ zuwP4>i5u`IA+K6iWVi+S^&_3rs-J_ylAxNi3P@^UrII(>7y3v8nArs{bG&Gx5Ip-mf0W=XuKX7IR(jMm8o%pk)=; zLqtbU1(Gtr-YR^-DtFz8+}YmtjVuoce@1>p##jhWECEoHmRhM`q9vPT@%s}EVLL$$5qPT|Ni%ut5>`hG^N z5mOKtrtFrWU{dhB3|=S`6T1o}lK*RK!2w=L^=TBXxN#F9Wa z#>4K(X`Op%E-0yNe({d5sTf%9TIr1vaYU*p4unSFZkC2VCqC57Ynax2ne4f3jk^G@ zs}ySi?kQ+O^>`r~GDuMv3=Me_0td{C!ZOp!dl~CTH)nQL_X+^ByWXsf6OS%1PfEl) zU%<{JgI>WAI2-*>_TBgG4EfY+lZE#=cF#&HC8eSGkLm-lB$k63Qi7T(-VH5VU>d8e zZ8P<)UQJb`4t)kYva5HCf;946qGH{_(6qE7B4tD0JpVGfoO(}@9j2IV9RW`qGznhW z%=M#c5I&ACw{C>JD_?*Hui#(o0+HJt*gQbO?Cp6jj$sL%9u;ti4G3+15x~N3vw=Fn zgFsQ_dvO<>U`tHQIxHuOlO~b|jtYPSL3H0us@~I%PaN?gBPo$nd22>+8l;)vxD`bu z3x-;Wd2+Jc&NSpzs62JfV>n1C(@Kp}^>Lu&N?SFG!~}cqUYjh|_Sc4v@IWhx{!lFJ zGUFw(NdXZ%&iyf@9ejaVpz%2k=wS6h>;LYfToqGXS5>nYZ^9nt2fWp#|*8L|$`ZtD$ zTn5i8f>+T)tv^3AC2cE3U}_ZBd5a?N@0D?Vj(PWt#zONLGhyB)rCJxw)rh2d$Kz#k zrWP_tF8HiVm2*P+X0=U)xW{5$RQGUuVV<9ze}s%*r$)Mr*+{lcwZZ`?2zY;GAZxWf z5-4B(3Vm9a zZocwx%p4-A<^Npeo$%rQcq3^~<*61ZfAf`PaLUNdw+dbjLZS0WB#lQDw0n{>aO$Qw zpg$U``e>n_&}}Yd*&@M3S{OSyaRg)Pj|_-| z`g#^@kM!AjEU8d-S%p99lAxVCcRe-#s}&k@h9kc08!MT;<((Jw72Dh+i9mm7GDBQ_ z;b@yWP?fDHty8eUi8~HbPsZP6nD^hCEyAYseYU#Lkea>@H2@$rjB}DEx7T=waFz(Hz`*gyJ<$-CyRMaAq1FfK10J!i(NC8*`|k|YuPlzc2TiwAjw zc{emxO-;gLDqPv>!q&5^li1Z+#g?uyFPG9m)nM1|Qq+qRJNS)t{0$)+?5O{SIYf{EHdufI4-ypdQTx*3Fd;!z`mq5{W@1YrW2njcn;e9-U)moE0X*E z37W@Y$eW3vHeI+E+Hx#tjVSys<$^#em*QVkRh#5BLoFkubPPV4ANMf0SXa(+c%teM zIJemic4Mp(0%g-QyZ>MssZQzPX35aWNi5mgyT&^`+>p2kSYly)`D-a26T@(VI3r`W zk{V;Ee`Tt_z;Ur~Wz~wk^!!9K2K2t;DHku0#ADE!xk_vANc=C?4=k02yqerp%Kf9> zjJ?NOB@w+G43&2TMsF1ABijTNJ3Au8MT5Pdpwb!Ys$7JUUeQCp7Co^^jQK^&5;6Hm zv&sA`Hu3R4+zspPy+-_t4{YFHv;G2zps)to-bY{|C;+1o&f(Eyw5?_Jkux}Q6D$-( z)zl1s0M-cw_>1EC)KiMc;Qsk9r5+vpiLBd;C9PTYevMAsj-Yvh{8atj+`nJ@0)5Bv z*eq#9=AHF=^8w>?A;55iJog3@pQA;5SZ&Lhth}9MoTr4e=sj*#1KDsUduwz;qhghG zeD6CgH{zw7jH5^P-m@%nX-Ei+yKFrKf%JBot5krj=qW`a?s@CGys5O-;d#+ql<~*0 zi{Bp{Tu`(fgVMC?)x^%#Kt91azrGFwRt3jSOM-0X(&Rg&ug#*RfVlpad{D!od zBr~#ScBZz!>v}v3ZX4xftmXZCMzqyJ6}1w$@s^D7u7K&rRywZ1X9R$GE*ASA+NWpF zihm5KN)=6n$96~VOt?qQLx6e_SKHz8^CB>RKcH&?P16_>@YBi3xkgs~=~5#~*~JBz zl;yzKO>>`nZg;glF`&hT9UpNpkgVaSISY>qD68bG;pM~^vw>vP&H;;c*naWhnUn9J z&(b%a#rR9+#<=em&|=(ipYf$tFR~m1bgD`?!QT!hkHGvxuqOW9IUsi|DAiRj)#0zz(|PFGrytwPf*Uhtq~(-G^dU zpwRI<&oTL*@!kVsmhMn{|NA42%Lf`C*8D8-xjWN9QsW}@ddDJcY)~^o*3aB7Q_{pL zm%3vvkUFBFUwB|`i-qx;V9gZNoD?lXatqVl-w=iuZt@v%L<^2|080idb}^xcUd7`6 zJI0h{rVl=rrIfA?;Bb3}j`Ls)VXy`8+|WZHW-blHnqo&r50(?7&i;Gm zm98`JI3%@tI5sFu(5@dl72@?5H-O`}WtZG+qDOuh0^MR~k=c}OvtA+d0hnNvYwT6V zK!N>$SohMGf>Zal{WsgQsV@JXsV#>5d*(J6Ljru-7f(*hXvgh<8!L?Nv7d;#5PLax zy61ejdLoJsFF>EWGlPPku6Wr@u(&8CGJTyM<+XPi=gk!kjk+#M&(5w=*{Y(8X&qjE ziG*vHAOEDx7CMn+0HekPP^gDia#-CGc)*i6#h+B3GOo!i9_+rL-RL}>$79d1_a7Ik zbWnO*J?NI{XYNoRD?-iZI#)n@1w`h87vnLuN?4mpu&Q|YRf9TvZH$7gTRl{Dz}#GJ z(vq`J8AG{(3jg;ze*fnuK~H0c$aIVS#kQmEPsnI$@WK+XGJHBQ5|p-7?J_QARj?Gx zD(i#DrJX`@(k|H9>q-$&aQn3^g>2ItC}Gxu)U2f}b%cYMSuZkFeYX&%yzTUeV zWM04+)PfMH2fJMYg&UtfA|l{+wD`VF(c=2re*4nU{Aiw9kp%1rR0B&g&&GhGI%K|X zNE#Hv!*^yrOqDBmZug~cxC-pX98V_N59cZ2C#{vi^FX|vS%1~DL9%oDP3_!~ zty@j=q%FA4f~Os9DZ}fU=RkC*M%R_AA!>40DuvaY!c6Vq!}TRAEqC`5VWJ#07WedC zL{=O~m>`RkoK|^zfbF3;A=dj#FHByEnd~T}^|_c-@IOEF6WffEb&u{l8R(wc)q8r7 z!0Q|e;-wFXeyUBPawPuIug{AZv2nYbvvJ(2NnHM+xH(^Vd7Rz=EliKCD11P(RDW$ z;!mRi-U~^lFp<56_Qy)4j;TbiMpmqzgpy!&e7|RCUfwe%Qhs|`V!&yXB%p%R%nh)& zQ*ta%v$mrtOcV=45y^v}a`#-+g#G%m3sk17Yj4}I?gP;tl|x#+z%E6tm6u%#C!q^< z+R!XnM&t+MpP8r9DHs=QRaOPFZDWt$kT{+_1(=|Imbx>?h1soevWq;D;5rC373J6}*#cv?W%Yh%Q4PEhXrd)g-O$Ya?+pITh>v&?m9V9z zAsxK&&uM-6x@zv9Ii#j$GpFIq8BS`*(>r{EYa9WJOSp$v2#qIX)!dbT#HOe`tM}2o zY{{*uT0h%bm6NIfR{`li<&&|_y$VpSO@mC?bxr27YY@z3@L_GWUi4H+)TzYHVBuRf z>Fyj+>@LcojQ$uHE^<}Bz~W`sqI@qt{B#SHMgU@E%3kLC&1-6aMOMIv5JbFdrbxQc zufQE9g_s*`ZTo5dUP0>|x5{sKg7!I2*v8DbdPo{eZ>>(%Q9dtZRS%3yaNAk%Vc8c? z_fh;UELe!*G{t|mr$WFPzHYKJjRmP1nCM^#ew7(1ne)&RCP#n99%?)s< zFM8G?S2_X7vsx5fm##j&!-`@~F?JlM)pU%?(osUJV8;3JuavSdCd_db)5whExy|Sc zET1BX`o(fjP~!hdoRrel3Ii=JMxwsE#vx$*A6OE7NUd+XRlv=<1MJgl^~tL8G?U$B@svPN&TvmP}`25CttTEblW=lXAr>8N`dw4mLv z@_cUEz5^y^mP(3tP``?=5T*=&-&-co!aAqUF4(0#hrefr)gj31`8C(mMw91}T69Yc z#<@bTILW|qpwx(7xqIU{Od&unz27`V@EfSo@v?am{%6K{tbzUv>HUHpm*+8jL{aFcdg z#Q73Bnb~e7O{T$nLLT&G{y^55g`_PN2 zTGtfKdR3?g8;BA3zS$fh|L8w;TfdlOxx@85W4*GNk>_q2@R<7klhsO>P1=vZ5%p={ zN&RsG-^Bm{^i#lf$Y$s7i>ilM)1zD_fB}pSeSCzCdd*U6>S3bRRLvqkLn@RkNH=AL(b$ zdPTkM`!q^be2v-+22LA+|8U>awr&kAg*tc=!4ekcg&ZP)&ZIFHb36QdPye*0_*&>E(Os8*Q^zG2IbYqbnH`Dk)f}5<0gJvabdTTI2olrbqwA+#jkW$S*^{i1zsd_yE zs9=;3LgX$Xdn@)FXPk4H8C@~trypmbHAFCIo8w$X6rL*^%eaQmzG+Hv<2)+5GHog} zF?Mz&Tx9U%V#wizv|fCh{-AY+`XMnZ^mz4#eRXFp!$8^`eBP{JZ0d7vjZJzr!@|Hs zvGYf+tfjwphar%3U1m7%-MeXE#y0=S{Gw=Yd;46!Qr>pJS3*>nr~5v_cPdLeYpIN> z8bN25^sK!g^Amny>9=Iv20YPPAPehj*Yh0+7Ts?FTMMlU7eqyWsWjqs+DL$E^dI!c zox(HC)=_#It0TW8Dab`yeGYyT134sbX%&Yi#W)~FW4ZW;BzsgHg1o7I11-2|q3#IIZ)WB`sc zsMJ+4*QX2DgRZtGzIVETGGMEQ?Hb?x9=ks8kPX-#7x0H<@+fXII!dDxNs?GUllw`q zz6CVcE_bd4qeE|wft~Z*NT%K+EP1Y{4q5_kp(Y9M0&y(-z~qlsSHH2atsbU6iCV!V zAMMkF`*xh~9hIGhzPb~kFIAXD+EW#L+N6Cx?uGaK#8fO-urW119vIdu zc)WM~@0m|tXs=wRK~bpi-4WY#eVRsDbFSUx-jICf#19YPJQ>%wX8J?V2aAylHA|%n znsS5frOT2LWq~CVeFIhRoy0x1BV(t;Y$~Azj(LTd(y1=BRpf7FH&DI0K%c7?B!*fm zS&Z!OvnmeFd7sN!Vop2l_9zK#(@FO!T7$N)S00*_9F9irQb^ zFeKGaA)M)_r6yYz7&IPUvEnk%vYGroGP3Yw@k+-!ikEDm+AkY)we%5+>fZsIB!0nJ zOph=S%Ts@aylhK;^1%`uNEwTohAOohDGW^F)Ib9d74OI2AJq`E47h!%(jZ!~??x7R zu!k!&G0*9Crl*pb!t}pq9*$D?B!VF)Z8Ziyzo=Gm zuz$7D9%Y;HcqFOepc4a^Korva%o&%bA`8s`Rc49^az zpDHSGM4y4?tV+{4nQJ8oM>*6XZ*XVWcTU&W*ov;FQbvHtP`v=42mrsw;wL?7Y1=+I z3D}9@ul~(v*YJnI)?RwV50W%_z-arsyNL6%Zo@CxF2^2&Kq;s#h!gX4t7X5d>n=Qq z$e;m?HMSMzv}T`*lBG>yNbnQW+lEQ|wM%oHpIHRDK;~*i*_|O;FQ?4IUslZyzmnf$ zOu`f_1GaRIb5(O5-NqX`wKjG8$7Qkc-yrB~jXRM~PgH@5L8pr|qa|KUG0>8FI>iYxUdHPefBaiO}|K^7*8?!%T7=3O}xuDF`7QTu3)DpH9NRI3|Lfu#T*gBJB4 z2IMB1`Nf%Vr5|24Q>mx{#A;V~jL{EQY!|t5A9Q9I#?V; zG-h-=oP_Vpxq6US`TrYQk`)33frFwz5vP;Mzm4))am>2kb9qQ+tBXs13X8(@+yYis zd?~{Sg+oZUxqKET=O6XBvg%RB2*Q59m>xSN)cos^=hq*s^)IvaFwzDJUY7U&zbrBl z$&x5Lbw;>S`1gKdSRMH?Haqyxm7K}W$Ry-l`uKr$duz)ijroy&G<#|`&C*oe8+{Qa zPR`_j+1{wZ;^)_Z{f0}};qGt;$i;C)>0@XX3{r}nn{xC3*oq9-p;j!T_yQMcCRY9DHR zue5NiaJNmD*B^ZHwr1j8wTV?;XYMvM(k7umo?=pRdNFoMoX`Y9hm+<3s#j^}oNRmc ztPvMeig6a2QZM6UCc{~o`|b|v6Hsb2R--YrbuTBb1V<|2fpl?RnB_q);7!Wc6QH8e z)ASIGcq2|){bQ)D9Y%UQs_!f*-Fxj;wOytOK90w<@O5!b}a)>wkd=^@tz1L3_I>1l;WG?pnW8=7VuOr6l z1}>qTU76KyH$;8+AYjv;k*h%;Q7~0^N_X7COZ72}-&DHIX@wGJ!@Z%IQc%GoAs>oO zx67dn1TIEe=#w75Q7!Jz2d$-rWF4#nNuf8pjwOHU$64;VWURn4=n(n$3@=!Vg8Kz2 z#Pp(`gMS0VDP?DtnPs*;%=iF_I+Kg?1ArwdDH)Ca20AtGJ5h_L>es^?=63VRr(R!H zDD~bHNc=H~58k|Cn#^FbXld=}v)6OK6%&mx`IIk@>|t7A1Ku4TX3z5tS!MR44fD&L z;XwUOAMLo-UaMVM43A)lMj~(OTlZ3GV9@DzhD{N39?-l{VSC-ZF-w7WIPv!z93WtR z3FE`VDf`T;`K7U3TXaMkl|0BF4{44ZfSlh_d^bPeieX4l36<+HcZeR+Ire$inwmPB zqQ0;E1PA6c>+=6;5vPXOkC|O_7Ittq~I;8 z5^E^x)ZvH~|5Of>q*!1a7tOOZCqR`U8Gbj*LNMlI8_V` zAH&D!Cllw{0Q5iGo5J4lL?1Eq`%0JE0q>V8H*38bwBPk5iXZf^Hs%15Jta#>7PYZ> zL_I?!^TWgUA=UCGxeT6cn>>B_;ap|AycPZ7H-RQRnoZd`>E3KV*3Ufzb_Qx~IR-{G zDYigou;8aUNLyylTQODE0^nl1XH>T%j!sayAaE;KXUX~Fx|Eb=S%KG8L!{GnHXBr%sZs zQZE{g3O7v!?tNd9RhtxUoT6k7kKM~O?{M|Kc5Xi3EB~RHT+d9(Y;|%jLm0c)priCK zU{OhVi7L0_;IH&i-rkv{^#?*yT{wO35^(;oN z-yOreg0ER68lPplzTUp@{^cItl%X|X*p`BXc}l+2lKn&VG zd5#X6I!KX8SR?ZzZ1Oyy3nT%Wn`vfwRG9t9H_0xp{0*ID_t#q}KObkdc#vLB?QJ|< zL1A)}txQB-D>c#_92Pm!_ZM}sZTtaGu2q_OQ<~vXA_=Zs{XW@c0m=Y;<4_q~KnHy3 z)R*Pn@~Y*g8fl#?<2&l&km>*_H{2>toUepFto-XA)LU?Gxi0!XtRv3I<|x~^T9w_N zvq$PWDF9SgeQ9XC6ul^MyVsMU!}OBx-@Ke?=tg!~myDH3j=^^qG#$<4!^$?kZ(BB3 zc<}N{>R8&}`u$ik3ox9i{G%kSZd&^VN6^gHNKK9EBJ=@{MG z{8zw~1I7F;67U(_oTM7Xxc0*?_V{EiG;YaT%o*l-D0h9*u}ZD4_5Drmm?aOV?i|;@ zak{)R>3V!kV`&V)0`EU>PeEY5kBzr)HcOPpkyyVoelCh{QPFX$&%7BjS_hkM=Wx3|C8Ml*r|O zrp&Hme^f@k=vjTL^31Da7or4ou_~nRimJZJweRVA)4&{w4EzxZsp(YyHZtQR9qS@Za@0$#qk0v>DijO==8F$vck|Fo=7QfErCK6PoYl5W!kltfisq(xUg(!9sHyqY5osd zq1R%@B=NzU-5dvdO&yr-xT@n@EVfwqbm(}E-NCu8w|DW>kuygI+Am&dRMg;py2BNb z8<54d)`@W5Q(QbpygNNv^-=bD`u_9gzz4q%d&n5HhzRbQqd8=HG=Si+!BZK!!qx<&Zz9_aKE7+bxHSNoc&wlwA=qZ zqui)61^RA%0`+Miy+@4t+%gp@+Gw9kA`Vu`=&pGvrPq2d-^!W9x$>I|0+QJPPp!x2 zrGW@HA9DWv%hY!NRGZ3^!)Mw|V&XftOGwhS`xOp6$ng?MB2R}uWqWus*Hd0>q8KZ; zMJiQtfWn4{ScdW(9uKfDk{_7(fHPowDeu&ZSFee;_0j0u=RNt4Y7q0R+o|L3Tz;pH zM}JKf*yx@e5B%9^Z4pR_-T-q{S{`Tcl|DNImXb$7=r$+r2h2i)nPUS&{kO7Ru_x;# z-9_bxA3eL<+8a27^A*5|#i3R54D8{zbgLW4`p{~0xO!7|-OhmFGjdTuQNc5R$Aq4G z5c4{mC1`tx{TwVsJuQ=DqKT!->}rCtFGrxASs{JDN(oM-t?*={J0`nJCUpTCm0-s;C&H>=K{yJ)g=))weHYeM@8 zhTi>b^JJ_FVBxs$sN|i71n^+|=RyjE=(LG6IZEb*f%PXrhFJ-<8vigB{=nSP`uB`; z6UuKW*KZAje#_w39t}Zk5bb2nDYY>4JDrTZx!do2+kL9Vn@U}ruZuB^po5mwN}ffO z>8RICwEk>UE%DA!8)LPjo12~fpeDL872<|k!=dOV2C8)&Ar>I|k9!h3x+(~};9Dr4 z8V*V8;UVz4`kv?|A6DxabxXL=Vf`y2Cetk!jfsQSPV>%yL+LbDCE`z=H6aBKcnWuoV5)dLyaly+aqRq~Zb2jaX{AsbI=* zclTox2@tv#tU_ReJRX!7gc z=Ydvi%sNThh3WYFrvl4PjnU2{bS*64!~xP0&g;6=r4g|#nW zBUJ6}#PKuhS*2`yR`(8BMmh8=X`+=E-x_QZ46RFYvJPE===I6$CKJ#+{qmR|{2^;m zaOenf+4v^2=Qg_}R!}}U=wkC?K^8|5!DUZxO9e-)vyB(&uQsxXSER4Zuxumi&PDAl z&MrQ@d-xf+nrM&-47W5ehU-)8`QcdhaeVxfx5&JHMK*9|JTW0ubny*-M1n79#Pk6FhLW$8vFV;hb=mm z5pLa^#kSqc0xVO_<$;FuY=Ag)cVW|c?J^nQ?G-?pL)1?+T}I6WU@VgISQOzbbQ);Pu` zQD3GMpS(RG-)$p}$#0!N*Lk-A&!qv^uc+r|2?pStDHi4Z&4%wJqbFo%=hZP)T*Qpa ztou}RY3l5cmaErua;B&EBgueU0Of<1?!?z;sN(AA+oebg1R*q_$IP%{( z8OL7aGRnp5)`VZO?M>Bo-@Pua8}k4BR|xMVE#^VGCdNG&kEt3E3cW*TL%Xl+I9+rho5Sb1hy?@8iZ5HQr3{3QEre$|`=K2*r8h$#OsD@^U7f;(8#!mD-sVRm? zgl8C8&^Z`57J;&uVi{rmrm(Xm^@yNx{);<{?vrru)f}8JZ&kpvySq`w_M3U{7To(S zJxg_esy#u8qzrh`XEYEj2YFCDRvO9#_q70+qU5T*XHLa@2GkIz8q3u~6-((B#XWtU z@?*Avp=}1#%%=K$B~R{LV>P#`UAawx?4Q~vefJBjWd1W%6?Zk3>|w;NiIrd;0Qjx3 zSlR&j3g_$s6YlVyG5-1*XP!aoBVTd%U$lH4NsYRi^lLB}MhOi5eHss`^?&gPUt1;W z!A|6=0|pg+0k&Z^In|4=0F)N8)N$cnqB12@qxPkzzqgRvsszBesV@~2%&aV^9dgp(t&B;dlv z?QpoZv)0iZK26$DC-dipQ*skvp;YQf4J?Z_f`o3RhvN>4A~aWds`fS( z8s^vDa(&USsxU}ZdpgI)LcisDrI=hLfHYJ!lZ&0;jHBotxTU4FE6?8o@SwsTz;3~h zpU3xUh~LR$h{R)^cH`fOenAgYC%Fmg2#39vKo1FJ9bcJthGPQKf@(D9v@rv=iV2w$ zxeO3UL+3t`d+W6ZsbOF~34=B8h?oZ=^?)MYZnz*(Z8Thg={wF)@T50k?W>0ko(BIl z@+hNT}q%$s}V(A zWebi#XcIO!w9wp&wqR!wcow%$MPnLI*Gc_sbBmSd?@Od13D1z}e|>&Aj!Rm*0;958 z(YvQ>?Nm30v|{KZ`moul5?GMfj=XKQf=NNTdnk6XU=I7;OE+I33eq>4pVZ0gMP~Fv zjjeLF|9)yU=0URmT9ym&O#VH?61F-bv0J`Jlg|Ng%nS@7jAH+NQilu#TnU|0q~~C+ zI@hRLS!`Lx+X80*!^AkR>2kcxI|qnB1;Wwxa+=Du_wpXd=m6@VkCAobnmvfc~F zp-?H&TQ<~Kxq+$iuyk2_F7dp^<$4Br>XpY4e4OEY#REt6_LyK=s z^iyT5cxCHFc*X8lTtCWiBq_a2lq#&&pUj!H3wP@&QE^^)_3Bk|zK@T}=;)KtQL~4m zX4iAFEfJeNA^+uy_~=buw)vy%mTZ^nr6nrJy;U{}N8*6OzLSnrfK#EFGxzVA_oTS% zOlNwNGtfsS2uVeHFjUdR{ZxVgfgx3f2CUOp&1-ii5k~zkBFT77EFyNqW$r6ZXT=su zfC+4os>x(GzxRG-3W<=P8L%%4l&o~IMym0(KAJP^a*X-eg1K>KuvU3obynX-vu8rD z%G^&GAACgJA|A_~FS&4DLI7Rr?xO$r=DFm2CF|mi?;Yw_d=_N+YbcfI+JvJ#B_+{9 zo9f*S>*25?d&L=yp}+m3ZK$e!T5hGcwC}rP+TI}$(eN|(fS-bZ${>PKWJQ-x*d>S~ zB8Lbd`d|jV%W|$c`VUkx=C*sV+l*SvN~Bwk?VL&=%gD=*GBUsW{cr+X-x99j0lXM` z3v6KB1^z<>@}=1^U0Q<+9Y~?aaz+{h4B^LD1A`m>uCVZ=cw9=7)=IbSk2Zdm9ro@RBRZ9u_@*POYF{l< z@KcX3iK#TVr+I458Fk^>%>l|lYq%uNCBQK`F=>|n41)JR&-`;U^Ja9Ve=Oe=d{!qI z#6(*K{PfPZF#M!hv0R3nEEZTf6{(Dg|9~=;{s|bU?7sj{arRM9Ww6ZCF#Vy$2gS6X z(mp5^+a?V>IDqc(CVbQoX1C2S+LI~XDq(iA+S`MjmY26i5ttjJPri6ZcqU*HtLR(N z;=*1w_xpymD*5~#!uc~VOnO(@hB}rV4fccxQ@SX!Fv9i0mv${_vGfO0IK&s z%C~1;q_<1}EI^0+!8C}%u`6*UcDe4YJ?Gzn1*c>K9t+?|2f?v`{f{9n{KpDAu?!@_rlv zy)-Oso``TLcRibsWW`R2FXel?4uPkR&_gS1&!rT;+oIB^HFaX}75b#!BkYWQRi2sQ z>Y{(Za<#ncl3n`xQMpYd&11hy@vf`achC{AALGh7lc=`2c#brJe;p8c75qsj5nNa+*1wTqISOsdW+B3iFRZG z_=F1b&j`&|w2mPjN2;3xB>6_6ftp%XOwog;Uu{23j)fSE=3mL@l^b3$oM~8iDmGo> zKeP6wdNM;+w`OQ{oLQtn@}+!vNI@rpb^ILSh*Q<)X}f@=ZahM+Ohw6Z?>3(W=Ih(o zP|y$^x58fxG4JsrGnLBr6i+X)t}x&qfd8iu)N92w#d}l9SD16o4E}W1St{rfVsRbD z@W~5!bCVeG44#G8^Smy8{)K1NmWOy8?T?pRov|hG0PPGvwYcLT6PL=vq zWiS*z_XOXhJgm_!S!?)V?c2)-jl+kU$iMp@K6xAiuter-=F>gAY((2@n0WhV6O|@m zctU|ZHJy09*WtrjHAP5yw$`H(+FWDVR00h}4~b7t9fc-b{bgO*Hr+EqD3|d2f5tYm zQphc)17+u9Ns#kB6fpubk*dn&TJ$@>aC}akqbFs(>s^bvviQR;^PvBQukmj(ZkunY{Qb35~rLB0s)OYG*YjSK@wK!%Quf7qIjk|OS?)=iQKLVO~qaS zS9>37UFe(_x6dv&oEp6AX@5^u7o#-2t}df8(qK@fmVfqqwc(-SSg%9PyFO^TF#C|Z z%^EZM=Jj!|&yqvOQTQT_C8Wpswe9rxRRpgkqbiF|8eCPO2PYX{+ldwZ)B+TA=#Er) zqPiNOTlJee`I=JayULg5IEyz5tsqtU8&>@V*h|Z!^R2k&VNA^ZiLcGx}@>X`;H_neojqjFuzZDHKmCsR|A1p(=t41<<-QbWy

    4dI8* zX6AvZ1dtkWUGbsj4d+XBOy=ovDJVdd z>>OKiy?-?Y+IB$v(c4d^-ygFg3NARQ?~>Ni+V>z-__`}7-uPNa{s6c_axoE$OO93b z@GUely?S{_t^9n;1;jVbSjgzv*vP+5_?Yr{G!uau6XTMWzbzK2Yi+DNQmr&evn=7B z=?!Vt)F0_nyKHA%sfe@;r+$5whrC6qG#k_$`O+0V;}u`lHPMVo4UO;WE-YzwSpju` z8ne=4RXF`9z@qmkE8v8uavQwU+nO?cOf;B!-(; z@YL6aN>^5o3B)`(eP||)!+Hd@Gx#t{jY^gg-7bJ!?tZ7A%)r#@@RZ4FKqU(IEf3GUbRs7gBvJM&y_&m zw$yx`j>@f~sd`BqJg%QOSwEFU^#ZwJAONM6=`B&3sPnQSrB}nVl$pSn(@6 zo|?rpKpp)v8~zF?-(F<>44`*Ks>cN1dR*Jh^#nPnDP={FaGat(o;0Zxx&N&V>OOcWRK7}kt|35)9}Qx7i8NkEI=4QY-yf$eCi zqfPu?2E;{FJl`Y=H5}nO3CY|gb$IyNNRli?^nYg#eTfp5E!n#4vC>iLOHU5QJI|MMU4p$6~ zo~w?(3amh6AGp!Y$ybdZ+XP7eJcl&G5;v>7;|^ubu4iNed5b)u01QbP1_zMB3@6^v z@$LnmS+OwMp1&5$mlu5hUX6G?7|~m7|ql zLaWSK2UY!#(T0tASLReuDd;?>=wMBM-qx)P}BS!$*;=-S%~z?#eCn|D(O@jA|-f*UT`eG|^#{B8mk>PzWGMha(CY z7(i+uAQ_}d?+_r68CobohOV@X28^K!0@5RW=pCd93B4wv21w%Bo^{WARC91Kum%Pg65%U2C0#D;+{>0o|#` z*h@|m*Gmq7g%XK$a-IIfq5zw+nj^$(IL%J>@5jx2HV>Xqfqku2J44qZl6jq(xnl;`Cd#mctTQEZPqn^CA{tnpp&?!xs;utzx~=GJey9 zWLlO~>*Dh*=g3w~-G}WYSCbTjQ7>BUp0`EtpvUxJj&gko*ykAP|6SI;kGjpC8cJ+x zeH9k^*(-hpF18C)UnfXFKBNop*iU0%L2g@;2ws08jE#PVvbh^C=e6E=bFf~A#KR9C zyoF8@QAlSBRE*Ho@@K85dX=qQ4+Kl%eHUB=%{JKS+`G%9`dUjE3q@Wcbt;!F|ym6#`W%IS7HznK-5ju9X2v_;&VAj*yDEsFY*b1#uOA&{6E}MXWg{TF3#Kuhje$l=#M#)2OMy|05@At;o$* zBigvRK7h>(JQM1e6=1BhLyq5mwL>pBoBar?BndH2cFoO}QCwK*^KKX_pzMt*I0%F& z$09Br%;_T?g;W1tc=)%?b{;V?p!K7HFB3moAWL&-lme1f?{BbRw^@hPxe(UW{`a7G z40odfLT;2-8|e3H#_+8+%29IYK;NKSxnKgCFVlYsQ}7`J?II`~gU~2+&E+58i2Tu7 z|D|hi?C{ox|NS>3lB!bT#3C%3W~V_EVn(#t*Mrl>yL=_iV9JYD%ob?669Y+lva=zFP&-a}Y zD256>)hQxvB)q6e6xD*Kc`(&y3= zgY7|D5m#C*g5`GBdsVY7q$7Jb4tOp%v0<_a_@<}iL_(_Q%lF(Ns9mm5ON*chBk@K?R}f@WyhSXE6; zY%S%p#J1qzWD;!u{sB}isxe||x_b`xr3GyL{G|MJ8NB1s2&}C$-?{NDGy6!HaiN^R zCjAUemg}$uI#SRngS#TMncMJs3+4jpZrOMttKFSiN zb333-E|DuRfoxk_;mWzNt55Ge?^65>Y1;A|wZ2mdQB~7*Kjwm6e`AD_!#{R>xwsLU zx-g@vQN!5y@Nr@-ARzN;PN3^+=cB0NhP^08LMtQyG6wN38p}uzl+K7=8d~E6Z*E;p zey|j$<@fm16jKX=Gfo2!7VG8f{X3IzVM7naqRO;|P1j0(W=47KxHmZOhF~g9{i{>pS%21Kd?z$4K(}?-ZL%6 zt$MCgcRbC_9Xr$vYXEa91w(IIZX5s=&5nn*-!}*XGK!MmP^2;kItT;Mpegc+%LlGK zDEcRsl#XQ}Kd{v3-jWAPDkGb=-z^^q^8nh56hra^VSi;k!i{%5KU<-i8h&9`5NG9nX*;05>_edNdmi0u>i~ULR)bEs_;m%jJUu z-a%j6dHYvGE=1$g9c8h%rcgWRTepQ$WZ@wN7O})7q7~aS06t26vQ*>XcHTiZ0Xl*Q ztR~+YA8uVHx?y9Vvh zq!K|hz>+P@O=qKoy#FXbbEdR3L-~F{u+DADUcAt9iI*}HsT`1mU8UH^xc?OEGo*jT zd24G~cIM+Fuw?J_u>Lg_~`c7ApJ6-c_LY%d>nF0RyQ9k3$G z+cigDxnP20<2OM+PS!AJ{*LlNRgLS?=_u7Zf{|tta!)#va}-PBBqr1ZtJImEP=m+cOO6^l>{acDr}S+EEzPExU11e7w!hySg?hAJy{k1z0y9 zFn$ATO2`lzLXDlYTt=i*B}m@#&I7lL#N1=-7fD`H0Wc$nf!~`p35PI3Q z@;jN;!DT)P->RQiM4Zq^73!L_ke)0`ci1kh+9~DJQ`&+SXehM~M|WMh0)ub7{1&nK z;Vn2W+2jgnj@3x(2s%Sv`B|)Sz`{YJZt0L=_TMX~@ylTRSHGR?5J{4Gl9zn_8XGo1 zyJIw%sl@QXx67JmUz2ahOM#G`{D%vUH{>QKDpxj`d!>hn36TtlEFSD3mS$*{?0hk- z&Z7Ji%Te8~nV=u(@P)w{R{b#p!?dqU=%tj!3)f|ff zwINVqgtsFeF=B7+CPos@ROH;7hinWw%UZ44oOyaQIZQg)Yz3a76Db6%F{!zsN)U(D z&vxk=(YaS^hAS9SC+cAAu9NQBf{@7dLtJ}57RF7(oA9;!h z#ZFs8c|I4OZtFn8eBr7&+*&I?RLFX~elq$=SMOKlnk$=3C+a~|b_lUio~YQ3lBof# zg!R~;55=`F1VvsEI4^zHJc<5coDWjEXfdlB#e zM*8)H{RC?@1L&L3QUS4AcTuHKO#^V>-Ojo2Q~OO#{Qcj0Z)VcBSD86{jJl!DQpu2y z%jEzQf0wS&rxLv1B8$C1kOb5&Sj`yD`DDSK87o$?pU8<}Jh)e<72BTxOaeM#&ch`w zjZiwibNutgvd;BfCGug|MUB%VT#?zpX2s$khTIPWf!znQL&iSuW&2Ekpb$?d^zR&R zY4-3l)V7hA_~^MGy6+*z_3l^JPU&p#y!BaqJAxeFqlMYAvmh}{!uI^fSB82b#SR7J znUb7hWc4ZbPF8`(VP--p%oSFV?O?9G`E1iWX;TMgGvso5)gdA}#iJWpe|T~~k5P+s zAb%ihGRJ7^R733n|E$-JfbL?*i&zANs?lbA_iax^OYRo~TFWt>_q8o1w~ky@+!gfS zT|Y3ct9lz}IlN2YQN2v%X}je#TCISRflo_{-?j7Yv5K~8sj+v=?^bP5?NAm76P{G; zG|Jz^!OjBSFCztGsaHT3lu2%hC~@B<_?lmVe6Jp-?jE%|Ua{?1NL0#Y2<>nqL^nY@ zN3na-H1%@+Z5kPv<*~>n6ZKonnRlymy&C!rG{a-%mC3X!TpmIq(WHtnR_{<~p_`!$ ziBp$aJ96!QYoFPZhl?v|HGTL8|5&|xs-f2Ms$n6iaI)JZ&5Be?i zL!7E!hehopTuDEA{;vCM-}kov@Mg47Gp=X4g27pInui1eBHt>!5-pJ-CnZo zE%MCZc`3y%~eoX^3Xi#ZIW{qD!iDcNUL!K|+|z=;}}o zs2kRrvKAyZozkfRWkzqWR6XK*xq`U--<$ORd?omgrn`Tp4}9@y{8wfIzldya?LtEH zT_zzhatZfL2356w>T()T1rr%orWA7QuE4X$U_W8r6-Z`ajGy>*<3VfnBs}!OGn)re zs#8JsQE3lMilbZS%D(ZU6`j5#p*Vd)fjhcm@xuxZ-f=O*&KdIF&Q1X8H+GX7Hqmz` zTS@Gc0iQwM>Ie>+y=GDferHfD-j@b-FH|rnR?^N_a2#Gpu1zsGc*4-6i30^=4lqSx z=-)i;*N>kM&1fT>hSuvbVyVkbwSkEqSKh|7zw9ueIz|M}A$>>OGSo$Xyw#!l$a3tFQB8H{K$B6| z$~N8vB_`*~{A1Jj%BtClr=@AQifKe6bAT?9(m zu8*J}>=NgNH&8EKtc=g4Jfx{m13W8xugom}><5YgEX6)zT)(k%y($)4Vx!rId!iLU z2dNx!I+$HRfJin{5gu4mcwuyC&JFGEiP!V8Tw%^JcyXMllw0kYgcNJ~_QDZeEZ+Yy zscb?-BsV$tq(H&U?8M{O#!&Zsu!4Wc4U8oX#yl;@Nc4YFKg*A}%*dyoyzH-SPALti z2l9Gw1Ojz7$3c7MUT4htYqAqlKi^5V6F4N?=~0ioblr9do9?agg_DB*jH6|V?zjVJ zla7*JzCPZ%vmmCtn_Nh$T)AL?(+P`*ZTI;90P zc#RzdbWsn28~j_QU{-!ZKeqtgr*i}h#bD~eM6v&DqF|YsSa&%iNBzcoJszEr-4MA; z5#A3~-u&$HF=Jr3gQHgyZo}20&D<&MsF#s%B!93g(9^T&hR|O>r(v3tXf8{)Z7glX z5e+L^k30!81sMtOLgr~e09&q7n1Z77F!JhsYpjd<^XSSH)l=TvvBT}TO2hJU-0i9j z>Ja|!8)BThhk*lutq4QeUO3@d>=YqvG;%@&TpHM*6V`ZcivWL9Qm%;c0uHN${lP zaPtuUtGr~_gYma@X!~iqLkzW)$pJvSY$s{+++$e<2zUxH1LZLW_fS=#2)76#TU0{o zl=h>m8mQ+M$I+?*)|cVw2U=7ZO3KV3Y1pk<;4))9N*&E)r=VZNv{3AQ=?Eb)u0Vk$ zGg`D?q2_*}4y$IaVe)p3yu!T;X^wJPap;=4WdVeZ9qHtG$D0%V@^EEY)U8zqzboPB zDQ^#hiu{;%od??;6OY9e@!&@1ZC&9k2!xOCC>K|}#;1^(`>wcKXmY8p5H{<2>B_iM z%(=MGz*cBO+kQ=n^?jVZ$=boeur{X7@=J;0F!HJPG_E^eCn#GWE^)|4bFxNZb=bde z()P^sem^H&u`>7OVRqUgmng@X)P_}Ya1{cvW{|gR41DszzNUC%U%WY%Y+MXB$TyS< z((Sag6p3;E@z3%5e;fDzHRpZtSFC7$v3mR|OJ)*EX2+iehafTQn@4B*$e+oZ;oW;c zjD(H70PK$mr2}l8%PIY^uxS9hPx%bWw}cV{58N4kU+0hyX30D>&voW$f)CFQGZ?^6 zp3NEm`XYasO#gNc{_i>OZ^-@qdoK7dyg}CAZXf?0jD7fTColhak@g?EXVy<6zvHow z{*K2!_B$T?|B$TzpPui(b}jply=?#Fg;;-E&h?-C=YRj{{~zD~QJn5y^GsMjP5cq{ C2fk|n diff --git a/static/img/191115-python-basic-data-types-booleans/header.jpg b/static/img/191115-python-basic-data-types-booleans/header.jpg index f7d4ada941d68d38d89029c876225e5b272c9ced..0a53816e1a4c4f378826a2869dc1f18d7adfb0ef 100644 GIT binary patch literal 58041 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 literal 250662 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 Oefn8H{Wgt8@h<^eRMpC(@gU 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%0AQi?@YQ@ivW3n$4qa( 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 M#{c)ff!|I2KdKdK3;+NC literal 51348 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 diff --git a/static/img/headers/django-materialize.jpg b/static/img/headers/django-materialize.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c96ce07406d9e91ae1c2da2d77b8b7fd80106844 GIT binary patch literal 23240 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≪P-|B@`psJE(CuI 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 OE8@y12Fj`WZQ!4VZGQRy literal 0 HcmV?d00001 From 17198468ffe6cfff508be5e2ecedab8e49a15552 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 21 Jul 2020 09:30:26 -0400 Subject: [PATCH 101/207] new flask examples --- .../flask/flask-app-badrequest.markdown | 2 +- .../examples/flask/flask-app-flask.markdown | 92 +++++++++-- .../examples/flask/flask-app-headers.markdown | 2 +- .../flask/flask-app-immutabledict.markdown | 2 +- .../flask/flask-blueprints-blueprint.markdown | 44 ++++-- .../flask-example-projects-code.markdown | 10 ++ .../examples/flask/flask-globals-g.markdown | 97 +++++++++++- .../flask/flask-globals-request.markdown | 119 ++++++++++++--- .../flask/flask-helpers-flash.markdown | 90 ++++++++++- .../flask/flask-helpers-url-for.markdown | 49 ++++-- .../flask-sessions-badsignature.markdown | 102 ++++++++++++- .../flask-templating-render-template.markdown | 143 +++++++++++++++--- .../flask-views-http-method-funcs.markdown | 2 +- .../flask/flask-views-methodview.markdown | 2 +- .../django-admin-login-material.jpg | Bin 0 -> 103718 bytes ...materialize-css-django-material-admin.html | 6 + 16 files changed, 671 insertions(+), 91 deletions(-) create mode 100644 static/img/200721-django-material-admin/django-admin-login-material.jpg create mode 100644 theme/templates/blog/materialize-css-django-material-admin.html diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 8eab8d041..3cd6aa5f3 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -16,7 +16,7 @@ at runtime when an that accepts POSTs. -These topics are also useful while reading the `BadRequest` examples: +These subjects go along with the `BadRequest` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 599b6e5d0..2f9c9f4cb 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -316,7 +316,69 @@ def create_app(config): ``` -## Example 5 from flask-bookshelf +## Example 5 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): +~~ app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): + return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): + g.request_start_time = time.time() + g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) + g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): + return render_template('index.html') + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -368,7 +430,7 @@ def get_lang_code(endpoint, values): ``` -## Example 6 from flaskex +## Example 7 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -421,7 +483,7 @@ def logout(): ``` -## Example 7 from Flask-HTTPAuth +## Example 8 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -477,7 +539,7 @@ class HTTPAuthTestCase(unittest.TestCase): ``` -## Example 8 from flask-phone-input +## Example 9 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -529,7 +591,7 @@ def index(): ``` -## Example 9 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -578,7 +640,7 @@ from app.models import User ``` -## Example 10 from Flask-SocketIO +## Example 11 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -689,7 +751,7 @@ if __name__ == '__main__': ``` -## Example 11 from Flask-User +## Example 12 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -772,7 +834,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 12 from Flask-VueJs-Template +## Example 13 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -813,7 +875,7 @@ def index_client(): ``` -## Example 13 from Flasky +## Example 14 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -877,7 +939,7 @@ def create_app(config_name): ``` -## Example 14 from Datadog Flask Example App +## Example 15 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -938,7 +1000,7 @@ def before_request(): ``` -## Example 15 from keras-flask-deploy-webapp +## Example 16 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1002,7 +1064,7 @@ def model_predict(img, model): ``` -## Example 16 from sandman2 +## Example 17 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1083,7 +1145,7 @@ def get_app( ``` -## Example 17 from Science Flask +## Example 18 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1152,7 +1214,7 @@ def create_celery_app(): ``` -## Example 18 from tedivms-flask +## Example 19 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1281,7 +1343,7 @@ def create_app(extra_config_settings={}): ``` -## Example 19 from trape +## Example 20 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index ca2b56bbb..db6a82c4e 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -18,7 +18,7 @@ from [requests](/flask-globals-request-examples.html) and responses for Flask web applications. -These topics are also useful while reading the `Headers` examples: +You should read up on these subjects along with these `Headers` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index bebe63460..29ee3cd16 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -16,7 +16,7 @@ The `ImmutableDict` class wraps a so that values cannot be modified after initially being set. -These subjects go along with the `ImmutableDict` code examples: +You should read up on these subjects along with these `ImmutableDict` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index daec67197..875a45214 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -272,7 +272,33 @@ def about(): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / auth / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/auth/__init__.py) + +```python +# __init__.py +~~from flask import Blueprint + +~~auth = Blueprint('auth', __name__, template_folder='templates') + +from . import views + + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -323,7 +349,7 @@ def create_author(): ``` -## Example 5 from Flask-Bootstrap +## Example 6 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -427,7 +453,7 @@ class Bootstrap(object): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -497,7 +523,7 @@ class DebugToolbarExtension(object): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -549,7 +575,7 @@ def swagger_static(filename): ``` -## Example 8 from Flask-WTF +## Example 9 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -657,7 +683,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 9 from Flask-User +## Example 10 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -764,7 +790,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 10 from Flask-VueJs-Template +## Example 11 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -796,7 +822,7 @@ import os ``` -## Example 11 from Datadog Flask Example App +## Example 12 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -843,7 +869,7 @@ def bp_after_request(response): ``` -## Example 12 from tedivms-flask +## Example 13 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index b657bf175..05d240c49 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -50,6 +50,16 @@ FlaskBB is provided as open source [under this license](https://github.com/flaskbb/flaskbb/blob/master/LICENSE). +### flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + + ### Flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 0824e343f..0d5cd4002 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -219,7 +219,88 @@ from .views import ( ``` -## Example 2 from flask-bookshelf +## Example 2 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): + app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): + return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): +~~ g.request_start_time = time.time() +~~ g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) +~~ g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): + return render_template('index.html') + + return app + + +def register_commands(app): + for command in [create_db, drop_db, populate_db, recreate_db]: + app.cli.command()(command) + + +def register_extensions(app): + travis.init_app(app) + db.init_app(app) + lm.init_app(app) + mail.init_app(app) + bcrypt.init_app(app) + assets.init_app(app) + babel.init_app(app) + rq.init_app(app) + migrate.init_app(app, db) + limiter.init_app(app) + + +## ... source file continues with no further g examples... + +``` + + +## Example 3 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -329,7 +410,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 3 from flask-debugtoolbar +## Example 4 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -435,7 +516,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 4 from Flask-HTTPAuth +## Example 5 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -591,7 +672,7 @@ class HTTPBasicAuth(HTTPAuth): ``` -## Example 5 from Flask-WTF +## Example 6 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -792,7 +873,7 @@ class CSRFProtect(object): ``` -## Example 6 from Flask-Security-Too +## Example 7 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -912,7 +993,7 @@ def check_and_update_authn_fresh(within, grace, method=None): ``` -## Example 7 from Flask-User +## Example 8 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1009,7 +1090,7 @@ def allow_unconfirmed_email(view_function): ``` -## Example 8 from indico +## Example 9 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1118,7 +1199,7 @@ config = IndicoConfig() ``` -## Example 9 from tedivms-flask +## Example 10 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index b3205cf6e..0fb1acf7e 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -812,7 +812,88 @@ class DeleteReport(MethodView): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): + app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): +~~ return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): + g.request_start_time = time.time() + g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) +~~ g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): + return render_template('index.html') + + return app + + +def register_commands(app): + for command in [create_db, drop_db, populate_db, recreate_db]: + app.cli.command()(command) + + +def register_extensions(app): + travis.init_app(app) + db.init_app(app) + lm.init_app(app) + mail.init_app(app) + bcrypt.init_app(app) + assets.init_app(app) + babel.init_app(app) + rq.init_app(app) + migrate.init_app(app, db) + limiter.init_app(app) + + +## ... source file continues with no further request examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -871,7 +952,7 @@ def create_author(): ``` -## Example 5 from flask-debugtoolbar +## Example 6 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -1018,7 +1099,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 6 from flaskex +## Example 7 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -1113,7 +1194,7 @@ if __name__ == "__main__": ``` -## Example 7 from Flask-HTTPAuth +## Example 8 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -1434,7 +1515,7 @@ class MultiAuth(object): ``` -## Example 8 from flask-login +## Example 9 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1671,7 +1752,7 @@ def _secret_key(key=None): ``` -## Example 9 from flask-restx +## Example 10 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1779,7 +1860,7 @@ class marshal_with_field(object): ``` -## Example 10 from Flask-WTF +## Example 11 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1937,7 +2018,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 11 from flaskSaaS +## Example 12 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1988,7 +2069,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 12 from Flask-Security-Too +## Example 13 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2208,7 +2289,7 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 13 from Flask-SocketIO +## Example 14 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -2432,7 +2513,7 @@ class TestSocketIO(unittest.TestCase): ``` -## Example 14 from Flask-User +## Example 15 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2496,7 +2577,7 @@ def init_translations(babel): ``` -## Example 15 from Flask-VueJs-Template +## Example 16 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2531,7 +2612,7 @@ def require_auth(func): ``` -## Example 16 from indico +## Example 17 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2620,7 +2701,7 @@ multipass = IndicoMultipass() ``` -## Example 17 from keras-flask-deploy-webapp +## Example 18 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -2713,7 +2794,7 @@ if __name__ == '__main__': ``` -## Example 18 from newspie +## Example 19 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2894,7 +2975,7 @@ if __name__ == '__main__': ``` -## Example 19 from sandman2 +## Example 20 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -3095,7 +3176,7 @@ class Service(MethodView): ``` -## Example 20 from Science Flask +## Example 21 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -3202,7 +3283,7 @@ def security_context_processor(): ``` -## Example 21 from tedivms-flask +## Example 22 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -3260,7 +3341,7 @@ def roles_accepted_api(*role_names): ``` -## Example 22 from trape +## Example 23 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index a53c58adb..e8a047b3b 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -385,7 +385,83 @@ def flaskbb_registration_post_processor(user): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / user / views.py**](https://github.com/cburmeister/flask-bones/blob/master/app/user/views.py) + +```python +# views.py +~~from flask import request, redirect, url_for, render_template, flash, g +from flask_babel import gettext +from flask_login import login_required +from app.user.models import User +from .forms import EditUserForm + +from ..user import user + + +@user.route('/list', methods=['GET', 'POST']) +@login_required +def list(): + + from app.database import DataTable + datatable = DataTable( + model=User, + columns=[User.remote_addr], + sortable=[User.username, User.email, User.created_ts], + searchable=[User.username, User.email], + filterable=[User.active], + limits=[25, 50, 100], + request=request + ) + + if g.pjax: + return render_template('users.html', datatable=datatable) + + return render_template('list.html', datatable=datatable) + + +@user.route('/edit/', methods=['GET', 'POST']) +@login_required +def edit(id): + user = User.query.filter_by(id=id).first_or_404() + form = EditUserForm(obj=user) + if form.validate_on_submit(): + form.populate_obj(user) + user.update() +~~ flash( + gettext('User {username} edited'.format(username=user.username)), + 'success' + ) + return render_template('edit.html', form=form, user=user) + + +@user.route('/delete/', methods=['GET']) +@login_required +def delete(id): + user = User.query.filter_by(id=id).first_or_404() + user.delete() +~~ flash( + gettext('User {username} deleted').format(username=user.username), + 'success' + ) + return redirect(url_for('.list')) + + + +## ... source file continues with no further flash examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -444,7 +520,7 @@ def create_author(): ``` -## Example 5 from flask_jsondash +## Example 6 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -675,7 +751,7 @@ def clone(c_id): ``` -## Example 6 from flask-login +## Example 7 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -836,7 +912,7 @@ class LoginManager(object): ``` -## Example 7 from Flask-Security-Too +## Example 8 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -956,7 +1032,7 @@ def transform_url(url, qparams=None, **kwargs): ``` -## Example 8 from Flask-User +## Example 9 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1429,7 +1505,7 @@ class UserManager__Views(object): ``` -## Example 9 from indico +## Example 10 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1515,7 +1591,7 @@ class ImportRoleMembersMixin(object): ``` -## Example 10 from tedivms-flask +## Example 11 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index fbb2b5c31..21472d8dc 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -233,7 +233,38 @@ class CustomSelectField(Field): ``` -## Example 4 from Flask-Bootstrap +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / utils.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./utils.py) + +```python +# utils.py +~~from flask import request, url_for + + +def url_for_other_page(**kwargs): + url_for_args = request.args.copy() + if 'pjax' in url_for_args: + url_for_args.pop('_pjax') + for key, value in kwargs.items(): + url_for_args[key] = value +~~ return url_for(request.endpoint, **url_for_args) + + + +## ... source file continues with no further url_for examples... + +``` + + +## Example 5 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -323,7 +354,7 @@ class ConditionalCDN(object): ``` -## Example 5 from flask-debugtoolbar +## Example 6 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -390,7 +421,7 @@ class DebugToolbar(object): ``` -## Example 6 from flask-login +## Example 7 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -490,7 +521,7 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): ``` -## Example 7 from flask-restx +## Example 8 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -545,7 +576,7 @@ def ui_for(api): ``` -## Example 8 from flaskSaaS +## Example 9 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -686,7 +717,7 @@ def reset(token): ``` -## Example 9 from Flask-Security-Too +## Example 10 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -806,7 +837,7 @@ def get_post_action_redirect(config_key, declared=None): ``` -## Example 10 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -955,7 +986,7 @@ class EmailManager(object): ``` -## Example 11 from Flasky +## Example 12 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1155,7 +1186,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 12 from Datadog Flask Example App +## Example 13 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 2ddacd7f9..7e01300e1 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -215,7 +215,107 @@ class Role(db.Model): ``` -## Example 3 from Flask-Security-Too +## Example 3 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / auth / views.py**](https://github.com/cburmeister/flask-bones/blob/master/app/auth/views.py) + +```python +# views.py +from flask import ( + current_app, request, redirect, url_for, render_template, flash, abort, +) +from flask_babel import gettext +from flask_login import login_user, login_required, logout_user +~~from itsdangerous import URLSafeSerializer, BadSignature +from app.extensions import lm +from app.jobs import send_registration_email +from app.user.models import User +from app.user.forms import RegisterUserForm +from .forms import LoginForm +from ..auth import auth + + +@lm.user_loader +def load_user(id): + return User.get_by_id(int(id)) + + +@auth.route('/login', methods=['GET', 'POST']) +def login(): + form = LoginForm() + if form.validate_on_submit(): + login_user(form.user) + flash( + gettext( + 'You were logged in as {username}'.format( + username=form.user.username + ), + ), + + +## ... source file abbreviated to get to BadSignature examples ... + + + remote_addr=request.remote_addr, + ) + + s = URLSafeSerializer(current_app.secret_key) + token = s.dumps(user.id) + + send_registration_email.queue(user.id, token) + + flash( + gettext( + 'Sent verification email to {email}'.format( + email=user.email + ) + ), + 'success' + ) + return redirect(url_for('index')) + return render_template('register.html', form=form) + + +@auth.route('/verify/', methods=['GET']) +def verify(token): + s = URLSafeSerializer(current_app.secret_key) + try: + id = s.loads(token) +~~ except BadSignature: + abort(404) + + user = User.query.filter_by(id=id).first_or_404() + if user.active: + abort(404) + else: + user.active = True + user.update() + + flash( + gettext( + 'Registered user {username}. Please login to continue.'.format( + username=user.username + ), + ), + 'success' + ) + return redirect(url_for('auth.login')) + + + +## ... source file continues with no further BadSignature examples... + +``` + + +## Example 4 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 113b4ddd4..017dd6631 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -19,7 +19,7 @@ imported, but there are less characters to type when you leave off the `.templating` part. -These topics are also useful while reading the `render_template` examples: +These subjects go along with the `render_template` code examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -243,7 +243,114 @@ def send_email(recipient, subject, template, **kwargs): ``` -## Example 4 from flask-bookshelf +## Example 4 from flask-bones +[flask-bones](https://github.com/cburmeister/flask-bones) +([demo](http://flask-bones.herokuapp.com/)) +is large scale [Flask](/flask.html) example application built +with [Blueprints](https://flask.palletsprojects.com/en/1.1.x/blueprints/) +([example Blueprint code](/flask-blueprints-blueprint-examples.html)). +This project is provided as open source under the +[MIT license](https://github.com/cburmeister/flask-bones/blob/master/LICENSE). + +[**flask-bones / app / __init__.py**](https://github.com/cburmeister/flask-bones/blob/master/app/./__init__.py) + +```python +# __init__.py +import time + +~~from flask import Flask, g, render_template, request +import arrow +import requests + +from app import config +from app.assets import assets +from app.auth import auth +from app.commands import create_db, drop_db, populate_db, recreate_db +from app.database import db +from app.extensions import lm, travis, mail, migrate, bcrypt, babel, rq, limiter +from app.user import user +from app.utils import url_for_other_page + + +def create_app(config=config.base_config): + app = Flask(__name__) + app.config.from_object(config) + + register_extensions(app) + register_blueprints(app) + register_errorhandlers(app) + register_jinja_env(app) + register_commands(app) + + def get_locale(): + return request.accept_languages.best_match(config.SUPPORTED_LOCALES) + + if babel.locale_selector_func is None: + babel.locale_selector_func = get_locale + + @app.before_request + def before_request(): + g.request_start_time = time.time() + g.request_time = lambda: '%.5fs' % (time.time() - g.request_start_time) + g.pjax = 'X-PJAX' in request.headers + + @app.route('/', methods=['GET']) + def index(): +~~ return render_template('index.html') + + return app + + +def register_commands(app): + for command in [create_db, drop_db, populate_db, recreate_db]: + app.cli.command()(command) + + +def register_extensions(app): + travis.init_app(app) + db.init_app(app) + lm.init_app(app) + mail.init_app(app) + bcrypt.init_app(app) + assets.init_app(app) + babel.init_app(app) + rq.init_app(app) + migrate.init_app(app, db) + limiter.init_app(app) + + +def register_blueprints(app): + app.register_blueprint(user, url_prefix='/user') + app.register_blueprint(auth) + + +def register_errorhandlers(app): + + def render_error(e): +~~ return render_template('errors/%s.html' % e.code), e.code + + for e in [ + requests.codes.INTERNAL_SERVER_ERROR, + requests.codes.NOT_FOUND, + requests.codes.UNAUTHORIZED, + ]: + app.errorhandler(e)(render_error) + + +def register_jinja_env(app): + app.jinja_env.globals.update({ + 'timeago': lambda x: arrow.get(x).humanize(), + 'url_for_other_page': url_for_other_page, + }) + + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -347,7 +454,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 5 from flaskex +## Example 6 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -442,7 +549,7 @@ if __name__ == "__main__": ``` -## Example 6 from flask_jsondash +## Example 7 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -585,7 +692,7 @@ def update(c_id): ``` -## Example 7 from flask-phone-input +## Example 8 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -643,7 +750,7 @@ def show_phone(): ``` -## Example 8 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -698,7 +805,7 @@ def ui_for(api): ``` -## Example 9 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -901,7 +1008,7 @@ def paySuccess(): ``` -## Example 10 from Flask-Security-Too +## Example 11 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -1011,7 +1118,7 @@ from .forms import ( ``` -## Example 11 from Flask-SocketIO +## Example 12 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -1087,7 +1194,7 @@ def get_session(): ``` -## Example 12 from Flask-User +## Example 13 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1179,7 +1286,7 @@ class EmailManager(object): ``` -## Example 13 from Flasky +## Example 14 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1219,7 +1326,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 14 from Datadog Flask Example App +## Example 15 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1321,7 +1428,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 15 from indico +## Example 16 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1351,7 +1458,7 @@ class MathjaxMixin(object): ``` -## Example 16 from keras-flask-deploy-webapp +## Example 17 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1442,7 +1549,7 @@ if __name__ == '__main__': ``` -## Example 17 from newspie +## Example 18 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1597,7 +1704,7 @@ if __name__ == '__main__': ``` -## Example 18 from Science Flask +## Example 19 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1885,7 +1992,7 @@ def static_from_root(): ``` -## Example 19 from tedivms-flask +## Example 20 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1988,7 +2095,7 @@ def init_error_handlers(app): ``` -## Example 20 from trape +## Example 21 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 882f5e562..0a67d4938 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -15,7 +15,7 @@ which is useful for checking if an HTTP method is valid by comparing it against the items in this set. -These topics are also useful while reading the `http_method_funcs` examples: +These subjects go along with the `http_method_funcs` code examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 3bf523565..6e94fffc5 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -15,7 +15,7 @@ that determines the methods, such as GET, POST, PUT, etc, that a view defines. -These topics are also useful while reading the `MethodView` examples: +You should read up on these subjects along with these `MethodView` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/static/img/200721-django-material-admin/django-admin-login-material.jpg b/static/img/200721-django-material-admin/django-admin-login-material.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca68484b4f44038c6fca754366ce427022cd49c5 GIT binary patch literal 103718 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 Programming +Web development +Django +Web design +CSS \ No newline at end of file From f3536d2efa6061da6317ef53c51f6e23ab97b226 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 24 Jul 2020 07:01:48 -0400 Subject: [PATCH 102/207] adding new sqlalchemy examples --- .../django-extensions-plug-ins.markdown | 4 +- .../flask-example-projects-code.markdown | 10 ++ .../sqlalchemy-engine-engine.markdown | 115 +++++++++++- .../sqlalchemy-engine-url-make-url.markdown | 114 +++++++++++- .../sqlalchemy-example-projects-code.markdown | 10 ++ .../sqlalchemy-exc-integrityerror.markdown | 116 +++++++++++- .../sqlalchemy-extensions-plug-ins.markdown | 13 ++ ...-attributes-instrumentedattribute.markdown | 52 ++++++ ...emy-orm-properties-columnproperty.markdown | 165 ++++++++++++++++++ .../sqlalchemy-orm-util-identity-key.markdown | 120 +++++++++++++ .../sqlalchemy-pool-nullpool.markdown | 2 +- .../sqlalchemy-pool-staticpool.markdown | 2 +- ...sqlalchemy-schema-checkconstraint.markdown | 2 +- .../sqlalchemy-schema-column.markdown | 2 +- .../sqlalchemy-schema-createindex.markdown | 2 +- .../sqlalchemy-schema-createtable.markdown | 2 +- .../sqlalchemy-schema-ddlelement.markdown | 2 +- .../sqlalchemy-schema-foreignkey.markdown | 2 +- ...chemy-schema-foreignkeyconstraint.markdown | 2 +- ...chemy-schema-primarykeyconstraint.markdown | 2 +- .../sqlalchemy-schema-table.markdown | 2 +- .../sqlalchemy-sql-clauseelement.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-column.markdown | 2 +- ...lchemy-sql-elements-columnelement.markdown | 2 +- .../sqlalchemy-sql-elements-label.markdown | 2 +- ...hemy-sql-expression-clauseelement.markdown | 2 +- ...chemy-sql-expression-columnclause.markdown | 2 +- ...hemy-sql-expression-columnelement.markdown | 2 +- ...alchemy-sql-expression-executable.markdown | 2 +- ...my-sql-expression-functionelement.markdown | 2 +- ...my-sql-expression-unaryexpression.markdown | 2 +- .../sqlalchemy-sql-expression.markdown | 2 +- .../sqlalchemy-sql-extract.markdown | 2 +- ...emy-sql-functions-functionelement.markdown | 2 +- ...emy-sql-functions-genericfunction.markdown | 2 +- .../sqlalchemy-sql-functions.markdown | 2 +- .../sqlalchemy-sql-naming-conv.markdown | 2 +- .../sqlalchemy-sql-operators.markdown | 2 +- .../sqlalchemy-sql-schema-column.markdown | 2 +- .../sqlalchemy-sql-schema-schemaitem.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-schema.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-select.markdown | 2 +- .../sqlalchemy-sql-sqltypes-nulltype.markdown | 2 +- .../sqlalchemy-sql-sqltypes.markdown | 2 +- .../sqlalchemy/sqlalchemy-sql-table.markdown | 2 +- ...sqlalchemy-sql-util-clauseadapter.markdown | 2 +- .../sqlalchemy-sql-visitors-traverse.markdown | 2 +- .../sqlalchemy-types-boolean.markdown | 2 +- .../sqlalchemy/sqlalchemy-types-enum.markdown | 2 +- .../sqlalchemy-types-integer.markdown | 2 +- .../sqlalchemy-types-nulltype.markdown | 2 +- .../sqlalchemy-types-string.markdown | 2 +- .../sqlalchemy-types-to-instance.markdown | 2 +- .../sqlalchemy-types-typeengine.markdown | 2 +- .../sqlalchemy-types-userdefinedtype.markdown | 2 +- ...qlalchemy-util-langhelpers-symbol.markdown | 2 +- .../sqlalchemy-util-ordereddict.markdown | 2 +- .../sqlalchemy-util-orderedset.markdown | 2 +- ...qlalchemy-util-set-creation-order.markdown | 2 +- .../sqlalchemy-util-topological.markdown | 2 +- theme/templates/code-examples/sqlalchemy.html | 3 +- 61 files changed, 764 insertions(+), 58 deletions(-) create mode 100644 content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown diff --git a/content/pages/examples/django/django-extensions-plug-ins.markdown b/content/pages/examples/django/django-extensions-plug-ins.markdown index da2f727e7..626e23cc5 100644 --- a/content/pages/examples/django/django-extensions-plug-ins.markdown +++ b/content/pages/examples/django/django-extensions-plug-ins.markdown @@ -80,14 +80,14 @@ Code from django-angular is shown on: [django-axes](https://github.com/jazzband/django-axes/) ([project documentation](https://django-axes.readthedocs.io/en/latest/) and -[PyPI package information](https://pypi.org/project/django-axes/) +[PyPI package information](https://pypi.org/project/django-axes/)) is a code library for [Django](/django.html) projects to track failed login attempts against a web application. The goal of the project is to make it easier for you to stop people and scripts from hacking your Django-powered website. The code for django-axes is -[open source under the MIT liense](https://github.com/jazzband/django-axes/blob/master/LICENSE) +[open source under the MIT license](https://github.com/jazzband/django-axes/blob/master/LICENSE) and maintained by the group of developers known as [Jazzband](https://jazzband.co/). diff --git a/content/pages/examples/flask/flask-example-projects-code.markdown b/content/pages/examples/flask/flask-example-projects-code.markdown index 05d240c49..438fc76c6 100644 --- a/content/pages/examples/flask/flask-example-projects-code.markdown +++ b/content/pages/examples/flask/flask-example-projects-code.markdown @@ -22,6 +22,16 @@ The code is open sourced under the [MIT license](https://github.com/braintree/braintree_flask_example/blob/master/LICENSE). +### CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + + ### Datadog Flask example The [Datadog Flask app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown index d00076add..8c58d9f87 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-engine.markdown @@ -10,7 +10,120 @@ meta: Example code for understanding how to use the Engine class from the sqlalc Engine is a class within the sqlalchemy.engine module of the SQLAlchemy project. -## Example 1 from GINO +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / __init__.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/__init__.py) + +```python +# __init__.py +import datetime +import os +import sys +import weakref +from distutils.version import StrictVersion + +import jinja2 +from flask import Flask, Request +from flask_migrate import upgrade +from jinja2 import FileSystemLoader +from jinja2.sandbox import SandboxedEnvironment +from werkzeug.middleware.proxy_fix import ProxyFix +from werkzeug.utils import cached_property + +from CTFd import utils +from CTFd.plugins import init_plugins +from CTFd.utils.crypto import sha256 +from CTFd.utils.initialization import ( + init_events, + init_logs, + init_request_processors, + init_template_filters, + init_template_globals, +) +from CTFd.utils.migrations import create_database, migrations, stamp_latest_revision +from CTFd.utils.sessions import CachingSessionInterface +from CTFd.utils.updates import update_check + +__version__ = "3.0.0b2" + + +class CTFdRequest(Request): + @cached_property + def path(self): + return self.script_root + super(CTFdRequest, self).path + + +## ... source file abbreviated to get to Engine examples ... + + + } + ) + app.jinja_loader = jinja2.ChoiceLoader([app.theme_loader, app.plugin_loader]) + + from CTFd.models import ( # noqa: F401 + db, + Teams, + Solves, + Challenges, + Fails, + Flags, + Tags, + Files, + Tracking, + ) + + url = create_database() + + app.config["SQLALCHEMY_DATABASE_URI"] = str(url) + + db.init_app(app) + + migrations.init_app(app, db) + + if url.drivername.startswith("sqlite"): +~~ from sqlalchemy.engine import Engine + from sqlalchemy import event + +~~ @event.listens_for(Engine, "connect") + def set_sqlite_pragma(dbapi_connection, connection_record): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() + + db.create_all() + stamp_latest_revision() + else: + upgrade() + + from CTFd.models import ma + + ma.init_app(app) + + app.db = db + app.VERSION = __version__ + + from CTFd.cache import cache + + cache.init_app(app) + app.cache = cache + + reverse_proxy = app.config.get("REVERSE_PROXY") + if reverse_proxy: + + +## ... source file continues with no further Engine examples... + +``` + + +## Example 2 from GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown index 04551b10e..b01b0801d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-engine-url-make-url.markdown @@ -10,7 +10,117 @@ meta: Python example code that shows how to use the make_url callable from the s make_url is a callable within the sqlalchemy.engine.url module of the SQLAlchemy project. -## Example 1 from flask-sqlalchemy +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / helpers.py**](https://github.com/CTFd/CTFd/blob/master/./tests/helpers.py) + +```python +# helpers.py +import datetime +import gc +import random +import string +import uuid +from collections import namedtuple +from unittest.mock import Mock, patch + +import requests +from flask.testing import FlaskClient +~~from sqlalchemy.engine.url import make_url +from sqlalchemy_utils import drop_database +from werkzeug.datastructures import Headers + +from CTFd import create_app +from CTFd.cache import cache, clear_standings +from CTFd.config import TestingConfig +from CTFd.models import ( + Awards, + ChallengeFiles, + Challenges, + Fails, + Files, + Flags, + Hints, + Notifications, + PageFiles, + Pages, + Solves, + Tags, + Teams, + Tokens, + Tracking, + Unlocks, + Users, + + +## ... source file abbreviated to get to make_url examples ... + + + if isinstance(headers, dict): + headers = Headers(headers) + headers.extend(api_key_headers) + kwargs["headers"] = headers + return super(CTFdTestClient, self).open(*args, **kwargs) + + +def create_ctfd( + ctf_name="CTFd", + ctf_description="CTF description", + name="admin", + email="admin@ctfd.io", + password="password", + user_mode="users", + setup=True, + enable_plugins=False, + application_root="/", + config=TestingConfig, +): + if enable_plugins: + config.SAFE_MODE = False + else: + config.SAFE_MODE = True + + config.APPLICATION_ROOT = application_root +~~ url = make_url(config.SQLALCHEMY_DATABASE_URI) + if url.database: + url.database = str(uuid.uuid4()) + config.SQLALCHEMY_DATABASE_URI = str(url) + + app = create_app(config) + app.test_client_class = CTFdTestClient + + if setup: + app = setup_ctfd( + app, + ctf_name=ctf_name, + ctf_description=ctf_description, + name=name, + email=email, + password=password, + user_mode=user_mode, + ) + return app + + +def setup_ctfd( + app, + ctf_name="CTFd", + ctf_description="CTF description", + + +## ... source file continues with no further make_url examples... + +``` + + +## Example 2 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -133,7 +243,7 @@ class _EngineConnector: ``` -## Example 2 from GINO +## Example 3 from GINO [GINO](https://github.com/fantix/gino) ([project documentation](https://python-gino.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 1562f416b..3392cc1be 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -27,6 +27,16 @@ The project is open sourced under the [BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). +# CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + + ### indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown index 91984a2ad..46b862797 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-exc-integrityerror.markdown @@ -10,7 +10,119 @@ meta: Example code for understanding how to use the IntegrityError class from th IntegrityError is a class within the sqlalchemy.exc module of the SQLAlchemy project. -## Example 1 from flask-base +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [SQLAlchemy](/sqlalchemy.html) and [Flask](/flask.html). +The application can be used as-is to run CTF events, or the code can be +modified for custom rules on hacking scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / views.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/views.py) + +```python +# views.py +import os + +from flask import Blueprint, abort +from flask import current_app as app +from flask import redirect, render_template, request, send_file, session, url_for +from flask.helpers import safe_join +~~from sqlalchemy.exc import IntegrityError + +from CTFd.cache import cache +from CTFd.constants.config import ( + AccountVisibilityTypes, + ChallengeVisibilityTypes, + ConfigTypes, + RegistrationVisibilityTypes, + ScoreVisibilityTypes, +) +from CTFd.models import ( + Admins, + Files, + Notifications, + Pages, + Teams, + Users, + UserTokens, + db, +) +from CTFd.utils import config, get_config, set_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_setup +from CTFd.utils.config.pages import get_page + + +## ... source file abbreviated to get to IntegrityError examples ... + + + set_config( + "user_creation_email_subject", DEFAULT_USER_CREATION_EMAIL_SUBJECT + ) + set_config("user_creation_email_body", DEFAULT_USER_CREATION_EMAIL_BODY) + + set_config("password_reset_subject", DEFAULT_PASSWORD_RESET_SUBJECT) + set_config("password_reset_body", DEFAULT_PASSWORD_RESET_BODY) + + set_config( + "password_change_alert_subject", + "Password Change Confirmation for {ctf_name}", + ) + set_config( + "password_change_alert_body", + ( + "Your password for {ctf_name} has been changed.\n\n" + "If you didn't request a password change you can reset your password here: {url}" + ), + ) + + set_config("setup", True) + + try: + db.session.add(admin) + db.session.commit() +~~ except IntegrityError: + db.session.rollback() + + try: + db.session.add(page) + db.session.commit() +~~ except IntegrityError: + db.session.rollback() + + login_user(admin) + + db.session.close() + with app.app_context(): + cache.clear() + + return redirect(url_for("views.static_html")) + return render_template("setup.html", state=serialize(generate_nonce())) + return redirect(url_for("views.static_html")) + + +@views.route("/setup/integrations", methods=["GET", "POST"]) +def integrations(): + if is_admin() or is_setup() is False: + name = request.values.get("name") + state = request.values.get("state") + + try: + state = unserialize(state, max_age=3600) + except (BadSignature, BadTimeSignature): + state = False + except Exception: + + +## ... source file continues with no further IntegrityError examples... + +``` + + +## Example 2 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -144,7 +256,7 @@ def load_user(user_id): ``` -## Example 2 from sqlalchemy-utils +## Example 3 from sqlalchemy-utils [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) ([project documentation](https://sqlalchemy-utils.readthedocs.io/en/latest/) and diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown index 1bf27f607..65d13d9a1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-extensions-plug-ins.markdown @@ -191,3 +191,16 @@ The wide array of includes [ranged values](https://sqlalchemy-utils.readthedocs.io/en/latest/range_data_types.html) and [aggregated attributes](https://sqlalchemy-utils.readthedocs.io/en/latest/aggregates.html). + +### wtforms-alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown index 9cdfe7d04..46b22a0a2 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-attributes-instrumentedattribute.markdown @@ -184,3 +184,55 @@ class AttrPath(object): ``` + +## Example 3 from WTForms-Alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + +[**WTForms-Alchemy / wtforms_alchemy / validators.py**](https://github.com/kvesteri/wtforms-alchemy/blob/master/wtforms_alchemy/./validators.py) + +```python +# validators.py +from collections.abc import Iterable, Mapping + +import six +from sqlalchemy import Column +~~from sqlalchemy.orm.attributes import InstrumentedAttribute +from wtforms import ValidationError + + +class Unique(object): + field_flags = ('unique', ) + + def __init__(self, column, get_session=None, message=None): + self.column = column + self.message = message + self.get_session = get_session + + @property + def query(self): + self._check_for_session(self.model) + if self.get_session: + return self.get_session().query(self.model) + elif hasattr(self.model, 'query'): + return getattr(self.model, 'query') + else: + raise Exception( + 'Validator requires either get_session or Flask-SQLAlchemy' + ' styled query parameter' + ) + + + +## ... source file continues with no further InstrumentedAttribute examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown index 69885f0a8..9974099bb 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-properties-columnproperty.markdown @@ -228,3 +228,168 @@ def get_all_descriptors(expr): ``` + +## Example 2 from WTForms-Alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + +[**WTForms-Alchemy / wtforms_alchemy / generator.py**](https://github.com/kvesteri/wtforms-alchemy/blob/master/wtforms_alchemy/./generator.py) + +```python +# generator.py +import inspect +from collections import OrderedDict +from decimal import Decimal +from enum import Enum + +import six +import sqlalchemy as sa +~~from sqlalchemy.orm.properties import ColumnProperty +from sqlalchemy_utils import types +from wtforms import ( + BooleanField, + Field, + FloatField, + PasswordField, + TextAreaField +) +from wtforms.widgets import CheckboxInput, TextArea +from wtforms_components import ( + ColorField, + DateField, + DateIntervalField, + DateTimeField, + DateTimeIntervalField, + DateTimeLocalField, + DecimalField, + DecimalIntervalField, + EmailField, + IntegerField, + IntIntervalField, + SelectField, + StringField, + TimeField + + +## ... source file abbreviated to get to ColumnProperty examples ... + + + + WIDGET_MAP = OrderedDict(( + (BooleanField, CheckboxInput), + (ColorField, ColorInput), + (DateField, DateInput), + (DateTimeField, DateTimeInput), + (DateTimeLocalField, DateTimeLocalInput), + (DecimalField, NumberInput), + (EmailField, EmailInput), + (FloatField, NumberInput), + (IntegerField, NumberInput), + (TextAreaField, TextArea), + (TimeField, TimeInput), + (StringField, TextInput) + )) + + def __init__(self, form_class): + self.form_class = form_class + self.model_class = self.form_class.Meta.model + self.meta = self.form_class.Meta + self.TYPE_MAP.update(self.form_class.Meta.type_map) + + def create_form(self, form): + attrs = OrderedDict() + for key, property_ in sa.inspect(self.model_class).attrs.items(): +~~ if not isinstance(property_, ColumnProperty): + continue + if self.skip_column_property(property_): + continue + attrs[key] = property_ + + for attr in translated_attributes(self.model_class): + attrs[attr.key] = attr.property + + return self.create_fields(form, self.filter_attributes(attrs)) + + def filter_attributes(self, attrs): + if self.meta.only: + attrs = OrderedDict([ + (key, prop) + for key, prop in map(self.validate_attribute, self.meta.only) + if key + ]) + else: + if self.meta.include: + attrs.update([ + (key, prop) + for key, prop + in map(self.validate_attribute, self.meta.include) + if key + + +## ... source file abbreviated to get to ColumnProperty examples ... + + + + if self.meta.exclude: + for key in self.meta.exclude: + try: + del attrs[key] + except KeyError: + if self.meta.attr_errors: + raise InvalidAttributeException(key) + return attrs + + def validate_attribute(self, attr_name): + try: + attr = getattr(self.model_class, attr_name) + except AttributeError: + try: + translation_class = ( + self.model_class.__translatable__['class'] + ) + attr = getattr(translation_class, attr_name) + except AttributeError: + if self.meta.attr_errors: + raise InvalidAttributeException(attr_name) + else: + return None, None + try: +~~ if not isinstance(attr.property, ColumnProperty): + if self.meta.attr_errors: + raise InvalidAttributeException(attr_name) + else: + return None, None + except AttributeError: + raise AttributeTypeException(attr_name) + return attr_name, attr.property + + def create_fields(self, form, properties): + for key, prop in properties.items(): + column = prop.columns[0] + try: + field = self.create_field(prop, column) + except UnknownTypeException: + if not self.meta.skip_unknown_types: + raise + else: + continue + + if not hasattr(form, key): + setattr(form, key, field) + + def skip_column_property(self, column_property): + if column_property._is_polymorphic_discriminator: + + +## ... source file continues with no further ColumnProperty examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown new file mode 100644 index 000000000..5f73f741f --- /dev/null +++ b/content/pages/examples/sqlalchemy/sqlalchemy-orm-util-identity-key.markdown @@ -0,0 +1,120 @@ +title: sqlalchemy.orm.util identity_key Example Code +category: page +slug: sqlalchemy-orm-util-identity-key-examples +sortorder: 500031087 +toc: False +sidebartitle: sqlalchemy.orm.util identity_key +meta: Python example code that shows how to use the identity_key callable from the sqlalchemy.orm.util module of the SQLAlchemy project. + + +identity_key is a callable within the sqlalchemy.orm.util module of the SQLAlchemy project. + + +## Example 1 from WTForms-Alchemy +[wtforms-alchemy](git@github.com:kvesteri/wtforms-alchemy.git) +([documentation](https://wtforms-alchemy.readthedocs.io/en/latest/) +and +[PyPI package information](https://pypi.org/project/WTForms-Alchemy/)) +is a [WTForms](https://wtforms.readthedocs.io/en/2.2.1/) extension toolkit +for easier creation of [SQLAlchemy](/sqlalchemy.html) model based forms. +While this project primarily focuses on proper form handling, it also +has many good examples of how to use various parts of SQLAlchemy in +its code base. The project is provided as open source under the +[MIT license](https://github.com/kvesteri/wtforms-alchemy/blob/master/LICENSE). + +[**WTForms-Alchemy / wtforms_alchemy / fields.py**](https://github.com/kvesteri/wtforms-alchemy/blob/master/wtforms_alchemy/./fields.py) + +```python +# fields.py +from __future__ import unicode_literals + +import operator +from itertools import groupby + +import six +~~from sqlalchemy.orm.util import identity_key +from sqlalchemy_utils import Country, i18n, PhoneNumber +from sqlalchemy_utils.primitives import WeekDay, WeekDays +from wtforms import widgets +from wtforms.compat import string_types, text_type +from wtforms.fields import FieldList, FormField, SelectFieldBase +from wtforms.validators import ValidationError +from wtforms.widgets import CheckboxInput, ListWidget +from wtforms_components import SelectField, SelectMultipleField +from wtforms_components.fields.html5 import StringField +from wtforms_components.widgets import SelectWidget, TelInput + +from .utils import find_entity + +try: + from wtforms.utils import unset_value as _unset_value +except ImportError: + from wtforms.fields import _unset_value + + +class SkipOperation(Exception): + pass + + +class ModelFormField(FormField): + + +## ... source file abbreviated to get to identity_key examples ... + + + + def _set_data(self, data): + self._data = data + self._formdata = None + + data = property(_get_data, _set_data) + + def iter_choices(self): + for pk, obj in self._get_object_list(): + yield (pk, self.get_label(obj), obj in self.data) + + def process_formdata(self, valuelist): + self._formdata = set(valuelist) + + def pre_validate(self, form): + if self._invalid_formdata: + raise ValidationError(self.gettext('Not a valid choice')) + elif self.data: + obj_list = list(x[1] for x in self._get_object_list()) + for v in self.data: + if v not in obj_list: + raise ValidationError(self.gettext('Not a valid choice')) + + +def get_pk_from_identity(obj): +~~ cls, key = identity_key(instance=obj)[0:2] + return ':'.join(text_type(x) for x in key) + + +class GroupedQuerySelectField(SelectField): + widget = SelectWidget() + + def __init__( + self, + label=None, + validators=None, + query_factory=None, + get_pk=None, + get_label=None, + get_group=None, + allow_blank=False, + blank_text='', + blank_value='__None', + **kwargs + ): + super(GroupedQuerySelectField, self).__init__( + label, + validators, + coerce=lambda x: x, + **kwargs + + +## ... source file continues with no further identity_key examples... + +``` + diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown index 00f63bc8f..dbc4392b1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-nullpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool NullPool Example Code category: page slug: sqlalchemy-pool-nullpool-examples -sortorder: 500031087 +sortorder: 500031088 toc: False sidebartitle: sqlalchemy.pool NullPool meta: Example code for understanding how to use the NullPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown index a427fbcc7..a594f0af3 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-pool-staticpool.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.pool StaticPool Example Code category: page slug: sqlalchemy-pool-staticpool-examples -sortorder: 500031088 +sortorder: 500031089 toc: False sidebartitle: sqlalchemy.pool StaticPool meta: Example code for understanding how to use the StaticPool class from the sqlalchemy.pool module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown index 2f4f885a9..6c09906fe 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-checkconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CheckConstraint Example Code category: page slug: sqlalchemy-schema-checkconstraint-examples -sortorder: 500031089 +sortorder: 500031090 toc: False sidebartitle: sqlalchemy.schema CheckConstraint meta: Example code for understanding how to use the CheckConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown index 4bface7d5..ab6a33c23 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Column Example Code category: page slug: sqlalchemy-schema-column-examples -sortorder: 500031090 +sortorder: 500031091 toc: False sidebartitle: sqlalchemy.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown index 5029af79a..c115b2a13 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createindex.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateIndex Example Code category: page slug: sqlalchemy-schema-createindex-examples -sortorder: 500031091 +sortorder: 500031092 toc: False sidebartitle: sqlalchemy.schema CreateIndex meta: Example code for understanding how to use the CreateIndex class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown index 458586fff..50c1b74c8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-createtable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema CreateTable Example Code category: page slug: sqlalchemy-schema-createtable-examples -sortorder: 500031092 +sortorder: 500031093 toc: False sidebartitle: sqlalchemy.schema CreateTable meta: Example code for understanding how to use the CreateTable class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown index 9ccfd1ea5..972bbca60 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-ddlelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema DDLElement Example Code category: page slug: sqlalchemy-schema-ddlelement-examples -sortorder: 500031093 +sortorder: 500031094 toc: False sidebartitle: sqlalchemy.schema DDLElement meta: Example code for understanding how to use the DDLElement class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown index 7d154cacf..85806f1a6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkey.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKey Example Code category: page slug: sqlalchemy-schema-foreignkey-examples -sortorder: 500031094 +sortorder: 500031095 toc: False sidebartitle: sqlalchemy.schema ForeignKey meta: Example code for understanding how to use the ForeignKey class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown index 491711f24..9625b1e09 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-foreignkeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema ForeignKeyConstraint Example Code category: page slug: sqlalchemy-schema-foreignkeyconstraint-examples -sortorder: 500031095 +sortorder: 500031096 toc: False sidebartitle: sqlalchemy.schema ForeignKeyConstraint meta: Example code for understanding how to use the ForeignKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown index 3108acf8b..384430ed7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-primarykeyconstraint.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema PrimaryKeyConstraint Example Code category: page slug: sqlalchemy-schema-primarykeyconstraint-examples -sortorder: 500031096 +sortorder: 500031097 toc: False sidebartitle: sqlalchemy.schema PrimaryKeyConstraint meta: Example code for understanding how to use the PrimaryKeyConstraint class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown index 568c40f44..1fd03be8d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-schema-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.schema Table Example Code category: page slug: sqlalchemy-schema-table-examples -sortorder: 500031097 +sortorder: 500031098 toc: False sidebartitle: sqlalchemy.schema Table meta: Example code for understanding how to use the Table class from the sqlalchemy.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown index 65004a42d..22f1338b6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql ClauseElement Example Code category: page slug: sqlalchemy-sql-clauseelement-examples -sortorder: 500031098 +sortorder: 500031099 toc: False sidebartitle: sqlalchemy.sql ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown index 9259fd646..36ee12c23 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql column Example Code category: page slug: sqlalchemy-sql-column-examples -sortorder: 500031099 +sortorder: 500031100 toc: False sidebartitle: sqlalchemy.sql column meta: Python example code that shows how to use the column callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown index 539f8420f..8872c90ec 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements ColumnElement Example Code category: page slug: sqlalchemy-sql-elements-columnelement-examples -sortorder: 500031108 +sortorder: 500031109 toc: False sidebartitle: sqlalchemy.sql.elements ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown index 112c524ed..b6ac898cd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-elements-label.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.elements Label Example Code category: page slug: sqlalchemy-sql-elements-label-examples -sortorder: 500031109 +sortorder: 500031110 toc: False sidebartitle: sqlalchemy.sql.elements Label meta: Example code for understanding how to use the Label class from the sqlalchemy.sql.elements module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown index d63891ca3..02d9d0722 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-clauseelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ClauseElement Example Code category: page slug: sqlalchemy-sql-expression-clauseelement-examples -sortorder: 500031110 +sortorder: 500031111 toc: False sidebartitle: sqlalchemy.sql.expression ClauseElement meta: Example code for understanding how to use the ClauseElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown index 0a667ca2c..c6acaf636 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnclause.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnClause Example Code category: page slug: sqlalchemy-sql-expression-columnclause-examples -sortorder: 500031111 +sortorder: 500031112 toc: False sidebartitle: sqlalchemy.sql.expression ColumnClause meta: Example code for understanding how to use the ColumnClause class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown index e929e48c8..95e07659a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-columnelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression ColumnElement Example Code category: page slug: sqlalchemy-sql-expression-columnelement-examples -sortorder: 500031112 +sortorder: 500031113 toc: False sidebartitle: sqlalchemy.sql.expression ColumnElement meta: Example code for understanding how to use the ColumnElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown index 3d850fa5e..4b7af7e7d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-executable.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression Executable Example Code category: page slug: sqlalchemy-sql-expression-executable-examples -sortorder: 500031113 +sortorder: 500031114 toc: False sidebartitle: sqlalchemy.sql.expression Executable meta: Example code for understanding how to use the Executable class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown index 6b26eb7c9..04b5e6cfd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression FunctionElement Example Code category: page slug: sqlalchemy-sql-expression-functionelement-examples -sortorder: 500031114 +sortorder: 500031115 toc: False sidebartitle: sqlalchemy.sql.expression FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown index da4c138a5..88a74b85d 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression-unaryexpression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.expression UnaryExpression Example Code category: page slug: sqlalchemy-sql-expression-unaryexpression-examples -sortorder: 500031115 +sortorder: 500031116 toc: False sidebartitle: sqlalchemy.sql.expression UnaryExpression meta: Example code for understanding how to use the UnaryExpression class from the sqlalchemy.sql.expression module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown index f1903b80b..bf0c05d1a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-expression.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql expression Example Code category: page slug: sqlalchemy-sql-expression-examples -sortorder: 500031100 +sortorder: 500031101 toc: False sidebartitle: sqlalchemy.sql expression meta: Python example code that shows how to use the expression callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown index 86aae7818..6a2904d77 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-extract.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql extract Example Code category: page slug: sqlalchemy-sql-extract-examples -sortorder: 500031101 +sortorder: 500031102 toc: False sidebartitle: sqlalchemy.sql extract meta: Python example code that shows how to use the extract callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown index a5c761948..75dd752bf 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-functionelement.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions FunctionElement Example Code category: page slug: sqlalchemy-sql-functions-functionelement-examples -sortorder: 500031116 +sortorder: 500031117 toc: False sidebartitle: sqlalchemy.sql.functions FunctionElement meta: Example code for understanding how to use the FunctionElement class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown index cbbea2c6c..92ae4a8d4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions-genericfunction.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.functions GenericFunction Example Code category: page slug: sqlalchemy-sql-functions-genericfunction-examples -sortorder: 500031117 +sortorder: 500031118 toc: False sidebartitle: sqlalchemy.sql.functions GenericFunction meta: Example code for understanding how to use the GenericFunction class from the sqlalchemy.sql.functions module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown index 8a475f5c5..8a2c3e2d8 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-functions.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql functions Example Code category: page slug: sqlalchemy-sql-functions-examples -sortorder: 500031102 +sortorder: 500031103 toc: False sidebartitle: sqlalchemy.sql functions meta: Python example code that shows how to use the functions callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown index cb85cee69..512c224b6 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-naming-conv.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.naming conv Example Code category: page slug: sqlalchemy-sql-naming-conv-examples -sortorder: 500031118 +sortorder: 500031119 toc: False sidebartitle: sqlalchemy.sql.naming conv meta: Python example code that shows how to use the conv callable from the sqlalchemy.sql.naming module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown index ab6800f57..7b1b44e0a 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-operators.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql operators Example Code category: page slug: sqlalchemy-sql-operators-examples -sortorder: 500031103 +sortorder: 500031104 toc: False sidebartitle: sqlalchemy.sql operators meta: Python example code that shows how to use the operators callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown index a94259598..93df3b4f1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-column.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema Column Example Code category: page slug: sqlalchemy-sql-schema-column-examples -sortorder: 500031119 +sortorder: 500031120 toc: False sidebartitle: sqlalchemy.sql.schema Column meta: Example code for understanding how to use the Column class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown index f42dc6700..78fbc3be7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema-schemaitem.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.schema SchemaItem Example Code category: page slug: sqlalchemy-sql-schema-schemaitem-examples -sortorder: 500031120 +sortorder: 500031121 toc: False sidebartitle: sqlalchemy.sql.schema SchemaItem meta: Example code for understanding how to use the SchemaItem class from the sqlalchemy.sql.schema module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown index 07c4f349a..d0869b2db 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-schema.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql schema Example Code category: page slug: sqlalchemy-sql-schema-examples -sortorder: 500031104 +sortorder: 500031105 toc: False sidebartitle: sqlalchemy.sql schema meta: Python example code that shows how to use the schema callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown index f9ac7847d..1eb126b66 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-select.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql select Example Code category: page slug: sqlalchemy-sql-select-examples -sortorder: 500031105 +sortorder: 500031106 toc: False sidebartitle: sqlalchemy.sql select meta: Python example code that shows how to use the select callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown index 544dfc97b..027c06f82 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes-nulltype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.sqltypes NullType Example Code category: page slug: sqlalchemy-sql-sqltypes-nulltype-examples -sortorder: 500031121 +sortorder: 500031122 toc: False sidebartitle: sqlalchemy.sql.sqltypes NullType meta: Example code for understanding how to use the NullType class from the sqlalchemy.sql.sqltypes module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown index 9e3d88eb2..63bf8ccb4 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-sqltypes.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql sqltypes Example Code category: page slug: sqlalchemy-sql-sqltypes-examples -sortorder: 500031106 +sortorder: 500031107 toc: False sidebartitle: sqlalchemy.sql sqltypes meta: Python example code that shows how to use the sqltypes callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown index 5a1aa46a1..3336472a5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-table.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql table Example Code category: page slug: sqlalchemy-sql-table-examples -sortorder: 500031107 +sortorder: 500031108 toc: False sidebartitle: sqlalchemy.sql table meta: Python example code that shows how to use the table callable from the sqlalchemy.sql module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown index 9cbd0f5cc..461e0f66e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-util-clauseadapter.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.util ClauseAdapter Example Code category: page slug: sqlalchemy-sql-util-clauseadapter-examples -sortorder: 500031122 +sortorder: 500031123 toc: False sidebartitle: sqlalchemy.sql.util ClauseAdapter meta: Example code for understanding how to use the ClauseAdapter class from the sqlalchemy.sql.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown index 37518cca5..cf9c98049 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-sql-visitors-traverse.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.sql.visitors traverse Example Code category: page slug: sqlalchemy-sql-visitors-traverse-examples -sortorder: 500031123 +sortorder: 500031124 toc: False sidebartitle: sqlalchemy.sql.visitors traverse meta: Python example code that shows how to use the traverse callable from the sqlalchemy.sql.visitors module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown index 381f9c45a..f55075ef1 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-boolean.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Boolean Example Code category: page slug: sqlalchemy-types-boolean-examples -sortorder: 500031124 +sortorder: 500031125 toc: False sidebartitle: sqlalchemy.types Boolean meta: Example code for understanding how to use the Boolean class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown index b1330cdae..07cc1d513 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-enum.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Enum Example Code category: page slug: sqlalchemy-types-enum-examples -sortorder: 500031125 +sortorder: 500031126 toc: False sidebartitle: sqlalchemy.types Enum meta: Example code for understanding how to use the Enum class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown index 5f2fab2e5..adcc73c33 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-integer.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types Integer Example Code category: page slug: sqlalchemy-types-integer-examples -sortorder: 500031126 +sortorder: 500031127 toc: False sidebartitle: sqlalchemy.types Integer meta: Example code for understanding how to use the Integer class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown index 19e93553a..9fe7e75f7 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-nulltype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types NULLTYPE Example Code category: page slug: sqlalchemy-types-nulltype-examples -sortorder: 500031127 +sortorder: 500031128 toc: False sidebartitle: sqlalchemy.types NULLTYPE meta: Python example code that shows how to use the NULLTYPE constant from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown index a25f4bf25..bdc9c4146 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-string.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types String Example Code category: page slug: sqlalchemy-types-string-examples -sortorder: 500031128 +sortorder: 500031129 toc: False sidebartitle: sqlalchemy.types String meta: Example code for understanding how to use the String class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown index 7dc7adb28..53a32658e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-to-instance.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types to_instance Example Code category: page slug: sqlalchemy-types-to-instance-examples -sortorder: 500031131 +sortorder: 500031132 toc: False sidebartitle: sqlalchemy.types to_instance meta: Python example code that shows how to use the to_instance callable from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown index fc10502c0..c28bd8cf5 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-typeengine.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types TypeEngine Example Code category: page slug: sqlalchemy-types-typeengine-examples -sortorder: 500031129 +sortorder: 500031130 toc: False sidebartitle: sqlalchemy.types TypeEngine meta: Example code for understanding how to use the TypeEngine class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown index 5ae70ea29..b82606737 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-types-userdefinedtype.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.types UserDefinedType Example Code category: page slug: sqlalchemy-types-userdefinedtype-examples -sortorder: 500031130 +sortorder: 500031131 toc: False sidebartitle: sqlalchemy.types UserDefinedType meta: Example code for understanding how to use the UserDefinedType class from the sqlalchemy.types module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown index 24f3ce4e0..28cff0f06 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-langhelpers-symbol.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util.langhelpers symbol Example Code category: page slug: sqlalchemy-util-langhelpers-symbol-examples -sortorder: 500031136 +sortorder: 500031137 toc: False sidebartitle: sqlalchemy.util.langhelpers symbol meta: Python example code that shows how to use the symbol callable from the sqlalchemy.util.langhelpers module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown index 93e4e5be6..11ef6357e 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-ordereddict.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedDict Example Code category: page slug: sqlalchemy-util-ordereddict-examples -sortorder: 500031132 +sortorder: 500031133 toc: False sidebartitle: sqlalchemy.util OrderedDict meta: Example code for understanding how to use the OrderedDict class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown index 703918750..955f213dd 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-orderedset.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util OrderedSet Example Code category: page slug: sqlalchemy-util-orderedset-examples -sortorder: 500031133 +sortorder: 500031134 toc: False sidebartitle: sqlalchemy.util OrderedSet meta: Example code for understanding how to use the OrderedSet class from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown index f4501ee76..92d1de89f 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-set-creation-order.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util set_creation_order Example Code category: page slug: sqlalchemy-util-set-creation-order-examples -sortorder: 500031134 +sortorder: 500031135 toc: False sidebartitle: sqlalchemy.util set_creation_order meta: Python example code that shows how to use the set_creation_order callable from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown index f2aee0996..8d8d4e589 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-util-topological.markdown @@ -1,7 +1,7 @@ title: sqlalchemy.util topological Example Code category: page slug: sqlalchemy-util-topological-examples -sortorder: 500031135 +sortorder: 500031136 toc: False sidebartitle: sqlalchemy.util topological meta: Python example code that shows how to use the topological callable from the sqlalchemy.util module of the SQLAlchemy project. diff --git a/theme/templates/code-examples/sqlalchemy.html b/theme/templates/code-examples/sqlalchemy.html index 450fb3242..cb3166f5e 100644 --- a/theme/templates/code-examples/sqlalchemy.html +++ b/theme/templates/code-examples/sqlalchemy.html @@ -155,7 +155,8 @@

    sqlalchemy.orm.session

    sqlalchemy.orm.util AliasedClass, - AliasedInsp + AliasedInsp, + identity_key

    sqlalchemy.pool NullPool, From 76dfd971e22557d354ad796b66ea9bda93646ea0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Fri, 24 Jul 2020 11:50:54 -0400 Subject: [PATCH 103/207] update webhooks with new resources and update changelog --- .../04-web-development/46-webhooks.markdown | 9 +++++++++ content/pages/meta/00-change-log.markdown | 1 + static/img/logos/grafana.jpg | Bin 0 -> 24875 bytes 3 files changed, 10 insertions(+) create mode 100644 static/img/logos/grafana.jpg diff --git a/content/pages/04-web-development/46-webhooks.markdown b/content/pages/04-web-development/46-webhooks.markdown index a50c9f558..06e3b1984 100644 --- a/content/pages/04-web-development/46-webhooks.markdown +++ b/content/pages/04-web-development/46-webhooks.markdown @@ -23,6 +23,15 @@ otherwise independent web applications. ### Webhook resources +* [What's a webhook?](https://sendgrid.com/blog/whats-webhook/) is a high-level + explanation of this concept that also contains some basic security + considerations when using them. + +* [How to Listen for Webhooks with Python](https://blog.bearer.sh/consume-webhooks-with-python/) + has code examples in both [Flask](/flask.html) and [Django](/django.html) + for how to receive an HTTP POST webhook request, as well as how to test + it locally with Ngrok. + * [Should you build a webhooks API?](https://brandur.org/webhooks) * [Webhooks do’s and dont’s: what we learned after integrating +100 APIs](https://restful.io/webhooks-dos-and-dont-s-what-we-learned-after-integrating-100-apis-d567405a3671) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index f21cc1bb8..34b82c08f 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,6 +15,7 @@ on GitHub. ## 2020 ### July +* Updated [webhooks](/webhooks.html) page with additional resources. * New blog posts: * [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) diff --git a/static/img/logos/grafana.jpg b/static/img/logos/grafana.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1922fa665b3645cfdc75d56fd75b87a5babe80c GIT binary patch literal 24875 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 m0)G(rgTNmI{vhxNfj Date: Sat, 25 Jul 2020 17:47:00 -0400 Subject: [PATCH 104/207] new flask code examples and cross linking --- .../flask/flask-app-badrequest.markdown | 6 +- .../examples/flask/flask-app-flask.markdown | 89 +++- .../examples/flask/flask-app-headers.markdown | 102 ++++- .../flask/flask-app-immutabledict.markdown | 6 +- .../flask/flask-blueprints-blueprint.markdown | 98 ++++- .../flask/flask-cli-appgroup.markdown | 6 + .../flask/flask-cli-dispatchingapp.markdown | 6 + .../flask/flask-cli-flaskgroup.markdown | 6 + .../flask/flask-cli-pass-script-info.markdown | 6 + .../flask/flask-cli-scriptinfo.markdown | 6 + .../flask/flask-cli-with-appcontext.markdown | 6 + .../flask-ctx-after-this-request.markdown | 4 + .../flask/flask-ctx-has-app-context.markdown | 4 + .../flask-ctx-has-request-context.markdown | 4 + .../flask/flask-globals-current-app.markdown | 106 ++++- .../examples/flask/flask-globals-g.markdown | 4 + .../flask/flask-globals-request.markdown | 141 +++++- .../flask/flask-globals-session.markdown | 135 +++++- .../flask/flask-helpers-flash.markdown | 6 + .../flask-helpers-get-root-path.markdown | 6 + .../flask-helpers-make-response.markdown | 6 + .../flask/flask-helpers-safe-join.markdown | 103 +++++ .../flask/flask-helpers-send-file.markdown | 93 +++- .../flask/flask-helpers-url-for.markdown | 206 ++++++++- .../flask/flask-json-jsonencoder.markdown | 4 +- .../flask/flask-json-jsonify.markdown | 4 +- .../flask-sessions-badsignature.markdown | 6 +- .../flask-sessions-sessioninterface.markdown | 6 +- .../flask-sessions-sessionmixin.markdown | 6 +- ...ask-signals-got-request-exception.markdown | 4 +- .../flask/flask-signals-namespace.markdown | 4 +- ...templating-render-template-string.markdown | 4 +- .../flask-templating-render-template.markdown | 409 +++++++++++++++++- .../flask-views-http-method-funcs.markdown | 8 +- .../flask/flask-views-methodview.markdown | 8 +- .../examples/flask/flask-views-view.markdown | 6 +- theme/static/css/base.css | 2 +- theme/templates/code-examples/flask.html | 1 + 38 files changed, 1486 insertions(+), 141 deletions(-) create mode 100644 content/pages/examples/flask/flask-helpers-safe-join.markdown diff --git a/content/pages/examples/flask/flask-app-badrequest.markdown b/content/pages/examples/flask/flask-app-badrequest.markdown index 3cd6aa5f3..656406cf3 100644 --- a/content/pages/examples/flask/flask-app-badrequest.markdown +++ b/content/pages/examples/flask/flask-app-badrequest.markdown @@ -15,8 +15,12 @@ at runtime when an [invalid POST request is sent to a URL route](https://stackoverflow.com/questions/14105452/what-is-the-cause-of-the-bad-request-error-when-submitting-form-in-flask-applica) that accepts POSTs. +Flask, +Headers, +and ImmutableDict +are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `BadRequest` code examples: +These topics are also useful while reading the `BadRequest` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-app-flask.markdown b/content/pages/examples/flask/flask-app-flask.markdown index 2f9c9f4cb..333598654 100644 --- a/content/pages/examples/flask/flask-app-flask.markdown +++ b/content/pages/examples/flask/flask-app-flask.markdown @@ -14,8 +14,12 @@ This class acts as a central registry for a significant amount of a Flask application's functionality, including URL rounting, [template configurations](/template-engines.html), and handling view functions. +BadRequest, +Headers, +and ImmutableDict +are several other callables with code examples from the same `flask.app` package. -These subjects go along with the `Flask` code examples: +You should read up on these subjects along with these `Flask` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts @@ -75,7 +79,52 @@ def new_checkout(): ``` -## Example 2 from Flask AppBuilder +## Example 2 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / manage.py**](https://github.com/CTFd/CTFd/blob/master/././manage.py) + +```python +# manage.py +~~from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_script import Manager +from flask_migrate import Migrate, MigrateCommand +from CTFd import create_app +from CTFd.utils import get_config as get_config_util, set_config as set_config_util +from CTFd.models import * + +app = create_app() + +manager = Manager(app) +manager.add_command("db", MigrateCommand) + + +def jsenums(): + from CTFd.constants import JS_ENUMS + import json + import os + + path = os.path.join(app.root_path, "themes/core/assets/js/constants.js") + + with open(path, "w+") as f: + for k, v in JS_ENUMS.items(): + f.write("const {} = Object.freeze({});".format(k, json.dumps(v))) + + + +## ... source file continues with no further Flask examples... + +``` + + +## Example 3 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -138,7 +187,7 @@ class OAuthRegistrationRoleTestCase(unittest.TestCase): ``` -## Example 3 from FlaskBB +## Example 4 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -237,7 +286,7 @@ def configure_app(app, config): ``` -## Example 4 from flask-base +## Example 5 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -316,7 +365,7 @@ def create_app(config): ``` -## Example 5 from flask-bones +## Example 6 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -378,7 +427,7 @@ def create_app(config=config.base_config): ``` -## Example 6 from flask-bookshelf +## Example 7 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -430,7 +479,7 @@ def get_lang_code(endpoint, values): ``` -## Example 7 from flaskex +## Example 8 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -483,7 +532,7 @@ def logout(): ``` -## Example 8 from Flask-HTTPAuth +## Example 9 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -539,7 +588,7 @@ class HTTPAuthTestCase(unittest.TestCase): ``` -## Example 9 from flask-phone-input +## Example 10 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -591,7 +640,7 @@ def index(): ``` -## Example 10 from flaskSaaS +## Example 11 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -640,7 +689,7 @@ from app.models import User ``` -## Example 11 from Flask-SocketIO +## Example 12 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -751,7 +800,7 @@ if __name__ == '__main__': ``` -## Example 12 from Flask-User +## Example 13 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -834,7 +883,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 13 from Flask-VueJs-Template +## Example 14 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -875,7 +924,7 @@ def index_client(): ``` -## Example 14 from Flasky +## Example 15 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -939,7 +988,7 @@ def create_app(config_name): ``` -## Example 15 from Datadog Flask Example App +## Example 16 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1000,7 +1049,7 @@ def before_request(): ``` -## Example 16 from keras-flask-deploy-webapp +## Example 17 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1064,7 +1113,7 @@ def model_predict(img, model): ``` -## Example 17 from sandman2 +## Example 18 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -1145,7 +1194,7 @@ def get_app( ``` -## Example 18 from Science Flask +## Example 19 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1214,7 +1263,7 @@ def create_celery_app(): ``` -## Example 19 from tedivms-flask +## Example 20 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1343,7 +1392,7 @@ def create_app(extra_config_settings={}): ``` -## Example 20 from trape +## Example 21 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-app-headers.markdown b/content/pages/examples/flask/flask-app-headers.markdown index db6a82c4e..79b73c775 100644 --- a/content/pages/examples/flask/flask-app-headers.markdown +++ b/content/pages/examples/flask/flask-app-headers.markdown @@ -17,6 +17,10 @@ Headers handles the from [requests](/flask-globals-request-examples.html) and responses for Flask web applications. +BadRequest, +Flask, +and ImmutableDict +are several other callables with code examples from the same `flask.app` package. You should read up on these subjects along with these `Headers` examples: @@ -24,7 +28,103 @@ You should read up on these subjects along with these `Headers` examples: * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts -## Example 1 from flask-restx +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / helpers.py**](https://github.com/CTFd/CTFd/blob/master/./tests/helpers.py) + +```python +# helpers.py +import datetime +import gc +import random +import string +import uuid +from collections import namedtuple +from unittest.mock import Mock, patch + +import requests +from flask.testing import FlaskClient +from sqlalchemy.engine.url import make_url +from sqlalchemy_utils import drop_database +~~from werkzeug.datastructures import Headers + +from CTFd import create_app +from CTFd.cache import cache, clear_standings +from CTFd.config import TestingConfig +from CTFd.models import ( + Awards, + ChallengeFiles, + Challenges, + Fails, + Files, + Flags, + Hints, + Notifications, + PageFiles, + Pages, + Solves, + Tags, + Teams, + Tokens, + Tracking, + Unlocks, + Users, +) + +text_type = str +binary_type = bytes + + +FakeRequest = namedtuple("FakeRequest", ["form"]) + + +class CTFdTestClient(FlaskClient): + def open(self, *args, **kwargs): + if kwargs.get("json") is not None: + with self.session_transaction() as sess: +~~ api_key_headers = Headers({"CSRF-Token": sess.get("nonce")}) +~~ headers = kwargs.pop("headers", Headers()) + if isinstance(headers, dict): +~~ headers = Headers(headers) + headers.extend(api_key_headers) + kwargs["headers"] = headers + return super(CTFdTestClient, self).open(*args, **kwargs) + + +def create_ctfd( + ctf_name="CTFd", + ctf_description="CTF description", + name="admin", + email="admin@ctfd.io", + password="password", + user_mode="users", + setup=True, + enable_plugins=False, + application_root="/", + config=TestingConfig, +): + if enable_plugins: + config.SAFE_MODE = False + else: + config.SAFE_MODE = True + + config.APPLICATION_ROOT = application_root + url = make_url(config.SQLALCHEMY_DATABASE_URI) + + +## ... source file continues with no further Headers examples... + +``` + + +## Example 2 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into diff --git a/content/pages/examples/flask/flask-app-immutabledict.markdown b/content/pages/examples/flask/flask-app-immutabledict.markdown index 29ee3cd16..86bed27c1 100644 --- a/content/pages/examples/flask/flask-app-immutabledict.markdown +++ b/content/pages/examples/flask/flask-app-immutabledict.markdown @@ -15,8 +15,12 @@ The `ImmutableDict` class wraps a [standard Python dictionary](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) so that values cannot be modified after initially being set. +BadRequest, +Flask, +and Headers +are several other callables with code examples from the same `flask.app` package. -You should read up on these subjects along with these `ImmutableDict` examples: +These topics are also useful while reading the `ImmutableDict` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [Flask](/flask.html) and [web framework](/web-frameworks.html) concepts diff --git a/content/pages/examples/flask/flask-blueprints-blueprint.markdown b/content/pages/examples/flask/flask-blueprints-blueprint.markdown index 875a45214..62a85d083 100644 --- a/content/pages/examples/flask/flask-blueprints-blueprint.markdown +++ b/content/pages/examples/flask/flask-blueprints-blueprint.markdown @@ -15,7 +15,79 @@ class within the `flask.blueprints` module implements that functionality for Flask [web apps](/web-development.html). -## Example 1 from Flask AppBuilder + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / auth.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/auth.py) + +```python +# auth.py +import base64 + +import requests +~~from flask import Blueprint +from flask import current_app as app +from flask import redirect, render_template, request, session, url_for +from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired + +from CTFd.cache import clear_team_session, clear_user_session +from CTFd.models import Teams, Users, db +from CTFd.utils import config, email, get_app_config, get_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_teams_mode +from CTFd.utils.config.integrations import mlc_registration +from CTFd.utils.config.visibility import registration_visible +from CTFd.utils.crypto import verify_password +from CTFd.utils.decorators import ratelimit +from CTFd.utils.decorators.visibility import check_registration_visibility +from CTFd.utils.helpers import error_for, get_errors, markup +from CTFd.utils.logging import log +from CTFd.utils.modes import TEAMS_MODE +from CTFd.utils.security.auth import login_user, logout_user +from CTFd.utils.security.signing import unserialize +from CTFd.utils.validators import ValidationError + +~~auth = Blueprint("auth", __name__) + + +@auth.route("/confirm", methods=["POST", "GET"]) +@auth.route("/confirm/", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=60) +def confirm(data=None): + if not get_config("verify_emails"): + return redirect(url_for("challenges.listing")) + + if data and request.method == "GET": + try: + user_email = unserialize(data, max_age=1800) + except (BadTimeSignature, SignatureExpired): + return render_template( + "confirm.html", errors=["Your confirmation link has expired"] + ) + except (BadSignature, TypeError, base64.binascii.Error): + return render_template( + "confirm.html", errors=["Your confirmation token is invalid"] + ) + + user = Users.query.filter_by(email=user_email).first_or_404() + if user.verified: + return redirect(url_for("views.settings")) + + +## ... source file continues with no further Blueprint examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -123,7 +195,7 @@ def dynamic_class_import(class_path): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -227,7 +299,7 @@ def flaskbb_load_blueprints(app): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -272,7 +344,7 @@ def about(): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -298,7 +370,7 @@ from . import views ``` -## Example 5 from flask-bookshelf +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -349,7 +421,7 @@ def create_author(): ``` -## Example 6 from Flask-Bootstrap +## Example 7 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -453,7 +525,7 @@ class Bootstrap(object): ``` -## Example 7 from flask-debugtoolbar +## Example 8 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -523,7 +595,7 @@ class DebugToolbarExtension(object): ``` -## Example 8 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -575,7 +647,7 @@ def swagger_static(filename): ``` -## Example 9 from Flask-WTF +## Example 10 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -683,7 +755,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 10 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -790,7 +862,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 11 from Flask-VueJs-Template +## Example 12 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -822,7 +894,7 @@ import os ``` -## Example 12 from Datadog Flask Example App +## Example 13 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -869,7 +941,7 @@ def bp_after_request(response): ``` -## Example 13 from tedivms-flask +## Example 14 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-cli-appgroup.markdown b/content/pages/examples/flask/flask-cli-appgroup.markdown index 36d9fe188..828b6c8e2 100644 --- a/content/pages/examples/flask/flask-cli-appgroup.markdown +++ b/content/pages/examples/flask/flask-cli-appgroup.markdown @@ -14,6 +14,12 @@ works like the class and automatically wraps the functions using [with_appcontext](/flask-cli-with-appcontext-examples.html). +DispatchingApp, +FlaskGroup, +ScriptInfo, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown index 30ab2e594..6301decdf 100644 --- a/content/pages/examples/flask/flask-cli-dispatchingapp.markdown +++ b/content/pages/examples/flask/flask-cli-dispatchingapp.markdown @@ -12,6 +12,12 @@ is a class within the `flask.cli` module of the [Flask](/flask.html) project. DispatchingApp is a special application that dispatches to a Flask app if it is imported by name in a background thread. +AppGroup, +FlaskGroup, +ScriptInfo, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-cli-flaskgroup.markdown b/content/pages/examples/flask/flask-cli-flaskgroup.markdown index 4528f6f91..f42799cb7 100644 --- a/content/pages/examples/flask/flask-cli-flaskgroup.markdown +++ b/content/pages/examples/flask/flask-cli-flaskgroup.markdown @@ -13,6 +13,12 @@ FlaskGroup is a subclass of [AppGroup](/flask-cli-appgroup-examples.html) that provides for loading more commands from a configured Flask app. Generally, only advanced use cases will need to use this class. +AppGroup, +DispatchingApp, +ScriptInfo, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-cli-pass-script-info.markdown b/content/pages/examples/flask/flask-cli-pass-script-info.markdown index d976323d0..c8516a952 100644 --- a/content/pages/examples/flask/flask-cli-pass-script-info.markdown +++ b/content/pages/examples/flask/flask-cli-pass-script-info.markdown @@ -11,6 +11,12 @@ meta: Python example code that shows how to use the pass_script_info callable fr is simply a decorator around the [ScriptInfo](/flask-cli-scriptinfo-examples.html) class within this same `flask.cli` module. +AppGroup, +DispatchingApp, +FlaskGroup, +ScriptInfo, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-cli-scriptinfo.markdown b/content/pages/examples/flask/flask-cli-scriptinfo.markdown index d348c758f..97aae3a5a 100644 --- a/content/pages/examples/flask/flask-cli-scriptinfo.markdown +++ b/content/pages/examples/flask/flask-cli-scriptinfo.markdown @@ -13,6 +13,12 @@ framework. It is a helper object for Flask application and not usually dealt with directly by developers, instead it is created automatically by the [FlaskGroup](/flask-cli-flaskgroup-examples.html) object. +AppGroup, +DispatchingApp, +FlaskGroup, +pass_script_info, +and with_appcontext +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-cli-with-appcontext.markdown b/content/pages/examples/flask/flask-cli-with-appcontext.markdown index c3daf2cc9..70e615275 100644 --- a/content/pages/examples/flask/flask-cli-with-appcontext.markdown +++ b/content/pages/examples/flask/flask-cli-with-appcontext.markdown @@ -13,6 +13,12 @@ wraps a callback to guarantee it will be called with a script's application context. Any callbacks registered with `app.cli` are wrapped with this function by default. +AppGroup, +DispatchingApp, +FlaskGroup, +ScriptInfo, +and pass_script_info +are several other callables with code examples from the same `flask.cli` package. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-ctx-after-this-request.markdown b/content/pages/examples/flask/flask-ctx-after-this-request.markdown index d662d8a8c..636546cb0 100644 --- a/content/pages/examples/flask/flask-ctx-after-this-request.markdown +++ b/content/pages/examples/flask/flask-ctx-after-this-request.markdown @@ -14,6 +14,10 @@ descriptive of what it does and it particularly useful for modifying response objects, especially when you want a function other than the view function to modify a response. +has_app_context +and +has_request_context +are a couple of other callables within the `flask.ctx` package that also have code examples. ## Example 1 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) diff --git a/content/pages/examples/flask/flask-ctx-has-app-context.markdown b/content/pages/examples/flask/flask-ctx-has-app-context.markdown index ef7e5208a..4742fb9f9 100644 --- a/content/pages/examples/flask/flask-ctx-has-app-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-app-context.markdown @@ -14,6 +14,10 @@ but for the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/) rather than the request. +after_this_request +and +has_request_context +are a couple of other callables within the `flask.ctx` package that also have code examples. ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an diff --git a/content/pages/examples/flask/flask-ctx-has-request-context.markdown b/content/pages/examples/flask/flask-ctx-has-request-context.markdown index d88ba4585..b639f67eb 100644 --- a/content/pages/examples/flask/flask-ctx-has-request-context.markdown +++ b/content/pages/examples/flask/flask-ctx-has-request-context.markdown @@ -17,6 +17,10 @@ function as well that works for the [application context](https://flask.palletsprojects.com/en/1.1.x/appcontext/). +after_this_request +and +has_app_context +are a couple of other callables within the `flask.ctx` package that also have code examples. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-globals-current-app.markdown b/content/pages/examples/flask/flask-globals-current-app.markdown index 6f7ad9d1d..6e9dd327b 100644 --- a/content/pages/examples/flask/flask-globals-current-app.markdown +++ b/content/pages/examples/flask/flask-globals-current-app.markdown @@ -19,8 +19,78 @@ You will often see `current_app` imported directly from `flask` instead of `flask.globals`. These imports are equivalent because `flask` is simply importing `current_app` from `flask.globals`. +g, +request, +and session +are several other callables with code examples from the same `flask.globals` package. + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / migrations / env.py**](https://github.com/CTFd/CTFd/blob/master/./migrations/env.py) -## Example 1 from Flask AppBuilder +```python +# env.py +from __future__ import with_statement + +import logging +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +config = context.config + +fileConfig(config.config_file_name, disable_existing_loggers=False) +logger = logging.getLogger("alembic.env") + +~~from flask import current_app + +config.set_main_option( + "sqlalchemy.url", + str(current_app.extensions["migrate"].db.engine.url).replace("%", "%%"), +) +~~target_metadata = current_app.extensions["migrate"].db.metadata + + + +def run_migrations_offline(): + url = config.get_main_option("sqlalchemy.url") + context.configure(url=url, target_metadata=target_metadata, literal_binds=True) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, "autogenerate", False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info("No changes in schema detected.") + + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + + +## ... source file continues with no further current_app examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -164,7 +234,7 @@ class MenuApiManager(BaseManager): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -307,7 +377,7 @@ class ForgotPassword(MethodView): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -414,7 +484,7 @@ class User(UserMixin, db.Model): ``` -## Example 4 from flask-bookshelf +## Example 5 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -519,7 +589,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 5 from Flask-Bootstrap +## Example 6 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -643,7 +713,7 @@ class Bootstrap(object): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -791,7 +861,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 7 from flask_jsondash +## Example 8 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -884,7 +954,7 @@ def local_static(chart_config, static_config): ``` -## Example 8 from flask-login +## Example 9 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1131,7 +1201,7 @@ def _secret_key(key=None): ``` -## Example 9 from flask-restx +## Example 10 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1388,7 +1458,7 @@ def _clean_header(header): ``` -## Example 10 from flask-sqlalchemy +## Example 11 from flask-sqlalchemy [flask-sqlalchemy](https://github.com/pallets/flask-sqlalchemy) ([project documentation](https://flask-sqlalchemy.palletsprojects.com/en/2.x/) and @@ -1505,7 +1575,7 @@ def _make_table(db): ``` -## Example 11 from Flask-WTF +## Example 12 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -1762,7 +1832,7 @@ def same_origin(current_uri, compare_uri): ``` -## Example 12 from Flask-Security-Too +## Example 13 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2023,7 +2093,7 @@ _default_config = { ``` -## Example 13 from Flask-User +## Example 14 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2130,7 +2200,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 14 from Flask-VueJs-Template +## Example 15 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2171,7 +2241,7 @@ def index_client(): ``` -## Example 15 from Flasky +## Example 16 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -2226,7 +2296,7 @@ def run_migrations_online(): ``` -## Example 16 from indico +## Example 17 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2287,7 +2357,7 @@ def run_migrations_offline(): ``` -## Example 17 from sandman2 +## Example 18 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -2412,7 +2482,7 @@ def register_model(cls, admin=None): ``` -## Example 18 from tedivms-flask +## Example 19 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own diff --git a/content/pages/examples/flask/flask-globals-g.markdown b/content/pages/examples/flask/flask-globals-g.markdown index 0d5cd4002..c14142844 100644 --- a/content/pages/examples/flask/flask-globals-g.markdown +++ b/content/pages/examples/flask/flask-globals-g.markdown @@ -15,6 +15,10 @@ of a running [Flask](/flask.html) web app. `g` can also be imported directly from the `flask` module instead of `flask.globals`, so you will often see that shortcut in example code. +current_app, +request, +and session +are several other callables with code examples from the same `flask.globals` package. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-globals-request.markdown b/content/pages/examples/flask/flask-globals-request.markdown index 0fb1acf7e..97cf9cda4 100644 --- a/content/pages/examples/flask/flask-globals-request.markdown +++ b/content/pages/examples/flask/flask-globals-request.markdown @@ -20,6 +20,10 @@ from `flask.globals`, even though it is defined within the `globals` module. It's the same import, just less characters to type when you import it from `flask`. +current_app, +g, +and session +are several other callables with code examples from the same `flask.globals` package. ## Example 1 from Braintree Flask app [Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) @@ -111,7 +115,100 @@ if __name__ == '__main__': ``` -## Example 2 from Flask AppBuilder +## Example 2 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / test_themes.py**](https://github.com/CTFd/CTFd/blob/master/./tests/test_themes.py) + +```python +# test_themes.py + +~~from flask import request +from jinja2.sandbox import SecurityError +from werkzeug.test import Client + +from CTFd.utils import get_config +from tests.helpers import create_ctfd, destroy_ctfd, gen_user, login_as_user + + +def test_themes_run_in_sandbox(): + app = create_ctfd() + with app.app_context(): + try: + app.jinja_env.from_string( + "{{ ().__class__.__bases__[0].__subclasses__()[40]('./test_utils.py').read() }}" + ).render() + except SecurityError: + pass + except Exception as e: + raise e + destroy_ctfd(app) + + +def test_themes_cant_access_configpy_attributes(): + app = create_ctfd() + with app.app_context(): + + +## ... source file abbreviated to get to request examples ... + + + r = client.post("/setup", data=data) + assert r.status_code == 302 + assert r.location == "http://localhost/ctf/" + + c = Client(app) + app_iter, status, headers = c.get("/") + headers = dict(headers) + assert status == "302 FOUND" + assert headers["Location"] == "http://localhost/ctf/" + + r = client.get("/challenges") + assert r.status_code == 200 + assert "Challenges" in r.get_data(as_text=True) + + r = client.get("/scoreboard") + assert r.status_code == 200 + assert "Scoreboard" in r.get_data(as_text=True) + destroy_ctfd(app) + + +def test_that_request_path_hijacking_works_properly(): + app = create_ctfd(setup=False, application_root="/ctf") + assert app.request_class.__name__ == "CTFdRequest" + with app.app_context(): + with app.test_request_context("/challenges"): +~~ assert request.path == "/ctf/challenges" + destroy_ctfd(app) + + app = create_ctfd() + assert app.request_class.__name__ == "CTFdRequest" + with app.app_context(): + with app.test_request_context("/challenges"): +~~ assert request.path == "/challenges" + + from flask import Flask + + test_app = Flask("test") + assert test_app.request_class.__name__ == "Request" + with test_app.test_request_context("/challenges"): +~~ assert request.path == "/challenges" + destroy_ctfd(app) + + + +## ... source file continues with no further request examples... + +``` + + +## Example 3 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -209,7 +306,7 @@ def get_filter_args(filters): ``` -## Example 3 from FlaskBB +## Example 4 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -812,7 +909,7 @@ class DeleteReport(MethodView): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -893,7 +990,7 @@ def register_extensions(app): ``` -## Example 5 from flask-bookshelf +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -952,7 +1049,7 @@ def create_author(): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -1099,7 +1196,7 @@ def replace_insensitive(string, target, replacement): ``` -## Example 7 from flaskex +## Example 8 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -1194,7 +1291,7 @@ if __name__ == "__main__": ``` -## Example 8 from Flask-HTTPAuth +## Example 9 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -1515,7 +1612,7 @@ class MultiAuth(object): ``` -## Example 9 from flask-login +## Example 10 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -1752,7 +1849,7 @@ def _secret_key(key=None): ``` -## Example 10 from flask-restx +## Example 11 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -1860,7 +1957,7 @@ class marshal_with_field(object): ``` -## Example 11 from Flask-WTF +## Example 12 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -2018,7 +2115,7 @@ def generate_csrf(secret_key=None, token_key=None): ``` -## Example 12 from flaskSaaS +## Example 13 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -2069,7 +2166,7 @@ admin.add_view(FileAdmin(path, '/static/', name='Static')) ``` -## Example 13 from Flask-Security-Too +## Example 14 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -2289,7 +2386,7 @@ class ChangePasswordForm(Form, PasswordFormMixin): ``` -## Example 14 from Flask-SocketIO +## Example 15 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -2513,7 +2610,7 @@ class TestSocketIO(unittest.TestCase): ``` -## Example 15 from Flask-User +## Example 16 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -2577,7 +2674,7 @@ def init_translations(babel): ``` -## Example 16 from Flask-VueJs-Template +## Example 17 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that @@ -2612,7 +2709,7 @@ def require_auth(func): ``` -## Example 17 from indico +## Example 18 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -2701,7 +2798,7 @@ multipass = IndicoMultipass() ``` -## Example 18 from keras-flask-deploy-webapp +## Example 19 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -2794,7 +2891,7 @@ if __name__ == '__main__': ``` -## Example 19 from newspie +## Example 20 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -2975,7 +3072,7 @@ if __name__ == '__main__': ``` -## Example 20 from sandman2 +## Example 21 from sandman2 [sandman2](https://github.com/jeffknupp/sandman2) ([project documentation](https://sandman2.readthedocs.io/en/latest/) and @@ -3176,7 +3273,7 @@ class Service(MethodView): ``` -## Example 21 from Science Flask +## Example 22 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -3283,7 +3380,7 @@ def security_context_processor(): ``` -## Example 22 from tedivms-flask +## Example 23 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -3341,7 +3438,7 @@ def roles_accepted_api(*role_names): ``` -## Example 23 from trape +## Example 24 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-globals-session.markdown b/content/pages/examples/flask/flask-globals-session.markdown index 6960f013f..9f8ee050c 100644 --- a/content/pages/examples/flask/flask-globals-session.markdown +++ b/content/pages/examples/flask/flask-globals-session.markdown @@ -20,8 +20,117 @@ from `flask.globals`, even though it is defined within the `globals` module. It's the same function that is imported, but it's less characters to type when you leave off the `.globals` part. +current_app, +g, +and request +are several other callables with code examples from the same `flask.globals` package. + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / auth.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/auth.py) -## Example 1 from Flask AppBuilder +```python +# auth.py +import base64 + +import requests +from flask import Blueprint +from flask import current_app as app +~~from flask import redirect, render_template, request, session, url_for +from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired + +from CTFd.cache import clear_team_session, clear_user_session +from CTFd.models import Teams, Users, db +from CTFd.utils import config, email, get_app_config, get_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_teams_mode +from CTFd.utils.config.integrations import mlc_registration +from CTFd.utils.config.visibility import registration_visible +from CTFd.utils.crypto import verify_password +from CTFd.utils.decorators import ratelimit +from CTFd.utils.decorators.visibility import check_registration_visibility +from CTFd.utils.helpers import error_for, get_errors, markup +from CTFd.utils.logging import log +from CTFd.utils.modes import TEAMS_MODE +from CTFd.utils.security.auth import login_user, logout_user +from CTFd.utils.security.signing import unserialize +from CTFd.utils.validators import ValidationError + +auth = Blueprint("auth", __name__) + + +@auth.route("/confirm", methods=["POST", "GET"]) + + +## ... source file abbreviated to get to session examples ... + + + log("registrations", "[{date}] {ip} - {name} registered with {email}") + db.session.close() + + if is_teams_mode(): + return redirect(url_for("teams.private")) + + return redirect(url_for("challenges.listing")) + else: + return render_template("register.html", errors=errors) + + +@auth.route("/login", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=5) +def login(): + errors = get_errors() + if request.method == "POST": + name = request.form["name"] + + if validators.validate_email(name) is True: + user = Users.query.filter_by(email=name).first() + else: + user = Users.query.filter_by(name=name).first() + + if user: + if user and verify_password(request.form["password"], user.password): +~~ session.regenerate() + + login_user(user) + log("logins", "[{date}] {ip} - {name} logged in") + + db.session.close() + if request.args.get("next") and validators.is_safe_url( + request.args.get("next") + ): + return redirect(request.args.get("next")) + return redirect(url_for("challenges.listing")) + + else: + log("logins", "[{date}] {ip} - submitted invalid password for {name}") + errors.append("Your username or password is incorrect") + db.session.close() + return render_template("login.html", errors=errors) + else: + log("logins", "[{date}] {ip} - submitted invalid account information") + errors.append("Your username or password is incorrect") + db.session.close() + return render_template("login.html", errors=errors) + else: + db.session.close() + return render_template("login.html", errors=errors) + + +## ... source file continues with no further session examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -129,7 +238,7 @@ class RegisterUserOIDView(BaseRegisterUser): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -237,7 +346,7 @@ def do_topic_action(topics, user, action, reverse): # noqa: C901 ``` -## Example 3 from flaskex +## Example 4 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -332,7 +441,7 @@ if __name__ == "__main__": ``` -## Example 4 from Flask-HTTPAuth +## Example 5 from Flask-HTTPAuth [Flask-HTTPAuth](https://github.com/miguelgrinberg/Flask-HTTPAuth) ([documentation](https://flask-httpauth.readthedocs.io/en/latest/) and @@ -450,7 +559,7 @@ class HTTPDigestAuth(HTTPAuth): ``` -## Example 5 from flask-login +## Example 6 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -607,7 +716,7 @@ def login_required(func): ``` -## Example 6 from Flask-WTF +## Example 7 from Flask-WTF [Flask-WTF](https://github.com/lepture/flask-wtf) ([project documentation](https://flask-wtf.readthedocs.io/en/stable/) and @@ -718,7 +827,7 @@ def _get_config( ``` -## Example 7 from flaskSaaS +## Example 8 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -790,7 +899,7 @@ logger = wrap_logger( ``` -## Example 8 from Flask-Security-Too +## Example 9 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -876,7 +985,7 @@ def tf_send_security_token(user, method, totp_secret, phone_number): ``` -## Example 9 from Flask-SocketIO +## Example 10 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -972,7 +1081,7 @@ if __name__ == '__main__': ``` -## Example 10 from Flask-User +## Example 11 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1080,7 +1189,7 @@ class UserManager(UserManager__Settings, UserManager__Utils, UserManager__Views) ``` -## Example 11 from indico +## Example 12 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1198,7 +1307,7 @@ def sentry_log_exception(): ``` -## Example 12 from tedivms-flask +## Example 13 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -1315,7 +1424,7 @@ def init_error_handlers(app): ``` -## Example 13 from trape +## Example 14 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-helpers-flash.markdown b/content/pages/examples/flask/flask-helpers-flash.markdown index e8a047b3b..0adf66d40 100644 --- a/content/pages/examples/flask/flask-helpers-flash.markdown +++ b/content/pages/examples/flask/flask-helpers-flash.markdown @@ -16,6 +16,12 @@ following request can access it in a template by using the `flash` can also be imported directly from the `flask` module instead of `flask.helpers` so you will often see that shortcut in example code. +get_root_path, +make_response, +safe_join, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. ## Example 1 from Braintree Flask app [Braintree's Flask example payments app](https://github.com/braintree/braintree_flask_example) diff --git a/content/pages/examples/flask/flask-helpers-get-root-path.markdown b/content/pages/examples/flask/flask-helpers-get-root-path.markdown index ca4551848..0284ba378 100644 --- a/content/pages/examples/flask/flask-helpers-get-root-path.markdown +++ b/content/pages/examples/flask/flask-helpers-get-root-path.markdown @@ -12,6 +12,12 @@ is a function within the `flask.helpers` module of the [Flask](/flask.html) framework. `get_root_path` returns the filesystem path to a package or the current working directly if the path cannot be found. +flash, +make_response, +safe_join, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. ## Example 1 from indico [indico](https://github.com/indico/indico) diff --git a/content/pages/examples/flask/flask-helpers-make-response.markdown b/content/pages/examples/flask/flask-helpers-make-response.markdown index bb62836a4..2dc887a82 100644 --- a/content/pages/examples/flask/flask-helpers-make-response.markdown +++ b/content/pages/examples/flask/flask-helpers-make-response.markdown @@ -19,6 +19,12 @@ problem. instead of `flask.helpers` so you will typically see that shortcut in example code. +flash, +get_root_path, +safe_join, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-helpers-safe-join.markdown b/content/pages/examples/flask/flask-helpers-safe-join.markdown new file mode 100644 index 000000000..7959e05d2 --- /dev/null +++ b/content/pages/examples/flask/flask-helpers-safe-join.markdown @@ -0,0 +1,103 @@ +title: flask.helpers safe_join Example Code +category: page +slug: flask-helpers-safe-join-examples +sortorder: 500021021 +toc: False +sidebartitle: flask.helpers safe_join +meta: Python example code that shows how to use the safe_join callable from the flask.helpers module of the Flask project. + + +`safe_join` is a callable within the `flask.helpers` module of the Flask project. + +flash, +get_root_path, +make_response, +send_file, +and url_for +are several other callables with code examples from the same `flask.helpers` package. + +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / views.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/views.py) + +```python +# views.py +import os + +from flask import Blueprint, abort +from flask import current_app as app +from flask import redirect, render_template, request, send_file, session, url_for +~~from flask.helpers import safe_join +from sqlalchemy.exc import IntegrityError + +from CTFd.cache import cache +from CTFd.constants.config import ( + AccountVisibilityTypes, + ChallengeVisibilityTypes, + ConfigTypes, + RegistrationVisibilityTypes, + ScoreVisibilityTypes, +) +from CTFd.models import ( + Admins, + Files, + Notifications, + Pages, + Teams, + Users, + UserTokens, + db, +) +from CTFd.utils import config, get_config, set_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_setup + + +## ... source file abbreviated to get to safe_join examples ... + + + abort(403) + else: + abort(403) + + if team: + if team.banned: + abort(403) + else: + pass + + if file_id != f.id: + abort(403) + + except (BadTimeSignature, SignatureExpired, BadSignature): + abort(403) + + uploader = get_uploader() + try: + return uploader.download(f.location) + except IOError: + abort(404) + + +@views.route("/themes//static/") +def themes(theme, path): +~~ filename = safe_join(app.root_path, "themes", theme, "static", path) + if os.path.isfile(filename): + return send_file(filename) + else: + abort(404) + + + +## ... source file continues with no further safe_join examples... + +``` + diff --git a/content/pages/examples/flask/flask-helpers-send-file.markdown b/content/pages/examples/flask/flask-helpers-send-file.markdown index e707fb77d..3ae76de0e 100644 --- a/content/pages/examples/flask/flask-helpers-send-file.markdown +++ b/content/pages/examples/flask/flask-helpers-send-file.markdown @@ -1,7 +1,7 @@ title: flask.helpers send_file Example Code category: page slug: flask-helpers-send-file-examples -sortorder: 500021021 +sortorder: 500021022 toc: False sidebartitle: flask.helpers send_file meta: Python example code that shows how to use the send_file callable from the flask.helpers module of the Flask project. @@ -19,8 +19,97 @@ from `flask.helpers`, even though it is defined within the `helpers` module. It's the same function that is imported, but it's less characters to type when you leave off the `.helpers` part. +flash, +get_root_path, +make_response, +safe_join, +and url_for +are several other callables with code examples from the same `flask.helpers` package. -## Example 1 from Flask-VueJs-Template +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / views.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/views.py) + +```python +# views.py +import os + +from flask import Blueprint, abort +from flask import current_app as app +~~from flask import redirect, render_template, request, send_file, session, url_for +from flask.helpers import safe_join +from sqlalchemy.exc import IntegrityError + +from CTFd.cache import cache +from CTFd.constants.config import ( + AccountVisibilityTypes, + ChallengeVisibilityTypes, + ConfigTypes, + RegistrationVisibilityTypes, + ScoreVisibilityTypes, +) +from CTFd.models import ( + Admins, + Files, + Notifications, + Pages, + Teams, + Users, + UserTokens, + db, +) +from CTFd.utils import config, get_config, set_config +from CTFd.utils import user as current_user +from CTFd.utils import validators + + +## ... source file abbreviated to get to send_file examples ... + + + abort(403) + + if team: + if team.banned: + abort(403) + else: + pass + + if file_id != f.id: + abort(403) + + except (BadTimeSignature, SignatureExpired, BadSignature): + abort(403) + + uploader = get_uploader() + try: + return uploader.download(f.location) + except IOError: + abort(404) + + +@views.route("/themes//static/") +def themes(theme, path): + filename = safe_join(app.root_path, "themes", theme, "static", path) + if os.path.isfile(filename): +~~ return send_file(filename) + else: + abort(404) + + + +## ... source file continues with no further send_file examples... + +``` + + +## Example 2 from Flask-VueJs-Template [Flask-VueJs-Template](https://github.com/gtalarico/flask-vuejs-template) ([demo site](https://flask-vuejs-template.herokuapp.com/)) is a minimal [Flask](/flask.html) boilerplate starter project that diff --git a/content/pages/examples/flask/flask-helpers-url-for.markdown b/content/pages/examples/flask/flask-helpers-url-for.markdown index 21472d8dc..92e4fa985 100644 --- a/content/pages/examples/flask/flask-helpers-url-for.markdown +++ b/content/pages/examples/flask/flask-helpers-url-for.markdown @@ -1,7 +1,7 @@ title: flask.helpers url_for Example Code category: page slug: flask-helpers-url-for-examples -sortorder: 500021022 +sortorder: 500021023 toc: False sidebartitle: flask.helpers url_for meta: Python example code that shows how to use the url_for callable from the flask.helpers module of the Flask project. @@ -17,8 +17,186 @@ from `flask.helpers`, even though it is defined within the `helpers` module. It is the same function that is imported, but it's less characters to type when you leave off the `.helpers` part. +flash, +get_root_path, +make_response, +safe_join, +and send_file +are several other callables with code examples from the same `flask.helpers` package. -## Example 1 from Flask AppBuilder +## Example 1 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / tests / test_views.py**](https://github.com/CTFd/CTFd/blob/master/./tests/test_views.py) + +```python +# test_views.py + +import os + +~~from flask import url_for +from freezegun import freeze_time + +from CTFd.cache import clear_pages +from CTFd.utils import set_config +from CTFd.utils.config.pages import get_pages +from CTFd.utils.encoding import hexencode +from tests.helpers import ( + create_ctfd, + destroy_ctfd, + gen_challenge, + gen_file, + gen_page, + login_as_user, + register_user, +) + + +def test_index(): + app = create_ctfd() + with app.app_context(): + with app.test_client() as client: + r = client.get("/") + assert r.status_code == 200 + destroy_ctfd(app) + + +## ... source file abbreviated to get to url_for examples ... + + + register_user(app) + client = login_as_user(app) + r = client.get("/profile") + assert r.status_code == 200 + destroy_ctfd(app) + + +def test_user_can_access_files(): + app = create_ctfd() + with app.app_context(): + from CTFd.utils.uploads import rmdir + + chal = gen_challenge(app.db) + chal_id = chal.id + path = app.config.get("UPLOAD_FOLDER") + + location = os.path.join(path, "test_file_path", "test.txt") + directory = os.path.dirname(location) + model_path = os.path.join("test_file_path", "test.txt") + + try: + os.makedirs(directory) + with open(location, "wb") as obj: + obj.write("testing file load".encode()) + gen_file(app.db, location=model_path, challenge_id=chal_id) +~~ url = url_for("views.files", path=model_path) + + set_config("challenge_visibility", "public") + with app.test_client() as client: + r = client.get(url) + + assert r.status_code == 200 + assert r.get_data(as_text=True) == "testing file load" + + set_config("challenge_visibility", "private") + with app.test_client() as client: + r = client.get(url) + + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + register_user(app) + client = login_as_user(app) + r = client.get(url) + assert r.status_code == 200 + assert r.get_data(as_text=True) == "testing file load" + + with freeze_time("2017-10-5"): + set_config("start", "1507262400") + for v in ("public", "private"): + + +## ... source file abbreviated to get to url_for examples ... + + + finally: + rmdir(directory) + destroy_ctfd(app) + + +def test_user_can_access_files_with_auth_token(): + app = create_ctfd() + with app.app_context(): + from CTFd.utils.uploads import rmdir + + chal = gen_challenge(app.db) + chal_id = chal.id + path = app.config.get("UPLOAD_FOLDER") + + md5hash = hexencode(os.urandom(16)) + + location = os.path.join(path, md5hash, "test.txt") + directory = os.path.dirname(location) + model_path = os.path.join(md5hash, "test.txt") + + try: + os.makedirs(directory) + with open(location, "wb") as obj: + obj.write("testing file load".encode()) + gen_file(app.db, location=model_path, challenge_id=chal_id) +~~ url = url_for("views.files", path=model_path) + + register_user(app) + with login_as_user(app) as client: + req = client.get("/api/v1/challenges/1") + data = req.get_json() + file_url = data["data"]["files"][0] + + with app.test_client() as client: + r = client.get(url) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + r = client.get( +~~ url_for( + "views.files", + path=model_path, + token="random_token_that_shouldnt_work", + ) + ) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + r = client.get(file_url) + assert r.status_code == 200 + assert r.get_data(as_text=True) == "testing file load" + + set_config("challenge_visibility", "admins") + r = client.get(file_url) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + set_config("challenge_visibility", "private") + + with freeze_time("2017-10-5"): + set_config("start", "1507262400") + + r = client.get(file_url) + assert r.status_code == 403 + assert r.get_data(as_text=True) != "testing file load" + + +## ... source file continues with no further url_for examples... + +``` + + +## Example 2 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) ([documentation](https://flask-appbuilder.readthedocs.io/en/latest/) and @@ -94,7 +272,7 @@ class Menu(object): ``` -## Example 2 from FlaskBB +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -162,7 +340,7 @@ class FlaskBBRenderer(mistune.Renderer): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -233,7 +411,7 @@ class CustomSelectField(Field): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -264,7 +442,7 @@ def url_for_other_page(**kwargs): ``` -## Example 5 from Flask-Bootstrap +## Example 6 from Flask-Bootstrap [flask-bootstrap](https://github.com/mbr/flask-bootstrap) ([PyPI package information](https://pypi.org/project/Flask-Bootstrap/)) makes it easier to use the [Bootstrap CSS framework](/bootstrap-css.html) @@ -354,7 +532,7 @@ class ConditionalCDN(object): ``` -## Example 6 from flask-debugtoolbar +## Example 7 from flask-debugtoolbar [Flask Debug-toolbar](https://github.com/flask-debugtoolbar/flask-debugtoolbar) ([documentation](https://flask-debugtoolbar.readthedocs.io/en/latest/) and @@ -421,7 +599,7 @@ class DebugToolbar(object): ``` -## Example 7 from flask-login +## Example 8 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) ([project documentation](https://flask-login.readthedocs.io/en/latest/) and [PyPI package](https://pypi.org/project/Flask-Login/)) @@ -521,7 +699,7 @@ def login_user(user, remember=False, duration=None, force=False, fresh=True): ``` -## Example 8 from flask-restx +## Example 9 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -576,7 +754,7 @@ def ui_for(api): ``` -## Example 9 from flaskSaaS +## Example 10 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -717,7 +895,7 @@ def reset(token): ``` -## Example 10 from Flask-Security-Too +## Example 11 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -837,7 +1015,7 @@ def get_post_action_redirect(config_key, declared=None): ``` -## Example 11 from Flask-User +## Example 12 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -986,7 +1164,7 @@ class EmailManager(object): ``` -## Example 12 from Flasky +## Example 13 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1186,7 +1364,7 @@ db.event.listen(Comment.body, 'set', Comment.on_changed_body) ``` -## Example 13 from Datadog Flask Example App +## Example 14 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). diff --git a/content/pages/examples/flask/flask-json-jsonencoder.markdown b/content/pages/examples/flask/flask-json-jsonencoder.markdown index 96cf91c66..fd4d8ce5d 100644 --- a/content/pages/examples/flask/flask-json-jsonencoder.markdown +++ b/content/pages/examples/flask/flask-json-jsonencoder.markdown @@ -1,7 +1,7 @@ title: flask.json JSONEncoder Example Code category: page slug: flask-json-jsonencoder-examples -sortorder: 500021023 +sortorder: 500021024 toc: False sidebartitle: flask.json JSONEncoder meta: Example code for understanding how to use the JSONEncoder class from the flask.json module of the Flask project. @@ -14,6 +14,8 @@ encoder for Flask and was designed to handle more types than Python's standard library [json](https://docs.python.org/3/library/json.html) module. +jsonify +is another callable from the `flask.json` package with code examples. ## Example 1 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) diff --git a/content/pages/examples/flask/flask-json-jsonify.markdown b/content/pages/examples/flask/flask-json-jsonify.markdown index 7d782befc..53923a951 100644 --- a/content/pages/examples/flask/flask-json-jsonify.markdown +++ b/content/pages/examples/flask/flask-json-jsonify.markdown @@ -1,7 +1,7 @@ title: flask.json jsonify Example Code category: page slug: flask-json-jsonify-examples -sortorder: 500021024 +sortorder: 500021025 toc: False sidebartitle: flask.json jsonify meta: Python example code that shows how to use the jsonify callable from the flask.json module of the Flask project. @@ -19,6 +19,8 @@ Note that `jsonify` is sometimes imported directly from the `flask` module instead of from `flask.json`. It is the same function that is imported, but there are less characters to type when you leave off the `.json` part. +JSONEncoder +is another callable from the `flask.json` package with code examples. ## Example 1 from Flask AppBuilder [Flask-AppBuilder](https://github.com/dpgaspar/Flask-AppBuilder) diff --git a/content/pages/examples/flask/flask-sessions-badsignature.markdown b/content/pages/examples/flask/flask-sessions-badsignature.markdown index 7e01300e1..4428d6b6e 100644 --- a/content/pages/examples/flask/flask-sessions-badsignature.markdown +++ b/content/pages/examples/flask/flask-sessions-badsignature.markdown @@ -1,7 +1,7 @@ title: flask.sessions BadSignature Example Code category: page slug: flask-sessions-badsignature-examples -sortorder: 500021025 +sortorder: 500021026 toc: False sidebartitle: flask.sessions BadSignature meta: Example code for understanding how to use the BadSignature class from the flask.sessions module of the Flask project. @@ -13,6 +13,10 @@ the `flask.sessions` module. `BadSignature` is actually defined in the [itsdangerous](https://github.com/pallets/itsdangerous) project and imported into Flask sessions for applications to use. +SessionInterface +and +SessionMixin +are a couple of other callables within the `flask.sessions` package that also have code examples. ## Example 1 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) diff --git a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown index 9ba9138fd..757772a3d 100644 --- a/content/pages/examples/flask/flask-sessions-sessioninterface.markdown +++ b/content/pages/examples/flask/flask-sessions-sessioninterface.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionInterface Example Code category: page slug: flask-sessions-sessioninterface-examples -sortorder: 500021026 +sortorder: 500021027 toc: False sidebartitle: flask.sessions SessionInterface meta: Example code for understanding how to use the SessionInterface class from the flask.sessions module of the Flask project. @@ -12,6 +12,10 @@ is a class used with [Flask](/flask.html) projects that is defined in the `flask.sessions` module. `SessionInterface` is the basic interface that must be implemented to replace the default session interface. +BadSignature +and +SessionMixin +are a couple of other callables within the `flask.sessions` package that also have code examples. ## Example 1 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a diff --git a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown index 8cc0cafcd..57ac14477 100644 --- a/content/pages/examples/flask/flask-sessions-sessionmixin.markdown +++ b/content/pages/examples/flask/flask-sessions-sessionmixin.markdown @@ -1,7 +1,7 @@ title: flask.sessions SessionMixin Example Code category: page slug: flask-sessions-sessionmixin-examples -sortorder: 500021027 +sortorder: 500021028 toc: False sidebartitle: flask.sessions SessionMixin meta: Example code for understanding how to use the SessionMixin class from the flask.sessions module of the Flask project. @@ -14,6 +14,10 @@ the `flask.sessions` module. `SessionMixin` expands a standard with [session](https://flask.palletsprojects.com/en/1.1.x/quickstart/#sessions) attributes. +BadSignature +and +SessionInterface +are a couple of other callables within the `flask.sessions` package that also have code examples. ## Example 1 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) diff --git a/content/pages/examples/flask/flask-signals-got-request-exception.markdown b/content/pages/examples/flask/flask-signals-got-request-exception.markdown index 64bfb260a..4484cce5a 100644 --- a/content/pages/examples/flask/flask-signals-got-request-exception.markdown +++ b/content/pages/examples/flask/flask-signals-got-request-exception.markdown @@ -1,7 +1,7 @@ title: flask.signals got_request_exception Example Code category: page slug: flask-signals-got-request-exception-examples -sortorder: 500021029 +sortorder: 500021030 toc: False sidebartitle: flask.signals got_request_exception meta: Python example code that shows how to use the got_request_exception callable from the flask.signals module of the Flask project. @@ -13,6 +13,8 @@ is a signal defined in the [Flask](/flask.html) project's issue with the HTTP request. It can also be thrown by your own view functions if there is an error and you want to raise it via a signal. +Namespace +is another callable from the `flask.signals` package with code examples. ## Example 1 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an diff --git a/content/pages/examples/flask/flask-signals-namespace.markdown b/content/pages/examples/flask/flask-signals-namespace.markdown index f2d968994..4faeecf05 100644 --- a/content/pages/examples/flask/flask-signals-namespace.markdown +++ b/content/pages/examples/flask/flask-signals-namespace.markdown @@ -1,7 +1,7 @@ title: flask.signals Namespace Example Code category: page slug: flask-signals-namespace-examples -sortorder: 500021028 +sortorder: 500021029 toc: False sidebartitle: flask.signals Namespace meta: Example code for understanding how to use the Namespace class from the flask.signals module of the Flask project. @@ -18,6 +18,8 @@ implementing its own event subscription signaling model. as a mapping of signal names to signals, and it serves the same purpose in the Flask project. +got_request_exception +is another callable from the `flask.signals` package with code examples. ## Example 1 from flask-login [Flask-Login](https://github.com/maxcountryman/flask-login) diff --git a/content/pages/examples/flask/flask-templating-render-template-string.markdown b/content/pages/examples/flask/flask-templating-render-template-string.markdown index 7a3d30660..c785805cb 100644 --- a/content/pages/examples/flask/flask-templating-render-template-string.markdown +++ b/content/pages/examples/flask/flask-templating-render-template-string.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template_string Example Code category: page slug: flask-templating-render-template-string-examples -sortorder: 500021031 +sortorder: 500021032 toc: False sidebartitle: flask.templating render_template_string meta: Python example code that shows how to use the render_template_string callable from the flask.templating module of the Flask project. @@ -17,6 +17,8 @@ package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. +render_template +is another callable from the `flask.templating` package with code examples. These topics are also useful while reading the `render_template_string` examples: diff --git a/content/pages/examples/flask/flask-templating-render-template.markdown b/content/pages/examples/flask/flask-templating-render-template.markdown index 017dd6631..da6a6da1a 100644 --- a/content/pages/examples/flask/flask-templating-render-template.markdown +++ b/content/pages/examples/flask/flask-templating-render-template.markdown @@ -1,7 +1,7 @@ title: flask.templating render_template Example Code category: page slug: flask-templating-render-template-examples -sortorder: 500021030 +sortorder: 500021031 toc: False sidebartitle: flask.templating render_template meta: Python example code that shows how to use the render_template callable from the flask.templating module of the Flask project. @@ -18,8 +18,10 @@ package instead of from `flask.templating`. It is the same function that is imported, but there are less characters to type when you leave off the `.templating` part. +render_template_string +is another callable from the `flask.templating` package with code examples. -These subjects go along with the `render_template` code examples: +You should read up on these subjects along with these `render_template` examples: * [template engines](/template-engines.html), specifically [Jinja2](/jinja2.html) * [Flask](/flask.html) and the concepts for [web frameworks](/web-frameworks.html) @@ -117,7 +119,370 @@ if __name__ == '__main__': ``` -## Example 2 from FlaskBB +## Example 2 from CTFd +[CTFd](https://github.com/CTFd/CTFd) +([homepage](https://ctfd.io/)) is a +[capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) +built with [Flask](/flask.html). The application can be used +as-is to run CTF events, or modified for custom rules for related +scenarios. CTFd is open sourced under the +[Apache License 2.0](https://github.com/CTFd/CTFd/blob/master/LICENSE). + +[**CTFd / CTFd / auth.py**](https://github.com/CTFd/CTFd/blob/master/./CTFd/auth.py) + +```python +# auth.py +import base64 + +import requests +from flask import Blueprint +from flask import current_app as app +~~from flask import redirect, render_template, request, session, url_for +from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired + +from CTFd.cache import clear_team_session, clear_user_session +from CTFd.models import Teams, Users, db +from CTFd.utils import config, email, get_app_config, get_config +from CTFd.utils import user as current_user +from CTFd.utils import validators +from CTFd.utils.config import is_teams_mode +from CTFd.utils.config.integrations import mlc_registration +from CTFd.utils.config.visibility import registration_visible +from CTFd.utils.crypto import verify_password +from CTFd.utils.decorators import ratelimit +from CTFd.utils.decorators.visibility import check_registration_visibility +from CTFd.utils.helpers import error_for, get_errors, markup +from CTFd.utils.logging import log +from CTFd.utils.modes import TEAMS_MODE +from CTFd.utils.security.auth import login_user, logout_user +from CTFd.utils.security.signing import unserialize +from CTFd.utils.validators import ValidationError + +auth = Blueprint("auth", __name__) + + +@auth.route("/confirm", methods=["POST", "GET"]) +@auth.route("/confirm/", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=60) +def confirm(data=None): + if not get_config("verify_emails"): + return redirect(url_for("challenges.listing")) + + if data and request.method == "GET": + try: + user_email = unserialize(data, max_age=1800) + except (BadTimeSignature, SignatureExpired): +~~ return render_template( + "confirm.html", errors=["Your confirmation link has expired"] + ) + except (BadSignature, TypeError, base64.binascii.Error): +~~ return render_template( + "confirm.html", errors=["Your confirmation token is invalid"] + ) + + user = Users.query.filter_by(email=user_email).first_or_404() + if user.verified: + return redirect(url_for("views.settings")) + + user.verified = True + log( + "registrations", + format="[{date}] {ip} - successful confirmation for {name}", + name=user.name, + ) + db.session.commit() + clear_user_session(user_id=user.id) + email.successful_registration_notification(user.email) + db.session.close() + if current_user.authed(): + return redirect(url_for("challenges.listing")) + return redirect(url_for("auth.login")) + + if current_user.authed() is False: + return redirect(url_for("auth.login")) + + user = Users.query.filter_by(id=session["id"]).first_or_404() + if user.verified: + return redirect(url_for("views.settings")) + + if data is None: + if request.method == "POST": + email.verify_email_address(user.email) + log( + "registrations", + format="[{date}] {ip} - {name} initiated a confirmation email resend", + ) +~~ return render_template( + "confirm.html", infos=[f"Confirmation email sent to {user.email}!"] + ) + elif request.method == "GET": +~~ return render_template("confirm.html") + + +@auth.route("/reset_password", methods=["POST", "GET"]) +@auth.route("/reset_password/", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=60) +def reset_password(data=None): + if config.can_send_mail() is False: +~~ return render_template( + "reset_password.html", + errors=[ + markup( + "This CTF is not configured to send email.
    Please contact an organizer to have your password reset." + ) + ], + ) + + if data is not None: + try: + email_address = unserialize(data, max_age=1800) + except (BadTimeSignature, SignatureExpired): +~~ return render_template( + "reset_password.html", errors=["Your link has expired"] + ) + except (BadSignature, TypeError, base64.binascii.Error): +~~ return render_template( + "reset_password.html", errors=["Your reset token is invalid"] + ) + + if request.method == "GET": +~~ return render_template("reset_password.html", mode="set") + if request.method == "POST": + password = request.form.get("password", "").strip() + user = Users.query.filter_by(email=email_address).first_or_404() + if user.oauth_id: +~~ return render_template( + "reset_password.html", + infos=[ + "Your account was registered via an authentication provider and does not have an associated password. Please login via your authentication provider." + ], + ) + + pass_short = len(password) == 0 + if pass_short: +~~ return render_template( + "reset_password.html", errors=["Please pick a longer password"] + ) + + user.password = password + db.session.commit() + clear_user_session(user_id=user.id) + log( + "logins", + format="[{date}] {ip} - successful password reset for {name}", + name=user.name, + ) + db.session.close() + email.password_change_alert(user.email) + return redirect(url_for("auth.login")) + + if request.method == "POST": + email_address = request.form["email"].strip() + user = Users.query.filter_by(email=email_address).first() + + get_errors() + + if not user: +~~ return render_template( + "reset_password.html", + infos=[ + "If that account exists you will receive an email, please check your inbox" + ], + ) + + if user.oauth_id: +~~ return render_template( + "reset_password.html", + infos=[ + "The email address associated with this account was registered via an authentication provider and does not have an associated password. Please login via your authentication provider." + ], + ) + + email.forgot_password(email_address) + +~~ return render_template( + "reset_password.html", + infos=[ + "If that account exists you will receive an email, please check your inbox" + ], + ) +~~ return render_template("reset_password.html") + + +@auth.route("/register", methods=["POST", "GET"]) +@check_registration_visibility +@ratelimit(method="POST", limit=10, interval=5) +def register(): + errors = get_errors() + if request.method == "POST": + name = request.form.get("name", "").strip() + email_address = request.form.get("email", "").strip().lower() + password = request.form.get("password", "").strip() + + website = request.form.get("website") + affiliation = request.form.get("affiliation") + country = request.form.get("country") + + name_len = len(name) == 0 + names = Users.query.add_columns("name", "id").filter_by(name=name).first() + emails = ( + Users.query.add_columns("email", "id") + .filter_by(email=email_address) + .first() + ) + pass_short = len(password) == 0 + + +## ... source file abbreviated to get to render_template examples ... + + + errors.append( + "Only email addresses under {domains} may register".format( + domains=get_config("domain_whitelist") + ) + ) + if names: + errors.append("That user name is already taken") + if team_name_email_check is True: + errors.append("Your user name cannot be an email address") + if emails: + errors.append("That email has already been used") + if pass_short: + errors.append("Pick a longer password") + if pass_long: + errors.append("Pick a shorter password") + if name_len: + errors.append("Pick a longer user name") + if valid_website is False: + errors.append("Websites must be a proper URL starting with http or https") + if valid_country is False: + errors.append("Invalid country") + if valid_affiliation is False: + errors.append("Please provide a shorter affiliation") + + if len(errors) > 0: +~~ return render_template( + "register.html", + errors=errors, + name=request.form["name"], + email=request.form["email"], + password=request.form["password"], + ) + else: + with app.app_context(): + user = Users(name=name, email=email_address, password=password) + + if website: + user.website = website + if affiliation: + user.affiliation = affiliation + if country: + user.country = country + + db.session.add(user) + db.session.commit() + db.session.flush() + + login_user(user) + + if config.can_send_mail() and get_config( + "verify_emails" + ): # Confirming users is enabled and we can send email. + log( + "registrations", + format="[{date}] {ip} - {name} registered (UNCONFIRMED) with {email}", + ) + email.verify_email_address(user.email) + db.session.close() + return redirect(url_for("auth.confirm")) + else: # Don't care about confirming users + if ( + config.can_send_mail() + ): # We want to notify the user that they have registered. + email.successful_registration_notification(user.email) + + log("registrations", "[{date}] {ip} - {name} registered with {email}") + db.session.close() + + if is_teams_mode(): + return redirect(url_for("teams.private")) + + return redirect(url_for("challenges.listing")) + else: +~~ return render_template("register.html", errors=errors) + + +@auth.route("/login", methods=["POST", "GET"]) +@ratelimit(method="POST", limit=10, interval=5) +def login(): + errors = get_errors() + if request.method == "POST": + name = request.form["name"] + + if validators.validate_email(name) is True: + user = Users.query.filter_by(email=name).first() + else: + user = Users.query.filter_by(name=name).first() + + if user: + if user and verify_password(request.form["password"], user.password): + session.regenerate() + + login_user(user) + log("logins", "[{date}] {ip} - {name} logged in") + + db.session.close() + if request.args.get("next") and validators.is_safe_url( + request.args.get("next") + ): + return redirect(request.args.get("next")) + return redirect(url_for("challenges.listing")) + + else: + log("logins", "[{date}] {ip} - submitted invalid password for {name}") + errors.append("Your username or password is incorrect") + db.session.close() +~~ return render_template("login.html", errors=errors) + else: + log("logins", "[{date}] {ip} - submitted invalid account information") + errors.append("Your username or password is incorrect") + db.session.close() +~~ return render_template("login.html", errors=errors) + else: + db.session.close() +~~ return render_template("login.html", errors=errors) + + +@auth.route("/oauth") +def oauth_login(): + endpoint = ( + get_app_config("OAUTH_AUTHORIZATION_ENDPOINT") + or get_config("oauth_authorization_endpoint") + or "https://auth.majorleaguecyber.org/oauth/authorize" + ) + + if get_config("user_mode") == "teams": + scope = "profile team" + else: + scope = "profile" + + client_id = get_app_config("OAUTH_CLIENT_ID") or get_config("oauth_client_id") + + if client_id is None: + error_for( + endpoint="auth.login", + message="OAuth Settings not configured. " + "Ask your CTF administrator to configure MajorLeagueCyber integration.", + ) + return redirect(url_for("auth.login")) + + +## ... source file continues with no further render_template examples... + +``` + + +## Example 3 from FlaskBB [FlaskBB](https://github.com/flaskbb/flaskbb) ([project website](https://flaskbb.org/)) is a [Flask](/flask.html)-based forum web application. The web app allows users to chat in an open @@ -196,7 +561,7 @@ def send_email(subject, recipients, text_body, html_body, sender=None): ``` -## Example 3 from flask-base +## Example 4 from flask-base [flask-base](https://github.com/hack4impact/flask-base) ([project documentation](http://hack4impact.github.io/flask-base/)) provides boilerplate code for new [Flask](/flask.html) web apps. @@ -243,7 +608,7 @@ def send_email(recipient, subject, template, **kwargs): ``` -## Example 4 from flask-bones +## Example 5 from flask-bones [flask-bones](https://github.com/cburmeister/flask-bones) ([demo](http://flask-bones.herokuapp.com/)) is large scale [Flask](/flask.html) example application built @@ -350,7 +715,7 @@ def register_jinja_env(app): ``` -## Example 5 from flask-bookshelf +## Example 6 from flask-bookshelf [flask-bookshelf](https://github.com/damyanbogoev/flask-bookshelf) is the example [Flask](/flask.html) application that developers create when going through @@ -454,7 +819,7 @@ app.register_blueprint(admin, url_prefix="//admin") ``` -## Example 6 from flaskex +## Example 7 from flaskex [Flaskex](https://github.com/anfederico/Flaskex) is a working example [Flask](/flask.html) web application intended as a base to build your own applications upon. The application comes with pre-built sign up, log in @@ -549,7 +914,7 @@ if __name__ == "__main__": ``` -## Example 7 from flask_jsondash +## Example 8 from flask_jsondash [Flask JSONDash](https://github.com/christabor/flask_jsondash) is a configurable web application built in Flask that creates charts and dashboards from arbitrary API endpoints. Everything for the web app @@ -692,7 +1057,7 @@ def update(c_id): ``` -## Example 8 from flask-phone-input +## Example 9 from flask-phone-input [flask-phone-input](https://github.com/miguelgrinberg/flask-phone-input) is an example application that ties together the [intTellInput.js](https://github.com/jackocnr/intl-tel-input) @@ -750,7 +1115,7 @@ def show_phone(): ``` -## Example 9 from flask-restx +## Example 10 from flask-restx [Flask RESTX](https://github.com/python-restx/flask-restx) is an extension that makes it easier to build [RESTful APIs](/application-programming-interfaces.html) into @@ -805,7 +1170,7 @@ def ui_for(api): ``` -## Example 10 from flaskSaaS +## Example 11 from flaskSaaS [flaskSaas](https://github.com/alectrocute/flaskSaaS) is a boilerplate starter project to build a software-as-a-service (SaaS) web application in [Flask](/flask.html), with [Stripe](/stripe.html) for billing. The @@ -1008,7 +1373,7 @@ def paySuccess(): ``` -## Example 11 from Flask-Security-Too +## Example 12 from Flask-Security-Too [Flask-Security-Too](https://github.com/Flask-Middleware/flask-security/) ([PyPi page](https://pypi.org/project/Flask-Security-Too/) and [project documentation](https://flask-security-too.readthedocs.io/en/stable/)) @@ -1118,7 +1483,7 @@ from .forms import ( ``` -## Example 12 from Flask-SocketIO +## Example 13 from Flask-SocketIO [Flask-SocketIO](https://github.com/miguelgrinberg/Flask-SocketIO) ([PyPI package information](https://pypi.org/project/Flask-SocketIO/), [official tutorial](https://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent) @@ -1194,7 +1559,7 @@ def get_session(): ``` -## Example 13 from Flask-User +## Example 14 from Flask-User [Flask-User](https://github.com/lingthio/Flask-User) ([PyPI information](https://pypi.org/project/Flask-User/) and @@ -1286,7 +1651,7 @@ class EmailManager(object): ``` -## Example 14 from Flasky +## Example 15 from Flasky [Flasky](https://github.com/miguelgrinberg/flasky) is a wonderful example application by [Miguel Grinberg](https://github.com/miguelgrinberg) that he builds @@ -1326,7 +1691,7 @@ def send_email(to, subject, template, **kwargs): ``` -## Example 15 from Datadog Flask Example App +## Example 16 from Datadog Flask Example App The [Datadog Flask example app](https://github.com/DataDog/trace-examples/tree/master/python/flask) contains many examples of the [Flask](/flask.html) core functions available to a developer using the [web framework](/web-frameworks.html). @@ -1428,7 +1793,7 @@ app.url_map.add(Rule('/custom-endpoint/', endpoint='custom-endpoint')) ``` -## Example 16 from indico +## Example 17 from indico [indico](https://github.com/indico/indico) ([project website](https://getindico.io/), [documentation](https://docs.getindico.io/en/stable/installation/) @@ -1458,7 +1823,7 @@ class MathjaxMixin(object): ``` -## Example 17 from keras-flask-deploy-webapp +## Example 18 from keras-flask-deploy-webapp The [keras-flask-deploy-webapp](https://github.com/mtobeiyf/keras-flask-deploy-webapp) project combines the [Flask](/flask.html) [web framework](/web-frameworks.html) @@ -1549,7 +1914,7 @@ if __name__ == '__main__': ``` -## Example 18 from newspie +## Example 19 from newspie [NewsPie](https://github.com/skamieniarz/newspie) is a minimalistic news aggregator created with [Flask](/flask.html) and the [News API](https://newsapi.org/). @@ -1704,7 +2069,7 @@ if __name__ == '__main__': ``` -## Example 19 from Science Flask +## Example 20 from Science Flask [Science Flask](https://github.com/danielhomola/science_flask) is a [Flask](/flask.html)-powered web application for online scientific research tools. The project was built as a template @@ -1992,7 +2357,7 @@ def static_from_root(): ``` -## Example 20 from tedivms-flask +## Example 21 from tedivms-flask [tedivm's flask starter app](https://github.com/tedivm/tedivms-flask) is a base of [Flask](/flask.html) code and related projects such as [Celery](/celery.html) which provides a template to start your own @@ -2095,7 +2460,7 @@ def init_error_handlers(app): ``` -## Example 21 from trape +## Example 22 from trape [trape](https://github.com/jofpin/trape) is a research tool for tracking people's activities that are logged digitally. The tool uses [Flask](/flask.html) to create a web front end to view aggregated data diff --git a/content/pages/examples/flask/flask-views-http-method-funcs.markdown b/content/pages/examples/flask/flask-views-http-method-funcs.markdown index 0a67d4938..b2fec1e84 100644 --- a/content/pages/examples/flask/flask-views-http-method-funcs.markdown +++ b/content/pages/examples/flask/flask-views-http-method-funcs.markdown @@ -1,7 +1,7 @@ title: flask.views http_method_funcs Example Code category: page slug: flask-views-http-method-funcs-examples -sortorder: 500021034 +sortorder: 500021035 toc: False sidebartitle: flask.views http_method_funcs meta: Python example code that shows how to use the http_method_funcs callable from the flask.views module of the Flask project. @@ -14,8 +14,12 @@ of the [Flask](/flask.html) project. It contains strings of the HTTP methods which is useful for checking if an HTTP method is valid by comparing it against the items in this set. +MethodView +and +View +are a couple of other callables within the `flask.views` package that also have code examples. -These subjects go along with the `http_method_funcs` code examples: +You should read up on these subjects along with these `http_method_funcs` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-methodview.markdown b/content/pages/examples/flask/flask-views-methodview.markdown index 6e94fffc5..e048933c1 100644 --- a/content/pages/examples/flask/flask-views-methodview.markdown +++ b/content/pages/examples/flask/flask-views-methodview.markdown @@ -1,7 +1,7 @@ title: flask.views MethodView Example Code category: page slug: flask-views-methodview-examples -sortorder: 500021032 +sortorder: 500021033 toc: False sidebartitle: flask.views MethodView meta: Example code for understanding how to use the MethodView class from the flask.views module of the Flask project. @@ -14,8 +14,12 @@ project. `MethodView` is a that determines the methods, such as GET, POST, PUT, etc, that a view defines. +View +and +http_method_funcs +are a couple of other callables within the `flask.views` package that also have code examples. -You should read up on these subjects along with these `MethodView` examples: +These topics are also useful while reading the `MethodView` examples: * [web development](/web-development.html) and [web design](/web-design.html) * [web framework concepts](/web-frameworks.html) and the [Flask framework](/flask.html) diff --git a/content/pages/examples/flask/flask-views-view.markdown b/content/pages/examples/flask/flask-views-view.markdown index d966b24b8..1f8e51936 100644 --- a/content/pages/examples/flask/flask-views-view.markdown +++ b/content/pages/examples/flask/flask-views-view.markdown @@ -1,7 +1,7 @@ title: flask.views View Example Code category: page slug: flask-views-view-examples -sortorder: 500021033 +sortorder: 500021034 toc: False sidebartitle: flask.views View meta: Example code for understanding how to use the View class from the flask.views module of the Flask project. @@ -15,6 +15,10 @@ for the routing system. This is typically only used in more advanced situations such as extending the Flask source code, rather than a standard way of interacting with the framework. +MethodView +and +http_method_funcs +are a couple of other callables within the `flask.views` package that also have code examples. You should read up on these subjects along with these `View` examples: diff --git a/theme/static/css/base.css b/theme/static/css/base.css index 58c38b7cd..1afe4c68e 100644 --- a/theme/static/css/base.css +++ b/theme/static/css/base.css @@ -59,7 +59,7 @@ img.shot{width:100%;margin:6px 0 6px 0} } @page { @top {text-align:right;font-size:9pt; - content:"Full Stack Python: July 2019 Edition"} + content:"Full Stack Python: 2020 Supporter's Edition"} @bottom { text-align: right; font-size: 9pt; content: counter(page) } margin: 0.9in; size: A4; diff --git a/theme/templates/code-examples/flask.html b/theme/templates/code-examples/flask.html index d2d99058f..984f266f1 100644 --- a/theme/templates/code-examples/flask.html +++ b/theme/templates/code-examples/flask.html @@ -36,6 +36,7 @@

    flask.helpers flash, get_root_path, make_response, + safe_join, send_file, url_for

    From 6dd83faa99014eba22c739e0d3944f923fa431ce Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 27 Jul 2020 14:07:07 -0400 Subject: [PATCH 105/207] fixing linking issue to author page from blog --- theme/templates/article.html | 6 +++--- theme/templates/blog.html | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/theme/templates/article.html b/theme/templates/article.html index 4fcea5f1c..5d7d00cdc 100644 --- a/theme/templates/article.html +++ b/theme/templates/article.html @@ -29,12 +29,12 @@

    {{ article.title }}

    {% if article.modified != article.date %} Post updated by - {% if article.author %}{{ article.author }}{% else %}Matt Makai{% endif %} + {% if article.author == "Matt Makai" %}Matt Makai{% else %}{{ article.author }}{% endif %} on {{ article.modified.strftime('%B %d, %Y') }}. Originally posted on {{ article.date.strftime('%B %d, %Y') }}. {% else %} - Posted by - {% if article.author %}{{ article.author }}{% else %}Matt Makai{% endif %} + Posted by + {% if article.author == "Matt Makai" %}Matt Makai{% else %}{{ article.author }}{% endif %} on {{ article.date.strftime('%B %d, %Y') }}. {% endif %}
    diff --git a/theme/templates/blog.html b/theme/templates/blog.html index 8a18cfed2..6a20daefb 100644 --- a/theme/templates/blog.html +++ b/theme/templates/blog.html @@ -25,12 +25,12 @@

    {{ a.ti
    {% if a.modified != a.date %} Post updated by - {% if a.author %}{{ a.author }}{% else %}Matt Makai{% endif %} + {% if a.author == "Matt Makai" %}Matt Makai{% else %}{{ a.author }}{% endif %} on {{ a.modified.strftime('%B %d, %Y') }}. Originally posted on {{ a.date.strftime('%B %d, %Y') }}. {% else %} - Posted by - {% if a.author %}{{ a.author }}{% else %}Matt Makai{% endif %} + Posted by + {% if a.author == "Matt Makai" %}Matt Makai{% else %}{{ a.author }}{% endif %} on {{ a.date.strftime('%B %d, %Y') }}. {% endif %}
    From 13eaa9d30f1517702b647b17ecc31f71d030b87d Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 27 Jul 2020 21:36:24 -0400 Subject: [PATCH 106/207] working on fixing broken links --- transform_book.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/transform_book.py b/transform_book.py index 7b2bd01b5..80084900c 100644 --- a/transform_book.py +++ b/transform_book.py @@ -38,7 +38,7 @@ "(/development-environments.html)": "(#development-environments)", "(/text-editors-ides.html)": - "(#text-editors-and-ides)", + "(#text-editors-ides)", "(/vim.html)": "(#vim)", "(/emacs.html)": @@ -54,7 +54,7 @@ "(/bourne-again-shell-bash.html)": "(#bourne-again-shell-bash)", "(/zsh-shell.html)": - "(#zsh)", + "(#zsh-shell)", "(/powershell.html)": "(#powershell)", "(/terminal-multiplexers.html)": @@ -68,7 +68,7 @@ "(/application-dependencies.html)": "(#application-dependencies)", "(/virtual-environments-virtualenvs-venvs.html)": - "(#virtual-environments-virtualenvs)", + "(#virtual-environments-virtualenvs-venvs)", "(/localhost-tunnels.html)": "(#localhost-tunnels)", "(/source-control.html)": @@ -96,11 +96,11 @@ "(/peewee.html)": "(#peewee)", "(/django-orm.html)": - "(#django-object-relational-mapper)", + "(#django-orm)", "(/pony-orm.html)": "(#pony-orm)", "(/no-sql-datastore.html)": - "(#nosql-data-stores)", + "(#nosql-data-store)", "(/redis.html)": "(#redis)", "(/mongodb.html)": From 6878defe2dac565515106c89099f461d15333b45 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Tue, 28 Jul 2020 15:45:53 -0400 Subject: [PATCH 107/207] fix typos --- .../20-css-frameworks.markdown | 2 +- .../05-deployment/22-wsgi-servers.markdown | 2 +- .../sqlalchemy-example-projects-code.markdown | 2 +- theme/templates/book-toc.html | 38 +++++++++---------- theme/templates/epub-book.html | 1 + transform_book.py | 24 +++++++----- 6 files changed, 37 insertions(+), 32 deletions(-) diff --git a/content/pages/04-web-development/20-css-frameworks.markdown b/content/pages/04-web-development/20-css-frameworks.markdown index 01f12984b..de0dbe3b2 100644 --- a/content/pages/04-web-development/20-css-frameworks.markdown +++ b/content/pages/04-web-development/20-css-frameworks.markdown @@ -12,7 +12,7 @@ a code library that abstracts common web designs and makes the designs easier for a developer to implement in their web apps. -### CSS frameworks +### CSS framework implementations * [Bootstrap](/bootstrap-css.html) * [Foundation](/foundation-css.html) diff --git a/content/pages/05-deployment/22-wsgi-servers.markdown b/content/pages/05-deployment/22-wsgi-servers.markdown index 7a92941c8..35174df41 100644 --- a/content/pages/05-deployment/22-wsgi-servers.markdown +++ b/content/pages/05-deployment/22-wsgi-servers.markdown @@ -146,7 +146,7 @@ configuration. For real SSL and non-SSL templates, take a look at the [Underwear web server templates](https://github.com/mattmakai/underwear/tree/master/underwear/roles/web/templates) on GitHub. -## WSGI servers +## WSGI server implementations There is a comprehensive list of WSGI servers on the [WSGI Read the Docs](http://wsgi.readthedocs.org/en/latest/servers.html) page. The following are WSGI servers based on community recommendations. diff --git a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown index 3392cc1be..13f311143 100644 --- a/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown +++ b/content/pages/examples/sqlalchemy/sqlalchemy-example-projects-code.markdown @@ -27,7 +27,7 @@ The project is open sourced under the [BSD 3-Clause "New" or "Revised" License](https://github.com/encode/databases/blob/master/LICENSE.md). -# CTFd +### CTFd [CTFd](https://github.com/CTFd/CTFd) ([homepage](https://ctfd.io/)) is a [capture the flag (CTF) hacking web app](https://cybersecurity.att.com/blogs/security-essentials/capture-the-flag-ctf-what-is-it-for-a-newbie) diff --git a/theme/templates/book-toc.html b/theme/templates/book-toc.html index 2e536802b..7d51ee73c 100644 --- a/theme/templates/book-toc.html +++ b/theme/templates/book-toc.html @@ -19,7 +19,7 @@
  • 2. Development Environments
  • *Vf?u;bNnFxktJ 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 Programming +Web development +Django \ No newline at end of file From 4049a451b6d974441fd02180882d242f1ed6decb Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jul 2020 13:14:29 -0400 Subject: [PATCH 098/207] update and fix change log --- content/pages/meta/00-change-log.markdown | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 4c81a8462..10f8993b5 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -15,10 +15,10 @@ on GitHub. ## 2020 ### July -* New blog post on how to - [Quickly Use Bootstrap 4 in a Django Template with a CDN](http://localhost:8002/blog/bootstrap-4-django-template.html). -* New blog post on - [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html). +* New blog posts: + * [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) + * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html). + * [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html) ### June * Added new example code for [Django](/django.html) modules: From ecdbbed6ddd5c643a9458c38ac9d30138affe6c0 Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Sun, 19 Jul 2020 13:24:14 -0400 Subject: [PATCH 099/207] fix typo in change log --- content/pages/meta/00-change-log.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pages/meta/00-change-log.markdown b/content/pages/meta/00-change-log.markdown index 10f8993b5..f21cc1bb8 100644 --- a/content/pages/meta/00-change-log.markdown +++ b/content/pages/meta/00-change-log.markdown @@ -17,7 +17,7 @@ on GitHub. ### July * New blog posts: * [Tracking Daily User Data in Django with django-user-visit](/blog/track-daily-user-data-django-user-visit.html) - * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html). + * [Quickly Use Bootstrap 4 in a Django Template with a CDN](/blog/bootstrap-4-django-template.html) * [How to report errors in Flask web apps with Sentry](/blog/report-errors-flask-web-apps-sentry.html) ### June From a6feea08a81753f6e90da642e6cacce59d4ba49c Mon Sep 17 00:00:00 2001 From: Matt Makai Date: Mon, 20 Jul 2020 06:27:52 -0400 Subject: [PATCH 100/207] update some header images to minify them --- static/img/181031-okta-exist-flask/header.jpg | Bin 54433 -> 20103 bytes .../header.jpg | Bin 99566 -> 49833 bytes .../header.jpg | Bin 250662 -> 58041 bytes static/img/200330-pandas-sqlite/header.jpg | Bin 69037 -> 24951 bytes static/img/200525-sentry/header.jpg | Bin 51348 -> 21112 bytes static/img/headers/django-materialize.jpg | Bin 0 -> 23240 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/img/headers/django-materialize.jpg diff --git a/static/img/181031-okta-exist-flask/header.jpg b/static/img/181031-okta-exist-flask/header.jpg index 6da57b0102c1987a3759d019e4fecb802e3e382a..282152c09fe8eb50e06af0aa06902f91d8a417fc 100644 GIT binary patch delta 15729 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 literal 54433 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 diff --git a/static/img/191018-python-basic-data-types-strings/header.jpg b/static/img/191018-python-basic-data-types-strings/header.jpg index 7696f44b4b570d4071dd20a934268f704da3500c..e9874c18f3d489c1eb534b6379a46297c9a4ee55 100644 GIT binary patch literal 49833 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 literal 99566 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