Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: cms/bin/xtm_translations/projects_handler.py

Issue 29886648: Issue #6942 - Add XTM integration in CMS (Closed)
Patch Set: Created Sept. 20, 2018, 4:24 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # This file is part of the Adblock Plus web scripts,
2 # Copyright (C) 2006-present eyeo GmbH
3 #
4 # Adblock Plus is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License version 3 as
6 # published by the Free Software Foundation.
7 #
8 # Adblock Plus is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
15 import sys
16 import logging
17 import ConfigParser
18 import zipfile
19 from io import BytesIO
20
21 import cms.bin.xtm_translations.constants as cnts
Vasily Kuznetsov 2018/09/24 16:32:11 What do you think about using "cnst" instead of "c
Tudor Avram 2018/09/25 12:26:24 Used `const`. And replaced it in all other files D
22 from cms.bin.xtm_translations.xtm_api import XTMCloudAPI, XTMCloudException
23 from cms.sources import FileSource
24 from cms.bin.xtm_translations import utils
25
26 __all__ = [
27 'create_project', 'upload_files', 'download_files', 'main',
28 ]
29
30 input = cnts.input_fn
Vasily Kuznetsov 2018/09/24 16:32:11 Since this is not used this much, we could just ca
Tudor Avram 2018/09/25 12:26:25 Oh, actually it isn't anymore. It was used initial
31
32
33 def create_project(args, api, source):
34 """Create a project.
35
36 Parameters
37 ----------
38 args: argparse.Namespace
39 The arguments parsed by the main script.
40 api: XTMCloudAPI
41 Used for interacting with the project.
42 source: FileSource
43 Representing the website the project is created for.
44
45 """
46 config = source.read_config()
47
48 try:
49 project_id = config.get(cnts.CONFIG['XTM_section'],
50 cnts.CONFIG['project_option'])
51 sys.exit(cnts.ErrorMessages.EXISTENT_PROJECT.format(project_id))
52 except ConfigParser.NoOptionError, ConfigParser.NoSectionError:
53 pass
54
55 target_langs = utils.map_locales(source)
56
57 page_strings = utils.extract_strings(source)
58 files = utils.get_local_files(page_strings)
59 files_to_upload = utils.get_files_to_upload(files, page_strings)
60
61 try:
62 name = utils.resolve_naming_conflicts(args.name)
63 logging.info(cnts.InfoMessages.PROJECT_NAME_CREATING.format(name))
64 logging.info(cnts.InfoMessages.UPLOADING_FILES.format(len(files)))
65
66 project_id, resulting_jobs = utils.run_and_wait(
67 api.create_project,
68 XTMCloudException,
69 cnts.UNDER_ANALYSIS_MESSAGE,
70 cnts.InfoMessages.WAITING_FOR_PROJECT,
71 name=name,
72 description=args.desc,
73 reference_id=args.ref_id,
74 target_languages=target_langs,
75 customer_id=args.client_id,
76 workflow_id=args.workflow_id,
77 source_language=args.source_lang,
78 files=files_to_upload,
79 )
80 except XTMCloudException as err:
81 sys.exit(err)
82
83 logging.info(cnts.InfoMessages.PROJECT_CREATED.format(project_id))
84 utils.log_resulting_jobs(resulting_jobs)
85
86 if args.save_id:
87 source.write_to_config(
88 cnts.CONFIG['XTM_section'],
89 cnts.CONFIG['project_option'],
90 str(project_id),
91 )
92 logging.info(cnts.InfoMessages.SAVED_PROJECT_ID)
93
94
95 def upload_files(args, api, source):
96 """Upload files to project.
97
98 Parameters
99 ----------
100 args: argparse.Namespace
101 The arguments parsed by the main script.
102 api: XTMCloudAPI
103 Used for interacting with the project.
104 source: cms.sources.FileSource
105 Representing the website the project is created for.
106
107 """
108 config = source.read_config()
109 try:
110 project_id = config.get(cnts.CONFIG['XTM_section'],
111 cnts.CONFIG['project_option'])
112 except ConfigParser.NoOptionError, ConfigParser.NoSectionError:
113 sys.exit(cnts.ErrorMessages.NO_PROJECT.format(source.get_path('')))
114
115 utils.resolve_locales(api, source)
116
117 page_strings = utils.extract_strings(source)
118 files = utils.get_local_files(page_strings)
119 files_to_upload = utils.get_files_to_upload(files, page_strings)
120 logging.info(cnts.InfoMessages.UPLOADING_FILES.format(len(files)))
121
122 new_jobs = utils.run_and_wait(
123 api.upload_files,
124 XTMCloudException,
125 cnts.UNDER_ANALYSIS_MESSAGE,
126 cnts.InfoMessages.WAITING_FOR_PROJECT,
127 files=files_to_upload,
128 project_id=project_id,
129 overwrite=not args.no_overwrite,
130 )
131
132 logging.info(cnts.InfoMessages.FILES_UPLOADED)
133 utils.log_resulting_jobs(new_jobs)
134
135
136 def download_files(args, api, source):
137 """Download the translation files and save them as locales.
138
139 Parameters
140 ----------
141 args: argparse.Namespace
142 The arguments provided when running the script
143 api: XTMCloudAPI
144 Used for interacting with the project.
145 source: FileSource
146 Used to write the downloaded translation files locally.
147
148 """
149 try:
150 raw_bytes = api.download_files(
151 source.read_config().get(
152 cnts.CONFIG['XTM_section'], cnts.CONFIG['project_option'],
153 ),
154 )
155 except ConfigParser.NoOptionError, ConfigParser.NoSectionError:
156 sys.exit(cnts.ErrorMessages.NO_PROJECT.format(source.get_path('')))
157 except XTMCloudException as err:
158 sys.exit(err)
159 except Exception as err:
160 sys.exit(err)
161
162 try:
163 with zipfile.ZipFile(BytesIO(raw_bytes)) as zf:
164 zip_contents = zf.namelist()
165 if len(zip_contents) == 0:
166 sys.exit(
167 cnts.InfoMessages.NO_FILES_FOUND.format(args.project_id),
168 )
169
170 logging.info(cnts.InfoMessages.FILES_DOWNLOADED)
171 locales_path = source.get_path('locales')
172 default_locale = source.read_config().get(
173 cnts.CONFIG['main_section'],
174 cnts.CONFIG['default_locale_option'],
175 )
176 valid_locales = utils.get_locales(locales_path, default_locale)
177 utils.clear_files(locales_path, valid_locales)
178
179 for name in zip_contents:
180 path = utils.resolve_remote_filename(name, locales_path,
181 valid_locales)
182 utils.write_to_file(zf.read(name), path)
183 logging.info(cnts.InfoMessages.FILE_SAVED.format(
184 path,
185 zf.getinfo(name).file_size,
186 ))
187 logging.info(cnts.InfoMessages.GREETINGS)
188 except zipfile.BadZipfile:
189 sys.exit(cnts.ErrorMessages.NO_TARGET_FILES_FOUND)
190 except IOError:
191 sys.exit(cnts.ErrorMessages.COULD_NOT_SAVE_FILES)
192
193
194 def main(args):
195 try:
196 api = XTMCloudAPI(utils.read_token())
197 except Exception as err:
198 sys.exit(err)
199 with FileSource(args.source_dir) as fs:
200 args.projects_func(args, api, fs)
OLDNEW

Powered by Google App Engine
This is Rietveld