From 42a4fe0539ebc1f17604952358aa7096bbba2696 Mon Sep 17 00:00:00 2001 From: andrei Date: Tue, 7 Jan 2025 17:48:14 +0500 Subject: [PATCH] ._. --- API/data/connect.py | 2 + Desktop/data/connect.py | 198 ++++++++++++++++++++++++++++++++++++++++ Desktop/main.py | 62 +++++++++++++ 3 files changed, 262 insertions(+) create mode 100644 Desktop/data/connect.py create mode 100644 Desktop/main.py diff --git a/API/data/connect.py b/API/data/connect.py index 41583e6..6727512 100644 --- a/API/data/connect.py +++ b/API/data/connect.py @@ -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' diff --git a/Desktop/data/connect.py b/Desktop/data/connect.py new file mode 100644 index 0000000..6727512 --- /dev/null +++ b/Desktop/data/connect.py @@ -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() diff --git a/Desktop/main.py b/Desktop/main.py new file mode 100644 index 0000000..1207008 --- /dev/null +++ b/Desktop/main.py @@ -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_())