From 5e550ef100f0f51589b2d7f59648a75fd425bf1e Mon Sep 17 00:00:00 2001 From: DaniloDiasLTDA Date: Wed, 18 Jun 2025 16:26:40 -0300 Subject: [PATCH 1/4] feat: setup app name --- django_blog/Makefile | 2 +- django_blog/{project => danilodias_dev}/__init__.py | 0 django_blog/{project => danilodias_dev}/asgi.py | 4 +++- django_blog/{project => danilodias_dev}/settings.py | 6 ++++-- django_blog/{project => danilodias_dev}/urls.py | 0 django_blog/{project => danilodias_dev}/wsgi.py | 4 +++- django_blog/manage.py | 4 +++- 7 files changed, 14 insertions(+), 6 deletions(-) rename django_blog/{project => danilodias_dev}/__init__.py (100%) rename django_blog/{project => danilodias_dev}/asgi.py (72%) rename django_blog/{project => danilodias_dev}/settings.py (96%) rename django_blog/{project => danilodias_dev}/urls.py (100%) rename django_blog/{project => danilodias_dev}/wsgi.py (72%) diff --git a/django_blog/Makefile b/django_blog/Makefile index ca4d437..bb3a7cf 100644 --- a/django_blog/Makefile +++ b/django_blog/Makefile @@ -10,7 +10,7 @@ init: pip install -r requirements.txt startproject: - python -m django startproject project + python -m django startproject app run: $(PYTHON) manage.py runserver diff --git a/django_blog/project/__init__.py b/django_blog/danilodias_dev/__init__.py similarity index 100% rename from django_blog/project/__init__.py rename to django_blog/danilodias_dev/__init__.py diff --git a/django_blog/project/asgi.py b/django_blog/danilodias_dev/asgi.py similarity index 72% rename from django_blog/project/asgi.py rename to django_blog/danilodias_dev/asgi.py index 3d66fe3..3a3736c 100644 --- a/django_blog/project/asgi.py +++ b/django_blog/danilodias_dev/asgi.py @@ -9,8 +9,10 @@ import os +from danilodias_dev.settings import APP_SETTINGS_PAT + from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', APP_SETTINGS_PAT) application = get_asgi_application() diff --git a/django_blog/project/settings.py b/django_blog/danilodias_dev/settings.py similarity index 96% rename from django_blog/project/settings.py rename to django_blog/danilodias_dev/settings.py index b549d76..6043696 100644 --- a/django_blog/project/settings.py +++ b/django_blog/danilodias_dev/settings.py @@ -9,7 +9,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.2/ref/settings/ """ - +import os from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. @@ -23,7 +23,7 @@ SECRET_KEY = 'django-insecure-@--^j$fso41z4o2ulo!!gx$0bl48yra+j&ihk0_&pz9xrk7^qs' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = bool(int(os.getenv('DEBUG', 0))) #Buscar por variaveis de ambiente ALLOWED_HOSTS = [] @@ -120,3 +120,5 @@ # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +APP_SETTINGS_PATH = 'danilodias_dev.settings' diff --git a/django_blog/project/urls.py b/django_blog/danilodias_dev/urls.py similarity index 100% rename from django_blog/project/urls.py rename to django_blog/danilodias_dev/urls.py diff --git a/django_blog/project/wsgi.py b/django_blog/danilodias_dev/wsgi.py similarity index 72% rename from django_blog/project/wsgi.py rename to django_blog/danilodias_dev/wsgi.py index e896f59..92abb13 100644 --- a/django_blog/project/wsgi.py +++ b/django_blog/danilodias_dev/wsgi.py @@ -9,8 +9,10 @@ import os +from danilodias_dev.settings import APP_SETTINGS_PATH + from django.core.wsgi import get_wsgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', APP_SETTINGS_PATH) application = get_wsgi_application() diff --git a/django_blog/manage.py b/django_blog/manage.py index 2c49f3a..25c0f11 100644 --- a/django_blog/manage.py +++ b/django_blog/manage.py @@ -3,10 +3,12 @@ import os import sys +from danilodias_dev.settings import APP_SETTINGS_PATH + def main(): """Run administrative tasks.""" - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') + os.environ.setdefault('DJANGO_SETTINGS_MODULE', APP_SETTINGS_PATH) try: from django.core.management import execute_from_command_line except ImportError as exc: From 8a192d2e858e367e9165c5a47cab9346d84f8104 Mon Sep 17 00:00:00 2001 From: DaniloDiasLTDA Date: Wed, 18 Jun 2025 17:14:04 -0300 Subject: [PATCH 2/4] feat: create home app --- django_blog/Makefile | 3 ++- django_blog/{danilodias_dev => danilodias}/__init__.py | 0 django_blog/{danilodias_dev => danilodias}/asgi.py | 2 +- django_blog/{danilodias_dev => danilodias}/settings.py | 10 ++++++---- django_blog/{danilodias_dev => danilodias}/urls.py | 4 +++- django_blog/{danilodias_dev => danilodias}/wsgi.py | 2 +- django_blog/home/__init__.py | 0 django_blog/home/admin.py | 3 +++ django_blog/home/apps.py | 6 ++++++ django_blog/home/migrations/__init__.py | 0 django_blog/home/models.py | 3 +++ django_blog/home/tests.py | 3 +++ django_blog/home/urls.py | 7 +++++++ django_blog/home/views.py | 7 +++++++ django_blog/manage.py | 2 +- 15 files changed, 43 insertions(+), 9 deletions(-) rename django_blog/{danilodias_dev => danilodias}/__init__.py (100%) rename django_blog/{danilodias_dev => danilodias}/asgi.py (88%) rename django_blog/{danilodias_dev => danilodias}/settings.py (94%) rename django_blog/{danilodias_dev => danilodias}/urls.py (90%) rename django_blog/{danilodias_dev => danilodias}/wsgi.py (87%) create mode 100644 django_blog/home/__init__.py create mode 100644 django_blog/home/admin.py create mode 100644 django_blog/home/apps.py create mode 100644 django_blog/home/migrations/__init__.py create mode 100644 django_blog/home/models.py create mode 100644 django_blog/home/tests.py create mode 100644 django_blog/home/urls.py create mode 100644 django_blog/home/views.py diff --git a/django_blog/Makefile b/django_blog/Makefile index bb3a7cf..b874896 100644 --- a/django_blog/Makefile +++ b/django_blog/Makefile @@ -9,6 +9,7 @@ init: $(PYTHON) -m pip install --upgrade pip pip install -r requirements.txt +# Cria a estrutura do projeto startproject: python -m django startproject app @@ -18,7 +19,7 @@ run: test: $(PYTHON) manage.py test $(app-name) -# Cria a estrutura do projeto +# Criar uma django app startapp: @echo "Creating Django app: $(app-name)" $(PYTHON) manage.py startapp $(app-name) diff --git a/django_blog/danilodias_dev/__init__.py b/django_blog/danilodias/__init__.py similarity index 100% rename from django_blog/danilodias_dev/__init__.py rename to django_blog/danilodias/__init__.py diff --git a/django_blog/danilodias_dev/asgi.py b/django_blog/danilodias/asgi.py similarity index 88% rename from django_blog/danilodias_dev/asgi.py rename to django_blog/danilodias/asgi.py index 3a3736c..757100f 100644 --- a/django_blog/danilodias_dev/asgi.py +++ b/django_blog/danilodias/asgi.py @@ -9,7 +9,7 @@ import os -from danilodias_dev.settings import APP_SETTINGS_PAT +from danilodias.settings import APP_SETTINGS_PAT from django.core.asgi import get_asgi_application diff --git a/django_blog/danilodias_dev/settings.py b/django_blog/danilodias/settings.py similarity index 94% rename from django_blog/danilodias_dev/settings.py rename to django_blog/danilodias/settings.py index 6043696..fbd0ce1 100644 --- a/django_blog/danilodias_dev/settings.py +++ b/django_blog/danilodias/settings.py @@ -12,9 +12,11 @@ import os from pathlib import Path + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent +APP_NAME = 'danilodias' # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ @@ -25,7 +27,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = bool(int(os.getenv('DEBUG', 0))) #Buscar por variaveis de ambiente -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ['127.0.0.1', 'localhost'] # Application definition @@ -49,7 +51,7 @@ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -ROOT_URLCONF = 'project.urls' +ROOT_URLCONF = f'{APP_NAME}.urls' TEMPLATES = [ { @@ -66,7 +68,7 @@ }, ] -WSGI_APPLICATION = 'project.wsgi.application' +WSGI_APPLICATION = f'{APP_NAME}.wsgi.application' # Database @@ -121,4 +123,4 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -APP_SETTINGS_PATH = 'danilodias_dev.settings' +APP_SETTINGS_PATH = f'{APP_NAME}.settings' diff --git a/django_blog/danilodias_dev/urls.py b/django_blog/danilodias/urls.py similarity index 90% rename from django_blog/danilodias_dev/urls.py rename to django_blog/danilodias/urls.py index d1d4e61..71e6e68 100644 --- a/django_blog/danilodias_dev/urls.py +++ b/django_blog/danilodias/urls.py @@ -15,8 +15,10 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include + urlpatterns = [ path('admin/', admin.site.urls), + path('', include('home.urls')) ] diff --git a/django_blog/danilodias_dev/wsgi.py b/django_blog/danilodias/wsgi.py similarity index 87% rename from django_blog/danilodias_dev/wsgi.py rename to django_blog/danilodias/wsgi.py index 92abb13..2f7c768 100644 --- a/django_blog/danilodias_dev/wsgi.py +++ b/django_blog/danilodias/wsgi.py @@ -9,7 +9,7 @@ import os -from danilodias_dev.settings import APP_SETTINGS_PATH +from danilodias.settings import APP_SETTINGS_PATH from django.core.wsgi import get_wsgi_application diff --git a/django_blog/home/__init__.py b/django_blog/home/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_blog/home/admin.py b/django_blog/home/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/django_blog/home/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/django_blog/home/apps.py b/django_blog/home/apps.py new file mode 100644 index 0000000..e5ea0af --- /dev/null +++ b/django_blog/home/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HomeConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'home' diff --git a/django_blog/home/migrations/__init__.py b/django_blog/home/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django_blog/home/models.py b/django_blog/home/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/django_blog/home/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/django_blog/home/tests.py b/django_blog/home/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/django_blog/home/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/django_blog/home/urls.py b/django_blog/home/urls.py new file mode 100644 index 0000000..a9d7f56 --- /dev/null +++ b/django_blog/home/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from . import views + +urlpatterns = [ + path("", views.index, name="index"), +] \ No newline at end of file diff --git a/django_blog/home/views.py b/django_blog/home/views.py new file mode 100644 index 0000000..97a39ed --- /dev/null +++ b/django_blog/home/views.py @@ -0,0 +1,7 @@ +from django.shortcuts import render + +from django.http import HttpResponse + + +def index(request): + return HttpResponse("Copyright © 2025 Danilo Dias .Dev - All rights reserved.") diff --git a/django_blog/manage.py b/django_blog/manage.py index 25c0f11..275952c 100644 --- a/django_blog/manage.py +++ b/django_blog/manage.py @@ -3,7 +3,7 @@ import os import sys -from danilodias_dev.settings import APP_SETTINGS_PATH +from danilodias.settings import APP_SETTINGS_PATH def main(): From 020f91cd3749ea005b09d9c6249a556daae85c4d Mon Sep 17 00:00:00 2001 From: DaniloDiasLTDA Date: Wed, 18 Jun 2025 17:16:56 -0300 Subject: [PATCH 3/4] chore: order settings --- django_blog/danilodias/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_blog/danilodias/settings.py b/django_blog/danilodias/settings.py index fbd0ce1..281014f 100644 --- a/django_blog/danilodias/settings.py +++ b/django_blog/danilodias/settings.py @@ -13,11 +13,11 @@ from pathlib import Path +APP_NAME = 'danilodias' + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent -APP_NAME = 'danilodias' - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ From 5d53fa25a66eaf195520ce68de51e45d9388d00d Mon Sep 17 00:00:00 2001 From: DaniloDiasLTDA Date: Wed, 18 Jun 2025 18:39:11 -0300 Subject: [PATCH 4/4] feat: create models --- django_blog/Makefile | 6 +++ django_blog/danilodias/settings.py | 6 ++- django_blog/danilodias/urls.py | 6 +-- django_blog/danilodias/wsgi.py | 2 +- django_blog/home/migrations/0001_initial.py | 44 +++++++++++++++++++++ django_blog/home/models.py | 33 +++++++++++++++- django_blog/home/urls.py | 4 +- django_blog/home/views.py | 2 +- django_blog/manage.py | 7 ++-- django_blog/requirements-dev.txt | 3 ++ django_blog/ruff.toml | 20 ++++++++++ django_blog/validators/date.py | 7 ++++ django_study/announcements/models.py | 6 +-- 13 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 django_blog/home/migrations/0001_initial.py create mode 100644 django_blog/requirements-dev.txt create mode 100644 django_blog/ruff.toml create mode 100644 django_blog/validators/date.py diff --git a/django_blog/Makefile b/django_blog/Makefile index b874896..a28503a 100644 --- a/django_blog/Makefile +++ b/django_blog/Makefile @@ -9,6 +9,12 @@ init: $(PYTHON) -m pip install --upgrade pip pip install -r requirements.txt +init-dev: init + pip install -r requirements-dev.txt + +fmt: + ruff format . + # Cria a estrutura do projeto startproject: python -m django startproject app diff --git a/django_blog/danilodias/settings.py b/django_blog/danilodias/settings.py index 281014f..0c83173 100644 --- a/django_blog/danilodias/settings.py +++ b/django_blog/danilodias/settings.py @@ -9,6 +9,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.2/ref/settings/ """ + import os from pathlib import Path @@ -25,7 +26,7 @@ SECRET_KEY = 'django-insecure-@--^j$fso41z4o2ulo!!gx$0bl48yra+j&ihk0_&pz9xrk7^qs' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = bool(int(os.getenv('DEBUG', 0))) #Buscar por variaveis de ambiente +DEBUG = bool(int(os.getenv('DEBUG', 0))) # Buscar por variaveis de ambiente ALLOWED_HOSTS = ['127.0.0.1', 'localhost'] @@ -39,6 +40,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'home.apps.HomeConfig', ] MIDDLEWARE = [ @@ -106,7 +108,7 @@ LANGUAGE_CODE = 'en-us' -TIME_ZONE = 'UTC' +TIME_ZONE = 'America/Sao_Paulo' USE_I18N = True diff --git a/django_blog/danilodias/urls.py b/django_blog/danilodias/urls.py index 71e6e68..9104a35 100644 --- a/django_blog/danilodias/urls.py +++ b/django_blog/danilodias/urls.py @@ -14,11 +14,9 @@ 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 path, include -urlpatterns = [ - path('admin/', admin.site.urls), - path('', include('home.urls')) -] +urlpatterns = [path('admin/', admin.site.urls), path('', include('home.urls'))] diff --git a/django_blog/danilodias/wsgi.py b/django_blog/danilodias/wsgi.py index 2f7c768..5f792a9 100644 --- a/django_blog/danilodias/wsgi.py +++ b/django_blog/danilodias/wsgi.py @@ -9,7 +9,7 @@ import os -from danilodias.settings import APP_SETTINGS_PATH +from danilodias.settings import APP_SETTINGS_PATH from django.core.wsgi import get_wsgi_application diff --git a/django_blog/home/migrations/0001_initial.py b/django_blog/home/migrations/0001_initial.py new file mode 100644 index 0000000..1729f9d --- /dev/null +++ b/django_blog/home/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 5.2.3 on 2025-06-18 20:41 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name='Year', + fields=[ + ( + 'id', + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID', + ), + ), + ( + 'name', + models.CharField( + default=2025, + max_length=4, + unique=True, + validators=[ + django.core.validators.RegexValidator( + code='invalid_year', + message='O ano deve conter exatamente 4 dígitos numéricos.', + regex='^\\d{4}$', + ) + ], + ), + ), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(blank=True, null=True)), + ], + ), + ] diff --git a/django_blog/home/models.py b/django_blog/home/models.py index 71a8362..73c87df 100644 --- a/django_blog/home/models.py +++ b/django_blog/home/models.py @@ -1,3 +1,34 @@ +from datetime import datetime + from django.db import models +from django.utils import timezone + +from validators.date import year_validator + + +class BaseModel(models.Model): + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(null=True, blank=True) + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + if self.pk: + self.updated_at = timezone.now() + super().save(*args, **kwargs) + + +class Year(BaseModel): + name = models.CharField( + max_length=4, + unique=True, + validators=[year_validator], # Aplica o validador + default=datetime.now().year, # Define o ano atual como valor padrão + ) + + def __str__(self): + return str(self.name) -# Create your models here. + class Meta: + app_label = 'home' diff --git a/django_blog/home/urls.py b/django_blog/home/urls.py index a9d7f56..88a9cac 100644 --- a/django_blog/home/urls.py +++ b/django_blog/home/urls.py @@ -3,5 +3,5 @@ from . import views urlpatterns = [ - path("", views.index, name="index"), -] \ No newline at end of file + path('', views.index, name='index'), +] diff --git a/django_blog/home/views.py b/django_blog/home/views.py index 97a39ed..ce25df6 100644 --- a/django_blog/home/views.py +++ b/django_blog/home/views.py @@ -4,4 +4,4 @@ def index(request): - return HttpResponse("Copyright © 2025 Danilo Dias .Dev - All rights reserved.") + return HttpResponse('Copyright © 2025 Danilo Dias .Dev - All rights reserved.') diff --git a/django_blog/manage.py b/django_blog/manage.py index 275952c..11bf862 100644 --- a/django_blog/manage.py +++ b/django_blog/manage.py @@ -1,9 +1,10 @@ #!/usr/bin/env python """Django's command-line utility for administrative tasks.""" + import os import sys -from danilodias.settings import APP_SETTINGS_PATH +from danilodias.settings import APP_SETTINGS_PATH def main(): @@ -14,8 +15,8 @@ def main(): except ImportError as exc: raise ImportError( "Couldn't import Django. Are you sure it's installed and " - "available on your PYTHONPATH environment variable? Did you " - "forget to activate a virtual environment?" + 'available on your PYTHONPATH environment variable? Did you ' + 'forget to activate a virtual environment?' ) from exc execute_from_command_line(sys.argv) diff --git a/django_blog/requirements-dev.txt b/django_blog/requirements-dev.txt new file mode 100644 index 0000000..781b92d --- /dev/null +++ b/django_blog/requirements-dev.txt @@ -0,0 +1,3 @@ +-r requirements.txt + +ruff>=0.12.0 \ No newline at end of file diff --git a/django_blog/ruff.toml b/django_blog/ruff.toml new file mode 100644 index 0000000..2c821e6 --- /dev/null +++ b/django_blog/ruff.toml @@ -0,0 +1,20 @@ +exclude = [] + +line-length = 120 +indent-width = 4 + +target-version = "py313" + +[lint] +select = ["E", "F", "B", "I", "UP", "N", "ANN", "ERA"] +ignore = ["E501"] +fixable = ["ALL"] +unfixable = [] + +[format] +quote-style = "single" +indent-style = "space" +skip-magic-trailing-comma = false +line-ending = "auto" +docstring-code-format = true +docstring-code-line-length = "dynamic" diff --git a/django_blog/validators/date.py b/django_blog/validators/date.py new file mode 100644 index 0000000..e57a2e8 --- /dev/null +++ b/django_blog/validators/date.py @@ -0,0 +1,7 @@ +from django.core.validators import RegexValidator + +year_validator = RegexValidator( + regex=r'^\d{4}$', + message='O ano deve conter exatamente 4 dígitos numéricos.', + code='invalid_year', +) diff --git a/django_study/announcements/models.py b/django_study/announcements/models.py index 074ac45..999e7cc 100644 --- a/django_study/announcements/models.py +++ b/django_study/announcements/models.py @@ -4,7 +4,6 @@ from django.core.validators import MinValueValidator -# Create your models here. class BaseModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(null=True, blank=True) @@ -25,7 +24,7 @@ class User(BaseModel): password = models.CharField(max_length=50) class Meta: - app_label = 'announcements' # + app_label = 'announcements' class Announcement(BaseModel): @@ -35,6 +34,7 @@ class Announcement(BaseModel): value = models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(0)]) class Meta: - app_label = 'announcements' # + app_label = 'announcements' +