From 9790acda8bc038e79d80ec63ca53254251bccdaf Mon Sep 17 00:00:00 2001 From: Gokuldevx Date: Tue, 26 Aug 2025 14:30:36 +0530 Subject: [PATCH] minor update --- .../core/__pycache__/models.cpython-313.pyc | Bin 8916 -> 9058 bytes .../core/__pycache__/views.cpython-313.pyc | Bin 18879 -> 19477 bytes civicfix/core/models.py | 18 ++++++++++----- civicfix/core/views.py | 21 ++++++++++++++---- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/civicfix/core/__pycache__/models.cpython-313.pyc b/civicfix/core/__pycache__/models.cpython-313.pyc index ca9962d3ab5a013334117cfb3c2c2e9a0ca25986..9d95b666e70357ec56123cb941ca244fafe8994f 100644 GIT binary patch delta 1880 zcmaJ>UrbwN6z^BtOaHDgTFL<7g2*VypP-Du0M|`AaadR>Tf$3I+Do~y+?Ma&8j56W zae-|_VfoaV#o&z5iP1#X=!^Q`gZf~M8cj-W_JDg)*L}Q|!^K~#yI&Yfa{d&&% zzTdgObI$kO(5=9}U!6{y0iM6+-koXiZtZ*D)X{k~s)!j?qT+OliV68?NfDLI>=YPM z(_%cDRmJAGG#$+(HE}@fVLzKLkO!D%o+3t;H@DRqefKSRCzPq(Q{>rMDK1AfDVc2# z1esMh{u)|IWUE~HkBQ%-<2Ezn9S?ysT3Rcq1J{A1-j|_%r8JGbt&mb?ub8uh=fzUT|!CYqrb1+b%b4guOmvfdRRKKJrru+ba1|;4CfdyybJ^W+PUg zU^2UZb69fESVsxzWnb7n8w#x+O*95|xz%?L!-e za$Z`GUelA37Ny5w8D!tvy<~*_VIL5NF{p|4J6eyPgr({LIBVE;m9J$lX1}&n77pO7 zK2I@LT7oBZBMh@mN6r3TSn9SIm7u`!NK~UeEbs6)k6^?oLXqU?06GwQ*%9ZfWFWWW zj2KCn9VtCmF@(MffUqves+y5hpNS5!eCZ1Dvq)JexB|Wfd)vP#dA{@s-1uJ=C{JS! z9Joof0xTQ0-Sz8_u38G8I>P=gTWM@UF98s_csz04IgIS>k%+3%NaPZGd;cfSEX3&M zSSq7vAme=bL*#k(M)?mU%bs(K4GZ9x zLY7%yg`d2{7Ax8wUPkW)fS~VSG1+z3c-SAF7>|U8#zsTop~vV7yIC>V#0!zZ%~(zv z0?=)N6qV$Jaze^d0j;2`*K6mRpT_^oY|48)glrV6N5=tlTP7XfE#ckbEu#Nfgo_Bp zYB`AxgmCUpZ<>%vmOOB)asv#Tgz{pdB2>Z%>SyO_53r@GmZjG*z(|+irJH%33(f8; z-t4Z7BF|-{h?Yu7+Kfbtro!_^W;|TQPK9b$wXVAE)EW#itTH^Tx%zxRC%52L$A|4T zuv0E((SC58N@;uT@Fx4Qx@V~{D5b?JRv45uJQ6Qhx{iQ^Tr0}C_S7%*={?8gDsDr- zZ&Swr;JfT)dA3nAMy}?5sTn7pO|a^gSPCv%MN_%l^c8lxwo%|UK;a(`yaz$N+y$-g zJu>e=AO`P^jJQ5{cVt|3O6xT|s;Ew`V}&GkCnv|=s*9E4rRF2Lkd9JF5Qe8(Y#|@8 zfLM1&#s9f(xQe{bxQbjmE-Kd(J6|t}r4$Vh-om_!2&-GtG?kX9mZdi^qz{4L7H+(( z3v+)RR|uQzcX5MUXIJW9^zgyq>{tTsriYoop^|*eCL11fbP&&l{@Vt4-JW8r4a5Hc DS#H7< delta 1754 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 delta 4593 zcmZ`+dr(u^8NWAgxFHDy2ni9wLm+@C0-`9mD2hBpBw4X(SZ z?zZ)DY}eiDy4JCyGj+OKT6a3_xV7!H)7fbaLp$1ArhoL0?X=TrZQa?<)_?ka=O!dP zdT01?&iTIco$q~4zHx>Bi1L=FIXT%Je46mxqnDd5T8jAji`B2kvwcFJqqm3@^*V{O z*F{{t#iY2`P23*Nm+dq6t?DfyCB3DjwAVvCu$JTENZBES&*I`*P#k=u9Ol-Hc?HaE z8S_eCF6>(E%LA-BWH?mlv!|$WE-j`SwpIHIT-;0ig6JAwA#C!(x&zlqjjssiwIIY; z&K;_4;Z+rU&Xm9md3DRUT+6rwj?|~v=v97Id`)V$Alkib6Gs}B9KR~fL)I>nP?DxD z7`AR1S1EGQjT&oKV~R!xHLK$5Q?mt)%2trq3@xT^i43#nHezM z(B$FJ%PS@#MZzR15mG{V!Oj=c0>Q`E(V$RPm4_QwBUB^QB2*z1A>;sf^<*u5U#KnE zj4O=*vL3*LA6ZZTDLC|-XF;&4Qp{vD-zvEG|I8jQAw6nU9@B^Qo0e=0mvwdDFXi$vudb6 zD9bU4?1rTlYRhk=8*J}_W)HSGXZ~T+Xf~>v;Ra3Qm{&tkF~!6-`GWz1XM1_l0RKn{ z0@H&d#k9uW(eVGQAo<9e_N0K*JbKw)aS)xVXuEgpQ?z4JR5e7$3{fmGSt9-u;i%-7 zVd43_!Z>P4x9U?l%n?-iP zKjJ{xj?jzHhrqnwk0bQ{a=)U5i~R}-G!~RGfrf!5(R+nc>aqOas6VTiUf5{lKc*4K zfJuCl#a4X4a&8HE9BAU`Iz zN5d2T@$gtML`GokIQ+@K2AJj^8!cx}o;rD@aL!mdZ!LST`a|;v=2>g|S>0p7dcOT! z`}wWsF1cH?9$W3R*3x-f0ln$oQ#dc=UZ_qK*WW(ze)M)|PH0c)+DY?_Y1KpCiaM~e z*tyTECH?f1lG<%7(5SrEOwz^9Y{iUKav&xBVd5Vpk_Zt-5sD!ojY}{wqr5RXR9Y#p zvKz$tI(n+qUV8-jcu6+Ge@s*O)J)B0$*fjj1ciSNO!==q(b3s5nu|@6veR1^?8Mh#OmmaU|5qG znqc=@q-My-&yW!i<)b5Ekp#$Vz;z!vF@dMKPYs+o4~yWrIiWM5>jYVN>o~oHccB*) zAt1@4Bp8VX!y)MJXJCz-rMGJPzF3GubPe$$u;;;lmnITs<4obpxXKh>tgE7zqhKbnBb{0GRTwEkQ1%l^4v(LJ%*F#piya>h3Ors2qaSii9F|rFS7?AM{))p381G$7;2y-)u z^-r_~B{*k}AH)$89H777u&!kY=jif9O^bP8rI4{AD5PzzRa-Ej)LRr~D#m~mi7s>k zJV7=9sEV&dAM=RP9F~p2ljFTb> z1w&(MUSTcWNj}`(K}O?fFdCeaLQ5VQuwAW??*Y>qDs=2kYI36E7Jr+%w>tMNJ5wJE zrA}ooPoGHcf|SK4WHV;G+glsd!}xnNQqgJ%Y4>Y}jP#=3C3v`D zd^X@mJIf02(W2Gt*V4#y`SeMLKA!n-L1(bfr%OLvy!rtWfYqt29(v3@W_lSpm>)pbQHDLt3I;xqLVkjL%`?UwZ}V|X4}$X5cIbwY*OC!@ zYz|9pV^`FY`ykJ^uXEpipTB3oKRC3fduWHxM`~~{N@Q07JT4Y@A0;~^HBS2Fs2GjO z83_X$6niWJFJnpl&5>jwzW~Y*9qj&=(2PQ-0lcmBv+h69zw9c>wZRmA(1jt9W%iz< zxjp%DMGu$CgslD?VZSWd+pY-(bRz6Vz~40N7Y2JNlL$^H5oCnZ2(KZWL%4*1O_^Xv zWZjEk;~-es1T&pr?lG@cF{ST-yK!YbfMVJLI>yGO4l)Za{o=pEoIES$#n2R=8ES3bvA{7a+fS3lKqno0!Q6CF(dZKJ>H>(!y;{{i<2%I5$8 diff --git a/civicfix/core/models.py b/civicfix/core/models.py index fe643a5..79b9590 100644 --- a/civicfix/core/models.py +++ b/civicfix/core/models.py @@ -10,7 +10,7 @@ class User(AbstractUser): is_moderator = models.BooleanField(default=False) is_resolver = models.BooleanField(default=False) phone = models.CharField(max_length=15, blank=True, null=True) - + groups = models.ManyToManyField( 'auth.Group', verbose_name='groups', @@ -27,25 +27,33 @@ class User(AbstractUser): related_name='core_user_permissions', related_query_name='core_user', ) + + # Ban-related fields is_banned = models.BooleanField(default=False) banned_until = models.DateTimeField(null=True, blank=True) - def ban(self, days=1): - """Ban user for given days (default 7 days).""" + def ban(self, days=7): + """Ban user for given number of days (default = 7).""" self.is_banned = True self.banned_until = timezone.now() + timedelta(days=days) self.save() def unban(self): + """Unban user immediately.""" self.is_banned = False self.banned_until = None self.save() def is_currently_banned(self): + """Check if user is still banned (auto-unban if expired).""" if self.is_banned and self.banned_until: - return timezone.now() < self.banned_until + if timezone.now() >= self.banned_until: + # Auto unban if ban expired + self.unban() + return False + return True return False - + class Department(models.Model): name = models.CharField(max_length=100, unique=True) description = models.TextField(blank=True, null=True) diff --git a/civicfix/core/views.py b/civicfix/core/views.py index eb10de2..224144c 100644 --- a/civicfix/core/views.py +++ b/civicfix/core/views.py @@ -6,6 +6,7 @@ from django.db import IntegrityError from django.db.models import Exists, OuterRef from django.http import JsonResponse from django.shortcuts import render, redirect, get_object_or_404 +from django.utils import timezone from django.views.decorators.http import require_POST from .models import Issue, User, Vote, Comment, Department from .forms import CitizenRegistrationForm, IssueForm, CommentForm @@ -117,7 +118,18 @@ def custom_login(request): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') user = authenticate(username=username, password=password) + if user is not None: + # 🔹 Auto unban check + if hasattr(user, "is_currently_banned") and user.is_currently_banned(): + days_left = (user.banned_until - timezone.now()).days + messages.error( + request, + f"🚫 Your account is banned for {days_left} more days for reporting a fake issue." + ) + return redirect('login') + + # Normal login login(request, user) messages.success(request, f'Welcome back, {username}!') return redirect('home') @@ -127,6 +139,7 @@ def custom_login(request): messages.error(request, 'Invalid username or password.') else: form = AuthenticationForm() + return render(request, 'core/login.html', {'form': form}) @login_required @@ -314,15 +327,15 @@ def unban_user(request, user_id): messages.success(request, f"{citizen.username} has been unbanned.") return redirect('manage_users') -# core/views.py @login_required @user_passes_test(superadmin_check) def delete_fake_issue(request, issue_id): issue = get_object_or_404(Issue, id=issue_id) - reporter = issue.reporter + reporter = issue.reporter + reporter.ban(7) issue.delete() - messages.error(request, f"Issue by {reporter.username} was reported fake and deleted.") - return redirect('manage_issues') + messages.success(request, f"✅ Issue deleted and user {reporter.username} has been banned for 7 days.") + return redirect("manage_issues") def resolver_check(user):