From dab9a145d0dc38dd4f19a77fbc9c7773d72edf71 Mon Sep 17 00:00:00 2001 From: Amit Singh Date: Tue, 6 Jun 2023 22:34:23 +0530 Subject: [PATCH] all changes --- blog/__pycache__/feeds.cpython-311.pyc | Bin 0 -> 1693 bytes blog/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1621 bytes blog/__pycache__/sitemaps.cpython-311.pyc | Bin 0 -> 950 bytes blog/feeds.py | 23 ++++++++++++ blog/forms.py | 20 +++++++++++ ..._comment_blog_commen_created_0e6ed4_idx.py | 34 ++++++++++++++++++ blog/migrations/0004_post_tags.py | 20 +++++++++++ ..._commen_created_0e6ed4_idx.cpython-311.pyc | Bin 0 -> 1945 bytes .../0004_post_tags.cpython-311.pyc | Bin 0 -> 1030 bytes blog/sitemaps.py | 13 +++++++ blog/templates/blog/post/comment.html | 11 ++++++ .../blog/post/includes/comment_form.html | 6 ++++ blog/templates/blog/post/latest_posts.html | 7 ++++ blog/templates/blog/post/search.html | 32 +++++++++++++++++ blog/templates/blog/post/share.html | 17 +++++++++ blog/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 161 bytes .../__pycache__/blog_tags.cpython-311.pyc | Bin 0 -> 2008 bytes blog/templatetags/blog_tags.py | 31 ++++++++++++++++ db.sqlite3 | Bin 151552 -> 212992 bytes mysite/__pycache__/settings.cpython-311.pyc | Bin 2530 -> 2974 bytes mysite/__pycache__/urls.cpython-311.pyc | Bin 498 -> 805 bytes mysite/settings.py | 20 ++++++++--- mysite/urls.py | 9 ++++- 24 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 blog/__pycache__/feeds.cpython-311.pyc create mode 100644 blog/__pycache__/forms.cpython-311.pyc create mode 100644 blog/__pycache__/sitemaps.cpython-311.pyc create mode 100644 blog/feeds.py create mode 100644 blog/forms.py create mode 100644 blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py create mode 100644 blog/migrations/0004_post_tags.py create mode 100644 blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc create mode 100644 blog/migrations/__pycache__/0004_post_tags.cpython-311.pyc create mode 100644 blog/sitemaps.py create mode 100644 blog/templates/blog/post/comment.html create mode 100644 blog/templates/blog/post/includes/comment_form.html create mode 100644 blog/templates/blog/post/latest_posts.html create mode 100644 blog/templates/blog/post/search.html create mode 100644 blog/templates/blog/post/share.html create mode 100644 blog/templatetags/__init__.py create mode 100644 blog/templatetags/__pycache__/__init__.cpython-311.pyc create mode 100644 blog/templatetags/__pycache__/blog_tags.cpython-311.pyc create mode 100644 blog/templatetags/blog_tags.py diff --git a/blog/__pycache__/feeds.cpython-311.pyc b/blog/__pycache__/feeds.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..288dc84bc26aa12a5bddd4fb072c285ed935f13a GIT binary patch literal 1693 zcmaJ>&u<$=6rNeH?X{g`OWV+-t=dgm)R==M#06C)5{&^NzzQm-Riu^U8Mm9xdd&CHwc{qX)W zJ6k0%K3LdhBaM*1Q8^pMiEwIzuuB+WR1h0yO;As>HHvaU6g=J5Q&|^9uVj}%F0zs+ zdxmXLqLEJtE59Vn;M#tHkVAO0VOJP^Lh6-cR9khL=$~-TV7?m2L9f#e_>M1`a-IdA z0PBq8+gvK{h;}$Urf>$2tothHWd1TdbAQ?deV1@zQ$}o!QM;fKt}|^PjvnIibl62! zuuDvTN$fH!0vfCYSV78ml^IAdnfn6Br~vOmiedT7p|vUer{Nsp!#>y@;i@2HDemG9ewVq6^iU^>jrkbL@`wwUX{RBIh$)#?RV zhAFA^2b)0a8D~kMEii|=;-ahY8tc{l=EIGTJU6h`rN6~H!GV0wsT%!Z zQUsHy!t2u+Xr$Iz@T2YmjL2W+wI9Fz(_H$)TskuEjm>*|kN3XXdptHDM8<(wbAT)c!`wuJr_ z_V|dzKrxJrMfnz}Q*1D2DVuc=pd@)22no^qdFhhl{7HMRY$u0!1a6K-OIu|x8WMPIIF|b&nx5Q_kV5v z_Sw<$>UeqeckRer8=Gs9v34=?|E+^Wzfg(tq>V08ok^*}GK2p|cTk)n^wJ+7>?6xd)#r7s^fS*8wiwV9Os)sTVyNpI-HkSr$iTS?|D)?7rw+I%Nq!{ z5ik=6Bz2#*imad&!GKqJ0HgdD&&-cLj%zo*e-tgO9M$UMT7A@vuhvJOpXju>azb(_ z(c(>1Cje@bqMjpIZlmG9kTJpg>s5IZro>`f?cP(r(eZnMbT=Dn*kdky@Sxa@ZI|yT ziEWqMnQVhb?+eIqgYj;AAcC$d0{9YU{ZyN58c3nC43!{<92EQpWU;@461IJsk5|T{ zEX%9%U9e#fs2>1M3Y5~An4|O;llP+OCng_8(@#w9N7GMC7NY6rq-0Xa$VK?+>wnPt J?OK;Oa5Z?8xapFP%@#rf;2oMGYCpaJk;*o-oC`fR!Dp_uKNmJP|T|0uF$bmx+ zJ@ilsi4!1HK;_QgXr&yiy>jXSDOG#wi5a^guZms!i+5&rW_G^Wd>b9j6BwU=$LtR! zSUy!W5?ZN}xI_B?@^&nD(A9ozq3Fvw2-5WCPx8IC^Sj zfYk_C86Ek6)ktcU11s}CzH%)8g4l&^bYfGfzY0YVZA13B8hH=~0k6gLoe=oj$!hl_ zEItrU9Lk8JD1@usj2Zo@tb>;g^pp0cArRrSS^6io_{Yq~|+>S`D3vN%+JaQ3;@@yv5T^JvnxHGkux{&TQ{lu$!^9 z!GI_ph#>H6DPUgFZGdiowxZ})+GH4ZP_}o7A`6c`53l4^(DYK%do|ZV*K_f7MxnNf z%)j8Cm|sA44yhqFyEqCU^`$x&%Y(-|hkAq)@J3Sr-Qy+JM6V>uIJ1F1lDlJM&Z88k2C)dW| O+R+kRyCI9TNPht^wN>Q+ literal 0 HcmV?d00001 diff --git a/blog/__pycache__/sitemaps.cpython-311.pyc b/blog/__pycache__/sitemaps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1de3542d8b36df4d7c06372525ff3cabbbacd29 GIT binary patch literal 950 zcmZuu&ubG=5T3W2-E3>)S}Xpj2&oZD5b_6_`)sd$vU6YTT;Ix#Fayfx)twJNDwF`tet z*KK-%aNT&(b&;U$lfUG;du`93W~#ehvnF<=*o&=}tcS85b)=09@*2W1By5QgnWiWK zOO4|PcJIdNs literal 0 HcmV?d00001 diff --git a/blog/feeds.py b/blog/feeds.py new file mode 100644 index 0000000..7818ca7 --- /dev/null +++ b/blog/feeds.py @@ -0,0 +1,23 @@ +import markdown +from django.contrib.syndication.views import Feed +from django.template.defaultfilters import truncatewords_html +from django.urls import reverse_lazy +from .models import Post + + +class LatestPostFeed(Feed): + title = 'My blog' + link = reverse_lazy('blog:post_list') + description = 'New posts of my blog.' + + def items(self): + return Post.published.all()[:5] + + def item_title(self, item): + return item.title + + def item_description(self, item): + return truncatewords_html(markdown.markdown(item.body), 30) + + def item_pubdate(self, item): + return item.publish diff --git a/blog/forms.py b/blog/forms.py new file mode 100644 index 0000000..1188962 --- /dev/null +++ b/blog/forms.py @@ -0,0 +1,20 @@ +from django import forms +from .models import Comment + + +class EmailPostForm(forms.Form): + name = forms.CharField(max_length=25) + email = forms.EmailField() + to = forms.EmailField() + comments = forms.CharField(required=False, + widget=forms.Textarea) + + +class CommentForm(forms.ModelForm): + class Meta: + model = Comment + fields = ['name', 'email', 'body'] + + +class SearchForm(forms.Form): + query = forms.CharField() diff --git a/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py b/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py new file mode 100644 index 0000000..4e78b7e --- /dev/null +++ b/blog/migrations/0003_comment_comment_blog_commen_created_0e6ed4_idx.py @@ -0,0 +1,34 @@ +# Generated by Django 4.2 on 2023-05-22 16:57 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_alter_post_slug'), + ] + + operations = [ + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=80)), + ('email', models.EmailField(max_length=254)), + ('body', models.TextField()), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('active', models.BooleanField(default=True)), + ('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comments', to='blog.post')), + ], + options={ + 'ordering': ['created'], + }, + ), + migrations.AddIndex( + model_name='comment', + index=models.Index(fields=['created'], name='blog_commen_created_0e6ed4_idx'), + ), + ] diff --git a/blog/migrations/0004_post_tags.py b/blog/migrations/0004_post_tags.py new file mode 100644 index 0000000..ec6ee4f --- /dev/null +++ b/blog/migrations/0004_post_tags.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2 on 2023-05-24 16:42 + +from django.db import migrations +import taggit.managers + + +class Migration(migrations.Migration): + + dependencies = [ + ('taggit', '0005_auto_20220424_2025'), + ('blog', '0003_comment_comment_blog_commen_created_0e6ed4_idx'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='tags', + field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', through='taggit.TaggedItem', to='taggit.Tag', verbose_name='Tags'), + ), + ] diff --git a/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc b/blog/migrations/__pycache__/0003_comment_comment_blog_commen_created_0e6ed4_idx.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81d449bdd1ac5982ca9d0ae48a1bcc5e77766481 GIT binary patch literal 1945 zcmaJCO-~y~barj8y~cp;0FFOOP>Z52M3&Wth!#=;c8Jn6C~8ntEUMMQ49=SMuDiRY zkV`rA&?ARRTj>u~kF2h|n+~(yW!uo~-vt_K0(bW4;lnau8H` z$kn)NhzBVA&J*Mz;|TR=U;u{c6M;fIdPMhhOs7A#co_2}V*v+>?f4P(a7<@kX26pX z0}f2QM`qBI@p8xHj_5oN6ae)z1*llEj1m+aiQCNtv635ujYSLqsG9f9Mt7H$#oX;1{TBElP*Q6nRzQt1;}(QIVOO~bNfOKa6gv}`mQ zNVf^E!qsKMKdwk&l2BTLBo{;75T8hRJ#wduIh$`rtDzZ%0)?}dUrT!^1 zX|fh0i6ynRNDpP1MN7o;OU3lj_(PW69(xt-+CDm1q5ED{8^|XUONOB#Mepe>8zxd~ z`V)Gd0<0@~%^*D7ATcj(^x~jZvG}~aSb0cdix56$yCD((6E~Wucf0%!&S_}i?YEWB z*B2YAJ@L#m>S)tmZ|qsBjn-NI*56%5>$Ltp?d8+%fB!$p#pa&L+ROv&4zjlCZL;5g zTmguZ8{$WV{jc0O5O4hycVgq+RPL|TD9%hB>^PaJH{m}gaaG2;i8EFwV>uZMC+%)3 zgR|1%n3I)GzQ)@-f^ zp`LJ|bhzvkN^c-8lskp8Qz+wP%G_8c=j8dUhAaSob;L-2{9E4 zE*Nk>8chrPU$V!X53(-_MD%N=2sgYk^(!;mXBPdRO);n<^KPJP&N0k0b)RByWAlD5 zd|^JIB>O*D8x*)9j^pT&auNm~Uw^w`0tc@vCsvmQq*|#~E46A(3iHB6 zZMuQY=Y+!?X$77KKD*-bXrz!<2o?iMD)03~buO@rr2Vkd+fgb2T`3qmdsvfZ^@=_@q~9q=jm zEeE1dem2i9Q~FBY5o(F*S-xdM81Zq5*=oA5Hneaf=)kB2zN2&bVVBQezGy6a4lBJ4 zgEq8S!`q7-1`S!l#&yRuM4f9y){ThAN9E35C|e>SvKOLlLH4g^tRcNT$gjlN%w27N zH7+21>cBY7KNw6-4<;rD#rt2L{w&V^D9-j5Hu`oiMrcV{RRsH}SW3S*dxp@RrgD+c zIH&5y84~0|k~pIkwf#48hSMnqGs|__wtPD%)8?=&!&N$#;_Knf5~U#^!DR3d2sQc(E#pE literal 0 HcmV?d00001 diff --git a/blog/sitemaps.py b/blog/sitemaps.py new file mode 100644 index 0000000..c4bb6b5 --- /dev/null +++ b/blog/sitemaps.py @@ -0,0 +1,13 @@ +from django.contrib.sitemaps import Sitemap +from .models import Post + + +class PostSitemap(Sitemap): + changefreq = 'weekly' + priority = 0.9 + + def items(self): + return Post.published.all() + + def lastmod(self, obj): + return obj.updated diff --git a/blog/templates/blog/post/comment.html b/blog/templates/blog/post/comment.html new file mode 100644 index 0000000..29bef16 --- /dev/null +++ b/blog/templates/blog/post/comment.html @@ -0,0 +1,11 @@ +{% extends 'blog/base.html' %} +{% block title %}Add a comment {% endblock title %} + +{% block content %} +{% if comment %} +

Your comment has been added.

+

Back to the post

+{% else %} +{% include 'blog/post/includes/comment_form.html' %} +{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/blog/templates/blog/post/includes/comment_form.html b/blog/templates/blog/post/includes/comment_form.html new file mode 100644 index 0000000..35a105c --- /dev/null +++ b/blog/templates/blog/post/includes/comment_form.html @@ -0,0 +1,6 @@ +

Add a new comment

+
+ {{form.as_p}} + {% csrf_token %} +

+
\ No newline at end of file diff --git a/blog/templates/blog/post/latest_posts.html b/blog/templates/blog/post/latest_posts.html new file mode 100644 index 0000000..3be24f2 --- /dev/null +++ b/blog/templates/blog/post/latest_posts.html @@ -0,0 +1,7 @@ +
    + {% for post in latest_posts %} +
  • + {{post.title}} +
  • + {% endfor %} +
\ No newline at end of file diff --git a/blog/templates/blog/post/search.html b/blog/templates/blog/post/search.html new file mode 100644 index 0000000..db09915 --- /dev/null +++ b/blog/templates/blog/post/search.html @@ -0,0 +1,32 @@ +{% extends "blog/base.html" %} +{% load blog_tags %} + +{% block title %}Search{% endblock %} + +{% block content %} + {% if query %} +

Posts containing "{{ query }}"

+

+ {% with results.count as total_results %} + Found {{ total_results }} result{{ total_results|pluralize }} + {% endwith %} +

+ {% for post in results %} +

+ + {{ post.title }} + +

+ {{ post.body|markdown|truncatewords_html:12 }} + {% empty %} +

There are no results for your query.

+ {% endfor %} +

Search again

+ {% else %} +

Search for posts

+
+ {{ form.as_p }} + +
+ {% endif %} +{% endblock %} \ No newline at end of file diff --git a/blog/templates/blog/post/share.html b/blog/templates/blog/post/share.html new file mode 100644 index 0000000..186c94e --- /dev/null +++ b/blog/templates/blog/post/share.html @@ -0,0 +1,17 @@ +{% extends 'blog/base.html' %} +{% block title %} Share a post {% endblock title %} +{% block content %} +{% if sent %} +

E-mail successfully sent

+

+ {{post.title}} was successfully sent to {{form.cleaned_data.to}}. +

+{% else %} +

share {{post.title}} by e-mail

+
+ {{form.as_p }} + {% csrf_token %} + +
+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/blog/templatetags/__init__.py b/blog/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/templatetags/__pycache__/__init__.cpython-311.pyc b/blog/templatetags/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b47c60f0e8c6432aadca1e1c0ec544805ddd13f6 GIT binary patch literal 161 zcmZ3^%ge<81nZ9GrGV(iAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFB2E57{}bq z5`}=G{H)aEl9=4e;>?oNn53Ni^q7*=+=86MlGKvK^x~NK_{_Y_lK6PNg34bUHo5sJ fr8%i~MXW$WK-LuV1BnmJjEsyQ7+^#ZGf)fwXQ?Kf literal 0 HcmV?d00001 diff --git a/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc b/blog/templatetags/__pycache__/blog_tags.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93c391e92fa5dca12c7555d52060ba6b7a96a480 GIT binary patch literal 2008 zcmb7EL2DaF6rS0YR%@?hIh9={aa~z1HCZ=OPIgNuhSESU#-!vDgh9xfwY=)C*368O z+PGjsN_*&`l$PYEQ`(Rma_pf$LNW^$3xz`I!8Zj53ZaL-w~}nFoJ-!$zL|OR=FNNG zdo#bLQj-MekN=u%LM7yHoD2!(A)UTY33)^qVbmcmEm2CC!c<3b)shNh!eUO$jhEuC zR?@jP@+~JT-R0)CKR}VcH#HPM_dLlLor9++C+4 ztrMj$h~4&tG?gI!xz}vSfPM)|6K;inRThO15q-7r-i2fbiox4GrmV#i`ZyoyddC8xOm^~$ZAo1eM1T)54>x>c2%?w+uvwYlYZ zwasB1vQiVFq>Q8D?p|O>Pgb1rF2p7HG#J9fig$q>l7Ec!4{OIp?#Re>jJ$8;+p#>y z3!2Erp`-#~Fky3PsuSv`voCWu0a#9bJ?9TJR=<%}GVZ;CNZj#2Q9LOWInLjqv&nKLti#_E+u z&Ex24pt&Bi9MOL(ru!>JwpAR6!@OV_1=+z`Q`(Lw;_D?Ow;Q!{pM%7@y~QhhFVMMF zvjwCzm=rcVh!(yc;bRe`>_*jT3fpUhGRz*wGzQwX?ZA#OD4s$wJ{;i%d#!&8?lc{1 zjhi4tv_%GZPolpLCF@LD{ zG@?xUbf%|Jy4WMYUaCZyJ(K9Ld`z=PG~2$s(xIz9UF|6fg_;^N)c^QQJUKKML!BWz kw~3M|(D^R+AopYaFxR1ZpXTxOBA#AE&Bcf$6o;Vw5A3d{`Tzg` literal 0 HcmV?d00001 diff --git a/blog/templatetags/blog_tags.py b/blog/templatetags/blog_tags.py new file mode 100644 index 0000000..dcf64f1 --- /dev/null +++ b/blog/templatetags/blog_tags.py @@ -0,0 +1,31 @@ +from django import template +from ..models import Post +from django.db.models import Count, Q +from django.utils.safestring import mark_safe +import markdown + +register = template.Library() + + +@register.simple_tag +def total_posts(): + return Post.published.count() + + +@register.inclusion_tag('blog/post/latest_posts.html') +def show_latest_posts(count=5): + latest_posts = Post.published.order_by('-publish')[:count] + return {'latest_posts': latest_posts} + + +@register.simple_tag +def get_most_commented_posts(count=5): + return Post.published.annotate( + total_comments=Count('comments') + + ).order_by('-total_comments')[:count] + + +@register.filter(name='markdown') +def markdown_format(text): + return mark_safe(markdown.markdown(text)) diff --git a/db.sqlite3 b/db.sqlite3 index bb6682bd81f5664536fea054068229af17ff0db1..cc576d76690a0ddd2e4425ca39b29e89f810b5fc 100644 GIT binary patch delta 9588 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 delta 959 zcmX|9Z)jUp6u;-b*FN)-_l`+ZGnZ_AEja3I{=6n}X>eP$WvFwVl%iiOF9}PtZfjGT zOhsBOqD-yG>Ju+arBw!FINaoc&!VqmD$LCfmMKL`%FrLLx?}ri$Pi_auO8%BGLXFQ8ZJ+S{XX zq&}!{@0XWM>CSttM(tzSTH3g|#xG$8a0N5?DL#$kcnnYBcb0ePVKg(*`n#k$QMeDX zhs*noq5SYbf2q`891NM`(P*t05QI3G=R9>CQnfM+=ASW)+@WH@7%G;^v``O16!sm+ z4i<{WK!0I4TjseXzs!Rr93^-Szs7lVa1^I-oIhDWb9CnsA>^)@QhOW!;`?r^vb#wX zLdt?EJzhoLQOq+>)mXpu&UtSTZiOcOkh-{Ue)^Jh<@HGO)wCWNrplxEv3Z)Ou(y+57E2ngqy z)D8_I-3xE9t?gj2*B$}?#EmsgbeeEDnYG3GpRLCta6CeGO$Pc(qGBpDm zWKY(8)%~pex2JpJ!4P{i13`A&p>=G#L+@s@4&5Tk%T!^iL!->DVox|U-Xt%>>w$&_ zcqw1b<__i8Te^Ob*_$);Ap7+!4YFG^^s4y<2^cu zZ02>uEG9J?O+pSOAdiwjqf{`aU>c=i24$dtvXGlaIhaFv zxPhkOCYlKn3UEs%inq^r(j}Q+WT3ei>Aj=AJn%xcqG{N6Qt(1CG*f7qhTX+Y!NRs` zIhp^ky0UAXJsSH)?G*k+p(!+#)=Sj@OV~9nTkERUUdJ1UrlB5q?1*y0BIwvyURYcz z(q2faJ}FlvkFJXA0dC3CrpIoGvbW=9pI0ljh|&xu*Oy(?(L%$BJ;Ggw!2Y+KmS+O4*--&Ty}%c#d^ zUp3p>o~7#T0~PP@wO->jiXf`R+1@jz!7_5WE;Y)f-dE=1k(Ve*tKwFr-VnFywZ>{$ zs+2rVS{KWe#)|lOO{$i>$c6i~CfB|A)x0r0d-57Fx`xq;joM~?v{{hcs8{6A#P7k^ z`%^4E+!1x$(^w&LFCYeQYw5iY>`sm)q7yFTQ_%$F6C-eAe!j8oU zJkE!FVgO?dN4a5tw)ZByz2rxT^!;-p;j_e~NV?n)uHZ)ciMwvRpPoM_l6{U3d_LuJ KgWg>XD*pwHNAX$! delta 333 zcmbOy{z#Z_IWI340}zD7rlq9uPUMqddcrVKBdnT+WyQ35GqQGzMrQ9>y!QNlnhk|Gf$nj#s@pedE8$;iO4*_g4Kkx7$%@>Zrb zn`ba@XR?$^$x6&i&(}*y(o0HA&Q8rsDb_14%*iZCHLl_U3PRbMOt;uv{oFnMTyL@X zIr_R5ac^GDrpn0drzti$og;qod5*=CA931psRI2Bw1=VCda@>0j1U)x5Yq<+7}3D@ zL1gkgu1FcZ8v+tDY%U6@e_&-6VEe!TBA8iunHo4hNKF>u4(Dv(YTznT2ATr^Y|K?X diff --git a/mysite/__pycache__/urls.cpython-311.pyc b/mysite/__pycache__/urls.cpython-311.pyc index 81aefd909fa508f0bc5d469db380c88d2d0e8203..e1b5bf7c2ea730d6df318c01b2cc5ff6839c1254 100644 GIT binary patch delta 497 zcmeywyp)Y^IWI340}yzn)~9S^oX97^xM!leqDcxv3Udx?E?X2EBLk4llEa?M5yb&y zv!-%nGDdMSF{Co5u%$9)fi;5+$l{(DBQ3}dlwe8WNa0+=wTy{@VKoy_P?bBCErlnQ zGm|lecMab%7N9T?LqIxn6i*6&FoUMR#1-<|nvA#Di!)17a}x`IOzwdE;*wwp_ZDjb zkW*a6mY9;8nWuk?Vd6D8&nj-HV!evooLd}FPH~lLN>*ZCdcIzAeqKpYW|AIELa!_{ zwY(U{1=_%pmzbOCr^!3m;jMx**042Bm_(G3RG3#jM;3wKBK2WBQ7rUs4=91N_S4K5uL6HKRAO|ieoqI`u# z`34IIP)MjFyd!)<^a{5Nyv7%KjjsSn7LzM1CJ3ROS@sRK_e;kR%9Xu}!RzHe>-x zu%xi2u&rTV#>Bv|8i*kPm6y&G#h$_u%%I6R@rArW6CyXe!6}YCy3H3 zEy^jr#R6h#GT!3MOUz9zE=WvH_0!~-Jd;s(GBZ;kmjKXgMj$TEo*c(y