-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathtransfer.py
More file actions
98 lines (76 loc) · 4.5 KB
/
transfer.py
File metadata and controls
98 lines (76 loc) · 4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import logging
from os.path import abspath, dirname, join
from typing import Optional
import pywikibot
import argparse
from pywikitools.family import Family
from pywikitools.fortraininglib import ForTrainingLib
from configparser import ConfigParser
from pywikitools.lang.translated_page import TranslatedPage
TIMEOUT: int = 30 # Timeout after 30s (prevent indefinite hanging when there is network issues)
class TransferTool:
def __init__(self, config: ConfigParser):
if not config.has_option('transfer', 'source_site') or \
not config.has_option('transfer', 'destination_site') or \
not config.has_option('transfer', 'destination_username'):
raise RuntimeError("Missing settings for transfer in config.ini")
self.logger: logging.Logger = logging.getLogger('pywikitools.transfer')
self.unchanged: int = 0
self.modified: int = 0
self.created: int = 0
self.source_site = config.get('transfer', 'source_site')
self.destination_site = config.get('transfer', 'destination_site')
family = Family()
self.destination_wiki_site = pywikibot.Site(code=self.destination_site, fam=family,
user=config.get('transfer', 'destination_username'))
if not self.destination_wiki_site.logged_in():
self.destination_wiki_site.login()
if not self.destination_wiki_site.logged_in():
raise RuntimeError("Login with pywikibot failed to destination site failed.")
# Set throttle to 0 to speed up write operations (otherwise pywikibot would wait up to 10s after each write)
self.destination_wiki_site.throttle.set_delays(delay=0, writedelay=0, absolute=True)
self.source_fortraininglib: ForTrainingLib = ForTrainingLib(family.base_url(self.source_site, ''),
family.scriptpath(self.source_site))
self.destination_fortraininglib: ForTrainingLib = ForTrainingLib(family.base_url(self.destination_site, ''),
family.scriptpath(self.destination_site))
def transfer(self, page_name, language_code, message=None):
source_translation_page: Optional[TranslatedPage] = self.source_fortraininglib.get_translation_units(
page_name, language_code)
if source_translation_page is None:
raise RuntimeError("Could not get translation units from source site")
self.unchanged: int = 0
self.modified: int = 0
self.created: int = 0
for source_translation_unit in source_translation_page:
source_translation = source_translation_unit.get_translation()
self.upload(f"{source_translation_unit.identifier}/{language_code}",
source_translation, message)
numTotal = self.unchanged + self.modified + self.created
print(f"Transfer of {numTotal} elements for '{page_name}/{language_code}' " +
f"from '{self.source_site}' to '{self.destination_site}' completed.")
print(f"unchanged: {self.unchanged} | modified: {self.modified} | created: {self.created}")
def upload(self, identifier: str, translated_text: str, message=None):
"""Transfer a worksheet from one mediawiki system to another one"""
destination_mediawiki_page = pywikibot.Page(self.destination_wiki_site, f"Translations:{identifier}")
if not destination_mediawiki_page.exists():
self.created += 1
elif destination_mediawiki_page.text == translated_text:
self.unchanged += 1
else:
self.modified += 1
destination_mediawiki_page.text = translated_text
if message is None:
destination_mediawiki_page.save()
else:
destination_mediawiki_page.save(summary=message)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Transfer a worksheet for a certain language from one site to another site.")
parser.add_argument("worksheet_name", help="Name of the worksheet to transfer.")
parser.add_argument("language_code", help="Target language code for transfer.")
parser.add_argument("--message", nargs=1, help="This is a test")
args = parser.parse_args()
config = ConfigParser()
config.read(join(dirname(abspath(__file__)), "config.ini"))
transfer_tool = TransferTool(config)
transfer_tool.transfer(args.worksheet_name, args.language_code, args.message)