kam_caloire / main.py
Abdelkareem's picture
deploy at 2024-12-22 23:36:10.283855
d5b8b50 verified
from fasthtml.common import *
from faq import create_faq
import pandas as pd
from fasthtml_hf import setup_hf_backup
df = pd.read_csv("./ar_en_nutrition.csv")
from food_sql import create_food_model, update_database
app, rt, foods, Food = create_food_model(df)
try:
app, rt, foods, Food = create_food_model(df)
update_database(df)
print("Database updated successfully!")
except Exception as e:
print(f"Error updating database: {e}")
items = foods()
print(len(items))
for item in items[:5]:
print(item.arabic_name, item.name, item.calories)
el = foods.search("banana")
for e in el:
print(e["name"])
print(e["arabic_name"])
print(e["calories"])
print(e)
break
seo_meta = [
Meta(
name="description",
content="كم كالوري أفضل موقع لمعرفة عدد السعرات الحرارية في الأطعمة باستخدام البحث الذكي وتقنيات الذكاء الإصطناعي",
),
Meta(name="keywords", content="سعرات حرارية, غذاء, صحة, تغذية, حمية"),
Meta(name="author", content="Abdelkareem Elkhateb"),
Meta(property="og:title", content="كم كالوري - حاسبة السعرات الحرارية"),
Meta(property="og:description", content="احسب السعرات الحرارية في طعامك بسهولة"),
Meta(property="og:type", content="website"),
Meta(name="robots", content="index, follow"),
Meta(name="language", content="ar"),
Meta(charset="UTF-8"),
# Meta(property="og:url", content="your-website-url"),
# Meta(property="og:image", content="url-to-your-logo"),
Meta(name="twitter:card", content="summary"),
Meta(name="twitter:title", content="كم كالوري - حاسبة السعرات الحرارية"),
Meta(name="twitter:description", content="احسب السعرات الحرارية في طعامك بسهولة"),
# Meta(name="twitter:image", content="url-to-your-logo"),
# Additional SEO
Meta(name="theme-color", content="#4a90e2"),
Meta(name="application-name", content="كم كالوري"),
Meta(property="og:locale", content="ar_AR"),
Meta(name="viewport", content="width=device-width, initial-scale=1.0"),
]
app, rt, foods, Food = fast_app(
"data/foods.db",
hdrs=[
*seo_meta,
Style("""
:root {
--pico-font-size: 100%;
--pico-color-info: #4a90e2;
}
body {
direction: rtl;
text-align: right;
}
.navbar {
background-color: var(--pico-color-info);
padding: 1rem;
margin-bottom: 2rem;
}
.navbar a {
color: white;
text-decoration: none;
}
table a {
text-decoration: none;
}
"""),
],
id=int,
name=str,
serving_size=str,
calories=int,
total_fat=str,
saturated_fat=str,
cholesterol=str,
sodium=str,
choline=str,
folate=str,
folic_acid=str,
niacin=str,
pantothenic_acid=str,
riboflavin=str,
thiamin=str,
vitamin_a=str,
vitamin_a_rae=str,
carotene_alpha=str,
carotene_beta=str,
cryptoxanthin_beta=str,
lutein_zeaxanthin=str,
lucopene=int,
vitamin_b12=str,
vitamin_b6=str,
vitamin_c=str,
vitamin_d=str,
vitamin_e=str,
tocopherol_alpha=str,
vitamin_k=str,
calcium=str,
copper=str,
irom=str,
magnesium=str,
manganese=str,
phosphorous=str,
potassium=str,
selenium=str,
zink=str,
protein=str,
alanine=str,
arginine=str,
aspartic_acid=str,
cystine=str,
glutamic_acid=str,
glycine=str,
histidine=str,
hydroxyproline=str,
isoleucine=str,
leucine=str,
lysine=str,
methionine=str,
phenylalanine=str,
proline=str,
serine=str,
threonine=str,
tryptophan=str,
tyrosine=str,
valine=str,
carbohydrate=str,
fiber=str,
sugars=str,
fructose=str,
galactose=str,
glucose=str,
lactose=str,
maltose=str,
sucrose=str,
fat=str,
saturated_fatty_acids=str,
monounsaturated_fatty_acids=str,
polyunsaturated_fatty_acids=str,
fatty_acids_total_trans=str,
alcohol=str,
ash=str,
caffeine=str,
theobromine=str,
water=str,
arabic_name=str,
pk="id",
)
def mk_search_input():
return Input(
id="search-input", name="query", placeholder="ابحث عن الطعام..", required=True
)
@rt("/search")
def post(query: str):
results = foods.search(query, limit=20)
header = Thead(
Tr(
*map(Th, ["الاسم بالعربية", "Food", "السعرات الحرارية"]),
),
cls="bg-purple/10",
)
rows = [
Tr(
Td(
AX(
f["arabic_name"],
f"/food/{f['id']}",
"results-table",
hx_push_url="true",
)
),
Td(f["name"]),
Td(f["calories"]),
cls="even:bg-purple/5",
)
for f in results
]
return Table(header, *rows, cls="w-full", id="results-table")
@rt("/food/{id}")
def get(id: int):
food = foods.get(id)
return Table(
*[Tr(Th(k), Td(v)) for k, v in food.__dict__.items() if k != "id"],
id="results-table",
)
@rt("/")
def get():
header = Header(
Nav(
Ul(
Li(A("البحث الذكي", href="/")),
),
cls="container",
),
cls="navbar",
)
search_form = Form(
Group(mk_search_input(), Button("Search")),
hx_post="/search",
target_id="results-table",
)
return (
Title("كم كالوري"),
header,
Main(
H1("كم كالوري في .."),
search_form,
Div(id="results-table"),
create_faq(),
cls="container",
),
)
setup_hf_backup(app)
if __name__ == "__main__":
serve()