From 99da3f2800aacef6f8a25a2f4727f21990f1f6f6 Mon Sep 17 00:00:00 2001 From: Rishit-Pandit Date: Thu, 19 Feb 2026 15:18:44 +0530 Subject: [PATCH 1/8] Some UI Changes --- BH/__pycache__/__init__.cpython-310.pyc | Bin 154 -> 162 bytes BH/__pycache__/settings.cpython-310.pyc | Bin 2504 -> 2512 bytes BH/__pycache__/urls.cpython-310.pyc | Bin 1192 -> 1200 bytes BH/__pycache__/wsgi.cpython-310.pyc | Bin 547 -> 555 bytes blog/__pycache__/__init__.cpython-310.pyc | Bin 150 -> 164 bytes blog/__pycache__/admin.cpython-310.pyc | Bin 479 -> 493 bytes blog/__pycache__/apps.cpython-310.pyc | Bin 368 -> 382 bytes blog/__pycache__/models.cpython-310.pyc | Bin 1044 -> 1058 bytes blog/__pycache__/urls.cpython-310.pyc | Bin 645 -> 659 bytes blog/__pycache__/views.cpython-310.pyc | Bin 2576 -> 2590 bytes .../__pycache__/0001_initial.cpython-310.pyc | Bin 1150 -> 1164 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 161 -> 175 bytes .../markdown_extras.cpython-310.pyc | Bin 512 -> 530 bytes db.sqlite3 | Bin 155648 -> 155648 bytes requirements.txt | 27 +- server.bat | 2 - templates/base.html | 639 +++++++++++++++--- templates/base2.html | 85 --- templates/bg.jpg | Bin 103613 -> 0 bytes templates/blog/blogList.html | 65 +- templates/blog/home.html | 2 + templates/index.html | 74 +- templates/logo.jpg | Bin 35551 -> 0 bytes templates/support.html | 65 +- templates/users/login.html | 2 + templates/users/logout.html | 3 + templates/users/register.html | 3 + users/__pycache__/__init__.cpython-310.pyc | Bin 151 -> 165 bytes users/__pycache__/admin.cpython-310.pyc | Bin 235 -> 249 bytes users/__pycache__/apps.cpython-310.pyc | Bin 518 -> 532 bytes users/__pycache__/forms.cpython-310.pyc | Bin 1031 -> 1045 bytes users/__pycache__/models.cpython-310.pyc | Bin 820 -> 834 bytes users/__pycache__/signals.cpython-310.pyc | Bin 311 -> 325 bytes users/__pycache__/urls.cpython-310.pyc | Bin 601 -> 615 bytes users/__pycache__/views.cpython-310.pyc | Bin 2581 -> 2595 bytes .../__pycache__/0001_initial.cpython-310.pyc | Bin 1040 -> 1054 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 162 -> 176 bytes 37 files changed, 716 insertions(+), 251 deletions(-) delete mode 100644 templates/base2.html delete mode 100644 templates/bg.jpg delete mode 100644 templates/logo.jpg diff --git a/BH/__pycache__/__init__.cpython-310.pyc b/BH/__pycache__/__init__.cpython-310.pyc index dda2563a64581fff67c7bed0ba03e5a1de084c77..f73aae29e33cf5533d58117acd079bd931a1ab3a 100644 GIT binary patch delta 46 zcmbQmxQLM_pO=@50SLMqrl(Ehv1W9g=%FDPACO;MQXCVWnpB)wk{aXWF|kq+031pU A&Hw-a delta 38 scmZ3)IE#@dpO=@50SInv*&a8M$C}Z0qK5`&Oh{^ShEq;{`ou;>0K>BjHUIzs diff --git a/BH/__pycache__/settings.cpython-310.pyc b/BH/__pycache__/settings.cpython-310.pyc index cd86255ab9edbb8d734021f020993687748df9a6..ada270c950dd8b9bb898e2a22021259682828bf3 100644 GIT binary patch delta 48 zcmX>hd_kBypO=@50SLMqrf=jH<79N5ti-7y7$1;dTv8kpo|;sgS&|y#pO=@50SLMqrl)P>F=t_Pob1A)As8Q!UtCfg6P}t>oLQ0@pO=@50SLMqrl(Ehv1W9i=%K+EACO;MQXCVWnpB)wk~*;b&xYnJmMo!51HpUtCfg6P}t>oLQ1O*@ba703iYm Ai~s-t delta 31 lcmaFMe4m*opO=@50SFX7Zjal@!_UZQHd%&IV{#DVYyg1w2lfB} diff --git a/blog/__pycache__/apps.cpython-310.pyc b/blog/__pycache__/apps.cpython-310.pyc index 07aa9d11eb644ab676cecaff9058f1fd78fdbe42..a281df039513acbdf84a8e9252d152f36e29e4cc 100644 GIT binary patch delta 44 ycmeys^pA-rpO=@50SLMqrl(Ehxy0x^@xBIMd_aD2NpVbgYEp4#N$O;F#!LV?GY*~r delta 29 jcmeyz^nr;dpO=@50SNA#+#WZP=Mtmo#QPePMHw>zi@^z- diff --git a/blog/__pycache__/models.cpython-310.pyc b/blog/__pycache__/models.cpython-310.pyc index 5a64af2f1763aacda9021df7c4627e68ffc7d6c6..3128fe414ca7ba928742773dc49d492eec034b74 100644 GIT binary patch delta 46 zcmbQjv512^pO=@50SLMqrf=lVU}SWiT*9cq7ax#cTv8kpo|;sgS(3VW4r2uq02r(d Ap#T5? delta 31 lcmZ3)F@=LWpO=@50SHbHQUGch_(R%g=Six0>zE-8))PfaS$EJ>a0&twJw^lc0? delta 30 kcmbQt+RDnE&&$ij00cLMCvD`GW@0p*tj?q{IhM%`0AKG0S^xk5 diff --git a/blog/__pycache__/views.cpython-310.pyc b/blog/__pycache__/views.cpython-310.pyc index c8b37f5bafac1baa696b141568fc9071d0ad8251..b347a7389637aab2284cc38a9f4569c82b506f98 100644 GIT binary patch delta 46 zcmbOrGEam%pO=@50SLMqrf=j{WM*`ktjnyy7ax#cTv8kpo|;sgS(3UrlzBHB01W&M AC;$Ke delta 31 lcmbOyGC_nppO=@50SJ5qCT-+aWM(v*tjnyiIhlDk8vtaC2EPCR diff --git a/blog/migrations/__pycache__/0001_initial.cpython-310.pyc b/blog/migrations/__pycache__/0001_initial.cpython-310.pyc index f07ee606a459666f1eb0f57e08c6ad2d3d5e6a17..bbd1106a782a2a3062007c00fa3400b7aa3d8940 100644 GIT binary patch delta 45 zcmeyz(Zk7|&&$ij00i9)(>HR5GBbuvPGr{Lix0>zE-8))PfaS$EJ>Z*$@~=n7(fm$ delta 30 kcmeC-{Kvta&&$ij00hhPJ2!HNGBbKiPGr`YJe~O~0Cj!{cK`qY diff --git a/blog/migrations/__pycache__/__init__.cpython-310.pyc b/blog/migrations/__pycache__/__init__.cpython-310.pyc index 967e6d66813601b6314e23bd05cd2288fc184a69..560125eada130da858785ffca7cd763fe1d32d4d 100644 GIT binary patch delta 42 wcmZ3;xSo+apO=@50SLMqrcdOyVGNq+p}`j)kY8L<921_JRGe9oI?oN;uxpY a%KW?(kJO_4)Z+Mn{9=d_klbVo#uEVY(;Lp2~SOONi73W#hE3k#W5kN P$r(;L`RS9r7*7BIPc{_j diff --git a/db.sqlite3 b/db.sqlite3 index abd0cd64db24d09bc98dd2ea2e5ca375229a8d41..306d3be008db700a33950c1c53c580a76d77d4a1 100644 GIT binary patch delta 745 zcmah_&1=(e7*5koT3Po~a0)tH)yfn}n_rVONkLuKHcgkc>&I4>qSQ1^?RT;^>DQ&3 z!_zKGZ^DLW8B8f`;AO+3XRrPNI|;i8UbI!1C-H^%h39>rhnMHsJh5+{*k9eS@ULeB zlRV;X?R?1Z&0TqeTmTIOoPsZ)0gk~Acn>AXn5}3MG)kwT{ewk)@-Vc5xQm@ zA;(4QoaKCr4v#${+=fo?BOo)qKfL99JKf)UfI5(^$DD1(F>kYT4n0@N7rfbKQT9?k z7sP*;Yi&u1=t8)jUrYo9uGP(T3NY4lCB#a(#pse4ggmE`qEresDrU1?)zgCL2~euc zo03F_^fLL-i+g<-?!_SM#92SV_zCF72@g#&q@gyAaW9OAThVIgT-phtpP>8%>1H9M z8G4Y>-q}!aihwh4IR(T<&fdc>~{| zDlJx_sv7Af+q6PfXt~?=R!eSmsgo{8n=9=Smq->c-bjTRDc$w4oo1vB1A4ep6wTf; zX7+M=qER5~LaeYXW{k#qD3_5cz2<6cm5!%qN!f_w^$f?dNwco@3o5Lo!>v+_(ITPFY^%|*W^%ABqCk2 z!>2VL8)pbP)?xgxW#DT`KNTzqLOdu3B@&B9eOOn?l(=5LmNn~XQJv2fV|p(kv=gan zZ|zT@1cp<8!-o(uK79CXcMe6t(J0HO;J(Wmwfrxzi7{#Leb>2tcyM%hU|C;4!OM}{ a1b1#)Im^FaO^nZjAA8r2KK-;jdiD#YJmi}I delta 184 zcmZoTz}awsbAmLZ?nD`9R$T_YaIcLi^W;TVFtG6#G4Q|SzrtU{zn{OGe-?kmX2F6O z{>er98mc^8%<`Oxr6n2hrNya53=9n79AI8SYEf=xadBpT9#CxaetlO1Hb(v^2L7nc ziV6YzlcVxiaWL|KVgMrc&4LZj_&0y5mk|KUJ>=c|ey%(d(1I3z78Pb+#>wC3Dl~6f fzkS - Beyond Heroes - - - + } + + a:hover { + text-decoration: underline; + } + + section { + padding: 60px 20px; + } + + hr { + border: 0; + border-top: 1px solid #444; + margin: 15px 0; + } + + /* Hero-Bereich (Hero Section) */ + .hero-section { + position: relative; + height: 100vh; /* Volle Bildschirmhöhe (Full viewport height) */ + background-size: cover; + background-position: center; + display: flex; + justify-content: center; + align-items: center; + text-align: center; + color: white; + } + + .hero-content { + background-color: rgba(0, 0, 0, 0.8); + padding: 40px; + margin: 0px 20%; + border-radius: 10px; + } + + .hero-section h1 { + font-size: 4.7em; + font-weight: bold; + margin-block-start: 0; + margin-block-end: 0; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7); + } + + .hero-section p { + margin-block-start: 0; + font-size: 1.2em; + font-weight: lighter; + margin-bottom: 30px; + } + + .discord-button { + background-color: var(--primary-color); + color: var(--background-color); + padding: 15px 30px; + letter-spacing: +0.8px; + border-radius: 50px; + font-weight: bold; + transition: background-color 0.3s ease; + } + + .discord-button:hover { + background-color: var(--primary-dark-color); + text-decoration: none; + } + + /* Team-Bereich (Team Section) */ + .team-container { + display: flex; + gap: 40px; + max-width: 1200px; + margin: auto; + align-items: flex-start; + } + + .dev-cards-column { + flex: 6; + display: flex; + flex-direction: column; + gap: 15px; + } + + .dev-card { + display: flex; + align-items: center; + gap: 20px; + background-color: var(--card-bg-color); + padding: 15px; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease; + } + + .dev-card:hover, .dev-card.active { + background-color: var(--primary-color); + color: var(--background-color); + } + + .dev-card:hover .dev-info p, .dev-card.active .dev-info p { + color: var(--background-color); + } + + .dev-card img { + border-radius: 50%; + width: 60px; + height: 60px; + object-fit: cover; + } + + .dev-info h3 { + margin-block-end: 0; + } + + .dev-info p { + margin-block-start: 0; + margin-block-end: 0; + font-style: italic; + color: #bbb; + } + + .dev-bio-column { + flex: 10; + } + + #dev-bio-box { + background-color: var(--card-bg-color); + padding: 30px; + border-radius: 8px; + min-height: 975px; /* Stellt sicher, dass die Box groß genug ist (Ensures the box is large enough) */ + } + + #dev-bio-box p { + margin-block-start: 5px; + margin-block-end: 0; + font-size: 1.2em; + } + + #dev-bio-box h3 { + color: var(--primary-color); + margin-block-end: 0; + font-size: 1.5em; + } + + /* NEUE NAV-BAR (NEW NAV BAR) */ + #navbar { + position: absolute; + top: 0; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 00px; + z-index: 1000; + transition: background-color 0.3s ease, padding 0.3s ease; + } + + #navbar .nav-brand{ + margin-left: 40px; + } + + #navbar .nav-links-div{ + margin-right: 40px; + } + + #navbar.scrolled { + position: fixed; + padding: 20px 40px; + top: 0; + background-color: var(--background-color); /* Feste Hintergrundfarbe (Solid background color) */ + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); + padding: 10px 40px; + } + + #navbar.scrolled .nav-brand{ + margin-left: 0px; + } + + #navbar.scrolled .nav-links-div{ + margin-right: 80px; + } + + .nav-brand { + font-weight: bold; + font-size: 1.5em; + color: white; + } + + .nav-links { + list-style: none; + letter-spacing: +0.6px; + display: flex; + gap: 30px; + margin: 0; + padding: 0; + } + + .nav-links a { + color: white; + font-weight: bold; + transition: color 0.3s ease; + } + + .nav-links button { + color: white; + font-weight: bold; + transition: color 0.3s ease; + background: transparent; + box-shadow: 0 0 0 #000; + border-width: 0; + font-size: 1em; + padding: 0px; + } + + .nav-links a:hover, button:hover{ + color: var(--primary-color); + text-decoration: none; + } + + /* Responsive Design (Für kleinere Bildschirme) (For smaller screens) */ + @media (max-width: 768px) { + .hero-section h1 { + font-size: 2.5em; + } + .hero-content p { + font-size: 1em; + } + .news-container, .team-container { + grid-template-columns: 1fr; + flex-direction: column; + } + .dev-bio-column { + min-height: auto; + } + } + + /* NEUE ALLGEMEINE HILFSKLASSE (NEW GENERAL HELPER CLASS) */ + .text-center { + text-align: center; + } + + /* NEUER SUPPORT-BEREICH (NEW SUPPORT SECTION) */ + #support-section { +/* margin-top: 90px;*/ + padding: 80px 20px; +/* background-color: var(--card-bg-color);*/ + } + + #support-section h2 { + color: var(--primary-color); + font-size: 2.5em; + margin-bottom: 40px; + color: #eee; + } + + #support-section h3 { + margin: 20px; + color: #ddd; + } + + #support-section p { + max-width: 800px; + margin: auto; + font-size: 1.1em; + color: #bbb; + } + + /* NEUER SUPPORT-BEREICH (NEW SUPPORT SECTION) */ + #about-section { + padding: 80px 20px; + background-color: var(--card-bg-color); + } + + #about-section h2 { + color: var(--primary-color); + font-size: 2.5em; + margin-bottom: 40px; + } + + #about-section h3 { + margin: 20px; + } + + #about-section p { + max-width: 800px; + margin: auto; + font-size: 1.1em; + color: #ccc; + } + + /* Fußzeile (Footer) */ + footer { + background-color: #111; + text-align: center; + padding: 30px; + margin-top: 50px; + font-size: 0.9em; + color: #bbb; + } + footer p { + margin: 0; + } + .footer-socials { + margin-bottom: 5px; + } + + .footer-socials a { + color: #fff; + font-size: 2em; /* Größe der Icons (Size of the icons) */ + margin: 0 50px; + transition: color 0.3s ease; + } + .footer-socials a:hover { + color: var(--primary-color); + } + + /* Neuigkeiten-Bereich (News Section) */ + #news-section h2, #team-section h2 { + text-align: center; + margin-bottom: 40px; + font-size: 2.5em; + color: var(--primary-color); + } + + /* NEUE STILE FÜR DEN NEUIGKEITEN-BEREICH (NEW STYLES FOR NEWS SECTION) */ + .news-container { + display: flex; + justify-content: center; + gap: 30px; + max-width: 1200px; + margin: auto; + flex-wrap: wrap; /* Erlaubt das Umbrechen auf kleineren Bildschirmen (Allows wrapping on smaller screens) */ + } + + .news-post { + background-color: var(--card-bg-color); + border-radius: 8px; + overflow: hidden; /* Stellt sicher, dass das Bild innerhalb der Form bleibt (Ensures the image stays within the shape) */ + width: 350px; /* Feste Breite für jede Karte (Fixed width for each card) */ + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); + transition: transform 0.3s ease; + } + + .news-post:hover { + transform: translateY(-5px); + } + + .news-post img { + width: 100%; + height: 200px; + object-fit: cover; + display: block; + } + + .post-content { + padding: 20px; + } + + .news-post h3 { + color: var(--primary-color); + margin-block-end: 0; + font-size: 1.5em; + } + + .news-post p { + font-size: 1.1em; + } + + .news-post p.news-date { + margin-block-start: 0; + margin-block-end: 0; + font-style: italic; + font-size: 0.9em; + color: #bbb; + margin-bottom: 15px; + } + + .news-post .read-more { + display: inline-block; + color: var(--primary-color); + font-weight: bold; + margin-top: 10px; + } + .news-post .read-more:hover { + text-decoration: underline; + } + + /* ... Der Rest des CSS-Codes bleibt gleich ... */ + + /* Responsive Design (Für kleinere Bildschirme) */ + @media (max-width: 768px) { + /* ... Die bereits existierenden Media-Query-Styles bleiben bestehen ... */ + .news-container { + flex-direction: column; + align-items: center; + } + .news-post { + width: 90%; /* Nimmt fast die ganze Breite ein (Takes up almost the full width) */ + max-width: 400px; + } + } + + /*********************************************************************************************/ + + /* NEUER SUPPORT-BEREICH (NEW SUPPORT SECTION) */ + #supporters-carousel { + padding-top: 50px; + text-align: center; +/* background-color: var(--card-bg-color);*/ + } + #supporters-carousel h3 { + color: white; + font-size: 2em; + margin-bottom: 30px; + } + .carousel-container { + overflow: hidden; + white-space: nowrap; + position: relative; + max-width: 100%; + } + .carousel-content { + display: inline-block; + animation: scroll-left 20s linear infinite; /* Animation für das Karussell (Animation for the carousel) */ + } + .supporter-item { + display: inline-block; + background-color: var(--card-bg-color); + border: 1px solid var(--primary-color); + color: white; + padding: 15px 25px; + border-radius: 8px; + margin: 0 10px; + text-align: center; + min-width: 150px; + } + .supporter-item h4 { + margin: 0; + font-size: 1.2em; + } + .supporter-item p { + margin: 5px 0 0; + font-size: 1.1em; + font-weight: bold; + color: var(--primary-color); + } + /* Animation Keyframes für das Scrollen (Animation keyframes for scrolling) */ + @keyframes scroll-left { + 0% { transform: translateX(0); } + 100% { transform: translateX(-50%); } + } + + - - {% block content %} - - {% endblock %} + {% block content %} + + {% endblock %} + +
+ +
+ + -
-
-
- -
-
- - - - + \ No newline at end of file diff --git a/templates/base2.html b/templates/base2.html deleted file mode 100644 index 143ca67..0000000 --- a/templates/base2.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - {% if title %} - WeBlog - {{ title }} - {% else %} - WeBlog - We connect your brains! - {% endif %} - - - - - - -
- {% if messages %} - {% for message in messages %} -
- {{ message }} -
- {% endfor %} - {% endif %} - {% block content %} - {% endblock %} -
- - - - - - diff --git a/templates/bg.jpg b/templates/bg.jpg deleted file mode 100644 index 578b17ef7cbe203cb29c57343341064f9897bed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103613 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

