napiš aplikaci ke katalogizaci anatomických preparátů s informacemi o místě uložení (místnost, box,...), popisem preparátu, detailem, údajem o pohlaví, patologii nebo variaci, poznámkou, datem pořízení, datem ošetření nálevu/preparátu, fotografií (buď jako malý náhled nebo s odkazem na foto v kořenovém adresáři, nebo jinak lépe vyřešeno), případně domysly další potřebné kolonky
To upload files, please first save the app
import streamlit as st
import os
from datetime import datetime
from sqlalchemy import create_engine, String, Date, Text
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from PIL import Image
import io
# Database setup
class Base(DeclarativeBase):
pass
class AnatomicalSpecimen(Base):
__tablename__ = "specimens"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(200))
room: Mapped[str] = mapped_column(String(50))
box: Mapped[str] = mapped_column(String(50))
description: Mapped[str] = mapped_column(Text)
details: Mapped[str] = mapped_column(Text, nullable=True)
sex: Mapped[str] = mapped_column(String(20))
pathology: Mapped[str] = mapped_column(Text, nullable=True)
variation: Mapped[str] = mapped_column(Text, nullable=True)
notes: Mapped[str] = mapped_column(Text, nullable=True)
acquisition_date: Mapped[datetime] = mapped_column(Date)
last_treatment_date: Mapped[datetime] = mapped_column(Date, nullable=True)
image_path: Mapped[str] = mapped_column(String(500), nullable=True)
# Create database and tables
engine = create_engine("sqlite:///anatomical_specimens.db")
Base.metadata.create_all(engine)
# App title
st.title("Katalog anatomických preparátů")
# Sidebar for navigation
page = st.sidebar.radio("Navigace", ["Zobrazit katalog", "Přidat nový preparát"])
if page == "Přidat nový preparát":
st.header("Přidat nový anatomický preparát")
# Form for adding new specimen
with st.form("new_specimen"):
name = st.text_input("Název preparátu*")
room = st.text_input("Místnost*")
box = st.text_input("Box/Umístění*")
description = st.text_area("Popis preparátu*")
details = st.text_area("Detaily")
sex = st.selectbox("Pohlaví*", ["Muž", "Žena", "Neurčeno"])
pathology = st.text_area("Patologie")
variation = st.text_area("Anatomická variace")
notes = st.text_area("Poznámky")
acquisition_date = st.date_input("Datum pořízení*")
last_treatment_date = st.date_input("Datum posledního ošetření")
# Image upload
uploaded_file = st.file_uploader("Nahrát fotografii", type=["jpg", "jpeg", "png"])
submitted = st.form_submit_button("Uložit")
if submitted:
if name and room and box and description and sex and acquisition_date:
# Handle image saving
image_path = None
if uploaded_file:
# Create images directory if it doesn't exist
if not os.path.exists("images"):
os.makedirs("images")
# Save image
image_path = f"images/{uploaded_file.name}"
with open(image_path, "wb") as f:
f.write(uploaded_file.getbuffer())
# Create new specimen
new_specimen = AnatomicalSpecimen(
name=name,
room=room,
box=box,
description=description,
details=details,
sex=sex,
pathology=pathology,
variation=variation,
notes=notes,
acquisition_date=acquisition_date,
last_treatment_date=last_treatment_date,
image_path=image_path
)
# Save to database
with Session(engine) as session:
session.add(new_specimen)
session.commit()
st.success("Preparát byl úspěšně přidán do katalogu!")
else:
st.error("Prosím vyplňte všechna povinná pole označená *")
else: # Zobrazit katalog
st.header("Katalog preparátů")
# Search and filter options
search = st.text_input("Vyhledat podle názvu")
# Get all specimens
with Session(engine) as session:
query = session.query(AnatomicalSpecimen)
if search:
query = query.filter(AnatomicalSpecimen.name.ilike(f"%{search}%"))
specimens = query.all()
# Display specimens
for specimen in specimens:
with st.expander(f"{specimen.name} (Box: {specimen.box}, Místnost: {specimen.room})"):
cols = st.columns([2, 1])
with cols[0]:
st.write("**Popis:**", specimen.description)
if specimen.details:
st.write("**Detaily:**", specimen.details)
st.write("**Pohlaví:**", specimen.sex)
if specimen.pathology:
st.write("**Patologie:**", specimen.pathology)
if specimen.variation:
st.write("**Anatomická variace:**", specimen.variation)
if specimen.notes:
st.write("**Poznámky:**", specimen.notes)
st.write("**Datum pořízení:**", specimen.acquisition_date.strftime("%d.%m.%Y"))
if specimen.last_treatment_date:
st.write("**Poslední ošetření:**", specimen.last_treatment_date.strftime("%d.%m.%Y"))
with cols[1]:
if specimen.image_path and os.path.exists(specimen.image_path):
image = Image.open(specimen.image_path)
st.image(image, use_column_width=True)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?