From 2792e4c4432317f0ed8e62530c67e9830feb60ef Mon Sep 17 00:00:00 2001 From: Chalaczi Date: Tue, 3 Mar 2026 13:18:33 +0100 Subject: [PATCH] Add projects app, models and templates --- core/settings.py | 115 ++++++++++---------------- core/urls.py | 23 ++---- db.sqlite3 | Bin 131072 -> 147456 bytes projects/__init__.py | 0 projects/admin.py | 5 ++ projects/apps.py | 5 ++ projects/migrations/0001_initial.py | 38 +++++++++ projects/migrations/__init__.py | 0 projects/models.py | 40 +++++++++ projects/tests.py | 3 + projects/urls.py | 6 ++ projects/views.py | 14 ++++ templates/projects/projects_list.html | 29 +++++++ 13 files changed, 189 insertions(+), 89 deletions(-) create mode 100644 projects/__init__.py create mode 100644 projects/admin.py create mode 100644 projects/apps.py create mode 100644 projects/migrations/0001_initial.py create mode 100644 projects/migrations/__init__.py create mode 100644 projects/models.py create mode 100644 projects/tests.py create mode 100644 projects/urls.py create mode 100644 projects/views.py create mode 100644 templates/projects/projects_list.html diff --git a/core/settings.py b/core/settings.py index 6f62377d..0a40a8fc 100644 --- a/core/settings.py +++ b/core/settings.py @@ -1,47 +1,39 @@ -""" -Django settings for core project. - -Generated by 'django-admin startproject' using Django 4.1.2. - -For more information on this file, see -https://docs.djangoproject.com/en/4.1/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/4.1/ref/settings/ -""" - -import os, random, string +import os +import random +import string from pathlib import Path + from dotenv import load_dotenv from str2bool import str2bool -load_dotenv() # take environment variables from .env. +load_dotenv() # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ - # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = os.environ.get('SECRET_KEY') if not SECRET_KEY: - SECRET_KEY = ''.join(random.choice( string.ascii_lowercase ) for i in range( 32 )) + SECRET_KEY = ''.join( + random.choice(string.ascii_lowercase) for i in range(32) + ) -# Enable/Disable DEBUG Mode DEBUG = str2bool(os.environ.get('DEBUG')) -#print(' DEBUG -> ' + str(DEBUG) ) -# Docker HOST ALLOWED_HOSTS = ['*'] -# Add here your deployment HOSTS -CSRF_TRUSTED_ORIGINS = ['http://localhost:8000', 'http://localhost:5085', 'http://127.0.0.1:8000', 'http://127.0.0.1:5085'] +CSRF_TRUSTED_ORIGINS = [ + 'http://localhost:8000', + 'http://localhost:5085', + 'http://127.0.0.1:8000', + 'http://127.0.0.1:5085', +] RENDER_EXTERNAL_HOSTNAME = os.environ.get('RENDER_EXTERNAL_HOSTNAME') -if RENDER_EXTERNAL_HOSTNAME: +if RENDER_EXTERNAL_HOSTNAME: ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME) + # Application definition INSTALLED_APPS = [ @@ -52,8 +44,12 @@ "django.contrib.messages", "django.contrib.staticfiles", - 'theme_pixel', + # UI & Theme Apps + "theme_pixel", "home", + + # Custom Apps + "projects", ] MIDDLEWARE = [ @@ -69,12 +65,12 @@ ROOT_URLCONF = "core.urls" -HOME_TEMPLATES = os.path.join(BASE_DIR, 'templates') +TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates') TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [HOME_TEMPLATES], + "DIRS": [TEMPLATES_DIR], "APP_DIRS": True, "OPTIONS": { "context_processors": [ @@ -91,78 +87,55 @@ # Database -# https://docs.djangoproject.com/en/4.1/ref/settings/#databases - -DB_ENGINE = os.getenv('DB_ENGINE' , None) -DB_USERNAME = os.getenv('DB_USERNAME' , None) -DB_PASS = os.getenv('DB_PASS' , None) -DB_HOST = os.getenv('DB_HOST' , None) -DB_PORT = os.getenv('DB_PORT' , None) -DB_NAME = os.getenv('DB_NAME' , None) - -if DB_ENGINE and DB_NAME and DB_USERNAME: - DATABASES = { - 'default': { - 'ENGINE' : 'django.db.backends.' + DB_ENGINE, - 'NAME' : DB_NAME, - 'USER' : DB_USERNAME, - 'PASSWORD': DB_PASS, - 'HOST' : DB_HOST, - 'PORT' : DB_PORT, - }, - } -else: - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': 'db.sqlite3', - } + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', } +} + # Password validation -# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + "NAME": "django.contrib.auth.password_validation." + "UserAttributeSimilarityValidator", }, { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + "NAME": "django.contrib.auth.password_validation." + "MinimumLengthValidator", }, { - "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + "NAME": "django.contrib.auth.password_validation." + "CommonPasswordValidator", }, { - "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + "NAME": "django.contrib.auth.password_validation." + "NumericPasswordValidator", }, ] # Internationalization -# https://docs.djangoproject.com/en/4.1/topics/i18n/ - -LANGUAGE_CODE = "en-us" - -TIME_ZONE = "UTC" +LANGUAGE_CODE = "pl-pl" +TIME_ZONE = "Europe/Warsaw" USE_I18N = True - USE_TZ = True # Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') - -#if not DEBUG: -# STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' - -# Default primary key field type -# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, "static"), +] DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" LOGIN_REDIRECT_URL = '/' +LOGOUT_REDIRECT_URL = '/login/' EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' diff --git a/core/urls.py b/core/urls.py index 1e6b5a80..c5263488 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,23 +1,10 @@ -"""core URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/4.1/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) -""" from django.contrib import admin from django.urls import include, path urlpatterns = [ + path('admin/', admin.site.urls), path('', include('home.urls')), - path("admin/", admin.site.urls), - path("", include('theme_pixel.urls')) -] + path('', include('theme_pixel.urls')), + # To jest kluczowa linia dla Twojej nowej aplikacji: + path('', include('projects.urls')), +] \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index e384063438693f0c5d54c091073df72b79a1c4c1..dd119841c0fe11daaa263e7d1065aa8f8d8606fd 100644 GIT binary patch delta 2893 zcmai0Yi!%r73L*nld?=**-C8KiepN49-3o^)Pu6TWVLK7iEY`kBfrw1RVb0RXiJo$ zmmfhPyG6Gl{;>o?;bQ%<4%nXoE3j7B1Z*wPWdpiy!_pRQu&f(a1lWphX!c_*f~_5} zD^Zedbwvg0lJ}hNp7Wh^c+chbHnqL2y=7{#Vi?wo{?*?%ZlAF?Sh0cZ?#to}kTTIo zVbq!Oq~QdvGZi?)$4ySVu>tEk;YlRpt5P_fVp*08%8Hzpg{Y0S@%^kFT@1$!ar_X= z5Ab%E!_F3FOs{C#zKc=Ng~5-Y3;rBt;V%3U48f^_ndyePBRJ6y#8p9Ai3bHSCM&^c zd<8c)6aCt%t6=4!RY&yg3&T-aQqo2Z(FcS~IucAs$(Wo<$#I3DwS<`}3s;iyOai`( zwQ9@LOiD_YLZh3AZgo{tNrbl(gdOC6(QIs_kou@LfB)>s4r3E~reFwz58-d&AK`28 zMYxWL?;_$8(0WAEWdc=-l{;nBbam8(Dnl~A``9MI=+5QIVb0Jz+}x@AME8#F$GUIp zuIbL9+Qqq`O8ck^ zqm!!Scn5-+tt4U)+{cvosI$T~-wz0ap`Xo@Gn_%Mr~gC$jeeKDL%&2nPd|&Qa-Pn2 zKiQBwlt$)=23SE|*1A>U;S?Qj(SROM%11RFU1iC^@Q)ca;1oC?imz@R; zFoOf3bQHRu{41bv{hJt+^=~4!ujz9;T{w;HocCyt(zI6Vp%bAsaoHA3MFg9Z@8!`R zW7*!-l(G?z2^+qI&t>yp-&zjM&Mn4!*GJjZ$Slvk>I^@DY4i zXh}SPT8cOdN{jHqqa1B$1p4tayFXA+h!WX<}nx)$8@I%bwZGQgGB38JlD;OoTJp@YLfMM`DSKiTHf_`of^( z5)z)Q7|bq9%Y1Cy#wBG=kte)-Y%7&XvYE}LsWIN+ijQR%ZG3KPYiU}H29(5-+j}vT zO}V^VgV{(h!p?{M3!xQOy3CDb$JdueHz&N4t0Vmx-ZveJMW)s!1Af;9ac;{o4x|&c<--5k8#FX}{lJ?5Bh9MZ} z&696&1{jAj48tejBAkVj(2Mf_Up?DE06;P2vAaATFOOZNkvvu&P35t(Ja!Z^fBDWe z3j}Xquvh<%_PxeC^m_Bn#v=`jn&)(nw2x6<-8tgd;Em$RVeoxW{BRZA#b18=3|_o* z0XPAU&E)@0`icn!+yce-#=#sgwzZqhU}r5YgrZWV0q^}J23{o$Msm+H3~m*7eIRS( znm)u@v8!0qIqeUrKU1xZe@9MZ_#FQeO3$d9nny2tJ#$`W&NJfkGL|}R-qSpqFG2$uj>i&$vYCGg zcJAF1!7*Sh{_7f;!}qR)fwTB}7@Q(C7={lQ|FH_r;kg}ylWh0*gB?y*L}{aDwek=w zohm_D47xb?GUpb>dO&Z5)%f(7cj*ADFI#V6{L=?uxeCt0oVHY4S*$y44zfLfIJy5n zC$))|ScOHmixZsAdR9GO!K!8;SJC*kXO=Yj(1|zaM;)JY28}x}JvROG>tH zJU`ZKYe>uKs8lN0iYTSRNjZ^5XTOC>OB-os+CRrk&-;957>g(gVpLWn3nL0?>7XW+ z7SfrNg~29r=-NoN^}sEzBU95ehlx!-@sSl_ux(Ru_U0a zJr1o#N`rNos=h1tR`gDGbyS5FJ~!`zEkxl427d`}p!O1nxeK@!gJ-pU0C>2Oj2K@R zm{d9$S2mf&#l@>PEa=FSM9UC!ZM@TI`{@TjgU$>10D}(@uRp-kU4%zl_4dU!SxN|i_c3@Mq3=TO z1ZcoIXpic6RX}G@Oh$E!rq<*^_wY(gkfQ@=8>`FiVelSW_B-e}4Jhm^Z9b|6UkF|G p?d-R6GI~pJwJ(2;!Ov0U{s~)LSkE)CAQ2=qDXSdv`lD)AicD$IqFu

9@B*Mc6l zNbMqneCQ87*jsvu`=G({MJPy%dN8Q=684Ac!3PnFx?3pp{eg4N?>pyrzTeR_QPYIc zstOMw#B1I4b#QD~W0{BS?(UfCnLt5tSb)&_N*W4e4F2+f35$DM| zAZmiE=Sr&NvN32XntOwu+*k~@U~!V+>-+qCiD;XdkHHS!oDaYPlWRT>GiKXS7y*zB sDEv8bdz6(q%n + + + Moje Projekty + + + +

+

Lista Projektów Freelancera

+
+ {% for project in projects %} +
+
+
+
{{ project.title }}
+
Klient: {{ project.client.name }}
+

{{ project.description }}

+ {{ project.get_status_display }} +
+
+
+ {% empty %} +

Brak projektów. Dodaj je w panelu admina!

+ {% endfor %} +
+ Przejdź do Admina +
+ +