Problemas resolvidos
Some checks failed
Creates a docker image for production / Deploy (push) Has been cancelled
Creates a docker image for production / Build the docker image (push) Has been cancelled
Build / Code quality (push) Has been cancelled

This commit is contained in:
2025-02-05 10:04:42 -03:00
parent f3e0e60048
commit 8bcc4e4373
8 changed files with 61 additions and 30 deletions

View File

@@ -7,8 +7,6 @@ help:
@echo "⭐️ help : Exibe esta mensagem" @echo "⭐️ help : Exibe esta mensagem"
@echo "⭐️ run : Executa a aplicação fora do docker" @echo "⭐️ run : Executa a aplicação fora do docker"
@echo "⭐️ run-worker : Executa Celery" @echo "⭐️ run-worker : Executa Celery"
@echo "⭐️ blue : Executa blue"
@echo "⭐️ isort : Executa isort"
@echo "⭐️ docker-run : Levanta toda a aplicação utilizando Docker" @echo "⭐️ docker-run : Levanta toda a aplicação utilizando Docker"
@echo "⭐️ docker-run-app : Levanta apenas a aplicação utilizando Docker" @echo "⭐️ docker-run-app : Levanta apenas a aplicação utilizando Docker"
@echo "⭐️ docker-run-worker : Levanta apenas o Celery utilizando Docker" @echo "⭐️ docker-run-worker : Levanta apenas o Celery utilizando Docker"
@@ -18,7 +16,7 @@ help:
@echo "⭐️ collectstatic : Atualiza os arquivos estáticos no bucket" @echo "⭐️ collectstatic : Atualiza os arquivos estáticos no bucket"
@echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――" @echo "―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――"
run: run-dev:
@uv run python manage.py runserver 0.0.0.0:7788 @uv run python manage.py runserver 0.0.0.0:7788
celery: celery:

37
app/openv.py Normal file
View File

@@ -0,0 +1,37 @@
from typing import Optional
from onepasswordconnectsdk.client import Client, new_client_from_environment
from onepasswordconnectsdk.models import Item, Vault
class OnePassword:
connect_client: Client = new_client_from_environment()
vault_title: Optional[str]
item_title: str = 'mines'
vault: Optional[Vault] = None
item: Optional[Item] = None
def __init__(self, scope: str, item_title=None):
if item_title:
self.item_title = item_title
self.vault_title = scope.lower()
def get_vault(self) -> Vault:
if self.vault:
return self.vault
self.vault = self.connect_client.get_vault_by_title(self.vault_title)
return self.vault
def get_item(self) -> Item:
if self.item:
return self.item
vault = self.get_vault()
self.item = self.connect_client.get_item_by_title(self.item_title, vault.id)
return self.item
def get(self, field: str, default_value=None) -> str | None:
item = self.get_item()
for f in item.fields:
if f.label == field:
return f.value
return default_value

View File

