initBasti / Amazon2PlentySync (public) (License: GPLv3) (since 2019-01-27) (hash sha1)
Transfer your data from you Amazon Flatfile spreadsheet over to the Plentymarkets system. How to is included in the readme

/product_import.py (971deb5820d65c1bda470e29aaaa1a2dcd28eab9) (12975 bytes) (mode 100644) (type blob)

from tkinter import Tk
from tkinter.filedialog import askopenfilename, askdirectory
import sys
import platform
import os
import ntpath
from packages.item_upload import itemUpload, itemPropertyUpload, WrongEncodingException
from packages.variation_upload import variationUpload, setActive, EANUpload, marketConnection, EmptyFieldWarning
from packages.stock_upload import priceUpload
from packages.amazon_data_upload import amazonSkuUpload, amazonDataUpload, asinUpload, featureUpload
from packages.image_upload import imageUpload
from packages.log_files import fileNotFoundLog, keyErrorLog, wrongEncodingLog, unboundLocalLog, emptyFieldWarningLog


def main():

    #define variable used throughout the script
    upload_folder = ''
    log_folder = ''
    recent_path = ''
    step = int(0)
    fexc = ''
    # Create a list of step names where every name fits to the index of a step number
    step_name = ['environment-creation',
                 'import-flatfile',
                 'import-internlist',
                 'item-upload',
                 'variation-upload',
                 'import-export',
                 'feature_upload',
                 'active_upload',
                 'property_upload',
                 'price_upload',
                 'import_stocklist',
                 'Barcode_upload',
                 'SKU_Upload',
                 'AmazonData_Upload',
                 'ASIN_upload',
                 'Image_upload',
                 'Marketconnection_upload']

    #app = UploadGUI(None)
    #app.title("Amazon Flatfile to PlentyMarkets Upload")
    # app.mainloop()
    '''
    Command Line Test Version will be used within the GUI as soon as it is finished
    '''
    root = Tk()
    root.withdraw()
    # Check if the os is Linux, in that case the initial directory is Documents
    # Unless Documents is not available in which case it is ~
    initial_directory = '../'

    if(platform.system() == 'Linux'):
        if(os.path.exists(path='/home/' + os.getlogin() + '/Documents/')):
            initial_directory = '/home/' + os.getlogin() + '/Documents/'
        else:
            initial_directory = '/home/' + os.getlogin()


    # Get the upload folder path from the user
    upload_folder = askdirectory(initialdir=initial_directory,
                                 title="Choose a folder for the upload files.")
    # Check if there is already a log folder within the upload folder
    if( not(os.path.exists(os.path.join(upload_folder, 'log'))) ):
        log_folder = os.path.join(upload_folder, 'log')
        os.makedirs(log_folder)
    elif( os.path.exists(os.path.join(upload_folder, 'log')) ):
        log_folder = os.path.join(upload_folder, 'log')

    step += 1
    sheet = askopenfilename(initialdir=initial_directory,
                            title="Amazon Flatfile as .csv",
                            filetypes=[ ("csv files", "*.csv") ])
    if(sheet):
        recent_path = os.path.dirname(sheet)

    step += 1
    intern_number = askopenfilename(initialdir=recent_path,
                            title="The Intern Numbers as .csv",
                            filetypes=[ ("csv files", "*.csv") ])

    print("spreadsheet csv containing the flatfile : ", sheet)
    print("spreadsheet csv containing the intern numbers : ", intern_number)

    step += 1
    try:
        print("\nItem Upload\n")
        itemUpload(sheet, intern_number, upload_folder)
    except WrongEncodingException:
        wrongEncodingLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name="flatfile")
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except OSError as fexc:
        fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name="intern_numbers")
    except TypeError:
        fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name="flatfile")
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except EmptyFieldWarning as eexc:
        emptyFieldWarningLog(log_path=log_folder, step_number=step, step_desc=step_name[step], field_name=eexc.errorargs, file_name=ntpath.basename(sheet))
    except Exception as exc:
        print("Item Upload failed!\n")
        print("Here: ", exc, '\n')
        if(exc == 'item_sku'):
            print("It is very likely that you don't have the proper headers, use the english ones!\n")
        e = sys.exc_info()
        for element in e:
            print(element)

    step += 1
    try:
        print("\nVariation Upload\n")
        variationUpload(sheet, intern_number, upload_folder)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except EmptyFieldWarning as eexc:
        emptyFieldWarningLog(log_path=log_folder, step_number=step, step_desc=step_name[step], field_name=eexc.errorargs, file_name=ntpath.basename(sheet))
    except Exception as exc:
        print("VariationUpload failed!\n")
        e = sys.exc_info()
        for element in e:
            print(element)

    print("###########################################################")
    print("\nUpload the files in plentymarkets, make sure that the categories are set because they are necessary for the active Upload.\n")

    moveon = input("Continue(ENTER)")

    print("\nGet a dataexport from the plentymarket site from the variation attributes, in order to access the current Variation ID.\n")

    step += 1
    try:
        export = askopenfilename(initialdir=recent_path,
                                title="The Export File from Plentymarkets as .csv",
                                filetypes=[ ("csv files", "*.csv") ])
    except OSError as fexc:
        fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name=fexc)
    except Exception as exc:
        print(exc)
        print("Something went wrong at the Export file import!")

    print("spreadsheet csv containing the export : ", export)

    try:
        print("Active, properties , features & price Upload")
        step += 1
        featureUpload(flatfile=sheet, feature='color_map', feature_id=1, folder=upload_folder)
        featureUpload(flatfile=sheet, feature='item_name', feature_id=13, folder=upload_folder)
        featureUpload(flatfile=sheet, feature='sleeve_type', feature_id=8, folder=upload_folder)
        featureUpload(flatfile=sheet, feature='pattern_type', feature_id=11, folder=upload_folder)
        featureUpload(flatfile=sheet, feature='collar_style', feature_id=12, folder=upload_folder)
        featureUpload(flatfile=sheet, feature='closure_type', feature_id=14, folder=upload_folder)
        featureUpload(flatfile=sheet, feature='style_name', feature_id=15, folder=upload_folder)
        featureUpload(flatfile=sheet, feature='care_instructions', feature_id=16, folder=upload_folder)
        step += 1
        setActive(sheet, export, upload_folder)
        step += 1
        itemPropertyUpload(sheet, export, upload_folder)
        step += 1
        priceUpload(sheet, export, upload_folder)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except EmptyFieldWarning as eexc:
        emptyFieldWarningLog(log_path=log_folder, step_number=step, step_desc=step_name[step], field_name=eexc.errorargs, file_name=ntpath.basename(sheet))
    except OSError as err:
        print(err)
        print("Missing Data, check if you have\n - a flatfile\n - a intern file table\n - export file from plentymarkets\n - a sheet with the stock numbers!\n")

    print("\nOpen your amazon storage report and save it as an csv.\n")

    step += 1
    try:
        stocklist = askopenfilename(initialdir=recent_path,
                                title="The Stockreport from Amazon as .csv",
                                filetypes=[ ("csv files", "*.csv") ])
        print("spreadsheet csv containing the FNSKU and ASIN : ", stocklist)
    except OSError as fexc:
        fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name=fexc)

    step += 1
    try:
        EANUpload(sheet, export, stocklist, upload_folder)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)

    print("\nCreate a upload file for the SKU and Parent_SKU\nto connect existing items from amazon to plentyMarkets.\n")

    step += 1
    try:
        amazonSkuUpload(sheet, export, upload_folder)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except EmptyFieldWarning as eexc:
        emptyFieldWarningLog(log_path=log_folder, step_number=step, step_desc=step_name[step], field_name=eexc.errorargs, file_name=ntpath.basename(sheet))

    print("\nCreate a upload file for the additional Information to Amazon Products like bullet points, lifestyle etc.\n")

    step += 1
    try:
        amazonDataUpload(sheet, export, upload_folder)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except EmptyFieldWarning as eexc:
        emptyFieldWarningLog(log_path=log_folder, step_number=step, step_desc=step_name[step], field_name=eexc.errorargs, file_name=ntpath.basename(sheet))

    print("\nCollect the ASIN Numbers matching to the Variationnumber(Sku) and format them into the dataformat format.\n")

    step += 1
    try:
        asinUpload(export, stocklist, upload_folder)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except EmptyFieldWarning as eexc:
        emptyFieldWarningLog(log_path=log_folder, step_number=step, step_desc=step_name[step], field_name=eexc.errorargs, file_name=ntpath.basename(sheet))

    print("\nCollect the imagelinks from the flatfile, sorts them and assigns the variation ID.\n")

    step += 1
    try:
        imageUpload(sheet, export, upload_folder)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except Exception as err:
        print(err)
        print("Image Upload failed!")

    print("\nActivate Marketconnection for Ebay & Amazon for all variation.\n")

    step += 1
    try:
        marketConnection(export, upload_folder, ebay=1, amazon=1)
    except KeyError as kexc:
        keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet))
    except UnboundLocalError as uexc:
        unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args)
    except EmptyFieldWarning as eexc:
        emptyFieldWarningLog(log_path=log_folder, step_number=step, step_desc=step_name[step], field_name=eexc.errorargs, file_name=ntpath.basename(sheet))
    except Exception as err:
        print(err)
        print("Market connection failed!")

    del moveon
    del fexc
