상세 페이지 수정 중
This commit is contained in:
parent
10d7991516
commit
b31e82cc59
314
config.ini
314
config.ini
|
|
@ -2,56 +2,270 @@
|
|||
max_businesses = 5
|
||||
log_level = DEBUG
|
||||
business_count = 0
|
||||
encryption_key = UDHoVlNcjDeR7ABRyDVr349RAtEUBNMZH5w4cq8g2IM=
|
||||
|
||||
[USER]
|
||||
user_id = leensoo1nt@gmail.com
|
||||
password = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
encryption_key = ujAT1bDEIJJ5uEw5MQ6R3gstatzpaZS_QaeSnTmGd0s=
|
||||
|
||||
[BUSINESS_1]
|
||||
사업자별칭 = sample_alias_1
|
||||
사업자등록번호 = 123-45-67890
|
||||
상호명 = sample_name_1
|
||||
등록날짜 = 2023-01-01
|
||||
응대전화번호 = 010-1234-5678
|
||||
쿠팡_쿠팡id = gAAAAABmRvruHmgHV1k6kuaWXu_abhE5WcPZxMjW3QKK7jY9Ms3UT1nD0BgpH_ujpnThATcfc4QNhlOTcYpa7PB8psJIr1_BsnTQ4HGUI45VbBPnEoWGglU=
|
||||
쿠팡_업체 코드 = gAAAAABmRvruW5eBP4UAE126L4DRScX9lgspb7ANxG-tdJOYNOg4gXo7F-4Xe-9LnIbjvxjITK0rqoCjJfAK8AaZRrzFohmXpX8MwM44XzMuyayC4WKsTu4=
|
||||
쿠팡_access key = gAAAAABmRvruIlRrsIgwTSsR3fCYMM6G-hYerYMnFkSD050WM9WArprzDJvAjVjxmiLYh6xXDHUxu31wFhJjiFwdcjOcwSvYkx55pAJRN7Crk0Pw80e_Spw=
|
||||
쿠팡_secret key = gAAAAABmRvru_QY05u0XIShzeLHiUWbdbRbW_5ruEPOl-7adaxjQZXOewnOaODi9wDdR2aLQ9dp0UNkIAVWZzq-BYc8ovEQ6I5keVA9mCzCxx8SWbIvst7M=
|
||||
스마트스토어_업로드항 스마트스토어 계정 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
스마트스토어_애플리케이션 id = gAAAAABmRvruEqawY-NssQNcQwEeOcRiGsiV0_QABw0IUhn-su02wAcyQ2X-At2sRla6tBK0HSDVZyGdCrrEIhlvTq_EbFE-HeNi8zaKdbGoPmnMhV5i9OE=
|
||||
스마트스토어_애플리케이션 시크릿 = gAAAAABmRvruf3WXP0dWq9b-ykEu_e2h7V2D9xcDfSyYtXb19u57STPmnabKSrUJeDnCaq23oBBM89vXnGPyIuWSTX5wajNnYLjYY0e_J5Gp-Jon5wv0ICU=
|
||||
옥션지마켓_옥션id = gAAAAABmRvruDCrmyG3EyInh86KIHrZt5JQK0rF8jvt6a3EOMfQCsUxfk7pZkY6xF34DvQmBLmqCcgifH8oBpFqUixE1_OHhQ6RwMcLAnk8ympBbEctGD4g=
|
||||
옥션지마켓_g마켓 id = gAAAAABmRvruJgJvYqzSfSg0YIAAb5h3HQOBUbheMqUYGiNU1fSxVgCCyODezPe-Ejgn4yLNOqmsxLkolyMWJNd5v0QCuqz_SbJPebff9I3tQaXC7pMqO6w=
|
||||
11번가-일반_api key = gAAAAABmRvrurEqGJf086Qs6TJYxIQXuiOV5gytNZ5Z6u7pRjFY9JY2IEMzxG-cg1cGTAv1XF_ilgDCEJmZHYxrlSRfkUdMtrA_uk8u0zjXcnKuoI85S2aE=
|
||||
11번가-글로벌_api key = gAAAAABmRvruI-bQL9A7rB1Z-JzqSQYaXm--wll9GMW-ke0cGLdD5iy_3VatzNGSy9JhOI2He_dF6srQ7EGbre-zfZReeaI1XLJEk-Ze6SL5EKcJ6j7IsLA=
|
||||
롯데온_api key = gAAAAABmRvrumkOok8QyAX4caHgkJDiifOmEpYCGG6zsqysBunDZFzmTd6Zbk_6tWWlyqxdXIQbqCbDPwHSPpM4yF_y8f9QB8gxrTg6bbF3rBzAFChPH-iU=
|
||||
인터파크_상품상태재고수정 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품상태재고수정 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품재고조회 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품재고조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품정보조회 인증 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품정보조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품수정 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품수정 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품등록 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품등록 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_반품배송지조회 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_반품배송지조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_반품배송지등록 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_반품배송지등록 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품qna등록 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품qna등록 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품qna조회 인증키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_상품qna조회 비밀키 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_인터파크 업체번호 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
인터파크_공급계약 일련번호 = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
위메프_api key = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
옥션1.0_api key = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
옥션1.0_멤버 id = gAAAAABmRrpwomEeVDrsgzi7afYKMZg0-B3eS3eZJrZGMTQ_FOebl-Uq2KkY6XByMAtr0hbGX0_ZiOgcIVSrEOf-9q7_Et38mA==
|
||||
alias = 설정사업자없음
|
||||
register_number = 000-00-00000
|
||||
name = 설정사업자없음
|
||||
date = 0000-00-00
|
||||
call = 000-000-0000
|
||||
사업자별칭 =
|
||||
사업자등록번호 =
|
||||
상호명 =
|
||||
등록날짜 =
|
||||
응대전화번호 =
|
||||
etc1_title =
|
||||
etc1_context =
|
||||
etc2_title =
|
||||
etc2_context =
|
||||
etc3_title =
|
||||
etc3_context =
|
||||
etc4_title =
|
||||
etc4_context =
|
||||
etc5_title =
|
||||
etc5_context =
|
||||
쿠팡_쿠팡id =
|
||||
쿠팡_업체 코드 =
|
||||
쿠팡_access key =
|
||||
쿠팡_secret key =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 id =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 pw =
|
||||
스마트스토어_애플리케이션 id =
|
||||
스마트스토어_애플리케이션 시크릿 =
|
||||
esm_옥션id =
|
||||
esm_g마켓 id =
|
||||
11번가-국내_api key =
|
||||
11번가-글로벌_api key =
|
||||
롯데온_api key =
|
||||
인터파크_상품상태재고수정 인증키 =
|
||||
인터파크_상품상태재고수정 비밀키 =
|
||||
인터파크_상품재고조회 인증키 =
|
||||
인터파크_상품재고조회 비밀키 =
|
||||
인터파크_상품정보조회 인증 =
|
||||
인터파크_상품정보조회 비밀키 =
|
||||
인터파크_상품수정 인증키 =
|
||||
인터파크_상품수정 비밀키 =
|
||||
인터파크_상품등록 인증키 =
|
||||
인터파크_상품등록 비밀키 =
|
||||
인터파크_반품배송지조회 인증키 =
|
||||
인터파크_반품배송지조회 비밀키 =
|
||||
인터파크_반품배송지등록 인증키 =
|
||||
인터파크_반품배송지등록 비밀키 =
|
||||
인터파크_상품qna등록 인증키 =
|
||||
인터파크_상품qna등록 비밀키 =
|
||||
인터파크_상품qna조회 인증키 =
|
||||
인터파크_상품qna조회 비밀키 =
|
||||
인터파크_인터파크 업체번호 =
|
||||
인터파크_공급계약 일련번호 =
|
||||
위메프_api key =
|
||||
옥션1.0_api key =
|
||||
옥션1.0_멤버 id =
|
||||
|
||||
[BUSINESS_2]
|
||||
사업자별칭 =
|
||||
사업자등록번호 =
|
||||
상호명 =
|
||||
등록날짜 =
|
||||
응대전화번호 =
|
||||
etc1_title =
|
||||
etc1_context =
|
||||
etc2_title =
|
||||
etc2_context =
|
||||
etc3_title =
|
||||
etc3_context =
|
||||
etc4_title =
|
||||
etc4_context =
|
||||
etc5_title =
|
||||
etc5_context =
|
||||
쿠팡_쿠팡id =
|
||||
쿠팡_업체 코드 =
|
||||
쿠팡_access key =
|
||||
쿠팡_secret key =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 id =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 pw =
|
||||
스마트스토어_애플리케이션 id =
|
||||
스마트스토어_애플리케이션 시크릿 =
|
||||
esm_옥션id =
|
||||
esm_g마켓 id =
|
||||
11번가-국내_api key =
|
||||
11번가-글로벌_api key =
|
||||
롯데온_api key =
|
||||
인터파크_상품상태재고수정 인증키 =
|
||||
인터파크_상품상태재고수정 비밀키 =
|
||||
인터파크_상품재고조회 인증키 =
|
||||
인터파크_상품재고조회 비밀키 =
|
||||
인터파크_상품정보조회 인증 =
|
||||
인터파크_상품정보조회 비밀키 =
|
||||
인터파크_상품수정 인증키 =
|
||||
인터파크_상품수정 비밀키 =
|
||||
인터파크_상품등록 인증키 =
|
||||
인터파크_상품등록 비밀키 =
|
||||
인터파크_반품배송지조회 인증키 =
|
||||
인터파크_반품배송지조회 비밀키 =
|
||||
인터파크_반품배송지등록 인증키 =
|
||||
인터파크_반품배송지등록 비밀키 =
|
||||
인터파크_상품qna등록 인증키 =
|
||||
인터파크_상품qna등록 비밀키 =
|
||||
인터파크_상품qna조회 인증키 =
|
||||
인터파크_상품qna조회 비밀키 =
|
||||
인터파크_인터파크 업체번호 =
|
||||
인터파크_공급계약 일련번호 =
|
||||
위메프_api key =
|
||||
옥션1.0_api key =
|
||||
옥션1.0_멤버 id =
|
||||
|
||||
[BUSINESS_3]
|
||||
사업자별칭 =
|
||||
사업자등록번호 =
|
||||
상호명 =
|
||||
등록날짜 =
|
||||
응대전화번호 =
|
||||
etc1_title =
|
||||
etc1_context =
|
||||
etc2_title =
|
||||
etc2_context =
|
||||
etc3_title =
|
||||
etc3_context =
|
||||
etc4_title =
|
||||
etc4_context =
|
||||
etc5_title =
|
||||
etc5_context =
|
||||
쿠팡_쿠팡id =
|
||||
쿠팡_업체 코드 =
|
||||
쿠팡_access key =
|
||||
쿠팡_secret key =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 id =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 pw =
|
||||
스마트스토어_애플리케이션 id =
|
||||
스마트스토어_애플리케이션 시크릿 =
|
||||
esm_옥션id =
|
||||
esm_g마켓 id =
|
||||
11번가-국내_api key =
|
||||
11번가-글로벌_api key =
|
||||
롯데온_api key =
|
||||
인터파크_상품상태재고수정 인증키 =
|
||||
인터파크_상품상태재고수정 비밀키 =
|
||||
인터파크_상품재고조회 인증키 =
|
||||
인터파크_상품재고조회 비밀키 =
|
||||
인터파크_상품정보조회 인증 =
|
||||
인터파크_상품정보조회 비밀키 =
|
||||
인터파크_상품수정 인증키 =
|
||||
인터파크_상품수정 비밀키 =
|
||||
인터파크_상품등록 인증키 =
|
||||
인터파크_상품등록 비밀키 =
|
||||
인터파크_반품배송지조회 인증키 =
|
||||
인터파크_반품배송지조회 비밀키 =
|
||||
인터파크_반품배송지등록 인증키 =
|
||||
인터파크_반품배송지등록 비밀키 =
|
||||
인터파크_상품qna등록 인증키 =
|
||||
인터파크_상품qna등록 비밀키 =
|
||||
인터파크_상품qna조회 인증키 =
|
||||
인터파크_상품qna조회 비밀키 =
|
||||
인터파크_인터파크 업체번호 =
|
||||
인터파크_공급계약 일련번호 =
|
||||
위메프_api key =
|
||||
옥션1.0_api key =
|
||||
옥션1.0_멤버 id =
|
||||
|
||||
[BUSINESS_4]
|
||||
사업자별칭 =
|
||||
사업자등록번호 =
|
||||
상호명 =
|
||||
등록날짜 =
|
||||
응대전화번호 =
|
||||
etc1_title =
|
||||
etc1_context =
|
||||
etc2_title =
|
||||
etc2_context =
|
||||
etc3_title =
|
||||
etc3_context =
|
||||
etc4_title =
|
||||
etc4_context =
|
||||
etc5_title =
|
||||
etc5_context =
|
||||
쿠팡_쿠팡id =
|
||||
쿠팡_업체 코드 =
|
||||
쿠팡_access key =
|
||||
쿠팡_secret key =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 id =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 pw =
|
||||
스마트스토어_애플리케이션 id =
|
||||
스마트스토어_애플리케이션 시크릿 =
|
||||
esm_옥션id =
|
||||
esm_g마켓 id =
|
||||
11번가-국내_api key =
|
||||
11번가-글로벌_api key =
|
||||
롯데온_api key =
|
||||
인터파크_상품상태재고수정 인증키 =
|
||||
인터파크_상품상태재고수정 비밀키 =
|
||||
인터파크_상품재고조회 인증키 =
|
||||
인터파크_상품재고조회 비밀키 =
|
||||
인터파크_상품정보조회 인증 =
|
||||
인터파크_상품정보조회 비밀키 =
|
||||
인터파크_상품수정 인증키 =
|
||||
인터파크_상품수정 비밀키 =
|
||||
인터파크_상품등록 인증키 =
|
||||
인터파크_상품등록 비밀키 =
|
||||
인터파크_반품배송지조회 인증키 =
|
||||
인터파크_반품배송지조회 비밀키 =
|
||||
인터파크_반품배송지등록 인증키 =
|
||||
인터파크_반품배송지등록 비밀키 =
|
||||
인터파크_상품qna등록 인증키 =
|
||||
인터파크_상품qna등록 비밀키 =
|
||||
인터파크_상품qna조회 인증키 =
|
||||
인터파크_상품qna조회 비밀키 =
|
||||
인터파크_인터파크 업체번호 =
|
||||
인터파크_공급계약 일련번호 =
|
||||
위메프_api key =
|
||||
옥션1.0_api key =
|
||||
옥션1.0_멤버 id =
|
||||
|
||||
[BUSINESS_5]
|
||||
사업자별칭 =
|
||||
사업자등록번호 =
|
||||
상호명 =
|
||||
등록날짜 =
|
||||
응대전화번호 =
|
||||
etc1_title =
|
||||
etc1_context =
|
||||
etc2_title =
|
||||
etc2_context =
|
||||
etc3_title =
|
||||
etc3_context =
|
||||
etc4_title =
|
||||
etc4_context =
|
||||
etc5_title =
|
||||
etc5_context =
|
||||
쿠팡_쿠팡id =
|
||||
쿠팡_업체 코드 =
|
||||
쿠팡_access key =
|
||||
쿠팡_secret key =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 id =
|
||||
스마트스토어_업로드 할 스마트스토어 계정 pw =
|
||||
스마트스토어_애플리케이션 id =
|
||||
스마트스토어_애플리케이션 시크릿 =
|
||||
esm_옥션id =
|
||||
esm_g마켓 id =
|
||||
11번가-국내_api key =
|
||||
11번가-글로벌_api key =
|
||||
롯데온_api key =
|
||||
인터파크_상품상태재고수정 인증키 =
|
||||
인터파크_상품상태재고수정 비밀키 =
|
||||
인터파크_상품재고조회 인증키 =
|
||||
인터파크_상품재고조회 비밀키 =
|
||||
인터파크_상품정보조회 인증 =
|
||||
인터파크_상품정보조회 비밀키 =
|
||||
인터파크_상품수정 인증키 =
|
||||
인터파크_상품수정 비밀키 =
|
||||
인터파크_상품등록 인증키 =
|
||||
인터파크_상품등록 비밀키 =
|
||||
인터파크_반품배송지조회 인증키 =
|
||||
인터파크_반품배송지조회 비밀키 =
|
||||
인터파크_반품배송지등록 인증키 =
|
||||
인터파크_반품배송지등록 비밀키 =
|
||||
인터파크_상품qna등록 인증키 =
|
||||
인터파크_상품qna등록 비밀키 =
|
||||
인터파크_상품qna조회 인증키 =
|
||||
인터파크_상품qna조회 비밀키 =
|
||||
인터파크_인터파크 업체번호 =
|
||||
인터파크_공급계약 일련번호 =
|
||||
위메프_api key =
|
||||
옥션1.0_api key =
|
||||
옥션1.0_멤버 id =
|
||||
|
||||
|
|
|
|||
2
main.py
2
main.py
|
|
@ -13,6 +13,8 @@ def main():
|
|||
logger = setup_logger(log_level)
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
app.setStyle('Fusion')
|
||||
# app.setStyle('windows')
|
||||
loop = QEventLoop(app)
|
||||
asyncio.set_event_loop(loop)
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
# coding:utf-8
|
||||
import os
|
||||
import sys
|
||||
|
||||
from PyQt5.QtCore import Qt, QTranslator
|
||||
from PyQt5.QtGui import QFont
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from qfluentwidgets import FluentTranslator
|
||||
|
||||
from app.common.config import cfg
|
||||
from app.view.main_window import MainWindow
|
||||
|
||||
|
||||
# enable dpi scale
|
||||
if cfg.get(cfg.dpiScale) == "Auto":
|
||||
QApplication.setHighDpiScaleFactorRoundingPolicy(
|
||||
Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
|
||||
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
|
||||
else:
|
||||
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "0"
|
||||
os.environ["QT_SCALE_FACTOR"] = str(cfg.get(cfg.dpiScale))
|
||||
|
||||
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
|
||||
|
||||
# create application
|
||||
app = QApplication(sys.argv)
|
||||
app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)
|
||||
|
||||
# internationalization
|
||||
locale = cfg.get(cfg.language).value
|
||||
translator = FluentTranslator(locale)
|
||||
galleryTranslator = QTranslator()
|
||||
galleryTranslator.load(locale, "gallery", ".", ":/gallery/i18n")
|
||||
|
||||
app.installTranslator(translator)
|
||||
app.installTranslator(galleryTranslator)
|
||||
|
||||
# create main window
|
||||
w = MainWindow()
|
||||
w.show()
|
||||
|
||||
app.exec_()
|
||||
111
prompt.txt
111
prompt.txt
|
|
@ -54,3 +54,114 @@ UI 구성
|
|||
29. 작업완료창의 확인 버튼을 누르면 창이 사라지고, 브라우저 실행 버튼을 누르면 playwright의 chrome이 headless=false 모드로 실행되면서 작업완료 창은 사라져.
|
||||
30. 사용자가 브라우저 실행 버튼을 누르면서 실행된 playwright는 이제부터 사용자가 웹사이트 작업을 할꺼야. 그래서 기존에 사업자 정보를 불러왔던 객체와는 별도의 객체여야 해.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
사업자 설정 버튼을 누르면 나오는 ui를 정의해야 해.
|
||||
|
||||
이 파일은 클래스 파일이고 내부에는 기본적은 클래스변수를 포함해 initIU메서드와 함께 여러 기능을 하는 메서드들이 포함되어야 해.
|
||||
모든 사용자에게 입력받는 모든 데이터는 클래스 변수로 설정되고 메서드들은 그 값들을 이용할 꺼야.
|
||||
그리고 이 클래스변수에 접근하는 메서드들도 포함해줘,
|
||||
|
||||
동작 정의
|
||||
기본적으로 다른 main 프로그램에 import되어 입력버튼을 누르는 등의 동작에 연결되어 해당하는 위젯이 표시되어야 해.
|
||||
그래서 처음 main 프로그램이 시작할때 이 클래스의 객체를 생성하고, 필요한 동작이 호출되면 UI를 show 시키는 방식으로 동작하는게 좋겠어.
|
||||
이 부분은 더 좋은 방법이 있으면 추천해줘
|
||||
|
||||
UI 정의
|
||||
|
||||
1. 메인 레이아웃은 QFRAME 안에 QVLAYOUT이 설정되어있어. 그 안애는 상단에 10%의 면적을 차지하는 QHLAYOUT이 1개 있고 여기에는 저장,삭제, 취소 버튼이 있고, 설정마켓 버튼이 있어.
|
||||
저장,삭제,취소 버튼은 해당 메서드에 연결되어 있고, 이 부분은 추후에 구현할 예정이니 그냥 PASS와 함께 해당버튼을 눌렀다는 PRINT문만 추가해줘.
|
||||
설정마켓 버튼은 클릭하면 작은 위젯이 하나 생성되는데, 여기서는 1행1열의 전체선택 체크박스와 3X3의 각 마켓의 체크박스가 함께 있어. 그리고 확인 버튼과 취소 버튼이 있지.
|
||||
기본설정은 모든 마켓이 체크되어있어. 그리고 체크박스의 상태에 따라 마켓정보가 있는 QTABWIDGET 표시된 마켓의 탭을 보여줄지 말지의 여부를 결정할 꺼야. 이 버튼은 각각의 사업자 마다 동작해.
|
||||
|
||||
그 아래에는 QTABWIDGET이 있고 90%의 면적을 차지해.
|
||||
|
||||
2. QTABWIDGET의 탭의 갯수는 클래스 변수에 설정된 MAX_BUSINESS_COUNT 값이야. 이 값은 클래스 객체를 생성할때 인자로 받는 값이야.
|
||||
각 탭의 제목은 기본값은 '1사업자', '2사업자', 등이 될꺼고, 만약 해당탭 내부의 '사업자 별칭'에 값이 있다면 그 값으로 설정되어야 해.
|
||||
탭이 선택되면 해당 탭은 색이 연두색으로 변해.
|
||||
|
||||
QTABWIDGET은 테두리가 설정되어있고, 내부에는 QVLAYOUT이 설정되어 있어. 그리고 2개의 QFRAME으로 상단에는 사업자 정보 (40%면적차지), 하단에는 마켓정보(60%면적차지)가 들어갈 꺼야.
|
||||
그 중 사업자 정보 QFRAME의 내부는 qgridlayout이 있고, 내부 구조는 다음과 같아
|
||||
1행 에는 2개 열이 있고 1열에는 '사업자 별칭' 라벨, 2열에는 해당값을 입력할 수 있는 QLineedit가 있어.
|
||||
2행 에는 4개 열이 있고 각각 사업자 등록번호, 상호명, 등록날짜, 전화번호 의 Qlabel이 가운데 정렬로 있어.
|
||||
3행 에는 4개의 열이 있고 각각 2열에 해당하는 값을 입력할 수 있도록 Qlineedit가 있어.
|
||||
4행 에는 4개 열이 있고 각각 기타 정보1, 기타정보2, 기타정보3, 기타정보4 의 Qpushbutton이 있어.
|
||||
기타정보의 각 버튼을 누르면 간단한 텍스트를 입력할 수 있는 다이알로그가 떠. 창에는 레이아웃이 3개 있고, 첫번째 QHLAYOUT에는 '제목' 텍스트의 QLABEL과 사용자가 편집할 수 있는 QLINEEDIT 3:7의 비율로 있어. 두번째 QVLAYOUT에는 '내용' 텍스트의 QLABEL과 QTEXTBROWSER가 있어. 세번째 QHLAYOUT에는 확인버튼과 취소버튼이 있어.
|
||||
확인 버튼을 누르면 기타정보 버튼의 텍스트가 제목 으로 설정된 텍스트로 바껴.
|
||||
|
||||
3. 마켓정보 QFRAME에도 역시 QTABWIDGET이 있고, 여기에는 탭마다 해당 사업자의 각 마켓 정보가 들어갈 꺼야.
|
||||
마켓정보를 담은 QTABWIDGET은 선택된 탭은 연두색으로 변해.
|
||||
탭 이름은 마켓이름이고(쿠팡,스마트스토어,ESM,11번가-국내,11번가-글로벌,롯데온,인터파크,위메프,옥션1.0)
|
||||
탭 내부에는 QGRIDLAYOUT으로 설정되어있어.
|
||||
기본적으로 4열로 구성되어있고, 1열, 3열에는 값 이름, 2열 4열에는 각각 1열,3열에 해당하는 값을 입력할 수 있는 QLINEEDIT가 있어.
|
||||
- '쿠팡' 1행 : 쿠팡ID, 업체코드
|
||||
- '쿠팡' 2행 : Access Key','Secret Key'
|
||||
- '스마트스토어' 1행 :'업로드 할 스마트스토어 계정 ID','업로드 할 스마트스토어 계정 PW',
|
||||
- '스마트스토어' 2행 :'애플리케이션 ID','애플리케이션 시크릿'
|
||||
- 'ESM' 1행 :'옥션ID','G마켓 ID'
|
||||
- '11번가-국내' 1행 :'API KEY'
|
||||
- '11번가-글로벌' 1행 :'API KEY'
|
||||
- '롯데온' 1행 :'API KEY'
|
||||
- '인터파크' 1행:'상품상태재고수정 인증키','상품상태재고수정 비밀키'
|
||||
- '인터파크' 2행'상품재고조회 인증키','상품재고조회 비밀키'
|
||||
- '인터파크' 3행'상품정보조회 인증','상품정보조회 비밀키'
|
||||
- '인터파크' 4행'상품수정 인증키','상품수정 비밀키'
|
||||
- '인터파크' 5행'상품등록 인증키','상품등록 비밀키'
|
||||
- '인터파크' 6행'반품배송지조회 인증키','반품배송지조회 비밀키'
|
||||
- '인터파크' 7행'반품배송지등록 인증키','반품배송지등록 비밀키'
|
||||
- '인터파크' 8행'상품QnA등록 인증키','상품QnA등록 비밀키'
|
||||
- '인터파크' 9행'상품QnA조회 인증키','상품QnA조회 비밀키'
|
||||
- '인터파크' 10행'인터파크 업체번호','공급계약 일련번호'
|
||||
- '위메프' 1행:'API KEY'
|
||||
- '옥션1.0' 1행:'멤버 ID'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
기타 정보 버튼 아래에 4개의 버튼을 추가로 만들어줘.
|
||||
이 버튼들은 '사업자등록증', '통신판매업신고증', '사업자통장', '기타이미지' 의 텍스트를 가지고 있어.
|
||||
이 버튼을 클릭하면 작은 위젯이 생성되고, 위젯에는 4:3 비율의 이미지를 표시할꺼야.
|
||||
사업자등록증이나 통신판매업 신고증 같은 A4용지를 스캔한 이미지를 표시할 예정이야.
|
||||
|
||||
UI의 구성은 아래와 같아.
|
||||
qvlayout을 메인레이아웃으로 하고 그 내부에 2개의 qhlayout이 있어. 첫번째는 10%의 면적을 차지하고 확인 버튼, 저장 버튼, 삭제버튼이 있어.
|
||||
두번째 qhlayout은 나머지 90%의 면적을 차지하고 내부에는 이미지를 표시하는 위젯이 있어.
|
||||
|
||||
|
||||
|
||||
이 모든 정보를 저장하기 위해 실행폴더에 My_BUSINESS_Info 폴더를 만들고 해당폴더 아래에 각 사업자 별로 정보를 저장해야 해.
|
||||
각 사업자 정보는 BUSINESS_INFO_1,BUSINESS_INFO_2,BUSINESS_INFO_3,BUSINESS_INFO_4,BUSINESS_INFO_5 폴더가 있고,
|
||||
해당 사업자 폴더 아래에는 business_info.ini 파일, etc_info.ini파일, image폴더, pdf폴더, etc폴더가 있어.
|
||||
business_info.ini파일에는 사업자 정보(사업자등록번호 등)과 각 마켓의 api정보를 담고 있어.
|
||||
etc_info.ini파일에는 기타 정보에서 설정한 내용들이 들어있어.
|
||||
image폴더에는 사업자등록증이나 통신판매업 신고증 같은 이미지파일들이 있고, pdf폴더에는 교육 수료증이나 판매허가증 같은 pdf 파일들이 있어.
|
||||
etc폴더에는 위의 내용을 제외한 나머지 사업폴더들이 존재할꺼야.
|
||||
|
||||
이렇게 폴더구조를 만든 후 이 내용들을 구글드라이브와 동기화 시키는 옵션을 만들고, My_BUSINESS_Info 폴더가 업데이트 될때 마다 동기화를 시키면 좋겠어.
|
||||
|
|
@ -0,0 +1,272 @@
|
|||
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QLineEdit,
|
||||
QPushButton, QTabWidget, QCheckBox, QFrame, QDialog, QDialogButtonBox,
|
||||
QFontDialog, QMenuBar, QAction, QMessageBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.Qsci import QsciScintilla, QsciLexerPython
|
||||
from qfluentwidgets import CalendarPicker
|
||||
|
||||
class BusinessSettings(QDialog):
|
||||
def __init__(self, max_business_count=3, parent=None):
|
||||
super().__init__(parent)
|
||||
self.max_business_count = max_business_count
|
||||
self.business_info = [{} for _ in range(max_business_count)]
|
||||
self.market_info = [{} for _ in range(max_business_count)]
|
||||
self.other_info = [{} for _ in range(max_business_count)]
|
||||
self.selected_markets = {market: True for market in ["쿠팡", "스마트스토어", "ESM", "11번가-국내", "11번가-글로벌", "롯데온", "인터파크", "위메프", "옥션1.0"]}
|
||||
self.initUI()
|
||||
|
||||
def initUI(self):
|
||||
self.setLayout(QVBoxLayout())
|
||||
|
||||
# 상단 버튼 레이아웃
|
||||
top_layout = QHBoxLayout()
|
||||
top_frame = QFrame(self)
|
||||
top_frame.setLayout(top_layout)
|
||||
top_frame.setFrameShape(QFrame.StyledPanel)
|
||||
top_frame.setFixedHeight(int(self.height() * 0.1))
|
||||
|
||||
save_button = QPushButton("저장")
|
||||
save_button.clicked.connect(lambda: print("저장 버튼 클릭됨"))
|
||||
delete_button = QPushButton("삭제")
|
||||
delete_button.clicked.connect(lambda: print("삭제 버튼 클릭됨"))
|
||||
cancel_button = QPushButton("취소")
|
||||
cancel_button.clicked.connect(lambda: print("취소 버튼 클릭됨"))
|
||||
setup_market_button = QPushButton("설정마켓")
|
||||
setup_market_button.clicked.connect(self.show_market_setup)
|
||||
|
||||
top_layout.addWidget(save_button)
|
||||
top_layout.addWidget(delete_button)
|
||||
top_layout.addWidget(cancel_button)
|
||||
top_layout.addWidget(setup_market_button)
|
||||
self.layout().addWidget(top_frame)
|
||||
|
||||
# QTabWidget 설정
|
||||
self.tab_widget = QTabWidget()
|
||||
self.tab_widget.setTabsClosable(False)
|
||||
self.layout().addWidget(self.tab_widget)
|
||||
|
||||
for i in range(self.max_business_count):
|
||||
tab = QWidget()
|
||||
tab.setLayout(QVBoxLayout())
|
||||
tab.layout().addLayout(self.create_business_info_layout(i))
|
||||
tab.layout().addWidget(self.create_market_info_widget())
|
||||
tab.layout().setStretch(0, 3)
|
||||
tab.layout().setStretch(1, 2)
|
||||
self.tab_widget.addTab(tab, f"{i + 1}사업자")
|
||||
|
||||
self.tab_widget.currentChanged.connect(self.update_tab_styles)
|
||||
self.update_tab_styles()
|
||||
|
||||
def create_business_info_layout(self, index):
|
||||
layout = QGridLayout()
|
||||
|
||||
layout.addWidget(QLabel("사업자 별칭"), 0, 0)
|
||||
alias_input = QLineEdit()
|
||||
alias_input.textChanged.connect(lambda text, idx=index: self.update_tab_title(text, idx))
|
||||
layout.addWidget(alias_input, 0, 1)
|
||||
|
||||
labels = ["사업자 등록번호", "상호명", "등록날짜", "전화번호"]
|
||||
for i, label in enumerate(labels):
|
||||
layout.addWidget(QLabel(label, alignment=Qt.AlignCenter), 1, i)
|
||||
|
||||
self.bs_number_edit = QLineEdit()
|
||||
self.bs_number_edit.setMinimumWidth(60)
|
||||
layout.addWidget(self.bs_number_edit, 2, 0)
|
||||
self.bs_name_edit = QLineEdit()
|
||||
self.bs_name_edit.setMinimumWidth(60)
|
||||
layout.addWidget(self.bs_name_edit, 2, 1)
|
||||
|
||||
self.datePicker = CalendarPicker(self)
|
||||
self.datePicker.setMinimumWidth(60)
|
||||
self.datePicker.dateChanged.connect(lambda t: print(t.toString()))
|
||||
layout.addWidget(self.datePicker, 2, 2)
|
||||
|
||||
# set date
|
||||
# self.picker.setDate(QDate(2023, 5, 30))
|
||||
|
||||
# customize date format
|
||||
# self.picker.setDateFormat(Qt.TextDate)
|
||||
# self.picker.setDateFormat('yyyy-M-d')
|
||||
|
||||
self.bs_call_edit = QLineEdit()
|
||||
self.bs_call_edit.setMinimumWidth(60)
|
||||
layout.addWidget(self.bs_call_edit, 2, 3)
|
||||
|
||||
other_info_labels = ["기타 정보1", "기타 정보2", "기타 정보3", "기타 정보4"]
|
||||
for i, label in enumerate(other_info_labels):
|
||||
button = QPushButton(label)
|
||||
button.clicked.connect(lambda checked, lbl=label, idx=index, btn=button: self.show_other_info_dialog(lbl, idx, btn))
|
||||
layout.addWidget(button, 3, i)
|
||||
|
||||
return layout
|
||||
|
||||
def create_market_info_widget(self):
|
||||
layout = QTabWidget()
|
||||
|
||||
market_tabs = {
|
||||
"쿠팡": [("쿠팡ID", ""), ("업체코드", ""), ("Access Key", ""), ("Secret Key", "")],
|
||||
"스마트스토어": [("계정 ID", ""), ("계정 PW", ""), ("애플리케이션 ID", ""), ("애플리케이션 시크릿", "")],
|
||||
"ESM": [("옥션ID", ""), ("G마켓 ID", "")],
|
||||
"11번가-국내": [("API KEY", "")],
|
||||
"11번가-글로벌": [("API KEY", "")],
|
||||
"롯데온": [("API KEY", "")],
|
||||
"인터파크": [("상품상태재고수정 인증키", ""), ("상품상태재고수정 비밀키", ""),
|
||||
("상품재고조회 인증키", ""), ("상품재고조회 비밀키", ""),
|
||||
("상품정보조회 인증", ""), ("상품정보조회 비밀키", ""),
|
||||
("상품수정 인증키", ""), ("상품수정 비밀키", ""),
|
||||
("상품등록 인증키", ""), ("상품등록 비밀키", ""),
|
||||
("반품배송지조회 인증키", ""), ("반품배송지조회 비밀키", ""),
|
||||
("반품배송지등록 인증키", ""), ("반품배송지등록 비밀키", ""),
|
||||
("상품QnA등록 인증키", ""), ("상품QnA등록 비밀키", ""),
|
||||
("상품QnA조회 인증키", ""), ("상품QnA조회 비밀키", ""),
|
||||
("인터파크 업체번호", ""), ("공급계약 일련번호", "")],
|
||||
"위메프": [("API KEY", "")],
|
||||
"옥션1.0": [("멤버 ID", "")]
|
||||
}
|
||||
|
||||
for market, fields in market_tabs.items():
|
||||
tab = QWidget()
|
||||
tab_layout = QGridLayout()
|
||||
for i, (label_text, placeholder) in enumerate(fields):
|
||||
tab_layout.addWidget(QLabel(label_text), i, 0)
|
||||
tab_layout.addWidget(QLineEdit(placeholder), i, 1)
|
||||
tab.setLayout(tab_layout)
|
||||
if self.selected_markets[market]:
|
||||
layout.addTab(tab, market)
|
||||
|
||||
return layout
|
||||
|
||||
def show_market_setup(self):
|
||||
dialog = QDialog(self)
|
||||
dialog.setWindowTitle("설정 마켓")
|
||||
dialog.setLayout(QVBoxLayout())
|
||||
layout = dialog.layout()
|
||||
|
||||
all_select_checkbox = QCheckBox("전체선택")
|
||||
all_select_checkbox.setChecked(all(self.selected_markets.values()))
|
||||
all_select_checkbox.stateChanged.connect(self.toggle_all_markets)
|
||||
layout.addWidget(all_select_checkbox)
|
||||
market_layout = QGridLayout()
|
||||
|
||||
markets = list(self.selected_markets.keys())
|
||||
self.market_checkboxes = []
|
||||
for i, market in enumerate(markets):
|
||||
checkbox = QCheckBox(market)
|
||||
checkbox.setChecked(self.selected_markets[market])
|
||||
self.market_checkboxes.append(checkbox)
|
||||
market_layout.addWidget(checkbox, i // 3, i % 3)
|
||||
|
||||
layout.addLayout(market_layout)
|
||||
|
||||
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
||||
button_box.accepted.connect(dialog.accept)
|
||||
button_box.rejected.connect(dialog.reject)
|
||||
layout.addWidget(button_box)
|
||||
|
||||
if dialog.exec() == QDialog.Accepted:
|
||||
for i, checkbox in enumerate(self.market_checkboxes):
|
||||
self.selected_markets[markets[i]] = checkbox.isChecked()
|
||||
self.update_market_tabs()
|
||||
|
||||
def toggle_all_markets(self, state):
|
||||
for checkbox in self.market_checkboxes:
|
||||
checkbox.setChecked(state == Qt.Checked)
|
||||
|
||||
def update_market_tabs(self):
|
||||
for i in range(self.tab_widget.count()):
|
||||
tab = self.tab_widget.widget(i)
|
||||
market_info_widget = tab.layout().itemAt(1).widget()
|
||||
for j in range(market_info_widget.count()):
|
||||
market_tab = market_info_widget.widget(j)
|
||||
market_name = market_info_widget.tabText(j)
|
||||
market_info_widget.setTabVisible(j, self.selected_markets[market_name])
|
||||
|
||||
def show_other_info_dialog(self, label, index, button):
|
||||
dialog = QDialog(self)
|
||||
dialog.setWindowTitle(label)
|
||||
layout = QVBoxLayout(dialog)
|
||||
|
||||
# 메뉴 바 생성
|
||||
menu_bar = QMenuBar()
|
||||
layout.setMenuBar(menu_bar)
|
||||
|
||||
# 폰트 선택 메뉴 추가
|
||||
font_menu = menu_bar.addMenu('Font')
|
||||
select_font_action = QAction('Select Font', self)
|
||||
font_menu.addAction(select_font_action)
|
||||
|
||||
title_layout = QHBoxLayout()
|
||||
title_layout.addWidget(QLabel("제목"))
|
||||
title_input = QLineEdit()
|
||||
title_layout.addWidget(title_input, 3)
|
||||
layout.addLayout(title_layout)
|
||||
|
||||
content_layout = QVBoxLayout()
|
||||
content_layout.addWidget(QLabel("내용"))
|
||||
content_editor = QsciScintilla()
|
||||
content_lexer = QsciLexerPython()
|
||||
content_editor.setLexer(content_lexer)
|
||||
content_layout.addWidget(content_editor)
|
||||
layout.addLayout(content_layout)
|
||||
|
||||
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
||||
button_box.accepted.connect(lambda: dialog.accept())
|
||||
button_box.rejected.connect(lambda: dialog.reject())
|
||||
layout.addWidget(button_box)
|
||||
|
||||
# 폰트 선택 메뉴 동작 연결
|
||||
select_font_action.triggered.connect(lambda: self.select_font(content_editor))
|
||||
|
||||
# 기존 정보가 없으면 초기화
|
||||
if label not in self.other_info[index]:
|
||||
self.other_info[index][label] = {"title": "", "content": ""}
|
||||
|
||||
# 기존 정보가 있으면 로드
|
||||
title_input.setText(self.other_info[index][label].get("title", ""))
|
||||
content_editor.setText(self.other_info[index][label].get("content", ""))
|
||||
|
||||
if dialog.exec() == QDialog.Accepted:
|
||||
new_title = title_input.text()
|
||||
new_content = content_editor.text()
|
||||
old_title = self.other_info[index][label].get("title", "")
|
||||
old_content = self.other_info[index][label].get("content", "")
|
||||
|
||||
if new_title != old_title or new_content != old_content:
|
||||
confirmation = QMessageBox.question(self, "변경 사항 확인", "내용이 변경되었습니다. 저장하시겠습니까?",
|
||||
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
|
||||
if confirmation == QMessageBox.Yes:
|
||||
self.other_info[index][label] = {
|
||||
"title": new_title,
|
||||
"content": new_content
|
||||
}
|
||||
button.setText(new_title)
|
||||
else:
|
||||
self.other_info[index][label] = {
|
||||
"title": new_title,
|
||||
"content": new_content
|
||||
}
|
||||
button.setText(new_title)
|
||||
|
||||
# Print the other_info dictionary for debugging
|
||||
print(self.other_info)
|
||||
|
||||
def select_font(self, content_editor):
|
||||
font, ok = QFontDialog.getFont()
|
||||
if ok:
|
||||
content_editor.setFont(font)
|
||||
|
||||
def update_tab_title(self, text, index):
|
||||
if text:
|
||||
self.tab_widget.setTabText(index, text)
|
||||
else:
|
||||
self.tab_widget.setTabText(index, f"{index + 1}사업자")
|
||||
|
||||
def update_tab_styles(self):
|
||||
for i in range(self.tab_widget.count()):
|
||||
tab_bar = self.tab_widget.tabBar()
|
||||
if i == self.tab_widget.currentIndex():
|
||||
tab_bar.setTabTextColor(i, Qt.black)
|
||||
tab_bar.setStyleSheet("QTabBar::tab:selected { background: lightgreen; }")
|
||||
else:
|
||||
tab_bar.setTabTextColor(i, Qt.black)
|
||||
tab_bar.setStyleSheet("QTabBar::tab:!selected { background: transparent; }")
|
||||
|
|
@ -1,22 +1,46 @@
|
|||
from PyQt5.QtWidgets import (QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QLabel, QProgressBar, QComboBox, QCheckBox, QTextBrowser, QPlainTextEdit, QDialog, QFrame, QLineEdit,QGridLayout)
|
||||
from PyQt5.QtWidgets import (QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QLabel, QProgressBar, QComboBox, QCheckBox, QTextBrowser, QPlainTextEdit, QDialog, QFrame, QLineEdit, QGridLayout, QSpinBox)
|
||||
from PyQt5.QtCore import Qt
|
||||
from ui.percenty_settings import PercentySettingsDialog
|
||||
from ui.business_settings import BusinessSettingsDialog
|
||||
from ui.business_set import BusinessSettings
|
||||
|
||||
from ui.help_dialog import HelpDialog
|
||||
from utils.playwright_helpers import PlaywrightHelper
|
||||
from utils.config import ConfigManager
|
||||
import asyncio, pyperclip
|
||||
from ui.apikey_widget import ApiKeyWidget
|
||||
from qfluentwidgets import PushButton, RoundMenu, DropDownPushButton, FluentIcon as FIF
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
def __init__(self, config, logger):
|
||||
super().__init__()
|
||||
self.config = config
|
||||
self.logger = logger
|
||||
self.max_business_number = 5
|
||||
self.current_api_keys = {}
|
||||
self.playwright_helper = PlaywrightHelper()
|
||||
self.api_widget = ApiKeyWidget()
|
||||
|
||||
self.business_infos = {}
|
||||
|
||||
|
||||
self.menu = RoundMenu(parent=self)
|
||||
# Initialize the class variable
|
||||
self.current_slot = 1
|
||||
# 액션 딕셔너리 생성
|
||||
self.actions = {
|
||||
'1번 슬롯': QAction(FIF.SETTING.icon(), '1번 슬롯', self),
|
||||
'2번 슬롯': QAction(FIF.SETTING.icon(), '2번 슬롯', self),
|
||||
'3번 슬롯': QAction(FIF.SETTING.icon(), '3번 슬롯', self),
|
||||
'4번 슬롯': QAction(FIF.SETTING.icon(), '4번 슬롯', self),
|
||||
'5번 슬롯': QAction(FIF.SETTING.icon(), '5번 슬롯', self)
|
||||
}
|
||||
# 액션에 메서드 연결 및 메뉴에 추가
|
||||
for text, action in self.actions.items():
|
||||
action.triggered.connect(lambda checked, text=text: self.save_business_action_triggered(text))
|
||||
self.menu.addAction(action)
|
||||
# 초기 스타일 시트 설정
|
||||
self.update_menu_items()
|
||||
|
||||
self.setWindowTitle('Change-Percenty2')
|
||||
self.setGeometry(100, 100, 450, 800)
|
||||
|
||||
|
|
@ -39,6 +63,9 @@ class MainWindow(QMainWindow):
|
|||
container.setLayout(main_layout)
|
||||
self.setCentralWidget(container)
|
||||
|
||||
|
||||
|
||||
|
||||
def create_menu(self):
|
||||
menubar = self.menuBar()
|
||||
|
||||
|
|
@ -116,12 +143,25 @@ class MainWindow(QMainWindow):
|
|||
|
||||
|
||||
def create_top_layout(self, layout):
|
||||
self.fetch_button = QPushButton('현재설정 가져오기')
|
||||
# self.fetch_button = QPushButton('현재설정 가져오기')
|
||||
self.fetch_button = PushButton('현재설정 가져오기', self)
|
||||
self.fetch_button.setMinimumSize(150,50)
|
||||
self.fetch_button.clicked.connect(lambda: asyncio.ensure_future(self.fetch_settings()))
|
||||
layout.addWidget(self.fetch_button)
|
||||
|
||||
self.select_Business = QSpinBox()
|
||||
self.select_Business.setSuffix("번째 사업자")
|
||||
self.select_Business.setValue(1)
|
||||
self.select_Business.setMaximum(self.max_business_number)
|
||||
self.select_Business.setMinimum(1)
|
||||
# self.select_Business.valueChanged.connect(self.updateSelect_Business)
|
||||
layout.addWidget(self.select_Business)
|
||||
|
||||
|
||||
self.save_button = QPushButton('현재설정 저장하기')
|
||||
# self.save_button = DropDownPushButton(FIF.SETTING, '현재설정 저장하기',self)
|
||||
# self.save_button.setMenu(self.menu)
|
||||
# self.save_button.setMenu(self.menu)
|
||||
self.save_button.setMinimumSize(150,50)
|
||||
self.save_button.clicked.connect(lambda: asyncio.ensure_future(self.save_settings()))
|
||||
layout.addWidget(self.save_button)
|
||||
|
|
@ -303,9 +343,11 @@ class MainWindow(QMainWindow):
|
|||
def market_info_cc_btn_clicked(self, button):
|
||||
currentBtnMarket = button.text()
|
||||
if self.current_api_keys:
|
||||
print("get_market_infos 호출")
|
||||
print(f"{currentBtnMarket} 호출")
|
||||
print(f"self.current_api_keys 인자 : {self.current_api_keys}")
|
||||
|
||||
market_api_infos = self.get_market_infos(self.current_api_keys, currentBtnMarket)
|
||||
print("call_UI")
|
||||
print(f"리턴된 market_api_infos : {market_api_infos}")
|
||||
self.api_widget.call_UI(market_api_infos)
|
||||
else:
|
||||
print(f"{currentBtnMarket}의 마켓정보 없음")
|
||||
|
|
@ -317,17 +359,17 @@ class MainWindow(QMainWindow):
|
|||
|
||||
await self.playwright_helper.init_browser()
|
||||
self.progress_bar.setValue(5)
|
||||
user_id = self.config.get('USER', 'user_id')
|
||||
password = self.config.decrypt(self.config.get('USER', 'password'))
|
||||
user_id = self.config.get('Percenty_Setting', 'user_id')
|
||||
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
|
||||
|
||||
web_api_keys = await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password, self.status_label, self.progress_bar)
|
||||
self.current_api_keys = web_api_keys
|
||||
print(f"가져온 apikeys\n{web_api_keys}")
|
||||
|
||||
business_info = self.search_apikeys_for_business(web_api_keys)
|
||||
selected_business_info = self.search_apikeys_for_business(web_api_keys)
|
||||
|
||||
# 가져온 API 키를 UI에 업데이트하는 로직 추가
|
||||
self.update_market_info(web_api_keys, business_info)
|
||||
self.update_market_info(web_api_keys, selected_business_info)
|
||||
self.progress_bar.setValue(100)
|
||||
self.status_label.setText('현재 상태: 설정 가져오기 완료')
|
||||
await self.playwright_helper.close_browser()
|
||||
|
|
@ -345,15 +387,16 @@ class MainWindow(QMainWindow):
|
|||
|
||||
# max_business = int(self.config.get('DEFAULT', 'max_businesses'))
|
||||
|
||||
all = self.config.get_all_businesses()
|
||||
print(f"저장된 사업자 수 : [{len(all)}] 개")
|
||||
print(f"all : {all}")
|
||||
|
||||
progress_step = 15 / len(all)
|
||||
|
||||
print(f"progress_step : {progress_step}")
|
||||
|
||||
try:
|
||||
|
||||
all = self.config.get_all_businesses()
|
||||
print(f"저장된 사업자 수 : [{len(all)}] 개")
|
||||
print(f"all : {all}")
|
||||
|
||||
progress_step = 15 / len(all)
|
||||
|
||||
print(f"progress_step : {progress_step}")
|
||||
|
||||
# 저장된 모든 사업자 정보 가져오기
|
||||
for business_section in all:
|
||||
print(f"키검증 business_section : {business_section}")
|
||||
|
|
@ -377,24 +420,87 @@ class MainWindow(QMainWindow):
|
|||
return business_info
|
||||
|
||||
def get_market_infos(self, current_api_keys, market_name):
|
||||
# 현재 current_api_keys는 이미 전체 마켓 데이터를 포함하는 사전입니다.
|
||||
if market_name in current_api_keys:
|
||||
market_details = current_api_keys[market_name]
|
||||
api_keys = {key: value for key, value in market_details.items() if 'key' in key.lower() or '키' in key}
|
||||
|
||||
if market_name == '쿠팡':
|
||||
api_keys = {
|
||||
'쿠팡ID': market_details.get('쿠팡ID'),
|
||||
'업체 코드': market_details.get('업체 코드'),
|
||||
'Access Key': market_details.get('Access Key'),
|
||||
'Secret Key': market_details.get('Secret Key'),
|
||||
}
|
||||
elif market_name == '스마트스토어':
|
||||
api_keys = {
|
||||
'업로드 할 스마트스토어 계정': market_details.get('업로드항 스마트스토어 계정'),
|
||||
'애플리케이션 ID': market_details.get('애플리케이션 ID'),
|
||||
'애플리케이션 시크릿': market_details.get('애플리케이션 시크릿'),
|
||||
}
|
||||
elif market_name == 'ESM':
|
||||
api_keys = {
|
||||
'옥션ID': market_details.get('옥션ID'),
|
||||
'G마켓 ID': market_details.get('G마켓 ID'),
|
||||
}
|
||||
elif market_name == '11번가-국내':
|
||||
api_keys = {
|
||||
'API KEY': market_details.get('API KEY'),
|
||||
}
|
||||
elif market_name == '11번가-글로벌':
|
||||
api_keys = {
|
||||
'API KEY': market_details.get('API KEY'),
|
||||
}
|
||||
elif market_name == '롯데온':
|
||||
api_keys = {
|
||||
'API KEY': market_details.get('API KEY'),
|
||||
}
|
||||
elif market_name == '인터파크':
|
||||
api_keys = {
|
||||
'상품상태재고수정 인증키': market_details.get('상품상태재고수정 인증키'),
|
||||
'상품상태재고수정 비밀키': market_details.get('상품상태재고수정 비밀키'),
|
||||
'상품재고조회 인증키': market_details.get('상품재고조회 인증키'),
|
||||
'상품재고조회 비밀키': market_details.get('상품재고조회 비밀키'),
|
||||
'상품정보조회 인증': market_details.get('상품정보조회 인증'),
|
||||
'상품정보조회 비밀키': market_details.get('상품정보조회 비밀키'),
|
||||
'상품수정 인증키': market_details.get('상품수정 인증키'),
|
||||
'상품수정 비밀키': market_details.get('상품수정 비밀키'),
|
||||
'상품등록 인증키': market_details.get('상품등록 인증키'),
|
||||
'상품등록 비밀키': market_details.get('상품등록 비밀키'),
|
||||
'반품배송지조회 인증키': market_details.get('반품배송지조회 인증키'),
|
||||
'반품배송지조회 비밀키': market_details.get('반품배송지조회 비밀키'),
|
||||
'반품배송지등록 인증키': market_details.get('반품배송지등록 인증키'),
|
||||
'반품배송지등록 비밀키': market_details.get('반품배송지등록 비밀키'),
|
||||
'상품QnA등록 인증키': market_details.get('상품QnA등록 인증키'),
|
||||
'상품QnA등록 비밀키': market_details.get('상품QnA등록 비밀키'),
|
||||
'상품QnA조회 인증키': market_details.get('상품QnA조회 인증키'),
|
||||
'상품QnA조회 비밀키': market_details.get('상품QnA조회 비밀키'),
|
||||
'인터파크 업체번호': market_details.get('인터파크 업체번호'),
|
||||
'공급계약 일련번호': market_details.get('공급계약 일련번호'),
|
||||
}
|
||||
elif market_name == '위메프':
|
||||
api_keys = {
|
||||
'API KEY': market_details.get('API KEY'),
|
||||
}
|
||||
elif market_name == '옥션1.0':
|
||||
api_keys = {
|
||||
'API KEY': market_details.get('API KEY'),
|
||||
'멤버 ID': market_details.get('멤버 ID'),
|
||||
}
|
||||
else:
|
||||
api_keys = {key: value for key, value in market_details.items() if 'key' in key.lower() or '키' in key}
|
||||
|
||||
return api_keys
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def update_market_info(self, api_keys, business_info):
|
||||
print(f"update_market_info : {api_keys}\n\n{business_info}")
|
||||
def update_market_info(self, web_api_keys, selected_business_info):
|
||||
print(f"update_market_info : {web_api_keys}\n\n{selected_business_info}")
|
||||
|
||||
# 사업자 정보 업데이트
|
||||
self.business_info_label_context.setText(business_info['사업자별칭'])
|
||||
self.business_register_number_label_context.setText(business_info['사업자등록번호'])
|
||||
self.business_name_label_context.setText(business_info['상호명'])
|
||||
self.business_date_label_context.setText(business_info['등록날짜'])
|
||||
self.business_call_label_context.setText(business_info['응대전화번호'])
|
||||
self.business_info_label_context.setText(selected_business_info['사업자별칭'])
|
||||
self.business_register_number_label_context.setText(selected_business_info['사업자등록번호'])
|
||||
self.business_name_label_context.setText(selected_business_info['상호명'])
|
||||
self.business_date_label_context.setText(selected_business_info['등록날짜'])
|
||||
self.business_call_label_context.setText(selected_business_info['응대전화번호'])
|
||||
|
||||
# 마켓 정보 업데이트
|
||||
market_buttons = [
|
||||
|
|
@ -410,10 +516,10 @@ class MainWindow(QMainWindow):
|
|||
]
|
||||
|
||||
for button, market, label in market_buttons:
|
||||
market_info = api_keys.get(market, None)
|
||||
market_info = web_api_keys.get(market, None)
|
||||
if market_info:
|
||||
button.setStyleSheet("background-color: lightgreen;")
|
||||
label.setText(business_info['사업자별칭'])
|
||||
label.setText(selected_business_info['사업자별칭'])
|
||||
else:
|
||||
button.setStyleSheet("background-color: darkgray;")
|
||||
label.setText("NoMatch")
|
||||
|
|
@ -434,33 +540,6 @@ class MainWindow(QMainWindow):
|
|||
|
||||
self.config.set_business_info(1, business_info)
|
||||
|
||||
# 예시 API 키 설정
|
||||
api_keys = {
|
||||
'쿠팡': {
|
||||
'쿠팡ID': 'example_coupang_id',
|
||||
'업체 코드': 'example_company_code',
|
||||
'Access Key': 'example_access_key',
|
||||
'Secret Key': 'example_secret_key'
|
||||
},
|
||||
'스마트스토어': {
|
||||
'애플리케이션 ID': 'example_application_id',
|
||||
'애플리케이션 시크릿': 'example_application_secret'
|
||||
},
|
||||
'ESM': {
|
||||
'옥션ID': 'example_auction_id',
|
||||
'G마켓 ID': 'example_gmarket_id'
|
||||
},
|
||||
'11번가-일반': {
|
||||
'API KEY': 'example_11st_api_key'
|
||||
},
|
||||
'11번가-글로벌': {
|
||||
'API KEY': 'example_11st_global_api_key'
|
||||
},
|
||||
'롯데온': {
|
||||
'API KEY': 'example_lotteon_api_key'
|
||||
},
|
||||
}
|
||||
|
||||
self.config.set_api_keys(1, api_keys)
|
||||
|
||||
self.progress_bar.setValue(100)
|
||||
|
|
@ -478,8 +557,8 @@ class MainWindow(QMainWindow):
|
|||
|
||||
# 선택된 사업자와 마켓에 따라 API 키 변경 작업 수행
|
||||
await self.playwright_helper.init_browser()
|
||||
user_id = self.config.get('USER', 'user_id')
|
||||
password = self.config.decrypt(self.config.get('USER', 'password'))
|
||||
user_id = self.config.get('Percenty_Setting', 'user_id')
|
||||
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
|
||||
api_keys = {} # 여기에 새로운 API 키를 설정하는 로직 추가
|
||||
|
||||
await self.playwright_helper.update_api_keys('https://percenty.co.kr', user_id, password, api_keys, self.status_label, self.progress_bar)
|
||||
|
|
@ -491,6 +570,56 @@ class MainWindow(QMainWindow):
|
|||
# 작업 완료 창 띄우기
|
||||
self.show_completion_dialog()
|
||||
|
||||
def save_business_action_triggered(self, action_name):
|
||||
if action_name == '1번 슬롯':
|
||||
print("1번자리")
|
||||
self.change_slot(int(action_name.split('번')[0]))
|
||||
|
||||
elif action_name == '2번 슬롯':
|
||||
print("2번자리")
|
||||
self.change_slot(int(action_name.split('번')[0]))
|
||||
|
||||
elif action_name == '3번 슬롯':
|
||||
print("3번자리")
|
||||
self.change_slot(int(action_name.split('번')[0]))
|
||||
|
||||
elif action_name == '4번 슬롯':
|
||||
print("4번자리")
|
||||
self.change_slot(int(action_name.split('번')[0]))
|
||||
|
||||
elif action_name == '5번 슬롯':
|
||||
print("5번자리")
|
||||
self.change_slot(int(action_name.split('번')[0]))
|
||||
|
||||
|
||||
def update_menu_items(self):
|
||||
# Update text of menu items based on the current slot
|
||||
for text, action in self.actions.items():
|
||||
if text.startswith(f'{self.current_slot}번'):
|
||||
action.setText(f'{self.current_slot}번 슬롯 (활성화)')
|
||||
action.setProperty("highlighted", True)
|
||||
else:
|
||||
action.setText(text.split(' ')[0] + ' 슬롯')
|
||||
action.setProperty("highlighted", False)
|
||||
|
||||
# Apply QSS 스타일 시트
|
||||
self.menu.setStyleSheet("""
|
||||
QMenu::item {
|
||||
background-color: white;
|
||||
color: black;
|
||||
}
|
||||
QMenu::item:selected {
|
||||
background-color: lightgray;
|
||||
}
|
||||
QMenu::item[highlighted="true"] {
|
||||
color: red;
|
||||
}
|
||||
""")
|
||||
|
||||
def change_slot(self, new_slot):
|
||||
self.current_slot = new_slot
|
||||
self.update_menu_items()
|
||||
|
||||
def show_completion_dialog(self):
|
||||
dialog = QDialog(self)
|
||||
dialog.setWindowTitle('작업 완료')
|
||||
|
|
@ -512,8 +641,8 @@ class MainWindow(QMainWindow):
|
|||
|
||||
async def run_browser(self):
|
||||
await self.playwright_helper.init_browser(headless=False)
|
||||
user_id = self.config.get('USER', 'user_id')
|
||||
password = self.config.decrypt(self.config.get('USER', 'password'))
|
||||
user_id = self.config.get('Percenty_Setting', 'user_id')
|
||||
password = self.config.decrypt(self.config.get('Percenty_Setting', 'password'))
|
||||
await self.playwright_helper.login_and_fetch_api_keys('https://percenty.co.kr', user_id, password)
|
||||
|
||||
def show_help(self):
|
||||
|
|
@ -525,5 +654,8 @@ class MainWindow(QMainWindow):
|
|||
dialog.exec_()
|
||||
|
||||
def show_business_settings(self):
|
||||
dialog = BusinessSettingsDialog(self.config)
|
||||
# dialog = BusinessSettingsDialog(self.config)
|
||||
max_business_count = 5
|
||||
dialog = BusinessSettings(max_business_count)
|
||||
|
||||
dialog.exec_()
|
||||
|
|
|
|||
206
utils/config.py
206
utils/config.py
|
|
@ -3,20 +3,21 @@ from cryptography.fernet import Fernet, InvalidToken
|
|||
import os
|
||||
|
||||
class ConfigManager:
|
||||
def __init__(self, config_file='config.ini'):
|
||||
def __init__(self, config_file='config.ini', max_businesses=5):
|
||||
self.config_file = config_file
|
||||
self.config = configparser.ConfigParser()
|
||||
self.valid_markets = ['쿠팡', '스마트스토어','옥션지마켓', '11번가-일반','11번가-글로벌', '롯데온','인터파크', '위메프', '옥션1.0'] # 여기에 원하는 마켓 이름을 추가하세요
|
||||
self.max_businesses = max_businesses
|
||||
self.valid_markets = ['쿠팡', '스마트스토어', 'ESM', '11번가-국내', '11번가-글로벌', '롯데온', '인터파크', '위메프', '옥션1.0']
|
||||
|
||||
if not os.path.exists(config_file):
|
||||
self._create_default_config()
|
||||
|
||||
self.config.read(config_file, encoding='cp949')
|
||||
self.config.read(config_file, encoding='utf-8')
|
||||
|
||||
if 'DEFAULT' not in self.config or 'encryption_key' not in self.config['DEFAULT']:
|
||||
self.key = Fernet.generate_key()
|
||||
self.config['DEFAULT']['encryption_key'] = self.key.decode()
|
||||
with open(self.config_file, 'w') as configfile:
|
||||
with open(self.config_file, 'w', encoding='utf-8') as configfile:
|
||||
self.config.write(configfile)
|
||||
else:
|
||||
self.key = self.config['DEFAULT']['encryption_key'].encode()
|
||||
|
|
@ -25,12 +26,97 @@ class ConfigManager:
|
|||
|
||||
def _create_default_config(self):
|
||||
self.config['DEFAULT'] = {
|
||||
'max_businesses': '5',
|
||||
'max_businesses': str(self.max_businesses),
|
||||
'log_level': 'DEBUG',
|
||||
'business_count': '0',
|
||||
'encryption_key': Fernet.generate_key().decode()
|
||||
}
|
||||
with open(self.config_file, 'w') as configfile:
|
||||
|
||||
for i in range(1, self.max_businesses + 1):
|
||||
section = f'BUSINESS_{i}'
|
||||
self.config[section] = {
|
||||
'사업자별칭': '',
|
||||
'사업자등록번호': '',
|
||||
'상호명': '',
|
||||
'등록날짜': '',
|
||||
'응대전화번호': '',
|
||||
'etc1_title': '',
|
||||
'etc1_context': '',
|
||||
'etc2_title': '',
|
||||
'etc2_context': '',
|
||||
'etc3_title': '',
|
||||
'etc3_context': '',
|
||||
'etc4_title': '',
|
||||
'etc4_context': '',
|
||||
'etc5_title': '',
|
||||
'etc5_context': ''
|
||||
}
|
||||
for market in self.valid_markets:
|
||||
if market == '쿠팡':
|
||||
self.config[section].update({
|
||||
'쿠팡_쿠팡ID': '',
|
||||
'쿠팡_업체 코드': '',
|
||||
'쿠팡_Access Key': '',
|
||||
'쿠팡_Secret Key': ''
|
||||
})
|
||||
elif market == '스마트스토어':
|
||||
self.config[section].update({
|
||||
'스마트스토어_업로드 할 스마트스토어 계정 ID': '',
|
||||
'스마트스토어_업로드 할 스마트스토어 계정 PW': '',
|
||||
'스마트스토어_애플리케이션 ID': '',
|
||||
'스마트스토어_애플리케이션 시크릿': ''
|
||||
})
|
||||
elif market == 'ESM':
|
||||
self.config[section].update({
|
||||
'ESM_옥션ID': '',
|
||||
'ESM_G마켓 ID': ''
|
||||
})
|
||||
elif market == '11번가-국내':
|
||||
self.config[section].update({
|
||||
'11번가-국내_API KEY': ''
|
||||
})
|
||||
elif market == '11번가-글로벌':
|
||||
self.config[section].update({
|
||||
'11번가-글로벌_API KEY': ''
|
||||
})
|
||||
elif market == '롯데온':
|
||||
self.config[section].update({
|
||||
'롯데온_API KEY': ''
|
||||
})
|
||||
elif market == '인터파크':
|
||||
self.config[section].update({
|
||||
'인터파크_상품상태재고수정 인증키': '',
|
||||
'인터파크_상품상태재고수정 비밀키': '',
|
||||
'인터파크_상품재고조회 인증키': '',
|
||||
'인터파크_상품재고조회 비밀키': '',
|
||||
'인터파크_상품정보조회 인증': '',
|
||||
'인터파크_상품정보조회 비밀키': '',
|
||||
'인터파크_상품수정 인증키': '',
|
||||
'인터파크_상품수정 비밀키': '',
|
||||
'인터파크_상품등록 인증키': '',
|
||||
'인터파크_상품등록 비밀키': '',
|
||||
'인터파크_반품배송지조회 인증키': '',
|
||||
'인터파크_반품배송지조회 비밀키': '',
|
||||
'인터파크_반품배송지등록 인증키': '',
|
||||
'인터파크_반품배송지등록 비밀키': '',
|
||||
'인터파크_상품QnA등록 인증키': '',
|
||||
'인터파크_상품QnA등록 비밀키': '',
|
||||
'인터파크_상품QnA조회 인증키': '',
|
||||
'인터파크_상품QnA조회 비밀키': '',
|
||||
'인터파크_인터파크 업체번호': '',
|
||||
'인터파크_공급계약 일련번호': ''
|
||||
})
|
||||
elif market == '위메프':
|
||||
self.config[section].update({
|
||||
'위메프_API KEY': ''
|
||||
})
|
||||
elif market == '옥션1.0':
|
||||
self.config[section].update({
|
||||
'옥션1.0_API KEY': '',
|
||||
'옥션1.0_멤버 ID': ''
|
||||
})
|
||||
|
||||
with open(self.config_file, 'w', encoding='utf-8') as configfile:
|
||||
self.config.write(configfile)
|
||||
|
||||
def get(self, section, option, fallback=None):
|
||||
|
|
@ -40,36 +126,28 @@ class ConfigManager:
|
|||
if not self.config.has_section(section):
|
||||
self.config.add_section(section)
|
||||
self.config.set(section, option, value)
|
||||
with open(self.config_file, 'w') as configfile:
|
||||
with open(self.config_file, 'w', encoding='utf-8') as configfile:
|
||||
self.config.write(configfile)
|
||||
|
||||
def encrypt(self, data):
|
||||
return self.cipher_suite.encrypt(data.encode()).decode()
|
||||
|
||||
def decrypt(self, encrypted_data):
|
||||
print(f"encrypted_data : {encrypted_data} ")
|
||||
try:
|
||||
print("decrypt Try")
|
||||
result = self.cipher_suite.decrypt(encrypted_data.encode()).decode()
|
||||
print(f"result : {result}")
|
||||
return result
|
||||
return self.cipher_suite.decrypt(encrypted_data.encode()).decode()
|
||||
except InvalidToken:
|
||||
raise ValueError("Invalid encryption key or corrupted data.")
|
||||
|
||||
def get_business_info(self, business_section):
|
||||
|
||||
if not self.config.has_section(business_section):
|
||||
print(f"{business_section} : 해당 섹션이 없음")
|
||||
return None
|
||||
print(f"business_section : {business_section}")
|
||||
print(f"self.config.get(business_section, '사업자별칭', fallback='설정사업자없음') \n {self.config.get(business_section, '사업자별칭', fallback='설정사업자없음')}")
|
||||
|
||||
|
||||
business_info = {
|
||||
'사업자별칭': self.config.get(business_section, '사업자별칭', fallback='설정사업자없음'),
|
||||
'사업자등록번호': self.config.get(business_section, '사업자등록번호', fallback='000-00-00000'),
|
||||
'상호명': self.config.get(business_section, '상호명', fallback='설정사업자없음'),
|
||||
'등록날짜': self.config.get(business_section, '등록날짜', fallback='0000-00-00'),
|
||||
'응대전화번호': self.config.get(business_section, '응대전화번호', fallback='000-000-0000')
|
||||
'사업자별칭': self.config.get(business_section, 'alias', fallback='설정사업자없음'),
|
||||
'사업자등록번호': self.config.get(business_section, 'register_number', fallback='000-00-00000'),
|
||||
'상호명': self.config.get(business_section, 'name', fallback='설정사업자없음'),
|
||||
'등록날짜': self.config.get(business_section, 'date', fallback='0000-00-00'),
|
||||
'응대전화번호': self.config.get(business_section, 'call', fallback='000-000-0000')
|
||||
}
|
||||
return business_info
|
||||
|
||||
|
|
@ -89,102 +167,27 @@ class ConfigManager:
|
|||
return businesses
|
||||
|
||||
def get_api_keys(self, business_section):
|
||||
print("get_api_keys")
|
||||
print(f"business_section : {business_section}")
|
||||
if not self.config.has_section(business_section):
|
||||
print("business_section이 존재하지 않음")
|
||||
return {}
|
||||
|
||||
api_keys = {}
|
||||
for key in self.config.options(business_section):
|
||||
print(f"key : {key}")
|
||||
market_name = key.split('_', 1)[0]
|
||||
print(f"market_name : {market_name}")
|
||||
if market_name in self.valid_markets and '_' in key:
|
||||
market, key_name = key.split('_', 1)
|
||||
print(f"market : {market}")
|
||||
print(f"key_name : {key_name}")
|
||||
if market not in api_keys:
|
||||
api_keys[market] = {}
|
||||
print("market not in api_keys, 마켓생성")
|
||||
encrypted_value = self.config.get(business_section, key)
|
||||
print(f"encrypted_value : {encrypted_value}")
|
||||
if encrypted_value:
|
||||
try:
|
||||
decrypted_value = self.decrypt(encrypted_value)
|
||||
print(f"decrypted_value : {decrypted_value}")
|
||||
api_keys[market][key_name] = decrypted_value
|
||||
except Exception as e:
|
||||
print(f"Decryption failed for key {key}: {e}")
|
||||
api_keys[market][key_name] = ''
|
||||
else:
|
||||
api_keys[market][key_name] = ''
|
||||
print(f"Empty value for key {key}, setting as empty string")
|
||||
|
||||
print(f"최종 api_keys: {api_keys}")
|
||||
return api_keys
|
||||
|
||||
|
||||
def get_api_keys_2(self, business_id):
|
||||
section = f'API_KEYS_{business_id}'
|
||||
if not self.config.has_section(section):
|
||||
return None
|
||||
return {
|
||||
'쿠팡': {
|
||||
'쿠팡ID': self.get(section, 'coupang_coupangid', ''),
|
||||
'업체 코드': self.get(section, 'coupang_업체_코드', ''),
|
||||
'Access Key': self.get(section, 'coupang_access_key', ''),
|
||||
'Secret Key': self.get(section, 'coupang_secret_key', '')
|
||||
},
|
||||
'스마트스토어': {
|
||||
'업로드항 스마트스토어 계정': self.get(section, 'ss_업로드항_스마트스토어_계정', ''),
|
||||
'애플리케이션 ID': self.get(section, 'ss_application_id', ''),
|
||||
'애플리케이션 시크릿': self.get(section, 'ss_application_secret', '')
|
||||
},
|
||||
'옥션지마켓': {
|
||||
'옥션ID': self.get(section, 'esm_auction_id', ''),
|
||||
'G마켓 ID': self.get(section, 'esm_gmarket_id', '')
|
||||
},
|
||||
'11번가-일반': {
|
||||
'API KEY': self.get(section, 'est_api_key', '')
|
||||
},
|
||||
'11번가-글로벌': {
|
||||
'API KEY': self.get(section, 'est_global_api_key', '')
|
||||
},
|
||||
'롯데온': {
|
||||
'API KEY': self.get(section, 'lotteon_api_key', '')
|
||||
},
|
||||
'인터파크': {
|
||||
'상품상태재고수정 인증키': self.get(section, 'ip_product_status_inventory_update_auth_key', ''),
|
||||
'상품상태재고수정 비밀키': self.get(section, 'ip_product_status_inventory_update_secret_key', ''),
|
||||
'상품재고조회 인증키': self.get(section, 'ip_product_inventory_check_auth_key', ''),
|
||||
'상품재고조회 비밀키': self.get(section, 'ip_product_inventory_check_secret_key', ''),
|
||||
'상품정보조회 인증': self.get(section, 'ip_product_info_check_auth_key', ''),
|
||||
'상품정보조회 비밀키': self.get(section, 'ip_product_info_check_secret_key', ''),
|
||||
'상품수정 인증키': self.get(section, 'ip_product_update_auth_key', ''),
|
||||
'상품수정 비밀키': self.get(section, 'ip_product_update_secret_key', ''),
|
||||
'상품등록 인증키': self.get(section, 'ip_product_register_auth_key', ''),
|
||||
'상품등록 비밀키': self.get(section, 'ip_product_register_secret_key', ''),
|
||||
'반품배송지조회 인증키': self.get(section, 'ip_return_address_check_auth_key', ''),
|
||||
'반품배송지조회 비밀키': self.get(section, 'ip_return_address_check_secret_key', ''),
|
||||
'반품배송지등록 인증키': self.get(section, 'ip_return_address_register_auth_key', ''),
|
||||
'반품배송지등록 비밀키': self.get(section, 'ip_return_address_register_secret_key', ''),
|
||||
'상품QnA등록 인증키': self.get(section, 'ip_product_qna_register_auth_key', ''),
|
||||
'상품QnA등록 비밀키': self.get(section, 'ip_product_qna_register_secret_key', ''),
|
||||
'상품QnA조회 인증키': self.get(section, 'ip_product_qna_check_auth_key', ''),
|
||||
'상품QnA조회 비밀키': self.get(section, 'ip_product_qna_check_secret_key', ''),
|
||||
'인터파크 업체번호': self.get(section, 'ip_interpark_company_number', ''),
|
||||
'공급계약 일련번호': self.get(section, 'ip_supply_contract_serial_number', '')
|
||||
},
|
||||
'위메프': {
|
||||
'API KEY': self.get(section, 'wmp_api_key', '')
|
||||
},
|
||||
'옥션1.0': {
|
||||
'API KEY': self.get(section, 'at_api_key', ''),
|
||||
'멤버 ID': self.get(section, 'at_member_id', '')
|
||||
}
|
||||
}
|
||||
|
||||
def set_api_keys(self, business_id, api_keys):
|
||||
business_section = f'BUSINESS_{business_id}'
|
||||
if not self.config.has_section(business_section):
|
||||
|
|
@ -195,18 +198,17 @@ class ConfigManager:
|
|||
encrypted_value = self.encrypt(key_value)
|
||||
self.config.set(business_section, f'{market}_{key_name}', encrypted_value)
|
||||
|
||||
with open(self.config_file, 'w') as configfile:
|
||||
with open(self.config_file, 'w', encoding='utf-8') as configfile:
|
||||
self.config.write(configfile)
|
||||
|
||||
|
||||
def reset_settings(self):
|
||||
if os.path.exists(self.config_file):
|
||||
os.remove(self.config_file)
|
||||
self._create_default_config()
|
||||
self.config.read(self.config_file)
|
||||
self.config.read(self.config_file, encoding='utf-8')
|
||||
|
||||
def get_user_info(self):
|
||||
user_id = self.get('USER', 'user_id', fallback='')
|
||||
encrypted_password = self.get('USER', 'password', fallback='')
|
||||
user_id = self.get('Percenty_Setting', 'user_id', fallback='')
|
||||
encrypted_password = self.get('Percenty_Setting', 'password', fallback='')
|
||||
password = self.decrypt(encrypted_password) if encrypted_password else ''
|
||||
return user_id, password
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ class PlaywrightHelper:
|
|||
# 마켓 설정상 팝업 다이얼로그가 있는 경우 닫기 (있는 경우)
|
||||
try:
|
||||
# await page.click(".ant-modal-footer [type='button']")
|
||||
await page.click("div.ant-modal-footer > button[type=\"button\"].ant-btn.css-1li46mu.ant-btn-primary")
|
||||
await page.click("div.ant-modal-footer > button[type=\"button\"].ant-btn.css-1li46mu.ant-btn-primary",2)
|
||||
|
||||
# .ant-modal-content
|
||||
# .ant-modal-footer [type='button']
|
||||
|
|
@ -64,7 +64,7 @@ class PlaywrightHelper:
|
|||
'Secret Key': "div#rc-tabs-0-panel-cp div:nth-child(4) > input",
|
||||
},
|
||||
'스마트스토어': {
|
||||
'업로드항 스마트스토어 계정' : "div#rc-tabs-0-panel-ss div:nth-child(1) > input",
|
||||
'업로드 할 스마트스토어 계정' : "div#rc-tabs-0-panel-ss div:nth-child(1) > input",
|
||||
'애플리케이션 ID': "div#rc-tabs-0-panel-ss div:nth-child(3) > input",
|
||||
'애플리케이션 시크릿': "div#rc-tabs-0-panel-ss div:nth-child(3) > input",
|
||||
},
|
||||
|
|
@ -72,7 +72,7 @@ class PlaywrightHelper:
|
|||
'옥션ID': "div#rc-tabs-0-panel-esm div:nth-child(1) > input",
|
||||
'G마켓 ID': "div#rc-tabs-0-panel-esm div:nth-child(2) > input",
|
||||
},
|
||||
'11번가-일반': {
|
||||
'11번가-국내': {
|
||||
'API KEY': "div#rc-tabs-0-panel-est input",
|
||||
},
|
||||
'11번가-글로벌': {
|
||||
|
|
@ -124,8 +124,8 @@ class PlaywrightHelper:
|
|||
print(f"api_keys['ESM'] \n {api_keys['ESM']}")
|
||||
progress_bar.setValue(45)
|
||||
status_label.setText('현재 상태: ESM 가져오기 완료')
|
||||
api_keys['11번가-일반'] = await fetch_market_api_keys("div#rc-tabs-0-tab-est", api_key_xpaths['11번가-일반'])
|
||||
print(f"api_keys['11번가-일반'] \n {api_keys['11번가-일반']}")
|
||||
api_keys['11번가-국내'] = await fetch_market_api_keys("div#rc-tabs-0-tab-est", api_key_xpaths['11번가-국내'])
|
||||
print(f"api_keys['11번가-국내'] \n {api_keys['11번가-국내']}")
|
||||
progress_bar.setValue(50)
|
||||
status_label.setText('현재 상태: 11번가 국내 가져오기 완료')
|
||||
api_keys['11번가-글로벌'] = await fetch_market_api_keys("div#rc-tabs-0-tab-est_global", api_key_xpaths['11번가-글로벌'])
|
||||
|
|
@ -194,7 +194,7 @@ class PlaywrightHelper:
|
|||
progress_bar.setValue(45)
|
||||
status_label.setText('현재 상태: ESM 업데이트 완료')
|
||||
|
||||
await update_market_api_keys("div#rc-tabs-0-tab-est", api_keys['11번가-일반'])
|
||||
await update_market_api_keys("div#rc-tabs-0-tab-est", api_keys['11번가-국내'])
|
||||
progress_bar.setValue(50)
|
||||
status_label.setText('현재 상태: 11번가 국내 업데이트 완료')
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,176 @@
|
|||
from PyQt4 import QtGui, QtCore
|
||||
# from load_CSS import load_CSS
|
||||
# from widgets import UniversalPlotWidget
|
||||
import sys
|
||||
import time
|
||||
|
||||
def exit_application():
|
||||
"""Exit program event handler"""
|
||||
|
||||
sys.exit(1)
|
||||
|
||||
class VerticalTabBar(QtGui.QTabBar):
|
||||
def __init__(self, width, height, parent=None):
|
||||
super(VerticalTabBar, self).__init__(parent)
|
||||
self.width = width
|
||||
self.height = height
|
||||
|
||||
def tabSizeHint(self, index):
|
||||
return QtCore.QSize(self.width, self.height)
|
||||
|
||||
def paintEvent(self, event):
|
||||
painter = QtGui.QStylePainter(self)
|
||||
tab_options = QtGui.QStyleOptionTab()
|
||||
|
||||
for tab in range(self.count()):
|
||||
self.initStyleOption(tab_options, tab)
|
||||
painter.drawControl(QtGui.QStyle.CE_TabBarTabShape, tab_options)
|
||||
painter.save()
|
||||
|
||||
size = tab_options.rect.size()
|
||||
size.transpose()
|
||||
rectangle = QtCore.QRect(QtCore.QPoint(), size)
|
||||
rectangle.moveCenter(tab_options.rect.center())
|
||||
tab_options.rect = rectangle
|
||||
|
||||
center = self.tabRect(tab).center()
|
||||
painter.translate(center)
|
||||
painter.rotate(90)
|
||||
painter.translate(-center)
|
||||
painter.drawControl(QtGui.QStyle.CE_TabBarTabLabel, tab_options);
|
||||
painter.restore()
|
||||
|
||||
class TabWidget(QtGui.QTabWidget):
|
||||
def __init__(self, *args, **kwargs):
|
||||
QtGui.QTabWidget.__init__(self, *args, **kwargs)
|
||||
self.setTabBar(VerticalTabBar(kwargs.pop('width'), kwargs.pop('height')))
|
||||
self.setTabPosition(QtGui.QTabWidget.West)
|
||||
self.setTabShape(QtGui.QTabWidget.Rounded)
|
||||
|
||||
class AdminTabWidget(QtGui.QWidget):
|
||||
def __init__(self, parent=None):
|
||||
super(AdminTabWidget, self).__init__(parent)
|
||||
self.setWindowModality(QtCore.Qt.ApplicationModal)
|
||||
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
|
||||
self.admin_page_locked_init()
|
||||
self.admin_page_unlocked_init()
|
||||
|
||||
self.admin_page_layout = QtGui.QGridLayout()
|
||||
|
||||
self.admin_page_switch = QtGui.QStackedWidget()
|
||||
self.admin_page_switch.addWidget(self.admin_locked_tab)
|
||||
self.admin_page_switch.addWidget(self.admin_unlocked_tab)
|
||||
self.admin_page_switch.setCurrentIndex(0)
|
||||
self.admin_page_layout.addWidget(self.admin_page_switch,0,0)
|
||||
|
||||
def admin_page_locked_init(self):
|
||||
self.admin_locked_tab = QtGui.QWidget()
|
||||
self.admin_locked_tab.setFixedSize(550,225)
|
||||
self.admin_locked_layout = QtGui.QGridLayout()
|
||||
|
||||
self.username_label = QtGui.QLabel('Username: ')
|
||||
self.username_field = QtGui.QLineEdit()
|
||||
self.username_field.returnPressed.connect(self.verify_credentials)
|
||||
self.space_label = QtGui.QLabel(' ')
|
||||
self.space_label.setFixedHeight(25)
|
||||
self.password_label = QtGui.QLabel('Password: ')
|
||||
self.password_field = QtGui.QLineEdit()
|
||||
self.password_field.returnPressed.connect(self.verify_credentials)
|
||||
self.password_field.setEchoMode(QtGui.QLineEdit.Password)
|
||||
|
||||
self.verify_button = QtGui.QPushButton('Ok')
|
||||
self.verify_button.clicked.connect(self.verify_credentials)
|
||||
self.cancel_button = QtGui.QPushButton('Cancel')
|
||||
self.cancel_button.clicked.connect(self.unauthorized)
|
||||
|
||||
self.status_label = QtGui.QLabel('')
|
||||
self.status_label.setAlignment(QtCore.Qt.AlignCenter)
|
||||
|
||||
self.button_layout = QtGui.QGridLayout()
|
||||
self.button_layout.addWidget(self.verify_button,0,0,1,1)
|
||||
self.button_layout.addWidget(self.cancel_button,0,1,1,1)
|
||||
|
||||
self.admin_locked_layout.addWidget(self.username_label,0,0,1,1)
|
||||
self.admin_locked_layout.addWidget(self.username_field,0,1,1,1)
|
||||
self.admin_locked_layout.addWidget(self.space_label,1,0,1,3)
|
||||
self.admin_locked_layout.addWidget(self.password_label,2,0,1,1)
|
||||
self.admin_locked_layout.addWidget(self.password_field,2,1,1,1)
|
||||
self.admin_locked_layout.addWidget(self.status_label,3,0,1,3)
|
||||
self.admin_locked_layout.addLayout(self.button_layout,4,0,1,3)
|
||||
|
||||
self.admin_locked_tab.setLayout(self.admin_locked_layout)
|
||||
|
||||
def verify_credentials(self):
|
||||
print('button pressed')
|
||||
# Grab username/password from input fields
|
||||
self.username = str(self.username_field.text())
|
||||
self.password = str(self.password_field.text())
|
||||
self.status_label.setText('Verifying')
|
||||
self.status_label.setStyleSheet('QLabel {color: rgb(117,255,161)}')
|
||||
self.spin(.001)
|
||||
print('verified')
|
||||
|
||||
def spin(self, seconds):
|
||||
"""Pause for set amount of seconds, replaces time.sleep so program doesnt stall"""
|
||||
|
||||
time_end = time.time() + seconds
|
||||
while time.time() < time_end:
|
||||
QtGui.QApplication.processEvents()
|
||||
|
||||
def unauthorized(self):
|
||||
print('unauthorized')
|
||||
self.status_label.setText('Invalid username and/or password')
|
||||
self.status_label.setStyleSheet('QLabel {color: rgb(255,65,106)}')
|
||||
|
||||
def admin_page_unlocked_init(self):
|
||||
self.admin_unlocked_tab = QtGui.QWidget()
|
||||
admin_unlocked_layout = QtGui.QGridLayout()
|
||||
admin_unlocked_button = QtGui.QPushButton('unlocked')
|
||||
admin_unlocked_layout.addWidget(admin_unlocked_button)
|
||||
self.admin_unlocked_tab.setLayout(admin_unlocked_layout)
|
||||
|
||||
def get_admin_page_layout(self):
|
||||
return self.admin_page_layout
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
# Create main application window
|
||||
app = QtGui.QApplication(sys.argv)
|
||||
# app.setStyleSheet(load_CSS(1))
|
||||
app.setStyle(QtGui.QStyleFactory.create("Cleanlooks"))
|
||||
font = QtGui.QFont('Ubuntu', 20)
|
||||
font.setWeight(70)
|
||||
app.setFont(font)
|
||||
|
||||
screen_height = QtGui.QApplication.desktop().screenGeometry().height()
|
||||
main_window_tab = TabWidget(width=300, height=screen_height/8)
|
||||
main_window_tab.setWindowTitle("Tab Layout")
|
||||
main_window_tab.setWindowFlags(QtCore.Qt.FramelessWindowHint)
|
||||
main_window_tab.showMaximized()
|
||||
|
||||
tab1 = QtGui.QWidget()
|
||||
tab2 = QtGui.QWidget()
|
||||
tab3 = QtGui.QWidget()
|
||||
tab4 = QtGui.QWidget()
|
||||
tab5 = QtGui.QWidget()
|
||||
tab6 = QtGui.QWidget()
|
||||
tab7 = QtGui.QWidget()
|
||||
admin_tab = QtGui.QWidget()
|
||||
|
||||
admin_tab_widget = AdminTabWidget()
|
||||
admin_tab.setLayout(admin_tab_widget.get_admin_page_layout())
|
||||
|
||||
main_window_tab.addTab(admin_tab, "Admin")
|
||||
main_window_tab.addTab(tab1, "tab1")
|
||||
main_window_tab.addTab(tab2, "tab2")
|
||||
main_window_tab.addTab(tab3, "tab3")
|
||||
main_window_tab.addTab(tab4, "tab4")
|
||||
main_window_tab.addTab(tab5, "tab5")
|
||||
main_window_tab.addTab(tab6, "tab6")
|
||||
main_window_tab.addTab(tab7, "tab7")
|
||||
|
||||
main_window_tab.show()
|
||||
|
||||
QtGui.QShortcut(QtGui.QKeySequence('Ctrl+Q'), main_window_tab, exit_application)
|
||||
|
||||
sys.exit(app.exec_())
|
||||
Loading…
Reference in New Issue