julen / pootle

Web-based translation and translation management tool

This URL has Read+Write access

pootle / potree.py
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 1 #!/usr/bin/env python
a953d6ab » davidfraser 2005-07-01 added encoding markers for ... 2 # -*- coding: utf-8 -*-
8cb4cf14 » winterstream 2008-08-21 Fix refreshstats by forcing... 3 #
d8ec3e47 » dwaynebailey 2006-06-15 [Forwardport] Update copyri... 4 # Copyright 2004-2006 Zuza Software Foundation
8cb4cf14 » winterstream 2008-08-21 Fix refreshstats by forcing... 5 #
d8ec3e47 » dwaynebailey 2006-06-15 [Forwardport] Update copyri... 6 # This file is part of translate.
7 #
8 # translate is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
8cb4cf14 » winterstream 2008-08-21 Fix refreshstats by forcing... 12 #
d8ec3e47 » dwaynebailey 2006-06-15 [Forwardport] Update copyri... 13 # translate is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with translate; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 21
22 """manages the whole set of projects and languages for a pootle installation"""
23
24 from Pootle import projects
25 from Pootle import pootlefile
1bd8ff5b » friedelwolff 2006-10-12 Use new localelanguage() fu... 26 from Pootle import pagelayout
b00bca80 » davidfraser 2006-04-26 [forwardport from Pootle-ki... 27 from translate.misc import autoencode
8c4346c1 » friedelwolff 2008-07-24 [Contributed by Suresh Chan... 28 from translate.lang import data as langdata
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 29
8c4346c1 » friedelwolff 2008-07-24 [Contributed by Suresh Chan... 30 import os
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 31
32 class POTree:
33 """Manages the tree of projects and languages"""
34 def __init__(self, instance):
35 self.languages = instance.languages
da21d7a3 » davidfraser 2005-06-26 added support for Templates... 36 if not self.haslanguage("templates"):
37 setattr(self.languages, "templates.fullname", "Templates")
38 self.saveprefs()
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 39 self.projects = instance.projects
40 self.podirectory = instance.podirectory
37cad147 » friedelwolff 2007-01-26 Get the default project rig... 41 self.instance = instance
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 42 self.projectcache = {}
43
44 def saveprefs(self):
45 """saves any changes made to the preferences"""
46 # TODO: this is a hack, fix it up nicely :-)
47 prefsfile = self.languages.__root__.__dict__["_setvalue"].im_self
48 prefsfile.savefile()
49
50 def changelanguages(self, argdict):
51 """changes language entries"""
52 for key, value in argdict.iteritems():
53 if key.startswith("languageremove-"):
54 languagecode = key.replace("languageremove-", "", 1)
55 if self.haslanguage(languagecode):
56 delattr(self.languages, languagecode)
57 elif key.startswith("languagename-"):
58 languagecode = key.replace("languagename-", "", 1)
59 if self.haslanguage(languagecode):
60 languagename = self.getlanguagename(languagecode)
61 if languagename != value:
62 self.setlanguagename(languagecode, value)
63 elif key.startswith("languagespecialchars-"):
64 languagecode = key.replace("languagespecialchars-", "", 1)
65 if self.haslanguage(languagecode):
66 languagespecialchars = self.getlanguagespecialchars(languagecode)
67 if languagespecialchars != value:
68 self.setlanguagespecialchars(languagecode, value)
69 elif key.startswith("languagenplurals-"):
70 languagecode = key.replace("languagenplurals-", "", 1)
71 if self.haslanguage(languagecode):
72 languagenplurals = self.getlanguagenplurals(languagecode)
73 if languagenplurals != value:
74 self.setlanguagenplurals(languagecode, value)
75 elif key.startswith("languagepluralequation-"):
76 languagecode = key.replace("languagepluralequation-", "", 1)
77 if self.haslanguage(languagecode):
78 languagepluralequation = self.getlanguagepluralequation(languagecode)
79 if languagepluralequation != value:
80 self.setlanguagepluralequation(languagecode, value)
81 elif key == "newlanguagecode":
82 languagecode = value.lower()
83 if not languagecode.strip():
84 continue
85 if not languagecode.isalpha():
1bd8ff5b » friedelwolff 2006-10-12 Use new localelanguage() fu... 86 languagecode = pagelayout.localelanguage(languagecode)
1d7d9d4c » friedelwolff 2006-03-24 allow dialect language name... 87 if languagecode.find("_") >= 0:
88 for part in languagecode.split("_"):
89 if not part.isalpha():
90 raise ValueError("Language code must be alphabetic")
77770670 » friedelwolff 2006-06-01 Format new language code co... 91 languagecode, countrycode = languagecode.split("_")
92 countrycode = countrycode.upper()
93 languagecode = "%s_%s" % (languagecode, countrycode)
8cb4cf14 » winterstream 2008-08-21 Fix refreshstats by forcing... 94 else:
1d7d9d4c » friedelwolff 2006-03-24 allow dialect language name... 95 raise ValueError("Language code must be alphabetic")
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 96 if self.haslanguage(languagecode):
97 raise ValueError("Already have language with the code %s" % languagecode)
98 languagename = argdict.get("newlanguagename", languagecode)
99 languagespecialchars = argdict.get("newlanguagespecialchars", "")
100 languagenplurals = argdict.get("newlanguagenplurals", "")
101 languagepluralequation = argdict.get("newlanguagepluralequation", "")
102 # FIXME need to check that default values are not present
103 # if languagename == self.localize("(add language here)"):
104 # raise ValueError("Please set a value for the language name")
105 print "nplurals: %s" % languagenplurals
106 if not languagenplurals.isdigit() and not languagenplurals == "":
107 raise ValueError("Number of plural forms must be numeric")
108 # if languagenplurals == self.localize("(number of plurals)"):
109 # raise ValueError("Please set a value for the number of plural forms")
110 # if languagepluralequation == self.localize("(plural equation)"):
111 # raise ValueError("Please set a value for the plural equation")
112 if not languagenplurals == "" and languagepluralequation == "":
113 raise ValueError("Please set both the number of plurals and the plural equation OR leave both blank")
114 setattr(self.languages, languagecode + ".fullname", languagename)
115 setattr(self.languages, languagecode + ".specialchars", languagespecialchars)
116 setattr(self.languages, languagecode + ".nplurals", languagenplurals)
117 setattr(self.languages, languagecode + ".pluralequation", languagepluralequation)
118 self.saveprefs()
119
120 def changeprojects(self, argdict):
121 """changes project entries"""
dc2f2deb » friedelwolff 2006-05-25 Fix not being able to disab... 122 #Let's reset all "createmofiles" to 0, otherwise we can't disable one
123 #since the key will never arrive
124 for project in self.getprojectcodes():
125 self.setprojectcreatemofiles(project, 0)
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 126 for key, value in argdict.iteritems():
127 if key.startswith("projectremove-"):
128 projectcode = key.replace("projectremove-", "", 1)
129 if hasattr(self.projects, projectcode):
130 delattr(self.projects, projectcode)
131 elif key.startswith("projectname-"):
132 projectcode = key.replace("projectname-", "", 1)
133 if hasattr(self.projects, projectcode):
134 projectname = self.getprojectname(projectcode)
135 if projectname != value:
136 self.setprojectname(projectcode, value)
137 elif key.startswith("projectdescription-"):
138 projectcode = key.replace("projectdescription-", "", 1)
139 if hasattr(self.projects, projectcode):
140 projectdescription = self.getprojectdescription(projectcode)
141 if projectdescription != value:
142 self.setprojectdescription(projectcode, value)
143 elif key.startswith("projectcheckerstyle-"):
144 projectcode = key.replace("projectcheckerstyle-", "", 1)
145 if hasattr(self.projects, projectcode):
146 projectcheckerstyle = self.getprojectcheckerstyle(projectcode)
147 if projectcheckerstyle != value:
148 self.setprojectcheckerstyle(projectcode, value)
10273d0e » varsist 2006-10-30 Added new project attribute... 149 elif key.startswith("projectfiletype-"):
150 projectcode = key.replace("projectfiletype-", "", 1)
151 if hasattr(self.projects, projectcode):
152 projectlocalfiletype = self.getprojectlocalfiletype(projectcode)
153 if projectlocalfiletype != value:
154 self.setprojectlocalfiletype(projectcode, value)
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 155 elif key.startswith("projectcreatemofiles-"):
156 projectcode = key.replace("projectcreatemofiles-", "", 1)
157 if hasattr(self.projects, projectcode):
158 self.setprojectcreatemofiles(projectcode, 1)
159 elif key == "newprojectcode":
160 projectcode = value.lower()
161 if not projectcode:
162 continue
163 if not (projectcode[:1].isalpha() and projectcode.replace("_","").isalnum()):
164 raise ValueError("Project code must be alphanumeric and start with an alphabetic character (got %r)" % projectcode)
165 if hasattr(self.projects, projectcode):
166 raise ValueError("Already have project with the code %s" % projectcode)
167 projectname = argdict.get("newprojectname", projectcode)
10273d0e » varsist 2006-10-30 Added new project attribute... 168 projecttype = argdict.get("newprojectfiletype", "")
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 169 projectdescription = argdict.get("newprojectdescription", "")
170 projectcheckerstyle = argdict.get("newprojectcheckerstyle", "")
171 projectcreatemofiles = argdict.get("newprojectcreatemofiles", "")
172 setattr(self.projects, projectcode + ".fullname", projectname)
10273d0e » varsist 2006-10-30 Added new project attribute... 173 setattr(self.projects, projectcode + ".localfiletype", projecttype)
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 174 setattr(self.projects, projectcode + ".description", projectdescription)
175 setattr(self.projects, projectcode + ".checkerstyle", projectcheckerstyle)
176 setattr(self.projects, projectcode + ".createmofiles", projectcreatemofiles)
177 projectdir = os.path.join(self.podirectory, projectcode)
178 if not os.path.isdir(projectdir):
179 os.mkdir(projectdir)
180 self.saveprefs()
181
182 def haslanguage(self, languagecode):
183 """checks if this language exists"""
184 return hasattr(self.languages, languagecode)
185
186 def getlanguageprefs(self, languagecode):
187 """returns the language object"""
188 return getattr(self.languages, languagecode)
189
190 def getlanguagename(self, languagecode):
191 """returns the language's full name"""
192 return getattr(self.getlanguageprefs(languagecode), "fullname", languagecode)
193
194 def setlanguagename(self, languagecode, languagename):
195 """stes the language's full name"""
196 setattr(self.getlanguageprefs(languagecode), "fullname", languagename)
197
198 def getlanguagespecialchars(self, languagecode):
199 """returns the language's special characters"""
b00bca80 » davidfraser 2006-04-26 [forwardport from Pootle-ki... 200 return autoencode.autoencode(getattr(self.getlanguageprefs(languagecode), "specialchars", ""), "utf-8")
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 201
202 def setlanguagespecialchars(self, languagecode, languagespecialchars):
203 """sets the language's special characters"""
204 setattr(self.getlanguageprefs(languagecode), "specialchars", languagespecialchars)
205
206 def getlanguagenplurals(self, languagecode):
207 """returns the language's number of plural forms"""
208 return getattr(self.getlanguageprefs(languagecode), "nplurals", "")
209
210 def setlanguagenplurals(self, languagecode, languagenplurals):
211 """sets the language's number of plural forms"""
212 setattr(self.getlanguageprefs(languagecode), "nplurals", languagenplurals)
213
214 def getlanguagepluralequation(self, languagecode):
215 """returns the language's number of plural forms"""
216 return getattr(self.getlanguageprefs(languagecode), "pluralequation", "")
217
218 def setlanguagepluralequation(self, languagecode, languagepluralequation):
219 """sets the language's number of plural forms"""
220 setattr(self.getlanguageprefs(languagecode), "pluralequation", languagepluralequation)
221
222 def getlanguagecodes(self, projectcode=None):
223 """returns a list of valid languagecodes for a given project or all projects"""
224 alllanguagecodes = [languagecode for languagecode, language in self.languages.iteritems()]
225 if projectcode is None:
ee8f2329 » dwaynebailey 2005-04-26 Languages are now always re... 226 languagecodes = alllanguagecodes
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 227 else:
228 projectdir = os.path.join(self.podirectory, projectcode)
229 if not os.path.exists(projectdir):
230 return []
231 if self.isgnustyle(projectcode):
ee8f2329 » dwaynebailey 2005-04-26 Languages are now always re... 232 languagecodes = [languagecode for languagecode in alllanguagecodes if self.hasproject(languagecode, projectcode)]
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 233 else:
234 subdirs = [fn for fn in os.listdir(projectdir) if os.path.isdir(os.path.join(projectdir, fn))]
235 languagecodes = []
236 for potentialcode in subdirs:
237 if not self.languagematch(None, potentialcode):
238 continue
098843fd » friedelwolff 2006-06-01 Prefer regional dialect ove... 239 if potentialcode in alllanguagecodes:
240 languagecodes.append(potentialcode)
241 continue
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 242 if "-" in potentialcode:
243 potentialcode = potentialcode[:potentialcode.find("-")]
244 elif "_" in potentialcode:
245 potentialcode = potentialcode[:potentialcode.find("_")]
246 if potentialcode in alllanguagecodes:
247 languagecodes.append(potentialcode)
ee8f2329 » dwaynebailey 2005-04-26 Languages are now always re... 248 languagecodes.sort()
249 return languagecodes
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 250
938ae0cd » davidfraser 2005-06-13 added getlanguages method w... 251 def getlanguages(self, projectcode=None, sortbyname=True):
252 """gets a list of (languagecode, languagename) tuples"""
253 languagecodes = self.getlanguagecodes(projectcode)
254 if sortbyname:
255 languages = [(self.getlanguagename(languagecode), languagecode) for languagecode in languagecodes]
256 languages.sort()
257 return [(languagecode, languagename) for languagename, languagecode in languages]
258 else:
259 return [(languagecode, self.getlanguagename(languagecode)) for languagecode in languagecodes]
260
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 261 def getprojectcodes(self, languagecode=None):
262 """returns a list of project codes that are valid for the given languagecode or all projects"""
263 projectcodes = [projectcode for projectcode, projectprefs in self.projects.iteritems()]
264 projectcodes.sort()
265 if languagecode is None:
266 return projectcodes
267 else:
268 return [projectcode for projectcode in projectcodes if self.hasproject(languagecode, projectcode)]
269
270 def hasproject(self, languagecode, projectcode):
271 """returns whether the project exists for the language"""
272 if not hasattr(self.projects, projectcode):
273 return False
274 if languagecode is None:
275 return True
276 if not self.haslanguage(languagecode):
277 return False
278 try:
279 self.getpodir(languagecode, projectcode)
280 return True
281 except IndexError:
282 return False
283
284 def gettemplates(self, projectcode):
285 """returns templates for the given project"""
286 projectdir = os.path.join(self.podirectory, projectcode)
287 templatesdir = os.path.join(projectdir, "templates")
288 if not os.path.exists(templatesdir):
eb966f0e » dwaynebailey 2005-04-26 Project PO Template files c... 289 templatesdir = os.path.join(projectdir, "pot")
290 if not os.path.exists(templatesdir):
291 templatesdir = projectdir
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 292 potfilenames = []
293 def addfiles(podir, dirname, fnames):
294 """adds the files to the set of files for this project"""
295 basedirname = dirname.replace(podir, "", 1)
296 while basedirname.startswith(os.sep):
297 basedirname = basedirname.replace(os.sep, "", 1)
298 ponames = [fname for fname in fnames if fname.endswith(os.extsep+"pot")]
299 potfilenames.extend([os.path.join(basedirname, poname) for poname in ponames])
300 os.path.walk(templatesdir, addfiles, templatesdir)
301 return potfilenames
302
303 def getproject(self, languagecode, projectcode):
304 """returns the project object for the languagecode and projectcode"""
305 if (languagecode, projectcode) not in self.projectcache:
da21d7a3 » davidfraser 2005-06-26 added support for Templates... 306 if languagecode == "templates":
307 self.projectcache[languagecode, projectcode] = projects.TemplatesProject(projectcode, self)
308 else:
309 self.projectcache[languagecode, projectcode] = projects.TranslationProject(languagecode, projectcode, self)
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 310 return self.projectcache[languagecode, projectcode]
311
312 def isgnustyle(self, projectcode):
313 """checks whether the whole project is a GNU-style project"""
314 projectdir = os.path.join(self.podirectory, projectcode)
315 return self.hasgnufiles(projectdir)
316
317 def addtranslationproject(self, languagecode, projectcode):
318 """creates a new TranslationProject"""
319 if self.hasproject(languagecode, projectcode):
320 raise ValueError("projects.TranslationProject for project %s, language %s already exists" % (projectcode, languagecode))
321 self.projectcache[languagecode, projectcode] = projects.TranslationProject(languagecode, projectcode, self, create=True)
322
323 def getprojectname(self, projectcode):
324 """returns the full name of the project"""
325 projectprefs = getattr(self.projects, projectcode)
326 return getattr(projectprefs, "fullname", projectcode)
327
328 def setprojectname(self, projectcode, projectname):
329 """returns the full name of the project"""
330 projectprefs = getattr(self.projects, projectcode)
331 setattr(projectprefs, "fullname", projectname)
332
333 def getprojectdescription(self, projectcode):
334 """returns the project description"""
335 projectprefs = getattr(self.projects, projectcode)
336 return getattr(projectprefs, "description", projectcode)
337
338 def setprojectdescription(self, projectcode, projectdescription):
339 """returns the project description"""
340 projectprefs = getattr(self.projects, projectcode)
341 setattr(projectprefs, "description", projectdescription)
342
10273d0e » varsist 2006-10-30 Added new project attribute... 343 def getprojectlocalfiletype(self, projectcode):
db67b485 » friedelwolff 2007-01-16 Make sure that the local fi... 344 """returns the project allowed file type. We assume it is .po if nothing
345 else is specified."""
10273d0e » varsist 2006-10-30 Added new project attribute... 346 projectprefs = getattr(self.projects, projectcode)
db67b485 » friedelwolff 2007-01-16 Make sure that the local fi... 347 type = getattr(projectprefs, "localfiletype", "po")
348 if not type:
349 type = "po"
350 return type
10273d0e » varsist 2006-10-30 Added new project attribute... 351
352 def setprojectlocalfiletype(self, projectcode, projectfiletype):
353 """sets the allowed file type for the project"""
354 projectprefs = getattr(self.projects, projectcode)
355 setattr(projectprefs, "localfiletype", projectfiletype)
356
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 357 def getprojectcheckerstyle(self, projectcode):
358 """returns the project checker style"""
359 projectprefs = getattr(self.projects, projectcode)
360 return getattr(projectprefs, "checkerstyle", projectcode)
361
362 def setprojectcheckerstyle(self, projectcode, projectcheckerstyle):
363 """sets the project checker style"""
364 projectprefs = getattr(self.projects, projectcode)
365 setattr(projectprefs, "checkerstyle", projectcheckerstyle)
366
367 def getprojectcreatemofiles(self, projectcode):
368 """returns whether the project builds MO files"""
369 projectprefs = getattr(self.projects, projectcode)
370 return getattr(projectprefs, "createmofiles", False)
371
372 def setprojectcreatemofiles(self, projectcode, projectcreatemofiles):
373 """sets whether the project builds MO files"""
374 projectprefs = getattr(self.projects, projectcode)
375 setattr(projectprefs, "createmofiles", projectcreatemofiles)
376
da21d7a3 » davidfraser 2005-06-26 added support for Templates... 377 def hasgnufiles(self, podir, languagecode=None, depth=0, maxdepth=3, poext="po"):
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 378 """returns whether this directory contains gnu-style PO filenames for the given language"""
25467016 » andreaspauley 2007-04-19 Made potree check for 'tree... 379 try:
380 if (podir.startswith(self.podirectory)):
381 def getprojectcode(podir=podir):
382 """Get the projectcode using the supplied podir."""
383 dirs = podir[len(self.podirectory):].split(os.sep)
384 if len(dirs[0]):
385 projectcode = dirs[0]
386 else:
387 projectcode = dirs[1]
388 return projectcode
389 projectprefs = getattr(self.projects, getprojectcode())
390 style = getattr(projectprefs, "treestyle")
391 if style == "gnu" \
392 or style == "nongnu":
393 return style
394 else:
395 print "Unsupported treestyle value (project %s): %s"%(projectcode,style)
396 except:
397 pass
ca2f9a7d » friedelwolff 2006-06-12 Detect gnu style projects d... 398 #Let's check to see if we specifically find the correct gnu file
399 foundgnufile = False
0fe36fd6 » davidfraser 2006-03-10 handle missing project dire... 400 if not os.path.isdir(podir):
401 return False
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 402 fnames = os.listdir(podir)
403 poext = os.extsep + "po"
404 subdirs = []
405 for fn in fnames:
eb22c2b2 » davidfraser 2005-05-12 reverse order of dir / .po ... 406 if os.path.isdir(os.path.join(podir, fn)):
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 407 # if we have a language subdirectory, we're probably not GNU-style
408 if self.languagematch(languagecode, fn):
409 return False
ca2f9a7d » friedelwolff 2006-06-12 Detect gnu style projects d... 410 #ignore hidden directories (like index directories)
411 if fn[0] == '.':
412 continue
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 413 subdirs.append(os.path.join(podir, fn))
eb22c2b2 » davidfraser 2005-05-12 reverse order of dir / .po ... 414 elif fn.endswith(poext):
415 if self.languagematch(languagecode, fn[:-len(poext)]):
ca2f9a7d » friedelwolff 2006-06-12 Detect gnu style projects d... 416 foundgnufile = True
417 elif not self.languagematch(None, fn[:-len(poext)]):
418 return "nongnu"
673f381b » davidfraser 2005-06-15 allow a limit to depth of s... 419 if depth < maxdepth:
420 for subdir in subdirs:
ca2f9a7d » friedelwolff 2006-06-12 Detect gnu style projects d... 421 style = self.hasgnufiles(subdir, languagecode, depth+1, maxdepth)
422 if style == "nongnu":
423 return "nongnu"
424 if style == "gnu":
425 foundgnufile = True
426
427 if foundgnufile:
428 return "gnu"
429 else:
430 return ""
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 431
fdb7fd90 » davidfraser 2005-06-15 added method to work out if... 432 def getcodesfordir(self, dirname):
433 """returns projectcode and languagecode if dirname is a project directory"""
434 canonicalpath = lambda path: os.path.normcase(os.path.normpath(os.path.realpath(os.path.abspath(path))))
435 dirname = canonicalpath(dirname)
436 podirectory = canonicalpath(self.podirectory)
437 if dirname == podirectory:
438 return "*", None
439 for projectcode, projectprefs in self.projects.iteritems():
440 projectdir = canonicalpath(os.path.join(self.podirectory, projectcode))
441 if projectdir == dirname:
442 return projectcode, None
443 for languagecode, languageprefs in self.languages.iteritems():
444 languagedir = canonicalpath(os.path.join(projectdir, languagecode))
445 if not os.path.exists(languagedir):
446 languagedirs = [canonicalpath(languagedir) for languagedir in os.listdir(projectdir) if self.languagematch(languagecode, languagedir)]
447 if dirname in languagedirs:
448 return projectcode, languagecode
449 elif languagedir == dirname:
450 return projectcode, languagecode
451 return None, None
452
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 453 def getpodir(self, languagecode, projectcode):
454 """returns the base directory containing po files for the project"""
455 projectdir = os.path.join(self.podirectory, projectcode)
456 if not os.path.exists(projectdir):
457 raise IndexError("directory not found for project %s" % (projectcode))
458 languagedir = os.path.join(projectdir, languagecode)
459 if not os.path.exists(languagedir):
460 languagedirs = [languagedir for languagedir in os.listdir(projectdir) if self.languagematch(languagecode, languagedir)]
461 if not languagedirs:
462 # if no matching directories can be found, check if it is a GNU-style project
ca2f9a7d » friedelwolff 2006-06-12 Detect gnu style projects d... 463 if self.hasgnufiles(projectdir, languagecode) == "gnu":
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 464 return projectdir
465 raise IndexError("directory not found for language %s, project %s" % (languagecode, projectcode))
466 # TODO: handle multiple regions
467 if len(languagedirs) > 1:
468 raise IndexError("multiple regions defined for language %s, project %s" % (languagecode, projectcode))
469 languagedir = os.path.join(projectdir, languagedirs[0])
470 return languagedir
471
472 def languagematch(self, languagecode, otherlanguagecode):
473 """matches a languagecode to another, ignoring regions in the second"""
8c4346c1 » friedelwolff 2008-07-24 [Contributed by Suresh Chan... 474 return langdata.languagematch(languagecode, otherlanguagecode)
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 475
da21d7a3 » davidfraser 2005-06-26 added support for Templates... 476 def getpofiles(self, languagecode, projectcode, poext="po"):
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 477 """returns a list of po files for the project and language"""
49ca02f8 » winterstream 2008-07-01 Merged in changes from bran... 478 pofilenames = []
479 prefix = os.curdir + os.sep
876b2ee6 » friedelwolff 2007-06-20 Handle the problem of broke... 480
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 481 def addfiles(podir, dirname, fnames):
482 """adds the files to the set of files for this project"""
49ca02f8 » winterstream 2008-07-01 Merged in changes from bran... 483 if dirname == os.curdir:
484 basedirname = ""
485 else:
486 basedirname = dirname.replace(prefix, "", 1)
05cf18b0 » friedelwolff 2007-06-20 Print error on missing file... 487 for fname in fnames:
8cb4cf14 » winterstream 2008-08-21 Fix refreshstats by forcing... 488 # check that it actually exists (to avoid problems with broken symbolic
05cf18b0 » friedelwolff 2007-06-20 Print error on missing file... 489 # links, for example)
49ca02f8 » winterstream 2008-07-01 Merged in changes from bran... 490 fpath = os.path.join(basedirname, fname)
05cf18b0 » friedelwolff 2007-06-20 Print error on missing file... 491 if fname.endswith(os.extsep+poext):
49ca02f8 » winterstream 2008-07-01 Merged in changes from bran... 492 pofilenames.append(fpath)
876b2ee6 » friedelwolff 2007-06-20 Handle the problem of broke... 493
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 494 def addgnufiles(podir, dirname, fnames):
495 """adds the files to the set of files for this project"""
496 basedirname = dirname.replace(podir, "", 1)
497 while basedirname.startswith(os.sep):
498 basedirname = basedirname.replace(os.sep, "", 1)
3ca3f56d » davidfraser 2005-06-28 fixed using same variable n... 499 ext = os.extsep + poext
500 ponames = [fn for fn in fnames if fn.endswith(ext) and self.languagematch(languagecode, fn[:-len(ext)])]
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 501 pofilenames.extend([os.path.join(basedirname, poname) for poname in ponames])
876b2ee6 » friedelwolff 2007-06-20 Handle the problem of broke... 502
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 503 podir = self.getpodir(languagecode, projectcode)
ca2f9a7d » friedelwolff 2006-06-12 Detect gnu style projects d... 504 if self.hasgnufiles(podir, languagecode) == "gnu":
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 505 os.path.walk(podir, addgnufiles, podir)
506 else:
49ca02f8 » winterstream 2008-07-01 Merged in changes from bran... 507 pwd = os.path.abspath(os.curdir)
508 os.chdir(podir)
509 os.path.walk(os.curdir, addfiles, None)
510 os.chdir(pwd)
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 511 return pofilenames
512
37cad147 » friedelwolff 2007-01-26 Get the default project rig... 513 def getdefaultrights(self):
514 """Returns the default rights for a logged in user on this Pootle server."""
515 return getattr(self.instance, "defaultrights", "view, suggest, archive, pocompile")
516
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 517 def refreshstats(self):
518 """manually refreshes (all or missing) the stats files"""
519 for projectcode in self.getprojectcodes():
520 print "Project %s:" % (projectcode)
521 for languagecode in self.getlanguagecodes(projectcode):
522 print "Project %s, Language %s:" % (projectcode, languagecode)
523 translationproject = self.getproject(languagecode, projectcode)
524 translationproject.stats = {}
525 for pofilename in translationproject.pofilenames:
d12c45eb » winterstream 2008-08-26 Change the indexing system ... 526 translationproject.indexer # Force indexing to be initialized
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 527 translationproject.getpostats(pofilename)
528 translationproject.pofiles[pofilename] = pootlefile.pootlefile(translationproject, pofilename)
8cb4cf14 » winterstream 2008-08-21 Fix refreshstats by forcing... 529 translationproject.pofiles[pofilename].statistics.getstats()
ca3d8109 » davidfraser 2005-04-20 moved from translate/pootle... 530 print ".",
531 print
532 self.projectcache = {}
533
c68cff26 » davidfraser 2006-04-28 move DummyPoTree into potre... 534 class DummyPoTree:
535 """A dummy PO tree for testing etc - just treats everything as a single directory"""
536 def __init__(self, podir):
537 self.podirectory = podir
538 def getlanguagename(self, languagecode):
539 return languagecode
540 def getprojectname(self, projectcode):
541 return projectcode
542 def getprojectdescription(self, projectcode):
543 return projectcode
544 def getprojectcheckerstyle(self, projectcode):
545 return ""
546 def getpodir(self, languagecode, projectcode):
547 return self.podirectory
548 def hasgnufiles(self, podir, languagecode):
549 return False
550 def getprojectcreatemofiles(self, projectcode):
551 return False
552 def getpofiles(self, languagecode, projectcode, poext):
553 pofiles = []
554 for dirpath, subdirs, filenames in os.walk(self.podirectory, topdown=False):
555 if dirpath == self.podirectory:
556 subdirpath = ""
557 else:
558 subdirpath = dirpath.replace(self.podirectory+os.path.sep, "", 1)
559 print dirpath, subdirpath, self.podirectory
560 pofiles.extend([os.path.join(subdirpath, name) for name in filenames if name.endswith(poext)])
561 return pofiles
562 def gettemplates(self, projectcode):
563 return []
564 def languagematch(self, languagecode, filename):
565 return True
566