home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 January / maximum-cd-2011-01.iso / DiscContents / calibre-0.7.26.msi / file_2188 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-10-31  |  3.5 KB  |  107 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import sys
  5. import zipfile
  6. from odf.text import UserFieldDecl
  7. from odf.namespaces import OFFICENS
  8. from odf.opendocument import load
  9. OUTENCODING = 'utf-8'
  10. VALUE_TYPES = {
  11.     'float': (OFFICENS, u'value'),
  12.     'percentage': (OFFICENS, u'value'),
  13.     'currency': (OFFICENS, u'value'),
  14.     'date': (OFFICENS, u'date-value'),
  15.     'time': (OFFICENS, u'time-value'),
  16.     'boolean': (OFFICENS, u'boolean-value'),
  17.     'string': (OFFICENS, u'string-value') }
  18.  
  19. class UserFields(object):
  20.     src_file = None
  21.     dest_file = None
  22.     
  23.     def __init__(self, src = None, dest = None):
  24.         self.src_file = src
  25.         self.dest_file = dest
  26.         self.document = None
  27.  
  28.     
  29.     def loaddoc(self):
  30.         if isinstance(self.src_file, basestring):
  31.             if not zipfile.is_zipfile(self.src_file):
  32.                 raise TypeError('%s is no odt file.' % self.src_file)
  33.             zipfile.is_zipfile(self.src_file)
  34.         elif self.src_file is None:
  35.             self.src_file = sys.stdin
  36.         
  37.         self.document = load(self.src_file)
  38.  
  39.     
  40.     def savedoc(self):
  41.         if self.dest_file is None:
  42.             self.document.save('-')
  43.         else:
  44.             self.document.save(self.dest_file)
  45.  
  46.     
  47.     def list_fields(self):
  48.         return [ x[0] for x in self.list_fields_and_values() ]
  49.  
  50.     
  51.     def list_fields_and_values(self, field_names = None):
  52.         self.loaddoc()
  53.         found_fields = []
  54.         all_fields = self.document.getElementsByType(UserFieldDecl)
  55.         for f in all_fields:
  56.             value_type = f.getAttribute('valuetype')
  57.             if value_type == 'string':
  58.                 value = f.getAttribute('stringvalue')
  59.             else:
  60.                 value = f.getAttribute('value')
  61.             field_name = f.getAttribute('name')
  62.             if field_names is None or field_name in field_names:
  63.                 found_fields.append((field_name.encode(OUTENCODING), value_type.encode(OUTENCODING), value.encode(OUTENCODING)))
  64.                 continue
  65.         
  66.         return found_fields
  67.  
  68.     
  69.     def list_values(self, field_names):
  70.         return [ x[2] for x in self.list_fields_and_values(field_names) ]
  71.  
  72.     
  73.     def get(self, field_name):
  74.         values = self.list_values([
  75.             field_name])
  76.         if not values:
  77.             return None
  78.         return values[0]
  79.  
  80.     
  81.     def get_type_and_value(self, field_name):
  82.         fields = self.list_fields_and_values([
  83.             field_name])
  84.         if not fields:
  85.             return None
  86.         (field_name, value_type, value) = fields[0]
  87.         return (value_type, value)
  88.  
  89.     
  90.     def update(self, data):
  91.         self.loaddoc()
  92.         all_fields = self.document.getElementsByType(UserFieldDecl)
  93.         for f in all_fields:
  94.             field_name = f.getAttribute('name')
  95.             if data.has_key(field_name):
  96.                 value_type = f.getAttribute('valuetype')
  97.                 value = data.get(field_name)
  98.                 if value_type == 'string':
  99.                     f.setAttribute('stringvalue', value)
  100.                 else:
  101.                     f.setAttribute('value', value)
  102.             value_type == 'string'
  103.         
  104.         self.savedoc()
  105.  
  106.  
  107.