From 0552be01bd3dc492ff20e41e270c568fb2e6925c Mon Sep 17 00:00:00 2001 From: SERTY Date: Sun, 5 May 2024 17:40:48 +0300 Subject: [PATCH] rebuild 0.0.2 --- .gitignore | 3 +- app.py | 302 ++++++++++++++++++++++++++++++++++++++++++++++++ base.db-journal | Bin 0 -> 21032 bytes models.py | 101 ++++++++++++++++ newapp.py | 1 - scripts.py | 21 ++++ 6 files changed, 426 insertions(+), 2 deletions(-) create mode 100644 app.py create mode 100644 base.db-journal create mode 100644 models.py delete mode 100644 newapp.py create mode 100644 scripts.py diff --git a/.gitignore b/.gitignore index e0ab011..c361c47 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .venv .env docker-compose.yml -*.db \ No newline at end of file +*.db +__* \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..f4e248c --- /dev/null +++ b/app.py @@ -0,0 +1,302 @@ +from scripts import req_from_sd as req +from models import Company, Server, Workstation, Fiscalnik, session_instance, OFDName, SrokFN, ModelKKT +import json + +def fill_companies(): + metaclass = 'ou$company' + attrs = 'adress,title,UUID,KEsInUse,additionalName,childOUs, parent' + response = req(metaclass, attrs) + + if response: + companies_json = json.loads(response) + for company_json in companies_json: + company = Company( + uuid = company_json['UUID'], + title = company_json['title'], + address = company_json['adress'], + additional_name = company_json['additionalName'] if 'additionalName' in company_json else None + ) + try: + session_instance.add(company) + session_instance.flush() + except: + session_instance.rollback() + print(company_json['title']) + continue + kes_in_use = company_json['KEsInUse'] + for kes in kes_in_use: + meta_class = kes['metaClass'] + equipment_uuid = kes['UUID'] + if meta_class == 'objectBase$Server': + server = Server( + uuid = equipment_uuid + ) + company.servers.append(server) + if meta_class == 'objectBase$Workstation': + workstation = Workstation( + uuid = equipment_uuid + ) + company.workstations.append(workstation) + if meta_class == 'objectBase$FR': + fiscal = Fiscalnik( + uuid = equipment_uuid + ) + company.fiscals.append(fiscal) + session_instance.commit() + +def fill_servers(): + metaclass = 'objectBase$Server' + attrs = 'UniqueID,UUID,Teamviewer,AnyDesk,RDP,IP,CabinetLink,DeviceName,owner' + response = req(metaclass, attrs) + + if response: + servers_json = json.loads(response) + for server_json in servers_json: + existing_server = session_instance.query(Server).filter_by(uuid=server_json['UUID']).first() + if existing_server: + existing_server.Teamviewer = server_json.get('Teamviewer') if 'Teamviewer' in server_json else None + existing_server.UniqueID = server_json.get('UniqueID') if 'UniqueID' in server_json else None + existing_server.AnyDesk = server_json.get('AnyDesk') if 'AnyDesk' in server_json else None + existing_server.rdp = server_json.get('RDP') if 'RDP' in server_json else None + existing_server.ip = server_json.get('IP') if 'IP' in server_json else None + existing_server.CabinetLink = server_json.get('CabinetLink') if 'CabinetLink' in server_json else None + existing_server.DeviceName = server_json.get('DeviceName') if 'DeviceName' in server_json else None + if 'owner' in server_json and server_json['owner']: + owner_uuid = server_json['owner']['UUID'] + if owner_uuid: + company = session_instance.query(Company).filter_by(uuid=owner_uuid).first() + if company: + existing_server.owner = company + session_instance.add(existing_server) + session_instance.refresh(existing_server) + else: + server = Server( + uuid=server_json['UUID'], + UniqueID=server_json['UniqueID'], + Teamviewer=server_json['Teamviewer'] if 'Teamviewer' in server_json else None, + AnyDesk=server_json['AnyDesk'] if 'AnyDesk' in server_json else None, + rdp=server_json['RDP'] if 'RDP' in server_json else None, + ip=server_json['IP'] if 'IP' in server_json else None, + CabinetLink=server_json['CabinetLink'] if 'CabinetLink' in server_json else None, + DeviceName=server_json['DeviceName'] if 'DeviceName' in server_json else None + ) + if 'owner' in server_json and server_json['owner']: + owner_uuid = server_json['owner']['UUID'] + if owner_uuid: + company = session_instance.query(Company).filter_by(uuid=owner_uuid).first() + if company: + server.owner = company + try: + session_instance.add(server) + session_instance.flush() + except: + session_instance.rollback() + print(server_json['UniqueID']) + continue + + session_instance.commit() + +def fill_workstations(): + metaclass = 'objectBase$Workstation' + attrs = 'UUID,AnyDesk,Teamviewer,DeviceName,owner' + response = req(metaclass, attrs) + + if response: + workstations_json = json.loads(response) + for workstation_json in workstations_json: + existing_workstation = session_instance.query(Workstation).filter_by(uuid=workstation_json['UUID']).first() + if existing_workstation: + existing_workstation.AnyDesk = workstation_json.get('AnyDesk') if 'AnyDesk' in workstation_json else None + existing_workstation.Teamviewer = workstation_json.get('Teamviewer') if 'Teamviewer' in workstation_json else None + existing_workstation.DeviceName = workstation_json.get('DeviceName') if 'DeviceName' in workstation_json else None + if 'owner' in workstation_json and workstation_json['owner']: + owner_uuid = workstation_json['owner']['UUID'] + if owner_uuid: + company = session_instance.query(Company).filter_by(uuid=owner_uuid).first() + if company: + existing_workstation.owner = company + session_instance.add(existing_workstation) + session_instance.refresh(existing_workstation) + else: + workstation = Workstation( + uuid = workstation_json['UUID'], + AnyDesk = workstation_json['AnyDesk'] if 'AnyDesk' in workstation_json else None, + Teamviewer = workstation_json['Teamviewer'] if 'Teamviewer' in workstation_json else None, + DeviceName = workstation_json['DeviceName'] if 'DeviceName' in workstation_json else None + ) + if 'owner' in workstation_json and workstation_json['owner']: + owner_uuid = workstation_json['owner']['UUID'] + if owner_uuid: + company = session_instance.query(Company).filter_by(uuid=owner_uuid).first() + if company: + workstation.owner = company + try: + session_instance.add(workstation) + session_instance.flush() + except: + session_instance.rollback() + print(workstation_json['DeviceName']) + continue + session_instance.commit() + +def fill_fiscals(): + metaclass = 'objectBase$FR' + attrs = 'RNKKT,KKTRegDate,OFDName,UUID,FNExpireDate,LegalName,FRSerialNumber,ModelKKT,SrokFN,FNNumber,owner' + response = req(metaclass, attrs) + + if response: + fiscals_json = json.loads(response) + for fiscal_json in fiscals_json: + existing_fiscal = session_instance.query(Fiscalnik).filter_by(uuid=fiscal_json['UUID']).first() + if existing_fiscal: + existing_fiscal.rnkkt = fiscal_json.get('RNKKT') + existing_fiscal.KKTRegDate = fiscal_json.get('KKTRegDate') + existing_fiscal.FNExpireDate = fiscal_json.get('FNExpireDate') + existing_fiscal.LegalName = fiscal_json.get('LegalName') + existing_fiscal.FRSerialNumber = fiscal_json.get('FRSerialNumber') + existing_fiscal.FNNumber = fiscal_json.get('FNNumber') + if 'owner' in fiscal_json and fiscal_json['owner']: + owner_uuid = fiscal_json['owner']['UUID'] + if owner_uuid: + company = session_instance.query(Company).filter_by(uuid=owner_uuid).first() + if company: + existing_fiscal.owner = company + session_instance.add(existing_fiscal) + if 'OFDName' in fiscal_json and fiscal_json['OFDName'] is not None: + ofd_name_uuid = fiscal_json['OFDName']['UUID'] + if ofd_name_uuid: + ofd_name = session_instance.query(OFDName).filter_by(uuid=ofd_name_uuid).first() + if ofd_name: + existing_fiscal.ofd = ofd_name + model_kkt_uuid = fiscal_json['ModelKKT']['UUID'] + if model_kkt_uuid: + model_kkt = session_instance.query(ModelKKT).filter_by(uuid=model_kkt_uuid).first() + if model_kkt: + existing_fiscal.model_kkt = model_kkt + srok_fn_uuid = fiscal_json['SrokFN']['UUID'] + if srok_fn_uuid: + srok_fn = session_instance.query(SrokFN).filter_by(uuid=srok_fn_uuid).first() + if srok_fn: + existing_fiscal.srok_fn = srok_fn + session_instance.refresh(existing_fiscal) + else: + fiscal = Fiscalnik( + uuid=fiscal_json['UUID'], + rnkkt=fiscal_json['RNKKT'], + KKTRegDate=fiscal_json['KKTRegDate'], + FNExpireDate=fiscal_json['FNExpireDate'], + LegalName=fiscal_json['LegalName'], + FRSerialNumber=fiscal_json['FRSerialNumber'], + FNNumber=fiscal_json['FNNumber'] + ) + if 'owner' in fiscal_json and fiscal_json['owner']: + owner_uuid = fiscal_json['owner']['UUID'] + if owner_uuid: + company = session_instance.query(Company).filter_by(uuid=owner_uuid).first() + if company: + fiscal.owner = company + if 'OFDName' in fiscal_json and fiscal_json['OFDName'] is not None: + ofd_name_uuid = fiscal_json['OFDName']['UUID'] + if ofd_name_uuid: + ofd_name = session_instance.query(OFDName).filter_by(uuid=ofd_name_uuid).first() + if ofd_name: + fiscal.ofd = ofd_name + model_kkt_uuid = fiscal_json['ModelKKT']['UUID'] + if model_kkt_uuid: + model_kkt = session_instance.query(ModelKKT).filter_by(uuid=model_kkt_uuid).first() + if model_kkt: + fiscal.model_kkt = model_kkt + srok_fn_uuid = fiscal_json['SrokFN']['UUID'] + if srok_fn_uuid: + srok_fn = session_instance.query(SrokFN).filter_by(uuid=srok_fn_uuid).first() + if srok_fn: + fiscal.srok_fn = srok_fn + try: + session_instance.add(fiscal) + session_instance.flush() + except: + session_instance.rollback() + print(fiscal_json['LegalName']) + continue + session_instance.commit() + +def fill_ofd_names(): + metaclass = 'OFD' + attrs = 'title,code,UUID' + response = req(metaclass, attrs) + + if response: + ofd_names_json = json.loads(response) + for ofd_name_json in ofd_names_json: + ofd_name = OFDName( + uuid=ofd_name_json['UUID'], + title=ofd_name_json['title'], + code=ofd_name_json['code'] + ) + try: + session_instance.add(ofd_name) + session_instance.flush() + except: + session_instance.rollback() + print(ofd_name_json['title']) + continue + + session_instance.commit() + + +def fill_model_kkts(): + metaclass = 'ModeliFR' + attrs = 'title,code,UUID' + response = req(metaclass, attrs) + + if response: + model_kkts_json = json.loads(response) + for model_kkt_json in model_kkts_json: + model_kkt = ModelKKT( + uuid=model_kkt_json['UUID'], + title=model_kkt_json['title'], + code=model_kkt_json['code'] + ) + try: + session_instance.add(model_kkt) + session_instance.flush() + except: + session_instance.rollback() + print(model_kkt_json['title']) + continue + + session_instance.commit() + + +def fill_sroki_fns(): + metaclass = 'SrokiFN' + attrs = 'title,code,UUID' + response = req(metaclass, attrs) + + if response: + sroki_fns_json = json.loads(response) + for srok_fn_json in sroki_fns_json: + srok_fn = SrokFN( + uuid=srok_fn_json['UUID'], + title=srok_fn_json['title'], + code=srok_fn_json['code'] + ) + try: + session_instance.add(srok_fn) + session_instance.flush() + except: + session_instance.rollback() + print(srok_fn_json['title']) + continue + + session_instance.commit() + + +if __name__ == '__main__': + fill_companies() + fill_servers() + fill_workstations() + fill_ofd_names() + fill_model_kkts() + fill_sroki_fns() + fill_fiscals() diff --git a/base.db-journal b/base.db-journal new file mode 100644 index 0000000000000000000000000000000000000000..7ae6825167e712a6a6aa46785170f2c099237127 GIT binary patch literal 21032 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 Yl`#!Xt2JTkms!XpN|;TYi4NZPZ{g|;QUCw| literal 0 HcmV?d00001 diff --git a/models.py b/models.py new file mode 100644 index 0000000..506a71c --- /dev/null +++ b/models.py @@ -0,0 +1,101 @@ +from sqlalchemy import create_engine, Column, String, String, ForeignKey, event +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship, sessionmaker +from typing import Optional, Annotated + +c_uuid = Annotated[str, ForeignKey('companies.uuid')] + +Base = declarative_base() + +class Company(Base): + __tablename__ = 'companies' + + uuid = Column(String, primary_key=True) + title = Column(String) + address = Column(String) + additional_name = Column(String) + + servers = relationship("Server", back_populates="owner") + workstations = relationship("Workstation", back_populates="owner") + fiscals = relationship("Fiscalnik", back_populates="owner") + +class Server(Base): + __tablename__ = 'servers' + + uuid = Column(String, primary_key=True) + UniqueID = Column(String) + Teamviewer = Column(String) + AnyDesk = Column(String) + rdp = Column(String) + ip = Column(String) + CabinetLink = Column(String) + DeviceName = Column(String) + + company_uuid = c_uuid + owner = relationship("Company", back_populates="servers") + +class Workstation(Base): + __tablename__ = 'workstations' + + uuid = Column(String, primary_key=True) + AnyDesk = Column(String) + Teamviewer = Column(String) + DeviceName = Column(String) + + company_uuid = Column(String, ForeignKey('companies.uuid')) + owner = relationship("Company", back_populates="workstations") + +class Fiscalnik(Base): + __tablename__ = 'fiscals' + + uuid = Column(String, primary_key=True) + rnkkt = Column(String) + LegalName = Column(String) + FNNumber = Column(String) + KKTRegDate = Column(String) + FNExpireDate = Column(String) + FRSerialNumber = Column(String) + + company_uuid = Column(String, ForeignKey('companies.uuid')) + owner = relationship("Company", back_populates="fiscals") + + # Внешние ключи для связи с вспомогательными таблицами + ofd_uuid = Column(String, ForeignKey('ofd_names.uuid')) + ofd = relationship("OFDName") + model_kkt_uuid = Column(String, ForeignKey('model_kkts.uuid')) + model_kkt = relationship("ModelKKT") + srok_fn_uuid = Column(String, ForeignKey('sroki_fns.uuid')) + srok_fn = relationship("SrokFN") + +class OFDName(Base): + __tablename__ = 'ofd_names' + + uuid = Column(String, primary_key=True) + title = Column(String) + code = Column(String) + def __repr__(self): + return self.title + +class ModelKKT(Base): + __tablename__ = 'model_kkts' + + uuid = Column(String, primary_key=True) + title = Column(String) + code = Column(String) + def __repr__(self): + return self.title + +class SrokFN(Base): + __tablename__ = 'sroki_fns' + + uuid = Column(String, primary_key=True) + title = Column(String) + code = Column(String) + def __repr__(self): + return self.title + +engine = create_engine('sqlite:///base.db') +session_factory = sessionmaker(bind=engine) +session_instance = session_factory() + +Base.metadata.create_all(engine) diff --git a/newapp.py b/newapp.py deleted file mode 100644 index ee8226e..0000000 --- a/newapp.py +++ /dev/null @@ -1 +0,0 @@ -#newapp will be here \ No newline at end of file diff --git a/scripts.py b/scripts.py new file mode 100644 index 0000000..51d2f96 --- /dev/null +++ b/scripts.py @@ -0,0 +1,21 @@ +import os +import sys +import requests + +def req_from_sd(metaclass, attrs): + url = f'https://myhoreca.itsm365.com/sd/services/rest/find/{metaclass}' + access_key = os.getenv('SDKEY') + if access_key is None: + sys.stderr.write("Ошибка: Не удалось получить доступный ключ для запроса\n") + sys.exit(1) + + params = {'accessKey': access_key, 'attrs': attrs} + response = requests.post(url, params=params) + + if response.status_code == 201: + sys.stdout.write("Успешно добавлено\n") + elif response.status_code == 200: + return response.text + elif response.status_code == 500: + sys.stderr.write("Ошибка подключения: " + str.strip(response.text) + '\n') + sys.exit(1)