@@ -1,16 +1,18 @@
import os
from pathlib import Path from pathlib import Path
import sentry_sdk import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration from sentry_sdk.integrations.django import DjangoIntegration
from .utils import get_op_config from app.openv import OnePassword
op_config = get_op_config() SCOPE = os.environ['SCOPE']
OP_ITEM_TITLE = os.environ.get('OP_ITEM_TITLE', 'mines')
SCOPE = op_config['settings.SCOPE'] op_env = OnePassword(SCOPE, OP_ITEM_TITLE)
sentry_sdk.init( sentry_sdk.init(
dsn=op_config['settings.SENTRY_DSN'], dsn=op_env.get('settings.SENTRY_DSN'),
integrations=[DjangoIntegration()], integrations=[DjangoIntegration()],
environment=SCOPE, environment=SCOPE,
send_default_pii=False, send_default_pii=False,
@@ -21,12 +23,12 @@ sentry_sdk.init(
BASE_DIR = Path(__file__).resolve().parent.parent BASE_DIR = Path(__file__).resolve().parent.parent
# SECURITY WARNING: keep the secret key used in production secret! # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = op_config['settings.SECRET_KEY'] SECRET_KEY = op_env.get('settings.SECRET_KEY')
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = op_config.get('settings.DEBUG', '0') in ['1', 'true'] DEBUG = op_env.get('settings.DEBUG', '0') in ['1', 'true']
ALLOWED_HOSTS = op_config.get('settings.ALLOWED_HOSTS', '127.0.0.1,localhost').split(',') ALLOWED_HOSTS = op_env.get('settings.ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
@@ -82,11 +84,11 @@ AUTH_USER_MODEL = 'core.User'
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.mysql',
'NAME': op_config['database.name'], 'NAME': op_env.get('database.name'),
'USER': op_config['database.user'], 'USER': op_env.get('database.user'),
'PASSWORD': op_config['database.password'], 'PASSWORD': op_env.get('database.password'),
'HOST': op_config['database.host'], 'HOST': op_env.get('database.host'),
'PORT': op_config['database.port'], 'PORT': op_env.get('database.port'),
'OPTIONS': {'charset': 'utf8mb4'}, 'OPTIONS': {'charset': 'utf8mb4'},
} }
} }
@@ -108,7 +110,7 @@ AUTH_PASSWORD_VALIDATORS = [
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC' TIME_ZONE = 'America/Sao_Paulo'
USE_I18N = True USE_I18N = True

View File

@@ -1,6 +1,5 @@
# Generated by Django 3.1.3 on 2020-11-05 03:03 # Generated by Django 3.1.3 on 2020-11-05 03:03
import django_mysql.models
from django.db import migrations, models from django.db import migrations, models
import internal.utils import internal.utils
@@ -46,7 +45,7 @@ class Migration(migrations.Migration):
), ),
( (
'board', 'board',
django_mysql.models.JSONField( models.JSONField(
default=internal.utils.empty_list, default=internal.utils.empty_list,
verbose_name='Generated board', verbose_name='Generated board',
), ),

View File

@@ -1,6 +1,5 @@
# Generated by Django 3.1.3 on 2020-11-06 02:25 # Generated by Django 3.1.3 on 2020-11-06 02:25
import django_mysql.models
from django.db import migrations, models from django.db import migrations, models
import game.models import game.models
@@ -36,7 +35,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='board', name='board',
field=django_mysql.models.JSONField( field=models.JSONField(
default=internal.utils.empty_list, default=internal.utils.empty_list,
help_text='Whe generated board game', help_text='Whe generated board game',
verbose_name='Generated board', verbose_name='Generated board',

View File

@@ -1,7 +1,6 @@
# Generated by Django 3.1.3 on 2020-11-06 03:54 # Generated by Django 3.1.3 on 2020-11-06 03:54
import django.db.models.deletion import django.db.models.deletion
import django_mysql.models
from django.db import migrations, models from django.db import migrations, models
import game.models import game.models
@@ -49,7 +48,7 @@ class Migration(migrations.Migration):
), ),
( (
'metadata', 'metadata',
django_mysql.models.JSONField( models.JSONField(
default=internal.utils.empty_object, default=internal.utils.empty_object,
help_text='Some usefull event metadata', help_text='Some usefull event metadata',
verbose_name='Event metadata', verbose_name='Event metadata',

View File

@@ -1,7 +1,5 @@
# Generated by Django 3.1.3 on 2020-11-07 01:30 # Generated by Django 3.1.3 on 2020-11-07 01:30
from django.db import migrations, models
import django_mysql.models
from django.db import migrations
import internal.utils import internal.utils
@@ -15,7 +13,7 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='game', model_name='game',
name='board_progress', name='board_progress',
field=django_mysql.models.JSONField( field=models.JSONField(
default=internal.utils.empty_list, default=internal.utils.empty_list,
help_text='This board is updated at each GameEvent recorded', help_text='This board is updated at each GameEvent recorded',
verbose_name='Progress board', verbose_name='Progress board',
@@ -24,7 +22,7 @@ class Migration(migrations.Migration):
migrations.AlterField( migrations.AlterField(
model_name='game', model_name='game',
name='board', name='board',
field=django_mysql.models.JSONField( field=models.JSONField(
default=internal.utils.empty_list, default=internal.utils.empty_list,
help_text='The generated board game', help_text='The generated board game',
verbose_name='Generated board', verbose_name='Generated board',

View File

@@ -1,7 +1,6 @@
from enum import IntEnum from enum import IntEnum
from django.db import models from django.db import models
from django_mysql.models import JSONField
from internal.utils import empty_list from internal.utils import empty_list
@@ -33,8 +32,8 @@ class Game(models.Model):
cols = models.PositiveIntegerField('Board cols', default=10, help_text="Board's total columns") cols = models.PositiveIntegerField('Board cols', default=10, help_text="Board's total columns")
mines = models.PositiveIntegerField('Mines on board', default=5, help_text="Board's total placed mines") mines = models.PositiveIntegerField('Mines on board', default=5, help_text="Board's total placed mines")
board = JSONField('Generated board', default=empty_list, help_text='The generated board game') board = models.JSONField('Generated board', default=empty_list, help_text='The generated board game')
board_progress = JSONField( board_progress = models.JSONField(
'Progress board', 'Progress board',
default=empty_list, default=empty_list,
help_text='This board is updated at each GameEvent recorded', help_text='This board is updated at each GameEvent recorded',