summaryrefslogtreecommitdiff
path: root/tablib/packages/odf3/userfield.py
diff options
context:
space:
mode:
authorMark Rogers <f4nt@f4ntasmic.com>2011-05-14 16:44:23 -0500
committerMark Rogers <f4nt@f4ntasmic.com>2011-05-14 16:44:23 -0500
commit1e21fee70ebbafab5a51e7c3a1ec77dae417802c (patch)
tree78b39da46a46c5163ad0ae6914dc9ec62694ec9f /tablib/packages/odf3/userfield.py
parent420dd36ab8c4fa7a3f75b8da80ffc2effdf0029e (diff)
downloadtablib-1e21fee70ebbafab5a51e7c3a1ec77dae417802c.tar.gz
start of the py3k port of odfpy
Diffstat (limited to 'tablib/packages/odf3/userfield.py')
-rw-r--r--tablib/packages/odf3/userfield.py169
1 files changed, 169 insertions, 0 deletions
diff --git a/tablib/packages/odf3/userfield.py b/tablib/packages/odf3/userfield.py
new file mode 100644
index 0000000..fd36dec
--- /dev/null
+++ b/tablib/packages/odf3/userfield.py
@@ -0,0 +1,169 @@
+#!/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
+
+OUTENCODING = "utf-8"
+
+
+# OpenDocument v.1.0 section 6.7.1
+VALUE_TYPES = {
+ 'float': (OFFICENS, 'value'),
+ 'percentage': (OFFICENS, 'value'),
+ 'currency': (OFFICENS, 'value'),
+ 'date': (OFFICENS, 'date-value'),
+ 'time': (OFFICENS, 'time-value'),
+ 'boolean': (OFFICENS, 'boolean-value'),
+ 'string': (OFFICENS, 'string-value'),
+ }
+
+
+class UserFields(object):
+ """List, view and manipulate user fields."""
+
+ # these attributes can be a filename or a file like object
+ src_file = None
+ dest_file = None
+
+ def __init__(self, src=None, dest=None):
+ """Constructor
+
+ src ... source document name, file like object or None for stdin
+ dest ... destination document name, file like object or None for stdout
+
+ """
+ self.src_file = src
+ self.dest_file = dest
+ self.document = None
+
+ def loaddoc(self):
+ if isinstance(self.src_file, str):
+ # src_file is a filename, check if it is a zip-file
+ if not zipfile.is_zipfile(self.src_file):
+ raise TypeError("%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('-')
+ else:
+ self.document.save(self.dest_file)
+
+ def list_fields(self):
+ """List (extract) all known user-fields.
+
+ Returns list of user-field names.
+
+ """
+ return [x[0] for x in self.list_fields_and_values()]
+
+ def list_fields_and_values(self, field_names=None):
+ """List (extract) user-fields with type and value.
+
+ field_names ... list of field names to show or None for all.
+
+ Returns list of tuples (<field name>, <field type>, <value>).
+
+ """
+ self.loaddoc()
+ found_fields = []
+ all_fields = self.document.getElementsByType(UserFieldDecl)
+ for f in all_fields:
+ value_type = f.getAttribute('valuetype')
+ if value_type == 'string':
+ value = f.getAttribute('stringvalue')
+ else:
+ value = f.getAttribute('value')
+ field_name = f.getAttribute('name')
+
+ if field_names is None or field_name in field_names:
+ found_fields.append((field_name.encode(OUTENCODING),
+ value_type.encode(OUTENCODING),
+ value.encode(OUTENCODING)))
+ return found_fields
+
+ def list_values(self, field_names):
+ """Extract the contents of given field names from the file.
+
+ field_names ... list of field names
+
+ Returns list of field values.
+
+ """
+ return [x[2] for x in self.list_fields_and_values(field_names)]
+
+ def get(self, field_name):
+ """Extract the contents of this field from the file.
+
+ Returns field value or None if field does not exist.
+
+ """
+ values = self.list_values([field_name])
+ if not values:
+ return None
+ return values[0]
+
+ def get_type_and_value(self, field_name):
+ """Extract the type and contents of this field from the file.
+
+ Returns tuple (<type>, <field-value>) or None if field does not exist.
+
+ """
+ fields = self.list_fields_and_values([field_name])
+ if not fields:
+ return None
+ field_name, value_type, value = fields[0]
+ return value_type, value
+
+ def update(self, data):
+ """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
+
+ """
+ self.loaddoc()
+ all_fields = self.document.getElementsByType(UserFieldDecl)
+ for f in all_fields:
+ field_name = f.getAttribute('name')
+ if field_name in data:
+ value_type = f.getAttribute('valuetype')
+ value = data.get(field_name)
+ if value_type == 'string':
+ f.setAttribute('stringvalue', value)
+ else:
+ f.setAttribute('value', value)
+ self.savedoc()
+