Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Pootle-1.2.1/Pootle/adminpages.py
diff options
context:
space:
mode:
Diffstat (limited to 'Pootle-1.2.1/Pootle/adminpages.py')
-rw-r--r--Pootle-1.2.1/Pootle/adminpages.py429
1 files changed, 429 insertions, 0 deletions
diff --git a/Pootle-1.2.1/Pootle/adminpages.py b/Pootle-1.2.1/Pootle/adminpages.py
new file mode 100644
index 0000000..e0172c4
--- /dev/null
+++ b/Pootle-1.2.1/Pootle/adminpages.py
@@ -0,0 +1,429 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2006 Zuza Software Foundation
+#
+# This file is part of translate.
+#
+# translate is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# translate is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with translate; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+from Pootle import pagelayout
+from Pootle import projects
+from translate.filters import checks
+
+import locale
+
+class AdminPage(pagelayout.PootlePage):
+ """page for administering pootle..."""
+ def __init__(self, potree, session, instance):
+ self.potree = potree
+ self.session = session
+ self.instance = instance
+ self.localize = session.localize
+ templatename = "adminindex"
+ sessionvars = {"status": self.session.status, "isopen": self.session.isopen, "issiteadmin": self.session.issiteadmin()}
+ instancetitle = getattr(self.instance, "title", session.localize("Pootle Demo"))
+ text = self.gettext(session)
+ templatevars = {"options": self.getoptions(), "session": sessionvars, "instancetitle": instancetitle, "text": text}
+ pagelayout.PootlePage.__init__(self, templatename, templatevars, session)
+
+ def gettext(self, session):
+ """Localize the text"""
+ text = {}
+ text["home"] = session.localize("Home")
+ text["users"] = session.localize("Users")
+ text["languages"] = session.localize("Languages")
+ text["projects"] = session.localize("Projects")
+ text["generaloptions"] = session.localize("General options")
+ text["option"] = session.localize("Option")
+ text["currentvalue"] = session.localize("Current value")
+ text["savechanges"] = session.localize("Save changes")
+ return text
+
+ def getoptions(self):
+ optiontitles = {"title": self.localize("Title"),
+ "description": self.localize("Description"),
+ "baseurl": self.localize("Base URL"),
+ "homepage": self.localize("Home Page")}
+ options = []
+ for optionname, optiontitle in optiontitles.items():
+ optionvalue = getattr(self.instance, optionname, "")
+ option = {"name": "option-%s" % optionname, "title": optiontitle, "value": optionvalue}
+ options.append(option)
+ return options
+
+class LanguagesAdminPage(pagelayout.PootlePage):
+ """page for administering pootle..."""
+ def __init__(self, potree, session, instance):
+ self.potree = potree
+ self.session = session
+ self.instance = instance
+ self.localize = session.localize
+ templatename = "adminlanguages"
+ sessionvars = {"status": self.session.status, "isopen": self.session.isopen, "issiteadmin": self.session.issiteadmin()}
+ instancetitle = getattr(self.instance, "title", session.localize("Pootle Demo"))
+ pagetitle = self.localize("Pootle Languages Admin Page")
+ text = self.gettext(session)
+ templatevars = {"pagetitle": pagetitle, "languages": self.getlanguagesoptions(), "options": self.getoptions(), "session": sessionvars, "instancetitle": instancetitle, "text": text}
+ pagelayout.PootlePage.__init__(self, templatename, templatevars, session)
+
+ def gettext(self, session):
+ """Localize the text"""
+ text = {}
+ text["home"] = session.localize("Home")
+ text["admin"] = session.localize("Main admin page")
+ text["languages"] = session.localize("Languages")
+ text["savechanges"] = session.localize("Save changes")
+ return text
+
+ def getoptions(self):
+ options = [{"name": "code", "title": self.localize("ISO Code"), "size": 6, "newvalue": ""},
+ {"name": "name", "title": self.localize("Full Name"),
+ "newvalue": self.localize("(add language here)")},
+ {"name": "specialchars", "title": self.localize("Special Chars"), "newvalue": self.localize("(special characters)")},
+ {"name": "nplurals", "title": self.localize("Number of Plurals"), "newvalue": self.localize("(number of plurals)")},
+ {"name": "pluralequation", "title": self.localize("Plural Equation"), "newvalue": self.localize("(plural equation)")},
+ {"name": "remove", "title": self.localize("Remove Language")}]
+ for option in options:
+ if "newvalue" in option:
+ option["newname"] = "newlanguage" + option["name"]
+ return options
+
+ def getlanguagesoptions(self):
+ languages = []
+ for languagecode, languagename in self.potree.getlanguages():
+ languagespecialchars = self.potree.getlanguagespecialchars(languagecode)
+ languagenplurals = self.potree.getlanguagenplurals(languagecode)
+ languagepluralequation = self.potree.getlanguagepluralequation(languagecode)
+ languageremove = None
+ # TODO: make label work like this
+ # l10n: The parameter is a languagecode, projectcode or username
+ removelabel = self.localize("Remove %s", languagecode)
+ languageoptions = [{"name": "languagename-%s" % languagecode, "value": languagename, "type": "text"},
+ {"name": "languagespecialchars-%s" % languagecode, "value": languagespecialchars, "type": "text"},
+ {"name": "languagenplurals-%s" % languagecode, "value": languagenplurals, "type": "text"},
+ {"name": "languagepluralequation-%s" % languagecode, "value": languagepluralequation, "type": "text"},
+ {"name": "languageremove-%s" % languagecode, "value": languageremove, "type": "checkbox", "label": removelabel}]
+ languages.append({"code": languagecode, "options": languageoptions})
+ return languages
+
+class ProjectsAdminPage(pagelayout.PootlePage):
+ """page for administering pootle..."""
+ def __init__(self, potree, session, instance):
+ self.potree = potree
+ self.session = session
+ self.instance = instance
+ self.localize = session.localize
+ templatename = "adminprojects"
+ projectfiletypes = ["po","xlf"]
+ self.allchecks = [{"value": check, "description": check} for check in checks.projectcheckers.keys()]
+ self.allchecks.insert(0, {"value": "", "description": self.localize("Standard")})
+ self.alltypes = [{"value": check, "description": check} for check in projectfiletypes]
+ sessionvars = {"status": self.session.status, "isopen": self.session.isopen, "issiteadmin": self.session.issiteadmin()}
+ instancetitle = getattr(self.instance, "title", session.localize("Pootle Demo"))
+ pagetitle = self.localize("Pootle Projects Admin Page")
+ text = self.gettext(session)
+ templatevars = {"pagetitle": pagetitle, "projects": self.getprojectsoptions(), "options": self.getoptions(), "session": sessionvars, "instancetitle": instancetitle, "text": text}
+ pagelayout.PootlePage.__init__(self, templatename, templatevars, session)
+
+ def gettext(self, session):
+ """Localize the text"""
+ text = {}
+ text["home"] = session.localize("Home")
+ text["admin"] = session.localize("Main admin page")
+ text["projects"] = session.localize("Projects")
+ text["savechanges"] = session.localize("Save changes")
+ return text
+
+ def getoptions(self):
+ options = [{"name": "code", "title": self.localize("Project Code"), "size": 6, "newvalue": ""},
+ {"name": "name", "title": self.localize("Full Name"),
+ "newvalue": self.localize("(add project here)")},
+ {"name": "description", "title": self.localize("Project Description"), "newvalue": self.localize("(project description)")},
+ {"name": "checkerstyle", "title": self.localize("Checker Style"), "selectoptions": self.allchecks, "newvalue": ""},
+ {"name": "filetype", "title": self.localize("File Type"), "selectoptions": self.alltypes, "newvalue": ""},
+ {"name": "createmofiles", "title": self.localize("Create MO Files"), "type": "checkbox", "newvalue": ""},
+ {"name": "remove", "title": self.localize("Remove Project")}]
+ for option in options:
+ if "newvalue" in option:
+ option["newname"] = "newproject" + option["name"]
+ if "type" not in option and "selectoptions" not in option:
+ option["type"] = "text"
+ return options
+
+ def getprojectsoptions(self):
+ projects = []
+ for projectcode in self.potree.getprojectcodes():
+ projectadminlink = "../projects/%s/admin.html" % projectcode
+ projectname = self.potree.getprojectname(projectcode)
+ projectdescription = self.potree.getprojectdescription(projectcode)
+ projectname = self.potree.getprojectname(projectcode)
+ projectcheckerstyle = self.potree.getprojectcheckerstyle(projectcode)
+ projectfiletype = self.potree.getprojectlocalfiletype(projectcode)
+ if self.potree.getprojectcreatemofiles(projectcode):
+ projectcreatemofiles = "checked"
+ else:
+ projectcreatemofiles = ""
+ projectremove = None
+ # l10n: The parameter is a languagecode, projectcode or username
+ removelabel = self.localize("Remove %s", projectcode)
+ projectoptions = [{"name": "projectname-%s" % projectcode, "value": projectname, "type": "text"},
+ {"name": "projectdescription-%s" % projectcode, "value": projectdescription, "type": "text"},
+ {"name": "projectcheckerstyle-%s" % projectcode, "value": projectcheckerstyle, "selectoptions": self.allchecks},
+ {"name": "projectfiletype-%s" % projectcode, "value": projectfiletype, "selectoptions": self.alltypes},
+ {"name": "projectcreatemofiles-%s" % projectcode, "value": projectcreatemofiles, "type": "checkbox", projectcreatemofiles: projectcreatemofiles},
+ {"name": "projectremove-%s" % projectcode, "value": projectremove, "type": "checkbox", "label": removelabel}]
+ projects.append({"code": projectcode, "adminlink": projectadminlink, "options": projectoptions})
+ return projects
+
+class UsersAdminPage(pagelayout.PootlePage):
+ """page for administering pootle..."""
+ def __init__(self, server, users, session, instance):
+ self.server = server
+ self.users = users
+ self.session = session
+ self.instance = instance
+ self.localize = session.localize
+ templatename = "adminusers"
+ sessionvars = {"status": self.session.status, "isopen": self.session.isopen, "issiteadmin": self.session.issiteadmin()}
+ instancetitle = getattr(self.instance, "title", session.localize("Pootle Demo"))
+ pagetitle = self.localize("Pootle User Admin Page")
+ text = self.gettext(session)
+ templatevars = {"pagetitle": pagetitle, "users": self.getusersoptions(), "options": self.getoptions(), "session": sessionvars, "instancetitle": instancetitle, "text": text}
+ pagelayout.PootlePage.__init__(self, templatename, templatevars, session)
+
+ def gettext(self, session):
+ """Localize the text"""
+ text = {}
+ text["home"] = session.localize("Home")
+ text["admin"] = session.localize("Main admin page")
+ text["users"] = session.localize("Users")
+ text["savechanges"] = session.localize("Save changes")
+ return text
+
+ def getoptions(self):
+ options = [{"name": "name", "title": self.localize("Username"), "newvalue": "", "size": 6},
+ {"name": "fullname", "title": self.localize("Full Name"),
+ "newvalue": self.localize("(add full name here)")},
+ {"name": "email", "title": self.localize("Email Address"), "newvalue": self.localize("(add email here)")},
+ {"name": "password", "title": self.localize("Password"), "newvalue": self.localize("(add password here)")},
+ {"name": "activated", "title": self.localize("Activated"), "type": "checkbox", "checked": "true", "newvalue": "", "label": self.localize("Activate New User")},
+ {"name": "remove", "title": self.localize("Remove User"), "type": "checkbox"}]
+ for option in options:
+ if "newvalue" in option:
+ # TODO: rationalize this in the form processing
+ if option["name"] == "activated":
+ option["newname"] = "newuseractivate"
+ else:
+ option["newname"] = "newuser" + option["name"]
+ return options
+
+ def getusersoptions(self):
+ users = []
+ for usercode, usernode in self.users.iteritems(sorted=True):
+ fullname = getattr(usernode, "name", "")
+ email = getattr(usernode, "email", "")
+ activated = getattr(usernode, "activated", 0) == 1
+ if activated:
+ activatedattr = "checked"
+ else:
+ activatedattr = ""
+ userremove = None
+ # l10n: The parameter is a languagecode, projectcode or username
+ removelabel = self.localize("Remove %s", usercode)
+ useroptions = [{"name": "username-%s" % usercode, "value": fullname, "type": "text"},
+ {"name": "useremail-%s" % usercode, "value": email, "type": "text"},
+ {"name": "userpassword-%s" % usercode, "value": None, "type": "text"},
+ {"name": "useractivated-%s" % usercode, "type": "checkbox", activatedattr: activatedattr},
+ {"name": "userremove-%s" % usercode, "value": None, "type": "checkbox", "label": removelabel}]
+ users.append({"code": usercode, "options": useroptions})
+ return users
+
+class ProjectAdminPage(pagelayout.PootlePage):
+ """list of languages belonging to a project"""
+ def __init__(self, potree, projectcode, session, argdict):
+ self.potree = potree
+ self.projectcode = projectcode
+ self.session = session
+ self.localize = session.localize
+ self.tr_lang = session.tr_lang
+ projectname = self.potree.getprojectname(self.projectcode)
+ if self.session.issiteadmin():
+ if "doaddlanguage" in argdict:
+ newlanguage = argdict.get("newlanguage", None)
+ if not newlanguage:
+ raise ValueError("You must select a new language")
+ self.potree.addtranslationproject(newlanguage, self.projectcode)
+ if "doupdatelanguage" in argdict:
+ languagecodes = argdict.get("updatelanguage", None)
+ if not languagecodes:
+ raise ValueError("No languagecode given in doupdatelanguage")
+ if isinstance(languagecodes, (str, unicode)):
+ languagecodes = [languagecodes]
+ for languagecode in languagecodes:
+ translationproject = self.potree.getproject(languagecode, self.projectcode)
+ translationproject.converttemplates(self.session)
+ main_link = self.localize("Back to main page")
+ existing_title = self.localize("Existing languages")
+ existing_languages = self.getexistinglanguages()
+ new_languages = self.getnewlanguages()
+ # l10n: This refers to updating the translation files from the templates like with .pot files
+ update_button = self.localize("Update Languages")
+ pagetitle = self.localize("Pootle Admin: %s", projectname)
+ norights_text = self.localize("You do not have the rights to administer this project.")
+ iso_code = self.localize("ISO Code")
+ full_name = self.localize("Full Name")
+ # l10n: This refers to updating the translation files from the templates like with .pot files
+ update_link = self.localize("Update from templates")
+ templatename = "projectadmin"
+ sessionvars = {"status": self.session.status, "isopen": self.session.isopen, "issiteadmin": self.session.issiteadmin()}
+ instancetitle = getattr(self.session.instance, "title", session.localize("Pootle Demo"))
+ templatevars = {"pagetitle": pagetitle, "norights_text": norights_text,
+ "project": {"code": projectcode, "name": projectname},
+ "iso_code": iso_code, "full_name": full_name,
+ "existing_title": existing_title, "existing_languages": existing_languages,
+ "new_languages": new_languages,
+ "update_button": update_button, "add_button": self.localize("Add Language"),
+ "main_link": main_link, "update_link": update_link,
+ "session": sessionvars, "instancetitle": instancetitle}
+ pagelayout.PootlePage.__init__(self, templatename, templatevars, session, bannerheight=80)
+
+ def getexistinglanguages(self):
+ """gets the info on existing languages"""
+ languages = self.potree.getlanguages(self.projectcode)
+ languageitems = [{"code": languagecode, "name": self.tr_lang(languagename)} for languagecode, languagename in languages]
+ # rewritten for compatibility with Python 2.3
+ # languageitems.sort(cmp=locale.strcoll, key=lambda dict: dict["name"])
+ languageitems.sort(lambda x,y: locale.strcoll(x["name"], y["name"]))
+ for n, item in enumerate(languageitems):
+ item["parity"] = ["even", "odd"][n % 2]
+ return languageitems
+
+ def getnewlanguages(self):
+ """returns a box that lets the user add new languages"""
+ existingcodes = self.potree.getlanguagecodes(self.projectcode)
+ allcodes = self.potree.getlanguagecodes()
+ newcodes = [code for code in allcodes if not (code in existingcodes or code == "templates")]
+ newoptions = [(self.potree.getlanguagename(code), code) for code in newcodes]
+ newoptions.sort()
+ newoptions = [{"code": code, "name": self.tr_lang(languagename)} for (languagename, code) in newoptions]
+ # rewritten for compatibility with Python 2.3
+ # newoptions.sort(cmp=locale.strcoll, key=lambda dict: dict["name"])
+ newoptions.sort(lambda x,y: locale.strcoll(x["name"], y["name"]))
+ return newoptions
+
+class TranslationProjectAdminPage(pagelayout.PootlePage):
+ """admin page for a translation project (project+language)"""
+ def __init__(self, potree, project, session, argdict):
+ self.potree = potree
+ self.project = project
+ self.session = session
+ self.localize = session.localize
+ self.rightnames = self.project.getrightnames(session)
+ # l10n: This is the page title. The first parameter is the language name, the second parameter is the project name
+ pagetitle = self.localize("Pootle Admin: %s %s", self.project.languagename, self.project.projectname)
+ main_link = self.localize("Project home page")
+ if "admin" in self.project.getrights(self.session):
+ if "doupdaterights" in argdict:
+ for key, value in argdict.iteritems():
+ if isinstance(key, str):
+ key = key.decode("utf-8")
+ if key.startswith("rights-"):
+ username = key.replace("rights-", "", 1)
+ self.project.setrights(username, value)
+ if key.startswith("rightsremove-"):
+ username = key.replace("rightsremove-", "", 1)
+ self.project.delrights(self.session, username)
+ username = argdict.get("rightsnew-username", None)
+ if username:
+ username = username.strip()
+ if self.session.loginchecker.userexists(username):
+ self.project.setrights(username, argdict.get("rightsnew", ""))
+ else:
+ raise IndexError(self.localize("Cannot set rights for username %s - user does not exist", username))
+ norights_text = self.localize("You do not have the rights to administer this project.")
+ templatename = "projectlangadmin"
+ sessionvars = {"status": self.session.status, "isopen": self.session.isopen, "issiteadmin": self.session.issiteadmin()}
+ instancetitle = getattr(self.session.instance, "title", session.localize("Pootle Demo"))
+ templatevars = {"pagetitle": pagetitle, "norights_text": norights_text,
+ "project": {"code": self.project.projectcode, "name": self.project.projectname},
+ "language": {"code": self.project.languagecode, "name": self.project.languagename},
+ "main_link": main_link,
+ "session": sessionvars, "instancetitle": instancetitle}
+ templatevars.update(self.getoptions())
+ pagelayout.PootlePage.__init__(self, templatename, templatevars, session, bannerheight=80)
+
+ def getoptions(self):
+ """returns a box that describes the options"""
+ self.project.readprefs()
+ if self.project.filestyle == "gnu":
+ filestyle_text = self.localize("This is a GNU-style project (one directory, files named per language).")
+ else:
+ filestyle_text = self.localize("This is a standard style project (one directory per language).")
+ permissions_title = self.localize("User Permissions")
+ username_title = self.localize("Username")
+ adduser_text = self.localize("(select to add user)")
+ rights_title = self.localize("Rights")
+ remove_title = self.localize("Remove")
+ nobodyrights = self.project.getrights(username=None)
+ nobody_dict = self.getuserdict("nobody", delete=False)
+ defaultrights = self.project.getrights(username="default")
+ default_dict = self.getuserdict("default", delete=False)
+ users_with_rights = ["nobody", "default"]
+ rights = {"nobody": nobodyrights, "default": defaultrights}
+ for username in self.project.getuserswithrights():
+ if username in ("nobody", "default"): continue
+ users_with_rights.append(username)
+ rights[username] = self.project.getrights(username=username)
+ users = self.project.getuserswithinterest(self.session)
+ user_details = {"nobody": nobody_dict, "default": default_dict}
+ for username, usernode in users.iteritems():
+ if not isinstance(username, unicode):
+ username = username.decode("utf-8")
+ user_dict = self.getuserdict(username, usernode=usernode)
+ user_details[username] = user_dict
+ # We need to make sure that users_with_rights are also in user_details,
+ # since they might not be there yet or anymore
+ for username in users_with_rights:
+ if username in user_details:
+ continue
+ user_dict = self.getuserdict(username, usernode=None)
+ user_details[username] = user_dict
+ users_without_rights = [username for username in user_details if username not in users_with_rights]
+ newuser_dict = self.getuserdict(None, delete=False)
+ updaterights_text = self.localize("Update Rights")
+ return {"filestyle_text": filestyle_text,
+ "permissions_title": permissions_title,
+ "username_title": username_title,
+ "rights_title": rights_title,
+ "remove_title": remove_title,
+ "users_with_rights": users_with_rights,
+ "users_without_rights": users_without_rights,
+ "user_details": user_details,
+ "rights": rights,
+ "newuser": newuser_dict,
+ "updaterights_text": updaterights_text,
+ "rightnames": self.rightnames,
+ "adduser_text": adduser_text,
+ }
+
+ def getuserdict(self, username, delete=True, usernode=None):
+ """gets a dictionary for the given user given user's rights"""
+ # l10n: The parameter is a languagecode, projectcode or username
+ remove_text = self.localize("Remove %s", username)
+ description = getattr(usernode, "description", None) or username
+ userdict = {"username": username, "delete": delete or None, "remove_text": remove_text, "description": description}
+ return userdict
+