if __name__ == '__main__':
    main()


Mode Type Size Ref File
100644 blob 788 a5c176cdfed5fc09bc908a7339b871be87072999 .gitignore
100644 blob 5084 499e1a6caa3ee82a06a37e0fd0ddfe9301610a91 Instructions.md
100644 blob 10299 816a1d0ee7f4496c32fdb92c7811eaf877d0efc0 LICENSE.md
100644 blob 3811 87e1df60c4c99c8400bcdcf1641a33e1ade245d8 README.md
100755 blob 546 98298b26c8cc746806228865e30466bee9d65c13 build_new_version.sh
100755 blob 35 842a6affcaddec0f7dc134889a531b100c62f473 clean_upload.sh
100644 blob 116 666750bce728d912256a546347e72d37d5a4159d main.py
040000 tree - 60c1e33f05cffcbe6c20a72c80e45cd9637dbb8b packages
100644 blob 12975 971deb5820d65c1bda470e29aaaa1a2dcd28eab9 product_import.py
100644 blob 178 627b92178d30145f0dedc2f4a31ac856f6a15ea1 todo.md
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/initBasti/Amazon2PlentySync

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/initBasti/Amazon2PlentySync

Clone this repository using git:
git clone git://git.rocketgit.com/user/initBasti/Amazon2PlentySync

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main