diff --git a/db/models.py b/db/models.py index 02a76f2..237c1bd 100644 --- a/db/models.py +++ b/db/models.py @@ -13,6 +13,7 @@ class BaseModel(Model): class User(BaseModel): telegram_username = TextField(unique=True) telegram_chat_id = IntegerField() + telegram_photo_url = TextField(null=True) class Meta: table_name = 'user' diff --git a/flask/api.py b/flask/api.py index b57efed..dd01185 100644 --- a/flask/api.py +++ b/flask/api.py @@ -10,7 +10,10 @@ api = Blueprint('api', __name__) def subs(): return jsonify( [ - {"sub_username": dsu.sub.telegram_username} + { + "sub_username": dsu.sub.telegram_username, + "telegram_photo_url": dsu.sub.telegram_photo_url + } for dsu in domsubusers_list(current_user.db_user) ] diff --git a/flask/app.py b/flask/app.py index 87a752d..5a373e3 100644 --- a/flask/app.py +++ b/flask/app.py @@ -84,6 +84,9 @@ def login(): if hmac_string == tg_data['hash']: try: db_user = user_get(tg_data['username']) + db_user.telegram_photo_url = request.args.get("photo_url") + db_user.save() + login_user(FlaskUser(db_user)) except: flash("Login failed. Please try again.") diff --git a/flask/vite/src/SubOrderSets.tsx b/flask/vite/src/SubOrderSets.tsx index fd9e546..c888e59 100644 --- a/flask/vite/src/SubOrderSets.tsx +++ b/flask/vite/src/SubOrderSets.tsx @@ -2,7 +2,13 @@ import { Container, Title, Card, Text, Box, Flex, Badge } from "@mantine/core"; import { TimeValue } from "@mantine/dates"; import { IconPencil, IconPlus, IconTrash } from "@tabler/icons-react"; import React from "react"; -import { Params, useLoaderData, useParams, useFetcher } from "react-router"; +import { + Params, + useLoaderData, + useParams, + useFetcher, + Link, +} from "react-router"; import { ConfirmDialogButton } from "./ConfirmDialogButton"; import { NavigateButton } from "./NavigateButton"; @@ -36,9 +42,10 @@ export const SubOrderSets: React.FC = () => { return ( - - Order Sets for {sub_username} - + + Order Sets for {sub_username} + Return to all subs + {orderSets ? orderSets.map( diff --git a/flask/vite/src/SubsList.tsx b/flask/vite/src/SubsList.tsx index e3adb49..81511d6 100644 --- a/flask/vite/src/SubsList.tsx +++ b/flask/vite/src/SubsList.tsx @@ -1,21 +1,54 @@ import React from "react"; -import { Container } from "@mantine/core"; -import { useLoaderData, Link } from "react-router"; +import { Container, Text, Title, Flex, Card, Image } from "@mantine/core"; +import { useLoaderData } from "react-router"; +import { IconPencil } from "@tabler/icons-react"; +import { NavigateButton } from "./NavigateButton"; export const subsListLoader = () => fetch("/api/subs").then((response) => response.json()); export const SubsList: React.FC = () => { - const subs = useLoaderData<{ sub_username: string }[]>(); + const subs = + useLoaderData<{ sub_username: string; telegram_photo_url: string }[]>(); return ( -

Subs

- {subs.map(({ sub_username }) => ( - - Orders for {sub_username} - - ))} + + Subs + + + {subs.map(({ sub_username, telegram_photo_url }) => ( + + {telegram_photo_url ? ( + + {`Profile + + ) : null} + + + {sub_username} + + + + Edit + + + + + ))} +
); }; diff --git a/migrations/004_add_user_photo_url.py b/migrations/004_add_user_photo_url.py new file mode 100644 index 0000000..5f239ae --- /dev/null +++ b/migrations/004_add_user_photo_url.py @@ -0,0 +1,49 @@ +"""Peewee migrations -- 004_add_user_photo_url.py. + +Some examples (model - class or model name):: + + > Model = migrator.orm['table_name'] # Return model in current state by name + > Model = migrator.ModelClass # Return model in current state by name + + > migrator.sql(sql) # Run custom SQL + > migrator.run(func, *args, **kwargs) # Run python function with the given args + > migrator.create_model(Model) # Create a model (could be used as decorator) + > migrator.remove_model(model, cascade=True) # Remove a model + > migrator.add_fields(model, **fields) # Add fields to a model + > migrator.change_fields(model, **fields) # Change fields + > migrator.remove_fields(model, *field_names, cascade=True) + > migrator.rename_field(model, old_field_name, new_field_name) + > migrator.rename_table(model, new_table_name) + > migrator.add_index(model, *col_names, unique=False) + > migrator.add_not_null(model, *field_names) + > migrator.add_default(model, field_name, default) + > migrator.add_constraint(model, name, sql) + > migrator.drop_index(model, *col_names) + > migrator.drop_not_null(model, *field_names) + > migrator.drop_constraints(model, *constraints) + +""" + +from contextlib import suppress + +import peewee as pw +from peewee_migrate import Migrator + + +with suppress(ImportError): + import playhouse.postgres_ext as pw_pext + + +def migrate(migrator: Migrator, database: pw.Database, *, fake=False): + """Write your migrations here.""" + + migrator.add_fields( + 'user', + + telegram_photo_url=pw.TextField(null=True)) + + +def rollback(migrator: Migrator, database: pw.Database, *, fake=False): + """Write your rollback migrations here.""" + + migrator.remove_fields('user', 'telegram_photo_url')