@@ -307,9 +307,31 @@ def _query_view(template, table=None):
307307 if table :
308308 default_sql = 'SELECT * FROM "%s"' % table
309309 model_class = dataset [table ].model_class
310+ pk = model_class ._meta .primary_key
311+ is_composite_pk = isinstance (pk , CompositeKey )
312+ allow_edit = not dataset .is_readonly and pk is not False
313+ allow_bulk = allow_edit and not is_composite_pk
310314 else :
311315 default_sql = ''
312316 model_class = dataset ._base_model
317+ pk = None
318+ is_composite_pk = False
319+ allow_edit = False
320+ allow_bulk = False
321+
322+ if request .method == 'POST' :
323+ action = request .form .get ('action' )
324+ pks = request .form .getlist ('pk' )
325+ if action == 'bulk-delete' :
326+ if not allow_bulk :
327+ flash ('Cannot perform bulk operation on this table.' , 'warning' )
328+ elif not pks :
329+ flash ('No rows were selected.' , 'warning' )
330+ else :
331+ n = (model_class .delete ()
332+ .where (model_class ._meta .primary_key .in_ (pks ))
333+ .execute ())
334+ flash ('Successfully deleted %s row(s)' % n , 'success' )
313335
314336 page = page_next = page_prev = page_start = page_end = total_pages = 1
315337 total = - 1 # Number of rows in query result.
@@ -358,19 +380,17 @@ def _query_view(template, table=None):
358380
359381 if data_description is not None and table :
360382 col_names = [r [0 ] for r in data_description ]
361- pk = model_class ._meta .primary_key
362- if not isinstance (pk , CompositeKey ) and pk is not False :
363- pk = pk .column_name
364- if pk in col_names :
365- pk_index = col_names .index (pk )
383+ if pk and not is_composite_pk and pk .column_name in col_names :
384+ pk_index = col_names .index (pk .column_name )
366385
367386 return render_template (
368387 template ,
388+ allow_bulk = allow_bulk ,
389+ allow_edit = allow_edit ,
369390 data = data ,
370391 data_description = data_description ,
371392 default_sql = default_sql ,
372393 error = error ,
373- is_view = any (v .name == table for v in dataset .get_all_views ()),
374394 ordering = ordering ,
375395 page = page ,
376396 page_end = page_end ,
@@ -641,16 +661,37 @@ def drop_trigger(table):
641661 table = table )
642662
643663
644- @app .route ('/<table>/content/' )
664+ @app .route ('/<table>/content/' , methods = [ 'GET' , 'POST' ] )
645665@require_table
646666def table_content (table ):
647- page_number = request .args .get ('page' ) or ''
648- if page_number == 'last' : page_number = '1000000'
649- page_number = int (page_number ) if page_number .isdigit () else 1
650-
651667 dataset .update_cache (table )
652668 ds_table = dataset [table ]
653669 model = ds_table .model_class
670+ is_composite_pk = isinstance (model ._meta .primary_key , CompositeKey )
671+
672+ allow_edit = not dataset .is_readonly and model ._meta .primary_key is not False
673+ allow_bulk = allow_edit and not is_composite_pk
674+
675+ if request .method == 'POST' :
676+ if not allow_bulk :
677+ flash ('Cannot perform bulk operation on this table.' , 'warning' )
678+ else :
679+ action = request .form ['action' ]
680+ pks = request .form .getlist ('pk' )
681+ if not pks :
682+ flash ('No rows were selected.' , 'warning' )
683+ elif action == 'bulk-delete' :
684+ n = (model .delete ()
685+ .where (model ._meta .primary_key .in_ (pks ))
686+ .execute ())
687+ flash ('Successfully deleted %s row(s)' % n , 'success' )
688+ else :
689+ flash ('Unrecognized action' , 'warning' )
690+ return redirect (request .full_path )
691+
692+ page_number = request .args .get ('page' ) or ''
693+ if page_number == 'last' : page_number = '1000000'
694+ page_number = int (page_number ) if page_number .isdigit () else 1
654695
655696 total_rows = ds_table .all ().count ()
656697 rows_per_page = app .config ['ROWS_PER_PAGE' ]
@@ -677,9 +718,12 @@ def table_content(table):
677718
678719 return render_template (
679720 'table_content.html' ,
721+ allow_bulk = allow_bulk ,
722+ allow_edit = allow_edit ,
680723 columns = columns ,
681724 ds_table = ds_table ,
682725 field_names = field_names ,
726+ is_composite_pk = isinstance (model ._meta .primary_key , CompositeKey ),
683727 next_page = next_page ,
684728 ordering = ordering ,
685729 page = page_number ,
0 commit comments