The same issue caused a bug in the TSV export, which was fixed by this pull 
request: https://github.com/web2py/web2py/pull/1766. Check out that code to 
see the fix.

Anthony

On Sunday, September 24, 2017 at 12:38:02 PM UTC-4, Alex Beskopilny wrote:
>
> Thanks for you answer !
> (it's code works with  web2py-14.6)
>
> db = DAL("postgres://user:pass@localhost:5432/dmdb", lazy_tables=False, 
> migrate_enabled= True)
>
> db.define_table('sprf10',
>     Field("spr",),
>     )
>
> db.define_table('sprf13',
>     Field("s13",),
>     )
>
> db.define_table('addr',
>     Field("f1", length= 96),
>     Field("f2", length= 96),
>     .......
>     Field("ptr_r1", 'integer', label= 'id registr'),
>     )
>
> db.define_table('registr',
>     Field ("dfld2",  label= "Регистрационный номер:2", length= 32),
>     Field ("dfld3", 'date',  label= "Дата внесения в реестр:3", requires = 
> IS_DATE(format=XFMT), default = request.now.today(), ),
>     Field ("dfld11",  length= 512),
>     Field ("dfld12",  length= 96),
>     Field ("dfld13",  length= 1024),
>     Field ("dfld14",  length= 96),
>     Field ("dfld15",  length= 96),
>     Field ("dfld16",  length= 1024, readable=False,writable=False ),
>     Field ("dfld17",  length= 1024, readable=False,writable=False ),
>     Field("p_client", 'reference reg_client', label= 'id reg_client', 
> writable= False, readable= False),
>     Field("p_addr", 'reference addr', label= 'id addr',  writable= False, 
> readable= False ),
>     Field("p_sprf10", 'reference sprf10', label= 'id sprf10',  writable= 
> False, readable= False),
>     Field("p_sprf13", 'reference sprf13', label= 'id sprf13',  writable= 
> False, readable= False),
>     auth.signature,
> )
>
> --------------------------------------------------------------------------------------------
> sqlhtml.py
>
>         exportManager = dict(
>             csv=(ExporterXLS, 'XLS', T('xls')),
>             xml=(ExporterXML, 'XML', T('XML export of columns shown')),
>             html=(ExporterHTML, 'HTML', T('HTML export of visible 
> columns')),
>             json=(ExporterJSON, 'JSON', T('JSON export of visible 
> columns')),
>             )
> .....................
> class ExporterXLS(ExportClass):
>     label = 'XLS'
>     file_ext = "xls"
>     content_type = ".xls"
>
>     def __init__(self, rows):
>         ExportClass.__init__(self, rows)
>
>     def export(self):
>         import xlwt, cStringIO
>         if len(self.rows) == 0:
>               return 'empty rows-table'
>
>         (table_name,f)=self.rows.colnames[0].split('.')
>         book = xlwt.Workbook()
>         sheet = book.add_sheet(table_name)
>
>         def list2xls(row_num,line_list):
>             for col_num, value in enumerate(line_list):
>                  #if isinstance(value, long):
>                  #    value= str(value)
>                  if isinstance(value, str):
>                      value= value.decode('utf8')
>                  if isinstance(value, datetime.datetime)  or 
> isinstance(value, datetime.date):
>                      value= value.strftime('%d.%m.%Y')
>                  sheet.write(row_num, col_num, value)
>
>         fields=[]; labels=[]
>         for col in self.rows.colnames:
>             (t,f) = col.split('.')
>             fields.append(f)
>             labels.append( self.rows.db[t][f].label )
>         list2xls(1,labels)
>
>         for r_num, row in enumerate (self.rows, 2):
>              llist=[ row[f]  for f in fields]
>              list2xls(r_num, llist)
>
>         s = cStringIO.StringIO()
>         book.save(s)
>         return s.getvalue()
> --------------------------------------
> controllers/default.py
> def index():
>
>     tbl= 'registr'
>     query = db[tbl].id >0
>
>     grid = SQLFORM.grid(query,showbuttontext=False,  maxtextlength=200, 
> deletable = False,  create = False,
>                   links=[ lambda row: A('k',_href=URL('cp2_new',args=
> row.id),  _class="btn btn-success" ),   ] ,
>                      buttons_placement = 'left', paginate= PAGIN, )
>     return dict(grid=grid)
>
> ------------------------------------------------------------------------------------------------------------
>
> Traceback (most recent call last):
>   File "/home/w2p/web2py/gluon/restricted.py", line 219, in restricted
>     exec(ccode, environment)
>   File "/home/w2p/web2py/applications/dmlic/controllers/default.py", line 
> 573, in <module>
>   File "/home/w2p/web2py/gluon/globals.py", line 414, in <lambda>
>     self._caller = lambda f: f()
>   File "/home/w2p/web2py/gluon/tools.py", line 3981, in f
>     return action(*a, **b)
>   File "/home/w2p/web2py/applications/dmlic/controllers/default.py", line 78, 
> in index
>     buttons_placement = 'left', paginate= PAGIN, )
>   File "/home/w2p/web2py/gluon/sqlhtml.py", line 2598, in grid
>     raise HTTP(200, oExp.export(), **response.headers)
>   File "/home/w2p/web2py/gluon/sqlhtml.py", line 3742, in export
>     labels.append( self.rows.db[t][f].label )
>   File "/home/w2p/web2py/gluon/packages/dal/pydal/base.py", line 663, in 
> __getitem__
>     return self.__getattr__(str(key))
>   File "/home/w2p/web2py/gluon/packages/dal/pydal/base.py", line 670, in 
> __getattr__
>     return BasicStorage.__getattribute__(self, key)
> AttributeError: 'DAL' object has no attribute '"registr"'
>
>
>
>
> On Saturday, September 23, 2017 at 10:29:59 PM UTC+3, Anthony wrote:
>>
>> Please show the full traceback as well as the rest of the relevant code 
>> (i.e., table definition and grid code).
>>
>> Anthony
>>
>> On Saturday, September 23, 2017 at 3:17:24 PM UTC-4, Alex Beskopilny 
>> wrote:
>>>
>>>
>>> Hi All,
>>> Why It's code work from controller and does error from  class Exporter ?
>>> How to access table_name ?
>>> (  AttributeError: 'DAL' object has no attribute '"table_name"' 
>>> <https://sun.minfindnr.ru/admin/default/errors/dmlic#> )
>>>
>>> class ExporterXLS(ExportClass):
>>>     label = 'XLS'
>>>     file_ext = "xls"
>>>     content_type = ".xls"
>>>
>>>     def __init__(self, rows):
>>>         ExportClass.__init__(self, rows)
>>>
>>>     def export(self):
>>>         import xlwt, cStringIO
>>>
>>>         table_name= self.rows.colnames[0].split('.')[0]
>>>         tbl2=[]; row_flds=[]; row_labs=[]
>>>
>>>         for col in self.rows.colnames:
>>>             (t,f) = col.split('.')
>>>             row_flds.append(f)
>>>             row_labs.append ( self.rows.db[t][f].label )
>>>
>>>         tbl2.append(row_labs) # table headres
>>>         for row in self.rows:
>>>              llist=[ row[x]  for x in row_flds]
>>>              tbl2.append(llist)
>>>     #------------------------------------------------------------
>>>         book = xlwt.Workbook()
>>>         sheet1 = book.add_sheet(table_name.decode('utf8'))
>>>
>>>         for i, l in enumerate(tbl2):
>>>             for j, col in enumerate(l):
>>>                if isinstance(col, str):
>>>                      col=col.decode('utf8')
>>>                elif isinstance(col, datetime.datetime) or 
>>> isinstance(col, datetime.date):
>>>                     col = col.strftime('%d.%m.%Y')
>>>                else:
>>>                      col=''
>>>         s = cStringIO.StringIO()
>>>         book.save(s)
>>>     
>>> #-------------------------------------------------------------------------
>>>         response.headers['Content-Type'] = '.xls'
>>>         response.headers['Content-disposition'] = \
>>>               'attachment; filename=\"%s_%s.xls\"' % ( 
>>> request.now.strftime("%d.%m.%Y_%H%M%S")  , table_name)
>>>         return s.getvalue()
>>>
>>>
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to