File packages/variation_upload.py changed (mode: 100644) (index 4eaf5b8..b950cb3) |
1 |
1 |
import csv |
import csv |
|
2 |
|
import re |
2 |
3 |
from os.path import isfile |
from os.path import isfile |
3 |
4 |
import sys |
import sys |
4 |
5 |
from tkinter.filedialog import askdirectory |
from tkinter.filedialog import askdirectory |
|
... |
... |
def variationUpload(flatfile, intern_number, folder): |
64 |
65 |
reader = csv.DictReader(item, delimiter=";") |
reader = csv.DictReader(item, delimiter=";") |
65 |
66 |
for row in reader: |
for row in reader: |
66 |
67 |
if(row['parent_child'] == 'child'): |
if(row['parent_child'] == 'child'): |
|
68 |
|
pack_height = 0 |
|
69 |
|
pack_length = 0 |
|
70 |
|
pack_width = 0 |
|
71 |
|
pack_weight = 0 |
67 |
72 |
try: |
try: |
68 |
73 |
if(row['package_height'] and |
if(row['package_height'] and |
69 |
74 |
row['package_length'] and |
row['package_length'] and |
70 |
75 |
row['package_width']): |
row['package_width']): |
71 |
76 |
|
|
72 |
|
row['package_height'] = int(row['package_height']) |
|
73 |
|
row['package_length'] = int(row['package_length']) |
|
74 |
|
row['package_width'] = int(row['package_width']) |
|
|
77 |
|
pack_height = int(row['package_height']) |
|
78 |
|
pack_length = int(row['package_length']) |
|
79 |
|
pack_width = int(row['package_width']) |
75 |
80 |
except ValueError as err: |
except ValueError as err: |
76 |
|
row['package_height'] = int(float(row['package_height'])) |
|
77 |
|
row['package_length'] = int(float(row['package_length'])) |
|
78 |
|
row['package_width'] = int(float(row['package_width'])) |
|
79 |
|
except ValueError as err: |
|
80 |
|
print(err) |
|
81 |
|
print( |
|
82 |
|
'/nPlease copy the values for height, length, width and weight\n', |
|
83 |
|
'from the children to the parent variation in the flatfile.\n') |
|
84 |
|
exit() |
|
|
81 |
|
pack_height = int(float(row['package_height'])) |
|
82 |
|
pack_length = int(float(row['package_length'])) |
|
83 |
|
pack_width = int(float(row['package_width'])) |
|
84 |
|
except ValueError: |
|
85 |
|
print("\nYour file doesn't include the proportions of the item\n\ |
|
86 |
|
at the parent, please add them later manually.\n") |
|
87 |
|
|
|
88 |
|
if(row['package_weight']): |
|
89 |
|
pack_weight = int(row['package_weight']) |
85 |
90 |
|
|
86 |
91 |
if(row['color_name']): |
if(row['color_name']): |
87 |
92 |
attributes = 'color_name:' + row['color_name'] |
attributes = 'color_name:' + row['color_name'] |
|
93 |
|
|
88 |
94 |
if(row['size_name'] and number_sizes > 1): |
if(row['size_name'] and number_sizes > 1): |
89 |
95 |
attributes += ';size_name:' + row['size_name'] |
attributes += ';size_name:' + row['size_name'] |
|
96 |
|
|
90 |
97 |
try: |
try: |
91 |
98 |
values = ['', '', row['item_sku'], row['item_name'], '', |
values = ['', '', row['item_sku'], row['item_name'], '', |
92 |
|
int(row['package_length']) * 10, |
|
93 |
|
int(row['package_width']) * 10, |
|
94 |
|
int(row['package_height']) * 10, |
|
95 |
|
row['package_weight'], attributes, |
|
|
99 |
|
pack_length * 10, |
|
100 |
|
pack_width * 10, |
|
101 |
|
pack_height * 10, |
|
102 |
|
pack_weight, attributes, |
96 |
103 |
row['standard_price'], 'Badel', 'Y', 'Y', ''] |
row['standard_price'], 'Badel', 'Y', 'Y', ''] |
97 |
104 |
except Exception as err: |
except Exception as err: |
98 |
105 |
print(err) |
print(err) |
99 |
|
sys.exit() |
|
100 |
106 |
Data[row['item_sku']] = SortedDict(zip(names, values)) |
Data[row['item_sku']] = SortedDict(zip(names, values)) |
101 |
107 |
|
|
102 |
108 |
# open the intern numbers csv and fill in the remaining missing fields by using the |
# open the intern numbers csv and fill in the remaining missing fields by using the |
|
... |
... |
def setActive(flatfile, export, folder): |
131 |
137 |
|
|
132 |
138 |
with open(export, mode='r') as item: |
with open(export, mode='r') as item: |
133 |
139 |
reader = csv.DictReader(item, delimiter=';') |
reader = csv.DictReader(item, delimiter=';') |
|
140 |
|
wrong_delimiter = False |
|
141 |
|
|
134 |
142 |
for row in reader: |
for row in reader: |
|
143 |
|
if( '\t' in [*row] ): |
|
144 |
|
wrong_delimiter = True |
|
145 |
|
break |
135 |
146 |
if(row['VariationNumber'] in [*Data]): |
if(row['VariationNumber'] in [*Data]): |
136 |
147 |
Data[row['VariationNumber']]['VariationID'] = row['VariationID'] |
Data[row['VariationNumber']]['VariationID'] = row['VariationID'] |
|
148 |
|
|
|
149 |
|
if(wrong_delimiter): |
|
150 |
|
reader = csv.DictReader(item, delimiter='\t') |
|
151 |
|
|
|
152 |
|
for row in reader: |
|
153 |
|
if(row['VariationNumber' in [*Data]]): |
|
154 |
|
Data[row['VariationNumber']]['VariationID'] = row['VariationID'] |
|
155 |
|
|
137 |
156 |
output_path = writeCSV(Data, 'SetActive', column_names, folder) |
output_path = writeCSV(Data, 'SetActive', column_names, folder) |
138 |
157 |
|
|
139 |
158 |
|
|
File product_import.py changed (mode: 100644) (index baafc96..6363d0b) |
... |
... |
from tkinter.filedialog import askopenfilename, askdirectory |
3 |
3 |
import sys |
import sys |
4 |
4 |
import platform |
import platform |
5 |
5 |
import os |
import os |
6 |
|
from packages.item_upload import itemUpload, itemPropertyUpload |
|
|
6 |
|
import ntpath |
|
7 |
|
from packages.item_upload import itemUpload, itemPropertyUpload, WrongEncodingException |
7 |
8 |
from packages.variation_upload import variationUpload, setActive, EANUpload, marketConnection |
from packages.variation_upload import variationUpload, setActive, EANUpload, marketConnection |
8 |
|
from packages.stock_upload import stockUpload, priceUpload |
|
|
9 |
|
from packages.stock_upload import priceUpload |
9 |
10 |
from packages.amazon_data_upload import amazonSkuUpload, amazonDataUpload, asinUpload, featureUpload |
from packages.amazon_data_upload import amazonSkuUpload, amazonDataUpload, asinUpload, featureUpload |
10 |
11 |
from packages.image_upload import imageUpload |
from packages.image_upload import imageUpload |
|
12 |
|
from packages.log_files import fileNotFoundLog, keyErrorLog, wrongEncodingLog, unboundLocalLog |
11 |
13 |
|
|
12 |
14 |
|
|
13 |
15 |
def main(): |
def main(): |
|
16 |
|
|
|
17 |
|
#define variable used throughout the script |
|
18 |
|
upload_folder = '' |
|
19 |
|
log_folder = '' |
|
20 |
|
recent_path = '' |
|
21 |
|
step = int(0) |
|
22 |
|
fexc = '' |
|
23 |
|
# Create a list of step names where every name fits to the index of a step number |
|
24 |
|
step_name = ['environment-creation', |
|
25 |
|
'import-flatfile', |
|
26 |
|
'import-internlist', |
|
27 |
|
'item-upload', |
|
28 |
|
'variation-upload', |
|
29 |
|
'import-export', |
|
30 |
|
'feature_upload', |
|
31 |
|
'active_upload', |
|
32 |
|
'property_upload', |
|
33 |
|
'price_upload', |
|
34 |
|
'import_stocklist', |
|
35 |
|
'Barcode_upload', |
|
36 |
|
'SKU_Upload', |
|
37 |
|
'AmazonData_Upload', |
|
38 |
|
'ASIN_upload', |
|
39 |
|
'Image_upload', |
|
40 |
|
'Marketconnection_upload'] |
|
41 |
|
|
14 |
42 |
#app = UploadGUI(None) |
#app = UploadGUI(None) |
15 |
43 |
#app.title("Amazon Flatfile to PlentyMarkets Upload") |
#app.title("Amazon Flatfile to PlentyMarkets Upload") |
16 |
44 |
# app.mainloop() |
# app.mainloop() |
|
... |
... |
def main(): |
29 |
57 |
else: |
else: |
30 |
58 |
initial_directory = '/home/' + os.getlogin() |
initial_directory = '/home/' + os.getlogin() |
31 |
59 |
|
|
|
60 |
|
|
|
61 |
|
# Get the upload folder path from the user |
|
62 |
|
upload_folder = askdirectory(initialdir=initial_directory, |
|
63 |
|
title="Choose a folder for the upload files.") |
|
64 |
|
# Check if there is already a log folder within the upload folder |
|
65 |
|
if( not(os.path.exists(os.path.join(upload_folder, 'log'))) ): |
|
66 |
|
log_folder = os.path.join(upload_folder, 'log') |
|
67 |
|
os.makedirs(log_folder) |
|
68 |
|
elif( os.path.exists(os.path.join(upload_folder, 'log')) ): |
|
69 |
|
log_folder = os.path.join(upload_folder, 'log') |
|
70 |
|
|
|
71 |
|
step += 1 |
32 |
72 |
sheet = askopenfilename(initialdir=initial_directory, |
sheet = askopenfilename(initialdir=initial_directory, |
33 |
73 |
title="Amazon Flatfile as .csv", |
title="Amazon Flatfile as .csv", |
34 |
74 |
filetypes=[ ("csv files", "*.csv") ]) |
filetypes=[ ("csv files", "*.csv") ]) |
35 |
|
intern_number = askopenfilename(initialdir=initial_directory, |
|
|
75 |
|
if(sheet): |
|
76 |
|
recent_path = os.path.dirname(sheet) |
|
77 |
|
|
|
78 |
|
step += 1 |
|
79 |
|
intern_number = askopenfilename(initialdir=recent_path, |
36 |
80 |
title="The Intern Numbers as .csv", |
title="The Intern Numbers as .csv", |
37 |
81 |
filetypes=[ ("csv files", "*.csv") ]) |
filetypes=[ ("csv files", "*.csv") ]) |
38 |
|
upload_folder = askdirectory(initialdir=initial_directory, |
|
39 |
|
title="Choose a folder for the upload files.") |
|
40 |
82 |
|
|
41 |
83 |
print("spreadsheet csv containing the flatfile : ", sheet) |
print("spreadsheet csv containing the flatfile : ", sheet) |
42 |
84 |
print("spreadsheet csv containing the intern numbers : ", intern_number) |
print("spreadsheet csv containing the intern numbers : ", intern_number) |
43 |
85 |
|
|
|
86 |
|
step += 1 |
44 |
87 |
try: |
try: |
45 |
88 |
print("\nItem Upload\n") |
print("\nItem Upload\n") |
46 |
89 |
itemUpload(sheet, intern_number, upload_folder) |
itemUpload(sheet, intern_number, upload_folder) |
|
90 |
|
except WrongEncodingException as wexc: |
|
91 |
|
wrongEncodingLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name="flatfile") |
|
92 |
|
except KeyError as kexc: |
|
93 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
94 |
|
except OSError as fexc: |
|
95 |
|
fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name="intern_numbers") |
|
96 |
|
except TypeError: |
|
97 |
|
fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name="flatfile") |
|
98 |
|
except UnboundLocalError as uexc: |
|
99 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
47 |
100 |
except Exception as exc: |
except Exception as exc: |
48 |
101 |
print("Item Upload failed!\n") |
print("Item Upload failed!\n") |
49 |
102 |
print("Here: ", exc, '\n') |
print("Here: ", exc, '\n') |
|
... |
... |
def main(): |
53 |
106 |
for element in e: |
for element in e: |
54 |
107 |
print(element) |
print(element) |
55 |
108 |
|
|
|
109 |
|
step += 1 |
56 |
110 |
try: |
try: |
57 |
111 |
print("\nVariation Upload\n") |
print("\nVariation Upload\n") |
58 |
112 |
variationUpload(sheet, intern_number, upload_folder) |
variationUpload(sheet, intern_number, upload_folder) |
|
113 |
|
except KeyError as kexc: |
|
114 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
115 |
|
except UnboundLocalError as uexc: |
|
116 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
59 |
117 |
except Exception as exc: |
except Exception as exc: |
60 |
118 |
print("VariationUpload failed!\n") |
print("VariationUpload failed!\n") |
61 |
119 |
e = sys.exc_info() |
e = sys.exc_info() |
|
... |
... |
def main(): |
69 |
127 |
|
|
70 |
128 |
print("\nGet a dataexport from the plentymarket site from the variation attributes, in order to access the current Variation ID.\n") |
print("\nGet a dataexport from the plentymarket site from the variation attributes, in order to access the current Variation ID.\n") |
71 |
129 |
|
|
|
130 |
|
step += 1 |
72 |
131 |
try: |
try: |
73 |
|
export = askopenfilename(initialdir="../", |
|
|
132 |
|
export = askopenfilename(initialdir=recent_path, |
74 |
133 |
title="The Export File from Plentymarkets as .csv", |
title="The Export File from Plentymarkets as .csv", |
75 |
134 |
filetypes=[ ("csv files", "*.csv") ]) |
filetypes=[ ("csv files", "*.csv") ]) |
76 |
|
except FileNotFoundError: # pylint:disable=invalid-name,used-before-assignment |
|
77 |
|
print("No Export File!") |
|
|
135 |
|
except OSError as fexc: |
|
136 |
|
fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name=fexc) |
78 |
137 |
except Exception as exc: |
except Exception as exc: |
79 |
138 |
print(exc) |
print(exc) |
80 |
139 |
print("Something went wrong at the Export file import!") |
print("Something went wrong at the Export file import!") |
|
... |
... |
def main(): |
83 |
142 |
|
|
84 |
143 |
try: |
try: |
85 |
144 |
print("Active, properties , features & price Upload") |
print("Active, properties , features & price Upload") |
|
145 |
|
step += 1 |
86 |
146 |
featureUpload(flatfile=sheet, feature='color_map', feature_id=1, folder=upload_folder) |
featureUpload(flatfile=sheet, feature='color_map', feature_id=1, folder=upload_folder) |
87 |
147 |
featureUpload(flatfile=sheet, feature='item_name', feature_id=13, folder=upload_folder) |
featureUpload(flatfile=sheet, feature='item_name', feature_id=13, folder=upload_folder) |
88 |
148 |
featureUpload(flatfile=sheet, feature='sleeve_type', feature_id=8, folder=upload_folder) |
featureUpload(flatfile=sheet, feature='sleeve_type', feature_id=8, folder=upload_folder) |
89 |
149 |
featureUpload(flatfile=sheet, feature='pattern_type', feature_id=11, folder=upload_folder) |
featureUpload(flatfile=sheet, feature='pattern_type', feature_id=11, folder=upload_folder) |
90 |
150 |
featureUpload(flatfile=sheet, feature='collar_style', feature_id=12, folder=upload_folder) |
featureUpload(flatfile=sheet, feature='collar_style', feature_id=12, folder=upload_folder) |
|
151 |
|
step += 1 |
91 |
152 |
setActive(sheet, export, upload_folder) |
setActive(sheet, export, upload_folder) |
|
153 |
|
step += 1 |
92 |
154 |
itemPropertyUpload(sheet, export, upload_folder) |
itemPropertyUpload(sheet, export, upload_folder) |
|
155 |
|
step += 1 |
93 |
156 |
priceUpload(sheet, export, upload_folder) |
priceUpload(sheet, export, upload_folder) |
94 |
|
except FileNotFoundError as err:# pylint:disable=invalid-name,used-before-assignment |
|
|
157 |
|
except KeyError as kexc: |
|
158 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
159 |
|
except UnboundLocalError as uexc: |
|
160 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
|
161 |
|
except OSError as err: |
95 |
162 |
print(err) |
print(err) |
96 |
163 |
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("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") |
97 |
164 |
sys.exit() |
sys.exit() |
98 |
165 |
|
|
99 |
166 |
print("\nOpen your amazon storage report and save it as an csv.\n") |
print("\nOpen your amazon storage report and save it as an csv.\n") |
100 |
167 |
|
|
101 |
|
stocklist = askopenfilename(initialdir="../", |
|
102 |
|
title="The Stockreport from Amazon as .csv", |
|
103 |
|
filetypes=[ ("csv files", "*.csv") ]) |
|
104 |
|
print("spreadsheet csv containing the FNSKU and ASIN : ", stocklist) |
|
|
168 |
|
step += 1 |
|
169 |
|
try: |
|
170 |
|
stocklist = askopenfilename(initialdir=recent_path, |
|
171 |
|
title="The Stockreport from Amazon as .csv", |
|
172 |
|
filetypes=[ ("csv files", "*.csv") ]) |
|
173 |
|
print("spreadsheet csv containing the FNSKU and ASIN : ", stocklist) |
|
174 |
|
except OSError as fexc: |
|
175 |
|
fileNotFoundLog(log_path=log_folder, step_number=step, step_desc=step_name[step], file_name=fexc) |
105 |
176 |
|
|
106 |
|
EANUpload(sheet, export, stocklist, upload_folder) |
|
|
177 |
|
step += 1 |
|
178 |
|
try: |
|
179 |
|
EANUpload(sheet, export, stocklist, upload_folder) |
|
180 |
|
except KeyError as kexc: |
|
181 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
182 |
|
except UnboundLocalError as uexc: |
|
183 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
107 |
184 |
|
|
108 |
185 |
print("\nCreate a upload file for the SKU and Parent_SKU\nto connect existing items from amazon to plentyMarkets.\n") |
print("\nCreate a upload file for the SKU and Parent_SKU\nto connect existing items from amazon to plentyMarkets.\n") |
109 |
186 |
|
|
110 |
|
amazonSkuUpload(sheet, export, upload_folder) |
|
|
187 |
|
step += 1 |
|
188 |
|
try: |
|
189 |
|
amazonSkuUpload(sheet, export, upload_folder) |
|
190 |
|
except KeyError as kexc: |
|
191 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
192 |
|
except UnboundLocalError as uexc: |
|
193 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
111 |
194 |
|
|
112 |
195 |
print("\nCreate a upload file for the additional Information to Amazon Products like bullet points, lifestyle etc.\n") |
print("\nCreate a upload file for the additional Information to Amazon Products like bullet points, lifestyle etc.\n") |
113 |
196 |
|
|
114 |
|
amazonDataUpload(sheet, export, upload_folder) |
|
|
197 |
|
step += 1 |
|
198 |
|
try: |
|
199 |
|
amazonDataUpload(sheet, export, upload_folder) |
|
200 |
|
except KeyError as kexc: |
|
201 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
202 |
|
except UnboundLocalError as uexc: |
|
203 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
115 |
204 |
|
|
116 |
205 |
print("\nCollect the ASIN Numbers matching to the Variationnumber(Sku) and format them into the dataformat format.\n") |
print("\nCollect the ASIN Numbers matching to the Variationnumber(Sku) and format them into the dataformat format.\n") |
117 |
206 |
|
|
118 |
|
asinUpload(export, stocklist, upload_folder) |
|
|
207 |
|
step += 1 |
|
208 |
|
try: |
|
209 |
|
asinUpload(export, stocklist, upload_folder) |
|
210 |
|
except KeyError as kexc: |
|
211 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
212 |
|
except UnboundLocalError as uexc: |
|
213 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
119 |
214 |
|
|
120 |
215 |
print("\nCollect the imagelinks from the flatfile, sorts them and assigns the variation ID.\n") |
print("\nCollect the imagelinks from the flatfile, sorts them and assigns the variation ID.\n") |
121 |
216 |
|
|
|
217 |
|
step += 1 |
122 |
218 |
try: |
try: |
123 |
219 |
imageUpload(sheet, export, upload_folder) |
imageUpload(sheet, export, upload_folder) |
|
220 |
|
except KeyError as kexc: |
|
221 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
222 |
|
except UnboundLocalError as uexc: |
|
223 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
124 |
224 |
except Exception as err: |
except Exception as err: |
125 |
225 |
print(err) |
print(err) |
126 |
226 |
print("Image Upload failed!") |
print("Image Upload failed!") |
127 |
227 |
|
|
128 |
228 |
print("\nActivate Marketconnection for Ebay & Amazon for all variation.\n") |
print("\nActivate Marketconnection for Ebay & Amazon for all variation.\n") |
129 |
229 |
|
|
|
230 |
|
step += 1 |
130 |
231 |
try: |
try: |
131 |
232 |
marketConnection(export, upload_folder, ebay=1, amazon=1) |
marketConnection(export, upload_folder, ebay=1, amazon=1) |
|
233 |
|
except KeyError as kexc: |
|
234 |
|
keyErrorLog(log_path=log_folder, step_number=step, step_desc=step_name[step], key_name=kexc, file_name=ntpath.basename(sheet)) |
|
235 |
|
except UnboundLocalError as uexc: |
|
236 |
|
unboundLocalLog(log_path=log_folder, step_number=step, step_desc=step_name[step], filename=ntpath.basename(sheet), variable_name=uexc.args) |
132 |
237 |
except Exception as err: |
except Exception as err: |
133 |
238 |
print(err) |
print(err) |
134 |
239 |
print("Market connection failed!") |
print("Market connection failed!") |
135 |
240 |
|
|
|
241 |
|
del moveon |
|
242 |
|
del fexc |
136 |
243 |
if __name__ == '__main__': |
if __name__ == '__main__': |
137 |
244 |
main() |
main() |