Add basic "Review Model" step for new table wizard
This commit is contained in:
parent
9d2bcff96b
commit
68ed5942e6
|
@ -275,6 +275,12 @@
|
||||||
<b-input v-model="tableModelFile"></b-input>
|
<b-input v-model="tableModelFile"></b-input>
|
||||||
</b-field>
|
</b-field>
|
||||||
|
|
||||||
|
<b-field horizontal>
|
||||||
|
<b-checkbox v-model="tableModelFileOverwrite">
|
||||||
|
Overwrite file if it exists
|
||||||
|
</b-checkbox>
|
||||||
|
</b-field>
|
||||||
|
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<b-button icon-pack="fas"
|
<b-button icon-pack="fas"
|
||||||
|
@ -289,6 +295,11 @@
|
||||||
:disabled="writingModelFile">
|
:disabled="writingModelFile">
|
||||||
{{ writingModelFile ? "Working, please wait..." : "Write model class to file" }}
|
{{ writingModelFile ? "Working, please wait..." : "Write model class to file" }}
|
||||||
</b-button>
|
</b-button>
|
||||||
|
<b-button icon-pack="fas"
|
||||||
|
icon-left="arrow-right"
|
||||||
|
@click="activeStep = 'review-model'">
|
||||||
|
Skip
|
||||||
|
</b-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</b-step-item>
|
</b-step-item>
|
||||||
|
@ -299,7 +310,87 @@
|
||||||
<h3 class="is-size-3 block">
|
<h3 class="is-size-3 block">
|
||||||
Review Model
|
Review Model
|
||||||
</h3>
|
</h3>
|
||||||
<p class="block">TODO: review model class here</p>
|
|
||||||
|
<p class="block">
|
||||||
|
Model code was generated to file:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="block is-family-code" style="padding-left: 3rem;">
|
||||||
|
{{ tableModelFile }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="block">
|
||||||
|
First, review that code and adjust to your liking.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="block">
|
||||||
|
Next be sure to import the new model. Typically this is done
|
||||||
|
by editing the file...
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="block is-family-code" style="padding-left: 3rem;">
|
||||||
|
${model_dir}__init__.py
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="block">
|
||||||
|
...and adding a line such as:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="block is-family-code" style="padding-left: 3rem;">
|
||||||
|
from .{{ tableModelFileModuleName }} import {{ tableModelName }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="block">
|
||||||
|
Once you've done all that, the web app must be restarted.
|
||||||
|
This may happen automatically depending on your setup.
|
||||||
|
Test the model import status below.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="card block">
|
||||||
|
<header class="card-header">
|
||||||
|
<p class="card-header-title">
|
||||||
|
Model Import Status
|
||||||
|
</p>
|
||||||
|
</header>
|
||||||
|
<div class="card-content">
|
||||||
|
<div class="content">
|
||||||
|
<div class="level">
|
||||||
|
<div class="level-left">
|
||||||
|
|
||||||
|
<div class="level-item">
|
||||||
|
<span v-if="!modelImported && !modelImportProblem">
|
||||||
|
import not yet attempted
|
||||||
|
</span>
|
||||||
|
<span v-if="modelImported"
|
||||||
|
class="has-text-success has-text-weight-bold">
|
||||||
|
imported okay
|
||||||
|
</span>
|
||||||
|
<span v-if="modelImportProblem"
|
||||||
|
class="has-text-danger">
|
||||||
|
import failed: {{ modelImportStatus }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="level-right">
|
||||||
|
<div class="level-item">
|
||||||
|
<b-field horizontal label="Model Class">
|
||||||
|
<b-input v-model="modelImportName"></b-input>
|
||||||
|
</b-field>
|
||||||
|
</div>
|
||||||
|
<div class="level-item">
|
||||||
|
<b-button type="is-primary"
|
||||||
|
icon-pack="fas"
|
||||||
|
icon-left="redo"
|
||||||
|
@click="modelImportTest()">
|
||||||
|
Refresh / Test Import
|
||||||
|
</b-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<b-button icon-pack="fas"
|
<b-button icon-pack="fas"
|
||||||
icon-left="arrow-left"
|
icon-left="arrow-left"
|
||||||
|
@ -309,7 +400,8 @@
|
||||||
<b-button type="is-primary"
|
<b-button type="is-primary"
|
||||||
icon-pack="fas"
|
icon-pack="fas"
|
||||||
icon-left="check"
|
icon-left="check"
|
||||||
@click="activeStep = 'write-revision'">
|
@click="activeStep = 'write-revision'"
|
||||||
|
:disabled="!modelImported">
|
||||||
Model class looks good!
|
Model class looks good!
|
||||||
</b-button>
|
</b-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -515,11 +607,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
ThisPageData.tableModelFile = '${model_dir}widget.py'
|
ThisPageData.tableModelFile = '${model_dir}widget.py'
|
||||||
|
ThisPageData.tableModelFileOverwrite = false
|
||||||
ThisPageData.writingModelFile = false
|
ThisPageData.writingModelFile = false
|
||||||
|
|
||||||
ThisPage.methods.writeModelFile = function() {
|
ThisPage.methods.writeModelFile = function() {
|
||||||
this.writingModelFile = true
|
this.writingModelFile = true
|
||||||
|
|
||||||
|
this.modelImportName = this.tableModelName
|
||||||
|
this.modelImported = false
|
||||||
|
this.modelImportStatus = "import not yet attempted"
|
||||||
|
this.modelImportProblem = false
|
||||||
|
|
||||||
let url = '${url('{}.write_model_file'.format(route_prefix))}'
|
let url = '${url('{}.write_model_file'.format(route_prefix))}'
|
||||||
let params = {
|
let params = {
|
||||||
branch_name: this.tableBranch,
|
branch_name: this.tableBranch,
|
||||||
|
@ -529,8 +627,9 @@
|
||||||
model_title_plural: this.tableModelTitlePlural,
|
model_title_plural: this.tableModelTitlePlural,
|
||||||
description: this.tableDescription,
|
description: this.tableDescription,
|
||||||
versioned: this.tableVersioned,
|
versioned: this.tableVersioned,
|
||||||
module_file: this.tableModelFile,
|
|
||||||
columns: this.tableColumns,
|
columns: this.tableColumns,
|
||||||
|
module_file: this.tableModelFile,
|
||||||
|
overwrite: this.tableModelFileOverwrite,
|
||||||
}
|
}
|
||||||
this.submitForm(url, params, response => {
|
this.submitForm(url, params, response => {
|
||||||
this.writingModelFile = false
|
this.writingModelFile = false
|
||||||
|
@ -540,6 +639,33 @@
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ThisPageData.modelImportName = '${rattail_app.get_class_prefix()}Widget'
|
||||||
|
ThisPageData.modelImportStatus = "import not yet attempted"
|
||||||
|
ThisPageData.modelImported = false
|
||||||
|
ThisPageData.modelImportProblem = false
|
||||||
|
|
||||||
|
ThisPage.computed.tableModelFileModuleName = function() {
|
||||||
|
let path = this.tableModelFile
|
||||||
|
path = path.replace(/^.*\//, '')
|
||||||
|
path = path.replace(/\.py$/, '')
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
ThisPage.methods.modelImportTest = function() {
|
||||||
|
let url = '${url('{}.check_model'.format(route_prefix))}'
|
||||||
|
let params = {model_name: this.modelImportName}
|
||||||
|
this.submitForm(url, params, response => {
|
||||||
|
if (response.data.problem) {
|
||||||
|
this.modelImportProblem = true
|
||||||
|
this.modelImported = false
|
||||||
|
this.modelImportStatus = response.data.problem
|
||||||
|
} else {
|
||||||
|
this.modelImportProblem = false
|
||||||
|
this.modelImported = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
|
|
|
@ -183,11 +183,28 @@ class TableView(MasterView):
|
||||||
path = data['module_file']
|
path = data['module_file']
|
||||||
|
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
return {'error': "File already exists"}
|
if data['overwrite']:
|
||||||
|
os.remove(path)
|
||||||
|
else:
|
||||||
|
return {'error': "File already exists"}
|
||||||
|
|
||||||
self.db_handler.write_table_model(data, path)
|
self.db_handler.write_table_model(data, path)
|
||||||
return {'ok': True}
|
return {'ok': True}
|
||||||
|
|
||||||
|
def check_model(self):
|
||||||
|
model = self.model
|
||||||
|
data = self.request.json_body
|
||||||
|
model_name = data['model_name']
|
||||||
|
|
||||||
|
if not hasattr(model, model_name):
|
||||||
|
return {'ok': True,
|
||||||
|
'problem': "class not found in primary model contents",
|
||||||
|
'model': self.model.__name__}
|
||||||
|
|
||||||
|
# TODO: probably should inspect closer before assuming ok..?
|
||||||
|
|
||||||
|
return {'ok': True}
|
||||||
|
|
||||||
def get_row_data(self, table):
|
def get_row_data(self, table):
|
||||||
data = []
|
data = []
|
||||||
for i, column in enumerate(table['table'].columns, 1):
|
for i, column in enumerate(table['table'].columns, 1):
|
||||||
|
@ -261,6 +278,15 @@ class TableView(MasterView):
|
||||||
renderer='json',
|
renderer='json',
|
||||||
permission='{}.create'.format(permission_prefix))
|
permission='{}.create'.format(permission_prefix))
|
||||||
|
|
||||||
|
# check model
|
||||||
|
config.add_route('{}.check_model'.format(route_prefix),
|
||||||
|
'{}/check-model'.format(url_prefix),
|
||||||
|
request_method='POST')
|
||||||
|
config.add_view(cls, attr='check_model',
|
||||||
|
route_name='{}.check_model'.format(route_prefix),
|
||||||
|
renderer='json',
|
||||||
|
permission='{}.create'.format(permission_prefix))
|
||||||
|
|
||||||
|
|
||||||
class TablesView(TableView):
|
class TablesView(TableView):
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue