From b1d2084eff9f8791ed1adae1dcf44a053ee3d7db Mon Sep 17 00:00:00 2001 From: Pawara Dassanayake Date: Wed, 29 Jul 2026 05:37:05 +0000 Subject: [PATCH 1/7] Create super user and migrate --- blango/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 130 bytes blango/__pycache__/settings.cpython-36.pyc | Bin 0 -> 2488 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 0 -> 904 bytes blango/settings.py | 14 +++++++++++--- blog/__init__.py | 0 blog/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 128 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 0 -> 169 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 0 -> 397 bytes blog/__pycache__/models.cpython-36.pyc | Bin 0 -> 166 bytes blog/admin.py | 3 +++ blog/apps.py | 6 ++++++ blog/migrations/__init__.py | 0 blog/models.py | 3 +++ blog/tests.py | 3 +++ blog/views.py | 3 +++ db.sqlite3 | Bin 0 -> 131072 bytes 16 files changed, 29 insertions(+), 3 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 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/__init__.py 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..b70b5177e48b957a03feb6ca46f1d821c194eff5 GIT binary patch literal 130 zcmXr!<>j*J%gkZ`g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m%e^Rer~FMa(+r? yzJ7UrQFd`bVsff}QchxCdOnPbkI&4@EQycTE2zB1VUwGmQks)$2QsJ_h#3Gh$sP>= 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..60e0b078b95b3ede6f0589e64b8631645e84cae6 GIT binary patch literal 2488 zcmb7F-FDJg6ef@Yr9akMty+K5(T>te(%P<3XU%dbdg|Za$zQApVEUN!JJ@i zZhe7y0AFBUDYtVqui(|}gwQh73x{yRVgG!4=i7UqY|qUV`hU{y*SS>c@6^~QkNa1+ z7|*3rkTO!hLE7eeX(P==`;472G9*p-&s=xvbE=!|W{n*1Mjob&X~=dsqX0RQ>CSX# zA^(|MPQmnY%9w+UF%N}FIa*&qzXe=ZVFoQ`j76A*IhcnlumD#(S>qZk!Zlce>u{qp zWh}w6aUE`UQZNO#;5Mwl9k|=!DF^qy@Q8K;?iz$(eX4=X8n@Fh(-<0d?WHMDsM zKgRb*@%=I7I=pcUipFhNH&!r*JGk!Rx(6G^eRyIBkkL}blC^9_(TzE7PF z6OLU^II?3|-*da9?TdxN9&w0g`2>WcGvN`$E+q?k)Df6(d46K~NEk2#5faR8@u~O> zy{ib>b3GzZ2hn?$PhCgAuYW=@9<|963{MItzTam*OA@$kCJtkaGHAO!i8vAhO1|5t zZ6=NKm4@*C2@#G5wk_C{`GR|V@jR9T7>H0$_-NS!!v0Szj~tH$`X_3qA{X)pmVeR+ zb`u(?!$^DJkB|YTUgBiJAR}V|orn)Z}^JTSCQ_a_^rZ?n$C73Tg-`w03+b&R7q;8NOkreU` z*CD~uFbOnpe2*T9aZQ42lhT2I60A%JBNyWM{#l=}V0l8x2xC~K%ZeTboBeZLurmpj1Q*BrwV`axt9UsGwn@)*#B%&I zX8LR*fQ5XFgUk3Isi5t+HOCw$GaEhqxbyyykuk5C;rxgL&t`#?#P&(AZ{rAwM^^hi zabVQqVkMp?JyA1bF)qv}-^Au`Bev_Y;PE8LWg8L5(V!Eoe}|<X99(|>SBu#PxhlJ8u&z`J!)G~pS~ShxL)w`dy)33Lwkc>oj4u;>E$3V;n9sfF9mlKT%@w+0E< zH|3W8+B}do?NDu2%(rsAhDsGjVy-SX_FD3ug2`1B1gznM8!C2jzJ>hNww^bJyZY8< zBg{rJ-9Sopj8TsA2p20#Rc_UF6Jw}mwWic7f2F*2EKz*>DoH19k4W)LM8dXz&-zxI zNW-}s{fu6yV*f16|AKumu*u6A#9)8mjZe>V`OHF&&+zFix5V+>4P5b+O>?6w%g4KP en#=P1`F^OK&+@rwH($tRqN|YS)5(?Pr~UfjN5KXe#ZAn}B3%+F|mKfUGszsoRib{wBAD6wP-q^eACH6$NLn&A8{15(8 zuAGqg1)LaXvr>eFR7-It&iKuHZ|3aeBsu>sx4)wx_!$h=2;&#{*r&MhU=i?;M^&hz zMHKpYRE<=;h{Hg{JQmS*yq$cD*5TrSkKYH`gaHCBE2h^#KE8WHEiu*3oREXA$O$rTu)zz8Ds3XJL?NL>kL1+hZR6M}2w zTy5u+awu)ix4v*~U@JXRv!w={Y6g(<|c^W>`0rDwM*+krmI z$xF@&(?qHojGGg(GN6dMD_C9khlBjnKEIQU0tO24DvI4q({$GB+JF)>qL~sGsgKhv zxvZGAPnIZ*4^aQd0^CLzPbBY*+S7TBSRMO&vhn#jvxNtlX8$m{)@9Xjsn=*iSI+drGLp8M!n#tU-G;;A#B)x3QH@w6Q1N z9u1oLBQOu}f4BX4Onvug30wlb1@p<)tQ2%N{QH-O$m_fI@LU0JD)Iag-nSFn;_x^; G9{mNNjT&A6 literal 0 HcmV?d00001 diff --git a/blango/settings.py b/blango/settings.py index f9209bef27..b1e4531c37 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -11,6 +11,7 @@ """ from pathlib import Path +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -25,7 +26,14 @@ # 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 @@ -43,10 +51,10 @@ '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..e53ee5565cb3d4ae29b9a46a3806d4f9a3e7fb9e GIT binary patch literal 128 zcmXr!<>kui&&*-~g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(m#%(Ber~FMa(+r? zzJ7UrQFd`bVsff}QchxCdOncKPuGu+&&kui&&;xCU|@I*#Bjg_WH|tFu>g=rVMt-jVaR2SVq|1UVG3r@WPS-0Wzb~2 z#hRFso0;dQ$rQzxl9ia3p0AgjpI1_pnN$QaU?oElGmrukzqIr-@^e%5lk-zD^YzQ~ ri?WLg5|dN)lX5`XfK-0EKG-n5g34PQHo5sJr8%i~j6m(hK+FIDU2iD0 literal 0 HcmV?d00001 diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef54ddb1388df22af4333cf3a8b710008a1fe8b5 GIT binary patch literal 397 zcmYLFu};G<5Ix7K6w-D(jcILWL8eLcrb)8IHBt$D4C4`HGAm*TbJrm+#koqt=MzxiL-U&&1u^kuq z*$4D7+1bN)lHHj`WgCN)$sSFAZ#%hBS)siTdQ6$guCrN~^H>iN3)#N2PPm&M dYkui&&;x9U|@I*#Bjg_WH|tFu>g=rVMt-jVaR2SVq|1UVG3r@WPS-0Wzb~2 z#g?0&lA2TOr^$4SGbJlAFFju`C8-Fcc_l*;3y=a6zqIu;@^e%5lk-zD^YzQ~i?WLg m5|dN)lX5^hfK-0EKExosg34PQHb8c1PO2RvP=7HHGXMbWpeOkN literal 0 HcmV?d00001 diff --git a/blog/admin.py b/blog/admin.py new file mode 100644 index 0000000000..8c38f3f3da --- /dev/null +++ b/blog/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. 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/__init__.py b/blog/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/blog/models.py b/blog/models.py new file mode 100644 index 0000000000..71a8362390 --- /dev/null +++ b/blog/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. 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..b92811808a0720b3286e4d7a11507bf81e3aaf9f GIT binary patch literal 131072 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 P0w4eaAOHd&;2`k-H2Eoe literal 0 HcmV?d00001 From f8940a8193b091eae001a043e15febf4bc6e3ea9 Mon Sep 17 00:00:00 2001 From: Pawara Dassanayake Date: Wed, 29 Jul 2026 06:04:21 +0000 Subject: [PATCH 2/7] Create models --- blog/models.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/blog/models.py b/blog/models.py index 71a8362390..3ebda80da6 100644 --- a/blog/models.py +++ b/blog/models.py @@ -1,3 +1,27 @@ 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 \ No newline at end of file From 3c23cd13071f29f73c8c153bb7badc49eb15d7cf Mon Sep 17 00:00:00 2001 From: Pawara Dassanayake Date: Wed, 29 Jul 2026 06:09:21 +0000 Subject: [PATCH 3/7] Create models and makemigrations --- blango/__pycache__/settings.cpython-36.pyc | Bin 2488 -> 2498 bytes blango/settings.py | 1 + blog/__pycache__/models.cpython-36.pyc | Bin 166 -> 1185 bytes blog/migrations/0001_initial.py | 39 ++++++++++++++++++ .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 139 bytes 5 files changed, 40 insertions(+) create mode 100644 blog/migrations/0001_initial.py create mode 100644 blog/migrations/__pycache__/__init__.cpython-36.pyc diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 60e0b078b95b3ede6f0589e64b8631645e84cae6..88a516551a108ccc41d537e493e5ccae680defb6 100644 GIT binary patch delta 208 zcmdlXd`MW?n3tF9*^JCAHa-T1#|%h-1ITs&;$pUm%FXpDLh0;L!YRTjA}OLNVkzS3 ztWhE<5>cWllIaX7tSM3{(kU`2vMF-uESZcc@^e_y8KcBf6r#ja6jPK^*;ACI8B$c{ zFl91ENu;Qzr~%cerl^BS4KS&h$(YU(C7GfXC6%HbC7r?=B?H8=KrEM{6D6O*sT-w` l!W_(?skd2&F_MWbiX|y0KYep6^LbXrq{*S2nv-idZ2(A~FUbG^ delta 199 zcmX>kyhB*on3tEUU_xfrFJ1%|0c~-`R$+4W8lRG%A0Q5sGwg3PC diff --git a/blango/settings.py b/blango/settings.py index b1e4531c37..6d32909744 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -45,6 +45,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'blog', ] MIDDLEWARE = [ diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index fb640bcfd09dfdca0657bc76f40a3e53e7715b56..c641cbe0e603d04b096a3c3d6fa784148cd9a6ca 100644 GIT binary patch literal 1185 zcma)5OK;Oa5Z?7Gj^iYyJc>ARjgXoHSA;-)fCPQ0buYfG-0U`S>PJ}Hv_+g~uRU<$ zH}IEy<ILmLrWI*2%nh$CBvY~bEt6*l0tljc$-1&~{)vW&BF zF`{3$4~{Y4_A!8BA(t#PlsUB|m&P>@?fHhGBW*0})MgNkZzSeoMK6ucMWV8CIT>+; z=%Fu-4UEEp`N*aWnS2)s_WLNQ6o6Hz!Va!KRl7oDQL2QfJt2@TWubql`kkfD{Aj7Kgthl(i(xZF3I$R9-h>fa|!Ste51QwM~$B)>L7 z7pN@_X@XjBfi2+90vpoCEFWH1qLcX31MXk4aHWa4P3#U~#8&aWtM19R^pJI5cBFsB z!UwVo!h5x~pBE*_Zs(bR22`m6cz#rsxybS}5lIQ(z4Zr1Z4>9GwUt##qHWYM;F`*g zzoVt0J;QpWBwwo}DwS+l{?E>rahag=+Qo8zvrDu;!np0HPY3_q&^7H-QkP7ROw&7W zJJ%{6XK&PnCK1>Dmq)>CadfzKAa?dPx8ByR{e!(=Ya<99lsL(C-QC2ggE&=9%R_IZ zRZ~V(h8@TxK8aBi9Di0FCvh=pJl&@)*Jy|KVN#8oTnHF2Y!y|SMjEOdEzXpz#Ju!;y_BRPkmi*PMJzz7h-ETAqoELo4NzfePO2Rv JP^=h;834lM7(xI5 diff --git a/blog/migrations/0001_initial.py b/blog/migrations/0001_initial.py new file mode 100644 index 0000000000..676f4eb201 --- /dev/null +++ b/blog/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.5 on 2026-07-29 06:08 + +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/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..312ab778ea9c1a9308ee53cabc07f83202085f89 GIT binary patch literal 139 zcmXr!<>kui&&*-~g2x~N1{i@12OutH0TL+;!3>&=ek&P@K*9*(mxX>ter~FMa(+r? zzJ7UrQFd`bVsff}QchxCdOncKPuI`QOfO0-$;{6y){l?R%*!l^kJl@xyv1RYo1ape MlWGStu^5OM0FX~1;s5{u literal 0 HcmV?d00001 From 243700fc03662c641fca0eb56a1e38b0d8b4f7bb Mon Sep 17 00:00:00 2001 From: Pawara Dassanayake Date: Wed, 29 Jul 2026 06:15:37 +0000 Subject: [PATCH 4/7] Add django admin chnages --- blango/settings.py | 2 +- blango/urls.py | 2 +- blog/admin.py | 6 ++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 0 -> 1231 bytes db.sqlite3 | Bin 131072 -> 163840 bytes 5 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 blog/migrations/__pycache__/0001_initial.cpython-36.pyc diff --git a/blango/settings.py b/blango/settings.py index 6d32909744..632d7b92ad 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -39,7 +39,7 @@ # Application definition INSTALLED_APPS = [ - 'django.contrib.admin', + # 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', diff --git a/blango/urls.py b/blango/urls.py index cde05802f9..42b1e64a5f 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -17,5 +17,5 @@ from django.urls import path urlpatterns = [ - path('admin/', admin.site.urls), + # path('admin/', admin.site.urls), ] diff --git a/blog/admin.py b/blog/admin.py index 8c38f3f3da..1d77fbfb85 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -1,3 +1,9 @@ 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",)} \ No newline at end of file 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..6d54535932ac18f7018672ad420a7ebed2c7861f GIT binary patch literal 1231 zcmZuxJ9FDc5C#qa34$Oc*|ZZok8zQP4Jl8GWHKI)ACi(xBHLrp4I0dmdx8!+;1C>W znQrY?z5hafPr7YWxk{5skt%xtWxEJ4ci7kMef#Ylz8#ICzuw9GkHB&MbUt}}k{{48 zKhOjYxXLNq#C5IA6f3;MEBwT7bx#FJ??(rG2;Mpn2ruuy@sd7xC(g9@p4K~47egbO zMwXeGGK>nD)x43qG}tRN2xXqEY~0neN5TUd<{z4blepj{4BW&MejbP(<##hT2}v6O z15ZTx5L|i*0rW2YQwDvq#Sp^a(miDvgXogA(Zm0ZjwyOX>qj;k##?Qt)poa<3wxK0 zyw^U>4A)5;zj4SuY3(<<9pR?cTKi`t?TFocFOTwT`E`pPK5sMKBF_YF!x!+S)w9T= z%vf>*z9Qzn#=-FwO$+oEJVPeo2-(jEQy*i#Zgje;1#bl4u&QOj>rHwtHaIY%mR!l# z0^^sWUTP!Kk{1Glmt3vIdmv7!AyL6!rAm}pb4D%k+lbz&6bcOb&$MYU+NMu=L-E~? zrM^fx(2mqLNzu?b!xj!XF|O82CCypqVHhkGFV89eS}6<~*(ia&QR@u*W?fj&@^9C1 zu)oq}BgzJQl-|);}P!TlqI$SE9&4?6=i)*1Q4Q-Y69V+k1 z^d^RBtEVYOX-a62GVUY_+8IWhoots`h9RPRs?bD!!yZ5S1uFl&ek6tZV1t zi^Wgri<86W>G9Kp!(TD}5Fv%Z;p4Uu$Mz`K_Ud5#NM;YIMMsuU94y4ErV~d81a%<` zvGtq~6`dFz=~~FF{DpehgPfO{Mg~g^TMp>5VE@_kr;EeK3*0&87`H$T&bn6Ic=dVZnnb5rq^nA@IYnm#(4f4qzH{r&yB>6VgNwW;Z+;Dj{H zH&$T2H}-v(v57nJy6@N>ySp@^cHDN`71I!h9sC*f^t2;zu(iOl<+>y3)(7LP`wPsj gO0DnO672pTi|M5A$%f&*uA%pB-%O9Dm~e#Ne_xMl!~g&Q literal 0 HcmV?d00001 diff --git a/db.sqlite3 b/db.sqlite3 index b92811808a0720b3286e4d7a11507bf81e3aaf9f..d9d3108f3be4672c003e8356913c2c3137531b93 100644 GIT binary patch delta 2224 zcmaJ?T})eL7(OrkIj5W+zHZQ!QOY@-(v4=Dqk{s4>BLbd1A#4&X`-^z(=*nsw2Ypz zpSYAWe`45$ELG3dvY#t2)Pxb!n2f~iW{V~|jl0myn3$N|sEL|5Z*+d&=?`sTYfj(x zd!P5`>GQqmyRg74EYvQ!H+d)@rGo#0(QdId2p9Cp^Te3o|jYFK_*`=gfK zU2mbBzJW+QIi0=6H`aCcb%gqYfu}-Uz1@34E936I1`x6rcfSBk_PgCXob|Q127_iP z^gH?z{eV`{c{ID?=y(OW?Pg~^kV2|7&2VO?(>Tl~Q!1UkxbJKOgOU{b4SkQkKsV79 zw1{3u$z|;ba&t!GkAcRk1408a9_b;hE`yrN?cJD;^6ZR`M8vrHXJRS8Qj1~(I|mE$P7HtMmp)& zyvYn+pbPoLD{9ug4+~otNYe=&w7hHZC|uDSdN(A zXCK=3F=2ME=?>h^ZF?53LGHl`_`1fnZ!_&WxeK(E4kOT#TOEWxQw=qKNgK({CSVD2 z_l95s>bDd}W9?J_bOvtb{uu^aLnrobq3}&j*4^U%=62Xk?5^6kZGYNU83+9%-DZ7Y z9k+aAe%{2_+^Fe>3)Dj@c}eTfXqIPa*N`7HUn~(-&X5bl@}yLva*CL#SahnRw0uWbch zlcPh2CN~r+gGDa#+o)bS*Nv#|6iNb~>!)2|9yCuCXDO{7PtK8Rj7EE;-mczYiKK6T z<}p{eKBIi|64j%%q%Hsh0Q{I=bTk1T*rSBB=_Va#a+f_?sG= zQH0U431M_{WCRnKNk(JGVowN|O-JIf)bVu@`E)g=#uZUel{0F2RYOx@UYZ-m|CV#@ z!47`~nx2`F=FYB9lamQmNnobc^^CF5$K!Cg+kd`?c6mIYy||_a7ON;)>jr8NEr}S; zc`2T*X6x7gItseAKWKH0`SmFo8g(fGyuK*GXZk_}I&+`P@GY8Ffa8`tT(5OCNB?V_Dxe`fEnAF}VT@nx-z%`^!X3Ov5jdfG1~ z1hQ)cOs<8;SgXHmR}nP7c?`TIkFTvRg6B^JZ}ec??JaIH0^*fKkmhEL@Z0J64B3ig zCQE(EL2zT(yQ6%`m31~En(`54ORuaqiD=r2BRsys63jOs-3cZ(V$8S8Iv>lOxDOwA OuP-@_N65>TxBmljprw=m delta 428 zcmZo@;A&{#m>?}E&%nT-0K_ohG*QQxQGR2>e0~mLUZ9{5cfe$J0o9F-D%_g`q^(34 zB_?<4doZ$1zM`)!D#Qg;!N%Xs!2gc_H2*FBz5EOKyEitL^H1)!uM}Y8?_%J8%YT#q z6#pLn`TSiQ8_W17cllQ_OYq50W)Cpj*!Y}xvwYmsLS_m6(#h->fC9Gsn@jKaCn#~T zOl9C#;k(3nmF*C3IZqdx2x~aYRPOIE$ny883$cr5>oPVLPiORD zl-s`7h0%(ciSfb4#ygDLuX-|uFfv}8*m!pPcW*{65nX0?24RNJ4E$Mq1-x5%UT{6< zvf*6GahF4g?G@0LT&B&;k<15}8W_8noEbh(Z0uoSc4yo(vC(vTKpNxp=_=`rJEuQS zW3-)qH=WUV`ln3BDMHMB3_`HrgV59WW-^+x0NF+p8}+seWH7E}+}@VOSjD>ixFh3v zrs=lcjJvnHc`)`fGIDKZobX?M(E Date: Wed, 29 Jul 2026 06:55:17 +0000 Subject: [PATCH 5/7] add model admins --- blango/__pycache__/settings.cpython-36.pyc | Bin 2498 -> 2472 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 904 -> 872 bytes blango/__pycache__/wsgi.cpython-36.pyc | Bin 0 -> 531 bytes blog/admin.py | 4 +++- 4 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 blango/__pycache__/wsgi.cpython-36.pyc diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 88a516551a108ccc41d537e493e5ccae680defb6..890e538e76ab7e97719379461f969b2aef2d06e1 100644 GIT binary patch delta 201 zcmYj{ISRs16h;3xvk(ho%%q7L=c#c67Vbc+2ZF_wPi*bAa0QY|$O7!$fw&Vl;wP0C z&fygI?L3`yW!u&JBRiQj#=h)trtG!ktlrbxRp{iP4hIdmXbO!Q@W_QP7&HV35ut^) zP&1CWPz9$Z67tYN_h_IOF{DK$87O delta 252 zcmYk0J5Iwu7=-s;TcGK!m+ za0}O*!soW5;$jsbk-`wgkiwY4l*5?I6ve~{Vl(G3 z=dwhxFfybwM6sr@1T$!|Zj9(+V)oNyoBWo^P?Wp0D5oH?q$IT{uXrUx5j)V7BKFDl I%pQzP0D1EmzyJUM delta 153 zcmaFC*1;ZO%*)GV)0dg`hKYgUF#{4{2C^N1xYz(lq%cG=q%fv1S*%%X%}nWxQS2$K!3>&g8-2Q%xU1L_Q*tx&^!+qBCf{T-RAed6 nEJ?k^Qd*Q#e2W`M79^IGq!#5BuVg6V1lm%>Ia!|BgOM2k6*nT! diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d14ceae0f87a7b243152c309d942cb3a76d04d7 GIT binary patch literal 531 zcmYjNv2NQi5Tz(5Hk738P-Nz6v=M`33xc8rk{T{rXK;!FUSvi*%Ty_zAToB7HOQL( z$Pabk+NrGLlqBvna$^ z(<+|D5rL@el{>O0cOGcC#Sdh*E9sOBckh2EKc=HG%h4=U!4}xC8!b$MtZuM`+@(n} zb_{;iXu&eK1lH9Ht;LN7CM*-ILV2s&=?P!r+98)vYrLz# zIKH-p;>q7I4Kf)<{%rv+Yu~ah8~*U(%csfcDw|$jUymoFY4+{v;``Uj``6v)Qwz>1 zQ`lkO_p>ZG$TCmS`Zt}AG!OREmbIZl$M?akRD;GRp;5v@+-m3dwgjI^lZ3(z{CgKn qSHN?W3i%qFpSBh`@J{+AwB%`h=LhHAa6b$}zipvM2XvplqW=NC3#Lr~ literal 0 HcmV?d00001 diff --git a/blog/admin.py b/blog/admin.py index 1d77fbfb85..ac51b5f03e 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -6,4 +6,6 @@ admin.site.register(Tag) class PostAdmin(admin.ModelAdmin): - prepopulated_fields = {"slug": ("title",)} \ No newline at end of file + prepopulated_fields = {"slug": ("title",)} + +admin.site.register(Post, PostAdmin) \ No newline at end of file From eea1ac66ec36ec159c087baca1a4d524c9f45056 Mon Sep 17 00:00:00 2001 From: Pawara Dassanayake Date: Wed, 29 Jul 2026 07:07:27 +0000 Subject: [PATCH 6/7] Finish Introduction and Django Admin --- blango/__pycache__/settings.cpython-36.pyc | Bin 2472 -> 2498 bytes blango/__pycache__/urls.cpython-36.pyc | Bin 872 -> 904 bytes blango/settings.py | 2 +- blango/urls.py | 2 +- blog/__pycache__/admin.cpython-36.pyc | Bin 169 -> 486 bytes db.sqlite3 | Bin 163840 -> 163840 bytes 6 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 890e538e76ab7e97719379461f969b2aef2d06e1..3684417d89fe8820ffff746f7bd2d51ad30b24b4 100644 GIT binary patch delta 252 zcmYk0y-or_9K`p(x3>pIjPXABIKJdW0r47Nz{1wb*!(+i%w|bE60x`N2?#B%i9K&% zd=nplS739MGx<%Xm}0)epD??v)s7y%>_VRi@hASN;`*IqrPtZ#2hL2uAwoomk)UpT zj?my3O(Wo=g%oXc&^5{udRt|P6ZE-`a|~VrWU0W#R$Af)hPZT_A+E|Cl{vO#6gM&9 z7Opvk&uvG?(Z!T|sNQfN-lG`jyD9xr9APml%rbvo7VmF%p3m@Vi``y6>A~E6R`QrC V-f5sbB{fB)C~=h5k~XN`9{{tgH2wep delta 201 zcmYj{ISRs16h;3xvk(ho%%q7L=c#c67Vbc+2ZF_wPi*bAa0QY|$O7!$fw&Vl;wP0C z&fygI?L3`yW!u&JBRiQj#=h)trtG!ktlrbxRp{iP4hIdmXbO!Q@W_QP7&HV35ut^) zP&1CWPz9$Z67tYN_h_IOF{DK$87O diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 36813a8495ec812d19f23ec37241858795bdf946..784735a7d934d900d2279de6129d1b90c0573822 100644 GIT binary patch delta 153 zcmaFC*1;ZO%*)H=wlp*A4HE;yV+JI^3}ib1aj^lANMVR#NMTH2%3;i9ieh2}v6*w2 zb6KKT7#UJoQdm-%vRJd&nwioWqu5hegBdj0Hu`iiaaXY=rsQVk>HBGNOuorvsK`>B nS(18-rL-ug_!c*iEJ!RVNiE7NUdd3z3ACk%bFw_M2O~28C$J*$ delta 121 zcmeBRf5GNs%*)HQWM*d8J0=E(#|%gS$Y*c>;$jsbk-`wgkiwY4l*5?I6ve~{Vl(G3 z=dwhxFfybwM6sr@1T$!|Zj9(+V)oNyoBWo^P?Wp0D5oH?q$IT{uXrUx5j)V7BKFDl I%pQzP0D1EmzyJUM diff --git a/blango/settings.py b/blango/settings.py index 632d7b92ad..6d32909744 100644 --- a/blango/settings.py +++ b/blango/settings.py @@ -39,7 +39,7 @@ # Application definition INSTALLED_APPS = [ - # 'django.contrib.admin', + 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', diff --git a/blango/urls.py b/blango/urls.py index 42b1e64a5f..cde05802f9 100644 --- a/blango/urls.py +++ b/blango/urls.py @@ -17,5 +17,5 @@ from django.urls import path urlpatterns = [ - # path('admin/', admin.site.urls), + path('admin/', admin.site.urls), ] diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 02891cc5c68102ba28683e5242a2283f3c195691..6ef7e0116fdcab268a9da0c11b9378fdfdb796b6 100644 GIT binary patch literal 486 zcmYLFJx{|h5Vd2cO-qUp@F&9146F#1i3KVon7mkNY=VOm2RjuomtVrhU-HVt$jZby z<-^jQ-}&8py7TdDHhp?k^(R8;9pdj$Knn?!O!}-zuqvdqXw_har6(<#(o$d1-_)`J=J-t}9BJuXNE?1};1Vb`E1n?JR*88$KR(QN8qum6dY6 jw0?RSI)*(5zyHy;Xck1t$#%U{43!Hbq|qKpqkZxX&Zc)M delta 115 zcmaFHypoaEn3tC;t3NZ#o`Hek@x%$Dt^zB zE!M=8+{`>bO{OTml&r+O^nAVK{JfH)%%mbFpn{bQMa)2|hjF%UBV07>c_82|tP diff --git a/db.sqlite3 b/db.sqlite3 index d9d3108f3be4672c003e8356913c2c3137531b93..4666c8a06f993dbc2780b5193dd6a300410effd6 100644 GIT binary patch delta 1273 zcmah{O>Y}j6n$^rxbav`E~U^mq*2_`O=toNdF=Obr3tBz9p({mqO)q7tvf6Nabf2MY zyCt7XkL)D2Liu=oEAVbmPi=+^rEpT(ndi&RAYZ7~12c)`(%kaRnh?*=#b)^8t^9T( z8O)^BVtOH*$ZLtYl9u~Gn~fVALS2zV)mT;B+Iwfw+nnEYZzNPTFQ zYOYv&TM0y$YuTB#Ttp9r8xb*PmKWt}#4r+(nNTG>A6rv`A$4^ryjn6V+1he)K}h-X zvvS7pi*>URY5JqlaJHGt>B&OHUA`Gw(UP~C>0)R$zq#Ux3uPf5_bsi|3#*OFTDE7K zj~AtX+2-{MKFLAt$IwO4-9J~p2iM*tQSSd7`=-S@zhn;%90ZOK9Kql4Cnf&`6E=eJ z5V1}>!xGHdEp-Bq5j=-y@R)*rhRZDBFtHAX5RMx@K};j~9zKTYPMe3l2;oow)Ek)N zPOaPH7u_zwrwWQB21-tSCtWNTbf=X>r>`xH<1yAZ45QMtkTJ>+wm7bFN=mTBWD7^cy&=a55*!`v=L!RaO81 delta 176 zcmZo@;A&{#njp=nJW{SE From 1c9c2765aefb2566f5391844df935d465ad0fc3b Mon Sep 17 00:00:00 2001 From: Pawara Dassanayake Date: Wed, 29 Jul 2026 08:52:41 +0000 Subject: [PATCH 7/7] 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 1185 -> 1792 bytes blog/admin.py | 8 +++--- blog/migrations/0002_comment.py | 27 ++++++++++++++++++ blog/migrations/0003_auto_20260729_0851.py | 25 ++++++++++++++++ .../__pycache__/0001_initial.cpython-36.pyc | Bin 1231 -> 1231 bytes .../__pycache__/0002_comment.cpython-36.pyc | Bin 0 -> 1035 bytes .../0003_auto_20260729_0851.cpython-36.pyc | Bin 0 -> 749 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 139 bytes blog/models.py | 24 ++++++++++++---- db.sqlite3 | Bin 163840 -> 184320 bytes 17 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 blog/migrations/0002_comment.py create mode 100644 blog/migrations/0003_auto_20260729_0851.py create mode 100644 blog/migrations/__pycache__/0002_comment.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0003_auto_20260729_0851.cpython-36.pyc diff --git a/blango/__pycache__/__init__.cpython-36.pyc b/blango/__pycache__/__init__.cpython-36.pyc index b70b5177e48b957a03feb6ca46f1d821c194eff5..3d14e70b3811751276637cb5f549fbb43aa73ee5 100644 GIT binary patch delta 14 VcmZo-Y+__H=H=yTTRD-f1^^e`1Ev4~ delta 14 VcmZo-Y+__H=H=zG>6^$_0{|8O13>@) diff --git a/blango/__pycache__/settings.cpython-36.pyc b/blango/__pycache__/settings.cpython-36.pyc index 3684417d89fe8820ffff746f7bd2d51ad30b24b4..e331d2494fcc20affd05e972ba354f77128b5234 100644 GIT binary patch delta 15 WcmX>kd`Othn3tDJebq*`J)8g|D+E;l delta 15 WcmX>kd`Othn3tE!cj-p9J)8g|_5^kS diff --git a/blango/__pycache__/urls.cpython-36.pyc b/blango/__pycache__/urls.cpython-36.pyc index 784735a7d934d900d2279de6129d1b90c0573822..4172e77a53cb37ce03274347a301a66c5a56ae83 100644 GIT binary patch delta 15 WcmeBR?_g&$=H=yTTe*>~i5UPLRs-h% delta 15 WcmeBR?_g&$=H=ybTe^|0i5UPJ!ULlK diff --git a/blango/__pycache__/wsgi.cpython-36.pyc b/blango/__pycache__/wsgi.cpython-36.pyc index 8d14ceae0f87a7b243152c309d942cb3a76d04d7..711726c6da33487987961d62dc83a4f872335956 100644 GIT binary patch delta 15 WcmbQtGMRYvC~1ppSa18M*O diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 6ef7e0116fdcab268a9da0c11b9378fdfdb796b6..1acc18c75b75397772a0880cf4b01a6b1228737b 100644 GIT binary patch delta 308 zcmYk2%}T>S5XWb-v&kBo9z^N`croBX@G4^Q;HgEhAOtUkT}nc>f!%oa5b-FKK8>%k zcoPNR!dWZg!2IVo%ooh3c&5j*qR2m9>t=!g@9@uv`I6n=vuM!Rg2f6ka?&PNRKik4 zR#p<>8nn>#1ey#s=^(0%qiXhy7V{0jazp#jzj9)cKV?;7yJ_NIm-wSXkUzQjNepdKP&(M delta 276 zcmX|(u}TC%42F|Qc5gg(QEYsM1q;FU5U;ZFR{c&$#<2y|& z2$mN1W<4?RhcC&W|Ajy3>AWnbkFQPp1px1=|6-*}RlL?FAlQM&8gXRP8BaBNt{K5$ zo3**4L2p+eB>W7*x}6ME+rKM2I~e`VZlTIQH4!RI*-8$5b6=T6cdK>cWgoY13!H4f z=Xs%)Q0!)Sc9JPtRWu`D80VYnU^n3DGI4A+F4^GLP29MUri)%&Hy6$QHHLkVzU-+~ WN_OUZdFb2)>J-Q9!W>ayj_C*IS~yt% diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index ef54ddb1388df22af4333cf3a8b710008a1fe8b5..d40fffe77690fc5531d308bf7ed1c2f64e531885 100644 GIT binary patch delta 15 WcmeBW?qy~(=H=y5U$v2~oe=;VO#_Yq delta 15 WcmeBW?qy~(=H=ze>fgxL&IkY;SOc~I diff --git a/blog/__pycache__/models.cpython-36.pyc b/blog/__pycache__/models.cpython-36.pyc index c641cbe0e603d04b096a3c3d6fa784148cd9a6ca..0f23bf3ff4460e43999232f3a3d65d8dc3b5fc17 100644 GIT binary patch literal 1792 zcma)7OK%%D5MHi!wNFWY<%yzA3lyjkz&`X^6ftZkEm}K)tz39vRw6C0vJZv3a-yO) z=Tsm+q<^CQAH4RIOHV!Z)NgiWTLsdfYj8N68B)Xf=A*yv^};`YOQ*lPmi33V@;T5S zVN@3o(vmE*a>f}W-OlX1!#j=M$(-EfZlgO{H}|;L=q~I&_nGy?l3nS&wWO!mG`Q^W z5Efqsumnp>1WPC*SfZsRmhq{z-FuJUwziq+=A~3w1C=lxey9y3{YLSu$3;qbw;VC8lz++unU=wlJO$Rjq~S(fKxn z#eRyA)6UX(Y@fK-gI7UFe(ALpgop?U#8DkWtN`EChN()yl-<7J5+wdpJf@HLgV}hX{+4 zd0mR4d@T|wvG%Xl$J<+afUNZziFFc9dBU5n($ptru=jlUop^qFcp{FT9vuFNB=%1C z_YMxZH`XetORYC3&Rb@o!6-}LBGcBhvP$dpLVb_coG9H^{Wkfja=d?)c$>269VE3H zrnzbYP1u~Tq)2KL0n+p=Z5As)HMlisZQ?-6qar+gw!wV1h7q!uY4Uv-w_o7-IBtXt z5FqRV=niy3kaQb3*}OrKs18pbo&gXg9D5);+15#ijqu!5TQZO#cHL69)tyVm@5)HV zpxQmz1Hygdpk#noZy_<@r|)3KbeAUExWtc_#wq4mrv26xU`qc2{kS{BUV0#6O{_<) zsPF$LOY5}Gz)~IIxRnAowWX4Ng>l8bn3B99-~A6YlD z;5nM+Q*wPq;sFGYXY)~(R_86kgrxow!UU(;eA4!VQ$gikHP7=zFZ3tm9vmgbVpx)F zyNg(BoI06QnqHy?d*hE=-c`v*J$Un=F0qw8%wRz(ay5biJ;XE+BlO{Ljm*A!1e`f2}PGN?h*YzXx^dbVogRX cXkF96_}{c|;J5THH=MwIY`RnIZ1@}DKciBiOaK4? delta 633 zcmZ`$O>5Oa6rGz)zTQjH;-a;>(p^9VaV3;eQ0uC%kM>a{n~-+KzSK!ZW)h^OpxEwQ zJ+kPo&_B^X;XjzId+{fDCn`J_Cfvh4H_16SXFjL5(foOmj273`Y3dU4oh)4x`)w?3 zfe{9R)Q|(%-Vsji<}Q#ogt?4f5k@(j(n~k@aN;o^C;p#_&w>Mzg^Qbqi=SU1>M!60 z;vMWg3s6{%Ekysq$WrU?V`vbgM8Sv2xvQ8I=+{L3@Pct@ga-W%F(7FsU8rqg8`u|a{qPksP-$w|6;yrR=h#|$o=&@2q*|#QH&~N&Ww~V(d gG2=mfc(4@KaF{kR6K>*fb%Jk!6}N|pqV%5s3z?0LY5)KL diff --git a/blog/admin.py b/blog/admin.py index ac51b5f03e..e8d8cb1fad 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -1,11 +1,11 @@ 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) class PostAdmin(admin.ModelAdmin): prepopulated_fields = {"slug": ("title",)} -admin.site.register(Post, PostAdmin) \ No newline at end of file +admin.site.register(Tag) +admin.site.register(Post, PostAdmin) +admin.site.register(Comment) \ No newline at end of file diff --git a/blog/migrations/0002_comment.py b/blog/migrations/0002_comment.py new file mode 100644 index 0000000000..a759b937be --- /dev/null +++ b/blog/migrations/0002_comment.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2.5 on 2026-07-29 07:34 + +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_20260729_0851.py b/blog/migrations/0003_auto_20260729_0851.py new file mode 100644 index 0000000000..6829f21cb0 --- /dev/null +++ b/blog/migrations/0003_auto_20260729_0851.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.5 on 2026-07-29 08:51 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_comment'), + ] + + 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), + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 6d54535932ac18f7018672ad420a7ebed2c7861f..5e3ca6f95a5774ebf16abb7c02dfc77876d82b70 100644 GIT binary patch delta 15 WcmX@ld7hKan3tDJebq*`lPmxus03pG delta 15 WcmX@ld7hKan3tF9{fv!lCs_a|{skET 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..f4f874e659edf6a27c2d11fc6321407fd4ab1917 GIT binary patch literal 1035 zcmY*YOK;Oa5VqHjV>?ctK`IAsT*4tKa6=Vp=mRQfLA1U2vU0prv##wmYqur6mIIgm z5F~!lUXhUc7dSC%rw?p-^Lb`G^UZvdm;Jtf^NXi{EW`M1Jh*JcoA^|(@L&crGb1-c z)6|$`B)38TV;a;E1<W2K5p3VIf^iy>uyEW(#cbnqb7z|8`xY^&}m(d`%KFTwyEN z%OmCO-x60rEQ%V6x}KF#sVD2}>o2H;T$}@)d#HBNBFaJ8(@Z2Pz@X=p7rf?Crn*}q z&oO}_oE_~dvbR07RS=!kg2ob}8kp*plIM|}(NmZyuL6nR@k>y_ImoG~=E=MBddd^i z6yln4cE_&aaJlx7>*&D?YT=23q5x2XBDGN6rnZpiu^Z~n35SeT2SXwq6hn6LKSZ|4=T8e;5gsjRx^@)y(?1hrV8HhWP-!m)%28i1mEfw4nBzrCwvZjs80g2 zwfeh40#AzfI7x@4QIQBm*i^Yq@3@Jm$K-Hpvc02xQNnyXe;RU##hT;q#`ufKVH^v_ z#rQ(V)2fVO7*8{u41Yv2zTfL{vk-AB@u-~14(8EAs|FfazDZ2SwoO6?rjPfU*+dLo z)oa;lnNHf-cykMzHe+o2e|%>gwf~^eZ71@nrmXATlW);8v?+I^mFTsWq|%xO=91}J F{{SXUGAjT8 literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0003_auto_20260729_0851.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20260729_0851.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73a22bdfa1ecdc9367259ed988f73eba6de64d13 GIT binary patch literal 749 zcmYjP&5qMB5VoD4rfGs!2*d>*AeSa|#h--GBB9+2?1eq$Vx^hckdVa1Nm;>_z4k$P z3f{w4PP_sq#%Zg?QNGN0?9bol$!Q#i-mkj36^#96{|%SoGkS+50Wjb#>v+yPkqd5f z(K@+%!N39cmVt}B@qReD2jU}3yg#&uCBlSVUFl-1RX-TNQ-JMoS=!oh%qTdccX&^L zEa$*-0dd812i?ZA?C3W$@GxlRP1r2J-wBvOuyYUf`MwU}j>BT-R3eWcA`SP<{KN5Z z=jdp7Y2lGp@t;+N8d zQWD9wMT#RSzif-vo@q0{4fcS2S>vFoam)m70nV)!?btMaM~1HI4yQTeLsRsXGTwHq z+rb1QRlchpjYBp~s5W?L(od!zTQL^?UZkH?hiOSpRC=TI=V4Qnn66vPMITkAckNB- zZcpW8bCs>0XD?Q-WcKpe)8*!yw!e~X^zeWnaD3P0f}Z=_7yD>hk@#l5*SUoC}F&$=H=y5Up0}f6#y3b17iRH delta 14 VcmeBX>}F&$=H=ze>YvEg3IG?}1B(Cv diff --git a/blog/models.py b/blog/models.py index 3ebda80da6..dff0105f17 100644 --- a/blog/models.py +++ b/blog/models.py @@ -1,6 +1,10 @@ from django.db import models from django.conf import settings +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.fields import GenericRelation + # Create your models here. class Tag(models.Model): @@ -9,11 +13,20 @@ class Tag(models.Model): def __str__(self): return self.value + +# Move Comment class above Post +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 - ) + 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) @@ -22,6 +35,7 @@ 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 \ No newline at end of file + return self.title diff --git a/db.sqlite3 b/db.sqlite3 index 4666c8a06f993dbc2780b5193dd6a300410effd6..bc85a9a42b412d08c3bccbb060d5d6b2eb2389df 100644 GIT binary patch delta 1406 zcmZ`(O>7%g5PoB?S?@Z|*h!5Gj+D*XrYxzG^}6vNC1q>e0!?Fzih64OyD_GY9R(Ap zgj6qx9*Be*xoD+I2o6ZV0jZ9We1HNsDmc&ssssh0Ac4ezaw15nKRDxoA>H&vd0-DgampY=<}JigCSRtOpRT$=$Z*Pbx9t-n?y#=A z+;&5<>kZm*fMV~k>rJ)JF2-FJ;(Aohm8(Tj6hrCkOSNiR5~Z*hkz#2vIukUMfEWo# zF;0xeXM*vNI28^>q)>QzpYH4L`%3A2b#YOt)CL_Q@z9}oP?`!xB`FqdjeCBj9%M02 z@ORAMr?`Tvcojd!+c<}D^fpxsQurYe*5uI<$B5YvMqd4WO^vzfS@1Phr=J9-@!j;~ zsEgH0VlYkc4t|3_;B`#59O6lIIw+T?yZJ{i%Q2`-~o5-XnaqQq!+gx^`hnF>+9(@Pa6YLxcMX z3GJ60jO-+F51)HvvK!3{ub)cNZoeNcDYa~_tPDmP{6Cm@HYuM@a;N2^b4jB>cIT#Q zj^i++WfXWoJAV{xbV)Cws4Qz&6X0=Fb1x|QnqCag%|6D7f>tj>#nPc!6BF>9_DKO| zL1|omldSU40H|`utl(?KX4!6*%Kx!5g1@(`6;ekItspTNJHzl^_|e-{5*{@eUM8yk)IC;RBzF)B>% z*7soKn0!TFTT++{XaEO)0R#U#{?q)o`1kVH@)z(g;P2kp7{Ncez z{HOT$@XzP(;;-S)-`E(=KRMrjDzgIb+{x?#jvE_8c{k6EO)p|r;CG$OegP=(mv6J{ z{rw5d{EWx9vpX;zVBGGX!pOw5{iHLawG4|GLq5ZFt^`II0oIEwZp`vbo0!ZPn;5<` o