Add weblate system
offlate/data/data.json
1 | - | [{"name": "a2ps", "system": 0}, {"name": "aegis", "system": 0}, {"name": "anubis", "system": 0}, {"name": "aspell", "system": 0}, {"name": "bash", "system": 0}, {"name": "bfd", "system": 0}, {"name": "binutils", "system": 0}, {"name": "bison", "system": 0}, {"name": "bison-runtime", "system": 0}, {"name": "buzztrax", "system": 0}, {"name": "ccd2cue", "system": 0}, {"name": "ccide", "system": 0}, {"name": "cflow", "system": 0}, {"name": "clisp", "system": 0}, {"name": "coreutils", "system": 0}, {"name": "cpio", "system": 0}, {"name": "cppi", "system": 0}, {"name": "cpplib", "system": 0}, {"name": "cryptsetup", "system": 0}, {"name": "datamash", "system": 0}, {"name": "denemo", "system": 0}, {"name": "dfarc", "system": 0}, {"name": "dialog", "system": 0}, {"name": "dico", "system": 0}, {"name": "diffutils", "system": 0}, {"name": "dink", "system": 0}, {"name": "direvent", "system": 0}, {"name": "doodle", "system": 0}, {"name": "dos2unix", "system": 0}, {"name": "dos2unix-man", "system": 0}, {"name": "e2fsprogs", "system": 0}, {"name": "enscript", "system": 0}, {"name": "exif", "system": 0}, {"name": "fetchmail", "system": 0}, {"name": "findutils", "system": 0}, {"name": "flex", "system": 0}, {"name": "freedink", "system": 0}, {"name": "fusionforge", "system": 0}, {"name": "gas", "system": 0}, {"name": "gawk", "system": 0}, {"name": "gcal", "system": 0}, {"name": "gcc", "system": 0}, {"name": "gdbm", "system": 0}, {"name": "gettext-examples", "system": 0}, {"name": "gettext-runtime", "system": 0}, {"name": "gettext-tools", "system": 0}, {"name": "gjay", "system": 0}, {"name": "glunarclock", "system": 0}, {"name": "gnubiff", "system": 0}, {"name": "gnubik", "system": 0}, {"name": "gnucash", "system": 0}, {"name": "gnuchess", "system": 0}, {"name": "gnucobol", "system": 0}, {"name": "gnulib", "system": 0}, {"name": "gnunet", "system": 0}, {"name": "gnunet-gtk", "system": 0}, {"name": "gold", "system": 0}, {"name": "gphoto2", "system": 0}, {"name": "gprof", "system": 0}, {"name": "gramadoir", "system": 0}, {"name": "grep", "system": 0}, {"name": "grip", "system": 0}, {"name": "grub", "system": 0}, {"name": "gsasl", "system": 0}, {"name": "gss", "system": 0}, {"name": "gst-plugins-bad", "system": 0}, {"name": "gst-plugins-base", "system": 0}, {"name": "gst-plugins-good", "system": 0}, {"name": "gst-plugins-ugly", "system": 0}, {"name": "gstreamer", "system": 0}, {"name": "gtick", "system": 0}, {"name": "gtkam", "system": 0}, {"name": "gtkspell", "system": 0}, {"name": "guix", "system": 0}, {"name": "guix-manual", "system": 0}, {"name": "guix-packages", "system": 0}, {"name": "gutenprint", "system": 0}, {"name": "hello", "system": 0}, {"name": "help2man", "system": 0}, {"name": "help2man-texi", "system": 0}, {"name": "hylafax", "system": 0}, {"name": "idutils", "system": 0}, {"name": "jwhois", "system": 0}, {"name": "kbd", "system": 0}, {"name": "klavaro", "system": 0}, {"name": "ld", "system": 0}, {"name": "leafpad", "system": 0}, {"name": "libc", "system": 0}, {"name": "libexif", "system": 0}, {"name": "libextractor", "system": 0}, {"name": "libgnutls", "system": 0}, {"name": "libgphoto2", "system": 0}, {"name": "libgphoto2_port", "system": 0}, {"name": "libgsasl", "system": 0}, {"name": "libiconv", "system": 0}, {"name": "libidn", "system": 0}, {"name": "libidn2", "system": 0}, {"name": "lilypond", "system": 0}, {"name": "lordsawar", "system": 0}, {"name": "lprng", "system": 0}, {"name": "lynx", "system": 0}, {"name": "m4", "system": 0}, {"name": "mailfromd", "system": 0}, {"name": "mailutils", "system": 0}, {"name": "make", "system": 0}, {"name": "man-db", "system": 0}, {"name": "man-db-manpages", "system": 0}, {"name": "midi-instruments", "system": 0}, {"name": "minicom", "system": 0}, {"name": "mkisofs", "system": 0}, {"name": "muibase", "system": 0}, {"name": "myserver", "system": 0}, {"name": "nano", "system": 0}, {"name": "opcodes", "system": 0}, {"name": "parted", "system": 0}, {"name": "pies", "system": 0}, {"name": "pnmixer", "system": 0}, {"name": "popt", "system": 0}, {"name": "procps-ng", "system": 0}, {"name": "procps-ng-man", "system": 0}, {"name": "psmisc", "system": 0}, {"name": "pspp", "system": 0}, {"name": "pushover", "system": 0}, {"name": "pwdutils", "system": 0}, {"name": "pyspread", "system": 0}, {"name": "radius", "system": 0}, {"name": "recode", "system": 0}, {"name": "recutils", "system": 0}, {"name": "rpm", "system": 0}, {"name": "rush", "system": 0}, {"name": "sarg", "system": 0}, {"name": "savane", "system": 0}, {"name": "sed", "system": 0}, {"name": "sharutils", "system": 0}, {"name": "shepherd", "system": 0}, {"name": "shishi", "system": 0}, {"name": "skribilo", "system": 0}, {"name": "solfege", "system": 0}, {"name": "solfege-manual", "system": 0}, {"name": "spotmachine", "system": 0}, {"name": "sudo", "system": 0}, {"name": "sudoers", "system": 0}, {"name": "sysstat", "system": 0}, {"name": "tar", "system": 0}, {"name": "texinfo", "system": 0}, {"name": "texinfo_document", "system": 0}, {"name": "tigervnc", "system": 0}, {"name": "tin", "system": 0}, {"name": "tin-man", "system": 0}, {"name": "tracgoogleappsauthplugin", "system": 0}, {"name": "trader", "system": 0}, {"name": "util-linux", "system": 0}, {"name": "ve", "system": 0}, {"name": "vmm", "system": 0}, {"name": "vorbis-tools", "system": 0}, {"name": "wastesedge", "system": 0}, {"name": "wcd", "system": 0}, {"name": "wcd-man", "system": 0}, {"name": "wdiff", "system": 0}, {"name": "wget", "system": 0}, {"name": "wyslij-po", "system": 0}, {"name": "xboard", "system": 0}, {"name": "xdg-user-dirs", "system": 0}, {"name": "xkeyboard-config", "system": 0}, {"name": "id-editor", "system": 1, "organization": "openstreetmap", "project": "id-editor"}, {"name": "offlate", "system": 2, "repo": "https://framagit.org/tyreunom/offlate", "branch": "master"}] | |
1 | + | [{"name": "a2ps", "system": 0}, {"name": "aegis", "system": 0}, {"name": "anubis", "system": 0}, {"name": "aspell", "system": 0}, {"name": "bash", "system": 0}, {"name": "bfd", "system": 0}, {"name": "binutils", "system": 0}, {"name": "bison", "system": 0}, {"name": "bison-runtime", "system": 0}, {"name": "buzztrax", "system": 0}, {"name": "ccd2cue", "system": 0}, {"name": "ccide", "system": 0}, {"name": "cflow", "system": 0}, {"name": "clisp", "system": 0}, {"name": "coreutils", "system": 0}, {"name": "cpio", "system": 0}, {"name": "cppi", "system": 0}, {"name": "cpplib", "system": 0}, {"name": "cryptsetup", "system": 0}, {"name": "datamash", "system": 0}, {"name": "denemo", "system": 0}, {"name": "dfarc", "system": 0}, {"name": "dialog", "system": 0}, {"name": "dico", "system": 0}, {"name": "diffutils", "system": 0}, {"name": "dink", "system": 0}, {"name": "direvent", "system": 0}, {"name": "doodle", "system": 0}, {"name": "dos2unix", "system": 0}, {"name": "dos2unix-man", "system": 0}, {"name": "e2fsprogs", "system": 0}, {"name": "enscript", "system": 0}, {"name": "exif", "system": 0}, {"name": "fetchmail", "system": 0}, {"name": "findutils", "system": 0}, {"name": "flex", "system": 0}, {"name": "freedink", "system": 0}, {"name": "fusionforge", "system": 0}, {"name": "gas", "system": 0}, {"name": "gawk", "system": 0}, {"name": "gcal", "system": 0}, {"name": "gcc", "system": 0}, {"name": "gdbm", "system": 0}, {"name": "gettext-examples", "system": 0}, {"name": "gettext-runtime", "system": 0}, {"name": "gettext-tools", "system": 0}, {"name": "gjay", "system": 0}, {"name": "glunarclock", "system": 0}, {"name": "gnubiff", "system": 0}, {"name": "gnubik", "system": 0}, {"name": "gnucash", "system": 0}, {"name": "gnuchess", "system": 0}, {"name": "gnucobol", "system": 0}, {"name": "gnulib", "system": 0}, {"name": "gnunet", "system": 0}, {"name": "gnunet-gtk", "system": 0}, {"name": "gold", "system": 0}, {"name": "gphoto2", "system": 0}, {"name": "gprof", "system": 0}, {"name": "gramadoir", "system": 0}, {"name": "grep", "system": 0}, {"name": "grip", "system": 0}, {"name": "grub", "system": 0}, {"name": "gsasl", "system": 0}, {"name": "gss", "system": 0}, {"name": "gst-plugins-bad", "system": 0}, {"name": "gst-plugins-base", "system": 0}, {"name": "gst-plugins-good", "system": 0}, {"name": "gst-plugins-ugly", "system": 0}, {"name": "gstreamer", "system": 0}, {"name": "gtick", "system": 0}, {"name": "gtkam", "system": 0}, {"name": "gtkspell", "system": 0}, {"name": "guix", "system": 0}, {"name": "guix-manual", "system": 0}, {"name": "guix-packages", "system": 0}, {"name": "gutenprint", "system": 0}, {"name": "hello", "system": 0}, {"name": "help2man", "system": 0}, {"name": "help2man-texi", "system": 0}, {"name": "hylafax", "system": 0}, {"name": "idutils", "system": 0}, {"name": "jwhois", "system": 0}, {"name": "kbd", "system": 0}, {"name": "klavaro", "system": 0}, {"name": "ld", "system": 0}, {"name": "leafpad", "system": 0}, {"name": "libc", "system": 0}, {"name": "libexif", "system": 0}, {"name": "libextractor", "system": 0}, {"name": "libgnutls", "system": 0}, {"name": "libgphoto2", "system": 0}, {"name": "libgphoto2_port", "system": 0}, {"name": "libgsasl", "system": 0}, {"name": "libiconv", "system": 0}, {"name": "libidn", "system": 0}, {"name": "libidn2", "system": 0}, {"name": "lilypond", "system": 0}, {"name": "lordsawar", "system": 0}, {"name": "lprng", "system": 0}, {"name": "lynx", "system": 0}, {"name": "m4", "system": 0}, {"name": "mailfromd", "system": 0}, {"name": "mailutils", "system": 0}, {"name": "make", "system": 0}, {"name": "man-db", "system": 0}, {"name": "man-db-manpages", "system": 0}, {"name": "midi-instruments", "system": 0}, {"name": "minicom", "system": 0}, {"name": "mkisofs", "system": 0}, {"name": "muibase", "system": 0}, {"name": "myserver", "system": 0}, {"name": "nano", "system": 0}, {"name": "opcodes", "system": 0}, {"name": "parted", "system": 0}, {"name": "pies", "system": 0}, {"name": "pnmixer", "system": 0}, {"name": "popt", "system": 0}, {"name": "procps-ng", "system": 0}, {"name": "procps-ng-man", "system": 0}, {"name": "psmisc", "system": 0}, {"name": "pspp", "system": 0}, {"name": "pushover", "system": 0}, {"name": "pwdutils", "system": 0}, {"name": "pyspread", "system": 0}, {"name": "radius", "system": 0}, {"name": "recode", "system": 0}, {"name": "recutils", "system": 0}, {"name": "rpm", "system": 0}, {"name": "rush", "system": 0}, {"name": "sarg", "system": 0}, {"name": "savane", "system": 0}, {"name": "sed", "system": 0}, {"name": "sharutils", "system": 0}, {"name": "shepherd", "system": 0}, {"name": "shishi", "system": 0}, {"name": "skribilo", "system": 0}, {"name": "solfege", "system": 0}, {"name": "solfege-manual", "system": 0}, {"name": "spotmachine", "system": 0}, {"name": "sudo", "system": 0}, {"name": "sudoers", "system": 0}, {"name": "sysstat", "system": 0}, {"name": "tar", "system": 0}, {"name": "texinfo", "system": 0}, {"name": "texinfo_document", "system": 0}, {"name": "tigervnc", "system": 0}, {"name": "tin", "system": 0}, {"name": "tin-man", "system": 0}, {"name": "tracgoogleappsauthplugin", "system": 0}, {"name": "trader", "system": 0}, {"name": "util-linux", "system": 0}, {"name": "ve", "system": 0}, {"name": "vmm", "system": 0}, {"name": "vorbis-tools", "system": 0}, {"name": "wastesedge", "system": 0}, {"name": "wcd", "system": 0}, {"name": "wcd-man", "system": 0}, {"name": "wdiff", "system": 0}, {"name": "wget", "system": 0}, {"name": "wyslij-po", "system": 0}, {"name": "xboard", "system": 0}, {"name": "xdg-user-dirs", "system": 0}, {"name": "xkeyboard-config", "system": 0}, {"name": "id-editor", "system": 1, "organization": "openstreetmap", "project": "id-editor"}, {"name": "offlate", "system": 2, "repo": "https://framagit.org/tyreunom/offlate", "branch": "master"}, {"name": "guix-weblate", "system": 4, "instance": "https://translate.fedoraproject.org", "project": "guix"}] |
offlate/systems/list.py
19 | 19 | from .github import GithubProject | |
20 | 20 | from .tp import TPProject | |
21 | 21 | from .transifex import TransifexProject | |
22 | + | from .weblate import WeblateProject | |
22 | 23 | ||
23 | 24 | systems = [ | |
24 | 25 | {'name': 'Translation Project', | |
… | |||
33 | 34 | {'name': 'Github', | |
34 | 35 | 'system': GithubProject, | |
35 | 36 | 'key': 'Github'}, | |
37 | + | {'name': 'Weblate', | |
38 | + | 'system': WeblateProject, | |
39 | + | 'key': 'Weblate'} | |
36 | 40 | ] |
offlate/systems/weblate.py unknown status 1
1 | + | # Copyright (c) 2018 Julien Lepiller <julien@lepiller.eu> | |
2 | + | # | |
3 | + | # This program is free software: you can redistribute it and/or modify | |
4 | + | # it under the terms of the GNU Affero General Public License as | |
5 | + | # published by the Free Software Foundation, either version 3 of the | |
6 | + | # License, or (at your option) any later version. | |
7 | + | # | |
8 | + | # This program 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 Affero General Public License for more details. | |
12 | + | # | |
13 | + | # You should have received a copy of the GNU Affero General Public License | |
14 | + | # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
15 | + | #### | |
16 | + | """ The transifex system connector. """ | |
17 | + | ||
18 | + | import json | |
19 | + | import os | |
20 | + | import requests | |
21 | + | from requests.auth import HTTPBasicAuth | |
22 | + | ||
23 | + | from ..core.config import * | |
24 | + | from ..formats.gettext import GettextFormat | |
25 | + | from ..formats.exception import UnsupportedFormatException | |
26 | + | from .exception import ProjectNotFoundSystemException | |
27 | + | from .project import Project | |
28 | + | ||
29 | + | class WeblateProject(Project): | |
30 | + | def __init__(self, name, lang, conf, data={}): | |
31 | + | Project.__init__(self, name, lang, conf, data) | |
32 | + | for server in self.conf['servers']: | |
33 | + | if server['server'] == data['instance']: | |
34 | + | self.conf['token'] = server['token'] | |
35 | + | self.basedir = '' | |
36 | + | self.contents = {} | |
37 | + | ||
38 | + | def open(self, basedir): | |
39 | + | self.basedir = basedir | |
40 | + | with open(self.basedir + '/project.info') as f: | |
41 | + | self.files = json.load(f) | |
42 | + | ||
43 | + | def initialize(self, basedir, callback=None): | |
44 | + | self.basedir = basedir | |
45 | + | self.updateFileList() | |
46 | + | with open(self.basedir + '/project.info', 'w') as f: | |
47 | + | f.write(json.dumps(self.files)) | |
48 | + | i = 0 | |
49 | + | for slug in self.files: | |
50 | + | callback.reportProgress(100.0 * i / len(self.files)) | |
51 | + | self.getFiles(slug['slug']) | |
52 | + | i += 1 | |
53 | + | callback.reportProgress(100) | |
54 | + | ||
55 | + | def updateFileList(self): | |
56 | + | self.files = [] | |
57 | + | ans = requests.get(self.data['instance'] + '/api/projects/' + | |
58 | + | self.data['project'] + '/components', | |
59 | + | auth=HTTPBasicAuth('Token', self.conf['token'])) | |
60 | + | if ans.status_code == 200: | |
61 | + | l = json.loads(ans.text)['results'] | |
62 | + | self.files = l | |
63 | + | else: | |
64 | + | raise ProjectNotFoundSystemException(self.name) | |
65 | + | ||
66 | + | def update(self, askmerge, callback=None): | |
67 | + | self.updateFileList() | |
68 | + | i = 0 | |
69 | + | for ff in self.files: | |
70 | + | callback.reportProgress(100.0 * i / len(self.files)) | |
71 | + | slug = ff['slug'] | |
72 | + | fname = self.filename(slug, False) | |
73 | + | sname = self.filename(slug, True) | |
74 | + | os.rename(fname, fname+'.old') | |
75 | + | os.rename(sname, sname+'.old') | |
76 | + | self.getFiles(slug) | |
77 | + | if ff['file_format'] == 'po': | |
78 | + | oldformat = GettextFormat({'file': fname + '.old', | |
79 | + | 'pot': sname + '.old', | |
80 | + | 'version': self.conf['offlate_version'], | |
81 | + | 'fullname': self.conf['name'] + ' <' + self.conf['email'] + '>', | |
82 | + | 'lang': self.lang}) | |
83 | + | currentformat = GettextFormat({'file': fname, | |
84 | + | 'pot': sname, | |
85 | + | 'version': self.conf['offlate_version'], | |
86 | + | 'fullname': self.conf['name'] + ' <' + self.conf['email'] + '>', | |
87 | + | 'lang': self.lang}) | |
88 | + | else: | |
89 | + | raise UnsupportedFormatException(ff['file_format']) | |
90 | + | currentformat.merge(oldformat, askmerge) | |
91 | + | i += 1 | |
92 | + | callback.reportProgress(100) | |
93 | + | ||
94 | + | def filename(self, slug, is_source): | |
95 | + | ext = '' | |
96 | + | f = None | |
97 | + | for ff in self.files: | |
98 | + | if ff['slug'] == slug: | |
99 | + | f = ff | |
100 | + | break | |
101 | + | if f['file_format'] == 'po': | |
102 | + | ext = 'po' | |
103 | + | else: | |
104 | + | raise UnsupportedFormatException(ff['file_format']) | |
105 | + | return self.basedir + '/' + slug + ('.source' if is_source else '') + '.' + ext | |
106 | + | ||
107 | + | def getFiles(self, slug): | |
108 | + | ans = requests.get(self.data['instance'] + '/api/components/' + | |
109 | + | self.data['project'] + '/' + slug + '/', | |
110 | + | auth=HTTPBasicAuth('Token', self.conf['token'])) | |
111 | + | source_lang='en' | |
112 | + | if ans.status_code == 200: | |
113 | + | l = json.loads(ans.text) | |
114 | + | source_lang = l['source_language']['code'] | |
115 | + | ||
116 | + | ans = requests.get(self.data['instance'] + '/api/translations/' + | |
117 | + | self.data['project'] + '/' + slug + '/' + self.lang + '/file', | |
118 | + | auth=HTTPBasicAuth('Token', self.conf['token'])) | |
119 | + | if ans.status_code == 200: | |
120 | + | with open(self.filename(slug, False), 'wb') as f: | |
121 | + | f.write(ans.text.encode(ans.encoding)) | |
122 | + | ||
123 | + | ans = requests.get(self.data['instance'] + '/api/translations/' + | |
124 | + | self.data['project'] + '/' + slug + '/' + source_lang + '/file', | |
125 | + | auth=HTTPBasicAuth('Token', self.conf['token'])) | |
126 | + | if ans.status_code == 200: | |
127 | + | with open(self.filename(slug, True), 'wb') as f: | |
128 | + | f.write(ans.text.encode(ans.encoding)) | |
129 | + | else: | |
130 | + | print(ans.text) | |
131 | + | ||
132 | + | def send(self, callback): | |
133 | + | self.save() | |
134 | + | i = 0 | |
135 | + | for slug in self.files: | |
136 | + | callback.reportProgress(100.0 * i / len(self.files)) | |
137 | + | print('{} => {}'.format(slug['slug'], slug['file_format'])) | |
138 | + | filename = self.filename(slug['slug'], False) | |
139 | + | with open(filename, 'rb') as f: | |
140 | + | ans = requests.get(self.data['instance'] + '/api/translations/' + | |
141 | + | self.data['project'] + '/' + slug['slug'] + '/' + | |
142 | + | self.lang + '/file', | |
143 | + | files={'file': f}, | |
144 | + | auth=HTTPBasicAuth('Token', self.conf['token'])) | |
145 | + | print(ans) | |
146 | + | print(ans.text) | |
147 | + | i += 1 | |
148 | + | callback.reportProgress(100) | |
149 | + | ||
150 | + | def save(self): | |
151 | + | for slug in self.slugs: | |
152 | + | slug.save() | |
153 | + | ||
154 | + | def content(self): | |
155 | + | content = {} | |
156 | + | self.slugs = [] | |
157 | + | for slug in self.files: | |
158 | + | fname = self.filename(slug['slug'], False) | |
159 | + | sname = self.filename(slug['slug'], True) | |
160 | + | if slug['file_format'] == 'po': | |
161 | + | myslug = GettextFormat({'file': fname, | |
162 | + | 'pot': sname, | |
163 | + | 'version': self.conf['offlate_version'], | |
164 | + | 'fullname': self.conf['name'] + ' <' + self.conf['email'] + '>', | |
165 | + | 'lang': self.lang}) | |
166 | + | else: | |
167 | + | raise UnsupportedFormatException(ff['file_format']) | |
168 | + | self.slugs.append(myslug) | |
169 | + | content[slug['slug']] = myslug.content() | |
170 | + | return content | |
171 | + | ||
172 | + | def getExternalFiles(self): | |
173 | + | return [x.getExternalFiles() for x in self.slugs] | |
174 | + | ||
175 | + | def reload(self): | |
176 | + | for x in self.slugs: | |
177 | + | x.reload() | |
178 | + | ||
179 | + | @staticmethod | |
180 | + | def getProjectConfigSpec(): | |
181 | + | return [StringConfigSpec('instance', Project.tr('Instance'), | |
182 | + | Project.tr('Full clone URL of the Weblate instance'), | |
183 | + | Project.tr('https://weblate.org')), | |
184 | + | StringConfigSpec('project', Project.tr('Project'), | |
185 | + | Project.tr('Name of the project on the instance'), | |
186 | + | Project.tr('foo'))] | |
187 | + | ||
188 | + | @staticmethod | |
189 | + | def getSystemConfigSpec(): | |
190 | + | return [ListConfigSpec('servers', Project.tr('Configured Weblate instances'), | |
191 | + | Project.tr('You need to find a token for each Weblate instance \ | |
192 | + | you have an account on. You can create a token by logging into your account, \ | |
193 | + | going to your settings and in the API Access page.'), | |
194 | + | [ | |
195 | + | StringConfigSpec('server', Project.tr('Server'), | |
196 | + | Project.tr('Server name'), | |
197 | + | placeholder = Project.tr('https://weblate.org')), | |
198 | + | StringConfigSpec('token', Project.tr('Token'), | |
199 | + | Project.tr('The token you created from your account'), | |
200 | + | placeholder = Project.tr('fKbStkBgFzIL0UW15sfcJh7kC0BAbcVtV16kblXlM')) | |
201 | + | ], | |
202 | + | 'server', | |
203 | + | WeblateProject.hasRequiredRow)] | |
204 | + | return specs | |
205 | + | ||
206 | + | @staticmethod | |
207 | + | def hasRequiredRow(conf, servers): | |
208 | + | """ | |
209 | + | Method used by the configuration system: it checks that the configuration | |
210 | + | refers to a server whose configuration is valid. | |
211 | + | """ | |
212 | + | server = conf['instance'] | |
213 | + | ||
214 | + | for serv in servers: | |
215 | + | if serv["server"] == server: | |
216 | + | return True | |
217 | + | return False |