Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

#! /usr/bin/env python3 

# -*- coding: utf-8 -*- 

 

#       Copyright 2012-2014, 2017, Marten de Vries 

# 

#       This file is part of OpenTeacher. 

# 

#       OpenTeacher 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 3 of the License, or 

#       (at your option) any later version. 

# 

#       OpenTeacher 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 OpenTeacher.  If not, see <http://www.gnu.org/licenses/>. 

 

import os 

import glob 

 

class RosettaPrioritiesUpdaterModule: 

        def __init__(self, moduleManager, *args, **kwargs): 

                super().__init__(*args, **kwargs) 

                self._mm = moduleManager 

 

                self.type = "rosettaUpdater" 

 

                self.priorities = { 

                        "default": -1, 

                        "update-rosetta": 0, 

                } 

                self.requires = ( 

                        self._mm.mods(type="execute"), 

                ) 

 

        def _getMod(self, template): 

                mapping = {} 

                for mod in self._mm.mods: 

                        modRoot = os.path.dirname(mod.__class__.__file__) 

                        potPathGlob = os.path.join(modRoot, "translations", "*.pot") 

                        potPath = glob.glob(potPathGlob) 

                        if potPath: 

                                potName = os.path.splitext(os.path.basename(potPath[0]))[0].lower() 

                                mapping[potName] = mod 

                                if "_" in potName: 

                                        #second possibility 

                                        mapping[potName.replace("_", "-")] = mod 

 

                return mapping[template] 

 

        def _adjustedPriority(self, mod, priority): 

                if mod in self._mm.mods(type="friendlyTranslationNames"): 

                        #this just needs to be on the top of the list. 

                        priority = 10000 

 

                priorityCorrectionsForKeyword = { 

                        "lesson": 50, 

                        "enterer": 40, 

                        "teacher": 30, 

                        "profiledescription": -40, 

                        "loader": -30, 

                        "saver": -30, 

                        "notecalculator": -70, 

                        "uicontroller": 50, 

                        "mobilegenerator": 15, 

                } 

                for keyword, priorityCorrection in priorityCorrectionsForKeyword.items(): 

                        if keyword in mod.__class__.__file__.lower(): 

                                priority += priorityCorrection 

                return priority 

 

        def _run(self): 

                answer = input("This updates the priorities and template paths of the translations of OpenTeacher on Launchpad. If you're not in the ~openteachermaintainers team, continuing will probably crash or do nothing. Continue? (y/n) ") 

                if answer.lower() not in ("y", "yes", "yep"): 

                        return 

                lp = launchpadlib.launchpad.Launchpad.login_with("OpenTeacher Rosetta priorities updater", "production") 

 

                priorities = [] 

                paths = [] 

 

                for template in lp.projects["openteacher"].translation_focus.getTranslationTemplates(): 

                        if not template.active: 

                                continue 

                        try: 

                                mod = self._getMod(template.name) 

                        except KeyError: 

                                print("Couldn't find a module for: %s" % template.name) 

                                continue 

 

                        #gather priorities 

                        priority = self._modPriority(mod) 

                        priority = self._adjustedPriority(mod, priority) 

 

                        priorities.append((priority, template)) 

 

                        #gather template paths 

                        potPathGlob = os.path.join(os.path.dirname(mod.__class__.__file__), "translations/*.pot") 

                        relPotPathGlob = os.path.relpath(potPathGlob, os.path.join(self._mm.modulesPath, "..")) 

                        templatePath = glob.glob(relPotPathGlob)[0] 

                        paths.append((templatePath, template)) 

 

                self._savePriorities(sorted(priorities, key=lambda p: p[0])) 

                self._savePaths(sorted(paths, key=lambda p: p[0])) 

 

        def _savePriorities(self, priorities): 

                for priority, template in priorities: 

                        print("Setting %s priority to %s" % (template.name, priority)) 

                        template.priority = priority 

                        template.lp_save() 

 

        def _savePaths(self, paths): 

                for path, template in paths: 

                        print("Setting %s path to %s" % (template.name, path)) 

                        template.path = path 

                        template.lp_save() 

 

        def _calculateModPriority(self, mod): 

                #start priority 

                priority = 1 

                #add the priorities of all mods depending on this one 

                for otherMod in self._mm.mods: 

                        if mod == otherMod: 

                                continue 

                        priority += self._requirementsPriority(mod, otherMod, getattr(otherMod,  "requires", [])) 

                        usesPriority = self._requirementsPriority(mod, otherMod, getattr(otherMod, "uses", [])) 

                        priority += int(round(0.75 * usesPriority)) 

                return priority 

 

        def _requirementsPriority(self, mod, otherMod, requirements): 

                priority = 0 

                for selector in requirements: 

                        if mod in selector: 

                                priority += self._modPriority(otherMod) 

                return priority 

 

        def _modPriority(self, mod, cache={}): 

                #caching to speed things up a bit. It's needed. 

                if mod not in cache: 

                        cache[mod] = self._calculateModPriority(mod) 

                return cache[mod] 

 

        def enable(self): 

                self._modules = next(iter(self._mm.mods(type="modules"))) 

 

                global launchpadlib 

                try: 

                        import launchpadlib.launchpad 

                except ImportError: 

                        #remain inactive 

                        return 

 

                self._modules.default("active", type="execute").startRunning.handle(self._run) 

 

                self.active = True 

 

        def disable(self): 

                self.active = False 

 

                self._modules.default("active", type="execute").startRunning.unhandle(self._run) 

                del self._modules 

 

def init(moduleManager): 

        return RosettaPrioritiesUpdaterModule(moduleManager)