~openerp-chinese-team/openerp-china/openerp-china

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
# -*- coding: utf-8 -*-
# __author__ = jeff@openerp.cn,joshua@openerp.cn
##############################################################################
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Affero General Public License as
#    published by the Free Software Foundation, either version 3 of the
#    License, or (at your option) any later version.
#
#    This program 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 Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

from osv import fields, osv
from reportlab.lib.fontfinder import FontFinder
from reportlab import rl_config
import os
import re

RMLS = ['rml_header','rml_header2','rml_header3']

class oecn_base_fonts_map(osv.osv_memory):
    _name = 'oecn_base_fonts.map'
    def _system_fonts_get(self, cr, uid, context = None):
        ''' get fonts list on server '''
        # consider both windows and unix like systems
        res = []
        env = {
            'windir': os.environ.get('windir', os.getcwd()),
            'home': os.environ.get('HOME', os.getcwd()),
            }
        FontFolders = [
            '%(windir)s/Fonts',
            '/usr/share/fonts',
            '%(home)s/tmp/corefonts',
            ]
        folders = [ s % env for s in FontFolders]
        # get all folders under fonts directory
        ff = FontFinder( useCache = False )
        fontdirs = folders[:]
        for ele in folders:
            for root, dirs, files in os.walk(ele):
                for name in dirs:
                    fontdirs.append(os.path.join(root, name))
        
        ff.addDirectories(set(fontdirs))

        # get fonts name and file path
        # ff.search() may resulting error if any AFMFont resided in
        # the search path has defined width that is not an integer
        # a dirty workaround:
        # replace following code around #110 in reportlab.pdfbase.pdfmetrics
        # From:
        # width = string.atoi(r)
        # To:
        # width = int(float(r))
        ff.search()
        for familyName in ff.getFamilyNames():
            for font in ff.getFontsInFamily(familyName):
                if font.fileName[-4:].lower() in (".ttf", ".ttc"):
                    res.append((font.fileName, font.name))
        return res

    def _pdf_fonts_get(self, cr, uid, context = None):    
        return [('Helvetica','Helvetica'),       \
                ('DejaVuSans','DejaVuSans'),     \
                ('Times','Times'),               \
                ('Times-Roman','Times-Roman'),   \
                ('Courier', 'Courier')]

    _columns = {
        'map_id':fields.many2one('oecn_base_fonts.config','Font Map', required=True),
        'pdf_font':fields.selection(_pdf_fonts_get, 'Original Fonts', required=True),
        'name':fields.char('New Font name', size=20, required=True),
        'new_font':fields.selection(_system_fonts_get, 'Replaced With', required=True),
    }
    _defaults = {
        'name':'SimHei',
   }
    
oecn_base_fonts_map()

class oecn_base_fonts_config(osv.osv_memory):
    _name = 'oecn_base_fonts.config'
    _inherit = 'res.config'

    _columns = {
        'wrap':fields.boolean('CJK wrap', required=True, \
            help="If you are using CJK fonts, check this option will wrap your \
            words properly at the edge of the  pdf report"),
        'map_ids':fields.one2many('oecn_base_fonts.map','map_id','Replace Fonts'),
    }
    _defaults = {
        'wrap': True
    }
    def execute(self, cr, uid, ids, context=None):
        company_obj = self.pool.get('res.company')
        company_ids = company_obj.search(cr, uid, [])
        p = re.compile('<setFont.*(?=size.*)')
        #Replace the font in company rml headrer and footer
        for o in self.browse(cr, uid, ids, context=context):
            config_obj = self.pool.get('ir.config_parameter')
            maps = []
            for map in o.map_ids:
                maps = maps + [(map.pdf_font, map.name ,map.new_font,'all')]
            config_obj.set_param(cr, uid, 'fonts_map', {'wrap':o.wrap,'maps':maps})
            for company in company_obj.read(cr, uid, company_ids, RMLS):
                value = {}
                for rml in RMLS:
                    new_font_rml  = '<setFont name="'+o.map_ids[0].name+'" '
                    value[rml] = p.sub(new_font_rml, company[rml])
                company_obj.write(cr, uid, company['id'], value)   
oecn_base_fonts_config()

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: