This commit is contained in:
Андрей Дувакин 2025-01-07 17:48:14 +05:00
parent 191c2fc6f2
commit 42a4fe0539
3 changed files with 262 additions and 0 deletions

View File

@ -22,6 +22,8 @@ class Department(base):
title = Column(VARCHAR(100))
description = Column(VARCHAR(1000))
parent_id = Column(Integer, ForeignKey('departments.id'))
class User(base):
__tablename__ = 'users'

198
Desktop/data/connect.py Normal file
View File

@ -0,0 +1,198 @@
from sqlalchemy import create_engine, Column, Integer, VARCHAR, Float, ForeignKey, Date, Text, Boolean, DateTime
from sqlalchemy.orm import Session, sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
base = declarative_base()
__factory = None
class Post(base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
users = relationship('User', back_populates='post')
class Department(base):
__tablename__ = 'departments'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
description = Column(VARCHAR(1000))
parent_id = Column(Integer, ForeignKey('departments.id'))
class User(base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autoincrement=True)
first_name = Column(VARCHAR(100))
last_name = Column(VARCHAR(100))
patronymic = Column(VARCHAR(100))
work_phone = Column(VARCHAR(20))
phone = Column(VARCHAR(20))
office = Column(VARCHAR(10))
birthday = Column(Date)
other_info = Column(Text)
email = Column(VARCHAR(100))
password = Column(VARCHAR(150))
helper_id = Column(Integer, ForeignKey('users.id'))
director_id = Column(Integer, ForeignKey('users.id'))
post_id = Column(Integer, ForeignKey('posts.id'))
department_id = Column(Integer, ForeignKey('departments.id'))
post = relationship('Post', back_populates='users')
comments = relationship('Comment', back_populates='user')
class DepartmentUser(base):
__tablename__ = 'department_users'
id = Column(Integer, primary_key=True, autoincrement=True)
department_id = Column(Integer, ForeignKey('departments.id'))
user_id = Column(Integer, ForeignKey('users.id'))
class DocumentCategory(base):
__tablename__ = 'document_categories'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
documents = relationship('Document', back_populates='category')
class Document(base):
__tablename__ = 'documents'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
date_created = Column(DateTime)
date_updated = Column(DateTime)
category_id = Column(Integer, ForeignKey('document_categories.id'))
category = relationship('DocumentCategory', back_populates='documents')
comments = relationship('Comment', back_populates='document')
class Comment(base):
__tablename__ = 'comments'
id = Column(Integer, primary_key=True, autoincrement=True)
text = Column(Text)
date_created = Column(DateTime)
date_updated = Column(DateTime)
user_id = Column(Integer, ForeignKey('users.id'))
document_id = Column(Integer, ForeignKey('documents.id'))
document = relationship('Document', back_populates='comments')
user = relationship('User', back_populates='comments')
class MaterialType(base):
__tablename__ = 'material_types'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
class MaterialStatus(base):
__tablename__ = 'material_statuses'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
class Material(base):
__tablename__ = 'materials'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
success_date = Column(Date)
edit_date = Column(DateTime)
area = Column(Text)
user_id = Column(Integer, ForeignKey('users.id'))
status_id = Column(Integer, ForeignKey('material_statuses.id'))
type_id = Column(Integer, ForeignKey('material_types.id'))
class EventType(base):
__tablename__ = 'event_types'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
class EventStatus(base):
__tablename__ = 'event_statuses'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
class Event(base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(VARCHAR(100))
datetime_event = Column(DateTime)
short_description = Column(VARCHAR(1500))
type_id = Column(Integer, ForeignKey('event_types.id'))
status_id = Column(Integer, ForeignKey('event_statuses.id'))
class DepartmentEvent(base):
__tablename__ = 'department_events'
id = Column(Integer, primary_key=True, autoincrement=True)
event_id = Column(Integer, ForeignKey('events.id'))
department_id = Column(Integer, ForeignKey('departments.id'))
class ResponsibleUser(base):
__tablename__ = 'responsible_users'
id = Column(Integer, primary_key=True, autoincrement=True)
event_id = Column(Integer, ForeignKey('events.id'))
user_id = Column(Integer, ForeignKey('users.id'))
class UserEvent(base):
__tablename__ = 'user_events'
id = Column(Integer, primary_key=True, autoincrement=True)
event_id = Column(Integer, ForeignKey('events.id'))
user_id = Column(Integer, ForeignKey('users.id'))
class WorkingCalendar(base):
__tablename__ = 'workingcalendar'
id = Column(Integer, primary_key=True, autoincrement=True)
exceptiondate = Column(Date)
isworkingday = Column(Boolean)
def init_db():
eng = create_engine(
'postgresql+psycopg2://postgres:2509@localhost:5432/prb1'
)
global __factory
__factory = sessionmaker(bind=eng)
base.metadata.create_all(eng)
def connect() -> Session:
global __factory
return __factory()

62
Desktop/main.py Normal file
View File

@ -0,0 +1,62 @@
import sys
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QPushButton, QGraphicsProxyWidget
from PyQt5.QtGui import QPen
from PyQt5.QtCore import Qt
from Desktop.data.connect import connect, Department, init_db
class DepartmentGraph(QGraphicsView):
def __init__(self, parent=None):
super().__init__(parent)
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
with connect() as session:
self.departments = session.query(Department).all() # Список департаментов с их иерархией
self.nodes = {}
self.render_graph()
def render_graph(self):
root_departments = [d for d in self.departments if d.parent_id is None]
x, y = 50, 50 # Начальные координаты
for root in root_departments:
self.add_department_node(root, x, y)
x += 200 # Расстояние между корневыми узлами
def add_department_node(self, department, x, y, parent_item=None):
# Создаем кнопку
button = QPushButton(department.title)
proxy = QGraphicsProxyWidget()
proxy.setWidget(button)
proxy.setPos(x, y)
self.scene.addItem(proxy)
# Сохраняем узел
self.nodes[department.id] = proxy
# Если есть родитель, добавляем линию
if parent_item:
parent_center = parent_item.sceneBoundingRect().center()
current_center = proxy.sceneBoundingRect().center()
line = self.scene.addLine(parent_center.x(), parent_center.y(), current_center.x(), current_center.y(),
QPen(Qt.black))
# Рекурсивно добавляем подразделы
child_departments = [d for d in self.departments if d.parent_id == department.id]
child_x = x - len(child_departments) * 100 // 2
for child in child_departments:
self.add_department_node(child, child_x, y + 100, proxy)
child_x += 200
if __name__ == "__main__":
init_db()
app = QApplication(sys.argv)
window = DepartmentGraph()
window.setWindowTitle("Иерархия департаментов")
window.resize(800, 600)
window.show()
sys.exit(app.exec_())