userfield.py
Go to the documentation of this file.
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (C) 2006-2009 Søren Roug, European Environment Agency
#
# This is free software. You may redistribute it under the terms
# of the Apache license and the GNU General Public License Version
# 2 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Contributor(s): Michael Howitz, gocept gmbh & co. kg
#
# $Id: userfield.py 447 2008-07-10 20:01:30Z roug $
##
# Class to show and manipulate user fields in odf documents.
import sys
import zipfile
from odf.text import UserFieldDecl
from odf.namespaces import OFFICENS
from odf.opendocument import load
import io, sys
if sys.version_info[0]==3:
unicode=str
OUTENCODING = "utf-8"
# OpenDocument v.1.0 section 6.7.1
VALUE_TYPES = {
u'float': (OFFICENS, u'value'),
u'percentage': (OFFICENS, u'value'),
u'currency': (OFFICENS, u'value'),
u'date': (OFFICENS, u'date-value'),
u'time': (OFFICENS, u'time-value'),
u'boolean': (OFFICENS, u'boolean-value'),
u'string': (OFFICENS, u'string-value'),
}
##
# List, view and manipulate user fields.
class UserFields(object):
# these attributes can be a filename or a file like object
src_file = None
dest_file = None
##
# Constructor
#
# @param src open file in binary mode: source document,
# or filename as a unicode string, or None for stdin.
# @param dest opendile in binary mode: destination document,
# or filename as a unicode string, or None for stdout.
#
def __init__(self, src=None, dest=None):
assert(src==None or 'rb' in repr(src) or 'BufferedReader' in repr(src) or 'BytesIO' in repr(src) or type(src)==type(u""))
assert(dest==None or 'wb' in repr(dest) or 'BufferedWriter' in repr(dest) or 'BytesIO' in repr(dest) or type(dest)==type(u""))
self.src_file = src
self.dest_file = dest
self.document = None
def loaddoc(self):
if (sys.version_info[0]==3 and (isinstance(self.src_file, str) or (isinstance(self.src_file, io.IOBase)))) or (sys.version_info[0]==2 and isinstance(self.src_file, basestring)):
# src_file is a filename, check if it is a zip-file
if not zipfile.is_zipfile(self.src_file):
raise TypeError(u"%s is no odt file." % self.src_file)
elif self.src_file is None:
# use stdin if no file given
self.src_file = sys.stdin
self.document = load(self.src_file)
def savedoc(self):
# write output
if self.dest_file is None:
# use stdout if no filename given
self.document.save(u'-')
else:
self.document.save(self.dest_file)
##
# List (extract) all known user-fields.
#
# @return list of user-field names as unicode strings.
#
def list_fields(self):
return [x[0] for x in self.list_fields_and_values()]
##
# List (extract) user-fields with type and value.
#
# @param field_names list of field names as unicode strings
# to show, or None for all.
#
# @return list of tuples (<field name>, <field type>, <value>)
# as type (unicode string, stringified type, unicode string).
#
#
def list_fields_and_values(self, field_names=None):
self.loaddoc()
found_fields = []
all_fields = self.document.getElementsByType(UserFieldDecl)
for f in all_fields:
value_type = f.getAttribute(u'valuetype')
if value_type == u'string':
value = f.getAttribute(u'stringvalue')
else:
value = f.getAttribute(u'value')
field_name = f.getAttribute(u'name')
if field_names is None or field_name in field_names:
found_fields.append((field_name,
value_type,
value))
return found_fields
##
# Extract the contents of given field names from the file.
#
# @param field_names list of field names as unicode strings
#
# @return list of field values as unicode strings.
#
#
def list_values(self, field_names):
return [x[2] for x in self.list_fields_and_values(field_names)]
##
# Extract the contents of this field from the file.
# @param field_name unicode string: name of a field
# @return field value as a unicode string or None if field does not exist.
#
#
def get(self, field_name):
assert(type(field_name)==type(u""))
values = self.list_values([field_name])
if not values:
return None
return values[0]
##
# Extract the type and contents of this field from the file.
# @param field_name unicode string: name of a field
# @return tuple (<type>, <field-value>) as a pair of unicode strings
# or None if field does not exist.
#
#
def get_type_and_value(self, field_name):
assert(type(field_name)==type(u""))
fields = self.list_fields_and_values([field_name])
if not fields:
return None
field_name, value_type, value = fields[0]
return value_type, value
##
# Set the value of user fields. The field types will be the same.
#
# data ... dict, with field name as key, field value as value
#
# Returns None
#
#
def update(self, data):
self.loaddoc()
all_fields = self.document.getElementsByType(UserFieldDecl)
for f in all_fields:
field_name = f.getAttribute(u'name')
if field_name in data:
value_type = f.getAttribute(u'valuetype')
value = data.get(field_name)
if value_type == u'string':
f.setAttribute(u'stringvalue', value)
else:
f.setAttribute(u'value', value)
self.savedoc()
odf.userfield.UserFields.savedoc
def savedoc(self)
Definition: userfield.py:85
odf.userfield.UserFields.src_file
src_file
Definition: userfield.py:56
odf.userfield.UserFields.get
def get(self, field_name)
Extract the contents of this field from the file.
Definition: userfield.py:146
odf.opendocument
Definition: opendocument.py:1
odf.userfield.UserFields
List, view and manipulate user fields.
Definition: userfield.py:53
odf.userfield.UserFields.get_type_and_value
def get_type_and_value(self, field_name)
Extract the type and contents of this field from the file.
Definition: userfield.py:160
odf.userfield.UserFields.loaddoc
def loaddoc(self)
Definition: userfield.py:74
odf.userfield.UserFields.list_values
def list_values(self, field_names)
Extract the contents of given field names from the file.
Definition: userfield.py:137
odf.opendocument.load
def load(odffile)
Load an ODF file into memory.
Definition: opendocument.py:1003
odf.userfield.UserFields.dest_file
dest_file
Definition: userfield.py:57
object
odf.userfield.UserFields.update
def update(self, data)
Set the value of user fields.
Definition: userfield.py:176
odf.text
Definition: text.py:1
odf.namespaces
Definition: namespaces.py:1
odf.userfield.UserFields.list_fields
def list_fields(self)
List (extract) all known user-fields.
Definition: userfield.py:98
odf.userfield.UserFields.document
document
Definition: userfield.py:72
odf.userfield.UserFields.__init__
def __init__
Constructor.
Definition: userfield.py:67
odf.userfield.UserFields.list_fields_and_values
def list_fields_and_values
List (extract) user-fields with type and value.
Definition: userfield.py:111