From 3ca82dae7f028e4d0bf6bbea1eab14ab2f72d32b Mon Sep 17 00:00:00 2001 From: Massimo Di Pierro Date: Wed, 2 May 2012 14:28:13 -0500 Subject: [PATCH] db.table.insert(uploadfield=...), ... can not be file or FieldStorage, issue 570 --- VERSION | 2 +- gluon/dal.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 02b0f6a1..340223ab 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 1.99.7 (2012-05-02 14:11:05) dev +Version 1.99.7 (2012-05-02 14:27:33) dev diff --git a/gluon/dal.py b/gluon/dal.py index 54ea00ea..b3a4a947 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -7215,10 +7215,24 @@ class Table(dict): raise SyntaxError,'Table: missing required field: %s' % ofield.name return new_fields + def _attempt_upload(self, fields): + for field in self: + if field.type=='upload' and field.name in fields: + value = fields[field.name] + if not isinstance(value,str): + if hasattr(value,'file') and hasattr(value,'filename'): + new_name = field.store(value.file,filename=value.filename) + elif hasattr(value,'read') and hasattr(value,'name'): + new_name = field.store(value,filename=value.name) + else: + raise RuntimeError, "Unable to handle upload" + fields[field.name] = new_name + def _insert(self, **fields): return self._db._adapter._insert(self,self._listify(fields)) def insert(self, **fields): + self._attempt_upload(fields) if any(f(fields) for f in self._before_insert): return 0 ret = self._db._adapter.insert(self,self._listify(fields)) ret and [f(fields,ret) for f in self._after_insert] @@ -8052,6 +8066,7 @@ class Set(object): def update(self, **update_fields): tablename = self.db._adapter.get_table(self.query) table = self.db[tablename] + table._attempt_upload(update_fields) if any(f(self,update_fields) for f in table._before_update): return 0 fields = table._listify(update_fields,update=True) if not fields: raise SyntaxError, "No fields to update"