def commonheader(title, section, user, request=None, padding="90px", skip_topbar=False, skip_idle_timeout=False, is_mobile=False): """ Returns the rendered common header """ current_app, other_apps, apps_list = _get_apps(user, section) template = 'common_header.mako' if is_mobile: template = 'common_header_m.mako' return django_mako.render_to_string(template, { 'current_app': current_app, 'apps': apps_list, 'other_apps': other_apps, 'title': title, 'section': section, 'padding': padding, 'user': user, 'request': request, 'skip_topbar': skip_topbar, 'skip_idle_timeout': skip_idle_timeout, 'leaflet': { 'layer': desktop.conf.LEAFLET_TILE_LAYER.get(), 'attribution': desktop.conf.LEAFLET_TILE_LAYER_ATTRIBUTION.get(), 'map_options': json.dumps(desktop.conf.LEAFLET_MAP_OPTIONS.get()), 'layer_options': json.dumps(desktop.conf.LEAFLET_TILE_LAYER_OPTIONS.get()), }, 'is_demo': desktop.conf.DEMO_ENABLED.get(), 'is_ldap_setup': 'desktop.auth.backend.LdapBackend' in desktop.conf.AUTH.BACKEND.get(), 'is_s3_enabled': fsmanager.is_enabled('s3a') and fsmanager.has_access('s3a', request.user), 'is_adls_enabled': fsmanager.is_enabled('adl') and fsmanager.has_access('adl', request.user), 'banner_message': get_banner_message(request) })
def hue(request): current_app, other_apps, apps_list = _get_apps(request.user, '') clusters = list(get_clusters(request.user).values()) user_permitted = request.session.get('samlgroup_permitted_flag') if (not user_permitted) and (not samlgroup_check(request)): return render('403.mako', request, { 'is_embeddable': True }) return render('hue.mako', request, { 'apps': apps_list, 'other_apps': other_apps, 'is_s3_enabled': fsmanager.is_enabled('s3a') and fsmanager.has_access('s3a', request.user), 'is_adls_enabled': fsmanager.is_enabled('adl') and fsmanager.has_access('adl', request.user), 'is_ldap_setup': 'desktop.auth.backend.LdapBackend' in desktop.conf.AUTH.BACKEND.get(), 'leaflet': { 'layer': desktop.conf.LEAFLET_TILE_LAYER.get(), 'attribution': desktop.conf.LEAFLET_TILE_LAYER_ATTRIBUTION.get(), 'map_options': json.dumps(desktop.conf.LEAFLET_MAP_OPTIONS.get()), 'layer_options': json.dumps(desktop.conf.LEAFLET_TILE_LAYER_OPTIONS.get()), }, 'is_demo': desktop.conf.DEMO_ENABLED.get(), 'banner_message': get_banner_message(request), 'user_preferences': dict((x.key, x.value) for x in UserPreferences.objects.filter(user=request.user)), 'cluster': clusters[0]['type'] if clusters else None })
def hue(request): apps = appmanager.get_apps_dict(request.user) current_app, other_apps, apps_list = _get_apps(request.user, '') default_cluster_index, default_cluster_interface = Cluster(request.user).get_list_interface_indexes() clusters = get_clusters().values() return render('hue.mako', request, { 'apps': apps, 'other_apps': other_apps, 'is_s3_enabled': is_s3_enabled() and has_s3_access(request.user), 'is_adls_enabled': is_adls_enabled() and has_adls_access(request.user), 'is_ldap_setup': 'desktop.auth.backend.LdapBackend' in desktop.conf.AUTH.BACKEND.get(), 'leaflet': { 'layer': desktop.conf.LEAFLET_TILE_LAYER.get(), 'attribution': desktop.conf.LEAFLET_TILE_LAYER_ATTRIBUTION.get(), 'map_options': json.dumps(desktop.conf.LEAFLET_MAP_OPTIONS.get()), 'layer_options': json.dumps(desktop.conf.LEAFLET_TILE_LAYER_OPTIONS.get()), }, 'is_demo': desktop.conf.DEMO_ENABLED.get(), 'banner_message': get_banner_message(request), 'user_preferences': dict((x.key, x.value) for x in UserPreferences.objects.filter(user=request.user)), 'cluster': clusters[0]['type'] if clusters else None, 'clusters_config_json': json.dumps(clusters), 'default_cluster_index': default_cluster_index, 'default_cluster_interface': default_cluster_interface })
def show_tables(request, database=None): cluster = json.loads(request.POST.get('cluster', '{}')) db = _get_db(user=request.user, cluster=cluster) if database is None: database = 'default' # Assume always 'default' if request.GET.get("format", "html") == "json": try: databases = db.get_databases() if database not in databases: database = 'default' if request.method == 'POST': db_form = DbForm(request.POST, databases=databases) if db_form.is_valid(): database = db_form.cleaned_data['database'] else: db_form = DbForm(initial={'database': database}, databases=databases) search_filter = request.GET.get('filter', '') tables = db.get_tables_meta( database=database, table_names=search_filter) # SparkSql returns [] table_names = [table['name'] for table in tables] except Exception as e: raise PopupException(_( 'Failed to retrieve tables for database: %s' % database), detail=e) resp = JsonResponse({ 'status': 0, 'database_meta': db.get_database(database), 'tables': tables, 'table_names': table_names, 'search_filter': search_filter }) else: apps_list = _get_apps(request.user, '') resp = render( "metastore.mako", request, { 'apps': apps_list, 'breadcrumbs': [], 'database': None, 'partitions': [], 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_catalog(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_catalog_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), }) return resp
def describe_table(request, database, table): app_name = get_app_name(request) cluster = json.loads(request.POST.get('cluster', '{}')) source_type = request.POST.get('source_type', request.GET.get('source_type', 'hive')) db = _get_db(user=request.user, source_type=source_type, cluster=cluster) try: table = db.get_table(database, table) except Exception as e: LOG.exception("Describe table error") raise PopupException(_("DB Error"), detail=e.message if hasattr(e, 'message') and e.message else e) if request.POST.get("format", "html") == "json": return JsonResponse({ 'status': 0, 'name': table.name, 'partition_keys': [{'name': part.name, 'type': part.type} for part in table.partition_keys], 'cols': [{'name': col.name, 'type': col.type, 'comment': col.comment} for col in table.cols], 'path_location': table.path_location, 'hdfs_link': table.hdfs_link, 'comment': table.comment, 'is_view': table.is_view, 'properties': table.properties, 'details': table.details, 'stats': table.stats }) else: # Render HTML renderable = "metastore.mako" apps_list = _get_apps(request.user, '') partitions = None if app_name != 'impala' and table.partition_keys: try: partitions = [_massage_partition(database, table, partition) for partition in db.get_partitions(database, table)] except: LOG.exception('Table partitions could not be retrieved') return render(renderable, request, { 'apps': apps_list, 'breadcrumbs': [{ 'name': database, 'url': reverse('metastore:show_tables', kwargs={'database': database}) }, { 'name': str(table.name), 'url': reverse('metastore:describe_table', kwargs={'database': database, 'table': table.name}) }, ], 'table': table, 'partitions': partitions, 'database': database, 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_catalog(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_catalog_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), })
def create_table(request, database='default'): """Create a table by specifying its attributes manually""" db = dbms.get(request.user) dbs = db.get_databases() databases = [{ 'name': db, 'url': reverse('beeswax:create_table', kwargs={'database': db}) } for db in dbs] form = MultiForm(table=CreateTableForm, columns=ColumnTypeFormSet, partitions=PartitionTypeFormSet) if request.method == "POST": form.bind(request.POST) form.table.db = db # curry is invalid form.table.database = database if request.POST.get('create'): if form.is_valid(): columns = [f.cleaned_data for f in form.columns.forms] partition_columns = [ f.cleaned_data for f in form.partitions.forms ] proposed_query = django_mako.render_to_string( "create_table_statement.mako", { 'databases': databases, 'database': database, 'table': form.table.cleaned_data, 'columns': columns, 'partition_columns': partition_columns }) # Mako outputs bytestring in utf8 proposed_query = proposed_query.decode('utf-8') table_name = form.table.cleaned_data['name'] return _submit_create_and_load(request, proposed_query, table_name, None, False, database=database) else: form.bind() apps_list = _get_apps(request.user, '') return render( "create_table_manually.mako", request, { 'apps': apps_list, 'action': "#", 'databases': databases, 'table_form': form.table, 'columns_form': form.columns, 'partitions_form': form.partitions, 'has_tables': len(dbms.get(request.user).get_tables()) > 0, 'database': database, })
def execute_query(request, design_id=None, query_history_id=None): """ View function for executing an arbitrary query. """ action = 'query' if query_history_id: query_history = authorized_get_query_history(request, query_history_id, must_exist=True) design = query_history.design try: if query_history.server_id and query_history.server_guid: handle, state = _get_query_handle_and_state(query_history) if 'on_success_url' in request.GET: if request.GET.get('on_success_url') and any( [regexp.match(request.GET.get('on_success_url')) for regexp in REDIRECT_WHITELIST.get()] ): action = 'watch-redirect' else: action = 'watch-results' else: action = 'editor-results' except QueryServerException as e: if 'Invalid query handle' in e.message or 'Invalid OperationHandle' in e.message: query_history.save_state(QueryHistory.STATE.expired) LOG.warn("Invalid query handle", exc_info=sys.exc_info()) action = 'editor-expired-results' else: raise e else: # Check perms. authorized_get_design(request, design_id) app_name = get_app_name(request) query_type = SavedQuery.TYPES_MAPPING[app_name] design = safe_get_design(request, query_type, design_id) query_history = None current_app, other_apps, apps_list = _get_apps(request.user, '') doc = design and design.id and design.doc.get() context = { 'design': design, 'apps': apps_list, 'query': query_history, # Backward 'query_history': query_history, 'autocomplete_base_url': reverse(get_app_name(request) + ':api_autocomplete_databases', kwargs={}), 'autocomplete_base_url_hive': reverse('beeswax:api_autocomplete_databases', kwargs={}), 'can_edit_name': design and design.id and not design.is_auto, 'doc_id': doc and doc.id or -1, 'can_edit': doc and doc.can_write(request.user), 'action': action, 'on_success_url': request.GET.get('on_success_url'), 'has_metastore': 'metastore' in get_apps_dict(request.user) } return render('execute.mako', request, context)
def databases(request): search_filter = request.GET.get('filter', '') cluster = json.loads(request.POST.get('cluster', '{}')) db = _get_db(user=request.user, cluster=cluster) databases = db.get_databases(search_filter) apps_list = _get_apps(request.user, '') return render("metastore.mako", request, { 'apps': apps_list, 'breadcrumbs': [], 'database': None, 'databases': databases, 'partitions': [], 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_catalog(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_catalog_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), })
def databases(request): search_filter = request.GET.get('filter', '') cluster = json.loads(request.POST.get('cluster', '{}')) db = _get_db(user=request.user, cluster=cluster) databases = db.get_databases(search_filter) apps_list = _get_apps(request.user, '') return render("metastore.mako", request, { 'apps': apps_list, 'breadcrumbs': [], 'database': None, 'databases': databases, 'partitions': [], 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_catalog(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_catalog_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), })
def describe_partitions(request, database, table): cluster = json.loads(request.POST.get('cluster', '{}')) db = _get_db(user=request.user, cluster=cluster) table_obj = db.get_table(database, table) if not table_obj.partition_keys: raise PopupException(_("Table '%(table)s' is not partitioned.") % {'table': table}) reverse_sort = request.GET.get("sort", "desc").lower() == "desc" if request.method == "POST": partition_filters = {} for part in table_obj.partition_keys: if request.GET.get(part.name): partition_filters[part.name] = request.GET.get(part.name) partition_spec = ','.join(["%s='%s'" % (k, v) for k, v in list(partition_filters.items())]) else: partition_spec = '' try: partitions = db.get_partitions(database, table_obj, partition_spec, reverse_sort=reverse_sort) except: LOG.exception('Table partitions could not be retrieved') partitions = [] massaged_partitions = [_massage_partition(database, table_obj, partition) for partition in partitions] if request.method == "POST" or request.GET.get('format', 'html') == 'json': return JsonResponse({ 'partition_keys_json': [partition.name for partition in table_obj.partition_keys], 'partition_values_json': massaged_partitions, }) else: apps_list = _get_apps(request.user, '') return render("metastore.mako", request, { 'apps': apps_list, 'breadcrumbs': [{ 'name': database, 'url': reverse('metastore:show_tables', kwargs={'database': database}) }, { 'name': table, 'url': reverse('metastore:describe_table', kwargs={'database': database, 'table': table}) }, { 'name': 'partitions', 'url': reverse('metastore:describe_partitions', kwargs={'database': database, 'table': table}) }, ], 'database': database, 'table': table_obj, 'partitions': partitions, 'partition_keys_json': json.dumps([partition.name for partition in table_obj.partition_keys]), 'partition_values_json': json.dumps(massaged_partitions), 'request': request, 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_catalog(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_catalog_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), })
def describe_partitions(request, database, table): cluster = json.loads(request.POST.get('cluster', '{}')) db = _get_db(user=request.user, cluster=cluster) table_obj = db.get_table(database, table) if not table_obj.partition_keys: raise PopupException(_("Table '%(table)s' is not partitioned.") % {'table': table}) reverse_sort = request.GET.get("sort", "desc").lower() == "desc" if request.method == "POST": partition_filters = {} for part in table_obj.partition_keys: if request.GET.get(part.name): partition_filters[part.name] = request.GET.get(part.name) partition_spec = ','.join(["%s='%s'" % (k, v) for k, v in partition_filters.items()]) else: partition_spec = '' try: partitions = db.get_partitions(database, table_obj, partition_spec, reverse_sort=reverse_sort) except: LOG.exception('Table partitions could not be retrieved') partitions = [] massaged_partitions = [_massage_partition(database, table_obj, partition) for partition in partitions] if request.method == "POST" or request.GET.get('format', 'html') == 'json': return JsonResponse({ 'partition_keys_json': [partition.name for partition in table_obj.partition_keys], 'partition_values_json': massaged_partitions, }) else: apps_list = _get_apps(request.user, '') return render("metastore.mako", request, { 'apps': apps_list, 'breadcrumbs': [{ 'name': database, 'url': reverse('metastore:show_tables', kwargs={'database': database}) }, { 'name': table, 'url': reverse('metastore:describe_table', kwargs={'database': database, 'table': table}) },{ 'name': 'partitions', 'url': reverse('metastore:describe_partitions', kwargs={'database': database, 'table': table}) }, ], 'database': database, 'table': table_obj, 'partitions': partitions, 'partition_keys_json': json.dumps([partition.name for partition in table_obj.partition_keys]), 'partition_values_json': json.dumps(massaged_partitions), 'request': request, 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_catalog(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_catalog_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), })
search_filter = request.GET.get('filter', '') tables = db.get_tables_meta(database=database, table_names=search_filter) # SparkSql returns [] table_names = [table['name'] for table in tables] except Exception, e: raise PopupException(_('Failed to retrieve tables for database: %s' % database), detail=e) resp = JsonResponse({ 'status': 0, 'database_meta': db.get_database(database), 'tables': tables, 'table_names': table_names, 'search_filter': search_filter }) else: apps_list = _get_apps(request.user, '') resp = render("metastore.mako", request, { 'apps': apps_list, 'breadcrumbs': [], 'database': None, 'partitions': [], 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_catalog(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_catalog_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), }) return resp
def import_wizard(request, database='default'): """ Help users define table and based on a file they want to import to Hive. Limitations: - Rows are delimited (no serde). - No detection for map and array types. - No detection for the presence of column header in the first row. - No partition table. - Does not work with binary data. """ encoding = i18n.get_site_encoding() app_name = get_app_name(request) db = dbms.get(request.user) dbs = db.get_databases() databases = [{ 'name': db, 'url': reverse('beeswax:import_wizard', kwargs={'database': db}) } for db in dbs] if request.method == 'POST': # # General processing logic: # - We have 3 steps. Each requires the previous. # * Step 1 : Table name and file location # * Step 2a : Display sample with auto chosen delim # * Step 2b : Display sample with user chosen delim (if user chooses one) # * Step 3 : Display sample, and define columns # - Each step is represented by a different form. The form of an earlier step # should be present when submitting to a later step. # - To preserve the data from the earlier steps, we send the forms back as # hidden fields. This way, when users revisit a previous step, the data would # be there as well. # delim_is_auto = False fields_list, n_cols = [[]], 0 s3_col_formset = None s1_file_form = CreateByImportFileForm(request.POST, db=db) if s1_file_form.is_valid(): do_s2_auto_delim = request.POST.get('submit_file') # Step 1 -> 2 do_s2_user_delim = request.POST.get( 'submit_preview') # Step 2 -> 2 do_s3_column_def = request.POST.get('submit_delim') # Step 2 -> 3 do_hive_create = request.POST.get( 'submit_create') # Step 3 -> execute cancel_s2_user_delim = request.POST.get( 'cancel_delim') # Step 2 -> 1 cancel_s3_column_def = request.POST.get( 'cancel_create') # Step 3 -> 2 # Exactly one of these should be True if len([ _f for _f in (do_s2_auto_delim, do_s2_user_delim, do_s3_column_def, do_hive_create, cancel_s2_user_delim, cancel_s3_column_def) if _f ]) != 1: raise PopupException(_('Invalid form submission')) if not do_s2_auto_delim: # We should have a valid delim form s2_delim_form = CreateByImportDelimForm(request.POST) if not s2_delim_form.is_valid(): # Go back to picking delimiter do_s2_user_delim, do_s3_column_def, do_hive_create = True, False, False if do_hive_create: # We should have a valid columns formset s3_col_formset = ColumnTypeFormSet(prefix='cols', data=request.POST) if not s3_col_formset.is_valid(): # Go back to define columns do_s3_column_def, do_hive_create = True, False load_data = s1_file_form.cleaned_data.get('load_data', 'IMPORT').upper() path = s1_file_form.cleaned_data['path'] # # Go to step 2: We've just picked the file. Preview it. # if do_s2_auto_delim: try: if load_data == 'IMPORT': if not request.fs.isfile(path): raise PopupException( _('Path location must refer to a file if "Import Data" is selected.' )) elif load_data == 'EXTERNAL': if not request.fs.isdir(path): raise PopupException( _('Path location must refer to a directory if "Create External Table" is selected.' )) except (IOError, S3FileSystemException) as e: raise PopupException( _('Path location "%s" is invalid: %s') % (path, e)) delim_is_auto = True fields_list, n_cols, s2_delim_form = _delim_preview( request.fs, s1_file_form, encoding, [reader.TYPE for reader in FILE_READERS], DELIMITERS) if (do_s2_user_delim or do_s3_column_def or cancel_s3_column_def) and s2_delim_form.is_valid(): # Delimit based on input fields_list, n_cols, s2_delim_form = _delim_preview( request.fs, s1_file_form, encoding, (s2_delim_form.cleaned_data['file_type'], ), (s2_delim_form.cleaned_data['delimiter'], )) if do_s2_auto_delim or do_s2_user_delim or cancel_s3_column_def: apps_list = _get_apps(request.user, '') return render( 'import_wizard_choose_delimiter.mako', request, { 'apps': apps_list, 'action': reverse(app_name + ':import_wizard', kwargs={'database': database}), 'delim_readable': DELIMITER_READABLE.get( s2_delim_form['delimiter'].data[0], s2_delim_form['delimiter'].data[1]), 'initial': delim_is_auto, 'file_form': s1_file_form, 'delim_form': s2_delim_form, 'fields_list': fields_list, 'delimiter_choices': TERMINATOR_CHOICES, 'n_cols': n_cols, 'database': database, 'databases': databases }) # # Go to step 3: Define column. # if do_s3_column_def: if s3_col_formset is None: columns = [] for i in range(n_cols): columns.append({ 'column_name': 'col_%s' % (i, ), 'column_type': 'string', }) s3_col_formset = ColumnTypeFormSet(prefix='cols', initial=columns) try: fields_list_for_json = list(fields_list) if fields_list_for_json: fields_list_for_json[0] = [ re.sub('[^\w]', '', a) for a in fields_list_for_json[0] ] # Cleaning headers apps_list = _get_apps(request.user, '') return render( 'import_wizard_define_columns.mako', request, { 'apps': apps_list, 'action': reverse(app_name + ':import_wizard', kwargs={'database': database}), 'file_form': s1_file_form, 'delim_form': s2_delim_form, 'column_formset': s3_col_formset, 'fields_list': fields_list, 'fields_list_json': json.dumps(fields_list_for_json), 'n_cols': n_cols, 'database': database, 'databases': databases }) except Exception as e: raise PopupException(_( "The selected delimiter is creating an un-even number of columns. Please make sure you don't have empty columns." ), detail=e) # # Final: Execute # if do_hive_create: delim = s2_delim_form.cleaned_data['delimiter'] table_name = s1_file_form.cleaned_data['name'] proposed_query = django_mako.render_to_string( "create_table_statement.mako", { 'table': { 'name': table_name, 'comment': s1_file_form.cleaned_data['comment'], 'row_format': 'Delimited', 'field_terminator': delim, 'file_format': 'TextFile', 'load_data': load_data, 'path': path, 'skip_header': request.GET.get('removeHeader', 'off').lower() == 'on' }, 'columns': [f.cleaned_data for f in s3_col_formset.forms], 'partition_columns': [], 'database': database, 'databases': databases }) try: return _submit_create_and_load(request, proposed_query, table_name, path, load_data, database=database) except QueryServerException as e: raise PopupException(_('The table could not be created.'), detail=e.message) else: s1_file_form = CreateByImportFileForm() return render( 'import_wizard_choose_file.mako', request, { 'action': reverse(app_name + ':import_wizard', kwargs={'database': database }), 'file_form': s1_file_form, 'database': database, 'databases': databases })
table_names=search_filter) # SparkSql returns [] table_names = [table['name'] for table in tables] except Exception, e: raise PopupException(_( 'Failed to retrieve tables for database: %s' % database), detail=e) resp = JsonResponse({ 'status': 0, 'database_meta': db.get_database(database), 'tables': tables, 'table_names': table_names, 'search_filter': search_filter }) else: apps_list = _get_apps(request.user, '') resp = render( "metastore.mako", request, { 'apps': apps_list, 'breadcrumbs': [], 'database': None, 'partitions': [], 'has_write_access': has_write_access(request.user), 'is_optimizer_enabled': has_optimizer(), 'is_navigator_enabled': has_navigator(request.user), 'optimizer_url': get_optimizer_url(), 'navigator_url': get_navigator_url(), 'is_embeddable': request.GET.get('is_embeddable', False), 'source_type': _get_servername(db), })
if 'Invalid query handle' in e.message or 'Invalid OperationHandle' in e.message: query_history.save_state(QueryHistory.STATE.expired) LOG.warn("Invalid query handle", exc_info=sys.exc_info()) action = 'editor-expired-results' else: raise e else: # Check perms. authorized_get_design(request, design_id) app_name = get_app_name(request) query_type = SavedQuery.TYPES_MAPPING[app_name] design = safe_get_design(request, query_type, design_id) query_history = None current_app, other_apps, apps_list = _get_apps(request.user, '') doc = design and design.id and design.doc.get() context = { 'design': design, 'apps': apps_list, 'query': query_history, # Backward 'query_history': query_history, 'autocomplete_base_url': reverse(get_app_name(request) + ':api_autocomplete_databases', kwargs={}), 'autocomplete_base_url_hive': reverse('beeswax:api_autocomplete_databases', kwargs={}), 'can_edit_name': design and design.id and not design.is_auto, 'doc_id': doc and doc.id or -1, 'can_edit': doc and doc.can_write(request.user), 'action': action, 'on_success_url': request.GET.get('on_success_url'), 'has_metastore': 'metastore' in get_apps_dict(request.user) }
if 'Invalid query handle' in e.message or 'Invalid OperationHandle' in e.message: query_history.save_state(QueryHistory.STATE.expired) LOG.warn("Invalid query handle", exc_info=sys.exc_info()) action = 'editor-expired-results' else: raise e else: # Check perms. authorized_get_design(request, design_id) app_name = get_app_name(request) query_type = SavedQuery.TYPES_MAPPING[app_name] design = safe_get_design(request, query_type, design_id) query_history = None current_app, other_apps, apps_list = _get_apps(request.user, '') doc = design and design.id and design.doc.get() context = { 'design': design, 'apps': apps_list, 'query': query_history, # Backward 'query_history': query_history, 'autocomplete_base_url': reverse(get_app_name(request) + ':api_autocomplete_databases', kwargs={}), 'autocomplete_base_url_hive': reverse('beeswax:api_autocomplete_databases', kwargs={}),