@ -0,0 +1,134 @@ |
|||||||
|
# Byte-compiled / optimized / DLL files |
||||||
|
__pycache__/ |
||||||
|
*.py[cod] |
||||||
|
*$py.class |
||||||
|
|
||||||
|
# C extensions |
||||||
|
*.so |
||||||
|
|
||||||
|
# Distribution / packaging |
||||||
|
.Python |
||||||
|
build/ |
||||||
|
develop-eggs/ |
||||||
|
dist/ |
||||||
|
downloads/ |
||||||
|
eggs/ |
||||||
|
.eggs/ |
||||||
|
lib/ |
||||||
|
lib64/ |
||||||
|
parts/ |
||||||
|
sdist/ |
||||||
|
var/ |
||||||
|
wheels/ |
||||||
|
pip-wheel-metadata/ |
||||||
|
share/python-wheels/ |
||||||
|
*.egg-info/ |
||||||
|
.installed.cfg |
||||||
|
*.egg |
||||||
|
MANIFEST |
||||||
|
|
||||||
|
# PyInstaller |
||||||
|
# Usually these files are written by a python script from a template |
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it. |
||||||
|
*.manifest |
||||||
|
*.spec |
||||||
|
|
||||||
|
# Installer logs |
||||||
|
pip-log.txt |
||||||
|
pip-delete-this-directory.txt |
||||||
|
|
||||||
|
# Unit test / coverage reports |
||||||
|
htmlcov/ |
||||||
|
.tox/ |
||||||
|
.nox/ |
||||||
|
.coverage |
||||||
|
.coverage.* |
||||||
|
.cache |
||||||
|
nosetests.xml |
||||||
|
coverage.xml |
||||||
|
*.cover |
||||||
|
*.py,cover |
||||||
|
.hypothesis/ |
||||||
|
.pytest_cache/ |
||||||
|
|
||||||
|
# Translations |
||||||
|
*.mo |
||||||
|
*.pot |
||||||
|
|
||||||
|
# Django stuff: |
||||||
|
*.log |
||||||
|
local_settings.py |
||||||
|
db.sqlite3 |
||||||
|
db.sqlite3-journal |
||||||
|
|
||||||
|
# Flask stuff: |
||||||
|
instance/ |
||||||
|
.webassets-cache |
||||||
|
|
||||||
|
# Scrapy stuff: |
||||||
|
.scrapy |
||||||
|
|
||||||
|
# Sphinx documentation |
||||||
|
docs/_build/ |
||||||
|
|
||||||
|
# PyBuilder |
||||||
|
target/ |
||||||
|
|
||||||
|
# Jupyter Notebook |
||||||
|
.ipynb_checkpoints |
||||||
|
|
||||||
|
# IPython |
||||||
|
profile_default/ |
||||||
|
ipython_config.py |
||||||
|
|
||||||
|
# pyenv |
||||||
|
.python-version |
||||||
|
|
||||||
|
# pipenv |
||||||
|
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. |
||||||
|
# However, in case of collaboration, if having platform-specific dependencies or dependencies |
||||||
|
# having no cross-platform support, pipenv may install dependencies that don't work, or not |
||||||
|
# install all needed dependencies. |
||||||
|
#Pipfile.lock |
||||||
|
|
||||||
|
# PEP 582; used by e.g. github.com/David-OConnor/pyflow |
||||||
|
__pypackages__/ |
||||||
|
|
||||||
|
# Celery stuff |
||||||
|
celerybeat-schedule |
||||||
|
celerybeat.pid |
||||||
|
|
||||||
|
# SageMath parsed files |
||||||
|
*.sage.py |
||||||
|
|
||||||
|
# Environments |
||||||
|
.env |
||||||
|
.venv |
||||||
|
env/ |
||||||
|
venv/ |
||||||
|
ENV/ |
||||||
|
env.bak/ |
||||||
|
venv.bak/ |
||||||
|
|
||||||
|
# Spyder project settings |
||||||
|
.spyderproject |
||||||
|
.spyproject |
||||||
|
|
||||||
|
# Rope project settings |
||||||
|
.ropeproject |
||||||
|
|
||||||
|
# mkdocs documentation |
||||||
|
/site |
||||||
|
|
||||||
|
# mypy |
||||||
|
.mypy_cache/ |
||||||
|
.dmypy.json |
||||||
|
dmypy.json |
||||||
|
|
||||||
|
# Pyre type checker |
||||||
|
.pyre/ |
||||||
|
|
||||||
|
# Custom |
||||||
|
.idea/ |
||||||
|
all_data/ |
||||||
|
.DS_Store |
@ -0,0 +1,609 @@ |
|||||||
|
from enum import Enum |
||||||
|
|
||||||
|
# Variable Constants for MainDriver.py |
||||||
|
HELP_SITE = "https://git.library.upei.ca/mbelvadi/COUNTER-5-Report-Tool/wiki" |
||||||
|
|
||||||
|
# region Variable Constants for ManageDB |
||||||
|
|
||||||
|
# region field and table definitions |
||||||
|
# region dictionary keys |
||||||
|
NAME_KEY = 'name' |
||||||
|
TYPE_KEY = 'type' |
||||||
|
OPTIONS_KEY = 'options' |
||||||
|
REPORTS_KEY = 'reports' |
||||||
|
CALCULATION_KEY = 'calculation' |
||||||
|
SOURCE_KEY = 'source' |
||||||
|
|
||||||
|
FIELD_KEY = 'field' |
||||||
|
COMPARISON_KEY = 'comparison' |
||||||
|
VALUE_KEY = 'value' |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region header definition |
||||||
|
HEADER_ENTRIES = ('report_name', 'report_id', 'release', 'institution_name', 'institution_id', 'metric_types', |
||||||
|
'report_filters', 'report_attributes', 'exceptions', 'reporting_period', 'created', 'created_by') |
||||||
|
HEADER_ROWS = len(HEADER_ENTRIES) |
||||||
|
BLANK_ROWS = 1 |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region database report definitions |
||||||
|
DATABASE_REPORTS = ('DR', 'DR_D1', 'DR_D2') |
||||||
|
DATABASE_REPORTS_METRIC = ('Searches_Automated', |
||||||
|
'Searches_Federated', |
||||||
|
'Searches_Regular', |
||||||
|
'Total_Item_Investigations', |
||||||
|
'Total_Item_Requests', |
||||||
|
'Unique_Item_Investigations', |
||||||
|
'Unique_Item_Requests', |
||||||
|
'Unique_Title_Investigations', |
||||||
|
'Unique_Title_Requests', |
||||||
|
'Limit_Exceeded', |
||||||
|
'No_License') |
||||||
|
DATABASE_REPORTS_ATTRIBUTES = ("Data_Type", |
||||||
|
"Access_Method") |
||||||
|
DATABASE_REPORT_FIELDS = ({NAME_KEY: 'database', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('DR', 'DR_D1', 'DR_D2')}, |
||||||
|
{NAME_KEY: 'publisher', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('DR', 'DR_D1', 'DR_D2')}, |
||||||
|
{NAME_KEY: 'publisher_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('DR', 'DR_D1', 'DR_D2')}, |
||||||
|
{NAME_KEY: 'platform', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('DR', 'DR_D1', 'DR_D2')}, |
||||||
|
{NAME_KEY: 'proprietary_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('DR', 'DR_D1', 'DR_D2')}, |
||||||
|
{NAME_KEY: 'data_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('DR',)}, |
||||||
|
{NAME_KEY: 'access_method', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('DR',)}) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region item report definitions |
||||||
|
ITEM_REPORTS = ('IR', 'IR_A1', 'IR_M1') |
||||||
|
ITEM_REPORTS_METRIC = ('Total_Item_Investigations', |
||||||
|
'Total_Item_Requests', |
||||||
|
'Unique_Item_Investigations', |
||||||
|
'Unique_Item_Requests', |
||||||
|
'Limit_Exceeded', |
||||||
|
'No_License') |
||||||
|
ITEM_REPORTS_ATTRIBUTES = ("Data_Type", |
||||||
|
"Access_Type", |
||||||
|
"Access_Method", |
||||||
|
"YOP", |
||||||
|
"Authors", |
||||||
|
"Publication_Date", |
||||||
|
"Article_Version") |
||||||
|
ITEM_REPORT_FIELDS = ({NAME_KEY: 'item', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1', 'IR_M1')}, |
||||||
|
{NAME_KEY: 'publisher', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1', 'IR_M1')}, |
||||||
|
{NAME_KEY: 'publisher_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1', 'IR_M1')}, |
||||||
|
{NAME_KEY: 'platform', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1', 'IR_M1')}, |
||||||
|
{NAME_KEY: 'authors', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'publication_date', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'doi', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1', 'IR_M1')}, |
||||||
|
{NAME_KEY: 'proprietary_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1', 'IR_M1')}, |
||||||
|
{NAME_KEY: 'isbn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'print_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'online_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'uri', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1', 'IR_M1')}, |
||||||
|
{NAME_KEY: 'parent_title', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'parent_authors', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'parent_publication_date', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'parent_article_version', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'parent_data_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'parent_doi', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'parent_proprietary_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'parent_isbn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'parent_print_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'parent_online_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'parent_uri', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'component_title', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_authors', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_publication_date', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_data_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_doi', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_proprietary_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_isbn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_print_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_online_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'component_uri', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'data_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'yop', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}, |
||||||
|
{NAME_KEY: 'access_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR', 'IR_A1')}, |
||||||
|
{NAME_KEY: 'access_method', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('IR',)}) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region platform report definitions |
||||||
|
PLATFORM_REPORTS = ('PR', 'PR_P1') |
||||||
|
PLATFORM_REPORTS_METRIC = ('Searches_Platform', |
||||||
|
'Total_Item_Investigations', |
||||||
|
'Total_Item_Requests', |
||||||
|
'Unique_Item_Investigations', |
||||||
|
'Unique_Item_Requests', |
||||||
|
'Unique_Title_Investigations', |
||||||
|
'Unique_Title_Requests') |
||||||
|
PLATFORM_REPORTS_ATTRIBUTES = ("Data_Type", |
||||||
|
"Access_Method") |
||||||
|
PLATFORM_REPORT_FIELDS = ({NAME_KEY: 'platform', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('PR', 'PR_P1')}, |
||||||
|
{NAME_KEY: 'data_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('PR',)}, |
||||||
|
{NAME_KEY: 'access_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('PR',)}) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region title report definitions |
||||||
|
TITLE_REPORTS = ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4') |
||||||
|
TITLE_REPORTS_METRIC = ('Total_Item_Investigations', |
||||||
|
'Total_Item_Requests', |
||||||
|
'Unique_Item_Investigations', |
||||||
|
'Unique_Item_Requests', |
||||||
|
'Unique_Title_Investigations', |
||||||
|
'Unique_Title_Requests', |
||||||
|
'Limit_Exceeded', |
||||||
|
'No_License') |
||||||
|
TITLE_REPORTS_ATTRIBUTES = ("Data_Type", |
||||||
|
"Section_Type", |
||||||
|
"Access_Type", |
||||||
|
"Access_Method", |
||||||
|
"YOP") |
||||||
|
TITLE_REPORT_FIELDS = ({NAME_KEY: 'title', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'publisher', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'publisher_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'platform', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'doi', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'proprietary_id', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'isbn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3')}, |
||||||
|
{NAME_KEY: 'print_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'online_issn', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'uri', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J1', 'TR_J2', 'TR_J3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'data_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR',)}, |
||||||
|
{NAME_KEY: 'section_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR',)}, |
||||||
|
{NAME_KEY: 'yop', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B1', 'TR_B2', 'TR_B3', 'TR_J4')}, |
||||||
|
{NAME_KEY: 'access_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR', 'TR_B3', 'TR_J3')}, |
||||||
|
{NAME_KEY: 'access_method', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',), |
||||||
|
REPORTS_KEY: ('TR',)}) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region fields that all reports have |
||||||
|
ALL_REPORT_FIELDS = ({NAME_KEY: 'metric_type', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(metric_type <> \"\")')}, |
||||||
|
{NAME_KEY: 'vendor', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(vendor <> \"\")')}, |
||||||
|
{NAME_KEY: 'year', |
||||||
|
TYPE_KEY: 'INTEGER', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(LENGTH(year) = 4)')}, |
||||||
|
{NAME_KEY: 'month', |
||||||
|
TYPE_KEY: 'INTEGER', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(month BETWEEN 1 AND 12)')}, |
||||||
|
{NAME_KEY: 'metric', |
||||||
|
TYPE_KEY: 'INTEGER', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(metric > 0)')}, |
||||||
|
{NAME_KEY: 'updated_on', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',)}, |
||||||
|
{NAME_KEY: 'file', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL',)}) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region cost table fields |
||||||
|
COST_FIELDS = ({NAME_KEY: 'cost_in_original_currency', |
||||||
|
TYPE_KEY: 'REAL', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(cost_in_original_currency >= 0)')}, |
||||||
|
{NAME_KEY: 'original_currency', |
||||||
|
TYPE_KEY: 'TEXT', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(original_currency <> \"\")')}, |
||||||
|
{NAME_KEY: 'cost_in_local_currency', |
||||||
|
TYPE_KEY: 'REAL', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(cost_in_local_currency >= 0)')}, |
||||||
|
{NAME_KEY: 'cost_in_local_currency_with_tax', |
||||||
|
TYPE_KEY: 'REAL', |
||||||
|
OPTIONS_KEY: ('NOT NULL', 'CHECK(cost_in_local_currency_with_tax >= 0)')}) |
||||||
|
# endregion |
||||||
|
# endregion |
||||||
|
|
||||||
|
ALL_REPORTS = DATABASE_REPORTS + ITEM_REPORTS + PLATFORM_REPORTS + TITLE_REPORTS |
||||||
|
REPORT_TYPE_SWITCHER = {'DR': {REPORTS_KEY: DATABASE_REPORTS, 'report_fields': DATABASE_REPORT_FIELDS}, |
||||||
|
'IR': {REPORTS_KEY: ITEM_REPORTS, 'report_fields': ITEM_REPORT_FIELDS}, |
||||||
|
'PR': {REPORTS_KEY: PLATFORM_REPORTS, 'report_fields': PLATFORM_REPORT_FIELDS}, |
||||||
|
'TR': {REPORTS_KEY: TITLE_REPORTS, 'report_fields': TITLE_REPORT_FIELDS}} |
||||||
|
NAME_FIELD_SWITCHER = {'DR': 'database', 'IR': 'item', 'PR': 'platform', 'TR': 'title'} |
||||||
|
|
||||||
|
MONTHS = {1: 'january', 2: 'february', 3: 'march', 4: 'april', 5: 'may', 6: 'june', |
||||||
|
7: 'july', 8: 'august', 9: 'september', 10: 'october', 11: 'november', 12: 'december'} |
||||||
|
MONTH_CALCULATION = 'COALESCE(SUM(CASE ' + 'month' + ' WHEN {} THEN ' + 'metric' + ' END), 0)' |
||||||
|
|
||||||
|
YEAR_TOTAL = 'reporting_period_total' |
||||||
|
YEAR_TOTAL_CALCULATION = 'SUM(' + 'metric' + ')' |
||||||
|
|
||||||
|
RANKING = 'ranking' |
||||||
|
RANKING_CALCULATION = 'RANK() OVER(ORDER BY ' + 'SUM(' + 'metric' + ')' + ' DESC)' |
||||||
|
|
||||||
|
VIEW_SUFFIX = '_view' |
||||||
|
COST_TABLE_SUFFIX = '_costs' |
||||||
|
|
||||||
|
FIELDS_NOT_IN_VIEWS = ('month', 'metric', 'updated_on') |
||||||
|
FIELDS_NOT_IN_KEYS = ('metric', 'updated_on') |
||||||
|
FIELDS_NOT_IN_SEARCH_DROPDOWN = ('year',) |
||||||
|
FIELDS_NOT_IN_CHARTS = FIELDS_NOT_IN_VIEWS + ('file',) |
||||||
|
FIELDS_NOT_IN_TOP_NUMBER_CHARTS = FIELDS_NOT_IN_CHARTS + ('year',) |
||||||
|
|
||||||
|
COSTS_KEY_FIELDS = ('vendor', 'year') |
||||||
|
CHART_KEY_FIELDS = ('vendor', 'metric_type') |
||||||
|
|
||||||
|
DATABASE_FOLDER = r'./all_data/search/' |
||||||
|
DATABASE_LOCATION = DATABASE_FOLDER + r'search.db' |
||||||
|
# All yearly reports tsv and json are saved here in original condition as backup |
||||||
|
PROTECTED_DATABASE_FILE_DIR = "./all_data/.DO_NOT_MODIFY/" |
||||||
|
FILE_SUBDIRECTORY_ORDER = ('year', 'vendor') |
||||||
|
COSTS_SAVE_FOLDER = r'./all_data/costs/' |
||||||
|
|
||||||
|
DELIMITERS = {'.tsv': '\t', '.csv': ','} |
||||||
|
|
||||||
|
COMPARISON_OPERATORS = ('LIKE', 'NOT LIKE', '=', '<=', '<', '>=', '>', '<>') |
||||||
|
NON_COMPARISONS = ('IS NULL', 'IS NOT NULL') |
||||||
|
|
||||||
|
CURRENCY_LIST = ('USD', 'EUR', 'JPY', 'GBP', 'CHF', 'CAD', 'AUD') |
||||||
|
|
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Variable Constants for FileDialog Filters |
||||||
|
JSON_FILTER = ('JSON files (*.dat)',) |
||||||
|
TSV_FILTER = ('TSV files (*.tsv)',) |
||||||
|
CSV_FILTER = ('CSV files (*.csv)',) |
||||||
|
EXCEL_FILTER = ('Excel files (*.xlsx)',) |
||||||
|
# endregion |
||||||
|
|
||||||
|
|
||||||
|
# region Variable Constants for FetchData |
||||||
|
MONTH_NAMES = ("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", |
||||||
|
"November", "December") |
||||||
|
|
||||||
|
MASTER_REPORTS = ("DR", "IR", "PR", "TR") |
||||||
|
|
||||||
|
|
||||||
|
class MajorReportType(Enum): |
||||||
|
PLATFORM = "PR" |
||||||
|
DATABASE = "DR" |
||||||
|
TITLE = "TR" |
||||||
|
ITEM = "IR" |
||||||
|
|
||||||
|
|
||||||
|
class SpecialOptionType(Enum): |
||||||
|
TO = 0 # Tabular Only, not included in request url, only used in creating tabular report |
||||||
|
AO = 1 # Attribute Only, only in attributes_to_include, does not have it's own parameters in request url |
||||||
|
AP = 2 # Attribute Parameter, in attributes_to_include and has it's own parameters in request url |
||||||
|
ADP = 3 # Attribute Date Parameter, in attributes_to_include and has it's own date parameters in request url |
||||||
|
POS = 4 # Parameter Only String, NOT in attributes_to_include and has it's own parameters in request url |
||||||
|
POB = 5 # Parameter Only Bool, NOT in attributes_to_include and has it's own parameters in request url |
||||||
|
|
||||||
|
|
||||||
|
SPECIAL_REPORT_OPTIONS = { |
||||||
|
MajorReportType.PLATFORM: [(SpecialOptionType.AP, "Data_Type", ["Article", |
||||||
|
"Book", |
||||||
|
"Book_Segment", |
||||||
|
"Database", |
||||||
|
"Dataset", |
||||||
|
"Journal", |
||||||
|
"Multimedia", |
||||||
|
"Newspaper_or_Newsletter", |
||||||
|
"Other", |
||||||
|
"Platform", |
||||||
|
"Report", |
||||||
|
"Repository_Item", |
||||||
|
"Thesis_or_Dissertation"]), |
||||||
|
(SpecialOptionType.AP, "Access_Method", ["Regular", |
||||||
|
"TDM"]), |
||||||
|
(SpecialOptionType.POS, "Metric_Type", ["Searches_Platform", |
||||||
|
"Total_Item_Investigations", |
||||||
|
"Total_Item_Requests", |
||||||
|
"Unique_Item_Investigations", |
||||||
|
"Unique_Item_Requests", |
||||||
|
"Unique_Title_Investigations", |
||||||
|
"Unique_Title_Requests"]), |
||||||
|
(SpecialOptionType.TO, "Exclude_Monthly_Details")], |
||||||
|
MajorReportType.DATABASE: [(SpecialOptionType.AP, "Data_Type", ["Book", |
||||||
|
"Database", |
||||||
|
"Journal", |
||||||
|
"Multimedia", |
||||||
|
"Newspaper_or_Newsletter", |
||||||
|
"Other", |
||||||
|
"Report", |
||||||
|
"Repository_Item", |
||||||
|
"Thesis_or_Dissertation"]), |
||||||
|
(SpecialOptionType.AP, "Access_Method", ["Regular", |
||||||
|
"TDM"]), |
||||||
|
(SpecialOptionType.POS, "Metric_Type", ["Searches_Automated", |
||||||
|
"Searches_Federated", |
||||||
|
"Searches_Regular", |
||||||
|
"Total_Item_Investigations", |
||||||
|
"Total_Item_Requests", |
||||||
|
"Unique_Item_Investigations", |
||||||
|
"Unique_Item_Requests", |
||||||
|
"Unique_Title_Investigations", |
||||||
|
"Unique_Title_Requests", |
||||||
|
"Limit_Exceeded", |
||||||
|
"No_License"]), |
||||||
|
(SpecialOptionType.TO, "Exclude_Monthly_Details")], |
||||||
|
MajorReportType.TITLE: [(SpecialOptionType.AP, "Data_Type", ["Book", |
||||||
|
"Journal", |
||||||
|
"Newspaper_or_Newsletter", |
||||||
|
"Other", |
||||||
|
"Report", |
||||||
|
"Thesis_or_Dissertation"]), |
||||||
|
(SpecialOptionType.AP, "Section_Type", ["Article", |
||||||
|
"Book", |
||||||
|
"Chapter", |
||||||
|
"Other", |
||||||
|
"Section"]), |
||||||
|
(SpecialOptionType.AP, "Access_Type", ["Controlled", |
||||||
|
"OA_Gold"]), |
||||||
|
(SpecialOptionType.AP, "Access_Method", ["Regular", |
||||||
|
"TDM"]), |
||||||
|
(SpecialOptionType.POS, "Metric_Type", ["Total_Item_Investigations", |
||||||
|
"Total_Item_Requests", |
||||||
|
"Unique_Item_Investigations", |
||||||
|
"Unique_Item_Requests", |
||||||
|
"Unique_Title_Investigations", |
||||||
|
"Unique_Title_Requests", |
||||||
|
"Limit_Exceeded", |
||||||
|
"No_License"]), |
||||||
|
(SpecialOptionType.ADP, "YOP"), |
||||||
|
(SpecialOptionType.TO, "Exclude_Monthly_Details")], |
||||||
|
MajorReportType.ITEM: [(SpecialOptionType.AP, "Data_Type", ["Article", |
||||||
|
"Book", |
||||||
|
"Book_Segment", |
||||||
|
"Dataset", |
||||||
|
"Journal", |
||||||
|
"Multimedia", |
||||||
|
"Newspaper_or_Newsletter", |
||||||
|
"Other", |
||||||
|
"Report", |
||||||
|
"Repository_Item", |
||||||
|
"Thesis_or_Dissertation"]), |
||||||
|
(SpecialOptionType.AP, "Access_Type", ["Controlled", |
||||||
|
"OA_Gold", |
||||||
|
"Other_Free_To_Read"]), |
||||||
|
(SpecialOptionType.AP, "Access_Method", ["Regular", |
||||||
|
"TDM"]), |
||||||
|
(SpecialOptionType.POS, "Metric_Type", ["Total_Item_Investigations", |
||||||
|
"Total_Item_Requests", |
||||||
|
"Unique_Item_Investigations", |
||||||
|
"Unique_Item_Requests", |
||||||
|
"Limit_Exceeded", |
||||||
|
"No_License"]), |
||||||
|
(SpecialOptionType.ADP, "YOP"), |
||||||
|
(SpecialOptionType.AO, "Authors"), |
||||||
|
(SpecialOptionType.AO, "Publication_Date"), |
||||||
|
(SpecialOptionType.AO, "Article_Version"), |
||||||
|
(SpecialOptionType.POB, "Include_Component_Details"), |
||||||
|
(SpecialOptionType.POB, "Include_Parent_Details"), |
||||||
|
(SpecialOptionType.TO, "Exclude_Monthly_Details")] |
||||||
|
} |
||||||
|
|
||||||
|
DEFAULT_SPECIAL_OPTION_VALUE = "all" |
||||||
|
|
||||||
|
# If these codes are received with a Report_Header, files will be created and saved |
||||||
|
ACCEPTABLE_CODES = [3030, |
||||||
|
3031, |
||||||
|
3032, |
||||||
|
3040, |
||||||
|
3050, |
||||||
|
3060, |
||||||
|
3062] + list(range(1, 1000)) |
||||||
|
|
||||||
|
# If these codes are received the retry checkbox will be checked, user can retry later |
||||||
|
RETRY_LATER_CODES = [1010, |
||||||
|
1011] |
||||||
|
RETRY_WAIT_TIME = 5 # Seconds |
||||||
|
|
||||||
|
|
||||||
|
class CompletionStatus(Enum): |
||||||
|
SUCCESSFUL = "Successful!" |
||||||
|
WARNING = "Warning!" |
||||||
|
FAILED = "Failed!" |
||||||
|
CANCELLED = "Cancelled!" |
||||||
|
|
||||||
|
# endregion |
||||||
|
|
||||||
|
|
||||||
|
# region Variable Constants for Settings |
||||||
|
SETTINGS_FILE_DIR = "./all_data/settings/" |
||||||
|
SETTINGS_FILE_NAME = "settings.dat" |
||||||
|
|
||||||
|
# Default Settings |
||||||
|
SHOW_DEBUG_MESSAGES = False |
||||||
|
YEARLY_DIR = "./all_data/yearly_files/" |
||||||
|
OTHER_DIR = "./all_data/other_files/" |
||||||
|
REQUEST_INTERVAL = 3 # Seconds |
||||||
|
REQUEST_TIMEOUT = 120 # Seconds |
||||||
|
CONCURRENT_VENDORS = 2 |
||||||
|
CONCURRENT_REPORTS = 2 |
||||||
|
USER_AGENT = "Mozilla/5.0 Firefox/73.0 Chrome/80.0.3987.132 Safari/605.1.15" |
||||||
|
DEFAULT_CURRENCY = 'USD' |
||||||
|
# endregion |
||||||
|
|
||||||
|
|
||||||
|
# region Variable Constants for ManageVendors |
||||||
|
VENDORS_FILE_DIR = "./all_data/vendor_manager/" |
||||||
|
VENDORS_FILE_NAME = "vendors.dat" |
||||||
|
VENDORS_FILE_PATH = VENDORS_FILE_DIR + VENDORS_FILE_NAME |
||||||
|
|
||||||
|
EXPORT_VENDORS_FILE_NAME = "exported_vendor_data.tsv" |
||||||
|
# endregion |
@ -0,0 +1,293 @@ |
|||||||
|
import json |
||||||
|
from PyQt5.QtWidgets import QDialog |
||||||
|
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont |
||||||
|
|
||||||
|
import ManageDB |
||||||
|
import ManageVendors |
||||||
|
from Settings import SettingsModel |
||||||
|
from ui import CostsTab, ReportTypeDialog |
||||||
|
from Constants import * |
||||||
|
from GeneralUtils import * |
||||||
|
|
||||||
|
|
||||||
|
class CostsController: |
||||||
|
"""Controls the Costs tab |
||||||
|
|
||||||
|
:param costs_ui: the UI for the costs_widget |
||||||
|
:param settings: the user's settings""" |
||||||
|
|
||||||
|
def __init__(self, costs_ui: CostsTab.Ui_costs_tab, settings: SettingsModel): |
||||||
|
self.costs_ui = costs_ui |
||||||
|
self.settings = settings |
||||||
|
|
||||||
|
# set parameters |
||||||
|
self.report_parameter_combobox = costs_ui.costs_report_parameter_combobox |
||||||
|
self.report_parameter_combobox.addItems(REPORT_TYPE_SWITCHER.keys()) |
||||||
|
self.report_parameter = None |
||||||
|
|
||||||
|
self.vendor_parameter_combobox = costs_ui.costs_vendor_parameter_combobox |
||||||
|
self.vendor_parameter = None |
||||||
|
|
||||||
|
self.year_parameter_dateedit = costs_ui.costs_year_parameter_dateedit |
||||||
|
self.year_parameter_dateedit.setDate(QDate.currentDate()) |
||||||
|
self.year_parameter = None |
||||||
|
|
||||||
|
self.name_label = costs_ui.costs_name_parameter_label |
||||||
|
self.name_parameter_combobox = costs_ui.costs_name_parameter_combobox |
||||||
|
self.name_parameter = None |
||||||
|
|
||||||
|
# set up values |
||||||
|
self.cost_in_original_currency_doublespinbox = costs_ui.costs_cost_in_original_currency_doublespinbox |
||||||
|
self.cost_in_original_currency = 0.0 |
||||||
|
|
||||||
|
self.original_currency_combobox = costs_ui.costs_original_currency_value_combobox |
||||||
|
self.load_currency_list() |
||||||
|
self.original_currency = '' |
||||||
|
|
||||||
|
self.cost_in_local_currency_doublespinbox = costs_ui.costs_cost_in_local_currency_doublespinbox |
||||||
|
self.cost_in_local_currency = 0.0 |
||||||
|
|
||||||
|
self.cost_in_local_currency_with_tax_doublespinbox = \ |
||||||
|
costs_ui.costs_cost_in_local_currency_with_tax_doublespinbox |
||||||
|
self.cost_in_local_currency_with_tax = 0.0 |
||||||
|
|
||||||
|
# set up buttons |
||||||
|
self.save_costs_button = costs_ui.costs_save_button |
||||||
|
self.save_costs_button.clicked.connect(self.save_costs) |
||||||
|
|
||||||
|
self.load_button = costs_ui.costs_load_button |
||||||
|
self.load_button.clicked.connect(self.load_costs) |
||||||
|
|
||||||
|
self.clear_button = costs_ui.costs_clear_button |
||||||
|
self.clear_button.clicked.connect(self.clear_costs) |
||||||
|
|
||||||
|
vendors_json_string = read_json_file(ManageVendors.VENDORS_FILE_PATH) |
||||||
|
vendor_dicts = json.loads(vendors_json_string) |
||||||
|
self.vendor_parameter_combobox.clear() |
||||||
|
self.vendor_parameter_combobox.addItems([vendor_dict[NAME_KEY] for vendor_dict in vendor_dicts]) |
||||||
|
|
||||||
|
self.report_parameter_combobox.currentTextChanged.connect(self.on_report_parameter_changed) |
||||||
|
self.vendor_parameter_combobox.currentTextChanged.connect(self.on_vendor_parameter_changed) |
||||||
|
self.year_parameter_dateedit.dateChanged.connect(self.on_year_parameter_changed) |
||||||
|
self.name_parameter_combobox.currentTextChanged.connect(self.on_name_parameter_changed) |
||||||
|
|
||||||
|
self.names = [] |
||||||
|
self.costs_names = [] |
||||||
|
|
||||||
|
self.on_report_parameter_changed() |
||||||
|
self.year_parameter = int(self.year_parameter_dateedit.text()) |
||||||
|
self.vendor_parameter = self.vendor_parameter_combobox.currentText() |
||||||
|
self.fill_names() |
||||||
|
|
||||||
|
self.cost_in_original_currency_doublespinbox.valueChanged.connect(self.on_cost_in_original_currency_changed) |
||||||
|
self.original_currency_combobox.currentTextChanged.connect(self.on_original_currency_changed) |
||||||
|
self.cost_in_local_currency_doublespinbox.valueChanged.connect(self.on_cost_in_local_currency_changed) |
||||||
|
self.cost_in_local_currency_with_tax_doublespinbox.valueChanged.connect( |
||||||
|
self.on_cost_in_local_currency_with_tax_changed) |
||||||
|
|
||||||
|
self.import_costs_button = costs_ui.costs_import_costs_button |
||||||
|
self.import_costs_button.clicked.connect(self.import_costs) |
||||||
|
|
||||||
|
def update_settings(self, settings: SettingsModel): |
||||||
|
"""Invoked when the settings are saved |
||||||
|
|
||||||
|
:param settings: the new settings""" |
||||||
|
self.settings = settings |
||||||
|
self.load_currency_list() |
||||||
|
|
||||||
|
def database_updated(self, code: int): |
||||||
|
"""Invoked when the database is updated |
||||||
|
|
||||||
|
:param code: the exit code of the update""" |
||||||
|
self.fill_names() |
||||||
|
|
||||||
|
def load_vendor_list(self, vendors: Sequence[ManageVendors.Vendor]): |
||||||
|
"""Updates the vendor list combobox |
||||||
|
|
||||||
|
:param vendors: the new list of vendors""" |
||||||
|
self.vendor_parameter_combobox.clear() |
||||||
|
self.vendor_parameter_combobox.addItems([vendor.name for vendor in vendors]) |
||||||
|
|
||||||
|
def load_currency_list(self): |
||||||
|
"""Updates the original currency combobox""" |
||||||
|
self.original_currency_combobox.clear() |
||||||
|
self.original_currency_combobox.addItem(self.settings.default_currency) |
||||||
|
self.original_currency_combobox.addItems([currency for currency in CURRENCY_LIST if currency != |
||||||
|
self.settings.default_currency]) |
||||||
|
self.original_currency_combobox.setCurrentText('') |
||||||
|
|
||||||
|
def on_report_parameter_changed(self): |
||||||
|
"""Invoked when the report parameter changes""" |
||||||
|
self.report_parameter = self.report_parameter_combobox.currentText() |
||||||
|
self.name_label.setText(NAME_FIELD_SWITCHER[self.report_parameter].capitalize()) |
||||||
|
if self.vendor_parameter: |
||||||
|
self.fill_names() |
||||||
|
|
||||||
|
def on_vendor_parameter_changed(self): |
||||||
|
"""Invoked when the vendor parameter changes""" |
||||||
|
self.vendor_parameter = self.vendor_parameter_combobox.currentText() |
||||||
|
if self.report_parameter: |
||||||
|
self.fill_names() |
||||||
|
|
||||||
|
def on_year_parameter_changed(self): |
||||||
|
"""Invoked when the year parameter changes""" |
||||||
|
self.year_parameter = int(self.year_parameter_dateedit.text()) |
||||||
|
self.load_costs() |
||||||
|
self.fill_names(True) |
||||||
|
|
||||||
|
def fill_names(self, only_get_costs_names: bool = False): |
||||||
|
"""Fills the name field combobox""" |
||||||
|
self.name_parameter_combobox.clear() |
||||||
|
|
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
if not only_get_costs_names: |
||||||
|
names_sql_text, names_data = ManageDB.get_names_sql_text(self.report_parameter, self.vendor_parameter) |
||||||
|
names_results = ManageDB.run_select_sql(connection, names_sql_text, names_data) |
||||||
|
if names_results: |
||||||
|
self.names = [result[0] for result in names_results] |
||||||
|
else: |
||||||
|
self.names = [] |
||||||
|
if self.settings.show_debug_messages: print(names_results) |
||||||
|
|
||||||
|
costs_sql_text, costs_data = ManageDB.get_names_with_costs_sql_text(self.report_parameter, |
||||||
|
self.vendor_parameter, |
||||||
|
self.year_parameter, |
||||||
|
self.year_parameter) |
||||||
|
costs_results = ManageDB.run_select_sql(connection, costs_sql_text, costs_data) |
||||||
|
connection.close() |
||||||
|
|
||||||
|
if costs_results: |
||||||
|
self.costs_names = [result[0] for result in costs_results] |
||||||
|
else: |
||||||
|
self.costs_names = [] |
||||||
|
if self.settings.show_debug_messages: print(costs_results) |
||||||
|
model = QStandardItemModel() |
||||||
|
for name in self.names: |
||||||
|
item = QStandardItem(name) |
||||||
|
if name in self.costs_names: |
||||||
|
font = QFont() |
||||||
|
font.setBold(True) |
||||||
|
item.setFont(font) |
||||||
|
model.appendRow(item) |
||||||
|
self.name_parameter_combobox.setModel(model) |
||||||
|
else: |
||||||
|
print('Error, no connection') |
||||||
|
|
||||||
|
def on_name_parameter_changed(self): |
||||||
|
"""Invoked when the name field parameter changes""" |
||||||
|
self.name_parameter = self.name_parameter_combobox.currentText() |
||||||
|
enable = False |
||||||
|
if self.name_parameter: |
||||||
|
enable = True |
||||||
|
self.load_costs() |
||||||
|
self.cost_in_original_currency_doublespinbox.setEnabled(enable) |
||||||
|
self.original_currency_combobox.setEnabled(enable) |
||||||
|
self.cost_in_local_currency_doublespinbox.setEnabled(enable) |
||||||
|
self.cost_in_local_currency_with_tax_doublespinbox.setEnabled(enable) |
||||||
|
|
||||||
|
def on_cost_in_original_currency_changed(self): |
||||||
|
"""Invoked when the cost in original currency parameter changes""" |
||||||
|
self.cost_in_original_currency = self.cost_in_original_currency_doublespinbox.value() |
||||||
|
|
||||||
|
def on_original_currency_changed(self): |
||||||
|
"""Invoked when the original currency parameter changes""" |
||||||
|
self.original_currency = self.original_currency_combobox.currentText() |
||||||
|
|
||||||
|
def on_cost_in_local_currency_changed(self): |
||||||
|
"""Invoked when the cost in local currency parameter changes""" |
||||||
|
self.cost_in_local_currency = self.cost_in_local_currency_doublespinbox.value() |
||||||
|
|
||||||
|
def on_cost_in_local_currency_with_tax_changed(self): |
||||||
|
"""Invoked when the cost in local currency with tax parameter changes""" |
||||||
|
self.cost_in_local_currency_with_tax = self.cost_in_local_currency_with_tax_doublespinbox.value() |
||||||
|
|
||||||
|
def save_costs(self): |
||||||
|
"""Saves the cost data: if it is nonzero, add it to the database; if it is zero, delete it from the database""" |
||||||
|
INSERT = 'insert' |
||||||
|
DELETE = 'delete' |
||||||
|
insert_or_delete = None |
||||||
|
sql_text = None |
||||||
|
data = None |
||||||
|
if self.cost_in_original_currency > 0 and self.original_currency != '' \ |
||||||
|
and self.cost_in_local_currency > 0 and self.cost_in_local_currency_with_tax > 0: |
||||||
|
insert_or_delete = INSERT |
||||||
|
elif self.cost_in_original_currency == 0 and self.original_currency == '' \ |
||||||
|
and self.cost_in_local_currency == 0 and self.cost_in_local_currency_with_tax == 0: |
||||||
|
insert_or_delete = DELETE |
||||||
|
if insert_or_delete == INSERT: |
||||||
|
sql_text, data = ManageDB.replace_costs_sql_text(self.report_parameter, |
||||||
|
({NAME_FIELD_SWITCHER[self.report_parameter]: |
||||||
|
self.name_parameter, |
||||||
|
'vendor': self.vendor_parameter, |
||||||
|
'year': self.year_parameter, |
||||||
|
'cost_in_original_currency': |
||||||
|
self.cost_in_original_currency, |
||||||
|
'original_currency': self.original_currency, |
||||||
|
'cost_in_local_currency': self.cost_in_local_currency, |
||||||
|
'cost_in_local_currency_with_tax': |
||||||
|
self.cost_in_local_currency_with_tax},)) |
||||||
|
elif insert_or_delete == DELETE: |
||||||
|
sql_text, data = ManageDB.delete_costs_sql_text(self.report_parameter, self.vendor_parameter, |
||||||
|
self.year_parameter, self.name_parameter) |
||||||
|
if insert_or_delete in (INSERT, DELETE): |
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
ManageDB.run_sql(connection, sql_text, data) |
||||||
|
connection.close() |
||||||
|
ManageDB.backup_costs_data(self.report_parameter) |
||||||
|
if insert_or_delete == INSERT: |
||||||
|
show_message('Data inserted/replaced') |
||||||
|
elif insert_or_delete == DELETE: |
||||||
|
show_message('Data removed') |
||||||
|
else: |
||||||
|
show_message('Invalid entry') |
||||||
|
|
||||||
|
def load_costs(self): |
||||||
|
"""Fills the costs fields with data from the database""" |
||||||
|
sql_text, data = ManageDB.get_costs_sql_text(self.report_parameter, self.vendor_parameter, self.year_parameter, |
||||||
|
self.name_parameter) |
||||||
|
results = [] |
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
results = ManageDB.run_select_sql(connection, sql_text, data) |
||||||
|
if not results: |
||||||
|
results.append((0.0, '', 0.0, 0.0)) |
||||||
|
connection.close() |
||||||
|
values = {} |
||||||
|
index = 0 |
||||||
|
for field in COST_FIELDS: |
||||||
|
values[field[NAME_KEY]] = results[0][index] |
||||||
|
index += 1 |
||||||
|
self.cost_in_original_currency_doublespinbox.setValue(values['cost_in_original_currency']) |
||||||
|
self.original_currency_combobox.setCurrentText(values['original_currency']) |
||||||
|
self.cost_in_local_currency_doublespinbox.setValue(values['cost_in_local_currency']) |
||||||
|
self.cost_in_local_currency_with_tax_doublespinbox.setValue(values['cost_in_local_currency_with_tax']) |
||||||
|
self.cost_in_original_currency_doublespinbox.repaint() |
||||||
|
|
||||||
|
def clear_costs(self): |
||||||
|
"""Empties the costs fields""" |
||||||
|
self.cost_in_original_currency_doublespinbox.setValue(0.0) |
||||||
|
self.original_currency_combobox.setCurrentText('') |
||||||
|
self.cost_in_local_currency_doublespinbox.setValue(0.0) |
||||||
|
self.cost_in_local_currency_with_tax_doublespinbox.setValue(0.0) |
||||||
|
|
||||||
|
def import_costs(self): |
||||||
|
"""Import a file with costs data in it into the database""" |
||||||
|
report_type_dialog = QDialog() |
||||||
|
report_type_dialog_ui = ReportTypeDialog.Ui_report_type_dialog() |
||||||
|
report_type_dialog_ui.setupUi(report_type_dialog) |
||||||
|
report_type_dialog_ui.report_type_combobox.addItems(REPORT_TYPE_SWITCHER.keys()) |
||||||
|
report_type_dialog.show() |
||||||
|
if report_type_dialog.exec_(): |
||||||
|
report_type = report_type_dialog_ui.report_type_combobox.currentText() |
||||||
|
if report_type != '': |
||||||
|
file_name = choose_file(TSV_FILTER + CSV_FILTER) |
||||||
|
if file_name != '': |
||||||
|
ManageDB.insert_single_cost_file(report_type, file_name) |
||||||
|
ManageDB.backup_costs_data(report_type) |
||||||
|
show_message('File ' + file_name + ' imported') |
||||||
|
else: |
||||||
|
print('Error, no file location selected') |
||||||
|
else: |
||||||
|
print('Error, no report type selected') |
@ -0,0 +1,25 @@ |
|||||||
|
import os |
||||||
|
|
||||||
|
|
||||||
|
def save_json_file(file_dir: str, file_name: str, json_string: str): |
||||||
|
try: |
||||||
|
if not os.path.isdir(file_dir): |
||||||
|
os.makedirs(file_dir) |
||||||
|
file = open(file_dir + file_name, 'w') |
||||||
|
file.write(json_string) |
||||||
|
file.close() |
||||||
|
except IOError as e: |
||||||
|
print(e) |
||||||
|
|
||||||
|
|
||||||
|
def read_json_file(file_path: str): |
||||||
|
json_string = "[]" |
||||||
|
try: |
||||||
|
file = open(file_path, 'r') |
||||||
|
json_string = file.read() |
||||||
|
file.close() |
||||||
|
except IOError as e: |
||||||
|
print(e) |
||||||
|
finally: |
||||||
|
return json_string |
||||||
|
|
@ -0,0 +1,140 @@ |
|||||||
|
import webbrowser |
||||||
|
import shlex |
||||||
|
import subprocess |
||||||
|
import platform |
||||||
|
import csv |
||||||
|
from typing import Sequence, Any |
||||||
|
from os import path, makedirs, system |
||||||
|
from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog |
||||||
|
from PyQt5.QtCore import QDate |
||||||
|
|
||||||
|
main_window: QWidget = None |
||||||
|
|
||||||
|
|
||||||
|
class JsonModel: |
||||||
|
def from_json(self, json_dict: dict): |
||||||
|
raise NotImplementedError("from_json method is not implemented") |
||||||
|
|
||||||
|
|
||||||
|
def save_json_file(file_dir: str, file_name: str, json_string: str): |
||||||
|
try: |
||||||
|
if not path.isdir(file_dir): |
||||||
|
makedirs(file_dir) |
||||||
|
file = open(file_dir + file_name, 'w') |
||||||
|
file.write(json_string) |
||||||
|
file.close() |
||||||
|
except IOError as e: |
||||||
|
print(e) |
||||||
|
|
||||||
|
|
||||||
|
def read_json_file(file_path: str) -> str: |
||||||
|
json_string = "[]" |
||||||
|
try: |
||||||
|
file = open(file_path, 'r', encoding='utf-8-sig') |
||||||
|
json_string = file.read() |
||||||
|
file.close() |
||||||
|
except IOError: |
||||||
|
pass |
||||||
|
finally: |
||||||
|
return json_string |
||||||
|
|
||||||
|
|
||||||
|
def show_message(message: str): |
||||||
|
message_box = QMessageBox(main_window) |
||||||
|
message_box.setMinimumSize(800, 800) |
||||||
|
message_box.setWindowTitle("Info") |
||||||
|
message_box.setText(message) |
||||||
|
message_box.exec_() |
||||||
|
|
||||||
|
|
||||||
|
def ask_confirmation(message: str = 'Are you sure you want to continue?') -> bool: |
||||||
|
reply = QMessageBox.question(main_window, "Confirm", message, QMessageBox.Yes, QMessageBox.No) |
||||||
|
return reply == QMessageBox.Yes |
||||||
|
|
||||||
|
|
||||||
|
def open_file_or_dir(target_path: str): |
||||||
|
if path.exists(target_path): |
||||||
|
if platform.system() == "Darwin": |
||||||
|
system("open " + shlex.quote(target_path)) |
||||||
|
elif platform.system() == "Linux": |
||||||
|
subprocess.call(["xdg-open", target_path]) |
||||||
|
else: |
||||||
|
webbrowser.open_new_tab(path.realpath(target_path)) |
||||||
|
else: |
||||||
|
show_message(f"\'{target_path}\' does not exist") |
||||||
|
|
||||||
|
|
||||||
|
def choose_file(name_filters) -> str: |
||||||
|
file_path = "" |
||||||
|
dialog = QFileDialog(main_window, directory=".") |
||||||
|
dialog.setFileMode(QFileDialog.ExistingFile) |
||||||
|
dialog.setNameFilters(name_filters) |
||||||
|
if dialog.exec_(): |
||||||
|
file_path = dialog.selectedFiles()[0] |
||||||
|
|
||||||
|
return file_path |
||||||
|
|
||||||
|
|
||||||
|
def choose_directory() -> str: |
||||||
|
dir_path = "" |
||||||
|
dialog = QFileDialog(main_window, directory=".") |
||||||
|
dialog.setFileMode(QFileDialog.Directory) |
||||||
|
if dialog.exec_(): |
||||||
|
dir_path = dialog.selectedFiles()[0] + "/" |
||||||
|
|
||||||
|
return dir_path |
||||||
|
|
||||||
|
|
||||||
|
def choose_save(name_filters) -> str: |
||||||
|
file_path = "" |
||||||
|
dialog = QFileDialog(main_window, directory=".") |
||||||
|
dialog.setFileMode(QFileDialog.AnyFile) |
||||||
|
dialog.setAcceptMode(QFileDialog.AcceptSave) |
||||||
|
dialog.setNameFilters(name_filters) |
||||||
|
if dialog.exec_(): |
||||||
|
file_path = dialog.selectedFiles()[0] |
||||||
|
|
||||||
|
return file_path |
||||||
|
|
||||||
|
|
||||||
|
def open_in_browser(url: str): |
||||||
|
webbrowser.open_new_tab(url) |
||||||
|
|
||||||
|
|
||||||
|
def get_yearly_file_dir(base_path: str, vendor_name: str, begin_date: QDate) -> str: |
||||||
|
return f"{base_path}{begin_date.toString('yyyy')}/{vendor_name}/" |
||||||
|
|
||||||
|
|
||||||
|
def get_yearly_file_name(vendor_name: str, report_type: str, begin_date: QDate) -> str: |
||||||
|
return f"{begin_date.toString('yyyy')}_{vendor_name}_{report_type}.tsv" |
||||||
|
|
||||||
|
|
||||||
|
def get_special_file_dir(base_path: str, vendor_name: str) -> str: |
||||||
|
return f"{base_path}{vendor_name}/special/" |
||||||
|
|
||||||
|
|
||||||
|
def get_special_file_name(vendor_name: str, report_type: str, begin_date: QDate, end_date: QDate) -> str: |
||||||
|
return f"{vendor_name}_{report_type}_{begin_date.toString('yyyy-MMM')}_{end_date.toString('yyyy-MMM')}_S.tsv" |
||||||
|
|
||||||
|
|
||||||
|
def get_other_file_dir(base_path: str, vendor_name: str) -> str: |
||||||
|
return f"{base_path}{vendor_name}/" |
||||||
|
|
||||||
|
|
||||||
|
def get_other_file_name(vendor_name: str, report_type: str, begin_date: QDate, end_date: QDate) -> str: |
||||||
|
return f"{vendor_name}_{report_type}_{begin_date.toString('yyyy-MMM')}_{end_date.toString('yyyy-MMM')}.tsv" |
||||||
|
|
||||||
|
|
||||||
|
def save_data_as_tsv(file_name: str, data: Sequence[Any]): |
||||||
|
"""Saves data in a TSV file |
||||||
|
|
||||||
|
:param file_name: the name and location to save the results at |
||||||
|
:param data: the data to save in the file""" |
||||||
|
file = open(file_name, 'w', newline="", encoding='utf-8-sig') |
||||||
|
if file.mode == 'w': |
||||||
|
output = csv.writer(file, delimiter='\t', quotechar='\"') |
||||||
|
for row in data: |
||||||
|
output.writerow(row) |
||||||
|
file.close() |
||||||
|
else: |
||||||
|
print('Error: could not open file ' + file_name) |
@ -0,0 +1,284 @@ |
|||||||
|
"""This module handles all operations involving importing reports.""" |
||||||
|
|
||||||
|
import shutil |
||||||
|
import platform |
||||||
|
import ctypes |
||||||
|
import csv |
||||||
|
from os import path, makedirs |
||||||
|
from PyQt5.QtCore import QModelIndex, QDate, Qt |
||||||
|
from PyQt5.QtWidgets import QWidget, QDialog, QDialogButtonBox |
||||||
|
from PyQt5.QtGui import QStandardItemModel, QStandardItem |
||||||
|
from PyQt5 import QtWidgets |
||||||
|
|
||||||
|
import GeneralUtils |
||||||
|
from Constants import * |
||||||
|
from ui import ImportReportTab, ReportResultWidget |
||||||
|
from ManageVendors import Vendor |
||||||
|
from FetchData import ALL_REPORTS, CompletionStatus |
||||||
|
from Settings import SettingsModel |
||||||
|
from ManageDB import UpdateDatabaseWorker |
||||||
|
|
||||||
|
|
||||||
|
class ProcessResult: |
||||||
|
"""This holds the results of an import process |
||||||
|
|
||||||
|
:param vendor: The target vendor |
||||||
|
:param report_type: The target report type |
||||||
|
""" |
||||||
|
def __init__(self, vendor: Vendor, report_type: str): |
||||||
|
self.vendor = vendor |
||||||
|
self.report_type = report_type |
||||||
|
self.completion_status = CompletionStatus.SUCCESSFUL |
||||||
|
self.message = "" |
||||||
|
self.file_name = "" |
||||||
|
self.file_dir = "" |
||||||
|
self.file_path = "" |
||||||
|
|
||||||
|
|
||||||
|
class ImportReportController: |
||||||
|
"""Controls the Import Report tab |
||||||
|
|
||||||
|
:param vendors: The list of vendors in the system |
||||||
|
:param settings: The user's settings |
||||||
|
:param import_report_widget: The import report widget. |
||||||
|
:param import_report_ui: The UI for the import_report_widget. |
||||||
|
""" |
||||||
|
def __init__(self, vendors: list, settings: SettingsModel, import_report_widget: QWidget, |
||||||
|
import_report_ui: ImportReportTab.Ui_import_report_tab): |
||||||
|
|
||||||
|
# region General |
||||||
|
self.import_report_widget = import_report_widget |
||||||
|
self.vendors = vendors |
||||||
|
self.date = QDate.currentDate() |
||||||
|
self.selected_vendor_index = -1 |
||||||
|
self.selected_report_type_index = -1 |
||||||
|
self.selected_file_path: str = "" |
||||||
|
self.settings = settings |
||||||
|
self.result_dialog = None |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Vendors |
||||||
|
self.vendor_list_view = import_report_ui.vendors_list_view_import |
||||||
|
self.vendor_list_model = QStandardItemModel(self.vendor_list_view) |
||||||
|
self.vendor_list_view.setModel(self.vendor_list_model) |
||||||
|
self.vendor_list_view.clicked.connect(self.on_vendor_selected) |
||||||
|
self.update_vendors_ui() |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Report Types |
||||||
|
self.report_type_list_view = import_report_ui.report_types_list_view_import |
||||||
|
self.report_type_list_model = QStandardItemModel(self.report_type_list_view) |
||||||
|
self.report_type_list_view.setModel(self.report_type_list_model) |
||||||
|
self.report_type_list_view.clicked.connect(self.on_report_type_selected) |
||||||
|
for report_type in ALL_REPORTS: |
||||||
|
item = QStandardItem(report_type) |
||||||
|
item.setEditable(False) |
||||||
|
self.report_type_list_model.appendRow(item) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Others |
||||||
|
self.year_date_edit = import_report_ui.report_year_date_edit |
||||||
|
self.year_date_edit.setDate(self.date) |
||||||
|
self.year_date_edit.dateChanged.connect(self.on_date_changed) |
||||||
|
|
||||||
|
self.select_file_btn = import_report_ui.select_file_button |
||||||
|
self.select_file_btn.clicked.connect(self.on_select_file_clicked) |
||||||
|
|
||||||
|
self.selected_file_edit = import_report_ui.selected_file_edit |
||||||
|
|
||||||
|
self.import_report_button = import_report_ui.import_report_button |
||||||
|
self.import_report_button.clicked.connect(self.on_import_clicked) |
||||||
|
# endregion |
||||||
|
|
||||||
|
def on_vendors_changed(self, vendors: list): |
||||||
|
"""Handles the signal emitted when the system's vendor list is updated |
||||||
|
|
||||||
|
:param vendors: An updated list of the system's vendors |
||||||
|
""" |
||||||
|
self.selected_vendor_index = -1 |
||||||
|
self.update_vendors(vendors) |
||||||
|
self.update_vendors_ui() |
||||||
|
|
||||||
|
def update_vendors(self, vendors: list): |
||||||
|
""" Updates the local copy of vendors that support report import |
||||||
|
|
||||||
|
:param vendors: A list of vendors |
||||||
|
""" |
||||||
|
self.vendors = vendors |
||||||
|
|
||||||
|
def update_vendors_ui(self): |
||||||
|
"""Updates the UI to show vendors that support report import""" |
||||||
|
self.vendor_list_model.clear() |
||||||
|
for vendor in self.vendors: |
||||||
|
item = QStandardItem(vendor.name) |
||||||
|
item.setEditable(False) |
||||||
|
self.vendor_list_model.appendRow(item) |
||||||
|
|
||||||
|
def on_vendor_selected(self, model_index: QModelIndex): |
||||||
|
"""Handles the signal emitted when a vendor is selected""" |
||||||
|
self.selected_vendor_index = model_index.row() |
||||||
|
|
||||||
|
def on_report_type_selected(self, model_index: QModelIndex): |
||||||
|
"""Handles the signal emitted when a report type is selected""" |
||||||
|
self.selected_report_type_index = model_index.row() |
||||||
|
|
||||||
|
def on_date_changed(self, date: QDate): |
||||||
|
"""Handles the signal emitted when the target date is changed""" |
||||||
|
self.date = date |
||||||
|
|
||||||
|
def on_select_file_clicked(self): |
||||||
|
"""Handles the signal emitted when the select file button is clicked""" |
||||||
|
file_path = GeneralUtils.choose_file(TSV_FILTER + CSV_FILTER) |
||||||
|
if file_path: |
||||||
|
self.selected_file_path = file_path |
||||||
|
self.selected_file_edit.setText(file_path) |
||||||
|
|
||||||
|
def on_import_clicked(self): |
||||||
|
"""Handles the signal emitted when the import button is clicked""" |
||||||
|
if self.selected_vendor_index == -1: |
||||||
|
GeneralUtils.show_message("Select a vendor") |
||||||
|
return |
||||||
|
elif self.selected_report_type_index == -1: |
||||||
|
GeneralUtils.show_message("Select a report type") |
||||||
|
return |
||||||
|
elif self.selected_file_path == "": |
||||||
|
GeneralUtils.show_message("Select a file") |
||||||
|
return |
||||||
|
|
||||||
|
vendor = self.vendors[self.selected_vendor_index] |
||||||
|
report_type = ALL_REPORTS[self.selected_report_type_index] |
||||||
|
|
||||||
|
process_result = self.import_report(vendor, report_type) |
||||||
|
self.show_result(process_result) |
||||||
|
|
||||||
|
def import_report(self, vendor: Vendor, report_type: str) -> ProcessResult: |
||||||
|
""" Imports the selected file using the selected parameters |
||||||
|
|
||||||
|
:param vendor: The target vendor |
||||||
|
:param report_type: The target report type |
||||||
|
:raises Exception: If anything goes wrong while importing the report |
||||||
|
""" |
||||||
|
process_result = ProcessResult(vendor, report_type) |
||||||
|
|
||||||
|
try: |
||||||
|
|
||||||
|
dest_file_dir = GeneralUtils.get_yearly_file_dir(self.settings.yearly_directory, vendor.name, self.date) |
||||||
|
dest_file_name = GeneralUtils.get_yearly_file_name(vendor.name, report_type, self.date) |
||||||
|
dest_file_path = f"{dest_file_dir}{dest_file_name}" |
||||||
|
|
||||||
|
# Verify that dest_file_dir exists |
||||||
|
if not path.isdir(dest_file_dir): |
||||||
|
makedirs(dest_file_dir) |
||||||
|
|
||||||
|
# Validate report header |
||||||
|
delimiter = DELIMITERS[self.selected_file_path[-4:].lower()] |
||||||
|
file = open(self.selected_file_path, 'r', encoding='utf-8-sig') |
||||||
|
reader = csv.reader(file, delimiter=delimiter, quotechar='\"') |
||||||
|
if file.mode == 'r': |
||||||
|
header = {} |
||||||
|
for row in range(HEADER_ROWS): # reads header row data |
||||||
|
cells = next(reader) |
||||||
|
if cells: |
||||||
|
key = cells[0].lower() |
||||||
|
if key != HEADER_ENTRIES[row]: |
||||||
|
raise Exception('File has invalid header (missing row ' + HEADER_ENTRIES[row] + ')') |
||||||
|
else: |
||||||
|
header[key] = cells[1].strip() |
||||||
|
else: |
||||||
|
raise Exception('File has invalid header (missing row ' + HEADER_ENTRIES[row] + ')') |
||||||
|
for row in range(BLANK_ROWS): |
||||||
|
cells = next(reader) |
||||||
|
if cells: |
||||||
|
if cells[0].strip(): |
||||||
|
raise Exception('File has invalid header (not enough blank rows)') |
||||||
|
if header['report_id'] != report_type: |
||||||
|
raise Exception('File has invalid header (wrong Report_Id)') |
||||||
|
if not header['created']: |
||||||
|
raise Exception('File has invalid header (no Created date)') |
||||||
|
else: |
||||||
|
raise Exception('Could not open file') |
||||||
|
|
||||||
|
# Copy selected_file_path to dest_file_path |
||||||
|
self.copy_file(self.selected_file_path, dest_file_path) |
||||||
|
|
||||||
|
process_result.file_dir = dest_file_dir |
||||||
|
process_result.file_name = dest_file_name |
||||||
|
process_result.file_path = dest_file_path |
||||||
|
process_result.completion_status = CompletionStatus.SUCCESSFUL |
||||||
|
|
||||||
|
# Save protected tsv file |
||||||
|
protected_file_dir = f"{PROTECTED_DATABASE_FILE_DIR}{self.date.toString('yyyy')}/{vendor.name}/" |
||||||
|
if not path.isdir(protected_file_dir): |
||||||
|
makedirs(protected_file_dir) |
||||||
|
if platform.system() == "Windows": |
||||||
|
ctypes.windll.kernel32.SetFileAttributesW(PROTECTED_DATABASE_FILE_DIR, 2) # Hide folder |
||||||
|
|
||||||
|
protected_file_path = f"{protected_file_dir}{dest_file_name}" |
||||||
|
self.copy_file(self.selected_file_path, protected_file_path) |
||||||
|
|
||||||
|
# Add file to database |
||||||
|
database_worker = UpdateDatabaseWorker([{'file': protected_file_path, |
||||||
|
'vendor': vendor.name, |
||||||
|
'year': int(self.date.toString('yyyy'))}], |
||||||
|
False) |
||||||
|
database_worker.work() |
||||||
|
|
||||||
|
except Exception as e: |
||||||
|
process_result.message = f"Exception: {e}" |
||||||
|
process_result.completion_status = CompletionStatus.FAILED |
||||||
|
|
||||||
|
return process_result |
||||||
|
|
||||||
|
def copy_file(self, origin_path: str, dest_path: str): |
||||||
|
"""Copies a file from origin_path to dest_path""" |
||||||
|
shutil.copy2(origin_path, dest_path) |
||||||
|
|
||||||
|
def show_result(self, process_result: ProcessResult): |
||||||
|
"""Shows the result of the import process to the user |
||||||
|
|
||||||
|
:param process_result: The result of the import process |
||||||
|
""" |
||||||
|
self.result_dialog = QDialog(self.import_report_widget, flags=Qt.WindowCloseButtonHint) |
||||||
|
self.result_dialog.setWindowTitle("Import Result") |
||||||
|
vertical_layout = QtWidgets.QVBoxLayout(self.result_dialog) |
||||||
|
vertical_layout.setContentsMargins(5, 5, 5, 5) |
||||||
|
|
||||||
|
report_result_widget = QWidget(self.result_dialog) |
||||||
|
report_result_ui = ReportResultWidget.Ui_ReportResultWidget() |
||||||
|
report_result_ui.setupUi(report_result_widget) |
||||||
|
|
||||||
|
button_box = QtWidgets.QDialogButtonBox(QDialogButtonBox.Ok, self.result_dialog) |
||||||
|
button_box.setCenterButtons(True) |
||||||
|
button_box.accepted.connect(self.result_dialog.accept) |
||||||
|
|
||||||
|
vendor = process_result.vendor |
||||||
|
report_type = process_result.report_type |
||||||
|
|
||||||
|
report_result_ui.report_type_label.setText(f"{vendor.name} - {report_type}") |
||||||
|
report_result_ui.success_label.setText(process_result.completion_status.value) |
||||||
|
|
||||||
|
if process_result.completion_status == CompletionStatus.SUCCESSFUL: |
||||||
|
report_result_ui.message_label.hide() |
||||||
|
report_result_ui.retry_frame.hide() |
||||||
|
|
||||||
|
report_result_ui.file_label.setText(f"Saved as: {process_result.file_name}") |
||||||
|
report_result_ui.file_label.mousePressEvent = \ |
||||||
|
lambda event: GeneralUtils.open_file_or_dir(process_result.file_path) |
||||||
|
|
||||||
|
report_result_ui.folder_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.open_file_or_dir(process_result.file_dir)) |
||||||
|
|
||||||
|
report_result_ui.success_label.setText("Successful!") |
||||||
|
report_result_ui.retry_frame.hide() |
||||||
|
|
||||||
|
elif process_result.completion_status == CompletionStatus.FAILED: |
||||||
|
report_result_ui.file_frame.hide() |
||||||
|
report_result_ui.retry_frame.hide() |
||||||
|
|
||||||
|
report_result_ui.message_label.setText(process_result.message) |
||||||
|
|
||||||
|
vertical_layout.addWidget(report_result_widget) |
||||||
|
vertical_layout.addWidget(button_box) |
||||||
|
self.result_dialog.show() |
||||||
|
|
||||||
|
|
@ -0,0 +1,3 @@ |
|||||||
|
class JsonModel: |
||||||
|
def from_json(self, json_dict: dict): |
||||||
|
raise NotImplementedError("from_json method is not implemented") |
@ -0,0 +1,144 @@ |
|||||||
|
import sys |
||||||
|
from PyQt5.QtCore import Qt |
||||||
|
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFrame, QHBoxLayout, QPushButton |
||||||
|
from PyQt5.QtGui import QIcon, QPixmap |
||||||
|
from ui import MainWindow, ManageVendorsTab, SettingsTab, FetchReportsTab, FetchSpecialReportsTab, ImportReportTab,\ |
||||||
|
SearchTab, VisualTab, CostsTab |
||||||
|
from ManageVendors import ManageVendorsController |
||||||
|
from FetchData import FetchReportsController, FetchSpecialReportsController |
||||||
|
from ImportFile import ImportReportController |
||||||
|
from Costs import CostsController |
||||||
|
from Search import SearchController |
||||||
|
from Settings import SettingsController, SettingsModel |
||||||
|
from Visual import VisualController |
||||||
|
import GeneralUtils |
||||||
|
import ManageDB |
||||||
|
from Constants import * |
||||||
|
|
||||||
|
# region debug_stuff |
||||||
|
|
||||||
|
def trap_exc_during_debug(*args): |
||||||
|
# when app raises uncaught exception, print info |
||||||
|
print(args) |
||||||
|
|
||||||
|
|
||||||
|
# install exception hook: without this, uncaught exception would cause application to exit |
||||||
|
sys.excepthook = trap_exc_during_debug |
||||||
|
|
||||||
|
# endregion |
||||||
|
|
||||||
|
if hasattr(Qt, 'AA_EnableHighDpiScaling'): |
||||||
|
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) |
||||||
|
|
||||||
|
if hasattr(Qt, 'AA_UseHighDpiPixmaps'): |
||||||
|
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
app = QApplication(sys.argv) |
||||||
|
app.setStyleSheet("QWidget {font-family: Segoe UI; font-size: 12pt;}") |
||||||
|
|
||||||
|
main_window = QMainWindow() |
||||||
|
main_window_ui = MainWindow.Ui_mainWindow() |
||||||
|
main_window_ui.setupUi(main_window) |
||||||
|
|
||||||
|
GeneralUtils.main_window = main_window |
||||||
|
|
||||||
|
# region Setup Tab Controllers |
||||||
|
settings_tab = QWidget(main_window) |
||||||
|
settings_ui = SettingsTab.Ui_settings_tab() |
||||||
|
settings_ui.setupUi(settings_tab) |
||||||
|
settings_controller = SettingsController(settings_tab, settings_ui) |
||||||
|
|
||||||
|
manage_vendors_tab = QWidget(main_window) |
||||||
|
manage_vendors_ui = ManageVendorsTab.Ui_manage_vendors_tab() |
||||||
|
manage_vendors_ui.setupUi(manage_vendors_tab) |
||||||
|
manage_vendors_controller = ManageVendorsController(manage_vendors_tab, manage_vendors_ui, settings_controller.settings) |
||||||
|
|
||||||
|
ManageDB.update_settings(settings_controller.settings) |
||||||
|
ManageDB.first_time_setup() |
||||||
|
|
||||||
|
fetch_reports_tab = QWidget(main_window) |
||||||
|
fetch_reports_ui = FetchReportsTab.Ui_fetch_reports_tab() |
||||||
|
fetch_reports_ui.setupUi(fetch_reports_tab) |
||||||
|
fetch_reports_controller = FetchReportsController(manage_vendors_controller.vendors, settings_controller.settings, |
||||||
|
fetch_reports_tab, fetch_reports_ui) |
||||||
|
|
||||||
|
fetch_special_reports_tab = QWidget(main_window) |
||||||
|
fetch_special_reports_ui = FetchSpecialReportsTab.Ui_fetch_special_reports_tab() |
||||||
|
fetch_special_reports_ui.setupUi(fetch_special_reports_tab) |
||||||
|
fetch_special_reports_controller = FetchSpecialReportsController(manage_vendors_controller.vendors, |
||||||
|
settings_controller.settings, |
||||||
|
fetch_special_reports_tab, |
||||||
|
fetch_special_reports_ui) |
||||||
|
|
||||||
|
costs_tab = QWidget(main_window) |
||||||
|
costs_tab_ui = CostsTab.Ui_costs_tab() |
||||||
|
costs_tab_ui.setupUi(costs_tab) |
||||||
|
costs_controller = CostsController(costs_tab_ui, settings_controller.settings) |
||||||
|
|
||||||
|
import_report_tab = QWidget(main_window) |
||||||
|
import_report_ui = ImportReportTab.Ui_import_report_tab() |
||||||
|
import_report_ui.setupUi(import_report_tab) |
||||||
|
import_report_controller = ImportReportController(manage_vendors_controller.vendors, settings_controller.settings, |
||||||
|
import_report_tab, import_report_ui) |
||||||
|
|
||||||
|
search_tab = QWidget(main_window) |
||||||
|
search_ui = SearchTab.Ui_search_tab() |
||||||
|
search_ui.setupUi(search_tab) |
||||||
|
search_controller = SearchController(search_ui, settings_controller.settings) |
||||||
|
|
||||||
|
visual_tab = QWidget(main_window) |
||||||
|
visual_ui = VisualTab.Ui_visual_tab() |
||||||
|
visual_ui.setupUi(visual_tab) |
||||||
|
visual_controller = VisualController(visual_ui, settings_controller.settings) |
||||||
|
|
||||||
|
# # endregion |
||||||
|
|
||||||
|
# region Connect Signals |
||||||
|
manage_vendors_controller.vendors_changed_signal.connect(fetch_reports_controller.on_vendors_changed) |
||||||
|
manage_vendors_controller.vendors_changed_signal.connect(fetch_special_reports_controller.on_vendors_changed) |
||||||
|
manage_vendors_controller.vendors_changed_signal.connect(import_report_controller.on_vendors_changed) |
||||||
|
manage_vendors_controller.vendors_changed_signal.connect(costs_controller.load_vendor_list) |
||||||
|
manage_vendors_controller.vendors_changed_signal.connect(visual_controller.load_vendor_list) |
||||||
|
|
||||||
|
settings_controller.settings_changed_signal.connect(ManageDB.update_settings) |
||||||
|
settings_controller.settings_changed_signal.connect(search_controller.update_settings) |
||||||
|
settings_controller.settings_changed_signal.connect(costs_controller.update_settings) |
||||||
|
settings_controller.settings_changed_signal.connect(visual_controller.update_settings) |
||||||
|
|
||||||
|
ManageDB.managedb_signal_handler.database_changed_signal.connect(costs_controller.database_updated) |
||||||
|
ManageDB.managedb_signal_handler.database_changed_signal.connect(visual_controller.database_updated) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Add tabs to main window |
||||||
|
main_window_ui.tab_widget.addTab(manage_vendors_tab, manage_vendors_tab.windowIcon(), "Manage Vendors") |
||||||
|
main_window_ui.tab_widget.addTab(fetch_reports_tab, fetch_reports_tab.windowIcon(), "Fetch Reports") |
||||||
|
main_window_ui.tab_widget.addTab(fetch_special_reports_tab, fetch_special_reports_tab.windowIcon(), |
||||||
|
"Fetch Special Reports") |
||||||
|
main_window_ui.tab_widget.addTab(import_report_tab, import_report_tab.windowIcon(), "Import Report") |
||||||
|
main_window_ui.tab_widget.addTab(costs_tab, costs_tab.windowIcon(), "Costs") |
||||||
|
main_window_ui.tab_widget.addTab(search_tab, search_tab.windowIcon(), "Search") |
||||||
|
main_window_ui.tab_widget.addTab(visual_tab, visual_tab.windowIcon(), "Visual") |
||||||
|
main_window_ui.tab_widget.addTab(settings_tab, settings_tab.windowIcon(), "Settings") |
||||||
|
|
||||||
|
main_window_ui.tab_widget.setCurrentIndex(1) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Status Bar |
||||||
|
status_bar = main_window_ui.statusbar |
||||||
|
|
||||||
|
help_frame = QFrame(status_bar) |
||||||
|
help_frame_layout = QHBoxLayout(help_frame) |
||||||
|
help_frame_layout.setContentsMargins(-1, 2, -1, 5) |
||||||
|
help_frame.setLayout(help_frame_layout) |
||||||
|
help_button = QPushButton("Help", help_frame) |
||||||
|
help_pixmap = QPixmap(":/ui/resources/help_icon.png") |
||||||
|
help_button.setIcon(QIcon(help_pixmap)) |
||||||
|
help_button.clicked.connect(lambda: GeneralUtils.open_in_browser(HELP_SITE)) |
||||||
|
help_frame_layout.addWidget(help_button) |
||||||
|
|
||||||
|
status_bar.addWidget(help_frame) |
||||||
|
# endregion |
||||||
|
|
||||||
|
main_window.show() |
||||||
|
sys.exit(app.exec_()) |
@ -0,0 +1,648 @@ |
|||||||
|
"""This module handles all operations involving managing vendors.""" |
||||||
|
|
||||||
|
import csv |
||||||
|
import os |
||||||
|
import json |
||||||
|
import validators |
||||||
|
from PyQt5.QtWidgets import QDialog, QLabel, QDialogButtonBox, QWidget |
||||||
|
from PyQt5.QtGui import QStandardItemModel, QStandardItem |
||||||
|
from PyQt5.QtCore import Qt, QObject, QModelIndex, pyqtSignal |
||||||
|
from ui import ManageVendorsTab, AddVendorDialog, RemoveVendorDialog |
||||||
|
import ManageDB |
||||||
|
import GeneralUtils |
||||||
|
from GeneralUtils import JsonModel |
||||||
|
from Constants import * |
||||||
|
from Settings import SettingsModel |
||||||
|
|
||||||
|
|
||||||
|
class Vendor(JsonModel): |
||||||
|
"""This holds a vendor's information |
||||||
|
|
||||||
|
:param name: The vendor's unique name (Mandatory) |
||||||
|
:param base_url: The base URL for making sushi report calls (must end with '/reports', mandatory) |
||||||
|
:param customer_id: The customer id used in sushi report calls |
||||||
|
:param requestor_id: The requestor id id used in sushi report calls |
||||||
|
:param api_key: The api key id used in sushi report calls |
||||||
|
:param platform: The platform id used in sushi report calls |
||||||
|
:param is_non_sushi: This indicates if this vendor is sushi compatible |
||||||
|
:param description: A description of this vendor |
||||||
|
:param companies: More information about the vendor |
||||||
|
""" |
||||||
|
def __init__(self, name: str, base_url: str, customer_id: str, requestor_id: str, api_key: str, platform: str, |
||||||
|
is_non_sushi: bool, description: str, companies: str): |
||||||
|
self.name = name |
||||||
|
self.base_url = base_url |
||||||
|
self.customer_id = customer_id |
||||||
|
self.requestor_id = requestor_id |
||||||
|
self.api_key = api_key |
||||||
|
self.platform = platform |
||||||
|
self.is_non_sushi = is_non_sushi |
||||||
|
self.description = description |
||||||
|
self.companies = companies |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def from_json(cls, json_dict: dict): |
||||||
|
"""This returns a vendor object using the parameters in a json dict |
||||||
|
|
||||||
|
:param json_dict: A dict containing a vendor's details |
||||||
|
:return: Vendor |
||||||
|
""" |
||||||
|
name = json_dict["name"] if "name" in json_dict else "" |
||||||
|
customer_id = json_dict["customer_id"] if "customer_id" in json_dict else "" |
||||||
|
base_url = json_dict["base_url"] if "base_url" in json_dict else "" |
||||||
|
requestor_id = json_dict["requestor_id"] if "requestor_id" in json_dict else "" |
||||||
|
api_key = json_dict["api_key"] if "api_key" in json_dict else "" |
||||||
|
platform = json_dict["platform"] if "platform" in json_dict else "" |
||||||
|
is_non_sushi = json_dict["is_non_sushi"] if "is_non_sushi" in json_dict else False |
||||||
|
description = json_dict["description"] if "description" in json_dict else "" |
||||||
|
companies = json_dict["companies"] if "companies" in json_dict else "" |
||||||
|
|
||||||
|
return cls(name, base_url, customer_id, requestor_id, api_key, platform, is_non_sushi, description, companies) |
||||||
|
|
||||||
|
|
||||||
|
class ManageVendorsController(QObject): |
||||||
|
"""Controls the Manage Vendors tab |
||||||
|
|
||||||
|
:param manage_vendors_widget: The manage vendors widget. |
||||||
|
:param manage_vendors_ui: The UI for the manage_vendors_widget. |
||||||
|
""" |
||||||
|
vendors_changed_signal = pyqtSignal(list) |
||||||
|
|
||||||
|
def __init__(self, manage_vendors_widget: QWidget, manage_vendors_ui: ManageVendorsTab.Ui_manage_vendors_tab, |
||||||
|
settings: SettingsModel): |
||||||
|
super().__init__() |
||||||
|
self.manage_vendors_widget = manage_vendors_widget |
||||||
|
self.selected_index = -1 |
||||||
|
|
||||||
|
self.edit_vendor_details_frame = manage_vendors_ui.edit_vendor_details_frame |
||||||
|
self.edit_vendor_options_frame = manage_vendors_ui.edit_vendor_options_frame |
||||||
|
|
||||||
|
self.name_line_edit = manage_vendors_ui.nameEdit |
||||||
|
self.customer_id_line_edit = manage_vendors_ui.customerIdEdit |
||||||
|
self.base_url_line_edit = manage_vendors_ui.baseUrlEdit |
||||||
|
self.requestor_id_line_edit = manage_vendors_ui.requestorIdEdit |
||||||
|
self.api_key_line_edit = manage_vendors_ui.apiKeyEdit |
||||||
|
self.platform_line_edit = manage_vendors_ui.platformEdit |
||||||
|
self.non_Sushi_check_box = manage_vendors_ui.non_Sushi_check_box |
||||||
|
self.description_text_edit = manage_vendors_ui.descriptionEdit |
||||||
|
self.companies_text_edit = manage_vendors_ui.companiesEdit |
||||||
|
|
||||||
|
manage_vendors_ui.non_sushi_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("Vendors that don't provide SUSHI service can be added to the list for " |
||||||
|
"use with Import Reports")) |
||||||
|
|
||||||
|
self.name_validation_label = manage_vendors_ui.name_validation_label |
||||||
|
self.name_validation_label.hide() |
||||||
|
self.url_validation_label = manage_vendors_ui.url_validation_label |
||||||
|
self.url_validation_label.hide() |
||||||
|
|
||||||
|
self.save_vendor_changes_button = manage_vendors_ui.saveVendorChangesButton |
||||||
|
self.undo_vendor_changes_button = manage_vendors_ui.undoVendorChangesButton |
||||||
|
self.remove_vendor_button = manage_vendors_ui.removeVendorButton |
||||||
|
self.add_vendor_button = manage_vendors_ui.addVendorButton |
||||||
|
self.export_vendors_button = manage_vendors_ui.exportVendorsButton |
||||||
|
self.import_vendors_button = manage_vendors_ui.importVendorsButton |
||||||
|
|
||||||
|
self.save_vendor_changes_button.clicked.connect(self.modify_vendor) |
||||||
|
self.undo_vendor_changes_button.clicked.connect(self.populate_edit_vendor_view) |
||||||
|
self.remove_vendor_button.clicked.connect(self.on_remove_vendor_clicked) |
||||||
|
self.add_vendor_button.clicked.connect(self.on_add_vendor_clicked) |
||||||
|
self.export_vendors_button.clicked.connect(self.on_export_vendors_clicked) |
||||||
|
self.import_vendors_button.clicked.connect(self.on_import_vendors_clicked) |
||||||
|
|
||||||
|
self.vendor_list_view = manage_vendors_ui.vendorsListView |
||||||
|
self.vendor_list_model = QStandardItemModel(self.vendor_list_view) |
||||||
|
self.vendor_list_view.setModel(self.vendor_list_model) |
||||||
|
self.vendor_list_view.clicked.connect(self.on_vendor_selected) |
||||||
|
|
||||||
|
self.settings = settings |
||||||
|
|
||||||
|
self.vendors = [] |
||||||
|
self.vendor_names = set() # Hash set for faster operations |
||||||
|
vendors_json_string = GeneralUtils.read_json_file(VENDORS_FILE_PATH) |
||||||
|
vendor_dicts = json.loads(vendors_json_string) |
||||||
|
for json_dict in vendor_dicts: |
||||||
|
vendor = Vendor.from_json(json_dict) |
||||||
|
self.vendors.append(vendor) |
||||||
|
self.vendor_names.add(vendor.name.lower()) |
||||||
|
|
||||||
|
self.update_vendors_ui() |
||||||
|
|
||||||
|
def on_vendor_selected(self, model_index: QModelIndex): |
||||||
|
"""Handles the signal emitted when a vendor is selected |
||||||
|
|
||||||
|
:param model_index: An object containing the location of the vendor on the vendor list |
||||||
|
""" |
||||||
|
self.selected_index = model_index.row() |
||||||
|
self.populate_edit_vendor_view() |
||||||
|
|
||||||
|
def on_name_text_changed(self, new_name: str, original_name: str, validation_label: QLabel, validate: bool = True): |
||||||
|
"""Handles the signal emitted when a vendor's name is changed |
||||||
|
|
||||||
|
:param new_name: The new name entered in the text field |
||||||
|
:param original_name: The vendor's original name |
||||||
|
:param validation_label: The label to show validation messages |
||||||
|
:param validate: This indicates whether the new_name should be validated |
||||||
|
""" |
||||||
|
if not validate: |
||||||
|
validation_label.hide() |
||||||
|
return |
||||||
|
|
||||||
|
is_valid, message = self.validate_new_name(new_name, original_name) |
||||||
|
if is_valid: |
||||||
|
validation_label.hide() |
||||||
|
else: |
||||||
|
validation_label.show() |
||||||
|
validation_label.setText(message) |
||||||
|
|
||||||
|
def on_url_text_changed(self, url: str, validation_label: QLabel, validate: bool = True): |
||||||
|
"""Handles the signal emitted when a vendor's URL is changed |
||||||
|
|
||||||
|
:param url: The URL entered in the text field |
||||||
|
:param validation_label: The label to show validation messages |
||||||
|
:param validate: This indicates whether the url should be validated |
||||||
|
""" |
||||||
|
if not validate: |
||||||
|
validation_label.hide() |
||||||
|
return |
||||||
|
|
||||||
|
is_valid, message = self.validate_url(url) |
||||||
|
if is_valid: |
||||||
|
validation_label.hide() |
||||||
|
else: |
||||||
|
validation_label.show() |
||||||
|
validation_label.setText(message) |
||||||
|
|
||||||
|
def validate_new_name(self, new_name: str, original_name: str = "") -> (bool, str): |
||||||
|
"""Validates a new vendor name |
||||||
|
|
||||||
|
:param new_name: The new name to be validated |
||||||
|
:param original_name: The original name |
||||||
|
:returns: (is_successful, message) A Tuple with the completion status and a message |
||||||
|
""" |
||||||
|
if not new_name: |
||||||
|
return False, "Vendor name can't be empty" |
||||||
|
elif new_name.lower() in self.vendor_names: |
||||||
|
if original_name and original_name.lower() == new_name.lower(): |
||||||
|
return True, "" |
||||||
|
else: |
||||||
|
return False, "Duplicate vendor name" |
||||||
|
else: |
||||||
|
return True, "" |
||||||
|
|
||||||
|
def validate_url(self, url: str) -> (bool, str): |
||||||
|
"""Validates a new url |
||||||
|
|
||||||
|
:param url: The URL to be validated |
||||||
|
:returns: (is_successful, message) A Tuple with the completion status and a message |
||||||
|
""" |
||||||
|
if not validators.url(url): |
||||||
|
return False, "Invalid Url" |
||||||
|
elif not url.endswith("/reports"): |
||||||
|
return False, "URL must end with '/reports'" |
||||||
|
else: |
||||||
|
return True, "" |
||||||
|
|
||||||
|
def update_vendors_ui(self): |
||||||
|
"""Updates the UI to show all vendors""" |
||||||
|
self.vendor_list_model.clear() |
||||||
|
for vendor in self.vendors: |
||||||
|
item = QStandardItem(vendor.name) |
||||||
|
item.setEditable(False) |
||||||
|
self.vendor_list_model.appendRow(item) |
||||||
|
|
||||||
|
self.populate_edit_vendor_view() |
||||||
|
|
||||||
|
def update_vendor_names(self): |
||||||
|
"""Updates the local set of vendor names used for validation""" |
||||||
|
self.vendor_names.clear() |
||||||
|
for vendor in self.vendors: |
||||||
|
self.vendor_names.add(vendor.name.lower()) |
||||||
|
|
||||||
|
def add_vendor(self, new_vendor: Vendor) -> (bool, str): |
||||||
|
"""Adds a new vendor to the system if the vendor is valid |
||||||
|
|
||||||
|
:param new_vendor: The new vendor to be added |
||||||
|
:returns: (is_successful, message) A Tuple with the completion status and a message |
||||||
|
""" |
||||||
|
# Check if vendor is valid |
||||||
|
is_valid, message = self.validate_new_name(new_vendor.name) |
||||||
|
if not is_valid: |
||||||
|
return is_valid, message |
||||||
|
|
||||||
|
if not new_vendor.is_non_sushi: |
||||||
|
is_valid, message = self.validate_url(new_vendor.base_url) |
||||||
|
if not is_valid: |
||||||
|
return is_valid, message |
||||||
|
|
||||||
|
self.vendors.append(new_vendor) |
||||||
|
self.vendor_names.add(new_vendor.name.lower()) |
||||||
|
|
||||||
|
return True, "" |
||||||
|
|
||||||
|
def modify_vendor(self): |
||||||
|
"""Updates a vendor's information in the system if the vendor is valid""" |
||||||
|
if self.selected_index < 0: |
||||||
|
if self.settings.show_debug_messages: print("No vendor selected") |
||||||
|
return |
||||||
|
|
||||||
|
selected_vendor = self.vendors[self.selected_index] |
||||||
|
|
||||||
|
# Check if entries are valid |
||||||
|
new_name = self.name_line_edit.text() |
||||||
|
original_name = selected_vendor.name |
||||||
|
is_valid, message = self.validate_new_name(new_name, original_name) |
||||||
|
if not is_valid: |
||||||
|
GeneralUtils.show_message(message) |
||||||
|
return |
||||||
|
|
||||||
|
if not self.non_Sushi_check_box.isChecked(): |
||||||
|
url = self.base_url_line_edit.text() |
||||||
|
is_valid, message = self.validate_url(url) |
||||||
|
if not is_valid: |
||||||
|
GeneralUtils.show_message(message) |
||||||
|
return |
||||||
|
|
||||||
|
# Apply Changes |
||||||
|
if original_name != new_name: |
||||||
|
self.update_name_of_file_and_folder(original_name, new_name) |
||||||
|
ManageDB.update_vendor_in_all_tables(original_name, new_name) |
||||||
|
for report_type in REPORT_TYPE_SWITCHER.keys(): |
||||||
|
ManageDB.backup_costs_data(report_type) |
||||||
|
|
||||||
|
selected_vendor.name = self.name_line_edit.text() |
||||||
|
selected_vendor.base_url = self.base_url_line_edit.text() |
||||||
|
selected_vendor.customer_id = self.customer_id_line_edit.text() |
||||||
|
selected_vendor.requestor_id = self.requestor_id_line_edit.text() |
||||||
|
selected_vendor.api_key = self.api_key_line_edit.text() |
||||||
|
selected_vendor.platform = self.platform_line_edit.text() |
||||||
|
selected_vendor.is_non_sushi = self.non_Sushi_check_box.checkState() == Qt.Checked |
||||||
|
selected_vendor.description = self.description_text_edit.toPlainText() |
||||||
|
selected_vendor.companies = self.companies_text_edit.toPlainText() |
||||||
|
|
||||||
|
self.update_vendors_ui() |
||||||
|
self.update_vendor_names() |
||||||
|
self.vendors_changed_signal.emit(self.vendors) |
||||||
|
self.save_all_vendors_to_disk() |
||||||
|
|
||||||
|
GeneralUtils.show_message("Changes Saved!") |
||||||
|
|
||||||
|
def update_name_of_file_and_folder(self,original_name, new_name): |
||||||
|
DO_NOT_MODIFY_json_path = os.getcwd() + os.path.sep + "all_data" + os.path.sep + ".DO_NOT_MODIFY" + os.path.sep + "_json" |
||||||
|
DO_NOT_MODIFY_year_path = os.getcwd() + os.path.sep + "all_data" + os.path.sep + ".DO_NOT_MODIFY" |
||||||
|
default_year_path = os.getcwd() + os.path.sep + "all_data" + os.path.sep + "yearly_files" |
||||||
|
default_other_path = os.getcwd() + os.path.sep + "all_data" + os.path.sep + "other_files" |
||||||
|
|
||||||
|
custom_year_path = self.settings.yearly_directory |
||||||
|
custom_other_path = self.settings.other_directory |
||||||
|
|
||||||
|
if os.path.exists(DO_NOT_MODIFY_json_path): |
||||||
|
folderList = os.listdir(DO_NOT_MODIFY_json_path) |
||||||
|
for folder in folderList: |
||||||
|
if folder[0] == "2" and folder[1] == "0": |
||||||
|
year_path = DO_NOT_MODIFY_json_path + os.path.sep + folder |
||||||
|
|
||||||
|
original_folder_path = year_path + os.path.sep + original_name |
||||||
|
new_folder_path = year_path + os.path.sep + new_name |
||||||
|
|
||||||
|
if os.path.exists(original_folder_path): |
||||||
|
filesList = os.listdir(original_folder_path) |
||||||
|
|
||||||
|
for theFile in filesList: |
||||||
|
old_file_path = original_folder_path + os.path.sep + theFile |
||||||
|
new_file_path = original_folder_path + os.path.sep + theFile.replace(original_name,new_name) |
||||||
|
os.rename(old_file_path,new_file_path) |
||||||
|
|
||||||
|
os.rename(original_folder_path,new_folder_path) |
||||||
|
|
||||||
|
if (os.path.exists(DO_NOT_MODIFY_year_path)): |
||||||
|
folderList = os.listdir(DO_NOT_MODIFY_json_path) |
||||||
|
for folder in folderList: |
||||||
|
if folder[0] == "2" and folder[1] == "0": |
||||||
|
year_path = DO_NOT_MODIFY_year_path + os.path.sep + folder |
||||||
|
|
||||||
|
original_folder_path = year_path + os.path.sep + original_name |
||||||
|
new_folder_path = year_path + os.path.sep + new_name |
||||||
|
|
||||||
|
if os.path.exists(original_folder_path): |
||||||
|
filesList = os.listdir(original_folder_path) |
||||||
|
|
||||||
|
for theFile in filesList: |
||||||
|
old_file_path = original_folder_path + os.path.sep + theFile |
||||||
|
new_file_path = original_folder_path + os.path.sep + theFile.replace(original_name, new_name) |
||||||
|
|
||||||
|
os.rename(old_file_path, new_file_path) |
||||||
|
|
||||||
|
os.rename(original_folder_path, new_folder_path) |
||||||
|
|
||||||
|
if (os.path.exists(default_year_path)): |
||||||
|
folderList = os.listdir(DO_NOT_MODIFY_json_path) |
||||||
|
for folder in folderList: |
||||||
|
if folder[0] == "2" and folder[1] == "0": |
||||||
|
year_path = default_year_path + os.path.sep + folder |
||||||
|
|
||||||
|
original_folder_path = year_path + os.path.sep + original_name |
||||||
|
new_folder_path = year_path + os.path.sep + new_name |
||||||
|
|
||||||
|
if os.path.exists(original_folder_path): |
||||||
|
filesList = os.listdir(original_folder_path) |
||||||
|
|
||||||
|
for theFile in filesList: |
||||||
|
old_file_path = original_folder_path + os.path.sep + theFile |
||||||
|
new_file_path = original_folder_path + os.path.sep + theFile.replace(original_name, new_name) |
||||||
|
|
||||||
|
os.rename(old_file_path, new_file_path) |
||||||
|
|
||||||
|
os.rename(original_folder_path, new_folder_path) |
||||||
|
|
||||||
|
if (os.path.exists(default_other_path)): |
||||||
|
original_folder_path = default_other_path + os.path.sep + original_name |
||||||
|
new_folder_path = default_other_path + os.path.sep + new_name |
||||||
|
|
||||||
|
if os.path.exists(original_folder_path): |
||||||
|
filesList = os.listdir(original_folder_path) |
||||||
|
|
||||||
|
for theFile in filesList: |
||||||
|
old_file_path = original_folder_path + os.path.sep + theFile |
||||||
|
new_file_path = original_folder_path + os.path.sep + theFile.replace(original_name, |
||||||
|
new_name) |
||||||
|
os.rename(old_file_path, new_file_path) |
||||||
|
|
||||||
|
os.rename(original_folder_path, new_folder_path) |
||||||
|
|
||||||
|
if (os.path.exists(custom_year_path)): |
||||||
|
folderList = os.listdir(custom_year_path) |
||||||
|
for folder in folderList: |
||||||
|
if folder[0] == "2" and folder[1] == "0": |
||||||
|
year_path = custom_year_path + os.path.sep + folder |
||||||
|
|
||||||
|
original_folder_path = year_path + os.path.sep + original_name |
||||||
|
new_folder_path = year_path + os.path.sep + new_name |
||||||
|
|
||||||
|
if os.path.exists(original_folder_path): |
||||||
|
filesList = os.listdir(original_folder_path) |
||||||
|
|
||||||
|
for theFile in filesList: |
||||||
|
old_file_path = original_folder_path + os.path.sep + theFile |
||||||
|
new_file_path = original_folder_path + os.path.sep + theFile.replace(original_name, |
||||||
|
new_name) |
||||||
|
os.rename(old_file_path, new_file_path) |
||||||
|
|
||||||
|
os.rename(original_folder_path, new_folder_path) |
||||||
|
|
||||||
|
if (os.path.exists(custom_other_path)): |
||||||
|
original_folder_path = custom_other_path + os.path.sep + original_name |
||||||
|
new_folder_path = custom_other_path + os.path.sep + new_name |
||||||
|
|
||||||
|
if os.path.exists(original_folder_path): |
||||||
|
filesList = os.listdir(original_folder_path) |
||||||
|
|
||||||
|
for theFile in filesList: |
||||||
|
old_file_path = original_folder_path + os.path.sep + theFile |
||||||
|
new_file_path = original_folder_path + os.path.sep + theFile.replace(original_name, |
||||||
|
new_name) |
||||||
|
os.rename(old_file_path, new_file_path) |
||||||
|
|
||||||
|
os.rename(original_folder_path, new_folder_path) |
||||||
|
|
||||||
|
def on_add_vendor_clicked(self): |
||||||
|
"""Handles the signal emitted when the add vendor button is clicked |
||||||
|
|
||||||
|
A dialog is show to allow the user to enter a new vendor's information. If the information entered is valid, |
||||||
|
the vendor is added to the system |
||||||
|
""" |
||||||
|
vendor_dialog = QDialog() |
||||||
|
vendor_dialog_ui = AddVendorDialog.Ui_addVendorDialog() |
||||||
|
vendor_dialog_ui.setupUi(vendor_dialog) |
||||||
|
|
||||||
|
name_edit = vendor_dialog_ui.nameEdit |
||||||
|
base_url_edit = vendor_dialog_ui.baseUrlEdit |
||||||
|
customer_id_edit = vendor_dialog_ui.customerIdEdit |
||||||
|
requestor_id_edit = vendor_dialog_ui.requestorIdEdit |
||||||
|
api_key_edit = vendor_dialog_ui.apiKeyEdit |
||||||
|
platform_edit = vendor_dialog_ui.platformEdit |
||||||
|
non_sushi_check_box = vendor_dialog_ui.non_Sushi_check_box |
||||||
|
description_edit = vendor_dialog_ui.descriptionEdit |
||||||
|
companies_edit = vendor_dialog_ui.companiesEdit |
||||||
|
|
||||||
|
vendor_dialog_ui.non_sushi_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("Vendors that don't provide SUSHI service can be added to the list for " |
||||||
|
"use with Import Reports")) |
||||||
|
|
||||||
|
name_validation_label = vendor_dialog_ui.name_validation_label |
||||||
|
name_validation_label.hide() |
||||||
|
url_validation_label = vendor_dialog_ui.url_validation_label |
||||||
|
url_validation_label.hide() |
||||||
|
|
||||||
|
name_edit.textChanged.connect( |
||||||
|
lambda new_name: self.on_name_text_changed(new_name, "", name_validation_label)) |
||||||
|
base_url_edit.textChanged.connect( |
||||||
|
lambda url: self.on_url_text_changed(url, url_validation_label)) |
||||||
|
|
||||||
|
def attempt_add_vendor(): |
||||||
|
vendor = Vendor(name_edit.text(), base_url_edit.text(), customer_id_edit.text(), requestor_id_edit.text(), |
||||||
|
api_key_edit.text(), platform_edit.text(), non_sushi_check_box.checkState() == Qt.Checked, |
||||||
|
description_edit.toPlainText(), companies_edit.toPlainText()) |
||||||
|
|
||||||
|
is_valid, message = self.add_vendor(vendor) |
||||||
|
if is_valid: |
||||||
|
self.sort_vendors() |
||||||
|
self.selected_index = -1 |
||||||
|
self.update_vendors_ui() |
||||||
|
self.populate_edit_vendor_view() |
||||||
|
self.vendors_changed_signal.emit(self.vendors) |
||||||
|
self.save_all_vendors_to_disk() |
||||||
|
vendor_dialog.close() |
||||||
|
else: |
||||||
|
GeneralUtils.show_message(message) |
||||||
|
|
||||||
|
button_box = vendor_dialog_ui.buttonBox |
||||||
|
ok_button = button_box.button(QDialogButtonBox.Ok) |
||||||
|
ok_button.clicked.connect(attempt_add_vendor) |
||||||
|
cancel_button = button_box.button(QDialogButtonBox.Cancel) |
||||||
|
cancel_button.clicked.connect(lambda: vendor_dialog.close()) |
||||||
|
|
||||||
|
vendor_dialog.exec_() |
||||||
|
|
||||||
|
def on_import_vendors_clicked(self): |
||||||
|
"""Handles the signal emitted when the import vendors button is clicked. |
||||||
|
|
||||||
|
A file select dialog is shown to allow the user to select the vendors TSV file to import. The selected file is |
||||||
|
then imported. |
||||||
|
""" |
||||||
|
file_path = GeneralUtils.choose_file(TSV_FILTER) |
||||||
|
if file_path: |
||||||
|
self.import_vendors_tsv(file_path) |
||||||
|
|
||||||
|
def on_export_vendors_clicked(self): |
||||||
|
"""Handles the signal emitted when the export vendors button is clicked. |
||||||
|
|
||||||
|
A folder select dialog is shown to allow the user to select the target directory to export the vendors file to. |
||||||
|
A vendors TSV file containing all the vendors in the system is then exported |
||||||
|
""" |
||||||
|
dir_path = GeneralUtils.choose_directory() |
||||||
|
if dir_path: |
||||||
|
self.export_vendors_tsv(dir_path) |
||||||
|
|
||||||
|
def populate_edit_vendor_view(self): |
||||||
|
"""Populates the edit vendor view with the selected vendors's information""" |
||||||
|
if self.selected_index >= 0: |
||||||
|
selected_vendor = self.vendors[self.selected_index] |
||||||
|
|
||||||
|
self.name_line_edit.textChanged.connect( |
||||||
|
lambda new_name: self.on_name_text_changed(new_name, selected_vendor.name, self.name_validation_label)) |
||||||
|
self.name_line_edit.setText(selected_vendor.name) |
||||||
|
|
||||||
|
self.base_url_line_edit.textChanged.connect( |
||||||
|
lambda url: self.on_url_text_changed(url, self.url_validation_label)) |
||||||
|
self.base_url_line_edit.setText(selected_vendor.base_url) |
||||||
|
|
||||||
|
self.customer_id_line_edit.setText(selected_vendor.customer_id) |
||||||
|
self.requestor_id_line_edit.setText(selected_vendor.requestor_id) |
||||||
|
self.api_key_line_edit.setText(selected_vendor.api_key) |
||||||
|
self.platform_line_edit.setText(selected_vendor.platform) |
||||||
|
self.non_Sushi_check_box.setChecked(selected_vendor.is_non_sushi) |
||||||
|
self.description_text_edit.setPlainText(selected_vendor.description) |
||||||
|
self.companies_text_edit.setPlainText(selected_vendor.companies) |
||||||
|
|
||||||
|
self.set_edit_vendor_view_state(True) |
||||||
|
else: |
||||||
|
self.name_line_edit.textChanged.connect( |
||||||
|
lambda new_name: self.on_name_text_changed(new_name, "", self.name_validation_label, False)) |
||||||
|
self.name_line_edit.setText("") |
||||||
|
self.name_line_edit.textChanged.emit("") # Hide validation_label if showing |
||||||
|
|
||||||
|
self.base_url_line_edit.textChanged.connect( |
||||||
|
lambda url: self.on_url_text_changed(url, self.url_validation_label, False)) |
||||||
|
self.base_url_line_edit.setText("") |
||||||
|
self.base_url_line_edit.textChanged.emit("") |
||||||
|
|
||||||
|
self.customer_id_line_edit.setText("") |
||||||
|
self.base_url_line_edit.setText("") |
||||||
|
self.requestor_id_line_edit.setText("") |
||||||
|
self.api_key_line_edit.setText("") |
||||||
|
self.platform_line_edit.setText("") |
||||||
|
self.non_Sushi_check_box.setChecked(False) |
||||||
|
self.description_text_edit.setPlainText("") |
||||||
|
self.companies_text_edit.setPlainText("") |
||||||
|
|
||||||
|
self.set_edit_vendor_view_state(False) |
||||||
|
|
||||||
|
def set_edit_vendor_view_state(self, is_enabled): |
||||||
|
"""Enables or disables the elements in the edit vendor view |
||||||
|
|
||||||
|
:param is_enabled: This indicates whether the edit vendor view should be enabled |
||||||
|
""" |
||||||
|
if is_enabled: |
||||||
|
self.edit_vendor_details_frame.setEnabled(True) |
||||||
|
self.edit_vendor_options_frame.setEnabled(True) |
||||||
|
else: |
||||||
|
self.edit_vendor_details_frame.setEnabled(False) |
||||||
|
self.edit_vendor_options_frame.setEnabled(False) |
||||||
|
|
||||||
|
def on_remove_vendor_clicked(self): |
||||||
|
"""Handles the signal emitted when the remove vendor button is clicked. |
||||||
|
|
||||||
|
A confirmation dialog is shown to confirm the removal of the vendor. The vendor is removed from the system if |
||||||
|
confirmed |
||||||
|
""" |
||||||
|
dialog_remove = QDialog() |
||||||
|
dialog_remove_ui = RemoveVendorDialog.Ui_dialog_remove() |
||||||
|
dialog_remove_ui.setupUi(dialog_remove) |
||||||
|
|
||||||
|
def remove_vendor(): |
||||||
|
if self.selected_index >= 0: |
||||||
|
self.vendors.pop(self.selected_index) |
||||||
|
self.selected_index = -1 |
||||||
|
|
||||||
|
self.update_vendors_ui() |
||||||
|
self.update_vendor_names() |
||||||
|
self.populate_edit_vendor_view() |
||||||
|
self.vendors_changed_signal.emit(self.vendors) |
||||||
|
self.save_all_vendors_to_disk() |
||||||
|
|
||||||
|
button_box = dialog_remove_ui.buttonBox |
||||||
|
button_box.accepted.connect(remove_vendor) |
||||||
|
dialog_remove.exec_() |
||||||
|
|
||||||
|
def save_all_vendors_to_disk(self): |
||||||
|
"""Saves all the vendors in the system to disk""" |
||||||
|
json_string = json.dumps(self.vendors, default=lambda o: o.__dict__, indent=4) |
||||||
|
GeneralUtils.save_json_file(VENDORS_FILE_DIR, VENDORS_FILE_NAME, json_string) |
||||||
|
|
||||||
|
def sort_vendors(self): |
||||||
|
"""Sorts the vendors alphabetically based their names""" |
||||||
|
self.vendors = sorted(self.vendors, key=lambda vendor: vendor.name.lower()) |
||||||
|
|
||||||
|
def import_vendors_tsv(self, file_path): |
||||||
|
"""Imports the vendors in a TSV file path to the system |
||||||
|
|
||||||
|
:param file_path: The file path of the vendors TSV file |
||||||
|
""" |
||||||
|
try: |
||||||
|
tsv_file = open(file_path, 'r', encoding="utf-8", newline='') |
||||||
|
reader = csv.DictReader(tsv_file, delimiter='\t') |
||||||
|
for row in reader: |
||||||
|
if 'is_non_sushi' in row: |
||||||
|
is_non_sushi = row['is_non_sushi'].lower() == "true" |
||||||
|
else: |
||||||
|
is_non_sushi = False |
||||||
|
vendor = Vendor(row['name'] if 'name' in row else "", |
||||||
|
row['base_url'] if 'base_url' in row else "", |
||||||
|
row['customer_id'] if 'customer_id' in row else "", |
||||||
|
row['requestor_id'] if 'requestor_id' in row else "", |
||||||
|
row['api_key'] if 'api_key' in row else "", |
||||||
|
row['platform'] if 'platform' in row else "", |
||||||
|
is_non_sushi, |
||||||
|
row['description'] if 'description' in row else "", |
||||||
|
row['companies'] if 'companies' in row else "") |
||||||
|
|
||||||
|
is_valid, message = self.add_vendor(vendor) |
||||||
|
if not is_valid: |
||||||
|
if self.settings.show_debug_messages: print(message) |
||||||
|
|
||||||
|
tsv_file.close() |
||||||
|
|
||||||
|
self.sort_vendors() |
||||||
|
self.selected_index = -1 |
||||||
|
self.update_vendors_ui() |
||||||
|
self.update_vendor_names() |
||||||
|
self.populate_edit_vendor_view() |
||||||
|
self.vendors_changed_signal.emit(self.vendors) |
||||||
|
self.save_all_vendors_to_disk() |
||||||
|
|
||||||
|
GeneralUtils.show_message(f"Import successful!") |
||||||
|
except Exception as e: |
||||||
|
if self.settings.show_debug_messages: print(f"File import failed: {e}") |
||||||
|
GeneralUtils.show_message(f"File import failed: {e}") |
||||||
|
|
||||||
|
def export_vendors_tsv(self, dir_path): |
||||||
|
"""Exports all vendor information as a TSV file to a directory |
||||||
|
|
||||||
|
:param dir_path: The directory path to export the vendors TSV file to |
||||||
|
""" |
||||||
|
file_path = f"{dir_path}{EXPORT_VENDORS_FILE_NAME}" |
||||||
|
column_names = ["name", |
||||||
|
"base_url", |
||||||
|
"customer_id", |
||||||
|
"requestor_id", |
||||||
|
"api_key", |
||||||
|
"platform", |
||||||
|
"is_non_sushi", |
||||||
|
"description", |
||||||
|
"companies"] |
||||||
|
try: |
||||||
|
tsv_file = open(file_path, 'w', encoding="utf-8", newline='') |
||||||
|
tsv_dict_writer = csv.DictWriter(tsv_file, column_names, delimiter='\t') |
||||||
|
tsv_dict_writer.writeheader() |
||||||
|
|
||||||
|
for vendor in self.vendors: |
||||||
|
tsv_dict_writer.writerow(vendor.__dict__) |
||||||
|
|
||||||
|
tsv_file.close() |
||||||
|
GeneralUtils.show_message(f"Exported to {file_path}") |
||||||
|
|
||||||
|
except Exception as e: |
||||||
|
if self.settings.show_debug_messages: print(f"File export failed: {e}") |
||||||
|
GeneralUtils.show_message(f"File export failed: {e}") |
||||||
|
|
@ -0,0 +1,11 @@ |
|||||||
|
import PyInstaller.__main__ |
||||||
|
from os import path |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
PyInstaller.__main__.run([ |
||||||
|
'--name=Counter 5 Report Tool', |
||||||
|
'--onefile', |
||||||
|
'--console', |
||||||
|
'--icon=%s' % path.join('main_icon.ico'), |
||||||
|
path.join('MainDriver.py'), |
||||||
|
]) |
@ -0,0 +1,75 @@ |
|||||||
|
# COUNTER 5 Report Tool |
||||||
|
|
||||||
|
This project uses the SUSHI API to request usage reports from library vendors. The JSON data received is used to generate TSV reports that follow the COUNTER 5 standards. |
||||||
|
The project is written with Python 3.7. The PyQt GUI framework is used to create a user friendly (hopefully) GUI. |
||||||
|
|
||||||
|
## Features |
||||||
|
- Manage library vendor credentials |
||||||
|
- Fetch reports that strictly adhere to the COUNTER 5 standards |
||||||
|
- Fetch customized reports using the available parameters in the SUSHI API |
||||||
|
- Import COUNTER 5 reports into the local directories and database |
||||||
|
- Specify the costs of subscribed items |
||||||
|
- Search the sqlite database of fetched and imported reports |
||||||
|
- Generate charts using the data in the database |
||||||
|
|
||||||
|
## Download Project |
||||||
|
https://github.com/CS-4820-Library-Project/Libly/releases |
||||||
|
|
||||||
|
## Developer Documentation |
||||||
|
https://counter-5-report-tool.readthedocs.io/en/latest/ |
||||||
|
|
||||||
|
## How to use pyinstaller for executables |
||||||
|
https://github.com/CS-4820-Library-Project/Libly/blob/master/docs/pyinstaller-how-to.md |
||||||
|
|
||||||
|
## Setup Instructions (Windows) |
||||||
|
- Install Python 3.8.2 [https://www.python.org/ftp/python/3.8.2/python-3.8.2-amd64.exe] |
||||||
|
### Add Python to environment variables [https://datatofish.com/add-python-to-windows-path/] |
||||||
|
- Open control panel |
||||||
|
- System and Security -> System -> Advanced System Settings -> Advanced -> Environment Variables |
||||||
|
- System Variables: Click on Path, Click Edit... |
||||||
|
- Click Browse |
||||||
|
- Browse to where python is downloaded, by default: C:\Users\USER_NAME\AppData\Local\Programs\Python\Python38 |
||||||
|
|
||||||
|
- Add another variable in the same way that we just did. |
||||||
|
- Except this time set the filepath to C:\Users\apjm4\AppData\Local\Programs\Python\Python38\Scripts |
||||||
|
Python should now be accessible in Windows Command Prompt. |
||||||
|
Open command prompt and type Python --version. This should return the version of python that is installed. |
||||||
|
If not the path may be wrong or python was not installed correctly. |
||||||
|
|
||||||
|
type pip -v into command prompt, this should return the version of PIP that is installed with Python. |
||||||
|
|
||||||
|
### Download the project from Github |
||||||
|
- Close and re-open command prompt |
||||||
|
- type cd |
||||||
|
- Open the location you downloaded the project to and drag the folder into the command prompt window |
||||||
|
- Your command prompt window should now show "C:\Users\NAME>cd C:\Users\NAME\DOWNLOAD_LOCATION |
||||||
|
- Hit ENTER |
||||||
|
- type: pip install -r requirements.txt |
||||||
|
- This installs all the neccessary packages to run the project. |
||||||
|
|
||||||
|
### Run the project |
||||||
|
- Type: python maindriver.py |
||||||
|
- A User-Interface window should open with the project working |
||||||
|
- To run the project from now on, you only need to double click or right click and open MainDriver.py and the project should open |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Developer Setup (using Anaconda and Pycharm) |
||||||
|
- Download and install Anaconda: https://www.anaconda.com/distribution/#download-section |
||||||
|
- Download and install PyCharm: https://www.jetbrains.com/pycharm/download/ |
||||||
|
|
||||||
|
### Using Anaconda |
||||||
|
- Launch Anaconda Navigator (Anaconda GUI) |
||||||
|
- Go to Environments on the left pane |
||||||
|
- Search for and ensure that pyqt and requests packages are installed |
||||||
|
|
||||||
|
### Using PyCharm |
||||||
|
- Download and open the project using PyCharm |
||||||
|
- Go to File->Settings |
||||||
|
- On the left pane, select Project->Project Interpreter |
||||||
|
- Click the cog wheel on the right of the project interpreter drop down, click add |
||||||
|
- Choose Existing environment and set the location to anaconda_install_location/python.exe, OK, OK |
||||||
|
- Allow the IDE to complete set up then launch the program from MainDriver.py. There should be a play icon next to the line "if __name__ == "__main__":" |
||||||
|
- We Good To Go! |
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@ |
|||||||
|
<RCC> |
||||||
|
<qresource> |
||||||
|
<file>ui/resources/main_icon.png</file> |
||||||
|
<file>ui/resources/help_icon.png</file> |
||||||
|
<file>ui/resources/undo_icon.png</file> |
||||||
|
<file>ui/resources/save_icon.png</file> |
||||||
|
<file>ui/resources/add_vendor_icon.png</file> |
||||||
|
<file>ui/resources/export_vendors_icon.png</file> |
||||||
|
<file>ui/resources/import_vendors_icon.png</file> |
||||||
|
<file>ui/resources/remove_vendor_icon.png</file> |
||||||
|
<file>ui/resources/folder_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/costs_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/fetch_reports_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/fetch_special_reports_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/import_report_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/manage_vendors_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/search_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/settings_icon.png</file> |
||||||
|
<file>ui/resources/tab_icons/visual_icon.png</file> |
||||||
|
</qresource> |
||||||
|
</RCC> |
@ -0,0 +1,301 @@ |
|||||||
|
import os |
||||||
|
import sip |
||||||
|
import json |
||||||
|
from typing import Tuple, Dict |
||||||
|
from PyQt5.QtGui import QIntValidator, QDoubleValidator |
||||||
|
from PyQt5.QtWidgets import QFrame, QVBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QLabel |
||||||
|
|
||||||
|
import ManageDB |
||||||
|
from Settings import SettingsModel |
||||||
|
from ui import SearchTab, SearchAndFrame, SearchOrFrame |
||||||
|
from Constants import * |
||||||
|
from GeneralUtils import * |
||||||
|
|
||||||
|
|
||||||
|
class SearchController: |
||||||
|
"""Controls the Search tab |
||||||
|
|
||||||
|
:param search_ui: the UI for the search_widget |
||||||
|
:param settings: the user's settings""" |
||||||
|
|
||||||
|
def __init__(self, search_ui: SearchTab.Ui_search_tab, settings: SettingsModel): |
||||||
|
self.main_window = search_ui |
||||||
|
self.settings = settings |
||||||
|
|
||||||
|
# set up report types combobox |
||||||
|
self.report_parameter = search_ui.search_report_parameter_combobox |
||||||
|
self.report_parameter.addItems(ALL_REPORTS) |
||||||
|
|
||||||
|
# set up start year dateedit |
||||||
|
self.start_year_parameter = search_ui.search_start_year_parameter_dateedit |
||||||
|
self.start_year_parameter.setDate(QDate.currentDate()) |
||||||
|
|
||||||
|
# set up end year dateedit |
||||||
|
self.end_year_parameter = search_ui.search_end_year_parameter_dateedit |
||||||
|
self.end_year_parameter.setDate(QDate.currentDate()) |
||||||
|
|
||||||
|
# set up search button |
||||||
|
self.search_button = search_ui.search_button |
||||||
|
self.search_button.clicked.connect(self.search) |
||||||
|
|
||||||
|
self.open_results_file_checkbox = search_ui.search_open_file_checkbox |
||||||
|
self.open_results_folder_checkbox = search_ui.search_open_folder_checkbox |
||||||
|
|
||||||
|
# set up export button |
||||||
|
self.export_button = search_ui.search_export_button |
||||||
|
self.export_button.clicked.connect(self.export_parameters) |
||||||
|
|
||||||
|
# set up import button |
||||||
|
self.import_button = search_ui.search_import_button |
||||||
|
self.import_button.clicked.connect(self.import_parameters) |
||||||
|
|
||||||
|
# set up add and clause button |
||||||
|
def add_and_and_or_clause(): |
||||||
|
"""Invoked to add an and clause containing an or clause to the search""" |
||||||
|
and_clause = self.add_and_clause() |
||||||
|
self.add_or_clause(and_clause) |
||||||
|
self.hide_or_label_in_first_or_clause(and_clause) |
||||||
|
self.hide_and_label_in_first_and_clause() |
||||||
|
|
||||||
|
self.add_and_button = search_ui.search_add_and_button |
||||||
|
self.add_and_button.clicked.connect(add_and_and_or_clause) |
||||||
|
|
||||||
|
# resets the search clauses when the report type is changed |
||||||
|
def refresh_and_add_clauses(): |
||||||
|
"""Resets the search clauses, then adds an and clause containing an or clause""" |
||||||
|
self.refresh_clauses() |
||||||
|
add_and_and_or_clause() |
||||||
|
|
||||||
|
self.report_parameter.currentTextChanged.connect(refresh_and_add_clauses) |
||||||
|
|
||||||
|
self.and_clause_parameters_scrollarea = search_ui.search_and_clause_parameters_scrollarea |
||||||
|
self.and_clause_parameters_frame = None |
||||||
|
refresh_and_add_clauses() |
||||||
|
|
||||||
|
def update_settings(self, settings: SettingsModel): |
||||||
|
"""Called when the settings are saved |
||||||
|
|
||||||
|
:param settings: the new settings""" |
||||||
|
self.settings = settings |
||||||
|
|
||||||
|
def refresh_clauses(self): |
||||||
|
"""Resets the search clauses""" |
||||||
|
self.and_clause_parameters_frame = QFrame() |
||||||
|
self.and_clause_parameters_frame.setLayout(QVBoxLayout()) |
||||||
|
self.and_clause_parameters_frame.layout().addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, |
||||||
|
QSizePolicy.Expanding)) |
||||||
|
self.and_clause_parameters_scrollarea.setWidget(self.and_clause_parameters_frame) |
||||||
|
|
||||||
|
def add_and_clause(self) -> SearchAndFrame.Ui_search_and_clause_parameter_frame: |
||||||
|
"""Adds an and clause to the search""" |
||||||
|
and_clause = QFrame() |
||||||
|
and_clause_ui = SearchAndFrame.Ui_search_and_clause_parameter_frame() |
||||||
|
and_clause_ui.setupUi(and_clause) |
||||||
|
|
||||||
|
# set up add or clause button |
||||||
|
def add_or_to_this_and(): |
||||||
|
"""Adds an or clause to this and clause""" |
||||||
|
self.add_or_clause(and_clause_ui) |
||||||
|
self.hide_or_label_in_first_or_clause(and_clause_ui) |
||||||
|
|
||||||
|
and_clause_ui.search_add_or_clause_button.clicked.connect(add_or_to_this_and) |
||||||
|
|
||||||
|
# set up remove current and clause button |
||||||
|
def remove_this_and(): |
||||||
|
"""Removes this and clause""" |
||||||
|
self.and_clause_parameters_frame.layout().removeWidget(and_clause) |
||||||
|
sip.delete(and_clause) |
||||||
|
self.hide_and_label_in_first_and_clause() |
||||||
|
self.and_clause_parameters_frame.repaint() |
||||||
|
|
||||||
|
and_clause_ui.search_remove_and_clause_button.clicked.connect(remove_this_and) |
||||||
|
|
||||||
|
# add to the layout |
||||||
|
self.and_clause_parameters_frame.layout().insertWidget(self.and_clause_parameters_frame.layout().count() - 1, |
||||||
|
and_clause) |
||||||
|
|
||||||
|
return and_clause_ui |
||||||
|
|
||||||
|
def hide_and_label_in_first_and_clause(self): |
||||||
|
"""Hides the and label for the first and clause in the search""" |
||||||
|
and_clause = self.and_clause_parameters_frame.findChild(QFrame, 'search_and_clause_parameter_frame') |
||||||
|
if and_clause: |
||||||
|
and_clause.findChild(QLabel, "search_and_label").hide() |
||||||
|
|
||||||
|
def add_or_clause(self, and_clause: SearchAndFrame.Ui_search_and_clause_parameter_frame) \ |
||||||
|
-> SearchOrFrame.Ui_search_or_clause_parameter_frame: |
||||||
|
"""Adds an or clause to the search |
||||||
|
|
||||||
|
:param and_clause: the and clause the or clause is added to""" |
||||||
|
or_clause = QFrame() |
||||||
|
or_clause_ui = SearchOrFrame.Ui_search_or_clause_parameter_frame() |
||||||
|
or_clause_ui.setupUi(or_clause) |
||||||
|
|
||||||
|
# fill field combobox |
||||||
|
field_combobox = or_clause_ui.search_field_parameter_combobox |
||||||
|
for field in ManageDB.get_view_report_fields_list(self.report_parameter.currentText()): |
||||||
|
if field[NAME_KEY] not in FIELDS_NOT_IN_SEARCH_DROPDOWN: |
||||||
|
field_combobox.addItem(field[NAME_KEY], field['type']) |
||||||
|
|
||||||
|
type_label = or_clause_ui.search_type_label |
||||||
|
|
||||||
|
value_lineedit = or_clause_ui.search_value_parameter_lineedit |
||||||
|
|
||||||
|
def on_field_changed(): |
||||||
|
"""Invoked when the field parameter is changed""" |
||||||
|
type_label.setText(field_combobox.currentData().capitalize() + " Input") |
||||||
|
value_lineedit.setText(None) |
||||||
|
if field_combobox.currentData() == 'INTEGER': |
||||||
|
value_lineedit.setValidator(QIntValidator()) |
||||||
|
elif field_combobox.currentData() == 'REAL': |
||||||
|
value_lineedit.setValidator(QDoubleValidator()) |
||||||
|
else: |
||||||
|
value_lineedit.setValidator(None) |
||||||
|
|
||||||
|
field_combobox.currentTextChanged.connect(on_field_changed) |
||||||
|
on_field_changed() |
||||||
|
|
||||||
|
# fill comparison operator combobox |
||||||
|
comparison_combobox = or_clause_ui.search_comparison_parameter_combobox |
||||||
|
comparison_combobox.addItems(COMPARISON_OPERATORS) |
||||||
|
comparison_combobox.addItems(NON_COMPARISONS) |
||||||
|
|
||||||
|
def on_comparison_changed(): |
||||||
|
"""Invoked when the comparison parameter is changed""" |
||||||
|
if comparison_combobox.currentText() in NON_COMPARISONS: |
||||||
|
value_lineedit.setText(None) |
||||||
|
value_lineedit.setEnabled(False) |
||||||
|
else: |
||||||
|
value_lineedit.setEnabled(True) |
||||||
|
|
||||||
|
comparison_combobox.currentTextChanged.connect(on_comparison_changed) |
||||||
|
|
||||||
|
# set up remove current or clause button |
||||||
|
def remove_this_or(): |
||||||
|
"""Removes this or clause""" |
||||||
|
and_clause.search_or_clause_parameters_frame.layout().removeWidget(or_clause) |
||||||
|
sip.delete(or_clause) |
||||||
|
self.hide_or_label_in_first_or_clause(and_clause) |
||||||
|
and_clause.search_or_clause_parameters_frame.repaint() |
||||||
|
|
||||||
|
or_clause_ui.search_remove_or_clause_button.clicked.connect(remove_this_or) |
||||||
|
|
||||||
|
# add to parent and clause's layout |
||||||
|
and_clause.search_or_clause_parameters_frame.layout().addWidget(or_clause) |
||||||
|
|
||||||
|
return or_clause_ui |
||||||
|
|
||||||
|
def hide_or_label_in_first_or_clause(self, and_clause: SearchAndFrame.Ui_search_and_clause_parameter_frame): |
||||||
|
"""Hides the or label for the first or clause in an and clause |
||||||
|
|
||||||
|
:param and_clause: the and clause""" |
||||||
|
or_clause = and_clause.search_or_clause_parameters_frame.findChild(QFrame, 'search_or_clause_parameter_frame') |
||||||
|
if or_clause: |
||||||
|
or_clause.findChild(QLabel, "search_or_label").hide() |
||||||
|
|
||||||
|
def export_parameters(self): |
||||||
|
"""Exports the current search parameters to the selected file""" |
||||||
|
file_name = choose_save(JSON_FILTER) |
||||||
|
if file_name != '': |
||||||
|
if not file_name.lower().endswith('.dat'): |
||||||
|
file_name += '.dat' |
||||||
|
report, start_year, end_year, search_parameters = self.get_search_parameters() |
||||||
|
file = open(file_name, 'w', encoding='utf-8-sig') |
||||||
|
if file.mode == 'w': |
||||||
|
json.dump({'report': report, 'start_year': start_year, 'end_year': end_year, |
||||||
|
'search_parameters': search_parameters}, file) |
||||||
|
show_message('Search saved to ' + file_name) |
||||||
|
else: |
||||||
|
print('Error, no file location selected') |
||||||
|
|
||||||
|
def import_parameters(self): |
||||||
|
"""Imports a new set of search parameters from the selected file""" |
||||||
|
file_name = choose_file(JSON_FILTER) |
||||||
|
if file_name != '': |
||||||
|
fields = json.loads(read_json_file(file_name)) |
||||||
|
self.report_parameter.setCurrentText(fields['report']) |
||||||
|
self.start_year_parameter.setDate(QDate(fields['start_year'], 1, 1)) |
||||||
|
self.end_year_parameter.setDate(QDate(fields['end_year'], 1, 1)) |
||||||
|
clauses = fields['search_parameters'] |
||||||
|
self.refresh_clauses() |
||||||
|
for clause in clauses: |
||||||
|
and_clause = self.add_and_clause() |
||||||
|
for sub_clause in clause: |
||||||
|
or_clause = self.add_or_clause(and_clause) |
||||||
|
or_clause.search_field_parameter_combobox.setCurrentText(sub_clause[FIELD_KEY]) |
||||||
|
or_clause.search_comparison_parameter_combobox.setCurrentText(sub_clause[COMPARISON_KEY]) |
||||||
|
or_clause.search_value_parameter_lineedit.setText(str(sub_clause[VALUE_KEY])) |
||||||
|
|
||||||
|
def search(self): |
||||||
|
"""Queries the database based on the current search parameters and saves the results to the selected file""" |
||||||
|
report, start_year, end_year, search_parameters = self.get_search_parameters() |
||||||
|
|
||||||
|
# sql query to get search results |
||||||
|
sql_text, data = ManageDB.search_sql_text(report, start_year, end_year, search_parameters) |
||||||
|
|
||||||
|
headers = [] |
||||||
|
for field in ManageDB.get_view_report_fields_list(report): |
||||||
|
headers.append(field[NAME_KEY]) |
||||||
|
|
||||||
|
file_name = choose_save(TSV_FILTER) |
||||||
|
if file_name != '': |
||||||
|
if not file_name.lower().endswith('.tsv'): |
||||||
|
file_name += '.tsv' |
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
results = ManageDB.run_select_sql(connection, sql_text, data) |
||||||
|
connection.close() |
||||||
|
results.insert(0, headers) |
||||||
|
if self.settings.show_debug_messages: print(results) |
||||||
|
save_data_as_tsv(file_name, results) |
||||||
|
if self.open_results_folder_checkbox.isChecked(): |
||||||
|
open_file_or_dir(os.path.dirname(file_name)) |
||||||
|
if self.open_results_file_checkbox.isChecked(): |
||||||
|
open_file_or_dir(file_name) |
||||||
|
if not self.open_results_file_checkbox.isChecked(): |
||||||
|
show_message('Results saved to ' + file_name) |
||||||
|
else: |
||||||
|
print('Error, no connection') |
||||||
|
else: |
||||||
|
print('Error, no file location selected') |
||||||
|
|
||||||
|
def get_search_parameters(self) -> Tuple[str, int, int, Sequence[Sequence[Dict[str, Any]]]]: |
||||||
|
"""Reads the current search parameters from the UI |
||||||
|
|
||||||
|
:returns: (report, start_year, end_year, search_parameters) a Tuple with the kind of report selected, the |
||||||
|
starting year selected, the ending year selected, and a list of the search parameters in POS form (and of |
||||||
|
ors)""" |
||||||
|
# get report type |
||||||
|
report = self.report_parameter.currentText() |
||||||
|
# get start year |
||||||
|
start_year = int(self.start_year_parameter.text()) |
||||||
|
# get end year |
||||||
|
end_year = int(self.end_year_parameter.text()) |
||||||
|
|
||||||
|
search_parameters = [] |
||||||
|
for and_widget in self.and_clause_parameters_frame.findChildren(QFrame, 'search_and_clause_parameter_frame'): |
||||||
|
# iterate over and clauses |
||||||
|
or_clause_parameters = and_widget.findChild(QFrame, 'search_or_clause_parameters_frame') |
||||||
|
or_clauses = [] |
||||||
|
for or_widget in or_clause_parameters.findChildren(QFrame, 'search_or_clause_parameter_frame'): |
||||||
|
# iterate over child or clauses |
||||||
|
# get parameters for clause |
||||||
|
field_parameter_combobox = or_widget.findChild(QComboBox, 'search_field_parameter_combobox') |
||||||
|
field_parameter = field_parameter_combobox.currentText() |
||||||
|
comparison_parameter_combobox = or_widget.findChild(QComboBox, 'search_comparison_parameter_combobox') |
||||||
|
comparison_parameter = comparison_parameter_combobox.currentText() |
||||||
|
value_parameter_lineedit = or_widget.findChild(QLineEdit, 'search_value_parameter_lineedit') |
||||||
|
value_parameter = None |
||||||
|
if comparison_parameter in NON_COMPARISONS: |
||||||
|
pass |
||||||
|
elif field_parameter_combobox.currentData() == 'INTEGER': |
||||||
|
value_parameter = int(value_parameter_lineedit.text()) |
||||||
|
elif field_parameter_combobox.currentData() == 'REAL': |
||||||
|
value_parameter = float(value_parameter_lineedit.text()) |
||||||
|
else: |
||||||
|
value_parameter = value_parameter_lineedit.text() |
||||||
|
or_clauses.append( |
||||||
|
{FIELD_KEY: field_parameter, COMPARISON_KEY: comparison_parameter, VALUE_KEY: value_parameter}) |
||||||
|
search_parameters.append(or_clauses) |
||||||
|
|
||||||
|
return report, start_year, end_year, search_parameters |
@ -0,0 +1,213 @@ |
|||||||
|
"""This module handles all operations involving the user's settings.""" |
||||||
|
|
||||||
|
import json |
||||||
|
from os import path |
||||||
|
from PyQt5.QtWidgets import QWidget |
||||||
|
from PyQt5.QtCore import QObject, pyqtSignal |
||||||
|
from ui import SettingsTab |
||||||
|
import ManageDB |
||||||
|
from Constants import * |
||||||
|
import GeneralUtils |
||||||
|
from GeneralUtils import JsonModel |
||||||
|
|
||||||
|
|
||||||
|
class Setting(Enum): |
||||||
|
"""An enum of all settings""" |
||||||
|
YEARLY_DIR = 0 |
||||||
|
OTHER_DIR = 1 |
||||||
|
REQUEST_INTERVAL = 2 |
||||||
|
REQUEST_TIMEOUT = 3 |
||||||
|
CONCURRENT_VENDORS = 4 |
||||||
|
CONCURRENT_REPORTS = 5 |
||||||
|
USER_AGENT = 6 |
||||||
|
|
||||||
|
|
||||||
|
class SettingsModel(JsonModel): |
||||||
|
"""This holds the user's settings. |
||||||
|
|
||||||
|
:param yearly_directory: The directory where yearly reports are saved. Yearly reports are reports that include all |
||||||
|
the available data for a year. |
||||||
|
:param other_directory: The default directory where non-yearly reports are saved. |
||||||
|
:param request_interval: The time to wait between each report request, per vendor. |
||||||
|
:param request_timeout: The time to wait before timing out a connection (seconds). |
||||||
|
:param concurrent_vendors: The max number of vendors to work on at a time. |
||||||
|
:param concurrent_reports: The max number of reports to work on at a time, per vendor. |
||||||
|
:param user_agent: The user-agent that's included in the header when making requests. |
||||||
|
""" |
||||||
|
def __init__(self, show_debug_messages: bool, yearly_directory: str, other_directory: str, request_interval: int, |
||||||
|
request_timeout: int, concurrent_vendors: int, concurrent_reports: int, user_agent: str, |
||||||
|
default_currency: str): |
||||||
|
self.show_debug_messages = show_debug_messages |
||||||
|
self.yearly_directory = path.abspath(yearly_directory) + path.sep |
||||||
|
self.other_directory = path.abspath(other_directory) + path.sep |
||||||
|
self.request_interval = request_interval |
||||||
|
self.request_timeout = request_timeout |
||||||
|
self.concurrent_vendors = concurrent_vendors |
||||||
|
self.concurrent_reports = concurrent_reports |
||||||
|
self.user_agent = user_agent |
||||||
|
self.default_currency = default_currency |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def from_json(cls, json_dict: dict): |
||||||
|
show_debug_messages = json_dict["show_debug_messages"]\ |
||||||
|
if "show_debug_messages" in json_dict else SHOW_DEBUG_MESSAGES |
||||||
|
yearly_directory = json_dict["yearly_directory"]\ |
||||||
|
if "yearly_directory" in json_dict else YEARLY_DIR |
||||||
|
other_directory = json_dict["other_directory"]\ |
||||||
|
if "other_directory" in json_dict else OTHER_DIR |
||||||
|
request_interval = int(json_dict["request_interval"])\ |
||||||
|
if "request_interval" in json_dict else REQUEST_INTERVAL |
||||||
|
request_timeout = int(json_dict["request_timeout"])\ |
||||||
|
if "request_timeout" in json_dict else REQUEST_TIMEOUT |
||||||
|
concurrent_vendors = int(json_dict["concurrent_vendors"])\ |
||||||
|
if "concurrent_vendors" in json_dict else CONCURRENT_VENDORS |
||||||
|
concurrent_reports = int(json_dict["concurrent_reports"])\ |
||||||
|
if "concurrent_reports" in json_dict else CONCURRENT_REPORTS |
||||||
|
user_agent = json_dict["user_agent"]\ |
||||||
|
if "user_agent" in json_dict else USER_AGENT |
||||||
|
default_currency = json_dict["default_currency"]\ |
||||||
|
if "default_currency" in json_dict else DEFAULT_CURRENCY |
||||||
|
|
||||||
|
return cls(show_debug_messages, yearly_directory, other_directory, request_interval, request_timeout, |
||||||
|
concurrent_vendors, concurrent_reports, user_agent, default_currency) |
||||||
|
|
||||||
|
|
||||||
|
class SettingsController(QObject): |
||||||
|
"""Controls the Settings tab |
||||||
|
|
||||||
|
:param settings_widget: The settings widget. |
||||||
|
:param settings_ui: The UI for settings_widget. |
||||||
|
""" |
||||||
|
settings_changed_signal = pyqtSignal(SettingsModel) |
||||||
|
|
||||||
|
def __init__(self, settings_widget: QWidget, settings_ui: SettingsTab.Ui_settings_tab): |
||||||
|
# region General |
||||||
|
super().__init__() |
||||||
|
self.settings_widget = settings_widget |
||||||
|
|
||||||
|
json_string = GeneralUtils.read_json_file(SETTINGS_FILE_DIR + SETTINGS_FILE_NAME) |
||||||
|
json_dict = json.loads(json_string) |
||||||
|
self.settings = SettingsModel.from_json(json_dict) |
||||||
|
|
||||||
|
self.show_debug_checkbox = settings_ui.show_debug_check_box |
||||||
|
self.show_debug_checkbox.setChecked(self.settings.show_debug_messages) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Reports |
||||||
|
self.yearly_dir_edit = settings_ui.yearly_directory_edit |
||||||
|
self.other_dir_edit = settings_ui.other_directory_edit |
||||||
|
self.request_interval_spin_box = settings_ui.request_interval_spin_box |
||||||
|
self.request_timeout_spin_box = settings_ui.request_timeout_spin_box |
||||||
|
self.concurrent_vendors_spin_box = settings_ui.concurrent_vendors_spin_box |
||||||
|
self.concurrent_reports_spin_box = settings_ui.concurrent_reports_spin_box |
||||||
|
self.user_agent_edit = settings_ui.user_agent_edit |
||||||
|
|
||||||
|
self.yearly_dir_edit.setText(self.settings.yearly_directory) |
||||||
|
self.other_dir_edit.setText(self.settings.other_directory) |
||||||
|
self.request_interval_spin_box.setValue(self.settings.request_interval) |
||||||
|
self.request_timeout_spin_box.setValue(self.settings.request_timeout) |
||||||
|
self.concurrent_vendors_spin_box.setValue(self.settings.concurrent_vendors) |
||||||
|
self.concurrent_reports_spin_box.setValue(self.settings.concurrent_reports) |
||||||
|
self.user_agent_edit.setText(self.settings.user_agent) |
||||||
|
|
||||||
|
settings_ui.yearly_directory_button.clicked.connect( |
||||||
|
lambda: self.on_directory_setting_clicked(Setting.YEARLY_DIR)) |
||||||
|
settings_ui.other_directory_button.clicked.connect( |
||||||
|
lambda: self.on_directory_setting_clicked(Setting.OTHER_DIR)) |
||||||
|
|
||||||
|
# Reports Help Messages |
||||||
|
settings_ui.yearly_directory_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("This is where the calendar-year reports will be saved")) |
||||||
|
settings_ui.other_directory_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("This is where the special and non-calendar-year date range reports will " |
||||||
|
"be saved by default")) |
||||||
|
settings_ui.request_interval_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("The number of seconds the program will wait between sending each report " |
||||||
|
"request to a given vendor")) |
||||||
|
settings_ui.request_timeout_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("The number of seconds the program will allow a vendor to respond to " |
||||||
|
"each report request before canceling it")) |
||||||
|
settings_ui.concurrent_vendors_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("The maximum number of vendors to work on at the same time. " |
||||||
|
"If set too high, the UI might freeze while fetching reports but the " |
||||||
|
"fetch process will continue")) |
||||||
|
settings_ui.concurrent_reports_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("The maximum number of reports to work on at the same time (per vendor). " |
||||||
|
"If set too high, the UI might freeze while fetching reports but the " |
||||||
|
"fetch process will continue")) |
||||||
|
settings_ui.user_agent_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("How program identifies itself to the SUSHI servers. Some vendors will " |
||||||
|
"reject some particular user agents. Only change this if there is a " |
||||||
|
"known problem as it will affect all requests to all vendors. " |
||||||
|
"See Help for more information.")) |
||||||
|
settings_ui.default_currency_help_button.clicked.connect( |
||||||
|
lambda: GeneralUtils.show_message("The currency shown first in the Costs pulldown and also by Visual to " |
||||||
|
"label the local currency in the spreadsheets generated with the Cost " |
||||||
|
"Ratio option. Note: This doesn't have to be one of the pre-loaded " |
||||||
|
"currencies.")) |
||||||
|
|
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Costs |
||||||
|
self.default_currency_combobox = settings_ui.settings_costs_default_currency_combobox |
||||||
|
self.default_currency_combobox.addItems(CURRENCY_LIST) |
||||||
|
self.default_currency_combobox.setCurrentText(self.settings.default_currency) |
||||||
|
# endregion |
||||||
|
|
||||||
|
# region Search |
||||||
|
# set up restore database button |
||||||
|
self.is_rebuilding_database = False |
||||||
|
self.update_database_dialog = ManageDB.UpdateDatabaseProgressDialogController(self.settings_widget) |
||||||
|
self.rebuild_database_button = settings_ui.settings_rebuild_database_button |
||||||
|
self.rebuild_database_button.clicked.connect(self.on_rebuild_database_clicked) |
||||||
|
# endregion |
||||||
|
|
||||||
|
settings_ui.save_button.clicked.connect(self.on_save_button_clicked) |
||||||
|
|
||||||
|
def on_directory_setting_clicked(self, setting: Setting): |
||||||
|
"""Handles the signal emitted when a choose folder button is clicked |
||||||
|
|
||||||
|
:param setting: The setting to be changed |
||||||
|
""" |
||||||
|
dir_path = GeneralUtils.choose_directory() |
||||||
|
if dir_path: |
||||||
|
if setting == Setting.YEARLY_DIR: |
||||||
|
self.yearly_dir_edit.setText(dir_path) |
||||||
|
elif setting == Setting.OTHER_DIR: |
||||||
|
self.other_dir_edit.setText(dir_path) |
||||||
|
|
||||||
|
def on_save_button_clicked(self): |
||||||
|
"""Handles the signal emitted when the save button is clicked""" |
||||||
|
self.update_settings() |
||||||
|
self.save_settings_to_disk() |
||||||
|
self.settings_changed_signal.emit(self.settings) |
||||||
|
GeneralUtils.show_message("Changes saved!") |
||||||
|
|
||||||
|
def on_rebuild_database_clicked(self): |
||||||
|
"""Restores the database when the restore database button is clicked""" |
||||||
|
if not self.is_rebuilding_database: # check if already running |
||||||
|
if GeneralUtils.ask_confirmation('Are you sure you want to rebuild the database?'): |
||||||
|
self.is_rebuilding_database = True |
||||||
|
self.update_database_dialog.update_database(ManageDB.get_all_report_files() + |
||||||
|
ManageDB.get_all_cost_files(), |
||||||
|
True) |
||||||
|
self.is_rebuilding_database = False |
||||||
|
else: |
||||||
|
if self.settings.show_debug_messages: print('Database is already being rebuilt') |
||||||
|
|
||||||
|
def update_settings(self): |
||||||
|
"""Updates the app's settings using the values entered on the UI""" |
||||||
|
self.settings.show_debug_messages = self.show_debug_checkbox.isChecked() |
||||||
|
self.settings.yearly_directory = self.yearly_dir_edit.text() |
||||||
|
self.settings.other_directory = self.other_dir_edit.text() |
||||||
|
self.settings.request_interval = self.request_interval_spin_box.value() |
||||||
|
self.settings.request_timeout = self.request_timeout_spin_box.value() |
||||||
|
self.settings.concurrent_vendors = self.concurrent_vendors_spin_box.value() |
||||||
|
self.settings.concurrent_reports = self.concurrent_reports_spin_box.value() |
||||||
|
self.settings.user_agent = self.user_agent_edit.text() |
||||||
|
self.settings.default_currency = self.default_currency_combobox.currentText() |
||||||
|
|
||||||
|
def save_settings_to_disk(self): |
||||||
|
"""Saves all settings to disk""" |
||||||
|
json_string = json.dumps(self.settings, default=lambda o: o.__dict__) |
||||||
|
GeneralUtils.save_json_file(SETTINGS_FILE_DIR, SETTINGS_FILE_NAME, json_string) |
@ -0,0 +1,757 @@ |
|||||||
|
"""This module handles all operations involving the visual tab.""" |
||||||
|
|
||||||
|
import calendar |
||||||
|
import datetime |
||||||
|
import json |
||||||
|
import os |
||||||
|
from _operator import itemgetter |
||||||
|
from typing import Sequence |
||||||
|
|
||||||
|
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QFont |
||||||
|
|
||||||
|
import xlsxwriter |
||||||
|
from datetime import date |
||||||
|
|
||||||
|
from PyQt5.QtCore import Qt |
||||||
|
from PyQt5.QtWidgets import QFileDialog, QDialog |
||||||
|
|
||||||
|
import GeneralUtils |
||||||
|
from GeneralUtils import * |
||||||
|
import ManageDB |
||||||
|
import ManageVendors |
||||||
|
from Settings import SettingsModel |
||||||
|
from ui import MessageDialog, VisualTab |
||||||
|
from Constants import * |
||||||
|
|
||||||
|
|
||||||
|
class VisualController: |
||||||
|
"""Controls the Visual tab |
||||||
|
|
||||||
|
:param visual_ui: The UI for visual_widget. |
||||||
|
""" |
||||||
|
|
||||||
|
def __init__(self, visual_ui: VisualTab.Ui_visual_tab, settings: SettingsModel): |
||||||
|
self.settings = settings |
||||||
|
|
||||||
|
# set up and configure report type combobox |
||||||
|
self.report_parameter = visual_ui.search_report_parameter_combobox_2 |
||||||
|
self.report_parameter.addItems(ALL_REPORTS) |
||||||
|
self.report_parameter.currentTextChanged[str].connect(self.on_report_parameter_changed) |
||||||
|
|
||||||
|
# set up and configure cost ratio combobox |
||||||
|
self.cost_parameter = visual_ui.cost_ratio_option_combobox |
||||||
|
COST_TYPE_ALL = ('Cost in Local Currency with Tax', 'Cost in Local Currency', 'Cost in Original Currency') |
||||||
|
self.cost_parameter.addItems(COST_TYPE_ALL) |
||||||
|
|
||||||
|
# set up and configure cost ratio frame |
||||||
|
self.frame_cost = visual_ui.edit_cost_ratio_frame |
||||||
|
self.frame_cost.setEnabled(False) |
||||||
|
|
||||||
|
# set up and configure top num frame |
||||||
|
self.top_num_frame = visual_ui.edit_top_num_frame |
||||||
|
self.top_num_frame.setEnabled(False) |
||||||
|
|
||||||
|
# set up top num spinbox and configure lower and upper bounds |
||||||
|
self.top_num_edit = visual_ui.top_num_spinbox |
||||||
|
|
||||||
|
# set up chart type radio buttons |
||||||
|
self.h_bar_radio = visual_ui.radioButton |
||||||
|
self.v_bar_radio = visual_ui.radioButton_3 |
||||||
|
self.line_radio = visual_ui.radioButton_4 |
||||||
|
self.v_bar_radio.setChecked(True) |
||||||
|
|
||||||
|
# set up calculations type radio buttons |
||||||
|
self.monthly_radio = visual_ui.monthly_radioButton |
||||||
|
self.yearly_radio = visual_ui.yearly_radioButton |
||||||
|
self.topNum_radio = visual_ui.topnum_radioButton |
||||||
|
self.costRatio_radio = visual_ui.costratio_radioButton |
||||||
|
|
||||||
|
# configure calculation type radio buttons and connect with method |
||||||
|
self.monthly_radio.setChecked(True) |
||||||
|
self.monthly_radio.toggled.connect(self.on_calculation_type_changed) |
||||||
|
self.yearly_radio.toggled.connect(self.on_calculation_type_changed) |
||||||
|
self.topNum_radio.toggled.connect(self.on_calculation_type_changed) |
||||||
|
self.costRatio_radio.toggled.connect(self.on_calculation_type_changed) |
||||||
|
|
||||||
|
# set up start year dateedit |
||||||
|
self.start_year_parameter = visual_ui.search_start_year_parameter_dateedit_2 |
||||||
|
self.start_year_parameter.setDate(date.today()) |
||||||
|
|
||||||
|
# set up end year dateedit |
||||||
|
self.end_year_parameter = visual_ui.search_end_year_parameter_dateedit_2 |
||||||
|
self.end_year_parameter.setDate(date.today()) |
||||||
|
|
||||||
|
# set up name label |
||||||
|
self.name_label = visual_ui.visual_name_label |
||||||
|
|
||||||
|
# set up name combobox |
||||||
|
self.name_combobox = visual_ui.visual_name_parameter_combobox |
||||||
|
self.name = None |
||||||
|
self.metric = visual_ui.metric_Type_comboBox |
||||||
|
self.metric.addItems(DATABASE_REPORTS_METRIC) |
||||||
|
|
||||||
|
self.vendor = visual_ui.visual_vendor_parameter_combobox |
||||||
|
self.vendor.currentTextChanged.connect(self.on_vendor_changed) |
||||||
|
self.vendor_parameter = None |
||||||
|
self.vendor_parameter = self.vendor.currentText() |
||||||
|
vendors_json_string = GeneralUtils.read_json_file(ManageVendors.VENDORS_FILE_PATH) |
||||||
|
vendor_dicts = json.loads(vendors_json_string) |
||||||
|
self.vendor.clear() |
||||||
|
self.vendor.addItem("") |
||||||
|
self.vendor.addItems([vendor_dict['name'] for vendor_dict in vendor_dicts]) |
||||||
|
|
||||||
|
# set up the search clauses |
||||||
|
self.and_clause_parameters = None |
||||||
|
|
||||||
|
# set up create chart button |
||||||
|
self.create_chart_button = visual_ui.create_chart_button |
||||||
|
self.create_chart_button.clicked.connect(self.createChart) |
||||||
|
|
||||||
|
# set up customize chart field |
||||||
|
self.chart_title_edit = visual_ui.chart_title_lineEdit |
||||||
|
self.horizontal_axis_edit = visual_ui.horizontal_axis_lineEdit |
||||||
|
self.vertical_axis_edit = visual_ui.vertical_axis_lineEdit |
||||||
|
|
||||||
|
# set up open file and open folder check box |
||||||
|
self.open_file = visual_ui.open_file_checkBox |
||||||
|
self.open_folder = visual_ui.open_folder_checkBox |
||||||
|
self.file_name = None |
||||||
|
|
||||||
|
self.data = [] |
||||||
|
self.temp_results = [] |
||||||
|
self.top_num = None |
||||||
|
self.results = None |
||||||
|
self.names = [] |
||||||
|
self.costs_names = [] |
||||||
|
|
||||||
|
def update_settings(self, settings: SettingsModel): |
||||||
|
"""Called when the settings are saved |
||||||
|
|
||||||
|
:param settings: the new settings""" |
||||||
|
self.settings = settings |
||||||
|
self.local_currency = self.settings.default_currency |
||||||
|
#self.load_currency_list() |
||||||
|
|
||||||
|
def database_updated(self, code: int): |
||||||
|
"""Called when the database is updated |
||||||
|
|
||||||
|
:param code: the exit code of the update""" |
||||||
|
self.fill_names() |
||||||
|
|
||||||
|
def load_vendor_list(self, vendors: Sequence[ManageVendors.Vendor]): |
||||||
|
"""Updates the vendor list combobox |
||||||
|
|
||||||
|
:param vendors: the new list of vendors""" |
||||||
|
self.vendor.clear() |
||||||
|
self.vendor.addItem("") |
||||||
|
self.vendor.addItems([vendor.name for vendor in vendors]) |
||||||
|
|
||||||
|
def on_calculation_type_changed(self): |
||||||
|
"""Invoke when calculation type is changed""" |
||||||
|
if self.topNum_radio.isChecked(): |
||||||
|
self.top_num_frame.setEnabled(True) |
||||||
|
self.frame_cost.setEnabled(False) |
||||||
|
self.name_combobox.setEnabled(False) |
||||||
|
self.name_label.setEnabled(False) |
||||||
|
if self.costRatio_radio.isChecked(): |
||||||
|
self.top_num_frame.setEnabled(False) |
||||||
|
self.frame_cost.setEnabled(True) |
||||||
|
self.name_combobox.setEnabled(True) |
||||||
|
self.name_label.setEnabled(True) |
||||||
|
if self.monthly_radio.isChecked() or self.yearly_radio.isChecked(): |
||||||
|
self.top_num_frame.setEnabled(False) |
||||||
|
self.frame_cost.setEnabled(False) |
||||||
|
self.name_combobox.setEnabled(True) |
||||||
|
self.name_label.setEnabled(True) |
||||||
|
|
||||||
|
def on_report_parameter_changed(self, text): |
||||||
|
"""Invoke when report type is changed""" |
||||||
|
self.metric.clear() |
||||||
|
if text in DATABASE_REPORTS: |
||||||
|
self.metric.addItems(DATABASE_REPORTS_METRIC) |
||||||
|
self.name_label.setText('Database') |
||||||
|
if text in ITEM_REPORTS: |
||||||
|
self.metric.addItems(ITEM_REPORTS_METRIC) |
||||||
|
self.name_label.setText('Item') |
||||||
|
if text in PLATFORM_REPORTS: |
||||||
|
self.metric.addItems(PLATFORM_REPORTS_METRIC) |
||||||
|
self.name_label.setText('Platform') |
||||||
|
if text in TITLE_REPORTS: |
||||||
|
self.metric.addItems(TITLE_REPORTS_METRIC) |
||||||
|
self.name_label.setText('Title') |
||||||
|
if self.vendor.currentText(): |
||||||
|
self.fill_names() |
||||||
|
|
||||||
|
def on_vendor_changed(self): |
||||||
|
"""Invoke when vendor is changed""" |
||||||
|
self.vendor_parameter = self.vendor.currentText() |
||||||
|
if self.report_parameter.currentText(): |
||||||
|
self.fill_names() |
||||||
|
|
||||||
|
def fill_names(self, only_get_costs_names: bool = False): |
||||||
|
"""Fill name field combobox""" |
||||||
|
self.name_combobox.clear() |
||||||
|
|
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
if not only_get_costs_names: |
||||||
|
names_sql_text, names_data = ManageDB.get_names_sql_text(self.report_parameter.currentText(), self.vendor_parameter) |
||||||
|
names_results = ManageDB.run_select_sql(connection, names_sql_text, names_data) |
||||||
|
if names_results: |
||||||
|
self.names = [result[0] for result in names_results] |
||||||
|
else: |
||||||
|
self.names = [] |
||||||
|
if self.settings.show_debug_messages: print(names_results) |
||||||
|
|
||||||
|
costs_sql_text, costs_data = ManageDB.get_names_with_costs_sql_text(self.report_parameter.currentText(), |
||||||
|
self.vendor_parameter, |
||||||
|
int(self.start_year_parameter.text()), |
||||||
|
int(self.end_year_parameter.text())) |
||||||
|
costs_results = ManageDB.run_select_sql(connection, costs_sql_text, costs_data) |
||||||
|
if costs_results: |
||||||
|
self.costs_names = [result[0] for result in costs_results] |
||||||
|
else: |
||||||
|
self.costs_names = [] |
||||||
|
if self.settings.show_debug_messages: print(costs_results) |
||||||
|
|
||||||
|
connection.close() |
||||||
|
model = QStandardItemModel() |
||||||
|
for name in self.names: |
||||||
|
item = QStandardItem(name) |
||||||
|
if name in self.costs_names: |
||||||
|
font = QFont() |
||||||
|
font.setBold(True) |
||||||
|
item.setFont(font) |
||||||
|
model.appendRow(item) |
||||||
|
self.name_combobox.setModel(model) |
||||||
|
else: |
||||||
|
print('Error, no connection') |
||||||
|
|
||||||
|
# submit search result to database and open results |
||||||
|
def createChart(self): |
||||||
|
"""Invoke when user click on create chart""" |
||||||
|
|
||||||
|
# get report type |
||||||
|
report = self.report_parameter.currentText() |
||||||
|
# get start year |
||||||
|
start_year = self.start_year_parameter.text() |
||||||
|
# get end year |
||||||
|
end_year = self.end_year_parameter.text() |
||||||
|
# get name |
||||||
|
name = self.name_combobox.currentText() |
||||||
|
# get metric |
||||||
|
metric = self.metric.currentText() |
||||||
|
# get vendor |
||||||
|
vendor = self.vendor.currentText() |
||||||
|
self.top_num = -1 |
||||||
|
|
||||||
|
self.temp_results = [] |
||||||
|
message = "" |
||||||
|
message1 = "" |
||||||
|
message2 = "" |
||||||
|
message3 = "" |
||||||
|
message4 = "" |
||||||
|
if name == "" and self.topNum_radio.isChecked() == False: |
||||||
|
message4 = "- Enter/Choose " + self.name_label.text() + "\n" |
||||||
|
if vendor == "" and self.topNum_radio.isChecked() == False: |
||||||
|
message1 = "- Choose a Vendor \n" |
||||||
|
if start_year > end_year or (int(start_year) > datetime.datetime.now().year or int(end_year) > datetime.datetime.now().year) : |
||||||
|
currentYear = datetime.datetime.now().year |
||||||
|
message3 = "- Start Year must be less than End Year and they cannot be greater than " + str( |
||||||
|
currentYear) + "\n" |
||||||
|
message = message1 + message4 + message3 |
||||||
|
if message != "": |
||||||
|
message = "To Create Chart check the following: \n" + message |
||||||
|
GeneralUtils.show_message(message) |
||||||
|
|
||||||
|
if self.monthly_radio.isChecked() and message == "": |
||||||
|
# sql query to get search results |
||||||
|
sql_text, data = ManageDB.monthly_chart_search_sql_text(report, start_year, end_year, name, metric, vendor) |
||||||
|
print(sql_text) # testing |
||||||
|
headers = tuple([field['name'] for field in ManageDB.get_monthly_chart_report_fields_list(report)]) |
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
self.results = ManageDB.run_select_sql(connection, sql_text, data) |
||||||
|
print(self.results) |
||||||
|
|
||||||
|
self.results.insert(0, headers) |
||||||
|
print(self.results) |
||||||
|
connection.close() |
||||||
|
else: |
||||||
|
print('Error, no connection') |
||||||
|
if len(self.results) > 1 and self.monthly_radio.isChecked(): |
||||||
|
self.process_default_data() |
||||||
|
self.open_file_folder() |
||||||
|
if name != "" and start_year <= end_year and len(self.results) <= 1: |
||||||
|
message4 = name + " of " + metric + " NOT FOUND in " + report + " for the chosen year range!" |
||||||
|
GeneralUtils.show_message(message4) |
||||||
|
|
||||||
|
if self.yearly_radio.isChecked() and message == "": |
||||||
|
# sql query to get search results |
||||||
|
sql_text, data = ManageDB.yearly_chart_search_sql_text(report, start_year, end_year, name, metric, vendor) |
||||||
|
print(sql_text) # testing |
||||||
|
headers = tuple([field['name'] for field in ManageDB.get_yearly_chart_report_fields_list(report)]) |
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
self.results = ManageDB.run_select_sql(connection, sql_text, data) |
||||||
|
print(self.results) |
||||||
|
|
||||||
|
self.results.insert(0, headers) |
||||||
|
print(self.results) |
||||||
|
connection.close() |
||||||
|
else: |
||||||
|
print('Error, no connection') |
||||||
|
if len(self.results) > 1 and self.yearly_radio.isChecked(): |
||||||
|
self.process_yearly_data() |
||||||
|
self.open_file_folder() |
||||||
|
if name != "" and start_year <= end_year and len(self.results) <= 1: |
||||||
|
message4 = name + " of " + metric + " NOT FOUND in " + report + " for the chosen year range!" |
||||||
|
GeneralUtils.show_message(message4) |
||||||
|
|
||||||
|
if self.costRatio_radio.isChecked() and message == "": |
||||||
|
# sql query to get search results |
||||||
|
sql_text, data = ManageDB.cost_chart_search_sql_text(report, start_year, end_year, name, metric, vendor) |
||||||
|
print(sql_text) # testing |
||||||
|
headers = tuple([field['name'] for field in ManageDB.get_cost_chart_report_fields_list(report)]) |
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
self.results = ManageDB.run_select_sql(connection, sql_text, data) |
||||||
|
print(self.results) |
||||||
|
|
||||||
|
self.results.insert(0, headers) |
||||||
|
print(self.results) |
||||||
|
connection.close() |
||||||
|
else: |
||||||
|
print('Error, no connection') |
||||||
|
|
||||||
|
if len(self.results) > 1 and self.costRatio_radio.isChecked(): |
||||||
|
self.process_cost_ratio_data() |
||||||
|
self.open_file_folder() |
||||||
|
if name != "" and start_year <= end_year and len(self.results) <= 1: |
||||||
|
message4 = name + " of " + metric + " NOT FOUND in " + report + " for the chosen year range!" |
||||||
|
GeneralUtils.show_message(message4) |
||||||
|
|
||||||
|
if self.topNum_radio.isChecked() and message == "": |
||||||
|
self.top_num = int(self.top_num_edit.text()) |
||||||
|
if self.top_num == 0: |
||||||
|
self.top_num = None |
||||||
|
if self.vendor.currentText() == "": |
||||||
|
vendor = None |
||||||
|
sql_text, data = ManageDB.top_number_chart_search_sql_text(report, start_year, end_year, metric, vendor, |
||||||
|
self.top_num) |
||||||
|
headers = tuple([field['name'] for field in ManageDB.get_top_number_chart_report_fields_list(report)]) |
||||||
|
connection = ManageDB.create_connection(DATABASE_LOCATION) |
||||||
|
if connection is not None: |
||||||
|
self.results = ManageDB.run_select_sql(connection, sql_text, data) |
||||||
|
|
||||||
|
self.results.insert(0, headers) |
||||||
|
connection.close() |
||||||
|
else: |
||||||
|
print('Error, no connection') |
||||||
|
if len(self.results) > 1: |
||||||
|
self.process_top_X_data() |
||||||
|
self.open_file_folder() |
||||||
|
elif start_year <= end_year: |
||||||
|
message5 = self.name_label.text() + " of " + metric + " Not Found in " + report + " for the chosen year range!" |
||||||
|
GeneralUtils.show_message(message5) |
||||||
|
|
||||||
|
def open_file_folder(self): |
||||||
|
"""Invoke to open file or folder""" |
||||||
|
if self.open_folder.isChecked(): |
||||||
|
open_file_or_dir(os.path.dirname(self.file_name)) |
||||||
|
if self.open_file.isChecked(): |
||||||
|
open_file_or_dir(self.file_name) |
||||||
|
if not self.open_file.isChecked(): |
||||||
|
show_message('Results saved to ' + self.file_name) |
||||||
|
|
||||||
|
# process_data distributes the usage data for monthly in an array accordingly |
||||||
|
def process_default_data(self): |
||||||
|
"""Invoked when calculation type: monthly is selected""" |
||||||
|
m = len(self.results) |
||||||
|
self.legendEntry = [] # legend entry data |
||||||
|
for i in range(1, m): |
||||||
|
self.legendEntry.append(self.results[i][3]) |
||||||
|
|
||||||
|
# data is an array with the sorted usage figures |
||||||
|
self.data = [] |
||||||
|
for i in range(0, m): |
||||||
|
data1 = [] |
||||||
|
n = len(self.results[i]) |
||||||
|
for j in range(4, n): # from jan to dec only |
||||||
|
data1.append(self.results[i][j]) |
||||||
|
self.data.append(data1) |
||||||
|
# testing to make sure its working good |
||||||
|
print(self.data[0]) # this is the first column in the excel file/vertical axis data in the chart |
||||||
|
print(self.data[1]) |
||||||
|
print(len(self.data)) |
||||||
|
self.chart_type() |
||||||
|
|
||||||
|
def process_yearly_data(self): |
||||||
|
"""Invoked when calculation type: yearly is selected""" |
||||||
|
m = len(self.results) |
||||||
|
self.legendEntry = [] # legend entry data |
||||||
|
self.legendEntry.append(self.metric.currentText()) |
||||||
|
|
||||||
|
# data is an array with the sorted usage figures |
||||||
|
self.data = [] |
||||||
|
data1 = [] # year |
||||||
|
data2 = [] # reporting_period_total |
||||||
|
for i in range(1, m): |
||||||
|
data1.append(self.results[i][3]) |
||||||
|
self.data.append(data1) |
||||||
|
for i in range(1, m): |
||||||
|
data2.append(self.results[i][4]) |
||||||
|
self.data.append(data2) |
||||||
|
|
||||||
|
# testing to make sure its working good |
||||||
|
print(self.data[0]) # this is the first column in the excel file/vertical axis data in the chart |
||||||
|
print(self.data[1]) |
||||||
|
print(len(self.data)) |
||||||
|
self.chart_type() |
||||||
|
|
||||||
|
def process_cost_ratio_data(self): |
||||||
|
"""Invoked when calculation type: cost ratio is selected""" |
||||||
|
m = len(self.results) #length of self.results |
||||||
|
self.legendEntry = [] # legend entry data contains column names |
||||||
|
|
||||||
|
# data is an array of array with year, cost per metric, total and cost in separate arrays |
||||||
|
self.data = [] |
||||||
|
|
||||||
|
data1 = [] # year |
||||||
|
data2 = [] # cost per metric |
||||||
|
data3 = [] # reporting_period_total |
||||||
|
data4 = [] # cost |
||||||
|
|
||||||
|
# retrieve year and add it to array |
||||||
|
for i in range(1, m): |
||||||
|
data1.append(self.results[i][3]) |
||||||
|
self.data.append(data1) |
||||||
|
|
||||||
|
# retrieve cost and total and finding cost per metric and adding it to array |
||||||
|
if self.cost_parameter.currentText() == 'Cost in Local Currency with Tax': |
||||||
|
self.legendEntry.append('Cost in Local Currency with Tax Per Metric') |
||||||
|
self.legendEntry.append('Cost in Local Currency with Tax') |
||||||
|
for i in range(1, m): |
||||||
|
cost = self.results[i][7] |
||||||
|
if self.results[i][7] is None: |
||||||
|
cost = 0 |
||||||
|
data4.append(cost) |
||||||
|
data2.append(cost / self.results[i][8]) |
||||||
|
self.data.append(data2) |
||||||
|
self.data.append(data4) |
||||||
|
if self.cost_parameter.currentText() == 'Cost in Local Currency': |
||||||
|
self.legendEntry.append('Cost in Local Currency Per Metric') |
||||||
|
self.legendEntry.append('Cost in Local Currency') |
||||||
|
for i in range(1, m): |
||||||
|
cost = self.results[i][6] |
||||||
|
if self.results[i][6] is None: |
||||||
|
cost = 0 |
||||||
|
data4.append(cost) |
||||||
|
data2.append(cost / self.results[i][8]) |
||||||
|
self.data.append(data2) |
||||||
|
self.data.append(data4) |
||||||
|
if self.cost_parameter.currentText() == 'Cost in Original Currency': |
||||||
|
self.legendEntry.append('Cost in Original Currency Per Metric') |
||||||
|
self.legendEntry.append('Cost in Original Currency') |
||||||
|
for i in range(1, m): |
||||||
|
cost = self.results[i][4] |
||||||
|
if self.results[i][4] is None: |
||||||
|
cost = 0 |
||||||
|
data4.append(cost) |
||||||
|
data2.append(cost / self.results[i][8]) |
||||||
|
self.data.append(data2) |
||||||
|
self.data.append(data4) |
||||||
|
|
||||||
|
# retrieve reporting_period_total and add it to array |
||||||
|
for i in range(1, m): |
||||||
|
data3.append(self.results[i][8]) |
||||||
|
self.data.append(data3) |
||||||
|
|
||||||
|
# add column header to legend entry |
||||||
|
self.legendEntry.append(self.metric.currentText()) |
||||||
|
|
||||||
|
# testing to see data in array of array |
||||||
|
print(self.data[0]) # first column in excel (year) |
||||||
|
print(self.data[1]) # second column (cost per metric) |
||||||
|
# print(self.data[2]) # third column (cost) |
||||||
|
# print(self.data[4]) # fourth column (total) |
||||||
|
# print(len(self.data)) #testing |
||||||
|
self.chart_type() |
||||||
|
|
||||||
|
def process_top_X_data(self): |
||||||
|
"""Invoked when calculation type: top # is selected""" |
||||||
|
m = len(self.results) |
||||||
|
#print(self.results) |
||||||
|
print(m) |
||||||
|
self.temp_results = [] |
||||||
|
|
||||||
|
self.legendEntry = [] # legend entry data |
||||||
|
self.legendEntry.append(self.results[0][3]) |
||||||
|
self.legendEntry.append(self.results[0][4]) |
||||||
|
for i in range(1, m): |
||||||
|
self.temp_results.append(self.results[i]) |
||||||
|
self.temp_results = sorted(self.temp_results, key=itemgetter(4)) |
||||||
|
print(len(self.temp_results)) |
||||||
|
print(self.temp_results) |
||||||
|
n = len(self.temp_results) |
||||||
|
|
||||||
|
# data is an array with the sorted usage figures |
||||||
|
self.data = [] |
||||||
|
data1 = [] # name(database, title,...) |
||||||
|
data2 = [] # reporting total |
||||||
|
data3 = [] # rankings |
||||||
|
data4 = [] # optional vendor column |
||||||
|
|
||||||
|
# get all name(database,title,...) |
||||||
|
data = self.temp_results[0][0] |
||||||
|
data1.append(data) |
||||||
|
for i in range(1, n): # get database |
||||||
|
data = self.temp_results[i][0] |
||||||
|
data1.append(data) |
||||||
|
self.data.append(data1) |
||||||
|
print(data1) |
||||||
|
|
||||||
|
# get all reporting total |
||||||
|
metri = self.temp_results[0][3] |
||||||
|
data2.append(metri) |
||||||
|
for i in range(1, n): # get reporting total |
||||||
|
metri = self.temp_results[i][3] |
||||||
|
data2.append(metri) |
||||||
|
self.data.append(data2) |
||||||
|
print(data2) |
||||||
|
|
||||||
|
# get all ranking |
||||||
|
rank = self.temp_results[0][4] |
||||||
|
data3.append(rank) |
||||||
|
for i in range(1, n): |
||||||
|
rank = self.temp_results[i][4] |
||||||
|
data3.append(rank) |
||||||
|
self.data.append(data3) |
||||||
|
|
||||||
|
# will add vendor column to chart if the user do not enter anything in vendor |
||||||
|
if self.vendor.currentText() == "": |
||||||
|
self.legendEntry.append(self.results[0][2]) |
||||||
|
for i in range(0, n): |
||||||
|
rank = self.temp_results[i][2] |
||||||
|
data4.append(rank) |
||||||
|
self.data.append(data4) |
||||||
|
|
||||||
|
self.chart_type() |
||||||
|
|
||||||
|
# get chart type checked |
||||||
|
def chart_type(self): |
||||||
|
"""Invoked to determine which chart type is selected by user""" |
||||||
|
if self.h_bar_radio.isChecked(): |
||||||
|
self.horizontal_bar_chart() |
||||||
|
|
||||||
|
if self.v_bar_radio.isChecked(): |
||||||
|
self.vertical_bar_chart() |
||||||
|
|
||||||
|
if self.line_radio.isChecked(): |
||||||
|
self.line_chart() |
||||||
|
|
||||||
|
# get file name and titles from user |
||||||
|
def customizeChart(self): |
||||||
|
"""Invoked to get information from user to customize chart. |
||||||
|
|
||||||
|
It is highly recommended that user write the details like year, report type, calculation type,.. in chart title""" |
||||||
|
chart_title = self.chart_title_edit.text() |
||||||
|
horizontal_axis_title = self.horizontal_axis_edit.text() |
||||||
|
vertical_axis_title = self.vertical_axis_edit.text() |
||||||
|
return chart_title, horizontal_axis_title, vertical_axis_title |
||||||
|
|
||||||
|
# add titles to chart and styles |
||||||
|
@staticmethod |
||||||
|
def add_Customize(chart1, chart_title, horizontal_axis_title, vertical_axis_title): |
||||||
|
"""Invoked to add information to customize the chart |
||||||
|
|
||||||
|
:param chart1: the chart to add details to |
||||||
|
:param chart_title: the chart title |
||||||
|
:param horizontal_axis_title: the horizontal axis title |
||||||
|
:param vertical_axis_title: the vertical axis title""" |
||||||
|
|
||||||
|
# Add a chart title and some axis labels. |
||||||
|
chart1.set_title({'name': chart_title}) |
||||||
|
chart1.set_x_axis({'name': horizontal_axis_title}) |
||||||
|
chart1.set_y_axis({'name': vertical_axis_title}) |
||||||
|
# Set an Excel chart style. |
||||||
|
chart1.set_style(11) |
||||||
|
|
||||||
|
# create file with ext and add sheet to file |
||||||
|
def createFile(self): |
||||||
|
"""Invoked to create xlsx file""" |
||||||
|
|
||||||
|
self.file_name = choose_save(EXCEL_FILTER) |
||||||
|
if self.file_name != '': |
||||||
|
if not self.file_name.lower().endswith('.xlsx'): |
||||||
|
self.file_name += '.xlsx' |
||||||
|
|
||||||
|
workbook = xlsxwriter.Workbook(self.file_name) |
||||||
|
# add sheet to xlsx file |
||||||
|
worksheet = workbook.add_worksheet() |
||||||
|
return workbook, worksheet |
||||||
|
|
||||||
|
# Add the worksheet data that the charts will refer to. |
||||||
|
def populateData(self, vertical_axis_title, worksheet, workbook): |
||||||
|
"""Invoked to create xlsx file |
||||||
|
|
||||||
|
:param vertical_axis_title: the vertical axis title |
||||||
|
:param worksheet: the worksheet in the xlsx file |
||||||
|
:param workbook: the workbook""" |
||||||
|
|
||||||
|
bold = workbook.add_format({'bold': 1}) |
||||||
|
#headings = [vertical_axis_title] |
||||||
|
headings = [""] |
||||||
|
for i in range(0, len(self.legendEntry)): |
||||||
|
headings.append(self.legendEntry[i]) |
||||||
|
worksheet.write_row('A1', headings, bold) |
||||||
|
worksheet.write_column('A2', self.data[0]) |
||||||
|
n = ord('A') + 1 |
||||||
|
if self.costRatio_radio.isChecked() == False: |
||||||
|
for i in range(1, len(self.data)): |
||||||
|
worksheet.write_column(chr(n) + '2', self.data[i]) |
||||||
|
n = n + 1 |
||||||
|
if self.costRatio_radio.isChecked() == True: |
||||||
|
# Add a number format for cells with money. |
||||||
|
currency = self.process_currency() |
||||||
|
money = workbook.add_format({'num_format': currency}) |
||||||
|
for i in range(1, len(self.data)-1): |
||||||
|
worksheet.write_column(chr(n) + '2', self.data[i], money) |
||||||
|
n = n + 1 |
||||||
|
worksheet.write_column(chr(n) + '2', self.data[len(self.data)-1]) |
||||||
|
|
||||||
|
# process currency |
||||||
|
def process_currency(self): |
||||||
|
"""Invoke to determine between local or original currency for cost""" |
||||||
|
if self.cost_parameter.currentText() == 'Cost in Local Currency with Tax' or self.cost_parameter.currentText() == 'Cost in Local Currency': |
||||||
|
local_currency = self.settings.default_currency |
||||||
|
currency = self.get_currency_code(local_currency) |
||||||
|
if self.cost_parameter.currentText() == 'Cost in Original Currency': |
||||||
|
original_currency = self.results[1][5] |
||||||
|
currency = self.get_currency_code(original_currency) |
||||||
|
return currency |
||||||
|
|
||||||
|
# return currency code for excel |
||||||
|
def get_currency_code(self, local_currency): |
||||||
|
"""Invoke to find currency being used""" |
||||||
|
if local_currency == 'CAD': |
||||||
|
currency = '[$CAD] #,###.#########################_)' |
||||||
|
if local_currency == 'USD': |
||||||
|
currency = '[$USD] #,###.#########################_)' |
||||||
|
if local_currency == 'EUR': |
||||||
|
currency = '[$EUR] #,###.#########################_)' |
||||||
|
if local_currency == 'JPY': |
||||||
|
currency = '[$JPY] #,###.#########################_)' |
||||||
|
if local_currency == 'GBP': |
||||||
|
currency = '[$GBP] #,###.#########################_)' |
||||||
|
if local_currency == 'CHF': |
||||||
|
currency = '[$CHF] #,###.#########################_)' |
||||||
|
if local_currency == 'AUD': |
||||||
|
currency = '[$AUD] #,###.#########################_)' |
||||||
|
return currency |
||||||
|
# create chart and add series to it |
||||||
|
def configureSeries(self, workbook, chart_type): |
||||||
|
"""Invoked to create xlsx file |
||||||
|
|
||||||
|
:param workbook: the workbook |
||||||
|
:param chart_type: the chart type""" |
||||||
|
|
||||||
|
chart1 = workbook.add_chart({'type': chart_type}) |
||||||
|
n = len(self.data[0]) |
||||||
|
# Configure the first series. |
||||||
|
chart1.add_series({ |
||||||
|
'name': '=Sheet1!$B$1', |
||||||
|
'categories': '=Sheet1!$A$2:$A$'+str(n+1), |
||||||
|
'values': '=Sheet1!$B$2:$B$'+str(n+1), |
||||||
|
}) |
||||||
|
|
||||||
|
# Configure any subsequent series. Note use of alternative syntax to define ranges. |
||||||
|
# no more series will be added if top # and cost ratio are not selected |
||||||
|
if self.top_num == -1 and self.costRatio_radio.isChecked() == False: |
||||||
|
m = 2 |
||||||
|
for i in range(2, len(self.data)): |
||||||
|
chart1.add_series({ |
||||||
|
'name': ['Sheet1', 0, m], |
||||||
|
'categories': ['Sheet1', 1, 0, n, 0], |
||||||
|
'values': ['Sheet1', 1, m, n, m], |
||||||
|
}) |
||||||
|
m = m + 1 |
||||||
|
return chart1 |
||||||
|
|
||||||
|
def horizontal_bar_chart(self): |
||||||
|
"""Invoked to create a horizontal bar chart""" |
||||||
|
|
||||||
|
# get titles from customizeChart |
||||||
|
chart_title, horizontal_axis_title, vertical_axis_title = self.customizeChart() |
||||||
|
|
||||||
|
# create xlsx file and add sheet file |
||||||
|
workbook, worksheet = self.createFile() |
||||||
|
|
||||||
|
# add data to worksheet |
||||||
|
self.populateData(vertical_axis_title, worksheet, workbook) |
||||||
|
|
||||||
|
# create horizontal bar chart and add series to it |
||||||
|
chart1 = self.configureSeries(workbook, 'bar') |
||||||
|
|
||||||
|
# Add a chart title and some axis labels. |
||||||
|
self.add_Customize(chart1, chart_title, horizontal_axis_title, vertical_axis_title) |
||||||
|
|
||||||
|
# Insert the chart into the worksheet (with an offset). |
||||||
|
worksheet.insert_chart('F2', chart1, {'x_scale': 2, 'y_scale': 2}) |
||||||
|
workbook.close() |
||||||
|
|
||||||
|
# Completion message |
||||||
|
message_completion = "Done!" |
||||||
|
GeneralUtils.show_message(message_completion) |
||||||
|
|
||||||
|
def vertical_bar_chart(self): |
||||||
|
"""Invoked to create a vertical bar chart""" |
||||||
|
|
||||||
|
# get titles from customizeChart |
||||||
|
chart_title, horizontal_axis_title, vertical_axis_title = self.customizeChart() |
||||||
|
|
||||||
|
# create xlsx file and add sheet file |
||||||
|
workbook, worksheet = self.createFile() |
||||||
|
|
||||||
|
# add data to worksheet |
||||||
|
self.populateData(vertical_axis_title, worksheet, workbook) |
||||||
|
|
||||||
|
# create horizontal bar chart and add series to it |
||||||
|
chart1 = self.configureSeries(workbook, 'column') |
||||||
|
|
||||||
|
# Add a chart title and some axis labels. |
||||||
|
self.add_Customize(chart1, chart_title, horizontal_axis_title, vertical_axis_title) |
||||||
|
|
||||||
|
# Insert the chart into the worksheet (with an offset). |
||||||
|
worksheet.insert_chart('F2', chart1, {'x_scale': 2, 'y_scale': 2}) |
||||||
|
workbook.close() |
||||||
|
|
||||||
|
# Completion message |
||||||
|
message_completion = "Done!" |
||||||
|
GeneralUtils.show_message(message_completion) |
||||||
|
|
||||||
|
def line_chart(self): |
||||||
|
"""Invoked to create a line chart""" |
||||||
|
|
||||||
|
# get titles from customizeChart |
||||||
|
chart_title, horizontal_axis_title, vertical_axis_title = self.customizeChart() |
||||||
|
|
||||||
|
# create xlsx file and add sheet file |
||||||
|
workbook, worksheet = self.createFile() |
||||||
|
|
||||||
|
# Add data to worksheet |
||||||
|
self.populateData(vertical_axis_title, worksheet, workbook) |
||||||
|
|
||||||
|
# create horizontal bar chart and add series to it |
||||||
|
chart1 = self.configureSeries(workbook, 'line') |
||||||
|
|
||||||
|
# Add a chart title and some axis labels. |
||||||
|
self.add_Customize(chart1, chart_title, horizontal_axis_title, vertical_axis_title) |
||||||
|
|
||||||
|
# Insert the chart into the worksheet (with an offset). |
||||||
|
worksheet.insert_chart('F2', chart1, {'x_scale': 2, 'y_scale': 2}) |
||||||
|
workbook.close() |
||||||
|
|
||||||
|
# Completion message |
||||||
|
message_completion = "Done!" |
||||||
|
GeneralUtils.show_message(message_completion) |
@ -0,0 +1,89 @@ |
|||||||
|
There are 2 levels of reports, Master Reports (e.g. PR, DR) which show all possible columns and Standard Views (e.g. PR_P1, DR_D1, DR_D2) which only show some of the columns from the master reports. |
||||||
|
|
||||||
|
## Report Fetching |
||||||
|
All reports are fetched via the COUNTER_SUSHI API, data is returned as JSON. The JSON models and all other details can be found at: https://app.swaggerhub.com/apis/COUNTER/counter-sushi_5_0_api/1.0.0 |
||||||
|
|
||||||
|
### Authentication |
||||||
|
SUSHI requests can use these parameters for authentication: |
||||||
|
- customer_id (required) |
||||||
|
- requestor_id (optional) |
||||||
|
- api_key (optional) |
||||||
|
There are also other optional parametrs like "platform" |
||||||
|
|
||||||
|
### URL Building |
||||||
|
Request supported reports: [base_url]/reports?[authentication],[parameters] |
||||||
|
|
||||||
|
Request report: [base_url]/reports/[report_type]?[authentication],[parameters],[begin_date],[end_date] |
||||||
|
|
||||||
|
## TSV Report Formatting |
||||||
|
All information about report formatting can be found at: https://www.projectcounter.org/code-of-practice-five-sections/3-0-technical-specifications/#formats |
||||||
|
|
||||||
|
All reports should be formatted like in this image: https://www.projectcounter.org/wp-content/uploads/2017/07/image3.png |
||||||
|
|
||||||
|
### Report Header |
||||||
|
All reports should have a header that takes the first 12 rows of the report. The header should be formatted like in this image: https://www.projectcounter.org/wp-content/uploads/2018/09/FIG-3D.png |
||||||
|
|
||||||
|
A blank row should then be added to separate the report header from the column headings and body of the report. |
||||||
|
|
||||||
|
### Report Column Headings and Body |
||||||
|
The column headings for each report type are as follows: |
||||||
|
|
||||||
|
PR |
||||||
|
["Platform", "Data_Type", "Access_Method"] |
||||||
|
|
||||||
|
PR_P1 |
||||||
|
["Platform"] |
||||||
|
|
||||||
|
DR |
||||||
|
["Database", "Publisher", "Publisher_ID", "Platform", "Propriety_ID", "Data_Type", "Access_Method"] |
||||||
|
|
||||||
|
DR_D1 and DR_D2 |
||||||
|
["Database", "Publisher", "Publisher_ID", "Platform", "Propriety_ID"] |
||||||
|
|
||||||
|
TR |
||||||
|
["Title", "Publisher", "Publisher_ID", "Platform", "DOI", "Propriety_ID", "ISBN", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI", "Data_Type", "Section_Type", "YOP", "Access_Type", "Access_Method"] |
||||||
|
|
||||||
|
TR_B1 and TR_B2 |
||||||
|
["Title", "Publisher", "Publisher_ID", "Platform", "DOI", "Propriety_ID", "ISBN", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI", "YOP"] |
||||||
|
|
||||||
|
TR_B3 |
||||||
|
["Title", "Publisher", "Publisher_ID", "Platform", "DOI", "Propriety_ID", "ISBN", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI", "YOP", "Access_Type"] |
||||||
|
|
||||||
|
TR_J1 and TR_J2 |
||||||
|
["Title", "Publisher", "Publisher_ID", "Platform", "DOI", "Propriety_ID", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI"] |
||||||
|
|
||||||
|
TR_J3 |
||||||
|
["Title", "Publisher", "Publisher_ID", "Platform", "DOI", "Propriety_ID", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI", "Access_Type"] |
||||||
|
|
||||||
|
TR_J4 |
||||||
|
["Title", "Publisher", "Publisher_ID", "Platform", "DOI", "Propriety_ID", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI", "YOP"] |
||||||
|
|
||||||
|
IR |
||||||
|
["Item", "Publisher", "Publisher_ID", "Platform", "Authors", "Publication_Date", "Article_version", "DOI", "Propriety_ID", "ISBN", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI", "Parent_Title", "Parent_Authors", "Parent_Publication_Date", "Parent_Article_Version", "Parent_Data_Type", "Parent_DOI", "Parent_Proprietary_ID", "Parent_ISBN", "Parent_Print_ISSN", "Parent_Online_ISSN", "Parent_URI", "Data_Type", "YOP", "Access_Type", "Access_Method"] |
||||||
|
|
||||||
|
IR_A1 |
||||||
|
["Item", "Publisher", "Publisher_ID", "Platform", "Authors", "Publication_Date", "Article_version", "DOI", "Propriety_ID", "Print_ISSN", "Online_ISSN", "Linking_ISSN", "URI", "Parent_Title", "Parent_Authors", "Parent_Article_Version", "Parent_DOI", "Parent_Proprietary_ID", "Parent_Print_ISSN", "Parent_Online_ISSN", "Parent_URI", "Access_Type"] |
||||||
|
|
||||||
|
IR_M1 |
||||||
|
["Item", "Publisher", "Publisher_ID", "Platform", "DOI", "Propriety_ID", "URI"] |
||||||
|
|
||||||
|
|
||||||
|
All report types end with these headings: |
||||||
|
[ |
||||||
|
"Metric_Type", |
||||||
|
"Reporting_Period_Total", |
||||||
|
"January", |
||||||
|
"February", |
||||||
|
"March", |
||||||
|
"April", |
||||||
|
"May", |
||||||
|
"June", |
||||||
|
"July", |
||||||
|
"August", |
||||||
|
"September", |
||||||
|
"October", |
||||||
|
"November", |
||||||
|
"December" |
||||||
|
] |
||||||
|
|
||||||
|
The report body is then populated with the data received |
@ -0,0 +1,7 @@ |
|||||||
|
Constants module |
||||||
|
======================== |
||||||
|
|
||||||
|
.. automodule:: Constants |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
Costs module |
||||||
|
============ |
||||||
|
|
||||||
|
.. automodule:: Costs |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
FetchData module |
||||||
|
================ |
||||||
|
|
||||||
|
.. automodule:: FetchData |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
GeneralUtils module |
||||||
|
=================== |
||||||
|
|
||||||
|
.. automodule:: GeneralUtils |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
ImportFile module |
||||||
|
================= |
||||||
|
|
||||||
|
.. automodule:: ImportFile |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
MainDriver module |
||||||
|
================= |
||||||
|
|
||||||
|
.. automodule:: MainDriver |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,20 @@ |
|||||||
|
# Minimal makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line, and also
|
||||||
|
# from the environment for the first two.
|
||||||
|
SPHINXOPTS ?=
|
||||||
|
SPHINXBUILD ?= sphinx-build
|
||||||
|
SOURCEDIR = .
|
||||||
|
BUILDDIR = _build
|
||||||
|
|
||||||
|
# Put it first so that "make" without argument is like "make help".
|
||||||
|
help: |
||||||
|
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||||
|
|
||||||
|
.PHONY: help Makefile |
||||||
|
|
||||||
|
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||||
|
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||||
|
%: Makefile |
||||||
|
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
@ -0,0 +1,7 @@ |
|||||||
|
ManageDB module |
||||||
|
=============== |
||||||
|
|
||||||
|
.. automodule:: ManageDB |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
ManageVendors module |
||||||
|
==================== |
||||||
|
|
||||||
|
.. automodule:: ManageVendors |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
Search module |
||||||
|
============= |
||||||
|
|
||||||
|
.. automodule:: Search |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
Settings module |
||||||
|
=============== |
||||||
|
|
||||||
|
.. automodule:: Settings |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,7 @@ |
|||||||
|
Visual module |
||||||
|
============= |
||||||
|
|
||||||
|
.. automodule:: Visual |
||||||
|
:members: |
||||||
|
:undoc-members: |
||||||
|
:show-inheritance: |
@ -0,0 +1,58 @@ |
|||||||
|
# Configuration file for the Sphinx documentation builder. |
||||||
|
# |
||||||
|
# This file only contains a selection of the most common options. For a full |
||||||
|
# list see the documentation: |
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html |
||||||
|
|
||||||
|
# -- Path setup -------------------------------------------------------------- |
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory, |
||||||
|
# add these directories to sys.path here. If the directory is relative to the |
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here. |
||||||
|
# |
||||||
|
import os |
||||||
|
import sys |
||||||
|
sys.path.insert(0, os.path.abspath('..')) |
||||||
|
|
||||||
|
|
||||||
|
# -- Project information ----------------------------------------------------- |
||||||
|
|
||||||
|
project = 'COUNTER 5 Report Tool' |
||||||
|
copyright = '2020, Adam McGuigan, Chandler Acorn, Samuel Esan, Urvesh Boodhoon, Ziheng Huang' |
||||||
|
author = 'Adam McGuigan, Chandler Acorn, Samuel Esan, Urvesh Boodhoon, Ziheng Huang' |
||||||
|
|
||||||
|
|
||||||
|
# -- General configuration --------------------------------------------------- |
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be |
||||||
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom |
||||||
|
# ones. |
||||||
|
extensions = [ |
||||||
|
'sphinx.ext.autodoc', |
||||||
|
'sphinx_autodoc_typehints', |
||||||
|
'sphinx_rtd_theme' |
||||||
|
] |
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory. |
||||||
|
templates_path = ['_templates'] |
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and |
||||||
|
# directories to ignore when looking for source files. |
||||||
|
# This pattern also affects html_static_path and html_extra_path. |
||||||
|
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] |
||||||
|
|
||||||
|
# The master document |
||||||
|
master_doc = 'index' |
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output ------------------------------------------------- |
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for |
||||||
|
# a list of builtin themes. |
||||||
|
# |
||||||
|
html_theme = 'sphinx_rtd_theme' |
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here, |
||||||
|
# relative to this directory. They are copied after the builtin static files, |
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css". |
||||||
|
html_static_path = ['_static'] |
@ -0,0 +1,31 @@ |
|||||||
|
.. COUNTER 5 Report Tool documentation master file, created by |
||||||
|
sphinx-quickstart on Sat Mar 21 00:21:37 2020. |
||||||
|
You can adapt this file completely to your liking, but it should at least |
||||||
|
contain the root `toctree` directive. |
||||||
|
|
||||||
|
Welcome to COUNTER 5 Report Tool's documentation! |
||||||
|
================================= |
||||||
|
|
||||||
|
.. toctree:: |
||||||
|
:maxdepth: 2 |
||||||
|
:caption: Modules: |
||||||
|
|
||||||
|
Constants.py |
||||||
|
Costs.py |
||||||
|
FetchData.py |
||||||
|
GeneralUtils.py |
||||||
|
ImportFile.py |
||||||
|
MainDriver.py |
||||||
|
ManageDB.py |
||||||
|
ManageVendors.py |
||||||
|
Search.py |
||||||
|
Settings.py |
||||||
|
Visual.py |
||||||
|
|
||||||
|
|
||||||
|
Indices and tables |
||||||
|
================== |
||||||
|
|
||||||
|
* :ref:`genindex` |
||||||
|
* :ref:`modindex` |
||||||
|
* :ref:`search` |
@ -0,0 +1,35 @@ |
|||||||
|
@ECHO OFF |
||||||
|
|
||||||
|
pushd %~dp0 |
||||||
|
|
||||||
|
REM Command file for Sphinx documentation |
||||||
|
|
||||||
|
if "%SPHINXBUILD%" == "" ( |
||||||
|
set SPHINXBUILD=sphinx-build |
||||||
|
) |
||||||
|
set SOURCEDIR=. |
||||||
|
set BUILDDIR=_build |
||||||
|
|
||||||
|
if "%1" == "" goto help |
||||||
|
|
||||||
|
%SPHINXBUILD% >NUL 2>NUL |
||||||
|
if errorlevel 9009 ( |
||||||
|
echo. |
||||||
|
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx |
||||||
|
echo.installed, then set the SPHINXBUILD environment variable to point |
||||||
|
echo.to the full path of the 'sphinx-build' executable. Alternatively you |
||||||
|
echo.may add the Sphinx directory to PATH. |
||||||
|
echo. |
||||||
|
echo.If you don't have Sphinx installed, grab it from |
||||||
|
echo.http://sphinx-doc.org/ |
||||||
|
exit /b 1 |
||||||
|
) |
||||||
|
|
||||||
|
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% |
||||||
|
goto end |
||||||
|
|
||||||
|
:help |
||||||
|
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% |
||||||
|
|
||||||
|
:end |
||||||
|
popd |
@ -0,0 +1,26 @@ |
|||||||
|
# How to create COUNTER 5 Report Tool's executable |
||||||
|
|
||||||
|
* Install python |
||||||
|
* Install pip |
||||||
|
* Install pyinstaller (pip install pyinstaller) |
||||||
|
|
||||||
|
|
||||||
|
Before starting the process below, make sure to delete your alldata folder as anything included in it will be included in the EXE file. |
||||||
|
|
||||||
|
|
||||||
|
### Creating the executable in terminal |
||||||
|
1. Open terminal/Command Prompt |
||||||
|
2. cd to your projectDirectory |
||||||
|
3. Run: *pip install -r requirements.txt* |
||||||
|
4. Run: *pip show validators* |
||||||
|
This will show the validators package location. |
||||||
|
5. Run: pyi-makespec --paths=DirectoryWithValidatorsPackage maindriver.py |
||||||
|
|
||||||
|
6. Run pyinstaller |
||||||
|
* Windows: Run: pyinstaller --onefile MainDriver.py -n "Counter 5 Report Tool" -i main_icon.ico |
||||||
|
* macOS: Run: pyinstaller --onefile --windowed -n "Counter 5 Report Tool" -i main_icon.ico |
||||||
|
* UNIX: Run: pyinstaller --onefile MainDriver.py -n "Counter 5 Report Tool" -i main_icon.ico |
||||||
|
|
||||||
|
Check in the project directory, under the folder named dist. There should now be an .exe or .app file. Double click the file to open. |
||||||
|
|
||||||
|
If you receive an error about missing modules make sure that you ran pyi-makespec and gave the right path. If there are other modules other than validators that the exe says it is missing you will need to include their paths as well. |
After Width: | Height: | Size: 169 KiB |
After Width: | Height: | Size: 177 KiB |
After Width: | Height: | Size: 177 KiB |
After Width: | Height: | Size: 205 KiB |
After Width: | Height: | Size: 217 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 158 KiB |
After Width: | Height: | Size: 134 KiB |
After Width: | Height: | Size: 22 KiB |
@ -0,0 +1,13 @@ |
|||||||
|
certifi==2020.4.5.1 |
||||||
|
chardet==3.0.4 |
||||||
|
decorator==4.4.2 |
||||||
|
idna==2.9 |
||||||
|
PyQt5==5.12.3 |
||||||
|
PyQt5-sip==12.7.2 |
||||||
|
requests==2.23.0 |
||||||
|
six==1.14.0 |
||||||
|
urllib3==1.25.9 |
||||||
|
validators==0.14.3 |
||||||
|
XlsxWriter==1.2.8 |
||||||
|
sphinx==2.4.4 |
||||||
|
sphinx_autodoc_typehints |
@ -0,0 +1,34 @@ |
|||||||
|
import sys |
||||||
|
import unittest |
||||||
|
from PyQt5.QtWidgets import QApplication, QDialog |
||||||
|
|
||||||
|
|
||||||
|
from ui import AddVendorDialog |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
|
||||||
|
vendor_dialog = QDialog() |
||||||
|
vendor_dialog_ui = AddVendorDialog.Ui_addVendorDialog() |
||||||
|
vendor_dialog_ui.setupUi(vendor_dialog) |
||||||
|
|
||||||
|
class AddVendorDialogTests(unittest.TestCase): |
||||||
|
|
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(vendor_dialog_ui.nameEdit.text(), "") |
||||||
|
self.assertEqual(vendor_dialog_ui.customerIdEdit.text(), "") |
||||||
|
self.assertEqual(vendor_dialog_ui.baseUrlEdit.text(), "") |
||||||
|
self.assertEqual(vendor_dialog_ui.requestorIdEdit.text(), "") |
||||||
|
self.assertEqual(vendor_dialog_ui.apiKeyEdit.text(), "") |
||||||
|
self.assertEqual(vendor_dialog_ui.platformEdit.text(), "") |
||||||
|
self.assertEqual(vendor_dialog_ui.local_only_check_box.checkState(), False) |
||||||
|
self.assertEqual(vendor_dialog_ui.descriptionEdit.toPlainText(), "") |
||||||
|
|
||||||
|
def test_ok_button(self): |
||||||
|
okWidget = vendor_dialog_ui.buttonBox.Ok |
||||||
|
self.assertIsNotNone(okWidget) |
||||||
|
cancelWidget = vendor_dialog_ui.buttonBox.Cancel |
||||||
|
self.assertIsNotNone(cancelWidget) |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
unittest.main() |
@ -0,0 +1,53 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import CostsTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
costTab_widget = QWidget() |
||||||
|
costTab_widget_ui = CostsTab.Ui_costs_tab() |
||||||
|
costTab_widget_ui.setupUi(costTab_widget) |
||||||
|
|
||||||
|
class CostsTabTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(costTab_widget_ui.costs_name_parameter_label.text(),"Name") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_report_parameter_label.text(), "Report") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_vendor_parameter_label.text(),"Vendor") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_year_parameter_label.text(),"Year") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_cost_in_local_currency_label.text(),"Cost in Local Currency") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_cost_in_local_currency_with_tax_label.text(),"Cost in Local Currency with Tax") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_cost_in_original_currency_label.text(),"Cost in Original Currency") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_original_currency_label.text(),"Original Currency") |
||||||
|
|
||||||
|
def test_doublesPinBox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(costTab_widget_ui.costs_cost_in_local_currency_doublespinbox.text(),"") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_cost_in_local_currency_with_tax_doublespinbox.text(),"") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_cost_in_original_currency_doublespinbox.text(),"") |
||||||
|
|
||||||
|
def test_combobox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(costTab_widget_ui.costs_name_parameter_combobox.isEditable(),True) |
||||||
|
self.assertEqual(costTab_widget_ui.costs_report_parameter_combobox.isEditable(),False) |
||||||
|
self.assertEqual(costTab_widget_ui.costs_vendor_parameter_combobox.isEditable(),False) |
||||||
|
self.assertEqual(costTab_widget_ui.costs_original_currency_value_combobox.isEditable(),True) |
||||||
|
self.assertEqual(costTab_widget_ui.costs_name_parameter_combobox.currentText(), "") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_report_parameter_combobox.currentText(), "") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_vendor_parameter_combobox.currentText(), "") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_original_currency_value_combobox.currentText(), "") |
||||||
|
|
||||||
|
def test_dateEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(costTab_widget_ui.costs_year_parameter_dateedit.text(),"2000") |
||||||
|
|
||||||
|
def test_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(costTab_widget_ui.costs_clear_button.text(), "Clear") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_insert_button.text(), "Insert") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_load_button.text(), "Load") |
||||||
|
self.assertEqual(costTab_widget_ui.costs_load_from_disk_button.text(), "Load From Disk") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,22 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QDialog |
||||||
|
|
||||||
|
from ui import DisclaimerDialog |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
disclaimer_dialog = QDialog() |
||||||
|
disclaimer_dialog_ui = DisclaimerDialog.Ui_dialog() |
||||||
|
disclaimer_dialog_ui.setupUi(disclaimer_dialog) |
||||||
|
|
||||||
|
class DisclaimerDialogTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(disclaimer_dialog_ui.label.text(),"Only reports supported by selected vendor will be retrieved!") |
||||||
|
|
||||||
|
def test_button(self): |
||||||
|
okWidget = disclaimer_dialog_ui.buttonBox.Ok |
||||||
|
self.assertIsNotNone(okWidget) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,28 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QDialog |
||||||
|
|
||||||
|
from ui import FetchProgressDialog |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
fetch_progress_dialog = QDialog() |
||||||
|
fetch_progress_dialog_ui = FetchProgressDialog.Ui_FetchProgressDialog() |
||||||
|
fetch_progress_dialog_ui.setupUi(fetch_progress_dialog) |
||||||
|
|
||||||
|
|
||||||
|
class FetchProgressDialogTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetch_progress_dialog_ui.status_label.text(), "Fetching...") |
||||||
|
self.assertEqual(fetch_progress_dialog_ui.progress_bar.text(), "24%") |
||||||
|
|
||||||
|
def test_button(self): |
||||||
|
okWidget = fetch_progress_dialog_ui.buttonBox.Ok |
||||||
|
self.assertIsNotNone(okWidget) |
||||||
|
retryWidget = fetch_progress_dialog_ui.buttonBox.Retry |
||||||
|
self.assertIsNotNone(retryWidget) |
||||||
|
cancelWidget = fetch_progress_dialog_ui.buttonBox.Cancel |
||||||
|
self.assertIsNotNone(cancelWidget) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,50 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import FetchReportsTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
fetchReportsTab_widget = QWidget() |
||||||
|
fetchReportsTab_widget_ui = FetchReportsTab.Ui_fetch_reports_tab() |
||||||
|
fetchReportsTab_widget_ui.setupUi(fetchReportsTab_widget) |
||||||
|
|
||||||
|
class FetchReportsTabTest(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.Adv_Fetch_text.text(),"Advanced Fetch Reports") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_11.text(),"Select Vendors") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_12.text(), "Select Report Types") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_38.text(), "Not a yearly date range") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_41.text(), "Report(s) will be saved to:") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_10.text(), "End Date") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_9.text(), "Begin Date") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_8.text(), "Date Range") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_34.text(), "Year") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.label_35.text(), "Fetch All Reports") |
||||||
|
|
||||||
|
def test_dateEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.begin_date_edit_fetch_month.text(),"01") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.begin_date_edit_fetch_year.text(),"2020") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.end_date_edit_fetch_month.text(),"01") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.end_date_edit_fetch_year.text(),"2020") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.All_reports_edit_fetch.text(),"2020") |
||||||
|
|
||||||
|
def test_pushButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.deselect_vendors_button_fetch.text(),"Deselect All") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.select_vendors_button_fetch.text(),"Select All") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.deselect_report_types_button_fetch.text(), "Deselect All") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.select_report_types_button_fetch.text(), "Select All") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.report_types_help_button.text(),"?") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.fetch_advanced_button.text(),"Fetch Selected Reports") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.custom_dir_button.text(),"Change") |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.fetch_all_data_button.text(),"Fetch All Reports") |
||||||
|
|
||||||
|
def test_lineEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchReportsTab_widget_ui.custom_dir_edit.text(),"") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,43 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import FetchSpecialReportsTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
fetchSpecialReportsTab_widget = QWidget() |
||||||
|
fetchSpecialReportsTab_widget_ui = FetchSpecialReportsTab.Ui_fetch_special_reports_tab() |
||||||
|
fetchSpecialReportsTab_widget_ui.setupUi(fetchSpecialReportsTab_widget) |
||||||
|
|
||||||
|
class FetchSpecialReportsTabTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.label_20.text(),"Select Report Type") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.label_21.text(), "Select Vendors") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.label_14.text(),"Options") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.label_25.text(),"End Date") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.label_24.text(),"Begin Date") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.label_15.text(),"Date Range") |
||||||
|
|
||||||
|
def test_radioButrton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.dr_radio_button.text(),"DR") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.pr_radio_button.text(), "PR") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.tr_radio_button.text(), "TR") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.ir_radio_button.text(), "IR") |
||||||
|
|
||||||
|
def test_pushButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.deselect_vendors_button_special.text(),"Deselect All") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.select_vendors_button_special.text(),"Select All") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.fetch_special_data_button.text(),"Fetch Special Report") |
||||||
|
|
||||||
|
def test_dateEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.begin_date_edit_special_month.text(),"01") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.begin_date_edit_special_year.text(),"2020") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.end_date_edit_special_month.text(),"01") |
||||||
|
self.assertEqual(fetchSpecialReportsTab_widget_ui.end_date_edit_special_year.text(),"2020") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,184 @@ |
|||||||
|
import sys |
||||||
|
import pytest |
||||||
|
from os import path |
||||||
|
from PyQt5.QtWidgets import QMainWindow |
||||||
|
from PyQt5.QtCore import QDate |
||||||
|
from PyQt5.QtGui import QStandardItemModel |
||||||
|
from ui import MainWindow |
||||||
|
from ImportFile import ImportReportController |
||||||
|
from ManageVendors import Vendor |
||||||
|
from FetchData import ALL_REPORTS, CompletionStatus |
||||||
|
import Settings |
||||||
|
import GeneralUtils |
||||||
|
import json |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='session') |
||||||
|
def qapp_args(): |
||||||
|
return sys.argv |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='session') |
||||||
|
def vendors() -> list: |
||||||
|
assert path.exists("./data/vendor_manager/vendors.dat"), \ |
||||||
|
"test vendor.dat should be placed in ./tests/data/vendor_manager/" |
||||||
|
|
||||||
|
vendor_list = [] |
||||||
|
vendors_json_string = GeneralUtils.read_json_file("./data/vendor_manager/vendors.dat") |
||||||
|
vendor_dicts = json.loads(vendors_json_string) |
||||||
|
for json_dict in vendor_dicts: |
||||||
|
vendor = Vendor.from_json(json_dict) |
||||||
|
vendor_list.append(vendor) |
||||||
|
|
||||||
|
return vendor_list |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope='session') |
||||||
|
def settings() -> Settings.SettingsModel: |
||||||
|
return Settings.SettingsModel(Settings.YEARLY_DIR, |
||||||
|
Settings.OTHER_DIR, |
||||||
|
Settings.REQUEST_INTERVAL, |
||||||
|
Settings.REQUEST_TIMEOUT, |
||||||
|
Settings.CONCURRENT_VENDORS, |
||||||
|
Settings.CONCURRENT_REPORTS, |
||||||
|
Settings.EMPTY_CELL, |
||||||
|
Settings.USER_AGENT) |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture |
||||||
|
def controller(qtbot, settings): # ImportFileController without populated vendor list |
||||||
|
window = QMainWindow() |
||||||
|
window_ui = MainWindow.Ui_mainWindow() |
||||||
|
window_ui.setupUi(window) |
||||||
|
|
||||||
|
c = ImportReportController([], settings, window_ui) |
||||||
|
yield c |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture |
||||||
|
def controller_v(qtbot, vendors, settings): # ImportFileController with populated vendor list |
||||||
|
window = QMainWindow() |
||||||
|
window_ui = MainWindow.Ui_mainWindow() |
||||||
|
window_ui.setupUi(window) |
||||||
|
|
||||||
|
c = ImportReportController(vendors, settings, window_ui) |
||||||
|
yield c |
||||||
|
|
||||||
|
|
||||||
|
def test_on_vendors_changed(controller, vendors): |
||||||
|
controller.on_vendors_changed(vendors) |
||||||
|
|
||||||
|
assert controller.selected_vendor_index == -1 |
||||||
|
assert len(controller.vendors) == len(vendors) |
||||||
|
assert controller.vendor_list_model.rowCount() == len(vendors) |
||||||
|
|
||||||
|
|
||||||
|
def test_update_vendors(controller, vendors): |
||||||
|
controller.update_vendors(vendors) |
||||||
|
|
||||||
|
assert len(controller.vendors) == len(vendors) |
||||||
|
for i in range(len(controller.vendors)): |
||||||
|
assert controller.vendors[i].name == vendors[i].name |
||||||
|
|
||||||
|
|
||||||
|
def test_update_vendors_ui(controller, vendors): |
||||||
|
controller.update_vendors(vendors) |
||||||
|
|
||||||
|
vendor_list_model = controller.vendor_list_model |
||||||
|
assert vendor_list_model.rowCount() == 0 |
||||||
|
|
||||||
|
controller.update_vendors_ui() |
||||||
|
assert vendor_list_model.rowCount() == len(controller.vendors) |
||||||
|
for i in range(len(controller.vendors)): |
||||||
|
assert vendor_list_model.item(i, 0).text() == controller.vendors[i].name |
||||||
|
|
||||||
|
|
||||||
|
def test_on_vendor_selected(controller_v, vendors, settings): |
||||||
|
index_to_select = 5 |
||||||
|
model_index = QStandardItemModel.createIndex(QStandardItemModel(), index_to_select, 0) |
||||||
|
controller_v.on_vendor_selected(model_index) |
||||||
|
|
||||||
|
assert controller_v.selected_vendor_index == index_to_select |
||||||
|
|
||||||
|
|
||||||
|
def test_on_report_type_selected(controller_v): |
||||||
|
|
||||||
|
index_to_select = 3 |
||||||
|
model_index = QStandardItemModel.createIndex(QStandardItemModel(), index_to_select, 0) |
||||||
|
controller_v.on_report_type_selected(model_index) |
||||||
|
|
||||||
|
assert controller_v.selected_report_type_index == index_to_select |
||||||
|
|
||||||
|
|
||||||
|
def test_on_date_changed(controller_v): |
||||||
|
test_date = QDate.currentDate() |
||||||
|
controller_v.on_date_changed(test_date) |
||||||
|
|
||||||
|
assert controller_v.date == test_date |
||||||
|
|
||||||
|
|
||||||
|
def test_on_import_clicked(controller_v): |
||||||
|
# No vendor selected |
||||||
|
controller_v.on_import_clicked() |
||||||
|
controller_v.selected_vendor_index = 1 |
||||||
|
|
||||||
|
# No report type selected |
||||||
|
controller_v.on_import_clicked() |
||||||
|
controller_v.selected_report_type_index = 1 |
||||||
|
|
||||||
|
vendor = controller_v.vendors[controller_v.selected_vendor_index] |
||||||
|
report_type = ALL_REPORTS[controller_v.selected_report_type_index] |
||||||
|
file_dir = f"{controller_v.settings.yearly_directory}{controller_v.date.toString('yyyy')}/{vendor.name}/" |
||||||
|
file_name = f"{controller_v.date.toString('yyyy')}_{vendor.name}_{report_type}.tsv" |
||||||
|
file_path = file_dir + file_name |
||||||
|
|
||||||
|
# No file selected |
||||||
|
controller_v.on_import_clicked() |
||||||
|
|
||||||
|
# Invalid file selected |
||||||
|
controller_v.selected_file_path = "./data/invalid_file" |
||||||
|
controller_v.on_import_clicked() |
||||||
|
|
||||||
|
# Valid file selected |
||||||
|
controller_v.selected_file_path = "./data/test_file_for_import.tsv" |
||||||
|
controller_v.on_import_clicked() |
||||||
|
assert path.isfile(file_path) |
||||||
|
|
||||||
|
|
||||||
|
def test_import_file(controller_v): |
||||||
|
controller_v.selected_vendor_index = 1 |
||||||
|
controller_v.selected_report_type_index = 1 |
||||||
|
|
||||||
|
vendor = controller_v.vendors[controller_v.selected_vendor_index] |
||||||
|
report_type = ALL_REPORTS[controller_v.selected_report_type_index] |
||||||
|
file_dir = f"{controller_v.settings.yearly_directory}{controller_v.date.toString('yyyy')}/{vendor.name}/" |
||||||
|
file_name = f"{controller_v.date.toString('yyyy')}_{vendor.name}_{report_type}.tsv" |
||||||
|
file_path = file_dir + file_name |
||||||
|
|
||||||
|
# No file selected |
||||||
|
assert controller_v.import_report(vendor, report_type).completion_status == CompletionStatus.FAILED |
||||||
|
|
||||||
|
# Invalid file selected |
||||||
|
controller_v.selected_file_path = "./data/invalid_file" |
||||||
|
assert controller_v.import_report(vendor, report_type).completion_status == CompletionStatus.FAILED |
||||||
|
|
||||||
|
# Valid file selected |
||||||
|
controller_v.selected_file_path = "./data/test_file_for_import.tsv" |
||||||
|
assert controller_v.import_report(vendor, report_type).completion_status == CompletionStatus.SUCCESSFUL |
||||||
|
assert path.isfile(file_path) |
||||||
|
|
||||||
|
|
||||||
|
def test_open_file(controller_v): |
||||||
|
# Invalid file/folder |
||||||
|
controller_v.open_explorer("./data/invalid_file") |
||||||
|
|
||||||
|
# Valid file |
||||||
|
controller_v.open_explorer("./data/test_file_for_import.tsv") |
||||||
|
|
||||||
|
# Valid folder |
||||||
|
controller_v.open_explorer("./data/") |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,35 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import ImportReportTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
importReportTab_widget = QWidget() |
||||||
|
importReportTab_widget_ui = ImportReportTab.Ui_import_report_tab() |
||||||
|
importReportTab_widget_ui.setupUi(importReportTab_widget) |
||||||
|
|
||||||
|
class ImportReportTabTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(importReportTab_widget_ui.label_17.text(),"Select Report Type") |
||||||
|
self.assertEqual(importReportTab_widget_ui.label_18.text(),"Select Vendor") |
||||||
|
self.assertEqual(importReportTab_widget_ui.label_19.text(),"Report Year") |
||||||
|
self.assertEqual(importReportTab_widget_ui.label_16.text(), "Date") |
||||||
|
self.assertEqual(importReportTab_widget_ui.label_36.text(),"Target Report File") |
||||||
|
|
||||||
|
def test_dateEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(importReportTab_widget_ui.report_year_date_edit.text(),"2000") |
||||||
|
|
||||||
|
def test_pushButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(importReportTab_widget_ui.select_file_button.text(),"Select File") |
||||||
|
self.assertEqual(importReportTab_widget_ui.import_report_button.text(),"Import Selected Report") |
||||||
|
|
||||||
|
def test_lineEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(importReportTab_widget_ui.selected_file_edit.text(),"") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,160 @@ |
|||||||
|
import sys |
||||||
|
import unittest |
||||||
|
from PyQt5.QtWidgets import QApplication, QMainWindow |
||||||
|
|
||||||
|
from ui import MainWindow |
||||||
|
app = QApplication(sys.argv) |
||||||
|
|
||||||
|
main_window = QMainWindow() |
||||||
|
main_window_ui = MainWindow.Ui_mainWindow() |
||||||
|
main_window_ui.setupUi(main_window) |
||||||
|
|
||||||
|
class MyTestCase(unittest.TestCase): |
||||||
|
|
||||||
|
def test_addVendorButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.addVendorButton.text(), "Add New Vendor") |
||||||
|
|
||||||
|
def test_edit_vendor_options_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.removeVendorButton.text(), "Remove Vendor") |
||||||
|
self.assertEqual(main_window_ui.saveVendorChangesButton.text(), "Save Changes") |
||||||
|
self.assertEqual(main_window_ui.undoVendorChangesButton.text(), "Undo Changes") |
||||||
|
|
||||||
|
def test_select_vendor_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.deselect_vendors_button_fetch.text(), "Deselect All") |
||||||
|
self.assertEqual(main_window_ui.select_vendors_button_fetch.text(), "Select All") |
||||||
|
self.assertEqual(main_window_ui.deselect_vendors_button_special.text(), "Deselect All") |
||||||
|
self.assertEqual(main_window_ui.select_vendors_button_special.text(), "Select All") |
||||||
|
|
||||||
|
def test_select_report_types_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.deselect_report_types_button_fetch.text(), "Deselect All") |
||||||
|
self.assertEqual(main_window_ui.select_report_types_button_fetch.text(), "Select All") |
||||||
|
self.assertEqual(main_window_ui.toolButton.text(), "?") |
||||||
|
|
||||||
|
def test_fetch_advanced_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.fetch_advanced_button.text(), "Fetch Selected Reports") |
||||||
|
|
||||||
|
def test_fetch_all_data_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.fetch_all_data_button.text(), "Fetch All Reports") |
||||||
|
|
||||||
|
def test_fetch_speical_data_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.fetch_special_data_button.text(), "Fetch Special Report") |
||||||
|
|
||||||
|
def test_select_file_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.select_file_button.text(), "Select File") |
||||||
|
self.assertEqual(main_window_ui.import_file_button.text(), "Import Selected File") |
||||||
|
|
||||||
|
def test_search_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.search_button.text(), "Search") |
||||||
|
|
||||||
|
def test_setting_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.concurrent_reports_help_button.text(), "?") |
||||||
|
self.assertEqual(main_window_ui.concurrent_vendors_help_button.text(), "?") |
||||||
|
self.assertEqual(main_window_ui.empty_cell_help_button.text(), "?") |
||||||
|
self.assertEqual(main_window_ui.other_directory_button.text(), "Choose Folder...") |
||||||
|
self.assertEqual(main_window_ui.other_directory_help_button.text(), "?") |
||||||
|
self.assertEqual(main_window_ui.request_interval_help_button.text(), "?") |
||||||
|
self.assertEqual(main_window_ui.request_timeout_help_button.text(), "?") |
||||||
|
self.assertEqual(main_window_ui.yearly_directory_button.text(), "Choose Folder...") |
||||||
|
self.assertEqual(main_window_ui.yearly_directory_help_button.text(), "?") |
||||||
|
|
||||||
|
def test_setting_spin_box(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.concurrent_reports_spin_box.value(),0) |
||||||
|
self.assertEqual(main_window_ui.concurrent_vendors_spin_box.value(), 0) |
||||||
|
self.assertEqual(main_window_ui.request_interval_spin_box.value(), 0) |
||||||
|
self.assertEqual(main_window_ui.request_timeout_spin_box.value(), 0) |
||||||
|
|
||||||
|
def test_date_edit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.begin_date_edit_fetch.text(), "2020-01") |
||||||
|
self.assertEqual(main_window_ui.end_date_edit_fetch.text(), "2020-01") |
||||||
|
self.assertEqual(main_window_ui.All_reports_edit_fetch.text(), "2020") |
||||||
|
self.assertEqual(main_window_ui.begin_date_edit_special.text(), "2000-01") |
||||||
|
self.assertEqual(main_window_ui.end_date_edit_special.text(), "2000-01") |
||||||
|
self.assertEqual(main_window_ui.report_year_date_edit.text(), "2000") |
||||||
|
|
||||||
|
def test_radio_button(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.dr_radio_button.isChecked(), False) |
||||||
|
self.assertEqual(main_window_ui.ir_radio_button.isChecked(), False) |
||||||
|
self.assertEqual(main_window_ui.tr_radio_button.isChecked(), False) |
||||||
|
self.assertEqual(main_window_ui.pr_radio_button.isChecked(), True) |
||||||
|
|
||||||
|
def test_label(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.label.text(), "Name") |
||||||
|
self.assertEqual(main_window_ui.label_2.text(), "Customer ID") |
||||||
|
self.assertEqual(main_window_ui.label_3.text(), "Base URL") |
||||||
|
self.assertEqual(main_window_ui.label_4.text(), "Requestor ID") |
||||||
|
self.assertEqual(main_window_ui.label_5.text(), "API Key") |
||||||
|
self.assertEqual(main_window_ui.label_6.text(), "Platform") |
||||||
|
self.assertEqual(main_window_ui.label_7.text(), "Edit Vendor") |
||||||
|
|
||||||
|
self.assertEqual(main_window_ui.label_9.text(), "Begin Date") |
||||||
|
self.assertEqual(main_window_ui.label_10.text(), "End Date") |
||||||
|
self.assertEqual(main_window_ui.label_11.text(), "Select Vendors") |
||||||
|
self.assertEqual(main_window_ui.label_12.text(), "Select Report Types") |
||||||
|
self.assertEqual(main_window_ui.label_13.text(), "Select Vendor") |
||||||
|
self.assertEqual(main_window_ui.label_14.text(), "Search Keyword(s)") |
||||||
|
self.assertEqual(main_window_ui.label_15.text(), "Search Results") |
||||||
|
self.assertEqual(main_window_ui.label_16.text(), "Search by:") |
||||||
|
self.assertEqual(main_window_ui.label_17.text(), "Select Report Type") |
||||||
|
self.assertEqual(main_window_ui.label_18.text(), "Select Vendor") |
||||||
|
self.assertEqual(main_window_ui.label_19.text(), "Report Year") |
||||||
|
self.assertEqual(main_window_ui.label_20.text(), "Select Report Type") |
||||||
|
self.assertEqual(main_window_ui.label_21.text(), "Select Vendors") |
||||||
|
self.assertEqual(main_window_ui.label_22.text(), "Begin Date") |
||||||
|
self.assertEqual(main_window_ui.label_23.text(), "End Date") |
||||||
|
self.assertEqual(main_window_ui.label_24.text(), "Reports") |
||||||
|
self.assertEqual(main_window_ui.label_25.text(), "Yearly Reports Directory") |
||||||
|
self.assertEqual(main_window_ui.label_26.text(), "Search") |
||||||
|
|
||||||
|
self.assertEqual(main_window_ui.label_28.text(), "Description") |
||||||
|
self.assertEqual(main_window_ui.label_29.text(), "Other Reports Directory") |
||||||
|
self.assertEqual(main_window_ui.label_30.text(), "Report Request Interval") |
||||||
|
self.assertEqual(main_window_ui.label_31.text(), "Concurrent Vendors") |
||||||
|
self.assertEqual(main_window_ui.label_32.text(), "Concurrent Reports") |
||||||
|
self.assertEqual(main_window_ui.label_33.text(), "Empty Cell") |
||||||
|
self.assertEqual(main_window_ui.label_34.text(), "Year") |
||||||
|
self.assertEqual(main_window_ui.label_35.text(), "Fetch All Reports") |
||||||
|
|
||||||
|
self.assertEqual(main_window_ui.label_37.text(), "Request Timeout") |
||||||
|
self.assertEqual(main_window_ui.label_39.text(), "Local Only Vendor") |
||||||
|
|
||||||
|
self.assertEqual(main_window_ui.Adv_Fetch_text.text(), "Advanced Fetch Reports") |
||||||
|
self.assertEqual(main_window_ui.selected_file_label.text(), "None") |
||||||
|
|
||||||
|
def test_check_box(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.local_only_check_box.checkState(), False) |
||||||
|
self.assertEqual(main_window_ui.isbn_checkbox.checkState(), False) |
||||||
|
self.assertEqual(main_window_ui.issn_checkbox.checkState(), False) |
||||||
|
self.assertEqual(main_window_ui.title_checkbox.checkState(), False) |
||||||
|
|
||||||
|
def test_line_edit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(main_window_ui.apiKeyEdit.text(),"") |
||||||
|
self.assertEqual(main_window_ui.baseUrlEdit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.customerIdEdit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.descriptionEdit.toPlainText(), "") |
||||||
|
self.assertEqual(main_window_ui.nameEdit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.platformEdit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.requestorIdEdit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.search_term_edit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.other_directory_edit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.yearly_directory_edit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.empty_cell_edit.text(), "") |
||||||
|
self.assertEqual(main_window_ui.save_location_edit_fetch_2.text(), "[In Development]") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,53 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import ManageVendorsTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
manageVendorsTab_widget = QWidget() |
||||||
|
manageVendorsTab_widget_ui = ManageVendorsTab.Ui_manage_vendors_tab() |
||||||
|
manageVendorsTab_widget_ui.setupUi(manageVendorsTab_widget) |
||||||
|
|
||||||
|
class ManageVendorsTabTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_13.text(),"Select Vendor") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.companiesText.text(),"External Companies") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label.text(),"Name") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_2.text(),"Customer ID") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_28.text(), "Description") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_3.text(),"Base URL") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_39.text(), "Local Only Vendor") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_4.text(),"Requestor ID") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_5.text(), "API Key") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.label_6.text(), "Platform") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.name_validation_label.text(),"Validation label") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.url_validation_label.text(),"Validation label") |
||||||
|
|
||||||
|
def test_pushButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.addVendorButton.text(),"Add New Vendor") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.exportVendorsButton.text(),"Export Vendors") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.importVendorsButton.text(),"Import Vendors") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.removeVendorButton.text(), "Remove Vendor") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.saveVendorChangesButton.text(), "Save Changes") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.undoVendorChangesButton.text(), "Undo Changes") |
||||||
|
|
||||||
|
def test_lineEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.apiKeyEdit.text(),"") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.baseUrlEdit.text(), "") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.companiesEdit.toPlainText(), "") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.customerIdEdit.text(), "") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.descriptionEdit.toPlainText(), "") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.nameEdit.text(), "") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.platformEdit.text(), "") |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.requestorIdEdit.text(), "") |
||||||
|
|
||||||
|
def test_checkBox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(manageVendorsTab_widget_ui.local_only_check_box.isChecked(),False) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,22 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QDialog |
||||||
|
|
||||||
|
from ui import MessageDialog |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
message_dialog = QDialog() |
||||||
|
message_dialog_ui = MessageDialog.Ui_message_dialog() |
||||||
|
message_dialog_ui.setupUi(message_dialog) |
||||||
|
|
||||||
|
class MessageDialogTest(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(message_dialog_ui.message_label.text(),"Message!") |
||||||
|
|
||||||
|
def test_button(self): |
||||||
|
okWidget = message_dialog_ui.buttonBox.Ok |
||||||
|
self.assertIsNotNone(okWidget) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,23 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QDialog |
||||||
|
|
||||||
|
from ui import RemoveVendorDialog |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
remove_vendor_dialog = QDialog() |
||||||
|
remove_vendor_dialog_ui = RemoveVendorDialog.Ui_dialog_remove() |
||||||
|
remove_vendor_dialog_ui.setupUi(remove_vendor_dialog) |
||||||
|
|
||||||
|
class RemoveVendorDialogTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(remove_vendor_dialog_ui.label.text(), |
||||||
|
"Are you sure you want to remove this vendor?") |
||||||
|
|
||||||
|
def test_button(self): |
||||||
|
okWidget = remove_vendor_dialog_ui.buttonBox.Ok |
||||||
|
self.assertIsNotNone(okWidget) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,28 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import ReportResultWidget |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
report_result_widget = QWidget() |
||||||
|
report_result_ui = ReportResultWidget.Ui_ReportResultWidget() |
||||||
|
report_result_ui.setupUi(report_result_widget) |
||||||
|
|
||||||
|
class ReportResultWidgetTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(report_result_ui.file_label.text(),"Saved as: Bleh.tsv") |
||||||
|
self.assertEqual(report_result_ui.message_label.text(),"No exception messages") |
||||||
|
self.assertEqual(report_result_ui.label_6.text(),"Retry") |
||||||
|
self.assertEqual(report_result_ui.success_label.text(),"Failed!") |
||||||
|
self.assertEqual(report_result_ui.report_type_label.text(),"TR_J1") |
||||||
|
|
||||||
|
def test_button(self): |
||||||
|
self.assertEqual(report_result_ui.folder_button.text(),"") |
||||||
|
|
||||||
|
def test_checkBox(self): |
||||||
|
self.assertEqual(report_result_ui.retry_check_box.checkState(),False) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,26 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QDialog |
||||||
|
|
||||||
|
from ui import ReportTypeDialog |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
report_type_dialog = QDialog() |
||||||
|
report_type_dialog_ui = ReportTypeDialog.Ui_report_type_dialog() |
||||||
|
report_type_dialog_ui.setupUi(report_type_dialog) |
||||||
|
|
||||||
|
class ReportTypeDialogTests(unittest.TestCase): |
||||||
|
def test_comboBox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(report_type_dialog_ui.report_type_combobox.isEditable(),False) |
||||||
|
self.assertEqual(report_type_dialog_ui.report_type_combobox.currentText(),"") |
||||||
|
|
||||||
|
def test_buttonBox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
okWidget = report_type_dialog_ui.buttonBox.Ok |
||||||
|
self.assertIsNotNone(okWidget) |
||||||
|
cancelWidget = report_type_dialog_ui.buttonBox.Cancel |
||||||
|
self.assertIsNotNone(cancelWidget) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,19 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QFrame |
||||||
|
|
||||||
|
from ui import SearchAndFrame |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
|
||||||
|
search_and_clause_frame = QFrame() |
||||||
|
search_and_clause_frame_ui = SearchAndFrame.Ui_search_and_clause_parameter_frame() |
||||||
|
search_and_clause_frame_ui.setupUi(search_and_clause_frame) |
||||||
|
|
||||||
|
class SearchAndClauseFrameTests(unittest.TestCase): |
||||||
|
def test_button(self): |
||||||
|
self.assertEqual(search_and_clause_frame_ui.search_add_or_clause_button.text(),"Add \"Or\" Clause") |
||||||
|
self.assertEqual(search_and_clause_frame_ui.search_remove_and_clause_button.text(),"Remove \"And\" Clause") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,26 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QFrame |
||||||
|
|
||||||
|
from ui import SearchOrFrame |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
|
||||||
|
search_or_clause_frame = QFrame() |
||||||
|
search_or_clause_frame_ui = SearchOrFrame.Ui_search_or_clause_parameter_frame() |
||||||
|
search_or_clause_frame_ui.setupUi(search_or_clause_frame) |
||||||
|
|
||||||
|
class SearchOrClauseFrameTests(unittest.TestCase): |
||||||
|
def test_button(self): |
||||||
|
self.assertEqual(search_or_clause_frame_ui.search_remove_or_clause_button.text(),"Remove \"Or\" Clause") |
||||||
|
|
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(search_or_clause_frame_ui.search_value_parameter_lineedit.text(), "") |
||||||
|
|
||||||
|
def test_combo_box(self): |
||||||
|
self.assertEqual(search_or_clause_frame_ui.search_comparison_parameter_combobox.currentText(),"") |
||||||
|
self.assertEqual(search_or_clause_frame_ui.search_field_parameter_combobox.currentText(),"") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,44 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import SearchTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
searchTab_widget = QWidget() |
||||||
|
searchTab_widget_ui = SearchTab.Ui_search_tab() |
||||||
|
searchTab_widget_ui.setupUi(searchTab_widget) |
||||||
|
|
||||||
|
class SearchTabTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(searchTab_widget_ui.search_end_year_parameter_label.text(),"End year") |
||||||
|
|
||||||
|
def test_radioButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(searchTab_widget_ui.dont_open_radioButton.text(),"Don't Open") |
||||||
|
self.assertEqual(searchTab_widget_ui.open_both_radioButton.text(), "Open Both") |
||||||
|
self.assertEqual(searchTab_widget_ui.open_file_radioButton.text(), "Open File") |
||||||
|
self.assertEqual(searchTab_widget_ui.open_folder_radioButton.text(), "Open Folder") |
||||||
|
self.assertEqual(searchTab_widget_ui.search_report_parameter_label.text(),"Report") |
||||||
|
self.assertEqual(searchTab_widget_ui.search_start_year_parameter_label.text(),"Start Year") |
||||||
|
|
||||||
|
def test_pushButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(searchTab_widget_ui.search_button.text(),"Search") |
||||||
|
self.assertEqual(searchTab_widget_ui.search_export_button.text(),"Export Search") |
||||||
|
self.assertEqual(searchTab_widget_ui.search_import_button.text(),"Import Search") |
||||||
|
self.assertEqual(searchTab_widget_ui.search_add_and_button.text(),"Add \"And\" Clause") |
||||||
|
|
||||||
|
def test_dateEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(searchTab_widget_ui.search_end_year_parameter_dateedit.text(),"2000") |
||||||
|
self.assertEqual(searchTab_widget_ui.search_start_year_parameter_dateedit.text(),"2000") |
||||||
|
|
||||||
|
def test_comboBox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(searchTab_widget_ui.search_report_parameter_combobox.isEditable(), False) |
||||||
|
self.assertEqual(searchTab_widget_ui.search_report_parameter_combobox.currentText(), "") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,56 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import SettingsTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
settingsTab_widget = QWidget() |
||||||
|
settingsTab_widget_ui = SettingsTab.Ui_settings_tab() |
||||||
|
settingsTab_widget_ui.setupUi(settingsTab_widget) |
||||||
|
|
||||||
|
class SettingsTabTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_25.text(), "Yearly Reports Directory") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_29.text(),"Other Reports Directory") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_30.text(), "Report Request Interval") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_31.text(), "Concurrent Vendors") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_32.text(), "Concurrent Reports") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_33.text(), "Empty Cell") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_37.text(), "Request Timeout") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_73.text(), "User Agent") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_24.text(),"Reports") |
||||||
|
self.assertEqual(settingsTab_widget_ui.label_26.text(),"Search") |
||||||
|
|
||||||
|
def test_pushButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(settingsTab_widget_ui.save_button.text(),"Save Changes") |
||||||
|
self.assertEqual(settingsTab_widget_ui.concurrent_reports_help_button.text(),"?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.concurrent_vendors_help_button.text(), "?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.empty_cell_help_button.text(), "?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.other_directory_help_button.text(), "?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.request_interval_help_button.text(), "?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.request_timeout_help_button.text(), "?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.other_directory_button.text(),"Choose") |
||||||
|
self.assertEqual(settingsTab_widget_ui.yearly_directory_button.text(), "Choose") |
||||||
|
self.assertEqual(settingsTab_widget_ui.user_agent_help_button.text(), "?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.yearly_directory_help_button.text(), "?") |
||||||
|
self.assertEqual(settingsTab_widget_ui.settings_restore_database_button.text(),"Restore Database") |
||||||
|
|
||||||
|
def test_spinBox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(settingsTab_widget_ui.concurrent_reports_spin_box.value(),0) |
||||||
|
self.assertEqual(settingsTab_widget_ui.concurrent_vendors_spin_box.value(), 0) |
||||||
|
self.assertEqual(settingsTab_widget_ui.request_interval_spin_box.value(), 0) |
||||||
|
self.assertEqual(settingsTab_widget_ui.request_timeout_spin_box.value(), 0) |
||||||
|
|
||||||
|
def test_lineEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(settingsTab_widget_ui.empty_cell_edit.text(),"") |
||||||
|
self.assertEqual(settingsTab_widget_ui.other_directory_edit.text(),"") |
||||||
|
self.assertEqual(settingsTab_widget_ui.user_agent_edit.text(),"") |
||||||
|
self.assertEqual(settingsTab_widget_ui.yearly_directory_edit.text(),"") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,30 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QDialog |
||||||
|
|
||||||
|
from ui import UpdateDatabaseProgressDialog |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
update_database_progress_dialog = QDialog() |
||||||
|
update_database_progress_dialog_ui = UpdateDatabaseProgressDialog.Ui_restore_database_dialog() |
||||||
|
update_database_progress_dialog_ui.setupUi(update_database_progress_dialog) |
||||||
|
|
||||||
|
class UpdateDatabaseProgressDialogTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(update_database_progress_dialog_ui.status_label.text(),"Status") |
||||||
|
|
||||||
|
def test_buttonBox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
okWidget = update_database_progress_dialog_ui.buttonBox.Ok |
||||||
|
self.assertIsNotNone(okWidget) |
||||||
|
cancelWidget = update_database_progress_dialog_ui.buttonBox.Cancel |
||||||
|
self.assertIsNotNone(cancelWidget) |
||||||
|
|
||||||
|
def test_progressBar(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(update_database_progress_dialog_ui.progressbar.text(),"0%") |
||||||
|
self.assertEqual(update_database_progress_dialog_ui.progressbar.value(), 0) |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,24 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import VendorResultsWidget |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
vendor_results_widget = QWidget() |
||||||
|
vendor_results_ui = VendorResultsWidget.Ui_VendorResultsWidget() |
||||||
|
vendor_results_ui.setupUi(vendor_results_widget) |
||||||
|
|
||||||
|
class VendorResultsWidgetTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(vendor_results_ui.status_label.text(),"Success") |
||||||
|
self.assertEqual(vendor_results_ui.vendor_label.text(),"Bioone") |
||||||
|
|
||||||
|
|
||||||
|
def test_button(self): |
||||||
|
self.assertEqual(vendor_results_ui.collapse_button.text(), "Collapse") |
||||||
|
self.assertEqual(vendor_results_ui.expand_button.text(), "Expand") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,65 @@ |
|||||||
|
import unittest |
||||||
|
import sys |
||||||
|
from PyQt5.QtWidgets import QApplication, QWidget |
||||||
|
|
||||||
|
from ui import VisualTab |
||||||
|
|
||||||
|
app = QApplication(sys.argv) |
||||||
|
visualTab_widget = QWidget() |
||||||
|
visualTab_widget_ui = VisualTab.Ui_visual_tab() |
||||||
|
visualTab_widget_ui.setupUi(visualTab_widget) |
||||||
|
|
||||||
|
class VisualTabTests(unittest.TestCase): |
||||||
|
def test_defaults(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(visualTab_widget_ui.label_46.text(), "IMPORTANT") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_47.text(), "Name must correspond to Report:") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_48.text(), "Examples : Report is PR, Name must be a Platform") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_49.text(), "Report is DR, Name must be a Database") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_50.text(), "Report is TR, Name must be a Title") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_45.text(), "Select Chart Type") |
||||||
|
self.assertEqual(visualTab_widget_ui.label.text(), "Create Chart") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_14.text(), "Metric Type * :") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_15.text(), "Required fields*") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_8.text(), "Name * :") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_16.text(), "File Name") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_36.text(), "Chart Title") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_42.text(), "Customize Chart") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_43.text(), "Horizontal Axis Title") |
||||||
|
self.assertEqual(visualTab_widget_ui.label_44.text(), "Vertical Axis Title") |
||||||
|
self.assertEqual(visualTab_widget_ui.search_end_year_parameter_label_2.text(), "End year") |
||||||
|
self.assertEqual(visualTab_widget_ui.search_report_parameter_label_2.text(), "Report") |
||||||
|
self.assertEqual(visualTab_widget_ui.search_start_year_parameter_label_2.text(),"Start Year") |
||||||
|
|
||||||
|
def test_combobox(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(visualTab_widget_ui.metric_Type_comboBox.isEditable(),False) |
||||||
|
self.assertEqual(visualTab_widget_ui.metric_Type_comboBox.currentText(),"") |
||||||
|
self.assertEqual(visualTab_widget_ui.search_report_parameter_combobox_2.isEditable(), False) |
||||||
|
self.assertEqual(visualTab_widget_ui.search_report_parameter_combobox_2.currentText(), "") |
||||||
|
|
||||||
|
def test_radioButrton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(visualTab_widget_ui.radioButton.text(),"Horizontal Bar") |
||||||
|
self.assertEqual(visualTab_widget_ui.radioButton_3.text(), "Vertical Bar") |
||||||
|
self.assertEqual(visualTab_widget_ui.radioButton_4.text(), "Line") |
||||||
|
|
||||||
|
def test_lineEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(visualTab_widget_ui.name_lineEdit.text(),"") |
||||||
|
self.assertEqual(visualTab_widget_ui.chart_title_lineEdit.text(), "") |
||||||
|
self.assertEqual(visualTab_widget_ui.file_name_lineEdit.text(), "") |
||||||
|
self.assertEqual(visualTab_widget_ui.horizontal_axis_lineEdit.text(), "") |
||||||
|
self.assertEqual(visualTab_widget_ui.vertical_axis_lineEdit.text(), "") |
||||||
|
|
||||||
|
def test_pushButton(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(visualTab_widget_ui.create_chart_button.text(),"Create Chart") |
||||||
|
|
||||||
|
def test_dateEdit(self): |
||||||
|
'''Test the defaults''' |
||||||
|
self.assertEqual(visualTab_widget_ui.search_end_year_parameter_dateedit_2.text(),"2000") |
||||||
|
self.assertEqual(visualTab_widget_ui.search_start_year_parameter_dateedit_2.text(),"2000") |
||||||
|
|
||||||
|
if __name__ == '__main__': |
||||||
|
unittest.main() |
@ -0,0 +1,146 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'AddVendorDialog.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.12.3 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_addVendorDialog(object): |
||||||
|
def setupUi(self, addVendorDialog): |
||||||
|
addVendorDialog.setObjectName("addVendorDialog") |
||||||
|
addVendorDialog.resize(600, 620) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setPointSize(11) |
||||||
|
addVendorDialog.setFont(font) |
||||||
|
self.gridLayout = QtWidgets.QGridLayout(addVendorDialog) |
||||||
|
self.gridLayout.setObjectName("gridLayout") |
||||||
|
self.buttonBox = QtWidgets.QDialogButtonBox(addVendorDialog) |
||||||
|
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) |
||||||
|
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) |
||||||
|
self.buttonBox.setObjectName("buttonBox") |
||||||
|
self.gridLayout.addWidget(self.buttonBox, 1, 0, 1, 1) |
||||||
|
self.frame = QtWidgets.QFrame(addVendorDialog) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.gridLayout_2 = QtWidgets.QGridLayout(self.frame) |
||||||
|
self.gridLayout_2.setSpacing(20) |
||||||
|
self.gridLayout_2.setObjectName("gridLayout_2") |
||||||
|
self.label_7 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_7.setObjectName("label_7") |
||||||
|
self.gridLayout_2.addWidget(self.label_7, 9, 0, 1, 1, QtCore.Qt.AlignTop) |
||||||
|
self.label_3 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_3.setObjectName("label_3") |
||||||
|
self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1) |
||||||
|
self.label_5 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_5.setObjectName("label_5") |
||||||
|
self.gridLayout_2.addWidget(self.label_5, 6, 0, 1, 1) |
||||||
|
self.companiesEdit = QtWidgets.QPlainTextEdit(self.frame) |
||||||
|
self.companiesEdit.setObjectName("companiesEdit") |
||||||
|
self.gridLayout_2.addWidget(self.companiesEdit, 10, 1, 1, 1) |
||||||
|
self.name_validation_label = QtWidgets.QLabel(self.frame) |
||||||
|
self.name_validation_label.setObjectName("name_validation_label") |
||||||
|
self.gridLayout_2.addWidget(self.name_validation_label, 1, 1, 1, 1) |
||||||
|
self.label_6 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_6.setObjectName("label_6") |
||||||
|
self.gridLayout_2.addWidget(self.label_6, 7, 0, 1, 1) |
||||||
|
self.frame_2 = QtWidgets.QFrame(self.frame) |
||||||
|
self.frame_2.setObjectName("frame_2") |
||||||
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_2) |
||||||
|
self.horizontalLayout.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout.setObjectName("horizontalLayout") |
||||||
|
self.non_Sushi_check_box = QtWidgets.QCheckBox(self.frame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.non_Sushi_check_box.sizePolicy().hasHeightForWidth()) |
||||||
|
self.non_Sushi_check_box.setSizePolicy(sizePolicy) |
||||||
|
self.non_Sushi_check_box.setText("") |
||||||
|
self.non_Sushi_check_box.setObjectName("non_Sushi_check_box") |
||||||
|
self.horizontalLayout.addWidget(self.non_Sushi_check_box) |
||||||
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) |
||||||
|
self.horizontalLayout.addItem(spacerItem) |
||||||
|
self.non_sushi_help_button = QtWidgets.QPushButton(self.frame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.non_sushi_help_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.non_sushi_help_button.setSizePolicy(sizePolicy) |
||||||
|
self.non_sushi_help_button.setText("") |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/help_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.non_sushi_help_button.setIcon(icon) |
||||||
|
self.non_sushi_help_button.setObjectName("non_sushi_help_button") |
||||||
|
self.horizontalLayout.addWidget(self.non_sushi_help_button) |
||||||
|
self.gridLayout_2.addWidget(self.frame_2, 8, 1, 1, 1) |
||||||
|
self.label_8 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_8.setObjectName("label_8") |
||||||
|
self.gridLayout_2.addWidget(self.label_8, 8, 0, 1, 1) |
||||||
|
self.label_2 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_2.setObjectName("label_2") |
||||||
|
self.gridLayout_2.addWidget(self.label_2, 4, 0, 1, 1) |
||||||
|
self.requestorIdEdit = QtWidgets.QLineEdit(self.frame) |
||||||
|
self.requestorIdEdit.setObjectName("requestorIdEdit") |
||||||
|
self.gridLayout_2.addWidget(self.requestorIdEdit, 5, 1, 1, 1) |
||||||
|
self.customerIdEdit = QtWidgets.QLineEdit(self.frame) |
||||||
|
self.customerIdEdit.setObjectName("customerIdEdit") |
||||||
|
self.gridLayout_2.addWidget(self.customerIdEdit, 4, 1, 1, 1) |
||||||
|
self.nameEdit = QtWidgets.QLineEdit(self.frame) |
||||||
|
self.nameEdit.setObjectName("nameEdit") |
||||||
|
self.gridLayout_2.addWidget(self.nameEdit, 0, 1, 1, 1) |
||||||
|
self.label_9 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_9.setObjectName("label_9") |
||||||
|
self.gridLayout_2.addWidget(self.label_9, 10, 0, 1, 1, QtCore.Qt.AlignTop) |
||||||
|
self.url_validation_label = QtWidgets.QLabel(self.frame) |
||||||
|
self.url_validation_label.setObjectName("url_validation_label") |
||||||
|
self.gridLayout_2.addWidget(self.url_validation_label, 3, 1, 1, 1) |
||||||
|
self.baseUrlEdit = QtWidgets.QLineEdit(self.frame) |
||||||
|
self.baseUrlEdit.setObjectName("baseUrlEdit") |
||||||
|
self.gridLayout_2.addWidget(self.baseUrlEdit, 2, 1, 1, 1) |
||||||
|
self.apiKeyEdit = QtWidgets.QLineEdit(self.frame) |
||||||
|
self.apiKeyEdit.setObjectName("apiKeyEdit") |
||||||
|
self.gridLayout_2.addWidget(self.apiKeyEdit, 6, 1, 1, 1) |
||||||
|
self.descriptionEdit = QtWidgets.QPlainTextEdit(self.frame) |
||||||
|
self.descriptionEdit.setObjectName("descriptionEdit") |
||||||
|
self.gridLayout_2.addWidget(self.descriptionEdit, 9, 1, 1, 1) |
||||||
|
self.label = QtWidgets.QLabel(self.frame) |
||||||
|
self.label.setObjectName("label") |
||||||
|
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) |
||||||
|
self.platformEdit = QtWidgets.QLineEdit(self.frame) |
||||||
|
self.platformEdit.setObjectName("platformEdit") |
||||||
|
self.gridLayout_2.addWidget(self.platformEdit, 7, 1, 1, 1) |
||||||
|
self.label_4 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_4.setObjectName("label_4") |
||||||
|
self.gridLayout_2.addWidget(self.label_4, 5, 0, 1, 1) |
||||||
|
self.gridLayout.addWidget(self.frame, 0, 0, 1, 1) |
||||||
|
|
||||||
|
self.retranslateUi(addVendorDialog) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(addVendorDialog) |
||||||
|
addVendorDialog.setTabOrder(self.nameEdit, self.baseUrlEdit) |
||||||
|
addVendorDialog.setTabOrder(self.baseUrlEdit, self.customerIdEdit) |
||||||
|
addVendorDialog.setTabOrder(self.customerIdEdit, self.requestorIdEdit) |
||||||
|
addVendorDialog.setTabOrder(self.requestorIdEdit, self.apiKeyEdit) |
||||||
|
addVendorDialog.setTabOrder(self.apiKeyEdit, self.platformEdit) |
||||||
|
addVendorDialog.setTabOrder(self.platformEdit, self.non_Sushi_check_box) |
||||||
|
addVendorDialog.setTabOrder(self.non_Sushi_check_box, self.non_sushi_help_button) |
||||||
|
addVendorDialog.setTabOrder(self.non_sushi_help_button, self.descriptionEdit) |
||||||
|
addVendorDialog.setTabOrder(self.descriptionEdit, self.companiesEdit) |
||||||
|
|
||||||
|
def retranslateUi(self, addVendorDialog): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
addVendorDialog.setWindowTitle(_translate("addVendorDialog", "Add Vendor")) |
||||||
|
self.label_7.setText(_translate("addVendorDialog", "Description")) |
||||||
|
self.label_3.setText(_translate("addVendorDialog", "Base URL")) |
||||||
|
self.label_5.setText(_translate("addVendorDialog", "API Key")) |
||||||
|
self.name_validation_label.setText(_translate("addVendorDialog", "Validation label")) |
||||||
|
self.label_6.setText(_translate("addVendorDialog", "Platform")) |
||||||
|
self.label_8.setText(_translate("addVendorDialog", "Non-SUSHI Vendor")) |
||||||
|
self.label_2.setText(_translate("addVendorDialog", "Customer ID")) |
||||||
|
self.label_9.setText(_translate("addVendorDialog", "Third party provider")) |
||||||
|
self.url_validation_label.setText(_translate("addVendorDialog", "Validation label")) |
||||||
|
self.label.setText(_translate("addVendorDialog", "Name")) |
||||||
|
self.label_4.setText(_translate("addVendorDialog", "Requestor ID")) |
||||||
|
import Resources_rc |
@ -0,0 +1,221 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>addVendorDialog</class> |
||||||
|
<widget class="QDialog" name="addVendorDialog"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>600</width> |
||||||
|
<height>620</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Add Vendor</string> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout"> |
||||||
|
<item row="1" column="0"> |
||||||
|
<widget class="QDialogButtonBox" name="buttonBox"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="standardButtons"> |
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<layout class="QGridLayout" name="gridLayout_2"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>20</number> |
||||||
|
</property> |
||||||
|
<item row="9" column="0" alignment="Qt::AlignTop"> |
||||||
|
<widget class="QLabel" name="label_7"> |
||||||
|
<property name="text"> |
||||||
|
<string>Description</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="0"> |
||||||
|
<widget class="QLabel" name="label_3"> |
||||||
|
<property name="text"> |
||||||
|
<string>Base URL</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="6" column="0"> |
||||||
|
<widget class="QLabel" name="label_5"> |
||||||
|
<property name="text"> |
||||||
|
<string>API Key</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="10" column="1"> |
||||||
|
<widget class="QPlainTextEdit" name="companiesEdit"/> |
||||||
|
</item> |
||||||
|
<item row="1" column="1"> |
||||||
|
<widget class="QLabel" name="name_validation_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Validation label</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="7" column="0"> |
||||||
|
<widget class="QLabel" name="label_6"> |
||||||
|
<property name="text"> |
||||||
|
<string>Platform</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="8" column="1"> |
||||||
|
<widget class="QFrame" name="frame_2"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QCheckBox" name="non_Sushi_check_box"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<spacer name="horizontalSpacer"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>40</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="non_sushi_help_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="8" column="0"> |
||||||
|
<widget class="QLabel" name="label_8"> |
||||||
|
<property name="text"> |
||||||
|
<string>Non-SUSHI Vendor</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="4" column="0"> |
||||||
|
<widget class="QLabel" name="label_2"> |
||||||
|
<property name="text"> |
||||||
|
<string>Customer ID</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="5" column="1"> |
||||||
|
<widget class="QLineEdit" name="requestorIdEdit"/> |
||||||
|
</item> |
||||||
|
<item row="4" column="1"> |
||||||
|
<widget class="QLineEdit" name="customerIdEdit"/> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QLineEdit" name="nameEdit"/> |
||||||
|
</item> |
||||||
|
<item row="10" column="0" alignment="Qt::AlignTop"> |
||||||
|
<widget class="QLabel" name="label_9"> |
||||||
|
<property name="text"> |
||||||
|
<string>Third party provider</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="1"> |
||||||
|
<widget class="QLabel" name="url_validation_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Validation label</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="1"> |
||||||
|
<widget class="QLineEdit" name="baseUrlEdit"/> |
||||||
|
</item> |
||||||
|
<item row="6" column="1"> |
||||||
|
<widget class="QLineEdit" name="apiKeyEdit"/> |
||||||
|
</item> |
||||||
|
<item row="9" column="1"> |
||||||
|
<widget class="QPlainTextEdit" name="descriptionEdit"/> |
||||||
|
</item> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QLabel" name="label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Name</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="7" column="1"> |
||||||
|
<widget class="QLineEdit" name="platformEdit"/> |
||||||
|
</item> |
||||||
|
<item row="5" column="0"> |
||||||
|
<widget class="QLabel" name="label_4"> |
||||||
|
<property name="text"> |
||||||
|
<string>Requestor ID</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<tabstops> |
||||||
|
<tabstop>nameEdit</tabstop> |
||||||
|
<tabstop>baseUrlEdit</tabstop> |
||||||
|
<tabstop>customerIdEdit</tabstop> |
||||||
|
<tabstop>requestorIdEdit</tabstop> |
||||||
|
<tabstop>apiKeyEdit</tabstop> |
||||||
|
<tabstop>platformEdit</tabstop> |
||||||
|
<tabstop>non_Sushi_check_box</tabstop> |
||||||
|
<tabstop>non_sushi_help_button</tabstop> |
||||||
|
<tabstop>descriptionEdit</tabstop> |
||||||
|
<tabstop>companiesEdit</tabstop> |
||||||
|
</tabstops> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,158 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'CostsTab.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.14.1 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_costs_tab(object): |
||||||
|
def setupUi(self, costs_tab): |
||||||
|
costs_tab.setObjectName("costs_tab") |
||||||
|
costs_tab.resize(898, 671) |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/tab_icons/costs_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
costs_tab.setWindowIcon(icon) |
||||||
|
self.horizontalLayout = QtWidgets.QHBoxLayout(costs_tab) |
||||||
|
self.horizontalLayout.setObjectName("horizontalLayout") |
||||||
|
spacerItem = QtWidgets.QSpacerItem(120, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) |
||||||
|
self.horizontalLayout.addItem(spacerItem) |
||||||
|
self.frame = QtWidgets.QFrame(costs_tab) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame) |
||||||
|
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.verticalLayout_2.setObjectName("verticalLayout_2") |
||||||
|
self.costs_parameters_frame = QtWidgets.QFrame(self.frame) |
||||||
|
self.costs_parameters_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.costs_parameters_frame.setObjectName("costs_parameters_frame") |
||||||
|
self.formLayout_3 = QtWidgets.QFormLayout(self.costs_parameters_frame) |
||||||
|
self.formLayout_3.setObjectName("formLayout_3") |
||||||
|
self.costs_report_parameter_label = QtWidgets.QLabel(self.costs_parameters_frame) |
||||||
|
self.costs_report_parameter_label.setObjectName("costs_report_parameter_label") |
||||||
|
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.costs_report_parameter_label) |
||||||
|
self.costs_report_parameter_combobox = QtWidgets.QComboBox(self.costs_parameters_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.costs_report_parameter_combobox.sizePolicy().hasHeightForWidth()) |
||||||
|
self.costs_report_parameter_combobox.setSizePolicy(sizePolicy) |
||||||
|
self.costs_report_parameter_combobox.setMinimumSize(QtCore.QSize(300, 0)) |
||||||
|
self.costs_report_parameter_combobox.setObjectName("costs_report_parameter_combobox") |
||||||
|
self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.costs_report_parameter_combobox) |
||||||
|
self.costs_vendor_parameter_label = QtWidgets.QLabel(self.costs_parameters_frame) |
||||||
|
self.costs_vendor_parameter_label.setObjectName("costs_vendor_parameter_label") |
||||||
|
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.costs_vendor_parameter_label) |
||||||
|
self.costs_vendor_parameter_combobox = QtWidgets.QComboBox(self.costs_parameters_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.costs_vendor_parameter_combobox.sizePolicy().hasHeightForWidth()) |
||||||
|
self.costs_vendor_parameter_combobox.setSizePolicy(sizePolicy) |
||||||
|
self.costs_vendor_parameter_combobox.setMinimumSize(QtCore.QSize(300, 0)) |
||||||
|
self.costs_vendor_parameter_combobox.setEditable(False) |
||||||
|
self.costs_vendor_parameter_combobox.setObjectName("costs_vendor_parameter_combobox") |
||||||
|
self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.costs_vendor_parameter_combobox) |
||||||
|
self.costs_year_parameter_label = QtWidgets.QLabel(self.costs_parameters_frame) |
||||||
|
self.costs_year_parameter_label.setObjectName("costs_year_parameter_label") |
||||||
|
self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.costs_year_parameter_label) |
||||||
|
self.costs_year_parameter_dateedit = QtWidgets.QDateEdit(self.costs_parameters_frame) |
||||||
|
self.costs_year_parameter_dateedit.setObjectName("costs_year_parameter_dateedit") |
||||||
|
self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.costs_year_parameter_dateedit) |
||||||
|
self.costs_name_parameter_label = QtWidgets.QLabel(self.costs_parameters_frame) |
||||||
|
self.costs_name_parameter_label.setObjectName("costs_name_parameter_label") |
||||||
|
self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.costs_name_parameter_label) |
||||||
|
self.costs_name_parameter_combobox = QtWidgets.QComboBox(self.costs_parameters_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.costs_name_parameter_combobox.sizePolicy().hasHeightForWidth()) |
||||||
|
self.costs_name_parameter_combobox.setSizePolicy(sizePolicy) |
||||||
|
self.costs_name_parameter_combobox.setMinimumSize(QtCore.QSize(300, 0)) |
||||||
|
self.costs_name_parameter_combobox.setEditable(True) |
||||||
|
self.costs_name_parameter_combobox.setObjectName("costs_name_parameter_combobox") |
||||||
|
self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.costs_name_parameter_combobox) |
||||||
|
self.verticalLayout_2.addWidget(self.costs_parameters_frame) |
||||||
|
self.costs_values_frame = QtWidgets.QFrame(self.frame) |
||||||
|
self.costs_values_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.costs_values_frame.setObjectName("costs_values_frame") |
||||||
|
self.formLayout = QtWidgets.QFormLayout(self.costs_values_frame) |
||||||
|
self.formLayout.setObjectName("formLayout") |
||||||
|
self.costs_cost_in_original_currency_label = QtWidgets.QLabel(self.costs_values_frame) |
||||||
|
self.costs_cost_in_original_currency_label.setObjectName("costs_cost_in_original_currency_label") |
||||||
|
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.costs_cost_in_original_currency_label) |
||||||
|
self.costs_cost_in_original_currency_doublespinbox = QtWidgets.QDoubleSpinBox(self.costs_values_frame) |
||||||
|
self.costs_cost_in_original_currency_doublespinbox.setEnabled(False) |
||||||
|
self.costs_cost_in_original_currency_doublespinbox.setMaximum(999999999.99) |
||||||
|
self.costs_cost_in_original_currency_doublespinbox.setObjectName("costs_cost_in_original_currency_doublespinbox") |
||||||
|
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.costs_cost_in_original_currency_doublespinbox) |
||||||
|
self.costs_original_currency_label = QtWidgets.QLabel(self.costs_values_frame) |
||||||
|
self.costs_original_currency_label.setObjectName("costs_original_currency_label") |
||||||
|
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.costs_original_currency_label) |
||||||
|
self.costs_original_currency_value_combobox = QtWidgets.QComboBox(self.costs_values_frame) |
||||||
|
self.costs_original_currency_value_combobox.setEnabled(False) |
||||||
|
self.costs_original_currency_value_combobox.setEditable(True) |
||||||
|
self.costs_original_currency_value_combobox.setObjectName("costs_original_currency_value_combobox") |
||||||
|
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.costs_original_currency_value_combobox) |
||||||
|
self.costs_cost_in_local_currency_label = QtWidgets.QLabel(self.costs_values_frame) |
||||||
|
self.costs_cost_in_local_currency_label.setObjectName("costs_cost_in_local_currency_label") |
||||||
|
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.costs_cost_in_local_currency_label) |
||||||
|
self.costs_cost_in_local_currency_doublespinbox = QtWidgets.QDoubleSpinBox(self.costs_values_frame) |
||||||
|
self.costs_cost_in_local_currency_doublespinbox.setEnabled(False) |
||||||
|
self.costs_cost_in_local_currency_doublespinbox.setMaximum(999999999.99) |
||||||
|
self.costs_cost_in_local_currency_doublespinbox.setObjectName("costs_cost_in_local_currency_doublespinbox") |
||||||
|
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.costs_cost_in_local_currency_doublespinbox) |
||||||
|
self.costs_cost_in_local_currency_with_tax_label = QtWidgets.QLabel(self.costs_values_frame) |
||||||
|
self.costs_cost_in_local_currency_with_tax_label.setObjectName("costs_cost_in_local_currency_with_tax_label") |
||||||
|
self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.costs_cost_in_local_currency_with_tax_label) |
||||||
|
self.costs_cost_in_local_currency_with_tax_doublespinbox = QtWidgets.QDoubleSpinBox(self.costs_values_frame) |
||||||
|
self.costs_cost_in_local_currency_with_tax_doublespinbox.setEnabled(False) |
||||||
|
self.costs_cost_in_local_currency_with_tax_doublespinbox.setMaximum(999999999.99) |
||||||
|
self.costs_cost_in_local_currency_with_tax_doublespinbox.setObjectName("costs_cost_in_local_currency_with_tax_doublespinbox") |
||||||
|
self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.costs_cost_in_local_currency_with_tax_doublespinbox) |
||||||
|
self.verticalLayout_2.addWidget(self.costs_values_frame) |
||||||
|
self.costs_control_frame = QtWidgets.QFrame(self.frame) |
||||||
|
self.costs_control_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.costs_control_frame.setObjectName("costs_control_frame") |
||||||
|
self.gridLayout = QtWidgets.QGridLayout(self.costs_control_frame) |
||||||
|
self.gridLayout.setObjectName("gridLayout") |
||||||
|
self.costs_save_button = QtWidgets.QPushButton(self.costs_control_frame) |
||||||
|
self.costs_save_button.setObjectName("costs_save_button") |
||||||
|
self.gridLayout.addWidget(self.costs_save_button, 0, 0, 1, 1) |
||||||
|
self.costs_clear_button = QtWidgets.QPushButton(self.costs_control_frame) |
||||||
|
self.costs_clear_button.setObjectName("costs_clear_button") |
||||||
|
self.gridLayout.addWidget(self.costs_clear_button, 0, 2, 1, 1) |
||||||
|
self.costs_load_button = QtWidgets.QPushButton(self.costs_control_frame) |
||||||
|
self.costs_load_button.setObjectName("costs_load_button") |
||||||
|
self.gridLayout.addWidget(self.costs_load_button, 0, 4, 1, 1) |
||||||
|
self.costs_import_costs_button = QtWidgets.QPushButton(self.costs_control_frame) |
||||||
|
self.costs_import_costs_button.setObjectName("costs_import_costs_button") |
||||||
|
self.gridLayout.addWidget(self.costs_import_costs_button, 0, 5, 1, 1) |
||||||
|
self.verticalLayout_2.addWidget(self.costs_control_frame) |
||||||
|
self.horizontalLayout.addWidget(self.frame) |
||||||
|
spacerItem1 = QtWidgets.QSpacerItem(120, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) |
||||||
|
self.horizontalLayout.addItem(spacerItem1) |
||||||
|
|
||||||
|
self.retranslateUi(costs_tab) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(costs_tab) |
||||||
|
|
||||||
|
def retranslateUi(self, costs_tab): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
costs_tab.setWindowTitle(_translate("costs_tab", "Costs")) |
||||||
|
self.costs_report_parameter_label.setText(_translate("costs_tab", "Report")) |
||||||
|
self.costs_vendor_parameter_label.setText(_translate("costs_tab", "Vendor")) |
||||||
|
self.costs_year_parameter_label.setText(_translate("costs_tab", "Year")) |
||||||
|
self.costs_year_parameter_dateedit.setDisplayFormat(_translate("costs_tab", "yyyy")) |
||||||
|
self.costs_name_parameter_label.setText(_translate("costs_tab", "Name")) |
||||||
|
self.costs_cost_in_original_currency_label.setText(_translate("costs_tab", "Cost in Original Currency")) |
||||||
|
self.costs_original_currency_label.setText(_translate("costs_tab", "Original Currency")) |
||||||
|
self.costs_cost_in_local_currency_label.setText(_translate("costs_tab", "Cost in Local Currency")) |
||||||
|
self.costs_cost_in_local_currency_with_tax_label.setText(_translate("costs_tab", "Cost in Local Currency with Tax")) |
||||||
|
self.costs_save_button.setText(_translate("costs_tab", "Save Costs")) |
||||||
|
self.costs_clear_button.setText(_translate("costs_tab", "Clear")) |
||||||
|
self.costs_load_button.setText(_translate("costs_tab", "Refresh Costs")) |
||||||
|
self.costs_import_costs_button.setText(_translate("costs_tab", "Import Costs File")) |
||||||
|
import Resources_rc |
@ -0,0 +1,289 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>costs_tab</class> |
||||||
|
<widget class="QWidget" name="costs_tab"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>898</width> |
||||||
|
<height>671</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Costs</string> |
||||||
|
</property> |
||||||
|
<property name="windowIcon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/tab_icons/costs_icon.png</normaloff>:/ui/resources/tab_icons/costs_icon.png</iconset> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||||
|
<item> |
||||||
|
<spacer name="horizontalSpacer"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeType"> |
||||||
|
<enum>QSizePolicy::Maximum</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>120</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="costs_parameters_frame"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QFormLayout" name="formLayout_3"> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QLabel" name="costs_report_parameter_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Report</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QComboBox" name="costs_report_parameter_combobox"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>300</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="0"> |
||||||
|
<widget class="QLabel" name="costs_vendor_parameter_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Vendor</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="1"> |
||||||
|
<widget class="QComboBox" name="costs_vendor_parameter_combobox"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>300</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="editable"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="0"> |
||||||
|
<widget class="QLabel" name="costs_year_parameter_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Year</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="1"> |
||||||
|
<widget class="QDateEdit" name="costs_year_parameter_dateedit"> |
||||||
|
<property name="displayFormat"> |
||||||
|
<string>yyyy</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="0"> |
||||||
|
<widget class="QLabel" name="costs_name_parameter_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Name</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="1"> |
||||||
|
<widget class="QComboBox" name="costs_name_parameter_combobox"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>300</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="editable"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="costs_values_frame"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QFormLayout" name="formLayout"> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QLabel" name="costs_cost_in_original_currency_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Cost in Original Currency</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QDoubleSpinBox" name="costs_cost_in_original_currency_doublespinbox"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="maximum"> |
||||||
|
<double>999999999.990000009536743</double> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="0"> |
||||||
|
<widget class="QLabel" name="costs_original_currency_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Original Currency</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="1"> |
||||||
|
<widget class="QComboBox" name="costs_original_currency_value_combobox"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="editable"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="0"> |
||||||
|
<widget class="QLabel" name="costs_cost_in_local_currency_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Cost in Local Currency</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="1"> |
||||||
|
<widget class="QDoubleSpinBox" name="costs_cost_in_local_currency_doublespinbox"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="maximum"> |
||||||
|
<double>999999999.990000009536743</double> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="0"> |
||||||
|
<widget class="QLabel" name="costs_cost_in_local_currency_with_tax_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Cost in Local Currency with Tax</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="1"> |
||||||
|
<widget class="QDoubleSpinBox" name="costs_cost_in_local_currency_with_tax_doublespinbox"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="maximum"> |
||||||
|
<double>999999999.990000009536743</double> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="costs_control_frame"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout"> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QPushButton" name="costs_save_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>Save Costs</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="2"> |
||||||
|
<widget class="QPushButton" name="costs_clear_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>Clear</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="4"> |
||||||
|
<widget class="QPushButton" name="costs_load_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>Refresh Costs</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="5"> |
||||||
|
<widget class="QPushButton" name="costs_import_costs_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>Import Costs File</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<spacer name="horizontalSpacer_2"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeType"> |
||||||
|
<enum>QSizePolicy::Maximum</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>120</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,39 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'DisclaimerDialog.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.14.1 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_dialog(object): |
||||||
|
def setupUi(self, dialog): |
||||||
|
dialog.setObjectName("dialog") |
||||||
|
dialog.resize(403, 80) |
||||||
|
self.buttonBox = QtWidgets.QDialogButtonBox(dialog) |
||||||
|
self.buttonBox.setGeometry(QtCore.QRect(40, 50, 341, 32)) |
||||||
|
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) |
||||||
|
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok) |
||||||
|
self.buttonBox.setObjectName("buttonBox") |
||||||
|
self.frame = QtWidgets.QFrame(dialog) |
||||||
|
self.frame.setGeometry(QtCore.QRect(10, 10, 381, 41)) |
||||||
|
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame.setFrameShadow(QtWidgets.QFrame.Raised) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.label = QtWidgets.QLabel(self.frame) |
||||||
|
self.label.setGeometry(QtCore.QRect(10, 0, 371, 41)) |
||||||
|
self.label.setObjectName("label") |
||||||
|
|
||||||
|
self.retranslateUi(dialog) |
||||||
|
self.buttonBox.accepted.connect(dialog.accept) |
||||||
|
self.buttonBox.rejected.connect(dialog.reject) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(dialog) |
||||||
|
|
||||||
|
def retranslateUi(self, dialog): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
dialog.setWindowTitle(_translate("dialog", "Disclaimer")) |
||||||
|
self.label.setText(_translate("dialog", "Only reports supported by selected vendor will be retrieved!")) |
@ -0,0 +1,97 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>dialog</class> |
||||||
|
<widget class="QDialog" name="dialog"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>403</width> |
||||||
|
<height>80</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Disclaimer</string> |
||||||
|
</property> |
||||||
|
<widget class="QDialogButtonBox" name="buttonBox"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>40</x> |
||||||
|
<y>50</y> |
||||||
|
<width>341</width> |
||||||
|
<height>32</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="standardButtons"> |
||||||
|
<set>QDialogButtonBox::Ok</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>10</x> |
||||||
|
<y>10</y> |
||||||
|
<width>381</width> |
||||||
|
<height>41</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Raised</enum> |
||||||
|
</property> |
||||||
|
<widget class="QLabel" name="label"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>10</x> |
||||||
|
<y>0</y> |
||||||
|
<width>371</width> |
||||||
|
<height>41</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Only reports supported by selected vendor will be retrieved!</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</widget> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections> |
||||||
|
<connection> |
||||||
|
<sender>buttonBox</sender> |
||||||
|
<signal>accepted()</signal> |
||||||
|
<receiver>dialog</receiver> |
||||||
|
<slot>accept()</slot> |
||||||
|
<hints> |
||||||
|
<hint type="sourcelabel"> |
||||||
|
<x>248</x> |
||||||
|
<y>254</y> |
||||||
|
</hint> |
||||||
|
<hint type="destinationlabel"> |
||||||
|
<x>157</x> |
||||||
|
<y>274</y> |
||||||
|
</hint> |
||||||
|
</hints> |
||||||
|
</connection> |
||||||
|
<connection> |
||||||
|
<sender>buttonBox</sender> |
||||||
|
<signal>rejected()</signal> |
||||||
|
<receiver>dialog</receiver> |
||||||
|
<slot>reject()</slot> |
||||||
|
<hints> |
||||||
|
<hint type="sourcelabel"> |
||||||
|
<x>316</x> |
||||||
|
<y>260</y> |
||||||
|
</hint> |
||||||
|
<hint type="destinationlabel"> |
||||||
|
<x>286</x> |
||||||
|
<y>274</y> |
||||||
|
</hint> |
||||||
|
</hints> |
||||||
|
</connection> |
||||||
|
</connections> |
||||||
|
</ui> |
@ -0,0 +1,80 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'FetchProgressDialog.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.12.3 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_FetchProgressDialog(object): |
||||||
|
def setupUi(self, FetchProgressDialog): |
||||||
|
FetchProgressDialog.setObjectName("FetchProgressDialog") |
||||||
|
FetchProgressDialog.resize(800, 600) |
||||||
|
FetchProgressDialog.setMinimumSize(QtCore.QSize(680, 0)) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setPointSize(9) |
||||||
|
FetchProgressDialog.setFont(font) |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(FetchProgressDialog) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.fetching_frame = QtWidgets.QFrame(FetchProgressDialog) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.fetching_frame.sizePolicy().hasHeightForWidth()) |
||||||
|
self.fetching_frame.setSizePolicy(sizePolicy) |
||||||
|
self.fetching_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.fetching_frame.setFrameShadow(QtWidgets.QFrame.Raised) |
||||||
|
self.fetching_frame.setObjectName("fetching_frame") |
||||||
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.fetching_frame) |
||||||
|
self.verticalLayout_2.setObjectName("verticalLayout_2") |
||||||
|
self.status_label = QtWidgets.QLabel(self.fetching_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.status_label.sizePolicy().hasHeightForWidth()) |
||||||
|
self.status_label.setSizePolicy(sizePolicy) |
||||||
|
self.status_label.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.status_label.setObjectName("status_label") |
||||||
|
self.verticalLayout_2.addWidget(self.status_label) |
||||||
|
self.progress_bar = QtWidgets.QProgressBar(self.fetching_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.progress_bar.sizePolicy().hasHeightForWidth()) |
||||||
|
self.progress_bar.setSizePolicy(sizePolicy) |
||||||
|
self.progress_bar.setProperty("value", 24) |
||||||
|
self.progress_bar.setObjectName("progress_bar") |
||||||
|
self.verticalLayout_2.addWidget(self.progress_bar) |
||||||
|
self.verticalLayout.addWidget(self.fetching_frame) |
||||||
|
self.results_scroll_area = QtWidgets.QScrollArea(FetchProgressDialog) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.results_scroll_area.sizePolicy().hasHeightForWidth()) |
||||||
|
self.results_scroll_area.setSizePolicy(sizePolicy) |
||||||
|
self.results_scroll_area.setWidgetResizable(True) |
||||||
|
self.results_scroll_area.setObjectName("results_scroll_area") |
||||||
|
self.scroll_area_widget_contents = QtWidgets.QWidget() |
||||||
|
self.scroll_area_widget_contents.setGeometry(QtCore.QRect(0, 0, 780, 480)) |
||||||
|
self.scroll_area_widget_contents.setObjectName("scroll_area_widget_contents") |
||||||
|
self.scroll_area_vertical_layout = QtWidgets.QVBoxLayout(self.scroll_area_widget_contents) |
||||||
|
self.scroll_area_vertical_layout.setObjectName("scroll_area_vertical_layout") |
||||||
|
self.results_scroll_area.setWidget(self.scroll_area_widget_contents) |
||||||
|
self.verticalLayout.addWidget(self.results_scroll_area) |
||||||
|
self.buttonBox = QtWidgets.QDialogButtonBox(FetchProgressDialog) |
||||||
|
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok|QtWidgets.QDialogButtonBox.Retry) |
||||||
|
self.buttonBox.setCenterButtons(True) |
||||||
|
self.buttonBox.setObjectName("buttonBox") |
||||||
|
self.verticalLayout.addWidget(self.buttonBox) |
||||||
|
|
||||||
|
self.retranslateUi(FetchProgressDialog) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(FetchProgressDialog) |
||||||
|
|
||||||
|
def retranslateUi(self, FetchProgressDialog): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
FetchProgressDialog.setWindowTitle(_translate("FetchProgressDialog", "Fetch Progress")) |
||||||
|
self.status_label.setText(_translate("FetchProgressDialog", "Fetching...")) |
@ -0,0 +1,113 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>FetchProgressDialog</class> |
||||||
|
<widget class="QDialog" name="FetchProgressDialog"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>800</width> |
||||||
|
<height>600</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>680</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<pointsize>9</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Fetch Progress</string> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="fetching_frame"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Raised</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="status_label"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Fetching...</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QProgressBar" name="progress_bar"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="value"> |
||||||
|
<number>24</number> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QScrollArea" name="results_scroll_area"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="widgetResizable"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<widget class="QWidget" name="scroll_area_widget_contents"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>780</width> |
||||||
|
<height>480</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="scroll_area_vertical_layout"/> |
||||||
|
</widget> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QDialogButtonBox" name="buttonBox"> |
||||||
|
<property name="standardButtons"> |
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Retry</set> |
||||||
|
</property> |
||||||
|
<property name="centerButtons"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,113 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>FetchProgressDialog</class> |
||||||
|
<widget class="QDialog" name="FetchProgressDialog"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>680</width> |
||||||
|
<height>353</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>680</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<pointsize>9</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Fetch Progress</string> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="fetching_frame"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Raised</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="status_label"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Fetching...</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QProgressBar" name="progress_bar"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="value"> |
||||||
|
<number>24</number> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QScrollArea" name="results_scroll_area"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="widgetResizable"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<widget class="QWidget" name="scroll_area_widget_contents"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>660</width> |
||||||
|
<height>236</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="scroll_area_vertical_layout"/> |
||||||
|
</widget> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QDialogButtonBox" name="buttonBox"> |
||||||
|
<property name="standardButtons"> |
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Retry</set> |
||||||
|
</property> |
||||||
|
<property name="centerButtons"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,422 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'FetchReportsTab.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.12.3 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_fetch_reports_tab(object): |
||||||
|
def setupUi(self, fetch_reports_tab): |
||||||
|
fetch_reports_tab.setObjectName("fetch_reports_tab") |
||||||
|
fetch_reports_tab.resize(1014, 746) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(fetch_reports_tab.sizePolicy().hasHeightForWidth()) |
||||||
|
fetch_reports_tab.setSizePolicy(sizePolicy) |
||||||
|
fetch_reports_tab.setMinimumSize(QtCore.QSize(800, 0)) |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/tab_icons/fetch_reports_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
fetch_reports_tab.setWindowIcon(icon) |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(fetch_reports_tab) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.frame_4 = QtWidgets.QFrame(fetch_reports_tab) |
||||||
|
self.frame_4.setMouseTracking(True) |
||||||
|
self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_4.setObjectName("frame_4") |
||||||
|
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.frame_4) |
||||||
|
self.verticalLayout_3.setObjectName("verticalLayout_3") |
||||||
|
self.label_35 = QtWidgets.QLabel(self.frame_4) |
||||||
|
self.label_35.setMinimumSize(QtCore.QSize(15, 15)) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(16) |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_35.setFont(font) |
||||||
|
self.label_35.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.label_35.setObjectName("label_35") |
||||||
|
self.verticalLayout_3.addWidget(self.label_35) |
||||||
|
self.frame_9 = QtWidgets.QFrame(self.frame_4) |
||||||
|
self.frame_9.setMinimumSize(QtCore.QSize(0, 60)) |
||||||
|
self.frame_9.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_9.setObjectName("frame_9") |
||||||
|
self.horizontalLayout_10 = QtWidgets.QHBoxLayout(self.frame_9) |
||||||
|
self.horizontalLayout_10.setObjectName("horizontalLayout_10") |
||||||
|
self.frame_28 = QtWidgets.QFrame(self.frame_9) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_28.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_28.setSizePolicy(sizePolicy) |
||||||
|
self.frame_28.setObjectName("frame_28") |
||||||
|
self.horizontalLayout_12 = QtWidgets.QHBoxLayout(self.frame_28) |
||||||
|
self.horizontalLayout_12.setSpacing(10) |
||||||
|
self.horizontalLayout_12.setObjectName("horizontalLayout_12") |
||||||
|
self.label_34 = QtWidgets.QLabel(self.frame_28) |
||||||
|
self.label_34.setObjectName("label_34") |
||||||
|
self.horizontalLayout_12.addWidget(self.label_34) |
||||||
|
self.All_reports_edit_fetch = QtWidgets.QDateEdit(self.frame_28) |
||||||
|
self.All_reports_edit_fetch.setDateTime(QtCore.QDateTime(QtCore.QDate(2020, 1, 1), QtCore.QTime(0, 0, 0))) |
||||||
|
self.All_reports_edit_fetch.setObjectName("All_reports_edit_fetch") |
||||||
|
self.horizontalLayout_12.addWidget(self.All_reports_edit_fetch) |
||||||
|
self.horizontalLayout_10.addWidget(self.frame_28) |
||||||
|
self.fetch_all_data_button = QtWidgets.QPushButton(self.frame_9) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.fetch_all_data_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.fetch_all_data_button.setSizePolicy(sizePolicy) |
||||||
|
self.fetch_all_data_button.setMaximumSize(QtCore.QSize(300, 16777215)) |
||||||
|
self.fetch_all_data_button.setObjectName("fetch_all_data_button") |
||||||
|
self.horizontalLayout_10.addWidget(self.fetch_all_data_button) |
||||||
|
self.verticalLayout_3.addWidget(self.frame_9) |
||||||
|
spacerItem = QtWidgets.QSpacerItem(20, 45, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) |
||||||
|
self.verticalLayout_3.addItem(spacerItem) |
||||||
|
self.Adv_Fetch_text = QtWidgets.QLabel(self.frame_4) |
||||||
|
self.Adv_Fetch_text.setMaximumSize(QtCore.QSize(16777215, 20)) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(16) |
||||||
|
font.setBold(True) |
||||||
|
font.setItalic(False) |
||||||
|
font.setUnderline(False) |
||||||
|
font.setWeight(75) |
||||||
|
self.Adv_Fetch_text.setFont(font) |
||||||
|
self.Adv_Fetch_text.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.Adv_Fetch_text.setObjectName("Adv_Fetch_text") |
||||||
|
self.verticalLayout_3.addWidget(self.Adv_Fetch_text) |
||||||
|
self.frame_5 = QtWidgets.QFrame(self.frame_4) |
||||||
|
self.frame_5.setObjectName("frame_5") |
||||||
|
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_5) |
||||||
|
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_3.setObjectName("horizontalLayout_3") |
||||||
|
self.frame_10 = QtWidgets.QFrame(self.frame_5) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_10.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_10.setSizePolicy(sizePolicy) |
||||||
|
self.frame_10.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_10.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_10.setObjectName("frame_10") |
||||||
|
self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_10) |
||||||
|
self.verticalLayout_4.setObjectName("verticalLayout_4") |
||||||
|
self.label_11 = QtWidgets.QLabel(self.frame_10) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_11.setFont(font) |
||||||
|
self.label_11.setObjectName("label_11") |
||||||
|
self.verticalLayout_4.addWidget(self.label_11) |
||||||
|
self.horizontalFrame = QtWidgets.QFrame(self.frame_10) |
||||||
|
self.horizontalFrame.setObjectName("horizontalFrame") |
||||||
|
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.horizontalFrame) |
||||||
|
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_4.setObjectName("horizontalLayout_4") |
||||||
|
self.select_vendors_button_fetch = QtWidgets.QPushButton(self.horizontalFrame) |
||||||
|
self.select_vendors_button_fetch.setObjectName("select_vendors_button_fetch") |
||||||
|
self.horizontalLayout_4.addWidget(self.select_vendors_button_fetch) |
||||||
|
self.deselect_vendors_button_fetch = QtWidgets.QPushButton(self.horizontalFrame) |
||||||
|
self.deselect_vendors_button_fetch.setObjectName("deselect_vendors_button_fetch") |
||||||
|
self.horizontalLayout_4.addWidget(self.deselect_vendors_button_fetch) |
||||||
|
self.verticalLayout_4.addWidget(self.horizontalFrame) |
||||||
|
self.vendors_list_view_fetch = QtWidgets.QListView(self.frame_10) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
self.vendors_list_view_fetch.setFont(font) |
||||||
|
self.vendors_list_view_fetch.setAlternatingRowColors(True) |
||||||
|
self.vendors_list_view_fetch.setObjectName("vendors_list_view_fetch") |
||||||
|
self.verticalLayout_4.addWidget(self.vendors_list_view_fetch) |
||||||
|
self.horizontalLayout_3.addWidget(self.frame_10) |
||||||
|
self.frame_11 = QtWidgets.QFrame(self.frame_5) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_11.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_11.setSizePolicy(sizePolicy) |
||||||
|
self.frame_11.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_11.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_11.setObjectName("frame_11") |
||||||
|
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.frame_11) |
||||||
|
self.verticalLayout_5.setObjectName("verticalLayout_5") |
||||||
|
self.label_12 = QtWidgets.QLabel(self.frame_11) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_12.setFont(font) |
||||||
|
self.label_12.setObjectName("label_12") |
||||||
|
self.verticalLayout_5.addWidget(self.label_12) |
||||||
|
self.horizontalFrame_2 = QtWidgets.QFrame(self.frame_11) |
||||||
|
self.horizontalFrame_2.setObjectName("horizontalFrame_2") |
||||||
|
self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.horizontalFrame_2) |
||||||
|
self.horizontalLayout_6.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_6.setObjectName("horizontalLayout_6") |
||||||
|
self.select_report_types_button_fetch = QtWidgets.QPushButton(self.horizontalFrame_2) |
||||||
|
self.select_report_types_button_fetch.setObjectName("select_report_types_button_fetch") |
||||||
|
self.horizontalLayout_6.addWidget(self.select_report_types_button_fetch) |
||||||
|
self.deselect_report_types_button_fetch = QtWidgets.QPushButton(self.horizontalFrame_2) |
||||||
|
self.deselect_report_types_button_fetch.setObjectName("deselect_report_types_button_fetch") |
||||||
|
self.horizontalLayout_6.addWidget(self.deselect_report_types_button_fetch) |
||||||
|
self.report_types_help_button = QtWidgets.QPushButton(self.horizontalFrame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.report_types_help_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.report_types_help_button.setSizePolicy(sizePolicy) |
||||||
|
self.report_types_help_button.setText("") |
||||||
|
icon1 = QtGui.QIcon() |
||||||
|
icon1.addPixmap(QtGui.QPixmap(":/ui/resources/help_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.report_types_help_button.setIcon(icon1) |
||||||
|
self.report_types_help_button.setObjectName("report_types_help_button") |
||||||
|
self.horizontalLayout_6.addWidget(self.report_types_help_button) |
||||||
|
self.verticalLayout_5.addWidget(self.horizontalFrame_2) |
||||||
|
self.report_types_list_view = QtWidgets.QListView(self.frame_11) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
self.report_types_list_view.setFont(font) |
||||||
|
self.report_types_list_view.setAlternatingRowColors(True) |
||||||
|
self.report_types_list_view.setObjectName("report_types_list_view") |
||||||
|
self.verticalLayout_5.addWidget(self.report_types_list_view) |
||||||
|
self.horizontalLayout_3.addWidget(self.frame_11) |
||||||
|
self.frame_7 = QtWidgets.QFrame(self.frame_5) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_7.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_7.setSizePolicy(sizePolicy) |
||||||
|
self.frame_7.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_7.setObjectName("frame_7") |
||||||
|
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.frame_7) |
||||||
|
self.verticalLayout_7.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.verticalLayout_7.setObjectName("verticalLayout_7") |
||||||
|
self.frame_14 = QtWidgets.QFrame(self.frame_7) |
||||||
|
self.frame_14.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_14.setObjectName("frame_14") |
||||||
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame_14) |
||||||
|
self.verticalLayout_2.setObjectName("verticalLayout_2") |
||||||
|
self.label_8 = QtWidgets.QLabel(self.frame_14) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.label_8.sizePolicy().hasHeightForWidth()) |
||||||
|
self.label_8.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_8.setFont(font) |
||||||
|
self.label_8.setObjectName("label_8") |
||||||
|
self.verticalLayout_2.addWidget(self.label_8) |
||||||
|
self.frame_6 = QtWidgets.QFrame(self.frame_14) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_6.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_6.setSizePolicy(sizePolicy) |
||||||
|
self.frame_6.setMinimumSize(QtCore.QSize(0, 0)) |
||||||
|
self.frame_6.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_6.setObjectName("frame_6") |
||||||
|
self.gridLayout = QtWidgets.QGridLayout(self.frame_6) |
||||||
|
self.gridLayout.setSpacing(20) |
||||||
|
self.gridLayout.setObjectName("gridLayout") |
||||||
|
self.end_date_edit_fetch_year = QtWidgets.QDateEdit(self.frame_6) |
||||||
|
self.end_date_edit_fetch_year.setDateTime(QtCore.QDateTime(QtCore.QDate(2020, 1, 1), QtCore.QTime(0, 0, 0))) |
||||||
|
self.end_date_edit_fetch_year.setObjectName("end_date_edit_fetch_year") |
||||||
|
self.gridLayout.addWidget(self.end_date_edit_fetch_year, 3, 1, 1, 1) |
||||||
|
self.begin_month_combo_box = QtWidgets.QComboBox(self.frame_6) |
||||||
|
self.begin_month_combo_box.setObjectName("begin_month_combo_box") |
||||||
|
self.gridLayout.addWidget(self.begin_month_combo_box, 0, 2, 1, 1) |
||||||
|
self.label_9 = QtWidgets.QLabel(self.frame_6) |
||||||
|
self.label_9.setObjectName("label_9") |
||||||
|
self.gridLayout.addWidget(self.label_9, 0, 0, 1, 1) |
||||||
|
self.end_month_combo_box = QtWidgets.QComboBox(self.frame_6) |
||||||
|
self.end_month_combo_box.setObjectName("end_month_combo_box") |
||||||
|
self.gridLayout.addWidget(self.end_month_combo_box, 3, 2, 1, 1) |
||||||
|
self.begin_date_edit_fetch_year = QtWidgets.QDateEdit(self.frame_6) |
||||||
|
self.begin_date_edit_fetch_year.setDate(QtCore.QDate(2020, 1, 1)) |
||||||
|
self.begin_date_edit_fetch_year.setObjectName("begin_date_edit_fetch_year") |
||||||
|
self.gridLayout.addWidget(self.begin_date_edit_fetch_year, 0, 1, 1, 1) |
||||||
|
self.label_10 = QtWidgets.QLabel(self.frame_6) |
||||||
|
self.label_10.setObjectName("label_10") |
||||||
|
self.gridLayout.addWidget(self.label_10, 3, 0, 1, 1) |
||||||
|
self.verticalLayout_2.addWidget(self.frame_6) |
||||||
|
self.custom_dir_frame = QtWidgets.QFrame(self.frame_14) |
||||||
|
self.custom_dir_frame.setMinimumSize(QtCore.QSize(0, 0)) |
||||||
|
self.custom_dir_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.custom_dir_frame.setObjectName("custom_dir_frame") |
||||||
|
self.verticalLayout_26 = QtWidgets.QVBoxLayout(self.custom_dir_frame) |
||||||
|
self.verticalLayout_26.setObjectName("verticalLayout_26") |
||||||
|
self.frame = QtWidgets.QFrame(self.custom_dir_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame.setSizePolicy(sizePolicy) |
||||||
|
self.frame.setMaximumSize(QtCore.QSize(16777215, 16777215)) |
||||||
|
self.frame.setFrameShape(QtWidgets.QFrame.NoFrame) |
||||||
|
self.frame.setFrameShadow(QtWidgets.QFrame.Plain) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame) |
||||||
|
self.horizontalLayout.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout.setSpacing(0) |
||||||
|
self.horizontalLayout.setObjectName("horizontalLayout") |
||||||
|
self.label_38 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_38.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.label_38.setObjectName("label_38") |
||||||
|
self.horizontalLayout.addWidget(self.label_38) |
||||||
|
self.date_range_help_button = QtWidgets.QPushButton(self.frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.date_range_help_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.date_range_help_button.setSizePolicy(sizePolicy) |
||||||
|
self.date_range_help_button.setMaximumSize(QtCore.QSize(16777215, 16777215)) |
||||||
|
self.date_range_help_button.setText("") |
||||||
|
self.date_range_help_button.setIcon(icon1) |
||||||
|
self.date_range_help_button.setObjectName("date_range_help_button") |
||||||
|
self.horizontalLayout.addWidget(self.date_range_help_button) |
||||||
|
self.verticalLayout_26.addWidget(self.frame) |
||||||
|
self.frame_2 = QtWidgets.QFrame(self.custom_dir_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_2.setSizePolicy(sizePolicy) |
||||||
|
self.frame_2.setFrameShape(QtWidgets.QFrame.NoFrame) |
||||||
|
self.frame_2.setFrameShadow(QtWidgets.QFrame.Plain) |
||||||
|
self.frame_2.setObjectName("frame_2") |
||||||
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame_2) |
||||||
|
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_2.setSpacing(0) |
||||||
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2") |
||||||
|
self.label = QtWidgets.QLabel(self.frame_2) |
||||||
|
self.label.setObjectName("label") |
||||||
|
self.horizontalLayout_2.addWidget(self.label) |
||||||
|
self.date_range_help_button2 = QtWidgets.QPushButton(self.frame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.date_range_help_button2.sizePolicy().hasHeightForWidth()) |
||||||
|
self.date_range_help_button2.setSizePolicy(sizePolicy) |
||||||
|
self.date_range_help_button2.setText("") |
||||||
|
self.date_range_help_button2.setIcon(icon1) |
||||||
|
self.date_range_help_button2.setObjectName("date_range_help_button2") |
||||||
|
self.horizontalLayout_2.addWidget(self.date_range_help_button2) |
||||||
|
self.verticalLayout_26.addWidget(self.frame_2) |
||||||
|
self.frame_3 = QtWidgets.QFrame(self.custom_dir_frame) |
||||||
|
self.frame_3.setFrameShape(QtWidgets.QFrame.NoFrame) |
||||||
|
self.frame_3.setFrameShadow(QtWidgets.QFrame.Plain) |
||||||
|
self.frame_3.setObjectName("frame_3") |
||||||
|
self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.frame_3) |
||||||
|
self.horizontalLayout_5.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_5.setSpacing(0) |
||||||
|
self.horizontalLayout_5.setObjectName("horizontalLayout_5") |
||||||
|
self.label_41 = QtWidgets.QLabel(self.frame_3) |
||||||
|
self.label_41.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.label_41.setObjectName("label_41") |
||||||
|
self.horizontalLayout_5.addWidget(self.label_41) |
||||||
|
self.date_range_help_button3 = QtWidgets.QPushButton(self.frame_3) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.date_range_help_button3.sizePolicy().hasHeightForWidth()) |
||||||
|
self.date_range_help_button3.setSizePolicy(sizePolicy) |
||||||
|
self.date_range_help_button3.setText("") |
||||||
|
self.date_range_help_button3.setIcon(icon1) |
||||||
|
self.date_range_help_button3.setObjectName("date_range_help_button3") |
||||||
|
self.horizontalLayout_5.addWidget(self.date_range_help_button3) |
||||||
|
self.verticalLayout_26.addWidget(self.frame_3) |
||||||
|
self.frame_39 = QtWidgets.QFrame(self.custom_dir_frame) |
||||||
|
self.frame_39.setObjectName("frame_39") |
||||||
|
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.frame_39) |
||||||
|
self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_7.setObjectName("horizontalLayout_7") |
||||||
|
self.custom_dir_edit = QtWidgets.QLineEdit(self.frame_39) |
||||||
|
self.custom_dir_edit.setObjectName("custom_dir_edit") |
||||||
|
self.horizontalLayout_7.addWidget(self.custom_dir_edit) |
||||||
|
self.custom_dir_button = QtWidgets.QPushButton(self.frame_39) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.custom_dir_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.custom_dir_button.setSizePolicy(sizePolicy) |
||||||
|
self.custom_dir_button.setObjectName("custom_dir_button") |
||||||
|
self.horizontalLayout_7.addWidget(self.custom_dir_button) |
||||||
|
self.verticalLayout_26.addWidget(self.frame_39) |
||||||
|
self.verticalLayout_2.addWidget(self.custom_dir_frame) |
||||||
|
self.verticalLayout_7.addWidget(self.frame_14) |
||||||
|
self.frame_13 = QtWidgets.QFrame(self.frame_7) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_13.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_13.setSizePolicy(sizePolicy) |
||||||
|
self.frame_13.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_13.setObjectName("frame_13") |
||||||
|
self.gridLayout_2 = QtWidgets.QGridLayout(self.frame_13) |
||||||
|
self.gridLayout_2.setObjectName("gridLayout_2") |
||||||
|
self.fetch_advanced_button = QtWidgets.QPushButton(self.frame_13) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.fetch_advanced_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.fetch_advanced_button.setSizePolicy(sizePolicy) |
||||||
|
self.fetch_advanced_button.setObjectName("fetch_advanced_button") |
||||||
|
self.gridLayout_2.addWidget(self.fetch_advanced_button, 1, 1, 1, 1) |
||||||
|
self.verticalLayout_7.addWidget(self.frame_13) |
||||||
|
self.horizontalLayout_3.addWidget(self.frame_7) |
||||||
|
self.verticalLayout_3.addWidget(self.frame_5) |
||||||
|
self.verticalLayout.addWidget(self.frame_4) |
||||||
|
self.label_2 = QtWidgets.QLabel(fetch_reports_tab) |
||||||
|
self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) |
||||||
|
self.label_2.setObjectName("label_2") |
||||||
|
self.verticalLayout.addWidget(self.label_2) |
||||||
|
|
||||||
|
self.retranslateUi(fetch_reports_tab) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(fetch_reports_tab) |
||||||
|
fetch_reports_tab.setTabOrder(self.All_reports_edit_fetch, self.fetch_all_data_button) |
||||||
|
fetch_reports_tab.setTabOrder(self.fetch_all_data_button, self.select_vendors_button_fetch) |
||||||
|
fetch_reports_tab.setTabOrder(self.select_vendors_button_fetch, self.deselect_vendors_button_fetch) |
||||||
|
fetch_reports_tab.setTabOrder(self.deselect_vendors_button_fetch, self.vendors_list_view_fetch) |
||||||
|
fetch_reports_tab.setTabOrder(self.vendors_list_view_fetch, self.select_report_types_button_fetch) |
||||||
|
fetch_reports_tab.setTabOrder(self.select_report_types_button_fetch, self.deselect_report_types_button_fetch) |
||||||
|
fetch_reports_tab.setTabOrder(self.deselect_report_types_button_fetch, self.report_types_help_button) |
||||||
|
fetch_reports_tab.setTabOrder(self.report_types_help_button, self.report_types_list_view) |
||||||
|
fetch_reports_tab.setTabOrder(self.report_types_list_view, self.end_date_edit_fetch_year) |
||||||
|
fetch_reports_tab.setTabOrder(self.end_date_edit_fetch_year, self.custom_dir_edit) |
||||||
|
fetch_reports_tab.setTabOrder(self.custom_dir_edit, self.custom_dir_button) |
||||||
|
fetch_reports_tab.setTabOrder(self.custom_dir_button, self.fetch_advanced_button) |
||||||
|
|
||||||
|
def retranslateUi(self, fetch_reports_tab): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
fetch_reports_tab.setWindowTitle(_translate("fetch_reports_tab", "Fetch Report")) |
||||||
|
self.label_35.setText(_translate("fetch_reports_tab", "Fetch All Reports")) |
||||||
|
self.label_34.setText(_translate("fetch_reports_tab", "Year")) |
||||||
|
self.All_reports_edit_fetch.setDisplayFormat(_translate("fetch_reports_tab", "yyyy")) |
||||||
|
self.fetch_all_data_button.setText(_translate("fetch_reports_tab", "Fetch All Reports")) |
||||||
|
self.Adv_Fetch_text.setText(_translate("fetch_reports_tab", "Advanced Fetch Reports")) |
||||||
|
self.label_11.setText(_translate("fetch_reports_tab", "Select Vendors")) |
||||||
|
self.select_vendors_button_fetch.setText(_translate("fetch_reports_tab", "Select All")) |
||||||
|
self.deselect_vendors_button_fetch.setText(_translate("fetch_reports_tab", "Deselect All")) |
||||||
|
self.label_12.setText(_translate("fetch_reports_tab", "Select Report Types")) |
||||||
|
self.select_report_types_button_fetch.setText(_translate("fetch_reports_tab", "Select All")) |
||||||
|
self.deselect_report_types_button_fetch.setText(_translate("fetch_reports_tab", "Deselect All")) |
||||||
|
self.label_8.setText(_translate("fetch_reports_tab", "Date Range")) |
||||||
|
self.end_date_edit_fetch_year.setDisplayFormat(_translate("fetch_reports_tab", "yyyy")) |
||||||
|
self.label_9.setText(_translate("fetch_reports_tab", "Begin Date")) |
||||||
|
self.begin_date_edit_fetch_year.setDisplayFormat(_translate("fetch_reports_tab", "yyyy")) |
||||||
|
self.label_10.setText(_translate("fetch_reports_tab", "End Date")) |
||||||
|
self.label_38.setText(_translate("fetch_reports_tab", "Date range is not a calendar year")) |
||||||
|
self.label.setText(_translate("fetch_reports_tab", "The date range contains months with no available data")) |
||||||
|
self.label_41.setText(_translate("fetch_reports_tab", "Report(s) will be saved to:")) |
||||||
|
self.custom_dir_button.setText(_translate("fetch_reports_tab", "Change")) |
||||||
|
self.fetch_advanced_button.setText(_translate("fetch_reports_tab", "Fetch Selected Reports")) |
||||||
|
self.label_2.setText(_translate("fetch_reports_tab", "Note: Yearly reports cover all available data for one calender year. Only yearly reports are added to the search database.")) |
||||||
|
import Resources_rc |
@ -0,0 +1,801 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>fetch_reports_tab</class> |
||||||
|
<widget class="QWidget" name="fetch_reports_tab"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>1014</width> |
||||||
|
<height>746</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>800</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Fetch Report</string> |
||||||
|
</property> |
||||||
|
<property name="windowIcon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/tab_icons/fetch_reports_icon.png</normaloff>:/ui/resources/tab_icons/fetch_reports_icon.png</iconset> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_4"> |
||||||
|
<property name="mouseTracking"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_35"> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>15</width> |
||||||
|
<height>15</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>16</pointsize> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Fetch All Reports</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_9"> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>0</width> |
||||||
|
<height>60</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_10"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_28"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_12"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>10</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_34"> |
||||||
|
<property name="text"> |
||||||
|
<string>Year</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QDateEdit" name="All_reports_edit_fetch"> |
||||||
|
<property name="dateTime"> |
||||||
|
<datetime> |
||||||
|
<hour>0</hour> |
||||||
|
<minute>0</minute> |
||||||
|
<second>0</second> |
||||||
|
<year>2020</year> |
||||||
|
<month>1</month> |
||||||
|
<day>1</day> |
||||||
|
</datetime> |
||||||
|
</property> |
||||||
|
<property name="displayFormat"> |
||||||
|
<string>yyyy</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="fetch_all_data_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>300</width> |
||||||
|
<height>16777215</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Fetch All Reports</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<spacer name="verticalSpacer"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Vertical</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeType"> |
||||||
|
<enum>QSizePolicy::Minimum</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>20</width> |
||||||
|
<height>45</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="Adv_Fetch_text"> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>16777215</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>16</pointsize> |
||||||
|
<weight>75</weight> |
||||||
|
<italic>false</italic> |
||||||
|
<bold>true</bold> |
||||||
|
<underline>false</underline> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Advanced Fetch Reports</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_5"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_10"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_11"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select Vendors</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="horizontalFrame"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="select_vendors_button_fetch"> |
||||||
|
<property name="text"> |
||||||
|
<string>Select All</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="deselect_vendors_button_fetch"> |
||||||
|
<property name="text"> |
||||||
|
<string>Deselect All</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QListView" name="vendors_list_view_fetch"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="alternatingRowColors"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_11"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_5"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_12"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select Report Types</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="horizontalFrame_2"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_6"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="select_report_types_button_fetch"> |
||||||
|
<property name="text"> |
||||||
|
<string>Select All</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="deselect_report_types_button_fetch"> |
||||||
|
<property name="text"> |
||||||
|
<string>Deselect All</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="report_types_help_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QListView" name="report_types_list_view"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="alternatingRowColors"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_7"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_7"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_14"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_8"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Date Range</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_6"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>0</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>20</number> |
||||||
|
</property> |
||||||
|
<item row="3" column="1"> |
||||||
|
<widget class="QDateEdit" name="end_date_edit_fetch_year"> |
||||||
|
<property name="dateTime"> |
||||||
|
<datetime> |
||||||
|
<hour>0</hour> |
||||||
|
<minute>0</minute> |
||||||
|
<second>0</second> |
||||||
|
<year>2020</year> |
||||||
|
<month>1</month> |
||||||
|
<day>1</day> |
||||||
|
</datetime> |
||||||
|
</property> |
||||||
|
<property name="displayFormat"> |
||||||
|
<string>yyyy</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="2"> |
||||||
|
<widget class="QComboBox" name="begin_month_combo_box"/> |
||||||
|
</item> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QLabel" name="label_9"> |
||||||
|
<property name="text"> |
||||||
|
<string>Begin Date</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="2"> |
||||||
|
<widget class="QComboBox" name="end_month_combo_box"/> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QDateEdit" name="begin_date_edit_fetch_year"> |
||||||
|
<property name="displayFormat"> |
||||||
|
<string>yyyy</string> |
||||||
|
</property> |
||||||
|
<property name="date"> |
||||||
|
<date> |
||||||
|
<year>2020</year> |
||||||
|
<month>1</month> |
||||||
|
<day>1</day> |
||||||
|
</date> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="0"> |
||||||
|
<widget class="QLabel" name="label_10"> |
||||||
|
<property name="text"> |
||||||
|
<string>End Date</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="custom_dir_frame"> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>0</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_26"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>16777215</width> |
||||||
|
<height>16777215</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::NoFrame</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Plain</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_38"> |
||||||
|
<property name="text"> |
||||||
|
<string>Date range is not a calendar year</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="date_range_help_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>16777215</width> |
||||||
|
<height>16777215</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_2"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::NoFrame</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Plain</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label"> |
||||||
|
<property name="text"> |
||||||
|
<string>The date range contains months with no available data</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="date_range_help_button2"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_3"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::NoFrame</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Plain</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_5"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_41"> |
||||||
|
<property name="text"> |
||||||
|
<string>Report(s) will be saved to:</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="date_range_help_button3"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_39"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_7"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLineEdit" name="custom_dir_edit"/> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="custom_dir_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Change</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_13"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout_2"> |
||||||
|
<item row="1" column="1"> |
||||||
|
<widget class="QPushButton" name="fetch_advanced_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Fetch Selected Reports</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_2"> |
||||||
|
<property name="text"> |
||||||
|
<string>Note: Yearly reports cover all available data for one calender year. Only yearly reports are added to the search database.</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<tabstops> |
||||||
|
<tabstop>All_reports_edit_fetch</tabstop> |
||||||
|
<tabstop>fetch_all_data_button</tabstop> |
||||||
|
<tabstop>select_vendors_button_fetch</tabstop> |
||||||
|
<tabstop>deselect_vendors_button_fetch</tabstop> |
||||||
|
<tabstop>vendors_list_view_fetch</tabstop> |
||||||
|
<tabstop>select_report_types_button_fetch</tabstop> |
||||||
|
<tabstop>deselect_report_types_button_fetch</tabstop> |
||||||
|
<tabstop>report_types_help_button</tabstop> |
||||||
|
<tabstop>report_types_list_view</tabstop> |
||||||
|
<tabstop>end_date_edit_fetch_year</tabstop> |
||||||
|
<tabstop>custom_dir_edit</tabstop> |
||||||
|
<tabstop>custom_dir_button</tabstop> |
||||||
|
<tabstop>fetch_advanced_button</tabstop> |
||||||
|
</tabstops> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,360 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'FetchSpecialReportsTab.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.9.2 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
class Ui_fetch_special_reports_tab(object): |
||||||
|
def setupUi(self, fetch_special_reports_tab): |
||||||
|
fetch_special_reports_tab.setObjectName("fetch_special_reports_tab") |
||||||
|
fetch_special_reports_tab.resize(1094, 577) |
||||||
|
fetch_special_reports_tab.setMinimumSize(QtCore.QSize(800, 0)) |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/tab_icons/fetch_special_reports_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
fetch_special_reports_tab.setWindowIcon(icon) |
||||||
|
self.verticalLayout_2 = QtWidgets.QVBoxLayout(fetch_special_reports_tab) |
||||||
|
self.verticalLayout_2.setObjectName("verticalLayout_2") |
||||||
|
self.frame_2 = QtWidgets.QFrame(fetch_special_reports_tab) |
||||||
|
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_2.setObjectName("frame_2") |
||||||
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame_2) |
||||||
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2") |
||||||
|
self.frame_26 = QtWidgets.QFrame(self.frame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_26.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_26.setSizePolicy(sizePolicy) |
||||||
|
self.frame_26.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_26.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_26.setObjectName("frame_26") |
||||||
|
self.verticalLayout_15 = QtWidgets.QVBoxLayout(self.frame_26) |
||||||
|
self.verticalLayout_15.setObjectName("verticalLayout_15") |
||||||
|
self.label_21 = QtWidgets.QLabel(self.frame_26) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_21.setFont(font) |
||||||
|
self.label_21.setObjectName("label_21") |
||||||
|
self.verticalLayout_15.addWidget(self.label_21) |
||||||
|
self.frame_32 = QtWidgets.QFrame(self.frame_26) |
||||||
|
self.frame_32.setObjectName("frame_32") |
||||||
|
self.horizontalLayout_9 = QtWidgets.QHBoxLayout(self.frame_32) |
||||||
|
self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_9.setObjectName("horizontalLayout_9") |
||||||
|
self.select_vendors_button_special = QtWidgets.QPushButton(self.frame_32) |
||||||
|
self.select_vendors_button_special.setObjectName("select_vendors_button_special") |
||||||
|
self.horizontalLayout_9.addWidget(self.select_vendors_button_special) |
||||||
|
self.deselect_vendors_button_special = QtWidgets.QPushButton(self.frame_32) |
||||||
|
self.deselect_vendors_button_special.setObjectName("deselect_vendors_button_special") |
||||||
|
self.horizontalLayout_9.addWidget(self.deselect_vendors_button_special) |
||||||
|
self.verticalLayout_15.addWidget(self.frame_32) |
||||||
|
self.vendors_list_view_special = QtWidgets.QListView(self.frame_26) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
self.vendors_list_view_special.setFont(font) |
||||||
|
self.vendors_list_view_special.setAlternatingRowColors(True) |
||||||
|
self.vendors_list_view_special.setObjectName("vendors_list_view_special") |
||||||
|
self.verticalLayout_15.addWidget(self.vendors_list_view_special) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_26) |
||||||
|
self.frame_25 = QtWidgets.QFrame(self.frame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_25.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_25.setSizePolicy(sizePolicy) |
||||||
|
self.frame_25.setMinimumSize(QtCore.QSize(180, 0)) |
||||||
|
self.frame_25.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_25.setObjectName("frame_25") |
||||||
|
self.verticalLayout_14 = QtWidgets.QVBoxLayout(self.frame_25) |
||||||
|
self.verticalLayout_14.setObjectName("verticalLayout_14") |
||||||
|
self.label_20 = QtWidgets.QLabel(self.frame_25) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.label_20.sizePolicy().hasHeightForWidth()) |
||||||
|
self.label_20.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_20.setFont(font) |
||||||
|
self.label_20.setObjectName("label_20") |
||||||
|
self.verticalLayout_14.addWidget(self.label_20) |
||||||
|
self.frame_30 = QtWidgets.QFrame(self.frame_25) |
||||||
|
self.frame_30.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_30.setObjectName("frame_30") |
||||||
|
self.gridLayout_9 = QtWidgets.QGridLayout(self.frame_30) |
||||||
|
self.gridLayout_9.setObjectName("gridLayout_9") |
||||||
|
self.tr_radio_button = QtWidgets.QRadioButton(self.frame_30) |
||||||
|
self.tr_radio_button.setObjectName("tr_radio_button") |
||||||
|
self.gridLayout_9.addWidget(self.tr_radio_button, 2, 0, 1, 1, QtCore.Qt.AlignHCenter) |
||||||
|
self.pr_radio_button = QtWidgets.QRadioButton(self.frame_30) |
||||||
|
self.pr_radio_button.setChecked(True) |
||||||
|
self.pr_radio_button.setObjectName("pr_radio_button") |
||||||
|
self.gridLayout_9.addWidget(self.pr_radio_button, 0, 0, 1, 1, QtCore.Qt.AlignHCenter) |
||||||
|
self.dr_radio_button = QtWidgets.QRadioButton(self.frame_30) |
||||||
|
self.dr_radio_button.setObjectName("dr_radio_button") |
||||||
|
self.gridLayout_9.addWidget(self.dr_radio_button, 1, 0, 1, 1, QtCore.Qt.AlignHCenter) |
||||||
|
self.ir_radio_button = QtWidgets.QRadioButton(self.frame_30) |
||||||
|
self.ir_radio_button.setObjectName("ir_radio_button") |
||||||
|
self.gridLayout_9.addWidget(self.ir_radio_button, 3, 0, 1, 1, QtCore.Qt.AlignHCenter) |
||||||
|
self.verticalLayout_14.addWidget(self.frame_30) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_25) |
||||||
|
self.frame_27 = QtWidgets.QFrame(self.frame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_27.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_27.setSizePolicy(sizePolicy) |
||||||
|
self.frame_27.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_27.setObjectName("frame_27") |
||||||
|
self.verticalLayout_16 = QtWidgets.QVBoxLayout(self.frame_27) |
||||||
|
self.verticalLayout_16.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.verticalLayout_16.setObjectName("verticalLayout_16") |
||||||
|
self.frame_15 = QtWidgets.QFrame(self.frame_27) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.MinimumExpanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_15.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_15.setSizePolicy(sizePolicy) |
||||||
|
self.frame_15.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_15.setObjectName("frame_15") |
||||||
|
self.verticalLayout_22 = QtWidgets.QVBoxLayout(self.frame_15) |
||||||
|
self.verticalLayout_22.setObjectName("verticalLayout_22") |
||||||
|
self.frame_3 = QtWidgets.QFrame(self.frame_15) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_3.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_3.setSizePolicy(sizePolicy) |
||||||
|
self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) |
||||||
|
self.frame_3.setObjectName("frame_3") |
||||||
|
self.horizontalLayout = QtWidgets.QHBoxLayout(self.frame_3) |
||||||
|
self.horizontalLayout.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout.setObjectName("horizontalLayout") |
||||||
|
self.label_14 = QtWidgets.QLabel(self.frame_3) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.label_14.sizePolicy().hasHeightForWidth()) |
||||||
|
self.label_14.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_14.setFont(font) |
||||||
|
self.label_14.setObjectName("label_14") |
||||||
|
self.horizontalLayout.addWidget(self.label_14) |
||||||
|
self.options_help_button = QtWidgets.QPushButton(self.frame_3) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.options_help_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.options_help_button.setSizePolicy(sizePolicy) |
||||||
|
icon1 = QtGui.QIcon() |
||||||
|
icon1.addPixmap(QtGui.QPixmap(":/ui/resources/help_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.options_help_button.setIcon(icon1) |
||||||
|
self.options_help_button.setObjectName("options_help_button") |
||||||
|
self.horizontalLayout.addWidget(self.options_help_button) |
||||||
|
self.verticalLayout_22.addWidget(self.frame_3) |
||||||
|
self.options_frame = QtWidgets.QFrame(self.frame_15) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.options_frame.sizePolicy().hasHeightForWidth()) |
||||||
|
self.options_frame.setSizePolicy(sizePolicy) |
||||||
|
self.options_frame.setMinimumSize(QtCore.QSize(0, 0)) |
||||||
|
self.options_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.options_frame.setObjectName("options_frame") |
||||||
|
self.gridLayout_6 = QtWidgets.QGridLayout(self.options_frame) |
||||||
|
self.gridLayout_6.setObjectName("gridLayout_6") |
||||||
|
self.verticalLayout_22.addWidget(self.options_frame) |
||||||
|
self.verticalLayout_16.addWidget(self.frame_15) |
||||||
|
self.frame_16 = QtWidgets.QFrame(self.frame_27) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.MinimumExpanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_16.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_16.setSizePolicy(sizePolicy) |
||||||
|
self.frame_16.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_16.setObjectName("frame_16") |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame_16) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.frame_4 = QtWidgets.QFrame(self.frame_16) |
||||||
|
self.frame_4.setFrameShape(QtWidgets.QFrame.NoFrame) |
||||||
|
self.frame_4.setFrameShadow(QtWidgets.QFrame.Plain) |
||||||
|
self.frame_4.setObjectName("frame_4") |
||||||
|
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_4) |
||||||
|
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_3.setSpacing(0) |
||||||
|
self.horizontalLayout_3.setObjectName("horizontalLayout_3") |
||||||
|
self.label_15 = QtWidgets.QLabel(self.frame_4) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.label_15.sizePolicy().hasHeightForWidth()) |
||||||
|
self.label_15.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_15.setFont(font) |
||||||
|
self.label_15.setObjectName("label_15") |
||||||
|
self.horizontalLayout_3.addWidget(self.label_15) |
||||||
|
self.date_range_help_button = QtWidgets.QPushButton(self.frame_4) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.date_range_help_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.date_range_help_button.setSizePolicy(sizePolicy) |
||||||
|
self.date_range_help_button.setText("") |
||||||
|
self.date_range_help_button.setIcon(icon1) |
||||||
|
self.date_range_help_button.setObjectName("date_range_help_button") |
||||||
|
self.horizontalLayout_3.addWidget(self.date_range_help_button) |
||||||
|
self.verticalLayout.addWidget(self.frame_4) |
||||||
|
self.frame = QtWidgets.QFrame(self.frame_16) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame.setSizePolicy(sizePolicy) |
||||||
|
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.gridLayout_2 = QtWidgets.QGridLayout(self.frame) |
||||||
|
self.gridLayout_2.setSpacing(20) |
||||||
|
self.gridLayout_2.setObjectName("gridLayout_2") |
||||||
|
self.label_25 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_25.setObjectName("label_25") |
||||||
|
self.gridLayout_2.addWidget(self.label_25, 1, 0, 1, 1) |
||||||
|
self.begin_date_edit_special_year = QtWidgets.QDateEdit(self.frame) |
||||||
|
self.begin_date_edit_special_year.setDateTime(QtCore.QDateTime(QtCore.QDate(2020, 1, 1), QtCore.QTime(0, 0, 0))) |
||||||
|
self.begin_date_edit_special_year.setObjectName("begin_date_edit_special_year") |
||||||
|
self.gridLayout_2.addWidget(self.begin_date_edit_special_year, 0, 1, 1, 1) |
||||||
|
self.label_24 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_24.setObjectName("label_24") |
||||||
|
self.gridLayout_2.addWidget(self.label_24, 0, 0, 1, 1) |
||||||
|
self.end_date_edit_special_year = QtWidgets.QDateEdit(self.frame) |
||||||
|
self.end_date_edit_special_year.setDateTime(QtCore.QDateTime(QtCore.QDate(2020, 1, 1), QtCore.QTime(0, 0, 0))) |
||||||
|
self.end_date_edit_special_year.setObjectName("end_date_edit_special_year") |
||||||
|
self.gridLayout_2.addWidget(self.end_date_edit_special_year, 1, 1, 1, 1) |
||||||
|
self.begin_month_combo_box = QtWidgets.QComboBox(self.frame) |
||||||
|
self.begin_month_combo_box.setObjectName("begin_month_combo_box") |
||||||
|
self.gridLayout_2.addWidget(self.begin_month_combo_box, 0, 2, 1, 1) |
||||||
|
self.end_month_combo_box = QtWidgets.QComboBox(self.frame) |
||||||
|
self.end_month_combo_box.setObjectName("end_month_combo_box") |
||||||
|
self.gridLayout_2.addWidget(self.end_month_combo_box, 1, 2, 1, 1) |
||||||
|
self.verticalLayout.addWidget(self.frame) |
||||||
|
self.custom_dir_frame = QtWidgets.QFrame(self.frame_16) |
||||||
|
self.custom_dir_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.custom_dir_frame.setObjectName("custom_dir_frame") |
||||||
|
self.verticalLayout_26 = QtWidgets.QVBoxLayout(self.custom_dir_frame) |
||||||
|
self.verticalLayout_26.setObjectName("verticalLayout_26") |
||||||
|
self.frame_5 = QtWidgets.QFrame(self.custom_dir_frame) |
||||||
|
self.frame_5.setFrameShape(QtWidgets.QFrame.NoFrame) |
||||||
|
self.frame_5.setFrameShadow(QtWidgets.QFrame.Plain) |
||||||
|
self.frame_5.setObjectName("frame_5") |
||||||
|
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.frame_5) |
||||||
|
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_4.setSpacing(0) |
||||||
|
self.horizontalLayout_4.setObjectName("horizontalLayout_4") |
||||||
|
self.label_41 = QtWidgets.QLabel(self.frame_5) |
||||||
|
self.label_41.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.label_41.setObjectName("label_41") |
||||||
|
self.horizontalLayout_4.addWidget(self.label_41) |
||||||
|
self.custom_dir_help_button = QtWidgets.QPushButton(self.frame_5) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.custom_dir_help_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.custom_dir_help_button.setSizePolicy(sizePolicy) |
||||||
|
self.custom_dir_help_button.setText("") |
||||||
|
self.custom_dir_help_button.setIcon(icon1) |
||||||
|
self.custom_dir_help_button.setObjectName("custom_dir_help_button") |
||||||
|
self.horizontalLayout_4.addWidget(self.custom_dir_help_button) |
||||||
|
self.verticalLayout_26.addWidget(self.frame_5) |
||||||
|
self.frame_39 = QtWidgets.QFrame(self.custom_dir_frame) |
||||||
|
self.frame_39.setObjectName("frame_39") |
||||||
|
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.frame_39) |
||||||
|
self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_7.setObjectName("horizontalLayout_7") |
||||||
|
self.custom_dir_edit = QtWidgets.QLineEdit(self.frame_39) |
||||||
|
self.custom_dir_edit.setObjectName("custom_dir_edit") |
||||||
|
self.horizontalLayout_7.addWidget(self.custom_dir_edit) |
||||||
|
self.custom_dir_button = QtWidgets.QPushButton(self.frame_39) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.custom_dir_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.custom_dir_button.setSizePolicy(sizePolicy) |
||||||
|
self.custom_dir_button.setObjectName("custom_dir_button") |
||||||
|
self.horizontalLayout_7.addWidget(self.custom_dir_button) |
||||||
|
self.verticalLayout_26.addWidget(self.frame_39) |
||||||
|
self.verticalLayout.addWidget(self.custom_dir_frame) |
||||||
|
self.verticalLayout_16.addWidget(self.frame_16) |
||||||
|
self.frame_29 = QtWidgets.QFrame(self.frame_27) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.MinimumExpanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_29.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_29.setSizePolicy(sizePolicy) |
||||||
|
self.frame_29.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_29.setObjectName("frame_29") |
||||||
|
self.gridLayout_8 = QtWidgets.QGridLayout(self.frame_29) |
||||||
|
self.gridLayout_8.setObjectName("gridLayout_8") |
||||||
|
self.fetch_special_data_button = QtWidgets.QPushButton(self.frame_29) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.fetch_special_data_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.fetch_special_data_button.setSizePolicy(sizePolicy) |
||||||
|
self.fetch_special_data_button.setMaximumSize(QtCore.QSize(180, 16777215)) |
||||||
|
self.fetch_special_data_button.setObjectName("fetch_special_data_button") |
||||||
|
self.gridLayout_8.addWidget(self.fetch_special_data_button, 0, 0, 1, 1) |
||||||
|
self.verticalLayout_16.addWidget(self.frame_29) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_27) |
||||||
|
self.verticalLayout_2.addWidget(self.frame_2) |
||||||
|
self.label = QtWidgets.QLabel(fetch_special_reports_tab) |
||||||
|
self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) |
||||||
|
self.label.setObjectName("label") |
||||||
|
self.verticalLayout_2.addWidget(self.label) |
||||||
|
|
||||||
|
self.retranslateUi(fetch_special_reports_tab) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(fetch_special_reports_tab) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.select_vendors_button_special, self.deselect_vendors_button_special) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.deselect_vendors_button_special, self.vendors_list_view_special) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.vendors_list_view_special, self.pr_radio_button) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.pr_radio_button, self.dr_radio_button) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.dr_radio_button, self.tr_radio_button) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.tr_radio_button, self.ir_radio_button) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.ir_radio_button, self.options_frame) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.options_frame, self.begin_date_edit_special_year) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.begin_date_edit_special_year, self.end_date_edit_special_year) |
||||||
|
fetch_special_reports_tab.setTabOrder(self.end_date_edit_special_year, self.fetch_special_data_button) |
||||||
|
|
||||||
|
def retranslateUi(self, fetch_special_reports_tab): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
fetch_special_reports_tab.setWindowTitle(_translate("fetch_special_reports_tab", "Fetch Special Reports")) |
||||||
|
self.label_21.setText(_translate("fetch_special_reports_tab", "Select Vendors")) |
||||||
|
self.select_vendors_button_special.setText(_translate("fetch_special_reports_tab", "Select All")) |
||||||
|
self.deselect_vendors_button_special.setText(_translate("fetch_special_reports_tab", "Deselect All")) |
||||||
|
self.label_20.setText(_translate("fetch_special_reports_tab", "Select Report Type")) |
||||||
|
self.tr_radio_button.setText(_translate("fetch_special_reports_tab", "TR")) |
||||||
|
self.pr_radio_button.setText(_translate("fetch_special_reports_tab", "PR")) |
||||||
|
self.dr_radio_button.setText(_translate("fetch_special_reports_tab", "DR")) |
||||||
|
self.ir_radio_button.setText(_translate("fetch_special_reports_tab", "IR")) |
||||||
|
self.label_14.setText(_translate("fetch_special_reports_tab", "Options")) |
||||||
|
self.label_15.setText(_translate("fetch_special_reports_tab", "Date Range")) |
||||||
|
self.label_25.setText(_translate("fetch_special_reports_tab", "End Date")) |
||||||
|
self.begin_date_edit_special_year.setDisplayFormat(_translate("fetch_special_reports_tab", "yyyy")) |
||||||
|
self.label_24.setText(_translate("fetch_special_reports_tab", "Begin Date")) |
||||||
|
self.end_date_edit_special_year.setDisplayFormat(_translate("fetch_special_reports_tab", "yyyy")) |
||||||
|
self.label_41.setText(_translate("fetch_special_reports_tab", "Report(s) will be saved to:")) |
||||||
|
self.custom_dir_button.setText(_translate("fetch_special_reports_tab", "Change")) |
||||||
|
self.fetch_special_data_button.setText(_translate("fetch_special_reports_tab", "Fetch Special Report")) |
||||||
|
self.label.setText(_translate("fetch_special_reports_tab", "Note: Special reports are not added to the search database.")) |
||||||
|
|
||||||
|
import Resources_rc |
@ -0,0 +1,633 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>fetch_special_reports_tab</class> |
||||||
|
<widget class="QWidget" name="fetch_special_reports_tab"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>1094</width> |
||||||
|
<height>577</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>800</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Fetch Special Reports</string> |
||||||
|
</property> |
||||||
|
<property name="windowIcon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/tab_icons/fetch_special_reports_icon.png</normaloff>:/ui/resources/tab_icons/fetch_special_reports_icon.png</iconset> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_2"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_26"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_15"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_21"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select Vendors</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_32"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_9"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="select_vendors_button_special"> |
||||||
|
<property name="text"> |
||||||
|
<string>Select All</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="deselect_vendors_button_special"> |
||||||
|
<property name="text"> |
||||||
|
<string>Deselect All</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QListView" name="vendors_list_view_special"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="alternatingRowColors"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_25"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>180</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_14"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_20"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select Report Type</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_30"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout_9"> |
||||||
|
<item row="2" column="0" alignment="Qt::AlignHCenter"> |
||||||
|
<widget class="QRadioButton" name="tr_radio_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>TR</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="0" alignment="Qt::AlignHCenter"> |
||||||
|
<widget class="QRadioButton" name="pr_radio_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>PR</string> |
||||||
|
</property> |
||||||
|
<property name="checked"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="0" alignment="Qt::AlignHCenter"> |
||||||
|
<widget class="QRadioButton" name="dr_radio_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>DR</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="3" column="0" alignment="Qt::AlignHCenter"> |
||||||
|
<widget class="QRadioButton" name="ir_radio_button"> |
||||||
|
<property name="text"> |
||||||
|
<string>IR</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_27"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_16"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_15"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_22"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_3"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Raised</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_14"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Options</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="options_help_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="options_frame"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>0</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout_6"/> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_16"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_4"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::NoFrame</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Plain</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_15"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Date Range</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="date_range_help_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout_2"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>20</number> |
||||||
|
</property> |
||||||
|
<item row="1" column="0"> |
||||||
|
<widget class="QLabel" name="label_25"> |
||||||
|
<property name="text"> |
||||||
|
<string>End Date</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QDateEdit" name="begin_date_edit_special_year"> |
||||||
|
<property name="dateTime"> |
||||||
|
<datetime> |
||||||
|
<hour>0</hour> |
||||||
|
<minute>0</minute> |
||||||
|
<second>0</second> |
||||||
|
<year>2020</year> |
||||||
|
<month>1</month> |
||||||
|
<day>1</day> |
||||||
|
</datetime> |
||||||
|
</property> |
||||||
|
<property name="displayFormat"> |
||||||
|
<string>yyyy</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QLabel" name="label_24"> |
||||||
|
<property name="text"> |
||||||
|
<string>Begin Date</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="1"> |
||||||
|
<widget class="QDateEdit" name="end_date_edit_special_year"> |
||||||
|
<property name="dateTime"> |
||||||
|
<datetime> |
||||||
|
<hour>0</hour> |
||||||
|
<minute>0</minute> |
||||||
|
<second>0</second> |
||||||
|
<year>2020</year> |
||||||
|
<month>1</month> |
||||||
|
<day>1</day> |
||||||
|
</datetime> |
||||||
|
</property> |
||||||
|
<property name="displayFormat"> |
||||||
|
<string>yyyy</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="2"> |
||||||
|
<widget class="QComboBox" name="begin_month_combo_box"/> |
||||||
|
</item> |
||||||
|
<item row="1" column="2"> |
||||||
|
<widget class="QComboBox" name="end_month_combo_box"/> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="custom_dir_frame"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_26"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_5"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::NoFrame</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Plain</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_41"> |
||||||
|
<property name="text"> |
||||||
|
<string>Report(s) will be saved to:</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="custom_dir_help_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_39"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_7"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLineEdit" name="custom_dir_edit"/> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="custom_dir_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Change</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_29"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout_8"> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QPushButton" name="fetch_special_data_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>180</width> |
||||||
|
<height>16777215</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Fetch Special Report</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Note: Special reports are not added to the search database.</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<tabstops> |
||||||
|
<tabstop>select_vendors_button_special</tabstop> |
||||||
|
<tabstop>deselect_vendors_button_special</tabstop> |
||||||
|
<tabstop>vendors_list_view_special</tabstop> |
||||||
|
<tabstop>pr_radio_button</tabstop> |
||||||
|
<tabstop>dr_radio_button</tabstop> |
||||||
|
<tabstop>tr_radio_button</tabstop> |
||||||
|
<tabstop>ir_radio_button</tabstop> |
||||||
|
<tabstop>options_frame</tabstop> |
||||||
|
<tabstop>begin_date_edit_special_year</tabstop> |
||||||
|
<tabstop>end_date_edit_special_year</tabstop> |
||||||
|
<tabstop>fetch_special_data_button</tabstop> |
||||||
|
</tabstops> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,208 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'ImportReportTab.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.9.2 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
class Ui_import_report_tab(object): |
||||||
|
def setupUi(self, import_report_tab): |
||||||
|
import_report_tab.setObjectName("import_report_tab") |
||||||
|
import_report_tab.resize(1008, 530) |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/tab_icons/import_report_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
import_report_tab.setWindowIcon(icon) |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(import_report_tab) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.frame = QtWidgets.QFrame(import_report_tab) |
||||||
|
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame) |
||||||
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2") |
||||||
|
self.frame_21 = QtWidgets.QFrame(self.frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_21.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_21.setSizePolicy(sizePolicy) |
||||||
|
self.frame_21.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_21.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_21.setObjectName("frame_21") |
||||||
|
self.verticalLayout_12 = QtWidgets.QVBoxLayout(self.frame_21) |
||||||
|
self.verticalLayout_12.setObjectName("verticalLayout_12") |
||||||
|
self.label_18 = QtWidgets.QLabel(self.frame_21) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_18.setFont(font) |
||||||
|
self.label_18.setObjectName("label_18") |
||||||
|
self.verticalLayout_12.addWidget(self.label_18) |
||||||
|
self.vendors_list_view_import = QtWidgets.QListView(self.frame_21) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
self.vendors_list_view_import.setFont(font) |
||||||
|
self.vendors_list_view_import.setAlternatingRowColors(True) |
||||||
|
self.vendors_list_view_import.setObjectName("vendors_list_view_import") |
||||||
|
self.verticalLayout_12.addWidget(self.vendors_list_view_import) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_21) |
||||||
|
self.frame_20 = QtWidgets.QFrame(self.frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_20.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_20.setSizePolicy(sizePolicy) |
||||||
|
self.frame_20.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_20.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_20.setObjectName("frame_20") |
||||||
|
self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.frame_20) |
||||||
|
self.verticalLayout_11.setObjectName("verticalLayout_11") |
||||||
|
self.label_17 = QtWidgets.QLabel(self.frame_20) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_17.setFont(font) |
||||||
|
self.label_17.setObjectName("label_17") |
||||||
|
self.verticalLayout_11.addWidget(self.label_17) |
||||||
|
self.report_types_list_view_import = QtWidgets.QListView(self.frame_20) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
self.report_types_list_view_import.setFont(font) |
||||||
|
self.report_types_list_view_import.setAlternatingRowColors(True) |
||||||
|
self.report_types_list_view_import.setObjectName("report_types_list_view_import") |
||||||
|
self.verticalLayout_11.addWidget(self.report_types_list_view_import) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_20) |
||||||
|
self.frame_22 = QtWidgets.QFrame(self.frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_22.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_22.setSizePolicy(sizePolicy) |
||||||
|
self.frame_22.setMinimumSize(QtCore.QSize(200, 0)) |
||||||
|
self.frame_22.setObjectName("frame_22") |
||||||
|
self.verticalLayout_13 = QtWidgets.QVBoxLayout(self.frame_22) |
||||||
|
self.verticalLayout_13.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.verticalLayout_13.setObjectName("verticalLayout_13") |
||||||
|
self.frame_17 = QtWidgets.QFrame(self.frame_22) |
||||||
|
self.frame_17.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_17.setObjectName("frame_17") |
||||||
|
self.verticalLayout_24 = QtWidgets.QVBoxLayout(self.frame_17) |
||||||
|
self.verticalLayout_24.setObjectName("verticalLayout_24") |
||||||
|
self.label_16 = QtWidgets.QLabel(self.frame_17) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.label_16.sizePolicy().hasHeightForWidth()) |
||||||
|
self.label_16.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_16.setFont(font) |
||||||
|
self.label_16.setObjectName("label_16") |
||||||
|
self.verticalLayout_24.addWidget(self.label_16) |
||||||
|
self.frame_19 = QtWidgets.QFrame(self.frame_17) |
||||||
|
self.frame_19.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_19.setObjectName("frame_19") |
||||||
|
self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.frame_19) |
||||||
|
self.horizontalLayout_13.setObjectName("horizontalLayout_13") |
||||||
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) |
||||||
|
self.horizontalLayout_13.addItem(spacerItem) |
||||||
|
self.label_19 = QtWidgets.QLabel(self.frame_19) |
||||||
|
self.label_19.setMinimumSize(QtCore.QSize(100, 0)) |
||||||
|
self.label_19.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) |
||||||
|
self.label_19.setObjectName("label_19") |
||||||
|
self.horizontalLayout_13.addWidget(self.label_19) |
||||||
|
self.report_year_date_edit = QtWidgets.QDateEdit(self.frame_19) |
||||||
|
self.report_year_date_edit.setObjectName("report_year_date_edit") |
||||||
|
self.horizontalLayout_13.addWidget(self.report_year_date_edit) |
||||||
|
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) |
||||||
|
self.horizontalLayout_13.addItem(spacerItem1) |
||||||
|
self.verticalLayout_24.addWidget(self.frame_19) |
||||||
|
self.verticalLayout_13.addWidget(self.frame_17) |
||||||
|
self.frame_18 = QtWidgets.QFrame(self.frame_22) |
||||||
|
self.frame_18.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_18.setObjectName("frame_18") |
||||||
|
self.verticalLayout_25 = QtWidgets.QVBoxLayout(self.frame_18) |
||||||
|
self.verticalLayout_25.setObjectName("verticalLayout_25") |
||||||
|
self.label_36 = QtWidgets.QLabel(self.frame_18) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.label_36.sizePolicy().hasHeightForWidth()) |
||||||
|
self.label_36.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_36.setFont(font) |
||||||
|
self.label_36.setObjectName("label_36") |
||||||
|
self.verticalLayout_25.addWidget(self.label_36) |
||||||
|
self.frame_38 = QtWidgets.QFrame(self.frame_18) |
||||||
|
self.frame_38.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_38.setObjectName("frame_38") |
||||||
|
self.horizontalLayout_15 = QtWidgets.QHBoxLayout(self.frame_38) |
||||||
|
self.horizontalLayout_15.setObjectName("horizontalLayout_15") |
||||||
|
self.select_file_button = QtWidgets.QPushButton(self.frame_38) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.select_file_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.select_file_button.setSizePolicy(sizePolicy) |
||||||
|
self.select_file_button.setObjectName("select_file_button") |
||||||
|
self.horizontalLayout_15.addWidget(self.select_file_button) |
||||||
|
self.selected_file_edit = QtWidgets.QLineEdit(self.frame_38) |
||||||
|
self.selected_file_edit.setReadOnly(True) |
||||||
|
self.selected_file_edit.setObjectName("selected_file_edit") |
||||||
|
self.horizontalLayout_15.addWidget(self.selected_file_edit) |
||||||
|
self.verticalLayout_25.addWidget(self.frame_38) |
||||||
|
self.verticalLayout_13.addWidget(self.frame_18) |
||||||
|
self.frame_24 = QtWidgets.QFrame(self.frame_22) |
||||||
|
self.frame_24.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_24.setObjectName("frame_24") |
||||||
|
self.gridLayout_7 = QtWidgets.QGridLayout(self.frame_24) |
||||||
|
self.gridLayout_7.setObjectName("gridLayout_7") |
||||||
|
self.import_report_button = QtWidgets.QPushButton(self.frame_24) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.import_report_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.import_report_button.setSizePolicy(sizePolicy) |
||||||
|
self.import_report_button.setMaximumSize(QtCore.QSize(180, 16777215)) |
||||||
|
self.import_report_button.setObjectName("import_report_button") |
||||||
|
self.gridLayout_7.addWidget(self.import_report_button, 0, 0, 1, 1) |
||||||
|
self.verticalLayout_13.addWidget(self.frame_24) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_22) |
||||||
|
self.verticalLayout.addWidget(self.frame) |
||||||
|
self.label = QtWidgets.QLabel(import_report_tab) |
||||||
|
self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) |
||||||
|
self.label.setObjectName("label") |
||||||
|
self.verticalLayout.addWidget(self.label) |
||||||
|
|
||||||
|
self.retranslateUi(import_report_tab) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(import_report_tab) |
||||||
|
import_report_tab.setTabOrder(self.vendors_list_view_import, self.report_types_list_view_import) |
||||||
|
import_report_tab.setTabOrder(self.report_types_list_view_import, self.report_year_date_edit) |
||||||
|
import_report_tab.setTabOrder(self.report_year_date_edit, self.selected_file_edit) |
||||||
|
import_report_tab.setTabOrder(self.selected_file_edit, self.import_report_button) |
||||||
|
|
||||||
|
def retranslateUi(self, import_report_tab): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
import_report_tab.setWindowTitle(_translate("import_report_tab", "Import Report")) |
||||||
|
self.label_18.setText(_translate("import_report_tab", "Select Vendor")) |
||||||
|
self.label_17.setText(_translate("import_report_tab", "Select Report Type")) |
||||||
|
self.label_16.setText(_translate("import_report_tab", "Date")) |
||||||
|
self.label_19.setText(_translate("import_report_tab", "Report Year")) |
||||||
|
self.report_year_date_edit.setDisplayFormat(_translate("import_report_tab", "yyyy")) |
||||||
|
self.label_36.setText(_translate("import_report_tab", "Target Report File")) |
||||||
|
self.select_file_button.setText(_translate("import_report_tab", "Select File")) |
||||||
|
self.import_report_button.setText(_translate("import_report_tab", "Import Selected Report")) |
||||||
|
self.label.setText(_translate("import_report_tab", "Note: Only yearly reports (all available data for one calender year) should be imported. Imported reports are added to the search database.")) |
||||||
|
|
||||||
|
import Resources_rc |
@ -0,0 +1,352 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>import_report_tab</class> |
||||||
|
<widget class="QWidget" name="import_report_tab"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>1008</width> |
||||||
|
<height>530</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Import Report</string> |
||||||
|
</property> |
||||||
|
<property name="windowIcon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/tab_icons/import_report_icon.png</normaloff>:/ui/resources/tab_icons/import_report_icon.png</iconset> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_21"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_12"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_18"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select Vendor</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QListView" name="vendors_list_view_import"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="alternatingRowColors"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_20"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_11"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_17"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select Report Type</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QListView" name="report_types_list_view_import"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="alternatingRowColors"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_22"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>200</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_13"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_17"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_24"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_16"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Date</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_19"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_13"> |
||||||
|
<item> |
||||||
|
<spacer name="horizontalSpacer"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>40</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_19"> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>100</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Report Year</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QDateEdit" name="report_year_date_edit"> |
||||||
|
<property name="displayFormat"> |
||||||
|
<string>yyyy</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<spacer name="horizontalSpacer_2"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>40</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_18"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_25"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_36"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Target Report File</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_38"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_15"> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="select_file_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select File</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLineEdit" name="selected_file_edit"> |
||||||
|
<property name="readOnly"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_24"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout_7"> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QPushButton" name="import_report_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>180</width> |
||||||
|
<height>16777215</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Import Selected Report</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Note: Only yearly reports (all available data for one calender year) should be imported. Imported reports are added to the search database.</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<tabstops> |
||||||
|
<tabstop>vendors_list_view_import</tabstop> |
||||||
|
<tabstop>report_types_list_view_import</tabstop> |
||||||
|
<tabstop>report_year_date_edit</tabstop> |
||||||
|
<tabstop>selected_file_edit</tabstop> |
||||||
|
<tabstop>import_report_button</tabstop> |
||||||
|
</tabstops> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,58 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'MainWindow.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.12.3 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_mainWindow(object): |
||||||
|
def setupUi(self, mainWindow): |
||||||
|
mainWindow.setObjectName("mainWindow") |
||||||
|
mainWindow.resize(1200, 721) |
||||||
|
mainWindow.setMinimumSize(QtCore.QSize(1200, 640)) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
mainWindow.setFont(font) |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/main_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
mainWindow.setWindowIcon(icon) |
||||||
|
self.centralwidget = QtWidgets.QWidget(mainWindow) |
||||||
|
self.centralwidget.setObjectName("centralwidget") |
||||||
|
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) |
||||||
|
self.gridLayout.setContentsMargins(-1, -1, -1, 0) |
||||||
|
self.gridLayout.setObjectName("gridLayout") |
||||||
|
self.tab_widget = QtWidgets.QTabWidget(self.centralwidget) |
||||||
|
self.tab_widget.setEnabled(True) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.tab_widget.sizePolicy().hasHeightForWidth()) |
||||||
|
self.tab_widget.setSizePolicy(sizePolicy) |
||||||
|
self.tab_widget.setMaximumSize(QtCore.QSize(16777215, 16777215)) |
||||||
|
self.tab_widget.setTabPosition(QtWidgets.QTabWidget.North) |
||||||
|
self.tab_widget.setElideMode(QtCore.Qt.ElideNone) |
||||||
|
self.tab_widget.setObjectName("tab_widget") |
||||||
|
self.gridLayout.addWidget(self.tab_widget, 1, 0, 1, 1) |
||||||
|
mainWindow.setCentralWidget(self.centralwidget) |
||||||
|
self.menubar = QtWidgets.QMenuBar(mainWindow) |
||||||
|
self.menubar.setGeometry(QtCore.QRect(0, 0, 1200, 21)) |
||||||
|
self.menubar.setObjectName("menubar") |
||||||
|
mainWindow.setMenuBar(self.menubar) |
||||||
|
self.statusbar = QtWidgets.QStatusBar(mainWindow) |
||||||
|
self.statusbar.setObjectName("statusbar") |
||||||
|
mainWindow.setStatusBar(self.statusbar) |
||||||
|
|
||||||
|
self.retranslateUi(mainWindow) |
||||||
|
self.tab_widget.setCurrentIndex(-1) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(mainWindow) |
||||||
|
|
||||||
|
def retranslateUi(self, mainWindow): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
mainWindow.setWindowTitle(_translate("mainWindow", "COUNTER 5 Report Tool")) |
||||||
|
import Resources_rc |
@ -0,0 +1,83 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>mainWindow</class> |
||||||
|
<widget class="QMainWindow" name="mainWindow"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>1200</width> |
||||||
|
<height>721</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>1200</width> |
||||||
|
<height>640</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>COUNTER 5 Report Tool</string> |
||||||
|
</property> |
||||||
|
<property name="windowIcon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/main_icon.png</normaloff>:/ui/resources/main_icon.png</iconset> |
||||||
|
</property> |
||||||
|
<widget class="QWidget" name="centralwidget"> |
||||||
|
<layout class="QGridLayout" name="gridLayout"> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item row="1" column="0"> |
||||||
|
<widget class="QTabWidget" name="tab_widget"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>16777215</width> |
||||||
|
<height>16777215</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="tabPosition"> |
||||||
|
<enum>QTabWidget::North</enum> |
||||||
|
</property> |
||||||
|
<property name="currentIndex"> |
||||||
|
<number>-1</number> |
||||||
|
</property> |
||||||
|
<property name="elideMode"> |
||||||
|
<enum>Qt::ElideNone</enum> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<widget class="QMenuBar" name="menubar"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>1200</width> |
||||||
|
<height>21</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
<widget class="QStatusBar" name="statusbar"/> |
||||||
|
</widget> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,262 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'ManageVendorsTab.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.12.3 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_manage_vendors_tab(object): |
||||||
|
def setupUi(self, manage_vendors_tab): |
||||||
|
manage_vendors_tab.setObjectName("manage_vendors_tab") |
||||||
|
manage_vendors_tab.resize(807, 642) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
manage_vendors_tab.setFont(font) |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/tab_icons/manage_vendors_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
manage_vendors_tab.setWindowIcon(icon) |
||||||
|
self.horizontalLayout = QtWidgets.QHBoxLayout(manage_vendors_tab) |
||||||
|
self.horizontalLayout.setObjectName("horizontalLayout") |
||||||
|
self.frame_12 = QtWidgets.QFrame(manage_vendors_tab) |
||||||
|
self.frame_12.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_12.setObjectName("frame_12") |
||||||
|
self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.frame_12) |
||||||
|
self.verticalLayout_6.setObjectName("verticalLayout_6") |
||||||
|
self.label_13 = QtWidgets.QLabel(self.frame_12) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_13.setFont(font) |
||||||
|
self.label_13.setObjectName("label_13") |
||||||
|
self.verticalLayout_6.addWidget(self.label_13) |
||||||
|
self.vendorsListView = QtWidgets.QListView(self.frame_12) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
self.vendorsListView.setFont(font) |
||||||
|
self.vendorsListView.setAlternatingRowColors(True) |
||||||
|
self.vendorsListView.setObjectName("vendorsListView") |
||||||
|
self.verticalLayout_6.addWidget(self.vendorsListView) |
||||||
|
self.frame_2 = QtWidgets.QFrame(self.frame_12) |
||||||
|
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame_2.setObjectName("frame_2") |
||||||
|
self.gridLayout_3 = QtWidgets.QGridLayout(self.frame_2) |
||||||
|
self.gridLayout_3.setObjectName("gridLayout_3") |
||||||
|
self.importVendorsButton = QtWidgets.QPushButton(self.frame_2) |
||||||
|
icon1 = QtGui.QIcon() |
||||||
|
icon1.addPixmap(QtGui.QPixmap(":/ui/resources/import_vendors_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.importVendorsButton.setIcon(icon1) |
||||||
|
self.importVendorsButton.setObjectName("importVendorsButton") |
||||||
|
self.gridLayout_3.addWidget(self.importVendorsButton, 0, 1, 1, 1) |
||||||
|
self.addVendorButton = QtWidgets.QPushButton(self.frame_2) |
||||||
|
icon2 = QtGui.QIcon() |
||||||
|
icon2.addPixmap(QtGui.QPixmap(":/ui/resources/add_vendor_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.addVendorButton.setIcon(icon2) |
||||||
|
self.addVendorButton.setObjectName("addVendorButton") |
||||||
|
self.gridLayout_3.addWidget(self.addVendorButton, 0, 0, 1, 1) |
||||||
|
self.exportVendorsButton = QtWidgets.QPushButton(self.frame_2) |
||||||
|
icon3 = QtGui.QIcon() |
||||||
|
icon3.addPixmap(QtGui.QPixmap(":/ui/resources/export_vendors_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.exportVendorsButton.setIcon(icon3) |
||||||
|
self.exportVendorsButton.setObjectName("exportVendorsButton") |
||||||
|
self.gridLayout_3.addWidget(self.exportVendorsButton, 0, 2, 1, 1) |
||||||
|
self.verticalLayout_6.addWidget(self.frame_2) |
||||||
|
self.horizontalLayout.addWidget(self.frame_12) |
||||||
|
self.frame_8 = QtWidgets.QFrame(manage_vendors_tab) |
||||||
|
self.frame_8.setObjectName("frame_8") |
||||||
|
self.horizontalLayout_2 = QtWidgets.QVBoxLayout(self.frame_8) |
||||||
|
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2") |
||||||
|
self.frame = QtWidgets.QFrame(self.frame_8) |
||||||
|
self.frame.setEnabled(True) |
||||||
|
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.label_7 = QtWidgets.QLabel(self.frame) |
||||||
|
self.label_7.setEnabled(True) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setFamily("Segoe UI") |
||||||
|
font.setPointSize(11) |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.label_7.setFont(font) |
||||||
|
self.label_7.setFrameShape(QtWidgets.QFrame.NoFrame) |
||||||
|
self.label_7.setObjectName("label_7") |
||||||
|
self.verticalLayout.addWidget(self.label_7) |
||||||
|
self.edit_vendor_details_frame = QtWidgets.QFrame(self.frame) |
||||||
|
self.edit_vendor_details_frame.setObjectName("edit_vendor_details_frame") |
||||||
|
self.gridLayout_5 = QtWidgets.QGridLayout(self.edit_vendor_details_frame) |
||||||
|
self.gridLayout_5.setSpacing(20) |
||||||
|
self.gridLayout_5.setObjectName("gridLayout_5") |
||||||
|
self.name_validation_label = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.name_validation_label.setObjectName("name_validation_label") |
||||||
|
self.gridLayout_5.addWidget(self.name_validation_label, 1, 1, 1, 1) |
||||||
|
self.label_28 = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label_28.setObjectName("label_28") |
||||||
|
self.gridLayout_5.addWidget(self.label_28, 11, 0, 1, 1, QtCore.Qt.AlignTop) |
||||||
|
self.descriptionEdit = QtWidgets.QPlainTextEdit(self.edit_vendor_details_frame) |
||||||
|
self.descriptionEdit.setAutoFillBackground(False) |
||||||
|
self.descriptionEdit.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.descriptionEdit.setFrameShadow(QtWidgets.QFrame.Sunken) |
||||||
|
self.descriptionEdit.setTabChangesFocus(False) |
||||||
|
self.descriptionEdit.setPlainText("") |
||||||
|
self.descriptionEdit.setBackgroundVisible(False) |
||||||
|
self.descriptionEdit.setObjectName("descriptionEdit") |
||||||
|
self.gridLayout_5.addWidget(self.descriptionEdit, 11, 1, 1, 1) |
||||||
|
self.nameEdit = QtWidgets.QLineEdit(self.edit_vendor_details_frame) |
||||||
|
self.nameEdit.setObjectName("nameEdit") |
||||||
|
self.gridLayout_5.addWidget(self.nameEdit, 0, 1, 1, 1) |
||||||
|
self.url_validation_label = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.url_validation_label.setObjectName("url_validation_label") |
||||||
|
self.gridLayout_5.addWidget(self.url_validation_label, 3, 1, 1, 1) |
||||||
|
self.companiesText = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.companiesText.setObjectName("companiesText") |
||||||
|
self.gridLayout_5.addWidget(self.companiesText, 12, 0, 1, 1, QtCore.Qt.AlignTop) |
||||||
|
self.label_4 = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label_4.setObjectName("label_4") |
||||||
|
self.gridLayout_5.addWidget(self.label_4, 7, 0, 1, 1) |
||||||
|
self.frame_3 = QtWidgets.QFrame(self.edit_vendor_details_frame) |
||||||
|
self.frame_3.setObjectName("frame_3") |
||||||
|
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_3) |
||||||
|
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_3.setObjectName("horizontalLayout_3") |
||||||
|
self.non_Sushi_check_box = QtWidgets.QCheckBox(self.frame_3) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.non_Sushi_check_box.sizePolicy().hasHeightForWidth()) |
||||||
|
self.non_Sushi_check_box.setSizePolicy(sizePolicy) |
||||||
|
self.non_Sushi_check_box.setText("") |
||||||
|
self.non_Sushi_check_box.setObjectName("non_Sushi_check_box") |
||||||
|
self.horizontalLayout_3.addWidget(self.non_Sushi_check_box) |
||||||
|
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) |
||||||
|
self.horizontalLayout_3.addItem(spacerItem) |
||||||
|
self.non_sushi_help_button = QtWidgets.QPushButton(self.frame_3) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.non_sushi_help_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.non_sushi_help_button.setSizePolicy(sizePolicy) |
||||||
|
self.non_sushi_help_button.setText("") |
||||||
|
icon4 = QtGui.QIcon() |
||||||
|
icon4.addPixmap(QtGui.QPixmap(":/ui/resources/help_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.non_sushi_help_button.setIcon(icon4) |
||||||
|
self.non_sushi_help_button.setObjectName("non_sushi_help_button") |
||||||
|
self.horizontalLayout_3.addWidget(self.non_sushi_help_button) |
||||||
|
self.gridLayout_5.addWidget(self.frame_3, 10, 1, 1, 1) |
||||||
|
self.label_3 = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label_3.setObjectName("label_3") |
||||||
|
self.gridLayout_5.addWidget(self.label_3, 2, 0, 1, 1) |
||||||
|
self.baseUrlEdit = QtWidgets.QLineEdit(self.edit_vendor_details_frame) |
||||||
|
self.baseUrlEdit.setObjectName("baseUrlEdit") |
||||||
|
self.gridLayout_5.addWidget(self.baseUrlEdit, 2, 1, 1, 1) |
||||||
|
self.label_2 = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label_2.setObjectName("label_2") |
||||||
|
self.gridLayout_5.addWidget(self.label_2, 4, 0, 1, 1) |
||||||
|
self.apiKeyEdit = QtWidgets.QLineEdit(self.edit_vendor_details_frame) |
||||||
|
self.apiKeyEdit.setObjectName("apiKeyEdit") |
||||||
|
self.gridLayout_5.addWidget(self.apiKeyEdit, 8, 1, 1, 1) |
||||||
|
self.label_5 = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label_5.setObjectName("label_5") |
||||||
|
self.gridLayout_5.addWidget(self.label_5, 8, 0, 1, 1) |
||||||
|
self.label = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label.setObjectName("label") |
||||||
|
self.gridLayout_5.addWidget(self.label, 0, 0, 1, 1) |
||||||
|
self.companiesEdit = QtWidgets.QPlainTextEdit(self.edit_vendor_details_frame) |
||||||
|
self.companiesEdit.setObjectName("companiesEdit") |
||||||
|
self.gridLayout_5.addWidget(self.companiesEdit, 12, 1, 1, 1) |
||||||
|
self.platformEdit = QtWidgets.QLineEdit(self.edit_vendor_details_frame) |
||||||
|
self.platformEdit.setObjectName("platformEdit") |
||||||
|
self.gridLayout_5.addWidget(self.platformEdit, 9, 1, 1, 1) |
||||||
|
self.label_39 = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label_39.setObjectName("label_39") |
||||||
|
self.gridLayout_5.addWidget(self.label_39, 10, 0, 1, 1) |
||||||
|
self.label_6 = QtWidgets.QLabel(self.edit_vendor_details_frame) |
||||||
|
self.label_6.setObjectName("label_6") |
||||||
|
self.gridLayout_5.addWidget(self.label_6, 9, 0, 1, 1) |
||||||
|
self.requestorIdEdit = QtWidgets.QLineEdit(self.edit_vendor_details_frame) |
||||||
|
self.requestorIdEdit.setObjectName("requestorIdEdit") |
||||||
|
self.gridLayout_5.addWidget(self.requestorIdEdit, 7, 1, 1, 1) |
||||||
|
self.customerIdEdit = QtWidgets.QLineEdit(self.edit_vendor_details_frame) |
||||||
|
self.customerIdEdit.setObjectName("customerIdEdit") |
||||||
|
self.gridLayout_5.addWidget(self.customerIdEdit, 4, 1, 1, 1) |
||||||
|
self.verticalLayout.addWidget(self.edit_vendor_details_frame) |
||||||
|
self.edit_vendor_options_frame = QtWidgets.QFrame(self.frame) |
||||||
|
self.edit_vendor_options_frame.setEnabled(False) |
||||||
|
self.edit_vendor_options_frame.setObjectName("edit_vendor_options_frame") |
||||||
|
self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.edit_vendor_options_frame) |
||||||
|
self.horizontalLayout_5.setObjectName("horizontalLayout_5") |
||||||
|
self.saveVendorChangesButton = QtWidgets.QPushButton(self.edit_vendor_options_frame) |
||||||
|
icon5 = QtGui.QIcon() |
||||||
|
icon5.addPixmap(QtGui.QPixmap(":/ui/resources/save_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.saveVendorChangesButton.setIcon(icon5) |
||||||
|
self.saveVendorChangesButton.setDefault(False) |
||||||
|
self.saveVendorChangesButton.setFlat(False) |
||||||
|
self.saveVendorChangesButton.setObjectName("saveVendorChangesButton") |
||||||
|
self.horizontalLayout_5.addWidget(self.saveVendorChangesButton) |
||||||
|
self.undoVendorChangesButton = QtWidgets.QPushButton(self.edit_vendor_options_frame) |
||||||
|
icon6 = QtGui.QIcon() |
||||||
|
icon6.addPixmap(QtGui.QPixmap(":/ui/resources/undo_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.undoVendorChangesButton.setIcon(icon6) |
||||||
|
self.undoVendorChangesButton.setObjectName("undoVendorChangesButton") |
||||||
|
self.horizontalLayout_5.addWidget(self.undoVendorChangesButton) |
||||||
|
self.removeVendorButton = QtWidgets.QPushButton(self.edit_vendor_options_frame) |
||||||
|
icon7 = QtGui.QIcon() |
||||||
|
icon7.addPixmap(QtGui.QPixmap(":/ui/resources/remove_vendor_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.removeVendorButton.setIcon(icon7) |
||||||
|
self.removeVendorButton.setObjectName("removeVendorButton") |
||||||
|
self.horizontalLayout_5.addWidget(self.removeVendorButton) |
||||||
|
self.verticalLayout.addWidget(self.edit_vendor_options_frame) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame) |
||||||
|
self.horizontalLayout.addWidget(self.frame_8) |
||||||
|
|
||||||
|
self.retranslateUi(manage_vendors_tab) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(manage_vendors_tab) |
||||||
|
manage_vendors_tab.setTabOrder(self.vendorsListView, self.addVendorButton) |
||||||
|
manage_vendors_tab.setTabOrder(self.addVendorButton, self.importVendorsButton) |
||||||
|
manage_vendors_tab.setTabOrder(self.importVendorsButton, self.exportVendorsButton) |
||||||
|
manage_vendors_tab.setTabOrder(self.exportVendorsButton, self.nameEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.nameEdit, self.baseUrlEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.baseUrlEdit, self.customerIdEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.customerIdEdit, self.requestorIdEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.requestorIdEdit, self.apiKeyEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.apiKeyEdit, self.platformEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.platformEdit, self.non_Sushi_check_box) |
||||||
|
manage_vendors_tab.setTabOrder(self.non_Sushi_check_box, self.non_sushi_help_button) |
||||||
|
manage_vendors_tab.setTabOrder(self.non_sushi_help_button, self.descriptionEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.descriptionEdit, self.companiesEdit) |
||||||
|
manage_vendors_tab.setTabOrder(self.companiesEdit, self.saveVendorChangesButton) |
||||||
|
manage_vendors_tab.setTabOrder(self.saveVendorChangesButton, self.undoVendorChangesButton) |
||||||
|
manage_vendors_tab.setTabOrder(self.undoVendorChangesButton, self.removeVendorButton) |
||||||
|
|
||||||
|
def retranslateUi(self, manage_vendors_tab): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
manage_vendors_tab.setWindowTitle(_translate("manage_vendors_tab", "Manage Vendors")) |
||||||
|
self.label_13.setText(_translate("manage_vendors_tab", "Select Vendor")) |
||||||
|
self.importVendorsButton.setText(_translate("manage_vendors_tab", "Import Vendors")) |
||||||
|
self.addVendorButton.setText(_translate("manage_vendors_tab", "Add New Vendor")) |
||||||
|
self.exportVendorsButton.setText(_translate("manage_vendors_tab", "Export Vendors")) |
||||||
|
self.label_7.setText(_translate("manage_vendors_tab", "Edit Vendor")) |
||||||
|
self.name_validation_label.setText(_translate("manage_vendors_tab", "Validation label")) |
||||||
|
self.label_28.setText(_translate("manage_vendors_tab", "Description")) |
||||||
|
self.url_validation_label.setText(_translate("manage_vendors_tab", "Validation label")) |
||||||
|
self.companiesText.setText(_translate("manage_vendors_tab", "Third party provider")) |
||||||
|
self.label_4.setText(_translate("manage_vendors_tab", "Requestor ID")) |
||||||
|
self.label_3.setText(_translate("manage_vendors_tab", "Base URL")) |
||||||
|
self.label_2.setText(_translate("manage_vendors_tab", "Customer ID")) |
||||||
|
self.label_5.setText(_translate("manage_vendors_tab", "API Key")) |
||||||
|
self.label.setText(_translate("manage_vendors_tab", "Name")) |
||||||
|
self.label_39.setText(_translate("manage_vendors_tab", "Non-SUSHI Vendor")) |
||||||
|
self.label_6.setText(_translate("manage_vendors_tab", "Platform")) |
||||||
|
self.saveVendorChangesButton.setText(_translate("manage_vendors_tab", "Save Changes")) |
||||||
|
self.undoVendorChangesButton.setText(_translate("manage_vendors_tab", "Undo Changes")) |
||||||
|
self.removeVendorButton.setText(_translate("manage_vendors_tab", "Remove Vendor")) |
||||||
|
import Resources_rc |
@ -0,0 +1,419 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>manage_vendors_tab</class> |
||||||
|
<widget class="QWidget" name="manage_vendors_tab"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>807</width> |
||||||
|
<height>642</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Manage Vendors</string> |
||||||
|
</property> |
||||||
|
<property name="windowIcon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/tab_icons/manage_vendors_icon.png</normaloff>:/ui/resources/tab_icons/manage_vendors_icon.png</iconset> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_12"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_6"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_13"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Select Vendor</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QListView" name="vendorsListView"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="alternatingRowColors"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_2"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout_3"> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QPushButton" name="importVendorsButton"> |
||||||
|
<property name="text"> |
||||||
|
<string>Import Vendors</string> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/import_vendors_icon.png</normaloff>:/ui/resources/import_vendors_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QPushButton" name="addVendorButton"> |
||||||
|
<property name="text"> |
||||||
|
<string>Add New Vendor</string> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/add_vendor_icon.png</normaloff>:/ui/resources/add_vendor_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="2"> |
||||||
|
<widget class="QPushButton" name="exportVendorsButton"> |
||||||
|
<property name="text"> |
||||||
|
<string>Export Vendors</string> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/export_vendors_icon.png</normaloff>:/ui/resources/export_vendors_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_8"> |
||||||
|
<layout class="QVBoxLayout" name="horizontalLayout_2"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_7"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<family>Segoe UI</family> |
||||||
|
<pointsize>11</pointsize> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::NoFrame</enum> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Edit Vendor</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="edit_vendor_details_frame"> |
||||||
|
<layout class="QGridLayout" name="gridLayout_5"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>20</number> |
||||||
|
</property> |
||||||
|
<item row="1" column="1"> |
||||||
|
<widget class="QLabel" name="name_validation_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Validation label</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="11" column="0" alignment="Qt::AlignTop"> |
||||||
|
<widget class="QLabel" name="label_28"> |
||||||
|
<property name="text"> |
||||||
|
<string>Description</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="11" column="1"> |
||||||
|
<widget class="QPlainTextEdit" name="descriptionEdit"> |
||||||
|
<property name="autoFillBackground"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Sunken</enum> |
||||||
|
</property> |
||||||
|
<property name="tabChangesFocus"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="plainText"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="backgroundVisible"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QLineEdit" name="nameEdit"/> |
||||||
|
</item> |
||||||
|
<item row="3" column="1"> |
||||||
|
<widget class="QLabel" name="url_validation_label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Validation label</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="12" column="0" alignment="Qt::AlignTop"> |
||||||
|
<widget class="QLabel" name="companiesText"> |
||||||
|
<property name="text"> |
||||||
|
<string>Third party provider</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="7" column="0"> |
||||||
|
<widget class="QLabel" name="label_4"> |
||||||
|
<property name="text"> |
||||||
|
<string>Requestor ID</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="10" column="1"> |
||||||
|
<widget class="QFrame" name="frame_3"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QCheckBox" name="non_Sushi_check_box"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<spacer name="horizontalSpacer"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="sizeHint" stdset="0"> |
||||||
|
<size> |
||||||
|
<width>40</width> |
||||||
|
<height>20</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
</spacer> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="non_sushi_help_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/help_icon.png</normaloff>:/ui/resources/help_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="0"> |
||||||
|
<widget class="QLabel" name="label_3"> |
||||||
|
<property name="text"> |
||||||
|
<string>Base URL</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="2" column="1"> |
||||||
|
<widget class="QLineEdit" name="baseUrlEdit"/> |
||||||
|
</item> |
||||||
|
<item row="4" column="0"> |
||||||
|
<widget class="QLabel" name="label_2"> |
||||||
|
<property name="text"> |
||||||
|
<string>Customer ID</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="8" column="1"> |
||||||
|
<widget class="QLineEdit" name="apiKeyEdit"/> |
||||||
|
</item> |
||||||
|
<item row="8" column="0"> |
||||||
|
<widget class="QLabel" name="label_5"> |
||||||
|
<property name="text"> |
||||||
|
<string>API Key</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QLabel" name="label"> |
||||||
|
<property name="text"> |
||||||
|
<string>Name</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="12" column="1"> |
||||||
|
<widget class="QPlainTextEdit" name="companiesEdit"/> |
||||||
|
</item> |
||||||
|
<item row="9" column="1"> |
||||||
|
<widget class="QLineEdit" name="platformEdit"/> |
||||||
|
</item> |
||||||
|
<item row="10" column="0"> |
||||||
|
<widget class="QLabel" name="label_39"> |
||||||
|
<property name="text"> |
||||||
|
<string>Non-SUSHI Vendor</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="9" column="0"> |
||||||
|
<widget class="QLabel" name="label_6"> |
||||||
|
<property name="text"> |
||||||
|
<string>Platform</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="7" column="1"> |
||||||
|
<widget class="QLineEdit" name="requestorIdEdit"/> |
||||||
|
</item> |
||||||
|
<item row="4" column="1"> |
||||||
|
<widget class="QLineEdit" name="customerIdEdit"/> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="edit_vendor_options_frame"> |
||||||
|
<property name="enabled"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_5"> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="saveVendorChangesButton"> |
||||||
|
<property name="text"> |
||||||
|
<string>Save Changes</string> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/save_icon.png</normaloff>:/ui/resources/save_icon.png</iconset> |
||||||
|
</property> |
||||||
|
<property name="default"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
<property name="flat"> |
||||||
|
<bool>false</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="undoVendorChangesButton"> |
||||||
|
<property name="text"> |
||||||
|
<string>Undo Changes</string> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/undo_icon.png</normaloff>:/ui/resources/undo_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="removeVendorButton"> |
||||||
|
<property name="text"> |
||||||
|
<string>Remove Vendor</string> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/remove_vendor_icon.png</normaloff>:/ui/resources/remove_vendor_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<tabstops> |
||||||
|
<tabstop>vendorsListView</tabstop> |
||||||
|
<tabstop>addVendorButton</tabstop> |
||||||
|
<tabstop>importVendorsButton</tabstop> |
||||||
|
<tabstop>exportVendorsButton</tabstop> |
||||||
|
<tabstop>nameEdit</tabstop> |
||||||
|
<tabstop>baseUrlEdit</tabstop> |
||||||
|
<tabstop>customerIdEdit</tabstop> |
||||||
|
<tabstop>requestorIdEdit</tabstop> |
||||||
|
<tabstop>apiKeyEdit</tabstop> |
||||||
|
<tabstop>platformEdit</tabstop> |
||||||
|
<tabstop>non_Sushi_check_box</tabstop> |
||||||
|
<tabstop>non_sushi_help_button</tabstop> |
||||||
|
<tabstop>descriptionEdit</tabstop> |
||||||
|
<tabstop>companiesEdit</tabstop> |
||||||
|
<tabstop>saveVendorChangesButton</tabstop> |
||||||
|
<tabstop>undoVendorChangesButton</tabstop> |
||||||
|
<tabstop>removeVendorButton</tabstop> |
||||||
|
</tabstops> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,37 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'MessageDialog.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.9.2 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
class Ui_message_dialog(object): |
||||||
|
def setupUi(self, message_dialog): |
||||||
|
message_dialog.setObjectName("message_dialog") |
||||||
|
message_dialog.resize(400, 60) |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(message_dialog) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.message_label = QtWidgets.QLabel(message_dialog) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setPointSize(9) |
||||||
|
self.message_label.setFont(font) |
||||||
|
self.message_label.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.message_label.setObjectName("message_label") |
||||||
|
self.verticalLayout.addWidget(self.message_label) |
||||||
|
self.buttonBox = QtWidgets.QDialogButtonBox(message_dialog) |
||||||
|
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Ok) |
||||||
|
self.buttonBox.setObjectName("buttonBox") |
||||||
|
self.verticalLayout.addWidget(self.buttonBox) |
||||||
|
|
||||||
|
self.buttonBox.accepted.connect(message_dialog.accept) |
||||||
|
self.retranslateUi(message_dialog) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(message_dialog) |
||||||
|
|
||||||
|
def retranslateUi(self, message_dialog): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
message_dialog.setWindowTitle(_translate("message_dialog", "Message")) |
||||||
|
self.message_label.setText(_translate("message_dialog", "Message!")) |
||||||
|
|
@ -0,0 +1,43 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>message_dialog</class> |
||||||
|
<widget class="QDialog" name="message_dialog"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>400</width> |
||||||
|
<height>60</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Message</string> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="message_label"> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<pointsize>9</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Message!</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QDialogButtonBox" name="buttonBox"> |
||||||
|
<property name="standardButtons"> |
||||||
|
<set>QDialogButtonBox::Ok</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,33 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'RemoveVendorDialog.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.14.1 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_dialog_remove(object): |
||||||
|
def setupUi(self, dialog_remove): |
||||||
|
dialog_remove.setObjectName("dialog_remove") |
||||||
|
dialog_remove.resize(399, 100) |
||||||
|
self.label = QtWidgets.QLabel(dialog_remove) |
||||||
|
self.label.setGeometry(QtCore.QRect(10, 10, 371, 41)) |
||||||
|
self.label.setObjectName("label") |
||||||
|
self.buttonBox = QtWidgets.QDialogButtonBox(dialog_remove) |
||||||
|
self.buttonBox.setGeometry(QtCore.QRect(210, 60, 164, 32)) |
||||||
|
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) |
||||||
|
self.buttonBox.setObjectName("buttonBox") |
||||||
|
|
||||||
|
self.retranslateUi(dialog_remove) |
||||||
|
self.buttonBox.accepted.connect(dialog_remove.accept) |
||||||
|
self.buttonBox.rejected.connect(dialog_remove.reject) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(dialog_remove) |
||||||
|
|
||||||
|
def retranslateUi(self, dialog_remove): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
dialog_remove.setWindowTitle(_translate("dialog_remove", "Remove Vendor")) |
||||||
|
self.label.setText(_translate("dialog_remove", "Are you sure you want to remove this vendor?")) |
@ -0,0 +1,45 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>dialog_remove</class> |
||||||
|
<widget class="QDialog" name="dialog_remove"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>399</width> |
||||||
|
<height>100</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Remove Vendor</string> |
||||||
|
</property> |
||||||
|
<widget class="QLabel" name="label"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>10</x> |
||||||
|
<y>10</y> |
||||||
|
<width>371</width> |
||||||
|
<height>41</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Are you sure you want to remove this vendor?</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
<widget class="QDialogButtonBox" name="buttonBox"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>210</x> |
||||||
|
<y>60</y> |
||||||
|
<width>164</width> |
||||||
|
<height>32</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="standardButtons"> |
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,192 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'ReportResultWidget.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.12.3 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
|
||||||
|
class Ui_ReportResultWidget(object): |
||||||
|
def setupUi(self, ReportResultWidget): |
||||||
|
ReportResultWidget.setObjectName("ReportResultWidget") |
||||||
|
ReportResultWidget.resize(600, 60) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(200) |
||||||
|
sizePolicy.setHeightForWidth(ReportResultWidget.sizePolicy().hasHeightForWidth()) |
||||||
|
ReportResultWidget.setSizePolicy(sizePolicy) |
||||||
|
ReportResultWidget.setMinimumSize(QtCore.QSize(600, 60)) |
||||||
|
ReportResultWidget.setMaximumSize(QtCore.QSize(16777215, 16777215)) |
||||||
|
ReportResultWidget.setSizeIncrement(QtCore.QSize(0, 1000)) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setPointSize(9) |
||||||
|
ReportResultWidget.setFont(font) |
||||||
|
self.horizontalLayout = QtWidgets.QHBoxLayout(ReportResultWidget) |
||||||
|
self.horizontalLayout.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout.setObjectName("horizontalLayout") |
||||||
|
self.frame = QtWidgets.QFrame(ReportResultWidget) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame.setSizePolicy(sizePolicy) |
||||||
|
self.frame.setMinimumSize(QtCore.QSize(600, 0)) |
||||||
|
self.frame.setFrameShape(QtWidgets.QFrame.Box) |
||||||
|
self.frame.setFrameShadow(QtWidgets.QFrame.Sunken) |
||||||
|
self.frame.setObjectName("frame") |
||||||
|
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame) |
||||||
|
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_2.setObjectName("horizontalLayout_2") |
||||||
|
self.frame_6 = QtWidgets.QFrame(self.frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_6.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_6.setSizePolicy(sizePolicy) |
||||||
|
self.frame_6.setMinimumSize(QtCore.QSize(80, 50)) |
||||||
|
self.frame_6.setObjectName("frame_6") |
||||||
|
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.frame_6) |
||||||
|
self.verticalLayout_5.setContentsMargins(-1, 0, -1, 0) |
||||||
|
self.verticalLayout_5.setSpacing(3) |
||||||
|
self.verticalLayout_5.setObjectName("verticalLayout_5") |
||||||
|
self.report_type_label = QtWidgets.QLabel(self.frame_6) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.report_type_label.sizePolicy().hasHeightForWidth()) |
||||||
|
self.report_type_label.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.report_type_label.setFont(font) |
||||||
|
self.report_type_label.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.report_type_label.setObjectName("report_type_label") |
||||||
|
self.verticalLayout_5.addWidget(self.report_type_label, 0, QtCore.Qt.AlignHCenter) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_6) |
||||||
|
self.frame_2 = QtWidgets.QFrame(self.frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_2.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_2.setSizePolicy(sizePolicy) |
||||||
|
self.frame_2.setObjectName("frame_2") |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame_2) |
||||||
|
self.verticalLayout.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.verticalLayout.setSpacing(6) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.file_frame = QtWidgets.QFrame(self.frame_2) |
||||||
|
self.file_frame.setObjectName("file_frame") |
||||||
|
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.file_frame) |
||||||
|
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) |
||||||
|
self.horizontalLayout_4.setObjectName("horizontalLayout_4") |
||||||
|
self.file_label = QtWidgets.QLabel(self.file_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.file_label.sizePolicy().hasHeightForWidth()) |
||||||
|
self.file_label.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setUnderline(True) |
||||||
|
self.file_label.setFont(font) |
||||||
|
self.file_label.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) |
||||||
|
self.file_label.setStyleSheet("color: #0000EE") |
||||||
|
self.file_label.setWordWrap(True) |
||||||
|
self.file_label.setObjectName("file_label") |
||||||
|
self.horizontalLayout_4.addWidget(self.file_label) |
||||||
|
self.folder_button = QtWidgets.QPushButton(self.file_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.folder_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.folder_button.setSizePolicy(sizePolicy) |
||||||
|
self.folder_button.setText("") |
||||||
|
icon = QtGui.QIcon() |
||||||
|
icon.addPixmap(QtGui.QPixmap(":/ui/resources/folder_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
||||||
|
self.folder_button.setIcon(icon) |
||||||
|
self.folder_button.setObjectName("folder_button") |
||||||
|
self.horizontalLayout_4.addWidget(self.folder_button) |
||||||
|
self.verticalLayout.addWidget(self.file_frame) |
||||||
|
self.message_label = QtWidgets.QLabel(self.frame_2) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.message_label.sizePolicy().hasHeightForWidth()) |
||||||
|
self.message_label.setSizePolicy(sizePolicy) |
||||||
|
self.message_label.setWordWrap(True) |
||||||
|
self.message_label.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) |
||||||
|
self.message_label.setObjectName("message_label") |
||||||
|
self.verticalLayout.addWidget(self.message_label) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_2) |
||||||
|
self.frame_4 = QtWidgets.QFrame(self.frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.frame_4.sizePolicy().hasHeightForWidth()) |
||||||
|
self.frame_4.setSizePolicy(sizePolicy) |
||||||
|
self.frame_4.setMinimumSize(QtCore.QSize(120, 50)) |
||||||
|
self.frame_4.setObjectName("frame_4") |
||||||
|
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_4) |
||||||
|
self.horizontalLayout_3.setContentsMargins(9, 0, -1, 0) |
||||||
|
self.horizontalLayout_3.setObjectName("horizontalLayout_3") |
||||||
|
self.success_label = QtWidgets.QLabel(self.frame_4) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.success_label.sizePolicy().hasHeightForWidth()) |
||||||
|
self.success_label.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(True) |
||||||
|
font.setWeight(75) |
||||||
|
self.success_label.setFont(font) |
||||||
|
self.success_label.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.success_label.setObjectName("success_label") |
||||||
|
self.horizontalLayout_3.addWidget(self.success_label) |
||||||
|
self.retry_frame = QtWidgets.QFrame(self.frame_4) |
||||||
|
self.retry_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.retry_frame.setFrameShadow(QtWidgets.QFrame.Raised) |
||||||
|
self.retry_frame.setObjectName("retry_frame") |
||||||
|
self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.retry_frame) |
||||||
|
self.verticalLayout_7.setContentsMargins(-1, 0, -1, -1) |
||||||
|
self.verticalLayout_7.setObjectName("verticalLayout_7") |
||||||
|
self.label_6 = QtWidgets.QLabel(self.retry_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) |
||||||
|
self.label_6.setSizePolicy(sizePolicy) |
||||||
|
font = QtGui.QFont() |
||||||
|
font.setBold(False) |
||||||
|
font.setWeight(50) |
||||||
|
self.label_6.setFont(font) |
||||||
|
self.label_6.setAlignment(QtCore.Qt.AlignCenter) |
||||||
|
self.label_6.setObjectName("label_6") |
||||||
|
self.verticalLayout_7.addWidget(self.label_6) |
||||||
|
self.retry_check_box = QtWidgets.QCheckBox(self.retry_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.retry_check_box.sizePolicy().hasHeightForWidth()) |
||||||
|
self.retry_check_box.setSizePolicy(sizePolicy) |
||||||
|
self.retry_check_box.setText("") |
||||||
|
self.retry_check_box.setObjectName("retry_check_box") |
||||||
|
self.verticalLayout_7.addWidget(self.retry_check_box, 0, QtCore.Qt.AlignHCenter) |
||||||
|
self.horizontalLayout_3.addWidget(self.retry_frame) |
||||||
|
self.horizontalLayout_2.addWidget(self.frame_4) |
||||||
|
self.horizontalLayout.addWidget(self.frame) |
||||||
|
|
||||||
|
self.retranslateUi(ReportResultWidget) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(ReportResultWidget) |
||||||
|
|
||||||
|
def retranslateUi(self, ReportResultWidget): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
ReportResultWidget.setWindowTitle(_translate("ReportResultWidget", "Report Result")) |
||||||
|
self.report_type_label.setText(_translate("ReportResultWidget", "TR_J1")) |
||||||
|
self.file_label.setText(_translate("ReportResultWidget", "Saved as: Bleh.tsv")) |
||||||
|
self.message_label.setText(_translate("ReportResultWidget", "No exception messages")) |
||||||
|
self.success_label.setText(_translate("ReportResultWidget", "Failed!")) |
||||||
|
self.label_6.setText(_translate("ReportResultWidget", "Retry")) |
||||||
|
import Resources_rc |
@ -0,0 +1,356 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>ReportResultWidget</class> |
||||||
|
<widget class="QWidget" name="ReportResultWidget"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>600</width> |
||||||
|
<height>60</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>200</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>600</width> |
||||||
|
<height>60</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="maximumSize"> |
||||||
|
<size> |
||||||
|
<width>16777215</width> |
||||||
|
<height>16777215</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="sizeIncrement"> |
||||||
|
<size> |
||||||
|
<width>0</width> |
||||||
|
<height>1000</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<pointsize>9</pointsize> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Report Result</string> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>600</width> |
||||||
|
<height>0</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::Box</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Sunken</enum> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_6"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>80</width> |
||||||
|
<height>50</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_5"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>3</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item alignment="Qt::AlignHCenter"> |
||||||
|
<widget class="QLabel" name="report_type_label"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>TR_J1</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_2"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<property name="spacing"> |
||||||
|
<number>6</number> |
||||||
|
</property> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="file_frame"> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="rightMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="file_label"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<underline>true</underline> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="cursor"> |
||||||
|
<cursorShape>PointingHandCursor</cursorShape> |
||||||
|
</property> |
||||||
|
<property name="styleSheet"> |
||||||
|
<string notr="true">color: #0000EE</string> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Saved as: Bleh.tsv</string> |
||||||
|
</property> |
||||||
|
<property name="wordWrap"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QPushButton" name="folder_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
<property name="icon"> |
||||||
|
<iconset resource="../Resources.qrc"> |
||||||
|
<normaloff>:/ui/resources/folder_icon.png</normaloff>:/ui/resources/folder_icon.png</iconset> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="message_label"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>No exception messages</string> |
||||||
|
</property> |
||||||
|
<property name="wordWrap"> |
||||||
|
<bool>true</bool> |
||||||
|
</property> |
||||||
|
<property name="textInteractionFlags"> |
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="frame_4"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="minimumSize"> |
||||||
|
<size> |
||||||
|
<width>120</width> |
||||||
|
<height>50</height> |
||||||
|
</size> |
||||||
|
</property> |
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
||||||
|
<property name="leftMargin"> |
||||||
|
<number>9</number> |
||||||
|
</property> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<property name="bottomMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="success_label"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>75</weight> |
||||||
|
<bold>true</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Failed!</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QFrame" name="retry_frame"> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Raised</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_7"> |
||||||
|
<property name="topMargin"> |
||||||
|
<number>0</number> |
||||||
|
</property> |
||||||
|
<item> |
||||||
|
<widget class="QLabel" name="label_6"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="font"> |
||||||
|
<font> |
||||||
|
<weight>50</weight> |
||||||
|
<bold>false</bold> |
||||||
|
</font> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Retry</string> |
||||||
|
</property> |
||||||
|
<property name="alignment"> |
||||||
|
<set>Qt::AlignCenter</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item alignment="Qt::AlignHCenter"> |
||||||
|
<widget class="QCheckBox" name="retry_check_box"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string/> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources> |
||||||
|
<include location="../Resources.qrc"/> |
||||||
|
</resources> |
||||||
|
<connections/> |
||||||
|
</ui> |
@ -0,0 +1,44 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'ReportTypeDialog.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.9.2 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
class Ui_report_type_dialog(object): |
||||||
|
def setupUi(self, report_type_dialog): |
||||||
|
report_type_dialog.setObjectName("report_type_dialog") |
||||||
|
report_type_dialog.resize(433, 155) |
||||||
|
self.verticalLayout = QtWidgets.QVBoxLayout(report_type_dialog) |
||||||
|
self.verticalLayout.setObjectName("verticalLayout") |
||||||
|
self.report_type_combobox = QtWidgets.QComboBox(report_type_dialog) |
||||||
|
self.report_type_combobox.setObjectName("report_type_combobox") |
||||||
|
self.verticalLayout.addWidget(self.report_type_combobox) |
||||||
|
self.buttonBox = QtWidgets.QDialogButtonBox(report_type_dialog) |
||||||
|
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) |
||||||
|
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) |
||||||
|
self.buttonBox.setObjectName("buttonBox") |
||||||
|
self.verticalLayout.addWidget(self.buttonBox) |
||||||
|
|
||||||
|
self.retranslateUi(report_type_dialog) |
||||||
|
self.buttonBox.accepted.connect(report_type_dialog.accept) |
||||||
|
self.buttonBox.rejected.connect(report_type_dialog.reject) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(report_type_dialog) |
||||||
|
|
||||||
|
def retranslateUi(self, report_type_dialog): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
report_type_dialog.setWindowTitle(_translate("report_type_dialog", "Report Type")) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
import sys |
||||||
|
app = QtWidgets.QApplication(sys.argv) |
||||||
|
report_type_dialog = QtWidgets.QDialog() |
||||||
|
ui = Ui_report_type_dialog() |
||||||
|
ui.setupUi(report_type_dialog) |
||||||
|
report_type_dialog.show() |
||||||
|
sys.exit(app.exec_()) |
||||||
|
|
@ -0,0 +1,67 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>report_type_dialog</class> |
||||||
|
<widget class="QDialog" name="report_type_dialog"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>433</width> |
||||||
|
<height>155</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Report Type</string> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||||
|
<item> |
||||||
|
<widget class="QComboBox" name="report_type_combobox"/> |
||||||
|
</item> |
||||||
|
<item> |
||||||
|
<widget class="QDialogButtonBox" name="buttonBox"> |
||||||
|
<property name="orientation"> |
||||||
|
<enum>Qt::Horizontal</enum> |
||||||
|
</property> |
||||||
|
<property name="standardButtons"> |
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections> |
||||||
|
<connection> |
||||||
|
<sender>buttonBox</sender> |
||||||
|
<signal>accepted()</signal> |
||||||
|
<receiver>report_type_dialog</receiver> |
||||||
|
<slot>accept()</slot> |
||||||
|
<hints> |
||||||
|
<hint type="sourcelabel"> |
||||||
|
<x>248</x> |
||||||
|
<y>254</y> |
||||||
|
</hint> |
||||||
|
<hint type="destinationlabel"> |
||||||
|
<x>157</x> |
||||||
|
<y>274</y> |
||||||
|
</hint> |
||||||
|
</hints> |
||||||
|
</connection> |
||||||
|
<connection> |
||||||
|
<sender>buttonBox</sender> |
||||||
|
<signal>rejected()</signal> |
||||||
|
<receiver>report_type_dialog</receiver> |
||||||
|
<slot>reject()</slot> |
||||||
|
<hints> |
||||||
|
<hint type="sourcelabel"> |
||||||
|
<x>316</x> |
||||||
|
<y>260</y> |
||||||
|
</hint> |
||||||
|
<hint type="destinationlabel"> |
||||||
|
<x>286</x> |
||||||
|
<y>274</y> |
||||||
|
</hint> |
||||||
|
</hints> |
||||||
|
</connection> |
||||||
|
</connections> |
||||||
|
</ui> |
@ -0,0 +1,71 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
|
||||||
|
# Form implementation generated from reading ui file 'SearchAndClauseFrame.ui' |
||||||
|
# |
||||||
|
# Created by: PyQt5 UI code generator 5.9.2 |
||||||
|
# |
||||||
|
# WARNING! All changes made in this file will be lost! |
||||||
|
|
||||||
|
from PyQt5 import QtCore, QtGui, QtWidgets |
||||||
|
|
||||||
|
class Ui_search_and_clause_parameter_frame(object): |
||||||
|
def setupUi(self, search_and_clause_parameter_frame): |
||||||
|
search_and_clause_parameter_frame.setObjectName("search_and_clause_parameter_frame") |
||||||
|
search_and_clause_parameter_frame.resize(542, 175) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(search_and_clause_parameter_frame.sizePolicy().hasHeightForWidth()) |
||||||
|
search_and_clause_parameter_frame.setSizePolicy(sizePolicy) |
||||||
|
search_and_clause_parameter_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
search_and_clause_parameter_frame.setFrameShadow(QtWidgets.QFrame.Raised) |
||||||
|
self.gridLayout = QtWidgets.QGridLayout(search_and_clause_parameter_frame) |
||||||
|
self.gridLayout.setObjectName("gridLayout") |
||||||
|
self.search_or_clause_parameters_frame = QtWidgets.QFrame(search_and_clause_parameter_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.search_or_clause_parameters_frame.sizePolicy().hasHeightForWidth()) |
||||||
|
self.search_or_clause_parameters_frame.setSizePolicy(sizePolicy) |
||||||
|
self.search_or_clause_parameters_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) |
||||||
|
self.search_or_clause_parameters_frame.setFrameShadow(QtWidgets.QFrame.Raised) |
||||||
|
self.search_or_clause_parameters_frame.setObjectName("search_or_clause_parameters_frame") |
||||||
|
self.verticalLayout_22 = QtWidgets.QVBoxLayout(self.search_or_clause_parameters_frame) |
||||||
|
self.verticalLayout_22.setObjectName("verticalLayout_22") |
||||||
|
self.gridLayout.addWidget(self.search_or_clause_parameters_frame, 0, 0, 1, 1) |
||||||
|
self.search_add_or_clause_button = QtWidgets.QPushButton(search_and_clause_parameter_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.search_add_or_clause_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.search_add_or_clause_button.setSizePolicy(sizePolicy) |
||||||
|
self.search_add_or_clause_button.setObjectName("search_add_or_clause_button") |
||||||
|
self.gridLayout.addWidget(self.search_add_or_clause_button, 1, 0, 1, 1) |
||||||
|
self.search_remove_and_clause_button = QtWidgets.QPushButton(search_and_clause_parameter_frame) |
||||||
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) |
||||||
|
sizePolicy.setHorizontalStretch(0) |
||||||
|
sizePolicy.setVerticalStretch(0) |
||||||
|
sizePolicy.setHeightForWidth(self.search_remove_and_clause_button.sizePolicy().hasHeightForWidth()) |
||||||
|
self.search_remove_and_clause_button.setSizePolicy(sizePolicy) |
||||||
|
self.search_remove_and_clause_button.setObjectName("search_remove_and_clause_button") |
||||||
|
self.gridLayout.addWidget(self.search_remove_and_clause_button, 0, 1, 1, 1) |
||||||
|
|
||||||
|
self.retranslateUi(search_and_clause_parameter_frame) |
||||||
|
QtCore.QMetaObject.connectSlotsByName(search_and_clause_parameter_frame) |
||||||
|
|
||||||
|
def retranslateUi(self, search_and_clause_parameter_frame): |
||||||
|
_translate = QtCore.QCoreApplication.translate |
||||||
|
search_and_clause_parameter_frame.setWindowTitle(_translate("search_and_clause_parameter_frame", "Frame")) |
||||||
|
self.search_add_or_clause_button.setText(_translate("search_and_clause_parameter_frame", "Add \"Or\" Clause")) |
||||||
|
self.search_remove_and_clause_button.setText(_translate("search_and_clause_parameter_frame", "Remove \"And\" Clause")) |
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
import sys |
||||||
|
app = QtWidgets.QApplication(sys.argv) |
||||||
|
search_and_clause_parameter_frame = QtWidgets.QFrame() |
||||||
|
ui = Ui_search_and_clause_parameter_frame() |
||||||
|
ui.setupUi(search_and_clause_parameter_frame) |
||||||
|
search_and_clause_parameter_frame.show() |
||||||
|
sys.exit(app.exec_()) |
||||||
|
|
@ -0,0 +1,76 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<ui version="4.0"> |
||||||
|
<class>search_and_clause_parameter_frame</class> |
||||||
|
<widget class="QFrame" name="search_and_clause_parameter_frame"> |
||||||
|
<property name="geometry"> |
||||||
|
<rect> |
||||||
|
<x>0</x> |
||||||
|
<y>0</y> |
||||||
|
<width>542</width> |
||||||
|
<height>175</height> |
||||||
|
</rect> |
||||||
|
</property> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="windowTitle"> |
||||||
|
<string>Frame</string> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Raised</enum> |
||||||
|
</property> |
||||||
|
<layout class="QGridLayout" name="gridLayout"> |
||||||
|
<item row="0" column="0"> |
||||||
|
<widget class="QFrame" name="search_or_clause_parameters_frame"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="frameShape"> |
||||||
|
<enum>QFrame::StyledPanel</enum> |
||||||
|
</property> |
||||||
|
<property name="frameShadow"> |
||||||
|
<enum>QFrame::Raised</enum> |
||||||
|
</property> |
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_22"/> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="1" column="0"> |
||||||
|
<widget class="QPushButton" name="search_add_or_clause_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Add "Or" Clause</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
<item row="0" column="1"> |
||||||
|
<widget class="QPushButton" name="search_remove_and_clause_button"> |
||||||
|
<property name="sizePolicy"> |
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> |
||||||
|
<horstretch>0</horstretch> |
||||||
|
<verstretch>0</verstretch> |
||||||
|
</sizepolicy> |
||||||
|
</property> |
||||||
|
<property name="text"> |
||||||
|
<string>Remove "And" Clause</string> |
||||||
|
</property> |
||||||
|
</widget> |
||||||
|
</item> |
||||||
|
</layout> |
||||||
|
</widget> |
||||||
|
<resources/> |
||||||
|
<connections/> |
||||||
|
</ui> |