Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create Entities #57

Merged
merged 1 commit into from
Apr 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions Code/entities/local/label.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, ForeignKey
from utils.base import Base


class Label(Base):
__tablename__ = 'label'

label_id = Column(Integer, primary_key=True, autoincrement=True)
task_id = Column(Integer, ForeignKey('task.task_id', ondelete='CASCADE'))
priority_id = Column(Integer, ForeignKey('priority.priority_id'))
size_id = Column(Integer, ForeignKey('size.size_id'))
type_id = Column(Integer, ForeignKey('type.type_id'))
status_id = Column(Integer, ForeignKey('status.status_id'))

task = relationship("Task", back_populates="label")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такой же вопрос - в конструкторе Task указан labels, тут label

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не прописан cascade на случай удаления задачи

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

labels - лишнее поле, которое я уберу
должен быть лишь label, который является отношением для создания связи один ко одному

ок, cascade посмотрю и добавлю

priority = relationship("Priority", back_populates="labels")
size = relationship("Size", back_populates="labels")
_type = relationship("Type", back_populates="labels")
status = relationship("Status", back_populates="labels")

def __init__(self, task, priority=None, size=None, _type=None, status=None):
self.task = task
self.priority = priority
self.size = size
self.type = type
self.status = status
22 changes: 22 additions & 0 deletions Code/entities/local/labels/priority.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from utils.base import Base
from entities.local.server import Server
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey


class Priority(Base):
__tablename__ = 'priority'

priority_id = Column(Integer, primary_key=True, autoincrement=True)
server_id = Column(Integer, ForeignKey('server.server_id', ondelete='CASCADE'))
name = Column(String)

# M:1
server = relationship("Server", back_populates="priorities")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужен cascade при удалении сервера

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такой же вопрос к сущностям Size, Status, Type


# 1:M
labels = relationship("Label", back_populates="priority")

def __init__(self, server: Server, name: str):
self.server = server
self.name = name
21 changes: 21 additions & 0 deletions Code/entities/local/labels/size.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from utils.base import Base
from entities.local.server import Server
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey


class Size(Base):
__tablename__ = 'size'

size_id = Column(Integer, primary_key=True, autoincrement=True)
server_id = Column(Integer, ForeignKey('server.server_id', ondelete='CASCADE'))
name = Column(String)

server = relationship("Server", back_populates="sizes")

# 1:M
labels = relationship("Label", back_populates="size")

def __init__(self, server: Server, name: str):
self.server = server
self.name = name
22 changes: 22 additions & 0 deletions Code/entities/local/labels/status.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from utils.base import Base
from entities.local.server import Server
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey


class Status(Base):
__tablename__ = 'status'

status_id = Column(Integer, primary_key=True, autoincrement=True)
server_id = Column(Integer, ForeignKey('server.server_id', ondelete='CASCADE'))
name = Column(String)

server = relationship("Server", back_populates="statuses")

# 1:M
labels = relationship("Label", back_populates="status")


def __init__(self, server: Server, name: str):
self.server = server
self.name = name
22 changes: 22 additions & 0 deletions Code/entities/local/labels/type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from utils.base import Base
from entities.local.server import Server
from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey


class Type(Base):
__tablename__ = 'type'

type_id = Column(Integer, primary_key=True, autoincrement=True)
server_id = Column(Integer, ForeignKey('server.server_id', ondelete='CASCADE'))
name = Column(String)

# M:1
server = relationship("Server", back_populates="types")

# 1:M
labels = relationship("Label", back_populates="type")

def __init__(self, server: Server, name: str):
self.server = server
self.name = name
29 changes: 29 additions & 0 deletions Code/entities/local/server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from utils.base import Base


class Server(Base):
__tablename__ = 'server'

# primary key
server_id = Column(Integer, primary_key=True, autoincrement=True)

# other fields
email = Column(String)
name = Column(String)
password = Column(String)
uri = Column(String)

# 1:M
tasks = relationship("Task", cascade="all,delete", back_populates="server")
priorities = relationship("Priority", cascade="all,delete", back_populates="server")
sizes = relationship("Size", cascade="all,delete", back_populates="server")
types = relationship("Type", cascade="all,delete", back_populates="server")
statuses = relationship("Status", cascade="all,delete", back_populates="server")

def __init__(self, email, name, password, uri):
self.email = email
self.name = name
self.password = password
self.uri = uri
50 changes: 50 additions & 0 deletions Code/entities/local/task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from utils.base import Base
from entities.local.server import Server
from datetime import datetime
from sqlalchemy.orm import relationship, backref
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey


class Task(Base):

__tablename__ = "task"

# keys
task_id = Column(Integer, primary_key=True, autoincrement=True)
server_id = Column(Integer, ForeignKey('server.server_id', ondelete='CASCADE'))
parent_id = Column(Integer, ForeignKey("task.task_id", ondelete='CASCADE'))

# M:1
server = relationship("Server", back_populates="tasks")

# 1:1
label = relationship("Label", back_populates="task")

# 1:M
children = relationship("Task", cascade="all", backref=backref("parent", remote_side="Task.task_id"))

# other fields
# caldav fields
dtstamp = Column(DateTime)
dtstart = Column(DateTime)
due = Column(DateTime)
last_mod = Column(DateTime)

summary = Column(String)
description = Column(String)

# own fields
tech_status = Column(Integer)

def __init__(self, server: Server, dtstamp: datetime, dtstart: datetime, due: datetime,
last_mod: datetime, summary: str, description: str,
tech_status: int, parent=None):
self.dtstamp = dtstamp
self.dtstart = dtstart
self.due = due
self.last_mod = last_mod
self.summary = summary
self.description = description
self.tech_status = tech_status
self.server = server
self.parent = parent
5 changes: 2 additions & 3 deletions Code/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

from PyQt6.QtGui import QGuiApplication
from PyQt6.QtQml import QQmlApplicationEngine
#from pathlib import Path

if __name__ =='__main__':
# from pathlib import Path

if __name__ == '__main__':
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load('QmlWindows/AuthWindow.qml') # файл с кодом QML основного окна
sys.exit(app.exec()) # запустить цикл события

20 changes: 20 additions & 0 deletions Code/utils/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from time import time
from datetime import datetime, timezone
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker


engine = create_engine('sqlite:///./test.db', echo=False)
Base = declarative_base()
Session = sessionmaker(bind=engine)


def local_to_utc(dt: datetime):
return dt.astimezone(timezone.utc)


def utc_to_local(dt: datetime):
now_timestamp = time()
offset = datetime.fromtimestamp(now_timestamp) - datetime.utcfromtimestamp(now_timestamp)
return dt + offset