-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into feature/tests-user-routes
- Loading branch information
Showing
9 changed files
with
140 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
42 changes: 42 additions & 0 deletions
42
gestao/db/migrations/versions/2023-11-25-07-13_89f33fa986f8.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
"""rename column 'mother_date' to 'mother_name' and add columns 'password and 'religion' | ||
Revision ID: 89f33fa986f8 | ||
Revises: 0084e7dffc7c | ||
Create Date: 2023-11-25 07:13:16.617587 | ||
""" | ||
from alembic import op | ||
import sqlalchemy as sa | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision = "89f33fa986f8" | ||
down_revision = "0084e7dffc7c" | ||
branch_labels = None | ||
depends_on = None | ||
|
||
|
||
def upgrade() -> None: | ||
with op.batch_alter_table("user") as batch_op: | ||
batch_op.alter_column( | ||
"mother_date", | ||
new_column_name="mother_name", | ||
existing_type=sa.String(length=200), | ||
) | ||
batch_op.add_column( | ||
sa.Column("password", sa.String(200), nullable=True), | ||
) | ||
batch_op.add_column( | ||
sa.Column("religion", sa.String(200), nullable=True), | ||
) | ||
|
||
|
||
def downgrade() -> None: | ||
with op.batch_alter_table("user") as batch_op: | ||
batch_op.alter_column( | ||
"mother_name", | ||
new_column_name="mother_date", | ||
existing_type=sa.String(length=200), | ||
) | ||
batch_op.drop_column("password") | ||
batch_op.drop_column("religion") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
from gestao.web.api.login.views import router | ||
|
||
__all__ = ["router"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
from pydantic import BaseModel | ||
|
||
|
||
class AuthUserDTO(BaseModel): | ||
registration: str | ||
password: str | ||
|
||
|
||
class RecoverPasswordDTO(BaseModel): | ||
email: str |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import os | ||
import smtplib | ||
import email.message | ||
import secrets | ||
import string | ||
|
||
|
||
def generate_password(length=8): | ||
characters = string.ascii_letters + string.digits | ||
password = "".join(secrets.choice(characters) for _ in range(length)) | ||
return password | ||
|
||
|
||
def send_email(user_name: str, user_email: str, user_message: str) -> None: | ||
|
||
email_data = { | ||
"email_address": os.getenv("EMAIL_ADDRESS"), | ||
"email_password": os.getenv("EMAIL_PASSWORD"), | ||
"email_subject": "recover-password SINDPOL-DF", | ||
"email_body": """ | ||
<p>recover-password<p> | ||
<p>name: {}<p> | ||
<p>new-password: {}<p> | ||
""", | ||
} | ||
|
||
msg = email.message.Message() | ||
msg["Subject"] = email_data["email_subject"] | ||
msg["From"] = email_data["email_address"] | ||
msg["To"] = user_email | ||
msg.add_header("Content-Type", "text/html") | ||
msg.set_payload(email_data["email_body"].format(user_name, user_message)) | ||
|
||
s = smtplib.SMTP("smtp.gmail.com: 587") | ||
s.starttls() | ||
s.login(msg["From"], email_data["email_password"]) | ||
s.sendmail(msg["From"], [msg["To"]], msg.as_string().encode("utf-8")) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import logging | ||
|
||
from fastapi import APIRouter, HTTPException | ||
|
||
from gestao.db.models.user import User | ||
from gestao.web.api.login.schemas import AuthUserDTO, RecoverPasswordDTO | ||
from gestao.web.api.login.utils import generate_password, send_email | ||
|
||
router = APIRouter() | ||
|
||
|
||
@router.post("/user") | ||
async def login_user(login_data: AuthUserDTO) -> User: | ||
try: | ||
return await User.objects.select_related(User.dependents).get( | ||
**login_data.dict() | ||
) | ||
except Exception: | ||
logging.error("User not found", exc_info=True) | ||
raise HTTPException( | ||
status_code=404, | ||
detail="User not found", | ||
) | ||
|
||
|
||
@router.post("/recover_password") | ||
async def recover_password(recover_data: RecoverPasswordDTO) -> None: | ||
try: | ||
user = await User.objects.get(**recover_data.dict()) | ||
new_password = generate_password() | ||
send_email(user.name, user.email, new_password) | ||
await user.update(password=new_password) | ||
except Exception: | ||
logging.error("User not found", exc_info=True) | ||
raise HTTPException(status_code=404, detail="User not found") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,9 @@ | ||
from fastapi.routing import APIRouter | ||
|
||
from gestao.web.api import echo, monitoring, user | ||
from gestao.web.api import echo, monitoring, user, login | ||
|
||
api_router = APIRouter() | ||
api_router.include_router(monitoring.router) | ||
api_router.include_router(echo.router, prefix="/echo", tags=["echo"]) | ||
api_router.include_router(user.router, prefix="/users", tags=["users"]) | ||
api_router.include_router(login.router, prefix="/login", tags=["login"]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters