Compare commits

..

3 Commits
mpabi ... fzoz

Author SHA1 Message Date
Twoje Imię Nazwisko d87d5bf2be replace name f1 -> b1 2024-10-24 07:28:54 -04:00
Twoje Imię Nazwisko de44be2320 update __n1`start 2024-10-24 07:28:21 -04:00
Twoje Imię Nazwisko 391f025e0f zoz model 2024-10-24 07:24:33 -04:00
11 changed files with 217 additions and 118 deletions

View File

@ -1,7 +1,7 @@
# Wybierz bazowy obraz. Debian jest dobrym wyborem ze względu na pyenv # Choose a base image. Debian is a good choice due to pyenv
FROM debian:latest FROM debian:latest
# Aktualizacja listy pakietów i instalacja niezbędnych zależności # Update the package list and install necessary dependencies
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
aptitude \ aptitude \
tmux vim-nox nano mc git curl termshark procps \ tmux vim-nox nano mc git curl termshark procps \
@ -13,67 +13,71 @@ RUN apt-get update && apt-get install -y \
python3-pip \ python3-pip \
npm npm
# Ustawienie hasła dla użytkownika root (opcjonalne, do konfiguracji) # Set password for root user (optional, for configuration)
RUN echo 'root:rootpass' | chpasswd RUN echo 'root:rootpass' | chpasswd
# Dodanie nowego użytkownika `user` z hasłem `pass` i przygotowanie środowiska # Add a new user `user` with password `pass` and prepare the environment
RUN useradd -m user && echo 'user:pass' | chpasswd && adduser user sudo RUN useradd -m user && echo 'user:pass' | chpasswd && adduser user sudo
# Przełączenie na użytkownika `user` # Switch to user `user`
USER user USER user
WORKDIR /home/user WORKDIR /home/user
# Ustawienie zmiennych środowiskowych # Install pyenv
RUN git clone https://github.com/pyenv/pyenv .pyenv
# Install pyenv-virtualenv
RUN git clone https://github.com/pyenv/pyenv-virtualenv .pyenv/plugins/pyenv-virtualenv
# Set environment variables
ENV HOME /home/user ENV HOME /home/user
ENV PYENV_ROOT $HOME/.pyenv ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$HOME/.local/bin:$PATH ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH
ENV PYENV_VERSION p3.12
# Instalacja pyenv # Add pyenv and pyenv-virtualenv configuration to .bashrc
RUN git clone https://github.com/pyenv/pyenv $PYENV_ROOT RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> .bashrc
RUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> .bashrc
RUN echo 'eval "$(pyenv init -)"' >> .bashrc
RUN echo 'eval "$(pyenv virtualenv-init -)"' >> .bashrc
# Instalacja pyenv-virtualenv # Install Python 3.12 with --enable-shared
RUN git clone https://github.com/pyenv/pyenv-virtualenv $PYENV_ROOT/plugins/pyenv-virtualenv RUN bash -i -c "source ~/.bashrc && env PYTHON_CONFIGURE_OPTS='--enable-shared' pyenv install 3.12"
# Dodanie konfiguracji pyenv i pyenv-virtualenv do .bashrc # Create a virtual environment p3.12
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc \ RUN bash -i -c "source ~/.bashrc && pyenv virtualenv 3.12 p3.12"
&& echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc \
&& echo 'eval "$(pyenv init --path)"' >> ~/.bashrc \
&& echo 'eval "$(pyenv init -)"' >> ~/.bashrc \
&& echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
# Instalacja Pythona 3.12 z --enable-shared # Set p3.12 as the default virtual environment
RUN env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.12.0 RUN bash -i -c "source ~/.bashrc && pyenv local p3.12"
# Utworzenie środowiska wirtualnego p3.12 # Install ipython in the p3.12 environment
RUN pyenv virtualenv 3.12.0 p3.12 RUN bash -i -c "source ~/.bashrc && pyenv activate p3.12 && pip install ipython"
# Ustawienie p3.12 jako globalnego środowiska # Install Vim-Plug for Vim plugin management
RUN pyenv global p3.12
# Instalacja ipython w środowisku p3.12
RUN pip install ipython
# Instalacja Vim-Plug do zarządzania wtyczkami Vim
RUN curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ RUN curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# Kopiowanie plików konfiguracyjnych vim i tmux # Copy the vim configuration file for plugins
COPY --chown=user:user ./_confs/.vimrc /home/user/.vimrc COPY ./_confs/.vimrc /home/user/.vimrc
COPY --chown=user:user ./_confs/.tmux.conf /home/user/.tmux.conf
# Instalacja wtyczek Vim za pomocą Vim-Plug # Install Vim plugins via Vim-Plug
RUN vim +'PlugInstall --sync' +qall RUN vim +'PlugInstall --sync' +qall
# Instalacja Poetry w środowisku p3.12 # Install Poetry
RUN curl -sSL https://install.python-poetry.org | python3 - RUN curl -sSL https://install.python-poetry.org | python3 -
# Kopiowanie projektu do obrazu # Copy the project into the image
COPY --chown=user:user . /home/user/fapi COPY --chown=user:user . /home/user/fapi
COPY ./_confs/* ./
# Instalacja zależności za pomocą Poetry z głównego katalogu # Set the working directory for installing dependencies
RUN cd /home/user/fapi && poetry config virtualenvs.create false && poetry install WORKDIR /home/user/fapi
# Uruchomienie aplikacji # Add Poetry path to PATH directly in the Dockerfile
CMD ["python", "/home/user/fapi/entrypoint.py"] ENV PATH="$HOME/.local/bin:$PATH"
# Install dependencies using Poetry
RUN bash -i -c "source ~/.bashrc && poetry config virtualenvs.create false && poetry install"
# Run the application
CMD ["/bin/bash", "-c", "python entrypoint.py"]

5
__n1
View File

@ -1,7 +1,8 @@
sudo docker run --rm \ sudo docker run --rm \
-dit \ -dit \
--privileged \ --privileged \
-p 9999:9999 \
-p 8888:8888 \ -p 8888:8888 \
-v /home/user/work/fapi/fapi/src:/home/user/fapi \ -v "$(pwd):/home/user/fapi" \
--name f1 \ --name b1 \
fapi bash fapi bash

2
__run2
View File

@ -1 +1 @@
docker run --rm -it -p 8888:8888 --name cfapi fapi bash docker run --rm -it -p 9999:9999 --name cfapi fapi bash

Binary file not shown.

View File

@ -4,7 +4,7 @@ from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
#SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db" # Dla SQLite #SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db" # Dla SQLite
SQLALCHEMY_DATABASE_URL = "mysql+mysqldb://root:secret@172.19.0.4:3306/test" SQLALCHEMY_DATABASE_URL = "mysql+mysqldb://root:secret@172.18.0.2:3306/test"
engine = create_engine( engine = create_engine(
SQLALCHEMY_DATABASE_URL, SQLALCHEMY_DATABASE_URL,

View File

@ -1,25 +1,15 @@
from fastapi import FastAPI, Depends, HTTPException from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from fastapi.middleware.cors import CORSMiddleware from . import models, schemas
from app.database import SessionLocal, engine from .database import SessionLocal, engine
import app.models as models from datetime import datetime
from app.schemas import Person, PersonCreate
app = FastAPI() app = FastAPI()
origins = [ # Tworzenie tabel w bazie danych
"http://localhost:8080", models.Base.metadata.create_all(bind=engine)
"http://mpabi.pl:8888",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Dependency do sesji z bazą danych
def get_db(): def get_db():
db = SessionLocal() db = SessionLocal()
try: try:
@ -27,31 +17,42 @@ def get_db():
finally: finally:
db.close() db.close()
# Endpoint do tworzenia nowej osoby (POST) # Endpoint do pobierania ról
@app.post("/persons/", response_model=Person) @app.get("/roles/", response_model=list[schemas.Role])
def create_person(person: PersonCreate, db: Session = Depends(get_db)): def read_roles(db: Session = Depends(get_db)):
db_person = models.Person( return db.query(models.Role).all()
last_name=person.last_name,
first_name=person.first_name, # Endpoint do dodania roli
address=person.address, @app.post("/roles/", response_model=schemas.Role)
city=person.city def create_role(role: schemas.RoleCreate, db: Session = Depends(get_db)):
) db_role = models.Role(name=role.name)
db.add(db_person) db.add(db_role)
db.commit() db.commit()
db.refresh(db_person) db.refresh(db_role)
return db_person return db_role
# Endpoint do odczytu listy osób (GET) # Endpoint do pobierania zdarzeń
@app.get("/persons/", response_model=list[Person]) @app.get("/events/", response_model=list[schemas.Event])
def read_persons(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): def read_events(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
persons = db.query(models.Person).offset(skip).limit(limit).all() return db.query(models.Event).offset(skip).limit(limit).all()
return persons
# Endpoint do odczytu osoby po ID (GET) # Endpoint do dodania zdarzenia
@app.get("/persons/{person_id}", response_model=Person) @app.post("/events/", response_model=schemas.Event)
def read_person(person_id: int, db: Session = Depends(get_db)): def create_event(event: schemas.EventCreate, db: Session = Depends(get_db)):
person = db.query(models.Person).filter(models.Person.person_id == person_id).first() db_event = models.Event(
if person is None: role_id=event.role_id,
raise HTTPException(status_code=404, detail="Person not found") student_id=event.student_id,
return person criteria_id=event.criteria_id,
description=event.description,
event_date=event.event_date or datetime.now()
)
db.add(db_event)
db.commit()
db.refresh(db_event)
return db_event
# Endpoint do pobierania informacji o zdarzeniach dla konkretnego ucznia
@app.get("/events/student/{student_id}", response_model=list[schemas.Event])
def read_student_events(student_id: int, db: Session = Depends(get_db)):
return db.query(models.Event).filter(models.Event.student_id == student_id).all()

View File

@ -1,25 +1,54 @@
from sqlalchemy import Column, Integer, String from sqlalchemy import Column, Integer, String, DateTime, ForeignKey
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship
from .database import Base
Base = declarative_base() class Criteria(Base):
__tablename__ = "criteria"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255))
class Person(Base): class Role(Base):
__tablename__ = "Persons" __tablename__ = "roles"
id = Column(Integer, primary_key=True, index=True)
name = Column(String(255))
person_id = Column("PersonID", Integer, primary_key=True, index=True, autoincrement=True) class Student(Base):
last_name = Column("LastName", String(255), nullable=False) __tablename__ = "students"
first_name = Column("FirstName", String(255), nullable=True) id = Column(Integer, primary_key=True, index=True)
address = Column("Address", String(255), nullable=True) first_name = Column(String(50))
city = Column("City", String(255), nullable=True) last_name = Column(String(50))
grade = Column(String(50), default="Brak ocen")
points = Column(Integer, nullable=True)
status = Column(Integer)
""" class ClassInfo(Base):
SQL Insert statements: __tablename__ = "class_info"
INSERT INTO Persons (PersonID, LastName, FirstName, Address, City) id = Column(Integer, primary_key=True, index=True)
VALUES school = Column(String(255))
(1, 'Smith', 'John', '123 Maple St', 'New York'), city = Column(String(255))
(2, 'Johnson', 'Emily', '456 Oak Ave', 'Los Angeles'), year = Column(String(50))
(3, 'Williams', 'Michael', '789 Pine Dr', 'Chicago'), semester = Column(String(50))
(4, 'Brown', 'Sarah', '101 Birch Ln', 'Houston'), subject = Column(String(255))
(5, 'Jones', 'David', '202 Cedar Rd', 'Phoenix'); level = Column(String(50))
""" publisher = Column(String(255))
class_name = Column(String(50))
group = Column(String(50))
profile = Column(String(255))
max_points = Column(Integer)
teacher = Column(String(255))
file_path = Column(String(255))
student_count = Column(Integer)
class Event(Base):
__tablename__ = "events"
id = Column(Integer, primary_key=True, index=True)
role_id = Column(Integer, ForeignKey("roles.id"), nullable=False)
student_id = Column(Integer, ForeignKey("students.id"), nullable=False)
criteria_id = Column(Integer, ForeignKey("criteria.id"), nullable=False)
description = Column(String(255))
event_date = Column(DateTime)
role = relationship("Role")
student = relationship("Student")
criteria = relationship("Criteria")

View File

@ -1,19 +1,83 @@
from pydantic import BaseModel, Field from pydantic import BaseModel
from datetime import datetime
# Schemat do tworzenia nowej osoby (POST) class CriteriaBase(BaseModel):
class PersonCreate(BaseModel): name: str
last_name: str = Field(..., description="Nazwisko osoby", example="Kowalski")
first_name: str = Field(..., description="Imię osoby", example="Jan")
address: str | None = None
city: str | None = None
# Schemat reprezentujący osobę (GET) class CriteriaCreate(CriteriaBase):
class Person(BaseModel): pass
person_id: int
last_name: str class Criteria(CriteriaBase):
first_name: str id: int
address: str | None = None
city: str | None = None class Config:
orm_mode = True
class RoleBase(BaseModel):
name: str
class RoleCreate(RoleBase):
pass
class Role(RoleBase):
id: int
class Config:
orm_mode = True
class StudentBase(BaseModel):
first_name: str
last_name: str
grade: str
points: int
status: int
class StudentCreate(StudentBase):
pass
class Student(StudentBase):
id: int
class Config:
orm_mode = True
class ClassInfoBase(BaseModel):
school: str
city: str
year: str
semester: str
subject: str
level: str
publisher: str
class_name: str
group: str
profile: str
max_points: int
teacher: str
file_path: str
student_count: int
class ClassInfoCreate(ClassInfoBase):
pass
class ClassInfo(ClassInfoBase):
id: int
class Config:
orm_mode = True
class EventBase(BaseModel):
role_id: int
student_id: int
criteria_id: int
description: str
event_date: datetime
class EventCreate(EventBase):
pass
class Event(EventBase):
id: int
class Config: class Config:
orm_mode = True orm_mode = True