julen / pootle
- Source
- Commits
- Network (0)
- Issues (0)
- Downloads (0)
- Wiki (1)
- Graphs
-
Tree:
36bb346
winterstream (author)
Wed Oct 22 08:22:29 -0700 2008
pootle / potree.py
| ca3d8109 » | davidfraser | 2005-04-20 | 1 | #!/usr/bin/env python | |
| a953d6ab » | davidfraser | 2005-07-01 | 2 | # -*- coding: utf-8 -*- | |
| 8cb4cf14 » | winterstream | 2008-08-21 | 3 | # | |
| d8ec3e47 » | dwaynebailey | 2006-06-15 | 4 | # Copyright 2004-2006 Zuza Software Foundation | |
| 8cb4cf14 » | winterstream | 2008-08-21 | 5 | # | |
| d8ec3e47 » | dwaynebailey | 2006-06-15 | 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 | 12 | # | |
| d8ec3e47 » | dwaynebailey | 2006-06-15 | 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 | 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 | 26 | from Pootle import pagelayout | |
| b00bca80 » | davidfraser | 2006-04-26 | 27 | from translate.misc import autoencode | |
| 8c4346c1 » | friedelwolff | 2008-07-24 | 28 | from translate.lang import data as langdata | |
| ca3d8109 » | davidfraser | 2005-04-20 | 29 | ||
| 8c4346c1 » | friedelwolff | 2008-07-24 | 30 | import os | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 36 | if not self.haslanguage("templates"): | |
| 37 | setattr(self.languages, "templates.fullname", "Templates") | ||||
| 38 | self.saveprefs() | ||||
| ca3d8109 » | davidfraser | 2005-04-20 | 39 | self.projects = instance.projects | |
| 40 | self.podirectory = instance.podirectory | ||||
| 37cad147 » | friedelwolff | 2007-01-26 | 41 | self.instance = instance | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 86 | languagecode = pagelayout.localelanguage(languagecode) | |
| 1d7d9d4c » | friedelwolff | 2006-03-24 | 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 | 91 | languagecode, countrycode = languagecode.split("_") | |
| 92 | countrycode = countrycode.upper() | ||||
| 93 | languagecode = "%s_%s" % (languagecode, countrycode) | ||||
| 8cb4cf14 » | winterstream | 2008-08-21 | 94 | else: | |
| 1d7d9d4c » | friedelwolff | 2006-03-24 | 95 | raise ValueError("Language code must be alphabetic") | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 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 | 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 | 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 | 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 | 168 | projecttype = argdict.get("newprojectfiletype", "") | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 173 | setattr(self.projects, projectcode + ".localfiletype", projecttype) | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 200 | return autoencode.autoencode(getattr(self.getlanguageprefs(languagecode), "specialchars", ""), "utf-8") | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 226 | languagecodes = alllanguagecodes | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 232 | languagecodes = [languagecode for languagecode in alllanguagecodes if self.hasproject(languagecode, projectcode)] | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 239 | if potentialcode in alllanguagecodes: | |
| 240 | languagecodes.append(potentialcode) | ||||
| 241 | continue | ||||
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 248 | languagecodes.sort() | |
| 249 | return languagecodes | ||||
| ca3d8109 » | davidfraser | 2005-04-20 | 250 | ||
| 938ae0cd » | davidfraser | 2005-06-13 | 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 | 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 | 289 | templatesdir = os.path.join(projectdir, "pot") | |
| 290 | if not os.path.exists(templatesdir): | ||||
| 291 | templatesdir = projectdir | ||||
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 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 | 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 | 343 | def getprojectlocalfiletype(self, projectcode): | |
| db67b485 » | friedelwolff | 2007-01-16 | 344 | """returns the project allowed file type. We assume it is .po if nothing | |
| 345 | else is specified.""" | ||||
| 10273d0e » | varsist | 2006-10-30 | 346 | projectprefs = getattr(self.projects, projectcode) | |
| db67b485 » | friedelwolff | 2007-01-16 | 347 | type = getattr(projectprefs, "localfiletype", "po") | |
| 348 | if not type: | ||||
| 349 | type = "po" | ||||
| 350 | return type | ||||
| 10273d0e » | varsist | 2006-10-30 | 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 | 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 | 377 | def hasgnufiles(self, podir, languagecode=None, depth=0, maxdepth=3, poext="po"): | |
| ca3d8109 » | davidfraser | 2005-04-20 | 378 | """returns whether this directory contains gnu-style PO filenames for the given language""" | |
| 25467016 » | andreaspauley | 2007-04-19 | 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 | 398 | #Let's check to see if we specifically find the correct gnu file | |
| 399 | foundgnufile = False | ||||
| 0fe36fd6 » | davidfraser | 2006-03-10 | 400 | if not os.path.isdir(podir): | |
| 401 | return False | ||||
| ca3d8109 » | davidfraser | 2005-04-20 | 402 | fnames = os.listdir(podir) | |
| 403 | poext = os.extsep + "po" | ||||
| 404 | subdirs = [] | ||||
| 405 | for fn in fnames: | ||||
| eb22c2b2 » | davidfraser | 2005-05-12 | 406 | if os.path.isdir(os.path.join(podir, fn)): | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 410 | #ignore hidden directories (like index directories) | |
| 411 | if fn[0] == '.': | ||||
| 412 | continue | ||||
| ca3d8109 » | davidfraser | 2005-04-20 | 413 | subdirs.append(os.path.join(podir, fn)) | |
| eb22c2b2 » | davidfraser | 2005-05-12 | 414 | elif fn.endswith(poext): | |
| 415 | if self.languagematch(languagecode, fn[:-len(poext)]): | ||||
| ca2f9a7d » | friedelwolff | 2006-06-12 | 416 | foundgnufile = True | |
| 417 | elif not self.languagematch(None, fn[:-len(poext)]): | ||||
| 418 | return "nongnu" | ||||
| 673f381b » | davidfraser | 2005-06-15 | 419 | if depth < maxdepth: | |
| 420 | for subdir in subdirs: | ||||
| ca2f9a7d » | friedelwolff | 2006-06-12 | 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 | 431 | ||
| fdb7fd90 » | davidfraser | 2005-06-15 | 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 | 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 | 463 | if self.hasgnufiles(projectdir, languagecode) == "gnu": | |
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 474 | return langdata.languagematch(languagecode, otherlanguagecode) | |
| ca3d8109 » | davidfraser | 2005-04-20 | 475 | ||
| da21d7a3 » | davidfraser | 2005-06-26 | 476 | def getpofiles(self, languagecode, projectcode, poext="po"): | |
| ca3d8109 » | davidfraser | 2005-04-20 | 477 | """returns a list of po files for the project and language""" | |
| 49ca02f8 » | winterstream | 2008-07-01 | 478 | pofilenames = [] | |
| 479 | prefix = os.curdir + os.sep | ||||
| 876b2ee6 » | friedelwolff | 2007-06-20 | 480 | ||
| ca3d8109 » | davidfraser | 2005-04-20 | 481 | def addfiles(podir, dirname, fnames): | |
| 482 | """adds the files to the set of files for this project""" | ||||
| 49ca02f8 » | winterstream | 2008-07-01 | 483 | if dirname == os.curdir: | |
| 484 | basedirname = "" | ||||
| 485 | else: | ||||
| 486 | basedirname = dirname.replace(prefix, "", 1) | ||||
| 05cf18b0 » | friedelwolff | 2007-06-20 | 487 | for fname in fnames: | |
| 8cb4cf14 » | winterstream | 2008-08-21 | 488 | # check that it actually exists (to avoid problems with broken symbolic | |
| 05cf18b0 » | friedelwolff | 2007-06-20 | 489 | # links, for example) | |
| 49ca02f8 » | winterstream | 2008-07-01 | 490 | fpath = os.path.join(basedirname, fname) | |
| 05cf18b0 » | friedelwolff | 2007-06-20 | 491 | if fname.endswith(os.extsep+poext): | |
| 49ca02f8 » | winterstream | 2008-07-01 | 492 | pofilenames.append(fpath) | |
| 876b2ee6 » | friedelwolff | 2007-06-20 | 493 | ||
| ca3d8109 » | davidfraser | 2005-04-20 | 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 | 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 | 501 | pofilenames.extend([os.path.join(basedirname, poname) for poname in ponames]) | |
| 876b2ee6 » | friedelwolff | 2007-06-20 | 502 | ||
| ca3d8109 » | davidfraser | 2005-04-20 | 503 | podir = self.getpodir(languagecode, projectcode) | |
| ca2f9a7d » | friedelwolff | 2006-06-12 | 504 | if self.hasgnufiles(podir, languagecode) == "gnu": | |
| ca3d8109 » | davidfraser | 2005-04-20 | 505 | os.path.walk(podir, addgnufiles, podir) | |
| 506 | else: | ||||
| 49ca02f8 » | winterstream | 2008-07-01 | 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 | 511 | return pofilenames | |
| 512 | |||||
| 37cad147 » | friedelwolff | 2007-01-26 | 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 | 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 | 526 | translationproject.indexer # Force indexing to be initialized | |
| ca3d8109 » | davidfraser | 2005-04-20 | 527 | translationproject.getpostats(pofilename) | |
| 528 | translationproject.pofiles[pofilename] = pootlefile.pootlefile(translationproject, pofilename) | ||||
| 8cb4cf14 » | winterstream | 2008-08-21 | 529 | translationproject.pofiles[pofilename].statistics.getstats() | |
| ca3d8109 » | davidfraser | 2005-04-20 | 530 | print ".", | |
| 531 | |||||
| 532 | self.projectcache = {} | ||||
| 533 | |||||
| c68cff26 » | davidfraser | 2006-04-28 | 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 | |||||
