From a3d8c6060923beb404eb54403c6f1109a7d79eeb Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Sat, 23 Dec 2023 13:14:43 +0000 Subject: [PATCH 01/38] Finish Introduction and Django Admin --- blango/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 0 -> 2498 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 0 -> 904 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 531 bytes blango/settings.py | 17 ++++++-- blog/__init__.py | 0 blog/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 0 -> 486 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 0 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 0 -> 1181 bytes blog/admin.py | 14 +++++++ blog/apps.py | 6 +++ blog/migrations/0001_initial.py | 39 ++++++++++++++++++ blog/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 1231 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 139 bytes blog/models.py | 26 ++++++++++++ blog/tests.py | 3 ++ blog/views.py | 3 ++ db.sqlite3 | Bin 0 -> 163840 bytes 20 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 blango/__pycache__/__init__.cpython-36.pyc create mode 100644 blango/__pycache__/settings.cpython-36.pyc create mode 100644 blango/__pycache__/urls.cpython-36.pyc create mode 100644 blango/__pycache__/wsgi.cpython-36.pyc create mode 100644 blog/__init__.py create mode 100644 blog/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/__pycache__/admin.cpython-36.pyc create mode 100644 blog/__pycache__/apps.cpython-36.pyc create mode 100644 blog/__pycache__/models.cpython-36.pyc create mode 100644 blog/admin.py create mode 100644 blog/apps.py create mode 100644 blog/migrations/0001_initial.py create mode 100644 blog/migrations/__init__.py create mode 100644 blog/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/models.py create mode 100644 blog/tests.py create mode 100644 blog/views.py create mode 100644 db.sqlite3 diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cb0e756e7b067f38d407862d31bc48158ac30e6 GIT binary patch literal 130 zcmXr!<>mT!rzMpE2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CU;6qP`MIh3$@wXn z`TFJgMcKs#iOH$@NjZsm>G?1!K0Y%qvm`!Vub}c4hfQvNN@-529mt?!AZ7pn#RwlW literal 0 HcmV?d00001 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c76111f4f19fd82d5d3bdcd2694a45b3cabb2c9 GIT binary patch literal 2498 zcmb7F-Ez}b5SDDkcAUh75C{+`N@)sCu$+)gflh~_*mCgTSQ$$utuD~W-V;SemW+-} zh^{(AAA=X@E9s&)z3MCUsw-JeT!)L)@{x}B=iAk{yT>~V3;Eyv{GD(GhWU$`_~dZ^ z3Kz|=3dIkq2D5|>oA8FbJ`Nj!vYlG8Z5$fSTeKP4Y&cza1(C9 ziaDb#!)@&*+%XxLfxEB@_uxK!V{#S?5591ScMEuJ1=iqOl7)w>41D(`WwF|AScmV? zW*r{I_s8+QXt5@z-GL45E^KP6n8iI@_i=p#PqYV6(s)QIOi?g4k&Jw`XE>(IQ{wxU zV^aRu_4tk*%Lbm?BVAv}=l6+2Ji{lzch2}n5WAEN=vxj?eZ%t;%SZf>A_$*g?g&qX zXXsr+$iC|l-f|GVZ}^t$@c8vlER1K_zcXaJy6(#TaMMb^B%Flo7D( zy929B%j0~@BY6LW@W(^j=534mynB4{K86Drh*%!~(XfYv{-0PLIi3jgchpeLA{%mt zhJO<5B{WzLCEcM%N}JSKhk>!S_56oTb8~%nH+Zq}uJ`UkX}IgG^&USwwTqu#80-4B zJ9rfYPdB$qYRGN`b7G?*AC+n?`GD676}eiM_1ChZHpK%eD3qRWZEXo%7c5t>+#ok5 zDdd{2LxSZ|5@_J~p4AcJnglndr9;ejbxIhy5Xbk=280GHQ%XuG#VTD^^ig4$=y7-2 z!^gUIqiRx(>)5UtloE@+1z?j?!y`h>l;xiZN<9eT-2C^~%Qm7ueLJ#nz2N0lkq#`!>JR%3;+X!) zh5yf2^&j=`VUptoz^khQG>3iSS>4MBGsGzksg`c5l^|Ef0~~w49NbTEk;=Xc#HPZY zW#UY@HH+9#Tnn?hjz_buhbfna*#Vw`w$<@cNNDO?kD($uR!-e?lldAE7r-WJJe6&2*3DYL=!)w3jwH8)TPkJO= zt|+aVUXkTDbxBuHqtsO?k*ck>q9Tyos$=byaOpp`Ql;IJ!kdbuDA;Z15F_!*w0MkM zKp+(}L|ANCCCnextJQ{dBqG*)OO{o=-D*_iW-XjmrGvwUs7gw>c%WWHDK^7#=lhYqkl|w6LOzp@u6&M5C0B-<`4=O=GrRx* literal 0 HcmV?d00001 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..007051089077a0c83360f2cbc5835d874dbd7579 GIT binary patch literal 904 zcma)4O^?$s5KYpwyJUCaFZh;5lo)nz6(G=x6)PbQd|Z0Ty0P23#Gc4@Se7gN8U9kl zjS~{TfCFNjrc#82w3gybobj9Y-ptv_N%H6WSMe(ff*-+PjWB+Ok9~+64;BFrc~pfe zT126bN7YEhi#QBK%wrL4$J@!5XdNyN`1oy*O&B2HvSNA-2DYMfc?pUNP0#XE>Y$dTr9PQrc}tTQpO``{J5MeeU3zxAvK{E7 zoIK~8FioVY!MHggD+7wCn}XGKe>liL?ejayC}5xvucFw^G)-r{t_>(LBbq7kB=vEc zCFd2h_Q4W`@d4`pSb*CIUW1XUeVFE-P45G;m)j^#>hpnq|pP zoYWu-+cD!xY7AoU_~%LYNndA&?LkrCd=$mvZcho7I3t$^hc#%A20V?Q|2DSLi8l7c z+oM4Ufw Hk4Jw2sq7ns literal 0 HcmV?d00001 diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a187e6fdec84d8a768c4d22eecd5aa2941951ef GIT binary patch literal 531 zcmYjNO-~y!5cPTkiI$IYsCxD_YP+t=4OJCL&?prRhfr0@Wn>`Dt$AggLzKh1TLq0~3}BR-(Mt@Lt0bG+T;Vty4ynAlY;(s!FR|IE7|94SZjM zNQpHtWrAM0PB1iqTv;|#8s0Grkj$N{>=EY@bDPRVW9r3IjwJ`f57Uo)jw^>;LZ$Jh z1mpP17K$f-!ZgUJANkh>xU6~0Hf;Der(aJ-gNtl@c6m7*4aV8Gi_`DtXSc7~&!-lg zQ>L)}uJ2}9aFAu5qV)%@k2DYV(}uOCLC1H&ELDxhC!tZoOk8W{cQyonlR627Yxw&% rm@a|mC>8P*)<10}a^S7>OK8Z`>c;mzwZr|~3;ni%4(-uhx=;TD8U3eo literal 0 HcmV?d00001 diff --git a/blango/settings.py b/blango/settings.py index f9209bef27..c1795cc999 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -9,7 +9,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ - +import os from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. @@ -25,7 +25,15 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ['*'] +X_FRAME_OPTIONS = 'ALLOW-FROM ' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io' +CSRF_COOKIE_SAMESITE = None +CSRF_TRUSTED_ORIGINS = ['https://' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io'] +CSRF_COOKIE_SECURE = True +SESSION_COOKIE_SECURE = True +CSRF_COOKIE_SAMESITE = 'None' +SESSION_COOKIE_SAMESITE = 'None' + # Application definition @@ -37,16 +45,17 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'blog', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', + #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + #'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'blango.urls' diff --git a/blog/__init__.py b/blog/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55b4cfbdd2f3ee656cc460225b3cb4f53217c107 GIT binary patch literal 128 zcmXr!<>k`4+mgxv1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFJ1kN{M=Oi=#N<@{q@2XO^n4(dpROMtpP83g5+AQuP C_8pG^ literal 0 HcmV?d00001 diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d838422b0aefe576b980afb3f397f48f31fce06 GIT binary patch literal 486 zcmYLFu};G<5Vd2cO-qUp@DpKZ23Ca1!~zu(OkS)sHo?V-gPjU7w?D%VF?d2^;um1y zoEETj=V!lr&v!nZOvZ2T8~Ke8`hfUb6wnO9T|p8^V2x_bFb+7j0gf&u^$E1Mey;|=~d<9PIX$&Gi-;T%BW8`Z;D!S?#GnjD_wL_@Ove-aIeUw;LxY9ll;NdGB1r#CVw{e(X~Y>^Mx*&%D`r- zydP%TzStO4;cXZCPjG*pXCt;RmZ5rDnx?aAVFS(ff_4gRN$o6w8yh|zW>KB=iItUd kowR;@9V+@cd%yqIwrCPW$=PJT?Vu+otq;g>8iG4&Ui zI5!1Oy64l~d*`RSm`>yK&#ig~fG^6w2&tM;+A{(KWEvWlGX}SS0rD*%SL}`F0fu*w zjCRC=gt?=6+g_XXs;)}k`3*+JjMAPED99NCDOt`j$V23`A$0LVn`+R$p5lXCS0=?G zZ44@H(?wm)`;ED&l|~m9L|rB$7YVVJjS|AeLJ+gpzMcs2)JuJs9HUyvUT=gXy;uzk z{Okj|nC$G~JIU@%qq5RqZL(+6J=#{5Dl4@2L6502*|s)qUph`Ae;(^0Vj9gH|9=^(G4)(@IoQ4Or?H+p;Xe-RVt)Vt literal 0 HcmV?d00001 diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..139004d4ae95f805eec4f741e63f835f2a034ce7 GIT binary patch literal 1181 zcma)5J8#rL5Z?9cd_Lb@2!V)>_JouxXb}p^10={piPN}QIk%gOFMb?rnwW%mt-cwIePs)e1-y zoUoA?sTrD_y=2mq)-{us;uGu23~fYg=^*0FBaUnxvVnVxUD$xvPMS-V6hLmF$}-Nz z#fYZv9ur_4qj(IXSjZ&{4P{O&$)$0_Lwj~$=tvveI<*-@<6DWf*wIU)3z4X7T%L|N zLiEs=#s)^=zF_P&FETARmr2d&x_B8yTbMC}QI)G8tD3-Pv! zlG%)=)Vdw0i*h?wiPSClx@VHU5QR&rU%@=V&PH~bDP*b!iX*7dta@{w)BwoKz5{m z&BBMW3&MM~wVxLy$ZqGEfCf~l0(gE@mAT0Ba}h}i-@Wq(Mr{-4XSJ18Nuq7kG2oiY zj=!U&p*_WZq$FRfBr26`SpLt>mvNb(^V-FBf3r)pKf<`{r%ylryP>Pvr=%{K9+{?h z-gd54JkDOLOHCrK`!9}ySK{b!>p<-6ZEn4(Tl)ul!PZ6)IwNtsu)5g<%I&zgxXdfokxXFcp0mD{NrD>$0%2A$`Dl6;$ zPLy2+IoX-6NEWqKM&sh&>RQ4YDy&$6arrX$@%AvFG>o31X$2{}Ehls-*5vVwgwEW@ m@h3AD>>axAjXayI1+E)mlbmb!+3Z$4r<>Z`Qk-ZlyFURm!V#tb literal 0 HcmV?d00001 diff --git a/blog/admin.py b/blog/admin.py new file mode 100644 index 0000000000..28f93ab3d3 --- /dev/null +++ b/blog/admin.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from blog.models import Tag, Post + +# Register your models here. +admin.site.register(Tag) + +class PostAdmin(admin.ModelAdmin): + prepopulated_fields = {"slug": ("title",)} + +admin.site.register(Post, PostAdmin) + + + + diff --git a/blog/apps.py b/blog/apps.py new file mode 100644 index 0000000000..94788a5eac --- /dev/null +++ b/blog/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BlogConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'blog' diff --git a/blog/migrations/0001_initial.py b/blog/migrations/0001_initial.py new file mode 100644 index 0000000000..3e1850049b --- /dev/null +++ b/blog/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.5 on 2023-12-22 01:01 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('value', models.TextField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('modified_at', models.DateTimeField(auto_now=True)), + ('published_at', models.DateTimeField(blank=True, null=True)), + ('title', models.TextField(max_length=100)), + ('slug', models.SlugField()), + ('summary', models.TextField(max_length=500)), + ('content', models.TextField()), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ('tags', models.ManyToManyField(related_name='posts', to='blog.Tag')), + ], + ), + ] diff --git a/blog/migrations/__init__.py b/blog/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb17e60646132b63334b09bc01c343ad7a6d9c85 GIT binary patch literal 1231 zcmZuxJ9FDc5XK!I1VNCJY}$$KB$FZy8&aMW$z(hkKO`lYShmNa8#I_B_XHgU;1C>W znQrY?Kg7Q$-8LywIdvvQs_X%j?IOV3VPCiR?YDRMb~udw`s1zq-FKWnolhQ*W-TEO!c)FlJ?*^TJKs!b`kXcXK}pesaJA|E&YQbXUDMZqfty#F+%|X}vRH7#i6$ zs?5xUV^pZD7LC%S!JyC}bMs_r>F7tk*n7d z*V)26{_n?4l{#dkZF z`XUuTJ5t*eMMLKdTR7yzxLPlAWzISeM}Luv@|^Oo^Bny~HMvC3Tl*a z*jwtdk!6Dcr8?6!Ve0ELrL!R$iM-M1H6kum(v;Ayb4hZXroXL4ZmT7&r%KfjSG7xvaBMC_Rfz=!f~;f-vRrOzZe2SM zUd(?^Uz{91PmiA-96rYQLxhqB2anoD9NVK@+pB}|LzO+C79Ckau|Jounob-Z5Y)LU zl9%04q^u8aXU5Y&oFIg1u+YpUw{-&2i^gl$*J>^LDMSZ+4~&Ia^Y*^z1^{=cW=%IkP>_YE#os!3k-Y zZ>+#QcjS4D^D!H{-FL)BY?nsVj@ztVF$rk`4+mgxv1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFAM#Q{M=Oi=#N<@{q@2XO^n4(dpRS*qnO>Awl9``ZtREkrnU`4-AFo$Xd5gm)H$SB` NC)EyQVlfai005%aA_f2e literal 0 HcmV?d00001 diff --git a/blog/models.py b/blog/models.py new file mode 100644 index 0000000000..0b4cacdb07 --- /dev/null +++ b/blog/models.py @@ -0,0 +1,26 @@ +from django.db import models +from django.conf import settings + + +# Create your models here. +class Tag(models.Model): + value = models.TextField(max_length=100) + + def __str__(self): + return self.value + + + +class Post(models.Model): + author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) + created_at = models.DateTimeField(auto_now_add=True) + modified_at = models.DateTimeField(auto_now=True) + published_at = models.DateTimeField(blank=True, null=True) + title = models.TextField(max_length=100) + slug = models.SlugField() + summary = models.TextField(max_length=500) + content = models.TextField() + tags = models.ManyToManyField(Tag, related_name="posts") + + def __str__(self): + return self.title diff --git a/blog/tests.py b/blog/tests.py new file mode 100644 index 0000000000..7ce503c2dd --- /dev/null +++ b/blog/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/blog/views.py b/blog/views.py new file mode 100644 index 0000000000..91ea44a218 --- /dev/null +++ b/blog/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..6f69b16842957877b08f76b5b70676cf40e21c20 GIT binary patch literal 163840 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 literal 0 HcmV?d00001 From bf230da59d031da8f89439e591a6a2683b28cf6d Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Sun, 24 Dec 2023 02:04:16 +0000 Subject: [PATCH 02/38] Finish generic relationships --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 2498 -> 2498 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 904 -> 904 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 531 -> 531 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 486 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1181 -> 1792 bytes blog/admin.py | 4 +- blog/migrations/0002_comment.py | 27 ++++++ blog/migrations/0003_auto_20231223_1542.py | 49 +++++++++++ blog/migrations/0004_auto_20231223_1549.py | 79 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 0 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 0 -> 712 bytes .../0004_auto_20231223_1549.cpython-36.pyc | Bin 0 -> 1504 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 19 ++++- db.sqlite3 | Bin 163840 -> 184320 bytes 19 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 blog/migrations/0002_comment.py create mode 100644 blog/migrations/0003_auto_20231223_1542.py create mode 100644 blog/migrations/0004_auto_20231223_1549.py create mode 100644 blog/migrations/__pycache__/0002_comment.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 9cb0e756e7b067f38d407862d31bc48158ac30e6..01f87eced0ac2fab0f5294cdd104bc481152abd5 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=yD^s{Xudo=(a%mkSL delta 15 WcmZo-Y+__L=H=!3cc*0{do=(cTLjhs diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 3c76111f4f19fd82d5d3bdcd2694a45b3cabb2c9..2e11774bf50fd3e5cac02475e00e4aeca70005e0 100644 GIT binary patch delta 16 XcmX>kd`Otxn3tDp(a*Mx?7KMuE#?KL delta 16 XcmX>kd`Otxn3tEU;a^w{WC0hh^ delta 16 XcmbQtGMR^w{WCnp54 diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 55b4cfbdd2f3ee656cc460225b3cb4f53217c107..82d313d0ea9833224718a24ebd942d17295334a8 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=yD^s{XudnEuKk_3|g delta 15 WcmZo*Y+z(J=H=zmy4y05y%GQ$E(84l diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 8d838422b0aefe576b980afb3f397f48f31fce06..5a3b74caab62580ef85e4260c0fa245a6c348677 100644 GIT binary patch delta 308 zcmYk2Jxc>Y5Qb;=<8E{0QUt+Pu<^h`uoW>_SVaT{VX+D967IOo!R}dGoM4$r zQQUN)kNIWioL#No=BU>1v#cc4mzzU8+0V%4l!1{b^r^nCicN#Z_g+#FMW}llmAA_} r^w!5>-Wl7@(v=_D?_MKx=O$@Mow?3Dw)UL91VTYF#yvh}Q$E3O)vG?H delta 251 zcmZo;dB$9C%*)Gl?LkZGZw3a2$3P4REI^h65EuIZi4=wu#vF!R#wbQc5SuB7DVI5l zIhQ4hg^?kZF^e^eEtR<$DCf?Q!kog=!jQrO6lHH_j^cpIvZQh}GXeFo1~X`~y#$)b zpvicPH8F)hH#1L@=@xTHV)`wXfc)Z#%Y7NyCw_Hg;{hru;+bs2XduoCWU>QsF%yvB zU@QXh{WLizH#6!?-ohwr4B{6-)Wcc4K-Mh|o80`A(wtN~Mj)@414!^N3NZ692{8iz D5aKRT diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 9e68a92a32e7429c1acab418179d59ae571e330d..7bfcb9839d0284fb1d8652d46333bb1bc845147f 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=yD^s{XvdmAGFC4L0o delta 16 XcmeBW?qy~-=H=zmy4$jmy^Rq7A%p}; diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 139004d4ae95f805eec4f741e63f835f2a034ce7..de3f4fae61082e43aa019958582ab21bff3298e2 100644 GIT binary patch literal 1792 zcma)7OK;mo5av>(_>|;Vo+#S1Xb(mJ`;co<#E_k|Xzc{Ha@ig>ly)ss;X_?gPF(cn z00j!<-oMblwAY?;@2RJLL&~-aq(MpS?Ci|!YB=9~t4FDJ;i3hWrv5b z_%eVcSXv@jLK(plEiJK(Pps|Ud;GSw%}h5hrOGO3ex>R|b01o8Y4MOstfFgs46O%yUk#)!JC`t5KS( zCeVb<`AUkUHW46APt#_x0#t)rgVrVvBq%EqKHFeETf+!h%ryBvjN5PUd>l7I1_%&# z0dxmCAxOFnoNV5pNK}WX56=LI5{^BPoowr*!$x>+sx2AF5W8-v+v?6G<9B5wV^Hm$ z>;d7vaZobAtGAFC@Y8oNW4cR|ZCv8VE8`T4EYp7L3NWRAfqvYbV=rA0v8I~=wW7ZN zpDeA@Is;2}gyU8U+|-sz`X$B{_hL%&hJ5!w)JXas9Yh_Z??V{x`SG*S!EnU8=)f~H z&8Ou0jKl*79?uu!EUnI3gsG$SR}dyR$rjVLADjv*_o_vnC;CEvLhiv~Qe2Eml5KYp zV~tZM(@GON8|;lgX?auqH`_l)Fjcvt_N4xa@%Ayme2hNxZA~#p+dUJ=8C_F5a@=wz zTCUN~r_CqxFK#TgPRBdTMkj(+J80ufw&|IV2DUd~ODH0YaS!SLpt*;d4{I`7LF<|h X#{as#1HYkrx#0wTPxIOv-bVNj-}|4} delta 629 zcmZ`$O>5Oa6rGz)zTQjHQp8fa(p^9VaV3;esJ5%VKH5i-Y(m-@`=XPK%p^#QpxC!_ zRkGGUA^0c!2eav-dlCEt-iZp&g$d_y&rNdf&6)SPKaV@t6?F# z=>|e$QiQ-|Z09{J3f-!rm}KiJ#mistzE|p21mbg<@^Sz1- zmXFR9#|A6PHXqlLRWGXFB7WVSib~H1rB1*d8RB(zWmx;;fFs diff --git a/blog/admin.py b/blog/admin.py index 28f93ab3d3..4fb41d4148 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from blog.models import Tag, Post +from blog.models import Tag, Post, Comment # Register your models here. admin.site.register(Tag) @@ -8,7 +8,7 @@ class PostAdmin(admin.ModelAdmin): prepopulated_fields = {"slug": ("title",)} admin.site.register(Post, PostAdmin) - +admin.site.register(Comment) diff --git a/blog/migrations/0002_comment.py b/blog/migrations/0002_comment.py new file mode 100644 index 0000000000..68776ce631 --- /dev/null +++ b/blog/migrations/0002_comment.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2.5 on 2023-12-23 15:21 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0002_remove_content_type_name'), + ('blog', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', models.TextField()), + ('object_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/blog/migrations/0003_auto_20231223_1542.py b/blog/migrations/0003_auto_20231223_1542.py new file mode 100644 index 0000000000..7b056999cc --- /dev/null +++ b/blog/migrations/0003_auto_20231223_1542.py @@ -0,0 +1,49 @@ +# Generated by Django 3.2.5 on 2023-12-23 15:42 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_comment'), + ] + + operations = [ + migrations.RemoveField( + model_name='post', + name='author', + ), + migrations.RemoveField( + model_name='post', + name='content', + ), + migrations.RemoveField( + model_name='post', + name='created_at', + ), + migrations.RemoveField( + model_name='post', + name='modified_at', + ), + migrations.RemoveField( + model_name='post', + name='published_at', + ), + migrations.RemoveField( + model_name='post', + name='slug', + ), + migrations.RemoveField( + model_name='post', + name='summary', + ), + migrations.RemoveField( + model_name='post', + name='tags', + ), + migrations.RemoveField( + model_name='post', + name='title', + ), + ] diff --git a/blog/migrations/0004_auto_20231223_1549.py b/blog/migrations/0004_auto_20231223_1549.py new file mode 100644 index 0000000000..723a36036a --- /dev/null +++ b/blog/migrations/0004_auto_20231223_1549.py @@ -0,0 +1,79 @@ +# Generated by Django 3.2.5 on 2023-12-23 15:49 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('blog', '0003_auto_20231223_1542'), + ] + + operations = [ + migrations.AddField( + model_name='comment', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='comment', + name='modified_at', + field=models.DateTimeField(auto_now=True), + ), + migrations.AddField( + model_name='post', + name='author', + field=models.ForeignKey(default=django.utils.timezone.now, on_delete=django.db.models.deletion.PROTECT, to='auth.user'), + preserve_default=False, + ), + migrations.AddField( + model_name='post', + name='content', + field=models.TextField(default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='post', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='post', + name='modified_at', + field=models.DateTimeField(auto_now=True), + ), + migrations.AddField( + model_name='post', + name='published_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='post', + name='slug', + field=models.SlugField(default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='post', + name='summary', + field=models.TextField(default='test', max_length=500), + preserve_default=False, + ), + migrations.AddField( + model_name='post', + name='tags', + field=models.ManyToManyField(related_name='posts', to='blog.Tag'), + ), + migrations.AddField( + model_name='post', + name='title', + field=models.TextField(default='test', max_length=100), + preserve_default=False, + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index cb17e60646132b63334b09bc01c343ad7a6d9c85..efe41336591c53bb76a1910a0ab2b0e62b221d06 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tDp(a*Mx>?c?NE@=g{ delta 16 XcmX@ld7hKqn3tF9)%})@>?c?NFS`Zc diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cea114b1d274ff8c606c4e39cec4fa65913cac19 GIT binary patch literal 1035 zcmY*YOK;Oa5VqHjV>?ctK`IAsT*4tKa6=Vp=mRQfLA1U2vU0prW7qbYUAHB@79lSE zA^fGiA|de?;KHn(KCtD@=b7=$H}g%N_xpbD?>G2m8OBfJ-en`+#7DlsgBi@sjlv8~ zQ)7~o!V0az4(;aM$~&R++F&;8d^K1HtgL%wg1Y zdCb4IPYCOwt#@T03J?Vi>LcpILbjNB*;2O57TDr7!HA{*?Yc(mNjhx#nj~hp!d9@C z2g=*OA+Ca$mo=1iJ*z;fN9*hB&!~Wcp97tHsCLmZDnQxOoF^*4prjfE)!pJn zfe92z+0m{dd)q@>1<_f}X)GYBfvH|4(jpQwdI~e;Nf7v5dI>5x2QlSxp1eD+r#wE* zAg*c3ZrL>)F4yjJ9o>6DEj(UQ6aZ>aq~@yI)aC*`c0=7cNg-$QU`T|6Vu&sth+U06 zjaQXRn=UC;KBXwnc%Q?H9h4W!I!#)gAZKdgwJ6Q^+`aq zR)3cZNR#p{PSRmnR3=;zHdSuZJ8mNCF*)3tZ0{(aS1{ksABGrWvF7-*G5*907{{EY ze0;&hsjQ+H#?xFU!ylfE@Ai7!EJWN&JgR1*gL(AOv69m;5QZgNb`r+{N@(faoO2G$P%z9@T*Vd8xzQ-r;yB2bk!)_R1%{3X;g!@v z!z<9h%DJ0!i)QxMx0==NYPH*Jl3#znfntRGB(sG+xj?f|Q6!O6k(QQ}l1m~38Ga=) z1bPgPvJCa4eF^*)^C2dn1F*Lffl|Q;$DZ&Ms{fq*nq>|v(hczujV8=*?lF8_M zaLe(G7c*YYcs1i>#_JiUGv0WvS7j_8V8f5x>djrJj_sAMUAoG=H*LHBR z7>9#4S%44I5)|)53yw{?sB|~@(4;aT29R6~ZjE8h`{v}N{kT_+J)Asd)mXcQ9otrz z8^;DwTNe$@px`PCj32p)P_l(v@~IH#F5w(AjtY=d&OeSq`QqM_&_gGos~WH-z>9AE z7FzuYUN@kmOLPynKkOn z4ngx`TkOt@V#m*)KP%4q8xvx-7|p&wS%xuVG@x!Ek%0jo2N8iAi+)rmM>2OdFAU{|L!#W2cnF$R{#J2 literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75131bdf3eb1016c70d00a2dbfc54eda71a0b497 GIT binary patch literal 1504 zcmah}OK;mo5awGXMcJ}r$4#5QZWRJZj+~$^P!vfUI|W)NMXdC|%YxFZX);T$!d=#p zuPM-ze@Oq*UVF;Dr=B`X>X9HVN?~V5Gv9tQoSEfOuNS^Ff2UuBhViHI*5jc50GId< z1sGs5qcCIB)Vjs2!jA32iJj)Z&D_{SyUjYW_t*dj+}{jvsh#_;?brwV%ouoYkjEI9 z$`@41tW3qgQely$RU$K93gs0XC=*X+8n=3OP0yp6RK6vLHBe;d0 zefSVQg4^%#eY`yJ$>v1bjc>xI*qP5&aJp)Pa;A)@>frG3@Q5U}vRxNaZ2mf>&38-iI}kA+oFe0WXo2 zQAw30xz4(jnDxMH-O;?BvP@jGku2p-SyH~h^lHYGBUqiPj;MKhuJ(0OuFNE(Zvgct$mQW)bx;fr zluw!h5u!puunIM!s7HjntP`dg2&rt%u_rE*`8=7TALyKxK+D;pvb1aa;q%E4ZRmL>Io&H(T`{VRn`6FE@3#Q6%YKym4b$)*KbaMRtL&8K37(|Pax>HK;)UsNtq2Dn6y z!nZ@ya~#vc->&Idt+ut?Z?7%=we~)$zeH~^(Hgz-MP?Is5U6fj#~}{fdE1s?X@P0e z!M6Ih*2ZD`)f=uVTHV3CBex?j3&sYXsz}Y;+6kRJ2cD&JR Di_n)< literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 3c8e3937af064811f84e8911326f2545f0a9bfaf..b9a634c61fda21ba1639582303c481bc020fc4f0 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=yD^s{XudkX*`(FC*r delta 15 WcmeBX>}F&)=H=zmy4y05y#)XqZ3G?w diff --git a/blog/models.py b/blog/models.py index 0b4cacdb07..25fc5fa3d6 100644 --- a/blog/models.py +++ b/blog/models.py @@ -1,7 +1,8 @@ from django.db import models from django.conf import settings - - +from django.contrib.contenttypes.fields import GenericRelation +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.fields import GenericForeignKey # Create your models here. class Tag(models.Model): value = models.TextField(max_length=100) @@ -10,6 +11,15 @@ def __str__(self): return self.value +class Comment(models.Model): + creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + content = models.TextField() + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey("content_type", "object_id") + created_at = models.DateTimeField(auto_now_add=True) + modified_at = models.DateTimeField(auto_now=True) + class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) @@ -21,6 +31,11 @@ class Post(models.Model): summary = models.TextField(max_length=500) content = models.TextField() tags = models.ManyToManyField(Tag, related_name="posts") + comments = GenericRelation(Comment) def __str__(self): return self.title + + + + diff --git a/db.sqlite3 b/db.sqlite3 index 6f69b16842957877b08f76b5b70676cf40e21c20..feb2ae6a7fa9dd963ece6afd493b09d7be365e9d 100644 GIT binary patch delta 1512 zcmZ`(L2MgE6rJzg&3ZR=zn#W7B>}J3b`!U8Vz1*SF_gp&5fqW6idyy5+K#<(+&JDS zF@YXXyo$m=nU{K^~8mD@voX=@jUJ| zqr~a9nO?kF;qBe5cw4+$)l1?+%*hewWAT~1mJNkMkwogbqLxrXN+hf(kwiE;pqP_j zSP3c-DIARrD6xUzzVMI|jSly>Q?9?kRT61!VL>evcN3IwEIQCPG^B)v25aulU)Zh* zB47;gS4`q3xPlk(BYYEMIE@q7UDX8~#>-@%S#r~3w=;e)i)ODyEFOQ~W`D=a%j`c=RL!Q1!^evhAF zqGk_Gpu^5OJL_4uI}<94BNrbM@C?D<@H_k(KgGB3Wqc7eJX6)5LB1<5t@R+lnn^o2=^p?wM+1!4JYpPJO=7lCPbG00U9b#P~2+;jhQ7I6`+Zg2Af(BHTu>aPGxDQjhY^>JN@^R5X$=)qheqrT95bcytmnks5biCiWzG&?*vIGk3R zzxNt9XJFsz_72_;ElX3AlHAOZr5<@_SvjD0jPkBiG=2O&>9s!Gzvp zuRw_LiJJz09pcv3XIf?PA91s)za*~8K8}DtxJ$!hse)u`TG~Fn173;=g#RaM6SXDt zdpLOuw_E2XZY$EjNgj&x9x|oxYG~g?(Rl;1k^ccM4%8f_-?6;zc>4=`O)A}>!|q3T z+Ms!F`lubG)l$161UNY|_kF`wiECdxzki>f)=kp3|-7Z^&9$1_bN7 JNsGOK`w!PAttJ2f delta 1764 zcmaJ>U2NM_6!x)`I!=F1OV=5+(paWjYgpF&E@{ip!j_Ges;#D0>;+OcNmGxc4v8~u zNRWE`JWw81Ws@bOL7&FM5G>@O5-=h0G6`PBBTNVc4+Atdja5aWAh=H2tjXF&a_oD) z@7(XZ=iGbemm25i?dSHiIVp)#ajn#reiylpu4Xc9 zZ*&yc)}Eq%*Ish$`Ni_^dlZKw6#j-&_&J`!1^fu##~V0O)IGTCA!H<&PO6DWTFq(^ zO-^L#!c^bmAQTq*o(tQ^ge-ZQS{MgcrF8()2eFg#Ttbbcltf0>6m>4!ZYM+=rYXFQ z-{ALn71Q`SF5yB^KY@kxGv{~NP^It>{0_gyFYp6=2VX@$eAT?#{6rJe=(NAh{mEUmwX#33-3>Pz#;xC4jxrAVQ~DsBrT(JSMSU=@Tc2k6 zAqn)o%3Lgdy1K}6EzG}&5{tNk0e{r*ch{o5hmVIt6JcR!^ho%GAl8EQsiH78TF()M z-n>|m5GCFA6w5zPj7VDk=@aNI~tU0#d>yhQlGoo%1aw&5Z)d;IaJHxS9qDX-M}+Gpfb(2=hVR<;^h%U1cDy=`S}zfdjMtAi{bc7Xn9 zokuyR&8iu*ZLwHD4*G(5f7QU=?F#iklE2Q0S)VFNlwKZS`9UJi)rn`5xkO~T-|q`} zXFTh&`K;Exoo)?(3rQ0frL*1rEH6p$CZmzg$E(XJZ_?V)W9v#2p=U?Jl?}&L54VBG z;2>_aS(sK5%A96=d<=HqKi$TE!?3UIew{b7Y-KIdHo6P#$~V-?B=x#s8OgD^^=&_Ij~cqkk{#S z^WbrLyiT{r>G29~?||Dk;0_+>_XXU3|8_{frw;KB_`DOdN+u^9RWeyk7$@gKGsn&u zbL=$Rsl^FkehAZ#oDs@sIfXX8(Rh!-zwutFZT=?mR@y>wKwE&kIP=a1yhY(H0{)C$ z?TnMFpS!|Yqi}5*TIsvkW?_J%%_xm4B#J8}_g8Fcuy6o0ZLx41cj*e<+Ek&eQuq(9 R63Xvr-1!o$R+?cr?tkEgAEE#N From a6fa77a4d3e6292b60e81b0be47743329e282b28 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Mon, 25 Dec 2023 04:06:00 +0000 Subject: [PATCH 03/38] Finish html frameworks --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 2498 -> 2528 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 904 -> 962 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 531 -> 531 bytes blango/settings.py | 2 ++ blango/templates/base.html | 16 ++++++++++++++++ blango/templates/blog/index.html | 0 blango/urls.py | 3 +++ blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 486 -> 486 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1181 -> 1181 bytes blog/__pycache__/views.cpython-36.pyc | Bin 0 -> 299 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/templates/base.html | 18 ++++++++++++++++++ blog/templates/blog/index.html | 10 ++++++++++ blog/urls.py | 7 +++++++ blog/views.py | 2 ++ 19 files changed, 58 insertions(+) create mode 100644 blango/templates/base.html create mode 100644 blango/templates/blog/index.html create mode 100644 blog/__pycache__/views.cpython-36.pyc create mode 100644 blog/templates/base.html create mode 100644 blog/templates/blog/index.html create mode 100644 blog/urls.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 9cb0e756e7b067f38d407862d31bc48158ac30e6..d5e47cd5ee2c196f361f7a5c378e5f016afbf5d0 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=yD`lM|ldo=(abp(e1 delta 15 WcmZo-Y+__L=H=!3cc*0{do=(cTLjhs diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 3c76111f4f19fd82d5d3bdcd2694a45b3cabb2c9..f692bacf914a583dc6535a724edc142d127025b0 100644 GIT binary patch delta 364 zcmZ9IyGjFL5QYEQ>^-}=ZIVs0iMg1I(HIM{m4M(2h=n5-!daHY2$BTb6oS2M8yjC? z-@wO6C0O_x{-hEIzTq&O84mO5eR+dZ*R^kcUc+uih;Q+yOsOZ5Wr2jae(Md_p#e1z z5v@&VY(ZxmMns&38Pd#|xv*Zy7qET787Q1Z`u|+Ib8;^)DZr5qhdsE+Ad4LGD8P#h zE~1DM%J5N%G%lgaWz-^p2ORBxU`Qs1x5A6K!G0A0_X`GwCC#7NfXoUAT}^CzG61PO;<2y8Q*C=}s#E delta 332 zcmZ9I%Syvw5QYCqb5GM-+NN!KRcmduZloI*QV@IrcjHPqA+$>?ZWXEzAlddUvg+0c z5y2O6=t>;;4u|2)FwA%G8H_J{-+ldhOZ1XbKk84};upf&B=s?wzCdRi20JiQVi#6I zD{obVy`fOS2^IU$xCHlqU(#ins|ZzilJK~OB7BrkMg>*WQi}rwsH1@*Lu PgIJwxDi$i)yL0yo6COr& diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 007051089077a0c83360f2cbc5835d874dbd7579..473d0ef549e9be3e0cf2c86647cd0ee91327f003 100644 GIT binary patch delta 240 zcmeBRKg3>d%*)HA^QtXXiJ5`nF#{4{0kR!{xYz|qq%cG=q%fv17+U&6diR#hJy`%#_X)#ht8swwkoS(NbyPS#FuZk@(B{wrq{}zKL&*ZmE22N32NjdrHdS#iZ<;AyHK65mN>^w{WB=Q7e delta 16 XcmbQtGMR^w{WCnp54 diff --git a/blango/settings.py b/blango/settings.py index c1795cc999..6245cd60b0 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -15,6 +15,8 @@ # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent +DIRS: [BASE_DIR / 'templates'] + # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ diff --git a/blango/templates/base.html b/blango/templates/base.html new file mode 100644 index 0000000000..6a1e1a602f --- /dev/null +++ b/blango/templates/base.html @@ -0,0 +1,16 @@ + + + + + + + Hello, world! + + +

Hello, world!

+ {% block content %} + + {% endblock %} + + + diff --git a/blango/templates/blog/index.html b/blango/templates/blog/index.html new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blango/urls.py b/blango/urls.py index cde05802f9..db6c067875 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -15,7 +15,10 @@ """ from django.contrib import admin from django.urls import path +import blog.views urlpatterns = [ path('admin/', admin.site.urls), + path("", blog.views.index) + ] diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 55b4cfbdd2f3ee656cc460225b3cb4f53217c107..6fa615496d302e54733642f339f07ff3ce6a5601 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=yD`lM|ldnEuKI|P9M delta 15 WcmZo*Y+z(J=H=zmy4y05y%GQ$E(84l diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 8d838422b0aefe576b980afb3f397f48f31fce06..7688e760b11ee6a15ac119fab081434fa0ac505c 100644 GIT binary patch delta 16 XcmaFH{EV61n3tDp>65mN?DrV~Ff|3( delta 16 XcmaFH{EV61n3tF9+Jlyj?DrV~F=_?_ diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 9e68a92a32e7429c1acab418179d59ae571e330d..e19d1228391de52c2e5cdfb86e791ccb870732b6 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=yD`lM|mdmAGFB^3nC delta 16 XcmeBW?qy~-=H=zmy4$jmy^Rq7A%p}; diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 139004d4ae95f805eec4f741e63f835f2a034ce7..5bfd9ac3c428fe5a95332d2619130fd22c0b3163 100644 GIT binary patch delta 16 XcmbQsIhT{&n3tDp>65mN?9*5PC%^>^ delta 16 XcmbQsIhT{&n3tDp^Zk~M?9*5PC;9~w diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6d4c1969efe62fe6a36a0cd293767064d21f29f GIT binary patch literal 299 zcmYjMu};G<6nu7?f+{K)`wL-+2i6K9v3Ft1*5+AFz^Pl?p@3jOApV74%F5JV=)~Cr z;z@VU_Ir0HUrnczx5JlyC!!zVuOv=4fS-YwSQzR=B?PhL?2{_VqdO|{1Ey4nVeIsV zwW~$Eqhim1Tfk31fnH(qAt92Bm-CgeYt=&XR5qbAg>W$tMkh}1dhNqExe;EDm#VRy zR<-5Us=aj&e!Hx-TAAf$ZP8%!*y_D6x6ebK45Q3PHxh0PUKCk%!S`{$^o@0)?t@Qp YX`EvIQ4Yy)I`1s^MqkH&B(t;Z7c1pKfdBvi literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index cb17e60646132b63334b09bc01c343ad7a6d9c85..dff2108477ed47b6561b7800968c2e82c9d7f351 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tDp>65mN>?c?NE&v6h delta 16 XcmX@ld7hKqn3tF9)%})@>?c?NFS`Zc diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 3c8e3937af064811f84e8911326f2545f0a9bfaf..57d12ad3c19f500485c604dcf6509356eb2c41e1 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=yD`lM|ldkX*`dIX{X delta 15 WcmeBX>}F&)=H=zmy4y05y#)XqZ3G?w diff --git a/blog/templates/base.html b/blog/templates/base.html new file mode 100644 index 0000000000..3dc5ea91ae --- /dev/null +++ b/blog/templates/base.html @@ -0,0 +1,18 @@ + + + + + + + Hello, world! + + +
+ {% block content %} + + {% endblock %} +
+ + + + diff --git a/blog/templates/blog/index.html b/blog/templates/blog/index.html new file mode 100644 index 0000000000..a1a5e4af49 --- /dev/null +++ b/blog/templates/blog/index.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% block content %} +
+
Column 1
+
Column 2
+
Column 3
+
+ + +{% endblock %} \ No newline at end of file diff --git a/blog/urls.py b/blog/urls.py new file mode 100644 index 0000000000..4a842e5787 --- /dev/null +++ b/blog/urls.py @@ -0,0 +1,7 @@ +# # other imports +# import blog.views + +# urlpatterns = [ +# # other patterns +# path("", blog.views.index) +# ] diff --git a/blog/views.py b/blog/views.py index 91ea44a218..9a5bffd5b2 100644 --- a/blog/views.py +++ b/blog/views.py @@ -1,3 +1,5 @@ from django.shortcuts import render # Create your views here. +def index(request): + return render(request, "blog/index.html") From 6418dbc47b8bbce809e13199a9f095cdb99d401d Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Tue, 26 Dec 2023 14:44:25 +0000 Subject: [PATCH 04/38] Local model fix --- blog/migrations/0004_auto_20231226_1443.py | 84 ++++++++++++++++++++++ blog/models.py | 14 ++-- 2 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 blog/migrations/0004_auto_20231226_1443.py diff --git a/blog/migrations/0004_auto_20231226_1443.py b/blog/migrations/0004_auto_20231226_1443.py new file mode 100644 index 0000000000..e009b3ec1b --- /dev/null +++ b/blog/migrations/0004_auto_20231226_1443.py @@ -0,0 +1,84 @@ +# Generated by Django 3.2.5 on 2023-12-26 14:43 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('blog', '0003_auto_20231223_1542'), + ] + + operations = [ + migrations.AddField( + model_name='comment', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='comment', + name='modified_at', + field=models.DateTimeField(auto_now=True), + ), + migrations.AddField( + model_name='post', + name='author', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='post', + name='content', + field=models.TextField(default='content'), + ), + migrations.AddField( + model_name='post', + name='created_at', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + migrations.AddField( + model_name='post', + name='modified_at', + field=models.DateTimeField(auto_now=True), + ), + migrations.AddField( + model_name='post', + name='published_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='post', + name='slug', + field=models.SlugField(default='test'), + ), + migrations.AddField( + model_name='post', + name='summary', + field=models.TextField(default='summary', max_length=500), + ), + migrations.AddField( + model_name='post', + name='tags', + field=models.ManyToManyField(related_name='posts', to='blog.Tag'), + ), + migrations.AddField( + model_name='post', + name='title', + field=models.TextField(default='title', max_length=100), + ), + migrations.AlterField( + model_name='comment', + name='content', + field=models.TextField(default='content'), + ), + migrations.AlterField( + model_name='comment', + name='object_id', + field=models.PositiveIntegerField(default=1), + ), + ] diff --git a/blog/models.py b/blog/models.py index 25fc5fa3d6..a2c52f2fe8 100644 --- a/blog/models.py +++ b/blog/models.py @@ -13,23 +13,23 @@ def __str__(self): class Comment(models.Model): creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - content = models.TextField() + content = models.TextField(default="content") content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - object_id = models.PositiveIntegerField() + object_id = models.PositiveIntegerField(default=1) content_object = GenericForeignKey("content_type", "object_id") created_at = models.DateTimeField(auto_now_add=True) modified_at = models.DateTimeField(auto_now=True) class Post(models.Model): - author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) + author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, default =1) created_at = models.DateTimeField(auto_now_add=True) modified_at = models.DateTimeField(auto_now=True) published_at = models.DateTimeField(blank=True, null=True) - title = models.TextField(max_length=100) - slug = models.SlugField() - summary = models.TextField(max_length=500) - content = models.TextField() + title = models.TextField(max_length=100, default="title") + slug = models.SlugField(default = "test") + summary = models.TextField(max_length=500, default="summary") + content = models.TextField(default="content") tags = models.ManyToManyField(Tag, related_name="posts") comments = GenericRelation(Comment) From 04d12b828ed2d9cea383fdd37d8940f8d772d392 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Tue, 26 Dec 2023 15:58:32 +0000 Subject: [PATCH 05/38] Finish custom filters --- blango/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 0 -> 2528 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 0 -> 962 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 531 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 486 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1181 -> 1878 bytes blog/__pycache__/views.cpython-36.pyc | Bin 299 -> 475 bytes blog/migrations/0004_auto_20231223_1549.py | 79 ------------------ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231223_1549.cpython-36.pyc | Bin 1504 -> 1504 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 0 -> 1567 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/templates/blog/index.html | 22 ++++- blog/templatetags/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 0 -> 764 bytes blog/templatetags/blog_extras.py | 32 +++++++ blog/views.py | 8 +- db.sqlite3 | Bin 184320 -> 184320 bytes 23 files changed, 58 insertions(+), 83 deletions(-) create mode 100644 blango/__pycache__/__init__.cpython-36.pyc create mode 100644 blango/__pycache__/settings.cpython-36.pyc create mode 100644 blango/__pycache__/urls.cpython-36.pyc create mode 100644 blango/__pycache__/wsgi.cpython-36.pyc delete mode 100644 blog/migrations/0004_auto_20231223_1549.py create mode 100644 blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc create mode 100644 blog/templatetags/__init__.py create mode 100644 blog/templatetags/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/templatetags/__pycache__/blog_extras.cpython-36.pyc create mode 100644 blog/templatetags/blog_extras.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..701930cc37b49ce4d5fa0a6b38daced621a8c1fb GIT binary patch literal 130 zcmXr!<>k`3+m*@y1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFMa)t{M=Oi=#N<@{q@2XO^n4f7ZEE!2A zL^r+QuFt>=^p!Nzt6udLdexO|C$7Tk{pjD2#r ze~rsuU>T;x0HZU&Lds@!7N2Q5)lKVZmLX}vePKIOUzkp&lhLyz3*0hevA^YDN}q;| zo`NAidY-hGJ2h(5JB?j_Kj9!40eg$SGepZn3UCGH;VLY^ zH7lzx!XjLU8?Xd7tttIF+|qBrZHs{nEW;hR3-{o@#ZeacuN>kn!HRwp9>7D)?$I&> zt6x);)o;OLc!D;M;c0R&CigYUTAY3x*7arB(C=UtcX8drbstJP4}!h|DU~UT<~kCS zuXIeua(SNw0d*{&KXyI-$WCNE&+U+QAmsCV#37y;5a5r__$QFKluYPShxY^13x<|Y z_`Z)I{19_ncqTkY?+wl9wI6$kLa3E_|Xw$0nr4|w8bvnZ4$R;rnhr>}XCo&juN+En&=y--#vHN|+Ns9HnX zm%~Eo#pdRw&~|~k0(HaOh_8rixDE*y2T7oT6L|DUNXiplo0Rs0lW=)L7`qTB2+n%= zGD{OmpZGo&?6RVZ3e!T5+mjvvmbe`k*4Mcs+qJ^d(4tELY;tOPL`ayT!I_}Ol;LLo zTo>+40uECU#{AWRY|N{8ISBSm*L8$)@)$FHJ`un~R>r|4{EdXrcG9b3j+2>55#G-IdC3 z<)niHBiUt@1Ffbs)NpCY)~Rn%!R+k3M;GMzA8i_t?J$qR;l7xP zGIC?D){t>TaD=>B9N_THMBYj5d#3N7x*iyKNKiPVTw4VzOScSS~<*# zc$Q<&i{afNE>hWbf!MyVOD&uUw@Qf(#RpN=Fz}Q%j40*$QMQN2p-qpx6w({z3?rU= z)MY*5yY?p%WqLU9PN3&@B~^}#?PX)jyegNQvSz%Me~qRp@@{J{noABqxssfEYLq3; zC+fLQl(t9^UHQeRHnEJxuu-DLvf8W~Wkq>glMNL$YE6@eQmxriH3U+cHEaMiTKJEx zTy8bx=(;MaDz@A?#6Y|>DIOsg5J}oN~JCzN{BVvR20o@lLAOP^sWt%+;mF zUQ61OF}aG2fHiz^UBOn)wUETx){DkqSKr!fM44Eo=}4)DG0Jfs(LzP8O0BwPU<}2m z*5rES560U-=9Ak$qIlwViJ1JKh}iod{GQn+;$ZkjkI~<(&^wEAKVdWUZSracF?_&V zhRw0F>G@PX%cZ$ghFxSi_6Dxx%BI+hE5jxGREo`T-1&Z>FJ!pHwvf-H<13%zQo}35 GP5lc7mpkDA literal 0 HcmV?d00001 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..619e46ef3b1ece05cf60294a5d72e09d9258de17 GIT binary patch literal 962 zcma)5%Z}496m`?|LE6GESZvye5{sE##URkYh>;Kr9-C}BZtS)$u^rhCGsAXv{0YAl zi4`k;ffd(oDpg2GlPJ!ObA9eP=h~-}NizTWoj>j(^a~wbF~l$7v9DoZC`YWrqOv2S zJnHzkTXtof$03f(Uf$<1>+xte*bVO@i2J<1d$3FHqD_>KSo{&C1F9p0RwY#%jX!^Q zhtIWIi%o5)6Ivz7r!B`2d;Zj(KjjkQHeu2eKx48~xf0`2j+e3s&MYvp2Z*S;N@H~c`d&7B8R?#*^p z>J0${50$2VBH&KbH2Dp?7p0x1N0}4~g4jF${#!qMlLn>ZX0Tks4p}bqhb<}4;*3}s z*siD<9WgaHAJ3c=qd_Hh$i;dm2!F->p(qbC&OH_hm%-9M0-!1^%!c|v@DNuin0 p>`Dt$AggLzKh1TLq0~3}BR-(MtaHwGknk_}G)+r-OkZd{?Ri#xfoI*352EK1W zq{JGSGC{9gCm5PQt}L4=4F}8uBy;B~`L)}uJ2}9aFAu5qV@Z&k2DYV(}uOCLC1H&ELDxhC!tZoOk8W{cQyq7k~#^6Yk2+; rOqalOlnVI@>)*B#Iq+8cH8kXDb>n+q+Tnifg?`&WhxX_$eM4UWckQOA literal 0 HcmV?d00001 diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 6fa615496d302e54733642f339f07ff3ce6a5601..29fb8ca2f11ce44ddd0e20738db1a1b399284848 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=zmx!X07y%GQ$QUnD6 delta 15 WcmZo*Y+z(J=H=yD`lM|ldnEuKI|P9M diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 7688e760b11ee6a15ac119fab081434fa0ac505c..46ca77a9621d2c725bf02f8f717c32018a2a8ae4 100644 GIT binary patch delta 308 zcmYk2Jxc>Y5Qb;=<8E{0QixzH*m#gauoW>_SS1Jw!eSHHCERhFgWa>XII*x0LjK*N zl_2;poHZg2%*#77&+Nc{@@MgQT9(E1{ly+4zz6&bLH>d=+>;nE*n&fim^^El=$r(AsnQ5(ov!829;@?ePhI1L@8_xBvhE delta 251 zcmZo;dB$9C%*)HQ^hsOlZw3a2$3P4REI^h65EuIZi4=wu#vF!R#wbQc5SuB7DVI5l zIhQ4hg^?kZF^e^eEtR<$DCf?Q!kog=!jQrO6lHH_j^cpIvZQh}GXeFo1~X`~y#$)b zpvicPH8F)hH#1L@=@xTHV)`wXfc)Z#%Y7NyCw_Hg;{hru;+bs2XduoCWU>QsF%yvB zU@QXh{WLizH#6!?-ohwr4B{6-)Wcc4K-Mh|o80`A(wtN~Mj)@414!^N3NZ692{8iz D=p`;D diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index e19d1228391de52c2e5cdfb86e791ccb870732b6..64d6c5777d67d65055b377e0204d979fd5d29964 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=zmx!bjoy^Rq7A+Q8d delta 16 XcmeBW?qy~-=H=yD`lM|mdmAGFB^3nC diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 5bfd9ac3c428fe5a95332d2619130fd22c0b3163..ff1f80c2760b61e6f45aa168086b7026c830edcf 100644 GIT binary patch literal 1878 zcma)7OK&4Z5T2fg=i#xPINm29Eek?eNXdaKLWz>>f*{#d;=RmeG;w#FapnMIgb?wmOBRgd#nX+ezDHPuyJJ=OJn)&9EIi%$RiRX82X`op^OxX?E- znsW$laaLF*OBf^FF6`1t9HTphTY8CSbhqe~e&QS5gFQ$BW<9rfhx>0W?h7^#FP$WU zCEy_};nLEDCE{IJx=TyU<3nrQyTZ4vG1Hy0=Avkz1&vTDuV$nVo{LJze0m^?OyzY2 zQ+KKEOTN)nOuVC&W7 zyY$uJ?m@cuVrTb9WVdy=y|uHO_){q|RZBUf=zAnQ5)UbC^s;Vpm7k06!Q7dUEhLY~ zPZUb}*GaeO>fTPK#3V0;S*Rnkx8P}}bQgH%$GMr@LD7I}pj^X-gmXh8U_%zO6^sZ& zlJ7lGDaB2U<~N8BgNiP3maw8zmavBC8V@>wOS;250KWwoQ1TG7K70e}d8{Lldpzbn z<5@MczVQ&`YhuI)d<8N0#C`GLk|huMDj%XNAMrJiV5D6XP{{{Ka%{^HUh+N!FqMzV z#^guFr9En@Q|(rZqL2Y>+EckI1foLBOq6z&Xh0`3$^QatwBIbsGLshux5PWc$LR8j zCEYqGHTBg0x&h=DZ8}~0*lnX3U)E|l^lO&x{U=t9t}_OR1HVDjPv1Hu1||;G*ZK( zB+AA)KKXb!D`IVWQMZIBN-YFs7T^%4z3bqg*5>iuL92F!$f8sUQF}rlwMq#4LcFP> zWHzHIwQdLMyxfjeB6SPC?vSCK7mPhjIS-8~1+$MI1Fk;L2-c>8IEj?u2lO5?_ zvGBg^g798#?dL@avfFtkpaE5?0G=OJWiGP(Ohi(`cW?cHQQO4%X>Dayl4u)s47jGU zpDaqF=iAp6KmjAQ!Wn3ocymqnO-|Q0Y4=`@~>C=z@Zs@A^DXB}QN2ckW zx1DPhkF%HRLX(K={p<-6ZEn4)Tl)ul!PZ6)Iw8Mn&9};>L`helg871I&zgxXdfokxXFcp0mD{NrD>$0%2A$`Dl6;$ zPLy2)IoX-6NEWqKM&sh&>RQ4YDy&$6arrX$@%AvFG>o31X$2{}Ehls-*5uKQgwEW@ m@y9b3>>axAjXayI1+E)mlbmb!$?R4dx diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index a6d4c1969efe62fe6a36a0cd293767064d21f29f..4e557171033a04e3c3283c3d4bf2d42c5edb6c9b 100644 GIT binary patch literal 475 zcmYk2y-ve05XbE}PD-1Kk4In&LxRML5E6TZ#FnLMV$(P{aj_i=RheKyV&E}&B}+_9 zyaE&Fh@mIl-CyUs`<;9?osK`g-gu7@`bIkzfW8Dbrw|xoSfUme7<(Papd|$vG?8IT z3ko`9^c58mi*8UF|G*SVv5PeC7}uaiRoF<9L%FA_!YQ0hG0>Ho4}GL zd;#z~e#Vw=0n5l13;aR=5YAFu9IpCO3R817U)cFvTE5vYrCR0!n2%X)Tj}TuP$rFZ z2#Z~;%7$0gxad|uyVk^4NvGD@Uy%kb*8INb#%h1jC(>g`zbARETAo*m36-yvzB8*u z#q&}wx}|~y$OpmKCR;r@I>7f}%y=ZiM_4D2XK7pW$tMkh}1dhNqExe;EDm#VRy zR<-5Us=aj&e!Hx-TAAf$ZP8%!*y_D6x6ebK45Q3PHxh0PUKCk%!S`{$^o@0)?t@Qp YX`EvIQ4Yy)I`1s^MqkH&B(t;Z7c1pKfdBvi diff --git a/blog/migrations/0004_auto_20231223_1549.py b/blog/migrations/0004_auto_20231223_1549.py deleted file mode 100644 index 723a36036a..0000000000 --- a/blog/migrations/0004_auto_20231223_1549.py +++ /dev/null @@ -1,79 +0,0 @@ -# Generated by Django 3.2.5 on 2023-12-23 15:49 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('blog', '0003_auto_20231223_1542'), - ] - - operations = [ - migrations.AddField( - model_name='comment', - name='created_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), - preserve_default=False, - ), - migrations.AddField( - model_name='comment', - name='modified_at', - field=models.DateTimeField(auto_now=True), - ), - migrations.AddField( - model_name='post', - name='author', - field=models.ForeignKey(default=django.utils.timezone.now, on_delete=django.db.models.deletion.PROTECT, to='auth.user'), - preserve_default=False, - ), - migrations.AddField( - model_name='post', - name='content', - field=models.TextField(default=django.utils.timezone.now), - preserve_default=False, - ), - migrations.AddField( - model_name='post', - name='created_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), - preserve_default=False, - ), - migrations.AddField( - model_name='post', - name='modified_at', - field=models.DateTimeField(auto_now=True), - ), - migrations.AddField( - model_name='post', - name='published_at', - field=models.DateTimeField(blank=True, null=True), - ), - migrations.AddField( - model_name='post', - name='slug', - field=models.SlugField(default=django.utils.timezone.now), - preserve_default=False, - ), - migrations.AddField( - model_name='post', - name='summary', - field=models.TextField(default='test', max_length=500), - preserve_default=False, - ), - migrations.AddField( - model_name='post', - name='tags', - field=models.ManyToManyField(related_name='posts', to='blog.Tag'), - ), - migrations.AddField( - model_name='post', - name='title', - field=models.TextField(default='test', max_length=100), - preserve_default=False, - ), - ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index dff2108477ed47b6561b7800968c2e82c9d7f351..c2630c1e7ae5f87edd90849b9ce034d4c86581c2 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tDJ=Wf?V_7f}sDw_o+ delta 16 XcmX@ld7hKqn3tDp>65mN>?c?NE&v6h diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index cea114b1d274ff8c606c4e39cec4fa65913cac19..60135599e19c606e2341e73185813faea933d7dd 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=zmx!bjoorMJeApZl{ delta 16 XcmeC?=;mNI=H=z${@u2borMJeAh-k3 diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 94f52e93800efeb0a49e1061281199eed1c9c1f4..32728f8698f8ac829b9bbdcc514800b6e65bd092 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tDJ=Wf?V_Jd3SDM<5_uF9`+R diff --git a/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc index 75131bdf3eb1016c70d00a2dbfc54eda71a0b497..94bab465c5f4aff4327f245ac325dac2d06e2f30 100644 GIT binary patch delta 16 XcmaFB{eYX@n3tDJ=Wf?V_M5B#Ec69l delta 16 XcmaFB{eYX@n3tEUkgOK;mo5awGX^|0dj5w}TSHytY3lG{szB5q@+Me8Jpl?yKmO0%ZOEV(SXilYEM zrKbY=A^l5xEl|Mso_gvmDaDTzrNH6vn~&d&W`-QK+y1YA{Z5y@rv0g1J1q1c;aPr% z1~kx_mg<47E8k#7Y6fO%1y*%$GCOb(H(4Wao@ii!{hJ0hH52!p8Mt7cX+7r>b+n!? z-I59sXHnTRq@Tu75sH{+rF2pbl$B4Xinl&C(RqYtIny;WoTUK`aF^C9?$vSdmpU|;W`(w(jpzn+@TqR%C3lidr3@QO z^BSj%oV(D4J2#&E|9ma@?|hr9Dr~rm^b1-^#I5W!`~ZxOaoShxj&p1Rulw z8~B5Y{{TL@#^1r-eE1I(`YEz^p|j2zwS#-`8P4hp>7A|zBdrPJk=)(i-ye~1E;t$P z4@U>X;fNf3bvTrbDNj?H3F%J@8VU*|6k{B1tKw$-f`kCF0rWhaGjY>rl)9Y|6pHEm^&gvY7v?nagUSVN##-vrUc_b}CQM*yj(=;p= z@!zQ4GwP@PG<-uC%_1>FS{RkmR)v&rUDdVzIE+*)3d*X^s6SimsG@8U3q~)YE^w02 zsUR^tMOg=-qJgHjCtXr?i4f@%f~}Y{ihhfbU*;iGVuTc?lGrLQ!aNTr7zdiu3}`l8 z6ov|I9K9U>Kwh35zaXd29v}ZKTkjb$Ev0(|aH6_js25(gA7i28IHeUP9Z13~;?kar zm?2qU6;DQ&g z$~>IXff{1O@xr6Q)i-8*SBKbrk@=Zi0~`e1t% kucp>t53Nda)w}F&)=H=zmx!X07y#)Xqkpw0H delta 15 WcmeBX>}F&)=H=yD`lM|ldkX*`dIX{X diff --git a/blog/templates/blog/index.html b/blog/templates/blog/index.html index a1a5e4af49..a2cabe02f4 100644 --- a/blog/templates/blog/index.html +++ b/blog/templates/blog/index.html @@ -1,10 +1,26 @@ {% extends "base.html" %} -{% block content %} -
+ + +{% block content %} +{% load blog_extras %} +

Blog Posts

+ {% for post in posts %} +
+
+

{{ post.title }}

+ By {{ post.author|author_details:request.user }} on {{ post.published_at|date:"M, d Y" }} +

{{ post.summary }}

+

+ ({{ post.content|wordcount }} words) + Read More +

+
+
+ {% endfor %} {% endblock %} \ No newline at end of file diff --git a/blog/templatetags/__init__.py b/blog/templatetags/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..342e1ef56bb07d953b9c3eaa0df5b06b8ff7d7db GIT binary patch literal 141 zcmXr!<>mVHyepLf2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CUsn1V`MIh3$@wXn z`TFJgMcKs#iOH$@NjZsm>G?n^KV82hHMbxqu_U!5F}+wnK0Y%qvm`!Vub}c4hfQvN PN@-529mvdLAZ7pnW5FY? literal 0 HcmV?d00001 diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9907d9b9b451091d2f2ec7e46b6b36080141584e GIT binary patch literal 764 zcmYjPy>8nu5GE;#mKDc9>P#JqAe)C;L$|^)3bbR9C7Tw5wrE+7evBiHCXO_zQ(wX8 z1N4=+cIpds$ke0kpdrD#?|yi9yyJ)S^HBW#q27Ch{3fp!%H$Is{RK%v5}K2O#*`98 zH>@SGhdP$?!jFCG>|QR4Ufe@_53PanHvNPr{&&*SI84MH8TbBRBr>KpFsj(*(kR4d zs|pHf=4(^rC=OF)<~yxmUQ~(7m&{$k<)6-HuV^KpKWzzyfb^hg#Nni2ar}ybKcBcz8H!MD5kA<}G)x zxV2y*B7vB$m@a%a{R#DnDyK$XY7S>8E`Emn~| zSfO_-%z_MY3@@zzx*)zGe%M@Mr^2 zX{L<=dvUZ+b_N4a+;2FxV|3CltI|NWn79gnV-N^jB(cIaE9la6Pkcq*IEP@0A8D7X R8AVBlNCq^Z11wZ{{{TLO(I@}_ literal 0 HcmV?d00001 diff --git a/blog/templatetags/blog_extras.py b/blog/templatetags/blog_extras.py new file mode 100644 index 0000000000..dee1cb2834 --- /dev/null +++ b/blog/templatetags/blog_extras.py @@ -0,0 +1,32 @@ +from django import template +register = template.Library() +from django.utils.html import format_html + +from django.contrib.auth import get_user_model +user_model = get_user_model() + + +@register.filter +def author_details(author, current_user): + if not isinstance(author, user_model): + # return empty string as safe default + return "" + + if author == current_user: + return format_html("me") + + if author.first_name and author.last_name: + name = f"{author.first_name} {author.last_name}" + else: + name = f"{author.username}" + + if author.email: + prefix = format_html('', author.email) + suffix = format_html("") + else: + prefix = "" + suffix = "" + + return format_html('{}{}{}', prefix, name, suffix) + + diff --git a/blog/views.py b/blog/views.py index 9a5bffd5b2..2a9f035325 100644 --- a/blog/views.py +++ b/blog/views.py @@ -1,5 +1,11 @@ from django.shortcuts import render +# from .models import Post +from django.utils import timezone +from blog.models import Post # Create your views here. +# def index(request): +# return render(request, "blog/index.html") def index(request): - return render(request, "blog/index.html") + posts = Post.objects.filter(published_at__lte=timezone.now()) + return render(request, "blog/index.html", {"posts": posts}) diff --git a/db.sqlite3 b/db.sqlite3 index feb2ae6a7fa9dd963ece6afd493b09d7be365e9d..bec9615ce422ebc354568bbd8aa36c4350022309 100644 GIT binary patch delta 3397 zcmb7GYm5`u6`ngYevEhRyPzy?S;Edby8**K#^bjM4=>rECClmbln4bAqA(bW#Y2Jc+WL!HPzTOI19 zVe`h&7Jo-C)7O;A=!Jr!8FVLNhLC(z(z1H0pk_;wq3T+B&3l4fu+LL?+B4s%zvJns zZ>QZ?Hf<|7~7uH-$+Ww;zsOPI$tWrD^rE)(MVu2TAYgH;sG^M z)bh&gA1=)89*srzCZ0bwmOUzsriR5aWA}s++Lt}{+=0UI#Qy!_$fQ&l`PSIP#Lj9y zRY*+$@}U7CFd)PU@|Kf>VKFR(#kngN#%ULW&r|q3p2xqRTU9)R{k_Z{^e9Id!ZiEi z3;f*m%l>l=M%PTo4%9~nnEf!W9Ci*zrVr_NEY%p@PDnQJrk1m|of(OzrRx7y5~YG~G6 zmqhQFbsg2__f4Xb6S?NlpBSOTj&D%-2L2M?!MCA~K7wd|fmhoYgjhRSoi=M_&D)nz zXOp|di*H!m=I!^9&24eh7B>yt?-OoMn!-QBXQ3Kt&s9&lQ6Klz(sqtYV(&CUXmNFi z6JjtS1O}t=cqkle7Q~^Ke3=|nmLmHS{7b$`Rmsa`_3vkjjYiALMXvWTR)|TZs z?#jD#TLh5v*9i9g4mf%J83EJ^wSK>5Csg!k$y#ENZ@4* ziF*#$o~50XA92YfH_GSLDTOagmzDfv54#Lvt4WFRs1OkzMuFxQk3{w&Cl#=iJ)e^d zUgEPQ1%63m>Ty0yOdNWIM&d7vKPIUC1OF9&459rR_uE;PB2d^E_~mFD%~B8_i{OWA zLTQ2VIlj9T3<3jVA#xuK_e~1F?!MWm|JGeQ9iZDObZTcZ8T6hy;idPL^r{L~#82y$ znw=_pc6l?pX21*fK&0f3L-_{6D^bFNxML}#kwiE`@>;GG z3Q}p>>J4t!CCcSEOL6tK7hPAKcb%H!?~b#ce)o*qW_znqKVxHEm(WLz`X5nkYRci= z(v9kzs>#an))Sp7=PTJ%Ivx&1gOg(Gcwpy&k>tS3dO~+k_kpr6-|YKY+=&0uz$j=6;S7qrH9SB1DGEs z|0vk*$KXHhoOF1*yV2Q{c}qcFw8^wjqERPsSfytQJJE#MBcrd^GUS<2Ag_jx^e4qo zp;L_SJ;;wwjEw<*L6=pSGgf9OR?>O3oO^(yDQ?{`zABYqZYgaH3;xBrp*swc_TYmz z;JC4vVl|9q$NoBZ%zQbGVyM^LmqF{y>uD50MRRoqZACtEbZEnV-Qn%)LoX}$%VuFN zw{Twgzrp-f2Ib6a!)UF!eJ6U%ydqWFzPW!WF)%%&H3am86xh&eDas( h0I|w?D4Vof6uyQ31+<%ZHOF|7)q80N)5(!8`Cplj;2;11 delta 927 zcmZWnO=uHA6rMMmO?DGEZ>z-k6HTJ6X>4ti)Y2O1PrP|(5m7wWSYsO7B&Cf)Pi83! zB0|y?21G@~gIZ%v7n*};wFP_f55$WKttjHff>1s5ptBXV;K29h&BvQ>-pn`o>yG?& zM`3eSGa+ObM-7L>(O;}@;$(y8zQ|XA%RCZydGI_sO@g?*iW%*bx=pPsYk9jdx#@uD z=^`>l0l(l;e1NC%0^Y@I7{!Cwg@Ljr;~uBee`uk|a9dxNf38oyIs&7GjHM7K7JZDcJSCC(Y;yHdACaO|?5lfTIiCDr!c zR&D)kJ%E~UM?g9%eiGkMLVl1eNfx!;vS|??;zC)w2o^3gTGY-6njB+NiMB#Li z=wz2lv<>Ram4|&T(T;%HVRP5iz}enh{MbNZ^{cPWgY3{f+Q<6$frCAppb_>c4H*`g zphv_Y9wxVn+D(6|+vfIqLG%ApGJX1M*mhRBP2J2Gr;*CVBn(UJRRVMi@4CLI)iO-N z8L%5LFNEv@E)rbEC0sPB@(aioC&2YTIlV%*6P(4f*k0B`SZRL&Pq`&HOYj5Easw)8 z*($_9e{yY8W#K1yRW7)Q#X{AM$ExAW&+{~}#m0Lu|9UmYPL5iR0LKoFZ7UmAO85<{YzzM%)BUnk8(?|N^IbYnD97^!n od>Fs Date: Sun, 31 Dec 2023 05:24:37 +0000 Subject: [PATCH 06/38] Finish django configurations --- blango/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 0 -> 3300 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 0 -> 962 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 574 bytes blango/settings.py | 259 ++++++++++-------- blango/urls.py | 7 +- blango/wsgi.py | 2 + blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 486 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1181 -> 1792 bytes blog/__pycache__/views.cpython-36.pyc | Bin 299 -> 299 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231223_1549.cpython-36.pyc | Bin 1504 -> 1504 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes manage.py | 2 + 18 files changed, 147 insertions(+), 123 deletions(-) create mode 100644 blango/__pycache__/__init__.cpython-36.pyc create mode 100644 blango/__pycache__/settings.cpython-36.pyc create mode 100644 blango/__pycache__/urls.cpython-36.pyc create mode 100644 blango/__pycache__/wsgi.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23126df9d6b0d955b8f047891de39ea745685fb1 GIT binary patch literal 130 zcmXr!<>k6|uP>DW2p)q77+?f49Dul(1xTbY1T$zd`mJOr0tq9CU;6qP`MIh3$@wXn z`TFJgMcKs#iOH$@NjZsm>G?1!K0Y%qvm`!Vub}c4hfQvNN@-529mt?!AZ7pnw<;eO literal 0 HcmV?d00001 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d156acec281423fe6e1f41255eb3a64c61a392d4 GIT binary patch literal 3300 zcmb7GUvt~W5eGn!AVK}JEL*Y_Cv;-Vp&bHplr&DKPDPQB%rQl32+&UMAsCQ%qQHOv zg#%>?GksECJMDYj571B48NB8xUm;K313-zU{oo3^!`ht3Kgq!j zj{A+9`4eHi3xgUkVGePa$AZHn9^M&87-dj~XEf0fM_H7O*I8KSP>$ygIGn@MuN;<0 z_A-Mc*ynKp_5~urK92>RE6dgsp5x^D&~gV}iIO0&-2p8fdw!|s#I&*R4M{&xWch%& z#J2*1OTCNIBOHrVEIhK^5)CXrNI4&sCKNzQDdvvywel@U?*rt>^GV5e0exfzw&#}M zKRB^LpY4#ZKs}L9f?!Pltg6`SQzg+cwV>~fRN|@ts0QBH?o)MYubRLIC!};dah#H4 z)1c%XU;iG<#h{4Te(B6|CWQV!x_ojxqv&_I39ePywfO7?8ZopW@d9)1UCN5wZ7x4mK#7lS?uizVl0$RhX_$FS%xA5&j z7Tv<@=r-OU627wu7+An}@h1KR-@~5{M4QK-y%hm@9hcAszK=f#zArX8{NSx%^XLwK zh_`^}A$}CkU&eFU<_99Wiyxy+^2zWXesam9Pr<6sV3c6o$6uk(aRq&W74!hcLo7k~ zsZpj*&ceMkm~5Al{=_Ght^3cvzxZb7Pg_4%di@8dwpAIOyMv44t@HEpZa*kLb0)jx z=cnfbbNjo>^Kkp=8zbT$hsA2M*?wKw@3ap~XsOn&H`?Zlwr;elhg!H)dA7a1t@J%? zdy4I~BC+MUBwR~$1KkaLyQjnf9p0R$PJ)wgbB@SFh#LeKV?x9AxkE}Qg@AbfU<3!& z03`0tO9T)?eU=Ioi9N>~poP9~)A5DL5{9B1>8|H_0S$a>{B2lCAx1XF4tZnwM2S6U z2N#OYTnUTAtF!Q%d5x)!%8b08&}O8{?<;{+9C@x%i(fOW-_0qoz-_bORoH{a?0%dq zGlKJ$O`S9=e3&?HMyi<9C}rY1G*naF0U3=QC{s$$>i z_$to>6KYK#)ObD(znsT=pGU!@HyMPFKZ4UIr%-o-@JY&h6>iK!A3$cF3wP$2ue|aB zf$3RUjHJD4?WNYLBeCA-=uy6UbY#XWseNQL+ATd?PaXG$4s695kDc^JA_&JYU4G)?#BYO zCL`k8{r3^F#H~yy%5;rdm{;LT3E{7X_flMN<;cUtp~{{;fb{V8ZQ@`gUnhBaE6SUu zYmJC$MzU!F`@~`E1=Bp8SWa@{3*dOh$m$0iNLu zG{bzU{S;;E+Fth{T8s;)R*$Qt9tj?eB;uagzUM}n0SThzAI<#^+^?BNP_$OlJNss> z-G157OdU@2hM}cYqtn$50Bd&|5E**3`VOyF>vpv0mageK#Nri1LSCOIPmz}Z$N(z= z7Q$JN*!vs)6kE8GN*2z znhfUDUg~HqJ${G$AI^UYmc-K^s(Rv$h#G&)RLH7d=-BELHA(B~YuX+u;|o6vqN_0I zF--Z)iX>)4A;+)rBEJeFezF4p?voSay&&*8QG|7#7hs({OF2x0!CQi6B!k641{#PwDGX(tCB=V11N83< zmj2Gilzd7n#54iRZw0h~i_lOkKwsv27^1-O`j&IzLCKZ2mG}t@S0DdSPU;slnrc{7 zXX+X6FMw@mquMmIP75ya6(mg>GweFUb=7hL;=7Q>XT+S56k^G!ICI=8FZ#;>=dZ8{ zx_i!FXA_GkRD=(-Pl7nE{M(FDXhPqb>^Inc84pb;lvdB8#Ds5Ll!Lkty{3PQfjnZ< zRYWAKuNiFzrhmYotQP0tBJ%u-z%E(fK4XLrsg3e~Nh;G1MW&m1Q55q00(*p&zx@w>>Gya5 literal 0 HcmV?d00001 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5364fd3c6bd2210bc34b64bedc7ecfd7b4ffaaae GIT binary patch literal 962 zcma)5%Z}496m`<{LE6GESZvye5{sE#1qd`SVkE?Z$0nPO8@sJbY)7`s%&?t3|G^Kj z$btKr%9UgAnvhmGDjZv6s_oyK1Tzp^<#*9J>%I2LN9 zjSLXDt~j+ETh8YxhHK+oZRdnAUD}*&ec{^ZEiYYOYDu^vr}+tSx)!A+KAAvyOVZcZ zR05Wrr{_CWdUpG=0rW|ZUowWN!a~;CxH-lvqa~I%3tHEQ$yWZ!AwNh40WF2F6vS?( zlgaF$YojHfVMQf>Hu3Q!OV285?c*f~V=dJGvCwYAjVF=^qmFdm09IgsM>ak`r*`2% zrrAG?E>v0Vm{4mlA=LBIN@(WMpNn7&1}e}VpUbBiULCBQ@9o;RBlm_MNgi@%!IV3* zT~>Ncz`$driJu6#lPpVr!|p{{)O0D6LP3yt$KQSJg>TZJY}E7@3)mrxMRET?3bZ&Q zmIk&fYKASQ22Keo(oiAz+ax}25-S{U5-+Cd?tgTJV*I)pw%Yw2nK7&n!=FdQ_m`BK r2~DoF`D|-iaziiqRBE=X`11#_-li}l(FpEAXB7Pf+m0;o literal 0 HcmV?d00001 diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0306d29725fd2487e82bcc0b4d3076e731b0fe50 GIT binary patch literal 574 zcmYk2!EO^V5Qe?GX%j7N;ZSk*H3HTWy&+UlHEpyAHWEpNl*`6lPc{x-&uZ-^wAVfW z&%rbB2;4bX;>3wp;DnQ_k5pJi(kD5n*Q8wD>EtU%EfZ{#+mc?E*bX1uPI zEVz}ZXEU#N>6=v80F~PJtF{S>+KWp==TgCQY5?MewY7Q0n83m$V!45OU@EX;pxH_C zk}Ys;kqM|3-d3P3Tboj{__zNXlJx_3T!PIvcli#6dpdY~mJLVw_+m0iv*9>@KN?)U zySRJY4xbpXR_fBY<9~(cqwF#rUVS*5q@&D516cLDuAAo`F3(+v#yx2flfqAyY#KJ9 zM{r%xE7_oSvDXwZ=Qql_M>{NENps)}x8~0?KTid$Kp~N>vH4_bUI1&U9^6Jesc&8H Wb^Gt9J^$Xs-gLrVcn}^1N6}xDTC*Ae literal 0 HcmV?d00001 diff --git a/blango/settings.py b/blango/settings.py index 6245cd60b0..09583cedc2 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -1,7 +1,7 @@ """ Django settings for blango project. -Generated by 'django-admin startproject' using Django 3.2.7. +Generated by 'django-admin startproject' using Django 3.2.5. For more information on this file, see https://docs.djangoproject.com/en/3.2/topics/settings/ @@ -9,128 +9,147 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/3.2/ref/settings/ """ + import os from pathlib import Path +from configurations import Configuration +from configurations import values + +class Dev(Configuration): + + # Build paths inside the project like this: BASE_DIR / 'subdir'. + BASE_DIR = Path(__file__).resolve().parent.parent + + + # Quick-start development settings - unsuitable for production + # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ + + # SECURITY WARNING: keep the secret key used in production secret! + SECRET_KEY = 'django-insecure-&!=9y436&^-bc$qia-mxngyf&xx)@ct)8lu@)=qxg_07-=z01w' + + # SECURITY WARNING: don't run with debug turned on in production! + DEBUG = True + + ALLOWED_HOSTS = ['*'] + X_FRAME_OPTIONS = 'ALLOW-FROM ' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io' + CSRF_COOKIE_SAMESITE = None + CSRF_TRUSTED_ORIGINS = [os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io'] + CSRF_COOKIE_SECURE = True + SESSION_COOKIE_SECURE = True + CSRF_COOKIE_SAMESITE = 'None' + SESSION_COOKIE_SAMESITE = 'None' -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - -DIRS: [BASE_DIR / 'templates'] - - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-+sn%dpa!086+g+%44z9*^j^q-u4n!j(#wl)x9a%_1op@zz2+1-' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = ['*'] -X_FRAME_OPTIONS = 'ALLOW-FROM ' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io' -CSRF_COOKIE_SAMESITE = None -CSRF_TRUSTED_ORIGINS = ['https://' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io'] -CSRF_COOKIE_SECURE = True -SESSION_COOKIE_SECURE = True -CSRF_COOKIE_SAMESITE = 'None' -SESSION_COOKIE_SAMESITE = 'None' - - - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'blog', -] - -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', -] - -ROOT_URLCONF = 'blango.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'blango.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/3.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - - -# Password validation -# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - - -# Internationalization -# https://docs.djangoproject.com/en/3.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' + # Application definition -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/3.2/howto/static-files/ - -STATIC_URL = '/static/' + INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'blog', + 'crispy_forms', + 'crispy_bootstrap5', + ] + + 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', + ] + + ROOT_URLCONF = 'blango.urls' + + TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + "DIRS": [BASE_DIR / "templates"], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, + ] + + WSGI_APPLICATION = 'blango.wsgi.application' + + + # Database + # https://docs.djangoproject.com/en/3.2/ref/settings/#databases + + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } + } + + + # Password validation + # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators + + AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, + ] + + + # Internationalization + # https://docs.djangoproject.com/en/3.2/topics/i18n/ + + LANGUAGE_CODE = 'en-us' + + TIME_ZONE = values.Value("UTC") + + USE_I18N = True + + USE_L10N = True + + USE_TZ = True + + + # Static files (CSS, JavaScript, Images) + # https://docs.djangoproject.com/en/3.2/howto/static-files/ + + STATIC_URL = '/static/' + + # Default primary key field type + # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field + + DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" + CRISPY_TEMPLATE_PACK = "bootstrap5" + +class Prod(Dev): + DEBUG = False + SECRET_KEY = values.SecretValue() + ALLOWED_HOSTS = values.ListValue(["localhost", "0.0.0.0", ".codio.io"]) + DATABASES = { + "default": dj_database_url.config(default=f"sqlite:///{BASE_DIR}/db.sqlite3"), + "alternative": dj_database_url.config( + "ALTERNATIVE_DATABASE_URL", + default=f"sqlite:///{BASE_DIR}/alternative_db.sqlite3", + ), +} -# Default primary key field type -# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/blango/urls.py b/blango/urls.py index db6c067875..900fabbae5 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -1,3 +1,5 @@ +import blog.views + """blango URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: @@ -15,10 +17,9 @@ """ from django.contrib import admin from django.urls import path -import blog.views urlpatterns = [ path('admin/', admin.site.urls), - path("", blog.views.index) - + path("", blog.views.index), + path("post//", blog.views.post_detail, name="blog-post-detail") ] diff --git a/blango/wsgi.py b/blango/wsgi.py index 83565cf12c..a246900546 100644 --- a/blango/wsgi.py +++ b/blango/wsgi.py @@ -12,5 +12,7 @@ from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blango.settings') +os.environ.setdefault("DJANGO_CONFIGURATION", "Prod") + application = get_wsgi_application() diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 6fa615496d302e54733642f339f07ff3ce6a5601..d92f2e15556bc2a0a06731646334ab6182c84588 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=zOcCT+DdnEuLV+6DS delta 15 WcmZo*Y+z(J=H=yD`lM|ldnEuKI|P9M diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 7688e760b11ee6a15ac119fab081434fa0ac505c..68e8c35ed32dcbd128f84866c4955e70a5a6997d 100644 GIT binary patch delta 308 zcmYk2Jxc>Y5Qb;=<8E{0QixzH*mz(e*oqh|tP%tTVX+D967IOo!R}dGoLB}z{+q=j zHiF>4aMp-8FfZ@SJhKD)$zR0NSy>jZ?`wOA03Yx#1o=zK@IYd~U<(d4V)CqIj%)6O z7EWr3V6n-X-133u*I>92&tL>~)xh=WcPi{?V1KMktT~pqP-S0q0xFDhVO+hcc;t7B zWfV7E=wp7>IcHa!^$gYKZJL#Y`f_`Orw19?oH8&Hg+A5us@OJoa_=P-QG~j;QF*(p sLvMX7W}UI^G+p_j{q8kFcW#oF)Vb@-V{0$yOCS^^W8CLsw#O&<4YoNyX8-^I delta 251 zcmZo;dB$9C%*)HQ^hsOlZw3a2$3P4REI^h65EuIZi4=wu#vF!R#wbQc5SuB7DVI5l zIhQ4hg^?kZF^e^eEtR<$DCf?Q!kog=!jQrO6lHH_j^cpIvZQh}GXeFo1~X`~y#$)b zpvicPH8F)hH#1L@=@xTHV)`wXfc)Z#%Y7NyCw_Hg;{hru;+bs2XduoCWU>QsF%yvB zU@QXh{WLizH#6!?-ohwr4B{6-)Wcc4K-Mh|o80`A(wtN~Mj)@414!^N3NZ692{8iz D=p`;D diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index e19d1228391de52c2e5cdfb86e791ccb870732b6..1ba3fe9d17d09442f668391125e7c03c22b1280c 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=zOcCT+EdmAGFCU6A+ delta 16 XcmeBW?qy~-=H=yD`lM|mdmAGFB^3nC diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 5bfd9ac3c428fe5a95332d2619130fd22c0b3163..82821bb4c48ebd5594423f29e3fc3a8d8c97857b 100644 GIT binary patch literal 1792 zcma)7J8v6D5WYR$@t!30@)JSg1W6$TkP5d!U_p|dAdzfHbhFLo$X!uK--F&e%4U#G zt^zo9{zCpxiY?Nla-S+yzPY0$25^krVP|J&W|wpG&9{8m>xIAn@r(M^wX8p_mB)ep z2&1}ykd|bbl{3y5>2_x49o}j5PUhq;cN^Wwy1B=_Mt5QNxzDU8mh4LJjU_$Brom;0 zhp_lEfF)R3B3MEh!4fSkv5Zfx?cO{5wzbVnH!r2iDrkPC>N+hZqz|5`Lg{pTqOzn; z%L1lozbtB1)WgM0VY$AHcwB0gPKxi;VoWDqJsl{IFscU-%Hm8~+*X~bBbl_{GVaQb zblzCJD_vyMHJxEHc_$Hzqr*ITEizS1>hm#!i5{A1>|<12h@Y&fg`Mme8{CT|n^RIw zrLwc%EFB}@?=N@H%Utb_OPQ9tuS)%*nk8ekJIaz`QerA6yY08{%ofHIqN=qJA)RkS zSnS6LIqfX%$J?Iqg(#9-31LDZuyvl19t-huo@A{@(^eA<)$96ksxqnRJl!WjIjx8u zEjqgYkLf>2YX))q%Av_ zHeZ8fT{_YQ2pdbi3w=|1D5r0{{W8x1GpZSsg+OnpTA6sI565V##run>di5tVsB5gZXR?BV;ktiX$l>P3eh#b&$RfVZ3K2Plt#5L*7LP zo}+0#Cf6q<9zgJTHXmhab>1RO9i_j3Fu`dypS1npR8YBB&GS6b3;hwf2S-V<7?vd4 z?jpt-r%oo7CU!R18-LvLruuKTe~MtLaz*V){S)KuV}SV>edgPmVve_aCXiFQrgr40 zGan3WZ@`vNL>S{9(f>hn4>cdwWVC|T ZH64uqReJ}1P4{xc3HqMqwKu$t@E>|5p*H{k delta 629 zcmZ`$O>5Oa6rGz)zTQjHQp8eR=`J9GxDrY!sCCuXNBa=TCZwIQFFMJTnFOf_iWWDn zO4fGQztBI?e=ys2Ekgf5??i>?!i00U=O#J#=FI2xM>KzuB%|}|Z~Vp~FO96U^L>Q2MF_E@X#dk)gD?Hmx!-5>^(!`J@d?TAvIGaDhEAn! zGcb{C3dRL*`3zNDcC9QL`MxL_LmmFrnPa?tQ8w=kZ8{;8hhs8Oet$_Pn<0vYt%il{ zrfUd|Nf81cVmt3qQRr3`#Uxu*F}77=Deaftho7dqJF^$hX1R|e=Te#Ed5Jq!HQ%bZ zVEO1kacr=nZ1Zs~S@ov+E#jkYUsQTND79n_SCLG#C%VJoTSGOLd7!(xF4eIK4rJ5v zrZr33Wpg}}mbZ58lp#h#+wxHVKk8+4PZ9bKQV1&$-`gQ-ohVix~ f<~ukK4;F$N4$`J&!gc(mPVfz|#`Yl5l&*xg(XWoX diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index a6d4c1969efe62fe6a36a0cd293767064d21f29f..8e693c215733cfbcec8c7c4d79a2db0476793ca6 100644 GIT binary patch delta 16 XcmZ3@w3>?(`^DHH_Q delta 16 XcmZ3@w3>?c?NFIxrG delta 16 XcmX@ld7hKqn3tDp>65mN>?c?NE&v6h diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index cea114b1d274ff8c606c4e39cec4fa65913cac19..22cf4292cf545ed1d624bca23ef835cd8d6ee48b 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=zOcCT+EI|~Z{CBFoR delta 16 XcmeC?=;mNI=H=z${@u2borMJeAh-k3 diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 94f52e93800efeb0a49e1061281199eed1c9c1f4..215a1160b2e298f4ece54a163e5e8dd9cad95939 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tF9+P%Jw><5_uE(ry; delta 16 XcmX@XdV-bRn3tF9$^W*E><5_uF9`+R diff --git a/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc index 75131bdf3eb1016c70d00a2dbfc54eda71a0b497..53b0c6dedc74340100dc784e882f795fb0819d64 100644 GIT binary patch delta 16 XcmaFB{eYX@n3tF9+P%Jw>^E5fF|-B^ delta 16 XcmaFB{eYX@n3tEUkg}F&)=H=zOcCT+DdkX*{q6F0d delta 15 WcmeBX>}F&)=H=yD`lM|ldkX*`dIX{X diff --git a/manage.py b/manage.py index c66b327f71..8fbae3230d 100644 --- a/manage.py +++ b/manage.py @@ -7,6 +7,8 @@ def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blango.settings') + os.environ.setdefault("DJANGO_CONFIGURATION", "Dev") + try: from django.core.management import execute_from_command_line except ImportError as exc: From dd318587ecb507519d8ff56c4d4d170c92160e88 Mon Sep 17 00:00:00 2001 From: Tiru m Date: Mon, 1 Jan 2024 08:22:10 +0000 Subject: [PATCH 07/38] Finish logging --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3300 -> 3300 bytes blango/urls.py | 4 ++++ blog/views.py | 8 ++++++++ 4 files changed, 12 insertions(+) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 23126df9d6b0d955b8f047891de39ea745685fb1..2a586e5757ab880189a69fa717d3b9715feaf326 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=z$VwyOSy&3=(l>-$3 delta 15 WcmZo-Y+__L=H=zOcCT+Ddo=(bodmi7 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index d156acec281423fe6e1f41255eb3a64c61a392d4..424e8800b39aacb41c13ef1573bf059b07dad11b 100644 GIT binary patch delta 16 XcmaDN`9zZ4n3tD}i)rFU_Paa)DHa5m delta 16 YcmaDN`9zZ4n3tF9`mYHa+3)fI05p6CTL1t6 diff --git a/blango/urls.py b/blango/urls.py index 900fabbae5..c2319c7321 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -17,6 +17,10 @@ """ from django.contrib import admin from django.urls import path +import logging + +logger = logging.getLogger(__name__) + urlpatterns = [ path('admin/', admin.site.urls), diff --git a/blog/views.py b/blog/views.py index 9a5bffd5b2..c5df569f9a 100644 --- a/blog/views.py +++ b/blog/views.py @@ -1,5 +1,13 @@ from django.shortcuts import render +import logging +logger = logging.getLogger(__name__) +from blog.models import Post + # Create your views here. def index(request): + logger.info("Test 123 !!") + posts = Post.objects.filter() + logger.debug("Got %d posts", len(posts)) + return render(request, "blog/index.html") From c82267fbe1e6de20b6b665e90bd5be6a6e3bc65c Mon Sep 17 00:00:00 2001 From: Tiru m Date: Mon, 1 Jan 2024 08:58:38 +0000 Subject: [PATCH 08/38] Finish security ad passwords --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3300 -> 2948 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 962 -> 379 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 574 -> 575 bytes blango/settings.py | 277 +++++++++--------- blango/urls.py | 2 +- blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 518 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1792 -> 1792 bytes blog/__pycache__/views.cpython-36.pyc | Bin 299 -> 520 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231223_1549.cpython-36.pyc | Bin 1504 -> 1504 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes db.sqlite3 | Bin 184320 -> 184320 bytes 17 files changed, 143 insertions(+), 136 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 2a586e5757ab880189a69fa717d3b9715feaf326..158ecc1ce8e7910d6e41132ad1496269565ee7ff 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=y5E1xuxy&3=+iUX$r delta 15 WcmZo-Y+__L=H=z$VwyOSy&3=(l>-$3 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 424e8800b39aacb41c13ef1573bf059b07dad11b..b14ee453dbe9fd7868fa3e1b68fa1d5cffab92b8 100644 GIT binary patch delta 687 zcmaKq&u$V?6vpQc1I!Ezh5na&ms>+{O8kdY{bgD2mL#J2O8dIPN?5 z*OOR&m&v)0jpQGe}|93eqIfv^Rq}Q${Auh9Hc2 zEFg8(!0NJymlpr(LKwJnxm`qBg3&`7cr5JFMKhOcbx)@z7I$ zBYI8SzO<-xHRh>%W%u>V4xjUM!_F(^!wqG^MN0qAoS?YyUc1Eu1Z_35YK)n6JLHD_N kCo;UPQ)U7$lISpkz9;LcAWw!75(Qo$OuP^hf-EDy08**CNB{r; delta 1052 zcmY*Y%Wl&^6rCA6_SjCEw6smyLd&BM!Xu%S6#_({p&(TS(NKxm3?_F7jzTS*gheEj zMc5*Qyrl3GED&G7KUnPGBamRh9k)R7=-iq6I=1c^zbby8SzOEIT$jC78{>q0BZnRn z&({&%26?-9ae0G)1@OJ|z!8{)DVT0$#1s_8G?bJLGjm7+3}#^tj>0jRZIum7WY^{#SARLGS)1?N@`E1wj9uwDQ4k}m{UjF$Iipq5f$_J zT?>fgh!b#5oP_h@6ja0_VhL=VRy8r!)r(i}|6=TP+#&A}H+wm%&j6YaE;-|c} zvYc=!cl~Ed%EXoOSqS}(K4+zT-uFBEnTW+-`8-YHpZuJ`!fw3m{F=>e*0wet)Hdq! z=H2yrr1eZPJAS9H;v4SJT17uvjlZ~;3Q-2n6Nv5;G~9?w-u952%w?utmYFfBNzT6 z$~4O2$B9yHvr)glRcqYYsmt|RqjsaVU6&8;Zw`u8ztdCEuHOq@DEYT@xK?IqYvLWs zZ1Gg7^D#L={lIGaKDz%OY(4{Zs4&wuQ9mF!2I#A=4S zPl8r7rAbz_*_VZoD+kAmI=F`B4Wg?r2uCeAEwBmP8BKF#C$Xi3uqkCUgC+4Ne)?*v dSDOAydWbXOSN8AHHBS@kA(@QRtX{0}@;A#n>l*+7 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 5364fd3c6bd2210bc34b64bedc7ecfd7b4ffaaae..76da8f97060df1158b284bb9c4434f80bfd44889 100644 GIT binary patch delta 261 zcmYk#u};J=3;@tLNz-0Q;cmEJ0F?od*qB(@5Cd#ks-9wnMrlFq0TM!D=pWE8;8*yJ ztW10Z3+_!=vh!?9&R6=&-_MI8-@JX`r(o=x{R>IHq#SOkSY{zG1N8F1TVVvuGZAE) zm}F-N$|zJm#cTw#z{E-vKKFYgCnpGA`(osdn|%v+tW-aAmz~{|5R=-rO-GQA_4fW% z?b_4G$^(;c!h<_`Zt!J@a`vRf(P2zUuIXG{INV;7v5#3*b#;qX71g}Oe!3FJYDu5; V%jrp6tbsUaD%nbdhK%P@!ylo6J;49~ literal 962 zcma)5%Z}496m`<{LE6GESZvye5{sE#1qd`SVkE?Z$0nPO8@sJbY)7`s%&?t3|G^Kj z$btKr%9UgAnvhmGDjZv6s_oyK1Tzp^<#*9J>%I2LN9 zjSLXDt~j+ETh8YxhHK+oZRdnAUD}*&ec{^ZEiYYOYDu^vr}+tSx)!A+KAAvyOVZcZ zR05Wrr{_CWdUpG=0rW|ZUowWN!a~;CxH-lvqa~I%3tHEQ$yWZ!AwNh40WF2F6vS?( zlgaF$YojHfVMQf>Hu3Q!OV285?c*f~V=dJGvCwYAjVF=^qmFdm09IgsM>ak`r*`2% zrrAG?E>v0Vm{4mlA=LBIN@(WMpNn7&1}e}VpUbBiULCBQ@9o;RBlm_MNgi@%!IV3* zT~>Ncz`$driJu6#lPpVr!|p{{)O0D6LP3yt$KQSJg>TZJY}E7@3)mrxMRET?3bZ&Q zmIk&fYKASQ22Keo(oiAz+ax}25-S{U5-+Cd?tgTJV*I)pw%Yw2nK7&n!=FdQ_m`BK r2~DoF`D|-iaziiqRBE=X`11#_-li}l(FpEAXB7Pf+m0;o diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 0306d29725fd2487e82bcc0b4d3076e731b0fe50..7e29269c7ea1f10a6780a81dd807548137f8aa78 100644 GIT binary patch delta 40 wcmdnTvY&<1n3tDJt$b4Io{gN77}=s&0*dleCNE(0X5(gHU?}3A{E^WY0PL0vTL1t6 delta 39 vcmdnbvX6z+n3tF9^xgi{-5WV4F|yubc1bOpypYkGjfa7Op@?VlCq`cY26zl^ diff --git a/blango/settings.py b/blango/settings.py index 09583cedc2..9cd011dd06 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -15,141 +15,148 @@ from configurations import Configuration from configurations import values -class Dev(Configuration): - - # Build paths inside the project like this: BASE_DIR / 'subdir'. - BASE_DIR = Path(__file__).resolve().parent.parent - - - # Quick-start development settings - unsuitable for production - # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ - - # SECURITY WARNING: keep the secret key used in production secret! - SECRET_KEY = 'django-insecure-&!=9y436&^-bc$qia-mxngyf&xx)@ct)8lu@)=qxg_07-=z01w' - - # SECURITY WARNING: don't run with debug turned on in production! - DEBUG = True - - ALLOWED_HOSTS = ['*'] - X_FRAME_OPTIONS = 'ALLOW-FROM ' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io' - CSRF_COOKIE_SAMESITE = None - CSRF_TRUSTED_ORIGINS = [os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io'] - CSRF_COOKIE_SECURE = True - SESSION_COOKIE_SECURE = True - CSRF_COOKIE_SAMESITE = 'None' - SESSION_COOKIE_SAMESITE = 'None' - - # Application definition - - INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'blog', - 'crispy_forms', - 'crispy_bootstrap5', - ] - - 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', - ] - - ROOT_URLCONF = 'blango.urls' - - TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - "DIRS": [BASE_DIR / "templates"], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, - ] - - WSGI_APPLICATION = 'blango.wsgi.application' - - - # Database - # https://docs.djangoproject.com/en/3.2/ref/settings/#databases - - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } - } - - - # Password validation - # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators - - AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, - ] - - - # Internationalization - # https://docs.djangoproject.com/en/3.2/topics/i18n/ - - LANGUAGE_CODE = 'en-us' - - TIME_ZONE = values.Value("UTC") - - USE_I18N = True - - USE_L10N = True - - USE_TZ = True - - - # Static files (CSS, JavaScript, Images) - # https://docs.djangoproject.com/en/3.2/howto/static-files/ - - STATIC_URL = '/static/' - - # Default primary key field type - # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field - - DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" - CRISPY_TEMPLATE_PACK = "bootstrap5" - -class Prod(Dev): - DEBUG = False - SECRET_KEY = values.SecretValue() - ALLOWED_HOSTS = values.ListValue(["localhost", "0.0.0.0", ".codio.io"]) - DATABASES = { - "default": dj_database_url.config(default=f"sqlite:///{BASE_DIR}/db.sqlite3"), - "alternative": dj_database_url.config( - "ALTERNATIVE_DATABASE_URL", - default=f"sqlite:///{BASE_DIR}/alternative_db.sqlite3", - ), +# class Dev: + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-&!=9y436&^-bc$qia-mxngyf&xx)@ct)8lu@)=qxg_07-=z01w' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['*'] +X_FRAME_OPTIONS = 'ALLOW-FROM ' + os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io' +CSRF_COOKIE_SAMESITE = None +CSRF_TRUSTED_ORIGINS = [os.environ.get('CODIO_HOSTNAME') + '-8000.codio.io'] +CSRF_COOKIE_SECURE = True +SESSION_COOKIE_SECURE = True +CSRF_COOKIE_SAMESITE = 'None' +SESSION_COOKIE_SAMESITE = 'None' + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'blog', + 'crispy_forms', + 'crispy_bootstrap5', +] + +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', +] + +ROOT_URLCONF = 'blango.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + "DIRS": [BASE_DIR / "templates"], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'blango.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } } +# Password validation +# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +PASSWORD_HASHERS = [ + 'django.contrib.auth.hashers.Argon2PasswordHasher', + 'django.contrib.auth.hashers.PBKDF2PasswordHasher', + 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', + 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', +] + + + +# Internationalization +# https://docs.djangoproject.com/en/3.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = "UTC" +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.2/howto/static-files/ + +STATIC_URL = '/static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" +CRISPY_TEMPLATE_PACK = "bootstrap5" + +# class Prod(Dev): +# DEBUG = False +# SECRET_KEY = values.SecretValue() +# ALLOWED_HOSTS = values.ListValue(["localhost", "0.0.0.0", ".codio.io"]) +# DATABASES = { +# "default": dj_database_url.config(default=f"sqlite:///{BASE_DIR}/db.sqlite3"), +# "alternative": dj_database_url.config( +# "ALTERNATIVE_DATABASE_URL", +# default=f"sqlite:///{BASE_DIR}/alternative_db.sqlite3", +# ), +# } + + diff --git a/blango/urls.py b/blango/urls.py index c2319c7321..11e9716181 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -25,5 +25,5 @@ urlpatterns = [ path('admin/', admin.site.urls), path("", blog.views.index), - path("post//", blog.views.post_detail, name="blog-post-detail") + # path("post//", blog.views.post_detail, name="blog-post-detail") ] diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index d92f2e15556bc2a0a06731646334ab6182c84588..6eecf79caddd681db385ed2d9ee9004e757f5be4 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=y5E1xuxy%GQ!Py?X= delta 15 WcmZo*Y+z(J=H=zOcCT+DdnEuLV+6DS diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 68e8c35ed32dcbd128f84866c4955e70a5a6997d..7cb419c1679ddb390588ff5e7b8cc15f39ce7f75 100644 GIT binary patch delta 16 XcmZo;X=7nG=H=y5E1$HH{XZiBABF^4 delta 16 XcmZo;X=7nG=H=zOcCT+E`+r6NCaeW* diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 1ba3fe9d17d09442f668391125e7c03c22b1280c..afb82faa265b884abf8728188b652c7157e25a8d 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=y5E1$HHy^Rq7A4&u5 delta 16 XcmeBW?qy~-=H=zOcCT+EdmAGFCU6A+ diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 82821bb4c48ebd5594423f29e3fc3a8d8c97857b..7dcdf23a45ef78c19cf7976ab9a21d9755de8cc3 100644 GIT binary patch delta 16 XcmZqRYv5xy=H=y5E1$HH{U;j$AL9gJ delta 16 XcmZqRYv5xy=H=zOcCT+E`%g9iCkX{~ diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 8e693c215733cfbcec8c7c4d79a2db0476793ca6..25373ad7d7e93c4ba832b89acd703116da7e6476 100644 GIT binary patch literal 520 zcmYk2y-ve05XWuj6KH`)C<91gNCZes2q73)5JG|}OV!3ln&8C6b}3Xag(u)GcqOk) zyaE&Fuwd)Xr#s*M{`S#uxW2difOAU77x}js#%E~y7#$~^3ewP=QWrD9at5sS!0%`t zV8#<+6Xg+BeIC4%Jm&0{B;hyql7!k&LCZm1W9Z*VZ3?9I%Tau^3pAagGo+@RcE~X} zzxF%wMlly~X2Ms@cML1hD-t_L@UK@Jcc9Ja;P7a)v$GmpN;BH!qd7wKYHKQFnN^5> zPG_bONo+&Rl%T9%wf9naNVJih)=(I2!~04YtOXpVi_&@mTIB>L%ti_x7s#h>ge=lReVw5rPegQ#!fZ+fD literal 299 zcmYjMu};G<6nu7?f+{K)`GqjV18aql*t@W0YvZRT;MA?{P(UmQX8wa8V#vV4#4j*$ z_E7anchB~FcPC#?r<1Sm4}K-0A7Eb+r)$8UgEVPjs1ubCq@~W@sginhOGW;RDHUQE zJ6>ycwTO3A>=|$a_z5V`3ryZ5L~{Oox-@pBT1XztCUm9{E(XHr$nmykA3n*A@bY(| z8r!j|t!}N_S$FR@i<;HaEY>TF2AhYLcfQ;_4S6z*G9TSYxG{KMWYw9zi~FT-tP6D? ae2Pos6mvj1B*XEnv${8Y75|aUPO^WF`a#zK diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index bc424e400e8d9742d9659ea385ace4c4067e3bea..0cc815dc7d11177934789da2a3d0378b27fc4ed4 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tDJt$fl(_7f}sC^ZDa delta 16 XcmX@ld7hKqn3tF9+P%Jw>?c?NFIxrG diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 22cf4292cf545ed1d624bca23ef835cd8d6ee48b..39540bed37cc2eef197eb05513c014bc49e5963a 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=y5E1$HHorMJe9+?Al delta 16 XcmeC?=;mNI=H=zOcCT+EI|~Z{CBFoR diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 215a1160b2e298f4ece54a163e5e8dd9cad95939..2de563b6f0aa19bccedc9c9c95559afefedceda0 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tDJt$fl(_Jd3SCgTL7 delta 16 XcmX@XdV-bRn3tF9+P%Jw><5_uE(ry; diff --git a/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc index 53b0c6dedc74340100dc784e882f795fb0819d64..7e2bb01a052f14588fd84f9663643947873b6e58 100644 GIT binary patch delta 16 XcmaFB{eYX@n3tDJt$fl(_M5B#DvkvD delta 16 XcmaFB{eYX@n3tF9+P%Jw>^E5fF|-B^ diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 59dc1bf8ae923d6a0dd1637e8d3d7b22c3f69c5d..f1d8b677a917b6f969d44652ff55ee9babb7d125 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=y5E1xuxy#)Xoj|0L0 delta 15 WcmeBX>}F&)=H=zOcCT+DdkX*{q6F0d diff --git a/db.sqlite3 b/db.sqlite3 index feb2ae6a7fa9dd963ece6afd493b09d7be365e9d..b710002e83005af24361e148d9ce8f62b8d5ade1 100644 GIT binary patch delta 640 zcmaiwO>5e49LKd`gSKkeX|Rq>HenRn?*C8BlOS8v_>?Bm)~dK5 z`CPew>OqHr)APy4z<46f`8|^+JO9xCYJQ&et6ja_!a~2p*bX^S$b_0v2(T~!EBz?8 z(uvZcO_;<4TJkDuA;K0y;uq5lF2u002l|u>5wpi7A&3mTmwP$-fR?S7(PU#&3KzzBCYi@lao9b|E?l;Oxq3QN*e5ytGM#E2VX zODiiih2W`-jw^&FH|rLiW2B)e52<=eEl6q3F#DFG$vDrK>~ajysdz4* z&xVJ(5a&o@OUooUmCg;sk(7}mu*-AMjaam5nQlB^k%6fim6$^bd_QJ6a=6=Yi!bc0 zT!CRUzE-d^@*j7Q_{$wh;TV2#c_hv)An1Vyy+XgE2Nw@I@6hECB6$BN4!J8GemM$G uZ_ci6&b-U7XP6TYdW&A8Co{|k^!XEn_5OPrxqBae{q*SS$4~FmZ@&Oh_Q!7k delta 246 zcmZozz}>KbdxA8h=|mZ4M$?T6%i`JgGw@gP?cdnAnXkUloQapA(bkbuoY$U{(~-9z zDLW<2D84u&(a6+H#mLM62vh=sBYh1GlTAy*qAUt>GP2T&B7;nWR2)k(Op8n`oO1&F z^Spi112RG_408Mp$`TEe%KZ()Lqpw)ot^Vj3QD~qZH)|!jCBo-bd8J@3=FLd%&klf z^(>4Gnaz!iH#_DZR^VXb-NwLon|IsB##OwVx6Soq;$Y(6&cMH&|ITK?g4O&iD$Kr& ullRS4XuiFE`|b6Nnhrqu!wme7_zwf+xAU{eF*`C&J~&Tm`@{c?@)rQkyiLOZ From 458094c2cb90dc8b0a98f81202c6c7497c4498b6 Mon Sep 17 00:00:00 2001 From: Tiru m Date: Mon, 1 Jan 2024 12:33:47 +0000 Subject: [PATCH 09/38] master branch cache codes --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 2948 -> 3054 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 379 -> 379 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 8 ++++++++ blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 518 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1792 -> 1792 bytes blog/__pycache__/views.cpython-36.pyc | Bin 520 -> 712 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231223_1549.cpython-36.pyc | Bin 1504 -> 1504 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/views.py | 19 +++++++++++++++--- db.sqlite3 | Bin 184320 -> 184320 bytes 17 files changed, 24 insertions(+), 3 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 158ecc1ce8e7910d6e41132ad1496269565ee7ff..5b2a687811597292c1ed783ca05445ec5d150853 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=yDJ!2wU4FDKY1G)eJ delta 14 VcmZo-Y+__H=H=y5E1$?#0{|5@0~7!N diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index b14ee453dbe9fd7868fa3e1b68fa1d5cffab92b8..9894ed4e8f588c1dd1791fc35cd18fcbb0c44b2d 100644 GIT binary patch delta 190 zcmZn>eM2aY z44PJ(6Bs?%1FE!BvJ&&s^YxPRi&FKH6O%Ji^^y{kvs3d@iuF>G^js245|a{(Q=LIF zQGB_T@nALaK+&93O{O9apdGh3eEgjqLp=TcG&MG_;t*jHyv641=drHlY6)da`@ delta 15 Wcmey(^qYyzn3tC;sb(WvDI)+UlLTV` diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 7e29269c7ea1f10a6780a81dd807548137f8aa78..e618d394ea2b2ac4a4ae9410ce781bf25ad96ebf 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tDp^^A>dmP`O60t6WV delta 15 WcmdnbvY&;`n3tDJt$ZV!B@+N2KLc|B diff --git a/blango/settings.py b/blango/settings.py index 9cd011dd06..1de8dd31da 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -147,6 +147,14 @@ CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" CRISPY_TEMPLATE_PACK = "bootstrap5" +CACHES = { + "default": { + "BACKEND": "django.core.cache.backends.db.DatabaseCache", + "LOCATION": "my_cache_table", + } +} + + # class Prod(Dev): # DEBUG = False # SECRET_KEY = values.SecretValue() diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 6eecf79caddd681db385ed2d9ee9004e757f5be4..fd0f1209fdac405157ba5de3ff4b3d00e759d51a 100644 GIT binary patch delta 14 VcmZo*Y+z(F=H=yDJ!2wU6#y6<1GE4D delta 14 VcmZo*Y+z(F=H=y5E1$?#1ppNP0}cQH diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 7cb419c1679ddb390588ff5e7b8cc15f39ce7f75..2bdcec1af68cb88a5e76a51ef1ed15e8bb138150 100644 GIT binary patch delta 14 VcmZo;X=7nC=H=yDJ!2so695>v16}|C delta 14 VcmZo;X=7nC=H=y5D__XQ1OOGA0=NJG diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index afb82faa265b884abf8728188b652c7157e25a8d..1217af897c483ae20afca26a7cd7d0fad8c56a7a 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=yDJ!2zVJ0k!d3j_cF delta 15 WcmeBW?qy~(=H=y5E8oc0&IkY+NCR2` diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 7dcdf23a45ef78c19cf7976ab9a21d9755de8cc3..73348bb24554220ae35c23f53a6fce68c369ab0d 100644 GIT binary patch delta 15 WcmZqRYv5xu=H=yDJ!2!=FE#)ks04HX delta 15 WcmZqRYv5xu=H=y5E8ocWiwyu8PiA(||kZ3|rj3vVG0#6{!#KM{=&0z^k4Un+s z2KE_u4o8a&;Zty$g6Kw(1Xh61KNvxA1C2x zK)chJ%y<`*h_X;n#=C_b%#aWKz5h7MB&Hn5Z5#@s3@Vl?bXZ*uwo;?uoo5tJQgWd@ Q07y%9fdBvi delta 336 zcmYjMJx{|h5WRDpG&BifWC67*LdrlSsFVpI1RFzz1XIV>Zq+C>$TmV$MGRqJh5P|l z{t3UqD-#kwf^(*x^`4&Z2re4-v`+X7yc`ZL&0t! z4Sro)iZ)PkDWn>a)+Eh`U_Otd}6*Ex-}dDcIoUewM{zRYW^_4a(j-W2^nX1m5`-wZQBkNQ*DD1y4vuR S+8#=I=04lH#w;Y)*!u^rFGMH+ diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 0cc815dc7d11177934789da2a3d0378b27fc4ed4..4ce99a19bfbb6b45ac9dca6805253be7d71a6140 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDp^^A>dCs_a{W(3s$ delta 15 WcmX@ld7hKan3tDJt$ZWfNfrPiqXaJi diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 39540bed37cc2eef197eb05513c014bc49e5963a..d3d36e287b0569e3bfb23d195307124c804a6192 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=yDJ!2yqD+>S}R0D?q delta 15 WcmeC?=;mNE=H=y5E8ob*$^rlxkpkfW diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 2de563b6f0aa19bccedc9c9c95559afefedceda0..dd0d1a64fabb81f71fcf76dee152bc53fe93c08c 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tDp^^A>dhnN5*Dg?Fw delta 15 WcmX@XdV-bBn3tDJt$ZWfAtnGJX9N%c diff --git a/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231223_1549.cpython-36.pyc index 7e2bb01a052f14588fd84f9663643947873b6e58..0113e9c700f0d489b1069d5528b1e7177369af4b 100644 GIT binary patch delta 15 WcmaFB{eYXzn3tDp^^A>dw^#uvnFS31 delta 15 WcmaFB{eYXzn3tDJt$ZWfEmi;|)&yq& diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index f1d8b677a917b6f969d44652ff55ee9babb7d125..c0d7cd151d3ab52a4e247624639ef20f7d540d95 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=yDJ!2wUD*zcq1JwWk delta 14 VcmeBX>}F&$=H=y5E1$^L3IG-;11|so diff --git a/blog/views.py b/blog/views.py index c5df569f9a..da37862889 100644 --- a/blog/views.py +++ b/blog/views.py @@ -3,11 +3,24 @@ import logging logger = logging.getLogger(__name__) from blog.models import Post +from django.views.decorators.cache import cache_page +from django.views.decorators.vary import vary_on_headers +from datetime import timezone # Create your views here. +# @cache_page(300) +# @vary_on_headers("Cookie") +# def index(request): +# from django.http import HttpResponse +# return HttpResponse(str(request.user).encode("ascii")) +# posts = Post.objects.filter(published_at__lte=timezone.now()) +# logger.debug("Got %d posts", len(posts)) +# return render(request, "blog/index.html", {"posts": posts}) + + def index(request): - logger.info("Test 123 !!") - posts = Post.objects.filter() + posts = Post.objects.filter(published_at__lte=timezone.now()) logger.debug("Got %d posts", len(posts)) + return render(request, "blog/index.html", {"posts": posts}) + - return render(request, "blog/index.html") diff --git a/db.sqlite3 b/db.sqlite3 index b710002e83005af24361e148d9ce8f62b8d5ade1..d3a3b6e4c45b5cf413faf9892324702a4de5f78f 100644 GIT binary patch delta 1616 zcmc&!OK;;;6pr23OsAtv7tjSrV+97LVru+|o4Cv%oR`zIaS|tXY;RKg`X)~5JZK(n zvLH2x1v|Q-+e#oLkkDubp-QaSAhDevz=93Z>{zkpCe1JeRjOEVkk8gz!tK5$d-^bPam+@L;v811MI8H!Yf$*Y~=vEw~GC;bdKc%?Lh6+ z51%y-u;0gn!pa7}iTNA#mJN@a!wN8g11mk#a$yA?cj`y5JMVofE+>UjlGv3JNsS22 z2VZOn5jpAKu@G@TG(!w+`qA9V#^z=b`}mzH*F4PpS7^pq5@P$wD^OPnv_hAKAHw0; zcR6h1?7oPtz5n1cG%(#h3=ute+#{r1iI9~2{aNTmL4)S=fUZ3x;&X0LtJC8q)|-<6J8gCr>?OJp<}=C=XIS&`~Cj94tc4XG+a zMJYf>A{@<=c9^!Kz~-Y>in16g4EZQU@q845YBbD5APHMr{Vu7L;;d;6`73)tAeYDuoU>t%~+nF6VQ_%b=yKR(HhlZ9J zxnfOd2z=4dB+p{Fk)b%QUY1?Z$|;9jp;I$t9^r{&jg=^i&A4uwQT7ml&hUL(RQq3UXmO)&Wg*gvipe z=6I%tisy>iv_cQ8x;L(66Ukb!nd1Vh&()N~!IoQHKU5<4#p1M2E7| zLVwPek~)?a>l%tQu$W%QFp4EN-i%G!J>xiZcbnOS%MXolIWKbdxEr}B?AM4E)c5%F$WN5Pt-AHv}{b+n!vauo>_>gc{+Onqbe8cH6{jz z?+p12=@T1Gre`HEKASjU0}HDyL-WMO`t8k0jJudv_(K_1Ol(}T{b?$r^s42I2}}Zu k4hU=)NMK?Y;ADqdqq1GVf$0N3Nc4j|h!hZ5*1!}10G!(=bN~PV From 73ab6824d371da66eeb1ab3ca336c191ad5d56ee Mon Sep 17 00:00:00 2001 From: Tiru m Date: Mon, 1 Jan 2024 13:50:54 +0000 Subject: [PATCH 10/38] Finish database optimization --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3054 -> 3164 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 379 -> 556 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 4 +++ blango/urls.py | 18 +++++++++++++- blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 518 -> 518 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1878 -> 1939 bytes blog/__pycache__/views.cpython-36.pyc | Bin 754 -> 908 bytes .../0005_alter_post_published_at.py | 18 ++++++++++++++ blog/migrations/0006_auto_20240101_1321.py | 23 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 0 -> 599 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 0 -> 685 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 6 +++-- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 903 -> 824 bytes blog/templatetags/blog_extras.py | 2 +- blog/views.py | 19 ++++++++++++--- db.sqlite3 | Bin 184320 -> 192512 bytes 26 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 blog/migrations/0005_alter_post_published_at.py create mode 100644 blog/migrations/0006_auto_20240101_1321.py create mode 100644 blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 5b2a687811597292c1ed783ca05445ec5d150853..96a483a341a8c01cd7c6454ccf40ffb6b893013a 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=zuv~40=4FDMJ1K$7u delta 14 VcmZo-Y+__H=H=yDJ!2wU4FDKY1G)eJ diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index e3d1e7fc36481f86dd693d49ccbb747efe0a951e..dea7d5fd7ba50fb0f4f9cae9562e04c153f0704f 100644 GIT binary patch delta 376 zcmY+AJx{`56ovbi0g; zi!+-)#kjfq7xWbqqc=G>=iWRyH@P3uTSzJU{o>ingLxm|xOeVPiOkoTE?Z;e@fJZ# zq(MjsA&dxQL@f`M5ThZ)O%Vy1vk1IMB84;*WGulZSe^Ti6zh|O3-1T%zO;%G>+N^O~6Z&Oev-`DpbKH&7ew`nX)XthAnK* zqjT6{XY=6OoVq)^AY;Bx{V@C2R`+T+9Q1q6sQ7Qx&TU{|-t-((JNV{0KiJ9ddiLpZ zy91*oy=G{7rK;&A%`hseI`b?<)Eu@HOlPY&k=^K!olKi`c*RaD`^Lk)Ff zkqe(Z1gjDnzAzFtnrNYo4!TCC65&=GNj3DSjy?w58~OsHtx6^Nh;YK42&aXg6@H#d zqba}z#)xsrxq&NcBB2(>Hnm|>hw0*)LQJTK8|pIyo}Xfd+hTeM^(3OZ{8esL{-7;O gMWg)L36%3C)-m5%$5~ch%D3#hoTvkx9UVUY0m1S;yZ`_I diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 505693a5aeb131fdb7a321ccdfbd3bea0bd63ac6..de619cd76b51dc5563121fadeb79dc4dc83e51e1 100644 GIT binary patch literal 556 zcmYk2y^ho{5XWuDNu2EMeXv}^8?2Bv1qBU42!Uu$G>FEHm8^%HgA+$imV<5g4X&Wz z4R{13p2Y1{yuwvC$q5cyp80wHGxpfemdpJ2uWLAPLT<=^BSwCOYxsdi6HP6VboNX# z^vp&rmz+*oWaBoG$;{lQt&pP4WH#>~>T;Pw-YnqgK;;sIjv;A|o09`WPJlM2&DqT9 z%#RMNj^qk>^Volf73K)YfMGsGg+3>8rRfK<&i-J3sXVD7H=;S6n&& udFab66qTKN|LdmnH~qIDUbIf{EWD&xIy^xm&ICQedCCONJe@g7D5H0wxtr_& delta 265 zcmYj}Jx;?w5QTU45651E({KkjNkNMQ5`7Aw+RkBD#;diB)&?XR3g3X7ASDtFC!yb# ziZjqKi6}DC%zW=@=6&#A`g)e<>G|iI-7-SH$w6`COYGqqham<$(SVzJ+A_^x=P}P) zp~arTOD(N*M>d&2&#W-qGMBn+qR7I6Q!bxqP4%&X8&b+2%q6$05~8R~+jI#0p&IXB z7qELv*T!Dgwrd+`vw|qci diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index ced380ab3c24a496067f88055232c0bde2ab00cb..65892e05825fe1d64bc302faaff13cac8be0d245 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tDp)3%LlmP`O6!UR45 delta 15 WcmdnbvY&;`n3tE!X5&USOC|sy/", blog.views.post_detail, name="blog-post-detail") ] + + +if settings.DEBUG: + urlpatterns += [ + path("__debug__/", include(debug_toolbar.urls)), + ] \ No newline at end of file diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index fd0f1209fdac405157ba5de3ff4b3d00e759d51a..04605e63ffedb07104c1b3754e43cb460226c341 100644 GIT binary patch delta 14 VcmZo*Y+z(F=H=zuv~40=6#y8w1K9uo delta 14 VcmZo*Y+z(F=H=yDJ!2wU6#y6<1GE4D diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 2bdcec1af68cb88a5e76a51ef1ed15e8bb138150..0cbd3a3c0f4d3d91a769c10e7b9bd3820b7c8117 100644 GIT binary patch delta 14 VcmZo;X=7nC=H=zuv~3|9695@g1A_nn delta 14 VcmZo;X=7nC=H=yDJ!2so695>v16}|C diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 1217af897c483ae20afca26a7cd7d0fad8c56a7a..487e47894bf653b3dc26a841a5f338d8a019c3d1 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=zuv~43>J0k!d%LF9= delta 15 WcmeBW?qy~(=H=yDJ!2zVJ0k!d3j_cF diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 62281b45219235ccc6629f2a9d3970e1f54ca3b3..3471165d0d0be6fdbd08fcac18f9a8b0c506f5f1 100644 GIT binary patch delta 401 zcmXYszfZzI6vunLUZJ)8ra%!%`~gxIHOAFwh>SpxsY_G5CP0wl0qW$UBMkZ`{{vTd z{Wl!CyZJxp9h#SXlKZ}wcc1qehlF+%i|NhxXMgghHDok`wtRX>sJfJ$xSyaA8hwzR zq>qOwN_c5JPyfI4C2}%!?Lx8*_>lM0U0Y^3Ns_`S?YV<7_3z+YwoF?N4R1aR+;MR0 zdX%yPpMe~17Q@IT^SxQXSei%76d(c?+~XoD!V4afIMPuZqDl$9ayJW3l$$dypi#W4 z)Dk-eP1DSyRm*S;t%&MZfE3lGkkSeOd z6)B@CEXYB9Lv*k}nInv}JFV_{z3Zs_o<7&!60L249S+Bs%zLB3wC_{boBiEXgCAm| hJuuadUg0z1n`r^A)dE3D%qp-@pHKx_Y95Xwo4*I9TT}o5 delta 374 zcmX|+&q@MO6vpSybw+0zHUAKr7NsH?L_(XELL{`QL0#0e7)I|!N5qjkqtPm&wk_&x zdW05jq$g+Pdd5S|>yP;$uwB+`kkD}E zfoD&>E8AfVn)H-da6=2_f+R^{-t>Goa2Nap?}uEpT|Qx=2yb*;F^EnKB67Gl!2T}< zRSVmH#<)c|k1bLx!?O31Rb)BLl!xzFDY1?l4I)aARvfrh>ZA@Y$|kA7htj+#qbX>F z4MZ3>J7>M)qn@Q=){!T~R%C5Qs30t3Ht$bdf5e&X1R@*F>xfY6PUgek$YIP!DR#hA aJ9-tp=sSN6UeyAXMHN2PM^c5$_~8#-kY3{e diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 7955e3f1616ed6d492082daf0c22b025bf5e56c2..a20389651ec468f0eaadf783645fe7180d6695da 100644 GIT binary patch delta 442 zcmZ8c%}T>S5Z>9OO>EO2p#>{ckb*P_UV2o-VuN0)SbM66P`gWNOq;s9y-3AFJ?f$6 z<{S71o_vs8eFI-WCly4TWxknjnQ!OY&(xz)Yvghn_5RFDDMCKTpP<+uV9MJ??XpTo zT2BMQ3}!x%UY@P64AuhE&xxH~yj*P5aa0i>e5y2GpA!a8;HMa!!yTw}RD~@wPWPv3 z7>ei&Dquv{uvyPb9`J#31rPd)Gm$K{X>167Gv!hV6ZtC<`REOH?{y>u)+|xPI)H>> zBoYnt5L2!rFkmzwBisvQ1~cMQrd7xs(5ZeR5}6ILb*$8+!{sC#OCD!CPW!a$xXo6p zV{37i`TemM?hJ88tfC;++fKL9w5iA;TV9EL(k-EoOr$-o+^fkp_VUN51)>~%fs6kR rLeJwO8qgzWXs_TahmW%Uo+?bi4EQhf@>KG>h&G@nuxdeM(I)-y2@z@#JH z85{Ysan8c#;^ks+Kqtr&NH~h5Q85Wm@Caxnw&dtMKm`>ChHkwHJACMy?QF-#?k7oR0V2>_?2nD zeuE>=CScHo0CcB*=9iXUBV#FsXU3IRsBoMq-62c+|0N(a?s1mOGF2x)RCGx^?t#Z$ JXaV(A20!eCMSuVR diff --git a/blog/migrations/0005_alter_post_published_at.py b/blog/migrations/0005_alter_post_published_at.py new file mode 100644 index 0000000000..11d7cf0dfa --- /dev/null +++ b/blog/migrations/0005_alter_post_published_at.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2024-01-01 13:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_auto_20231226_1443'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='published_at', + field=models.DateTimeField(blank=True, db_index=True, null=True), + ), + ] diff --git a/blog/migrations/0006_auto_20240101_1321.py b/blog/migrations/0006_auto_20240101_1321.py new file mode 100644 index 0000000000..a48aeb8103 --- /dev/null +++ b/blog/migrations/0006_auto_20240101_1321.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.23 on 2024-01-01 13:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0005_alter_post_published_at'), + ] + + operations = [ + migrations.AlterField( + model_name='comment', + name='created_at', + field=models.DateTimeField(auto_now_add=True, db_index=True), + ), + migrations.AlterField( + model_name='comment', + name='object_id', + field=models.PositiveIntegerField(db_index=True, default=1), + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 4ce99a19bfbb6b45ac9dca6805253be7d71a6140..99bbb59d9f0b93704463af3548d171ed408a0503 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDp)3%LlCs_a|CItEb delta 15 WcmX@ld7hKan3tDp^^A>dCs_a{W(3s$ diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index d3d36e287b0569e3bfb23d195307124c804a6192..eb9370f8d6276004c74ddd8cb367b58e1260a928 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=zuv~43BD+>S~6a%aP delta 15 WcmeC?=;mNE=H=yDJ!2yqD+>S}R0D?q diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index dd0d1a64fabb81f71fcf76dee152bc53fe93c08c..ddeccddf3215cefc749a918382418fefdef1e3f9 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tDp)3%LlhnN5*>IB;W delta 15 WcmX@XdV-bBn3tDp^^A>dhnN5*Dg?Fw diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 0f06149674fe8339dc621f053cb263890e76803f..070a44f88f33370a59e5984e65825fb86f3d6935 100644 GIT binary patch delta 15 WcmbQwGoOden3tF9#kP%Xl57AX8U!c+ delta 15 WcmbQwGoOden3tE!VB)%W diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfd9c7a45f2b4dd998541ab75030caa065f3b62b GIT binary patch literal 599 zcmYjOv2NTj43#X|@fkUwQ}YJ}yu{AkwNp`~K#?wOmSplG*hkj!MYdeaM$@@nv*ZUl z_ZRvpTD!ErkSUatAd#SFniL=TsP%H0{QGl*zc^!m*|R0dKBi+|5dZ_OS<4IF21UTx zM+O0ip9}=@o%kUN0rHHc;eWcz(!eEcQxE0Xn9jPWHGtY~eduw;WE|76IRUbQ11kbp z)VvTVcOeiRM!P)-=N(-O*t-@KjUlEoiCcVr9V_YF;uGQ0I!_vCao!u%-yQ4Y>|8(!!HeLI8B2g zq-KYRAYHgv&3BY?iBgm^X(W4JsjpM1eV+dV?2*{JZG(0QDA6VF^@ziXXB>ogEI*VZ zo;NMdK9`st9|rfE4KIB`54WGP3)5n@HPD#sn;9-`Uv4q;Dr!R?Q)f>j&uAF0Rp~1! zFJC=Zf7pK?{M&jRHX(>bBqa}M&;HX?x&`b!?;%uk*K?wxlI{Pte|J1@w3 HnJ>g0LtLS< literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a40e6722e3dc9d94c6d8a33c3490d2ca78d7160a GIT binary patch literal 685 zcmYjP!EV$r5OtjFZZ_;n72*QojFd~0-2x|siiBEmph99#xmZqSntDm%5PK<{;o1v- z!9VaNzH;g>aAKV8s@U?(j=Ij|rVavd3#)%;5nQU%L7GLsb`*jjr9(JkMVU z*;pJzuZ_vnK*%BnB;uCrL*-E@iW z@opBs*znl5;mzOk>`J$oRT`AeuJ!QA^s>UNY-Cq!a=Om$rBre3h@n z>SVn-?!OKGPw~RcLo#tVjiP|lKH_^n<}cF7&0*`QkD(mpj1tD=eN+4B3Gul2)&5~# Ld!@$fKMMZ=B9pm} literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index c0d7cd151d3ab52a4e247624639ef20f7d540d95..23bb17dff86d4bdfb5e7f694a39111a4f78d91d8 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=zuv~40=D*zeb1Nr~} delta 14 VcmeBX>}F&$=H=yDJ!2wUD*zcq1JwWk diff --git a/blog/models.py b/blog/models.py index a2c52f2fe8..70c1dca82f 100644 --- a/blog/models.py +++ b/blog/models.py @@ -15,9 +15,9 @@ class Comment(models.Model): creator = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) content = models.TextField(default="content") content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - object_id = models.PositiveIntegerField(default=1) + object_id = models.PositiveIntegerField(default=1, db_index=True) content_object = GenericForeignKey("content_type", "object_id") - created_at = models.DateTimeField(auto_now_add=True) + created_at = models.DateTimeField(auto_now_add=True, db_index=True) modified_at = models.DateTimeField(auto_now=True) @@ -32,6 +32,8 @@ class Post(models.Model): content = models.TextField(default="content") tags = models.ManyToManyField(Tag, related_name="posts") comments = GenericRelation(Comment) + published_at = models.DateTimeField(blank=True, null=True, db_index=True) + def __str__(self): return self.title diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 17b33c223b5a466d70ec39b54fcd78b101825841..3925c0117d4f130f3c1fab11c8703247a1d05fad 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=yjv27w-I{+Ib1U3Kw delta 14 VcmeBW>}6y#=H=xw*f^1`9RL@219<=d diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 1d75e1269fdfcde7165ffa7567d13a666a6d8362..ed79317027a44840ecfb2e9034ca53c031e632fc 100644 GIT binary patch delta 227 zcmZo?-@(Rd%*)Glb;qRC%@aBI)mJbuFqAOVFqAMhGZpitFa`tJHH_IzMRFxfDNM~^ zein0)T@6DP3z%e{&5*(j;>~85%UsKp#{p!s&St1(0@7?nNkCmJAXYO|Ei;hK+RRwX zlE;z4Sj!B=EI<*q8s-|N8kT03Ux_J5e_%# delta 327 zcmY+9F;2rk5JhKZH})nZT|$IJVGIzX#Xc#Du#23aBs;7fU17KWp`BeD WbGeDe)7%+rhivTNziifhvG)gt3{YeM diff --git a/blog/templatetags/blog_extras.py b/blog/templatetags/blog_extras.py index 6e979b429a..068c458bbe 100644 --- a/blog/templatetags/blog_extras.py +++ b/blog/templatetags/blog_extras.py @@ -10,7 +10,7 @@ @register.filter def author_details(author, current_user): - logger.debug("Loaded %d recent posts for post %d", len(author), author.id) + # logger.debug("Loaded %d recent posts for post %d", len(author), author.id) if not isinstance(author, user_model): # return empty string as safe default diff --git a/blog/views.py b/blog/views.py index 2eb7fb0f38..b708bfa920 100644 --- a/blog/views.py +++ b/blog/views.py @@ -8,7 +8,7 @@ from blog.models import Post from django.views.decorators.cache import cache_page from django.views.decorators.vary import vary_on_headers -from datetime import timezone +from django.utils import timezone # Create your views here. @@ -25,9 +25,22 @@ def index(request): - posts = Post.objects.filter(published_at__lte=timezone.now()) - logger.debug("Got %d posts", len(posts)) + posts = Post.objects.filter(published_at__lte=timezone.now()).select_related("author") + + # posts = ( + # Post.objects.filter(published_at__lte=timezone.now()) + # .select_related("author") + # .defer("created_at", "modified_at") +# ) + + + + + # logger.debug("Got %d posts", (posts)) return render(request, "blog/index.html", {"posts": posts}) +def get_ip(request): + from django.http import HttpResponse + return HttpResponse(request.META['REMOTE_ADDR']) diff --git a/db.sqlite3 b/db.sqlite3 index bec9615ce422ebc354568bbd8aa36c4350022309..4369c5d5917124832d1ca881b3c9a674a88f293a 100644 GIT binary patch delta 2432 zcmai0Z)_Xo8Nc^^&wtK|{kCPnU8AMOO`2v+<2#?vv0VbXgd~laFRv0USO=9oa zNl4m7vuxjc_dL(f&+qp<&-?nsuWL?RulYs&_8y9&9OSe1`olsi4|>Xvzl70F=Icen zwga?DV7@MwE->@HojR)SpcqccF_vZB!B9bwgHG1zVmX!za=eq%ZVs>K_wK+>lcR|dw^lF=m_uI zhnlL^h@4JGGYVY?kON4`P$nh^(}`Fvq$K1_e&_F5J*!`$@Qh`tT>6b=zSIZJRH;j3 zth*m(7`{1_i^&;hWA&1d8jBsAw=vzpX@an=N{6#G+u>;(9F32RP7WN2u*%p`{wL0G zPdqi=>raoSx#|8`+0?kW1D4gwfh9FP0ww z%#8P>I}>SF|Im2mklYngRP4&&jibwh7!B&x^Psuv^PR`ljXse0yrubA_EPwd z_!NE!L(3&g*s`}=+GcssXJ9B1TlWLNtg)#MmCNJfxi&Y;3%r|G5=tui=y7{UlA@B` zXFEPOcgzS^!hZrUK0sKWqVR_V`z3s;Tq@u_4M+rQVE0NxYv#q%XLhYz{1$X>BjGnG z{7sb}q4rn2ze0_!d?OkG#;7f6Xd-)u9=}TwExyEm!#D5;_+1ik5n}@l06rkV+*zW4$>*myT)RfKC*W}oBFhz!>VySFi?iG(U`fppp$ zRuqIpK?XpC7)A@dyH=eWYqiR?-N*86EXxUQccoT$(O5IP1RiP8>SY=3(!n1fk*O@d zXRg%g9j&PU#JBLrq3NUU)R`tjz7V72%qc3^)ha& zFwkqcuaeQ0sPc5348pgy$UFG<^7a!SVrRv=!N+VmN11h>QcTHo$#}<@shKr=VK}A# z*3xQTFzfVr-KXVJhNeyDpjZ-9b5=j7F4TLL%pn zE8^v&(nfQeDlWnL9rrq^@)Eq?vi{uOQex&*;}UGBuN*_cP&?NiatfQknl&(+WwV0@ zR4-JX5fD@$iSFK%=sibV&?`7yA-CXFe|r|%JsVHIb(7sTIAF7{pJ;a5KKn*Ld&{Jv zK6Mths!iwM_tnd1VKd09U!H{=_@S2MeJkE`unU2lI`=AU08Q%BE6}PgzY1@vZ@vco z>a(xG2AWX*sYdzd;JEs$CHNeeRUNOxM&MW(c^&=^m=L}}ksAIT-yoI0f?JHJ4rpDE z45*IL77Vh2k$56ksO$g;uQtEd_LuO3``7+aP?Qz%>-*07+&Wn@0hBfY)anFmwJp@r zmX|4f9*42c@^ZQKjAi~9ZKV1D5JmF)q0FRhMlRSUuA k8KJE#UI9LeGh!8QAI~tD_vKwVaw0Kgn=N#AAbDM;?@tPR#&HMCo0U7R4RJl<#NyS zJnwnV`<#ipRTJ-5z3p`$LI^eSs^^7yUCB2F@FDY+X`nUIc){jsGL55BaeU7Q7MmZw zhBjz04GZ|;67q9;Wy$+#EsiGAvHnatr;}av^x(h0{dy#p6AC^41K3&^_eY=f(fV!l zL^_!qOzET=Q$HRUiKJrb{^W2h8_|c;sa(y+idC_e5S(V@+BiaFWE>8Np4ua# z7-+~uM+b(q{#-nw1w%e9r10hIezC7ZRZj%Rj=$WJNyJBnvVA?l9$#3G2eZvB?TPNL z)blUIy5qeqN}@{{kEqety406?d!Nm=MkKT5`0^9XU>7(qaC<#ajLF(W1;gGmlYNf zEW)3#2^+8m%bfEmu)A*&f!$lc2e$DY6c%@ID_g#a_qnXjD1uL5l24vEZ#$!=(djHj z@8HY(_`%Z%mN+=gMHfKWOT)M@_3ob1t;hJN%T8bu!5^?$bWf~-SD;w5TPVf?k$7qX ztRimeA^Z%hT>T}mRX?fannwu!f=67l4!Z>^VnV4X{u6ZhAA6FGLk*159^6RS(-(XZ4!w_)$7u2`<6Xr z`_(q-Y?Sk|#d6s+&RGO$7B8E|cbJThvNvW(BMZ%t-R!d&(ttk$@WN}vpQ_hsYeFXR6caAN=E|GfhG5&DJh>cc@ Date: Tue, 2 Jan 2024 02:34:34 +0000 Subject: [PATCH 11/38] Finish custom User model --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3164 -> 3222 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 556 -> 556 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 3 +- blango_auth/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 0 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 0 -> 417 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 0 -> 1840 bytes blango_auth/admin.py | 41 ++++++++++++++ blango_auth/apps.py | 6 ++ blango_auth/migrations/0001_initial.py | 44 +++++++++++++++ .../migrations/0002_auto_20240102_0232.py | 29 ++++++++++ blango_auth/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 0 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 146 bytes blango_auth/models.py | 53 ++++++++++++++++++ blango_auth/tests.py | 3 + blango_auth/views.py | 3 + blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 518 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 1939 -> 2344 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/admin.py | 4 +- blog/migrations/0007_authorprofile.py | 24 ++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 685 -> 685 bytes .../0007_authorprofile.cpython-36.pyc | Bin 0 -> 907 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 8 +++ .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes data.json | 1 + db.sqlite3 | Bin 192512 -> 204800 bytes 41 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 blango_auth/__init__.py create mode 100644 blango_auth/__pycache__/__init__.cpython-36.pyc create mode 100644 blango_auth/__pycache__/admin.cpython-36.pyc create mode 100644 blango_auth/__pycache__/apps.cpython-36.pyc create mode 100644 blango_auth/__pycache__/models.cpython-36.pyc create mode 100644 blango_auth/admin.py create mode 100644 blango_auth/apps.py create mode 100644 blango_auth/migrations/0001_initial.py create mode 100644 blango_auth/migrations/0002_auto_20240102_0232.py create mode 100644 blango_auth/migrations/__init__.py create mode 100644 blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc create mode 100644 blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc create mode 100644 blango_auth/migrations/__pycache__/__init__.cpython-36.pyc create mode 100644 blango_auth/models.py create mode 100644 blango_auth/tests.py create mode 100644 blango_auth/views.py create mode 100644 blog/migrations/0007_authorprofile.py create mode 100644 blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc create mode 100644 data.json diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 96a483a341a8c01cd7c6454ccf40ffb6b893013a..1d7e247f8682d4108241faebc8088639bbc20fba 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=!3A2N9&do=(Z^#oo3 delta 15 WcmZo-Y+__L=H=zuv~AKv_G$ng4Fqxk diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index dea7d5fd7ba50fb0f4f9cae9562e04c153f0704f..4fc7f9d8fd82c705e3268aaf1816298b6e174c5d 100644 GIT binary patch delta 327 zcmca3F-=n0n3tE!HfeI|ejx^i#|%h-8_0G5;^MH0%Jb_}#M8N>#8Mud8ci4PDI>ww*ZPX>t7o*SJZm+qmVo9jIsF-z6*g jrINsSI#9l!ykxs7yAz9$XD!0`=jcIhVk=sM_Dai!A delta 16 XcmdnbvY&iV>oSe!41dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFBAQY{M=Oi=#N<@{q@2XO^n554pIBOwp&uWgnU`4-AFo$Xd5gm)H$SB`C)EyQS}_na F008m5AUOa4 literal 0 HcmV?d00001 diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..059c1068c038ecab47d0b4381e352bea4ed0b65f GIT binary patch literal 1078 zcmY*YJ9E@95Vrg}+xJKaNk|BfKzGgE1X_j(Gz?9KfuV6D#7TG2AwQ60LehqRKubpj zKS?bWe}Rf!pDzJxy!yV?uJn1eemopzKbx=Od+2$;yni0x-Z8x9H5l%3qP&9Sgdp~n zUj%v3;y{H(lt(QNRb2G)gm^DJ9`X2#$72y(26-yTGF$dVB+^SCB71MVaq=7X^~S_S zj2E&5kiIoSKkG<{1e}9~uvUDwRI!Wm8K$hC6u>dO<{cQ}<%D~=&k6VWjwEwm1U$M# zw%f6!Ww$yuYS|vLd66xu~v0p161} zh2q9VqF_?Fq-MsPRhnN6UkPohlBq*k&MTMAr8bt9tPn0$Yz_MmRY+rGRT`H{L)pyA zPr@Ytjb-z>8z5?Gp&KZMix;|TYU4JMQSh#lFE(Blb)_vU?ICAY7?-uDsA?fg*GCs! zRHU7aifsakXE&(K_tP3+Z_JICTkaD@UozC@m`9C;@mt>BojCtSK-; zUAnpqVT~Iy&gnHBC literal 0 HcmV?d00001 diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..597bf0c476ebf64a95d9585066c8cdd9b7ec983b GIT binary patch literal 417 zcmYLFu};G<5Ix7KRFYOgh!u%7OM=9TP+KI}y0B%j+??A6oI1pf5UlVAOnd^r8#cI$Fec;wd@B{On+OhG};5QxcgjzJzGrwO4uTxhx5n0dS3_7k2@ z@XjMCuF}e&(l%X`8>*Y@QfYMYsv`(VjAb%%V$2qLuF=My0wTB(Q15vsLp z_1=?=Sa)+mU;BV2qTRaieU@!arLw|cX|hMt+}m0fD(m%zr<2WOUE8#NYB+KI$*d1! l7P1amCfvotCwylUcnRP8FV<%{Wqt32{{YiUYJ>m) literal 0 HcmV?d00001 diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f609ec06fb279ea9b41976bc6d4d108ecb847fa GIT binary patch literal 1840 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 literal 0 HcmV?d00001 diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6c7eb60dcfaa7fee0b52a07f52936439ca79b66 GIT binary patch literal 806 zcmYjPy>iqr5SA_5=kwh`xPlIb*3H?uP%=zl2BHV79L!|h@UE1M_q%g5&GY<_Rb92Kcw>TIgEAwzu3@v&NImFy3np%P$4gM! z#MZ&;Tv@ghW^ZbY%uNU_ubP{Gh)=)G+~pY;LV?yP#V+tKtbwk?SEIhGE_yK2OHga6 z!6iwlnqugX>#TxCVE0sLbrFhmW@6?%88ZoE*vY;D#8bvDdfr$f_9kEpoq%prfmS$C zV&<=!9jKM1yBaFlr=`~V=(X#|N33kHn#p@; z@%JP?a)I z){jxdGztRG_vaL)7x`BDp7TkgVt#M5i~Ub?g_^Ob?aUWq?K+}t;V$To_Z~e(gNa}4 Od;8M5Y5RWc9nk-5z}{&9 literal 0 HcmV?d00001 diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af367c9b6934f6deb6264fa746e1fe3fd5ed2553 GIT binary patch literal 146 zcmXr!<>iV>oSe!41dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFMIur{M=Oi=#N<@{q@2XO^n554pIBOwp`V+XUX)mpnV(mzA0MBYmst`YuUAlci^C>2 QKczG$)edBEF%UBV0GUT5umAu6 literal 0 HcmV?d00001 diff --git a/blango_auth/models.py b/blango_auth/models.py new file mode 100644 index 0000000000..d651038b8d --- /dev/null +++ b/blango_auth/models.py @@ -0,0 +1,53 @@ +from django.db import models +from django.contrib.auth.models import AbstractUser +from django.utils.translation import gettext_lazy as _ + +# Create your models here. + + +from django.db import models +from django.contrib.auth.models import AbstractUser, UserManager + +class BlangoUserManager(UserManager): + def _create_user(self, email, password, **extra_fields): + if not email: + raise ValueError("Email must be set") + email = self.normalize_email(email) + user = self.model(email=email, **extra_fields) + user.set_password(password) + user.save(using=self._db) + return user + + def create_user(self, email, password=None, **extra_fields): + extra_fields.setdefault("is_staff", False) + extra_fields.setdefault("is_superuser", False) + return self._create_user(email, password, **extra_fields) + + def create_superuser(self, email, password, **extra_fields): + extra_fields.setdefault("is_staff", True) + extra_fields.setdefault("is_superuser", True) + + if extra_fields.get("is_staff") is not True: + raise ValueError("Superuser must have is_staff=True.") + if extra_fields.get("is_superuser") is not True: + raise ValueError("Superuser must have is_superuser=True.") + + return self._create_user(email, password, **extra_fields) + + + +class User(AbstractUser): + username = None + email = models.EmailField( + _("email address"), + unique=True, + ) + + objects = BlangoUserManager() + + USERNAME_FIELD = "email" + REQUIRED_FIELDS = [] + + def __str__(self): + return self.email + diff --git a/blango_auth/tests.py b/blango_auth/tests.py new file mode 100644 index 0000000000..7ce503c2dd --- /dev/null +++ b/blango_auth/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/blango_auth/views.py b/blango_auth/views.py new file mode 100644 index 0000000000..91ea44a218 --- /dev/null +++ b/blango_auth/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 04605e63ffedb07104c1b3754e43cb460226c341..db6d172d7cc2e13a57a20082dae05f1592ac4467 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=!3A2N9&dnEuJy98JO delta 15 WcmZo*Y+z(J=H=zuv~AKv_DTR9(*$e) diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 0cbd3a3c0f4d3d91a769c10e7b9bd3820b7c8117..af24385e465e52c022772a2ede57abee1086eb55 100644 GIT binary patch delta 286 zcmZo;S;L}i%*)HwS2Q^_n2~|uF#{4{0kR!{xHxB`vSNKMTNE23Ln>nydlpA3b2B3& zgF8bCa|%lfLkbH}l(U&RiVG^slFHT01Xs%nQVW$~1F=(BgBdj0UV?1WWW2?in39{B zr^#}QIV3Ut7E3^Wamg)q=ltB<)Vz{gypE+M8Tmy4MfoggnK`KwSNJe;PW&qk=g|s0gA3&f*8MZgJS;=BJeA Zq}lODbnG6I?ATNNoyhFoP!BOOVN$jJH@5Q*tx&G?{NPha{%o zVhPAEF1f|-oS&PUnpZOMxDO-8WD!P3HeR6OBHqc-j0WOtKqfm77c&6~4#px7-%pck y@*+mV$u}5fO+ox3hn||fH#QnCf`rL^Je~UHU!C*3;-S>yB8SjB`V$uTMUc9@siys_ zh`Zc7N8A&*T{xqm$4eV1C_mr75gfjp(huy^;I3 z<^_eOP*~)YTjwb3;x;trWZqKR*-K!n6A;-8733r!!T=NIOF_#ZWsXl! z8@2H*;usvcMRycxlKQb*Nt$gDbt*fFtn>#oD=-$t+e$Ge%kW=jrAkQsWDnM6O)UaI z__*(1FVl>vj%2JJxO##1Mc&%J*h~OlbC9MHIb<+wFlS%}7Sd)bktMTr|HCs|^WGFl oG?`!7n3tE!Z_lLE0yYMQ#|%h-1;};);^MN2%B5^6Ji!c_yc;(>U}C(rc_Q-{ zMm9B|T#@?ZZdN@;jmf)M^DUJ?0?Hsl1xQ5k6qF|AWEN+nro<t}GlBWMJP diff --git a/blog/admin.py b/blog/admin.py index 4fb41d4148..02c9b965f8 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -from blog.models import Tag, Post, Comment +from blog.models import Tag, Post, Comment, AuthorProfile + # Register your models here. admin.site.register(Tag) @@ -9,6 +10,7 @@ class PostAdmin(admin.ModelAdmin): admin.site.register(Post, PostAdmin) admin.site.register(Comment) +admin.site.register(AuthorProfile) diff --git a/blog/migrations/0007_authorprofile.py b/blog/migrations/0007_authorprofile.py new file mode 100644 index 0000000000..d99711206c --- /dev/null +++ b/blog/migrations/0007_authorprofile.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.6 on 2024-01-02 02:18 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('blog', '0006_auto_20240101_1321'), + ] + + operations = [ + migrations.CreateModel( + name='AuthorProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('bio', models.TextField()), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 99bbb59d9f0b93704463af3548d171ed408a0503..3e758870419bb23ca55fec15d4f61d90662faaca 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tF9f5_yG>?c?NEmsA3 delta 16 YcmX@ld7hKqn3tDp)3!+)*-x+l04;+BjQ{`u diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index eb9370f8d6276004c74ddd8cb367b58e1260a928..f97aec694f4ce56e8b84d88d6ff26ca58bf158b2 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=!3A2N9(I|~Z{BfA7E delta 16 XcmeC?=;mNI=H=zuv~AKxb`}-@Bj*G^ diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index ddeccddf3215cefc749a918382418fefdef1e3f9..62f5f4273bfd4faa29c586489ba5f66498a23e17 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tF9f5_yG><5_uECmHx delta 16 YcmX@XdV-bRn3tDp)3!+)*$*-S04y;DZU6uP diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 070a44f88f33370a59e5984e65825fb86f3d6935..d3a2a514a7860fd890c9f863be7e8839080b10b1 100644 GIT binary patch delta 16 XcmbQwGoOdun3tDJGIa7rb_q5BAZY`P delta 16 XcmbQwGoOdun3tF9#kNTs*(KNjC{qNx diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index dfd9c7a45f2b4dd998541ab75030caa065f3b62b..f83e871dd8493fe63d2ef8c1036611bdaab735a0 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tDJGIa7r_5daTCWQnb delta 16 Xcmcc4a-D_Un3tF9#jZ&k*#npWE{6qE diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index a40e6722e3dc9d94c6d8a33c3490d2ca78d7160a..c7892130f3f6f994fc24f8ab2e37d23ebaee9219 100644 GIT binary patch delta 16 XcmZ3>x|WsQn3tDJGIa7r_GL@}B4Gq1 delta 16 XcmZ3>x|WsQn3tC;dC#Pc?8}${Cd>rX diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3154b653feb9a76319178d4fcbe339fea85cffa6 GIT binary patch literal 907 zcmYjPOK;RL5Kf$IUYqR$RYDxOfO6SKi$FpMb^8J&+9JAKam|U_7r+=F0DGc?foK*9#O}3w5T21ml{#ms!_3TTe)67f^LtuUyLW?37zb0Phc=zHs?Zql46nO97xJ$M?gLt1Sa^c`&{y<;SBnfOp8da z=mlSaTXUI4dHS7$|BcI7)SQ-4!NG`A0p=3TU{_ttzyMd26sh42x=Ws`c%3_G1d?dB zPpw7Db5@@OL|Vv|v{3|)z@e=xrQlJD3@>wz*r)XCGRoCMN+q^jgRS~9s;VePJL45E z887E6Nt9`Q`epW>emOh*Opi|w4nKl_?~(Ev`ulB-$Etl&jSKjDX@bOvBb5@kGk(={ zaBy1knLyE9EtW-PB7m?MoVG%o1hDs~XZzEGL-0h!Z>QszCZA#CR{Y%?or{8x=7ObS zbSdOTT}5*~igOhV50Q)>=4ynkd!<^3ZMvm&Sgm9aqdB z@3I@tMY-sRaBnp%ZaM3UeR8iHb`w0jt3*CkDXTv{B;TRur~~Is*N?Y~|5`Q8*Ee*> F_y-hI1&9Cu literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 23bb17dff86d4bdfb5e7f694a39111a4f78d91d8..0ad14a1d4d0730040e1ad6e3f8c4fe144d06b4ee 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=!3A2N9&dkX*_`UH6Z delta 15 WcmeBX>}F&)=H=zuv~AKv_7(si5(JF^ diff --git a/blog/models.py b/blog/models.py index 70c1dca82f..e6e4de47b6 100644 --- a/blog/models.py +++ b/blog/models.py @@ -40,4 +40,12 @@ def __str__(self): +class AuthorProfile(models.Model): + user = models.OneToOneField( + settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="profile" + ) + bio = models.TextField() + + def __str__(self): + return f"{self.__class__.__name__} object for {self.user}" diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 3925c0117d4f130f3c1fab11c8703247a1d05fad..6a1ca923e65594867da6bf600d4e0f84a8184261 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=y*44piYy$t{v)dQLU delta 15 WcmeBW>}6y(=H=yjv2D^s_BH?@kOav9 diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index ed79317027a44840ecfb2e9034ca53c031e632fc..a4af299bc892db2d501cae962c8484413e6cad28 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tDJGIa7rc0*W)bp*$tTiDo+IF diff --git a/data.json b/data.json new file mode 100644 index 0000000000..6fcbb977e4 --- /dev/null +++ b/data.json @@ -0,0 +1 @@ +[{"model": "blog.comment", "pk": 1, "fields": {"creator": 1, "content": "What a great post!", "content_type": 8, "object_id": 1, "created_at": "2023-12-26T14:43:20.297Z", "modified_at": "2023-12-26T14:43:20.312Z"}}, {"model": "blog.comment", "pk": 2, "fields": {"creator": 1, "content": "I like myself!", "content_type": 4, "object_id": 1, "created_at": "2023-12-26T14:43:20.297Z", "modified_at": "2023-12-26T14:43:20.312Z"}}, {"model": "blog.comment", "pk": 3, "fields": {"creator": 1, "content": "Thank you for reading my post!", "content_type": 8, "object_id": 1, "created_at": "2024-01-01T13:47:03.001Z", "modified_at": "2024-01-01T13:47:03.001Z"}}, {"model": "blog.comment", "pk": 4, "fields": {"creator": 2, "content": "Thank you for reading my post!", "content_type": 8, "object_id": 2, "created_at": "2024-01-01T13:47:03.001Z", "modified_at": "2024-01-01T13:47:03.001Z"}}, {"model": "blog.tag", "pk": 1, "fields": {"value": "django"}}, {"model": "blog.tag", "pk": 2, "fields": {"value": "example"}}, {"model": "blog.post", "pk": 1, "fields": {"author": 1, "created_at": "2023-12-26T14:47:03.829Z", "modified_at": "2023-12-26T14:47:03.829Z", "title": "title", "slug": "test", "summary": "summary", "content": "content", "published_at": null, "tags": [1, 2]}}, {"model": "blog.post", "pk": 2, "fields": {"author": 2, "created_at": "2023-12-26T14:47:52.578Z", "modified_at": "2023-12-26T14:47:52.578Z", "title": "Thiru", "slug": "Thiru", "summary": "If you don’t already have some test Blog data added, you should log to the Django admin and add a couple of posts, and another user as an extra author. This will come in handy later.", "content": "Provided you’ve done this and have some test data, when you start the Django dev server and navigate to the main page you should see something like this:", "published_at": null, "tags": [1, 2]}}, {"model": "blog.post", "pk": 3, "fields": {"author": 2, "created_at": "2024-01-01T13:48:31.575Z", "modified_at": "2024-01-01T13:48:31.575Z", "title": "title", "slug": "test", "summary": "summary", "content": "content", "published_at": "2024-01-01T13:48:20Z", "tags": [1, 2]}}, {"model": "auth.user", "pk": 1, "fields": {"password": "pbkdf2_sha256$260000$Vb3Nzqn4v5Fh1KC2VbVR6J$J/F+J8DRBt0BgTmbdH8Ah0sVxtny3E0uXRhPHgPjcy8=", "last_login": null, "is_superuser": true, "username": "codio", "first_name": "", "last_name": "", "email": "", "is_staff": true, "is_active": true, "date_joined": "2023-12-22T00:57:16.353Z", "groups": [], "user_permissions": []}}, {"model": "auth.user", "pk": 2, "fields": {"password": "argon2$argon2id$v=19$m=102400,t=2,p=8$OUhTUkNXc0tVZ3Y2bFhlWGJmUm1xMg$UUWqV9jKQG5J0/a41CEIAg", "last_login": "2024-01-01T13:47:51.013Z", "is_superuser": true, "username": "thiru", "first_name": "Thiruvalluvan", "last_name": "Murugesan", "email": "m.thiruvalluvar@gmail.com", "is_staff": true, "is_active": true, "date_joined": "2023-12-22T00:57:50Z", "groups": [], "user_permissions": []}}] \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index 4369c5d5917124832d1ca881b3c9a674a88f293a..e1f5f964e499907f05b159be6391a1ae4a610702 100644 GIT binary patch delta 7385 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 Date: Tue, 2 Jan 2024 03:41:11 +0000 Subject: [PATCH 12/38] Finish django registration --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3222 -> 3327 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 556 -> 1033 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 3 ++ blango/urls.py | 19 ++++++++++- .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 0 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 0 -> 390 bytes blango_auth/forms.py | 15 +++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes .../activateion_email_body.txt | 11 +++++++ .../activateion_error.message | 12 +++++++ .../activation_complete.txt | 12 +++++++ .../activation_email_subject.txt | 1 + .../registration_closed.html | 10 ++++++ .../registration_complete.html | 11 +++++++ .../registration_form.html | 11 +++++++ .../templates/blango_auth/profile.html | 11 +++++++ blango_auth/templates/registration/login.html | 30 ++++++++++++++++++ blango_auth/views.py | 6 +++- blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2344 -> 2344 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 685 -> 685 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/templates/base.html | 18 ++++++++++- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 42 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 blango_auth/__pycache__/forms.cpython-36.pyc create mode 100644 blango_auth/__pycache__/views.cpython-36.pyc create mode 100644 blango_auth/forms.py create mode 100644 blango_auth/templates/blango_auth/django_registration/activateion_email_body.txt create mode 100644 blango_auth/templates/blango_auth/django_registration/activateion_error.message create mode 100644 blango_auth/templates/blango_auth/django_registration/activation_complete.txt create mode 100644 blango_auth/templates/blango_auth/django_registration/activation_email_subject.txt create mode 100644 blango_auth/templates/blango_auth/django_registration/registration_closed.html create mode 100644 blango_auth/templates/blango_auth/django_registration/registration_complete.html create mode 100644 blango_auth/templates/blango_auth/django_registration/registration_form.html create mode 100644 blango_auth/templates/blango_auth/profile.html create mode 100644 blango_auth/templates/registration/login.html diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 1d7e247f8682d4108241faebc8088639bbc20fba..ecc6864711c43638e8393c637db89cfe0c1bf35e 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=yjQZ|vT1^^i61JM8g delta 14 VcmZo-Y+__H=H=!3A2N}x1^^i51IhpZ diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 4fc7f9d8fd82c705e3268aaf1816298b6e174c5d..90731367413ee33b233924dc0eda5a7e5fc50fc0 100644 GIT binary patch delta 189 zcmbOx`Cn4mn3tDpVe{lvSz!i-#|%h-8_0G5;^MfC%3+MW_EB0X4pG`EOu-DAj+^Tk zSvkyKvIC{7^ir}C^V0M6lJkpF^>Pz4bM%rDle1IvQi_2>dByoTsd}y;VJC>Frq1S8 zPHQH^C~-$;Xa7*Yka$Pu5YI5j5Kn)ypTwBCa*sSc@Ax`ZQSKVLddBjKUxZ0=#5-859HtPwQtaKp> zAuOk`b)l1OaHtJdxl`V`Fc3SSm%HU%g&tO;%h8 zL3tl0bb6`Nt($!AkbN-A1NIm8F>f1OFz{S-&Gn}m*{AvkZMO4U4(HuW7Y>K6E1H}m z9;dV}nwcTYMcSPRyJ)g%NdcMgJ>&)NSlShB^QnMyjO`v(X_L3>%;sqzNLtt-bt4=hF}?-(mgvMS}A9Ngl!G6&XsNkU=1%#$RZJs{q^ zYV+s}8|T85SOf#xwQV&|neeY$J7xyXmTX=}WV399!7G_;nwc13W2v3a)hH7+kl_@6 zEkqvOQtGX(t6YX}{|!&sHfOdh!N%%yeBi>(p?ixMm~fIrjyOq#C0UG^yy!rfvQ9A` zDjF9Jh0nyow4_)tSDB?ek*x4hi7!nDtignruZ}*x`Ju4`)TrgpVSLio5N9nd+W5R> zr+krS5D!iM-{fi0;)`&e)h%6C@Eku@jX%c4nL7FgUZLUW3XL4Yvt>j@aW(Mrbjt`m G3(-H4qBvLp delta 237 zcmeC=Si_=X%*)Fq89F(&nT3JjF#{4{1+pE0xOf)BL>13au2ilp?o^&;#wgxYjuh5Z zwk*CZ{$?g1n=O?wOCU=S%w`9(g_@btnWKbLS+Ycmrlkr4)o`S8rZNH5GXiB8%^9ME zQy7C8G&v`0G3v-xu_dPDX6EVNVyI%yEYPpwijPl8O)5=~kJr}}ogBdwKUtaCL-rPT zX;Dr=Vo6DAQC{&aRu@;NQ1_J#MWR3#7Ku)t#%wPq1!Qsvaxn4$p#T#H5OT4D*=%f# GOpE~23^Mru diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index e1b54917f72977780cca4adeb7ee4d8fd3196cde..be50ecc1e4a2b6e85cda52f8c1a242cb8de081d5 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tF9N!dm=OC|s#t^_au delta 15 WcmdnbvY&;`n3tF9f5=8QOC|s#rUWSf diff --git a/blango/settings.py b/blango/settings.py index e8df48d759..7fc645b58e 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -158,6 +158,9 @@ } INTERNAL_IPS = ["192.168.10.226"] AUTH_USER_MODEL = "blango_auth.User" +ACCOUNT_ACTIVATION_DAYS = 7 +EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" + # # class Prod(Dev): diff --git a/blango/urls.py b/blango/urls.py index 97a0b3b807..d5685cf817 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -21,6 +21,10 @@ from django.urls import path, include import blog.views +import blango_auth.views +from django_registration.backends.activation.views import RegistrationView +from blango_auth.forms import BlangoRegistrationForm + import logging @@ -33,7 +37,20 @@ urlpatterns = [ path('admin/', admin.site.urls), path("", blog.views.index), - path("ip/", blog.views.get_ip) + path("ip/", blog.views.get_ip), + path("accounts/", include("django.contrib.auth.urls")), + path("accounts/profile/", blango_auth.views.profile, name="profile"), + path('accounts/', include('django_registration.backends.activation.urls')), + path( + "accounts/register/", + RegistrationView.as_view(form_class=BlangoRegistrationForm), + name="django_registration_register", + ), + path("accounts/", include("django_registration.backends.activation.urls")), + + + + # path("post//", blog.views.post_detail, name="blog-post-detail") ] diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index e9d8c20c0c45fad1dc87a25352e8af936a04f433..23407c089132bcfeaddb29789d55645d1c2c2b2b 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=!3TQ-rc5dazM1Ni^| delta 14 VcmZo?Y-eOM=H=yzN}R~n2mlsn13>@) diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 059c1068c038ecab47d0b4381e352bea4ed0b65f..a68c5840572a32469cbc6fe1bba8ec4b8227f269 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tF9Z`npR0~P=ypaeJo delta 15 WcmdnSv5kYxn3tDpRp~}H0~P=wsRQHy diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 597bf0c476ebf64a95d9585066c8cdd9b7ec983b..33f83ae0754550d8870f49aa04631621527ff61d 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tF9Z`nq+*^B@or37pM delta 15 WcmZ3;ypWmAn3tC;Dsdy*Y(@YbY6G+Y diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..298be809ab1dffaaff7f8cf592337d0785939d15 GIT binary patch literal 974 zcmZ`%O^?$s5VaHMqoozAB9IUV&bhQ8t_ZCV0xtBxiim8K9zzI`d-Pi8t9gBw=`RM5qD%ech(Q6Sq<|4zJ^44r_=9TlDR87htnx|; z;rc>UwQM!|10g=Qx$aI(1kf&mL#4kHa}Rdj{C+-J)RmePwJht&Wo<6(Ixp1Z+(*4% zMBX-w$qWRtR)bHuwq^ZNeSd z62Z1)$(B(Qqm;W~=W7iKhf^0@Un8D&x7$Ws#jQJi;)f} Ie8C|619t)Jxc~qF literal 0 HcmV?d00001 diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 3f609ec06fb279ea9b41976bc6d4d108ecb847fa..5a35f7215413702ba5bb4159abf7351dcaa081b9 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tF9Z`npREp`ASiv%?Q delta 15 WcmdnMw}Fq%n3tC;vveby7CQhS4g;V7 diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d85bb1fa78333137b66e2285bb856907aab2ef1 GIT binary patch literal 390 zcmYjMy-veG48FVkp{hlUOw43Sgjf+mVqojSmZeJXOcS`|g6~2_#a7;cr{E!Yk*rL8 z1txrLgs|k#mi77b=gZk_a<}<_FUHt6u>9tlq8 zXIox`D!ONBydySC`Eabws%{qu&wY)cXc8l|3Q%&-pzzfnxuvud0>|Fy%vO+$m~T#( zx@=cwQTDFNJ2VfqhOBapPC5EDQcS!$Sog^=qRG!iUYQ1RX;f|UwZSLbl@juU&{z(7 zFEy-f*1ZnNsOA$fRi<*2~O0$rMO~r88*J(}$ChWGjPC_Rj9j b?KSqM{z2^dM^}wey@qT5z6}Ycd>Z@$9z9?A literal 0 HcmV?d00001 diff --git a/blango_auth/forms.py b/blango_auth/forms.py new file mode 100644 index 0000000000..80c9376fa5 --- /dev/null +++ b/blango_auth/forms.py @@ -0,0 +1,15 @@ +from crispy_forms.helper import FormHelper +from crispy_forms.layout import Submit +from django_registration.forms import RegistrationForm + +from blango_auth.models import User + + +class BlangoRegistrationForm(RegistrationForm): + class Meta(RegistrationForm.Meta): + model = User + + def __init__(self, *args, **kwargs): + super(BlangoRegistrationForm, self).__init__(*args, **kwargs) + self.helper = FormHelper() + self.helper.add_input(Submit("submit", "Register")) diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 8f9e234d0fd0a25c66bc0d85e6c2fa2bb8d32bdc..534fc9dad6fdb95cb5a973422969414a91e0e77d 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=!3TegvnjS~PLy#vz# delta 15 WcmeAX>Jefy=H=!3mb#IRjS~PLJ_EY| diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index b6c7eb60dcfaa7fee0b52a07f52936439ca79b66..f4ef01743f02dba65a7687807d4e3af58404ae2b 100644 GIT binary patch delta 15 WcmZ3+wv3IActivation Failed +

Sorry, we couldn't activate your account.

+

{{ activation_error.message }}

+ {% endcol %} +{% endrow %} +{% endblock %} diff --git a/blango_auth/templates/blango_auth/django_registration/activation_complete.txt b/blango_auth/templates/blango_auth/django_registration/activation_complete.txt new file mode 100644 index 0000000000..0aa403fca1 --- /dev/null +++ b/blango_auth/templates/blango_auth/django_registration/activation_complete.txt @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% load crispy_forms_tags blog_extras %} +{% block title %}Activation Complete{% endblock %} +{% block content %} +{% row "justify-content-center" %} + {% col "col-md-6" %} +

Activation Complete

+

Your account is now activated! You can now log in and use Blango.

+

Log In

+ {% endcol %} +{% endrow %} +{% endblock %} diff --git a/blango_auth/templates/blango_auth/django_registration/activation_email_subject.txt b/blango_auth/templates/blango_auth/django_registration/activation_email_subject.txt new file mode 100644 index 0000000000..28cb171627 --- /dev/null +++ b/blango_auth/templates/blango_auth/django_registration/activation_email_subject.txt @@ -0,0 +1 @@ +Activate your Blango account! You have {{ expiration_days }} days! diff --git a/blango_auth/templates/blango_auth/django_registration/registration_closed.html b/blango_auth/templates/blango_auth/django_registration/registration_closed.html new file mode 100644 index 0000000000..e52f0ee429 --- /dev/null +++ b/blango_auth/templates/blango_auth/django_registration/registration_closed.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} +{% load crispy_forms_tags blog_extras %} +{% block title %}Registration Closed{% endblock %} +{% block content %} +{% row "justify-content-center" %} + {% col "col-md-6" %} +

Registration is currently closed

+ {% endcol %} +{% endrow %} +{% endblock %} diff --git a/blango_auth/templates/blango_auth/django_registration/registration_complete.html b/blango_auth/templates/blango_auth/django_registration/registration_complete.html new file mode 100644 index 0000000000..9050bc8b19 --- /dev/null +++ b/blango_auth/templates/blango_auth/django_registration/registration_complete.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% load crispy_forms_tags blog_extras %} +{% block title %}Registration Successful{% endblock %} +{% block content %} +{% row "justify-content-center" %} + {% col "col-md-6" %} +

Your registration was successful

+

Check your email to validate your account.

+ {% endcol %} +{% endrow %} +{% endblock %} diff --git a/blango_auth/templates/blango_auth/django_registration/registration_form.html b/blango_auth/templates/blango_auth/django_registration/registration_form.html new file mode 100644 index 0000000000..962ef2c759 --- /dev/null +++ b/blango_auth/templates/blango_auth/django_registration/registration_form.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% load crispy_forms_tags blog_extras %} +{% block title %}Register for Blango{% endblock %} +{% block content %} +{% row "justify-content-center" %} + {% col "col-md-6" %} +

Register for Blango

+ {% crispy form %} + {% endcol %} +{% endrow %} +{% endblock %} diff --git a/blango_auth/templates/blango_auth/profile.html b/blango_auth/templates/blango_auth/profile.html new file mode 100644 index 0000000000..c5cf4aadb7 --- /dev/null +++ b/blango_auth/templates/blango_auth/profile.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% load blog_extras %} +{% block title %}Blango Profile{% endblock %} +{% block content %} +{% row %} + {% col %} +

Logged in as {{ request.user }}.

+

Log Out

+ {% endcol %} +{% endrow %} +{% endblock content %} diff --git a/blango_auth/templates/registration/login.html b/blango_auth/templates/registration/login.html new file mode 100644 index 0000000000..7748631e08 --- /dev/null +++ b/blango_auth/templates/registration/login.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} +{% load crispy_forms_tags blog_extras %} +{% block title %}Log In to Blango{% endblock %} +{% block content %} +{% row %} + {% col "col-md-6" %} + {% if next %} + {% if user.is_authenticated %} +

Your account doesn't have access to this page. To proceed, + please login with an account that has access.

+ {% else %} +

Please login to see this page.

+ {% endif %} + {% endif %} + {% endcol %} +{% endrow %} + +{% row %} + {% col "col-md-6" %} +
+ {% csrf_token %} + {{ form|crispy }} + + +
+ +

Lost password?

+ {% endcol %} +{% endrow %} +{% endblock %} diff --git a/blango_auth/views.py b/blango_auth/views.py index 91ea44a218..84fb12280d 100644 --- a/blango_auth/views.py +++ b/blango_auth/views.py @@ -1,3 +1,7 @@ +from django.contrib.auth.decorators import login_required from django.shortcuts import render -# Create your views here. + +@login_required +def profile(request): + return render(request, "blango_auth/profile.html") diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index db6d172d7cc2e13a57a20082dae05f1592ac4467..93698f9b5484dc1f972b4d530805582fca4ddc04 100644 GIT binary patch delta 14 VcmZo*Y+z(F=H=yjQZ|vT3IG_f1Iqva delta 14 VcmZo*Y+z(F=H=!3A2N}x3IG_e1H=FT diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index af24385e465e52c022772a2ede57abee1086eb55..ec519b5fb125d485a18c0d4df086ceb3c059754a 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tF9Z`npRH6{Qe3Iq@U delta 15 WcmZ3(vWA7tn3tEUuV^Ei8WR8?Tmzi| diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index d5800cdf5268ca9e3c27dd4ffbebd4853485d399..a50793c5bc563dc21ca7607903912aca4843fccc 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=yjQnrz;oe=;Yw*(ge delta 15 WcmeBW?qy~(=H=!3AF`3Hoe=;YuLKYP diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 7d96d9d46f109e511a2fe170c91b480fe0e7fe50..ca8c7dacd671edba1ed0310a54fb04b11c991bfe 100644 GIT binary patch delta 15 WcmZ1>v_go@n3tF9Z`npRB~Ab%1q3Gm delta 15 WcmZ1>v_go@n3tEUtY{;f5+?v3#{--I diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 5fd693bd88b69b4ee5a4a1a96fbb256336190dfe..26fc3986608d26aa6c224e933ec59a26b955c51a 100644 GIT binary patch delta 15 WcmeBS?_p;%=H=!3Tegv{jTrzRnFKcg delta 15 WcmeBS?_p;%=H=y*4Bg1q#tZ-%oC7id diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 3e758870419bb23ca55fec15d4f61d90662faaca..cd6f1846ff0b71c09a532285500a9cb785ff7edf 100644 GIT binary patch delta 15 WcmX@ld7hKan3tF9N!doWlPmxy5(Ml3 delta 15 WcmX@ld7hKan3tF9f5=9*lPmxy3Iyc< diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index f97aec694f4ce56e8b84d88d6ff26ca58bf158b2..392868b60a3b9f29c60cf4b2e0e74ef7b9bbe08f 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=yjQnrzel?4DE00W)? delta 15 WcmeC?=;mNE=H=!3AF`2+l?4DD_yd;! diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 62f5f4273bfd4faa29c586489ba5f66498a23e17..b7db4756c44e407610dc7a6d4159df6c1ed52275 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tF9N!doWLrefA)&$J} delta 15 WcmX@XdV-bBn3tF9f5=9*LrefA&IHB) diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index d3a2a514a7860fd890c9f863be7e8839080b10b1..afff552481ef52c68ac1ac54a4e8ecce340eaa5f 100644 GIT binary patch delta 15 WcmbQwGoOden3tF9Z`npRNj3l>SOfh4 delta 15 WcmbQwGoOden3tDJGIS%GBpU!5TLSn1 diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index f83e871dd8493fe63d2ef8c1036611bdaab735a0..a16a2bf97a341af38ab8476fd96a8568155eda44 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tF9Z`nq+Kqdeu6ax|WsAn3tF9Z`nq+x|WsAn3tDJGIS%`awY&BMFWrk diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index 3154b653feb9a76319178d4fcbe339fea85cffa6..e9b409f9da29ccce6f7db6067e7d9970511070f3 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=!3Tegv{l^FmZdjvE9 delta 15 WcmeBX?`CH+=H=z8DB8%@$_xM;Ndv0@ diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 0ad14a1d4d0730040e1ad6e3f8c4fe144d06b4ee..05eac17781e616e5cdc8fbb6875ed4a7bf0cd92b 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=yjQZ|vT6#yC91MC0* delta 14 VcmeBX>}F&$=H=!3A2N}x6#yC81LXh! diff --git a/blog/templates/base.html b/blog/templates/base.html index 3dc5ea91ae..f37ee2e448 100644 --- a/blog/templates/base.html +++ b/blog/templates/base.html @@ -4,10 +4,26 @@ - Hello, world! + {% block title %}Welcome to Blango{% endblock %} +
+ + {% block content %} {% endblock %} diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 6a1ca923e65594867da6bf600d4e0f84a8184261..cfd717747738e89a30527d68e32c175cd23d0870 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=!3TQ-rc9RM1Q1PcHF delta 14 VcmeBW>}6y#=H=y*44uf<4geLE0|o#9 diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index a4af299bc892db2d501cae962c8484413e6cad28..4928ac1f9c3dd2b47e7c8bd05d81628b9c965469 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tF9Z`npRBW3_2rvy0w delta 15 WcmdnNwu6n$n3tDJGIS%G5i Date: Tue, 2 Jan 2024 04:41:11 +0000 Subject: [PATCH 13/38] Finish django Allauth --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3327 -> 3627 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1033 -> 1091 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 10 ++++++++++ blango/urls.py | 4 ++++ .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blango_auth/templates/registration/login.html | 16 ++++++++-------- blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2344 -> 2344 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 685 -> 685 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 204800 -> 290816 bytes 32 files changed, 22 insertions(+), 8 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index ecc6864711c43638e8393c637db89cfe0c1bf35e..775a986a12487a500586ccd96fc315fc20722a69 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=xoXrIVd0{|B118x8S delta 14 VcmZo-Y+__H=H=yjQZ|vT1^^i61JM8g diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 90731367413ee33b233924dc0eda5a7e5fc50fc0..58e85ad515beee5cbd010ef58ee0f54fbd9bcae9 100644 GIT binary patch delta 577 zcmZutJ8#oq6t#^@AWGE?p)^g>Hcgv0eYg!Fls7f;m&Q^aB5?-pVvLVvT$va-DMN(R zjg6toT7ei5WBvf*uQ0Lj7vO6|Dh9r*b9Hp?xetB6lV8)h((G*X+u6uDN(jOa;hz`h z{E(yn?kxBD6bndV5hh#-#*Y@&cISN23~ zpUbXDN$k)fcA;?JUP{3Jx#WqILJ_yPr-;%d-=5^MC%Q7FaR&#ui+ipmQwH~G2@hx) z5nAEMa;)MZbZep2fab)y;S<%VD#$>drlF{_pOt`tKr;VqFA;aob(368&jbl z*q-H2<@|qTcnU>V9 vQDaR*uc(IJYMKpZ)LPn?YeHD&SB2$~603+GM`7$>^eOftD#v9>7BAuts?nsU delta 285 zcmYk1%}T>i6ol^$SBoiG3EDJC|C0Wsjkelo{kIbE1q2rdapROrT-FD0;jZ99vhAke zMqK6v-1`_lh#s=?z&Ffdn8SR!zqUWNEOYge&Ad$^e#E~kv!60g_iz5{S(j-G71*f4 zfeTNs(>7{UL49VT;Rr2JLK7|c2+-ClmFO&$mSm$#RrC;YuI~s8mPRVcL4+O7MA$8K zSm-E~T9J!A>|>0Wy@vy;;gFI#O4MMQObZk8aYO-*sm*k_{sgBuE2_IV=eIpvP>4(F xV@d-UHzK^s-{qr`1uDtE)a#lNM){rjU~GJddCW8CadvGba*-{pN%n2s{s95-Mx6iv diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index bd7cf2b706362c798efdbbb933141e015e2a6dc4..d2a9a6788e4f3246ede7b431245c8eb16ffadc4d 100644 GIT binary patch delta 163 zcmeC=ILx7J%*)H=K4Efd4m$(GV+JI^2V^?{ak0ik<%d4094TC>oGHT1jLl5A*y-F+ z(y1(2G7}h!R8pmZszg#bQ<<_vL3+{|%^9MkQy7C8G(|USF)A|h@+9WuB$k$B=#>`b b6mRxo>Skm#n|zH~mxqTD1O>P`7?~IW?B^nv delta 105 zcmX@i(aE7~%*)Hw)jB!#E*k^GV+JI^4P-k2aWT_G<%eqN98uD#ELk!||5Bw>IZ}jE xIa8UkM4K6#nbH}}8KR_97=sx!MK%X8Dl%@aXX;{PG?>iAqRS@0#m30Q2mqH)6*>R_ diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index be50ecc1e4a2b6e85cda52f8c1a242cb8de081d5..020bd4c997e817bd7e93a654e1b684e9c0bf49de 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tEUpnW5oB@+N4O9RaS delta 15 WcmdnbvY&;`n3tF9N!dm=OC|s#t^_au diff --git a/blango/settings.py b/blango/settings.py index 7fc645b58e..43c73a959a 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -48,11 +48,16 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.sites', 'blog', 'crispy_forms', 'crispy_bootstrap5', 'debug_toolbar', 'blango_auth', + 'allauth', + 'allauth.account', + 'allauth.socialaccount', + 'allauth.socialaccount.providers.google', ] MIDDLEWARE = [ @@ -175,4 +180,9 @@ # ), # } +SITE_ID = 1 +ACCOUNT_USER_MODEL_USERNAME_FIELD = None +ACCOUNT_EMAIL_REQUIRED = True +ACCOUNT_USERNAME_REQUIRED = False +ACCOUNT_AUTHENTICATION_METHOD = "email" diff --git a/blango/urls.py b/blango/urls.py index d5685cf817..bd0702918c 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -47,6 +47,10 @@ name="django_registration_register", ), path("accounts/", include("django_registration.backends.activation.urls")), + path("accounts/", include("allauth.urls")), + path("accounts/", include("allauth.urls")), + path("accounts/", include("allauth.urls")), + diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 23407c089132bcfeaddb29789d55645d1c2c2b2b..8c534b4fe7db5e4d91d92eb5876ff9ef7d456a02 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=zmoiLHD5daoL1494+ delta 14 VcmZo?Y-eOM=H=!3TQ-rc5dazM1Ni^| diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index a68c5840572a32469cbc6fe1bba8ec4b8227f269..c61e1178409ad7328de305dd77c4ac3c9dd8e1e0 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tDJcfv+C0~P=uLIZ*T delta 15 WcmdnSv5kYxn3tF9Z`npR0~P=ypaeJo diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 33f83ae0754550d8870f49aa04631621527ff61d..299cbde08420b9d8b32f45915a5dd157a52f463a 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tDJcfv-t*^B@kM+3G1 delta 15 WcmZ3;ypWmAn3tF9Z`nq+*^B@or37pM diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 298be809ab1dffaaff7f8cf592337d0785939d15..6be350d8912809c5af9453ad4fbf35f4f9e7bce8 100644 GIT binary patch delta 15 WcmX@devX~Zn3tDJcfv-t6U+c2_XI}( delta 15 WcmX@devX~Zn3tC;vvnie31$E!C29RpD diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 534fc9dad6fdb95cb5a973422969414a91e0e77d..a37f3097aaec5caca46fd7735166ed174267dae9 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=zmov@LOjS~PHUjrQg delta 15 WcmeAX>Jefy=H=!3TegvnjS~PLy#vz# diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index f4ef01743f02dba65a7687807d4e3af58404ae2b..393cc618afce1aaa932e6642d059235fd64cef1d 100644 GIT binary patch delta 15 WcmZ3+wv3IYour account doesn't have access to this page. To proceed, @@ -12,11 +11,9 @@

Please login to see this page.

{% endif %} {% endif %} - {% endcol %} -{% endrow %} -{% row %} - {% col "col-md-6" %} + +
{% csrf_token %} {{ form|crispy }} @@ -25,6 +22,9 @@

Lost password?

- {% endcol %} -{% endrow %} +

+ Log in with Google +

+ + {% endblock %} diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 93698f9b5484dc1f972b4d530805582fca4ddc04..0ec5059587e670317d0867d08b8a04b7eb21bad8 100644 GIT binary patch delta 14 VcmZo*Y+z(F=H=xoXrIVd1ppSY184vM delta 14 VcmZo*Y+z(F=H=yjQZ|vT3IG_f1Iqva diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index ec519b5fb125d485a18c0d4df086ceb3c059754a..6f9e377ec4bc8023b4ff1e8fadcbc08510c8817a 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tDJcfv+CH6{QZtOHsA delta 15 WcmZ3(vWA7tn3tF9Z`npRH6{Qe3Iq@U diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index a50793c5bc563dc21ca7607903912aca4843fccc..415f1a57c4bdd79655828bf19baa52536c42cb3a 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=xoXy3@z&IkY;R0FgC delta 15 WcmeBW?qy~(=H=yjQnrz;oe=;Yw*(ge diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index ca8c7dacd671edba1ed0310a54fb04b11c991bfe..2aab9c55906fb1de1d8e867197ec6dd531892ecb 100644 GIT binary patch delta 15 WcmZ1>v_go@n3tDJcfv+CB~Abyrvq^S delta 15 WcmZ1>v_go@n3tF9Z`npRB~Ab%1q3Gm diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 26fc3986608d26aa6c224e933ec59a26b955c51a..f3d409cb3bd05390a60629f5c7c2628114c4176d 100644 GIT binary patch delta 15 WcmeBS?_p;%=H=zmov@LujTrzNI|G3L delta 15 WcmeBS?_p;%=H=!3Tegv{jTrzRnFKcg diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index cd6f1846ff0b71c09a532285500a9cb785ff7edf..a2f2d183625f48c468fc4c1a016ce9aa4860b4cb 100644 GIT binary patch delta 15 WcmX@ld7hKan3tEUpnW6TNfrPkuLOwz delta 15 WcmX@ld7hKan3tF9N!doWlPmxy5(Ml3 diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 392868b60a3b9f29c60cf4b2e0e74ef7b9bbe08f..6beec46d9c73bc91868a5c1b76d82d36c8cbb084 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=xoXy3@j$^rlzodY`n delta 15 WcmeC?=;mNE=H=yjQnrzel?4DE00W)? diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index b7db4756c44e407610dc7a6d4159df6c1ed52275..6cfeb8ab2b6072f07ff965a2bba91f422a16e73a 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tEUpnW6TAtnGLa|CJt delta 15 WcmX@XdV-bBn3tF9N!doWLrefA)&$J} diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index afff552481ef52c68ac1ac54a4e8ecce340eaa5f..1c2d146528f90224be529d55f114092405dfc01c 100644 GIT binary patch delta 15 WcmbQwGoOden3tDJcfv+CNj3l+`U6J* delta 15 WcmbQwGoOden3tF9Z`npRNj3l>SOfh4 diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index a16a2bf97a341af38ab8476fd96a8568155eda44..3c48a9fe99a370335099f82971aecdd8a4448c5b 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tDJcfv-tKqdepwgcM$ delta 15 Wcmcc4a-D_En3tF9Z`nq+Kqdeu6ax|WsAn3tDJcfv-tx|WsAn3tF9Z`nq+}F&$=H=xoXrIW|3IG?{1Bn0t delta 14 VcmeBX>}F&$=H=yjQZ|vT6#yC91MC0* diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index cfd717747738e89a30527d68e32c175cd23d0870..a32a6c59e0aed10853f06948c9e3607f24adc092 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=zmoiLHD9RL>P162S3 delta 14 VcmeBW>}6y#=H=!3TQ-rc9RM1Q1PcHF diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 4928ac1f9c3dd2b47e7c8bd05d81628b9c965469..4e96af673331cf89c44169a944b6bd6f66150d3f 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tDJcfv+CBW3^}Ndtob delta 15 WcmdnNwu6n$n3tF9Z`npRBW3_2rvy0w diff --git a/db.sqlite3 b/db.sqlite3 index e1f5f964e499907f05b159be6391a1ae4a610702..460af7ff434f60fd389edd6036f70dbbc2384c95 100644 GIT binary patch delta 8697 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 JrqC|@{{glPBbNXG delta 893 zcmY*XZDWS)rRKokyD6SXxYR zx1)5~`%x(smihmPC`yXfZdjdJ-`29GEz{nbX>V!o+|+8Cl4qit;Sqks2tGhHHsVY4 z;3)RXE_2{kR}B@INHhG7Yq*T>Cx9Os=n$|9Sx&QKJ{Oi z#665-R2sbmF?x(jBs9+O41ePfd9A-;TtYu1s479ya>adku)xvm6vKJ!LLCD30Xrpc zrO5VE!!&%NJn)#=$}FY}J>Q-i>b72JU4dun^MJ3eS7xcjc`bP}Dfbs&2USXcd87s& z(;Yb*Bfq(a6KOS@wMbLBIJScqh Date: Tue, 2 Jan 2024 09:53:16 +0000 Subject: [PATCH 14/38] Finish First-Party Django REST API --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3627 -> 3627 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1091 -> 1129 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/urls.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/api_urls.cpython-36.pyc | Bin 0 -> 348 bytes blog/__pycache__/api_views.cpython-36.pyc | Bin 0 -> 1803 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2344 -> 2361 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api_urls.py | 8 +++ blog/api_views.py | 59 ++++++++++++++++++ blog/migrations/0005_alter_post_slug.py | 18 ++++++ blog/migrations/0006_auto_20240101_1321.py | 3 +- blog/migrations/0007_authorprofile.py | 3 +- blog/migrations/0008_merge_20240102_0948.py | 16 +++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 0 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 685 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 0 -> 556 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 2 +- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 290816 -> 294912 bytes 41 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 blog/__pycache__/api_urls.cpython-36.pyc create mode 100644 blog/__pycache__/api_views.cpython-36.pyc create mode 100644 blog/api_urls.py create mode 100644 blog/api_views.py create mode 100644 blog/migrations/0005_alter_post_slug.py create mode 100644 blog/migrations/0008_merge_20240102_0948.py create mode 100644 blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 775a986a12487a500586ccd96fc315fc20722a69..531aa85c48e91c6b0c87774734395ca3521f0bf7 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=zG+B=c01^^bZ18x8S delta 14 VcmZo-Y+__H=H=xoXrIVd0{|B118x8S diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 58e85ad515beee5cbd010ef58ee0f54fbd9bcae9..4e024cc3892a27fe5a809f9f4a7e3edc99386738 100644 GIT binary patch delta 15 WcmZ22vs#ADn3tF9!Oe|qs(b(?sRWMz delta 15 WcmZ22vs#ADn3tF9z{HJgs(b(=fdnT2 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index d2a9a6788e4f3246ede7b431245c8eb16ffadc4d..bdac286bc0a0a02a6a37b61f302e0db2776a6407 100644 GIT binary patch delta 142 zcmX@i@sdN?n3tF9;+@HJ}&Dzh@0q;jN)q;jT+HZwLerSn8d zr?OR0h5<>aU9 c0eSJ8tC;#387(Gru^4mkFbeQ+FfuU$0GKr%n*aa+ delta 108 zcmaFKahOBdn3tE!eZu6_9CikV#|%h-56E@^;$n@B%B+kU>D*D$sVrGC6BvtBQl(Ql zQbbZYQ<<_vn;Dy#(izPeqNGz8gBdhMH^(sQGj3kY)WyhXHd&9wm`#A2gOQ050CDsb Aj{pDw diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 020bd4c997e817bd7e93a654e1b684e9c0bf49de..b429ec5e200bd432b20b59516b6b787294f9877f 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tE!YVSriOC|sz6$8xx delta 15 WcmdnbvY&;`n3tEUpnW5oB@+N4O9RaS diff --git a/blango/urls.py b/blango/urls.py index bd0702918c..16abc52b14 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -50,6 +50,8 @@ path("accounts/", include("allauth.urls")), path("accounts/", include("allauth.urls")), path("accounts/", include("allauth.urls")), + path("api/v1/", include("blog.api_urls")), + diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 8c534b4fe7db5e4d91d92eb5876ff9ef7d456a02..251120b6a8a019c3b139fe3b28bc40b25fbc375d 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=yjaC0JCBLEua1U~=( delta 14 VcmZo?Y-eOM=H=zmoiLHD5daoL1494+ diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index c61e1178409ad7328de305dd77c4ac3c9dd8e1e0..20dcb10f9a427ed95d74d50a630e9eb045d4ec96 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tF9!Oe|q1}p$1;RJpF delta 15 WcmdnSv5kYxn3tDJcfv+C0~P=uLIZ*T diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 299cbde08420b9d8b32f45915a5dd157a52f463a..e8d5f651176c5c0524c02d09927aded3ad06102f 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tF9!Oe|qvl#&*<^-|; delta 15 WcmZ3;ypWmAn3tDJcfv-t*^B@kM+3G1 diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 6be350d8912809c5af9453ad4fbf35f4f9e7bce8..76fa7cdee4f7b0ffa756e572006b8c273d1de3bc 100644 GIT binary patch delta 15 WcmX@devX~Zn3tF9!Oe|qCzt^!mIXrq delta 15 WcmX@devX~Zn3tDJcfv-t6U+c2_XI}( diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 3e19b31c6b7da2c88272db61764cc4a7451af4fe..1283956b7ce1c09aa2a8e2b4634feb426e2f6316 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tF9!Oe|qTI>KM%mjM? delta 15 WcmdnMw}Fq%n3tDJcfv+CEp`AOEdzf5 diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 3f861ee5675796f088c973f36e330cdd94435c27..16e6a4b7333429f4d9e29d44a314f75cefb5e64d 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=yjaC0MD10w(*yaZtY delta 15 WcmZo;ZewOM=H=zmov@Lufe`>29RpJefy=H=yjaC0LY8z%rD{sb8S delta 15 WcmeAX>Jefy=H=zmov@LOjS~PHUjrQg diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 393cc618afce1aaa932e6642d059235fd64cef1d..a342fcadb13269794541e659b945355f9a8e6660 100644 GIT binary patch delta 15 WcmZ3+wv3I!OQ>C?)n%Z$>r&RO~tT+W%ve>cW3al8n zQbwBR=b1NeEI*Xx_1*WUiU^?}$SE>lPmrMjkVs;KEEX6iP7JYBP|F0vNMT78l}ye) zDDX@%d6jra#7yQdsG9$R1FCRjLp$y&66b>pft@+jdk*1)C$9JNFTQ# Iw{(I30WyJNApigX literal 0 HcmV?d00001 diff --git a/blog/__pycache__/api_views.cpython-36.pyc b/blog/__pycache__/api_views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..177236262989b4055e442abc83b0629cfb006959 GIT binary patch literal 1803 zcmZ8h-ESi`5VyS_*=#oH2c;kc=yVdG@R6RxNxW1QM;mcMr?k2TA+0z?+qIi+x|>aH zr@f-hQ~F4e5O0WofPcy2jVHu^a8Jy5+g`a{&3Nqb*z@u8eA#Y?n}7W#{`Cp@o80>x zkiP~}6);XX%}IK>FzrxZPa562K_7f5{ytRfR63dDdMAQ#93@_`ya0jGa7Aq+O?HVvDd znr1TBCvbJfO_)lNXu(H`Hm#!M*>P4+qS^c?&(ujh^K_lI?u#~>dh`qgvKLXj(C=8yiVb%gt_$pzubh?yUckoX#m;GA*3KP z0IE|adzwzz#95LB<%~O5q@sHOgay+scPp0BC4j*0_F(r+dv#`Ehhr^+V^TT4(1oj; zI-In)uOr^5+)4YG^57cmdGneb65ZjHdt-*Db;E&izU>e1ykp>y3v>viFe_uY@kO+t z8oXK3U)h;^Sf{H?ZCqVuSnrXcGn>Pjy$yD+!fhya_9GGV9Cxjv2LQ_oQ>$KdcG2r(=p%5B`g*2oc8Uc@B zWPqP{9r*=lQuGBsXi5a{x2X9Y1Wh!pD5uwKf$xoR2AFuL9SulX-XaB11gq2gNO}37 zawfr&?2#86KeC0p@N~0cm0NjBhmx~zejpW_giCnfx}~E@o4eOF>KI4V{S4a9n_9hs zcm+&37E?ZSs5)csfTPAa_mI~DgWU>CL|6p%scW-NS7~5n;7oo6+U~mb*tjRqb!+If_yjvf&#u_Oth?xy zS-sII=zBVyYh@E*ZcXMgR~B*R{hN(-x8Wi!Wui-|df1g^0B6N5Y)L(6mI90r>~#VW lH`cX#;aL#kvoygr7|e6AgB{#9EDU7>f`Xq#PSAv{Q)Fn3tF9&&|oHlQwd?voNlj9LN&I%ACU8%QSf%i?}6!FJqKYDsz@_sz{1J zieN8OlxV70s(3SFlmt+eGldxpg?gEzcv6H@L|Pc4BvV9#88pQv|6>VJWhxS5U|_h# zR+^VtSelyog%QYMFD}i^O)RP`5(P?WG8TzV&S3q?s5Lo>Et`>V@;SB|M(xSo>}MHG YCQEXtGa5~Hy!#gihGBHY3dC7B`;%%CYci8Vxwu}F-8fg$q?BLl-N z_Ttjq+{B{FBGJi}tUnnwCl|A2GxAKn&sM{zH93a;ETi#cEe>^YL!bt2ATH(r5*&;y Wi~>v?Ohty1GdQL(8czPtVFduX1}jnk diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index f3d409cb3bd05390a60629f5c7c2628114c4176d..a66f88fcbeb92b3e014078b3790730457739f5ba 100644 GIT binary patch delta 21 dcmeBS?_p;%=H=yjaC0Nu3?{}~ljk$N1pq~}2Z{gy delta 21 ccmeBS?_p;%=H=zmov@K@1`}h{/", post_detail, name="api_post_detail"), +] diff --git a/blog/api_views.py b/blog/api_views.py new file mode 100644 index 0000000000..fc1d0615da --- /dev/null +++ b/blog/api_views.py @@ -0,0 +1,59 @@ +import json +from http import HTTPStatus + +from django.http import JsonResponse, HttpResponse, HttpResponseNotAllowed +from django.shortcuts import get_object_or_404 +from django.urls import reverse +from django.views.decorators.csrf import csrf_exempt + +from blog.models import Post + + +def post_to_dict(post): + return { + "pk": post.pk, + "author_id": post.author_id, + "created_at": post.created_at, + "modified_at": post.modified_at, + "published_at": post.published_at, + "title": post.title, + "slug": post.slug, + "summary": post.summary, + "content": post.content, + } + + +@csrf_exempt +def post_list(request): + if request.method == "GET": + posts = Post.objects.all() + posts_as_dict = [post_to_dict(p) for p in posts] + return JsonResponse({"data": posts_as_dict}) + elif request.method == "POST": + post_data = json.loads(request.body) + post = Post.objects.create(**post_data) + return HttpResponse( + status=HTTPStatus.CREATED, + headers={"Location": reverse("api_post_detail", args=(post.pk,))}, + ) + + return HttpResponseNotAllowed(["GET", "POST"]) + + +@csrf_exempt +def post_detail(request, pk): + post = get_object_or_404(Post, pk=pk) + + if request.method == "GET": + return JsonResponse(post_to_dict(post)) + elif request.method == "PUT": + post_data = json.loads(request.body) + for field, value in post_data.items(): + setattr(post, field, value) + post.save() + return HttpResponse(status=HTTPStatus.NO_CONTENT) + elif request.method == "DELETE": + post.delete() + return HttpResponse(status=HTTPStatus.NO_CONTENT) + + return HttpResponseNotAllowed(["GET", "PUT", "DELETE"]) diff --git a/blog/migrations/0005_alter_post_slug.py b/blog/migrations/0005_alter_post_slug.py new file mode 100644 index 0000000000..90dae7a311 --- /dev/null +++ b/blog/migrations/0005_alter_post_slug.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2024-01-02 09:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_auto_20231226_1443'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='slug', + field=models.SlugField(unique=True), + ), + ] diff --git a/blog/migrations/0006_auto_20240101_1321.py b/blog/migrations/0006_auto_20240101_1321.py index a48aeb8103..7376c8344f 100644 --- a/blog/migrations/0006_auto_20240101_1321.py +++ b/blog/migrations/0006_auto_20240101_1321.py @@ -6,7 +6,8 @@ class Migration(migrations.Migration): dependencies = [ - ('blog', '0005_alter_post_published_at'), + ('blog', '0004_auto_20231226_1443'), + # ('blog', '0005_alter_post_published_at'), ] operations = [ diff --git a/blog/migrations/0007_authorprofile.py b/blog/migrations/0007_authorprofile.py index d99711206c..61699c74d1 100644 --- a/blog/migrations/0007_authorprofile.py +++ b/blog/migrations/0007_authorprofile.py @@ -9,7 +9,8 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('blog', '0006_auto_20240101_1321'), +# ('blog', '0006_auto_20240101_1321'), + ('blog', '0004_auto_20231226_1443'), ] operations = [ diff --git a/blog/migrations/0008_merge_20240102_0948.py b/blog/migrations/0008_merge_20240102_0948.py new file mode 100644 index 0000000000..f094093e47 --- /dev/null +++ b/blog/migrations/0008_merge_20240102_0948.py @@ -0,0 +1,16 @@ +# Generated by Django 3.2.6 on 2024-01-02 09:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0005_alter_post_published_at'), + ('blog', '0005_alter_post_slug'), + ('blog', '0006_auto_20240101_1321'), + ('blog', '0007_authorprofile'), + ] + + operations = [ + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index a2f2d183625f48c468fc4c1a016ce9aa4860b4cb..adac93238095a76b93227cdeccb6cac763ba975c 100644 GIT binary patch delta 15 WcmX@ld7hKan3tE!YVSt2lPmxvc?5|7 delta 15 WcmX@ld7hKan3tEUpnW6TNfrPkuLOwz diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 6beec46d9c73bc91868a5c1b76d82d36c8cbb084..3079293d7d3af612c1ae756af5397f58983f2ba0 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=zG+PjgBl?4DBX9GI` delta 15 WcmeC?=;mNE=H=xoXy3@j$^rlzodY`n diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 6cfeb8ab2b6072f07ff965a2bba91f422a16e73a..e20052b2fb7b7d96f3ec467b760674cb3524aada 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tE!YVSt2Lref8Jp^h1 delta 15 WcmX@XdV-bBn3tEUpnW6TAtnGLa|CJt diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 1c2d146528f90224be529d55f114092405dfc01c..630b97fd427e8a9289211ceb1cc0048c5947a9fc 100644 GIT binary patch delta 15 WcmbQwGoOden3tF9!Oe|ql57AXnFK=s delta 15 WcmbQwGoOden3tDJcfv+CNj3l+`U6J* diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 3c48a9fe99a370335099f82971aecdd8a4448c5b..651ce25e6cf8fb7b2e28a6f648b01901d52d75e6 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tF9!Oe|qflL4>RRq@n delta 15 Wcmcc4a-D_En3tDJcfv-tKqdepwgcM$ diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f87667c9ea44dba5232ff03e60b5b5b3a0532db GIT binary patch literal 560 zcmYjO!A{&T5Vd0`BvFxiDB=$)MM7lRT{u-0NEJPm3!HMXvOCi>TPF_oMu>BJ<o9#S3{D0O3S?`00vyMj#s>ks))1C z3?dLe83^PX@k3Msk(=c z3oi%bwq80tHdh7r$=J8oBNl?_1xl)~JM?nG_-l(AE{e#;#K;DIMdnjAy-~{NN>R+H zk?c20U5~X6ap43wU=P@@TXZ&}K%bxKE!y*t(TZ@9T@r=q>~k~VQ)m7#`z{mNJA~E5bYeF-Uzj{vdlc`}509EZ1`#eudn+CQ)gh8t literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index ea31449e6d9e14915515a2c6ceb6ce3f57f0681a..70f4972f7678ec8c287a3341532f56079408ca3a 100644 GIT binary patch delta 52 zcmZ3>x`LI{n3tDp=k3X=u-6J`Ja diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index 3b9b32d047d12faa75ae9a25878dbcb6b9f0931a..f78f0ea0a0699cf16b45784248d4220eaadc5450 100644 GIT binary patch delta 50 zcmeBX?`G#T=H=zOczbfH^F~fdMiGO@D##4-pjFTCe Fy8t_~3}^rV diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc70adf2f440d84dd2b265f98bcf691e8919781d GIT binary patch literal 556 zcmZ8dv2NQi5G6&~kyWPwiU3(Mb@LL*cG4z5QFu$1Wa*~mAo*BXE+s0Ygd%hD2ljqN{Y(KFa>Z(%an3Fo1}GjF z3dz^Oy~qL#f3V5miR##dyST1OlXsPF?9!*UHXyJdx5pGD%Q!N6x`z>tFfPMPlq?Hz zNKzl%=z6Q+!b0iN9j9q}2D$2_fmYiN+P+YgT}gzzbBF)4R`sPjqU;yQ`%c3wot>uB zbPCh?Z0bG{@zoP6ZCay$R!ZJX0^=t(zRN8h?%=&09Cj~JO;S! zbM?lIQMR%{*(@t*U94OAwwgc8d?cAoc)m(jx|YdOW2KYd+WfL@zLZI!@}|^u=`wj= zYC_$gLoH1yw{y)Py*NETY4406P2aYSDMTXR{tU$?e=`wogln&Pf`tkE_rCtUkyms; RITw9}F&$=H=zG+B=c06#y5c1Bn0t delta 14 VcmeBX>}F&$=H=xoXrIW|3IG?{1Bn0t diff --git a/blog/models.py b/blog/models.py index e6e4de47b6..905889e9ed 100644 --- a/blog/models.py +++ b/blog/models.py @@ -27,7 +27,7 @@ class Post(models.Model): modified_at = models.DateTimeField(auto_now=True) published_at = models.DateTimeField(blank=True, null=True) title = models.TextField(max_length=100, default="title") - slug = models.SlugField(default = "test") + slug = models.SlugField(default = "test", unique=True) summary = models.TextField(max_length=500, default="summary") content = models.TextField(default="content") tags = models.ManyToManyField(Tag, related_name="posts") diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index a32a6c59e0aed10853f06948c9e3607f24adc092..47d5f8e5c098ab1e6cd9702c80ba6cd628338b92 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=yjaC0JCI{+Jq1W^D0 delta 14 VcmeBW>}6y#=H=zmoiLHD9RL>P162S3 diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 4e96af673331cf89c44169a944b6bd6f66150d3f..3392852ce0b98b9553fe1e0197a013f5e2638981 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tF9!Oe|qM$7;t=mdWN delta 15 WcmdnNwu6n$n3tDJcfv+CBW3^}Ndtob diff --git a/db.sqlite3 b/db.sqlite3 index 460af7ff434f60fd389edd6036f70dbbc2384c95..c649732733dc6ba645fd59f2739be810d67f3e56 100644 GIT binary patch delta 673 zcmZvZUr19?9LLX}d++AId+u6e)q)NGY|hf%d)?J-Vk)8NL*dd5pBx*+WD=^b$Uly$M!F!tkMU_`vU+FW-mX_gna4D-=!? zUA7SbKtHF6gE)Ij=Ud^(#^@TsUTJOFq6`Sqj$U?`$%Et(Nhjkfj%ZZ?k0Mq(_TOHL&wC$hOj zHa(sCpHVe*BOJU~F9KgjPj;eI=lpIxohLD}Li|LL_sF)qDSwbxzYzui^X(51%g5o|%O^!FF=-V2B24fg)Xk(K+9%A`E$ow}L212!l#@Kh z!vi^u93Q8)WGn2F)#u6!C@2qwEyRQ^d_Wqwq<}>rKdvH`p^8aqQ+y}d@#pII)(6#g z?1x3`6=9siB zZg_u&{uqW%*hiNZx%F%e{-oF9&_(@m*h)zpp0Rpjmj|M;UO!teW4~z8OrPZJb<<~a z=#=BI@xN7R|HgiH^&@_StISTb-r`JkL3505l(C0h_=I0&Hx=}h2(2!sgRZ(!NB!}7 j^@tXX7@_QRCNnlQle?KqCv(Ycu7<$^78NE<@4`8h%1rLocVkp(zNEkXl0Kup zf;P}dL54RBOvm_M@d@*4aVv9Ga6aWs^HNePl5+CX;|ubO zOX7=jO4H+$EKNeA0%s^qpV$L*;<1a&pQp25W|o?MGLN4{R9f74`l5IiYvq#E;*#Rh+}y;X%96~IoKzzNBNJT%LtO(S1p^~1 zLlY}gi){)_Y!1uW6j%hdvlX!X;$POlB(N-jNnq0l7KL_}15Ddl4lw`aS7blWz{9kR zfo~Gm6E0p(S2knT0G0{N(L7f;qIrawmNE8iP87&tWMMzgcoxVKVcf2HnOT#Sh5H3V z4=}Vlwzu72?qy~H#*sFVtIpkM+o-}Wo^H?Bm^gjn4Q7Syc6XQ$6;BM{=5z(Bu?J$? N&4LYY_?IvW002RQu~h&7 From 9309799ca5f90e63952df26e478d210e7be0015a Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Wed, 3 Jan 2024 14:53:34 +0000 Subject: [PATCH 15/38] Finish Serializers --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3627 -> 3627 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1129 -> 1129 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/api_urls.cpython-36.pyc | Bin 348 -> 348 bytes blog/__pycache__/api_views.cpython-36.pyc | Bin 1803 -> 1604 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2361 -> 2361 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__init__.py | 0 blog/api/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 132 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 0 -> 627 bytes blog/api/serializers.py | 9 ++++++ blog/api_views.py | 28 ++++++++---------- .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 294912 -> 294912 bytes 38 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 blog/api/__init__.py create mode 100644 blog/api/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/api/__pycache__/serializers.cpython-36.pyc create mode 100644 blog/api/serializers.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 531aa85c48e91c6b0c87774734395ca3521f0bf7..8db8eb9adff59a79a47c8ef1dd0874175952848c 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=y56Pq%Ty&3=)tpi8^ delta 15 WcmZo-Y+__L=H=zG+B?(W!CqM*J delta 16 XcmZ22vs#ATn3tF9!Oh7V*;V)eEII`v diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index bdac286bc0a0a02a6a37b61f302e0db2776a6407..5862f9db846f0ddc46254860ebf951f30543d36a 100644 GIT binary patch delta 16 XcmaFK@sfkxn3tF9tkjf^>`5#DEXD-d delta 16 XcmaFK@sfkxn3tF9;+@GG*^^iRF=+*# diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index b429ec5e200bd432b20b59516b6b787294f9877f..9e2248a0c65990d0e880cbceea7430e2367bdb90 100644 GIT binary patch delta 16 XcmdnbvY&D|Wb_*r|B5MPu delta 16 XcmdnbvY&=sM_Cfo#J diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 251120b6a8a019c3b139fe3b28bc40b25fbc375d..fb288dea9ab7fbbf760de4121c391ea5a438af82 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=x&D>Y>zdjkL*JOly& delta 15 WcmZo?Y-eOQ=H=yjaC7oR_67hTWdzdz diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 20dcb10f9a427ed95d74d50a630e9eb045d4ec96..f002958fdf88cd8751d263dd5feccdb20d10ee06 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tF9tkjf^?D{MKCT0Xd delta 16 XcmdnSv5kY>n3tF9!Oh7V+4WffD_{i@ diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index e8d5f651176c5c0524c02d09927aded3ad06102f..3a86b71584e45c1379487ffe5447d475bbdda69b 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tF9tkjf^?6VjFBsTY>!dp#onAlC#W delta 16 XcmZo;ZewOQ=H=yjaC7oT_IgGDCD8=+ diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 9c69c5063242405c656a90c58fc525e672a9b619..fb4b9f80cc5a3d322940392776213647af0ea853 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=x&D>Y>!J1ZvuB0~e* delta 16 XcmeAX>Jef$=H=yjaC7oTc2-URCp`qM diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index a342fcadb13269794541e659b945355f9a8e6660..335c0ff19d94b10e9b68695ab53bf4c37e9172a5 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tF9tkjf^?DEV2BrOCC delta 16 XcmZ3+wv3J4n3tF9!Oh7V+2xr5DJKNo diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 1fbd9c264dd7b012e1c90f458b054e647468afca..4c96ee2d8fc93d354c0021955ca93c2c3fdedf73 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tF9tkjf=?A-tzdjul@ delta 15 WcmbQlIEj(nn3tF9!Oh7N*}DNDqy+Q; diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 5b1113e988bf5173e81e1ff8ec06201e0d0866dc..96421acdc27eb41f5d22cbc9372b46575795623a 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=y56Pq%Ty%GQya|1#E delta 15 WcmZo*Y+z(J=H=zG+B delta 16 XcmZ3(vWA7-n3tF9!Oh7V*;SbUDXs+S diff --git a/blog/__pycache__/api_urls.cpython-36.pyc b/blog/__pycache__/api_urls.cpython-36.pyc index 654e1ab7c9debd022963466d388b082944cf1e64..b06a9e98cd27e3171a3e6dc47813e6a8d236f4be 100644 GIT binary patch delta 16 Xcmcb^bcc!En3tF9tkjf^?4gVRDtiQ^ delta 16 Xcmcb^bcc!En3tDJ?at(l?4gVRDscq9 diff --git a/blog/__pycache__/api_views.cpython-36.pyc b/blog/__pycache__/api_views.cpython-36.pyc index 177236262989b4055e442abc83b0629cfb006959..8e3f7f3f911d944c5641104b4cf8470f04b5c28e 100644 GIT binary patch delta 921 zcmZ9KUuzUG5Ww?icW-ZRZ~O0BE45H+h%;$zi&D$BKO%iUGE zY4YwyS}T9@seKhe*yY$No~(^UY?$lz4ge6=)7g$xKGyJTMaivgsg3n9Roh6PaZ(Me zGkT`Rz&fqi$+ejPR}X?BETRz|1Bqx%!%42L!{jQ%5DbKe;^2KOkG=8z8N-d&gR>U? zDI+F0Flynf36S3&@A0A{d?W^xcoFsqC8lbkqK4!gStdeQwF?a6|D&cZpr#1dxFcF! z1Z*|vLX8vhoLIi}>>o({Ux5e!4YbM3wzk2;=Huo{GffoUx~ig@M1}A19Iu)}_bRGu zpvq%^rtPU|^xamD-z>WSL9Crzi!@o@Ng=MGDZm&5$izVejDRw7THS(J+OS@syBpaH zr@f-hQ~F4e5O0WofPcy2jVHu^a8Jy5+g`a{&3Nqb*z@u8eA#Y?n}7W#{`Cp@o80>x zkiP~}6);XX%}IK>FzrxZPa562K_7f5{ytRfR63dDdMAQ#93@_`ya0jGa7Aq+O?HVvDd znr1TBCvbJfO_)lNXu(H`Hm#!M*>P4+qS^c?&(ujh^K_lI?u#~>dh`qgvKLXj(C=8yiVb%gt_$pzubh?yUckoX#m;GA*3KP z0IE|adzwzz#95LB<%~O5q@sHOgay+scPp0BC4j*0_F(r+dv#`Ehhr^+V^TT4(1oj; zI-In)uOr^5+)4YG^57cmdGneb65ZjHdt-*Db;E&izU>e1ykp>y3v>viFe_uY@kO+t z8oXK3U)h;^Sf{H?ZCqVuSnrXcGn>Pjy$yD+!fhya_9GGV9Cxjv2LQ_oQ>$KdcG2r(=p%5B`g*2oc8Uc@B zWPqP{9r*=lQuGBsXi5a{x2X9Y1Wh!pD5uwKf$xoR2AFuL9SulX-XaB11gq2gNO}37 zawfr&?2#86KeC0p@N~0cm0NjBhmx~zejpW_giCnfx}~E@o4eOF>KI4V{S4a9n_9hs zcm+&37E?ZSs5)csfTPAa_mI~DgWU>CL|6p%scW-NS7~5n;7oo6+U~mb*tjRqb!+If_yjvf&#u_Oth?xy zS-sII=zBVyYh@E*ZcXMgR~B*R{hN(-x8Wi!Wui-|df1g^0B6N5Y)L(6mI90r>~#VW lH`cX#;aL#kvoygr7|e6AgB{#9EDU7>f`Xq#PSA_(gbC*uTT delta 16 Xcmdlfv{Q)Pn3tF9&&|mj*^M{>EujTa diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index a66f88fcbeb92b3e014078b3790730457739f5ba..6c0822c8338778232a3323b1b4471311b3d91de0 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=x&D>Y>!dn+>lA_)XQ delta 16 XcmeBS?_p;*=H=yjaC7oT_Eu&9Cj$i$ diff --git a/blog/api/__init__.py b/blog/api/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5be236d9bf213be9151efad4f701afae09581022 GIT binary patch literal 132 zcmXr!<>l(gnVQM~1dl-k3@`#24nSPY0whuxf*CX!{Z=v*frJsnFGKx|{M=Oi=#N<@{q@2XO^n4(dpRS)+kf|RZpP83g5+AQuP~G8 literal 0 HcmV?d00001 diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73d74595b4e7c7e8bd9b2fddf277a9c06757e2ab GIT binary patch literal 627 zcmZvZy-ve05Xb$MH1rdR4ePST;rKp)>6_=cnGh(r3s*mGuFp;-U`C3}ZiogE$2X``|2*)DX#lN(}=l zdt#Cs4nz@$cy{`W+oG@^%E1Q3aw!ajikRVZCQ~DTldSf(IpcHN=-5$8JEv6aRkbOv zN^6vEVt3}PZdyIbJ26vgp(_i!x=O*mdxyHO)ZM*y>xjpGVgfV!QQuzl3Ww!Zm!_1T5gaWwf17@>CAJ4UM|;&?FY*F&ukX%DC+)wC%~! aIkxxr6z%!{62D|W_7f}sCHVwn delta 16 XcmX@ld7hKqn3tE!YVYKY>?c?NDryBC diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 3079293d7d3af612c1ae756af5397f58983f2ba0..841e845ff8859c8c30dcf7a7943f74d926c56db0 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=y56PvP;orMJe99;ty delta 16 XcmeC?=;mNI=H=zG+BD|W_Jd3SB&P&K delta 16 XcmX@XdV-bRn3tE!YVYKY><5_uDHsI) diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 630b97fd427e8a9289211ceb1cc0048c5947a9fc..f168f6cbd30b220698cb7afb40f248651fbcd1ec 100644 GIT binary patch delta 16 XcmbQwGoOdun3tF9tkjf^>=JAMBlrXc delta 16 XcmbQwGoOdun3tF9!Oh7V*(KNjDDni? diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 651ce25e6cf8fb7b2e28a6f648b01901d52d75e6..da2af10afc98d2db1808280bbfdbb56facec1f01 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tF9tkjf^>;X&wDij2o delta 16 Xcmcc4a-D_Un3tF9!Oh7V*#npWFAfE3 diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 0f87667c9ea44dba5232ff03e60b5b5b3a0532db..bc4319b758ae359ec41063449ae98b244580992e 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tF9tkjf^?3zpfB{T#j delta 16 XcmdnMvVn!&n3tDp*6qm~*)^E}C{P5l diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 70f4972f7678ec8c287a3341532f56079408ca3a..2a44a55c0cfed3124d4edbdd1a7759c28b7c2bf0 100644 GIT binary patch delta 16 XcmZ3%x`LJ6n3tF9tkjf^>Y>!dkZrFA?XA? delta 16 XcmeBX?`CH==H=zOczg0j_7-LUCWZw8 diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index bc70adf2f440d84dd2b265f98bcf691e8919781d..3204476a6cb2321257f54e69ffc1b738e049564a 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tF9tkjf^?5a!vB(ww> delta 16 XcmZ3(vWA7-n3tF9*6qm~*;SbUDUbx_ diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 1ea7f9315bf7ad2e42d8b2e311c0778eacaf9767..5961c554a220f7f3cd5934878ee44f8a724a5a27 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=y56Pq%Ty#)XmvIAoP delta 15 WcmeBX>}F&)=H=zG+B}6y(=H=x&D>Y>zdm8{8>I4)3 delta 15 WcmeBW>}6y(=H=yjaC7oR_BH?^69nY| diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 3392852ce0b98b9553fe1e0197a013f5e2638981..4e8ff75f601226faeeade217072717e36b140db9 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tF9tkjf^?1sz$CT#>l delta 16 XcmdnNwu6n`n3tF9!Oh7V*$tTiD`y20 diff --git a/db.sqlite3 b/db.sqlite3 index c649732733dc6ba645fd59f2739be810d67f3e56..6d4b50842ef8420f8347317b0c8a714bfb053dee 100644 GIT binary patch delta 592 zcmZ{g&1(}u7>DO;Qzy`Ulax|1LMM6<(R^%^7#m7usbYm3L_G*S#I+rxD48X@q11~j z9wfI)4>{|(2PNQM{Tn=p2-S$C5NHoU@f&frDmgiqVR)Z;em~wINCiP^J&l(h9bUjo z&#pb0HaaM2Ha5mYhM5g>xn~tB=0WJ7iSYuR#@FwtM%`7OPeh)c=iT?O=;X$F?%Pp# ziA*#)sSG_ng6qE1@aTihe7Kp%S6{>_>>>C8pJ1<-4Bo*+jA4!mjWLcfA&ha(pZ9Sr z5yk}h1sWeB_z7QNsPPYwFsQ~TqtPGAc|62V2}^L;MerRy!mg&?!V!ZqggG$?LmFgQ zUp%fG{a3DgvASDzc4(?5RaMyHtdy>7iJDTk hed+n*A?{-%5gQ;Fz*oJKEtoQC29Nw?j85_h{SA}Xn9~3N delta 335 zcmZo@5Nc=;njp;>F;T{uF=AuFB6-$J41#=Rli3v%S@=8ok~bR~nDa^ScQObwpaKPb zW_Ql%53ezcPM)CmQ<=wrS)MZ~CqF&DAiubTK}eBVlM&91FG)-5q44l%Aj>gjB)2GCRFf?TN;>6zYxzN#Z{77l9O7JT3o`row0$LRe Date: Wed, 3 Jan 2024 15:43:43 +0000 Subject: [PATCH 16/38] Finish DRF views --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3627 -> 3627 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1129 -> 1129 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/urls.py | 11 +-- .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/api_urls.cpython-36.pyc | Bin 348 -> 431 bytes blog/__pycache__/api_views.cpython-36.pyc | Bin 1604 -> 1427 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2361 -> 2361 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 627 -> 627 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 0 -> 445 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 0 -> 729 bytes blog/api/urls.py | 11 +++ blog/api/views.py | 14 ++++ blog/api_urls.py | 3 + blog/api_views.py | 71 ++++++++---------- .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 294912 -> 294912 bytes 42 files changed, 61 insertions(+), 49 deletions(-) create mode 100644 blog/api/__pycache__/urls.cpython-36.pyc create mode 100644 blog/api/__pycache__/views.cpython-36.pyc create mode 100644 blog/api/urls.py create mode 100644 blog/api/views.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 8db8eb9adff59a79a47c8ef1dd0874175952848c..36dcf4146f005ad6777f8eff16c899d3ded78a28 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=yjUpjRndo=(aLIiOD delta 15 WcmZo-Y+__L=H=y56Pq%Ty&3=)tpi8^ diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 8c56699418de5ef34d1fc0ca95bc0c6bdfbad8dc..ff94c9a7cfde17a931600438d5157992008c561f 100644 GIT binary patch delta 16 XcmZ22vs#ATn3tF9ed*MV>?(W!Dpdr~ delta 16 XcmZ22vs#ATn3tF9tkjf^>?(W!CqM*J diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 5862f9db846f0ddc46254860ebf951f30543d36a..6342f61e8e8166858c03bc44b07460a091187220 100644 GIT binary patch delta 33 pcmaFK@sfknn3tEUt6^&DlZ~8Hm>Bgo&tp2m$j&Ul%E8FQ2mrZk2<-p> delta 33 pcmaFK@sfknn3tF9tkjg$SsOX0Ffqn&p2u{Ak)2V1hl7!c5dgDq2(=sM_Dk%ie delta 16 XcmdnbvY&D|Wb_*r|B5MPu diff --git a/blango/urls.py b/blango/urls.py index 16abc52b14..d98d043e08 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -50,14 +50,9 @@ path("accounts/", include("allauth.urls")), path("accounts/", include("allauth.urls")), path("accounts/", include("allauth.urls")), - path("api/v1/", include("blog.api_urls")), - - - - - - - + # for function based view below + # path("api/v1/", include("blog.api_urls")), + path("api/v1/", include("blog.api.urls")), # path("post//", blog.views.post_detail, name="blog-post-detail") ] diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index fb288dea9ab7fbbf760de4121c391ea5a438af82..164d1ba0d039f6a10a2096f6346cc92cbb24dc97 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=yjUpjRndjkL-(*%G3 delta 15 WcmZo?Y-eOQ=H=x&D>Y>zdjkL*JOly& diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index f002958fdf88cd8751d263dd5feccdb20d10ee06..693728e9af7edf80e504e3317376e80b4371b286 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tF9ed*MV?D{MKDSHIJ delta 16 XcmdnSv5kY>n3tF9tkjf^?D{MKCT0Xd diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 3a86b71584e45c1379487ffe5447d475bbdda69b..524128c74459633324bda1c7a5b83f553f0c2c39 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tF9ed*MV?6VjFCrkwM delta 16 XcmZ3;ypWmQn3tF9tkjf^?6VjFBsTY>!dp#onAlC#W diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index fb4b9f80cc5a3d322940392776213647af0ea853..c095dba0381ba59dc1e110a5e6e54dda237e473d 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=yjUpjRoJ1ZvuC0GPn delta 16 XcmeAX>Jef$=H=x&D>Y>!J1ZvuB0~e* diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 335c0ff19d94b10e9b68695ab53bf4c37e9172a5..101b28f79cd095cfebb8f3544fc020a0bb5ad659 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tF9ed*MV?DEV2Cqe{@ delta 16 XcmZ3+wv3J4n3tF9tkjf^?DEV2BrOCC diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 4c96ee2d8fc93d354c0021955ca93c2c3fdedf73..86c38fca098de15d4d35bc4560bd332253039348 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tF9ed*MR?A-t$5(J?D delta 15 WcmbQlIEj(nn3tF9tkjf=?A-tzdjul@ diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 96421acdc27eb41f5d22cbc9372b46575795623a..5ac6c2c4b22e0a069a9bab34c413be78bd60447a 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=yjUpjRndnEuK2n1^Y delta 15 WcmZo*Y+z(J=H=y56Pq%Ty%GQya|1#E diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 75fae15906bf2bdab60cab1f79073fecb99a17e3..19862da304957989796b8209e8ec16c996a201d3 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tF9ed*MV?5a!vC&>ht delta 16 XcmZ3(vWA7-n3tF9tkjf^?5a!vB(ww> diff --git a/blog/__pycache__/api_urls.cpython-36.pyc b/blog/__pycache__/api_urls.cpython-36.pyc index b06a9e98cd27e3171a3e6dc47813e6a8d236f4be..ab3dad7b8eafa165803592da490baf4a0ce4e1a9 100644 GIT binary patch delta 245 zcmcb^w4S-%n3tEUp=N5T7b641V+JI^24p(`ad7~UNMT4}%wfo7jACR2v6*t1a+#x; zb6KKTzmCgUx!wEUvn#FF^p(zLY9iui)Wl9JS-yyA)7&Ws!r&+C{+Nfo6Q zm&B(PCFZ7<=NDz`l@{f|6cw=oO}fR6B(jpBh!ZGQ#5q}z(UFe}$mC%XVB}%uVH98n E0BgZIVE_OC delta 154 zcmZ3_e1|E;n3tF9tkjg$TMP^gkAWBt*nlhtATG865-AKRj5!Rsj8Tk?AU0DDQ!aB9 zb1q913nN1+V+wOBa|%leYcDg9&6diN!VY4mGexnca0D}Ga!#yJpSaVRk!|8%9kE;7 lrA0Xfi6teeMR~<58HzZ7rWbKcPGEH80@=vJB*4tW2mmVpAL{@B diff --git a/blog/__pycache__/api_views.cpython-36.pyc b/blog/__pycache__/api_views.cpython-36.pyc index 8e3f7f3f911d944c5641104b4cf8470f04b5c28e..1bd581b173c62db45e39df4560500cc064927319 100644 GIT binary patch literal 1427 zcmZ8hO^@S55bbV%CAKG-9WDC-Vp-r64#`S;MTli$KxpL*6OTZ?MBa2y#vVHk-959+ zDzgW|HQe|SNF4Y*edWYo;6zntb{Va$E?2)Um#gYM`RU$XSgwB;zE8;CKck%RTG6wciAJV12LdG~K*weZLNyD32%+9uIhD!8Vld z^N>fs(hbdHi^hC!;Q)Sz_juppd%Qa(gM)wI`(!{(_-&RQO?9C!6zl>iE`?MA+)lA7 zXP2dTiT<%rt9EJe-chUcRLHWZ%U43esf&nlzDY80C(|sQGfWPb2P=Se2uu9}W=$&S z`JBnmG_6?WY{)g!E@#?XGwyJA%PPNw>ZiL%4fHE3%2p~9ef4ZS zJ5IhoNv7GrL$ZFl5HNcGw3SVvjfa&g6RNlD7#E>Gi2Mk0{W~0;wT&3fTVA%Km#sWk zt70xjFY02sXyMT=MsG-0!_}4P+Rp1z=?Gp|_rMSq(vaSR71IvfjJoszlOMy0agI(h zi@EzctHORT@-bf_iF5tf*3Q=9|ZP~R8LI^=5ui+VO-eik+*+3F5NWue2FqDMN z?L&?~K`Q-sqpe_q6sWxqmESOIzSQRcds2I z`{W35@sS&UfWOpNPW%NlEe`3t?*4w%3jXU#w({!g&;Eb)AG}G>IE-MUb`sk}i2*ygDNTnsr zUZvHGseC2drGXnf?KF)88V{tZ%clNSs)|ug_-M=^k0JUY)VVh&VGs`SAps!Y<7n%Xqd2D(|z zY^+ypTdFe~SKY$Mg&C%*hg4Kfs!wV_YJ=1!sV!3XNZp5`Yc6rUzdZF0+Y6P`2Si{OgSqncfU5^iOPmCsCQVi8@j z3x3Xlt1sd!#yr?5cKaq1OoTH|dxpu_`akYXY#>TgPUy~Uxi~|C_YdHy_mKgD8>+0e zMExtdG3D{Q=`j<$Z;G>RHVQTg3=n>rxqe4EsIdIGKp)TjivLOMPm zqP<*6ZEQ$OwaxS`rPMZ^Lj_o?9az^VqVDDcxSERR@r-3`2a>UzCBFIsv5M0SK0=km z@$okp#xo4~u`3RYz)8V@+h@i%!8vf5hu3&=;Uiv9)I@~!g@5kPV-XU%K-8Znmms@I zO*Zcl%B~7rB-r%|c;|1=n!do9BANLP{S^JXCgpob%KA@#xdENV2Z#auNW0#)(GPn+ z?@jiG14RUJz^f0*dJ}K;5yd_x^$97uw;~{HHr}5;-XBl)#uFO}*+_F!0re>@a^2zZ z{+!&mK<}-~C{0;6L(FSR+2c8YA2`qfJD|^;R$pRnxNU_(gbD)_(gbC*uTT diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 6c0822c8338778232a3323b1b4471311b3d91de0..7d8d871b298edfd8a6f7e30b26544ba0987a0962 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=yjUpjRodn+>lB_0I6 delta 16 XcmeBS?_p;*=H=x&D>Y>!dn+>lA_)XQ diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 5be236d9bf213be9151efad4f701afae09581022..c3889c46a2bcdceda23dc59ec50f556d556b28c8 100644 GIT binary patch delta 14 VcmZo+Y++OULv=4(zJFQ*(rriNSzsZ2wo{G z6R*I;aS;ehKIcCdfBGe#k4Evs%bTDWp%3)$grG0s+It8baV(L-6l147=_x|VK@;h# zfCeh0Aw~joUj(b(9`S&OuLSCz2oH7S>e8c;AR^jh8u9)eO5#tTqXc(;!`da}lR_KC z+T3o6qI$}q+X_?L#OtD4ZQJY0wq5Mhm1tQdcVPqCW^}}wDt9`Uu;PF67-@|McIc@Q04fX+w%V-SBwc0z&YYXHdG4aA W(tIPu3_b{1M;PLvHz5;zOuhm6Cx5yC literal 0 HcmV?d00001 diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc2bc1b88c7bffac140db8b85a087305bf55406d GIT binary patch literal 729 zcmbVKy>8nu5GM6w(TeQ+pi|Ko@L~;Jiy%b<1O8w2u8fRawyXw_vPkcl96%<8;aDK*1noVoLwhzE zc0#G8Za}FnSE_MlZ7D94x>{?y&3JO#W$t1DRU5ikTic1NHTX?{*2k3G3oqhSWpxO@ zm>*%Hhd5g%sQ$mCcH+bKLJ#R}1oB%%1ux=*^a*Jvru_f_ literal 0 HcmV?d00001 diff --git a/blog/api/urls.py b/blog/api/urls.py new file mode 100644 index 0000000000..39fdd47a32 --- /dev/null +++ b/blog/api/urls.py @@ -0,0 +1,11 @@ +from django.urls import path +from rest_framework.urlpatterns import format_suffix_patterns + +from blog.api.views import PostList, PostDetail + +urlpatterns = [ + path("posts/", PostList.as_view(), name="api_post_list"), + path("posts/", PostDetail.as_view(), name="api_post_detail"), +] + +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/blog/api/views.py b/blog/api/views.py new file mode 100644 index 0000000000..46c3e3e51b --- /dev/null +++ b/blog/api/views.py @@ -0,0 +1,14 @@ +from rest_framework import generics + +from blog.api.serializers import PostSerializer +from blog.models import Post + + +class PostList(generics.ListCreateAPIView): + queryset = Post.objects.all() + serializer_class = PostSerializer + + +class PostDetail(generics.RetrieveUpdateDestroyAPIView): + queryset = Post.objects.all() + serializer_class = PostSerializer diff --git a/blog/api_urls.py b/blog/api_urls.py index 4f95d4e5dd..888fa20846 100644 --- a/blog/api_urls.py +++ b/blog/api_urls.py @@ -1,8 +1,11 @@ from django.urls import path from blog.api_views import post_list, post_detail +from rest_framework.urlpatterns import format_suffix_patterns urlpatterns = [ path("posts/", post_list, name="api_post_list"), path("posts//", post_detail, name="api_post_detail"), ] + +urlpatterns = format_suffix_patterns(urlpatterns) \ No newline at end of file diff --git a/blog/api_views.py b/blog/api_views.py index 1759335581..06f62f754b 100644 --- a/blog/api_views.py +++ b/blog/api_views.py @@ -1,55 +1,44 @@ -import json from http import HTTPStatus -from django.http import JsonResponse, HttpResponse, HttpResponseNotAllowed -from django.shortcuts import get_object_or_404 from django.urls import reverse -from django.views.decorators.csrf import csrf_exempt +from rest_framework.decorators import api_view +from rest_framework.response import Response -from blog.models import Post from blog.api.serializers import PostSerializer +from blog.models import Post -def post_to_dict(post): - return { - "pk": post.pk, - "author_id": post.author_id, - "created_at": post.created_at, - "modified_at": post.modified_at, - "published_at": post.published_at, - "title": post.title, - "slug": post.slug, - "summary": post.summary, - "content": post.content, - } - - -@csrf_exempt -def post_list(request): +@api_view(["GET", "POST"]) +def post_list(request, format =None): if request.method == "GET": - posts = Post.objects.all() - return JsonResponse({"data": PostSerializer(posts, many=True).data}) + posts = Post.objects.all() + return Response({"data": PostSerializer(posts, many=True).data}) elif request.method == "POST": - serializer = PostSerializer(data=post_data) - serializer.is_valid(raise_exception=True) - post = serializer.save() - - - return HttpResponseNotAllowed(["GET", "POST"]) - - -@csrf_exempt -def post_detail(request, pk): - post = get_object_or_404(Post, pk=pk) + serializer = PostSerializer(data=request.data) + if serializer.is_valid(): + post = serializer.save() + return Response( + status=HTTPStatus.CREATED, + headers={"Location": reverse("api_post_detail", args=(post.pk,))}, + ) + return Response(serializer.errors, status=HTTPStatus.BAD_REQUEST) + + +@api_view(["GET", "PUT", "DELETE"]) +def post_detail(request, pk, format=None): + try: + post = Post.objects.get(pk=pk) + except Post.DoesNotExist: + return Response(status=HTTPStatus.NOT_FOUND) if request.method == "GET": - return JsonResponse(PostSerializer(post).data) + return Response(PostSerializer(post).data) elif request.method == "PUT": - serializer = PostSerializer(post, data=post_data) - serializer.is_valid(raise_exception=True) - serializer.save() - return HttpResponse(status=HTTPStatus.NO_CONTENT) + serializer = PostSerializer(post, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(status=HTTPStatus.NO_CONTENT) + return Response(serializer.errors, status=HTTPStatus.BAD_REQUEST) elif request.method == "DELETE": post.delete() - return HttpResponse(status=HTTPStatus.NO_CONTENT) - return HttpResponseNotAllowed(["GET", "PUT", "DELETE"]) + return Response(status=HTTPStatus.NO_CONTENT) diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 888b33ee44b06301490d9de6b011c0f540d0cadf..cb97f8ae51bd4e95fd6c51d32c72fbef2ac39f77 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tF9ed*MV>?c?NEw=@X delta 16 XcmX@ld7hKqn3tDJO>D|W_7f}sCHVwn diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 841e845ff8859c8c30dcf7a7943f74d926c56db0..7e67bbfe0120a9df32488c5188234ee7e3946f2b 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=yjUpjRoI|~Z{BpU=i delta 16 XcmeC?=;mNI=H=y56PvP;orMJe99;ty diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index a2c290dd182eba5fb84ecccef1821af79d9e9a6d..7941288496511f9be98f50f0f015a24c6faa8ffe 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tF9ed*MV><5_uEM*04 delta 16 XcmX@XdV-bRn3tDJO>D|W_Jd3SB&P&K diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index f168f6cbd30b220698cb7afb40f248651fbcd1ec..94f12c6aab3622b72a6aa8dff7b226b1a5c89322 100644 GIT binary patch delta 16 XcmbQwGoOdun3tF9ed*MV>=JAMCk+II delta 16 XcmbQwGoOdun3tF9tkjf^>=JAMBlrXc diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index da2af10afc98d2db1808280bbfdbb56facec1f01..e35710e6cf3e354c74609393702f2e9f59b98794 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tF9ed*MV>;X&wEhz;U delta 16 Xcmcc4a-D_Un3tF9tkjf^>;X&wDij2o diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index bc4319b758ae359ec41063449ae98b244580992e..c34c4de9fe7894e1cb2ed2066673c4f2f065bdc3 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tF9ed*MV?3zpfC`kmP delta 16 XcmdnMvVn!&n3tF9tkjf^?3zpfB{T#j diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 2a44a55c0cfed3124d4edbdd1a7759c28b7c2bf0..e5f0a6c34dde69821d186fdab8355cf5fbccfcc4 100644 GIT binary patch delta 16 XcmZ3%x`LJ6n3tF9ed*MV>n`u delta 16 XcmeBX?`CH==H=x&D>Y>!dkZrFA?XA? diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 3204476a6cb2321257f54e69ffc1b738e049564a..9ab3cf3c1ac478728c68205e72f9d6dd9a65c975 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tF9ed*MV?5a!vC&>ht delta 16 XcmZ3(vWA7-n3tF9tkjf^?5a!vB(ww> diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 5961c554a220f7f3cd5934878ee44f8a724a5a27..563c7c10240ae83832836f7ddb5972d7ee2d6eb2 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=yjUpjRndkX*`M+A%j delta 15 WcmeBX>}F&)=H=y56Pq%Ty#)XmvIAoP diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 7b0680171f6e78b09d91c9c0d2be5a1138f71186..e84999c32cae8787de47c9fd23bedf5233a0ff3f 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=yjUpjRndm8{BfdrBO delta 15 WcmeBW>}6y(=H=x&D>Y>zdm8{8>I4)3 diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 4e8ff75f601226faeeade217072717e36b140db9..c41e5c9caa9ace1d3362dac1c9214633a0eb546d 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tF9ed*MV?1sz$DS`yR delta 16 XcmdnNwu6n`n3tF9tkjf^?1sz$CT#>l diff --git a/db.sqlite3 b/db.sqlite3 index 6d4b50842ef8420f8347317b0c8a714bfb053dee..98f433b201be108fb89ed8635e1f4a4586e3be7d 100644 GIT binary patch delta 501 zcmZo@5Nc=;njp;>H&Mo!F>YhRsXRer1w&ISBLgc_OFc77OCwYBX6yWR>wL!T*7-~) z19(`tMH%>R@owR<<`&&-sKCly-=xgK>f0RZSdyJ-U~Zh3Zl0c+n4FoKm1$94Y*Lz; zTa}YjTvCyqq?hVd5tijr>|dVc80eH5pXr{HS5Z-}!}+kZMxyTv-s3S>WoC z>JjXmo1PXDP!*Bs6IfD^Se_DQ?wscv6qW9hWtmjqp6g_poKoOY78Y(=?-x?2TU;4r zo?T>7=#&zXQ{wo!U779T>{eJ2<>>1eUgBP0USX0}?&4aJl@wuRSma}D>|*5@Us6))Xqq0Joa}Ar zVxFk$ZK7)y;F4nM>YP=oq3iFMXlPUr;B6jd=H_T*U}U0eV5nZ?`_f zbds5eg+G^pe-eK#{~iAAn*|GE`BhbzeHjS_9?SGe_nC@-np+w8AMqdNU&7xC)LhE1 eEXVA~h}%vUko5FfXPKnh54~sFe&{{3-2?z;4xYdO delta 129 zcmV-{0Dk{~fD(X!5|A4KTag??0b8+P%5D)dATTsKGc-ChFfK7TI5amogFA1BJ8uEE zJ8uHXPznPKI{*&a4YUk9voRno47WSX0?7jk0}qk_50Veu54W=saD)$+lHUSy3Ih+M j01x61!w;mh5pb3d1ReuH0hgN10vd Date: Fri, 5 Jan 2024 01:01:47 +0000 Subject: [PATCH 17/38] Local Changes --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3627 -> 3852 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1129 -> 1129 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 7 +++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2361 -> 2361 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 627 -> 627 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 445 -> 515 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 729 -> 729 bytes blog/api/urls.py | 5 ++++- blog/migrations/0009_alter_post_slug.py | 18 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 0 -> 578 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 294912 -> 294912 bytes 39 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 blog/migrations/0009_alter_post_slug.py create mode 100644 blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 36dcf4146f005ad6777f8eff16c899d3ded78a28..54de79c2ba3f0ed3e5a71b70ef36526f4a146c3f 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=z`Juqz|do=(X@dO(H delta 15 WcmZo-Y+__L=H=yjUpjRndo=(aLIiOD diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index ff94c9a7cfde17a931600438d5157992008c561f..2e6bab3fc3dfb6daa0aaa469811e69fc35e27f44 100644 GIT binary patch delta 301 zcmZ22(<7&B%*)HwA2L1FS(Jg{F#{410J0r`xVUShat))fXNp&fcZyFsb0%YyVG2_) zgQoB1C5+oR>Z9abT-_W)eL~_LLqj}V{X#sQ9YZ|*{ohgR2aSQj1IC(~1&v zQ_J&q(%*)I5zI1A;y9firV+JH30AxD=adFK?`5#DEi?rJ delta 16 XcmaFK@sfkxn3tEUt6}O!_9PYnEm{Qr diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index f4333839e0ef853e8cb238761e098f7ffdaada7b..8464633ed82e7640c844a8bd26f4d198b9bdf79d 100644 GIT binary patch delta 16 XcmdnbvY&=sM_CxQfe delta 16 XcmdnbvY&=sM_Dk%ie diff --git a/blango/settings.py b/blango/settings.py index 43c73a959a..2aa1b77e6d 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -186,3 +186,10 @@ ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_AUTHENTICATION_METHOD = "email" +REST_FRAMEWORK = { + "DEFAULT_AUTHENTICATION_CLASSES": [ + "rest_framework.authentication.BasicAuthentication", + "rest_framework.authentication.SessionAuthentication", + "rest_framework.authentication.TokenAuthentication", + ] +} diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 164d1ba0d039f6a10a2096f6346cc92cbb24dc97..506b82ba74c7512a6317e72a57c6cf63e210ed7b 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=z`Juqz|djkL*f&?l6 delta 15 WcmZo?Y-eOQ=H=yjUpjRndjkL-(*%G3 diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 693728e9af7edf80e504e3317376e80b4371b286..0948e96b972220ce0fc25d304ec1d3be8bcacf99 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tE!_rSD`?D{MKCe#FJ delta 16 XcmdnSv5kY>n3tF9ed*MV?D{MKDSHIJ diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 524128c74459633324bda1c7a5b83f553f0c2c39..68963bc93505b50d88e0629195c550699604e24a 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tE!_rSD`?6VjFB&7tM delta 16 XcmZ3;ypWmQn3tF9ed*MV?6VjFCrkwM diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index b92c95483c13c6f799a2314756ff841f0d682edb..61ac7317c184f9dc9c21ae7cdad93a1a6db77b9c 100644 GIT binary patch delta 16 XcmX@devX~pn3tE!_rSD`?8lh_Dz^nL delta 16 XcmX@devX~pn3tF9ed*MV?8lh_EnWqL diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 01d7dcb10b47324dc47dcb814661f73725400299..27f7f40085ed1446d180d5c5d92124cbb1d14b95 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tE!_rSD`?3(NVCcgw` delta 16 XcmdnMw}Fq{n3tF9ed*MV?3(NVDP{z` diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index a48f6bcff12a1195b512fbe9990a03d9813512d2..a70ecb31d3345c0531203569f3814fe4545be1e8 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=z`Juqz}dp#onAw>jC delta 16 XcmZo;ZewOQ=H=yjUpjRodp#onBkTmC diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index c095dba0381ba59dc1e110a5e6e54dda237e473d..071f7aa975c3df12f60387839cf1a5c2eb261504 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=z`Juqz}J1ZvuBC!Mn delta 16 XcmeAX>Jef$=H=yjUpjRoJ1ZvuC0GPn diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 101b28f79cd095cfebb8f3544fc020a0bb5ad659..e1c8aaa0d3ce4617fa5d8a152335b3ea10067941 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tE!_rSD`?DEV2B%1^@ delta 16 XcmZ3+wv3J4n3tF9ed*MV?DEV2Cqe{@ diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 86c38fca098de15d4d35bc4560bd332253039348..ae36c79a6433cee6a5df15010ceb95c9e7ab9c97 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tE!_rSD??A-tz!30YH delta 15 WcmbQlIEj(nn3tF9ed*MR?A-t$5(J?D diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 5ac6c2c4b22e0a069a9bab34c413be78bd60447a..764254266043f3656b82d4990002d4fa5c9b7552 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=z`Juqz|dnEuHw*(ac delta 15 WcmZo*Y+z(J=H=yjUpjRndnEuK2n1^Y diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 19862da304957989796b8209e8ec16c996a201d3..5ced4710b20fb36fb627c791c934772a5be547f2 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tE!_rSD`?5a!vB_aet delta 16 XcmZ3(vWA7-n3tF9ed*MV?5a!vC&>ht diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 21f24e58a19d3efa5056564c0fb9db09ee2da579..b77b638c70c4ca715d2c00c1502bd550c15a5d67 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=z`Juqz}dmAGFA|(W2 delta 16 XcmeBW?qy~-=H=yjUpjRodmAGFB+LZ2 diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 1f8e4e505553db5094f2ad1fa6541a7d97f24fb0..bcf8455a35aca1696f75cecee3a9a8961367e98a 100644 GIT binary patch delta 16 Xcmdlfv{Q)Pn3tE!_rSD`>_(gbC{YB9 delta 16 Xcmdlfv{Q)Pn3tF9ed*MV>_(gbD)lB6kF6 delta 16 XcmeBS?_p;*=H=yjUpjRodn+>lB_0I6 diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index c3889c46a2bcdceda23dc59ec50f556d556b28c8..beca2cfecc8c586c81e0bfeee83d1880196baa5e 100644 GIT binary patch delta 15 WcmZo+Y++?}--w?}--QImO?(g9MG24?^O diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 9d54649b25845beea55a344268dbd29133b8a759..7e6c775db2db1ade5f005ccbe97d578ef0b2ae38 100644 GIT binary patch delta 301 zcmYj~y-ve05XXJC<9xMM_}E}z&5{lsSYbyjY+kB>O`2jSk&{rV3q$4(C=w4*iAO-< zIkGbG7C4zW>F$0%{iVAv($Tlod>(v$f5;;s^n?BtvwUN_uIvyD$1%eGxvO zc=l`Gq8JafN}J8#=Eak0g?vAl)!s?lX0zO%8Cf^$XOn8VE6q#N8dcxN!4QgVT4d$q z2HPu!^e1q2K`rvdqbjo`t@7kGm%G|HW6t_JxMbmoVPC-Q>B3?JGaQi!&WQ&Y{s6SF BLyiCd delta 258 zcmYj}Jx;?w5QTU4FOEs96jTuxaN~vxkOM$N1KS`+J2(luaWw0Y5+v6kp@?fBF2F_7 zQgI7*Q)Q$XeQ)Ny>E(}jxg3x4``1r2z}PQ4DINJLcDRefG7FA*FaU|U<6anXWZ|S& zMtN;CFa#@6tp+`_%IY@}^#JuzXGu5QWGFD}!DM!L%gQ4Ei|<(p2f3-c#m5(2-;~3{ znO)WErmeQ*0`X`tQ^L?aJW}m(*V0qE#6X9%4kVJHn7g*A>dmrxUg9p0j7w7ccev1b T!hHV?vm)ULMtmYBa4!A_Df6vDuV?N diff --git a/blog/api/urls.py b/blog/api/urls.py index 39fdd47a32..bb432617dc 100644 --- a/blog/api/urls.py +++ b/blog/api/urls.py @@ -1,4 +1,4 @@ -from django.urls import path +from django.urls import path, include from rest_framework.urlpatterns import format_suffix_patterns from blog.api.views import PostList, PostDetail @@ -9,3 +9,6 @@ ] urlpatterns = format_suffix_patterns(urlpatterns) +urlpatterns += [ + path("auth/", include("rest_framework.urls")), +] diff --git a/blog/migrations/0009_alter_post_slug.py b/blog/migrations/0009_alter_post_slug.py new file mode 100644 index 0000000000..050c2b8bed --- /dev/null +++ b/blog/migrations/0009_alter_post_slug.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2024-01-05 01:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0008_merge_20240102_0948'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='slug', + field=models.SlugField(default='test', unique=True), + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index cb97f8ae51bd4e95fd6c51d32c72fbef2ac39f77..71a694333a7d908c0164729c6744079cee0a09c2 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tE!_rSD`>?c?ND-Z=X delta 16 XcmX@ld7hKqn3tF9ed*MV>?c?NEw=@X diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 7e67bbfe0120a9df32488c5188234ee7e3946f2b..ba26089c0b12b64b4b58456537ed1c764abedcc9 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=z`Juqz}I|~Z{A#?-i delta 16 XcmeC?=;mNI=H=yjUpjRoI|~Z{BpU=i diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 7941288496511f9be98f50f0f015a24c6faa8ffe..2545c723dc2f6870cc5fa6ade0f2ceb6fd382c62 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tE!_rSD`><5_uDZT|4 delta 16 XcmX@XdV-bRn3tF9ed*MV><5_uEM*04 diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 94f12c6aab3622b72a6aa8dff7b226b1a5c89322..b15342fc9e4ca36c1b5856dc44be4e49d35613ad 100644 GIT binary patch delta 16 XcmbQwGoOdun3tE!_rSD`>=JAMBxVFI delta 16 XcmbQwGoOdun3tF9ed*MV>=JAMCk+II diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index e35710e6cf3e354c74609393702f2e9f59b98794..229c9f8e0b15d7a06b12467c44d3ce3e814b4909 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tE!_rSD`>;X&wDuM*U delta 16 Xcmcc4a-D_Un3tF9ed*MV>;X&wEhz;U diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index c34c4de9fe7894e1cb2ed2066673c4f2f065bdc3..9f061cf24433abb72f9a561efd80bc861eb0036b 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tE!_rSD`?3zpfC87jP delta 16 XcmdnMvVn!&n3tF9ed*MV?3zpfC`kmP diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index e5f0a6c34dde69821d186fdab8355cf5fbccfcc4..abf1ee08cf31c93ec0875aef6590f319ed16d3de 100644 GIT binary patch delta 16 XcmZ3%x`LJ6n3tE!_rSD`>n`u diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 9ab3cf3c1ac478728c68205e72f9d6dd9a65c975..c9db4260ceea7b6586297fc24cb385050337c56f 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tE!_rSD`?5a!vB_aet delta 16 XcmZ3(vWA7-n3tF9ed*MV?5a!vC&>ht diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..065e4722db795fbebc3b83f56ebb6659082c150d GIT binary patch literal 578 zcmYjO!EV$r5Vd0`n*=Ix0=@t#mrYoDXeES-RKbZ}+EXr8c4r#0IB{wxLY(1Lsb{`{ zU*Qvc<-{-a)Nx8xZ25WY@yxt8esge;|GxN%*PO9G?7tz&KB47a5dZ_OS|8$j)L!Syg!WSr1)YXW372UbUr zx4af8_c2g9O!g~?A%WFR1nG?+UkVu&dE&EA581ukYSa3cRaG6S9&L+iQ*92b*VRT< z$A?E=j>b)1Iz6{uPUxl!Vz&akY-TSmSS97C7TsQ%aH~+x%O!Q-ST&)F3X)Y&ydJ;V z@Qs1H%L!7ENXa9b%l%m)eFpoGZw=dp>B4StJ~FwtUQoPG-`;C}7eu%q?U}d(UzeF& literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 563c7c10240ae83832836f7ddb5972d7ee2d6eb2..2254cf9e216c0161b5f7bb05e57f2f302155e12a 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=z`Juqz|dkX*@_5?Nn delta 15 WcmeBX>}F&)=H=yjUpjRndkX*`M+A%j diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index e84999c32cae8787de47c9fd23bedf5233a0ff3f..4b8a11e8a978ffe6feb48c7e73f60e14e11a0b37 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=z`Juqz|dm8{9Fa$gR delta 15 WcmeBW>}6y(=H=yjUpjRndm8{BfdrBO diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index c41e5c9caa9ace1d3362dac1c9214633a0eb546d..efd2ed3f9767d799094736fefc020acde40c8e78 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tE!_rSD`?1sz$CffvR delta 16 XcmdnNwu6n`n3tF9ed*MV?1sz$DS`yR diff --git a/db.sqlite3 b/db.sqlite3 index 98f433b201be108fb89ed8635e1f4a4586e3be7d..367fe49692407456f611c8b6ba289a7cf1f50106 100644 GIT binary patch delta 1521 zcmah}Z){Ul6o2>L_xjd$eXkvCZyUqa6atKOd+)Vf+l^7`*q_dAFvb{Ng1By7*V&DZ zP1Y_3`ZhNPD%ou0!Z)K}f_^Yq!iyS%f6)X#2*MaRK#hn|gvCU@IMmyz=ojM4JvaCK zx$mC*&hMN=A}f)|np$QGP!v`7w?K*lhUsD(2%LQKB|fW!m~#fmwzR-N_BG6{Bx`Kc zXo8wz=2oi1_yPl~)+7rAOQ~b0D2bvh%66+LSw)9gl*-AH>?JmbDB30GYKF>ocmt7L zAyE|F$@!eTCI1PMC70Xgu3VKon!DWm@PA2?EIZ}Yv7BM8=`y#6H*&vlA?`Fc!yVx^ zrX+I?ry<%A%989b7D9t987>j&GUUm?-^`$;_{Htou0qtOC6 z9XBum^PnIlvr5l^HDeb_)eEISHm^2Ow<&m*`;l8>DAHSWG3`xlcZP?3j-@m)>NazY zX{JA+*P$`;ZlfCC3;=@E$3%Hw{pk?Q2I}!KxC-o#Z3Aj-8=Tgn-}vuRro=42JO|md z4^WfMqD&wwcerRo0ccRc1^|r3$EhqRKfHU02a%d}kD@G_#MglZ-_DXs^PtLTxR0wgrDMgYuJ8 zB^m0O>&OdOhoaXAJ_~+x66WIWahOMws^?F8bJ%93L?Z+}Y0pZ$cLJ_r%0}B2D}H?f zuE#|OU;!2pSwLRUPwKZ{no3w8+*w-%(`XXIT?Gf*A>&ALtOPkc(7_RT?ZZ4O0H*5;`mJfs@ zRs8{1LuhODQ1wu3i)?qdR#o@JTbc$$>+Zlvq)zPWY_JB)T%G@LL2{W15oC9{km0YLHx`On5|ZxgP+nI!`D&#i+mm5$ItO<$`mc*SFS*f z;QyduaNiAx$@OlE|CaxVKgN&q-Q@aK-tq{c#KZGp(r*0d=P+M=^)Bp4sPtxffqyMZ z8&6LmuwgBGpE6K>iY;QMnH}`kv>(0)u7Z5-oWYQ3q5S%OLaoIQm?lu7Mbz-IdoXBtW(NZAy@^J9cgRc;p>RS>o1`r84gy6SAkLfU-R#m(7V8n-F^ zYG-uU;LwAE3r{}}m#AmYqb|U2Qc782kmMN;_jd(j>5-9-PmIG8q*>4aX}dl|E0R)y ztzV*(w9>7(@xfX2y?(4*aj}BO113s8KKhf@>|2Y9byY Km1NfZ!2b!X*Srn@ delta 988 zcmY+BZA@EL7{~89&$%ysyZ4q-ItG?Po<4YLhMrY1TU+(`Ulw&e za&twaHn*;BYisHi^_F^8eOEoIzMhMOcdL?iO7OVC**8OB7J`_9kCvfW^w+`j3ihl( ziMX>K_So{JS572KtMXSm#%ZzWtAu6+^$A*-t!=nOs?sYB)=C4325MZw1A%_4-d8=Y zU5=nVY5UnWq{QTpWI;;u*1vl+JD_)2V{t-&KyE;PLMM_3iIqG^XKnD4_G`{<{GgRG z5C|=TMq4x-ZK@AP>ci1MINBO%YHe~rq0 zC+)kHZRL`}q)(*-;z_zC?!%Bl7qSUG!Pp`>$8FCN+)7c)>ggrbgz@Cw=W~t9&89>0 zy%@yv8M*_9GPIbP-KK(}HCTckQ^s={8W*2Uy=qGMC__6)ixnQHenLd-o}d>*Ciz}# z&OffirzWV36_d0`d?wXt0=7@mCTtj|rFc2tIWtM`OR+J@_j3I|W>)WqbRF=6Q}j!# z?G@rBg?y&`BAgmdHK&4y^FX_BSzjPbcQS`pP;a{yoO>Kz{^6oSNd=kMmG14tw>D|O zYX6>IV-nMb1?{xuT&8Ur51<-{Hz_)qmJzgj+Be#qmdUvj?`X^qodnAl=}zn7?{vVp z$j%2WHUm#$d1GCe64cWU&E8^5NLR!gq6apdtID|31GQvEIY2zZ6whyvnPApp-zsEC z4gRIR?@)}G zJs6v&#c13G5ns9s3O>BUW&RGFV5x{%j!PTRirwoF#JWvbWoDZhK>v04nv~(jb+||T zcy$GyBb^vuhl=b{NXESzAmcBMB!q*TP>$&va0?=4H6FeRVds8x$PCK9lQEJi`M>j3 zY?`Lup)W<(tjE)o5oWfVPh;OQe8tkOW(B&}p@ZzRxX%e<-A>bCLhKfK2!EA*ZZLhG W>1?mX67X0ft}h4`bxShfPwj68S0fbw From 56b54c97a5d2aa40ca4c249715a5e6b0b80eb4da Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Fri, 5 Jan 2024 13:45:46 +0000 Subject: [PATCH 18/38] Finish authentication --- blango/__pycache__/settings.cpython-36.pyc | Bin 3852 -> 3882 bytes blango/settings.py | 1 + blog/api/__pycache__/urls.cpython-36.pyc | Bin 515 -> 613 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 729 -> 841 bytes blog/api/urls.py | 3 ++- blog/api/views.py | 3 +++ db.sqlite3 | Bin 294912 -> 299008 bytes 7 files changed, 6 insertions(+), 1 deletion(-) diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 2e6bab3fc3dfb6daa0aaa469811e69fc35e27f44..151b36de0b0f22f87e92a445dc32f00de1ff9781 100644 GIT binary patch delta 345 zcmYk0xlRIM6ou!9Q6dQ>7AlAg1H-;A?kgznOJjE%GvN%s1CdFXF_ydljlsf#%F1ZT zTUhuKK7_4*sJzK{a*A`$y+h?g(P}=Q_t*Vuv=$`kNBTGO!q)}%@LBsDAk61!5egzu z5k(9dpQRsHF#=s6}y-eyPdaZ9xg$1!`{ vR@>I(i_N%$fxclockRCZU_4pMmVt delta 319 zcmYk0xlY4S5JlgMEg~W%O2ca6IB_<|*-Y5igoGU`sHTf_&BGLlgwwl6NC>&0NlgJ| z{(ukQCn)&|o?J1~xw^%jJM*DG>t;KdOuXE_xxG2Ye%QZBOW%?BPp{@@Aks9C40L2+ zAcwq|p#_+ZQzueIHMNMae+%*2}Qo+Aa=v7>w(P~OY|QGLoqUZcRcon!Z+?l XkH++yE6Vg&4QKg#7^J%4SL*%`k4sZS diff --git a/blango/settings.py b/blango/settings.py index 2aa1b77e6d..b24170183e 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -58,6 +58,7 @@ 'allauth.account', 'allauth.socialaccount', 'allauth.socialaccount.providers.google', + 'rest_framework.authtoken', ] MIDDLEWARE = [ diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 7e6c775db2db1ade5f005ccbe97d578ef0b2ae38..21a41ab7a6a00999a6467239aed66c65463a6853 100644 GIT binary patch delta 291 zcmZo>dCH<}%*)H=%sL~Lm5G7jF#{4{1F{`}xVUYivStz^LkdF*OAdQ3M-)dcXA~zR zLn>nmYbr+;S2IHjTMBzGGmy`b$_eIkg81o7QQWC4soc$sK$;sU%azKM0^~I_0ogpM zY*{?bOzBMK3{l)Eyul2bd=qCFvNPUdEz3+TpLo1fpo+UBKRY!~H?g!NL*Gx6cd|XB zrKv+?T2W$dYI%N9wjM|ltgMI?=+Y>@q@4V8y~Kh{J&-BIMIbK}u}|(}l$41Q v%ugyw%*=}iX^98xS;|-Pm=KUDz{mrH0?Y!8BFr3&Oh7gO1cyZ4 delta 214 zcmaFL(#)c4%*)HQ_Q15%Rg4S_j~S2v8<6b)#Ki>@l{I~G*`wGQ8B!TjSW?-tIGPz! zSX0<~nSp%vRCX|*1H?~fisDRVN#$&21k#*9SsW&uVKW)4OsMgZxSFb)6! diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 91a21bb6a473f4574eb6bfd186a1fe4aa869d9dd..3352808265215561b09d66103cdb42ed107b12ab 100644 GIT binary patch delta 503 zcmZuuO-sW-5Zz6h%_faj1&ba8(SrohOZ_^CSSyGir67ppBEcOsHEm&bMey4GfzXRL z&;Aq-{s4PZ|A;#lM8So5ynVyWo7sKyUc_>3Vj_I?AK{%d_Q`&olI8n0^m(zovZa_R z<)Y&!K4(Wvc}fhJ62RNC?~QatPC4`V@_Ba*w92I54qq-w0PRiLNYr9lV*7{ z4$!wUN&+fCdKL@`$^;PsIpQS2*y4vx5u3I^x~5X{`c|58G+c8UI|~TfTwGz=f%_ib zuK!&MY13qyR&OAr2I{TjvkdN03_8E=6n3BpJ5YoJD8iY-5zL^;Ik7=|@^waY9*%(g;u4?C;u1ei&dI!tPLp#OCE0j^ z1{U#7?q)O*W(6|YLFR)j;$Y-rEMlE}h0!yL4WtAlQN#fvK(a-gAc6}-aDxbD5Wxc? zAm+hYd>|G-kN`;{3v_2XL1%11UbpMC^fMp)iJ;`EHkwnXzwQ`C1a2xZ06nK bu*uC&Da}c>1BMVoG00IoOgxM{%tEXH1B*6` diff --git a/blog/api/urls.py b/blog/api/urls.py index bb432617dc..03740a857c 100644 --- a/blog/api/urls.py +++ b/blog/api/urls.py @@ -1,6 +1,6 @@ from django.urls import path, include from rest_framework.urlpatterns import format_suffix_patterns - +from rest_framework.authtoken import views from blog.api.views import PostList, PostDetail urlpatterns = [ @@ -11,4 +11,5 @@ urlpatterns = format_suffix_patterns(urlpatterns) urlpatterns += [ path("auth/", include("rest_framework.urls")), + path("token-auth/", views.obtain_auth_token) ] diff --git a/blog/api/views.py b/blog/api/views.py index 46c3e3e51b..a2b8fc763a 100644 --- a/blog/api/views.py +++ b/blog/api/views.py @@ -4,8 +4,11 @@ from blog.models import Post +from rest_framework.authentication import SessionAuthentication + class PostList(generics.ListCreateAPIView): queryset = Post.objects.all() + authentication_classes = [SessionAuthentication] serializer_class = PostSerializer diff --git a/db.sqlite3 b/db.sqlite3 index 367fe49692407456f611c8b6ba289a7cf1f50106..7b706a227638373d20a262e1d676041ab6535241 100644 GIT binary patch delta 1430 zcma)+-*3}a6vut->soQ>^$&i8ZfyC{Rc%PpUOREpY%5!uqzThB!6=%tsS9rG(F)d9 zYqr8u8ZkC)0tse`Jb^li$MJwHk%x(YV7wrPGzlccOJAmK+WQ9DwapSY@PK6>+2?%x zz2}_!V{=p9+>$T7DlJhIb(lQQE`Tm4(_rc5iR%KBWOEiL9vfnBvTJP4*2UjoE0<)c zaH61p*<5O_o-$W3#_78Iw)Vy9nX@WZGbya3uoh9$Z>o86PbyeZHT9hY`SGnCKdN;i zvszcNlEtc;tt+`q?nMGvC2lQqkO&0F`U)1o{BG!yq_MxHB(L`tKJUuf0|LNilP*(>;4$rh_ zdhiOMq5;j206g6nbn>KHR7ZA@6g&#cM%d@{R0@Mc4WUREY&&B-$2 z%A0w_vLzWECRgZ3GHOn~q^~P1zy;JSz_*ZrUy|=P|2zKE{I@oX8N~5TE)X!>ywEP0 zky(Im!DMy^#m#~V6?~f)_@yv1J8-R?%pTAPG+32u^V+CzQ)UOg*2(M>Kq7y6H@D8K zcVu>8O_|L803>pUr8(tkd&*PB?I};07QE8nWr$>8*J7Q>8q4y4C6Z|`<1I!hzSF$C zJjx7_+<8FPfB~c6 Date: Fri, 5 Jan 2024 14:58:58 +0000 Subject: [PATCH 19/38] Finish permissions --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3882 -> 3882 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1129 -> 1129 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 6 +++++- .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2361 -> 2361 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 0 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 627 -> 627 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 613 -> 613 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 841 -> 1020 bytes blog/api/permission.py | 9 +++++++++ blog/api/views.py | 5 ++++- .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 299008 -> 299008 bytes 40 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 blog/api/__pycache__/permission.cpython-36.pyc create mode 100644 blog/api/permission.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 54de79c2ba3f0ed3e5a71b70ef36526f4a146c3f..22822ca84e010fb8754fb127bfbf94b3e5f522d7 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=yT;hHg#y&3=+wF902 delta 15 WcmZo-Y+__L=H=z`Juqz|do=(X@dO(H diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 151b36de0b0f22f87e92a445dc32f00de1ff9781..72c2961bea55cd1bd82f6cd4c7dd8b7b6088f179 100644 GIT binary patch delta 25 gcmZ1_w@Qx7n3tDpf$)q}9`5#DEi?rJ diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 8464633ed82e7640c844a8bd26f4d198b9bdf79d..f79c82b1de0e293d1640f7e49a739b79acd3e9ab 100644 GIT binary patch delta 16 XcmdnbvY&=sM_CxQfe diff --git a/blango/settings.py b/blango/settings.py index b24170183e..3e77d63e95 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -189,8 +189,12 @@ ACCOUNT_AUTHENTICATION_METHOD = "email" REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": [ + # "rest_framework.permissions.IsAuthenticated", "rest_framework.authentication.BasicAuthentication", "rest_framework.authentication.SessionAuthentication", "rest_framework.authentication.TokenAuthentication", - ] + ], + # "DEFAULT_PERMISSION_CLASSES": [ + # "rest_framework.permissions.IsAuthenticatedOrReadOnly" + # ], } diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 506b82ba74c7512a6317e72a57c6cf63e210ed7b..e5b825635ecdfd9b35ecb5ad3230130a7e66ced4 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=yT;hHg#y#W9kMgy$? delta 15 WcmZo?Y-eOQ=H=z`Juqz|djkL*f&?l6 diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 0948e96b972220ce0fc25d304ec1d3be8bcacf99..db7d14c9a84ce2f8eed7f13f92b6f643051ecce3 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tEUg=@w}c6}BABpUn3tE!_rSD`?D{MKCe#FJ diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 68963bc93505b50d88e0629195c550699604e24a..dea16d9e8134231579f16c308498da88e045c274 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tEUg=@w}_F0SoA?ySo delta 16 XcmZ3;ypWmQn3tE!_rSD`?6VjFB&7tM diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 61ac7317c184f9dc9c21ae7cdad93a1a6db77b9c..a1671551aab28261f6f31c4ccfde5c1510c070b6 100644 GIT binary patch delta 16 XcmX@devX~pn3tEUg=@w}_T$U|C;kMn delta 16 XcmX@devX~pn3tE!_rSD`?8lh_Dz^nL diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 27f7f40085ed1446d180d5c5d92124cbb1d14b95..8d0f10538a64abb26f6390d6385dd590d02961f5 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tEUg=@w}c1?BwBnAWN delta 16 XcmdnMw}Fq{n3tE!_rSD`?3(NVCcgw` diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index a70ecb31d3345c0531203569f3814fe4545be1e8..c1d3d829cb54d19eac2cd51d2b10d92f3b785d6e 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=yT;hM3Ly`B*O9*hIe delta 16 XcmZo;ZewOQ=H=z`Juqz}dp#onAw>jC diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 071f7aa975c3df12f60387839cf1a5c2eb261504..20c4a85ff1c5c32c1949cb91ee48f7a33903c3a9 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=yT;hM3Los|;+ANT`@ delta 16 XcmeAX>Jef$=H=z`Juqz}J1ZvuBC!Mn diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index e1c8aaa0d3ce4617fa5d8a152335b3ea10067941..2d96233c35345212fe2496159faa1771d61533f5 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tEUg=@w}c6nw1A>sqK delta 16 XcmZ3+wv3J4n3tE!_rSD`?DEV2B%1^@ diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index ae36c79a6433cee6a5df15010ceb95c9e7ab9c97..62755c8c041d6732e88c47a984a6d171bdd40b6d 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tEUg=@w{_HF_(gbC{YB9 diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 1668e3663fe37296970b3a59026f2dc94b448ae4..4b103a21f1732cee1e45946d023bb70fe07052f6 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=yT;hM3Ly_FdNAHDlB6kF6 diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index beca2cfecc8c586c81e0bfeee83d1880196baa5e..f056f9d8f9da8860c3bb6244f1d2535ac9d9df8a 100644 GIT binary patch delta 15 WcmZo+Y++iC{=x}o?3Ha%3>*sjs(c+s`#lQ}6}Zxee^Pk#!i=W> zn2j*~y%SGN4sn9|O#Eo<%*|B-@hDTpy}`xY$7-I&n-R3<3;$)JoJ0~xO1ZhIQ44hh z#v>jEPv3X9-rkvfi((s67AglR{l1jB(N#uqB;`Y;vh|HUMEaHTEojo2K%ikdno5JO y_C$JUv2i)JNKEamhxYBpkvJ&IG*Kn!&BLtnwzz3XmJ0aBkF}(q_+zcBMB+bn+n`|p literal 0 HcmV?d00001 diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index 29fdbc5453feceb618d1d02c8ebb2c932d49dbf8..714193e00088f9c66efdf53ff5b5680909688422 100644 GIT binary patch delta 16 Xcmey&@|lI*n3tDpk;IIR>^V#TEN=wG delta 16 Xcmey&@|lI*n3tE!_rSD`>^V#TE&>G> diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 21a41ab7a6a00999a6467239aed66c65463a6853..176685d1b1e9a184814038170199f33c9f3caa45 100644 GIT binary patch delta 15 WcmaFL@|1 delta 15 WcmaFL@|1|SU?zmfMQ$~Z-g|dvcV-^Vmr`xc^X%)7_v(ki*b^K2KA>K~ z(7k?bZdEc_j74Gv7H6o<*iM|l;p{7uB`I#16pEj?H-*4M$C5TWHacZ=Mx?XNe7Aqq zn4D;xWydLOrZPIb*n)2=lv~~SqW>^e_xZqC*DaYu-5ssq`%oo}zn4G`)vyDh+ZQsj1zRJzK!)Lq_rVgq-1xciJzRy3KRdk@5-|_irfzrXy zBm}p)i3{kb|7+>erW@B(7DjQ~cfdj$YyzbKjR#zUM<^4Dgi%6)P$9fM_fL(H8b{Ek zHW6>{{_)!WXix^Fv%NzI^J}9yF?JBAM~$!-HU72`rCliIKaJV~KJ+If(qX@u^8Q{I9rySWHrR7OQ2Nx~9Hd!{xXN7)I561@-54 ACIA2c delta 418 zcmeyvev(bun3tF9Ec=Yqhl~sij~S2v3y|#q#KjR4m5sIB8B$nN*jgA;*isp@IGUNG zIDsPUDI7o%4xk7ZP=q^$Gnhe>YvK&Oi4VjkTQb@5a0KKRm-u8Bm-uONPYz*p5@ZFM zcS|g>v?L=nuOu@$v1IZAMpZU`plA{Qp6+vJ7JN~R#gu-S5p!zMRBr8Fni4&<$3kOO&`co=z@d6?c?ND-Z=X diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index ba26089c0b12b64b4b58456537ed1c764abedcc9..9fa33cb88b0ea06e9197d3acaf84620c7b41de2d 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=yT;hM3LorMJe9=ii; delta 16 XcmeC?=;mNI=H=z`Juqz}I|~Z{A#?-i diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 2545c723dc2f6870cc5fa6ade0f2ceb6fd382c62..b88b6348c479f9670afca9aadd051f3c5e0e2d5a 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tEUg=@w}_Jd3SCj|tW delta 16 XcmX@XdV-bRn3tE!_rSD`><5_uDZT|4 diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index b15342fc9e4ca36c1b5856dc44be4e49d35613ad..22a1e1bc2a900eb33459da5825e143b0bf8a9317 100644 GIT binary patch delta 16 XcmbQwGoOdun3tEUg=@w}b_q5BA*}=JAMBxVFI diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 229c9f8e0b15d7a06b12467c44d3ce3e814b4909..59b7a9b819586e0011b6f3bbf506a60060d8c0fd 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tEUg=@w}_5daTC&>gw delta 16 Xcmcc4a-D_Un3tE!_rSD`>;X&wDuM*U diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 9f061cf24433abb72f9a561efd80bc861eb0036b..49a5869009f9d4e007f752c7e2b45c74a7024532 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tEUg=@w}c1}F&)=H=yT;hHg#y#)Xox&yfY delta 15 WcmeBX>}F&)=H=z`Juqz|dkX*@_5?Nn diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 4b8a11e8a978ffe6feb48c7e73f60e14e11a0b37..0d59b9425900dded97c50d9b32e6273c74ee1a2f 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=yT;hHg#y$t{w^aH;D delta 15 WcmeBW>}6y(=H=z`Juqz|dm8{9Fa$gR diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index efd2ed3f9767d799094736fefc020acde40c8e78..39a46dfdf996d8c17182d51c8612a1c4046f3415 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tEUg=@w}c0*Hn`{&| znn|k}Gx_2R)Ji9U>2yX)3H4+1^J5x<7_ayj#Wu=nWH81iOPLyu(n9Px${$pzH7Z5r zuKuB}U0YqztWjx>l|pSDC(xOVprHXRT&-8DoJ&LOEJGzSLRQF8r8$e^f*78`*<46Y zL`7N>B;#aHb|k`au26&>bWa9`WN%!O9YeiCfys%`a4sIQbn-o6w>O)T$GLFO5}0hU z2C%=25z-{X`MmyNCYhY>5T;T>cc8};WnIyZ+}r|A&825db5U+ejL-?vhh1%{q`=65 z4ma;j_Io6*%Q4Dj(-F4YGo4~Z68qd;ai=dd+T|Dha;R@QD-Fo;PCn`NI=g#%Qv>$4 zmhpa4vf)%;l%KVU^q`QlPqE%K?u&PaWOJZ5I4lIoq+^iDWX@)NeKCha4vQimG5&fFx5T3= zHSh{}2T$NGT!Sg#;asU))qpOnvb7DTl#U-TF`H;3v^xAzat_6rRUjYX5?tH0PBGnLk} x=^po)_5dZ)82BIYALd`e-^!l`lnCLU?*5*McRI^yCc*ZW_e|Sc-ZR%M008Y>W Date: Sat, 6 Jan 2024 10:21:41 +0000 Subject: [PATCH 20/38] Finish related fields --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3882 -> 3882 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1129 -> 1129 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2361 -> 2369 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 627 -> 1014 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 613 -> 688 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 1020 -> 1309 bytes blog/api/serializers.py | 7 ++++++- blog/api/urls.py | 4 +++- blog/api/views.py | 15 ++++++++++++--- blog/migrations/0010_alter_tag_value.py | 18 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 0 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 2 +- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 299008 -> 307200 bytes 43 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 blog/migrations/0010_alter_tag_value.py create mode 100644 blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 22822ca84e010fb8754fb127bfbf94b3e5f522d7..ddd6afad74fd1ba9ae631b125c0d26b2c1de1f26 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=zmlbXm@0{|200>1zN delta 14 VcmZo-Y+__H=H=yT;hM-+0{|6Q0|fv8 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 72c2961bea55cd1bd82f6cd4c7dd8b7b6088f179..b887b552f51f21af385ee0b9b78c93937816910a 100644 GIT binary patch delta 15 WcmZ1_w@Qx9n3tE!O==^X3O@iIX#+R_ delta 15 WcmZ1_w@Qx9n3tDpf$&B)6@CC9Vgri+ diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index ba25c4d8d05b944f6e46e24c78bbac4cc58bce1f..f1d9ccf624afb7dc7daaaf5586ca11f52c621f53 100644 GIT binary patch delta 15 WcmaFK@sfkhn3tDJPiiAuG7A7A^aG{< delta 15 WcmaFK@sfkhn3tEUg=-^QG7A7Cr~~W( diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index f79c82b1de0e293d1640f7e49a739b79acd3e9ab..7e443ea65c3c4947c0d536715acf8b80bb5ffd9b 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tDJPiiBZB@+N0o&z2L delta 15 WcmdnbvY&;`n3tEUg=-_5B@+N2QUhcF diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index e5b825635ecdfd9b35ecb5ad3230130a7e66ced4..5e3872fded5b30d4264783219881a0eafc465034 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=zmlbXoZ2mlmt0?q&c delta 14 VcmZo?Y-eOM=H=yT;hMe`U4FB delta 15 WcmdnSv5kYxn3tEUg=-_50Sf>gt^-p5 diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index dea16d9e8134231579f16c308498da88e045c274..7cac866fb1dc84fdf6041c1d819b403290286d9c 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tDJPiiCEY(@YY{{uk) delta 15 WcmZ3;ypWmAn3tEUg=-_*Y(@Yavjc|! diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index a1671551aab28261f6f31c4ccfde5c1510c070b6..5e35511e3eadb28551c41fde2f82d48be35c4f7a 100644 GIT binary patch delta 15 WcmX@devX~Zn3tDJPiiCE31$EwuLIHm delta 15 WcmX@devX~Zn3tEUg=-_*31$EyV+0rg diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 8d0f10538a64abb26f6390d6385dd590d02961f5..76a9a52f5f0295ae86ed28da99eb0c53ddb7eb0d 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tDJPiiBZ7CQhOJefy=H=zmliJ9}#t8r!7XqjN delta 15 WcmeAX>Jefy=H=yT;o8W?#t8r#%L48I diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 2d96233c35345212fe2496159faa1771d61533f5..ff9c5df1da6ba0a7f2bb6b55e167c4ab414e1cb3 100644 GIT binary patch delta 15 WcmZ3+wv3IP4*(Yj12q5u diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 474c84038cd84eb6a4c3c4d3281782e2cb8ad4a7..44b4134d31fe14cc90d12acd998f91fbfe1f4f00 100644 GIT binary patch delta 14 VcmZo*Y+z(F=H=zmlbXm@1ppJX0=WPH delta 14 VcmZo*Y+z(F=H=yT;hM-+1ppNx0{;L2 diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 42d08fcca31c66a199fe7cefc1a0b4a1e74378ba..990162a62aff231154e15db95a2d38c2e784deb0 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tDJPiiBZ8WR8;WCG;? delta 15 WcmZ3(vWA7tn3tEUg=-_58WR8=7y~N+ diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 24941c6eb248ab8429ad5afe75ebf9efe5e54c79..4a3adabec4a3dcd482ec5ae6a168be173b2813ec 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=zmliJAE&IkY)rvn85 delta 15 WcmeBW?qy~(=H=yT;o8X7&IkY+TLVh~ diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index fe30b79e7a523ad660f65477798adb335ac8b200..29f4b577015dd3b0c9bf1c5ecd3a321e24bb079b 100644 GIT binary patch delta 707 zcmZ{hJ#W-N5Qe>8dwq9_FX29N+()=mf{(aB0)mtZ34}riiGoQaOVP<;S2;`ic+ zdKwDSOhtvLkm#roWeO`y5(THD ziHMK0al!I9e4Y!~CtJjZbMmUQpsM5&!u}goxT)7k6}I&Y(gKTa_1mhzB}FO7vt$$} zFCMuKxr~=CA!=|)?=06bTtS$K4t$^;(uFVdUi07nm~TMW=#mEfWNp|rKJ_ju(bZ)W zb1enWC9;Pak*lz74zHtF7@0^jRfY#yQ3!t#C0l78MS(niL>u0j zZf`?{D!GWtY@{k4m*BfOIQU~F6m`TE1V!`}3Tt<7$J@T|`Am5+PNc*?Bi9jE75v3# z`Ozdy$AXW7Oin%7fJ4?HD{#sjw}CxMPm?GTahA?^AA33Ql{v&w?wpV&99U1*aJIt8 zQz8Gm!Z*v^pR+gC~YPP>RI delta 766 zcmZ{hJ8#rL5XZfKpL2H!&T#~i<3hMQWROn0q*O>e1c)MVN}R^c$-%2TM`s&mZ6Fmw zN<)!`ZQv77Q&Q#&pi~t81~gRp0L-{akdk75J3Eivng1TTKi%5BM#I^6zVa_WY9@QG zDT?wCmsmw`C18;fs9f9CBNnL#EHEN1()X3XjEpVCGfT}6Cx0T$^;qd7;fL{zr;~gt zL$=Q9@*Dd+bT9}_Lj8X<=x8Bm2_0c$$w)n9ZRu+3-6izkt#(-C**MMKzw}x#k3Lu+ zT#!@k!7Z1}iv)vk8Bw-InTYfF9eR=XW{I=lnF~f)@iX;hP zuj&+w+VYdpY4+*50f8n(#rhq%ffgprk@uw6N~xy&Ypi}eB>?59gbsl|4z40fYqa^w zfBM7^OjK@~0bHZd8sR!3sJ|(8X0e#^XdLEHDM-(jwXIn(sl+OEfhOFf5)!wZ-w4w^ zKidf9fw|<7V5R*!OA?;u;{3nu$zNul_2jX+%UW`5ZLd-HrCtaQ=MMSX^5#wrDIL2r mq_Ln&xKEpbH&VE{M+uys?BlHM&2`5@sRzoh=2LAxOEt7=+ diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 4b103a21f1732cee1e45946d023bb70fe07052f6..d6642934c6bc4e0b45c55b4150cfa9a96460653e 100644 GIT binary patch delta 15 WcmeBS?_p;%=H=zmliJAE#tZ-$^8*Y3 delta 15 WcmeBS?_p;%=H=yT;o8X7#tZ-&rvp*| diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index f056f9d8f9da8860c3bb6244f1d2535ac9d9df8a..add016ba943eba3c14f75030922f8a8600337d16 100644 GIT binary patch delta 14 VcmZo+Y++uCT delta 14 VcmZo+Y++8nu5GE<=$FiNY?pE{#v{*ws7Dcu$jZq-z!i8W>+EGhcE-9l(*5nbo6n%oc z64y+9g-*SbqQoxJArkoMcszX~zwh*VI?aC+Kg};n$Sv8sIK(F~{09I{G_|Crf>Ml` zWpyN?E{-g(V-ZvGo@lP)YocRAza&?YNFkHx6f)^uCezs&DMr76krXtHy>XSY)unMB zru<{$TYP?k{1R)1D}vwzhJOiQh@hGX2JBQbU}slML^=Xy9*&UX?4I_3g$*pP_E=0L zxTYf3Oh;=b63u}pzI<`WGe0%03aOOJS}DW0ZgjP(jFzem`O+EHcJZP}Lnh@$)ds3^ zDWPs>F`h{IZKrI%;_y5nhDBpT0z6jxkO7NsHumC%xMNuF;Ln@#ys1sOgzq)w_r`to zTeURhXR9{r1|H42RNJcD6LP-22pqSY0EtJ)D2LlUhj3AFH$w6pVT^$3hY$AAGt9*R zI6Uf>(QbaA=M!8(NB`r>qb$8EohK1^bLYt+OYcd(s+?~-$-~I1A&gC}D!V9>e~*i8 z?Is9QgnOm;4vvaog~wVH@5$25;6)U7kPhdIVib;?feo%4^apzBP}wj>7w26w_`Wk{ sy}eTH+Vf!n_Y#gzv1J~F>^yPE{@6i6_O|c8ckpi$p8-rL+-#Qo1+){~v;Y7A delta 291 zcmeyy{+XrTn3tDpk;IJDR}2gckAWBtSb!`CATHJe5-AKRj5!Rsj8Tk?AU0DDQ!aB9 zGb4jLLke>WOAA8^ODba)OEYs6YYJ;HgC^TcpdJQI##`LQsYRKIIhj?dMa4iaOF({c zNis+d1}0lGX-~Xxl#LH4P{cQRHlx400FddY$x_4t65<3ATp$7@Tm(@DXYqqrAcwL7 zaWNB+;9vyv{WRGo=P+wH@cZVcq~-*}9RZfaX38xNo80`A(wtN~Mvze;GkF+!m;u43 BGwT2V diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 176685d1b1e9a184814038170199f33c9f3caa45..3f265c9f4a435b2301f7502f3d5296875a4f5d03 100644 GIT binary patch delta 264 zcmaFLvVm3En3tEUMP+7cJQD-MV+JI^4rDt3aq+B)%9d%lTv1$%45^GMtf?GX+|3Lr zY$@!$%s@UzDkqrF3FUL8a)J5WAbvV?6i+HkDo-;bkmdoZ=1FBr;caGYW&*PLQrWV2 zo0-y?%o(D1Quu=zGzBKEvyx@L#SxHST;h{iTyl#G#Bxb3NzBZ-#T8ndS~T&eyNqBd zkWs8}Q(RJHm6{8bvWwzREXa%p2~W0QG-BkNoXuFsRKzj)CZj$ZFVG7`yp#Eu93@16 WOaVq7AQWL1U=&~!Vc}q80`dS;{XK#J delta 199 zcmdnM`jkc4n3tEUg=H&hE&EB)>Muxu4aZ5wiNbW zW+0yoaKDmWai;;Kodd9-Zs!Td;JU}-T@k|b9augE+ VG6fiUfKY&0fKh~*gOLfy1^~k@C&K^$ diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index f29416e997ce16a47b4ecb5994f63e88012cd95b..dc8a0d386220f114c5172b6701f66c943b28379e 100644 GIT binary patch literal 1309 zcmbtTOK;Oa5MDpxIDRB)`anV;aX?79BnPetwW1QL1Z~x-9QI;DqP!N zz>S~4U-Fd`e}NM-cGI*~d&1U!p8aOVJFk5kh8}zU6Rs`BezQA|jq)}w{R2TTVMvx4 z+%QNsrI}gW%4}}edrP)5hdZ@w%Xa2+x0YM7lX={$Wk>p1z=K+D%P{NmuE9Ps;fl^R z6CE(7y(^3Nk@19&jE~G3G6Q4+5h4>JvyRM$=pM6S?+?bshDPO1AP1EudT3VN!$OzG zxQk`_9aPml(V$j)w6@6tzgs)=@@t_!7a~1d9H=9R#X&9?WI;ao-8=@Z(;_EB$jdZ| zOWdKt-_tuHOLMYID2U}_ps+e2qgwd)s$HB;At`lb#Zp%8`5e?jL#bR+ zZpHUvjuIJb4O(?bIhcXU(mJ(U1vZ~meaz>kaE;;@QyZwL;qPetwa8$cV8M#Nk;0`O%@)c-&j6REh+M-n9DHl`@tVCtv!`puy_;%zRIObo z<5cbsedVKv85l>bj78{nleOGIcrmplN$Vb2hqhp=9{W`zMd?4`Mx?{P_c$)z6y=m+ES4tJKi*rKELkeaW9_cocg^*BPq$W6;{&sA L1k2YRID^(dJDxVR delta 524 zcmZvYy-EZz5P&oLo7>$x^%PD-L==l_6n`2)#Lhxc!7h#5xlv9N_e@U2N<<$(Nu!08 zjjv<7t(Ap7frT?Gh=m*G<70N1ndB+?im#UI_2hc|K|Xtoy|F)EfWCoY`-q(7pqK^$ zK<+6|`@*l>SAh;iSb3l#9gDc~P;p%owaO!v=v1V@Hd!9${Fdch!f|%vi={fIYI%aG z1XB%64dv+`YiI8`mbIbeNAgsf-hoAL>=t%#|F+;J;Bkr;EaRekEDr{@^gBwG{Onws zODhK^a<4E6vHOI@sELK9>E^tZ7Dr7nED47MB0Pq>zPEE#qq2lR6^7cIj8G>u2q9sZ z;1fm&Kiz+Alxz$^KW&8g8B^u9+ry$^q#f)ZnvRwig*h?!?o5nzmHY5pZIO0WaWt=s zTq;|wAV#Z9r{A0JOQU<%_KH&zx~*UqB3A^{c*(n<1>C&^GpjWCzl}=1hCR=fTnAc< OE|Yl~;PElMX7mlXon}P< diff --git a/blog/api/serializers.py b/blog/api/serializers.py index 76084c2865..96157d8cea 100644 --- a/blog/api/serializers.py +++ b/blog/api/serializers.py @@ -1,9 +1,14 @@ from rest_framework import serializers from blog.models import Post - +from blango_auth.models import User class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = "__all__" readonly = ["modified_at", "created_at"] + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ["first_name", "last_name", "email"] \ No newline at end of file diff --git a/blog/api/urls.py b/blog/api/urls.py index 03740a857c..27f929147a 100644 --- a/blog/api/urls.py +++ b/blog/api/urls.py @@ -1,11 +1,13 @@ from django.urls import path, include from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.authtoken import views -from blog.api.views import PostList, PostDetail +from blog.api.views import PostList, PostDetail, UserDetail urlpatterns = [ path("posts/", PostList.as_view(), name="api_post_list"), path("posts/", PostDetail.as_view(), name="api_post_detail"), + path("users/", UserDetail.as_view(), name="api_user_detail"), + ] urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/blog/api/views.py b/blog/api/views.py index cd4b778bed..41bb4623f2 100644 --- a/blog/api/views.py +++ b/blog/api/views.py @@ -1,13 +1,14 @@ from rest_framework import generics -from blog.api.serializers import PostSerializer +from blog.api.serializers import PostSerializer, UserSerializer from blog.models import Post from blog.api.permission import AuthorModifyOrReadOnly - - +from blango_auth.models import User from rest_framework.authentication import SessionAuthentication from rest_framework.permissions import IsAdminUser + + class PostList(generics.ListCreateAPIView): queryset = Post.objects.all() authentication_classes = [SessionAuthentication] @@ -18,3 +19,11 @@ class PostDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Post.objects.all() permission_classes = [AuthorModifyOrReadOnly] serializer_class = PostSerializer + +class UserDetail(generics.RetrieveAPIView): + queryset = User.objects.all() + authentication_classes = [SessionAuthentication] + serializer_class = UserSerializer + + + diff --git a/blog/migrations/0010_alter_tag_value.py b/blog/migrations/0010_alter_tag_value.py new file mode 100644 index 0000000000..975552137e --- /dev/null +++ b/blog/migrations/0010_alter_tag_value.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2024-01-06 09:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0009_alter_post_slug'), + ] + + operations = [ + migrations.AlterField( + model_name='tag', + name='value', + field=models.TextField(max_length=100, unique=True), + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index f970532df0d3bfa090553b1fe31dd6ea263fd790..590b6db3d1590fff9540a9429d334dcc910eb77c 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDJPiiCENfrPh0t4Cr delta 15 WcmX@ld7hKan3tEUg=-_*NfrPiwgeym diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 9fa33cb88b0ea06e9197d3acaf84620c7b41de2d..158d1e87b499c16215668f11ee84330c4f5452cf 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=zmliJ9}$^rlv@B)kg delta 15 WcmeC?=;mNE=H=yT;o8W?$^rlxqyo|a diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index b88b6348c479f9670afca9aadd051f3c5e0e2d5a..3f306b39c584f5684fd097783b2388486d930438 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tDJPiiCEAtnGH#sj+m delta 15 WcmX@XdV-bBn3tEUg=-_*AtnGJdISLg diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 22a1e1bc2a900eb33459da5825e143b0bf8a9317..50450907162ad107c6fbeff7778792642699ea64 100644 GIT binary patch delta 15 WcmbQwGoOden3tDJPiiBZBpU!4vI5co delta 15 WcmbQwGoOden3tEUg=-_5BpU!6W&;=i diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 59b7a9b819586e0011b6f3bbf506a60060d8c0fd..407ada1fb466441c3c516e50a899d1c139d19fc5 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tDJPiiAuAQJ!}ZUbfj delta 15 Wcmcc4a-D_En3tEUg=-^QAQJ#0A_J@d diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 49a5869009f9d4e007f752c7e2b45c74a7024532..82d538d1f15712e44777c7b7ef896bd12e1120cd 100644 GIT binary patch delta 15 WcmdnMvVn!on3tDJPiiBZ783v)+ye0c delta 15 WcmdnMvVn!on3tEUg=-_5783v+kOMaW diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index bbbc9b1f54fb2fed15bef39d2259119972cf8d58..1f4e301c449d69c3bf975413e77c946bb85bfaa0 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tDJPiiCEA|?PF1_N6F delta 15 WcmZ3%x`LI>n3tEUg=-_*A|?PGx&xsA diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index a51471647cf1f9b98666b82e952bd5015198664f..5ff5b7ec866f008e99e1b6ed6f27c7c03b360532 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=zmliJAE$_xM))dL9t delta 15 WcmeBX?`CH+=H=yT;o8X7$_xM+i33jn diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index a7bd0be4a4401bd5e05d74923ccebb352f09eb34..6928b93a676ec39de0234316201a7076b3c3fac7 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tDJPiiBZ8WR8;WCG;? delta 15 WcmZ3(vWA7tn3tEUg=-_58WR8=7y~N+ diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index 51bc787943325c22d10f5baa32090822009a77c3..6612380d9edbc61481594df951ec794692a84c61 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tDJPiiBZ4HEzz_yZ>Z delta 15 WcmX@aa)^b^n3tEUg=-_54HEz#tOIQT diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..871653cdf3db47346d36a705afcb5d24ba75a73b GIT binary patch literal 576 zcmYjOL2lJB5OwS%KM7P~f#3j0NZI@Zu|h&nBm^tEp{r~x|35>Tj}xbM0%Z+i*8^|_ zuH-GNUV#;3w^ecEm$Aoh<~{rQ(NXpK$uInwF!qQ2H&Tj^X}YHbz#!3VOuA&`9Z%SM z1{}l>1_G0V_%1pD=|@&)S9F%u+*jk!TeS>kay}mopmzI^x*Zz|j%m6r0kSRu)^Vu% zq!XAPGN5vpA2yId4x393#igKJ0VOrL=gSYb)qT3truPrqwtXR$UeL_FgQi z_t_VvSG)r1a~g%I3#oDHmouNQ({R3GEl6&VC?_?dPa|fZ2Gnp;bDI&<<^*-=3mMNy z=_@ITvudRHzLe*y(t#INfHO{j(|$l_IT3yJCMbIsDq0aX%2T{p;@Vec#+#e^&FrJl zEWqEl&6ydo*&7&4^VQhTZdQA2c3Mrnp`YoSyE|^$_E~%5pG?c>c{_iz;Sqy&R}mB< rPt%0c7xz!<)R%Aw^|r8!N~5}%yi;-=Jtn>{US4~C6->Bb?Sc3Qx4M~X literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index bca1715417d3bc3bf8b14b6519405e70776071d7..9ec158e17b018e6944141665e88af72cd6596909 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=zmlbXoZ3IG(`0@?ro delta 14 VcmeBX>}F&$=H=yT;hM}6y#=H=zmlbXoZ4geJr0^k4u delta 14 VcmeBW>}6y#=H=yT;hM3=tv~DT!qV z%EM|%VQnr=`eReEHU6q%I?=>x6JJR+P)bXXN2!s-G+5W=6dpOusLv!}FP#!|8p7`Ksuh^Pbv@{oK* z24+J_3PDx2NS3;{#S^r9-7cry>9W`z7Q4r6_ZGWd#SV|v<@R{o&LS(%rMmsEc6E2! z?GAe|)OGym8^PnD&R}1t>&>J86dc1{YmdLsEZ1ex;ce*?duXna6b={;+%X#vW z)F*Yyiu8xvEM1XqOViSUSw}^h6sfcxA*I-7pbzG82A@-ms|>Vh0cY}0l;9F$OiUGf zdb0M%T*^mL2Co)jw}C2SC?%3-vw$~p#5Mr7;RTz%U<0RlUlO;)q3@)7QgT9m++I_^ zans-v-xWEbpWEWs_$Kl#t2b=?C=yZ*>n9rF5sEV&pghA5axzl+gjeF*;?qt2rXut^ ze-JNAJ4lsW;&uF?STB6T1-JlzmllMPh46!Lm7(Yid$8fB#jYa&nK6wkD1CsD3ca!xsC-_bX>hqS}zVznPD2ih(moZa`?wUY9!iA{$ zGa!mizD7I23zwCt4RVRhgV})OZBG76-kwbi-<6XMI29P?y~v0&j2*9qUhnL_(vG3W z!m=fEr#Qo^;k=<$RE3{}JaV19g=ge`xhCP``0vrLaZ|=c_#3?3DOUEyIL)Eei)zpZ zS`+n6pbQ#b#XPNB#RhtRg|SO3IDO^(W2Sb_v4!cIQ zQtc4Uxq-jL4cY-}UBWL>+bA;7i6z{Po3tu=egrl0&Y_pJO8Q^~l|#O6A4NF;e%dgG zs$m~JJBC{M3PEjg$0qd@%^pJ{-7}8T_}U@A=A&if$OX?)7L`da$87J9qkDAoXB?*6 z%lIJ~F4k&k;uMy ztRk&g$0Gf$5UjN04t|mj-^8~?n^q&JRoT1P<;3=Hck3LFC67k5YEjM32Cap52Ot$( zbn-ovOs4}-XEZn0A8Kl@&NIzI^il2%C{t&MP870ZOJR^bJ{3&xF)CvyZ^<)6x!6wZ H>`VLu;;Ko} delta 827 zcmXw1ZD>aHAB}{(EgFBAf*+m zeH*r_lhR9BkNy$C&mUtfDqj4d_`?mP;7pB4t9HtuV~jfMz>gns?nc~!^PIzT&VlD} z&fv4+!L!Aqr9}gbvGtaJG|-H|XE2cL`rch!ZE+vemyf3zO$x|Y#SX={_RL>pUO-63kR#YU+VE>y~+xaLFZrO^kdD!v#t z+Vdr^t^2@%MK$@xWZG)fBN(%h%%FFyDinmuv5wGT2qY#$=41$JDwh?pImUm{{?Zn> z{Dn&#efC-VUR#U$oyrRO*qkz>Y!yF?CQKM|liA-6@42vq-!bHEv*`=)D-{ENRWB<8 zx#>{%?tOc9@7v$gd8oVR|5#4ONxp!7c#0dL%AAcuMeijM#!6GnL+&WJOjrfr@n2xY zT<7*9u2-(FoV%Q#I{F-S{BPxRoYrz&*P^z1^@X}Yd9IwMz#tDA-y9cs0b)rR0aG91 zBOsKcENaNGIi27aAurKqw3gsjSxtx2*sjzLeJO+VYZ_OMr_n|oS@hDaG&(8v5Z^$6 zf*EXs8iF*I(ntndVL9E;;5x-W)GGZ{n#CwAGuyN11WIg!8wD->1^Tuim7nB3v*QFm zgLF9#&1TIAzX#yB3TNL}Tm#`T#ciJJJP)2LKZ&p@y71lp Date: Sat, 6 Jan 2024 15:23:50 +0000 Subject: [PATCH 21/38] Finish nested relationships --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3882 -> 3882 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1129 -> 1129 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 1014 -> 2552 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 688 -> 688 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 1309 -> 1370 bytes blog/api/serializers.py | 46 +++++++++++++++++- blog/api/views.py | 10 +++- .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 40 files changed, 53 insertions(+), 4 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index ddd6afad74fd1ba9ae631b125c0d26b2c1de1f26..7f6355270585cb3f0a8f23d83ecd1feed05b634c 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=z$NS!&6y&3=*m;-(Q delta 15 WcmZo-Y+__L=H=zmlbSJ+y&3=*0Rvb7 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index b887b552f51f21af385ee0b9b78c93937816910a..c55e66eaf59956d6d6264bab002e7c9e9f882351 100644 GIT binary patch delta 18 ZcmZ1_w@QxFn3tC;v|whc^F~fZegH6&1mOSx delta 18 ZcmZ1_w@QxFn3tE!O=?Ce&qhu~egG^&1VjJ; diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index f1d9ccf624afb7dc7daaaf5586ca11f52c621f53..98f0c4df7f20d5e3da9dfb4b3f6d26fb0b2d8b27 100644 GIT binary patch delta 16 XcmaFK@sfkxn3tD}BX#CR_9PYnDLw>c delta 16 XcmaFK@sfkxn3tDJPin?S_9PYnD1ih& diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 7e443ea65c3c4947c0d536715acf8b80bb5ffd9b..2e68758156aadaec484426885f5c7b3596399a4e 100644 GIT binary patch delta 16 XcmdnbvY&n3tD}BX#CRc6}BABHjbc delta 16 XcmdnSv5kY>n3tDJPin?Sc6}BAA|V5& diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 7cac866fb1dc84fdf6041c1d819b403290286d9c..5a5ae9669e5a1f2468f167c283e6f8c75d7bf441 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tD}BX#CR_F0SoAg=@f delta 16 XcmZ3;ypWmQn3tDJPin?S_F0SoAMyj* diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 5e35511e3eadb28551c41fde2f82d48be35c4f7a..d069c7c29c2ae99c8a34595147962effb0da5d94 100644 GIT binary patch delta 16 XcmX@devX~pn3tD}BX#CR_T$U|Ccy-e delta 16 XcmX@devX~pn3tDJPin?S_T$U|CIkd) diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 76a9a52f5f0295ae86ed28da99eb0c53ddb7eb0d..0c8d7864c63aeeca7eb02bc8ab40d3dfa58fee37 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tD}BX#CRc1?BwBFO{E delta 16 XcmdnMw}Fq{n3tDJPin?Sc1?BwA`Ang diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 14858f467033130c0d2b7431075050a9ebcaa667..7f6ab9412078b7dcdce1ee5f2b14595b7ed936de 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=z$NS(Qny`B*O9Zv(V delta 16 XcmZo;ZewOQ=H=zmlbW%Sy`B*O9FhZx diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 7569a78cf04a095aedcb85c9e3f4dd893d4dd236..9beead11ff9eeffeb3c5b6df8aa7d6d2c1c91cc5 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=z$NS(Qnos|;+9=ii) delta 16 XcmeAX>Jef$=H=zmlbW%Sos|;+9sUDB diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index ff9c5df1da6ba0a7f2bb6b55e167c4ab414e1cb3..dd201baf4ecd5bedf05413383503eca4e36caac8 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tD}BX#CRc6nw1Af*GB delta 16 XcmZ3+wv3J4n3tDJPin?Sc6nw1ALs*d diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 2064805641917f2fd3112670854ffc5afee082ec..b565d6948ac4f300422b53c6ea3348f987494e0e 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tD}BX#CP_HFobWn)Rn3tDJI&~wPH75WdQUiYg delta 15 WcmX>obWn)Rn3tE!Kw%@BH75WccLPrV diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index d6642934c6bc4e0b45c55b4150cfa9a96460653e..128f1cf2ac9709ae8aeae91384b3b88aaf2f8722 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=z$NS(Qny_FdN9)SbP delta 16 XcmeBS?_p;*=H=zmlbW%Sy_FdN9mE5r diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index add016ba943eba3c14f75030922f8a8600337d16..abc73a2844f0746ee235788036bb6f51afe55758 100644 GIT binary patch delta 15 WcmZo+Y++bLi9#MoERjI6kk*hO4hTgN2>}jSAvU~5Lc_$}cE%ZdyglP2 zYk9diQn-XWLi_;!QeQdo7dY|NjJ>uun?t;sn(pfEs-F73s@j{)X7D2WL;dP9_7B_m z*%;r(lm7-GndB)O@sM*Gi&TuP&>GpHJ#s>))LE%J@sYB3ahlAO z&O4T|zsd5#SP$ZX@$O`!ks24+WPgWUJvy=aSs2{LlV62UEaZ}f0=~Eu@Ff-^w4?<; zwrP>YgA*rPR>aE6+Z$Gt721-Ajug@wh|rZb>^QRv+jjQut0FdD6vb&8MW#N=WYSNR zjN-xsJ+0!R9Pf8L<44gr9x3b!q6qt@DUBOZbU2OEYDLrc7zc|gH7@L=GB-Y~$ZVV* z{mt}wte4`ykGqeuk?Qu~FY7+d^y7RI_f+>`8jlAVUfG}?smv@!BPb4R+MxeJ>6(gQtxbAFjE>zLj{;($Vj z(?l!z0FxT=DI!8`d3NCNHlFFad+DXY1EEQ`6*6Kd{Z55!36=eV^*IIZxgR<&n9V{8nPV)o7NKgD0?_mJuKz% z6V-9?R%ze($v7|KaZj1n6BK{4CnLyMzYBw5V|klWMdnwHpcX|vq;wud8`=3Dj?m3= zf|miXwg?~v4|t2aydh@S&WikA^&PJglHe}yp~wMV<@M{g?4cktw2K^$EMrfk86e9nhr0cN~} zjVtT`q$#Yz?u*BP{+t6}&al&w;L4w9<$qZVH2t60Sp10APlVhD^&EtMsx*h;Spes| z<$QNm-%aw}WL$y+)EdAV?MmsRTotBCvrI=-n=?+DJyqJ&9vn^77g{6lgYU^|HMaZU zdq?OG;KJA?#_Q~+*qQT17A444J&x0;^nVlT+=pOX@XNf-XIEE&*?VR486E6XoLmF7 zL6wiNa0Ab(4AXqSvtwEsWRLn9ZJJuDE(=JVn(1EIlk>7cYf8(C^6jeMM)9qf6bnvZ8iS|`_qKlk$W8;5T{l{>NAj+u;HTXr*5N)sR Jwrl4u{SR>JGClwR delta 492 zcmb7>Jx;_h5QRO7?Ks(u7DB}dP#PLq{yG|1fwoJ70=8h0LnNDRXtsbF355nB?f^9> zAuXcd0*I2CfDl645X+xlUS`J6%E!WcG+jy4)*7i>V|b^ay0TueKjGM@k@Q`v9T9iRK|(Y_5X) z>7NO7QP(G=gjuub5UTK0OL_jCCc{R`i)nBW#vx;v$IV*2bl7GGwmdzm_shxI@p4sb rW4)uJ+QAOJjEozXc6@GJcdM>0 delta 15 WcmdnMx`CC=n3tEUMP(z~DkcCQECbU3 diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index dc8a0d386220f114c5172b6701f66c943b28379e..7a27e895987baf1db1c5f0d41f6cc768fb24fdf8 100644 GIT binary patch delta 580 zcmZ{gKTpCy7{>3~Qp&Zo{3+mKVkE{e>!?N&6XQaN1c!4_%$=s#269D7To}+@(#e69 z_!;~tj5_-rd|x$ai1zaS^7d)(dEUDzo3rXxHp|-mCpk3;c_Y6bcqjW%@oZ8(Z3-f+ zP>Xb~M+P?{k9(9H5|I(?o(LvsH#gRK9u!+Rpg5ouKq-Qf6)q?)C_X49;k8IDH+gwj ztLaLI0EJ0&zuAii2XfE}!j@D)Ck*bAUHWR4@Q+fmp>0=eXtPkU1+XZiCM;zqeQk4e zMY$nUU9+1W6K=^2XM#eGHfKM+jhd|-v_li+B1}XPkwSQg93qck2p{n^#iA=?R{>zf zV3L7(OqfVjV48YzuDhe9q%>|>^2c+i0s^n#|D+Z8x(bC!-v?KyHELz$Oz z!=AcU8tB}=2$OexrYV*@8Wn0M&&GNiXXW0p9H>Cv%6jwYB#^^TpTCYbw|1hQxC!MR Tg?%yJf}`cAvsk`SUkg{Ts28eYx@ diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 82d538d1f15712e44777c7b7ef896bd12e1120cd..34d80f56ef7b6dae0ec9b7e56ffaddcf45ad162e 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tD}BX#CRc1 delta 16 XcmeBX?`CH==H=zmlbW%Sy@eS79i#)I diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 6928b93a676ec39de0234316201a7076b3c3fac7..09198c63d704251603ff1003d34306dbc4880eeb 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tD}BX#CRc2y<-AuI!= delta 16 XcmZ3(vWA7-n3tDJPin?Sc2y<-Aa4VH diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index 6612380d9edbc61481594df951ec794692a84c61..ad5465d15f133dc03af6c9506cc068bf49911afc 100644 GIT binary patch delta 16 XcmX@aa)^c9n3tD}BX#CRc55a8BkTj_ delta 16 XcmX@aa)^c9n3tDJPin?Sc55a8BQFEM diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 871653cdf3db47346d36a705afcb5d24ba75a73b..28c6e74ccb381a48a7888df84376dd36628f6e4b 100644 GIT binary patch delta 15 WcmX@Wa)5=+n3tDJI&~wP6%zm+!2?+U delta 15 WcmX@Wa)5=+n3tE!UU?&%6%zm+PXjvu diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 9ec158e17b018e6944141665e88af72cd6596909..f15c5b5b05097745c71c7eb036f5859ba8e879ca 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=z$NS!&6y#)XnodcNw delta 15 WcmeBX>}F&)=H=zmlbSJ+y#)Xn1_N^d diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 17ca4fd7686aacd200b1c4cc9ab37be3bfe515ee..0cafd3ba6920b17141c3220019719e7779497551 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=z$NS!&6y$t{v*8`sb delta 15 WcmeBW>}6y(=H=zmlbSJ+y$t{vKm&OI diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 088256ec048401322d85aa2b6c33e9e4f76fa18f..ad21d04962270bc2dd5e6933b2ea2f507d38d23d 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tD}BX#CRc0* Date: Mon, 8 Jan 2024 15:42:09 +0000 Subject: [PATCH 22/38] Finish browsable API --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 3882 -> 4045 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1129 -> 1501 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 9 +++ blango/templates/rest_framework/api.html | 17 ++++++ blango/urls.py | 34 +++++++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2552 -> 2552 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 688 -> 1258 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 1370 -> 1370 bytes blog/api/urls.py | 28 ++++++++- .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 307200 -> 311296 bytes requirements.txt | 55 ++++++++++++++++++ 43 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 blango/templates/rest_framework/api.html create mode 100644 requirements.txt diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 7f6355270585cb3f0a8f23d83ecd1feed05b634c..588e2c9982cf29e82a82b0188f2dcfbf4bb1c444 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=zm5|}fQy&3=)#{*6P delta 15 WcmZo-Y+__L=H=z$NS!&6y&3=*m;-(Q diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index c55e66eaf59956d6d6264bab002e7c9e9f882351..77b1d1c77e5e5107a6f01532ecd976b94a9b7865 100644 GIT binary patch delta 479 zcmYjN%}x_x6rJzubRc8e5MltSwm|tC{-KIm6e(q>BU+?0g>W~`$oUusV@sxWQ8#@C z(`_F>O-xM61NZ{G!0e1WcfNt2v*IS_=G^4mb5HKK^i3w4OCo~+)9H9cc7lVVUjB^~hZGhVfH%|K3Y%`|QAcFH++iiONKWbGIbk{bE)r#eu*7nSO zt86*eVc90lz48x4n-YbOt&2wBe{x%XqaJD(!i5NoSg5wzS0YsF?gtTazaISmHpSn$ zP5;c`VccoF7j=s7Msu!Txbv5%XvjV(luBl$W}A*)W()aX=H;d*o`<5|!@px=__v|_;A%4WaO0pj?_m5A;`-4hS3K?XP zLmmYfDnj!p(gI3u3}sy?i6|HV%7{-0)BzEGY?njcQX`8zF7&5dK>cD~oL=@BwiLzJ-%gw!UY&mgswiA&h zLpP)#kXIH)HYWZUOH52GmG}>MZH$x!Tb6(CJ!@Ql~TU;8G@1^{1i4G z75NE%{)bPUaK!{BxzePnSBZcuyR}JOucuse_a_a#K?G<(-8o<-rm!-rtVOoP)HT(c zAhT^KIET*B9Yx*&;v74zly_4;NqG;7ta?XMu7QFcjn&!yTEsr9L~LZ@0aTn*P+4Ro2_k#wkvq>2#Qe;ZE0-wUcoz@=!oE=XAA?guhR19Vi0D zBuUp)X5^L7??!KkzUq@$;$Y0oV4R>ggQ+>Q5mgHU!yk@eVj6QB7R%DWHK&%RJ$-qt z)A@tt9)dRVxR$jKT+ix@aXzpE7j%`u$PC@Um;?81ZyGBM{2{kz0Twqneqk2gx;7a` z-^u;eTYq6%7VwL%E@g<8%Fx95jliCO7Y56nzpFXR3}>OeEExua+t4zMi+(TqMt?uz zGM;}dGd?ojnZCt~Sn6B<%JU?N&+*;}aqfCL@^ob*V)RAqTqbuYmP|hl9V;Psac=_P zQ(u=Bb}%+VJI+758oYk-Rp31|^Imi>J|;KOd9JZb%VL?7DJ3~V@hwm}dY)^k6^c!i Jpd`uo{{zLh!utRK delta 353 zcmcc1{gOl3n3tD}BXwr#6LtoM#|%h-AINq9;$oAD%BA(G94YLnY*`{%qRmV|Hb*LB zmROcJn9T`hOMuy2shla?&5U3+PbxQ1jbsXM3STcXP!C9sA1Wu1%9|yX%AX?G%a|gB zMINM97^)V;c17mE*djm)QIMi^o+#;5mMobGj70{i(m<=kQaMwZfKCO;F`6?(NvALd zGiZuW-o_X;c>>crp7{8b)TGk%_;`Iy*~y2QKTiI@qO8RU^z1G6#Nzm}%+&H*+@(c1 z1&JjksYQ9kw^&_VokHDLG8D-G)fCB0c4M`dv;Z + Blango REST API + +{% endblock %} + +{% block style %} + {{ block.super }} + +{% endblock %} diff --git a/blango/urls.py b/blango/urls.py index d98d043e08..2121493075 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -30,6 +30,20 @@ logger = logging.getLogger(__name__) +from django.urls import re_path + + +from drf_yasg import openapi +from drf_yasg.views import get_schema_view + +schema_view = get_schema_view( + openapi.Info( + title="Blango API", + default_version="v1", + description="API for Blango Blog", + ), + public=True, +) @@ -56,6 +70,26 @@ # path("post//", blog.views.post_detail, name="blog-post-detail") ] +# urlpatterns += [ +# # ... +# re_path( +# r"^swagger(?P\.json|\.yaml)$", +# schema_view.without_ui(cache_timeout=0), +# name="schema-json", +# ), +# # ... +# ] +urlpatterns += [ + # ... + path( + r"^swagger/$", + schema_view.with_ui("swagger", cache_timeout=0), + name="schema-swagger-ui", + ), + # ... +] + + if settings.DEBUG: urlpatterns += [ diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 4e12d08594c72bd2efd55005542c3417c81eda78..8e9502efeaf3d85440d90cfbe62712c3bb1de0fa 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=zm5|}fQy#W9iSOZ-E delta 15 WcmZo?Y-eOQ=H=z$NS!&6y#W9jDFclF diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 55656afbcd4f597d97ca91c98dec580342db1ad9..49940c4f911b4d708f9fab0a20020e14db26d5f8 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tDJOJL4Mc6}BAA>9L< delta 16 XcmdnSv5kY>n3tD}BX#CRc6}BABHjbc diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 5a5ae9669e5a1f2468f167c283e6f8c75d7bf441..375a60bb8b2a7d13b5284a9e82313f574669e329 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tDJOJL4M_F0SoAFcz? delta 16 XcmZ3;ypWmQn3tD}BX#CR_F0SoAg=@f diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index d069c7c29c2ae99c8a34595147962effb0da5d94..3fe90bb72287d2337ac518590e71baf4af178858 100644 GIT binary patch delta 16 XcmX@devX~pn3tDJOJL4M_T$U|CBOt> delta 16 XcmX@devX~pn3tD}BX#CR_T$U|Ccy-e diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 0c8d7864c63aeeca7eb02bc8ab40d3dfa58fee37..c975b77906a203104fbb2489d328bae3d8e8b7c6 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tDJOJL4Mc1?BwA;<%n delta 16 XcmdnMw}Fq{n3tD}BX#CRc1?BwBFO{E diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 7f6ab9412078b7dcdce1ee5f2b14595b7ed936de..f8c125506ab50ffbc70ba244b7abdd41133b177e 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=zm5}31*y`B*O98Lp& delta 16 XcmZo;ZewOQ=H=z$NS(Qny`B*O9Zv(V diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 9beead11ff9eeffeb3c5b6df8aa7d6d2c1c91cc5..44ef07a5cd6a6084449dd26a4bd4490bdaeae52b 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=zm5}31*os|;+9l8TI delta 16 XcmeAX>Jef$=H=z$NS(Qnos|;+9=ii) diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index dd201baf4ecd5bedf05413383503eca4e36caac8..ccb61318c09e076d759f928a99b570b914552f0a 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tDJOJL4Mc6nw1AEX0k delta 16 XcmZ3+wv3J4n3tD}BX#CRc6nw1Af*GB diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index b565d6948ac4f300422b53c6ea3348f987494e0e..a743dcf2a901f5c6c9b2051ea918c1ade52d626a 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tDJOJL4K_HFobWn)hn3tEUR$$IXb}LQ*CZ7Z; delta 16 XcmX>obWn)hn3tDJI(6nob}LQ*CEx@Z diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 128f1cf2ac9709ae8aeae91384b3b88aaf2f8722..a7a233267345fa74fcc7065634edda00bae8c5cd 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=zm5}31*y_FdN9e@Ly delta 16 XcmeBS?_p;*=H=z$NS(Qny_FdN9)SbP diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index abc73a2844f0746ee235788036bb6f51afe55758..4be4758c4d90c68b45c8c03f25523ddea0857e2f 100644 GIT binary patch delta 15 WcmZo+Y++bFZ%NxtgzqU!|>wm5Tn&{78Q*lJrCR z@6iE2gE!tpw_E!+L?Q)W3XqKgY~#SN4J3h9^vglTuH;ztt3l1KoKhWQppz zu$&1!**2*{%`t-0gz^=N$?6!5G2lD2=q&*<$X(j-mSN0$6GYZ#jn_e2Ae8>byEVzc@K~{USBDAMfn!v^o)CQHw=w z7^gkjZC`*9dB}ZH91P$2tTSCl6EEF-8(+D-9_0_7o;`tC0yo*eY6#X>m_yOB_7IAR?9%dk)}`*pt2>3wXi3H^#CeVED_GNEP|z-NhX wKo`C-eS;77_W;&W8KMD^otli1f-po8&m*l+M|IRtG~i{V=eiD=EMG={01_(QYXATM delta 200 zcmaFGxq(&1n3tDJI(24hJQD-MV+JI^4rDt3aq%pMi7Ivpsf;PCsT^6{%?v4QDeS$> zKt4w*Cz#I(<#VNSf%)7ZemZj$Pby0)PctKs<^ihaNo7jmZDwp{0nbMie z8KQVn_=6cV1txnj#!k*;>SgxRJ delta 16 Xcmcb`b&HGLn3tC;v|#2&_Fz^3Df9%D diff --git a/blog/api/urls.py b/blog/api/urls.py index 27f929147a..431108e62a 100644 --- a/blog/api/urls.py +++ b/blog/api/urls.py @@ -2,6 +2,22 @@ from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.authtoken import views from blog.api.views import PostList, PostDetail, UserDetail +from django.urls import path, include, re_path +from drf_yasg import openapi +from drf_yasg.views import get_schema_view +import os + + +schema_view = get_schema_view( + openapi.Info( + title="Blango API", + default_version="v1", + description="API for Blango Blog", + ), + url=f"https://{os.environ.get('CODIO_HOSTNAME')}-8000.codio.io/api/v1/", + public=True, +) + urlpatterns = [ path("posts/", PostList.as_view(), name="api_post_list"), @@ -13,5 +29,15 @@ urlpatterns = format_suffix_patterns(urlpatterns) urlpatterns += [ path("auth/", include("rest_framework.urls")), - path("token-auth/", views.obtain_auth_token) + path("token-auth/", views.obtain_auth_token), + re_path( + r"^swagger(?P\.json|\.yaml)$", + schema_view.without_ui(cache_timeout=0), + name="schema-json", + ), + path( + "swagger/", + schema_view.with_ui("swagger", cache_timeout=0), + name="schema-swagger-ui", + ), ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 9e6395fd23c35e3260ed59302ef51ad492a15d09..a0ea1284e08150b32f422208574b4e475a7e90f0 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tDJOJL4M_7f}sCK&{2 delta 16 XcmX@ld7hKqn3tD}BX#CR_7f}sCmIBq diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index d24d30ce687e2620517ac33cd2db029d9afe7a2b..c7033d8b206083df201d56425ffa7b046eb0eafa 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=zm5}31*orMJe9DM^D delta 16 XcmeC?=;mNI=H=z$NS(QnorMJe9ex8# diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index ccbbc75b8e385fc403a2da95a1cc4b4895d2d434..543efb473b6c626d88ad10d1bb258b2b876eb859 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tDJOJL4M_Jd3SB*z3w delta 16 XcmX@XdV-bRn3tD}BX#CR_Jd3SCCCJN diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index aa6d38ce474a232a31fe6ebaf80640132d085495..9944792d3942ac20d03aadb99b92544258253613 100644 GIT binary patch delta 16 XcmbQwGoOdun3tDJOJL4Mb_q5BA8!L; delta 16 XcmbQwGoOdun3tD}BX#CRb_q5BAaDbb diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index a99eb3b8de9eb714a48d05432777b0f092e3b62c..230259b821a365c9ada52a96bcee41a1d2065fbf 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tDJOJL4M_5daTC5r>~ delta 16 Xcmcc4a-D_Un3tD}BX#CR_5daTCX56n diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 34d80f56ef7b6dae0ec9b7e56ffaddcf45ad162e..2df1aec9fb8166ec25a9e30126391516466bfb9d 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tDJOJL4Mc1 diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 09198c63d704251603ff1003d34306dbc4880eeb..a279ccef45d33fa24994664f326efbcac27a10c8 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tDJOJL4Mc2y<-AS(lO delta 16 XcmZ3(vWA7-n3tD}BX#CRc2y<-AuI!= diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index ad5465d15f133dc03af6c9506cc068bf49911afc..1624ac6bbe9be65490b09828afc2be57a085a627 100644 GIT binary patch delta 16 XcmX@aa)^c9n3tDJOJL4Mc55a8BI^UT delta 16 XcmX@aa)^c9n3tD}BX#CRc55a8BkTj_ diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 28c6e74ccb381a48a7888df84376dd36628f6e4b..952bf5f84bbb487651e012789f45ddde3694ab09 100644 GIT binary patch delta 16 XcmX@Wa)5>1n3tEUR$$IXc1tDzB=7_S delta 16 XcmX@Wa)5>1n3tDJI(6noc1tDzBryZ? diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index f15c5b5b05097745c71c7eb036f5859ba8e879ca..f77ee2b83f475979d12acd727d601cff2a200b87 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=zm5|}fQy#)Xm%mZlv delta 15 WcmeBX>}F&)=H=z$NS!&6y#)XnodcNw diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 0cafd3ba6920b17141c3220019719e7779497551..d651791ef734beb7ed339287449bddad8e0a1a7e 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=zm5|}fQy$t{v1_N&Z delta 15 WcmeBW>}6y(=H=z$NS!&6y$t{v*8`sb diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index ad21d04962270bc2dd5e6933b2ea2f507d38d23d..8defe0aa34336db4259e35cabd21847b03ef1d54 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tDJOJL4Mc0*;#{ delta 16 XcmdnNwu6n`n3tD}BX#CRc0*I)+0!y9rDT6c}zS%eoPf zqKSPa7-PsNHs+dW%))-S{j;no;r*r2ME_uFq|gByBkLc=EdC?vvL%KvUvd7qc$0H- zbI<4A^Ue3%WYLsNK9$~HIYv>`K`mTbV2VO@lP|c?Sho8U!4%Stwhn5^Tw~C(1P?N- zv5TgI@F1&<18$Tu@0qQ;d|i_4ayvz*+a^jj(Pxq5fXf|ldhC+ymz=&jG4r?i8OxI} z+3uG;ZrPg~F<+`M91)ECpZpBJ$bZW3%PL#>OoP3R4nv3|`8;f6YD3VtxiypY0OyASXMj53qT1nFFcdR-`?tBTr4?KrMh+djfqnav)Lc1$DMXkytS#osne>w^_r z%AYS|*kV?>!R}7&VwslFXn3$cKAd>_M9*=_+kFBb0r31Be6ukL~OG- z*W7Y;U?>oC#v`5s?+gx}^zZNKi$w>951op>)#PgK6;Cz|4fn)cvF84`=xua%{5K@0 zvoxf~KKR^T(W5f6_>s=U@*9-!vCzbC2&V+Aa7R$H$~}J1v(SS6PZ3*!h+!66$o{+d zD`17)DqF-m1#2yY(UUu~r7|(z&`dh^JO0da5g8{VEQ2&_!zx!#-xn^65TA+AI-{z) z4jVfhMzl`p|I&Ypf5Yd|IzPp~YIwKex$=gx6xX7gU@pCu4F zL6&d9UNW}=R@HwSIuX~-Rt1A-G(qm(f^B4G1*%byTUV=X>VDWRZFjNDw$vgOX+sq7Bi%j_6C?n#dBx67Z$o=?qdj~k57T*_{IrszbFbN95z>W%mMJM3HCZN7$_ey3*dcyl3ieMvvkP3 zq2-Tg*6t^%agsgk?K#CRsk1ZoRp4es^QlT`Ie0aY^Viq4`BWd5TCeL2TI7&8cYyEq`?;_dBY!JbdyIMjJC%vICV7Vv&k+Xm&hV%#>)8?We=_Py51zvFM= zoH#6=30@9-%YOBr@!f)Z(4!oekG|-4)9&-SHJS%^gchpULd9G7jUXy67hHMg5 z`~aS#OI7^c?{0CQ)vf*g;J#Wb#-uqqUHJ*yAxBg1v3Ti+gjTzUDY}eF+~sbgx9{Ly z=%A%Lco_O=WEF?irzT!<`)Ga@d!fzyZ511UyS7_6Tftd%t7g5Nq5JQ$7=2a2R&{8i z;O6Pi3U`k6v-QYi#b%%5-pNEr3sTGXTR25bFVi99d zpvfhCqy~K6zl*pVU4ypNzp4YvxEV4uHVXCRoM!dw z(j;u4wPoyqL26yWK4|pbSV6&{t_(8|n&!ZqH+jmCmaQ)@VB Date: Tue, 9 Jan 2024 13:32:19 +0000 Subject: [PATCH 23/38] Finish viewsets and routers --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4045 -> 4045 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2552 -> 2859 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1258 -> 1581 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 1370 -> 2683 bytes blog/api/serializers.py | 5 +++ blog/api/urls.py | 22 +++++++++++ blog/api/views.py | 37 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 311296 -> 311296 bytes 41 files changed, 64 insertions(+) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 588e2c9982cf29e82a82b0188f2dcfbf4bb1c444..c404f469f65c03f043f379943255aaeca606934f 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=zuATg1x1^^ao13v%& delta 14 VcmZo-Y+__H=H=zm5}3$V0{|1P0re^#E&n3tDpgTzL*re^#E&n3tF9q1Z;Y#P7J-2{mM delta 15 Wcmcc1eV3cfn3tD}RdgfUbyff&%mdp1 diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index c81cb51f12fef50cac5ff06ea9e6caf5c487c804..902527b112cc4048c3ae1fa9d5b041d0cbf9df1e 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tDpgTzKQOC|sypaY%& delta 15 WcmdnbvY&;`n3tDJOJF0LB@+N0R09wI diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 8e9502efeaf3d85440d90cfbe62712c3bb1de0fa..97a521af76ba84e3b95750137d995a88dc9d2f79 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=zuATg1x5daqQ15N+{ delta 14 VcmZo?Y-eOM=H=zm5}3%=2mll`0>A(O diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 49940c4f911b4d708f9fab0a20020e14db26d5f8..ec22b5b5a32f9e1f82635a58872c3e0ebf2a1926 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tDpgTzKQ0~P=u`~!^u delta 15 WcmdnSv5kYxn3tDJOJF0L0Sf>eumb-8 diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 375a60bb8b2a7d13b5284a9e82313f574669e329..8aa07a92157c53afd90e27a9c712ae082ee9186c 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tDpgTzL**^B@l0RzDR delta 15 WcmZ3;ypWmAn3tDJOJF10Y(@YYwF5H% diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 3fe90bb72287d2337ac518590e71baf4af178858..551bf7dc0ca51cf42be20a2ec3ddd20a00bace77 100644 GIT binary patch delta 15 WcmX@devX~Zn3tDpgTzL*6U+c3u>?{8 delta 15 WcmX@devX~Zn3tDJOJF1031$EwWdp2*8^|> delta 15 WcmZo;ZewOM=H=zm64=Przz6^rivr>R diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 44ef07a5cd6a6084449dd26a4bd4490bdaeae52b..59afa30558394d0dffdea2b6eb4a0ff951726cb1 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=zuAhD5+jS~PI83QN) delta 15 WcmeAX>Jefy=H=zm64=Pb#t8rz%>tSL diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index ccb61318c09e076d759f928a99b570b914552f0a..3475dfe1b83af706a7d72fac9b8bddb358f3b21c 100644 GIT binary patch delta 15 WcmZ3+wv3IQ3 diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 9f4bff3c1b8bb23f8564f748cbdd1c9a47676dcf..6f6aef6e7331158c66131caf5efbc97307f49a68 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tDpgTzKQH6{QaW&>pa delta 15 WcmZ3(vWA7tn3tDJOJF0L8WR8;8Uoh< diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 842f8941f72c9fd37abdae4ab7dd1ce57d84b16b..34dd5e3cc29fdf1bc1cb8d25f0d0b35243d9b071 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=zuAhD6Hoe=;VsRM-o delta 15 WcmeBW?qy~(=H=zm64=Pr&IkY)T>|$2 diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 303b64e77c95ff8d819c26313e66e94ee8edba60..bc66823508ec788e057efe91d8811cf6d62e33cd 100644 GIT binary patch delta 15 WcmX>obWn)Rn3tDpgTzKQYfbobWn)Rn3tEUR$wEWH75Wd^#hCm diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index a7a233267345fa74fcc7065634edda00bae8c5cd..a6640357ef17b634e8866af44e9774ab78c8bda5 100644 GIT binary patch delta 15 WcmeBS?_p;%=H=zuAhD6HjTrzN^#hCm delta 15 WcmeBS?_p;%=H=zm64=Pr#tZ-$sRI50 diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 4be4758c4d90c68b45c8c03f25523ddea0857e2f..f5016cc3cefe1fa6012b78a20d8bdc207f45b684 100644 GIT binary patch delta 14 VcmZo+Y++h0Ik#K*`|LqRhmc z%&OEPJ>S%l#3Bx$IzLUeB5ojE!~-IDK?KWWYi2brYap{2*K0Mp73O8@`> diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 2eb1cac5a575a99322a0dcd2eff7970b35524b16..1154cda6472f170ec608850e6f66a5ed0a7c6348 100644 GIT binary patch delta 617 zcmaJ;zi-n(6u$FaQ`@og(@B#wZCXMBx2OvP5)u+1CI%EyV7R43daqI4SfOV}9XoiA zMCB1x%nY5_SolB8$i`p6v+IEYai_cYecwHO@7>*R>&6*Ba$WnylWTmq&e$*Z*RTmc zqZNI>8lPW=P1WQK7+CZ5&{SqR>16f`hHZ z;H)hc-I0t&|O^$H9!sjbN`( z4Y&vW3E9cV>>oz=(V+Y6l(zqE@YVsUN6deazT%(W`8;!9;>mP5kKZhoF=}7x3O%`| zzhK&=EwkTFXYWt(;s|436q0sxy*gP$ae44Mlks#GWosWvi@yEj36~l3che8z%Tv|W z7{$jYdK%)zLZ2P#qEe)tyhiS&Yq_DZh_cG^NLg1n3tF9u-Kf`k1Pxfj~S2v7m)1$#KlSzl?&^m1XB4^d9wslI8(S%xKns~ znNxUE1+s*)gj4vM8D}%3@XuvV5l9j2WsVX_WlRxD<;W6kW=IiE5$RKzG$70S9C6>Yw%%G_>`4Qs;M!(I+nVK1yG^Hl{vCL<= r#gtz>S&KEEb0tHOBG7+Dij!xsItp6>nF5SFKqvx)Aev+H4_0je&EY~0 diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 1ae39038139858a7528c08fe99ae9754ee1ebc29..816da403287e30d00ed9de7e06a0818b2789052d 100644 GIT binary patch literal 2683 zcma)8OK;mo5ayB;MNw~Ae#VZ~CrUJsQMA1kf!zcs475&QJ2~t{V7P0UGASy%bX*(G z$-d?%^atcG?X{QoFZ9%zrEE%qQc-`DHj$NfL}U#?;NY0Nw}%y(hP zC&VzA!ANW*gc5>tGd2^8T8T|A4eElNzn*c{#2p z4cgFixA<1lq)pAMAdCYkxfB%?b|zdTkw)%bfDow` zz&edfF8FAOH4td>Pk-k$P54d-@kn*3iU#al zh9S`-mw3d1pXNS{Sr60-%m5>smqyO049Edy)SIH^6(KzEtD*_JL<>n9iGySX34$a# zNS2Uvkzg#vDw6wS<+F9M~3k3i)s7*lrj zFeDZphF>6O&N-~QT^RC9Acb@Dp=X4dw+5{+3yQ^7RSf^s&k*YkAADOdp23g^=e031 zn04leMg}#OnYi^p*)bHEazep_jQgf|44MKX?pw+ULTny+;bWd)pOHL1nMoDQ64f2@ zY_M1;KY~QZ!GMF>th#&`~gS-{%mIO3L`^+pIOZQU@@0Dtb9vupnI_rAX?E8RTiA@ z_^N{^mc5H8JMBR??m;#Is^x@34`)(2OgCL+V+%V7FuxVo8ZjAR%E;>*Y?Q1!KP^+9ILY6(DdM{FqNGI<4aWz({aXs&-{||5c9l2>WHe+ z1lT%Jb}hO!Z@E8z5x^mR&f*h8*jC2+~6ei{Vl;7A-u_5WMRx?|q VcK_>=mbvD%td7@l^sfRk>tA_9QG);g delta 485 zcmew@a*IpFn3tEUR$xx*Towj~#|%gS$Y*c>;^Jit6IJqT+!<0hQ@C0fQn*qXvjm!% zqXdB>+$lUj5gwq35Ku%ID8ie<2NdB0iiiM3L{s>K88ihZhcGUmY{B$^O%!Nek?3SO zW)pF4Ad?qlJO_~AVB}(C1HvNi$(hXl2|OTWAju*=5Wxl_gh2!=h~Nhi0w6*VL~wx! z5fA|}9nKO1vBZG{2p5A4;Q(5}#aJW`v_yTfJ&Q&?nnmm&9cadboL3|SB0vFx+ad{| ztSk^iEdu$c2qfmGDHg?7lv-R8pH`HZn_8Y+R9Ez|A IaS5>j028oHrvLx| diff --git a/blog/api/serializers.py b/blog/api/serializers.py index 697439605a..0217341e36 100644 --- a/blog/api/serializers.py +++ b/blog/api/serializers.py @@ -54,3 +54,8 @@ def to_internal_value(self, data): except (TypeError, ValueError): self.fail(f"Tag value {data} is invalid") + +class TagSerializer(serializers.ModelSerializer): + class Meta: + model = Tag + fields = "__all__" diff --git a/blog/api/urls.py b/blog/api/urls.py index 431108e62a..544054eec1 100644 --- a/blog/api/urls.py +++ b/blog/api/urls.py @@ -5,9 +5,19 @@ from django.urls import path, include, re_path from drf_yasg import openapi from drf_yasg.views import get_schema_view +from rest_framework.routers import DefaultRouter +from blog.api.views import PostList, PostDetail, UserDetail, TagViewSet +from blog.api.views import UserDetail, TagViewSet, PostViewSet + + import os +router = DefaultRouter() +router.register("tags", TagViewSet) +router.register("posts", PostViewSet) + + schema_view = get_schema_view( openapi.Info( title="Blango API", @@ -41,3 +51,15 @@ name="schema-swagger-ui", ), ] + + +urlpatterns += [ + path("auth/", include("rest_framework.urls")), + # ... other patterns omitted + path("", include(router.urls)), + path("posts/", PostList.as_view(), name="api_post_list"), + path("posts/", PostDetail.as_view(), name="api_post_detail"), +] + + + diff --git a/blog/api/views.py b/blog/api/views.py index d5a4a4a667..de5cd88a1b 100644 --- a/blog/api/views.py +++ b/blog/api/views.py @@ -7,7 +7,15 @@ from rest_framework.authentication import SessionAuthentication from rest_framework.permissions import IsAdminUser from blog.api.serializers import PostSerializer, UserSerializer, PostDetailSerializer +from rest_framework import generics, viewsets +from blog.api.serializers import ( + PostSerializer, + UserSerializer, + PostDetailSerializer, + TagSerializer, +) +from blog.models import Post, Tag class PostList(generics.ListCreateAPIView): @@ -32,4 +40,33 @@ class UserDetail(generics.RetrieveAPIView): serializer_class = UserSerializer +class TagViewSet(viewsets.ModelViewSet): + queryset = Tag.objects.all() + serializer_class = TagSerializer + + +class PostViewSet(viewsets.ModelViewSet): + permission_classes = [SessionAuthentication] + queryset = Post.objects.all() + + def get_serializer_class(self): + if self.action in ("list", "create"): + return PostSerializer + return PostDetailSerializer + +from rest_framework.decorators import action +from rest_framework.response import Response + + +class TagViewSet(viewsets.ModelViewSet): + queryset = Tag.objects.all() + serializer_class = TagSerializer + + @action(methods=["get"], detail=True, name="Posts with the Tag") + def posts(self, request, pk=None): + tag = self.get_object() + post_serializer = PostSerializer( + tag.posts, many=True, context={"request": request} + ) + return Response(post_serializer.data) diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index a0ea1284e08150b32f422208574b4e475a7e90f0..761fbea06aae400aab106d0656d0427a99fb1c4d 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDpgTzL*lPmxv1O!?D delta 15 WcmX@ld7hKan3tDJOJF10NfrPgxC6`p diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index c7033d8b206083df201d56425ffa7b046eb0eafa..06a7cff03dbbecaf9bcad84441b1e0cace6f5b37 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=zuAhD5+l?4DA@&gP2 delta 15 WcmeC?=;mNE=H=zm64=Pb$^rlvrUHHd diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 543efb473b6c626d88ad10d1bb258b2b876eb859..1259068e354a911e2a7d45bd5c111ce56722d3b1 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tDpgTzL*Lref7$OJn8 delta 15 WcmX@XdV-bBn3tDJOJF10AtnGHd;_fj diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 9944792d3942ac20d03aadb99b92544258253613..3747434b15a3dfd33e9dea64aec12289e14bd687 100644 GIT binary patch delta 15 WcmbQwGoOden3tDpgTzKQNj3l-v;$HA delta 15 WcmbQwGoOden3tDJOJF0LBpU!4Xad9l diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 230259b821a365c9ada52a96bcee41a1d2065fbf..fcad578677253d4002cf501ce008d0f7e0c31c4e 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tDpgTzL*Kqdeqa0BK5 delta 15 Wcmcc4a-D_En3tDJOJE~gAQJ!}Bm-Cg diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 2df1aec9fb8166ec25a9e30126391516466bfb9d..54b6df3e3de2790be1e7199165fea0f6f05c30ec 100644 GIT binary patch delta 15 WcmdnMvVn!on3tDpgTzKQEhYdS-UD#} delta 15 WcmdnMvVn!on3tDJOJF0L783v)k^n3tDpgTzL*MN9x62m{*y delta 15 WcmZ3%x`LI>n3tDJOJF10A|?PEyaP=D diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index b83fd89cb264e7f9af79ad01ab7d940b7b24a9ac..e705fa8d64d30a230dbf53954bcfc712bf15356e 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=zuAhD6Hl^FmV*8_pa delta 15 WcmZ3(vWA7tn3tDJOJF0L8WR8;8Uoh< diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index 1624ac6bbe9be65490b09828afc2be57a085a627..335b95d1f2d066b8af095587233ee4ca28bed49b 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tDpgTzKQ8zulC`U9r` delta 15 WcmX@aa)^b^n3tDJOJF0L4HEzzt^*kW diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 952bf5f84bbb487651e012789f45ddde3694ab09..e2c530023572c69c9ac6db7e88e316703cdf9dc8 100644 GIT binary patch delta 15 WcmX@Wa)5=+n3tDpgTzKQD<%LSz5}5E delta 15 WcmX@Wa)5=+n3tEUR$wEW6%zm-WCLaZ diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index f77ee2b83f475979d12acd727d601cff2a200b87..eb23e730e73b77f6858b1a858b6b7b385afecbdf 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=zuATg1x6#y4r16lw8 delta 14 VcmeBX>}F&$=H=zm5}3%=3IG(K0?Ysa diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index d651791ef734beb7ed339287449bddad8e0a1a7e..b06adec1ab846f7c9d2a34588f7050989072627e 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=zuATg1x9RL@U17H9E delta 14 VcmeBW>}6y#=H=zm5}3%=4geI^0@45g diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 8defe0aa34336db4259e35cabd21847b03ef1d54..0c6352531dd6720920c87d236d54185e0e30d704 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tDpgTzKQBW3^~0|Sl# delta 15 WcmdnNwu6n$n3tDJOJF0L5iD?o*>QGF;T{uv14PxsXReT1w&&iLrW_I6FpONa|>h3X6yWR>wL!T*7-~) z14KC3b~EtZ;@!ey%`M8M#mUP4fNl3?Lxsg`8cj+ZtiH{`j_D<(St-fJMwynDMFtrq zC1u41*@ZcU1%|nm1&KKoNz-*tGHv$qb2bRKGAl7OHVG^WGP6iDPxCda%64(C$cWE( zFS9hNNb`z{$n^Fx53DS5&GR%dGB7gHH89jQGDf)1%*4{j)O`Dc<4h_X92|T%8Tcph z-Q3P~f$1!tstU6&BO#Y?Z2xzUiH%W&gP)Uu{}KOT{w4ga{Av8|{2Kh6n*|#_@=e!x U&%`T)VIxO7P<*?_d*&M#0B15|E&u=k delta 142 zcmV;90CE3-fD?d#6ObDLg^?UX0fn((%5D)jATc#MG%z|dH7+qQFgP_ggFA1BJ8uEE zJ8uHXP!b0R-~bNV4YUk93l$0~2?Yn>voRpb2e;tI0wf3q2M+!K50bYG&;rd4lYkH> wxBlJ&1_2TW4=4Z+;t#_Qqz{D;W)DXXD6 Date: Sat, 13 Jan 2024 15:13:37 +0000 Subject: [PATCH 24/38] Finish testing DRF with mocks --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4045 -> 4045 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/tests.cpython-36.pyc | Bin 0 -> 176 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/test_post_api.cpython-36.pyc | Bin 0 -> 3352 bytes blog/__pycache__/tests.cpython-36.pyc | Bin 0 -> 169 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 2859 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1581 -> 1581 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 2683 -> 2683 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes blog/test_post_api.py | 105 ++++++++++++++++++ 40 files changed, 105 insertions(+) create mode 100644 blango_auth/__pycache__/tests.cpython-36.pyc create mode 100644 blog/__pycache__/test_post_api.cpython-36.pyc create mode 100644 blog/__pycache__/tests.cpython-36.pyc create mode 100644 blog/test_post_api.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index c404f469f65c03f043f379943255aaeca606934f..de8dca3e64313dcb580e4234252f2eb8e577e1ec 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=xwte-oPy&3=-AOpn! delta 15 WcmZo-Y+__L=H=zuATehmdo=(X69e1; diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 7c1bf44b6fe50f82d4e591a254bf6bff9e442315..10bce3ebb5ce37ddcab5ad3e2385de114d740859 100644 GIT binary patch delta 16 XcmX>re^#E|n3tE!uzv1F_GA12D;xz8 delta 16 XcmX>re^#E|n3tDpgT$PT?8o>4EG7jg diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index fb52c41af5b2c0926309a47d3079edca3736059c..3f1e1aca8667b6130c43a2b4b2c927c6c943633b 100644 GIT binary patch delta 16 Xcmcc1eV3cvn3tE!uzv1F_G_#FD&hqX delta 16 Xcmcc1eV3cvn3tDpgT$PT?AKTUE9?a( diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 97a521af76ba84e3b95750137d995a88dc9d2f79..3b9d72aef7f87b19f1d97fdd3bcd1f34519d9a06 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=xwte-oPy#W9ku>;fq delta 15 WcmZo?Y-eOQ=H=zuATehmdjkL)qyy^! diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index ec22b5b5a32f9e1f82635a58872c3e0ebf2a1926..8926fe8e3777679cae221bdb75fb89f9d3f8b2b1 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tE!uzv1Fc6}BAB&`G! delta 16 XcmdnSv5kY>n3tDpgT$PT?D{MKCAS1B diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 8aa07a92157c53afd90e27a9c712ae082ee9186c..c693c0960ca05ba896998d56b2baba0c41b22f77 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tE!uzv1F_F0SoB7Ou% delta 16 XcmZ3;ypWmQn3tDpgT$PT?6VjFBZvfE diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 551bf7dc0ca51cf42be20a2ec3ddd20a00bace77..976187a599a5404580eee05e60449c7065c93f93 100644 GIT binary patch delta 16 XcmX@devX~pn3tE!uzv1F_T$U|D3Ao$ delta 16 XcmX@devX~pn3tDpgT$PT?8lh_DVhZD diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 647819a62d3d2023d3dfe37ff7f9d8b761667989..2868fd76f4080b7904b3cb36327e36daa9e31bf9 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tE!uzv1Fc1?BwB$xyc delta 16 XcmdnMw}Fq{n3tDpgT$PT?3(NVC87i; diff --git a/blango_auth/__pycache__/tests.cpython-36.pyc b/blango_auth/__pycache__/tests.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00554cbd07c2e46d78c046a68529eac02e90a48a GIT binary patch literal 176 zcmXr!<>fN0pPOpKz`*brh~a<<$Z`PUVgVqL!jQt4!;s4u#mLBz!W7J)$@~&1%Am=3 ziz6hpxWqZJIMq*+=@xfNR$^XyzFrAXtO#VlN`@j9AO$9V8R}=`=cei>=ci=m>zC&j uWfvDDCa3Br<$&}+srbawk_>&2{$jm?%3B;Zx%nxjIjMGxKvRl=m;nI1bu0}4 literal 0 HcmV?d00001 diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index b047597fcf0690a43560baf988ada3ed01d4d8d7..6dfe35cc65ffb627d2df1fdbe57682c7d6e2286d 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=xwte?A)y`B*OA07kt delta 16 XcmZo;ZewOQ=H=zuATehndp#onASeV4 diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 59afa30558394d0dffdea2b6eb4a0ff951726cb1..dfc046a30ae40978e467aded6187886bcbfe1048 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=xwte?A)os|;+Ac_O7 delta 16 XcmeAX>Jef$=H=zuATehnJ1ZvuA(R8f diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 3475dfe1b83af706a7d72fac9b8bddb358f3b21c..49d533d4e1cbda87dc538829548a861bf17d211e 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tE!uzv1Fc6nw1B6I`Z delta 16 XcmZ3+wv3J4n3tDpgT$PT?DEV2BYp$* diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 08c16faaf57dd7e846cf6455703d84f4ac644390..3878f805767de23daca364be5a736ffb841b6e4d 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tE!uzv1D_HFobWn)hn3tE!uzv1Fb}LQ*Cn^L@ delta 16 XcmX>obWn)hn3tDpgT$PT>{grrC^Q6Q diff --git a/blog/__pycache__/test_post_api.cpython-36.pyc b/blog/__pycache__/test_post_api.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5492b3ac6227b379eee99624cce8d20e318315f2 GIT binary patch literal 3352 zcmdT{Pmkk77O%1$$FZIC-vN48K(k9r1W3}ISuHRcji%KgW)3tXIwQamvOFnIx7~K^ zDOVWAN}n>Q&XNs`q~HSJgM0 zP5a=-@56sJ3HgOA{0xxq!dnO^7-2LaDe(wJSxacDd76^-L{AORP_mKKQqwb)TubVy zkkJ9@Tm>5({KbrWB)TQJM~Ls3X)$U{gkl~Yn1@4?&Wh*@b? zExd*meUv?wDt>;FWvAnuTU8&GQM`^7G{qov5v)w=r{S}<4q*zD$FhbyEg*E5ieD(dAE@~5f3RwZ8%n6Xd7TF?a24>~Ni0hy+ zwg`@xX)MsxmNX5}m`fTPH1)a0fts~NVwW|*Vl!@iOa2Y(n9Yf^tccZk4SLyIggH|! zUKbn8J*PP9lea&w^0j$bwt4`g-q(9Q<>=lEBp`kRi&ZSvuvo`p1B(_EmqQRVMUP_u z${Rahc6QRv4jb&;yS4Mlt(~Lp&SMXtWr{KyJOjNNh>L6_9pHtKi;td+ zgGA~{ID%;NXe9U>IMp@NOS>8|;NwtQ;fNJaBXOb@#a$eOE8&QLX%&L!$mz1q!#sf` z;uy|$jqhNy!NVe#1{@E8Y~ap)%puQGA^`j<(pr~U2Ye!Kf{g;VL#PX&Th(kRTXcQ) z81zq?0T48xwS4U=(3VZj5r@fz$)FJT83+~Prg(4yzVINyLxk18GXa5!MvYk$h-ZaE z;9`R{E-(d5Z^m^vG4KSiQLFgbIV>9k;E!!wQ|aJJI=JP|&C*r+3xca^GkPm~Cqm@6 zdWw1=Vqb^+0yGr@(9R-{mz(|F{$6Kyud}y1*!|$v?k@a!ZS%UAR?$-sx&p=MAAm*P z22Zpb3OoF-AWH)m%sVJLg$TsB@PRHv#XS7asMdodk+oqqhOTrN^ccr5+5E~a30#c*aV zxJZuoDe2BMV-Y1qb+0h;XQEV2^j-%x7ye@oi^n^YvZO8yU3Jwj)Fs2)xYA2m$K`nr iUaT(qs-WZYuiKZjZdZ=EgRm&@jB+&>Xnyu+uKqhGsyZhC literal 0 HcmV?d00001 diff --git a/blog/__pycache__/tests.cpython-36.pyc b/blog/__pycache__/tests.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b30d8b79623a4fb82b0689da786da41ae9919343 GIT binary patch literal 169 zcmXr!<>fN0pPOpKz`*brh~a<<$Z`PUVgVqL!jQt4!;s4u#mLBz!W7J)$@~&1%Am=3 ziz6hpxWqZJIMq*+=@xfNR$^XyzFrAXtO#VlN`@j9AO$9VY3XO==cei>=ci=m>zC&j rWfvDDCa3Br<$&}6sr+<(kj7%Yg34PQHo5sJr8%i~j6m(hK+FIDb#Eyq literal 0 HcmV?d00001 diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index a6640357ef17b634e8866af44e9774ab78c8bda5..efa850e4fd9a31ed7112f4acada6ccab8182a10e 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=xwte?A)y_FdNAW#Gn delta 16 XcmeBS?_p;*=H=zuATehndn+>lAzB0} diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index f5016cc3cefe1fa6012b78a20d8bdc207f45b684..535a48fb27893fbc3ea305d10ecaa4aab9e20e83 100644 GIT binary patch delta 15 WcmZo+Y++}gB@EF}cR diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index ff7534d28f07a9bd951ab933e1fa48bbee3238da..8c49856aa39398a2bb4916ca05af4f81966fb88d 100644 GIT binary patch delta 15 WcmZ22wpxtMn3tE!uzn+(DmMThE(3P} delta 15 WcmZ22wpxtMn3tD}(Q+f3DmMTeumb@A diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 1154cda6472f170ec608850e6f66a5ed0a7c6348..2fdfc42ff716955203c81fd60285b389aef42d8b 100644 GIT binary patch delta 15 WcmZ3>vzCX=n3tE!uzn+(IvW5UVFP3U delta 15 WcmZ3>vzCX=n3tE!$!a5;IvW5TZUZm? diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 816da403287e30d00ed9de7e06a0818b2789052d..87158e585e97731702ae659a77274119e207d102 100644 GIT binary patch delta 15 Wcmew@@>_(>n3tE!uzn+3DHi}JSp;GL delta 15 Wcmew@@>_(>n3tDprRPSrQZ4{08w8{P diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 761fbea06aae400aab106d0656d0427a99fb1c4d..6e91be7dc6c6e2c89926c75f334418b7172a7b40 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tE!uzv1F_7f}sDCq>? delta 16 XcmX@ld7hKqn3tDpgT$PT>?c?NDf0yP diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 06a7cff03dbbecaf9bcad84441b1e0cace6f5b37..d87c0540a9bcc5fba18da6f43bf8f681f2b1755e 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=xwte?A)orMJeA58<2 delta 16 XcmeC?=;mNI=H=zuATehnI|~Z{AXfva diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 1259068e354a911e2a7d45bd5c111ce56722d3b1..81e6783f9b9fbb2585036e1b59c25aee1e307b94 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tE!uzv1F_Jd3SCzk}l delta 16 XcmX@XdV-bRn3tDpgT$PT><5_uD4_({ diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 3747434b15a3dfd33e9dea64aec12289e14bd687..9e996c2810c6c3cfb243ae950a5387aec7294f2e 100644 GIT binary patch delta 16 XcmbQwGoOdun3tE!uzv1Fb_q5BB0mGz delta 16 XcmbQwGoOdun3tDpgT$PT>=JAMBS{1A diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index fcad578677253d4002cf501ce008d0f7e0c31c4e..a643b17294b05aa8e97e459aa768377efc761816 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tE!uzv1F_5daTC|d+< delta 16 Xcmcc4a-D_Un3tDpgT$PT>;X&wDP;tM diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 54b6df3e3de2790be1e7199165fea0f6f05c30ec..aef5d3b4019317578ac910f426aeb26c18b08960 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tE!uzv1Fc11n3tE!uzv1Fc1tDzC3^%X delta 16 XcmX@Wa)5>1n3tDpgT$PT?3PRbCWQn( diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index eb23e730e73b77f6858b1a858b6b7b385afecbdf..4d61e5ce25e326779349a132f993c2a56e8fb304 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=xwte-oPy#)XpB?I69 delta 15 WcmeBX>}F&)=H=zuATehmdkX*@7z6hJ diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index b06adec1ab846f7c9d2a34588f7050989072627e..e405551e7c1376a58ca9bb89bed921ac4c902a8d 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=xwte-oPy$t{xUjya< delta 15 WcmeBW>}6y(=H=zuATehmdm8{8QUm<} diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 0c6352531dd6720920c87d236d54185e0e30d704..4ced836d0d5e4749f6b395f4d18e2e39cfcf1ed3 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tE!uzv1Fc0* Date: Sat, 13 Jan 2024 15:50:24 +0000 Subject: [PATCH 25/38] Finish testing DRF with requests --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4045 -> 4045 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/tests.cpython-36.pyc | Bin 176 -> 176 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/test_post_api.cpython-36.pyc | Bin 3352 -> 3352 bytes blog/__pycache__/test_tag_api.cpython-36.pyc | Bin 0 -> 2213 bytes blog/__pycache__/tests.cpython-36.pyc | Bin 169 -> 169 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 2859 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1581 -> 1581 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 2683 -> 2683 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes blog/test_tag_api.py | 46 ++++++++++++++++++ 41 files changed, 46 insertions(+) create mode 100644 blog/__pycache__/test_tag_api.cpython-36.pyc create mode 100644 blog/test_tag_api.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index de8dca3e64313dcb580e4234252f2eb8e577e1ec..5abbcfa951e17bd41a57d88d6dd45cd2d202f271 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=yzTeWB+do=(Y83ZB# delta 15 WcmZo-Y+__L=H=xwte-oPy&3=-AOpn! diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 10bce3ebb5ce37ddcab5ad3e2385de114d740859..8c2f96eab507ebd981fa5cf8776305f3e2988184 100644 GIT binary patch delta 16 XcmX>re^#E|n3tC;Zq=fV?8o>4Epi2J delta 16 XcmX>re^#E|n3tE!uzv1F_GA12D;xz8 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 3f1e1aca8667b6130c43a2b4b2c927c6c943633b..57056ee66af8eb81f1cf311dba1da3e4422015b6 100644 GIT binary patch delta 16 Xcmcc1eV3cvn3tC;Zq=fV?AKTUEjR^i delta 16 Xcmcc1eV3cvn3tE!uzv1F_G_#FD&hqX diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 3b9d72aef7f87b19f1d97fdd3bcd1f34519d9a06..ffd37df86cb665dde8c80925cdb88ab52a0039ee 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=yzTeWB+djkL*ssu3r delta 15 WcmZo?Y-eOQ=H=xwte-oPy#W9ku>;fq diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 8926fe8e3777679cae221bdb75fb89f9d3f8b2b1..27b6312204a7f3905b839748f3eab881ca874381 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tC;Zq=fV?D{MKCj$g< delta 16 XcmdnSv5kY>n3tE!uzv1Fc6}BAB&`G! diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index c693c0960ca05ba896998d56b2baba0c41b22f77..b942fe2b48aa09286b8213720cf50b9bc5c6f317 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tC;Zq=fV?6VjFB-8|? delta 16 XcmZ3;ypWmQn3tE!uzv1F_F0SoB7Ou% diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 976187a599a5404580eee05e60449c7065c93f93..bb0bfac7b5920ebc0c41c0a250ee379b2b0fc732 100644 GIT binary patch delta 16 XcmX@devX~pn3tC;Zq=fV?8lh_D&_?> delta 16 XcmX@devX~pn3tE!uzv1F_T$U|D3Ao$ diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 2868fd76f4080b7904b3cb36327e36daa9e31bf9..bc50379d9ed5aac2062c1b9426967be2de9d72b9 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tC;Zq=fV?3(NVChi1n delta 16 XcmdnMw}Fq{n3tE!uzv1Fc1?BwB$xyc diff --git a/blango_auth/__pycache__/tests.cpython-36.pyc b/blango_auth/__pycache__/tests.cpython-36.pyc index 00554cbd07c2e46d78c046a68529eac02e90a48a..e330fe69b35501369a6575d0ace9a63298de7be4 100644 GIT binary patch delta 15 WcmdnMxPg(~n3tC;Zq=fR>?;8wPXw$0 delta 15 WcmdnMxPg(~n3tE!uzv1D_LTr1Rs>G~ diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 6dfe35cc65ffb627d2df1fdbe57682c7d6e2286d..71bde8dd4d1016b8b2a4c42813260357270fb5a0 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=yzTeWB-dp#onA#?;& delta 16 XcmZo;ZewOQ=H=xwte?A)y`B*OA07kt diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index dfc046a30ae40978e467aded6187886bcbfe1048..c31314f918111a5a19fbaee2d13bedeb3bcdc735 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=yzTeWB-J1ZvuBH#oI delta 16 XcmeAX>Jef$=H=xwte?A)os|;+Ac_O7 diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 49d533d4e1cbda87dc538829548a861bf17d211e..b7ae1a332e613b8f84beb153687315c02d895c4e 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tC;Zq=fV?DEV2B+3Lk delta 16 XcmZ3+wv3J4n3tE!uzv1Fc6nw1B6I`Z diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 3878f805767de23daca364be5a736ffb841b6e4d..5362298a485dafccbdf196125a15c1f779f9f808 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tC;Zq=fR?A-tz=>$>$ delta 15 WcmbQlIEj(nn3tE!uzv1D_HFobWn)hn3tC;Zq=fV>{grrDS!m3 delta 16 XcmX>obWn)hn3tE!uzv1Fb}LQ*Cn^L@ diff --git a/blog/__pycache__/test_post_api.cpython-36.pyc b/blog/__pycache__/test_post_api.cpython-36.pyc index 5492b3ac6227b379eee99624cce8d20e318315f2..1404be17afead5fb6cff3668f37d12a2de960aef 100644 GIT binary patch delta 15 WcmbOsHA9Ncn3tC;Zq-IMAzlC!8TDJcRW6jdY$=}Ohrjc1zJz4mox#-Uiw z%Gq`UTUPAY@iX8r%$8ODLRWleoH%KlR=v_a^FDLV_sutRr_reX{`a5qZp7Gs?8+CQ zzJ*^ufDugag7taIIn}+w>-(wi>V6UQ!!&gDposc$8oPQ}B>hTS;p|%`A`zc55lcSx z)2c{zS+jBmudK=K;t$FxyPbO@bBKq<9fU3 z%7LMt18K66mMZI)LKf)p_ws`dxxM&2RJQQz&tN1=xnQX$xbRL{>I+{4C<76S2xTZ@ zk)Vu31>sfg0-W6&b}wS;aJZn4d=fO<`1SWNhD}+I_ncqhKlPBj^C{xPV8Sy0$=ZbV z{QKt9MG znw|}1KkpVQ!PaSD@`H6}zjXGFvtI#=@Hj6&Z6B|< z5w>oh{e!K}XybV#7tHUXQ!m3DB9@1B?2mJ`%6{{X0&vI`W$AzdSzhZ4_0~n(b*d#a zpH()HC72yz83V}z)I^w3id_;A!Rr@P*OHh zg{|StNM*h`8s%tcljB@vAWhn!r^|u$3pr2?tZ(}2Cb2L2Yn8QDG>gO(@_^3IfkK{UL>M(CPNeV zl3oSMt4?vT%y~>+p&%!h7btc_S(4D*vwsoF8A+vCQ*`2HxCS{c9~%ryZPYF5eTU2% z8PbcY!B{^p3LAFH5pE^V0jb`jK?mL?g16=fo=b3_ZnunfAg||eF7SvidJBBqd=;E8 zt)62`aZ?HoTZIZRy`mK1(T(>9us-2}(DZ>^w8~ay^8yiXTwRd>|B9$O{E3%v;sO8K zwfNWP_&0XOOLHBSkLBQVO0a$XwdP2HND{j526*&;rli;RN4l;0Hx}VbJHyc z*Kw#mM6&85G9SZ$LQ;kLgp8x@UDRxRD03l|zK%roDb2kNbFPK7>Nd|v5pPE4Y(8a6 zfoKvG1DOf0dvAMhNb04Jon~y4EF(~|%vLjc<3sdyEo{cC{qWXYLlT3@u<-wbu zJ{4o2f?w0Kk?^FN#7W|McbYX@6Fs`RTXaMf-9>3bojlBBlgy delta 16 XcmeBS?_p;*=H=xwte?A)y_FdNAW#Gn diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 535a48fb27893fbc3ea305d10ecaa4aab9e20e83..5929b1dae4c5ffe5f21c79a90211ddc12ad460f6 100644 GIT binary patch delta 15 WcmZo+Y++}gB@EpY`4 delta 16 XcmaFM@|K0&n3tE!uzv1F_B18{D;or^ diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index 8c49856aa39398a2bb4916ca05af4f81966fb88d..9cf3bed9fab36dd170b2bcaf6c611fdd7ebd29a4 100644 GIT binary patch delta 16 XcmZ22wpxtcn3tC;Zq=fV>?+&_B-{iQ diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 2fdfc42ff716955203c81fd60285b389aef42d8b..6ffc30e8669eafbb32390a73f5e2f106e4c22f81 100644 GIT binary patch delta 16 XcmZ3>vzCY5n3tC;Zq=fV>}qTPCRGGq delta 16 XcmZ3>vzCY5n3tE!uzv1Fb~QEtBmV>f diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 87158e585e97731702ae659a77274119e207d102..908a4d3991f3992a3f61c429f3779d511aba5d90 100644 GIT binary patch delta 16 Xcmew@@>_)6n3tC;Zq=fV>?K?PF!=>t delta 16 Xcmew@@>_)6n3tE!uzv1F_7W}tE~5ni diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 6e91be7dc6c6e2c89926c75f334418b7172a7b40..d7fb7e4c5e9df916fcb12bf007e73f7c1e4ff788 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tC;Zq=fV>?c?ND?bH2 delta 16 XcmX@ld7hKqn3tE!uzv1F_7f}sDCq>? diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index d87c0540a9bcc5fba18da6f43bf8f681f2b1755e..fe05ec02b4015087e69b2b27fc5c4f9323ccc7d8 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=yzTeWB-I|~Z{A)^ED delta 16 XcmeC?=;mNI=H=xwte?A)orMJeA58<2 diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 81e6783f9b9fbb2585036e1b59c25aee1e307b94..861246c39bc5de4cef82606ea5b3cee5ac75b867 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tC;Zq=fV><5_uDeVOw delta 16 XcmX@XdV-bRn3tE!uzv1F_Jd3SCzk}l diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 9e996c2810c6c3cfb243ae950a5387aec7294f2e..0f47b5aab3705e011248f1962b17c83375c003a9 100644 GIT binary patch delta 16 XcmbQwGoOdun3tC;Zq=fV>=JAMB$Wg; delta 16 XcmbQwGoOdun3tE!uzv1Fb_q5BB0mGz diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index a643b17294b05aa8e97e459aa768377efc761816..67b11a0a20ead61cc19544c7757197f87a535f05 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tC;Zq=fV>;X&wDzOB~ delta 16 Xcmcc4a-D_Un3tE!uzv1F_5daTC|d+< diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index aef5d3b4019317578ac910f426aeb26c18b08960..3ff6b9e642e457ae972a0cf02daf2b8390088f66 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tC;Zq=fV?3zpfCD8;_ delta 16 XcmdnMvVn!&n3tE!uzv1Fc11n3tC;Zq=fV?3PRbC(#6i delta 16 XcmX@Wa)5>1n3tE!uzv1Fc1tDzC3^%X diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 4d61e5ce25e326779349a132f993c2a56e8fb304..e361c55ee81281422fad76addcb37d186753c9f6 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=yzTeWB+dkX*^9t1rA delta 15 WcmeBX>}F&)=H=xwte-oPy#)XpB?I69 diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index e405551e7c1376a58ca9bb89bed921ac4c902a8d..7fc56ede73d0c6adccce55d0c4339386b8d194ac 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=yzTeWB+dm8{9SOh}= delta 15 WcmeBW>}6y(=H=xwte-oPy$t{xUjya< diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 4ced836d0d5e4749f6b395f4d18e2e39cfcf1ed3..1a82d844a23eba1e49a6c8d8311feac1ce98ebc3 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tC;Zq=fV?1sz$Ckg~{ delta 16 XcmdnNwu6n`n3tE!uzv1Fc0* Date: Sun, 14 Jan 2024 02:41:55 +0000 Subject: [PATCH 26/38] Finish caching --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4045 -> 4045 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 2859 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1581 -> 1581 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 2683 -> 3999 bytes blog/api/views.py | 39 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 311296 -> 311296 bytes 39 files changed, 39 insertions(+) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 5abbcfa951e17bd41a57d88d6dd45cd2d202f271..57244248b873daf078788fc8ff03d15e5ea748f9 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=y*J35iA1^^aC16lw8 delta 14 VcmZo-Y+__H=H=yzTQ!lb1^^cs1AhPj diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 8c2f96eab507ebd981fa5cf8776305f3e2988184..da4750954f7f8e1eb471a066968a251fc2503f13 100644 GIT binary patch delta 15 WcmX>re^#E&n3tDJ?&wCgre^#E&n3tC;Zq-J%#P7J(gdUc delta 15 Wcmcc1eV3cfn3tC;Zq-J%>#P7K%LK^) diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 902527b112cc4048c3ae1fa9d5b041d0cbf9df1e..ea6ebed250c98ee220e7d0fcc387c04663e6739e 100644 GIT binary patch delta 16 XcmdnbvY&=sM_CX)nQ delta 16 XcmdnbvY&=sM_CS?RW diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index ffd37df86cb665dde8c80925cdb88ab52a0039ee..18b637bc5b0e0da66cea4deb5e2157436c7fce87 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=y*J35iA5dap<18D#N delta 14 VcmZo?Y-eOM=H=yzTQ!lb5dasU1C9Uy diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 27b6312204a7f3905b839748f3eab881ca874381..abf76d12feab04238390adc42abdcd0564a24263 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tDJ?&wA~0~P=u@dKy; delta 15 WcmdnSv5kYxn3tC;Zq-IM0~P=v>I2OH diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index b942fe2b48aa09286b8213720cf50b9bc5c6f317..55ab8b6558fda8b7940d8e5f2e5f946142a5f00c 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tDJ?&wCg*^B@k_5<7i delta 15 WcmZ3;ypWmAn3tC;Zq-J%*^B@l?*st= diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index bb0bfac7b5920ebc0c41c0a250ee379b2b0fc732..a031391e532a1ca923b4fd47ec2db9860886292a 100644 GIT binary patch delta 15 WcmX@devX~Zn3tDJ?&wCg6U+c3rUY#O delta 15 WcmX@devX~Zn3tC;Zq-J%6U+c4p9GQs diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index bc50379d9ed5aac2062c1b9426967be2de9d72b9..fef6857786737bc5d5056fc65b9f330f66cc8c4e 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tDJ?&wA~Ep`AO+ykWm delta 15 WcmdnMw}Fq%n3tC;Zq-IMEp`AP)dR`^ diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 71bde8dd4d1016b8b2a4c42813260357270fb5a0..96fa211078e0ee40a0fbad91c1cfd3772de4f417 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=y*JGzmrfe`>2%ma%6 delta 15 WcmZo;ZewOM=H=yzTeXp`fe`>3#RISa diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index c31314f918111a5a19fbaee2d13bedeb3bcdc735..615bc5935e942ca8d7daf6a87b16628c1061b832 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=y*JGzmLjS~PI4g*5~ delta 15 WcmeAX>Jefy=H=yzTeXpmjS~PJ2LosT diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index b7ae1a332e613b8f84beb153687315c02d895c4e..bb146dd2459893585bc6509d9f1891025cc62e68 100644 GIT binary patch delta 15 WcmZ3+wv3IobWn)Rn3tDJ?&wA~YfbobWn)Rn3tC;Zq-IMYfbI0_$ delta 15 WcmeBS?_p;%=H=yzTeXp`jTrzO;{(h9 diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 5929b1dae4c5ffe5f21c79a90211ddc12ad460f6..a4067259f9fb063f618f00b9e44846cdad070978 100644 GIT binary patch delta 14 VcmZo+Y++vzCX=n3tDJ?&wA~bv6JWO#_zz delta 15 WcmZ3>vzCX=n3tC;Zq-IMbv6JXMgzP6 diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 908a4d3991f3992a3f61c429f3779d511aba5d90..f00f1df2a78466d2c3d9802d9e62057c5aa325de 100644 GIT binary patch literal 3999 zcmb^!%W~Vu5d(lA2$2*;Q7=of>6dK!K~*+6>|twT*E-p9)voNay{XDvP%vgpfdUBb z3}~4u`4al-{e->blwZjw%r%$nFXWW&0Y#8pDaj#3O=G5~2i?0n&1AF|Gj1y z|1jo$F3g|6kpCox!3;)XBO#O!oSU(kSky{vYU{NXmlB6MdTz(%#HFsDm*Ps|QBTjE zcqOUQs-BnQT2iNVJ$H+5C98B*<0?6?q(K{c?Jd$IYjjQHS8~2dlQ#9b8m}iU+S2n{ zype3uO+By2Tgf)vPIl;yUa!X2l3lt>jBgFrU~8WYw#G?+Z(`AXz%IzE4^7Zu~;L;sJXxh{s5QXW+f@noAj_10>{wEDD1RRljAkKG$zEwGW+vi~>l@-LXa(^6gF$S#&3}UqzEa=(~<3LI- zMFlsT!`U5X8>oBL0DDaho^Slk5c{y9!N0nP$7#Y3LojrDc$$h6ISfL6_%;p(y%b() z?=TofhuS*b;aIH0$vqenC31;J9C$SLa-Fq-tk4Q*o_)b{%my0HEO{e#8Y~J)&{{i@3`sF2qIW z&RzKuam&beNk~+exP|~@;c9W)u=@zcR9w`rK-}fx;s*=u7UEL(Laz`de}c$*&A|^V z%X)=U@hd^Ah`UmoH(~b+7!q%R<`;-r5Dvrn2@H7$Kq1_s=^0_>Cxcd)1;Jvg6*T`; z&Jg1bfB3dwd;>!^0h}9sgIOnzsAmvknTbb_lpRBmDJK*>$ROUuZJ-p$yJIOQ2r(<= z83p|Wg58!pemCbT=q0Mv#W`@K19;*DkdG|Gy(s-I?ofNwx}u%Q9N-USSXtXS@z;Qd4cz}E!BESR^ngH;Jkvg-+*RVJzeWOoA zBLhoJ$X^Ip$C?;@8}ZEiOg@@f>0G;qwo(bKWMvLmuB@%(9G!jf=XBIgMlx%^1fGNCD;00Fbs$i?Ad5Hz&~cTGcTm+x`oSO_jFWUE z1%|w;qRlVLpmN?tamGa+&uDgm$p~78nboznl~;uFoaS|;+t8ZuS8z&VJ}^oyaY+*% zfzkfU2LQ7Kg#L`<1q_{lG6Ou=n3#R=-*fXP^jYu;OO@mZs;>@EoqoU=D3G!P(Ss;C zImP#qAezv}FKa{PdFyi4SPd6h|7`wbOqmNbsV))POQx*F?-Bb1!K~H`?d<4EA&e>8 z%Q>Rz7dg%@oAX20oxkeU{B8r~@&ARNas_lk5r5DB>m{E8!?<87aDCKytm*<%i~mkQ zy24&Zx1O|xT}~IeoNnPYvS>o-ir$B=jmJ_qAas3pqG-BwlR}$$=!)7`v(D|WlO zMHZ__vv(B@_Q|4w?ADNOXGuK%A>>0WuX(7_HSBi3(PjAQ%ja0lbzeyLUQNyR!w_;b ze+DKH>G*;K`!l+FL2`j@Ben{EKX^QC3v^l1Ax4)4DXyi9quN>$6qdSD>O!I8JZ};( z6trv1#mFo>EBC9sQU4n9u^}-#RLusd&Yl)&nA=XnL<~T?=`|hwQ~+Z&YaS$Yhg|ns JcB|B~{|%cIdB^|& delta 994 zcmaJ<%Wl(95cN$Q+cAD5vGb1O(11up#X~JSR0TE&As(Vt7haU4+zV<+6m%1)*icpQ z0icoCBC$bY#g2dA6S4&f#GVx!W=xeJt8J`%G(L0ZoSBK=hkyL`ifx-)pFW76hN65^ z{`;vI_wY=X-?l&Q-%z;4?biyo1>5yrr6V61hr7tQ$P|$&A(P{IWb(+Ak*Oe4;2tub z$n92Q zf7L43p{&4)x>|NHEK%_Qq+R)yc0 zOB;!)Y?4YCStrUjFngZlsS8?}Y`_ccjn<^95L~^LTdaVlpZV}q_t_QL&{ww;_VG-| zE_I0{7h-V~?=!%}Wju?0rX+D)CR^}J@3RKnGCq54q-H7~Ob6YJJdH2115UQ-FC=5N zWz1ZMUbeHJ=%t{Mk^fF}yK31AVvRrVD04i=V8;tn^=t$)4r_ diff --git a/blog/api/views.py b/blog/api/views.py index de5cd88a1b..55b6eb30d4 100644 --- a/blog/api/views.py +++ b/blog/api/views.py @@ -17,6 +17,13 @@ ) from blog.models import Post, Tag +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_page +from django.views.decorators.vary import vary_on_headers, vary_on_cookie + +from rest_framework.exceptions import PermissionDenied + + class PostList(generics.ListCreateAPIView): queryset = Post.objects.all() @@ -70,3 +77,35 @@ def posts(self, request, pk=None): tag.posts, many=True, context={"request": request} ) return Response(post_serializer.data) + + +@method_decorator(cache_page(300)) +@method_decorator(vary_on_headers("Authorization")) +@method_decorator(vary_on_cookie) +@action(methods=["get"], detail=False, name="Posts by the logged in user") +def mine(self, request): + if request.user.is_anonymous: + raise PermissionDenied("You must be logged in to see which Posts are yours") + posts = self.get_queryset().filter(author=request.user) + serializer = PostSerializer(posts, many=True, context={"request": request}) + return Response(serializer.data) + + + +@method_decorator(cache_page(120)) +def list(self, *args, **kwargs): + return super(PostViewSet, self).list(*args, **kwargs) + +@method_decorator(cache_page(300)) +def get(self, *args, **kwargs): + return super(UserDetail, self).get(*args, *kwargs) + + +@method_decorator(cache_page(300)) +def list(self, *args, **kwargs): + return super(TagViewSet, self).list(*args, **kwargs) + +@method_decorator(cache_page(300)) +def retrieve(self, *args, **kwargs): + return super(TagViewSet, self).retrieve(*args, **kwargs) + diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index d7fb7e4c5e9df916fcb12bf007e73f7c1e4ff788..5cab001f10f991109a5f3a90bd1c414b3b13c9bb 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDJ?&wCglPmxu`2=+U delta 15 WcmX@ld7hKan3tC;Zq-J%lPmxv@&uXy diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index fe05ec02b4015087e69b2b27fc5c4f9323ccc7d8..7efc970bf6631dd015ba0711bdbbbc5c52dcb064 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=y*JGzmLl?4DA=L07I delta 15 WcmeC?=;mNE=H=yzTeXpml?4DB-~&tm diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 861246c39bc5de4cef82606ea5b3cee5ac75b867..510812b16b1708ba8e3e8c93f5a308dcfc72f46d 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tDJ?&wCgLref7y#!VO delta 15 WcmX@XdV-bBn3tC;Zq-J%Lref8wgh_s diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 0f47b5aab3705e011248f1962b17c83375c003a9..941d17d8db957be6c953cfe9af40181ec88993ab 100644 GIT binary patch delta 15 WcmbQwGoOden3tDJ?&wA~Nj3l-sRL~Q delta 15 WcmbQwGoOden3tC;Zq-IMNj3l;q63lu diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 67b11a0a20ead61cc19544c7757197f87a535f05..62d44c867e5741294a5420209a4b5b993385dc32 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tDJ?&wCgKqdeqWds2L delta 15 Wcmcc4a-D_En3tC;Zq-J%KqderUIZop diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 3ff6b9e642e457ae972a0cf02daf2b8390088f66..372c6dc515b2ba0e5287e08eb0b7ba7cfe06cd1e 100644 GIT binary patch delta 15 WcmdnMvVn!on3tDJ?&wA~EhYdS(*ukE delta 15 WcmdnMvVn!on3tC;Zq-IMEhYdT%mc9i diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index fae38746abaddee30c8c4a59cbe760a7d461f14c..488ac8507b94a64844ab35dd7943b88932c4153a 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tDJ?&wCgMN9x5{R8#@ delta 15 WcmZ3%x`LI>n3tC;Zq-J%MN9x6_5>RM diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index be5fa602984f7bbda333be29c939d608d66d67a4..ef77f8850da05410a470d334392dc8e1cf13c35a 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=y*JGzmrl^FmV%mbtV delta 15 WcmeBX?`CH+=H=yzTeXp`l^FmW#RJIz diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 9d5a80c89652069c7476362e463b6108009403f9..135d4f67e4f4fd6dbf384a0050bedaf86385eef0 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tDJ?&wA~H6{QaTLXXq delta 15 WcmZ3(vWA7tn3tC;Zq-IMH6{QbR0E{| diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index d629e045218339d7468041f381ed79e1e4d8d9a1..139b314c972d0eff1807ebe4d6340ff13e4aee7d 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tDJ?&wA~8zulC?*qaB delta 15 WcmX@aa)^b^n3tC;Zq-IM8zulD=mX~f diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 36cf77045900a34985a121988df4f6d0ee46ca0e..5b2538bd49bdf390df33ae5c614b480c4348d6bd 100644 GIT binary patch delta 15 WcmX@Wa)5=+n3tDJ?&wA~D<%LSvje;U delta 15 WcmX@Wa)5=+n3tC;Zq-IMD<%LTtOMZy diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index e361c55ee81281422fad76addcb37d186753c9f6..6a93dc4d4a4b17f331f5cc39f65e999fc73c90b0 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=y*J35iA6#y4F19boZ delta 14 VcmeBX>}F&$=H=yzTQ!lb6#y6v1DXH; diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 7fc56ede73d0c6adccce55d0c4339386b8d194ac..deda6e42df350fe4aec8ef90cc028bd9b834d032 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=y*J35iA9RL?@1A71f delta 14 VcmeBW>}6y#=H=yzTQ!lb9RL_Y1E2r^ diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 1a82d844a23eba1e49a6c8d8311feac1ce98ebc3..e38538a6cd58433bd9da2542cf00fd9c7de8014c 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tDJ?&wA~BW3^}_yef` delta 15 WcmdnNwu6n$n3tC;Zq-IMBW3^~@dM5P diff --git a/db.sqlite3 b/db.sqlite3 index 1adf67365a8e38adfe0c071ed4750ac9aecf516b..c492123b8c1389e8f536c8edf12364ceca9a680b 100644 GIT binary patch delta 975 zcma))%TE(g6vpSy+$ovT&Os`mk&vmc5DjHseX=0M1gxf@si&ES23&B@|K_AG57_9k+JEWjg}Ajmi*xDT{R z&d=`j$S#}cR7Fw56^s|jqO4YlQq|@*qc3Q*aIBPL$0`1$dD2u+GojlUi>p$sn z_@W&H?xSJ9))$Hf74PxWL&Fz(BaXgKd%LgR*AzL`QrA-7bK+=6|GGEXwc*)ZqGEUI zQ;%sMXXN-v3hwYJeo{Bh&=dT=y^J6I%L}Kc=IMi|l;ht~@D?7zUAPWy&;XS{N+huv zK9`uec#|rplln@`gw3-Q+~m{z8S^a3;emN%)QF7~s`Yxkd#o1vaJx|7rL}hU3n5Jl z3f)>?q&*T6tk(5`*1}drkF44xr>Hu`Ejo75{%1$o@P2{8NbvlyP}il6gz{%eRszk^ zD9acrZq?0B%YT|tTpmfbxmCN{>HbSH-*Jf2R%Xh`Z~E;fZzj;(sHd+o6^Q)E6a^`G e155CY3^uJDy|t-kO?05~rys@B<4|hlU1e%70K(tG}Q)5K&F`G57mFNk`$K^f6~o4_ehunFpGzp0fo**F}wBPt>HiWJhA( z3XIEIolViO4ujwkXE?+LR#3nM3>9`o<+;QBa_E(HEH4vHf^8v#MRqG>bB&Ku^@T&= R;8V$W*mTNVI%Q8Z`3H!zaE|~0 From c762103a67c52589dc37c3170e043e8c4c067f45 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Sun, 14 Jan 2024 11:10:40 +0000 Subject: [PATCH 27/38] Finish throttling --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4045 -> 4397 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 15 +++++++++++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 2859 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 0 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1581 -> 1581 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 3999 -> 3999 bytes blog/api/throttling.py | 17 +++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 40 files changed, 32 insertions(+) create mode 100644 blog/api/__pycache__/throttling.cpython-36.pyc create mode 100644 blog/api/throttling.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 57244248b873daf078788fc8ff03d15e5ea748f9..9a4a8430fbbfe95109f6103682e65c20077a9a6e 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=y@;k9@odo=(XnFIX* delta 15 WcmZo-Y+__L=H=y*JGy8hdo=(XAOrmX diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index da4750954f7f8e1eb471a066968a251fc2503f13..05c8485a2d86084c9c7bda42426c1043f5cb453a 100644 GIT binary patch delta 486 zcmX>rzg9`vn3tF9%z?$JJ0%zx9y1^TAt2iUh>Q1aRBmOoOJ`2;OYu($NC`}5NeM~` zP6oY)V`vV@muSrcA~tqZFoK2F--c7Z`7G zFjW~&{?8>h`4v}neU)ZXPJX&xVnL=}Nk&nANl8v-Ub>!RUVdJ1X>mznW?pJa2t+)! zN)?w!Y~9{3MVQqxedJMkCAdfCa#kn#_||aVZ!@Nw~PWIfnX# z#D{nU`Gzq?sW! K4?7bh7b5@}{GD(B delta 123 zcmZ3hbXH#3n3tDJ?&zXaCUFLa#|%h72*`E-;^Gw>m0KA#QvA}HGZ~`{Q~Xl`QUX(g zQiA6&r-Y=0W-_LP&0zw{7^N@;GiZiye#Ur=sM_CkzB! delta 16 XcmdnbvY&=sM_CX)nQ diff --git a/blango/settings.py b/blango/settings.py index b99506050d..c37d65c2d7 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -199,6 +199,20 @@ # "DEFAULT_PERMISSION_CLASSES": [ # "rest_framework.permissions.IsAuthenticatedOrReadOnly" # ], + + "DEFAULT_THROTTLE_CLASSES": [ + "blog.api.throttling.AnonSustainedThrottle", + "blog.api.throttling.AnonBurstThrottle", + "blog.api.throttling.UserSustainedThrottle", + "blog.api.throttling.UserBurstThrottle", + ], + "DEFAULT_THROTTLE_RATES": { + "anon_sustained": "500/day", + "anon_burst": "10/minute", + "user_sustained": "5000/day", + "user_burst": "100/minute", + }, + } @@ -208,3 +222,4 @@ "Basic": {"type": "basic"}, } } + diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 18b637bc5b0e0da66cea4deb5e2157436c7fce87..d12dc6800a0825b3249a262284c192e3a33a06be 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=y@;k9@odjkL*Dg+Dw delta 15 WcmZo?Y-eOQ=H=y*JGy8hdjkL)u>=eN diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index abf76d12feab04238390adc42abdcd0564a24263..4761780ab7a1f64e329ddc165c0d8b749feb1bb8 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tDphS%ba?D{MKCSC+f delta 16 XcmdnSv5kY>n3tDJ?&zY8?D{MKCFKN5 diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 55ab8b6558fda8b7940d8e5f2e5f946142a5f00c..59d303739e8fcb2cfd0b52f03caa59a55bb3e19a 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tDphS%ba?6VjFBrgPi delta 16 XcmZ3;ypWmQn3tDJ?&zY8?6VjFBen#8 diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index a031391e532a1ca923b4fd47ec2db9860886292a..1c6162af63475cf8dbb25f0c6f02eb05e4a38f95 100644 GIT binary patch delta 16 XcmX@devX~pn3tDphS%ba?8lh_DnSJh delta 16 XcmX@devX~pn3tDJ?&zY8?8lh_DaZv7 diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index fef6857786737bc5d5056fc65b9f330f66cc8c4e..8a88e54ffd6b5fabcb9601db580ca22d3130e193 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tDphS%ba?3(NVCP@TH delta 16 XcmdnMw}Fq{n3tDJ?&zY8?3(NVCC~&& diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 96fa211078e0ee40a0fbad91c1cfd3772de4f417..07ba2f2fb1aeffa5434859d70ebd5f0711e1b0d0 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=y@;k9@pdp#onAkPFY delta 16 XcmZo;ZewOQ=H=y*JGy8idp#onAXWq} diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 615bc5935e942ca8d7daf6a87b16628c1061b832..1d237e21f8489c13d37abd6ccdf4ae665f3cdca9 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=y@;k9@pJ1ZvuB0B@- delta 16 XcmeAX>Jef$=H=y*JGy8iJ1ZvuA;JUZ diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index bb146dd2459893585bc6509d9f1891025cc62e68..3a28bdc2daf525b9b960ab4448528ffb91dc20bc 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tDphS%ba?DEV2BqanE delta 16 XcmZ3+wv3J4n3tDJ?&zY8?DEV2Bdi1# diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index c47ac92e6484d34f297ce6386fddb82c47ba4447..d5cbdab6d452ad21d6fb21bbd6606a55a608a443 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tDphS%bW?A-tzX#_0* delta 15 WcmbQlIEj(nn3tDJ?&zY4?A-ty@B}RY diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 681a2bf9ca8617c21971932de992be1976485a7e..78067acb14621a1afe27de5582f3440aac485616 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=y@;k9@odnEuHUjz35 delta 15 WcmZo*Y+z(J=H=y*JGy8hdnEuG<^%Tt diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 4b280d0e3caa6f1f260e57e02fe2e2caa678bf6b..e5eb1028eb36f1988f442ce6beeb4feff8a77b4a 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tDphS%ba?5a!vB&-A@ delta 16 XcmZ3(vWA7-n3tDJ?&zY8?5a!vBr^mf diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 5798df518c5a57eaaa3017b1cf3c90755cc1601c..c7771c07509896bc056f3330ed3552b632e8d1e5 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=y@;k9@pdmAGFA+H2O delta 16 XcmeBW?qy~-=H=y*JGy8idmAGFAvOd< diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 82e15dcb9d02e4d123f17fcefe97be60706f61af..0600aeeb0e302c23e37ac5c5580564fcb869f854 100644 GIT binary patch delta 16 XcmX>obWn)hn3tDphS%ba>{grrDBA>u delta 16 XcmX>obWn)hn3tDJ?&zY8>{grrC}ISK diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 1725c1584f4e077f4184d2a08a4fec0a1eb2f6e9..d6b9ca29c8833e439108a5feee4db2e3cd0c3df8 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=y@;k9@pdn+>lA^`+S delta 16 XcmeBS?_p;*=H=y*JGy8idn+>lA&3M@ diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index a4067259f9fb063f618f00b9e44846cdad070978..295b5ef45c1c029bf0c801cfd293839b87ec4330 100644 GIT binary patch delta 15 WcmZo+Y++}gB@EX)Mv delta 16 XcmaFM@|K0&n3tDJ?&zY8>}gB@EK>yL diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index ab765cae7f87bd9d344ed573055322673fd01cba..7a3c34a8cf22edbb461f0ba4f6055a6a6e8faffd 100644 GIT binary patch delta 16 XcmZ22wpxtcn3tDphS%ba>?+&?+&Q1}RGNI~m3YGX$s*rYiFcS6P_hj+<1*7_z^zJfN&;o9Y7VuWZZQyOu0p5`e&Rf78(FNYEcw4wL;`crvGVxjIoo6b$igGz$YnA7T zEWK+Z^{!`$SDOV=YiS-Bl7v){kO>-Efq}T>MionfH2RJ! zspPzLIZu@+614lA-xpExebO>ZwUMtxyYROPJ}1Fir7~D55v$-q={vKDmNHl*QMOX> zQmY`^#6e!C6KAXO=22roaT^BU(25_F))3RWD74A9DY;cj3-m!cx{V4u2o6FQVXL~f zdg$u|;EhHK@`I#|us?e$T!8ymh5s$-2qd74MiTOaBn?s0pXyX{4z3PP74Aj~+Ec$1 w9&2fGeyd?%u;=5S_G)aYwh*wxRed#Ppz+&%EhwFndfZNNm<=|=vpgH0FSazn`2YX_ literal 0 HcmV?d00001 diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 45e87afe7fb7e37723d48b49a173024a301a12d8..19089a80be9ed5a466065bc4e1a8ecd41b63fdab 100644 GIT binary patch delta 16 XcmZ3>vzCY5n3tDphS%ba>}qTPC9niK delta 16 XcmZ3>vzCY5n3tDJ?&zY8>}qTPB{u{* diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index f00f1df2a78466d2c3d9802d9e62057c5aa325de..a241e0b8003351bf222fcba70165bc00c704b8a3 100644 GIT binary patch delta 15 WcmbO)KVP2Bn3tDphSx^6nfw4D6$Bdq delta 15 WcmbO)KVP2Bn3tDJ$bBQ*Onv|z;scTZ diff --git a/blog/api/throttling.py b/blog/api/throttling.py new file mode 100644 index 0000000000..f4eda89760 --- /dev/null +++ b/blog/api/throttling.py @@ -0,0 +1,17 @@ +from rest_framework.throttling import AnonRateThrottle, UserRateThrottle + + +class AnonSustainedThrottle(AnonRateThrottle): + scope = "anon_sustained" + + +class AnonBurstThrottle(AnonRateThrottle): + scope = "anon_burst" + + +class UserSustainedThrottle(UserRateThrottle): + scope = "user_sustained" + + +class UserBurstThrottle(UserRateThrottle): + scope = "user_burst" diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 5cab001f10f991109a5f3a90bd1c414b3b13c9bb..d274009ef57661ecea201bf3cfc7f2eeaa82b1bf 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tDphS%ba>?c?NDw+it delta 16 XcmX@ld7hKqn3tDJ?&zY8>?c?NDj@|J diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 7efc970bf6631dd015ba0711bdbbbc5c52dcb064..d0313942b682434e235e814954144910120eb636 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=y@;k9@pI|~Z{ApQf& delta 16 XcmeC?=;mNI=H=y*JGy8iI|~Z{AcX_U diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 510812b16b1708ba8e3e8c93f5a308dcfc72f46d..95c44146ed7fdb6ee59f1ea5b74308f6639671ae 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tDphS%ba><5_uDM$qQ delta 16 XcmX@XdV-bRn3tDJ?&zY8><5_uD9;4> diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 941d17d8db957be6c953cfe9af40181ec88993ab..e6521da5718b474be72d3fdf3280ef9043ec87e4 100644 GIT binary patch delta 16 XcmbQwGoOdun3tDphS%ba>=JAMBk%+e delta 16 XcmbQwGoOdun3tDJ?&zY8>=JAMBX;X&wDhvdq delta 16 Xcmcc4a-D_Un3tDJ?&zY8>;X&wDU$@G diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 372c6dc515b2ba0e5287e08eb0b7ba7cfe06cd1e..1ef94ac47adfec7f22b56503d6ad3ace5b7dd5ac 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tDphS%ba?3zpfB`gFl delta 16 XcmdnMvVn!&n3tDJ?&zY8?3zpfB(nrB diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 488ac8507b94a64844ab35dd7943b88932c4153a..3fce18532b5661727e7054f60ed7a636a61a6878 100644 GIT binary patch delta 16 XcmZ3%x`LJ6n3tDphS%ba>jl^ delta 16 XcmeBX?`CH==H=y*JGy8idkZrFA!r0g diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 135d4f67e4f4fd6dbf384a0050bedaf86385eef0..672b1d77e6c1237c2d70c1a4f8c79550b315407c 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tDphS%ba?5a!vB&-A@ delta 16 XcmZ3(vWA7-n3tDJ?&zY8?5a!vBr^mf diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index 139b314c972d0eff1807ebe4d6340ff13e4aee7d..d543cdc67cdf2742bb91638dc4c411b3abeb9798 100644 GIT binary patch delta 16 XcmX@aa)^c9n3tDphS%ba?AA;GCu{^| delta 16 XcmX@aa)^c9n3tDJ?&zY8?AA;GCi4Vk diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 5b2538bd49bdf390df33ae5c614b480c4348d6bd..86f42849d4d7580c9f382af94cf1dd1fbf79d353 100644 GIT binary patch delta 16 XcmX@Wa)5>1n3tDphS%ba?3PRbCoBYC delta 16 XcmX@Wa)5>1n3tDJ?&zY8?3PRbCbI-z diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 6a93dc4d4a4b17f331f5cc39f65e999fc73c90b0..7faa1364c04e11344b0a6b3dd6a1fc4f0ce02039 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=y@;k9@odkX*@o&*>G delta 15 WcmeBX>}F&)=H=y*JGy8hdkX*@B?K4% diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index deda6e42df350fe4aec8ef90cc028bd9b834d032..4d5c9b6de6d4d41e521445b2c3abba01afa9b7ac 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=y@;k9@odm8{8*aRK` delta 15 WcmeBW>}6y(=H=y*JGy8hdm8{8Uj!Zi diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index e38538a6cd58433bd9da2542cf00fd9c7de8014c..b98106a5284131e6adafe46ce39f3ffa510b9ed6 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tDphS%ba?1sz$CS?Rn delta 16 XcmdnNwu6n`n3tDJ?&zY8?1sz$CF}%D From 838128b45e7da612d44acb063a88618a0206c4da Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Sun, 14 Jan 2024 11:57:31 +0000 Subject: [PATCH 28/38] Finish filtering --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4397 -> 4291 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 12 ++--- blango/urls.py | 1 + .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2369 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 2859 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1581 -> 1671 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 3999 -> 4854 bytes blog/api/urls.py | 6 +++ blog/api/views.py | 44 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 311296 -> 311296 bytes 43 files changed, 57 insertions(+), 6 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 9a4a8430fbbfe95109f6103682e65c20077a9a6e..bb98704a9671b9fdfed375cc5d2d78c70b1a6350 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=yja&RJB4FDPw1RMYW delta 14 VcmZo-Y+__H=H=y@;Wd%11^^bj16cq7 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 05c8485a2d86084c9c7bda42426c1043f5cb453a..bb08d9aa75f6f6e0f1b36e72ec116f3db90c26d2 100644 GIT binary patch delta 221 zcmZ3hbXZZ@n3tDp@sY);MJIDRQ6%4cT8uDQcrP;(nxWR(oAuQ z(n@iS(oSKD(n(>D(oJ!T(o1oV(ogY7@l5ebXHM}>@k#Mb@k?h(@lOdz2}}t}37*4} z5;BK5${-~)B`hU8B_btq4s%LWN^~Y;O3WOlOvWg~6sBMX&Dcb3Mg|5hm#oCR^n8Wl z)RL0Sy!2v)&3_n$IX1^~En;F6oWv{5XtY^|SCnb8CI3q{3!o#5EGBCRI5X~;oFmZ3 K$T68wPzL~RGduGD delta 335 zcmYjMJ5R!36z%twN7D!r6B8E)WY7v0m5oU#C@2pVd|e+{dYTFb(v8_c znOq2oj*d=DCT{);3zIiF$$gx2Zq9r7c_ESr1mw?Q&wQH`gdgEw&A9!Bi|*hhQeY2p zq>zT@@CKtrWGqHY$dZChTE-Sdk)s$mt-wzz@)XB5tzriS6fF@Yl(CCF%Y%JXP{jcb z9S@Eik=AgG6A(^u=7>1QMT4O>`LPaO5tK_k$^=2qH2dEyEES_@>Mg6S8tsm$8oF_1 zs&(DCHe2YbsH++MPOs}-QyX6>cza))aBA-M##DGma^sAoLRm{y^X1a3+~f1(l;m|q z4MX80Z?)~3kvBb=6aC@TEcg4gl$Og@?62UjFX_@dN&913V*^_XJ^Dq?IFm*DDHQty D6`o)o diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 4ac6c6b36cf9fa06b7bcc61dab161b9bd74d1af4..88490a6d5504ff62d8a2b9bcf220ffc83f2d20a3 100644 GIT binary patch delta 34 ocmcc1eV3cln3tDp+KI)f/", blog.views.post_detail, name="blog-post-detail") ] diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index d12dc6800a0825b3249a262284c192e3a33a06be..49fb804334e026ead01a828d04bc983e859d1a26 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=yja&RJBBLEtj1S
KMYy@Wj delta 15 WcmdnMw}Fq%n3tDphSx?mEp`APQ3Ip^ diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 07ba2f2fb1aeffa5434859d70ebd5f0711e1b0d0..235a46c66e7e326af89c092e323591e83b32514c 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=yja&RMC10w(*Tm(%3 delta 15 WcmZo;ZewOM=H=y@;kA*ife`>3K?8~a diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 1d237e21f8489c13d37abd6ccdf4ae665f3cdca9..4292285f282a89c94b54ed6ec3be5103aad7a51b 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=yja&RLX8z%rDo&*H| delta 15 WcmeAX>Jefy=H=y@;kA*CjS~PIg9AbU diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 3a28bdc2daf525b9b960ab4448528ffb91dc20bc..3f20a9a14b6a008342c5e7a4bf4e8a7177b2ef7c 100644 GIT binary patch delta 15 WcmZ3+wv3Ip` delta 15 WcmZ3+wv3IjXjo delta 15 WcmZ3(vWA7tn3tDphSx?mH6{Qa&;x$} diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index c7771c07509896bc056f3330ed3552b632e8d1e5..fcf274d9c4f7886e2fdec65c081fb29058dc54f3 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=yja&RMCJ0k!fE(Br# delta 15 WcmeBW?qy~(=H=y@;kA*ioe=;W69bobWn)Rn3tF9$-#|m)|>z))C8me delta 15 WcmX>obWn)Rn3tDphSx?mYfb)6T1G%*)Hwae8s;E_Mcn#|%h-3&?f=;^GS%m8UTZYorQiNvCM0Xk{`sGp1;# zNcJ*M-o~iN&1%jNC6mG(%%G{W`4M9llTDREL4I*bv3^peZb@cts=iHeNs(1SYEfo> zN_<{oZmOOBE#~ypl3Oe}nZ+elykNz;P{osdSl+T0Nds-2Y{weHrVV5iX-}TP>c|)| T`4(#+7ZW2BBM&1Rvj8Ii4qq}k delta 99 zcmZqYUCX0v%*)F)!)tM>4m$(GV+JI^1!Ow_aq+H=%F`GppJ$ZgW-(`ol1bqXX3*5w r{DU!zY4SXlx2(6A(^E?(PhbsU(*mk4(wh8=)sZn^vJP7ylK>+C8g3Tb diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index a241e0b8003351bf222fcba70165bc00c704b8a3..7f47b84f491585378be361b5d6684c4468896729 100644 GIT binary patch literal 4854 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 ZFY2!etX-cf<32zMRW6$g&P-v(`48`ETAly^ delta 1923 zcmah}O>Y}T7~a`kZ|t=ldmYF2Chpy7bHaNsX+LHq(Z@B0viKn z444`)bzq7oY#gX@pc+6;165*WV9GrIYzCNFU@FW7#yw}6Ok)#%D`?ZUayjYG1s&Q^ zE~oyf%Zt3ks;A_Xz^cM(=PMWXZC2kUtikrD+05q#n`O;24aGR9rxaVbW^Fcy5;}in zjCELDaSH>S_nLF_Y(bq{WQ$KU?}mJ&e=jS>nf%UpZdIWLqAI^O@07=2IfWg;)+C8d zEEr-;zBC`dU&LeM2qgpyVG<#MP)4XAxCk}^S`x3UU#@DnssprPhG--SE^H#|;ABqz zkmw9M8bOUA^BA6(Krj)mb<_aqBFu9~n2%`42iDrtp={u4{>w=Qxob^NgLDZ^V+2?# zF)g24E@{fY%t@CKrk`mv#SAF78K>9#VYJ!f$4}%hsr$EQ(Q*^OGh(Z|9rgML!axqo z=8@P8xxX_|xte@vyJT7J+Dj+47z$n0;@U>cq1o534u)(H;~Z}_hTdK z?$X>LlwvF7qSy6%pK>t}oVpvg;q;o^%yia=^8D`>Vax(`2kfb|l~D|MRsNi55l{Y+ zX{P7#-~z&;oXvhY1zk9b_WI(f3f9xbO_bdN@RE|G#!m{cj5Cn&7Gx?u33(J-J3T*w z_*LUDYk}9nGp~|X@x=DExyEMDJK!6j6=LJHM3N*)0ftzH-R~a*Y!eh{a&vU)K6Xdo z)$t7FBR0EYH;k?QWBeb;TcwN#w_t`kfTk-&`FOM>e;uveSpiBk5Ilf$d*Ur5?jl@W z7-b6&ZOdD^8cR(F4J|5x=*-hEEVaXD^(Y6Z{6z z+{Sq<7qSMjnTLJGef3;Htg^-0Q&+$x-`Ww~fFJk8{!PZW`=T55MW~)kTpp6cR=ppg zZU^>MRZZ1=Phd6!g}%J3adJ86vm>9c5I7N{T1L;4%;hMOyk4>LIx>J}!7f;8q<}FB PSzCR#Yj)8rCW_|Y5YT9q diff --git a/blog/api/urls.py b/blog/api/urls.py index 544054eec1..19e365a197 100644 --- a/blog/api/urls.py +++ b/blog/api/urls.py @@ -57,6 +57,12 @@ path("auth/", include("rest_framework.urls")), # ... other patterns omitted path("", include(router.urls)), + path( + "posts/by-time//", + PostViewSet.as_view({"get": "list"}), + name="posts-by-time", + ), + path("posts/", PostList.as_view(), name="api_post_list"), path("posts/", PostDetail.as_view(), name="api_post_detail"), ] diff --git a/blog/api/views.py b/blog/api/views.py index 55b6eb30d4..abeb3bb390 100644 --- a/blog/api/views.py +++ b/blog/api/views.py @@ -8,6 +8,9 @@ from rest_framework.permissions import IsAdminUser from blog.api.serializers import PostSerializer, UserSerializer, PostDetailSerializer from rest_framework import generics, viewsets +from django.db.models import Q +from django.utils import timezone + from blog.api.serializers import ( PostSerializer, @@ -22,6 +25,9 @@ from django.views.decorators.vary import vary_on_headers, vary_on_cookie from rest_framework.exceptions import PermissionDenied +from datetime import timedelta +from django.http import Http404 + @@ -57,6 +63,43 @@ class PostViewSet(viewsets.ModelViewSet): permission_classes = [SessionAuthentication] queryset = Post.objects.all() + + def get_queryset(self): + if self.request.user.is_anonymous: + # published only + queryset = self.queryset.filter(published_at__lte=timezone.now()) + + elif not self.request.user.is_staff: + # allow all + queryset = self.queryset + else: + queryset = self.queryset.filter( + Q(published_at__lte=timezone.now()) | Q(author=self.request.user) + ) + + time_period_name = self.kwargs.get("period_name") + + if not time_period_name: + # no further filtering required + return queryset + + if time_period_name == "new": + return queryset.filter( + published_at__gte=timezone.now() - timedelta(hours=1) + ) + elif time_period_name == "today": + return queryset.filter( + published_at__date=timezone.now().date(), + ) + elif time_period_name == "week": + return queryset.filter(published_at__gte=timezone.now() - timedelta(days=7)) + else: + raise Http404( + f"Time period {time_period_name} is not valid, should be " + f"'new', 'today' or 'week'" + ) + + def get_serializer_class(self): if self.action in ("list", "create"): return PostSerializer @@ -93,6 +136,7 @@ def mine(self, request): @method_decorator(cache_page(120)) +@method_decorator(vary_on_headers("Authorization", "Cookie")) def list(self, *args, **kwargs): return super(PostViewSet, self).list(*args, **kwargs) diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index d274009ef57661ecea201bf3cfc7f2eeaa82b1bf..26648c52ad403308a809f5a46dcdedae4a91c28e 100644 GIT binary patch delta 15 WcmX@ld7hKan3tF9$-#|mCs_a}i3K+R delta 15 WcmX@ld7hKan3tDphSx^6lPmxvZUl4y diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index d0313942b682434e235e814954144910120eb636..ea925e0af1a70f78afc8a312ecc62dbe1c9eb85c 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=yja&RLXD+>T0cLV7F delta 15 WcmeC?=;mNE=H=y@;kA*Cl?4DBTmvQm diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 95c44146ed7fdb6ee59f1ea5b74308f6639671ae..f499a369fe9f71c090b4fc997ebd924a7dabf1f8 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tF9$-#|mhnN5-O$8VL delta 15 WcmX@XdV-bBn3tDphSx^6Lref8G6Yos diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index e6521da5718b474be72d3fdf3280ef9043ec87e4..3fda4fedb6e7ad8cb87120b4b3cd9373784afc80 100644 GIT binary patch delta 15 WcmbQwGoOden3tF9$-#|ml57AXIRq~N delta 15 WcmbQwGoOden3tDphSx?mNj3l;9s_Iu diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 07777942e93dbf83379fe412c2e6f35e5b11f302..1a80149921d511dd7f85f4d3519a3d6b0616f5a9 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tF9$-#|mflL4=^#sEJ delta 15 Wcmcc4a-D_En3tDphSx^6Kqdeq+5`Xq diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 1ef94ac47adfec7f22b56503d6ad3ace5b7dd5ac..532c150b0af06b1a42a0111ee5f4ab83933f3f71 100644 GIT binary patch delta 15 WcmdnMvVn!on3tF9$-#|mT1)^VV+2kB delta 15 WcmdnMvVn!on3tDphSx?mEhYdTNCS%i diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 3fce18532b5661727e7054f60ed7a636a61a6878..e4c11462cdd7b00129c113219cbe476340542218 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tF9$-#|min3tDphSx^6MN9x6as%}M diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index a00c6e3fcc94b92e9a0dfe2673a910ca14d183b5..d55d1d639e2b55f85ae1c221dd5b07d61574b366 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=yja&RMCD>DEfTm)tS delta 15 WcmeBX?`CH+=H=y@;kA*il^FmWK?9=z diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 672b1d77e6c1237c2d70c1a4f8c79550b315407c..a9ada9218987135d762b103a046162919f296fdc 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tF9$-#|mYD@qk>jXjo delta 15 WcmZ3(vWA7tn3tDphSx?mH6{Qa&;x$} diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index d543cdc67cdf2742bb91638dc4c411b3abeb9798..21beb27baba44c229d1a87f715bcc078c41fc74e 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tF9$-#|mHcS8|e*}a8 delta 15 WcmX@aa)^b^n3tDphSx?m8zulDWCOtf diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 86f42849d4d7580c9f382af94cf1dd1fbf79d353..5aa2aa13bb0956763afdf6298ba7942005ffe0e7 100644 GIT binary patch delta 15 WcmX@Wa)5=+n3tF9$-#|mR!jgTLj-;R delta 15 WcmX@Wa)5=+n3tDphSx?mD<%LTC}F&$=H=yja&RJBD*zh?1UCQx delta 14 VcmeBX>}F&$=H=y@;Wd%16#y5m19SiY diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 4d5c9b6de6d4d41e521445b2c3abba01afa9b7ac..6d15952072632a82ac6b4f0ee604bb9282828e4e 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=yja&RJBI{+Iz1U&!% delta 14 VcmeBW>}6y#=H=y@;Wd%19RL^P19|`e diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index b98106a5284131e6adafe46ce39f3ffa510b9ed6..33123dd18d70cd09ed05725188ee68ef299cab06 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tF9$-#|mM$7;thy-f@ delta 15 WcmdnNwu6n$n3tDphSx?mBW3^~Z3CzP diff --git a/db.sqlite3 b/db.sqlite3 index c492123b8c1389e8f536c8edf12364ceca9a680b..30d65336db81d81fec342702048f3399374b418d 100644 GIT binary patch delta 1304 zcmai!YfM~46vyw}v&%lbd(UFGStz6~&@>>g``EiIOIo^YftEtMh}23`U}2X>WqI2I zZROFZ@exbigh~CNLMVwJOfe9zO{0(~CZ+~0N~K_lu`${vwuz5ugKfNvF{Z@mhnYDu z^PB%UbLKHHuxVgm({MuUD8n$NTG^)+mSIT6*$kPCzEeAnAVX)wV6E4I3Y}9ORvoZD zIdamLoFY1FL{W50g5=B;#7xoY5JivZ_Q!vO8S(Z^(2zjRHgv}UeZ%_0^u}4-l%w7PBk%|joi=<_5 zCJ@QjYA#ZleUivi3)zxj2HwPA9k24HDbcZJ!NGLkm_eV{Xt5Yg-poix+xGrIU$D9S z@v6egqJomDaCzSo2ZLRKma4M-ttCxW-fd-Je}}WhpPhcFy+_^~DD7$Qe%jag;Lc^i zBe}9Y?W!1NZ2UA%sn8^FBZK!2Wad`xd zR9sG3jO4X_Vg{UN@DH5F8&k0ZvlwrKOtMh|;y@vEcAnTyul1{I{lw%*jcv{0Lvf1E}X;<7LY|%d91AF>&X)YAwS%x#B|3#CS0?oeZ*Mrz8S1NV3M-9D$dxO*bB@=$o9fycjs<)BnmeDOAI!1Sd;65*p3aVa z75fhzJ8-nJxZ<&5cfpf_yIm;h+I=w4nUfPz!oH^Po^pRfO=W4>-_c9%=-vM7bR@}@ zBZ=zB9NTJ+GxKK{e3ie(Pvai`K87&`zebfmGZkCg#iwn9GV*_MnWGSWeU5dgORH=K z(IhW3_$_{jvrjq4!^4))O zBIxORS2gRUB}j>OP3pa?P(eroEnfl;QRvG{aMu_z*h4;|Io9;zwO4MSZ(oB9BGKVj z*p$fUSuxRmEVV6zXbc+cy*@I8|FGd@xJ2q{+6okq618Oo9%e}$?Y|CJNPw2Ff?r=c zR5e&jCstu6DOA5(g@mMWVx6$+cBu|4e2x0XnP3{vPH)N0n39?mdx=9>dEXM(}BU@)yY zBlVIX2<1GyJVZf&)h*dxxOA_kgV2LNb;Y_rGqe{hCXi99@)Y@am78NDfk~nAf)#y{1CyF*bD|bGKx}T3J`nKG9@Pwkd zd2UtI41xA(MkqCSQ`3zj$H|>n;9XVV_2sPc$(HaqtBrh;&y#igx)*rkwOX+s;;Gt1%E>5(SD=dBh~b2~OR@X?a0Z!s3>~aF zhBA9Fhz?lGE)3(+M8agu4&oMoovd;g3)sLQy4amz98z~E_5-ERxF=E6!T*oKZjWF# z_*nBr(WSr2NlL6!nQat3>UPC`q7<6wzpWd^KG?>x#&8Yf8HdMko(Nl6!#f;+Evzz* q0eNFnRpVyX6~`jjV0?^YMrOCOSh99mrQ%+YtcFx0&G_4Uoc{pI#s7T( From 049670ce6ddfafd4d0be134439494fa39611ec10 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Sun, 14 Jan 2024 14:57:13 +0000 Subject: [PATCH 29/38] Finish pagination and django filter --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4291 -> 4534 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 8 ++++ .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2369 -> 2521 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 0 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 2859 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1671 -> 1671 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 4854 -> 5687 bytes blog/api/filters.py | 31 ++++++++++++++ blog/api/views.py | 39 ++++++++++++++++-- .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 2 + .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes blog/test_post_api.py | 2 +- blog/test_tag_api.py | 2 +- db.sqlite3 | Bin 311296 -> 311296 bytes 46 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 blog/api/__pycache__/filters.cpython-36.pyc create mode 100644 blog/api/filters.py diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index bb98704a9671b9fdfed375cc5d2d78c70b1a6350..e78a47f94a97f908cd3f749bc833bf47810dbe46 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=x|cs!A<1^^fb1G)eJ delta 14 VcmZo-Y+__H=H=yja&RJB4FDPw1RMYW diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index bb08d9aa75f6f6e0f1b36e72ec116f3db90c26d2..eebae14a567bfe3ae792b72b50a409f1bd8cf724 100644 GIT binary patch delta 606 zcmZ9I%TE(w6vbzzb%3T|14ar}p_BsUF;Kxr6}8iLieu}vGR4RBF%F*L%ZNw|MNAqYQ& zf8H3^Sx)22`^2XAuPlMCSm|7EMf`ESYbg|gwhQ% zktVQ8lUPHV`!2==tal|>q!>1EiF-D1xj(P;=T%o^K{|&FuHia1xjv5@bOG&~G=%}0 z=EONOxJ3zMX%;FaIdjPIpn2qJ0R>7yqeT>H2@)-H_X@U1!EIWFjyou^0Lr)v0~HoT z75A_W6SZy-JGhSrc*rC?>dLeR!eczaQ#|Vi&cMQR-q7xMPeU?=)Nb#)m<>c|1TSrm z)vZ1ERnzesz38bUx!qEHr_r?beEYz8Tle>s*EVxKyXn?FrD`+BcyqAp_+0&2{sjN( zR{H-_CvOz`LB)Pf&VI4)cxWY0TF{E>PPt}P)h*pn zYkI}7@@3UDX^3w$%hXAu@xP{`Uao1|R!+^AG^5a=ur7}FK87a)a)!6{Go8cJdGTv! TFrsxz5r0IMBvImo207wy)^M}p delta 364 zcmYk2xlRIM6ou!X83#ik0SZM>S%z)c5!7)<5pmyey=r&JA3CECz!O-QX{Vz$nqZ8* z`Xt&L-@sogZ}Od-;w1Ovyy$Ncz3g^7yYJoBhhLIDrGMuWzACtVy4N2&+($zQA&dy3 z&=KPr4I@r|Bw9`+gA!+OAO!*ugGWv4?#e;1Eq)#gVO05yv>eDb8?iD#P7L^aTU} delta 15 Wcmcc1eV3cfn3tDp+KG*9*I5B5u>~Ih diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index c174c6aa658e768b2507ce93b7d64c9e4c143417..d90b904785bf20687a67c386afacbd5e46a7e352 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tC;;qgW`OC|s!w*(mg delta 15 WcmdnbvY&;`n3tF9$-#|mmP`O8B?Nl_ diff --git a/blango/settings.py b/blango/settings.py index e4a97bcce1..dbd4cd61ec 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -60,6 +60,7 @@ 'allauth.socialaccount.providers.google', 'rest_framework.authtoken', 'drf_yasg', + 'django_filters', ] MIDDLEWARE = [ @@ -212,6 +213,13 @@ "user_sustained": "5000/day", "user_burst": "100/minute", }, + "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination", + "PAGE_SIZE": 100, + "DEFAULT_FILTER_BACKENDS": [ + "django_filters.rest_framework.DjangoFilterBackend", + "rest_framework.filters.OrderingFilter" + ], + } diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 49fb804334e026ead01a828d04bc983e859d1a26..b448e0d0aa6f532d70258950e8dfe7362d18665d 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=x|cs!A<5davD1IYjY delta 14 VcmZo?Y-eOM=H=yja&RJBBLEtj1S
KMYy@Wj diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 235a46c66e7e326af89c092e323591e83b32514c..febe343da18c51b3b2921b29bf28e97a6abf3354 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=x|c)XFVfe`>4?gQ%p delta 15 WcmZo;ZewOM=H=yja&RMC10w(*Tm(%3 diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 4292285f282a89c94b54ed6ec3be5103aad7a51b..4d66b05b0eeb184b32b4a720392e49c0392c0f47 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=x|c)XE~jS~PKFax6i delta 15 WcmeAX>Jefy=H=yja&RLX8z%rDo&*H| diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 3f20a9a14b6a008342c5e7a4bf4e8a7177b2ef7c..332e83642db7d7b4349270466e708c7e8bfd6695 100644 GIT binary patch delta 15 WcmZ3+wv3Ip` diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 99e13d491d9fad2876114488073225a7b05aa2ce..79e9e3270f7eb5fa6f144c13006f6c3788c5ed94 100644 GIT binary patch delta 14 VcmbQlIEj(Xn3tC;;qgSa9sn7)1L^<( delta 14 VcmbQlIEj(Xn3tF9$-#+iJpdcS1WW(` diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index bcb4c73da197f1ba7b20369fd960675aaebd41c7..14f84fe457893aa1a1ebe99e6ef8321ac5d57361 100644 GIT binary patch delta 14 VcmZo*Y+z(F=H=x|cs!A<3IG?;1GE4D delta 14 VcmZo*Y+z(F=H=yja&RJB6#yCC1Qq}Q diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 65f186a6ec55f36ecd934967d87bb15815f52e06..514b1a6312ac18735bce57f37f267dbaa78589f8 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tC;;qgW`H6{QceFNYC delta 15 WcmZ3(vWA7tn3tF9$-#|mYD@qk>jXjo diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index fcf274d9c4f7886e2fdec65c081fb29058dc54f3..a5b86371c84dcab7a4a175812cd45379dcd8587f 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=x|c)XFVoe=;XzytsQ delta 15 WcmeBW?qy~(=H=yja&RMCJ0k!fE(Br# diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index e006f7f876e7567a89e8552b45fda28210a99112..1e8d7f6d25d300904652a1629bd32e65ef7d9594 100644 GIT binary patch delta 1036 zcmaKqJ5v-v5XX1+IeQ%Ey+EFxP#m}_6ciLjR)LmU1Om!Mn_Ml|S|XAl}vdwzsEyw)@}nz5KJ{E)NdoO20qLA79;TY;{r7 zG^zPaXud9ueN!-@3*)2iTTe7$3hP)C)_dKzg)N+8&36Rf(L7hJvFUZpy!bJ+)^NpT z#QAxGwU}=R9W#t0-UwO?Ph}FM)?v`@$xY8xzt~JA}puD4k{tHwgw|3XwY7 z&$k+n9yWX%72S&fW@xKUm_;o5`GekWJB;_FXa)&n(o#vOyVLHqG8OS|pb2*=XGFcV z>susV%3nmCj_fA!)uW!nIFd1@VR2SPk@Gb0>`xYFMFZy4sl9J!I?pTNY|qk_O3hv@ z;XlGGtJJ9v^xZy{#U?+L#OT=u$^Z)! zf&uOiU|@m`F|g8w{{gQsz{CJzV&FZ4phzvleSG)s-QD|spWm1Ei~2cT&wSi}?mbfl z;RF97&Od2>Uuz12;0YFU1xxf&W65Q%=%yZvmh4Kd{6Mf2SJ@E^mG@bbpAlQ7Sia>< zBF|v46nK*xF9gu}C)Qn6Z953TwljEPAR+{IH)}eB)4$_=yyF#XT>{#R)24SPygKqG zE@W{Ha|HcgTqj7lfEb3m{iU-x!9~Aev4c*h{Ly6BS-lma-j6I!UPUO~qJV z!zpg&DDt<^#1XQp!yhX3`v;81=&BEa5 zKDIHh%E#&oYom{2B{6TE|4_F(BqNrhz=QuN?sCxDhbfNrt(j-~h+n_cAMLP=_riGs z>9SJ0Bme07&SJ_sjzB|bOkxF56M>?ABOj;Tu`?U^d?9_WL5hLoB)bQ?lk_RiU#C}O JwU{ZEegcc#spS9w diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 256b6af1ed8f10c46ab9ea363753bd2dd5ed64ed..60fef442c87f5907e57868eb8e13e400d806278a 100644 GIT binary patch delta 15 WcmeBS?_p;%=H=x|c)XFVjTrzQ3h8?k+Ky-)QnnGwA!CCh$blUXhb zPFHX(+bpEK*{rGfv{p7M*hCaIfRWqoKfNDh)?yp8kcv`Kvb?a3d@5Il25v70$|=YAIP0JsRZr$<~2 z-V4KQT*0-WVRJp|$F@%0ohh{mrKRMXLV%xAdb?o-vO%eWcSLLiMc^TJJn3&lok7-_ z-!Fy>S&HFQ@>~w_QRp?Bis7VStGR?t&WCKB4`)smJy_q_5Wzfy0UF@^CjMv?%*mENufZti3AKBd%B{sQGtU8>e~N@ S!`5F_V!ZYc45CW?H24E#6b9G; literal 0 HcmV?d00001 diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index 5fdba81393eb481a8e4d50b65c6af899df7eab35..aab1d93d58b8e048601a381935810b44b1f4fdd2 100644 GIT binary patch delta 15 WcmaFM@|K0on3tC;;qgYcbS3~O8w8^O delta 15 WcmaFM@|K0on3tF9$-#|m=}Z7Bi3J4! diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index d47d132e74a7370696c5d5a0bda1e7e6fd84655b..3168e3b504a733a40685b8e8d679ea227ac55daf 100644 GIT binary patch delta 15 WcmZ22wpxtMn3tC;;qgW`Rc-(xJOl~= delta 15 WcmZ22wpxtMn3tF9$-#|ms@wo1sswBR diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index 74bcb87d793b4338de5c4d9247b24d913a5477c4..f6a17189521f3285b08fc901b6c1e32829b0b598 100644 GIT binary patch delta 15 WcmbQlK8c;pn3tC;;qgYc9%cX@zyuip delta 15 WcmbQlK8c;pn3tF9$-#|mJN^2Mt&~(x6sn}EyLgjHzOl9nQ2nrimcdXcI+@mzuQqMF0-=k zJ5eQenXCJyXe#!Yr~Bn-IY86&&>E5@d8`Wfrs*V%Q= z@nUo%zR7NCj+e&giY2kkFCUplCVDIUl|k&WD9@>Wj8ep0N=*ZC@8+1n$yt2yNu-8Ft))BTj+Aa3j}UVUgZZ@wVo zYMRRJioTFxCv94)c0Wn8hj%GzZT!4@H`WNuLNsKMOlShBpjMf1KXtaoE>%wzMIJbO6*Gt$kNyK^Tqjv?L7P zQ0|jZ?4=@0v4Z(IfSZM}I7s?pqv;fjNRNnT9tGX8B}#;~fyKmnEFd~>bJ0m;kR>Fn z*9kgXqP-Jz1=KM6B#`^8?BKL)iL%qSfq8|zl+!RT~MU(}2 zseF`WJ2$W1M0bYv^+6bAq|2-WQHDPgy<2GMs{q1aCO4QR?4Hvr9T}`FDqWMgVhYd` z)2zx(oSdaxTJX~_%{H1d%5As%K`h#B<+a;!!gnL;SKIBccY`P&k$U@;vnn zBo^x(*hsRzm&omOC+LXv$5GJlCU_*>^lmhsovlXd2U ztk4;B8av+VTps+GtM8vzR592%IBOCg2kwCCOz1=LxJ3AZwBr2@JQD z_bwBTgl(avw1^8~JyYZUA8{v-xDc28BKLw5#H|qD2_Z>c@&W;JqnC@jiqV^B193^e zl5k_<+CbbQBHCP`-9lXEa)(>oerB>Mt>KdL;8C$s^ z(ctChIYk8&zbhzu)8OR}#-=d#mtqXFJw9E`&Z@k6Xnlt|==b)K`5VM^Xri`(OmJ#+ z|Lrz10-Hu`4Uvr~QY*VJ_Fj+%KwH{Mb|tbMo0!zi1T>cL0Lhj$#utQ@LXUewY`>sD zfmL9*`{_aT5i*mXbMg^CgW9A^3G$w{Sp`*qzu!u<}A;0t+G|M9Q<9=G3Pa` z11?#Xd9XNQhONym4dNx@LcvX)T{vT%sbhH_xPFx`$6*hABjzW}BD z6rgFtpgUCKl`S7JYq|G=M=cyhuT@#*74||4S(d!x6o2bK}Ap*O)LTl1;w!rE+~#&Ugni&R2X}_1np1hNF_hQ z{6_~3Qcvpdh1r&m0@J73&Q_JYwo6r+>pD_7E$=9h*Mx%qe-m|2F07KfWDLu$*1g;aHosTG$Y(Y=_EjqgB zF<`DQ&jJ5cyZrAQKnIb_b<#P~=6`+6mx?XNs+r*xc!8S9Yy0p(SL|Bf9~_*^_5FBX zYa6v&S8zY<`xFu2#h(+i2Lv7hbSwb+Q6?Gc`#roMY9fludWLjPv5}(m5v6+IxrJD6 zWhIKw92k@WC6od-QoW6;j?SUHad7>sWY>>((~JUEAxD<@sSy6&R@m9nu9NzK6#jl5 zMCIGyeZmpC@_h`*I|SwkXyd<2J$tz$m#$ z@D2PW#jF?P=&F22-z0|7hqzI@ho+-XX22wkBddp+=+OF>HjgsER;6?o5mGywjy;12 zsvL^3@!&dDEyQwk*PxQMEu|;e+7o$7fdC+4~?G;pBh2RIi9sQB_cZACiQm# zHb?i!7VeR)!XNWuUf+h;v>wO3SVVccW2c8R;7EfzyuJpqMt(JIQ(f8`Orbi8oge4i z8ow;-8#G&*peYv5Z_)W(avIC2I`7dHxWykIbD?Cassr?H7DCn;%{WIPUDMZtv^CB{ z)y9Wq4Ra)A1+_4`R%`gFBb9X;JwF)DuinLIOMeEDr-)|xWi<3HM3Upm(?oZ6T&9-z zrXzN!3`%uGRW22KRN3XV-}GSFEqor)B_OL0&ttGlUA(YU^nv4!F0*dm|CnwN`cnW~ zelT#(FLr3>rcRt(DCllN@7L30uX-DiIB?B6%r6B@3I}K%ov@%czBk4dPW_ z3iEVNW~&2~j*2<}j99j|aWZe^zMFrWd5`MM^izPURmauu_&;anZ?3girmJ98UkLSR ex#2a+_@8cE#k<{@@$|Qm70)vlow?E++J6A&a2_83 delta 2328 zcmb7F%WoS+7~k1f*6U}}_z@>|(%4DkHcitsZF%%vL{$;mKr0R_A>(Eysoh;W%x(xp zi7b(xilT~6Dzxf{Xee=!u z>zThNOUL7JJMrXmHn3k&epC8>7Rcve_){O3K3h^f&CxvF(Y>UT^wLh6C{&?w*YHfo z^fFFHeka_lmveGbPP)Th-pNZj<&Jox&Zt*#3i5lOE23nqeOaMHG<{d0X+|35ZOxek zCPTBpWPzCi<{&URItLxYFoiBNLls(dk9f1rtc*A2 z9`)v&Iii5(_^xeR8nYbB(*xUNn}9S*C%RGrzGrD^mC!Psq*FT@JxHhTDmaUeb4=P* zy4qkz4{fX4gdV0d9W7_R=b0X%C1joBecbFsNA)SiqjXLxF3@AwmCC$msNabN?Xmb( z``J7IyTK2LC;CD*3*rQB4(^ggY+}O0vtqw-?VTK|4I|_cOoTB617QSV6rq4%Ba9<- zyzffrotFS+VEE|7f)F<0B?xj*{BBIYy(iEBTI_L;%i~1^9bp{dS%JzhF%P2~2=Wo% z7^5UFJ~H!d0+moh`$lc`tvcJd&Vs9z2;UPtiJtcaParpr@T`!NF!2HmA6JGYomXJqpAkolkrE|Ty{kA8s!<)@HZ@>nW*A*+`9XJS4fhRg>^D`a-&Xm( zO#;@^Hi%M#nmZ(?(1D$fh6Ng5^fYcZVh|$IowQ-{NpBL&qcqkt58^bwseY=^#A68j zA)yK+mb_Xa;l8!?n{M5|#b~t_RI6^lfHZ6C!L1e-e@4D+C&B^F-d$&Y5bEnb<6*4s zS8L5y^N!bA_hplX=1Lt5IgdjFtQ>)TxH*)Rq^s<0q_$7jJMVEicnh1lwlYO9uN zlA zp{KJ?yOWOPA;ab2WcMt?A=9ifM-~=wM!rJpP3Et)nm&{LDSn78n%J%UlqknH+HZEyzy+be-`fB%b99mF|o0Q>QzIvKRVR@q9y6dWeRv$%tqeS{zPYoxR8Y zGwd6n{t1ju3M$9%tCbUCWdC2{%+Oau`xfhdaEUWGyBC(O;FSpfNyYR8DTxc|^f2b< z#9nVv=60`3dFS#e(MpezGva=_(3ab@2#T^kvKlf>Up04ICA3a^ExPWqvji7~Z5dNj nB)0nu5&5O%%#@032V=&dJ!r~j7FcaCZp(krqHPm#G-Lh?ZY|Cj diff --git a/blog/api/filters.py b/blog/api/filters.py new file mode 100644 index 0000000000..592f87c848 --- /dev/null +++ b/blog/api/filters.py @@ -0,0 +1,31 @@ +from django_filters import rest_framework as filters + +from blog.models import Post + + +class PostFilterSet(filters.FilterSet): + published_from = filters.DateFilter( + field_name="published_at", lookup_expr="gte", label="Published Date From" + ) + published_to = filters.DateFilter( + field_name="published_at", lookup_expr="lte", label="Published Date To" + ) + author_email = filters.CharFilter( + field_name="author__email", + lookup_expr="icontains", + label="Author Email Contains", + ) + summary = filters.CharFilter( + field_name="summary", + lookup_expr="icontains", + label="Summary Contains", + ) + content = filters.CharFilter( + field_name="content", + lookup_expr="icontains", + label="Content Contains", + ) + + class Meta: + model = Post + fields = ["author", "tags"] diff --git a/blog/api/views.py b/blog/api/views.py index abeb3bb390..03db868835 100644 --- a/blog/api/views.py +++ b/blog/api/views.py @@ -10,7 +10,7 @@ from rest_framework import generics, viewsets from django.db.models import Q from django.utils import timezone - +import django_filters.rest_framework from blog.api.serializers import ( PostSerializer, @@ -27,6 +27,8 @@ from rest_framework.exceptions import PermissionDenied from datetime import timedelta from django.http import Http404 +from blog.api.filters import PostFilterSet + @@ -56,11 +58,28 @@ class UserDetail(generics.RetrieveAPIView): class TagViewSet(viewsets.ModelViewSet): queryset = Tag.objects.all() serializer_class = TagSerializer + def posts(self, request, pk=None): + tag = self.get_object() + page = self.paginate_queryset(tag.posts) + if page is not None: + post_serializer = PostSerializer( + page, many=True, context={"request": request} + ) + return self.get_paginated_response(post_serializer.data) + post_serializer = PostSerializer( + tag.posts, many=True, context={"request": request} + ) + return Response(post_serializer.data) + class PostViewSet(viewsets.ModelViewSet): permission_classes = [SessionAuthentication] + filterset_class = PostFilterSet + ordering_fields = ["published_at", "author", "title", "slug"] + # filter_backends = [django_filters.rest_framework.DjangoFilterBackend] + # filterset_fields = ["author", "tags"] queryset = Post.objects.all() @@ -73,9 +92,7 @@ def get_queryset(self): # allow all queryset = self.queryset else: - queryset = self.queryset.filter( - Q(published_at__lte=timezone.now()) | Q(author=self.request.user) - ) + queryset = self.queryset time_period_name = self.kwargs.get("period_name") @@ -153,3 +170,17 @@ def list(self, *args, **kwargs): def retrieve(self, *args, **kwargs): return super(TagViewSet, self).retrieve(*args, **kwargs) + +def mine(self, request): + if request.user.is_anonymous: + raise PermissionDenied("You must be logged in to see which Posts are yours") + posts = self.get_queryset().filter(author=request.user) + + page = self.paginate_queryset(posts) + + if page is not None: + serializer = PostSerializer(page, many=True, context={"request": request}) + return self.get_paginated_response(serializer.data) + + serializer = PostSerializer(posts, many=True, context={"request": request}) + return Response(serializer.data) diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 26648c52ad403308a809f5a46dcdedae4a91c28e..a406b01315b7ef5ece05c93a3517eb7ed193a282 100644 GIT binary patch delta 15 WcmX@ld7hKan3tC;;qgYclPmxx8wAw= delta 15 WcmX@ld7hKan3tF9$-#|mCs_a}i3K+R diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index ea925e0af1a70f78afc8a312ecc62dbe1c9eb85c..5ef2fb1605a71e7d6ee2340ef03f580d6d1b4b59 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=x|c)XE~l?4DD2?K`! delta 15 WcmeC?=;mNE=H=yja&RLXD+>T0cLV7F diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index f499a369fe9f71c090b4fc997ebd924a7dabf1f8..5ad8130fa4d949ec739278b5d45f378c735c33c0 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tC;;qgYcLref9-vqV* delta 15 WcmX@XdV-bBn3tF9$-#|mhnN5-O$8VL diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 3fda4fedb6e7ad8cb87120b4b3cd9373784afc80..e84579430e2d990117025ad601c19c723ae116a5 100644 GIT binary patch delta 15 WcmbQwGoOden3tC;;qgW`Nj3l<%LB~- delta 15 WcmbQwGoOden3tF9$-#|ml57AXIRq~N diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 1a80149921d511dd7f85f4d3519a3d6b0616f5a9..3cbfe30f935f49ebce400f05d95e1594198a7304 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tC;;qgYcKqdeshXi2& delta 15 Wcmcc4a-D_En3tF9$-#|mflL4=^#sEJ diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 532c150b0af06b1a42a0111ee5f4ab83933f3f71..5385b7dfacfb7d47b401c114ce5fce16c2af25e7 100644 GIT binary patch delta 15 WcmdnMvVn!on3tC;;qgW`EhYdU^#kkx delta 15 WcmdnMvVn!on3tF9$-#|mT1)^VV+2kB diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index e4c11462cdd7b00129c113219cbe476340542218..390e690d41ab0d8ef1e81f9b0ee06940d1653985 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tC;;qgYcMN9x89|Tqa delta 15 WcmZ3%x`LI>n3tF9$-#|miDEfTm)tS diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index a9ada9218987135d762b103a046162919f296fdc..fc9b8dc88e5a01034e015b520e374e987baf29d7 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tC;;qgW`H6{QceFNYC delta 15 WcmZ3(vWA7tn3tF9$-#|mYD@qk>jXjo diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index 21beb27baba44c229d1a87f715bcc078c41fc74e..c7bd2f21203a2433b487016ebdbbd81c11ef6398 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tC;;qgW`8zulF5d delta 15 WcmX@Wa)5=+n3tF9$-#|mR!jgTLj-;R diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 09991a483b445271b9ab6c3fd5e9855e8f345d08..0fcd0f5746e83ed9b050fd9dcbcbf753b2f58f60 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=x|cs!A<6#y9e1JwWk delta 14 VcmeBX>}F&$=H=yja&RJBD*zh?1UCQx diff --git a/blog/models.py b/blog/models.py index dfeaed1b01..f035912d8c 100644 --- a/blog/models.py +++ b/blog/models.py @@ -6,6 +6,8 @@ # Create your models here. class Tag(models.Model): value = models.TextField(max_length=100, unique=True) + class Meta: + ordering = ["value"] def __str__(self): return self.value diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 6d15952072632a82ac6b4f0ee604bb9282828e4e..f398157fa1a80da7b18de4670181666b92fa3e57 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=x|cs!A<9RL|H1KR)q delta 14 VcmeBW>}6y#=H=yja&RJBI{+Iz1U&!% diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 33123dd18d70cd09ed05725188ee68ef299cab06..f10d819b8719fa26c19b74856e1bef70429e17f0 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tC;;qgW`BW3_18UzUd delta 15 WcmdnNwu6n$n3tF9$-#|mM$7;thy-f@ diff --git a/blog/test_post_api.py b/blog/test_post_api.py index 6d143d683e..79124fa215 100644 --- a/blog/test_post_api.py +++ b/blog/test_post_api.py @@ -50,7 +50,7 @@ def setUp(self): def test_post_list(self): resp = self.client.get("/api/v1/posts/") - data = resp.json() + data = resp.json()["results"] self.assertEqual(len(data), 1) for post_dict in data: diff --git a/blog/test_tag_api.py b/blog/test_tag_api.py index a0e72d0b23..f4f6f3f0f3 100644 --- a/blog/test_tag_api.py +++ b/blog/test_tag_api.py @@ -20,7 +20,7 @@ def setUp(self): def test_tag_list(self): resp = self.client.get(self.live_server_url + "/api/v1/tags/") self.assertEqual(resp.status_code, 200) - data = resp.json() + data = resp.json()["results"] self.assertEqual(len(data), 4) self.assertEqual(self.tag_values, {t["value"] for t in data}) diff --git a/db.sqlite3 b/db.sqlite3 index 30d65336db81d81fec342702048f3399374b418d..f51bdfd31d97e58af4b8e542d2093037bcc683ed 100644 GIT binary patch delta 351 zcmZo@5N>D?o*>P*e4>mqtO51_pZO<`$-AMw5H<7664z41h?_($LV{ z*s|F=zuh{Yal3Us)5!oSZe||_zFWLoc&xcaxwJT0*&nd&W}U`T$n3M(P(hDbqe+RI z)wem=F)O(s-M}O{HOnkNH_<$|D9JddqNJ*z%CgF!%)%hAbo#!dOq;y|4Ab1KT%9T` z9Fx3#g3C=zLbAOpEd87_0u200DlLL?LJj>Y3w_gq{IguEEP@P-42(>44GeXSEEEhO zt~As$FfcJRH{V`(glRH24>w;H1OFtxn|xdNvbOVGV2a{XRblpJB;*?I?fv(dN*SfN z`PMM-KjJ^kzl6V)KaJm=UxS~M?-k!^zBQW#8~XUBpMJ+Az>jJ%cRNsU`{{SgrWXOD Cz-wm! delta 174 zcmV;f08#&dfD?d#6ObDLp^+Rz0im&AA8rmYIx{djGBz$VI5{*lF_VpMpbjxQH8wgh zG%hhUHZ(IagFA1BJ8uEEJ8uHXP#6jXaR3h54YUk93l$0~2?Yn>2D=581aY%5AXNmn zal`_X3knJjj{pyn4%rU0w-C?*S`L$d5GS{f-U4+27zz%{01x61!w;kng%4&AM-M0u c2@dKG%d-)HuMU^2?g9{p+wKCl+wKD;(NlXi Date: Sun, 14 Jan 2024 15:32:34 +0000 Subject: [PATCH 30/38] Finish simplejwt --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4534 -> 4734 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1501 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 6 ++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2521 -> 2521 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 2859 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1671 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes blog/api/urls.py | 4 ++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 41 files changed, 10 insertions(+) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index e78a47f94a97f908cd3f749bc833bf47810dbe46..82d4fd70f7701644fa05fcc03857c51cf8246b51 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=xQ`#zDa1^^c21B3to delta 14 VcmZo-Y+__H=H=x|cs!A<1^^fb1G)eJ diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index eebae14a567bfe3ae792b72b50a409f1bd8cf724..92faa47f34cc486542ca835531e087d74fe902a7 100644 GIT binary patch delta 663 zcmZ8fOHUI~7@a#E==3pItbkGc+TYVPew6js5}s3Ai!Q|6tq@Z`o+P$@#vMlk?s0+~j@?orFViO>@6KdB;Du zOVSVNpW_#NMxgxtFcb$E8n>K9l~g8i2Y2nWf_q;ocnTi!!buubYJ$sTbOvtD3cf-! zJo~Iog11egvyjRESFLNpc}~o<2(&^Yzd+mJhwvVPrk~EE1DyyVj4pJWjdTG$)Q(>6 zMI<05p`s7{h++USQ?VEZtBSZUfFZhwVT=f0JRo7TDqD;$VGLJ=XAI+~_1bBju$ZaP zWlZ8arZ6q|72Kd8_HI&#h}0<%5(s04x-d)KxJ5kzy-0{f5!|Le=+uuniejDy#Pedp zJ%|MwLXw8Dh$WmXCcgK8s<;2|F2G4gm4tvX=f zsmQo-nm*1|%mW8ZbiLlet1^v3&PtKZ+E2F5vLJju|iQXMEeXHVoU^*^Vu)p=W?svJrEAM^3=6RWyKi&r4doAmm_1`I~ zUR0ic-tlV^B!X1SG~JffOgGb#At_l>(uEru@kj@znQQJM(=sKCY{`;tY{~!Y{_Ux= zpfg2fH(iofdhm8WR<^^U?4h3l2Jxvd6egv_u3`lwr>3MI$W9D9cjitc-C^#`Sp<>Yn7hOtB)#P7KoCMAQ delta 15 Wcmcc1eV3cfn3tC;;qgYc>#P7L^aTU} diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index d90b904785bf20687a67c386afacbd5e46a7e352..5719e386f7dd7b32f2b3d68834d4fa6c4a975ce8 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tDJ?E6MGOC|szUjyR+ delta 15 WcmdnbvY&;`n3tC;;qgW`OC|s!w*(mg diff --git a/blango/settings.py b/blango/settings.py index dbd4cd61ec..3652383b33 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -14,6 +14,7 @@ from pathlib import Path from configurations import Configuration from configurations import values +from datetime import timedelta # class Dev: @@ -195,6 +196,7 @@ "rest_framework.authentication.BasicAuthentication", "rest_framework.authentication.SessionAuthentication", "rest_framework.authentication.TokenAuthentication", + "rest_framework_simplejwt.authentication.JWTAuthentication" # 'rest_framework.permissions.IsAuthenticated' ], # "DEFAULT_PERMISSION_CLASSES": [ @@ -231,3 +233,7 @@ } } +SIMPLE_JWT = { +"ACCESS_TOKEN_LIFETIME": timedelta(days=1), +"REFRESH_TOKEN_LIFETIME": timedelta(days=7), +} diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index b448e0d0aa6f532d70258950e8dfe7362d18665d..bdce0bbd04b76da27ae30d730dc6736bd2ace40d 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=xQ`#zDa5dar#1Csy% delta 14 VcmZo?Y-eOM=H=x|cs!A<5davD1IYjY diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index d51a9efbff71a35b8d2905b34e4c70ad37fbfdf1..01e26bbd0826df237f6c0acf1c5676154407dbb7 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tDJ?E6MG0~P=vy93ey delta 15 WcmdnSv5kYxn3tC;;qgW`0~P=x69fnV diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 0b3c1716731f314212c4341e8d9ed2c5464057bd..6697eaac8416cc968c093636a4b3cf0691f5dcee 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tDJ?E6Nx*^B@lzyt;W delta 15 WcmZ3;ypWmAn3tC;;qgYc*^B@n7z8{3 diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index b30a3e2dc6caa3eae3df1e74698d6a404a8b1636..21b4008a81289d17ae7e577a8665fa9d3de53e98 100644 GIT binary patch delta 27 hcmX@devX~Zn3tDJ?E6MGb!Ns}ll7P-fusj>8vtxO2kig= delta 27 hcmX@devX~Zn3tC;;qgW`b!Nt>$$HF^K+=P`4FG5x2O|Ig diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 324cf55e5498cc73bb078af97315a2fcdbe4a437..6f1caae257f92e3701a8eb3a6c627d371a61a338 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tDJ?E6MGEp`APrUTCa delta 15 WcmdnMw}Fq%n3tC;;qgW`Ep`AQ{saX8 diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index febe343da18c51b3b2921b29bf28e97a6abf3354..97f705220085c705de5c06571b52331bcf357380 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=xQ`@WH_fe`>3mIJi_ delta 15 WcmZo;ZewOM=H=x|c)XFVfe`>4?gQ%p diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 4d66b05b0eeb184b32b4a720392e49c0392c0f47..5057e03b837accf9c35d1ed1e19eb47df47c97d8 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=xQ`@WHljS~PI*aK|< delta 15 WcmeAX>Jefy=H=x|c)XE~jS~PKFax6i diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 332e83642db7d7b4349270466e708c7e8bfd6695..06cf7bd48288d3eb72f410fd0a71c5a2c2e05ae5 100644 GIT binary patch delta 15 WcmZ3+wv3IW9$qJk0-xp65Xh@of80fl?g5Y delta 26 icmca9d{da$n3tDJ@ZI9nW9$qJk0-xp65Xh@of80eun8al diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 60fef442c87f5907e57868eb8e13e400d806278a..a99c30b52e9cf8229647e034101b86be9213aabe 100644 GIT binary patch delta 15 WcmeBS?_p;%=H=xQ`@WH_jTrzOv;)xq delta 15 WcmeBS?_p;%=H=x|c)XFVjTrzQ3=e7(QMk7JDe zVh@%@_!;d16Ym;du6hMo=oMv=GhkqymShR1Lng~uRu!;uCKQ}$JcW6Ub7-qM$bkdX zFcTS&$C8>?3osk<_Y4Xj3@Ab=GGrAwlyOYeLIxF>iwxrPIIj6Z%By%ap@mu^bPefZ z2HlX;?ULO^0rilFg76}ms;f}| z*4@l)Cf$R78a+Wl^Dd`to0wNM*npPLLk^p1x&O}9%_fDxdd0l0_>TYdJaLaEoG=BDpPICgj9B=1Rulj)=Qv{SR#Lp40#U delta 430 zcmaKoyG{c!5Jf$9VqlZa`@I{IKoXKHqM@J#et`nC6~&AqT*3#WFcQ@k$R$D)NQj<} zl7gC!8s#hK@LDM-5SDD8Ga6lu{Z_c~hx@+ooi88hb&atl`?WmFhjw3m!0qsP5!a}! zSzM>OYG9r!nges}Q`K>ieAUDP7O{loL|}z#s-@ak)o{nKb}z7wjYPy90&LQ{3N*tO zwi98!LmSS6m51ax@1{N%aY%~{g&Hh`wtbU0_B3d2xldAcE#+`P9kq!Jw-UhZRnXAZ zdN^`bj$;>>IbeU}>=3ul>90~JR8;{^adrV3Fv9kpoAckf=h-wEb0=)NYbN~jWg=!^ zt}{\.json|\.yaml)$", schema_view.without_ui(cache_timeout=0), diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index a406b01315b7ef5ece05c93a3517eb7ed193a282..c230c2ad36497c05f427e2a9be7c21f176180316 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDJ?E6NxlPmxv!vvoI delta 15 WcmX@ld7hKan3tC;;qgYclPmxx8wAw= diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 5ef2fb1605a71e7d6ee2340ef03f580d6d1b4b59..0736cb64635e7c9159eacb17493c2b0f8e1cb016 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=xQ`@WHll?4DBu>(;6 delta 15 WcmeC?=;mNE=H=x|c)XE~l?4DD2?K`! diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 5ad8130fa4d949ec739278b5d45f378c735c33c0..4dc33cefd46c49ec5b02f3a2db7bf2e1ad20f36b 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tDJ?E6NxLref8hXjBC delta 15 WcmX@XdV-bBn3tC;;qgYcLref9-vqV* diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index e84579430e2d990117025ad601c19c723ae116a5..9ab0ac0ce57490574b97d7fbfa7c0268231841a3 100644 GIT binary patch delta 15 WcmbQwGoOden3tDJ?E6MGNj3l;a|4$E delta 15 WcmbQwGoOden3tC;;qgW`Nj3l<%LB~- diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 3cbfe30f935f49ebce400f05d95e1594198a7304..a9ecabf49bb539fdaeca8fb34a60ff23cc389e3f 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tDJ?E6NxKqderF9a(9 delta 15 Wcmcc4a-D_En3tC;;qgYcKqdeshXi2& diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 5385b7dfacfb7d47b401c114ce5fce16c2af25e7..1d5caa98ae85a142f8458781b8cbe3deb044b8e8 100644 GIT binary patch delta 15 WcmdnMvVn!on3tDJ?E6MGEhYdToddQ2 delta 15 WcmdnMvVn!on3tC;;qgW`EhYdU^#kkx diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 390e690d41ab0d8ef1e81f9b0ee06940d1653985..5aabf95324e502e49be6d662c86316de147f7aa6 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tDJ?E6NxMN9x6#{?h% delta 15 WcmZ3%x`LI>n3tC;;qgYcMN9x89|Tqa diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index a22f7165d25d95637a4b4b5194c2e90ee14609e6..498682c2e7a758db7a41a9759bba0ab597e709e2 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=xQ`@WH_l^FmWmIKZJ delta 15 WcmeBX?`CH+=H=x|c)XFVl^FmX?gRt? diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index fc9b8dc88e5a01034e015b520e374e987baf29d7..1b6db2e7c7ebb8f41fdfb58f322269f2741ebee8 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tDJ?E6MGH6{QbB?GDe delta 15 WcmZ3(vWA7tn3tC;;qgW`H6{QceFNYC diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index c7bd2f21203a2433b487016ebdbbd81c11ef6398..544cb68d689fa7050e61a62a4ca2b85c59711b41 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tDJ?E6MG8zulDxdZF~ delta 15 WcmX@aa)^b^n3tC;;qgW`8zulF5d diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 0fcd0f5746e83ed9b050fd9dcbcbf753b2f58f60..052ebc526726078c7c93bd020b27489d5a669749 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=xQ`#zDa6#y651D^l@ delta 14 VcmeBX>}F&$=H=x|cs!A<6#y9e1JwWk diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index f398157fa1a80da7b18de4670181666b92fa3e57..7b98c3b2aec66e0d45eab46f539183832b4223db 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=xQ`#zDa9RL^(1El}} delta 14 VcmeBW>}6y#=H=x|cs!A<9RL|H1KR)q diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index f10d819b8719fa26c19b74856e1bef70429e17f0..17f3d01dd1e56e7ab4e0196a9234f4df1f40f804 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tDJ?E6MGBW3^~!UNL) delta 15 WcmdnNwu6n$n3tC;;qgW`BW3_18UzUd From 727d32830b488f6eca04d59ed5c9885c37bb453e Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Mon, 15 Jan 2024 14:31:35 +0000 Subject: [PATCH 31/38] Finish django-versatileimagefield --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4734 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1501 -> 1613 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/settings.py | 5 ++++ blango/urls.py | 3 +- .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2521 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 908 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 2859 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes blog/api/serializers.py | 16 ++++++++-- blog/migrations/0011_auto_20240115_1411.py | 28 ++++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 0 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 6 ++++ blog/templates/blog/index.html | 4 +++ .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes db.sqlite3 | Bin 311296 -> 311296 bytes .../data_insights-thumbnail-100x100.png | Bin 0 -> 5421 bytes .../data_insights-thumbnail-300x300.png | Bin 0 -> 30476 bytes media/hero_images/data_insights.png | Bin 0 -> 328988 bytes 50 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 blog/migrations/0011_auto_20240115_1411.py create mode 100644 blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc create mode 100644 media/__sized__/hero_images/data_insights-thumbnail-100x100.png create mode 100644 media/__sized__/hero_images/data_insights-thumbnail-300x300.png create mode 100644 media/hero_images/data_insights.png diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 82d4fd70f7701644fa05fcc03857c51cf8246b51..4b2cbbd9fafbf57799910f509bf63b34fccdc4b3 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=x&ZM}3Ndo=(Yhy)`5 delta 15 WcmZo-Y+__L=H=xQ`@VQ0do=(X?gS_R diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 92faa47f34cc486542ca835531e087d74fe902a7..239243fa4080313420cfc9d3c69318ab5a2d9db9 100644 GIT binary patch delta 464 zcmYk3yHgWU6vlTq3$BddM8FZ(2ap5^uK4rr5hU?4zeferf*rltpBFP_(_BP zKi^{C59!b?a)(Z0#7WRax2~5qdgLxib%S2t(l#D_^fSO9DeVR}L!ql}@fntTjF2|D zQQu-LbOKxMlVRLsGECI?QH>u5wsz$KPk72Rvc^B;xwLaQDIIvyX%I7rGbIULNEg%6 zZP3GvS(Ic}dYO|xUP?dnGJqq4CY>TDL%fnl_1s_wUUOX^CBpm=aCRnt^*yt>qMJJNpMusA!Do7yhq l^K0kVul#yp;nXT;%~Q(RN+~*R|E!!vbCrwek=qpU?0=M+g9QKp delta 384 zcmYk2xk>|J6oqFdqeM|b1EPt05;coS%;FmNHSYUz-Svw@T73W!EVQtYw9{Exr?Al% zu<#iK3m-xde^YtkyXO=K?%}@se|+9VWo7x@&tvw*t!bayzi}x)s<`}k@V;JIE~%rH zHoW-o({7bYJsskvGh0Exqggsmf`kauMZ_|5I#JuSbny_A2D*u>T*9M~w2hoDjil&N znH0Un-B;ZGIo&d)i2(*lGo*Yo!_vZtT(#nqHicK=V^sW%Nju}xq3C2n9SSfhL8c_c zw1kC~T+wGByPtZRYuLalM&DBPBOIgLQ7a9vgFD0|W_((02J T>HKr`g#MQQuFmAAYi@o47a(ga diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 49fa68648bf31889f2bdefd8bcb14a0d111c3953..a4f82d4009697bf00a23d02ca746d51a373f9e8e 100644 GIT binary patch delta 559 zcmZ{h-)a*<6vk&ZNwb?|o83*Cq)FPQO;VFyA^uaNu|5`@R_t^F9Bq(7tY(xgWRQ;?Epo zzt~@^NPLGX_;AsloMm0hvxUtWFyO8u9CTy}%L^{n=tOt3UPV+A)o`m`P1F+3x$9nC z)H%aC)?@?nPyiEF!xR+33N_J09c)~Y8*+1@5j)7`mTVsMMGP1(jGG(rx|f9SDyp(KR)tsHXkbApZELGm(AkK&zq8aqO@^nV zV5;Z?nOObP4vr7;BvAQinZC)bsGRAymd4Zj_a5CHzBqWY%w6Ka{{Hj#O!X+LdeMW- X?b1s^-PU=5wx#KuD0-85s9F3s|6q!5 delta 450 zcmZ{gJxjwt7{~9@)?U)2N&1qe?=NYQE_QH`PP+L4bUF|bo~NZpx};!n>d;MyDESCZ zPJ(_6ad8x!`XK}-FQI~i-f{4I`2U_eo_p0la^AjSXwK(7E;T|nRa4GOW0UgQ(goDSwA~3@e(DHnO~ke+(}sVD|45-l%R`_sDcJL(7^~(kOwnVcnuj? zxFhPKu~sD8NJUe$5-ud%PPm9Fl-4xi@(OcO>VN~4FeRJf(A|brG(;CosD%{jf8?>- z*t-95Q#!5Knd-cUJ^4Z#Yr=z$9IhKGFzUq@Pw4@Xaa#0mX>grr9;&FwN#fQd1$sh; z{pgLJJ&%<~N(a$b>LuEwcLz*<<~xI6a(;EOm=sM_C?N!b delta 16 XcmdnbvY&=sM_CyWG# diff --git a/blango/settings.py b/blango/settings.py index 3652383b33..d40f036828 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -62,6 +62,7 @@ 'rest_framework.authtoken', 'drf_yasg', 'django_filters', + 'versatileimagefield', ] MIDDLEWARE = [ @@ -237,3 +238,7 @@ "ACCESS_TOKEN_LIFETIME": timedelta(days=1), "REFRESH_TOKEN_LIFETIME": timedelta(days=7), } + +MEDIA_ROOT = BASE_DIR / "media" +MEDIA_URL = "/media/" + diff --git a/blango/urls.py b/blango/urls.py index 320d558185..723c1f6692 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -24,6 +24,7 @@ import blango_auth.views from django_registration.backends.activation.views import RegistrationView from blango_auth.forms import BlangoRegistrationForm +from django.conf.urls.static import static import logging @@ -95,4 +96,4 @@ if settings.DEBUG: urlpatterns += [ path("__debug__/", include(debug_toolbar.urls)), - ] \ No newline at end of file + ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index bdce0bbd04b76da27ae30d730dc6736bd2ace40d..c08799dd99ac64acac6ea515d232e38e6bbe8906 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=x&ZM}3NdjkL+83Zx_ delta 15 WcmZo?Y-eOQ=H=xQ`@VQ0djkL*e*`xG diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 01e26bbd0826df237f6c0acf1c5676154407dbb7..cbc9bd71a98a96e3281826e49f0139bd8e6dd7de 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tF9wDr=B?D{MKCvyaG delta 16 XcmdnSv5kY>n3tDJ?EB)4?D{MKCf)>g diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 6697eaac8416cc968c093636a4b3cf0691f5dcee..e34ba65213e7587df486281f98e5aa92014d9873 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tF9wDr=B?6VjFB}4?J delta 16 XcmZ3;ypWmQn3tDJ?EB)4?6VjFB(DUj diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 21b4008a81289d17ae7e577a8665fa9d3de53e98..d92fba95d292ced7411d88d7083b549648d754f0 100644 GIT binary patch delta 16 XcmX@devX~pn3tF9wDr=B?8lh_D^>+I delta 16 XcmX@devX~pn3tDJ?EB)4?8lh_D!~Oi diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 6f1caae257f92e3701a8eb3a6c627d371a61a338..24619117979048e33b36df4922c78c29e5b186f2 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tF9wDr=B?3(NVCtd_@ delta 16 XcmdnMw}Fq{n3tDJ?EB)4?3(NVCdmYI diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 97f705220085c705de5c06571b52331bcf357380..d67cc1175f6c2ff99f4d9aaea2fe64e5af372fd5 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=x&ZM}3Odp#onA>;&9 delta 16 XcmZo;ZewOQ=H=xQ`@VQ1dp#onAx{KZ diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 5057e03b837accf9c35d1ed1e19eb47df47c97d8..6657fd6520d258860c926d77749af931653ec18e 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=x&ZM}3OJ1ZvuBTxhk delta 16 XcmeAX>Jef$=H=xQ`@VQ1J1ZvuBD(|; diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 06cf7bd48288d3eb72f410fd0a71c5a2c2e05ae5..ef9216aee4243d95619cc0637f4ad24842da261a 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tF9wDr=B?DEV2B{~E= delta 16 XcmZ3+wv3J4n3tDJ?EB)4?DEV2B&7sF diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index ea949d9ad2bae8621d8561e80a964c639bd65176..a5555bc59e802aa5ba13787f99846617feb3f9d2 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tF9wDr=7?A-t!SOil5 delta 15 WcmbQlIEj(nn3tDJ?EB)0?A-tzz64kR diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 4daadacb46a236b9b1f041540f04a0362900dcde..81764855d82eb955910aca3bda89fe8e091045a9 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=x&ZM}3NdnEuIP6QnQ delta 15 WcmZo*Y+z(J=H=xQ`@VQ0dnEuHv;-mm diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 6afc9d59c6c1e78a2462e0588ae7ea7b2c836051..31462af9e296f3e164fe9526ecdb24deaa47f7bf 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tF9wDr=B?5a!vCBXzq delta 16 XcmZ3(vWA7-n3tDJ?EB)4?5a!vB`gF^ diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 0299f34f3446833a74b854595773162f1d65206c..2fa25d5f7190100f42e3cc8eb0d8a2929156b2ee 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=x&ZM}3OdmAGFBE$q~ delta 16 XcmeBW?qy~-=H=xQ`@VQ1dmAGFA}<7P diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 3013811aed3dfe081554ee8df723793662436ab5..5060fa211b3b7494db09d0d32479599c255f5f93 100644 GIT binary patch delta 1472 zcmaJ>OK;mo5ayB;MN%R~>t$Ptorm*ckr*uk^o8^h6ipEnj)g=>03Jfn*^Nz?65U;@ zt$WcSITh6*<)we1J@nF|KcL4R`VYF-UJ3+AFF7_qXI74F6ir3!w=>_4W|uSH^7q!y z9q)?gxzDeD$9}Xm?T_*=y+gizy!PHbs!=O*MsDPeYEg}7A8E8o?ME858QHBrG$Ice zhq}PH2aFF)jn;vwA21DIJn94EA20!J+}6V2@lUtTgt~0qVO%6dnz0+BWSd=2Sw^KZ z7;N59X8Ba_mP_O}tEp)kZ;#UulMiz$TtuI1k56xA^W0GyKzj!+X!8Rqg2YmeB1%RAuIr!_{2B3Q$EpuA^q|P z1KXf3tOVdKU_Yq`UK6|)^&zqWUR$jNbV03kl-Hy!$k7FRkuA|S?aZcnw9I;} z|Byr{fW~d`>CTKOpo?_rkru7cWspNpnu8qrbOMeZ>UveP)}%A4~p5VBIF zMaF3bABF|E+A9^BKN2+9Img% zUqQHtOZC0UR+fq#M&qR5N_2QG>DHM{r8RbHpgt31I*vyu$ufV2EUDf<%o=}G=KRkya^#! zUFtec9wwN`*fr-!)f~Br3ukU_Y>`)Z9$@HgtcYyUd30wUyN2S6tUVi6Y( z&cV$pd_}L4_xy=I)29km4~d@(l(qqN25NIqD^xp_eG5i5&0-5+e+*bW1+T)P;#;&|q@@GNuhKGftCFf45jb6g zSN3E!3J+EVsC$H6M2@gYF_mVv!)Et+s&;!}$aLV+Owvli09IjZ#i~?If;a&Nw_rJd z)^CE{jC-9?$t72&DPdW_Pb1weTSnB4Y5x&7GL3D8v4z`qQY>3A#yqel+JnhknPnuTDyk z6AJ?>F06FoDr_DS)7C^o7WqegV-C}qs=YX1|M6&v<1)p&-K|;ZSO?cY}HaaPsn} zUa?CkSw=t~d}X^8o&WAPK(YvTj0w<*N?ci&8M14hlNz+$?CwPToAGip&8$W=2!%_+ l8iwC3q(jX;{b5u6b|<2}Ft`JOkz(Z07IDc1qmU~U{{j)S=V|}| diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index a99c30b52e9cf8229647e034101b86be9213aabe..2c2294d3d41029adead4ed98f3f0fd98c182f5de 100644 GIT binary patch delta 16 XcmeBS?_p;*=H=x&ZM}3Odn+>lBNha3 delta 16 XcmeBS?_p;*=H=xQ`@VQ1dn+>lB7p>T diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 338eaa349a406c759aeb7df5deed581d01be5ed5..218a305428f9a2003962fa6b711dec19d71d142c 100644 GIT binary patch delta 15 WcmZo+Y++{plpEcOLm delta 16 Xcmcc3ew&@$n3tDJ?EB)4>{plpEMWy= diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index 9ec5f781ef4ebb1e48953dc4f7f19e3815d8ac7d..06815b27b4cae95fecb6bd7cc62d33988fe81c8a 100644 GIT binary patch delta 16 XcmaFM@|K0&n3tF9wDr=B>}gB@E#U}gB@EldRw diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index b8494e10d226fcf8960594594c024e4f1470055b..0733b9eb60ce7688b2ab24d323973db8008a5063 100644 GIT binary patch delta 1546 zcmbVM&1(}u6yKR_HoKe6*J3}ket@CkQnmH#AQsz$A1D&Us$dY7H8ZA>Y0}OnrHYV) zUOkk#ds3lz5&a81c=tSB1W$q|FJ66byKPF07Z={!H*aQs@Ap1--;IBmte!0t++T}t zc+ED9@5Y|T1bY!Ae!E$n?K6X!!d`Le4l%A7EX%AH2D3PM>^{%b^We!b8$5RE@xbFS z7d&q2DS#)>Jn(ot4|j^NF0dl3i*TX@o-%k!tPGxVdZ)rFOGe=TFpSO5vl9W)hwgD1 zN8Og-*H@w@zuMx0sW~#CZkkU21d!!MoiL+Ld4_oi-^?Jfm$YsU2tB9uEXxCMNf&Q* z;_ecctw^+Z{=Y-Y6cD;5Ix4X40!-R{fwbnu7^3hX@E z-nLypyNI?W_n|$8Y8+J#ly;Z7?1U|>c!HJ2!u=%b6k0Go21@K9giR==gkpS}Y^g8w zsA@Z7>Jxp|9}0q0=3$K9J%LUuPH+$!PC- zyUU@zFw%>H$!SDGdh!^mf2M>Xj)0_LJmOMWRh{flGOZq1QzTFu)-*Y$URm>GMt!x8 zmj)f1g?lr~&&}T(>IZ_#8B};g7s9Y1qBw4F_%^~pwgHhB@KBO(0M>Dkv^zi}`1m?k zA}7xygvp|AG`N{u(UmR?6=W^jkqFl#(c=s1n>{x_#O5-_7**nnuyF}PrrpGKI%dtj z&V^xwd~1IXH4f089*)Asf?q@I{~WgchP(pTuOdWB57)K8S1tEOwSHuM=SP-&R>|0( zig$lRvCOIW?$|PZP}^gW^aP8n%S)oyyv;?_yn9o?q#(p5T`V9E)+R TJ+hB_#LM^<-}0UExNrXfRc|K$ delta 1322 zcmbVM&ubGw6rR~^vcI!QY-7-BsG;B@+G;)7PS zWx#`1Pa=3w@S=Z%f53t#PlAFsufDh4HYKzN-7t?g-@Nzcn{VFaL+xF)vFtcz_0Jpr zyFkcya^O?JUxN|7-f1k3*9lWu{sm!qP9N&ea~%Va0@DD|GQsQ=KDby`hH?P8nE7j9%p_K zCuUdhAWnU`u3SD*fQ67ni4HIu^uz79M3kYhD9cyM)!Q0w1ga68s_+xXz-@V|urS0% zI={!5+&UmT_#)%>t7tJnK;%MpgMmy(_=cn!G>_xs<;*hGim5FfC7;K5rh^CR9r}J&NyfSlpMexX0L-E{Osq z_Kkkbx45|0<7*)kC$TOP6nNK1t6YOslqTE8rlulla-;C`6jn$y!5@!!6nj>Z8xDp^ zJ{k?V5Ovws7U-PZ)|zx)e$vjm=@C+)7a*@Le`(D-QmorWreZX2ZPqnt^p9gem(d5CWrx&@jAk0`LvVS*%j6aEE8 ZAz!5s5n;pHbVjk2idHF9j8e6t{{`Kk<%0kK diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index 683f7bdf3a0ff5f10129c57647a9e8bd9056747e..86e3747b8c081492a73a5eba0e3cd7f2bf78f01e 100644 GIT binary patch delta 16 XcmbQlK8c;(n3tF9wDr=B?A^=&Bi00h delta 16 XcmbQlK8c;(n3tDJ?EB)4?A^=&BS8d* diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 6cf3a99731d280fa8eb5eae03fc23def5c870900..d794ae4f16c7dd0eaabb1052651d09511fd5492e 100644 GIT binary patch delta 16 XcmX@acZiSOn3tF9wDr=B?AGi6DV_wR delta 16 XcmX@acZiSOn3tDp<=@2{*{#_DEiwf{ diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index fc55d4def0de12e0c3183b981e43de2d6181de2c..b5ebce23f772649e293c2d4b97f8edb2583d9bd1 100644 GIT binary patch delta 16 Xcmdn4vt5VXn3tF9wDr=B>;_^0E0qM! delta 16 Xcmdn4vt5VXn3tDJ?EB)4>;_^0D*y!3 diff --git a/blog/api/serializers.py b/blog/api/serializers.py index 0217341e36..d35a939516 100644 --- a/blog/api/serializers.py +++ b/blog/api/serializers.py @@ -2,12 +2,24 @@ from blog.models import Post, Tag, Comment from blango_auth.models import User +from versatileimagefield.serializers import VersatileImageFieldSerializer + class PostSerializer(serializers.ModelSerializer): + hero_image = VersatileImageFieldSerializer( + sizes=[ + ("full_size", "url"), + ("thumbnail", "thumbnail__100x100"), + ("square_crop", "crop__200x200"), + ], + read_only=True, + ) class Meta: model = Post - fields = "__all__" + #fields = "__all__" readonly = ["modified_at", "created_at"] + exclude = ["ppoi"] + class UserSerializer(serializers.ModelSerializer): @@ -30,7 +42,7 @@ class PostDetailSerializer(PostSerializer): def update(self, instance, validated_data): comments = validated_data.pop("comments") - + instance = super(PostDetailSerializer, self).update(instance, validated_data) for comment_data in comments: diff --git a/blog/migrations/0011_auto_20240115_1411.py b/blog/migrations/0011_auto_20240115_1411.py new file mode 100644 index 0000000000..961283f599 --- /dev/null +++ b/blog/migrations/0011_auto_20240115_1411.py @@ -0,0 +1,28 @@ +# Generated by Django 3.2.6 on 2024-01-15 14:11 + +from django.db import migrations +import versatileimagefield.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0010_alter_tag_value'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tag', + options={'ordering': ['value']}, + ), + migrations.AddField( + model_name='post', + name='hero_image', + field=versatileimagefield.fields.VersatileImageField(blank=True, null=True, upload_to='hero_images'), + ), + migrations.AddField( + model_name='post', + name='ppoi', + field=versatileimagefield.fields.PPOIField(blank=True, default='0.5x0.5', editable=False, max_length=20, null=True), + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index c230c2ad36497c05f427e2a9be7c21f176180316..6b250256500d36b89f48aacb1c7f81cc4906449b 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tF9wDr=B>?c?NE3XAU delta 16 XcmX@ld7hKqn3tDJ?EB)4>?c?ND;fnu diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 0736cb64635e7c9159eacb17493c2b0f8e1cb016..6dfad0592fc05d2faee55b60c42a269ed429adc6 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=x&ZM}3OI|~Z{A`=7f delta 16 XcmeC?=;mNI=H=xQ`@VQ1I|~Z{A$|k( diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 4dc33cefd46c49ec5b02f3a2db7bf2e1ad20f36b..9d23e38237c4c5563b37473b0616c6494dda652a 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tF9wDr=B><5_uDqRI1 delta 16 XcmX@XdV-bRn3tDJ?EB)4><5_uDaZvR diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 9ab0ac0ce57490574b97d7fbfa7c0268231841a3..03425d3d384cdba063480e627ac7ec08fc0b6cc5 100644 GIT binary patch delta 16 XcmbQwGoOdun3tF9wDr=B>=JAMB?SaF delta 16 XcmbQwGoOdun3tDJ?EB)4>=JAMBya>f diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index a9ecabf49bb539fdaeca8fb34a60ff23cc389e3f..6bfb89acac87ced40da31f8488eab5e2146f0690 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tF9wDr=B>;X&wD;X&wDvSir diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 1d5caa98ae85a142f8458781b8cbe3deb044b8e8..e57fcd1c19a820756d0e1ae903c0ebc808859666 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tF9wDr=B?3zpfCP4&M delta 16 XcmdnMvVn!&n3tDJ?EB)4?3zpfC9DKm diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 5aabf95324e502e49be6d662c86316de147f7aa6..9bbce9018fcb963d542fb058ae0a8b7a29bdcde5 100644 GIT binary patch delta 16 XcmZ3%x`LJ6n3tF9wDr=B>1n3tF9wDr=B?3PRbC_w~; delta 16 XcmX@Wa)5>1n3tDJ?EB)4?3PRbC#(dD diff --git a/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc b/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35bcd31ac4860301661d217d8b42ced754003198 GIT binary patch literal 855 zcmZuvJ8#rL5cc|U=W{LzAy*&@8fc8rJwnn&C}|R<$U_2AxLNJpOdMbKyk>2OKnv~t z3=00zwp95G6o^?nr=!5uJa)f%&%WK0C=h#l<+?IIx*lc(VaMF~xdxyHD zjY@2qZtLzeqBOf7SKyhQNbAwNy1G1T)kqci_#A#Z`lT(^vfrnp8@0gEOhKkbpOwBX z3o*lyonNX*sC2Y`NF&}F&)=H=x&ZM}3NdkX*^jRZab delta 15 WcmeBX>}F&)=H=xQ`@VQ0dkX*@^8`Zx diff --git a/blog/models.py b/blog/models.py index f035912d8c..8cab32ab01 100644 --- a/blog/models.py +++ b/blog/models.py @@ -3,6 +3,8 @@ from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey +from versatileimagefield.fields import VersatileImageField, PPOIField + # Create your models here. class Tag(models.Model): value = models.TextField(max_length=100, unique=True) @@ -26,6 +28,10 @@ class Comment(models.Model): class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, default =1) created_at = models.DateTimeField(auto_now_add=True) + hero_image = VersatileImageField( + upload_to="hero_images", ppoi_field="ppoi", null=True, blank=True + ) + ppoi = PPOIField(null=True, blank=True) modified_at = models.DateTimeField(auto_now=True) published_at = models.DateTimeField(blank=True, null=True) title = models.TextField(max_length=100, default="title") diff --git a/blog/templates/blog/index.html b/blog/templates/blog/index.html index a2cabe02f4..7da2955fd4 100644 --- a/blog/templates/blog/index.html +++ b/blog/templates/blog/index.html @@ -19,6 +19,10 @@

{{ post.title }}

({{ post.content|wordcount }} words) Read More

+ {% if post.hero_image %} + + {% endif %} +
{% endfor %} diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 7b98c3b2aec66e0d45eab46f539183832b4223db..4ba2a9852f68f7aceb7b07aa2712dc1a18b97c19 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=x&ZM}3Ndm8{9#{@(G delta 15 WcmeBW>}6y(=H=xQ`@VQ0dm8{9Ed)sb diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 17f3d01dd1e56e7ab4e0196a9234f4df1f40f804..ebd11f6449cc4a940a757acc458a6e51d3086ad6 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tF9wDr=B?1sz$Cwc^O delta 16 XcmdnNwu6n`n3tDJ?EB)4?1sz$CglWo diff --git a/db.sqlite3 b/db.sqlite3 index f51bdfd31d97e58af4b8e542d2093037bcc683ed..a3aa0361fd0965b0f1a7abf0023bfbdfb855973c 100644 GIT binary patch delta 2043 zcmah}ZA@F&8NTP7dwp$u?>#0!T>=BgG#|8J?zOQ2Qv!}di4sC!l(x#0IHobiBgTNu zXA|&+CRMV0wN^P*eoSrBf+nS17FWGVD>a?6NShL^Ee$jz3uEh6RaKWs+1mUV*>)Tg zA+6f><30DB_dM@8?|bg^yzzKeJf3wjFY_ISVH%eWG7N~mT;c%l{9@0mcvUxbKN6)w zcD_hQ7d)TfO+g)UzR_DwT*bcZ0~B!mBfzr}yWNlkhkoWVK{0l(M_m3GC^+TXp`KTLjq z4Xn=h^v60Qeby3-bxWWxVhM%)!GLwwfdjjE2({hUz!@*bcNrFcna=e~{0+@)E}fZx zQuRQV5{6^6dxbEg4&y5nJe8{ZPxu<1qToqP&fb9nDIZ0v3R75~ni)A(GAy^qcDJL# zZLie6h`<6<83km6F@`fq|B~JpR}1rk)%bPBe#4Od4Srtt2i+SwKR3@!qpL`Tx4{^Z z<8T{UdkbBl$AfG17i?k2cdFfFY5{Eo4(-niC=alzMGa5Rpwrwwo%u&j^3TICmwYsX zin(p$9<__ynL*{?DXr);Bm&|)1}Dice}~>jHR?uk;vg&`>yE%o?dU;R1u{0PIlMX4 z0Mr0EM|qVvVKa~qj>AmScN`ue=5hGBwsah_K%1X{Q-ItVhnlW-SZ8i6B?U*}YVFx0 zkVjLCNPcCJ%@^Q$M!G4!D^weEG9EW@{G#pyZj$Xqjc`2`9uGH+TLo_WM5{+`e?IJ2 zDr14pP^@#fUv6)29}HKGRK^dE?`a5tc*-&*tkh!o6-G3EO{AL6u8W-bHl_Wy0#?@|fdRE1k0Yxn zw;_)#96%e$*-@k?r$&+3l@@JU0j>(C)Ag`sWrcaIZB1!eST@ndm7aD|Mfe^lB3icB zAM^V{-O*66GZwY=bO&XdbBLOn#ipm+ zz!;()53|Obiv8Ot3TAXh21{d+Qh!f~>>NXDbC!cf0fpw#3Ul%l3Vn49H9Zy!L}StZ zaM<5B+!%ZFrrorn-E`paCiSa?HNqoWZqM=#;necbx zb6^oz_@8o%?01Zh_0YVkjcScL#+!q+K=r2xZXtLUJppRS$>Y#UPR=5Zh_q{xfmtMH zJgL6Gn*&~;?n-OnV;fK2o=30gM|ktF7mVW-clah1sB{{PQd*AyqpFNEyxB)@X-Q$$ zkv-SZ8seTskCRVkkuJ5=lZ)3;3F=Ts$chV&^8Lr2XDF|3vWf8X<+{=N;0EEijv z+8P^aEA8otgjRO!%NxZEGx4Z8Op0%zO`u-ecMG-Au7uPf^6Nuzf>n2@J!I@Q`V>S+ z%K~cVJhYkZrf;@zhFUe% H*H`%8?F3wS delta 1432 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 XlC$hg(By!000000NkvXXu0mjfHjsD; literal 0 HcmV?d00001 diff --git a/media/__sized__/hero_images/data_insights-thumbnail-300x300.png b/media/__sized__/hero_images/data_insights-thumbnail-300x300.png new file mode 100644 index 0000000000000000000000000000000000000000..cd25311326cf62f3f49d4df1f3590418bc0d5c38 GIT binary patch literal 30476 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

Tyw+${7c`+Fl~ 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%0A$QODX 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

T*7s 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


r$<8et@lYIewlT zvh`&g@9H-a+)PLX#UgrMP%t5vaNo4mG`v5w>%AFp^9?~t#KR{k zQnQHPA*PI*zy3Lqe?J)^ye}Za+!~Te!cH3uDZ)m+bWzmFYr`DQW zqpDw$AfX|yGN^7b(W~6<8rxTc>)IG2qPAZoo+RAS-4b2EtlO+&Nb^@-R_?jQ+le-&^q# zs5M9*A)IBIun0&=UPlAz2t%M-#j^0(F)N;atf56d1ye%?v6n1X?6;JSGFCJu*Pzm0 z3{~W^mewTQ!a7Si(3kC}rqCMjVbIS7Ji+IgI6zQ5*l8Ke#UKPTtp_J3KmQ}DHF_dX z{Y}fx+?#MY0(-_=e7FDniGsox1+3|@U>!mN?q@JV$h@e{U2u#FSmiOqktE4y*+}K* z^wgko>;(=sJH6IheZqDehlNY~CMP+*TnLg(sOVI2Tz0&1fMt62b_b$xY)-zn<5U

;>hU0y7? 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

%|UpC1orM{n&{C;>%J$c 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 literal 0 HcmV?d00001 From caed19e36ab0a3026b0cc50c86cd1e91d1cb2374 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Wed, 17 Jan 2024 11:34:26 +0000 Subject: [PATCH 32/38] Finish JavaScript intro and fundamentals --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4814 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1613 -> 1673 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes blango/urls.py | 2 ++ .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2738 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 908 -> 1041 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 3122 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 855 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/static/blog/blog.js | 11 +++++++++++ blog/templates/blog/post-table.html | 5 +++++ .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes blog/views.py | 2 ++ 44 files changed, 20 insertions(+) create mode 100644 blog/static/blog/blog.js create mode 100644 blog/templates/blog/post-table.html diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 4b2cbbd9fafbf57799910f509bf63b34fccdc4b3..a7956ec74af05f1a5aef4eeed1ea9932ef21beee 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=zOQMPO%do=(a0R(IS delta 15 WcmZo-Y+__L=H=x&ZM}3Ndo=(Yhy)`5 diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 239243fa4080313420cfc9d3c69318ab5a2d9db9..836ddd1f86e1d7774b4eb49414372051373796e9 100644 GIT binary patch delta 16 XcmX@7dQO$yn3tF9M%l8B?8k)wFmDCQ delta 16 XcmX@7dQO$yn3tEU%5LdK_TxeTEQkd& diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index a4f82d4009697bf00a23d02ca746d51a373f9e8e..26f75de5c281db2c2f36cde27ea2b9a2e3827894 100644 GIT binary patch delta 289 zcmX@h)5)uB%*)FqyJLB(4mShCV+JH32xL0|aq+H=%8`uqsT?T^sf=0jSt==tDH6TR z>AX>@sj5IxrBs!}ZYHrqGsb-wKp4FU91L%q( hjmd9V?HMB`>#%tW3Ggv7F)=bR@-XtSa{y@pMgR!YF5LhC diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 366b55d84c2537504a921e149d6126cf19c4746e..636dee0000a59f9f889b92bfb041c153d1320b55 100644 GIT binary patch delta 16 XcmdnbvY&=sM_DdPmo delta 16 XcmdnbvY&=sM_C?N!b diff --git a/blango/urls.py b/blango/urls.py index 723c1f6692..6738a83097 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -68,6 +68,8 @@ # for function based view below # path("api/v1/", include("blog.api_urls")), path("api/v1/", include("blog.api.urls")), + path("post-table/", blog.views.post_table, name="blog-post-table"), + # path("post//", blog.views.post_detail, name="blog-post-detail") ] diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index c08799dd99ac64acac6ea515d232e38e6bbe8906..3117888861fff819065f8b0ed6dd35c0900d7304 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=zOQMPO%djkL-k_3AI delta 15 WcmZo?Y-eOQ=H=x&ZM}3NdjkL+83Zx_ diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index cbc9bd71a98a96e3281826e49f0139bd8e6dd7de..d9f31b05b42d98f0771edb89c375887789707e3e 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tF9M%l8B?D{MKDK!MT delta 16 XcmdnSv5kY>n3tF9wDr=B?D{MKCvyaG diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index e34ba65213e7587df486281f98e5aa92014d9873..7787a12beb5cad122aa9311900e2e8e5d5c5b191 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tF9M%l8B?6VjFCk6!W delta 16 XcmZ3;ypWmQn3tF9wDr=B?6VjFB}4?J diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index d92fba95d292ced7411d88d7083b549648d754f0..bb37e5a80d61f1e291a1f84732ce9774283165e5 100644 GIT binary patch delta 16 XcmX@devX~pn3tF9M%l8B?8lh_Ef@uV delta 16 XcmX@devX~pn3tF9wDr=B?8lh_D^>+I diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 24619117979048e33b36df4922c78c29e5b186f2..87ca0e99735df37b02fed8036c9416d24d7ddd9f 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tF9M%l8B?3(NVDIf&5 delta 16 XcmdnMw}Fq{n3tF9wDr=B?3(NVCtd_@ diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index d67cc1175f6c2ff99f4d9aaea2fe64e5af372fd5..e9172e944d4a0bb5c16623addbc25bfa122647ff 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=zOQMPO&dp#onBc=qM delta 16 XcmZo;ZewOQ=H=x&ZM}3Odp#onA>;&9 diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index 6657fd6520d258860c926d77749af931653ec18e..e69a58fcac33129c096746ed6e4201c926c2e173 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=zOQMPO&J1ZvuB@zTx delta 16 XcmeAX>Jef$=H=x&ZM}3OJ1ZvuBTxhk diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index ef9216aee4243d95619cc0637f4ad24842da261a..88b1b871ddd440b7e73f89e1f5e8aa9d132b54ce 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tF9M%l8B?DEV2Cj112 delta 16 XcmZ3+wv3J4n3tF9wDr=B?DEV2B{~E= diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index a5555bc59e802aa5ba13787f99846617feb3f9d2..19af2b121ff529846b56ae237f16f33f723beeb8 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tF9M%l87?A-t#(FB|T delta 15 WcmbQlIEj(nn3tF9wDr=7?A-t!SOil5 diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index 81764855d82eb955910aca3bda89fe8e091045a9..d4ac36c1f65d868cff05767a6351c6bb9765e33e 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=zOQMPO%dnEuJ#{^~o delta 15 WcmZo*Y+z(J=H=x&ZM}3NdnEuIP6QnQ diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 31462af9e296f3e164fe9526ecdb24deaa47f7bf..436f7f9df089740ab15afc2b3014ccb1c9da72b9 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tF9M%l8B?5a!vCxZl% delta 16 XcmZ3(vWA7-n3tF9wDr=B?5a!vCBXzq diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 2fa25d5f7190100f42e3cc8eb0d8a2929156b2ee..220f1e801dd7da4cc2649f4b83920f145e111783 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=zOQMPO&dmAGFB!&dC delta 16 XcmeBW?qy~-=H=x&ZM}3OdmAGFBE$q~ diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 5060fa211b3b7494db09d0d32479599c255f5f93..795fbc92faaa6ceb1fa398a483e9770c8483a034 100644 GIT binary patch delta 26 icmdlax=EDRn3tF9M%l8|^&AWgk0&cKi*8h!zy$zrP6!_W delta 26 icmdlax=EDRn3tF9ug%ib^&AWgk0&cKi*8h!zy$zq6bK0b diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 2c2294d3d41029adead4ed98f3f0fd98c182f5de..7a4f691b210938d5a9cd3f84bb5bcedbeb13a21e 100644 GIT binary patch delta 226 zcmeBSpU9zX%*)Hgy<>T50xJWG}ov#U;8WiAg!BdKo3TIhu?` zAoGC~FOVwYgA@Ef)-5iO>UgkfeIUOWq?CcNNDN473f>Y($x6&ipS+Z5Eu+|EKV~&4 YkT?$$4{plpF1Q7z delta 16 Xcmcc3ew&@$n3tF9wDr=B>{plpEcOLm diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index 06815b27b4cae95fecb6bd7cc62d33988fe81c8a..60d5410513f30af0631d07e31b47d39b6462ec2b 100644 GIT binary patch delta 16 XcmaFM@|K0&n3tF9M%l8B>}gB@FQWxj delta 16 XcmaFM@|K0&n3tF9wDr=B>}gB@E#U;_^0Ems8> delta 16 Xcmdn4vt5VXn3tF9wDr=B>;_^0E0qM! diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 6b250256500d36b89f48aacb1c7f81cc4906449b..1060ac7642a68a9d6c31a40f035fb579cbd66c7d 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tF9M%l8B>?c?NEpY{h delta 16 XcmX@ld7hKqn3tF9wDr=B>?c?NE3XAU diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 6dfad0592fc05d2faee55b60c42a269ed429adc6..fd28440ae01e618890856e1d52bb815512ff3a34 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=zOQMPO&I|~Z{Bh>^s delta 16 XcmeC?=;mNI=H=x&ZM}3OI|~Z{A`=7f diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 9d23e38237c4c5563b37473b0616c6494dda652a..7c5e8840cc4c22a02d5261c3390adc01408a0767 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tF9M%l8B><5_uEFT4E delta 16 XcmX@XdV-bRn3tF9wDr=B><5_uDqRI1 diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 03425d3d384cdba063480e627ac7ec08fc0b6cc5..404989e7fa92013daf0eabfa48af1cbb8eb648bd 100644 GIT binary patch delta 16 XcmbQwGoOdun3tF9M%l8B>=JAMCdUMS delta 16 XcmbQwGoOdun3tF9wDr=B>=JAMB?SaF diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 6bfb89acac87ced40da31f8488eab5e2146f0690..b4fbca6bf23f090e5c9493bb44ae596ab44fd5c0 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tF9M%l8B>;X&wEaL?e delta 16 Xcmcc4a-D_Un3tF9wDr=B>;X&wD1n3tF9M%l8B?3PRbDgy-0 delta 16 XcmX@Wa)5>1n3tF9wDr=B?3PRbC_w~; diff --git a/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc b/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc index 35bcd31ac4860301661d217d8b42ced754003198..13646bcc373522a87f05498a48e6c45514ec3cfc 100644 GIT binary patch delta 16 Xcmcc4cAbsgn3tF9M%l8B>;cRGEgS_H delta 16 Xcmcc4cAbsgn3tF9pUu*Z>;cRGEX4%_ diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 5d29bb3086497300e8bfd4541328ad82a3283573..b12c238d7c7e3fd3901c7123da5779a2c2520231 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=zOQMPO%dkX*`1_Xxy delta 15 WcmeBX>}F&)=H=x&ZM}3NdkX*^jRZab diff --git a/blog/static/blog/blog.js b/blog/static/blog/blog.js new file mode 100644 index 0000000000..3d73a23bb4 --- /dev/null +++ b/blog/static/blog/blog.js @@ -0,0 +1,11 @@ +// alert('Hello, world!') +const theNumber = 1 +//let yourName = 'Thiru' + +if (theNumber === 2) { + let yourName = 'valluvan' + alert(yourName) +} + +alert(yourName) + diff --git a/blog/templates/blog/post-table.html b/blog/templates/blog/post-table.html new file mode 100644 index 0000000000..d40fcd39d7 --- /dev/null +++ b/blog/templates/blog/post-table.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} +{% load static %} +{% block content %} + +{% endblock %} diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 4ba2a9852f68f7aceb7b07aa2712dc1a18b97c19..969a153686795b152d5178f210717bab7a29ae36 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=zOQMPO%dm8{BKm?5d delta 15 WcmeBW>}6y(=H=x&ZM}3Ndm8{9#{@(G diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index ebd11f6449cc4a940a757acc458a6e51d3086ad6..6142778da3efc62932e2bc70ca870cf5bee766e4 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tF9M%l8B?1sz$DLe$b delta 16 XcmdnNwu6n`n3tF9wDr=B?1sz$Cwc^O diff --git a/blog/views.py b/blog/views.py index b708bfa920..c1d6d64b8a 100644 --- a/blog/views.py +++ b/blog/views.py @@ -44,3 +44,5 @@ def get_ip(request): from django.http import HttpResponse return HttpResponse(request.META['REMOTE_ADDR']) +def post_table(request): + return render(request, "blog/post-table.html") From 661e69fe32b344c1a1ecea128696ba07e63d0103 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Wed, 17 Jan 2024 12:06:00 +0000 Subject: [PATCH 33/38] Finish JavaScript functions --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4814 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1673 -> 1673 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2738 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 1041 -> 1041 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 3122 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 855 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/static/blog/blog.js | 67 ++++++++++++++++-- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 41 files changed, 61 insertions(+), 6 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index a7956ec74af05f1a5aef4eeed1ea9932ef21beee..69ef1487ab91ddd93d8c7e5f128c42c4702eda7d 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=y*+OvEjdo=(W?*sJ! delta 15 WcmZo-Y+__L=H=zOQMPO%do=(a0R(IS diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 836ddd1f86e1d7774b4eb49414372051373796e9..1bed48bca2f218ec7edf009e9e973e5073060543 100644 GIT binary patch delta 16 XcmX@7dQO$yn3tDJYR~eG?8k)wEanAM delta 16 XcmX@7dQO$yn3tF9M%l8B?8k)wFmDCQ diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 26f75de5c281db2c2f36cde27ea2b9a2e3827894..5265ea391afd951cc871bce0ac988b4b70a40fbe 100644 GIT binary patch delta 15 WcmeC=?c`-M=H=y*+Ov_ZnGFCN>I0wv delta 15 WcmeC=?c`-M=H=y*-La9anGFCN=mVbs diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 636dee0000a59f9f889b92bfb041c153d1320b55..ca56cd40ff03cf265c2093be1c353b07dc653970 100644 GIT binary patch delta 16 XcmdnbvY&=sM_CRzkk delta 16 XcmdnbvY&=sM_DdPmo diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 3117888861fff819065f8b0ed6dd35c0900d7304..0a23205aeab2722a01c05beda1372db0d57dec78 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=y*+OvEjdjkL)fCK~p delta 15 WcmZo?Y-eOQ=H=zOQMPO%djkL-k_3AI diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index d9f31b05b42d98f0771edb89c375887789707e3e..e9a6b348d1815b5356df494e13410f400688314d 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tDJYR~eG?D{MKC9DKP delta 16 XcmdnSv5kY>n3tF9M%l8B?D{MKDK!MT diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 7787a12beb5cad122aa9311900e2e8e5d5c5b191..764e46957c3c8afb522ddee0988db66d732e5cd7 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tDJYR~eG?6VjFBYgyS delta 16 XcmZ3;ypWmQn3tF9M%l8B?6VjFCk6!W diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index bb37e5a80d61f1e291a1f84732ce9774283165e5..05ee91dad588deff18fc16dab5fb3ba7132d3e56 100644 GIT binary patch delta 16 XcmX@devX~pn3tDJYR~eG?8lh_DUSsR delta 16 XcmX@devX~pn3tF9M%l8B?8lh_Ef@uV diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 87ca0e99735df37b02fed8036c9416d24d7ddd9f..9e9b4a6222be6b6d6078a08ed381aae99ea333ea 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tDJYR~eG?3(NVC6@$1 delta 16 XcmdnMw}Fq{n3tF9M%l8B?3(NVDIf&5 diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index e9172e944d4a0bb5c16623addbc25bfa122647ff..2240a106009a66caa30ba4cc4357fdefdc277f8f 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=y*+OvEkdp#onARPoI delta 16 XcmZo;ZewOQ=H=zOQMPO&dp#onBc=qM diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index e69a58fcac33129c096746ed6e4201c926c2e173..f5e5a069b7a8d5740403f3ef9ae6fddfdd0f380d 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=y*+OvEkJ1ZvuA&CRt delta 16 XcmeAX>Jef$=H=zOQMPO&J1ZvuB@zTx diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 88b1b871ddd440b7e73f89e1f5e8aa9d132b54ce..ed0bb47b5a8e84ef56f2ff8116db17b6182aea91 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tDJYR~eG?DEV2BXa}} delta 16 XcmZ3+wv3J4n3tF9M%l8B?DEV2Cj112 diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 19af2b121ff529846b56ae237f16f33f723beeb8..b6e942fae52f83caae87b0411e5861b4bf35491f 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tDJYR~eC?A-tyzXT-! delta 15 WcmbQlIEj(nn3tF9M%l87?A-t#(FB|T diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index d4ac36c1f65d868cff05767a6351c6bb9765e33e..33e751170d8d1a5d26913e0d64a335d93260a058 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=y*+OvEjdnEuGwFB<} delta 15 WcmZo*Y+z(J=H=zOQMPO%dnEuJ#{^~o diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 436f7f9df089740ab15afc2b3014ccb1c9da72b9..54e4bfa8a2f5f5e17b8702eb38f6d6391b8f21ab 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tDJYR~eG?5a!vBl-jz delta 16 XcmZ3(vWA7-n3tF9M%l8B?5a!vCxZl% diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 220f1e801dd7da4cc2649f4b83920f145e111783..07724a2d4a8285df6c2f3c2f4b135c2baa758539 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=y*+OvEkdmAGFApHb8 delta 16 XcmeBW?qy~-=H=zOQMPO&dmAGFB!&dC diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index 795fbc92faaa6ceb1fa398a483e9770c8483a034..75a690898de1c8e105e94d069b5f7caee3d87d7d 100644 GIT binary patch delta 26 icmdlax=EDRn3tDJYR~f2^&AWgk0&cKi*8h!zy$zj9|x!a delta 26 icmdlax=EDRn3tF9M%l8|^&AWgk0&cKi*8h!zy$zrP6!_W diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 7a4f691b210938d5a9cd3f84bb5bcedbeb13a21e..aed72830b9db37ff2d5d39f6bf984d4116651aba 100644 GIT binary patch delta 15 WcmbQpF_DAKn3tDJYR^VCZWaI=Rs$>m delta 15 WcmbQpF_DAKn3tD}d&fpLZWaI<=mQx5 diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index bcf26b13d06d54be6834cc2b8989252f350dc1c6..104d42250c283c88ce0d3514fcfb9fee2f38e250 100644 GIT binary patch delta 15 WcmZo+Y++{plpD=!5v delta 16 Xcmcc3ew&@$n3tF9M%l8B>{plpF1Q7z diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index 60d5410513f30af0631d07e31b47d39b6462ec2b..a7e03c28922cf47b2c0f07f8fc084001915b3346 100644 GIT binary patch delta 16 XcmaFM@|K0&n3tDJYR~eG>}gB@EE)vf delta 16 XcmaFM@|K0&n3tF9M%l8B>}gB@FQWxj diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index 89694419583fdf1bb566561894bf848a3b1a1e25..61ae3c172b1d8316dd956d636b26ad06e4677a59 100644 GIT binary patch delta 16 Xcmdlau}Om6n3tDJYR~eG?Akm4CiDbf delta 16 Xcmdlau}Om6n3tF9M%l8B?Akm4Dt!dj diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index b4c0073a48592ec423f194fbf8effafe0d078433..161318f4cdc7d91515218de3d23572930692c90b 100644 GIT binary patch delta 16 XcmbQlK8c;(n3tDJYR~eG?A^=&A`b*q delta 16 XcmbQlK8c;(n3tF9M%l8B?A^=&C71-u diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index ce2eb42e46c94d3aa1d6c7a3ac486a2e741c0309..94dc3be4162089b2cb191e3047fa171a2c8888f8 100644 GIT binary patch delta 16 XcmX@acZiSOn3tDJYR~eG?AGi6C)Wga delta 16 XcmX@acZiSOn3tF9M%l8B?AGi6D_{ie diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 4ddc5d3849c6dc08cbab90a05ce8990e89e5291f..0fb7ff2c9be317fed1449e256a058d67744076df 100644 GIT binary patch delta 16 Xcmdn4vt5VXn3tDJYR~eG>;_^0Db56- delta 16 Xcmdn4vt5VXn3tF9M%l8B>;_^0Ems8> diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 1060ac7642a68a9d6c31a40f035fb579cbd66c7d..3a94a61828f3b9bc43ccb51e1efc3d270b8f7274 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tDJYR~eG>?c?NDd+_d delta 16 XcmX@ld7hKqn3tF9M%l8B>?c?NEpY{h diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index fd28440ae01e618890856e1d52bb815512ff3a34..ee077288f6821344218793181d7810c954a25488 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=y*+OvEkI|~Z{AWQ?o delta 16 XcmeC?=;mNI=H=zOQMPO&I|~Z{Bh>^s diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index 7c5e8840cc4c22a02d5261c3390adc01408a0767..dab81e93950b92aed40607a680a7e5139c8c4889 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tDJYR~eG><5_uD3%2A delta 16 XcmX@XdV-bRn3tF9M%l8B><5_uEFT4E diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 404989e7fa92013daf0eabfa48af1cbb8eb648bd..226fa02c319322d53c80df3a7f7e24d19ae70c8d 100644 GIT binary patch delta 16 XcmbQwGoOdun3tDJYR~eG>=JAMBR&KO delta 16 XcmbQwGoOdun3tF9M%l8B>=JAMCdUMS diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index b4fbca6bf23f090e5c9493bb44ae596ab44fd5c0..65c5e24b4463804d5e610d6dfbb7f7c7914adc74 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tDJYR~eG>;X&wDOv=a delta 16 Xcmcc4a-D_Un3tF9M%l8B>;X&wEaL?e diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 3fe62c9aff61a6c0513004ad0f978bc5077cf55e..4b7c80aff4f9c8746dc58816fb83f6402406eb6b 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tDJYR~eG?3zpfBzgoV delta 16 XcmdnMvVn!&n3tF9M%l8B?3zpfC<6qZ diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 306fd4d01ef23cb07f574b43690d95a30dbd9eb1..81bedb84b6f3eb5170e09934893b6529b28a6bd5 100644 GIT binary patch delta 16 XcmZ3%x`LJ6n3tDJYR~eG>1n3tDJYR~eG?3PRbCVB){ delta 16 XcmX@Wa)5>1n3tF9M%l8B?3PRbDgy-0 diff --git a/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc b/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc index 13646bcc373522a87f05498a48e6c45514ec3cfc..bfd4d72dfa982ea8cddeee1982c9db459575c4d3 100644 GIT binary patch delta 16 Xcmcc4cAbsgn3tDJYR~eG>;cRGDU$@D delta 16 Xcmcc4cAbsgn3tF9M%l8B>;cRGEgS_H diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index b12c238d7c7e3fd3901c7123da5779a2c2520231..987943cef57c30fd0acbe624646dec18b6c53215 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=y*+OvEjdkX*?^aKz9 delta 15 WcmeBX>}F&)=H=zOQMPO%dkX*`1_Xxy diff --git a/blog/static/blog/blog.js b/blog/static/blog/blog.js index 3d73a23bb4..6c768c631d 100644 --- a/blog/static/blog/blog.js +++ b/blog/static/blog/blog.js @@ -1,11 +1,66 @@ // alert('Hello, world!') -const theNumber = 1 -//let yourName = 'Thiru' +// const theNumber = 1 +// //let yourName = 'Thiru' -if (theNumber === 2) { - let yourName = 'valluvan' - alert(yourName) +// if (theNumber === 2) { +// let yourName = 'valluvan' +// alert(yourName) +// } + +// alert(yourName) + +// console.time('myTimer') +// console.count('counter1') +// console.log('A normal log message') +// console.warn('Warning: something bad might happen') +// console.error('Something bad did happen!') +// console.count('counter1') +// console.log('All the things above took this long to happen:') +// console.timeEnd('myTimer') + +// function sayHello(yourName) { +// if (yourName === undefined) { +// console.log('Hello, no name') +// } else { +// console.log('Hello, ' + yourName) +// } +// } + +// const yourName = 'Thiru' // Put your name here + +// console.log('Before setTimeout') + +// setTimeout(() => { +// sayHello(yourName) +// }, 2000 +// ) + +// console.log('After setTimeout') + +for(let i = 0; i < 10; i += 1) { + console.log('for loop i: ' + i) } -alert(yourName) +let j = 0 +while(j < 10) { + console.log('while loop j: ' + j) + j += 1 +} + +let k = 10 + +do { + console.log('do while k: ' + k) +} while(k < 10) + +const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + +numbers.forEach((value => { + console.log('For each value ' + value) +})) + +const doubled = numbers.map(value => value * 2) + +console.log('Here are the doubled numbers') +console.log(doubled) diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 969a153686795b152d5178f210717bab7a29ae36..2aec2927e97491a56c2ee9db35139c31bdbd840c 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=y*+OvEjdm8{8E(8_; delta 15 WcmeBW>}6y(=H=zOQMPO%dm8{BKm?5d diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 6142778da3efc62932e2bc70ca870cf5bee766e4..2f04e7b740161a1d730c4fc3b3d658a233972695 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tDJYR~eG?1sz$C9?!X delta 16 XcmdnNwu6n`n3tF9M%l8B?1sz$DLe$b From aea9c155853de3bb61bec1b5204ecb155a111991 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Wed, 17 Jan 2024 14:45:56 +0000 Subject: [PATCH 34/38] Finish JavaScript classes --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4814 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1673 -> 1673 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2738 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 1041 -> 1041 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 3122 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 855 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/static/blog/blog.js | 88 ++++++++++++++---- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 41 files changed, 70 insertions(+), 18 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 69ef1487ab91ddd93d8c7e5f128c42c4702eda7d..e190adb77799492628c015817a3b13215a587b78 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=zucXT3K4FDNs1Nr~} delta 14 VcmZo-Y+__H=H=y*+B1=@1^^Zf15E$` diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 1bed48bca2f218ec7edf009e9e973e5073060543..036392f71dd8667b9d2773ec6b84b3d108658c5e 100644 GIT binary patch delta 15 WcmX@7dQO$in3tDp-_eb1CxiehfdyCq delta 15 WcmX@7dQO$in3tDJYR^Wt6G8wcd<3fi diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 5265ea391afd951cc871bce0ac988b4b70a40fbe..fbcdb0e0a608e7e7ba1abbd6c707d4a0478c70c3 100644 GIT binary patch delta 15 WcmeC=?c`-M=H=zucXT6LGaCRO?*vT% delta 15 WcmeC=?c`-M=H=y*+Ov_ZnGFCN>I0wv diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index ca56cd40ff03cf265c2093be1c353b07dc653970..e9431ed4e024c69de81575b40d01fbd417bfa70f 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tDp-_eb1mP`O7RRmc8 delta 15 WcmdnbvY&;`n3tDJYR^VCOC|syPy?(0 diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 0a23205aeab2722a01c05beda1372db0d57dec78..357c113c68494dded3fe22183e748ba473685962 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=zucXT3KBLErf1PK5D delta 14 VcmZo?Y-eOM=H=y*+B1=@5dapH16%+A diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index e9a6b348d1815b5356df494e13410f400688314d..0f626839f1d4a90a8e686f5328dbf33c1ef07f7e 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tDp-_eb11}p$0u>?o} delta 15 WcmdnSv5kYxn3tDJYR^VC0~P=utOJ_> diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 764e46957c3c8afb522ddee0988db66d732e5cd7..52519fe309c290db7e1c400f661dca064ee78a2e 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tDp-_eb1vl#&)wgh|t delta 15 WcmZ3;ypWmAn3tDJYR^Wt*^B@ku>;Ql diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 05ee91dad588deff18fc16dab5fb3ba7132d3e56..80972ec3205e815d9d4736b70c5c727cfee08925 100644 GIT binary patch delta 15 WcmX@devX~Zn3tDp-_eb1Czt^zW(5rZ delta 15 WcmX@devX~Zn3tDJYR^Wt6U+c3VFX|R diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 9e9b4a6222be6b6d6078a08ed381aae99ea333ea..237b0bf19179651ce90a52d4431f9b81f7d68f74 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tDp-_eb1TI>KLoCHMx delta 15 WcmdnMw}Fq%n3tDJYR^VCEp`AOmjjpp diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 2240a106009a66caa30ba4cc4357fdefdc277f8f..ccf85e2a66d6d204d8e6064c84e17bd59a57459b 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=zucXT6L10w()j07tH delta 15 WcmZo;ZewOM=H=y*+Ov_Zfe`>2hXZ~9 diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index f5e5a069b7a8d5740403f3ef9ae6fddfdd0f380d..ff0b31e5e109044bfcb51e09c56ece1deb671597 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=zucXT5g8z%rC&I98B delta 15 WcmeAX>Jefy=H=y*+Ov_3jS~PH$pbb3 diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index ed0bb47b5a8e84ef56f2ff8116db17b6182aea91..b4dc214f711f859a506c738da6d22544bb3d527a 100644 GIT binary patch delta 15 WcmZ3+wv3Ip2)09#2+e7Tu^cfeQd~lL%D+ delta 26 icmdlax=EDRn3tDJYR~f2^&AWgk0&cKi*8h!zy$zj9|x!a diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index aed72830b9db37ff2d5d39f6bf984d4116651aba..958664b02d90c25d3e95f78851a14da7bae21380 100644 GIT binary patch delta 15 WcmbQpF_DAKn3tDp-_eb1+$;beTLaku delta 15 WcmbQpF_DAKn3tDJYR^VCZWaI=Rs$>m diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 104d42250c283c88ce0d3514fcfb9fee2f38e250..6b0a6da18d33c4b1901acfcca88b7bf63e16676f 100644 GIT binary patch delta 14 VcmZo+Y++;*Ic delta 15 Wcmcc3ew&@mn3tDJYR^WttIPl-=LClU diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index a7e03c28922cf47b2c0f07f8fc084001915b3346..2441ba2243551380201c0efe98aaaf88ce21c36c 100644 GIT binary patch delta 15 WcmaFM@|K0on3tDp-_eb1=}Z7Axdh_? delta 15 WcmaFM@|K0on3tDJYR^WtbS3~Lv;;N) diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index 61ae3c172b1d8316dd956d636b26ad06e4677a59..ca4fbf0ac1fc72f4804c61a752793b48465e3842 100644 GIT binary patch delta 15 Wcmdlau}Ol>n3tDp-_eb1Iy?X*;RIv= delta 15 Wcmdlau}Ol>n3tDJYR^VC9UcH6+yl1& diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index 161318f4cdc7d91515218de3d23572930692c90b..79199fde32bb7318343eddfe8f98d89233097a55 100644 GIT binary patch delta 15 WcmbQlK8c;pn3tDp-_eb1JSp%#9 diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 94dc3be4162089b2cb191e3047fa171a2c8888f8..be18c7d16f13bf9002c3c5dfb91d27ea8672ea99 100644 GIT binary patch delta 15 WcmX@acZiS8n3tDp-_eb1HtYZ;xCDCu delta 15 WcmX@acZiS8n3tDJYR^VC8+HI8vjffm diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 0fb7ff2c9be317fed1449e256a058d67744076df..3c466d272e9d1209a2c3967e077e855ece6665a5 100644 GIT binary patch delta 15 Wcmdn4vt5VHn3tDp-_eb1hGGCGi3Ftp delta 15 Wcmdn4vt5VHn3tDJYR^VCLoom&gah~h diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 3a94a61828f3b9bc43ccb51e1efc3d270b8f7274..bfe837fba6d9a65b95c4c8d45c41ef36da912178 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDp-_eb1Cs_a|xdjyf delta 15 WcmX@ld7hKan3tDJYR^WtlPmxuv;=4X diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index ee077288f6821344218793181d7810c954a25488..28e3340bcda07f522ab0604ece4a75713e12b3f6 100644 GIT binary patch delta 15 WcmeC?=;mNE=H=zucXT5gD+>S~rvt|T delta 15 WcmeC?=;mNE=H=y*+Ov_3l?4DAq5~QL diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index dab81e93950b92aed40607a680a7e5139c8c4889..e77bb8f33dafac495624a9abff1284defde1c381 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tDp-_eb1hnN5+eFXLZ delta 15 WcmX@XdV-bBn3tDJYR^WtLref7cmzoR diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 226fa02c319322d53c80df3a7f7e24d19ae70c8d..864d674339ef3575b64f8c20321da288b1bee1a1 100644 GIT binary patch delta 15 WcmbQwGoOden3tDp-_eb1l57AWX#@=b delta 15 WcmbQwGoOden3tDJYR^VCNj3l-WCLIT diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 65c5e24b4463804d5e610d6dfbb7f7c7914adc74..48c183e7db31633030541a696b5c4503aa3950c6 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tDp-_eb1flL4=B?O@W delta 15 Wcmcc4a-D_En3tDJYR^WtKqdeqAOrLO diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 4b7c80aff4f9c8746dc58816fb83f6402406eb6b..904775ccd24f026a933b2f8c482bd3f914c08c3c 100644 GIT binary patch delta 15 WcmdnMvVn!on3tDp-_eb1T1)^UlLRaP delta 15 WcmdnMvVn!on3tDJYR^VCEhYdSjst%H diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 81bedb84b6f3eb5170e09934893b6529b28a6bd5..a81bc2ac5fe1f125d3c7764669ac07b4670cb8f9 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tDp-_eb1in3tDJYR^WtMN9x5xC7|` diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index 514ec05a8b4899557389ae4bbbceb0ad96b7b002..cdee559140922ba47cee66a18c3dbb4ac0a05e04 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=zucXT6LD>DEej08jg delta 15 WcmeBX?`CH+=H=y*+Ov_Zl^FmVhXa=Y diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index 7cb38242cce24f2fe057364bad0e8f4e2ea02d07..c14ca602ef97e595f94ae5988c6a3d2f0b7554d2 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tDp-_eb1YD@qk8w4N# delta 15 WcmZ3(vWA7tn3tDJYR^VCH6{Qa76Wqt diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index 440d92e4a03589f70f61032da1626c976fcabae5..75e083bc96ead67d6eb0f421e8a7b2749c4acb6c 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tDp-_eb1HcS8{uLNQM delta 15 WcmX@aa)^b^n3tDJYR^VC8zulCssptE diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 5f52bb374785448632270aa09be17214a1877158..5d6c265e1aeeaaf15846d2c37befd5f32a5fee45 100644 GIT binary patch delta 15 WcmX@Wa)5=+n3tDp-_eb1R!jgSa|B!f delta 15 WcmX@Wa)5=+n3tDJYR^VCD<%LSZUe6X diff --git a/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc b/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc index bfd4d72dfa982ea8cddeee1982c9db459575c4d3..97d0c3ab051bce54cb8f386b978588583358ce4d 100644 GIT binary patch delta 15 Wcmcc4cAbsQn3tDp-_eb1fy@9WS_Gy5 delta 15 Wcmcc4cAbsQn3tDJYR^WtKxP0VRRj3| diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 987943cef57c30fd0acbe624646dec18b6c53215..80d3120336b95e994dae66fa9c4422421ab931b9 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=zucXT3KD*zf;1Qh@P delta 14 VcmeBX>}F&$=H=y*+B1=@6#y3i184vM diff --git a/blog/static/blog/blog.js b/blog/static/blog/blog.js index 6c768c631d..34c63e96ec 100644 --- a/blog/static/blog/blog.js +++ b/blog/static/blog/blog.js @@ -37,30 +37,82 @@ // console.log('After setTimeout') -for(let i = 0; i < 10; i += 1) { - console.log('for loop i: ' + i) -} +// for(let i = 0; i < 10; i += 1) { +// console.log('for loop i: ' + i) +// } + +// let j = 0 +// while(j < 10) { +// console.log('while loop j: ' + j) +// j += 1 +// } + +// let k = 10 + +// do { +// console.log('do while k: ' + k) +// } while(k < 10) + +// const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + +// numbers.forEach((value => { +// console.log('For each value ' + value) +// })) + +// const doubled = numbers.map(value => value * 2) -let j = 0 -while(j < 10) { - console.log('while loop j: ' + j) - j += 1 +// console.log('Here are the doubled numbers') + +// console.log(doubled) + + +class Greeter { + constructor (name) { + this.name = name + } + + getGreeting () { + if (this.name === undefined) { + return 'Hello, no name' + } + + return 'Hello, ' + this.name + } + + showGreeting (greetingMessage) { + console.log(greetingMessage) + } + + greet () { + this.showGreeting(this.getGreeting()) + } } -let k = 10 +const g = new Greeter('Thiru') // Put your name here if you like +g.greet() -do { - console.log('do while k: ' + k) -} while(k < 10) -const numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] +class DelayedGreeter extends Greeter { + delay = 2000 -numbers.forEach((value => { - console.log('For each value ' + value) -})) + constructor (name, delay) { + super(name) + if (delay !== undefined) { + this.delay = delay + } + } -const doubled = numbers.map(value => value * 2) + greet () { + setTimeout( + () => { + this.showGreeting(this.getGreeting()) + }, this.delay + ) + } +} -console.log('Here are the doubled numbers') +const dg2 = new DelayedGreeter('Thiru 2 Seconds') +dg2.greet() -console.log(doubled) +const dg1 = new DelayedGreeter('Thiru 1 Second', 1000) +dg1.greet() diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 2aec2927e97491a56c2ee9db35139c31bdbd840c..ff7f83bf8cd1de637b8b04f25492be86c7257acd 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=zucXT3KI{+Gv1RDSV delta 14 VcmeBW>}6y#=H=y*+B1=@9RL?L18x8S diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 2f04e7b740161a1d730c4fc3b3d658a233972695..747d06e6769d0a4abf906c9b9c8247298ed75c2f 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tDp-_eb1M$7;sxCBW6 delta 15 WcmdnNwu6n$n3tDJYR^VCBW3^}vjdy} From 609fccc64bd06bb83a64d817493fe8ef4f51a65a Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Wed, 17 Jan 2024 15:22:26 +0000 Subject: [PATCH 35/38] Finish JavaScript promises --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4814 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1673 -> 1673 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2738 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 1041 -> 1041 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 3122 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 855 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/static/blog/blog.js | 100 +++++++++++------- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 41 files changed, 64 insertions(+), 36 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index e190adb77799492628c015817a3b13215a587b78..c3c016c93f8971f28afa02223a27d8674b3a0fd4 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=z;el?M;1^^iP1MC0* delta 14 VcmZo-Y+__H=H=zucXT3K4FDNs1Nr~} diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 036392f71dd8667b9d2773ec6b84b3d108658c5e..ac48dac5f1d0b77618aadc275325e10d92b5cb62 100644 GIT binary patch delta 15 WcmX@7dQO$in3tEU`_)Fa6G8wg2n9+2 delta 15 WcmX@7dQO$in3tDp-_eb1CxiehfdyCq diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index fbcdb0e0a608e7e7ba1abbd6c707d4a0478c70c3..7f833f87ae00973d550965f091125791e48cd24a 100644 GIT binary patch delta 15 WcmeC=?c`-M=H=z;ezlRUnGFCRb_72F delta 15 WcmeC=?c`-M=H=zucXT6LGaCRO?*vT% diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index e9431ed4e024c69de81575b40d01fbd417bfa70f..87aabd63f80e316d2ee4db02fa724d107a000186 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tEU`_)D^OC|s#+yqMi delta 15 WcmdnbvY&;`n3tDp-_eb1mP`O7RRmc8 diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 357c113c68494dded3fe22183e748ba473685962..2756094c71878153d036b1bee6754ba595888d41 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=z;el?M;5day11N#5~ delta 14 VcmZo?Y-eOM=H=zucXT3KBLErf1PK5D diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 0f626839f1d4a90a8e686f5328dbf33c1ef07f7e..d823edaf9fa35c8ee57971bb9e5e9f065311d436 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tEU`_)D^0~P=yI0QNX delta 15 WcmdnSv5kYxn3tDp-_eb11}p$0u>?o} diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 52519fe309c290db7e1c400f661dca064ee78a2e..78d59c5aecc2dd5d72767ba5be3ae47ef531f6c4 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tEU`_)Fa*^B@oJp^t5 delta 15 WcmZ3;ypWmAn3tDp-_eb1vl#&)wgh|t diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 80972ec3205e815d9d4736b70c5c727cfee08925..bef4da35b94b9cf7e50b9f29aaa8177885e3b19e 100644 GIT binary patch delta 15 WcmX@devX~Zn3tEU`_)Fa6U+c6?F9b- delta 15 WcmX@devX~Zn3tDp-_eb1Czt^zW(5rZ diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 237b0bf19179651ce90a52d4431f9b81f7d68f74..9d89a283ad78c3d6ae141a39019ad59056da08bc 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tEU`_)D^Ep`ASBLp`9 delta 15 WcmdnMw}Fq%n3tDp-_eb1TI>KLoCHMx diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index ccf85e2a66d6d204d8e6064c84e17bd59a57459b..8278c36cd9eb25eacfd8545ff1439a633d8a18aa 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=z;ezlRUfe`>669gRq delta 15 WcmZo;ZewOM=H=zucXT6L10w()j07tH diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index ff0b31e5e109044bfcb51e09c56ece1deb671597..c81bf1654e03bc6d6955ad85fe3deff933f31a0a 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=z;ezlQ}jS~PLRRh%k delta 15 WcmeAX>Jefy=H=zucXT5g8z%rC&I98B diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index b4dc214f711f859a506c738da6d22544bb3d527a..44f970b1e2395d0bd83ee0d00f3ee652403a012e 100644 GIT binary patch delta 15 WcmZ3+wv3Ip2)09#2+e7Tu^cfeQd~lL%D+ diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 958664b02d90c25d3e95f78851a14da7bae21380..a915caab3fb5bdd752c898a9bad352136183ef27 100644 GIT binary patch delta 15 WcmbQpF_DAKn3tEU`_)D^ZWaI@;seV7 delta 15 WcmbQpF_DAKn3tDp-_eb1+$;beTLaku diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 6b0a6da18d33c4b1901acfcca88b7bf63e16676f..a7cc75126dd843931b1978a297057421e42a14b9 100644 GIT binary patch delta 14 VcmZo+Y++ delta 14 VcmZo+Y++a|I>< delta 15 Wcmcc3ew&@mn3tDp-_eb1SD67Q>;*Ic diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index 2441ba2243551380201c0efe98aaaf88ce21c36c..36711fbe34c26df26f9506768165fe4d34126fe5 100644 GIT binary patch delta 15 WcmaFM@|K0on3tEU`_)FabS3~PKm^qQ delta 15 WcmaFM@|K0on3tDp-_eb1=}Z7Axdh_? diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index ca4fbf0ac1fc72f4804c61a752793b48465e3842..c4b38e6ec290b0fcfc5258987c898c578f06af0c 100644 GIT binary patch delta 15 Wcmdlau}Ol>n3tEU`_)D^9UcHAXarUO delta 15 Wcmdlau}Ol>n3tDp-_eb1Iy?X*;RIv= diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index 79199fde32bb7318343eddfe8f98d89233097a55..a33d92174138fc3a38a1368eb6dba1784451f29b 100644 GIT binary patch delta 15 WcmbQlK8c;pn3tEU`_)Fa9%cX^S~rvt|T diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index e77bb8f33dafac495624a9abff1284defde1c381..2bd1712f9b3cc28fabfa0dcfdd97b4cd41082383 100644 GIT binary patch delta 15 WcmX@XdV-bBn3tEU`_)FaLrefB1O(^+ delta 15 WcmX@XdV-bBn3tDp-_eb1hnN5+eFXLZ diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 864d674339ef3575b64f8c20321da288b1bee1a1..9c3270fdb98a8d81aef719abee43d1582e764a6b 100644 GIT binary patch delta 15 WcmbQwGoOden3tEU`_)D^Nj3l=@B{w< delta 15 WcmbQwGoOden3tDp-_eb1l57AWX#@=b diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 48c183e7db31633030541a696b5c4503aa3950c6..36d7354c302e7b351cf5928f364fbf565a4e2ab3 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tEU`_)FaKqdettOSz) delta 15 Wcmcc4a-D_En3tDp-_eb1flL4=B?O@W diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 904775ccd24f026a933b2f8c482bd3f914c08c3c..f76aa324deaceddd696204379d49af7a29ba5993 100644 GIT binary patch delta 15 WcmdnMvVn!on3tEU`_)D^EhYdW8U!8y delta 15 WcmdnMvVn!on3tDp-_eb1T1)^UlLRaP diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index a81bc2ac5fe1f125d3c7764669ac07b4670cb8f9..95c65736e1ec014fd3e3fce759c9924bcda37baa 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tEU`_)FaMN9x9Ln3tDp-_eb1iDEej08jg diff --git a/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc b/blog/migrations/__pycache__/0008_merge_20240102_0948.cpython-36.pyc index c14ca602ef97e595f94ae5988c6a3d2f0b7554d2..3bf8363705498ddc05b0e98f3bda77e730241830 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tEU`_)D^H6{Qdq688E delta 15 WcmZ3(vWA7tn3tDp-_eb1YD@qk8w4N# diff --git a/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0009_alter_post_slug.cpython-36.pyc index 75e083bc96ead67d6eb0f421e8a7b2749c4acb6c..325c2c56f044d2a78d46f8ed3f811189726b17b7 100644 GIT binary patch delta 15 WcmX@aa)^b^n3tEU`_)D^8zulGHUv}v delta 15 WcmX@aa)^b^n3tDp-_eb1HcS8{uLNQM diff --git a/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc b/blog/migrations/__pycache__/0010_alter_tag_value.cpython-36.pyc index 5d6c265e1aeeaaf15846d2c37befd5f32a5fee45..81624592d60f2e1065ba191b3e5a119e3680e492 100644 GIT binary patch delta 15 WcmX@Wa)5=+n3tEU`_)D^D<%LV`UFk@ delta 15 WcmX@Wa)5=+n3tDp-_eb1R!jgSa|B!f diff --git a/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc b/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc index 97d0c3ab051bce54cb8f386b978588583358ce4d..37dca10d20cbfaa59087fa230772b33334d9fdd6 100644 GIT binary patch delta 15 Wcmcc4cAbsQn3tEU`_)FaKxP0Y;RKif delta 15 Wcmcc4cAbsQn3tDp-_eb1fy@9WS_Gy5 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 80d3120336b95e994dae66fa9c4422421ab931b9..7b74b83a4876e3c313831abb238c0af203cfe186 100644 GIT binary patch delta 14 VcmeBX>}F&$=H=z;el?M;6#yCS1P1^B delta 14 VcmeBX>}F&$=H=zucXT3KD*zf;1Qh@P diff --git a/blog/static/blog/blog.js b/blog/static/blog/blog.js index 34c63e96ec..12ba890c07 100644 --- a/blog/static/blog/blog.js +++ b/blog/static/blog/blog.js @@ -65,54 +65,82 @@ // console.log(doubled) +////class related -class Greeter { - constructor (name) { - this.name = name - } +// class Greeter { +// constructor (name) { +// this.name = name +// } - getGreeting () { - if (this.name === undefined) { - return 'Hello, no name' - } +// getGreeting () { +// if (this.name === undefined) { +// return 'Hello, no name' +// } - return 'Hello, ' + this.name - } +// return 'Hello, ' + this.name +// } - showGreeting (greetingMessage) { - console.log(greetingMessage) - } +// showGreeting (greetingMessage) { +// console.log(greetingMessage) +// } - greet () { - this.showGreeting(this.getGreeting()) - } -} +// greet () { +// this.showGreeting(this.getGreeting()) +// } +// } + +// const g = new Greeter('Thiru') // Put your name here if you like +// g.greet() -const g = new Greeter('Thiru') // Put your name here if you like -g.greet() +// class DelayedGreeter extends Greeter { +// delay = 2000 -class DelayedGreeter extends Greeter { - delay = 2000 +// constructor (name, delay) { +// super(name) +// if (delay !== undefined) { +// this.delay = delay +// } +// } + +// greet () { +// setTimeout( +// () => { +// this.showGreeting(this.getGreeting()) +// }, this.delay +// ) +// } +// } + +// const dg2 = new DelayedGreeter('Thiru 2 Seconds') +// dg2.greet() + +// const dg1 = new DelayedGreeter('Thiru 1 Second', 1000) +// dg1.greet() - constructor (name, delay) { - super(name) - if (delay !== undefined) { - this.delay = delay + +function resolvedCallback(data) { + console.log('Resolved with data ' + data) +} + +function rejectedCallback(message) { + console.log('Rejected with message ' + message) +} + +const lazyAdd = function (a, b) { + const doAdd = (resolve, reject) => { + if (typeof a !== "number" || typeof b !== "number") { + reject("a and b must both be numbers") + } else { + const sum = a + b + resolve(sum) } } - greet () { - setTimeout( - () => { - this.showGreeting(this.getGreeting()) - }, this.delay - ) - } + return new Promise(doAdd) } -const dg2 = new DelayedGreeter('Thiru 2 Seconds') -dg2.greet() +const p = lazyAdd(3, 4) +p.then(resolvedCallback, rejectedCallback) -const dg1 = new DelayedGreeter('Thiru 1 Second', 1000) -dg1.greet() +lazyAdd("nan", "alsonan").then(resolvedCallback, rejectedCallback) diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index ff7f83bf8cd1de637b8b04f25492be86c7257acd..a3c7d734f453c6a3e8cd7b90ebeefaaf1f72e401 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=z;el?M;9RM051PuTH delta 14 VcmeBW>}6y#=H=zucXT3KI{+Gv1RDSV diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 747d06e6769d0a4abf906c9b9c8247298ed75c2f..25929232e6dd9f5ba00f7e381630e0801df9a197 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tEU`_)D^BW3_2KLk4f delta 15 WcmdnNwu6n$n3tDp-_eb1M$7;sxCBW6 From 5b45b79492120afb31dc6e2e5d7be5616e4679dd Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Fri, 19 Jan 2024 03:33:41 +0000 Subject: [PATCH 36/38] Finish ReactJS --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4814 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1673 -> 1673 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2738 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 1041 -> 1041 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 3122 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 855 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/static/blog/blog.js | 111 ++++++++++++++---- blog/templates/blog/post-table.html | 8 ++ .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 42 files changed, 99 insertions(+), 20 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index c3c016c93f8971f28afa02223a27d8674b3a0fd4..2ee7b8dcb2fdd56fed385fba78b7ee98a3cdeed3 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=xI_&AZR1^^fD1GoSH delta 14 VcmZo-Y+__H=H=z;el?M;1^^iP1MC0* diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index ac48dac5f1d0b77618aadc275325e10d92b5cb62..010d5083f111f016b042a230b88bf01bcc5a0e80 100644 GIT binary patch delta 15 WcmX@7dQO$in3tC;;NwQN6G8we$psbw delta 15 WcmX@7dQO$in3tEU`_)Fa6G8wg2n9+2 diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 7f833f87ae00973d550965f091125791e48cd24a..6e0b4be7840c6b60e1ad7917967aae7a267d7c9e 100644 GIT binary patch delta 15 WcmeC=?c`-M=H=xI__&d+nGFCQHv|g+ delta 15 WcmeC=?c`-M=H=z;ezlRUnGFCRb_72F diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 87aabd63f80e316d2ee4db02fa724d107a000186..7e98160fa43a0e8209f486d65f29b9a7b565d7cf 100644 GIT binary patch delta 15 WcmdnbvY&;`n3tC;;NwO%OC|s!odg#E delta 15 WcmdnbvY&;`n3tEU`_)D^OC|s#+yqMi diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 2756094c71878153d036b1bee6754ba595888d41..2b8a54d2cab5d0cfc32a8002214aed8d30e4f975 100644 GIT binary patch delta 14 VcmZo?Y-eOM=H=xI_&AZR5dau=1IGXW delta 14 VcmZo?Y-eOM=H=z;el?M;5day11N#5~ diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index d823edaf9fa35c8ee57971bb9e5e9f065311d436..2f680c60cf503cced73d6d3a20cebf199a40a971 100644 GIT binary patch delta 15 WcmdnSv5kYxn3tC;;NwO%0~P=w`2+?4 delta 15 WcmdnSv5kYxn3tEU`_)D^0~P=yI0QNX diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 78d59c5aecc2dd5d72767ba5be3ae47ef531f6c4..023dd36549a27c74cc5fe85b5d6e3956b81e3617 100644 GIT binary patch delta 15 WcmZ3;ypWmAn3tC;;NwQN*^B@m{scMz delta 15 WcmZ3;ypWmAn3tEU`_)Fa*^B@oJp^t5 diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index bef4da35b94b9cf7e50b9f29aaa8177885e3b19e..0b7efa18e8ef276182f14253072a070a6560fdf6 100644 GIT binary patch delta 15 WcmX@devX~Zn3tC;;NwQN6U+c5t^~^f delta 15 WcmX@devX~Zn3tEU`_)Fa6U+c6?F9b- diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 9d89a283ad78c3d6ae141a39019ad59056da08bc..fbab4a71938bdb501aa91724b82dcd32c2657f5f 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tC;;NwO%Ep`AQ4)C1`N delta 15 WcmZo;ZewOM=H=z;ezlRUfe`>669gRq diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index c81bf1654e03bc6d6955ad85fe3deff933f31a0a..b78bdd678cfa98fb35646725f2a5049886155041 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=xI__&dcjS~PK76YLG delta 15 WcmeAX>Jefy=H=z;ezlQ}jS~PLRRh%k diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 44f970b1e2395d0bd83ee0d00f3ee652403a012e..708e952c41f172da9be31d961cbe2242766f9bdf 100644 GIT binary patch delta 15 WcmZ3+wv3I1HJ$N delta 14 VcmZo+Y++ diff --git a/blog/api/__pycache__/filters.cpython-36.pyc b/blog/api/__pycache__/filters.cpython-36.pyc index 233732da3c59e8745fc7be315570ecedede263ff..e7e5a10b34d76e84a829dc477b859dd988ce99d1 100644 GIT binary patch delta 15 Wcmcc3ew&@mn3tC;;NwQNtIPl=Gz9Vh delta 15 Wcmcc3ew&@mn3tEU`_)FatIPl>a|I>< diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index 36711fbe34c26df26f9506768165fe4d34126fe5..ecc51e68ea9a798a3a84fd5dd36910c52a34eda1 100644 GIT binary patch delta 15 WcmaFM@|K0on3tC;;NwQNbS3~O0R*7{ delta 15 WcmaFM@|K0on3tEU`_)FabS3~PKm^qQ diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index c4b38e6ec290b0fcfc5258987c898c578f06af0c..f61670038d4a4707d12069725b441a721681b49f 100644 GIT binary patch delta 15 Wcmdlau}Ol>n3tC;;NwO%9UcH9DFh+_ delta 15 Wcmdlau}Ol>n3tEU`_)D^9UcHAXarUO diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index a33d92174138fc3a38a1368eb6dba1784451f29b..7f2caff583a72c0a0bee29833a1ec6f57f9a39b0 100644 GIT binary patch delta 15 WcmbQlK8c;pn3tC;;NwQN9%cX@rUVxN delta 15 WcmbQlK8c;pn3tEU`_)Fa9%cX^;Eh delta 15 WcmbQwGoOden3tEU`_)D^Nj3l=@B{w< diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 36d7354c302e7b351cf5928f364fbf565a4e2ab3..23b1fe26e042ce8588340207fc57b699cdee8498 100644 GIT binary patch delta 15 Wcmcc4a-D_En3tC;;NwQNKqdesZ3JHc delta 15 Wcmcc4a-D_En3tEU`_)FaKqdettOSz) diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index f76aa324deaceddd696204379d49af7a29ba5993..9a1c370d72a1d1f23656feb4146e8c7db4f106a6 100644 GIT binary patch delta 15 WcmdnMvVn!on3tC;;NwO%EhYdU+XLzV delta 15 WcmdnMvVn!on3tEU`_)D^EhYdW8U!8y diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 95c65736e1ec014fd3e3fce759c9924bcda37baa..98ce054065f50d7201dc87dd870f24af7adc71e6 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tC;;NwQNMN9x81q4(8 delta 15 WcmZ3%x`LI>n3tEU`_)FaMN9x9L}F&$=H=xI_&AZR6#y9G1JeKi delta 14 VcmeBX>}F&$=H=z;el?M;6#yCS1P1^B diff --git a/blog/static/blog/blog.js b/blog/static/blog/blog.js index 12ba890c07..e6a46eecaa 100644 --- a/blog/static/blog/blog.js +++ b/blog/static/blog/blog.js @@ -1,3 +1,72 @@ +// react based + +class ClickButton extends React.Component { + state = { + wasClicked: false + } + + handleClick () { + this.setState( + {wasClicked: true} + ) + } + + render () { + let buttonText + + if (this.state.wasClicked) + buttonText = 'Clicked!' + else + buttonText = 'Click Me' + + return React.createElement( + 'button', + { + className: 'btn btn-primary mt-2', + onClick: () => { + this.handleClick() + } + }, + buttonText + ) + } +} + +const domContainer = document.getElementById('react_root') +ReactDOM.render( + React.createElement(ClickButton), + domContainer +) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // alert('Hello, world!') // const theNumber = 1 // //let yourName = 'Thiru' @@ -119,28 +188,30 @@ // dg1.greet() -function resolvedCallback(data) { - console.log('Resolved with data ' + data) -} +// function resolvedCallback(data) { +// console.log('Resolved with data ' + data) +// } -function rejectedCallback(message) { - console.log('Rejected with message ' + message) -} +// function rejectedCallback(message) { +// console.log('Rejected with message ' + message) +// } -const lazyAdd = function (a, b) { - const doAdd = (resolve, reject) => { - if (typeof a !== "number" || typeof b !== "number") { - reject("a and b must both be numbers") - } else { - const sum = a + b - resolve(sum) - } - } +// const lazyAdd = function (a, b) { +// const doAdd = (resolve, reject) => { +// if (typeof a !== "number" || typeof b !== "number") { +// reject("a and b must both be numbers") +// } else { +// const sum = a + b +// resolve(sum) +// } +// } - return new Promise(doAdd) -} +// return new Promise(doAdd) +// } + +// const p = lazyAdd(3, 4) +// p.then(resolvedCallback, rejectedCallback) + +// lazyAdd("nan", "alsonan").then(resolvedCallback, rejectedCallback) -const p = lazyAdd(3, 4) -p.then(resolvedCallback, rejectedCallback) -lazyAdd("nan", "alsonan").then(resolvedCallback, rejectedCallback) diff --git a/blog/templates/blog/post-table.html b/blog/templates/blog/post-table.html index d40fcd39d7..6b5428f434 100644 --- a/blog/templates/blog/post-table.html +++ b/blog/templates/blog/post-table.html @@ -1,5 +1,13 @@ {% extends "base.html" %} {% load static %} {% block content %} +

+
+
+
+
+ + + {% endblock %} diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index a3c7d734f453c6a3e8cd7b90ebeefaaf1f72e401..425d4e267a873998ada6889709582baecfb27c94 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=xI_&AZR9RL{^1K9uo delta 14 VcmeBW>}6y#=H=z;el?M;9RM051PuTH diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index 25929232e6dd9f5ba00f7e381630e0801df9a197..e75d41cb70204b45544554aee9dbd0d8e387eaf1 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tC;;NwO%BW3_100ajB delta 15 WcmdnNwu6n$n3tEU`_)D^BW3_2KLk4f From 1b8056d52b1ca08106d750a0f33d2e1ad6ae3406 Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Fri, 19 Jan 2024 04:36:50 +0000 Subject: [PATCH 37/38] Finish JSX --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4814 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1673 -> 1673 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2738 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 1041 -> 1041 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 3122 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5687 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 855 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/static/blog/blog.js | 163 +++++++++++++++--- blog/templates/blog/post-table.html | 5 +- .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes 42 files changed, 142 insertions(+), 26 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 2ee7b8dcb2fdd56fed385fba78b7ee98a3cdeed3..4a88c92230253300204add6545abe1b3336b7670 100644 GIT binary patch delta 15 WcmZo-Y+__L=H=x|c)xNYdo=(ZngnnF delta 15 WcmZo-Y+__L=H=xI__%x`do=(ZJOp3> diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 010d5083f111f016b042a230b88bf01bcc5a0e80..bd09e541475cbb11fd35374b0f2d6dbde0a54dde 100644 GIT binary patch delta 16 XcmX@7dQO$yn3tC;;r+^u?8k)wFboCG delta 16 XcmX@7dQO$yn3tC;;N$X*?8k)wFP;Uy diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 6e0b4be7840c6b60e1ad7917967aae7a267d7c9e..1be061fa5b3e9964b4dc75c407e9148ff6e27cca 100644 GIT binary patch delta 16 XcmeC=?c`-Q=H=x|c)xNZdlMS~B)|m2 delta 16 XcmeC=?c`-Q=H=xI__%x{dlMS~BvJ&k diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 7e98160fa43a0e8209f486d65f29b9a7b565d7cf..418e391465fdc353e90a4ed42f0dce6df000d70a 100644 GIT binary patch delta 16 XcmdnbvY&=sM_DS!me delta 16 XcmdnbvY&=sM_DG~&~ diff --git a/blango_auth/__pycache__/__init__.cpython-36.pyc b/blango_auth/__pycache__/__init__.cpython-36.pyc index 2b8a54d2cab5d0cfc32a8002214aed8d30e4f975..9bfddec92ccc4a38063e0d054ecd2c43c4b7c05c 100644 GIT binary patch delta 15 WcmZo?Y-eOQ=H=x|c)xNYdjkL-D+GT4 delta 15 WcmZo?Y-eOQ=H=xI__%x`djkL+%>-`% diff --git a/blango_auth/__pycache__/admin.cpython-36.pyc b/blango_auth/__pycache__/admin.cpython-36.pyc index 2f680c60cf503cced73d6d3a20cebf199a40a971..2f0d9d100e3ef027676b6d91534921751718715c 100644 GIT binary patch delta 16 XcmdnSv5kY>n3tC;;r+^u?D{MKDAEMJ delta 16 XcmdnSv5kY>n3tC;;N$X*?D{MKC}ae# diff --git a/blango_auth/__pycache__/apps.cpython-36.pyc b/blango_auth/__pycache__/apps.cpython-36.pyc index 023dd36549a27c74cc5fe85b5d6e3956b81e3617..9acd985a8a985ef59d9d363ab1a9e6dc287929e0 100644 GIT binary patch delta 16 XcmZ3;ypWmQn3tC;;r+^u?6VjFCZh!M delta 16 XcmZ3;ypWmQn3tC;;N$X*?6VjFCN%`& diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 0b7efa18e8ef276182f14253072a070a6560fdf6..23eb611c6a8438ccbbd1fc319ff481b78cf6e968 100644 GIT binary patch delta 16 XcmX@devX~pn3tC;;r+^u?8lh_EVTuL delta 16 XcmX@devX~pn3tC;;N$X*?8lh_EJp=% diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index fbab4a71938bdb501aa91724b82dcd32c2657f5f..1521c2c785fe70531ff55cf83dc0d649daefa8b6 100644 GIT binary patch delta 16 XcmdnMw}Fq{n3tC;;r+^u?3(NVD7^%` delta 16 XcmdnMw}Fq{n3tC;;N$X*?3(NVC{F~d diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 3001697eac830d769e0db704656f96273f41d1f5..1d48eee3a044c9c24310ab8ca0b51b0c83809f82 100644 GIT binary patch delta 16 XcmZo;ZewOQ=H=x|c)xNZdp#onBSQqC delta 16 XcmZo;ZewOQ=H=xI__%x{dp#onBGm+u diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index b78bdd678cfa98fb35646725f2a5049886155041..f7250111727d8a1ffc8d687ffaea2886283a12ab 100644 GIT binary patch delta 16 XcmeAX>Jef$=H=x|c)xNZJ1ZvuB(DTn delta 16 XcmeAX>Jef$=H=xI__%x{J1ZvuBtZm8 diff --git a/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc b/blango_auth/migrations/__pycache__/0002_auto_20240102_0232.cpython-36.pyc index 708e952c41f172da9be31d961cbe2242766f9bdf..e175eac95e1ffe4c73bfc0c7572f89d89731e5e3 100644 GIT binary patch delta 16 XcmZ3+wv3J4n3tC;;r+^u?DEV2CYc0@ delta 16 XcmZ3+wv3J4n3tC;;N$X*?DEV2CMyJa diff --git a/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc b/blango_auth/migrations/__pycache__/__init__.cpython-36.pyc index 293bd0d20963abe36fb02ecec36511777fddac5e..233eae3446d690f6b700137c563d59b0f609f119 100644 GIT binary patch delta 15 WcmbQlIEj(nn3tC;;r+^q?A-t#Y6PGF delta 15 WcmbQlIEj(nn3tC;;N$X%?A-t#3 diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index c0d34d40ccb8983daa30b3442bc804eacc5c7227..10f7432959e4ee65fecf4de8ae9763fec73f6574 100644 GIT binary patch delta 15 WcmZo*Y+z(J=H=x|c)xNYdnEuJU<7Ia delta 15 WcmZo*Y+z(J=H=xI__%x`dnEuJ0t8wB diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index b50e5d5286729c5faa5c973a710d74134a61d697..9feddf1cde62055158aa21bb92392b0cd84b3f7e 100644 GIT binary patch delta 16 XcmZ3(vWA7-n3tC;;r+^u?5a!vCm;lt delta 16 XcmZ3(vWA7-n3tC;;N$X*?5a!vCb9&E diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 0c024c811528753b99557138babc45c594109c94..3c79a98735bf6409699f08aef3975c89e1b648ea 100644 GIT binary patch delta 16 XcmeBW?qy~-=H=x|c)xNZdmAGFBqId2 delta 16 XcmeBW?qy~-=H=xI__%x{dmAGFBeevk diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index a53c3085d05f0484c7a63662327233da190b5632..3dd4f35ecd0ef9d36eb588ea6cddcfd19880f8c6 100644 GIT binary patch delta 26 icmdlax=EDRn3tC;;r+_g^&AWgk0&cKi*8h!zy$zr69^*! delta 26 icmdlax=EDRn3tC;;N$Yt^&AWgk0&cKi*8h!zy$zq1qc%W diff --git a/blog/__pycache__/views.cpython-36.pyc b/blog/__pycache__/views.cpython-36.pyc index 410727052cf52b309c11a128c71a0c7e7b1344e0..02eaa1ed818f1e3c3e920b1ea4d4c72f11b725b1 100644 GIT binary patch delta 16 XcmbQpF_DAan3tC;;r+^u>|87WBr*g~ delta 16 XcmbQpF_DAan3tC;;N$X*>|87WBg6zh diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 1870c9b74cbbe00f160ce94ea539f536ca0067b1..047be19030c91f6536abf9bf37d5be92b9b0bf1c 100644 GIT binary patch delta 15 WcmZo+Y++{plpE>#7p delta 16 Xcmcc3ew&@$n3tC;;N$X*>{plpE$0QA diff --git a/blog/api/__pycache__/permission.cpython-36.pyc b/blog/api/__pycache__/permission.cpython-36.pyc index ecc51e68ea9a798a3a84fd5dd36910c52a34eda1..abb0d64e00a75fa1b5d941945a6f59c95b66c000 100644 GIT binary patch delta 16 XcmaFM@|K0&n3tC;;r+^u>}gB@FF*xZ delta 16 XcmaFM@|K0&n3tC;;N$X*>}gB@F46@_ diff --git a/blog/api/__pycache__/serializers.cpython-36.pyc b/blog/api/__pycache__/serializers.cpython-36.pyc index f61670038d4a4707d12069725b441a721681b49f..426b9573765df7e40e750447d9feab9b29da2555 100644 GIT binary patch delta 16 Xcmdlau}Om6n3tC;;r+^u?Akm4DjEdZ delta 16 Xcmdlau}Om6n3tC;;N$X*?Akm4DXav_ diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index 7f2caff583a72c0a0bee29833a1ec6f57f9a39b0..467761770550322fc30819797c17fed7f8c3a473 100644 GIT binary patch delta 16 XcmbQlK8c;(n3tC;;r+^u?A^=&B{c-k delta 16 XcmbQlK8c;(n3tC;;N$X*?A^=&B*z55 diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 922d99e063e44327e63d348f1b6ccaadf625bdd2..1cd785b3268f0d284796efbf06027b757ca3ef36 100644 GIT binary patch delta 16 XcmX@acZiSOn3tC;;r+^u?AGi6D*XiU delta 16 XcmX@acZiSOn3tC;;N$X*?AGi6Dvt!= diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index aa15a16180566f93abe39ca0f67527eaeea53677..0f364fd511ebbf09eac35cd9029967ca7a73f0fc 100644 GIT binary patch delta 16 Xcmdn4vt5VXn3tC;;r+^u>;_^0Ec68% delta 16 Xcmdn4vt5VXn3tC;;N$X*>;_^0EQSRO diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index a467d6c4df0fc826333326fd68a642b32f93136a..81052e8f1be7d6715571c376d4333c42fb478e83 100644 GIT binary patch delta 16 XcmX@ld7hKqn3tC;;r+^u>?c?NEe-{X delta 16 XcmX@ld7hKqn3tC;;N$X*>?c?NET9E@ diff --git a/blog/migrations/__pycache__/0002_comment.cpython-36.pyc b/blog/migrations/__pycache__/0002_comment.cpython-36.pyc index 038a595c0ff830e5dd7915a656cf0e297d4850ac..44099a7af339f5d27763f853b2526b42d3f5aa22 100644 GIT binary patch delta 16 XcmeC?=;mNI=H=x|c)xNZI|~Z{BXR^i delta 16 XcmeC?=;mNI=H=xI__%x{I|~Z{BLoC3 diff --git a/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20231223_1542.cpython-36.pyc index a6c5b4b54b259fd8ffd7540c016fdaaab6d6b377..c46034686e2f3b1006e889ef464b235a10aaf7a6 100644 GIT binary patch delta 16 XcmX@XdV-bRn3tC;;r+^u><5_uE4&44 delta 16 XcmX@XdV-bRn3tC;;N$X*><5_uD^3Mm diff --git a/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20231226_1443.cpython-36.pyc index 60dd3462ff22e885f4077bb4020da7f9a2ac3d36..b281b6710ce8ae900665b0f33e24b620281acff0 100644 GIT binary patch delta 16 XcmbQwGoOdun3tC;;r+^u>=JAMCS(MI delta 16 XcmbQwGoOdun3tC;;N$X*>=JAMCH4e! diff --git a/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_published_at.cpython-36.pyc index 23b1fe26e042ce8588340207fc57b699cdee8498..7d41872fec9428e56e374faa3f1f1588b91968cf 100644 GIT binary patch delta 16 Xcmcc4a-D_Un3tC;;r+^u>;X&wEPw?U delta 16 Xcmcc4a-D_Un3tC;;N$X*>;X&wED{9= diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 9a1c370d72a1d1f23656feb4146e8c7db4f106a6..1a795b9ed44809d5eeeaeb7ea145e3695578534b 100644 GIT binary patch delta 16 XcmdnMvVn!&n3tC;;r+^u?3zpfC!hqP delta 16 XcmdnMvVn!&n3tC;;N$X*?3zpfCo%+* diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 98ce054065f50d7201dc87dd870f24af7adc71e6..5ed9bf41547b67729b8f2402fcf0ced5a2173952 100644 GIT binary patch delta 16 XcmZ3%x`LJ6n3tC;;r+^u>1n3tC;;r+^u?3PRbDWC+> delta 16 XcmX@Wa)5>1n3tC;;N$X*?3PRbDKZ4Y diff --git a/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc b/blog/migrations/__pycache__/0011_auto_20240115_1411.cpython-36.pyc index bfb3ce1e2362dfad7156e871063047c251ca5616..a8499a219b9992badd92cf2046252afeb771df29 100644 GIT binary patch delta 16 Xcmcc4cAbsgn3tC;;r+^u>;cRGEV%_7 delta 16 Xcmcc4cAbsgn3tC;;N$X*>;cRGEK3Cp diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index 6f883789b69307caa2f9d704cdf410011a83bf17..399e1c929a4e8b80d40db552f8c8cc49fd158b70 100644 GIT binary patch delta 15 WcmeBX>}F&)=H=x|c)xNYdkX*_p9G5l delta 15 WcmeBX>}F&)=H=xI__%x`dkX*_K?HjM diff --git a/blog/static/blog/blog.js b/blog/static/blog/blog.js index e6a46eecaa..1a026a0e15 100644 --- a/blog/static/blog/blog.js +++ b/blog/static/blog/blog.js @@ -1,45 +1,158 @@ // react based -class ClickButton extends React.Component { - state = { - wasClicked: false + +class PostRow extends React.Component { + render () { + const post = this.props.post + + let thumbnail + + if (post.hero_image.thumbnail) { + thumbnail = + } else { + thumbnail = '-' + } + + return + {post.title} + + {thumbnail} + + {post.tags.join(', ')} + {post.slug} + {post.summary} +
View + } +} - handleClick () { - this.setState( - {wasClicked: true} - ) +class PostTable extends React.Component { + state = { + dataLoaded: true, + data: { + results: [ + { + id: 15, + tags: [ + 'django', 'react' + ], + 'hero_image': { + 'thumbnail': '/media/__sized__/hero_images/data_insights-thumbnail-100x100.png', + 'full_size': '/media/hero_images/data_insights.png' + }, + title: 'Test Post', + slug: 'test-post', + summary: 'A test post, created for Django/React.' + } + ] + } } render () { - let buttonText - - if (this.state.wasClicked) - buttonText = 'Clicked!' - else - buttonText = 'Click Me' - - return React.createElement( - 'button', - { - className: 'btn btn-primary mt-2', - onClick: () => { - this.handleClick() - } - }, - buttonText - ) + let rows + if (this.state.dataLoaded) { + if (this.state.data.results.length) { + rows = this.state.data.results.map(post => ) + } else { + rows = + No results found. + + } + } else { + rows = + Loading… + + } + + return + + + + + + + + + + + + {rows} + +
TitleImageTagsSlugSummaryLink
} } const domContainer = document.getElementById('react_root') ReactDOM.render( - React.createElement(ClickButton), + React.createElement(PostTable), domContainer ) +// class ClickButton extends React.Component { +// state = { +// wasClicked: false +// } + +// handleClick () { +// this.setState( +// {wasClicked: true} +// ) +// } + +// render () { +// let buttonText + +// if (this.state.wasClicked) +// buttonText = 'Clicked!' +// else +// buttonText = 'Click Me' + +// return React.createElement( +// 'button', +// { +// className: 'btn btn-primary mt-2', +// onClick: () => { +// this.handleClick() +// } +// }, +// buttonText +// ) +// } +// } + +// const domContainer = document.getElementById('react_root') +// ReactDOM.render( +// React.createElement(ClickButton), +// domContainer +// ) + + +// using jsx + + // render () { + // let buttonText + + // if (this.state.wasClicked) + // buttonText = 'Clicked!' + // else + // buttonText = 'Click Me' + + // return + // } + + + diff --git a/blog/templates/blog/post-table.html b/blog/templates/blog/post-table.html index 6b5428f434..07ac354deb 100644 --- a/blog/templates/blog/post-table.html +++ b/blog/templates/blog/post-table.html @@ -1,6 +1,8 @@ {% extends "base.html" %} {% load static %} {% block content %} +{% block title %}Post Table{% endblock %} +
@@ -9,5 +11,6 @@ - + + {% endblock %} diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index 425d4e267a873998ada6889709582baecfb27c94..f44f7f6253db2647db1d54092cdae1929cfbdeef 100644 GIT binary patch delta 15 WcmeBW>}6y(=H=x|c)xNYdm8{A*#waQ delta 15 WcmeBW>}6y(=H=xI__%x`dm8{Adjx?1 diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index e75d41cb70204b45544554aee9dbd0d8e387eaf1..cf6926c87e72647b876d12df4dc0ae1a4187348d 100644 GIT binary patch delta 16 XcmdnNwu6n`n3tC;;r+^u?1sz$DA@$R delta 16 XcmdnNwu6n`n3tC;;N$X*?1sz$C~E|- From d4a1757dc73ffc8bc483dd79aed3073da82e6fda Mon Sep 17 00:00:00 2001 From: Thiruvalluvan Murugesan Date: Fri, 19 Jan 2024 05:45:25 +0000 Subject: [PATCH 38/38] Finish fetch and React hooks --- blango/__pycache__/__init__.cpython-36.pyc | Bin 130 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 4814 -> 4814 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 1673 -> 1673 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 575 -> 575 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 135 -> 135 bytes blango_auth/__pycache__/admin.cpython-36.pyc | Bin 1078 -> 1078 bytes blango_auth/__pycache__/apps.cpython-36.pyc | Bin 417 -> 417 bytes blango_auth/__pycache__/forms.cpython-36.pyc | Bin 974 -> 974 bytes blango_auth/__pycache__/models.cpython-36.pyc | Bin 1840 -> 1840 bytes blango_auth/__pycache__/views.cpython-36.pyc | Bin 390 -> 390 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2316 -> 2316 bytes .../0002_auto_20240102_0232.cpython-36.pyc | Bin 806 -> 806 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 146 -> 146 bytes blog/__pycache__/__init__.cpython-36.pyc | Bin 128 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 556 -> 556 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 397 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2738 -> 2738 bytes blog/__pycache__/views.cpython-36.pyc | Bin 1041 -> 1127 bytes blog/api/__pycache__/__init__.cpython-36.pyc | Bin 132 -> 132 bytes blog/api/__pycache__/filters.cpython-36.pyc | Bin 987 -> 987 bytes .../api/__pycache__/permission.cpython-36.pyc | Bin 621 -> 621 bytes .../__pycache__/serializers.cpython-36.pyc | Bin 3122 -> 3122 bytes .../api/__pycache__/throttling.cpython-36.pyc | Bin 914 -> 914 bytes blog/api/__pycache__/urls.cpython-36.pyc | Bin 1858 -> 1858 bytes blog/api/__pycache__/views.cpython-36.pyc | Bin 5687 -> 5651 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 1035 -> 1035 bytes .../0003_auto_20231223_1542.cpython-36.pyc | Bin 712 -> 712 bytes .../0004_auto_20231226_1443.cpython-36.pyc | Bin 1567 -> 1567 bytes ...005_alter_post_published_at.cpython-36.pyc | Bin 599 -> 599 bytes .../0005_alter_post_slug.cpython-36.pyc | Bin 560 -> 560 bytes .../0006_auto_20240101_1321.cpython-36.pyc | Bin 680 -> 680 bytes .../0007_authorprofile.cpython-36.pyc | Bin 907 -> 907 bytes .../0008_merge_20240102_0948.cpython-36.pyc | Bin 556 -> 556 bytes .../0009_alter_post_slug.cpython-36.pyc | Bin 578 -> 578 bytes .../0010_alter_tag_value.cpython-36.pyc | Bin 576 -> 576 bytes .../0011_auto_20240115_1411.cpython-36.pyc | Bin 855 -> 855 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/static/blog/blog.js | 48 +++++++++++++++++- blog/templates/blog/post-table.html | 4 ++ .../__pycache__/__init__.cpython-36.pyc | Bin 141 -> 141 bytes .../__pycache__/blog_extras.cpython-36.pyc | Bin 824 -> 824 bytes blog/views.py | 9 +++- 43 files changed, 59 insertions(+), 2 deletions(-) diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index 4a88c92230253300204add6545abe1b3336b7670..a13d8b5dbf4f563d0936d42387f35e1e57d01153 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=xw_&brU1^^d-1Ec@| delta 14 VcmZo-Y+__H=H=x|ct4S?1^^g01I7RV diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index bd09e541475cbb11fd35374b0f2d6dbde0a54dde..a3b8accf37b83355ce4ce80e46ce902480d951d7 100644 GIT binary patch delta 15 WcmX@7dQO$in3tE!;O|DZ6G8weMFj!? delta 15 WcmX@7dQO$in3tC;;r&Lo6G8wf9|a@; diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 1be061fa5b3e9964b4dc75c407e9148ff6e27cca..4f25590de6a0b2f6e07994b34de7f6a086e3d552 100644 GIT binary patch delta 15 WcmeC=?c`-M=H=xw_`8v diff --git a/blango_auth/__pycache__/forms.cpython-36.pyc b/blango_auth/__pycache__/forms.cpython-36.pyc index 23eb611c6a8438ccbbd1fc319ff481b78cf6e968..fa32d5609971a3b45c2fdff4a02a314e5be94f55 100644 GIT binary patch delta 15 WcmX@devX~Zn3tE!;O|DZ6U+c5Dg?Ix delta 15 WcmX@devX~Zn3tC;;r&Lo6U+c61O(Xt diff --git a/blango_auth/__pycache__/models.cpython-36.pyc b/blango_auth/__pycache__/models.cpython-36.pyc index 1521c2c785fe70531ff55cf83dc0d649daefa8b6..cb36dcadf6b07e90b867c12e68372ee7a4fcf037 100644 GIT binary patch delta 15 WcmdnMw}Fq%n3tE!;O|B@Ep`AQU<2;} delta 15 WcmdnMw}Fq%n3tC;;r&K7Ep`ARIs_2_ diff --git a/blango_auth/__pycache__/views.cpython-36.pyc b/blango_auth/__pycache__/views.cpython-36.pyc index 1d48eee3a044c9c24310ab8ca0b51b0c83809f82..60b3d7acc67e9cd66e63efbf0be0a1c49187ad0f 100644 GIT binary patch delta 15 WcmZo;ZewOM=H=xw_`8v4Py^Kf delta 15 WcmZo;ZewOM=H=x|c)yXYfe`>5Dg*Zb diff --git a/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc b/blango_auth/migrations/__pycache__/0001_initial.cpython-36.pyc index f7250111727d8a1ffc8d687ffaea2886283a12ab..9a39432c92f02eaf22b38ad9f7291241ab8c337c 100644 GIT binary patch delta 15 WcmeAX>Jefy=H=xw_`8vfjS~PJk^_wZ delta 15 WcmeAX>Jefy=H=x|c)yX2jS~PKYy+L1D*f? delta 14 VcmZo*Y+z(F=H=x|ct4S?3IG@Z1Hb?P diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 9feddf1cde62055158aa21bb92392b0cd84b3f7e..af514f04f9e6bd613ca9fb1271bc9cad3adc43f8 100644 GIT binary patch delta 15 WcmZ3(vWA7tn3tE!;O|B@H6{Qb-vi13 delta 15 WcmZ3(vWA7tn3tC;;r&K7H6{QcxdZF~ diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 3c79a98735bf6409699f08aef3975c89e1b648ea..48678c5c7705f6e0d95251f89ba24f9da1e9a19a 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=xw_`8v)SiZR4@x$phRd*8k9QvS*7N1o?gJ1c4D82eybW?+1VH-1g)qmYTbDvtfO z4@_`jzp!>798o}D60Y#jmxXo1!eY8=6+&3&wS1I1mg(0!w~=MZw7+X66#=itE=v~bEfIvnbWv~mpaRnh^ zPfUO?5)kGbhA=mAMeAx->8WUNIEmuqAnEq{N;dA3v1)r%>8K&XRI8btHBgFc(Rb)P zLI|4`|83`Fv&g1olb+v5G(hjs%+8`_F7MU_G3q`Hq6V_Z8JR8-Es4nbwj^itnQneE aj>J^SQ<4`~5nRIs*Wlm)`ppS=!1)iKfmxCO delta 379 zcmaFPF_A;rn3tC;;r+_g1Xc!y#|%h-3CMN;;^L->%2~4PDI6^fQG6+!DO^CBKZQGm z2S^K~umm$`@=o05I+=}eF9!!u`AUW&zR9N<&G@B3dRc%31ET~_k-%gDrkr{~Anz87 zuWN{-CQ}hFkW&N_DdK|@{2&Ev>8U00nFZQFHq-zf#v)N5FPRZYfB=YQ24ZI*F6IIf zB@8tTDU8ibK-Vz&Rf#0!qgl!YQXUUh zt`9O5q?CcNNDQPyaB>{;N}nPDARFusuqcwN!A60d&S8_ApHiBWY6o&*F-S8H6AvQ~ R69*#~Baj9`0S*BU768b~KkEPh diff --git a/blog/api/__pycache__/__init__.cpython-36.pyc b/blog/api/__pycache__/__init__.cpython-36.pyc index 047be19030c91f6536abf9bf37d5be92b9b0bf1c..f0594d0680fa7cf4187b38e0f6fc54f12a2569b7 100644 GIT binary patch delta 14 VcmZo+Y++n3tE!;O|B@9UcH8r34ND delta 15 Wcmdlau}Ol>n3tC;;r&K79UcH9e*`c9 diff --git a/blog/api/__pycache__/throttling.cpython-36.pyc b/blog/api/__pycache__/throttling.cpython-36.pyc index 467761770550322fc30819797c17fed7f8c3a473..f1bd8fe3a6e520983de64783f809a85ee117466b 100644 GIT binary patch delta 15 WcmbQlK8c;pn3tE!;O|DZ9%cX@A_M~f delta 15 WcmbQlK8c;pn3tC;;r&Lo9%cX@`~)Qc diff --git a/blog/api/__pycache__/urls.cpython-36.pyc b/blog/api/__pycache__/urls.cpython-36.pyc index 1cd785b3268f0d284796efbf06027b757ca3ef36..1a9fd3791690944f4d33f70b216c565e2132f45c 100644 GIT binary patch delta 15 WcmX@acZiS8n3tE!;O|B@8+HIAd;}!` delta 15 WcmX@acZiS8n3tC;;r&K78+HIBRs=@? diff --git a/blog/api/__pycache__/views.cpython-36.pyc b/blog/api/__pycache__/views.cpython-36.pyc index 0f364fd511ebbf09eac35cd9029967ca7a73f0fc..a0b30597ebfbd5dc0ac646d9248c4717c7dc345d 100644 GIT binary patch delta 545 zcmdn4Gg*hzn3tF9HOs2h^BXzeGc!s}?q-t`Vhm=`WV*!>kY8NllUZEir^z|lki|)! znSp`fmOyc8QD$OJW>soYd~!}=aq&uqA_bsCk;3E?EVdjhKqdzx7xQF6)|AOpSVS3F zCo8fEPwr=B)sqLSLM0SITqPi(2gJo}K!SsjjggD7NNKV#tNP@Zto}Z?#1czOGE(zO zGLsWaGV}8wwx$*rfvhURX{ZWN)&yZF7tq)umCc20$&B0zAdO%`aq@lkWGS#2I&eWG z>CG`5o0w44OLFf;;XmX~VpN{&!s97`&;~Jj^IRTRRJ-2tM#_Wj@&(z2-NID9KvYc! z`I}KJ^cM(ZRGGX`Kng|lm_RBD-%KzInZJ3ppaY7ro4*NpF)=Dlb`%u_niejahvEFm HS4EQmHcM+r delta 592 zcmbQNvt5VNn3tC;;r+_g(;GS8Gc&49KENZcn9dl*k;(}qxl*~Kcv2XH88n%0aRlTS zm-u8Bm-uP&PF7`cn*5hlmXUL^4y%MbGXn#|ErH_HqRhmc%&OF)_~e|#;^LJIMM^-4 zBBjY~EVeuxKqdzx7b6=GPCm_&;#;Hul4J!DG9W@0M96^%E)byzA|U$VEM*W&1xV-t zaWNZ^-~gJ&#aN^=`7De2Y6{3*MXH;9*^(K# z5tb@X-p!sY1vWzmWEw&S%u?QL!Lf-6Mg3Q+)0cIlNES81u*nh^0=bfb&@wy z9&DE{$S&*_I`RdgYMRU6jAEg-Kp>;)kQD$mcs$+m>SY~Q@k?Le)(L4$sv delta 15 Wcmcc4a-D_En3tC;;r&LoKqdes!vt*r diff --git a/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc b/blog/migrations/__pycache__/0005_alter_post_slug.cpython-36.pyc index 1a795b9ed44809d5eeeaeb7ea145e3695578534b..af1223f86f47e3cf12ab0084f2e2bb83e8ae2b82 100644 GIT binary patch delta 15 WcmdnMvVn!on3tE!;O|B@EhYdUR|D1n delta 15 WcmdnMvVn!on3tC;;r&K7EhYdVF$4Gj diff --git a/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20240101_1321.cpython-36.pyc index 5ed9bf41547b67729b8f2402fcf0ced5a2173952..88aae2a4e6659f61a82f42048933a73ffa8b5497 100644 GIT binary patch delta 15 WcmZ3%x`LI>n3tE!;O|DZMN9x7fdoJR delta 15 WcmZ3%x`LI>n3tC;;r&LoMN9x8TLfYN diff --git a/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc b/blog/migrations/__pycache__/0007_authorprofile.cpython-36.pyc index 5492a1198fae9928afb40c1bd1999cb2bb06fb8c..d60d890721248d51a84c67f9e8ab33ed52b0c577 100644 GIT binary patch delta 15 WcmeBX?`CH+=H=xw_`8v}F&$=H=xw_&brU6#y7=1HS+O delta 14 VcmeBX>}F&$=H=x|ct4S?6#yA31K|Jw diff --git a/blog/static/blog/blog.js b/blog/static/blog/blog.js index 1a026a0e15..c21366bf49 100644 --- a/blog/static/blog/blog.js +++ b/blog/static/blog/blog.js @@ -1,5 +1,42 @@ // react based +['/api/v1/posts/', '/', '/abadurl/'].forEach(url => { + fetch(url).then(response => { + if (response.status !== 200) { + throw new Error('Invalid status from server: ' + response.statusText) + } + + return response.json() + }).then(data => { + // do something with data, for example + console.log(data) + }).catch(e => { + console.error(e) + }) +}) +componentDidMount () { + fetch(this.props.url).then(response => { + if (response.status !== 200) { + throw new Error('Invalid status from server: ' + response.statusText) + } + + return response.json() + }).then(data => { + this.setState({ + dataLoaded: true, + data: data + }) + }).catch(e => { + console.error(e) + this.setState({ + dataLoaded: true, + data: { + results: [] + } + }) + }) + } + class PostRow extends React.Component { render () { @@ -83,11 +120,20 @@ class PostTable extends React.Component { } const domContainer = document.getElementById('react_root') + ReactDOM.render( - React.createElement(PostTable), + React.createElement( + PostTable, + {url: postListUrl} + ), domContainer ) +// ReactDOM.render( +// React.createElement(PostTable), +// domContainer +// ) + // class ClickButton extends React.Component { diff --git a/blog/templates/blog/post-table.html b/blog/templates/blog/post-table.html index 07ac354deb..49e1a3c74d 100644 --- a/blog/templates/blog/post-table.html +++ b/blog/templates/blog/post-table.html @@ -12,5 +12,9 @@ + + {% endblock %} diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc index f44f7f6253db2647db1d54092cdae1929cfbdeef..ef4778ea807ffff661b9d24fb063a8e403d94c98 100644 GIT binary patch delta 14 VcmeBW>}6y#=H=xw_&brU9RL`p1H}LU delta 14 VcmeBW>}6y#=H=x|ct4S?9RL|%1Lpt$ diff --git a/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc b/blog/templatetags/__pycache__/blog_extras.cpython-36.pyc index cf6926c87e72647b876d12df4dc0ae1a4187348d..4bee88e94476b1b294df17239e35aa6b06c3929a 100644 GIT binary patch delta 15 WcmdnNwu6n$n3tE!;O|B@BW3_0d;{|U delta 15 WcmdnNwu6n$n3tC;;r&K7BW3_1Rs