From 32b1ec4379c0f9ea6c2ff7693002c2d74b6c91a8 Mon Sep 17 00:00:00 2001 From: NikDizell Date: Wed, 12 Nov 2025 15:26:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B8=D0=B3=D0=BD=D0=BE=D1=80=20=D1=81=D1=82=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/views.cpython-310.pyc | Bin 3874 -> 5861 bytes OneCprogsite/programmer/views.py | 85 ++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/OneCprogsite/programmer/__pycache__/views.cpython-310.pyc b/OneCprogsite/programmer/__pycache__/views.cpython-310.pyc index 8ae32e43c46199bd7f9a0ec858984f505439d1a3..40fbb99228a94b58cc27d1baa8488c62bc96d345 100644 GIT binary patch delta 3144 zcmb7GQE(H-8NR(coldfBlg1`7HXy*ps1OMg8ba$babgjt9b_WAA!yR5iuP=uE$fuM z6E+%ALF@pXrp=`4TPF!H?E?>;VM1srV7D)QXkL1H>dZZ~Po3#oAIMYNne_WtKrrPY zwdel*_ut+B-~IRdztxp(e}AUS>FkUu`1@DZ^Bt?o3d;>Z-^rhn`c~+>_!Cm!27Qn}DfR8phj_2l<9s(ChL0V54^N=o z$-mC`qTR*!@n_Hu@+4289kP0@&DK!Q3gi3v2rWgh-Tc6ml6dy|G&&6pn|%qNdjO)Y z%qy1|XP4O-R%hagI=iHD^)lmHpK?a6t5f%9=$Ik<38VTf7WyCi>;CQ5O6!7u&A;K_ ziMP(8xdzjF{#xtD{_oEYM~xF9^AnlI_737S`KU%k^^I%lR2cEENQ| zIB9`uSFS2zu=z*rSfdkb^2L&EmA$-O>7&EOAY!V{x|puTzR;Q24MUOQ-v85~&`0@k ze*od(>?@QPWuE;=nN>Kuf*hb#(P|eJWJk+T*5H~yNx9;YP6{q@#6 zt#eRszp6>g*-eCMv5~_Ek|WPOpM36Ma^#`jH_(fY9KzV4 zFo_68pqI}XRE?5G{bK85`OFn30LC@pj@4|??8N$>IW@=_fPef;% zHJzDEXSym<%@Mt)K_nx~_B@m}G+l$UDW$g4WAo~~2AJwzh#(8ixD@6DPn9#SzpM69 z8Ivvau#Fo((V21rz@EZ2c;@LBnR13PrPk#|c(~4fp?s*WpnpO+sWdn$;fG)fKv!x@ zY)MI&)nnL={}F%*paPU@faUw~)+(^O=HF_a_iv*6ztF{?9JmKu|Bjpj5c{8Gf^MRT z{P(8P+5Fhc>CAMX*q^fovKNyB+4RwLHl0oAfmRizAZl0g1#3?a6Yhyznf z5J@i=t%_$mf+V}hbfI)W~U=%8U%C?ri11}QbCMZZ%4P30jdhj3n zPnR*k%(LnjVia>WR0k0eAy*PogPh|s)snJ^{4F6uf$xy#Q~%S9p2-!7ugJO!_S z_i6Y|3P))&wau)yqn&sf__C}w%+G*0BIMF@oRTZPO}o&<7#gVyB8>KRzCfBR+o&h{ zi7?1*4p!HMh^dB(*CZsyo1?}+^Ka^}-w=mj4~!YR1PqA@T2Eyw42Y}kGm4kV@LduT zE>g%KAuzYKJc|*x3!+QKA5#e_z=)Ux35>Ie<|#e?EkYBpC;gM_dpLZYS1~~T=%X#G zTC=6U`n5Dv(F=h+$?Z%u4~BM4NVlQDoN`K4Lb*JRpaTCgl*mwb?IO&*Z&mV!a{;x^yWW0e1j@N9BZz}CQiz{ zggl2APUp-e%US?aJA%L|JQ7tBOC(N_SSInfLg}VoHMZ;7MORkjADa2j$?!Q$&m@MM zH#+~^kd?8U)=Q2jW)z>% delta 1200 zcma)*%TE(g6o-4Kuc4HI@|05Ol=3QwEC3Vaksy!MM5{bB5ltp#?k$W=JN3>~(2WZ) zx-;Y&7cSj(X^1QT17m{gNnDz^C+=8y&VWX`qD{VY=iGD8@0>elevW?ZQLKiBh!1|R zd8_fE`A|uazQd8PTE~HJqmy>g7}z*X&=#;=w41hpP0${i1lvtjngZKHdubYMlJ?Pl zuqqv(gJ4svjkUAXKA}T2bKu)2`(&e+4zKw#BS&xGL41jPo^r$1<`bqnwi_xKro%W_ zp&E`g@erWucf*`LtuWi+Npz;s>Ejvk%YP>sG)k21b%4uO01A;LiAW?sLZ?cIkBD#e zi$oQ%s5;#X+ZpLBIp&4+5Ew5V&)~|#Fs>2+jJIWgBndOR(%g+3ZGfu(tPWKiN7Gp^ zZP1n1EVJSmR*Cmx+yFvFpcEfO)M&JW55-QR0ELJf4Sg@K!ZH)it#eNdyW*pO7x6N; zws^i+WPD7wie=`olFqJeJ4KV97Z6$a=f89bS0MKUii`nt;uAj_I$AH*(23ilLRJ#< z=R%=Xrsqxb(jsxlFz1N~raYd&J9oon%XTz_*4&9(XK!1(8g6DG%$5KO;p5`BvOVP; ztYdpRD|`2R@jBgTIlsknma}YCO7!;M(=y?cNADX;gj^TFSZ)TB@D#ue77S)mK8=o9 zL`}XXY;rTN?`Y@4cTc>HrO3Sa6dRnal3bOzvSDkslP?rt9jMqaxivX3AWw@%Ne6)w z>?TBb7BVEp`AyVZKrAAb5f_j1CGc&b{}y8DsL&iILDyg5rg+uzJ#;o`;!$h%p?5by z$D;Y?8}cq=J6e9r;wyM;6|si6k61@MK;UOoqv$q5JC0#HhHh)m47R%?PFwGWHHge* z(qgskSX1%T2m-$mjzi3Gj5xk#K8~0~%p>q6dR=f#@t>I2C=S0X&lD|MG1(k}CwoS` aYai&Wlj~(!j(Goo9FSY&fD{OkCh`a3%KQ%i diff --git a/OneCprogsite/programmer/views.py b/OneCprogsite/programmer/views.py index 45725c4..92ad499 100644 --- a/OneCprogsite/programmer/views.py +++ b/OneCprogsite/programmer/views.py @@ -20,6 +20,87 @@ menu = [ ] +# === ДОБАВЬТЕ ЭТИ ФУНКЦИИ ЗДЕСЬ === + +def get_client_ip(request): + """Получаем реальный IP клиента""" + x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') + if x_forwarded_for: + ip = x_forwarded_for.split(',')[0] + else: + ip = request.META.get('REMOTE_ADDR') + return ip + + +def should_track_request(request): + """Определяем, нужно ли отслеживать запрос""" + + client_ip = get_client_ip(request) + path = request.path + + # Игнорируемые пути (Nextcloud специфичные) + nextcloud_paths = [ + '/index.php', + '/status.php', + '/cron', + '/remote.php', + '/ocs', + '/apps/', + '/custom_apps/', + ] + + # Игнорируемые IP (Docker сети) + docker_ips = [ + '192.168.64.1', + '192.168.65.1', + '172.17.0.1', + '172.18.0.1', + '172.19.0.1', + ] + + # Игнорируем статические файлы и админку + if path.startswith('/static/') or path.startswith('/admin/'): + return False + + # Не отслеживаем Nextcloud и Docker запросы + if any(path.startswith(p) for p in nextcloud_paths): + return False + if client_ip in docker_ips: + return False + + return True + + +def track_page_view(request): + """Основная функция отслеживания просмотров""" + if not should_track_request(request): + return + + try: + PageView.objects.create( + url=request.path, + ip_address=get_client_ip(request), + user_agent=request.META.get('HTTP_USER_AGENT', '')[:500], + referer=request.META.get('HTTP_REFERER', '')[:500], + ) + except Exception as e: + print(f"Error tracking page: {e}") + + +def track_view(view_func): + """Декоратор для отслеживания просмотров страниц""" + from functools import wraps + + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + # Отслеживаем просмотр перед выполнением view + track_page_view(request) + return view_func(request, *args, **kwargs) + + return _wrapped_view + + +@track_view def index(request): posts = Home.objects.filter(is_published=True) context = { @@ -31,6 +112,7 @@ def index(request): return render(request, 'programmer/index.html', context=context) +@track_view def about(request): context = { 'menu': menu, @@ -39,6 +121,7 @@ def about(request): return render(request, 'programmer/about.html', context=context) +@track_view def solution(request): posts = Solution.objects.filter(is_published=True) context = { @@ -49,6 +132,7 @@ def solution(request): return render(request, 'programmer/solution.html', context=context) +@track_view def ability(request): posts = Competence.objects.filter(is_published=True) context = { @@ -59,6 +143,7 @@ def ability(request): return render(request, 'programmer/competence.html', context=context) +@track_view def recall(request): posts = Recall.objects.filter(is_published=True) context = {