|
@@ -76,7 +76,7 @@ def save_design(request, form, type_, design, explicit_save):
|
|
|
Need to return a SavedQuery because we may end up with a different one.
|
|
Need to return a SavedQuery because we may end up with a different one.
|
|
|
Assumes that form.saveform is the SaveForm, and that it is valid.
|
|
Assumes that form.saveform is the SaveForm, and that it is valid.
|
|
|
"""
|
|
"""
|
|
|
- authorized_get_design(request, design.id, owner_only=True)
|
|
|
|
|
|
|
+ authorized_get_design(request, design.id)
|
|
|
assert form.saveform.is_valid()
|
|
assert form.saveform.is_valid()
|
|
|
sub_design_form = form # Beeswax/Impala case
|
|
sub_design_form = form # Beeswax/Impala case
|
|
|
|
|
|
|
@@ -91,22 +91,30 @@ def save_design(request, form, type_, design, explicit_save):
|
|
|
else:
|
|
else:
|
|
|
raise ValueError(_('Invalid design type %(type)s') % {'type': type_})
|
|
raise ValueError(_('Invalid design type %(type)s') % {'type': type_})
|
|
|
|
|
|
|
|
|
|
+ design_obj = design_cls(sub_design_form, query_type=type_)
|
|
|
|
|
+ name = form.saveform.cleaned_data['name']
|
|
|
|
|
+ desc = form.saveform.cleaned_data['desc']
|
|
|
|
|
+
|
|
|
|
|
+ return _save_design(request.user, design, type_, design_obj, explicit_save, name, desc)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _save_design(user, design, type_, design_obj, explicit_save, name=None, desc=None):
|
|
|
# Design here means SavedQuery
|
|
# Design here means SavedQuery
|
|
|
old_design = design
|
|
old_design = design
|
|
|
- design_obj = design_cls(sub_design_form, query_type=type_)
|
|
|
|
|
new_data = design_obj.dumps()
|
|
new_data = design_obj.dumps()
|
|
|
|
|
|
|
|
# Auto save if (1) the user didn't click "save", and (2) the data is different.
|
|
# Auto save if (1) the user didn't click "save", and (2) the data is different.
|
|
|
- # Don't generate an auto-saved design if the user didn't change anything
|
|
|
|
|
- if explicit_save:
|
|
|
|
|
- design.name = form.saveform.cleaned_data['name']
|
|
|
|
|
- design.desc = form.saveform.cleaned_data['desc']
|
|
|
|
|
|
|
+ # Create an history design if the user is executing a shared design.
|
|
|
|
|
+ # Don't generate an auto-saved design if the user didn't change anything.
|
|
|
|
|
+ if explicit_save and (not design.doc.exists() or design.doc.get().can_write_or_exception(user)):
|
|
|
|
|
+ design.name = name
|
|
|
|
|
+ design.desc = desc
|
|
|
design.is_auto = False
|
|
design.is_auto = False
|
|
|
elif design_obj != old_design.get_design():
|
|
elif design_obj != old_design.get_design():
|
|
|
# Auto save iff the data is different
|
|
# Auto save iff the data is different
|
|
|
if old_design.id is not None:
|
|
if old_design.id is not None:
|
|
|
# Clone iff the parent design isn't a new unsaved model
|
|
# Clone iff the parent design isn't a new unsaved model
|
|
|
- design = old_design.clone()
|
|
|
|
|
|
|
+ design = old_design.clone(new_owner=user)
|
|
|
if not old_design.is_auto:
|
|
if not old_design.is_auto:
|
|
|
design.name = old_design.name + models.SavedQuery.AUTO_DESIGN_SUFFIX
|
|
design.name = old_design.name + models.SavedQuery.AUTO_DESIGN_SUFFIX
|
|
|
else:
|
|
else:
|
|
@@ -175,16 +183,7 @@ def clone_design(request, design_id):
|
|
|
LOG.error('Cannot clone non-existent design %s' % (design_id,))
|
|
LOG.error('Cannot clone non-existent design %s' % (design_id,))
|
|
|
return list_designs(request)
|
|
return list_designs(request)
|
|
|
|
|
|
|
|
- copy = design.clone()
|
|
|
|
|
- copy_doc = design.doc.get().copy()
|
|
|
|
|
- copy.name = design.name + ' (copy)'
|
|
|
|
|
- copy.owner = request.user
|
|
|
|
|
- copy.save()
|
|
|
|
|
-
|
|
|
|
|
- copy_doc.owner = copy.owner
|
|
|
|
|
- copy_doc.name = copy.name
|
|
|
|
|
- copy_doc.save()
|
|
|
|
|
- copy.doc.add(copy_doc)
|
|
|
|
|
|
|
+ copy = design.clone(request.user)
|
|
|
|
|
|
|
|
messages.info(request, _('Copied design: %(name)s') % {'name': design.name})
|
|
messages.info(request, _('Copied design: %(name)s') % {'name': design.name})
|
|
|
|
|
|
|
@@ -404,6 +403,7 @@ def execute_query(request, design_id=None, query_history_id=None):
|
|
|
'query_history': query_history,
|
|
'query_history': query_history,
|
|
|
'autocomplete_base_url': reverse(get_app_name(request) + ':api_autocomplete_databases', kwargs={}),
|
|
'autocomplete_base_url': reverse(get_app_name(request) + ':api_autocomplete_databases', kwargs={}),
|
|
|
'can_edit_name': design and design.id and not design.is_auto,
|
|
'can_edit_name': design and design.id and not design.is_auto,
|
|
|
|
|
+ 'can_edit': design and design.id and design.doc.get().can_write(request.user),
|
|
|
'action': action,
|
|
'action': action,
|
|
|
'on_success_url': request.GET.get('on_success_url'),
|
|
'on_success_url': request.GET.get('on_success_url'),
|
|
|
'has_metastore': 'metastore' in get_apps_dict(request.user)
|
|
'has_metastore': 'metastore' in get_apps_dict(request.user)
|
|
@@ -460,7 +460,7 @@ def view_results(request, id, first_row=0):
|
|
|
else:
|
|
else:
|
|
|
results = db.fetch(handle, start_over, 100)
|
|
results = db.fetch(handle, start_over, 100)
|
|
|
data = []
|
|
data = []
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
# Materialize and HTML escape results
|
|
# Materialize and HTML escape results
|
|
|
# TODO: use Number + list comprehension
|
|
# TODO: use Number + list comprehension
|
|
|
for row in results.rows():
|
|
for row in results.rows():
|
|
@@ -630,11 +630,10 @@ def massage_columns_for_json(cols):
|
|
|
})
|
|
})
|
|
|
return massaged_cols
|
|
return massaged_cols
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-# owner_only is deprecated
|
|
|
|
|
def authorized_get_design(request, design_id, owner_only=False, must_exist=False):
|
|
def authorized_get_design(request, design_id, owner_only=False, must_exist=False):
|
|
|
if design_id is None and not must_exist:
|
|
if design_id is None and not must_exist:
|
|
|
return None
|
|
return None
|
|
|
|
|
+
|
|
|
try:
|
|
try:
|
|
|
design = SavedQuery.objects.get(id=design_id)
|
|
design = SavedQuery.objects.get(id=design_id)
|
|
|
except SavedQuery.DoesNotExist:
|
|
except SavedQuery.DoesNotExist:
|
|
@@ -653,6 +652,7 @@ def authorized_get_design(request, design_id, owner_only=False, must_exist=False
|
|
|
def authorized_get_query_history(request, query_history_id, owner_only=False, must_exist=False):
|
|
def authorized_get_query_history(request, query_history_id, owner_only=False, must_exist=False):
|
|
|
if query_history_id is None and not must_exist:
|
|
if query_history_id is None and not must_exist:
|
|
|
return None
|
|
return None
|
|
|
|
|
+
|
|
|
try:
|
|
try:
|
|
|
query_history = QueryHistory.get(id=query_history_id)
|
|
query_history = QueryHistory.get(id=query_history_id)
|
|
|
except QueryHistory.DoesNotExist:
|
|
except QueryHistory.DoesNotExist:
|