nfRj|1B=q@<5`d&#sx?@RrB< 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�Kdq#b21ZLl=qC|F(9A;EjK1TfOlvoc0 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 +

+ - {% endfor %} - +
+ + +
+
+
+ Updates +
+
+
    + {% for topic in topics %} +
  • {{ topic }}
  • + {% endfor %} +
+
+
+
+ + + {% endblock %} diff --git a/templates/blog/home.html b/templates/blog/home.html index f9051f3..25c5231 100644 --- a/templates/blog/home.html +++ b/templates/blog/home.html @@ -2,6 +2,8 @@ {% block content %} {% load markdown_extras %} + +

diff --git a/templates/index.html b/templates/index.html index 1258d2a..588a6e8 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,24 +1,62 @@ {% extends 'base.html' %} {% block content %} - -
-
-

Beyond Heroes

-

- The project that rose from the ashes of a game that was once. We aim to recreate the experience that we enjoyed throughout the years, while also adding new features that make it truly Beyond Heroes and Generals.
- Join Us on this journey to relive the old days and experience something new by clicking on the button below! -

+ + {% if not user.is_authenticated %} +
+
+

BEYOND HEROES

+

The project that rose from the ashes of a game that brought us all together. We aim to recreate the experience that we enjoyed throughout the years, while also adding new features that make this game truly Beyond Heroes and Generals.

+
+ Join The Community +

already a part? Login

-
-
- -
+ +
+ + {% else %} +
+

DEVELOPMENT NEWS

+
+
+ Gameplay Video +
+

New 3D Models!

+

20 April 2025

+

Look at the great looking 3D Models made by our skilled modellers... Read More

+
+
+
+ Alpha-Test +
+

Happy New Year!

+

01 January 2025

+

This was a great year and we have made good progress... Read More

+
+
+
+ Community Umfrage +
+

New 3D Models!

+

26 November 2024

+

Look at the great looking 3D Models made by our skilled modellers... Read More

+
+
+
+
+ {% endif %} + +
+
+

ABOUT US

+

Our Developers

+

+ Made up of enthusiastic helpers from all over the globe, with a strong core in Germany, Poland, France, India, Argentina, Checkia, Slovakia, Canada, and more. Sharing ideas across so many cultures gives us fresh perspectives and helps us keep eyes on different parts that might be more relevant locally and their experience with other mmos. That way, we can reach farther and keep a foot in major countries around the globe. If you'd like to join, just fill out the form and don't be scared to hit us up on Discord! Our work environment is super hostile and we do require you to have a sense of humor and the latest version of sarcasm which you can get here Sarcasm-StopMakingNewBranches-win-x64.7z +

+

Our Vision

+

+ Beyond Heroes, aims to create an exciting World War gaming experience inspired by 'Heroes & Generals' but without the issues it had. Our goal is to provide the same immersive and challenging game while renewing some changes and upgrading the technical systems that preceded. Through strategic gameplay that made HnG so interesting, War, and balanced mechanics, our game aims to deliver a fun and rewarding experience that appeals to old and new players. We value our community and strive to provide a respectful and enjoyable environment that fosters teamwork, camaraderie, and sportsmanship. Also this text sounds corporate af, and thus this anti-climatic sentence is here to break with the same old corporate speech that makes us pay 5$ to open the game. The team is mostly comprised of people who share the same core values those being: Being against the new trend of p2w mechanics, combating microtransaction fatigue, being in favour of stop killing games, being in favour of clippy and against anti-consumer practices (1) (2), being absolutely against enshittification, and in favor of remakes. +

+
{% endblock %} \ No newline at end of file diff --git a/templates/logo.jpg b/templates/logo.jpg deleted file mode 100644 index 9e7e52d761b2ef66d3dde79897b08fbd1262e0de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35551 zcmeFa2Ut^C*EW1Yi=YrtKt&-cDhL8f5k(*9=pjWGf2*R`^9vU9Yuv)>{kxd+&P_~>yKmQSDl za=zo2bM9urJ0CE>3ziXY_DAEC!(NOMfM*rUewO{rkZk}H4}_Tq!YBve;JaBNzigjg z0bVmPv#_#3SFv-f1|P`g2ACks%uFoItgI_P1Mvhu2UvJm*KXZ=h;5yoIdq!?uk?+3 zF{^|RXO!~kH;}f=oWFXLor8bv8lPGmC*K~y_eY6KQK5nJTgk2o|&DSU!W{fSLy`;m_Jnu{QpzU zzN;4xST80P7G@UcO1&UV*HuMkgwYPHVTORh#LNRA z0Me*vtT)Gh_pfb$VATJ&O}>){1f$`q~*VD z^1C)^{coH6u1yI4ZIj=%$$#<5_jvVx7oPx8;g`h4--K-S)u>xI83Ewb>`Hre)*8=n z-WnRcg;r<^>Rkv*U;qzynk@uk##A=j@(nxCq{tS_!*M#Pn32=#dvyXg%=BX@a0X!L zt=Jei$4b#AsHVK@Gt-lV1`4yF|rpK2r1#lQUp)k@5KaJj4&Y@ zDgf7IK0{N^Lc!3y@iJs7o6ObU?DLqIe( z@PBP*{11XBv92hrXR_wD7q4ePTn5% zy6A3`7q1onGl9kaJg>!r$Z2?=Nrj)^tjTWJ^Y*HZg0Jt;J*}7rQl(b8+}DNR(h}O; z_%~^c1&*b8t#i5A$2P5rt7^`m`B4asyt>f4XK7m+V3C|W$Cg=*|Ef}RmaT% zt;Y$zS*z>S-i1j-Edhu}xEfLBy7ZzA6#bzcTV0OQ`>_3v#_y&|$M&(bnJNgqR$GJE z8#wPK$~=ggx*fGM`%Ml{r_>Us&!RxTU4eZ1NObnZlZ<4#L_Fp#vTgPj+Xmq+_0Y0r zWSfBBEt*nFf7ge~GYnvDaMBE4=_q#9Y)W%c_`#CpaJn`~eS)e?urU=LJvCn7e`tp={%stJ<2YJ`Sy^`G3c_)K* z9Pn6-^N=I+r}#Z(O|zsVj8Q}f3z6y+lW1#7=z?>n&r+vUzj%{qG)HUewU-Y5xNVwY z*L0!Nsj_-1th_(5TbfxbTuJmjND+Pnp8|A-3}tnp_r~DtS+CM+<7-;qqi+{oU;sR( z$TSyNx!Yce?QB+66<(_6gt!Na&w!?(na6SosAhWEn_>XE4~cD=_kS@X%vi|1zgV}{5| z#T@g6h-1$iaTPDI9OXeDG-i~BnX9v4w;B>Vg1tss&LtE!O;7lnD`S+xh}SNBm9KTtlPU=*s7dSQRdTuIKi&0;;U+i z;4>^jVL;aRiVnO!KT3x;%2gNOv{>&q1Ns%9#B zD)6;kh9+l^*-rLZJ#`T)V@oBpwG;fDg58+8;y5zK`+VW5rt671z5-E?BcE=MOxDnPTi3ATl;hdYg(*;{xSfPspTc`wF~`m*RW@tiGA=V04ajiqfxKJ^}Z<6W-7#C80k z2sibCNOHQjs4ky6Fw83Pd%JV$z!c8bZ_3!R{wfMvNS4)2xzHYn2zW2boI28)@-F#o z2LniRz#e+%GM_@`sFBt^)|3a<5h1S;g@xT(%3;dW zW&nbQ9icBeEBzW=5eXiP&Z#y?KY5u~LoZ!usmk6;zDq=jn7XhXkCvXs=A~lbHe6_j zwObb6$dxvz2yUlK5G?!Z+7KUr(~9}Qv>_QCVb3!y3Zf8gnXBayTB6ZRf#2*;UMNhb zY1B7aMXx5=pWrni0o}gkXz_=!-b!pAiLC8B^N;unoA07hGAKb8 zODrF(o2p(Guds@SB{?wwfl}uiYsj?|PXtC{2ou;TR?Or3?Ie;Iz{#GaQxS_dtEv|E_L!D$T8`h32*2L0gGozYr8&7zeql%7+z7QE z`n57KPv0?F#5)(byw{0ixY6z?mOD83tR}<6S-6ejzwZPWaCc*NF$P#<40NGQgB0oJ^E6$Y%+k2uoAl*2$YWLOS zfE!y(U&ouHMytv#mg;KJw;hnkg`D@Mlc(=u4XOrCeIu;j_4#iE`Mb|J4+>fuG(D0_ zdmFbDKY$iCdH%g6A93=2n&8%fahS!fY1HD(H|R(u`bJ`lU<}UqR&Z6j%VI*g#R> zAKaN4{}hvudipfdFu3OIhnUc_TzqPP>Kf@zt>+~PT_H@#Z*~^lBLmKcLH;HK8zb>Xr5;UTMuC05<5EI>G>;lznw&`(oPIB|AN)-P~a|W>6PpLfO7^ z&tcA6miw{w?nu-(&Vj+%@I#mOGZz91FQn$IY#~P$KQ=w5wkl^5MQwYph6o3H&H7Q1 zHz+=p>(`IB&a+g(uF-cg0EmhpHo(JSGgrgm*RE8Dh0_H$=jl_rkLs>(y{23Utv_|x z@y)*zHI&OLv|#|6VM>{_ya8C3+=Q0^`N{f6XN)djE7l1WYb{crZpN$&5Z-a->Z&mn zxYdVIZc}`fDT(FYWU1h;7Qt*3G+%X-Eno-#VfhDVDMq;@|71sv^kB8}=3D zK?Z~rNGxtI_NBy&YR7~QD;#A21pL#1K+OwQ3HoVCEJCZ~=9gV{Fa@jf3v5%ZwfINa zOrW$ZX3$>0cQSY?ATQdJx~mkLEZhE%kSPCgge~Ee<+*3lIv_<9(cbP}dn@~;{eWcP=LM z80Qq@O_4dftCFIHZhA|ODa=h~N{+m5D_yh@gi<0Z{soNjEsZ6fTCZr}9RH$p--VpI zEpui`6yz>7z!Mow30?h&Cui}Vy!xb4@U>?(qZ>~g!iUJ(UY%0MdWbk(pjErU>4okL zz}MpxYbTSYk(1{}*eO}a$jOrq)uGX$GIwpXzV5P-;!@@AlK=UcRT z&H8eISoe}U2y)-D_&pNr7Q7t!(I$UGmiIt$2ciq!S`>9evtDBZ8wcR|)dZYE zr6%LHNmqOMG}kjZIVp8s(GYam`JN=ESKN7rA}&%%|}e zgc1u5TPNg(Cq52(wK>#vr?;S^qg>}Z2m6Yy_ebS8|6M}hD^4*KxRm6aU>p>Ax>Qi( zyb`Bng9=>J#i+u*`|$Q#V2?@&E1e`HmdQF+ZujpOpcLygOFDIg=V#ldDNuQaQNvOk zE{U6}k7QsEZTD=hho&^>Rct$UQ}g|y5&ci&=9tq_?y4@-m;VpW~SE(o}d~j|)F)pdY=7IhhQ_0~0V;-}el(@1S!hp5aI~n2720Yd>xAmD#p$M{xaL-DkcS@M6V8KCPmW-_m9uABCi)i^q@1sIJbkZ2;Q#`OuIY)^ zL+9TQZI1~2XQAO=!b}{ejDB8Y`h(H7o{+cYj5XjnplIML-w&)GPHu>DBaaX0-J z`Mw5s-2^Bf)mkNGQ5lNHF};LlWTWyXLQmce4&~tsOG!&f_4QCkH4#&_PhK`(4dqpt zuFFF$)M?-tR#s=Y8>?z^iWfrO(UR4A9frD^ust~NxsrdfcsE_tR{oCi`2HEhPjh8BlXXXPTj%yWjh)lh?8F}Gr1L_Ci&xVmmSbF; zYb)OF8{+Yy>5Ng34Sd*yk(cdiw+uaFCqi}r?os_q5%s@%=ec(4P|poZ#wYw^2QUkm zXdDiu&)={??|Jz}Of)`1@f4A*CEddxMpe|n%wuqX#h3uD67NDVh*H=#uQzhm=^Om~ zRZ0C1+;bM%K=`PcKRswM?+SaX1jAjO)rAtMLdg&J?%rKO4ztrU5%hT1gI}vCE&1?j z+t9)>ceoA-A1m9@Qt0EbG*-p|G<*iOkkD;f!JECMpO->&<))KDJfyofw{F}9A8r~T zD*NQq`R1Ijc1w}QO@$l!v$nX_&XjlGK~yCG9>Hoy6{S0lkxnF-u%Cuz@Cp7joJIdE zLq(P8z3$5ZGP9b}jMI1K!*{yf0trDvh|570H20W;A-6~T!2!g0$VZG8wS9l1Xsc*t zi!Q+YoEM;eF@`CwP7m&GG{T#Y+B9rg6EQutffBqM*WGuZW4gQu2L{XJLkf<3-1l_# zrK1PJLdu%Rc+nKgD5J*_u91#;Z$w&SL17X%&}^7;PQ|`BlRi}Gpt8{ki3USu1dvyq zDfc>$p`0!fVE|FWGrW)zJrf2%6E|DO0P1)a0};K36fE5Z^HvuMQM=9nNH`B22B4@h zC<+pUC?a~1h}f&LnU(J&=uKyn5i~OVQ5>BQ4{GTle_91#&-*X_P&|UO;B#S^Z^XWO zK)Fu5I0hRPyVK1|UsqB!eW3BykMboU_;w97?q*DrV27Op%C5&VY-14mkQ zDd;oZMRj}d5iPEByuyA|yM5171Lq=PHKGvKernX@wHy4ATL{rx`CZ`2h`qZlxB99b zHAec%`KQO|NM!PsU4^TTnBcz3s0*~hj57!oPMAQl@9hv3jLe{+s>CNajgIBC%8q1> z#e{`xQiZBWa^%URq`Cx~b=C{au+@Bsdb%t`{W~6n>2F@ceu|Dt$CtYC5axz$&s^HB ze4%&}Lmp8P8X|QZ5>UUDqn|GFYOyUU27L={IICroyuzaPa5#UirrvR}vQ1jcyqCQ9 zX4m%GK|_<)lx?SSEc#Rk)Y?#Qw4oi>*Z2^c>2kxS%7p$vX1jIgjY4uqLFvRd7M%a2 z+-LE(KThw#E{MNFH5RQ$SHDJgM#B=n1-*ZCevISrGq)QjV!gM7wzI2$;O3c4Llv(c zei(S<<;eX`j$zP$7Hv`H8+j;ZSn>9XryDYSOqr>5HuQ|h6CcWhqSV9};=$<JVW})`sPm$gUj5Ep_VI}>4vpRi0>6yvFUOAh zEON4mbZ$+o47}v@4mZpVC)$WYNNic`Wj1fc8eRU=di4S!3D{-F<>PAK_^rQH;Q|WB z_SPkr@y3b0h49UeD?>?5hws=v+@a=C7sCLmPs0`}JcI4%F^Dc+NGR#;Pydk2O zl~hMtl5hq!^Hv71O3D{K^udY&+*)6Tm>JI|G^lL$qireL$N;bxS9AF6zp@@wifh11cN>KdWyMM z*IG@UnOWE&M9+eZHtRFryQlrBC0rg>;Fz5pQ1fFo^vTO^Xm&(R;mhRF)7&=K)}1k4 z6JLE291CO*co`33h{(R_=rG$)WVp zrkOEQXzzsBanzZdrnrqWo3G64y+MR~2CUiJ@%rwOJ^nE#-5@2=>|YSB_2dl^=a!kN(avZCT@ZR*OV?`vh~!hQTawh&)uZ==m_a z$wwB*TH~S|UV?0Q3&Gl@7#8AQgFMt=(J3<0&yqxsB|TR@dq8zUWpnnode?JZ@5I4z zA>e!&r}TP6um=OUc!hA?!AR=t2B|^R80YCOTaP`hqkGow_6mbc8-tb;J8C2L06kYX zC&%|yQGU-qp{&r;d_K!$GYcaIkgT(y=Hd9eK_K^SF;>n!2xJ4gI*bC~6T}CL1F_S4 z&?T&ZYw*fv&R#sNh)g*i-X!k2>70ylR9N&{F3@SdA7|BVDJEK!*! zHn-f2eutUG+owr!T3e{sPh`=|@3BoSU_|C{UpSpdlRT?)RAf{(R|QBlcCWo-pDbV8 zYqr~lFl}>vy89?i}=4B#FJitliCz?Q6B1=69AxB7T9i7hUDhRB6k z4##C~d9D3`uk5VeMde26 zI~c%SxvC{lwDFXobW)r>&Wi)K>=Leaek$j&yP3T!TE~U`bsq=DkT)~b* z?TeSatSGdD$jWCGXQW9Q+luazPGry5o{==3E~~x2+}rJ~^c52nU7}!PpURspT}Jt* zSCZ+JrLsi<>ZO7);+0TmDK4dQ)ME*qM~E)ERHL`@`R@z(H?Em~l&YIl7P7WDNmkrc zsSo=oPlG0n87p~0NI^%rtqB4JK7&sSvKWA~8~p-33^IQ5Gri0QhK?5Zb)VTUMHm*p zQczq;Ey>D`vUfc--L%|S0k~Wbm=jL1Y21(4Zh77lN+Bp6+8(N7@N3Et--y}j;(l|) zBr<~Vs}!ohkNsf^&RL{eYovupxU+Pen?Ne)XDa(K0ED>8rrFbLDfiW`@b`*!8oqpb zpxkjQsD-rxgD(ct`- zu9z+OQ389!-i0@PFsX2ccL)1;orKI^yj|69tAB!0N)3Ev{Lt4<-=(rCJX{s${E3e~ zDf9Xvcfr~FcA=u?4;=zN5 zr4v=&&6?^=COy5xJr-M2G`!m(;0I;ZtsNRS&Oht?NF3IApd9 zMJTpwNy>$a8Lgh(%mGw?JNmw{;{~mS;=R{tcSM$J0P6WaP)D#xWsx`A#vYv(4xG_Z zu$zLvFBB$XXnqKe83iCrXV37^ObY+}1egA4c<||1Zv|~Q|JVaAfsJi9+Gb4gy~Tk% z#tI!awa=rNF=M9epzX`CbKq<~?6N^RXG>sI(RGR|aRev%P`kjRoF?fmK;6u(A{-OV z`fYK+bEc;>Q|Bic48ThpBIWPI%^U!Z$N ztZVTypy;yQ{tQWkT*)%p0)D<1o~$WMWrsG!EOUC4n%Ru*3-UBqikyA0PvC6uw6<$@0MD&OcYfXQ=)rznrjdk<9 zE04#-k`Ttf21u&T`Jb8J7!8vrSH{evv>zWDSZ76zSd7EVjbVA5ndhCdp^u;BQDF?g z#Pzqd%#WyL$c#<}e38qGZ_s%J%Zu(mKtVqKYSvj^PG_y#o@{^8$LySoqppdz#?1lO zMJ8N&MRH!d6d+rvjp?oc4>q4)gdze@$O#v^$sNk56_8@7w-FTd3@_j z(|y}8)w-;srDQ4EjdVn(T;Unz{}X6ph1q3#_hbTfov(&uVgK<$`}1oq))khZnvVrRbKOp+w>R!(-@V|lHG&d zaGAs8!>HDNXREfQ5RDmGNZ-nc{*fL1L&R(9zCCj9#`ld%U%00WOJVX>&L!dQHqj1V zv|-~Yk6$*rPaBI#Cf-q7TVBWuAUHxl(FSoTM+eSocE`b=nx+Z59e=*vD@g>*!HT3^ zcN{_~YbqY`_7aI8j%lCGlaIhvR9(84F$-nNwE7Jh{zED_!V4tLsvSvq8T>Iy9B5VR zzyy@9{50fEg{L-&$d*GY7b|0VfOw3L$V%PlylEJBe&g=fMP*GA{FSdaUEI*-4NpH1 zy?XY$7QHZ*>4`m>8=2TFGK&vM$G*)C)tTBWH#=2sqIt%}vsvikL4?BM<>_C_&-{YK z=Qr;cU|WCZncxr!pE~whncI3PF~9kdXXiEsAY)2aVf{a>U;*Sa+JRTEjg2fPrE}@0 z22QoP2#k$WM=N#K35)bKqs0JfzWiGC^n>0uT6Im^XLjF>io?`oeRBHo@|1*2k{)}S zEFNt~(iGrBruU48f^f>~Yq4=7yT~JS z53~KUO1f5|eD4t<%Ye7VGw=BkQLKQc_!pgSY#BJ|@n}1GacG^~HRk~{ZpmYYwtZA@ zAMzGm==;mp_gZughJF|E`B}ldMDgogHqdKT9McR+R|uS802Ea)O=)q#1{kzTPw?1; z&(Y*G_32&kAF@s52E%YfF_gRYWIT^b!XpxZH*Qj1*R9zzD!pj29EECe(t!?Bx3H}$ zJG$JbviYI62jB7|AN^u@k@;&XGEE53O+_O6s8?#^TvDO_upOEN5Z{_lO>>fq0VC?%G z6oyn-6&19F0X(>udg&F%FR^^F195B1$@1#@us(e-lX%@nqe!C~W!_l4K*-H_eSgC2AWiGx-VTw}OkL>xhTkML@&Z3XLNJ{Z z%CZ##XPPjbbJM$_{YPd^*VtGUwOZ#O>#2=kGNywAU)FKiw|plr+&7bPnW_j*?~ZhL zT=IVpEjrkm6HL3-{@50wv)_L+zu;JnC}f4I7SA9F`gPDWn0W5`IncyI@KzMHq^aDz z<}>!uTM+NPmHOAL(Qo*ppZ@E6e@k9gWX4mb=jhuA&&YMHg2fNvjfFc4uJ^u;9yuK! zrTT)NSQz+q;3}V?+=t#H*7|&SoiiwY3$IJb=C50;A+pe8Rv$4<{hAZ9QnSC>ehh4wD32k?!rfUZCAcxYq0zP zf%Al4ugJnqMl529yBI(~{OXbQbFz@3tnbIx4>1Ja3DswV0ePA-x;n94u6CDgTr@tC zcD7GR=WIBxaySM$NhLJZ3245$0AN(lJd6@(u)DFYq=33c7g`k-K5Lpv%GA!)Z+CZ< zn0n{B-d}OkGb^ChUWQw7Pc+vrTuxCO#Wu;)uT1aY8rgBs+mRYElRjHQkk>Q9?`Q-0 z)A2&-50_^t5@F}IL8!W{UjvF?LJxoUxQGWQG~9ucAZA+MxIe&*z;`cDD(lViS=x2g zYoZh$iybo^FhkH}4`e<*IwFm2ETlPobqAS;rta*uZ5|(>&mKbvn<|-hknea+mn

z@oWE-Ok?_jI=?x>euU?wy7$@(zut4d`zT^oY|*zUhH|ciqTI<<2dccPV8D&@v;W0s zhwf|DSwIb%`TNmDc+iBcw0E8|o(w=J6#dFfnx?v;)dDeFjRrYSzRzFzN-MY_Ur#M= z&{+x}%>E)fy3nST;q)UrUmpYDpQ7OuHgUV&d*OAn@Me(}B_Y`pUk<-y5Pst@edo#) zNHE*Is^l8nj=UrP-d#Uen)n#7XRj%Y6r|Io1bWGn-f?8S>kl>OZ<_d5=N8!*{*~bI zR;>J{{a3yKGp1N+e3&dAi$x2Y9hU0in<11PS_%U3?eTRWt;pv!Ox0yh{yY@Push!4 z&y}Z^#mmIIyrlO`UtV7{gows-{7^YzKf*6k?Rt%TNfEHg+AUxV4K=7m)$ZLLL)!y- zfQpkQXmSgp)m!QC=Sp!9eD=M7%^&xuC3B<8+l9xt>6eP0m8>~a7UKg@uW<{QQ(R40bFW8^e>a&B*XF5ncs43v;a%!V2I1i&Y zlE~(rcCuJYhjPXgPG1JDpG2-^0IOG*F@TS8bpG`q-BPR~*uwW31WT_;3}6974YzOi zGJvUisI!`VG3j{$VwsBQHFrTT%|g2LjHPJ1r9ghb3-ePibg*}sI-DDB9!$TqpYMY> zn{HXmpts-`Nd4t#CPzC7h97+BfcS{kS3Rd9Wbx&J&qpYpCSx{>@);AuG#1?yWOYH5 zX%-U=r?0!;@lrttyH@}bU)Y;X+v2Zi*LNP;SfA{ zueBfqoSiXqm~0x3m!fX>K|6^=jHD7HH!VF?cFxVdnpPA(i@!lL%wNXev)737xi_XF zFF!tUL<~wqy&VS9%Ss~9^OykJyLZwo zU1@I8ZI{*OJnlasZ=PTefH9yq-!P8%)sKT*b))@(h&*nYOa=LZHk3rZ{2P(fX6!vPyCA9u2BjlC&1jP$wSz;5z{ua=s-ty5B+My zz!S~lx8O|snZHJCUy8SK{1H-d4tq;xoFEC>-l)4n)7uIn3YmMuOMEJxZ{0tm*F^5X zj;O%(zUWwF2u&mBV|?d1bm~1b&>bBkWFWCFt%SPg`IwC#c@X{#U``iW+x(rK{l}=p zUs7aE*595(Hp=-+s+u!%b`$g3Pxbhyz-^7*=5TMXZSa;;axCJHtZUeE)p7cU2_L}6 z`+i$Myb|v^eZt;8PSqv(G6E9l85dJd^j0<^;7`P)8F$@(I=xTXyXUkTOXyXrXr`iQ z5YR0Lm8ERmV11&`OuFN6Q>O;Uw23zeK*HkT}t&fJOPL%tg9*q1|MzSv7L2A$?2k zdc%SKo_^W)8bfD)jTwKDivPzE@+17=2hzlc=Y+KM(vlD-k&!3x#*CDP3=O2Abu|-h2$7G~+LA*M2huvF_!cWO3j!|1~9o+zp+hsr@Xq=76a-YyfJAp3szC8a@ z$L$g=n^S09Vge%t=2jANOWtfOw=@wwCTPRKFBSe|vVWGS`2z;=7X}4tD6V=m!&6%~ zutxdC9$v_t*{yARt@iAqPdLqKpLogtK+g!%t1C7E@bx43=V0Q;ZkFmuzwDdk8*7=- zs1VecaAN=;nrY9I;Q@o6QRb_X_7y!T5i2YfT)+TIT=8ioB_()PifYnSejZ2}R$@0v(Sdpf&@T>MA{JHV zFaTZbWFQdnWdM9R{w=hcFU8&wiRCs-l;+F9QdYfl%pNZ0vQ>O{*!=~fC9z@70-W+4 z4U2WU)q#4oR36d%Y(8M1Bi4;0<5P!Q+7J%c9?N@$n6BArSA9Cz!HoM#QEjhw=9Bdh zC~Z|ewB~X}+bd@g5pw)@D*0O_`A6qJm|dzIL^2DOwNgA_YnyDm+wm|5w_A@8LTeP= zdjL%6T22}=+W}_R8=_x3_F@*7blzhqCp`9o(Q4~O!W$=DXe*lZgknMWYMMz-SG4U7 zFn6K1KEW6+ss{oSGzVAnWK&h=i(AlPsTLgx4nObVcr=kU=&B$Nc=`f#G~>?uPa8LT@y$sE;eD~aOObba z#@m$>i&QV|uE6L!s<3}TyY_dbkmnEz0M)WL5j!u%Sp_QHkQr0Iv-xVzK3G3D60Iy} zp2dm%-#8Lz9%-_a1Q%#NIl$!F1dVTChhRNb6{T zpj-q5;WKS?bqwXK>3YxtS53=J4}iJ?PTP$KL3^FWq5#PJ`g_SV$rVb9bMCFZbiA%| zKXV`m3;)cL{Mr23kEs;7T+aq=z~N4e&0cj?x#s#|F~hGd!CXz3uu)bI=e!wp$pah90H|X_5wpdChJNid6^XEc zbH}_yaIOgeAHhYSY)Q5JTEo4&xLi74HQ|Maa1*We%~YGckCpPEx6XW}TRsb_!jv*d&sji8;g1GH@X+N=Gb*~V1&{W5(Y?3pYQ2a}h$k(ZH zzlQ5`Qoo{`|NXqGA0ZY0>{;}WkZJ#J=Uo7&TgP7sWJlcga3pSON=C`cUl{W6gKJSA zR^;@ZAT764+F#>?8&r7QdV4lVXh;?a)6*~A7~vG)y1T^72{M~gCWsjK5<1&vo_PM_ zZ8xP$R;}mDv~#kUHwo){<>C~+8uOK*|Nr07_>(Kgi8nf7d>8WHWBKE(?R^iZtGoGh z3N(VIQv=L*taBM=ej|zpGpfN$be#(W5JU9pjeeZzM$~vKh6c_RQ%<_&&=z!RFkenq zZqJSt-=^ZCSrZP!v}S@*tOO+ zR=<#nW{XrXX(|asJ7B`&>ea7{XXdB^E7T&A?p3U6w(Ec4SK{paqt**b%1{IrO+i}A zODDio@X)lT5lQZ$e1+#W#GHc+;eD7cG|}Z%)lm69GxM7=0{m~@j0MgpfQTUR<aypV2? z|E&gRip{~p;a^K@%=d47aFtq=>5l7MezusSyf>oeGnXfBpx$^zF0v&vr%y3c$lHyO z(C#6Umxp;Pzg5HTAr5e5<(n`gB@KbX2WBgJfb`M|Ta7@_mN84;dIgV?7WEgg9lTu zb!@-9QFD%OZpwEq*LiuHp!zoXJ!KemK{decv)=|W9c0bBRr%4cwE#+l`L$st&LD>{ z17Tc!88q=>o6=UN+1!Bm_6D( zscT@Z{ehi+S$hj)_x{X3`m6iQKf+{vYo2H8e4|7JloOpg5-SQDm_=fXEhw{indr6g z(ocBm>!F>p*`OrDJam?eU@|=*vJ~ zIm&~Jme%!77)q#b4u^6TcN;V#2?CyTFOw_<=i=BxPOaheFfh#^)m0RK$U(O~tP66j zn|w2jr?Yu02gZhe&daJR&RnlYEB0{0aexb>7H@Jnh3lHr-u`-MA^9L&ZyEI#HU8A# zg!ZGifzeOQ{gUyK9wxnhjY;wkf+DS9hiK5I5tYqq|5Ic8o8RGhcILKTs2j)p6pPEz zwAWpo=~pgpW~OnVaTYGZuS4EOBurn#P~#C)9(wpx>pm0;u9!D!#e_mRz4TWv4w#cW z|CJ*TIcsrqXT&8AfA;fkfG9JxoWA8HX)t^TZAfat;>37W5(6+T(kv{9qEBjfJdoI) zb{714i%UnvTFS#yma0KkS2Lt?7BG3~(qH2)-*(gAJxBaVw$!(JVC7s_>u!y`#iK0+;QTSOLU|rq&kb=ZoaU z(+S_q9x&x2%U2$(b#Xj#1xoYS&j9Mtm9M1WltM+N^Oq-#hh2!hUb1=A$!v@=!c z3#D;)Er;EGCdJi@PLVW%21zZXkn@I(76I!)65hpAeDom7|4NT`GxE;)0H?SEujhy2lIu7@%QG+P)8M*Am$x|yw#_ql z65i0aky(fQ=hhd!+Aqj+P;8#bThzuayc_4fV|nahsA{N=o%y&}@HbNTlWhR~krb&v z6UbQ%lS{V=lY_aJ_E}BzhBuQ+g{XJKU~tSlLfrp>)ft8THP8FGZ44J*m3S$7@~bt@ zsY_g{;^;bd0UQKW>5Z{bJ0keGLZmlbUG>eZW`zZvkl`z4;me+0*>P%si%wtx$HQX; zeyy#!o5P3kAZ*5O%zGKtcqu3Ea7Yr1z>+?(T|Df=7OD`jV641|JG~0-{HkdxD%R{`UTDE7SN~q&Pyzq^2@py1iSz8Mra1||g2}`s~NpIaBx}AMP z2`_{b7k@e>`+(9r!*AI_#L1T3v+g3rMfUfi>++O+x*zH{r)5QI6c&Rkc5)q^8dn+{ z__)C(f2@2VZ$Kgr@d`u5x&b~FUSb7gC31vu{3-`t*B+R`Br5!y*RD_>KfC`^RMBiP zGiBP7O|5B;U+O|t$e^@4#?EF&OO$!ymAk(rs9r2#o9?7?9b!wuKkyLji~Pu`B{B52 z^|IH6$)Yhj-)zy-l(ROi0q*8oLPa+7&@eII%!jzew&~0T0Yg#dC(T*=ubjVd3e-o{ zU7Ritib>0Tm#~@>t^8vY0qWsr#vjVA<~r1!SEz?p+*g$-@ZH!Pmr}}duGx9E&fjCJ zb#kRzvpa@VQ|y8aLYb~9)hy{d`tee2cB-W6Zh}af9nQ$ z6V29AE2uo9_r&N!!SanFx(ZB?NLh9SvRV@qdF1PP>beak#l4DlH_2&FY@4uiT3mBg%Hd;M z2(c)H<&h=)WD->u8r$$qji0);UVQ(MW%0t|2C5Sd6y<7Nw9*OL zU^sL`cB!%PIPAd?-B7J+PyzYCCW@sc?M7(RdQrryGB2~<6C>-DfB8rIeS(@W4m6>zUmmiLcqfZ-D_)iLgbzI3k*@`kyp5P zP0h9ETc`p{VzxqEi+92hkJ2p+NX`kv2&f00P{XmQ`qM(EcdgtDh_rqpAXf$ zY%?RImUc_1|C|@Nh|q94wXSzEb)UfGky~z_eN^PdBoFzfFdxy-9=bLa9SpdHIcUpV z4$xlLwuYdWaXbyLv3n))4%@|r2_j|+Ubkd z{gdP75OQv)^r^6Zo>IOsq4ks)_oUld1W4{J`|WT~ucEj){0@*feBU_tRNnCAdc(`L zVsO>!dEsQ77Ufx)esSZ_`hDwUB@d=l4UL($^wtIOym{GCzU%qy%v}cx-tM)xQhH#@ zMYLsdiRA8!XDzPWNs_zrTdN0_OQ0rgPYE1%^1e>i{b!I_VtRwhhO5K(_AG8*-f-!8 zIt^~^cweGG+P#O_*0G_Q<tzi<{uW4Cl~f zWkDVdkpixm3a>D#ecqbC)|Dqpv2~z&UXayw_e`DRu87`tjVs!F-^fC`UE+vBIJ}He z`+XFu={)vvF*ryHsK2o;UlTR{ifa8kpELgljNG5vfp5l&Y}PwVgNDJG*$>_PQ&}Xh zxEQ!YpY)9$JRR(zW9jK? zE*e#X45)J2kJqg)5+A+h;&b+nan&+;I(OwS5&6gFDZwkd1zWw1P`8i5Xqop1>&igHqH)E;^aU)TZ zqEhdp#!7LunX zyT?5IfKc=3U$~Bsrng%--Qjh+9|(Bzy)$zuE_3rzdpCYoFl-W$;IIHrYs%VWuNJ1? zDSu@j2Fx(O4Y=Xtx`g#758r5x5+7XFAQt;e1{lePd~iQ^#ct&Rdn(4?8HWs7O4(sH z`QRX0G7K`?n$%akX2f-EXIcotSLzY{2{O{=Y|1Hye@`piw z<@!0m?pn$G$1?Sw-X{6~e*ceYquxHf*F{abYae#sdD>fPD#Ca(_K(BI*n8!1M$9)E zqMqw*jrIHf&+eV-bo+ZrS*;{3A19~Jic1gaXR#rTCX$l~hJc=dy^V5khA+hj*AIbs zhZj^ty49YP9YsW%NvazLn|kukBp;mVo*Ln6PvcfOHQY#VGboxc9;SJT;u+Lo7%ukI Wm>?Wx;WFAj!K^Dr+b7t< - body { - background-image: url('/media/bg.jpg'); background-size: cover; background-repeat: no-repeat; - } - -

-
-

Beyond Heroes

-

- The project that rose from the ashes of a game that was once. We aim to recreate the experience that we enjoyed throughout the years, while also adding new features that make it truly Beyond Heroes and Generals.
-

-
-
-

Why Help Us

-

- Similique earum unde unde exercitationem totam voluptatibus. Cupiditate reiciendis aut ducimus sunt. Sunt laboriosam rerum qui maxime quod aut aspernatur. Ipsa reprehenderit quas nihil vel dignissimos at. Repellendus minima dolorem ipsa sit est ipsum accusamus.
-

-
-
-

How to Help Us

-

- Laborum nobis incidunt voluptate magnam voluptatibus. Itaque sequi eveniet vitae voluptas voluptatem ullam alias omnis. Officiis quia dolores architecto.Voluptate quia aspernatur excepturi voluptas molestias. Maxime magnam maiores sunt dolorum. Id possimus ullam rerum dignissimos.
-

- +
+
+

SUPPORT US

+

Hi! So, you want to support the project, I hear?

+

+ Well, the main way you can do that is by joining the team or telling people to join the team! You can fill out these forms if you're interested in any dev position or if you're interested in translation.
+

+

If you want to help economically... let's talk first...

+

+ Here's the thing, I really appreciate that you want to help us out, and we LOVE your energy. We really don't want to accept economic help, and there are a few reasons as to why. Mostly, we can't (or don't want to) promise anything, we don't want to get your hopes up, and we don't want to lead you to believe in something that might not happen. Giving us money has a worse ROI than playing it all on red in roulette, and as such, to me personally, it feels like asking for money from you just because you like us. If that's the case, okay, alright, no problem; we still have to solve the distribution issue, but whatever, we'll get to it eventually. Otherwise, understand that the reason the links are so hidden is exactly because we don't want you to feel like you wasted money - at least not before you knowingly and willingly understand that this is just like giving it to us because you like us and want to, or you have money to spare and don't care. If you want to specifically help out a team member, assign it on the message or something so I know who not to give it to :P +
+

+

+ If you understand the above-mentioned stuff, then here's the links to our Ko-fi, and Buy Me a Coffee. +

+ + -
+ + {% endblock %} \ No newline at end of file diff --git a/templates/users/login.html b/templates/users/login.html index 32f4f16..5a0b7aa 100644 --- a/templates/users/login.html +++ b/templates/users/login.html @@ -1,6 +1,8 @@ {% extends 'base.html' %} {% block content %} {% load crispy_forms_tags %} + +

{% csrf_token %} diff --git a/templates/users/logout.html b/templates/users/logout.html index d21303a..6e7e917 100644 --- a/templates/users/logout.html +++ b/templates/users/logout.html @@ -1,6 +1,9 @@ {% extends 'base.html' %} {% block content %} {% load crispy_forms_tags %} + + +

{% if messages %} {% for message in messages %}
{{ message }}
diff --git a/templates/users/register.html b/templates/users/register.html index f79c17e..ab98853 100644 --- a/templates/users/register.html +++ b/templates/users/register.html @@ -1,6 +1,9 @@ {% extends 'base.html' %} {% block content %} {% load crispy_forms_tags %} + +
+
{% csrf_token %} diff --git a/users/__pycache__/__init__.cpython-310.pyc b/users/__pycache__/__init__.cpython-310.pyc index bf63ed4b87fd424e5d0705e3fa057a3a142513e8..450c5dddd04e960984f227df96e5090de7be8e0a 100644 GIT binary patch delta 43 xcmbQvxRjA6pO=@50SLMqrl(Ehv1as`=%K+EACO;MQXCVWnpB)wk~*+-4pO=@50SLMqrcdOa$mlw8t_ELxKz?yaaZGq>QgLQU>cpdJ01y2RApigX delta 27 hcmey#_?nSBpO=@50SHW!J125aWHg^RS7YL3H2`H72kQU; diff --git a/users/__pycache__/apps.cpython-310.pyc b/users/__pycache__/apps.cpython-310.pyc index e7dce5cd74465a3e412160ee2b3eac6d272516fa..4c0ae2581fe8cf1e79b0ad1253edc687317475c3 100644 GIT binary patch delta 45 zcmZo;nZm-8&&$ij00i9))6*vM{9<&O%+9F67ax#cTv8kpo|;sgS&}+gpYb{X5A6-O delta 30 kcmbQj(#FD*&&$ij00eK>?24Pn^NZ1JGCQNjWLw7T0C?dDtN;K2 diff --git a/users/__pycache__/forms.cpython-310.pyc b/users/__pycache__/forms.cpython-310.pyc index 3a13254455a41af018c16e6724a9d69d3a5c5115..7ed4a9c92b4fe5f41c55069c6f611775a91bbd22 100644 GIT binary patch delta 46 zcmZqYn99MO&&$ij00i9)(>HRTWMp)me3emyFFqi@xTH8HJT<8}vm|x%Uq&t_04Nm> AJOBUy delta 31 lcmbQr(ayo0&&$ij00du?IyZ8kWMnj-e3emSGdB|#699W(2gU#Z diff --git a/users/__pycache__/models.cpython-310.pyc b/users/__pycache__/models.cpython-310.pyc index 1e5730675b91d9dbc9f1334d851ed48f160b8de6..a23b2bc3e1d7d7cc0561632552b0f66f2710c2c2 100644 GIT binary patch delta 47 zcmdnOc8HB9pO=@50SLMqrl)P>nZ?NHHhDRt248$YesM{0On7Qiab`*C=JSlHi~v4t B4$1%k delta 32 mcmX@awuOx+pO=@50SLBBe@WfQGmDYYV)AlEjm>u%QyBq`rU^Iz diff --git a/users/__pycache__/signals.cpython-310.pyc b/users/__pycache__/signals.cpython-310.pyc index 331f8c37d2627d234666528e65d26227f3642844..c31cf180b52aced53612a18b2976f80ce29c8a10 100644 GIT binary patch delta 43 xcmdnabd-rZpO=@50SLMqrcdO)$>=`usRmzsKz?yaaZGq>QgLQU>SSInZ(HGI(a^$248$YesM{0On7Qiab`*C=HraBnHi%d zC$ok!8cp8G8p3EWnU5_(+!(0Q8HkHHfCL8v3nL372V;@(FcW&h7WoGo8EXk}f*`N750A@)CE&u=k diff --git a/users/migrations/__pycache__/__init__.cpython-310.pyc b/users/migrations/__pycache__/__init__.cpython-310.pyc index 10c9334171d912ab7494a1e62b107633509a3dea..ed4bc7f58cd3b78496fe03e93daf4f5dcc5af128 100644 GIT binary patch delta 42 wcmZ3)xPg&7pO=@50SLMqrcdOyVGN$=p}`j)kY8L<921_JRGe9oIFcTVKCVRW77p)s+}2mo0p2Lk{A -- 2.40.1 From 319d4374e8d55bed1488a5324c7034eda3644944 Mon Sep 17 00:00:00 2001 From: Rishit-Pandit Date: Tue, 24 Feb 2026 20:09:41 +0530 Subject: [PATCH 2/8] Added API API has auth --- .gitignore | 5 +- BH/settings.py | 40 +++++++++- BH/urls.py | 8 +- api/__init__.py | 0 api/admin.py | 9 +++ api/apps.py | 5 ++ api/migrations/0001_initial.py | 71 ++++++++++++++++++ api/migrations/__init__.py | 0 api/models.py | 70 +++++++++++++++++ api/permissions.py | 12 +++ api/serializers.py | 25 ++++++ api/templatetags/api_markdown_extras.py | 12 +++ api/tests.py | 3 + api/urls.py | 13 ++++ api/views.py | 48 ++++++++++++ .../0002_alter_blog_id_alter_post_id.py | 23 ++++++ db.sqlite3 | Bin 155648 -> 294912 bytes users/migrations/0002_alter_profile_id.py | 18 +++++ 18 files changed, 357 insertions(+), 5 deletions(-) create mode 100644 api/__init__.py create mode 100644 api/admin.py create mode 100644 api/apps.py create mode 100644 api/migrations/0001_initial.py create mode 100644 api/migrations/__init__.py create mode 100644 api/models.py create mode 100644 api/permissions.py create mode 100644 api/serializers.py create mode 100644 api/templatetags/api_markdown_extras.py create mode 100644 api/tests.py create mode 100644 api/urls.py create mode 100644 api/views.py create mode 100644 blog/migrations/0002_alter_blog_id_alter_post_id.py create mode 100644 users/migrations/0002_alter_profile_id.py diff --git a/.gitignore b/.gitignore index 56bf8f4..cffd79f 100644 --- a/.gitignore +++ b/.gitignore @@ -159,4 +159,7 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -.idea/ \ No newline at end of file +.idea/ + +# static +staticfiles/ diff --git a/BH/settings.py b/BH/settings.py index 6370527..83ff08e 100644 --- a/BH/settings.py +++ b/BH/settings.py @@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/3.0/ref/settings/ """ import os +from dotenv import load_dotenv # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -23,9 +24,9 @@ TEMPLATES_DIR = os.path.join(BASE_DIR + '/templates') SECRET_KEY = '!2g)+m+_h9fq9%il5+t5#qnj^9502or6$=2!$==v=i2*c#7q*m' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = False -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'beyond-heroes.com', 'www.beyond-heroes.com'] # Application definition @@ -33,26 +34,43 @@ ALLOWED_HOSTS = [] INSTALLED_APPS = [ 'crispy_forms', 'crispy_bootstrap4', + 'blog.apps.BlogConfig', 'users.apps.UsersConfig', + 'api.apps.APIConfig', + 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.sites', # for django-allauth + + 'corsheaders', + 'dj_rest_auth', + 'rest_framework', + 'rest_framework.authtoken', + # 'allauth', + # 'allauth.account', + # 'allauth.socialaccount', + # 'dj_rest_auth.registration', # for api side user registration ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', # cors-headers 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + # 'allauth.account.middleware.AccountMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] +CORS_ORIGIN_WHITELIST = ( 'http://localhost:3000', 'http://www.beyond-heroes.com') + ROOT_URLCONF = 'BH.urls' TEMPLATES = [ @@ -103,6 +121,17 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +REST_FRAMEWORK = { + 'DEFAULT_PERMISSION_CLASSES': [ + # 'rest_framework.permissions.AllowAny', + 'rest_framework.permissions.IsAuthenticated', + ], + 'DEFAULT_AUTHENTICATION_CLASSES': ( + # 'rest_framework.authentication.SessionAuthentication', # causes CSRF Token conflicts in API + 'rest_framework.authentication.TokenAuthentication', + ) +} + # Internationalization # https://docs.djangoproject.com/en/3.0/topics/i18n/ @@ -121,6 +150,8 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ +# remember to `python manage.py collectstatic` +STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATIC_URL = '/static/' MEDIA_ROOT = os.path.join(BASE_DIR + '/media') MEDIA_URL = '/media/' @@ -128,3 +159,8 @@ MEDIA_URL = '/media/' CRISPY_TEMPLATE_PACK = 'bootstrap4' LOGIN_REDIRECT_URL = 'Home' LOGIN_URL = 'Login' + +EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # prints to console +# SITE_ID = 1 # for django-allauth + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/BH/urls.py b/BH/urls.py index 13801d3..888ad1c 100644 --- a/BH/urls.py +++ b/BH/urls.py @@ -1,4 +1,4 @@ -"""TechBlog URL Configuration +"""BH URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/3.0/topics/http/urls/ @@ -20,8 +20,12 @@ from django.urls import path, include urlpatterns = [ path('', include('blog.urls')), - path('users/', include('users.urls')), path('admin/', admin.site.urls), + path('api/v1/', include('api.urls')), + path('users/', include('users.urls')), + path('api-auth/', include('rest_framework.urls')), + path('api/v1/dj-rest-auth/', include('dj_rest_auth.urls')), + # path('api/v1/dj-rest-auth/register/', include('dj_rest_auth.registration.urls')), ] if settings.DEBUG: diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/admin.py b/api/admin.py new file mode 100644 index 0000000..1da1144 --- /dev/null +++ b/api/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin +from .models import * + + +# Register your models here. +admin.site.register(Province) +admin.site.register(AssaultTroop) +admin.site.register(Player) +admin.site.register(Server) diff --git a/api/apps.py b/api/apps.py new file mode 100644 index 0000000..93127e4 --- /dev/null +++ b/api/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class APIConfig(AppConfig): + name = 'api' diff --git a/api/migrations/0001_initial.py b/api/migrations/0001_initial.py new file mode 100644 index 0000000..674c694 --- /dev/null +++ b/api/migrations/0001_initial.py @@ -0,0 +1,71 @@ +# Generated by Django 5.2.9 on 2026-02-19 10:09 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Player', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=50)), + ('faction', models.IntegerField()), + ('server', models.CharField(max_length=20)), + ], + options={ + 'ordering': ['id'], + }, + ), + migrations.CreateModel( + name='Province', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100)), + ('faction', models.IntegerField()), + ('map', models.CharField(max_length=255)), + ('mov_speed', models.IntegerField()), + ('ats', models.JSONField(null=True)), + ], + options={ + 'ordering': ['id'], + }, + ), + migrations.CreateModel( + name='Server', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('players', models.IntegerField()), + ('capacity', models.IntegerField()), + ('region', models.CharField(max_length=3)), + ('address', models.CharField(max_length=20)), + ], + options={ + 'ordering': ['id'], + }, + ), + migrations.CreateModel( + name='AssaultTroop', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('name', models.CharField(max_length=100)), + ('faction', models.IntegerField()), + ('type', models.IntegerField()), + ('province', models.IntegerField()), + ('orders', models.JSONField(null=True)), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ats', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['id'], + }, + ), + ] diff --git a/api/migrations/__init__.py b/api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/models.py b/api/models.py new file mode 100644 index 0000000..9fae33b --- /dev/null +++ b/api/models.py @@ -0,0 +1,70 @@ +from django.db import models +from django.contrib.auth.models import User +from django.db.models.fields import CharField, IntegerField + + +# Create your models here. +class Province(models.Model): + id = models.IntegerField(primary_key = True) + name = models.CharField(max_length = 100, blank = False) + faction = models.IntegerField() # 0 - Neutral, 1 - Allies, 2 - Axis + map = models.CharField(max_length=255) + mov_speed = models.IntegerField() + ats = models.JSONField(null=True) + + class Meta: + ordering = ['id'] + + def __str__(self): + return f"{self.name} - {self.faction}" + + +class AssaultTroop(models.Model): + id = models.IntegerField(primary_key = True) + name = models.CharField(max_length = 100, blank = False) + faction = models.IntegerField() # 0 - Neutral, 1 - Allies, 2 - Axis + type = models.IntegerField() + province = models.IntegerField() # Province ID (-1 for not deployed) + orders = models.JSONField(null=True) + owner = models.ForeignKey( + 'auth.User', + related_name='ats', + on_delete=models.CASCADE + ) + + class Meta: + ordering = ['id'] + + def __str__(self): + return f"{self.name} - {self.province},{self.faction}" + + + +class Player(models.Model): + id = models.IntegerField(primary_key = True) + name = models.CharField(max_length = 50, blank = False) + faction = models.IntegerField() + server = CharField(max_length = 20, blank = False) + + class Meta: + ordering = ['id'] + + def __str__(self): + return self.name + + + +class Server(models.Model): + id = IntegerField(primary_key = True) + players = IntegerField() # total current players + capacity = IntegerField() # max player capacity + region = CharField(max_length = 3, blank = False) # 3 letter abb. for region + address = CharField(max_length = 20, blank = False) + + class Meta: + ordering = ['id'] + + def __str__(self): + return f"{self.address} - {self.region}" + + diff --git a/api/permissions.py b/api/permissions.py new file mode 100644 index 0000000..26cdde2 --- /dev/null +++ b/api/permissions.py @@ -0,0 +1,12 @@ +from rest_framework import permissions + +class IsSuperUserOrReadOnly(permissions.BasePermission): + def has_permission(self, request, view): + if request.method in permissions.SAFE_METHODS: + return True + return request.user.is_superuser + + +class IsStaff(permissions.BasePermission): + def has_permission(self, request, view): + return request.user.is_staff diff --git a/api/serializers.py b/api/serializers.py new file mode 100644 index 0000000..400fa05 --- /dev/null +++ b/api/serializers.py @@ -0,0 +1,25 @@ +from rest_framework import serializers +from .models import * + +class ProvinceSerializer(serializers.ModelSerializer): + class Meta: + model = Province + fields = ['id', 'name', 'faction', 'map', 'mov_speed', 'ats'] + + +class AssaultTroopSerializer(serializers.ModelSerializer): + class Meta: + model = AssaultTroop + fields = ['id', 'name', 'faction', 'type', 'province', 'deployed', 'orders', 'owner'] + + +class PlayerSerializer(serializers.ModelSerializer): + class Meta: + model = Player + fields = ['id', 'name', 'faction', 'server'] + + +class ServerSerializer(serializers.ModelSerializer): + class Meta: + model = Server + fields = ['id', 'players', 'capacity', 'region', 'address'] diff --git a/api/templatetags/api_markdown_extras.py b/api/templatetags/api_markdown_extras.py new file mode 100644 index 0000000..23b1077 --- /dev/null +++ b/api/templatetags/api_markdown_extras.py @@ -0,0 +1,12 @@ +from django import template +from django.template.defaultfilters import stringfilter + +import markdown as md + + +register = template.Library() + +@register.filter() +@stringfilter +def markdown(value): + return md.markdown(value, extensions=['markdown.extensions.fenced_code']) diff --git a/api/tests.py b/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/api/urls.py b/api/urls.py new file mode 100644 index 0000000..327296f --- /dev/null +++ b/api/urls.py @@ -0,0 +1,13 @@ +from django.urls import path +from .views import * + +urlpatterns = [ + path('provinces/', ProvincesView.as_view()), + path('provinces//', ProvinceView.as_view()), + path('assault_troops/', AssaultTroopsView.as_view()), + path('assault_troops//', AssaultTroopView.as_view()), + path('players/', PlayersView.as_view()), + path('players//', PlayerView.as_view()), + path('servers/', ServersView.as_view()), + path('servers//', ServerView.as_view()), +] diff --git a/api/views.py b/api/views.py new file mode 100644 index 0000000..30ac0d5 --- /dev/null +++ b/api/views.py @@ -0,0 +1,48 @@ +from rest_framework import generics, permissions +from .models import * +from .serializers import * +from .permissions import * + + +class ProvincesView(generics.ListCreateAPIView): + permission_classes = (IsSuperUserOrReadOnly,) + queryset = Province.objects.all() + serializer_class = ProvinceSerializer + +class ProvinceView(generics.RetrieveUpdateDestroyAPIView): + permission_classes = (IsSuperUserOrReadOnly,) + queryset = Province.objects.all() + serializer_class = ProvinceSerializer + + +class AssaultTroopsView(generics.ListCreateAPIView): + permission_classes = (IsSuperUserOrReadOnly,) + queryset = AssaultTroop.objects.all() + serializer_class = AssaultTroopSerializer + +class AssaultTroopView(generics.RetrieveUpdateDestroyAPIView): + permission_classes = (IsSuperUserOrReadOnly,) + queryset = AssaultTroop.objects.all() + serializer_class = AssaultTroopSerializer + + +class PlayersView(generics.ListCreateAPIView): + permission_classes = (IsStaff,) # Only Staff can see player info, i.e. authorized servers + queryset = Player.objects.all() + serializer_class = PlayerSerializer + +class PlayerView(generics.RetrieveUpdateDestroyAPIView): + permission_classes = (IsStaff) + queryset = Player.objects.all() + serializer_class = PlayerSerializer + + +class ServersView(generics.ListCreateAPIView): + permission_classes = (IsSuperUserOrReadOnly,) + queryset = Server.objects.all() + serializer_class = ServerSerializer + +class ServerView(generics.RetrieveUpdateDestroyAPIView): + permission_classes = (IsSuperUserOrReadOnly,) + queryset = Server.objects.all() + serializer_class = ServerSerializer diff --git a/blog/migrations/0002_alter_blog_id_alter_post_id.py b/blog/migrations/0002_alter_blog_id_alter_post_id.py new file mode 100644 index 0000000..2bdeec9 --- /dev/null +++ b/blog/migrations/0002_alter_blog_id_alter_post_id.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.9 on 2026-02-19 10:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='blog', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='post', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/db.sqlite3 b/db.sqlite3 index 306d3be008db700a33950c1c53c580a76d77d4a1..02c78a60e66d4c67e5be3a6d8e697cc1df91608c 100644 GIT binary patch literal 294912 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 Date: Tue, 24 Feb 2026 20:14:49 +0530 Subject: [PATCH 3/8] Update requirements.txt --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements.txt b/requirements.txt index ed3138e..285bf20 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,10 +2,13 @@ beautifulsoup4==4.14.3 crispy-bootstrap4==2025.6 Django==5.2.9 +dj-rest-auth==7.1.1 django-bootstrap4==25.3 django-braces==1.17.0 django-cors-headers==4.9.0 django-crispy-forms==2.5 +django-rest-framework==0.1.0 +djangorestframework==3.16.1 Markdown==3.10 MarkupSafe==2.1.1 mysqlclient==2.2.7 -- 2.40.1 From d774f2f93c173495326507c30a6a0e6986bb500e Mon Sep 17 00:00:00 2001 From: Surya Date: Sat, 28 Feb 2026 18:50:48 +0530 Subject: [PATCH 4/8] Added UserData to the API --- .gitignore | 3 + BH/settings.py | 6 +- api/filters.py | 8 +++ api/permissions.py | 12 ++++ api/serializers.py | 2 +- api/urls.py | 2 + api/views.py | 29 +++++++- db.sqlite3 | Bin 294912 -> 307200 bytes users/admin.py | 4 +- users/forms.py | 2 +- .../0003_userdata_delete_profile.py | 31 +++++++++ users/models.py | 21 ++++-- users/serializers.py | 7 ++ users/urls.py | 4 +- users/views.py | 62 +++++++----------- 15 files changed, 137 insertions(+), 56 deletions(-) create mode 100644 api/filters.py create mode 100644 users/migrations/0003_userdata_delete_profile.py create mode 100644 users/serializers.py diff --git a/.gitignore b/.gitignore index cffd79f..0e1ea32 100644 --- a/.gitignore +++ b/.gitignore @@ -163,3 +163,6 @@ cython_debug/ # static staticfiles/ + +# database +db.sqlite3 diff --git a/BH/settings.py b/BH/settings.py index 83ff08e..b87b28e 100644 --- a/BH/settings.py +++ b/BH/settings.py @@ -24,7 +24,7 @@ TEMPLATES_DIR = os.path.join(BASE_DIR + '/templates') SECRET_KEY = '!2g)+m+_h9fq9%il5+t5#qnj^9502or6$=2!$==v=i2*c#7q*m' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = True ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'beyond-heroes.com', 'www.beyond-heroes.com'] @@ -127,7 +127,7 @@ REST_FRAMEWORK = { 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': ( - # 'rest_framework.authentication.SessionAuthentication', # causes CSRF Token conflicts in API + 'rest_framework.authentication.SessionAuthentication', # causes CSRF Token conflicts in API 'rest_framework.authentication.TokenAuthentication', ) } @@ -161,6 +161,6 @@ LOGIN_REDIRECT_URL = 'Home' LOGIN_URL = 'Login' EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # prints to console -# SITE_ID = 1 # for django-allauth +SITE_ID = 1 # for django-allauth DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/api/filters.py b/api/filters.py new file mode 100644 index 0000000..b250d48 --- /dev/null +++ b/api/filters.py @@ -0,0 +1,8 @@ +from rest_framework.filters import BaseFilterBackend +from users.models import * + +class UserDataFilterBackend(BaseFilterBackend): + def filter_queryset(self, request, queryset, view): + queryset = queryset.filter(user__id=request.user.id) + + return queryset diff --git a/api/permissions.py b/api/permissions.py index 26cdde2..9ef600d 100644 --- a/api/permissions.py +++ b/api/permissions.py @@ -10,3 +10,15 @@ class IsSuperUserOrReadOnly(permissions.BasePermission): class IsStaff(permissions.BasePermission): def has_permission(self, request, view): return request.user.is_staff + + +class IsSuperUserOrAuthReadOnly(permissions.BasePermission): + def has_permission(self, request, view): + if request.method in permissions.SAFE_METHODS: + return request.user != None + return request.user.is_superuser + + +class IsSuperUser(permissions.BasePermission): + def has_permission(self, request, view): + return request.user.is_superuser diff --git a/api/serializers.py b/api/serializers.py index 400fa05..1f0cca8 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -10,7 +10,7 @@ class ProvinceSerializer(serializers.ModelSerializer): class AssaultTroopSerializer(serializers.ModelSerializer): class Meta: model = AssaultTroop - fields = ['id', 'name', 'faction', 'type', 'province', 'deployed', 'orders', 'owner'] + fields = ['id', 'name', 'faction', 'type', 'province', 'orders', 'owner'] class PlayerSerializer(serializers.ModelSerializer): diff --git a/api/urls.py b/api/urls.py index 327296f..8a07d97 100644 --- a/api/urls.py +++ b/api/urls.py @@ -10,4 +10,6 @@ urlpatterns = [ path('players//', PlayerView.as_view()), path('servers/', ServersView.as_view()), path('servers//', ServerView.as_view()), + path('user_data/', UserDataView.as_view()), + path('user_data//', UserDatumView.as_view()), ] diff --git a/api/views.py b/api/views.py index 30ac0d5..a4adcd0 100644 --- a/api/views.py +++ b/api/views.py @@ -1,48 +1,75 @@ from rest_framework import generics, permissions +from django.views.decorators.csrf import csrf_exempt +from django.utils.decorators import method_decorator from .models import * +from .filters import * from .serializers import * from .permissions import * +from users.models import * +from users.serializers import * - +@method_decorator(csrf_exempt, name='dispatch') class ProvincesView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Province.objects.all() serializer_class = ProvinceSerializer +@method_decorator(csrf_exempt, name='dispatch') class ProvinceView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Province.objects.all() serializer_class = ProvinceSerializer +@method_decorator(csrf_exempt, name='dispatch') class AssaultTroopsView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = AssaultTroop.objects.all() serializer_class = AssaultTroopSerializer +@method_decorator(csrf_exempt, name='dispatch') class AssaultTroopView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = AssaultTroop.objects.all() serializer_class = AssaultTroopSerializer +@method_decorator(csrf_exempt, name='dispatch') class PlayersView(generics.ListCreateAPIView): permission_classes = (IsStaff,) # Only Staff can see player info, i.e. authorized servers queryset = Player.objects.all() serializer_class = PlayerSerializer +@method_decorator(csrf_exempt, name='dispatch') class PlayerView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsStaff) queryset = Player.objects.all() serializer_class = PlayerSerializer +@method_decorator(csrf_exempt, name='dispatch') class ServersView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Server.objects.all() serializer_class = ServerSerializer +@method_decorator(csrf_exempt, name='dispatch') class ServerView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Server.objects.all() serializer_class = ServerSerializer + + +@method_decorator(csrf_exempt, name='dispatch') +class UserDatumView(generics.RetrieveUpdateDestroyAPIView): + permission_classes = (IsSuperUser,) + queryset = UserData.objects.all() + serializer_class = UserDataSerializer + # filter_backends = [UserDataFilterBackend] + +@method_decorator(csrf_exempt, name='dispatch') +class UserDataView(generics.ListCreateAPIView): + permission_classes = (IsSuperUserOrAuthReadOnly,) + queryset = UserData.objects.all() + serializer_class = UserDataSerializer + filter_backends = [UserDataFilterBackend] \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index 02c78a60e66d4c67e5be3a6d8e697cc1df91608c..51fa76967409cb4accdf39825b83cfc920d1edde 100644 GIT binary patch delta 11067 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 diff --git a/users/admin.py b/users/admin.py index b5afd5a..42421a0 100644 --- a/users/admin.py +++ b/users/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import Profile +from .models import * -# Register your models here. +admin.site.register(UserData) diff --git a/users/forms.py b/users/forms.py index 17b30be..0d0a388 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,7 +1,7 @@ from django import forms from django.contrib.auth.models import User from django.contrib.auth.forms import UserCreationForm -from .models import Profile +from .models import * class UserRegisterForm(UserCreationForm): diff --git a/users/migrations/0003_userdata_delete_profile.py b/users/migrations/0003_userdata_delete_profile.py new file mode 100644 index 0000000..88ae888 --- /dev/null +++ b/users/migrations/0003_userdata_delete_profile.py @@ -0,0 +1,31 @@ +# Generated by Django 5.2.9 on 2026-02-28 03:45 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_alter_profile_id'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserData', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=40)), + ('xp', models.IntegerField()), + ('money', models.IntegerField()), + ('equipment', models.CharField(default='0;', max_length=1024)), + ('inventory', models.CharField(default='0;', max_length=1024)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.DeleteModel( + name='Profile', + ), + ] diff --git a/users/models.py b/users/models.py index 3802880..8a3ec8e 100644 --- a/users/models.py +++ b/users/models.py @@ -3,14 +3,21 @@ from django.contrib.auth.models import User # Create your models here. -class Profile(models.Model): +class UserData(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) - name = models.CharField(max_length=100) - about = models.TextField(default='Hi, I am new to TechBlog') - gender = models.TextField(default='None') - dob = models.DateField(default='1999-01-01') - # image = models.ImageField(default='default.png', name='profile_pic', upload_to='profile_pics') + name = models.CharField(max_length=40) + xp = models.IntegerField() + money = models.IntegerField() + equipment = models.CharField(max_length=1024, default='0;') + inventory = models.CharField(max_length=1024, default='0;') def __str__(self): - return f"{self.user.username}'s Profile" + return f"{self.user.username}'s data" + + +# So this is my beutiful brainchild to keep user data in about 1KB per user, I'm not too sure but still +# it's worth the try, so the main payload is the inventory along the soliers an their weapons and vehicles +# along with the mods for everything which I have separated by `;`, `.` and `,` for soldier, equipment +# class and each equipment. I'll try a bit of bit-hacking to pack as much info of 20 bytes in 2 of the mods. +# ammo|--|sights|---|internals|---|, trigger|--|barrel|--|skins|----|, number|--------| \ No newline at end of file diff --git a/users/serializers.py b/users/serializers.py new file mode 100644 index 0000000..f8a8a47 --- /dev/null +++ b/users/serializers.py @@ -0,0 +1,7 @@ +from rest_framework import serializers +from .models import * + +class UserDataSerializer(serializers.ModelSerializer): + class Meta: + model = UserData + fields = ['user', 'name', 'xp', 'money', 'equipment', 'inventory'] diff --git a/users/urls.py b/users/urls.py index d90dc45..1e87528 100644 --- a/users/urls.py +++ b/users/urls.py @@ -3,8 +3,8 @@ from django.contrib.auth import views as login_view from . import views urlpatterns = [ - path('profile/', views.profile, name='Profile'), - path('profile/', views.profile, name='NamedProfile'), + # path('profile/', views.profile, name='Profile'), + # path('profile/', views.profile, name='NamedProfile'), path('login/', login_view.LoginView.as_view(template_name='users/login.html'), name='Login'), path('logout/', login_view.LogoutView.as_view(template_name='users/logout.html'), name='Logout'), path('register/', views.register, name='Register') diff --git a/users/views.py b/users/views.py index 6bac6ff..70326ac 100644 --- a/users/views.py +++ b/users/views.py @@ -11,52 +11,36 @@ from django.views.generic import * # def users(request): # return render(request, 'users/users.html', {'title': 'Users'}) -def getFromArr(arr, indices, *args, **kwargs): - x = [] - for i in indices: - x.append(arr[i]) - return x +# def getFromArr(arr, indices, *args, **kwargs): +# x = [] +# for i in indices: +# x.append(arr[i]) +# return x -@login_required -def profile(request, *args, **kwargs): - try: - user = User._default_manager.all()[kwargs['pk'] - 1] - except: - user = request.user - print(user.id) +# @login_required +# def profile(request, *args, **kwargs): +# try: +# user = User._default_manager.all()[kwargs['pk'] - 1] +# except: +# user = request.user +# print(user.id) - allow_empty = True - queryset = None - model = Post - paginate_by = None - paginate_orphans = 0 - context_object_name = 'posts' - ordering = ['-date_posted'] +# allow_empty = True +# queryset = Post._default_manager.all() +# context_object_name = 'posts' +# ordering = ['-date_posted'] - if queryset is not None: - queryset = queryset - if isinstance(queryset, QuerySet): - queryset = queryset.all() - elif model is not None: - queryset = model._default_manager.all() - else: - raise ImproperlyConfigured( - "%(cls)s is missing a QuerySet. Define " - "%(cls)s.model, %(cls)s.queryset, or override " - "%(cls)s.get_queryset()." % {"cls": self.__class__.__name__} - ) +# if ordering: +# if isinstance(ordering, str): +# ordering = (ordering,) +# queryset = queryset.order_by(*ordering) - if ordering: - if isinstance(ordering, str): - ordering = (ordering,) - queryset = queryset.order_by(*ordering) - - return render(request, 'users/profile.html', {'title': 'Profile', 'profileUser': user, context_object_name: queryset}) +# return render(request, 'users/profile.html', {'title': 'Profile', 'profileUser': user, context_object_name: queryset}) -def people(request): - return render(request, 'users/people.html', {'title': 'People', 'users': User._default_manager.all()}) +# def people(request): +# return render(request, 'users/people.html', {'title': 'People', 'users': User._default_manager.all()}) users = { -- 2.40.1 From 3e337f63bd413e4ee711d1d2cdb2402e6f9fc7eb Mon Sep 17 00:00:00 2001 From: Jukoga Date: Fri, 6 Mar 2026 12:41:02 +0100 Subject: [PATCH 5/8] Remove pycache from tracking and apply gitignore --- api/views.py | 12 ++---------- blog/__pycache__/__init__.cpython-310.pyc | Bin 164 -> 0 bytes blog/__pycache__/admin.cpython-310.pyc | Bin 493 -> 0 bytes blog/__pycache__/apps.cpython-310.pyc | Bin 382 -> 0 bytes blog/__pycache__/models.cpython-310.pyc | Bin 1058 -> 0 bytes blog/__pycache__/urls.cpython-310.pyc | Bin 659 -> 0 bytes blog/__pycache__/views.cpython-310.pyc | Bin 2590 -> 0 bytes 7 files changed, 2 insertions(+), 10 deletions(-) delete mode 100644 blog/__pycache__/__init__.cpython-310.pyc delete mode 100644 blog/__pycache__/admin.cpython-310.pyc delete mode 100644 blog/__pycache__/apps.cpython-310.pyc delete mode 100644 blog/__pycache__/models.cpython-310.pyc delete mode 100644 blog/__pycache__/urls.cpython-310.pyc delete mode 100644 blog/__pycache__/views.cpython-310.pyc diff --git a/api/views.py b/api/views.py index a4adcd0..4886b3c 100644 --- a/api/views.py +++ b/api/views.py @@ -8,66 +8,58 @@ from .permissions import * from users.models import * from users.serializers import * -@method_decorator(csrf_exempt, name='dispatch') class ProvincesView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Province.objects.all() serializer_class = ProvinceSerializer -@method_decorator(csrf_exempt, name='dispatch') class ProvinceView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Province.objects.all() serializer_class = ProvinceSerializer -@method_decorator(csrf_exempt, name='dispatch') class AssaultTroopsView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = AssaultTroop.objects.all() serializer_class = AssaultTroopSerializer -@method_decorator(csrf_exempt, name='dispatch') + class AssaultTroopView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = AssaultTroop.objects.all() serializer_class = AssaultTroopSerializer -@method_decorator(csrf_exempt, name='dispatch') class PlayersView(generics.ListCreateAPIView): permission_classes = (IsStaff,) # Only Staff can see player info, i.e. authorized servers queryset = Player.objects.all() serializer_class = PlayerSerializer -@method_decorator(csrf_exempt, name='dispatch') + class PlayerView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsStaff) queryset = Player.objects.all() serializer_class = PlayerSerializer -@method_decorator(csrf_exempt, name='dispatch') class ServersView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Server.objects.all() serializer_class = ServerSerializer -@method_decorator(csrf_exempt, name='dispatch') class ServerView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsSuperUserOrReadOnly,) queryset = Server.objects.all() serializer_class = ServerSerializer -@method_decorator(csrf_exempt, name='dispatch') class UserDatumView(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsSuperUser,) queryset = UserData.objects.all() serializer_class = UserDataSerializer # filter_backends = [UserDataFilterBackend] -@method_decorator(csrf_exempt, name='dispatch') class UserDataView(generics.ListCreateAPIView): permission_classes = (IsSuperUserOrAuthReadOnly,) queryset = UserData.objects.all() diff --git a/blog/__pycache__/__init__.cpython-310.pyc b/blog/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index d51ecffc97f7ce2789bcf31edc003d994a90ace9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmd1j<>g`kg6@XtX(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6w=#VRJCC_gJT zxuiHIJT=KBwG2cRXO^TE$2g@{=I5n&q!#6;7RLwV7ekbQd#45UCXAA@+ zPYe>|^Y}5&1?l89#Vr(X5!I!athe<=-K@ubQo^FDzxc-E`_mBrPa$(cZ1+eY%Q>(- z0-nbZ5l-y42TIRQ0|+^ZtDHigmMeFwjo*RNpT!6b%}BIqY*%!}4=5Ubs{jB1 diff --git a/blog/__pycache__/apps.cpython-310.pyc b/blog/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index a281df039513acbdf84a8e9252d152f36e29e4cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmYjN%}T>S5T4CONMj2gd;qVx^Z|-UZ3}uT1rJJCSklfmv?SRz+X}r2dh-E%245*x zPriaDXA+?um~Z~R`PsFDK@21xub=BDvfmt>N=U(&)L#)GpeUdesSt1n7@&Lylt#SC zG{EoylCvLTK_Z&ot#eabtvC6KGp8ab7?b)70t2Z)pl*>$3}}LE;z?oit~U*r)W6UZGrLuZ5LoiJ*S-tHE%6{rvqvd5ry{!{Q3?@B+7agCLmT zlFfL^Imw>%W`63IvM+;Kn1-CaWFipZ851G+)7lq5jZjk)5o)4qO)TPF)~R1&MAqRh zcxOQ4w>DD(q(LdRlNp?<0`|#eaov=&japzS7cBL_{}KFTX_-)P;hpo8QpHe5YzY6{ zOPeSq(3&oZ0Ika+6ty#!wnc=6#4gyBYJB+(Lt^sAEI-a96k~gM!ChSy8CC@r@DK?& z$mi1T^M#s7rrpDBs6N3ls5iLck1xvh49ElBLPH5xTm7fQ9j&IYZ_V&MjQa4AK4xOU z3^(CK72*|W1t!~3rg9;L=|SXb{I=DN~_c48&C z#z5My^KL;Nw3ghmEaZu(W7q@tP$KLpx*U8f^~xX1k|d2K=6>@W&#$vdxQoGY$zXf z*XFBSlXlRlyLBG@W!!(2 X;o@i2Bs`}%Hq>^)5@dQcxYPU%V#4vv diff --git a/blog/__pycache__/urls.cpython-310.pyc b/blog/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index e09cf358a2686307995fe10788343925a18b68cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 659 zcmYk3Jx|;~5QcZpYi!ORAta$rdkvOSB7_iJL4}Zz5@}@#8Fq5q#r9g>y^C;_KBA^2 zW&YB(srUy`s?69J6$`y(P5>Wuo3)vf17fx@0r%L{r$?Cq4*&vxKk4F(=M+1(dCe3Oc_= znn`hvTbEpydXXJ2YkSaqIdb9zWf%AGriH>n)=c@ikcMQxF)OxJB>i9L>s zxUnYx1lKqPZDwh~uvzVt| N%6G>v^#Q~y5>M@8{-u58sn2=q12D68axS5Wvvzi8c6MiW<~O^}Yqh|D@8|o!b${{= z;}2x!KL?m=(8Mo5s6k0;3`j@_j?L7(J?$;%E#PhFZR$KQLg%_cUFtnBsK?wrEA)W( z=>qTz%x4RGb{K#ppcRl*v_=K^Dy;!un`u<(B3**LYP3#YfPRrK(-Y7y(Z+_+I{5@V zGWLmbIm;;HEuzT9Cj?|2B!?dy%J87ALKD9Op=6g(W7m|%t_8hK&0U9DyDqhRWY;T9 zYK#a!SD2td3R9YUCO=!4kF3YACTkS12IgCZ)wgG|KswZ+u5|le-%rRXV~_ku3XiYA zdQUFE`m2T4)qD4Y!uu6%R|*JB;es^?N{=Mwo&`q=)^Bt4J#>b-kYZB3Ok>F+WEh?F z&tK@Iq9vM%Xbut~lC0N^o8OEWA8#<(ZmzLzlCkDYt3AjmOD`Rd->v{9e5M2}PcDq$o_6jJf zAOV+zjI$0?{-ImSiqllpBg(q*D3#G5&f*^9s`2Gu$nzoN>3B8Ix=C-u8CAAmX;&>o zQ74Ush$7`jQ5Fvvj4UC!@^cQEj<&|!f-tpw<#7gX3#lq#Cchi8!BCEse|Qw-=qRYl zFzzK8#&T<{>PJk@hud)`)QL`>Np??0`BtBGq&7LT1wr07_!+SFbZza*<}IG1hS>a` zZLP5#>_h@_*j!=bJfk-l&zXpBVfGH^HZh8uI|;ih+QYH3GZ-K!#XCT3QvO`aH*FFS zpP2W3QYEHolE5_owEwc*fVePo%H%J@q7JlYKE%v5Xa@}-%m@MBp~B179W$om?bSp-%C7%jHY3hYF$yA~#Ag^3@2S5vS8UaI7VM5_M`4qMc$; zaZ1N%j=Y3=XMtRRcHjc>;j}){vSTN}bmAv20XcpGYW2*}eQ0!vzFz#$duZ53=)=j} z>B&|(15f^OvZ+v?OgS=Mh~zZya=Q)`bM7=q;E!+wD*ihPC*`% z4Y+OA_g%gW8p<9CfU$pscsCx&?VKw|i~!Xt=;nM7?Zjz9_f1~YD^Rpg_#!aVK9ewNoyL%Mdd@Md zv#Dbrz~~d?UPFT1F?TEw;wLTwIgXhgnIXoa_JeuEI8(>V0MBXx9iKxCKM&hJ7bg5o znB{LFL4fl%5*^p_3>erIl)npPavD!v8vW0#eu%5E$ff~8c<7Y!_i>~xXi_HfBbc}f zZ7z{6CKBb(yoZ=XeAHK=9n^tHKszPWq*g-oD`c-ve9Cro+3+_&Bdowx$I^T_V437t zEP!Gxf;mqRP0E60*I{sgI(5Q7h3>h=`NuHZ0%KLEm|@OkX>by3OhwH*LfhjS3gx-A zHE*`=E7*r$LGs!EvKJ)qci~=XP1!f#iF>{s8(+YiM@BHp>#cfNr~NqV6Y8`SN2abNuB}fNP$IbtIdbNLnP!M?CRSh4?9)5Pcx$M*{ L%Z?xTR@M3&89iN0 -- 2.40.1 From 23bb4b7c397a4ed61b3ef76f9e5570a279186e87 Mon Sep 17 00:00:00 2001 From: Jukoga Date: Fri, 6 Mar 2026 12:42:26 +0100 Subject: [PATCH 6/8] Remove pycache from tracking and apply gitignore --- BH/__pycache__/__init__.cpython-310.pyc | Bin 162 -> 0 bytes BH/__pycache__/settings.cpython-310.pyc | Bin 2512 -> 0 bytes BH/__pycache__/urls.cpython-310.pyc | Bin 1200 -> 0 bytes BH/__pycache__/wsgi.cpython-310.pyc | Bin 555 -> 0 bytes .../__pycache__/0001_initial.cpython-310.pyc | Bin 1164 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 175 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 BH/__pycache__/__init__.cpython-310.pyc delete mode 100644 BH/__pycache__/settings.cpython-310.pyc delete mode 100644 BH/__pycache__/urls.cpython-310.pyc delete mode 100644 BH/__pycache__/wsgi.cpython-310.pyc delete mode 100644 blog/migrations/__pycache__/0001_initial.cpython-310.pyc delete mode 100644 blog/migrations/__pycache__/__init__.cpython-310.pyc diff --git a/BH/__pycache__/__init__.cpython-310.pyc b/BH/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index f73aae29e33cf5533d58117acd079bd931a1ab3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 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 diff --git a/BH/__pycache__/wsgi.cpython-310.pyc b/BH/__pycache__/wsgi.cpython-310.pyc deleted file mode 100644 index b9ef24bf0f51571c78b0afa554826387cc47f190..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555 zcmYjP!D<^Z5Y@^~oNk)ZL&#ZIL%SR3EtJw2r?yMu1e_8u3$n7BUCU@S%Sv(LoB}*o+`w}f!=H|dQy+Uhoqk##_1S?S9YIv<-37RcMrPd`Q3Xp6z6J@DYDx5+y zn|Ztso}j=Am@=NLSQi)?53VfBl!jN#0)%ttN_!H=5>p$=g)lk(*OX!rgNffn$MGER z9L5q#jjIBTi|=f%;_#2(1Q~aO`Y;E_n>)TGqdw|?JRJ`%_~h*BYBU~9`1wWu^QW_i z{oXLL;G8nK?RM%8=boMOnxd^=ZZt%xmmW2U74;l-2h37cXzI`pO31{mcJ=-i*%PUn z=UcnKr~Q-Uab;%BkiWW4Wq!1_a6CskH7aQIT)k?w%>k!GXK331TUQM zeq$)y!mbZ+5P=|dkP$yqKhrvFSjLF6g>|QivZ(21T@rj12qrqe2BHH|75@@uu^^|x zFnWnN!QCOTu?Azxw$MXr)21v`Zc5o|8#Piut!HlE`>ltYFSuX ziepQ^9uJxA=Sw5`OhIly*xo{wO|Dk_M_AcJgDUg7djtjKafYvL)zqzcnxh~&TUU19$!d}sA%d6nCHvd*a+R7ONE(AWXmx?(7(sq`nthJ2|S{}<5Y}m?&Ha(UK%A&o4>{2ncu_pkF z)pif}PY?IUM>drU*c9-eff`{9et7-;`18pg`kg6@XtX(0MBh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o11##VRJCC_gJT zxuiHIJT=KBwG2cRXO^TE$2g@{=I5n&q!#6;7RLwV7ekbQ?&pg5-bb=#}6%a -- 2.40.1 From efc5d9e286be13b0f4c5d7b1fe84eafd0be76fae Mon Sep 17 00:00:00 2001 From: Jukoga Date: Fri, 6 Mar 2026 12:43:03 +0100 Subject: [PATCH 7/8] Remove pycache from tracking and apply gitignore --- .../__pycache__/markdown_extras.cpython-310.pyc | Bin 530 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 blog/templatetags/__pycache__/markdown_extras.cpython-310.pyc diff --git a/blog/templatetags/__pycache__/markdown_extras.cpython-310.pyc b/blog/templatetags/__pycache__/markdown_extras.cpython-310.pyc deleted file mode 100644 index bad437ccd839b3e0857be07d793506ea05fd7e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 530 zcmYjNy-or_5Z<5TI0zVO3$1DH0gN$5DJ%>ju`oF=AqP8L4)<=!?t)@0Ot3T7wov*? z*IM}sR?b3BnPk45+4=cqMzz~bg7WtAF*&4!d^u-dJao=cjRQdhl_aMTrOsxOvEtmukHp5Qm6>wjYx(xqi!A)m>_0@^KObylR4Oj^+W zF;4L(&UO=AqM8nZB~$v0Q>0X|cZMB#|LHhS^u16IMF@`;3X`eAgcB&nAckWl97Xd# z(q$#fMHy5@7_BW5IfqZ817!HQ>z%{{t)?)xCccGH4;Jn*nFSMHz)}_B3bX<<94NC( zaj|$LRT@`o*(5b_MKMHnotSX8)IKsa+%gQI!?%97QTk$<6sgkgw>;W8Vbv=XFiGap z?ha%$$E0ncuDSI3bvDw8UY3D|G&6X^(%+?S_t^tSTn4AP5_1V>?zZLtp+#CWU;+0T HqaFGSsws;( -- 2.40.1 From c62d0deb33676f8902447f12c6107c9e534b1ac8 Mon Sep 17 00:00:00 2001 From: Jukoga Date: Sun, 8 Mar 2026 12:54:11 +0100 Subject: [PATCH 8/8] Refactor UserData admin interface; enhance user registration forms and validation; update Dockerfile for static files collection --- BH/settings.py | 6 +-- Dockerfile | 4 +- .../0002_alter_blog_id_alter_post_id.py | 23 --------- templates/base.html | 3 +- templates/blog/home.html | 1 - templates/users/login.html | 1 - templates/users/logout.html | 1 - templates/users/register.html | 1 - users/__init__.py | 0 users/admin.py | 8 ++- users/forms.py | 14 +++++- users/models.py | 9 ++-- users/serializers.py | 4 +- users/views.py | 50 ++----------------- 14 files changed, 36 insertions(+), 89 deletions(-) delete mode 100644 blog/migrations/0002_alter_blog_id_alter_post_id.py create mode 100644 users/__init__.py diff --git a/BH/settings.py b/BH/settings.py index 95d5d97..9179c00 100644 --- a/BH/settings.py +++ b/BH/settings.py @@ -25,11 +25,9 @@ DEFAULT_AUTO_FIELD='django.db.models.AutoField' # Load the Env load_dotenv() -# SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = os.getenv('SECRET_KEY') -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = False +DEBUG = os.environ.get('DEBUG', 'False') == 'True' ALLOWED_HOSTS = ['localhost', '127.0.0.1', 'beyond-heroes.com', 'www.beyond-heroes.com'] @@ -40,7 +38,7 @@ INSTALLED_APPS = [ 'crispy_forms', 'crispy_bootstrap4', 'blog.apps.BlogConfig', - 'users.apps.UsersConfig', + 'users', 'api.apps.APIConfig', 'django.contrib.admin', 'django.contrib.auth', diff --git a/Dockerfile b/Dockerfile index 3e9c5a0..71405da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,5 +30,5 @@ EXPOSE 3030 # Define environment variable for Gunicorn ENV GUNICORN_CMD_ARGS="--bind 0.0.0.0:3030" -# Run Gunicorn server with your Django application -CMD ["gunicorn", "BH.wsgi:application"] +# Collect static files and run Gunicorn +CMD ["sh", "-c", "python manage.py collectstatic --noinput && gunicorn BH.wsgi:application"] diff --git a/blog/migrations/0002_alter_blog_id_alter_post_id.py b/blog/migrations/0002_alter_blog_id_alter_post_id.py deleted file mode 100644 index 2bdeec9..0000000 --- a/blog/migrations/0002_alter_blog_id_alter_post_id.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.2.9 on 2026-02-19 10:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('blog', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='blog', - name='id', - field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), - ), - migrations.AlterField( - model_name='post', - name='id', - field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), - ), - ] diff --git a/templates/base.html b/templates/base.html index b67ce7c..2ce3abc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -10,6 +10,7 @@ +