', { id: "modal-new-recipient", class: "modal fade in"}).appendTo(t);
+ $('#modal-new-recipient').insertTpl(pmHooks.renderNewRecipientModal(item_id));
+ $("#modal-new-recipient").modal('show');
+ }
+}
+
+
+/**
+ * Фукнция рендерит модальное окно для создание нового recipient'a.
+ * @param {String/Number} item_id - "new" для нового хука либо id для существующего хука.
+ */
+pmHooks.renderNewRecipientModal = function (item_id)
+{
+ var html=spajs.just.render('new-recipient-modal', {item_id:item_id});
+ return html;
+}
+
+
+/**
+ * Фукнция добавляет нового recipient'a к списку других recipient'ов.
+ * @param {String/Number} item_id - "new" для нового хука либо id для существующего хука.
+ */
+pmHooks.addNewRecipient = function (item_id)
+{
+ if($("#new_recipient").val().trim() == "")
+ {
+ $.notify("Recipient field should not be empty.", "error");
+ return false;
+ }
+
+ if(item_id == "new")
+ {
+ var recipients_arr = pmHooks.parseRecipientsFromStrToArr(pmHooks.model.newItem.recipients);
+ recipients_arr.push($('#new_recipient').val().trim());
+ pmHooks.model.newItem.recipients = pmHooks.parseRecipientsFromArrToStr(recipients_arr);
+ }
+ else
+ {
+ var recipients_arr = pmHooks.parseRecipientsFromStrToArr(pmHooks.model.items[item_id].recipients);
+ recipients_arr.push($('#new_recipient').val().trim());
+ pmHooks.model.items[item_id].recipients = pmHooks.parseRecipientsFromArrToStr(recipients_arr);
+ }
+ $("#modal-new-recipient").modal('hide');
+}
+
+
+/**
+ * Фукнция отрисовывает форму для редактирования списка recipient'ов.
+ * @param {String/Number} item_id - "new" для нового хука либо id для существующего хука.
+ */
+pmHooks.showEditRecipientsForm = function(item_id)
+{
+ if(!item_id)
+ {
+ throw "Error in pmHooks.showEditRecipientsForm with item_id = `" + item_id + "`"
+ }
+
+ $("#edit_hook_recipients").remove()
+ $(".content").appendTpl(spajs.just.render('edit_hook_recipients', {item_id:item_id}))
+ var scroll_el = "#edit_hook_recipients";
+ if ($(scroll_el).length != 0) {
+ $('html, body').animate({ scrollTop: $(scroll_el).offset().top }, 1000);
+ }
+ $("#polemarch-model-recipients-select").select2({ width: '100%' });
+}
+
+
+/**
+ * Фукнция запоминает изменения в списке recipient'ов.
+ * @param {String/Number} item_id - "new" для нового хука либо id для существующего хука.
+ * @param {Array} recipients - массив с новым списком recipient'ов.
+ */
+pmHooks.setRecipients = function(item_id, recipients)
+{
+ if(!item_id)
+ {
+ throw "Error in pmHooks.setRecipients with item_id = `" + item_id + "`"
+ }
+
+ if(!recipients)
+ {
+ recipients = "";
+ }
+
+
+ if(item_id == "new")
+ {
+ pmHooks.model.newItem.recipients = pmHooks.parseRecipientsFromArrToStr(recipients);
+ }
+ else
+ {
+ return spajs.ajax.Call({
+ url: hostname + "/api/v1/hooks/"+item_id+"/",
+ type: "PATCH",
+ contentType:'application/json',
+ data:JSON.stringify({recipients:pmHooks.parseRecipientsFromArrToStr(recipients)}),
+ success: function(data)
+ {
+ pmHooks.model.items[item_id].recipients = data.recipients;
+ },
+ error:function(e)
+ {
+ console.warn("Hook "+item_id+" update error - " + JSON.stringify(e));
+ polemarch.showErrors(e.responseJSON)
+ }
+ });
+ }
+}
+
+
+tabSignal.connect("polemarch.start", function()
+{
+ spajs.addMenu({
+ id:"hooks",
+ urlregexp:[/^hooks/, /^hooks\/search\/?$/, /^hooks\/page\/([0-9]+)$/],
+ onOpen:function(holder, menuInfo, data){return pmHooks.openSomeHookPage(holder, menuInfo, data, 'showList');}
+ })
+
+ spajs.addMenu({
+ id:"hooks-item",
+ urlregexp:[/^hook\/([0-9]+)$/],
+ onOpen:function(holder, menuInfo, data){return pmHooks.openSomeHookPage(holder, menuInfo, data, 'showItem');}
+ })
+
+ spajs.addMenu({
+ id:"newHook",
+ urlregexp:[/^new-hook/, /^([A-z0-9_]+)\/([0-9]+)\/new-hook/],
+ onOpen:function(holder, menuInfo, data){return pmHooks.openSomeHookPage(holder, menuInfo, data, 'showNewItemPage');}
+ })
+
+ spajs.addMenu({
+ id:"hooks-search",
+ urlregexp:[/^hooks\/search\/([A-z0-9 %\-.:,=]+)$/, /^hooks\/search\/([A-z0-9 %\-.:,=]+)\/page\/([0-9]+)$/],
+ onOpen:function(holder, menuInfo, data){return pmHooks.openSomeHookPage(holder, menuInfo, data, 'showSearchResults');}
+ })
+})
\ No newline at end of file
diff --git a/polemarch/static/js/pmHosts.js b/polemarch/static/js/pmHosts.js
index 61be26db..a183d2bc 100644
--- a/polemarch/static/js/pmHosts.js
+++ b/polemarch/static/js/pmHosts.js
@@ -11,9 +11,9 @@ pmHosts.model.page_list = {
{
class:'btn btn-primary',
function:function(){ return "spajs.open({ menuId:'new-"+this.model.page_name+"'}); return false;"},
- title:'Create',
- link:function(){ return '/?new-'+this.model.page_name},
- },
+ title:'Create',
+ link:function(){ return '/?new-'+this.model.page_name},
+ },
],
title: "Hosts",
short_title: "Hosts",
@@ -26,24 +26,23 @@ pmHosts.model.page_list = {
title:'Type',
name:'type',
style:function(item){ return 'style="width: 70px"'},
- class:function(item){ return 'class="hidden-xs"'},
+ class:function(item){ return 'class="hidden-xs"'},
}
],
actions:[
{
- class:'btn btn-danger',
function:function(item){ return 'spajs.showLoader('+this.model.className+'.deleteItem('+item.id+')); return false;'},
title:'Delete',
link:function(){ return '#'}
}
]
}
-
-
+
+
pmHosts.fileds = [
[
{
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'Name',
name:'name',
placeholder:'Enter host or range name',
@@ -54,11 +53,19 @@ pmHosts.fileds = [
{
return true;
}
-
- $.notify("Invalid value in field `name` it mast be valid host or range name", "error");
+
+ $.notify("Invalid value in field `name` it mast be valid host or range name", "error");
return false;
- },
- fast_validator:function(value){ return this.validateRangeName(value) || this.validateHostName(value)}
+ },
+ fast_validator:function(value){ return this.validateRangeName(value) || this.validateHostName(value)}
+ },
+ ],
+ [
+ {
+ filed: new filedsLib.filed.textarea(),
+ title:'Notes',
+ name:'notes',
+ placeholder:'Not required field, just for your notes'
},
]
]
@@ -73,26 +80,26 @@ pmHosts.model.page_new = {
}
],
onBeforeSave:function(data)
- {
+ {
if(this.validateHostName(data.name))
{
data.type = 'HOST'
}
else if(this.validateRangeName(data.name))
- {
+ {
data.type = 'RANGE'
}
else
{
- $.notify("Error in host or range name", "error");
+ $.notify("Error in host or range name", "error");
return undefined;
}
-
+
data.vars = jsonEditor.jsonEditorGetValues()
return data;
},
onCreate:function(result, status, xhr, callOpt)
- {
+ {
var def = new $.Deferred();
$.notify("Host created", "success");
@@ -136,19 +143,19 @@ pmHosts.model.page_new = {
def.resolve()
})
}
-
+
return def.promise();
}
}
-
+
pmHosts.model.page_item = {
buttons:[
{
class:'btn btn-primary',
function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.updateItem('+item_id+')); return false;'},
- title:'Save',
- link:function(){ return '#'},
- },
+ title:'Save',
+ link:function(){ return '#'},
+ },
{
class:'btn btn-default copy-btn',
function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.copyAndEdit('+item_id+')); return false;'},
@@ -160,45 +167,45 @@ pmHosts.model.page_item = {
class:'btn btn-danger danger-right',
function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.deleteItem('+item_id+')); return false;'},
title:'
',
- link:function(){ return '#'},
+ link:function(){ return '#'},
},
],
sections:[
- function(section, item_id){
+ function(section, item_id){
return jsonEditor.editor(this.model.items[item_id].vars, {block:this.model.name});
}
],
- title: function(item_id){
+ title: function(item_id){
return "Host "+pmHosts.model.items[item_id].justText('name')
},
- short_title: function(item_id){
+ short_title: function(item_id){
return "Host "+pmHosts.model.items[item_id].justText('name', function(v){return v.slice(0, 20)})
},
fileds:pmHosts.fileds,
onUpdate:function(result)
- {
+ {
return true;
},
onBeforeSave:function(data, item_id)
- {
+ {
data.vars = jsonEditor.jsonEditorGetValues()
if(this.validateHostName(data.name))
{
data.type = 'HOST'
}
else if(this.validateRangeName(data.name))
- {
+ {
data.type = 'RANGE'
}
else
{
- $.notify("Error in host or range name", "error");
+ $.notify("Error in host or range name", "error");
return undefined;
}
return data;
},
}
-
+
pmHosts.copyItem = function(item_id)
{
var def = new $.Deferred();
@@ -211,11 +218,11 @@ pmHosts.copyItem = function(item_id)
{
delete data.id;
spajs.ajax.Call({
- url: "/api/v1/"+thisObj.model.name+"/",
+ url: hostname + "/api/v1/"+thisObj.model.name+"/",
type: "POST",
contentType:'application/json',
data: JSON.stringify(data),
- success: function(data)
+ success: function(data)
{
thisObj.model.items[data.id] = data
def.resolve(data.id)
@@ -229,7 +236,7 @@ pmHosts.copyItem = function(item_id)
{
def.reject(e)
})
-
+
}).fail(function(e)
{
def.reject(e)
@@ -237,8 +244,8 @@ pmHosts.copyItem = function(item_id)
return def.promise();
-}
-
+}
+
/*
*
@@ -251,41 +258,41 @@ setTimeout(function(){
name = Math.random()+"-"+Math.random()
name = name.replace(/\./g, "")
spajs.ajax.Call({
- url: "/api/v1/hosts/",
+ url: hostname + "/api/v1/hosts/",
type: "POST",
contentType:'application/json',
data: JSON.stringify({name:name, type:"HOST"}),
})
}, i*400);
}
- */
+ */
- tabSignal.connect("polemarch.start", function()
- {
+tabSignal.connect("polemarch.start", function()
+{
// hosts
spajs.addMenu({
- id:"hosts",
+ id:"hosts",
urlregexp:[/^hosts$/, /^host$/, /^hosts\/search\/?$/, /^hosts\/page\/([0-9]+)$/],
onOpen:function(holder, menuInfo, data){return pmHosts.showList(holder, menuInfo, data);}
})
-
+
spajs.addMenu({
- id:"hosts-search",
+ id:"hosts-search",
urlregexp:[/^hosts\/search\/([A-z0-9 %\-.:,=]+)$/, /^hosts\/search\/([A-z0-9 %\-.:,=]+)\/page\/([0-9]+)$/],
onOpen:function(holder, menuInfo, data){return pmHosts.showSearchResults(holder, menuInfo, data);}
})
-
+
spajs.addMenu({
- id:"host",
+ id:"host",
urlregexp:[/^host\/([0-9]+)$/, /^hosts\/([0-9]+)$/],
onOpen:function(holder, menuInfo, data){return pmHosts.showItem(holder, menuInfo, data);}
})
spajs.addMenu({
- id:"newHost",
+ id:"newHost",
urlregexp:[/^new-host$/, /^([A-z0-9_]+)\/([0-9]+)\/new-host$/],
onOpen:function(holder, menuInfo, data){return pmHosts.showNewItemPage(holder, menuInfo, data);}
- })
- })
-
- //изменение типа input'a на file при выборе
\ No newline at end of file
+ })
+})
+
+//изменение типа input'a на file при выборе
\ No newline at end of file
diff --git a/polemarch/static/js/pmInventories.js b/polemarch/static/js/pmInventories.js
index 7495ef59..b415117e 100644
--- a/polemarch/static/js/pmInventories.js
+++ b/polemarch/static/js/pmInventories.js
@@ -122,7 +122,13 @@ pmInventories.parseHostLine = function(index, line, section, inventory)
var host = {
name:name,
+ notes:"",
type:type,
+ all_only:false,
+ matches:false,
+ match_id_arr:[],
+ match_arr:[],
+ extern:false,
vars:pmInventories.parseVarsLine(index, line)
}
@@ -201,9 +207,14 @@ pmInventories.addGroupIfNotExists = function(inventory, group_name)
if(!inventory.groups[group_name])
{
inventory.groups[group_name] = {
+ notes:"",
vars:{},
groups:[],
hosts:[],
+ matches:false,
+ match_id_arr:[],
+ match_arr:[],
+ extern:false,
}
return true;
@@ -227,7 +238,8 @@ pmInventories.parseFromText = function(text)
hosts:[],
groups:{},
vars:{},
- name:new Date().toString()
+ name:new Date().toString(),
+ notes:""
}
for(var i in lines)
@@ -372,6 +384,7 @@ pmInventories.importFromFile = function(files_event)
this.model.files = files_event
this.model.importedInventories = {}
var thisObj = this;
+ pmInventories.model.importedInventoriesIsReady=false;
for(var i=0; i
', { id: "edit_imported_subitem", class: "modal fade in"}).appendTo(t);
+ $('#edit_imported_subitem').insertTpl(pmInventories.renderEditItemModal(subItemType, index));
+ $("#edit_imported_subitem").modal('show');
+ }
+}
+
+/**
+ * Функция сохраняет изменения внесенные в модальном окне для редактирования нового subitem(host or group),
+ * вложенного в импортируемый инвенторий.
+ * @param {string} subItemType - типа subitem(group or host)
+ * @param {integer/string} index - индекс данного subitem в массиве
+ */
+pmInventories.saveChangesFromEditItemModal = function(subItemType, index)
+{
+ pmInventories.model.importedSubItem.notes=$("#"+subItemType+"_notes").val();
+ pmInventories.model.importedInventories.inventory[subItemType][index]=JSON.parse(JSON.stringify(pmInventories.model.importedSubItem));
+ var html=spajs.just.render('change_imported_subitem_vars', {vars:pmInventories.model.importedInventories.inventory[subItemType][index].vars});
+ $("#"+subItemType+"-"+index+"-vars").html(html);
+ $("#edit_imported_subitem").modal('hide');
+ pmInventories.updateImportedInventoryPage();
+}
+
+/**
+ * Функция открывает модальное окно, в котором пользователь может выбрать
+ * какой конкретно из subitems с одинаковым именем использовать в данном инвентории.
+ * Так же данная функция посылает bulk запрос, который подгружает свойства созданных ранее
+ * subitems с таким же именем.
+ * @param {string} subItemType - типа subitem(group or host)
+ * @param {integer/string} index - индекс данного subitem в массиве
+ */
+pmInventories.openChooseMatchingModal = function(subItemType, index)
+{
+ var def = new $.Deferred();
+ var bulkHosts=[];
+ var type1=subItemType.slice(0,-1);
+ var imported_subitem=pmInventories.model.importedInventories.inventory[subItemType][index];
+ imported_subitem=JSON.parse(JSON.stringify(imported_subitem));
+ for(var i in imported_subitem.match_id_arr)
+ {
+ bulkHosts.push({
+ type:"get",
+ item: type1,
+ pk: imported_subitem.match_id_arr[i]
+ })
+ }
+ return $.when(
+ spajs.ajax.Call({
+ url: "/api/v1/_bulk/",
+ type: "POST",
+ contentType:'application/json',
+ data:JSON.stringify(bulkHosts),
+ success: function(data)
+ {
+ for(var i in data)
+ {
+ imported_subitem.match_arr.push(data[i].data);
+ }
+ pmInventories.model.importedSubItem=JSON.parse(JSON.stringify(imported_subitem));
+ if($('div').is('#choose_matching_modal'))
+ {
+ $('#choose_matching_modal').empty();
+ $('#choose_matching_modal').insertTpl(pmInventories.renderChooseMatchingModal(subItemType, index));
+ $("#choose_matching_modal").modal('show');
+ }
+ else
+ {
+ var t=$(".content")[0];
+ $('', { id: "choose_matching_modal", class: "modal fade in"}).appendTo(t);
+ $('#choose_matching_modal').insertTpl(pmInventories.renderChooseMatchingModal(subItemType, index));
+ $("#choose_matching_modal").modal('show');
+ }
+
+ },
+ error: function(e)
+ {
+ $.notify("Error with getting matching "+subItemType+"' data.", "error");
+ }
+ })).done(function(){def.promise();}).fail(function(){def.reject();}).promise();
+
+}
+
+
+/**
+ * Функция рендерит модальное окно, в котором пользователь может выбрать
+ * какой конкретно из subitems с одинаковым именем использовать в данном инвентории.
+ * @param {string} subItemType - типа subitem(group or host)
+ * @param {integer/string} index - индекс данного subitem в массиве
+ */
+pmInventories.renderChooseMatchingModal = function(subItemType, index)
+{
+ var html=spajs.just.render('choose_matching_modal', {val:pmInventories.model.importedSubItem, subItemType:subItemType, index:index});
+ return html;
+}
+
+/**
+ * Пользователь выбрал какой из subitems с одинаковым именем ему использовать.
+ * Данная функция снимает выделение со всех других subitems,
+ * и выделяет выбранный пользователем subitem.
+ * @param {object} thisEl - конкретный элемент
+ */
+pmInventories.toggleSelectMatchSubItem = function (thisEl)
+{
+ var mode=$(thisEl).parent().hasClass('selected');
+ var match_subitem_arr=$(".match-subitem");
+ for(var i=0; i
- $.notify("Error in field ansible_ssh_private_key_file invalid value", "error");
- pmInventories.showHostVarsModal({group:'all', name:val.name});
- def2.reject()
- return def2.promise();
+ if (val.vars.ansible_ssh_private_key_file !== undefined && !/-----BEGIN RSA PRIVATE KEY-----/.test(val.vars.ansible_ssh_private_key_file)) {
+ //
+ $.notify("Error in field ansible_ssh_private_key_file invalid value", "error");
+ //pmInventories.showHostVarsModal({group: 'all', name: val.name});
+ var scroll_el = "#imported_hosts";
+ if ($(scroll_el).length != 0) {
+ $('html, body').animate({ scrollTop: $(scroll_el).offset().top }, 700);
+ }
+ def2.reject()
+ return def2.promise();
+ }
}
}
for(var i in inventory.groups)
{
var val = inventory.groups[i]
- if(val.vars.ansible_ssh_private_key_file !== undefined && !/-----BEGIN RSA PRIVATE KEY-----/.test(val.vars.ansible_ssh_private_key_file))
- {
- //
- $.notify("Error in field ansible_ssh_private_key_file invalid value", "error");
- pmInventories.showGroupVarsModal({name:i});
- def2.reject()
- return def2.promise();
- }
-
- for(var j in val.hosts)
+ if(val.id===undefined)
{
- var hval = val.hosts[j]
- if(hval.vars.ansible_ssh_private_key_file !== undefined && !/-----BEGIN RSA PRIVATE KEY-----/.test(hval.vars.ansible_ssh_private_key_file))
+ if(val.vars.ansible_ssh_private_key_file !== undefined && !/-----BEGIN RSA PRIVATE KEY-----/.test(val.vars.ansible_ssh_private_key_file))
{
//
$.notify("Error in field ansible_ssh_private_key_file invalid value", "error");
- pmInventories.showHostVarsModal({group:i, name:hval.name});
+ //pmInventories.showGroupVarsModal({name:i});
+ var scroll_el = "#imported_groups";
+ if ($(scroll_el).length != 0) {
+ $('html, body').animate({ scrollTop: $(scroll_el).offset().top }, 700);
+ }
def2.reject()
return def2.promise();
}
+
+ }
+ //проверяем, что пользователь не пытается создать инвенторий с уже существующей ранее группой с children==true
+ //которая так же включает в себя группы, название которых идентично тем, что пользователь хочет создать сейчас заново
+ if(inventory.groups[i].children!==undefined && inventory.groups[i].children==true && inventory.groups[i].id!==undefined)
+ {
+ for(var j in inventory.groups[i].groups)
+ {
+ if(inventory.groups[inventory.groups[i].groups[j].name]!==undefined && inventory.groups[inventory.groups[i].groups[j].name].id==undefined)
+ {
+ $.notify('It is impossible to replace subitem "'+inventory.groups[i].groups[j].name+'" in existing group "'+i+'" with new one.', "error");
+ var scroll_el = "#imported_groups";
+ if ($(scroll_el).length != 0) {
+ $('html, body').animate({ scrollTop: $(scroll_el).offset().top }, 700);
+ }
+ def2.reject()
+ return def2.promise();
+
+ }
+
+ if(inventory.groups[inventory.groups[i].groups[j].name]!==undefined && inventory.groups[inventory.groups[i].groups[j].name].id!=inventory.groups[i].groups[j].id)
+ {
+ $.notify('It is impossible to replace subitem "'+inventory.groups[i].groups[j].name+'" in existing group "'+i+'" with another existing subitem.', "error");
+ var scroll_el = "#imported_groups";
+ if ($(scroll_el).length != 0) {
+ $('html, body').animate({ scrollTop: $(scroll_el).offset().top }, 700);
+ }
+ def2.reject()
+ return def2.promise();
+
+ }
+
+ }
}
+
}
var def = new $.Deferred();
- if($("#inventory_name").val() != "")
+ if($("#inventory_name").val() != "" && $("#inventory_name").val()!==undefined)
{
inventory.name = $("#inventory_name").val();
}
@@ -501,7 +1739,8 @@ pmInventories.importInventory = function(inventory)
var inventoryObject = {
name:inventory.name,
- vars:inventory.vars
+ vars:inventory.vars,
+ notes:$("#filed_notes").val()
}
var deleteBulk = []
@@ -512,56 +1751,32 @@ pmInventories.importInventory = function(inventory)
item:'inventory',
pk:inventory_id
})
- var bulkdata = []
- // Сбор групп и вложенных в них хостов
- for(var i in inventory.groups)
- {
- var val = inventory.groups[i]
- bulkdata.push({
- type:"add",
- item:'group',
- data:{
- name:i,
- children:val.children,
- vars:val.vars
- }
- })
- for(var j in val.hosts)
+ // Сбор хостов вложенных к инвенторию
+ var bulkHosts = [];
+ for(var i in inventory.hosts)
+ {
+ var val = inventory.hosts[i]
+ if(val.id===undefined)
{
- var hval = val.hosts[j]
- bulkdata.push({
+ bulkHosts.push({
type:"add",
item:'host',
data:{
- name:hval.name,
- type:hval.type,
- vars:hval.vars
+ name:val.name,
+ notes:val.notes,
+ type:val.type,
+ vars:val.vars
}
})
}
}
- // Сбор хостов вложенных к инвенторию
- var bulkHosts = []
- for(var i in inventory.hosts)
- {
- var val = inventory.hosts[i]
- bulkHosts.push({
- type:"add",
- item:'host',
- data:{
- name:val.name,
- type:val.type,
- vars:val.vars
- }
- })
- }
- // Добавление хостов вложенных к инвенторию
+ // Добавление новых хостов вложенных к инвенторию
spajs.ajax.Call({
- url: "/api/v1/_bulk/",
+ url: hostname + "/api/v1/_bulk/",
type: "POST",
contentType:'application/json',
data:JSON.stringify(bulkHosts),
@@ -569,6 +1784,7 @@ pmInventories.importInventory = function(inventory)
{
var hasError = false;
var hosts_ids = []
+ var just_added_hosts = [];
for(var i in data)
{
var val = data[i]
@@ -578,27 +1794,106 @@ pmInventories.importInventory = function(inventory)
hasError = true;
continue;
}
- hosts_ids.push(val.data.id)
- deleteBulk.push({
- type:"del",
- item:'host',
- pk:val.data.id
- })
+ for(var j in inventory.hosts)
+ {
+ if(inventory.hosts[j].name==val.data.name)
+ {
+ if(just_added_hosts[val.data.name]===undefined)
+ {
+ just_added_hosts[val.data.name]=val.data;
+ deleteBulk.push({
+ type:"del",
+ item:'host',
+ pk:val.data.id
+ })
+ if(inventory.hosts[j].all_only==false)
+ {
+ hosts_ids.push(val.data.id);
+
+ }
+ }
+ }
+ }
+ }
+ //добавление существующих ранее хостов
+ for(var i in pmInventories.model.importedInventories.inventory.hosts)
+ {
+ if(pmInventories.model.importedInventories.inventory.hosts[i].id)
+ {
+ var hostName=pmInventories.model.importedInventories.inventory.hosts[i].name;
+ just_added_hosts[hostName]=pmInventories.model.importedInventories.inventory.hosts[i];
+
+ //добавление существующих ранее хостов, вложенных непосредственно к инвенторию
+ if(pmInventories.model.importedInventories.inventory.hosts[i].all_only==false)
+ {
+ hosts_ids.push(+pmInventories.model.importedInventories.inventory.hosts[i].id);
+ }
+ }
}
if(hasError)
{
// По меньшей мере в одной операции была ошибка вставки.
- // Инвенторий импортирован не полностью
+ // Инвенторий импортирован не полностью
def.reject(deleteBulk);
return;
}
+ var bulkdata = [];
+ var groups_with_just_added_hosts=[];
+ // Сбор групп и вложенных в них хостов
+ for(var i in inventory.groups)
+ {
+ var val = inventory.groups[i]
+ //если нужно создать новую группу(id===undefined, следовательно, она не была создана ранее)
+ //то доавляем ее в bulk запрос
+ if(val.id===undefined)
+ {
+ bulkdata.push({
+ type: "add",
+ item: 'group',
+ data: {
+ name: i,
+ notes: val.notes,
+ children: val.children,
+ vars: val.vars
+ }
+ })
+
+ //собираем хосты в нужные группы
+ for(var j in val.hosts)
+ {
+ var hval = val.hosts[j];
+ if(just_added_hosts[hval.name])
+ {
+ if(!groups_with_just_added_hosts[i])
+ {
+ groups_with_just_added_hosts[i]=[];
+ }
+ groups_with_just_added_hosts[i].push(just_added_hosts[hval.name].id);
+ }
+ else
+ {
+ bulkdata.push({
+ type:"add",
+ item:'host',
+ data:{
+ name:hval.name,
+ notes:hval.notes,
+ type:hval.type,
+ vars:hval.vars
+ }
+ })
+ }
+ }
+ }
+ }
+
$.when(pmInventories.addSubHosts(inventory_id, hosts_ids)).done(function()
{
// Добавление групп и вложенных в них хостов
spajs.ajax.Call({
- url: "/api/v1/_bulk/",
+ url: hostname + "/api/v1/_bulk/",
type: "POST",
contentType:'application/json',
data:JSON.stringify(bulkdata),
@@ -607,6 +1902,15 @@ pmInventories.importInventory = function(inventory)
var igroups_ids = []
var bulk_update = []
var hasError = false;
+ for(var i in pmInventories.model.importedInventories.inventory.groups)
+ {
+ //собираем в igroups_ids группы, которые существовали в системе ранее
+ if(pmInventories.model.importedInventories.inventory.groups[i].id)
+ {
+ //igroups_ids - массив с id групп, которые будут добавлены в инвенторий в качестве subitems
+ igroups_ids.push(+pmInventories.model.importedInventories.inventory.groups[i].id);
+ }
+ }
for(var i in data)
{
deleteBulk.push({
@@ -631,7 +1935,7 @@ pmInventories.importInventory = function(inventory)
{
if(inventory.groups[val.data.name].groups.length)
{
- // Добавление подгрупп
+ // Добавление подгрупп
var groups_ids = []
for(var j in inventory.groups[val.data.name].groups)
{
@@ -644,6 +1948,16 @@ pmInventories.importInventory = function(inventory)
break;
}
}
+
+ //добавляем подгруппы, которые являются созданными ранее группами
+ for(var l in pmInventories.model.importedInventories.inventory.groups)
+ {
+ if(l==inventory.groups[val.data.name].groups[j] && pmInventories.model.importedInventories.inventory.groups[l].id)
+ {
+ groups_ids.push(pmInventories.model.importedInventories.inventory.groups[l].id);
+ }
+ }
+
}
bulk_update.push({
type: "mod",
@@ -657,6 +1971,7 @@ pmInventories.importInventory = function(inventory)
}
else
{
+ // Это хост
if(inventory.groups[val.data.name].hosts.length)
{
// Добавление хостов
@@ -673,6 +1988,17 @@ pmInventories.importInventory = function(inventory)
}
}
}
+
+ for(var z in groups_with_just_added_hosts)
+ {
+ if(z==val.data.name){
+ for(var y in groups_with_just_added_hosts[z])
+ {
+ hosts_ids.push(groups_with_just_added_hosts[z][y]);
+ }
+ }
+ }
+
bulk_update.push({
type: "mod",
item:'group',
@@ -684,16 +2010,12 @@ pmInventories.importInventory = function(inventory)
}
}
}
- else
- {
- // Это хост
- }
}
if(hasError)
{
// По меньшей мере в одной операции была ошибка вставки.
- // Инвенторий импортирован не полностью
+ // Инвенторий импортирован не полностью
def.reject(deleteBulk);
return;
}
@@ -703,7 +2025,7 @@ pmInventories.importInventory = function(inventory)
if(bulk_update.length)
{
spajs.ajax.Call({
- url: "/api/v1/_bulk/",
+ url: hostname + "/api/v1/_bulk/",
type: "POST",
contentType:'application/json',
data:JSON.stringify(bulk_update),
@@ -724,7 +2046,7 @@ pmInventories.importInventory = function(inventory)
if(hasError)
{
// По меньшей мере в одной операции была ошибка обновления.
- // Инвенторий импортирован не полностью
+ // Инвенторий импортирован не полностью
def.reject(deleteBulk);
return;
}
@@ -782,7 +2104,7 @@ pmInventories.importInventory = function(inventory)
}).fail(function(delete_bulk)
{
$.when(spajs.ajax.Call({
- url: "/api/v1/_bulk/",
+ url: hostname + "/api/v1/_bulk/",
type: "POST",
contentType:'application/json',
data:JSON.stringify(delete_bulk),
@@ -831,7 +2153,7 @@ pmInventories.copyItem = function(item_id)
$.when(encryptedCopyModal.replace(data)).done(function(data)
{
spajs.ajax.Call({
- url: "/api/v1/"+thisObj.model.name+"/",
+ url: hostname + "/api/v1/"+thisObj.model.name+"/",
type: "POST",
contentType:'application/json',
data: JSON.stringify(data),
@@ -900,13 +2222,11 @@ pmInventories.model.page_list = {
],
actions:[
{
- class:'btn btn-danger',
function:function(item){ return 'spajs.showLoader('+this.model.className+'.deleteItem('+item.id+')); return false;'},
title:'Delete',
link:function(){ return '#'}
},
{
- class:'btn btn-default',
function:function(item){ return '';},
title:'Create sub group',
link:function(item)
@@ -915,7 +2235,6 @@ pmInventories.model.page_list = {
},
},
{
- class:'btn btn-default',
function:function(item){ return '';},
title:'Create sub host',
link:function(item)
@@ -941,6 +2260,14 @@ pmInventories.model.page_new = {
},
fast_validator:filedsLib.validator.notEmpty
},
+ ],
+ [
+ {
+ filed: new filedsLib.filed.textarea(),
+ title:'Notes',
+ name:'notes',
+ placeholder:'Not required field, just for your notes'
+ },
]
],
sections:[
@@ -1033,6 +2360,14 @@ pmInventories.model.page_item = {
},
fast_validator:function(value){ return value != '' && value}
},
+ ],
+ [
+ {
+ filed: new filedsLib.filed.textarea(),
+ title:'Notes',
+ name:'notes',
+ placeholder:'Not required field, just for your notes'
+ },
]
],
onUpdate:function(result)
@@ -1171,7 +2506,7 @@ pmInventories.setSubGroups = function(item_id, groups_ids)
}
return spajs.ajax.Call({
- url: "/api/v1/inventories/"+item_id+"/groups/",
+ url: hostname + "/api/v1/inventories/"+item_id+"/groups/",
type: "PUT",
contentType:'application/json',
data:JSON.stringify(groups_ids),
@@ -1210,7 +2545,7 @@ pmInventories.setSubHosts = function(item_id, hosts_ids)
}
return spajs.ajax.Call({
- url: "/api/v1/inventories/"+item_id+"/hosts/",
+ url: hostname + "/api/v1/inventories/"+item_id+"/hosts/",
type: "PUT",
contentType:'application/json',
data:JSON.stringify(hosts_ids),
@@ -1245,7 +2580,7 @@ pmInventories.addSubGroups = function(item_id, groups_ids)
var def = new $.Deferred();
spajs.ajax.Call({
- url: "/api/v1/inventories/"+item_id+"/groups/",
+ url: hostname + "/api/v1/inventories/"+item_id+"/groups/",
type: "POST",
contentType:'application/json',
data:JSON.stringify(groups_ids),
@@ -1302,7 +2637,7 @@ pmInventories.addSubHosts = function(item_id, hosts_ids)
}
spajs.ajax.Call({
- url: "/api/v1/inventories/"+item_id+"/hosts/",
+ url: hostname + "/api/v1/inventories/"+item_id+"/hosts/",
type: "POST",
contentType:'application/json',
data:JSON.stringify(hosts_ids),
@@ -1440,12 +2775,6 @@ tabSignal.connect("polemarch.start", function()
onOpen:function(holder, menuInfo, data){return pmInventories.showItem(holder, menuInfo, data);}
})
- spajs.addMenu({
- id:"inventory-history",
- urlregexp:[/^inventory\/([0-9]+)\/history$/, /^inventory\/([0-9]+)\/history\/page\/([0-9]+)$/],
- onOpen:function(holder, menuInfo, data){return pmHistory.showListInInventory(holder, menuInfo, data);}
- })
-
spajs.addMenu({
id:"newInventory",
urlregexp:[/^new-inventory$/, /^([A-z0-9_]+)\/([0-9]+)\/new-inventory$/],
diff --git a/polemarch/static/js/pmItems.js b/polemarch/static/js/pmItems.js
index e6ffdd2c..8d23240b 100644
--- a/polemarch/static/js/pmItems.js
+++ b/polemarch/static/js/pmItems.js
@@ -156,6 +156,7 @@ pmItems.validateRangeName = function (name)
*/
pmItems.showList = function (holder, menuInfo, data)
{
+ setActiveMenuLi();
var thisObj = this;
var offset = 0
var limit = this.pageSize;
@@ -271,7 +272,7 @@ pmItems.copyItem = function (item_id)
$.when(encryptedCopyModal.replace(data)).done(function (data)
{
spajs.ajax.Call({
- url: "/api/v1/" + thisObj.model.name + "/",
+ url: hostname + "/api/v1/" + thisObj.model.name + "/",
type: "POST",
contentType: 'application/json',
data: JSON.stringify(data),
@@ -302,7 +303,7 @@ pmItems.importItem = function (data)
var thisObj = this;
spajs.ajax.Call({
- url: "/api/v1/" + thisObj.model.name + "/",
+ url: hostname + "/api/v1/" + thisObj.model.name + "/",
type: "POST",
contentType: 'application/json',
data: JSON.stringify(data),
@@ -344,6 +345,7 @@ pmItems.copyAndEdit = function (item_id)
pmItems.showItem = function (holder, menuInfo, data)
{
+ setActiveMenuLi();
var thisObj = this;
//console.log(menuInfo, data)
@@ -364,6 +366,7 @@ pmItems.showItem = function (holder, menuInfo, data)
pmItems.showNewItemPage = function (holder, menuInfo, data)
{
+ setActiveMenuLi();
var def = new $.Deferred();
var tpl = this.model.name + '_new_page'
@@ -413,7 +416,7 @@ pmItems.loadItems = function (limit, offset)
var thisObj = this;
return spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/",
+ url: hostname + "/api/v1/" + this.model.name + "/",
type: "GET",
contentType: 'application/json',
data: "limit=" + encodeURIComponent(limit) + "&offset=" + encodeURIComponent(offset),
@@ -523,7 +526,7 @@ pmItems.sendSearchQuery = function (query, limit, offset, ordering)
var thisObj = this;
return spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/?" + q.join("&"),
+ url: hostname + "/api/v1/" + this.model.name + "/?" + q.join("&"),
type: "GET",
contentType: 'application/json',
success: function (data)
@@ -591,7 +594,7 @@ pmItems.loadItem = function (item_id)
}
spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/" + item_id + "/",
+ url: hostname + "/api/v1/" + this.model.name + "/" + item_id + "/",
type: "GET",
contentType: 'application/json',
data: "",
@@ -680,7 +683,7 @@ pmItems.deleteRows = function (elements)
var thisObj = this;
return $.when(spajs.ajax.Call({
- url: "/api/v1/_bulk/",
+ url: hostname + "/api/v1/_bulk/",
type: "POST",
contentType: 'application/json',
data: JSON.stringify(deleteBulk)
@@ -723,7 +726,7 @@ pmItems.deleteSelected = function ()
}
return $.when(spajs.ajax.Call({
- url: "/api/v1/_bulk/",
+ url: hostname + "/api/v1/_bulk/",
type: "POST",
contentType: 'application/json',
data: JSON.stringify(deleteBulk)
@@ -788,7 +791,7 @@ pmItems.deleteItemQuery = function (item_id)
this.toggleSelect(item_id, false);
return spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/" + item_id + "/",
+ url: hostname + "/api/v1/" + this.model.name + "/" + item_id + "/",
type: "DELETE",
contentType: 'application/json',
success: function (data)
@@ -939,7 +942,7 @@ pmItems.addItem = function (parent_type, parent_item, opt)
var thisObj = this;
spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/",
+ url: hostname + "/api/v1/" + this.model.name + "/",
type: "POST",
contentType: 'application/json',
data: JSON.stringify(data),
@@ -1001,7 +1004,7 @@ pmItems.updateItem = function (item_id, opt)
var thisObj = this;
spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/" + item_id + "/",
+ url: hostname + "/api/v1/" + this.model.name + "/" + item_id + "/",
type: "PATCH",
contentType: 'application/json',
data: JSON.stringify(data),
@@ -1009,6 +1012,7 @@ pmItems.updateItem = function (item_id, opt)
{
thisObj.model.items[item_id] = data
$.when(thisObj.model.page_item.onUpdate.apply(thisObj, arguments)).always(function () {
+ $.notify("Changes in "+thisObj.model.name+" were successfully saved", "success");
def.resolve()
})
},
@@ -1071,4 +1075,4 @@ pmItems.checkSubItemsAndAdd=function(thisObj, ObjToAdd, data, itemId, itemType,
}
}
debugger;
- }*/
\ No newline at end of file
+ }*/
diff --git a/polemarch/static/js/pmModuleTemplates.js b/polemarch/static/js/pmModuleTemplates.js
index 82a898e3..82f55da8 100644
--- a/polemarch/static/js/pmModuleTemplates.js
+++ b/polemarch/static/js/pmModuleTemplates.js
@@ -91,6 +91,13 @@ pmModuleTemplates.model.page_item = {
link:function(){ return '#'},
help:'Create new option'
},
+ {
+ class:'btn btn-info',
+ function:function(){ return 'return spajs.openURL(this.href);'},
+ title:'History',
+ link:function(item_id){ return polemarch.opt.host +'/?template/'+this.model.kind+'/'+ item_id + '/history'},
+ help:'Template execution history'
+ },
{
class:'btn btn-default copy-btn',
function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.copyAndEdit('+item_id+')); return false;'},
@@ -131,11 +138,20 @@ pmModuleTemplates.model.page_item = {
},
fast_validator:function(value){ return value != '' && value}
},
- ],[
+ ],
+ [
{
filed: new pmModuleTemplates.filed.selectProjectInventoryGroupAndModule(),
name:'inventory',
},
+ ],
+ [
+ {
+ filed: new filedsLib.filed.textarea(),
+ title:'Notes',
+ name:'notes',
+ placeholder:'Not required field, just for your notes'
+ },
]
],
onUpdate:function(result)
@@ -163,7 +179,7 @@ pmModuleTemplates.model.page_item_new_option = {
buttons:[
{
class:'btn btn-primary',
- function:function(item_id){ return 'spajs.showLoader(pmModuleTemplates.saveOption('+item_id+')); return false;'},
+ function:function(item_id){ return 'spajs.showLoader(pmModuleTemplates.saveNewOption('+item_id+')); return false;'},
title:'Create',
link:function(){ return '#'},
}
@@ -280,11 +296,40 @@ pmModuleTemplates.saveAndExecute = function(item_id)
return def.promise()
}
+/**
+ *Функция открывает страницу для создания новой опции.
+ */
pmModuleTemplates.setNewOption = function(item_id)
{
return spajs.openURL(window.location.href+"/new-option");
}
+/**
+ *Функция сохраняет новую опцию.
+ */
+pmModuleTemplates.saveNewOption = function(item_id)
+{
+ var def = new $.Deferred();
+ var optionName=$('#filed_option_name').val();
+ optionName=optionName.trim();
+ optionName=optionName.replace( /\s/g, "-" );
+ var templateOptionList=this.model.items[item_id].options_list;
+ for (var i=0; i' + item.playbook + '
';
},
@@ -700,9 +834,9 @@ pmTasksTemplates.showNewItemPage = function(holder, menuInfo, data)
term = term.toLowerCase();
var matches = []
- for(var i in pmTasks.model.items)
+ for(var i in pmTasks.model.itemslist.results)
{
- var val = pmTasks.model.items[i]
+ var val=pmTasks.model.itemslist.results[i];
if(val.name.toLowerCase().indexOf(term) != -1 && thisObj.model.selectedProject == val.project)
{
matches.push(val)
@@ -714,6 +848,7 @@ pmTasksTemplates.showNewItemPage = function(holder, menuInfo, data)
}
}
});
+ pmTasksTemplates.selectProject($("#projects-autocomplete").val());
def.resolve();
}).fail(function(e)
@@ -753,9 +888,11 @@ pmTasksTemplates.addItem = function()
return def.promise();
}
+ data.notes=$("#filed_notes").val();
+
var thisObj = this;
spajs.ajax.Call({
- url: "/api/v1/templates/",
+ url: hostname + "/api/v1/templates/",
type: "POST",
contentType:'application/json',
data:JSON.stringify(data),
@@ -816,4 +953,4 @@ tabSignal.connect("polemarch.start", function()
onOpen:function(holder, menuInfo, data){return pmTasksTemplates.showOptionPage(holder, menuInfo, data);}
})
-})
\ No newline at end of file
+})
diff --git a/polemarch/static/js/pmTemplates.js b/polemarch/static/js/pmTemplates.js
index d56b0afb..2edc3470 100644
--- a/polemarch/static/js/pmTemplates.js
+++ b/polemarch/static/js/pmTemplates.js
@@ -48,7 +48,7 @@ pmTemplates.execute = function (item_id, option)
}
var def = new $.Deferred();
spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/" + item_id + "/execute/",
+ url: hostname + "/api/v1/" + this.model.name + "/" + item_id + "/execute/",
type: "POST",
data: JSON.stringify(option),
contentType: 'application/json',
@@ -100,7 +100,7 @@ pmTemplates.exportToFile = function (item_ids)
var thisObj = this;
spajs.ajax.Call({
- url: "/api/v1/" + this.model.name + "/filter/?detail=1",
+ url: hostname + "/api/v1/" + this.model.name + "/filter/?detail=1",
type: "POST",
contentType: 'application/json',
data: JSON.stringify(data),
@@ -191,7 +191,7 @@ pmTemplates.importFromFile = function (files_event, project_id)
console.log(bulkdata)
spajs.ajax.Call({
- url: "/api/v1/_bulk/",
+ url: hostname + "/api/v1/_bulk/",
type: "POST",
contentType: 'application/json',
data: JSON.stringify(bulkdata),
diff --git a/polemarch/static/js/pmUsers.js b/polemarch/static/js/pmUsers.js
index 176490d9..ab4418df 100644
--- a/polemarch/static/js/pmUsers.js
+++ b/polemarch/static/js/pmUsers.js
@@ -10,9 +10,9 @@ pmUsers.model.page_list = {
{
class:'btn btn-primary',
function:function(){ return "spajs.open({ menuId:'new-"+this.model.page_name+"'}); return false;"},
- title:'Create',
- link:function(){ return '/?new-'+this.model.page_name},
- },
+ title:'Create',
+ link:function(){ return '/?new-'+this.model.page_name},
+ },
],
title: "Users",
short_title: "Users",
@@ -20,25 +20,62 @@ pmUsers.model.page_list = {
{
title:'Name',
name:'username',
+ },
+ {
+ title:'Active',
+ name:'is_active',
+ style:function(item, opt){ return 'style="width: 80px"'},
+ class:function(item, opt)
+ {
+ if(!item || !item.id)
+ {
+ return 'class="hidden-xs hidden-sm"';
+ }
+
+ return 'class="hidden-xs hidden-sm user-status '+'user-status-'+item.id+ '"';
+ },
+ value:function(item, filed_name, opt){
+ if(this.model.items[item.id].is_active)
+ {
+ return ''
+ }
+ else
+ {
+ return '';
+ }
+ },
}
],
actions:[
{
- class:'btn btn-danger',
function:function(item){ return 'spajs.showLoader('+this.model.className+'.deleteItem('+item.id+')); return false;'},
title:'Delete',
link:function(){ return '#'}
- }
+ },
+ {
+ class:function(item){return 'change-activation-'+item.id;},
+ function:function(item){ return 'spajs.showLoader('+this.model.className+'.changeItemActivation('+item.id+')); return false;'},
+ title:function(item){
+ if(this.model.items[item.id].is_active==true)
+ {
+ return "Deactivate";
+ }
+ else {
+ return "Activate";
+ }
+ },
+ link:function(){ return '#'}
+ },
]
}
-
+
pmUsers.model.page_new = {
title: "New user",
short_title: "New user",
fileds:[
[
{
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'User name',
name:'username',
placeholder:'Enter user name',
@@ -49,7 +86,18 @@ pmUsers.model.page_new = {
fast_validator:function(value){ return value != '' && value}
},
{
- filed: new filedsLib.filed.password(),
+ filed: new filedsLib.filed.text(),
+ title:'Email',
+ name:'email',
+ placeholder:'Enter user email',
+ help:'',
+ }
+
+ ],
+
+ [
+ {
+ filed: new filedsLib.filed.password(),
title:'Password',
name:'password',
placeholder:'Enter user password',
@@ -59,86 +107,123 @@ pmUsers.model.page_new = {
},
fast_validator:function(value){ return value != '' && value}
},
- ],[
{
- filed: new filedsLib.filed.text(),
- title:'Email',
- name:'email',
- placeholder:'Enter user email',
+ filed: new filedsLib.filed.password(),
+ title:'Confirm password',
+ name:'confirm_password',
+ placeholder:'Enter user password again',
help:'',
- },
+ validator:function(value){
+ return filedsLib.validator.notEmpty(value, 'Confirm password')
+ },
+ fast_validator:function(value){ return value != '' && value}
+ }
+ ],
+
+ [
{
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'First name',
name:'first_name',
placeholder:'Enter user first name',
help:'',
},
- ],[
{
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'Last name',
name:'last_name',
placeholder:'Enter user last name',
help:'',
- },
+ }
+ ],[
{
- filed: new filedsLib.filed.boolean(),
+ filed: new filedsLib.filed.boolean(),
title:'Is active',
- name:'is_active',
+ name:'is_active',
default:true,
}
]
],
onBeforeSave:function(data, item_id)
{
- data.is_staff = true
- return data;
+ if(data.password == data.confirm_password)
+ {
+ data.is_staff = true
+ delete data.confirm_password;
+ return data;
+ }
+ else
+ {
+ $.notify("Confirm password value is not the same as password one", "error");
+ return false;
+ }
},
onCreate:function(result)
- {
+ {
var def = new $.Deferred();
$.notify("User created", "success");
$.when(spajs.open({ menuId:pmUsers.model.page_name+"/"+result.id})).always(function(){
def.resolve()
})
-
+
return def.promise();
}
}
-
+
pmUsers.model.page_item = {
buttons:[
{
class:'btn btn-primary',
function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.updateItem('+item_id+')); return false;'},
- title:'Save',
- link:function(){ return '#'},
- },
+ title:'Save',
+ link:function(){ return '#'},
+ },
+ {
+ class:'btn btn-info',
+ function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.openChangePasswordForm('+item_id+')); return false;'},
+ title:'Change password',
+ link:function(){ return '#'}
+ },
{
- class:'btn btn-default copy-btn',
- function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.copyAndEdit('+item_id+')); return false;'},
- title:'',
+ class:function(item_id){return 'btn btn-warning change-activation-'+item_id;},
+ function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.changeItemActivation('+item_id+')); return false;'},
+ title:function(item_id){
+ if(this.model.items[item_id].is_active==true)
+ {
+ return "Deactivate";
+ }
+ else {
+ return "Activate";
+ }
+ },
link:function(){ return '#'},
- help:'Copy'
+ help:function(item_id){
+ if(this.model.items[item_id].is_active==true)
+ {
+ return "Deactivate account";
+ }
+ else {
+ return "Activate account";
+ }
+ }
},
{
class:'btn btn-danger danger-right',
function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.deleteItem('+item_id+')); return false;'},
title:' Remove',
- link:function(){ return '#'},
+ link:function(){ return '#'},
},
],
- title: function(item_id){
+ title: function(item_id){
return "User "+pmUsers.model.items[item_id].justText('username')
},
- short_title: function(item_id){
+ short_title: function(item_id){
return "User "+pmUsers.model.items[item_id].justText('username', function(v){return v.slice(0, 20)})
},
fileds:[
[
{
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'User name',
name:'username',
placeholder:'Enter user name',
@@ -149,59 +234,160 @@ pmUsers.model.page_item = {
fast_validator:function(value){ return value != '' && value}
},
{
- filed: new filedsLib.filed.password(),
- title:'Password',
- name:'password',
- placeholder:'Enter user password',
- help:'',
- },
- ],[
- {
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'Email',
name:'email',
placeholder:'Enter user email',
help:'',
- },
+ }
+
+ ],[
+
{
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'First name',
name:'first_name',
placeholder:'Enter user first name',
help:'',
},
- ],[
{
- filed: new filedsLib.filed.text(),
+ filed: new filedsLib.filed.text(),
title:'Last name',
name:'last_name',
placeholder:'Enter user last name',
help:'',
+ }
+ ]
+ ],
+ onUpdate:function(result)
+ {
+ return true;
+ },
+ onBeforeSave:function(data, item_id)
+ {
+ if(!data.password)
+ {
+ delete data.password
+ }
+ data.is_staff = true
+
+ return data;
+ },
+}
+
+pmUsers.model.profile_page = {
+ buttons:[
+ {
+ class:'btn btn-primary',
+ function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.updateProfile('+item_id+')); return false;'},
+ title:'Save',
+ link:function(){ return '#'},
+ },
+ {
+ class:'btn btn-info',
+ function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.openChangePasswordForm('+item_id+')); return false;'},
+ title:'Change password',
+ link:function(){ return '#'}
+ },
+ {
+ class:function(item_id){return 'btn btn-warning change-activation-'+item_id;},
+ function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.changeItemActivation('+item_id+')); return false;'},
+ title:function(item_id){
+ if(this.model.items[item_id].is_active==true)
+ {
+ return "Deactivate";
+ }
+ else {
+ return "Activate";
+ }
+ },
+ link:function(){ return '#'},
+ help:function(item_id){
+ if(this.model.items[item_id].is_active==true)
+ {
+ return "Deactivate account";
+ }
+ else {
+ return "Activate account";
+ }
+ }
+ },
+ {
+ class:'btn btn-danger danger-right',
+ function:function(item_id){ return 'spajs.showLoader('+this.model.className+'.deleteItem('+item_id+')); return false;'},
+ title:' Remove',
+ link:function(){ return '#'},
+ },
+ ],
+ title: function(item_id){
+ return pmUsers.model.items[item_id].justText('username').replace(/\b\w/g, function(l){ return l.toUpperCase() }) + " profile";
+ },
+ short_title: function(item_id){
+ return pmUsers.model.items[item_id].justText('username', function(v){return v.slice(0, 20)}).replace(/\b\w/g, function(l){ return l.toUpperCase() }) + " profile";
+ },
+ fileds:[
+ [
+ {
+ filed: new filedsLib.filed.text(),
+ title:'User name',
+ name:'username',
+ placeholder:'Enter user name',
+ help:'',
+ validator:function(value){
+ return filedsLib.validator.notEmpty(value, 'Name')
+ },
+ fast_validator:function(value){ return value != '' && value}
},
{
- filed: new filedsLib.filed.boolean(),
- title:'Is active',
- name:'is_active',
+ filed: new filedsLib.filed.text(),
+ title:'Email',
+ name:'email',
+ placeholder:'Enter user email',
+ help:'',
+ }
+
+ ],[
+
+ {
+ filed: new filedsLib.filed.text(),
+ title:'First name',
+ name:'first_name',
+ placeholder:'Enter user first name',
+ help:'',
+ },
+ {
+ filed: new filedsLib.filed.text(),
+ title:'Last name',
+ name:'last_name',
+ placeholder:'Enter user last name',
+ help:'',
}
]
],
+ sections:[
+ function(){
+ return spajs.just.render("WidgetsSettingsFromProfile");
+ }
+ ],
onUpdate:function(result)
- {
+ {
return true;
},
onBeforeSave:function(data, item_id)
- {
+ {
if(!data.password)
{
- delete data.password
+ delete data.password
}
data.is_staff = true
return data;
},
}
-
-
+
+/**
+ *Функиця создает копию пользователя.
+ */
pmUsers.copyItem = function(item_id)
{
var def = new $.Deferred();
@@ -212,15 +398,15 @@ pmUsers.copyItem = function(item_id)
var data = thisObj.model.items[item_id];
delete data.id;
data.username = "copy-from-" + data.username
-
+
$.when(encryptedCopyModal.replace(data)).done(function(data)
{
spajs.ajax.Call({
- url: "/api/v1/"+thisObj.model.name+"/",
+ url: hostname + "/api/v1/"+thisObj.model.name+"/",
type: "POST",
contentType:'application/json',
data: JSON.stringify(data),
- success: function(data)
+ success: function(data)
{
thisObj.model.items[data.id] = data
def.resolve(data.id)
@@ -233,7 +419,7 @@ pmUsers.copyItem = function(item_id)
}).fail(function(e)
{
def.reject(e)
- })
+ })
}).fail(function(e)
{
def.reject(e)
@@ -243,9 +429,229 @@ pmUsers.copyItem = function(item_id)
return def.promise();
}
-
- tabSignal.connect("polemarch.start", function()
- {
+/**
+ *Данная функция в зависимости от текущего статуса пользователя
+ *вызывает функцию активации/деактивации пользователя соответственно.
+ */
+pmUsers.changeItemActivation = function(item_id) {
+ if(pmUsers.model.items[item_id].is_active==true)
+ {
+ return pmUsers.deactivateItem(item_id);
+ }
+ else
+ {
+ return pmUsers.activateItem(item_id);
+ }
+}
+
+/**
+ *Функция деактивирует пользователя, переводя значение поля is_active из true в false.
+ */
+pmUsers.deactivateItem = function(item_id, force) {
+ var thisObj = this;
+ var def = new $.Deferred();
+ if (!force && !confirm("Are you sure, that you want to deactivate this account? Only superuser will be able to activate it again."))
+ {
+ def.reject();
+ return def.promise()
+ }
+ var data={ "is_active": false }
+ spajs.ajax.Call({
+ url: hostname + "/api/v1/"+thisObj.model.name+"/"+item_id+"/",
+ type: "PATCH",
+ contentType:'application/json',
+ data: JSON.stringify(data),
+ success: function(data)
+ {
+ if(my_user_id==item_id)
+ {
+ spajs.openURL(window.location.protocol+"//"+window.location.host);
+ }
+ else {
+ $.notify("Account was deactivated", "success");
+ pmUsers.model.items[item_id].is_active=!pmUsers.model.items[item_id].is_active;
+ var t=$(".change-activation-"+item_id)[0];
+ $(t).html("Activate");
+ $(t).attr("title", "Activate account");
+ var s=$(".user-status-"+item_id)[0];
+ $(s).html("");
+ }
+ def.resolve()
+ },
+ error:function(e)
+ {
+ if(e.status==403)
+ {
+ $.notify("You do not have permission to perform this action.", "error");
+ }
+ def.reject(e)
+ }
+ });
+
+ return def.promise();
+}
+
+/**
+ *Функция активирует пользователя, переводя значение поля is_active из false в true.
+ */
+pmUsers.activateItem = function(item_id, force) {
+ var thisObj = this;
+ var def = new $.Deferred();
+ var data={ "is_active": true }
+ spajs.ajax.Call({
+ url: hostname + "/api/v1/"+thisObj.model.name+"/"+item_id+"/",
+ type: "PATCH",
+ contentType:'application/json',
+ data: JSON.stringify(data),
+ success: function(data)
+ {
+ $.notify("Account was activated", "success");
+ pmUsers.model.items[item_id].is_active=!pmUsers.model.items[item_id].is_active;
+ var t=$(".change-activation-"+item_id)[0];
+ $(t).html("Deactivate");
+ $(t).attr("title", "Deactivate account");
+ var s=$(".user-status-"+item_id)[0];
+ $(s).html('');
+ def.resolve()
+ },
+ error:function(e)
+ {
+ if(e.status==403)
+ {
+ $.notify("You do not have permission to perform this action.", "error");
+ }
+ def.reject(e)
+ }
+ });
+
+ return def.promise();
+}
+
+/**
+ *Функция открывает модальное окно с формой для изменения пароля.
+ */
+pmUsers.openChangePasswordForm = function(item_id)
+{
+ if($('div').is('#change_password_form'))
+ {
+ $('#change_password_form').empty();
+ $('#change_password_form').html(pmUsers.renderModalWindow(item_id));
+ $("#change_password_form").modal('show');
+ }
+ else
+ {
+ var t=$(".content")[0];
+ $('', { id: "change_password_form", class: "modal fade in"}).appendTo(t);
+ $('#change_password_form').html(pmUsers.renderModalWindow(item_id));
+ $("#change_password_form").modal('show');
+ }
+}
+
+/**
+ *Функция рендинга модального окна для смены пароля пользователя.
+ */
+pmUsers.renderModalWindow = function(item_id)
+{
+ var html=spajs.just.render('change_password_form', {item_id: item_id});
+ return html;
+}
+
+/**
+ *Функция смены пароля пользователя: пользователь вводит новый ароль дважды, чтобы исключить вероятность опечатки.
+ *Если оба введенных значения идентичны друг другу, то новый пароль сохраняется.
+ *В противном случае выводится сообщение об ошибке.
+ */
+pmUsers.changePassword = function(item_id)
+{
+ var thisObj = this;
+ var def = new $.Deferred();
+ var newPassword1 = $("#new_password").val();
+ var newPassword2 = $("#new_password_confirm").val();
+ if(newPassword1==newPassword2 && newPassword1==""){
+ $.notify("Form is empty", "error");
+ def.resolve();
+ return def.promise();
+ }
+ if(newPassword1==newPassword2 && newPassword1!="")
+ {
+ var data={"password": newPassword1};
+ spajs.ajax.Call({
+ url: hostname + "/api/v1/"+thisObj.model.name+"/"+item_id+"/",
+ type: "PATCH",
+ contentType:'application/json',
+ data: JSON.stringify(data),
+ success: function(data)
+ {
+
+ if(my_user_id==item_id)
+ {
+ return $.when(hidemodal(), $("#change_password_form").modal('hide')).done(function(){
+ def.resolve();
+ return spajs.openURL("/");
+ }).promise();
+ }
+ else
+ {
+ $.notify("Password was successfully changed", "success");
+ $("#change_password_form").modal('hide');
+ def.resolve();
+ }
+
+ },
+ error:function(e)
+ {
+ def.reject(e)
+ }
+ });
+ }
+ else
+ {
+ $.notify("Confirm password value is not the same as new password one", "error");
+ def.reject();
+ }
+ return def.promise();
+}
+
+/**
+ *Функция, открывающая страницу с профайлом пользователя.
+ */
+pmUsers.showProfile = function (holder, menuInfo, data)
+{
+ setActiveMenuLi();
+ var thisObj = this;
+ //console.log(menuInfo, data)
+
+ return $.when(pmDashboard.getUserWidgetSettingsFromAPI(), this.loadItem(data.reg[1])).done(function ()
+ {
+ var tpl = "profile_page"
+ if (!spajs.just.isTplExists(tpl))
+ {
+ tpl = 'items_page'
+ }
+
+ $(holder).insertTpl(spajs.just.render(tpl, {item_id: data.reg[1], pmObj: thisObj, opt: {}}))
+ }).fail(function ()
+ {
+ $.notify("", "error");
+ }).promise()
+}
+
+/**
+ *Функция, сохраняющая все настройки профиля пользоваетля.
+ */
+pmUsers.updateProfile = function (item_id) {
+ return $.when(pmUsers.updateItem(item_id), pmDashboard.saveWigdetsOptionsFromProfile()).done(function ()
+ {
+ $.notify("Profile was successfully updated", "success");
+ }).fail(function ()
+ {
+ $.notify("Profile was not updated", "error");
+ }).promise()
+}
+
+
+tabSignal.connect("polemarch.start", function()
+{
// users
spajs.addMenu({
id:"users",
@@ -271,4 +677,10 @@ pmUsers.copyItem = function(item_id)
onOpen:function(holder, menuInfo, data){return pmUsers.showNewItemPage(holder, menuInfo, data);}
})
- })
+ spajs.addMenu({
+ id:"profile",
+ urlregexp:[/^profile\/([0-9]+)$/],
+ onOpen:function(holder, menuInfo, data){return pmUsers.showProfile(holder, menuInfo, data);}
+ })
+
+})
diff --git a/polemarch/static/js/polemarch.js b/polemarch/static/js/polemarch.js
index 1cc58a2c..fba8bdcf 100644
--- a/polemarch/static/js/polemarch.js
+++ b/polemarch/static/js/polemarch.js
@@ -204,3 +204,23 @@ spajs.errorPage = function(holder, menuInfo, data, error_data)
$(holder).insertTpl(spajs.just.render("errorPage", {error:error, data:data, menuInfo:menuInfo}))
}
+
+
+
+tabSignal.connect("loading.completed", function()
+{
+ var just = new JUST({
+ root : {
+ 'app-body-gui':$("script[data-just=app-body-gui]").html()
+ }
+ });
+
+ $("body").appendTpl(just.render('app-body-gui', {}))
+
+ polemarch.start({
+ is_superuser:window.is_superuser,
+ holder:'#spajs-body'
+ })
+
+ hideLoadingProgress();
+})
\ No newline at end of file
diff --git a/polemarch/static/js/tests/phantomjs/injectTest.js b/polemarch/static/js/tests/phantomjs/injectTest.js
index 0973bd0b..fd2aa2e7 100644
--- a/polemarch/static/js/tests/phantomjs/injectTest.js
+++ b/polemarch/static/js/tests/phantomjs/injectTest.js
@@ -156,7 +156,7 @@ function startTest()
console.log("Тест формы авторизации шаг 2");
spajs.ajax.Call({
- url: "/api/v1/users/",
+ url: hostname + "/api/v1/users/",
type: "GET",
contentType:'application/json',
data: "",
diff --git a/polemarch/static/js/tests/qUnitTest.js b/polemarch/static/js/tests/qUnitTest.js
index cb9f497c..6a6d7702 100644
--- a/polemarch/static/js/tests/qUnitTest.js
+++ b/polemarch/static/js/tests/qUnitTest.js
@@ -211,7 +211,7 @@ function render(name, callback)
var def = new $.Deferred();
var time = 4
- setTimeout(function(name){
+ setTimeout(function(name){
setTimeout(function(){
if(callback)
@@ -235,9 +235,9 @@ function saveReport()
/**
* В этом массиве должны быть qunit тесты для приложения
- */
+ */
window.qunitTestsArray = []
-
+
/**
* Вставляет Qunit и запускает выполнение тестов.
*/
@@ -276,7 +276,7 @@ function injectQunit()
"Skipped": details.skipped,
"Runtime": details.runtime
};
-
+
if(!syncQUnit.nextTest())
{
saveReport()
@@ -345,25 +345,25 @@ window.qunitTestsArray.push({
assert.equal(trim(' x y '), 'x y', 'Табы и пробелы внутри строки не трогаем');
render(done);
- });
-
+ });
+
syncQUnit.addTest('trim', function ( assert ) {
var done = assert.async();
-
+
var stringArr = [
"abc",
"A \" A",
"A ' \\ \\\\ \t \\ \ g \" ' \' ",
'"',
- 'a"b\' g \" \t \ \\ \\\ c',
+ 'a"b\' g \" \t \ \\ \\\ c',
' \' \\ " \t \r \b \e \c \d \n' ,
];
for(var i in stringArr)
{
- assert.equal(stripslashes(addslashes(stringArr[i])), stringArr[i], "i:"+stringArr[i]);
+ assert.equal(stripslashes(addslashes(stringArr[i])), stringArr[i], "i:"+stringArr[i]);
}
render(done);
- });
+ });
}})
/**
@@ -376,63 +376,63 @@ window.qunitTestsArray.push({
syncQUnit.addTest('crontabEditor', function ( assert )
{
var done = assert.async();
-
+
var cronString = "1 * * * *"
-
- crontabEditor.parseCronString(undefined)
+
+ crontabEditor.parseCronString(undefined)
assert.ok(cronString != crontabEditor.getCronString(), 'getCronString');
-
- crontabEditor.parseCronString("1 5")
+
+ crontabEditor.parseCronString("1 5")
assert.ok(cronString != crontabEditor.getCronString(), 'getCronString');
-
+
crontabEditor.parseCronString(cronString)
assert.ok(cronString == crontabEditor.getCronString(), 'getCronString');
-
+
cronString = "1 1 1 1 1"
- crontabEditor.parseCronString(cronString)
+ crontabEditor.parseCronString(cronString)
assert.ok("1 1 1 1 1" == crontabEditor.getCronString(), 'getCronString');
-
+
crontabEditor.setDaysOfWeek("1-2")
assert.ok("1 1 1 1 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+
crontabEditor.setMonths("1-2")
assert.ok("1 1 1 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+
crontabEditor.setDayOfMonth("1-2")
assert.ok("1 1 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+
crontabEditor.setHours("1-2")
assert.ok("1 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+
crontabEditor.setMinutes("1-2")
- assert.ok("1,2 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("1,2 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,7")
- assert.ok("1,2,7 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("1,2,7 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,*/7")
- assert.ok("*/7,1,2 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("*/7,1,2 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,3,4,*/7")
- assert.ok("*/7,1-4 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("*/7,1-4 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,3,4,*/7,45-51")
- assert.ok("*/7,1-4,45-48,50,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("*/7,1-4,45-48,50,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,3,4,*/7,45-51,17-30/2")
- assert.ok("*/7,*/23,*/25,1-4,17,19,27,29,45,47,48,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("*/7,*/23,*/25,1-4,17,19,27,29,45,47,48,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,3,4,*/7,45-51,17-380/2")
- assert.ok("0-4,7,14,17,19,21,23,25,27-29,31,33,35,37,39,41-43,45-51,53,55-57,59 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("0-4,7,14,17,19,21,23,25,27-29,31,33,35,37,39,41-43,45-51,53,55-57,59 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,3,4,*/7,45-51,170-38/2")
- assert.ok("*/7,*/12,*/16,1-4,6,8,10,18,20,22,26,30,34,38,45-47,50,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("*/7,*/12,*/16,1-4,6,8,10,18,20,22,26,30,34,38,45-47,50,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
crontabEditor.setMinutes("1,2,3,4,5/5,45-51,170-38/2")
- assert.ok("*/5,*/12,*/16,1-4,6,8,14,18,22,26,28,34,38,46,47,49,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
-
+ assert.ok("*/5,*/12,*/16,1-4,6,8,14,18,22,26,28,34,38,46,47,49,51 1,2 1,2 1,2 1,2" == crontabEditor.getCronString(), 'getCronString');
+
render(done)
- });
+ });
}})
/**
@@ -459,11 +459,11 @@ window.qunitTestsArray.push({
});
syncQUnit.addTest('Страница списка пользователей toggleSelectEachItem', function ( assert )
- {
+ {
var done = assert.async();
-
- pmUsers.toggleSelectAll($('.multiple-select tr'), true);
-
+
+ pmUsers.toggleSelectAll($('.multiple-select tr'), true);
+
$.when(pmUsers.toggleSelectEachItem(true)).done(function()
{
assert.ok(true, 'ok:toggleSelectEachItem');
@@ -475,7 +475,7 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Открытие страницы добавления пользователя', function ( assert )
{
var done = assert.async();
@@ -520,7 +520,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Создание пользователя с ошибкой 2', function ( assert )
{
// Предполагается что мы от прошлого теста попали на страницу создания пользователя
@@ -545,7 +545,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Создание пользователя', function ( assert )
{
// Предполагается что мы от прошлого теста попали на страницу создания пользователя
@@ -554,10 +554,11 @@ window.qunitTestsArray.push({
// Заполнение формы с данными пользователя
$("#filed_username").val("test-user-"+t);
$("#filed_password").val("test-user-"+t);
+ $("#filed_confirm_password").val("test-user-"+t);
$("#filed_email").val("test2@user.ru");
$("#filed_first_name").val("test");
$("#filed_last_name").val("user");
-
+
// Отправка формы с данными пользователя
$.when(pmUsers.addItem()).done(function()
{
@@ -581,11 +582,10 @@ window.qunitTestsArray.push({
userId = /user\/([0-9]+)/.exec(window.location.href)[1]
$("#filed_username").val("admin");
- $("#filed_password").val("test2-user-"+t);
$("#filed_email").val("test2@user.ru");
$("#filed_first_name").val("test2-"+t);
$("#filed_last_name").val("user2-"+t);
-
+
$.when(pmUsers.updateItem(userId)).done(function()
{
debugger;
@@ -600,13 +600,12 @@ window.qunitTestsArray.push({
syncQUnit.addTest('Изменение пользователя', function ( assert )
{
var done = assert.async();
-
+
// Предполагается что мы от прошлого теста попали на страницу редактирования пользователя
// с адресом http://192.168.0.12:8080/?user-5
userId = /user\/([0-9]+)/.exec(window.location.href)[1]
$("#filed_username").val("test2-user-"+t);
- $("#filed_password").val("test2-user-"+t);
$("#filed_email").val("test2@user.ru");
$("#filed_first_name").val("test2-"+t);
$("#filed_last_name").val("user2-"+t);
@@ -623,9 +622,10 @@ window.qunitTestsArray.push({
})
});
+ /*
syncQUnit.addTest('Копирование пользователя с ошибкой', function ( assert )
{
- var done = assert.async();
+ var done = assert.async();
$.when(pmUsers.copyAndEdit(999999)).done(function()
{
debugger;
@@ -635,10 +635,10 @@ window.qunitTestsArray.push({
assert.ok(true, 'Ошибка при copyAndEdit add Item, как и задумано');
render(done)
})
- });
-
+ });
+
syncQUnit.addTest('Копирование пользователя', function ( assert )
- {
+ {
var done = assert.async();
$.when(pmUsers.copyAndEdit(userId)).done(function()
@@ -656,7 +656,7 @@ window.qunitTestsArray.push({
syncQUnit.addTest('Удаление копии пользователя с ошибкой', function ( assert )
{
var done = assert.async();
-
+
// Удаление пользователя.
$.when(pmUsers.deleteItem(999999, true)).done(function()
{
@@ -689,7 +689,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+ */
syncQUnit.addTest('Удаление пользователя', function ( assert )
{
var done = assert.async();
@@ -767,14 +767,14 @@ window.qunitTestsArray.push({
var t = new Date();
t = t.getTime()
-
+
syncQUnit.addTest('Создание хоста', function ( assert )
{
// Предполагается что мы от прошлого теста попали на страницу создания хоста
var done = assert.async();
// Заполнение формы с данными хоста
- $("#filed_name").val("test-host-"+t);
+ $("#filed_name").val("test-host-"+t);
$("#new_json_nameprefix").val("test1");
$("#new_json_valueprefix").val("val1");
@@ -947,7 +947,7 @@ window.qunitTestsArray.push({
t = t.getTime()
syncQUnit.addTest('Сохранение группы', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания группы
var done = assert.async();
@@ -1011,8 +1011,8 @@ window.qunitTestsArray.push({
// с адресом http://192.168.0.12:8080/?group-5
var itemId = /group\/([0-9]+)/.exec(window.location.href)[1]
-
- assert.ok(!pmGroups.hasGroups(itemId, 99999999999), 'pmGroups.hasGroups() вернула не тот результат');
+
+ assert.ok(!pmGroups.hasGroups(itemId, 99999999999), 'pmGroups.hasGroups() вернула не тот результат');
$.when(pmGroups.setSubGroups(itemId, [99999999999])).done(function()
{
@@ -1025,7 +1025,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Обновление группы setSubHosts', function ( assert )
{
var done = assert.async();
@@ -1034,7 +1034,7 @@ window.qunitTestsArray.push({
// с адресом http://192.168.0.12:8080/?group-5
var itemId = /group\/([0-9]+)/.exec(window.location.href)[1]
-
+
assert.ok(!pmGroups.hasHosts(itemId, 99999999999), 'pmGroups.hasHosts() вернула не тот результат');
$.when(pmGroups.setSubHosts(itemId, [99999999999])).done(function()
@@ -1055,7 +1055,7 @@ window.qunitTestsArray.push({
// Предполагается что мы от прошлого теста попали на страницу редактирования группы
// с адресом http://192.168.0.12:8080/?group-5
var itemId = /group\/([0-9]+)/.exec(window.location.href)[1]
-
+
$.when(pmGroups.showAddSubGroupsForm(itemId)).done(function()
{
assert.ok(true, 'Успешно showAddSubGroupsForm');
@@ -1067,7 +1067,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('pmGroups.showAddSubHostsForm', function ( assert )
{
var done = assert.async();
@@ -1075,7 +1075,7 @@ window.qunitTestsArray.push({
// Предполагается что мы от прошлого теста попали на страницу редактирования группы
// с адресом http://192.168.0.12:8080/?group-5
var itemId = /group\/([0-9]+)/.exec(window.location.href)[1]
-
+
$.when(pmGroups.showAddSubHostsForm(itemId)).done(function()
{
assert.ok(true, 'Успешно showAddSubHostsForm');
@@ -1087,7 +1087,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Открытие страницы создания подгруппы', function ( assert )
{
var done = assert.async();
@@ -1109,7 +1109,7 @@ window.qunitTestsArray.push({
})
});
- var itemId = undefined
+ var itemId = undefined
syncQUnit.addTest('Сохранение подгруппы', function ( assert )
{
// Предполагается что мы от прошлого теста попали на страницу создания группы
@@ -1125,10 +1125,10 @@ window.qunitTestsArray.push({
$("#new_json_nameprefix").val("test2");
$("#new_json_valueprefix").val("val2");
jsonEditor.jsonEditorAddVar();
-
+
var master_group_itemId = /group\/([0-9]+)/.exec(window.location.href)[1]
itemId = master_group_itemId
-
+
// Отправка формы с данными группы
$.when(pmGroups.addItem('group', master_group_itemId)).done(function()
{
@@ -1241,10 +1241,10 @@ window.qunitTestsArray.push({
render(done)
})
});
-
-
-
-
+
+
+
+
syncQUnit.addTest('Страница создания группы не children', function ( assert )
{
var done = assert.async();
@@ -1280,14 +1280,14 @@ window.qunitTestsArray.push({
$("#new_json_nameprefix").val("test4");
$("#new_json_valueprefix").val("val4");
jsonEditor.jsonEditorAddVar();
-
+
// Отправка формы с данными группы
$.when(pmGroups.addItem()).done(function()
{
assert.ok(true, 'Успешно group add Item');
render(done)
}).fail(function()
- {
+ {
debugger;
assert.ok(false, 'Ошибка при group add Item');
render(done)
@@ -1295,15 +1295,15 @@ window.qunitTestsArray.push({
});
syncQUnit.addTest('Обновление группы не children', function ( assert )
- {
+ {
var done = assert.async();
// Предполагается что мы от прошлого теста попали на страницу редактирования группы
// с адресом http://192.168.0.12:8080/?group-5
itemId = /group\/([0-9]+)/.exec(window.location.href)[1]
-
- assert.ok(!pmGroups.hasGroups(itemId, 99999999999), 'pmGroups.hasGroups() вернула не тот результат');
+
+ assert.ok(!pmGroups.hasGroups(itemId, 99999999999), 'pmGroups.hasGroups() вернула не тот результат');
$.when(pmGroups.setSubGroups(itemId, [99999999999])).done(function()
{
@@ -1315,10 +1315,10 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Обновление группы не children', function ( assert )
- {
- var done = assert.async();
+ {
+ var done = assert.async();
assert.ok(!pmGroups.hasHosts(itemId, 99999999999), 'pmGroups.hasHosts() вернула не тот результат');
$.when(pmGroups.setSubHosts(itemId, [99999999999])).done(function()
@@ -1347,10 +1347,10 @@ window.qunitTestsArray.push({
render(done)
})
});
-
-
-
-
+
+
+
+
}})
@@ -1394,7 +1394,7 @@ window.qunitTestsArray.push({
})
});
-
+
var t = new Date();
t = t.getTime()
@@ -1543,12 +1543,12 @@ window.qunitTestsArray.push({
// Предполагается что мы от прошлого теста попали на страницу редактирования группы
// с адресом http://192.168.0.12:8080/?group-5
var itemId = /inventory\/([0-9]+)/.exec(window.location.href)[1]
-
+
pmGroups.groupsAutocompleteMatcher("A", function(res){
- assert.ok(true, 'Успешно');
- }, itemId)
+ assert.ok(true, 'Успешно');
+ }, itemId)
});
-
+
syncQUnit.addTest('Удаление копии Inventory', function ( assert )
{
var done = assert.async();
@@ -1571,7 +1571,7 @@ window.qunitTestsArray.push({
syncQUnit.addTest('Страница списка inventory History', function ( assert )
{
- var done = assert.async();
+ var done = assert.async();
$.when(spajs.open({ menuId:'inventory/'+itemId+'/history'})).done(function()
{
assert.ok(true, 'Страница открылась');
@@ -1583,8 +1583,8 @@ window.qunitTestsArray.push({
render(done)
})
})
-
-
+
+
syncQUnit.addTest('Удаление inventory', function ( assert )
{
var done = assert.async();
@@ -1702,11 +1702,11 @@ os-controller-2.vst.lan ansible_host=10.20.0.8
})
});
- var etalon = {"hosts":[{"name":"1.2.3.[1:255]","type":"RANGE","vars":{}},{"name":"124.3.4.[44:55]","type":"RANGE","vars":{}},{"name":"124.3.5.[1:250]","type":"RANGE","vars":{"ansible_host":"10.20.0.2","ansible_user":"root","ansible_ssh_pass":"eadgbe","ansible_ssh_private_key_file":"/root/f.txt"}},{"name":"124.3.5.[1:251]","type":"RANGE","vars":{"ansible_host":"10.20.0.2","ansible_user":"root","ansible_ssh_pass":"eadgbe"}},{"name":"124.3.5.[1:252]","type":"RANGE","vars":{"ansible_host":"10.20.0.12","ansible_user":"r\"o\'ot","ansible_ssh_pass":"eadgbe"}}],"groups":{"git":{"vars":{},"groups":["ci","git-servers"],"hosts":[],"children":true,"dataLevel":{"level":2,"parents":["all","cloud","git"]}},"ci":{"vars":{},"groups":[],"hosts":[{"name":"git-ci-1","type":"HOST","vars":{"ansible_host":"172.16.1.13","ansible_ssh_private_key_file":"/root/f.txt"}},{"name":"git-ci-2","type":"HOST","vars":{"ansible_host":"172.16.1.14"}}],"dataLevel":{"level":3,"parents":["all","cloud","git","ci"]}},"git-servers":{"vars":{},"groups":[],"hosts":[{"name":"git.vst.lan","type":"HOST","vars":{}}],"dataLevel":{"level":3,"parents":["all","cloud","git","git-servers"]}},"cloud":{"vars":{},"groups":["git","services","test"],"hosts":[],"children":true,"dataLevel":{"level":1,"parents":["all","cloud"]}},"services":{"vars":{},"groups":[],"hosts":[{"name":"chat.vstconsulting.net","type":"HOST","vars":{"ansible_host":"172.16.1.16"}},{"name":"pipc.vst.lan","type":"HOST","vars":{}},{"name":"redmine.vst.lan","type":"HOST","vars":{}}],"dataLevel":{"level":2,"parents":["all","cloud","services"]}},"test":{"vars":{"ansible_ssh_private_key_file":"/root/f.txt"},"groups":[],"hosts":[{"name":"test.vst.lan","type":"HOST","vars":{"ansible_user":"centos"}},{"name":"test2.vst.lan","type":"HOST","vars":{"ansible_host":"172.16.1.26"}}],"dataLevel":{"level":2,"parents":["all","cloud","test"]}},"openstack":{"vars":{},"groups":[],"hosts":[{"name":"fuel.vst.lan","type":"HOST","vars":{"ansible_host":"10.20.0.2","ansible_user":"root","ansible_ssh_pass":"eadgbe"}},{"name":"os-compute-1.vst.lan","type":"HOST","vars":{"ansible_host":"10.20.0.9"}},{"name":"os-compute-2.vst.lan","type":"HOST","vars":{"ansible_host":"10.20.0.13","ansible_ssh_private_key_file":"/root/f.txt"}},{"name":"os-controller-1.vst.lan","type":"HOST","vars":{"ansible_host":"10.20.0.6"}},{"name":"os-controller-2.vst.lan","type":"HOST","vars":{"ansible_host":"10.20.0.8"}}],"dataLevel":{"level":1,"parents":["all","openstack"]}}},"vars":{"ansible_user":"grey","ansible_ssh_private_key_file":"/root/f.txt","ansible_ssh_extra_args":"-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"},"name":"inventory"}
+ var etalon = {"hosts":[{"name":"1.2.3.[1:255]","notes":"","type":"RANGE","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{}},{"name":"124.3.4.[44:55]","notes":"","type":"RANGE","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{}},{"name":"124.3.5.[1:250]","notes":"","type":"RANGE","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.2","ansible_user":"root","ansible_ssh_pass":"eadgbe","ansible_ssh_private_key_file":"/root/f.txt"}},{"name":"124.3.5.[1:251]","notes":"","type":"RANGE","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.2","ansible_user":"root","ansible_ssh_pass":"eadgbe"}},{"name":"124.3.5.[1:252]","notes":"","type":"RANGE","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.12","ansible_user":"r\"o'ot","ansible_ssh_pass":"eadgbe"}}],"groups":{"git":{"notes":"","vars":{},"groups":["ci","git-servers"],"hosts":[],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"children":true,"dataLevel":{"level":2,"parents":["all","cloud","git"]}},"ci":{"notes":"","vars":{},"groups":[],"hosts":[{"name":"git-ci-1","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"172.16.1.13","ansible_ssh_private_key_file":"/root/f.txt"}},{"name":"git-ci-2","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"172.16.1.14"}}],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"dataLevel":{"level":3,"parents":["all","cloud","git","ci"]}},"git-servers":{"notes":"","vars":{},"groups":[],"hosts":[{"name":"git.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{}}],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"dataLevel":{"level":3,"parents":["all","cloud","git","git-servers"]}},"cloud":{"notes":"","vars":{},"groups":["git","services","test"],"hosts":[],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"children":true,"dataLevel":{"level":1,"parents":["all","cloud"]}},"services":{"notes":"","vars":{},"groups":[],"hosts":[{"name":"chat.vstconsulting.net","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"172.16.1.16"}},{"name":"pipc.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{}},{"name":"redmine.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{}}],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"dataLevel":{"level":2,"parents":["all","cloud","services"]}},"test":{"notes":"","vars":{"ansible_ssh_private_key_file":"/root/f.txt"},"groups":[],"hosts":[{"name":"test.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_user":"centos"}},{"name":"test2.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"172.16.1.26"}}],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"dataLevel":{"level":2,"parents":["all","cloud","test"]}},"openstack":{"notes":"","vars":{},"groups":[],"hosts":[{"name":"fuel.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.2","ansible_user":"root","ansible_ssh_pass":"eadgbe"}},{"name":"os-compute-1.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.9"}},{"name":"os-compute-2.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.13","ansible_ssh_private_key_file":"/root/f.txt"}},{"name":"os-controller-1.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.6"}},{"name":"os-controller-2.vst.lan","notes":"","type":"HOST","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{"ansible_host":"10.20.0.8"}}],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"dataLevel":{"level":1,"parents":["all","openstack"]}}},"vars":{"ansible_user":"grey","ansible_ssh_private_key_file":"/root/f.txt","ansible_ssh_extra_args":"-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null"},"name":"inventory","notes":""}
var inventory = undefined;
syncQUnit.addTest('Парсинг inventory', function ( assert )
- {
+ {
var done = assert.async();
inventory = pmInventories.parseFromText(pmInventoriesText)
inventory.name = "inventory"
@@ -1715,19 +1715,19 @@ os-controller-2.vst.lan ansible_host=10.20.0.8
inventory:inventory,
text:pmInventoriesText
}
-
- var res = deepEqual(etalon, inventory)
+
+ var res = deepEqual(etalon, inventory)
assert.ok(res, 'Сравнение инвентория распарсенного и оригинального');
render(done)
});
-
+
syncQUnit.addTest('Импорт не валидного inventory 1', function ( assert )
- {
+ {
var done = assert.async();
-
+
$.when(spajs.open({ menuId:"inventories/import"})).done(function()
{
- assert.ok(true, 'Успешно открыто меню inventories/import');
+ assert.ok(true, 'Успешно открыто меню inventories/import');
$("#inventory_name").val("inventory")
$.when(pmInventories.importInventory(inventory)).done(function()
@@ -1736,7 +1736,7 @@ os-controller-2.vst.lan ansible_host=10.20.0.8
assert.ok(false, 'Успешно импортирован не валидный инвенторий (а это не правильно)');
render(done)
}).fail(function()
- {
+ {
assert.ok(true, 'Ошибка в импорте не валидного инвентория (как и задумано)');
render(done)
})
@@ -1745,33 +1745,32 @@ os-controller-2.vst.lan ansible_host=10.20.0.8
debugger;
assert.ok(false, 'Ошибка при открытиии меню inventories/import');
render(done)
- })
+ })
});
syncQUnit.addTest('Импорт валидного inventory', function ( assert )
- {
+ {
delete inventory.vars.ansible_ssh_private_key_file
for(var i in inventory.hosts)
- {
- delete inventory.hosts[i].vars.ansible_ssh_private_key_file
+ {
+ delete inventory.hosts[i].vars.ansible_ssh_private_key_file
}
for(var i in inventory.groups)
{
- delete inventory.groups[i].vars.ansible_ssh_private_key_file
+ delete inventory.groups[i].vars.ansible_ssh_private_key_file
for(var j in inventory.groups[i].hosts)
{
- delete inventory.groups[i].hosts[j].vars.ansible_ssh_private_key_file
+ delete inventory.groups[i].hosts[j].vars.ansible_ssh_private_key_file
}
}
-
var done = assert.async();
$("#inventory_name").val("inventory")
$.when(pmInventories.importInventory(inventory)).done(function()
{
- assert.ok(true, 'Успешно импортирован инвенторий');
+ assert.ok(true, 'Успешно импортирован инвенторий');
render(done)
}).fail(function()
- {
+ {
debugger;
assert.ok(false, 'Ошибка в импорте инвентория');
render(done)
@@ -1779,7 +1778,7 @@ os-controller-2.vst.lan ansible_host=10.20.0.8
});
syncQUnit.addTest('Импорт не валидного inventory', function ( assert )
- {
+ {
var done = assert.async();
inventory.groups["error group"] = {
"vars": {},
@@ -1787,15 +1786,15 @@ os-controller-2.vst.lan ansible_host=10.20.0.8
"hosts": [],
"children": true
}
-
- $("#inventory_name").val("inventory")
+
+ $("#inventory_name").val("inventory")
$.when(pmInventories.importInventory(inventory)).done(function()
- {
+ {
debugger;
assert.ok(false, 'Успешно импортирован инвенторий а должна быть ошибка');
render(done)
}).fail(function()
- {
+ {
assert.ok(true, 'Ошибка в импорте инвентория как и задумано');
render(done)
})
@@ -1810,43 +1809,15 @@ oxNzIuMTYuMS5bMzA6MzFdClt1bnVzdWFsXQpbc2VydmVyczp2YXJzXQphbnNpYmxlX3VzZXI9Y2Vud\
G9zCmFuc2libGVfc3NoX3ByaXZhdGVfa2V5X2ZpbGU9L2hvbWUvY2VwcmV1L2RlZmF1bHQucGVtCmFu\
c2libGVfYmVjb21lPXRydWU="
inventoryText = Base64.decode(inventoryText)
-
+
inventory = pmInventories.parseFromText(inventoryText)
- var etalon = {
- "hosts":[],
- "groups":{
- "servers":{
- "vars":{"ansible_user":"centos","ansible_ssh_private_key_file":"/home/cepreu/default.pem","ansible_become":"true"},
- "groups":["usual","unusual"],
- "hosts":[],
- "children":true,
- "dataLevel":{"level":1,"parents":["all","servers"]}
- },
- "usual":{
- "vars":{},
- "groups":[],
- "hosts":[
- {"name":"172.16.1.[30:31]","type":"RANGE","vars":{}}
- ],
- "dataLevel":{"level":2,"parents":["all","servers","usual"]}
- },
- "unusual":{
- "vars":{},
- "groups":[],
- "hosts":[],
- "dataLevel":{"level":2,"parents":["all","servers","unusual"]}
- }
- },
- "vars":{},
- "name":"inventory"
- }
-
+ var etalon = {"hosts":[],"groups":{"servers":{"notes":"","vars":{"ansible_user":"centos","ansible_ssh_private_key_file":"/home/cepreu/default.pem","ansible_become":"true"},"groups":["usual","unusual"],"hosts":[],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"children":true,"dataLevel":{"level":1,"parents":["all","servers"]}},"usual":{"notes":"","vars":{},"groups":[],"hosts":[{"name":"172.16.1.[30:31]","notes":"","type":"RANGE","all_only":false,"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"vars":{}}],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"dataLevel":{"level":2,"parents":["all","servers","usual"]}},"unusual":{"notes":"","vars":{},"groups":[],"hosts":[],"matches":false,"match_id_arr":[],"match_arr":[],"extern":false,"dataLevel":{"level":2,"parents":["all","servers","unusual"]}}},"vars":{},"name":"inventory","notes":""}
inventory.name = "inventory"
-
+
var res = deepEqual(etalon, inventory)
assert.ok(res, 'Сравнение инвентория 2 распарсенного и оригинального');
render(done)
- });
+ });
}})
/**
@@ -1945,20 +1916,82 @@ window.qunitTestsArray.push({
assert.ok(true, 'Успешно update add Item');
render(done)
}).fail(function()
- {
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при update add Item');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Изменение проекта repo_sync_on_run true', function ( assert )
+ {
+ var done = assert.async();
+
+ // Предполагается что мы от прошлого теста попали на страницу редактирования project
+ // с адресом http://192.168.0.12:8080/?group-5
+
+ $("#filed_repo_sync_on_run").addClass("selected");
+
+
+ $.when(pmProjects.updateItem(project_id)).done(function()
+ {
+ if(pmProjects.model.items[project_id].vars.repo_sync_on_run == true)
+ {
+ assert.ok(true, 'Успешно update add Item');
+ render(done)
+ }
+ else
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при update add Item');
+ render(done)
+ }
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при update add Item');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Изменение проекта repo_sync_on_run false', function ( assert )
+ {
+ var done = assert.async();
+
+ // Предполагается что мы от прошлого теста попали на страницу редактирования project
+ // с адресом http://192.168.0.12:8080/?group-5
+
+ $("#filed_repo_sync_on_run").removeClass("selected");
+
+
+ $.when(pmProjects.updateItem(project_id)).done(function()
+ {
+ if(pmProjects.model.items[project_id].vars.repo_sync_on_run === undefined)
+ {
+ assert.ok(true, 'Успешно update add Item');
+ render(done)
+ }
+ else
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при update add Item');
+ render(done)
+ }
+ }).fail(function()
+ {
debugger;
assert.ok(false, 'Ошибка при update add Item');
render(done)
})
});
-
+
syncQUnit.addTest('pmProjects.syncRepo', function ( assert )
{
var done = assert.async();
// Предполагается что мы от прошлого теста попали на страницу редактирования project
// с адресом http://192.168.0.12:8080/?group-5
- var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
+ var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
$.when(pmProjects.syncRepo(itemId)).done(function()
{
assert.ok(true, 'Успешно syncRepo');
@@ -1970,16 +2003,16 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('pmProjects.executePlaybook', function ( assert )
- {
+ {
var done = assert.async();
$('#inventories-autocomplete').val('')
$('#playbook-autocomplete').val('')
-
+
// Предполагается что мы от прошлого теста попали на страницу редактирования project
// с адресом http://192.168.0.12:8080/?group-5
- var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
+ var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
$.when(pmProjects.executePlaybook(itemId)).done(function()
{
debugger;
@@ -1990,7 +2023,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Страница Run playbook', function ( assert )
{
var done = assert.async();
@@ -2008,12 +2041,12 @@ window.qunitTestsArray.push({
})
syncQUnit.addTest('run playbooke с ошибкой 1', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
-
- var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
-
+
+ var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
+
// Отправка формы с данными project
$.when(pmTasks.execute(itemId, 99999, "main.yml")).done(function()
{
@@ -2024,20 +2057,20 @@ window.qunitTestsArray.push({
{
assert.ok(true, 'Ошибка Execute ansible module, как и задумано');
render(done)
- })
+ })
});
syncQUnit.addTest('run playbook с ошибкой 2', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
-
- jsonEditor.__devAddVar("test1", "test1", "playbook")
-
- var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
- var inventoryId = $("#inventories-autocomplete option")[1].value // Надеемся что там есть хоть один инвенторий
+
+ jsonEditor.__devAddVar("test1", "test1", "playbook")
+
+ var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
+ var inventoryId = $("#inventories-autocomplete option")[1].value // Надеемся что там есть хоть один инвенторий
$('#inventories-autocomplete').val(inventoryId)
-
+
// Отправка формы с данными project
$.when(pmTasks.execute(itemId, $('#inventories-autocomplete').val(), "main.yml")).done(function()
{
@@ -2053,15 +2086,15 @@ window.qunitTestsArray.push({
});
syncQUnit.addTest('run playbook', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
-
+
jsonEditor.jsonEditorRmVar("test1")
-
- var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
+
+ var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
var inventoryId = $("#inventories-autocomplete option")[1].value // Надеемся что там есть хоть один инвенторий
-
+
$('#inventories-autocomplete').val(inventoryId)
// Отправка формы с данными project
$.when(pmTasks.execute(itemId, $('#inventories-autocomplete').val(), "main.yml")).done(function()
@@ -2073,9 +2106,9 @@ window.qunitTestsArray.push({
debugger;
assert.ok(false, 'Ошибка Execute ansible module, а не должно было');
render(done)
- })
+ })
});
-
+
var projectId = undefined
syncQUnit.addTest('Страница Execute ansible module', function ( assert )
{
@@ -2101,13 +2134,13 @@ window.qunitTestsArray.push({
// Заполнение формы с данными project
$("#module-autocomplete").val("test");
jsonEditor.jsonEditorRmVar("test1")
-
+
var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
-
+
var inventoryId = $("#inventories-autocomplete option")[1].value // Надеемся что там есть хоть один инвенторий
$.when(pmModuleTemplates.selectInventory(inventoryId)).done(function()
- {
+ {
pmAnsibleModule.selectInventory(inventoryId)
// Отправка формы с данными project
$.when(pmAnsibleModule.execute(itemId, 99999, "All", $('#module-autocomplete').val())).done(function()
@@ -2134,16 +2167,16 @@ window.qunitTestsArray.push({
// Заполнение формы с данными project
$("#module-autocomplete").val("test");
-
- jsonEditor.__devAddVar("test1", "test1", "playbook")
-
+
+ jsonEditor.__devAddVar("test1", "test1", "playbook")
+
var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
-
+
var inventoryId = $("#inventories-autocomplete option")[1].value // Надеемся что там есть хоть один инвенторий
$.when(pmModuleTemplates.selectInventory(inventoryId)).done(function()
- {
+ {
$('#inventories-autocomplete').val(inventoryId)
// Отправка формы с данными project
$.when(pmAnsibleModule.execute(itemId, $('#inventories-autocomplete').val(), "All", $('#module-autocomplete').val())).done(function()
@@ -2171,13 +2204,13 @@ window.qunitTestsArray.push({
// Заполнение формы с данными project
$("#module-autocomplete").val("test");
jsonEditor.jsonEditorRmVar("test1")
-
+
var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
-
+
var inventoryId = $("#inventories-autocomplete option")[1].value // Надеемся что там есть хоть один инвенторий
$.when(pmModuleTemplates.selectInventory(inventoryId)).done(function()
- {
+ {
$('#inventories-autocomplete').val(inventoryId)
// Отправка формы с данными project
$.when(pmAnsibleModule.execute(itemId, $('#inventories-autocomplete').val(), "All", $('#module-autocomplete').val())).done(function()
@@ -2196,10 +2229,10 @@ window.qunitTestsArray.push({
assert.ok(false, 'Ошибка при selectInventory');
})
});
-
+
syncQUnit.addTest('Страница periodic-tasks', function ( assert )
- {
- var done = assert.async();
+ {
+ var done = assert.async();
$.when(spajs.open({ menuId:'project/'+projectId+'/periodic-tasks'})).done(function()
{
assert.ok(true, 'Страница открылась');
@@ -2211,10 +2244,10 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Страница periodic-tasks.toggleSelectEachItem', function ( assert )
- {
- var done = assert.async();
+ {
+ var done = assert.async();
$.when(pmPeriodicTasks.toggleSelectEachItem(true, projectId)).done(function()
{
assert.ok(true, 'ok:toggleSelectEachItem');
@@ -2226,10 +2259,10 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Страница periodic-tasks.search', function ( assert )
- {
- var done = assert.async();
+ {
+ var done = assert.async();
$.when(pmPeriodicTasks.search("test", {project_id:projectId})).done(function()
{
assert.ok(true, 'ok:periodic-tasks.search');
@@ -2241,9 +2274,9 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
// pmPeriodicTasks.showSearchResults
-
+
/*
syncQUnit.addTest('Страница нового inventory для проекта', function ( assert )
{
@@ -2323,8 +2356,8 @@ window.qunitTestsArray.push({
// Заполнение формы с данными inventory
$("#filed_name").val("test-inventory-"+t);
- jsonEditor.__devAddVar("test1", "test1", "inventory")
- jsonEditor.__devAddVar("test2", "test2", "inventory")
+ jsonEditor.__devAddVar("test1", "test1", "inventory")
+ jsonEditor.__devAddVar("test2", "test2", "inventory")
// Отправка формы с данными inventory
@@ -2359,7 +2392,7 @@ window.qunitTestsArray.push({
syncQUnit.addTest('Создание не валидного periodic task', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
@@ -2368,9 +2401,9 @@ window.qunitTestsArray.push({
$("#new_periodic-tasks_playbook").val("test-project-"+t);
$("#new_periodic-tasks_schedule_INTERVAL").val(t);
-
- jsonEditor.__devAddVar("test1", "test1", "periodic_playbook", 'PLAYBOOK')
-
+
+ jsonEditor.__devAddVar("test1", "test1", "periodic_playbook", 'PLAYBOOK')
+
var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
var inventoryId = $("#inventories-autocomplete option")[0].value
@@ -2398,12 +2431,12 @@ window.qunitTestsArray.push({
});
syncQUnit.addTest('Создание periodic task', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
jsonEditor.jsonEditorRmVar('test1', 'PLAYBOOK')
-
+
// Заполнение формы с данными project
$("#new_periodic-tasks_name").val("test-project-"+t);
$("#new_periodic-tasks_playbook").val("test-project-"+t);
@@ -2412,12 +2445,12 @@ window.qunitTestsArray.push({
$("#new_json_namePLAYBOOK").val("become-method");
$("#new_json_valuePLAYBOOK").val("val1");
- jsonEditor.jsonEditorAddVar('periodic_playbook', "PLAYBOOK");
-
+ jsonEditor.jsonEditorAddVar('periodic_playbook', "PLAYBOOK");
+
var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
var inventoryId = $("#inventories-autocomplete option")[0].value
-
+
$.when(pmPeriodicTasks.selectInventory(inventoryId)).done(function()
{
$("#inventories-autocomplete").val(inventoryId)
@@ -2439,9 +2472,9 @@ window.qunitTestsArray.push({
assert.ok(false, 'Ошибка при selectInventory');
})
});
-
+
syncQUnit.addTest('Изменение не валидного periodic task', function ( assert )
- {
+ {
var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
var taskId = /periodic-task\/([0-9]+)/.exec(window.location.href)[1]
// Предполагается что мы от прошлого теста попали на страницу создания inventory
@@ -2449,9 +2482,9 @@ window.qunitTestsArray.push({
// Заполнение формы с данными inventory
$("#periodic-tasks_"+taskId+"_name").val("test-task2-"+t);
-
- jsonEditor.__devAddVar("test1", "test1", "periodic_playbook", "PLAYBOOK")
-
+
+ jsonEditor.__devAddVar("test1", "test1", "periodic_playbook", "PLAYBOOK")
+
// Отправка формы с данными inventory
$.when(pmPeriodicTasks.updateItem(taskId, {project_id:itemId})).done(function()
{
@@ -2466,7 +2499,7 @@ window.qunitTestsArray.push({
});
syncQUnit.addTest('Изменение periodic task', function ( assert )
- {
+ {
var itemId = /project\/([0-9]+)/.exec(window.location.href)[1]
var taskId = /periodic-task\/([0-9]+)/.exec(window.location.href)[1]
// Предполагается что мы от прошлого теста попали на страницу создания inventory
@@ -2474,13 +2507,13 @@ window.qunitTestsArray.push({
// Заполнение формы с данными inventory
$("#periodic-tasks_"+taskId+"_name").val("test-task2-"+t);
-
+
jsonEditor.jsonEditorRmVar('test1', 'PLAYBOOK')
-
+
$("#new_json_namePLAYBOOK").val("private-key");
$("#new_json_valuePLAYBOOK").val("PLAYBOOK");
jsonEditor.jsonEditorAddVar('periodic_playbook', 'PLAYBOOK');
-
+
// Отправка формы с данными inventory
$.when(pmPeriodicTasks.updateItem(taskId, {project_id:itemId})).done(function()
{
@@ -2534,11 +2567,11 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('execute для Periodic Task', function ( assert )
{
var done = assert.async();
-
+
// Удаление пользователя.
$.when(pmPeriodicTasks.execute(projectId, taskId)).done(function()
{
@@ -2600,7 +2633,7 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Удаление проекта', function ( assert )
{
var done = assert.async();
@@ -2673,12 +2706,12 @@ window.qunitTestsArray.push({
// Заполнение формы с данными project
$("#Templates-name").val("!2 d#");
-
- jsonEditor.__devAddVar("syntax-check32", "syntax-check32")
-
+
+ jsonEditor.__devAddVar("syntax-check32", "syntax-check32")
+
jsonEditor.jsonEditorImportVars("playbook", "prefix", "syntax-check=\n")
jsonEditor.jsonEditorImportVars("playbook", "prefix", "syntax-check:\n")
-
+
// Отправка формы с данными project
$.when(pmTasksTemplates.addItem()).done(function()
{
@@ -2693,7 +2726,7 @@ window.qunitTestsArray.push({
});
syncQUnit.addTest('Сохранение шаблона задачи', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
@@ -2714,301 +2747,284 @@ window.qunitTestsArray.push({
})
});
- syncQUnit.addTest('Изменение не валидного шаблона', function ( assert )
+ //тестируем опции шаблона
+ var itemIdForOptionTest=undefined;
+ syncQUnit.addTest('Открытие страницы создания новой опции шаблона задачи', function ( assert )
{
+ // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
+ itemIdForOptionTest = /template\/Task\/([0-9]+)/.exec(window.location.href)[1];
- // Предполагается что мы от прошлого теста попали на страницу редактирования project
- // с адресом http://192.168.0.12:8080/?group-5
- var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
-
- $("#playbook-autocomplete").val("test2-playbook-"+t);
-
- jsonEditor.__devAddVar("syntax-check22", "syntax-check22")
-
- $.when(pmTasksTemplates.updateItem(itemId)).done(function()
+ $.when(spajs.open({ menuId:"template/Task/"+itemIdForOptionTest+"/new-option"})).done(function()
{
- debugger;
- assert.ok(false, 'Успешно template update Item, а не должно было');
+ assert.ok(true, 'Успешно открыто меню templates/Task/item_id/new-option');
render(done)
}).fail(function()
{
- assert.ok(true, 'Ошибка при template update Item, как и задумано');
+ debugger;
+ assert.ok(false, 'Ошибка при открытиии меню templates/Task/item_id/new-option');
render(done)
})
});
- syncQUnit.addTest('Изменение шаблона', function ( assert )
+ syncQUnit.addTest('Сохранение новой невалидной опции шаблона задачи', function ( assert )
{
var done = assert.async();
- // Предполагается что мы от прошлого теста попали на страницу редактирования project
- // с адресом http://192.168.0.12:8080/?group-5
- var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
- $("#playbook-autocomplete").val("test2-playbook-"+t);
- $("#projects-autocomplete").val($("#projects-autocomplete option")[0].value).trigger('change.select2');
- $("#inventories-autocomplete").val($("#inventories-autocomplete option")[0].value).trigger('change.select2');
-
- jsonEditor.jsonEditorRmVar("syntax-check22");
- $("#new_json_nameprefix").val("new-vault-password-file");
- $("#new_json_valueprefix").val("syntax-check");
- jsonEditor.jsonEditorAddVar();
-
-
- $.when(pmTasksTemplates.updateItem(itemId)).done(function()
+ //пытаемся сохранить пустую опцию, даже не забав имя
+ $.when(pmTasksTemplates.saveNewOption(itemIdForOptionTest)).done(function()
{
- assert.ok(true, 'Успешно update add Item');
- render(done)
- }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при update add Item');
+ assert.ok(false, 'Успешно сохранено, а не должно было');
+ render(done)
+ }).fail(function(){
+ assert.ok(true, 'Ошибка при сохранении, как и задумано');
render(done)
})
});
-
- var itemId = undefined
- syncQUnit.addTest('Копирование template Task', function ( assert )
- {
- // Предполагается что мы от прошлого теста попали на страницу редактирования группы
- // с адресом http://192.168.0.12:8080/?group-5
- itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
+ syncQUnit.addTest('Сохранение новой невалидной опции шаблона задачи 2', function ( assert )
+ {
+ // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- $.when(pmTasksTemplates.copyAndEdit(itemId)).done(function()
+
+ $("#filed_option_name").val("test-option");
+
+ //пытаемся сохранить пустую опцию, с именем, но идентичную шаблону
+ $.when(pmTasksTemplates.saveOption(itemIdForOptionTest)).done(function()
{
- assert.ok(true, 'Успешно copyAndEdit add Item');
+ debugger;
+ assert.ok(false, 'Успешно сохранено, а не должно было');
render(done)
}).fail(function(){
- debugger;
- assert.ok(false, 'Ошибка при copyAndEdit add Item');
+ assert.ok(true, 'Ошибка при сохранении, как и задумано');
render(done)
})
});
- syncQUnit.addTest('Удаление копии template Task', function ( assert )
+ syncQUnit.addTest('Сохранение новой валидной опции шаблона задачи', function ( assert )
{
+ // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- // Предполагается что мы от прошлого теста попали на страницу редактирования пользователя
- // с адресом http://192.168.0.12:8080/?user-5
- var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
+ jsonEditor.jsonEditorRmVar("become2")
+ $("#new_json_nameprefix").val("become");
+ jsonEditor.jsonEditorAddVar();
- // Удаление пользователя.
- $.when(pmTasksTemplates.deleteItem(itemId, true)).done(function()
+ $.when(pmTasksTemplates.saveNewOption(itemIdForOptionTest)).done(function()
{
- assert.ok(true, 'Успешно delete add Item');
+ assert.ok(true, 'Опция успешно сохранена');
render(done)
}).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при delete add Item');
+ assert.ok(false, 'Ошибка при сохранении опции');
render(done)
})
});
- syncQUnit.addTest('Удаление шаблона', function ( assert )
- {
- var done = assert.async();
-
- $.when(spajs.open({ menuId:"template/Task/"+itemId})).done(function()
- {
- $.when(pmTasksTemplates.saveAndExecute(itemId)).done(function()
- {
- assert.ok(true, 'Успешно pmTasksTemplates.saveAndExecute');
- render(done)
- }).fail(function(){
- debugger;
- assert.ok(false, 'Ошибка при pmTasksTemplates.saveAndExecute');
- render(done)
- })
- }).fail(function()
- {
- debugger;
- assert.ok(false, 'Ошибка при открытиии меню template/Module/'+itemId);
- render(done)
- })
- });
-
- syncQUnit.addTest('Удаление шаблона', function ( assert )
+ syncQUnit.addTest('Изменение опции шаблона задачи', function ( assert )
{
+ // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- // Удаление project.
- $.when(pmTasksTemplates.deleteItem(itemId, true)).done(function()
+ jsonEditor.jsonEditorRmVar("check2")
+ $("#new_json_nameprefix").val("check");
+ jsonEditor.jsonEditorAddVar();
+
+ $.when(pmTasksTemplates.saveOption(itemIdForOptionTest)).done(function()
{
- assert.ok(true, 'Успешно delete Item');
+ assert.ok(true, 'Опция успешно изменена');
render(done)
}).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при delete Item');
+ assert.ok(false, 'Ошибка при изменении опции');
render(done)
})
});
- syncQUnit.addTest('Список шаблонов', function ( assert )
+ syncQUnit.addTest('Сохранение и запуск опции шаблона задачи', function ( assert )
{
+ // Предполагается что мы от прошлого теста попали на страницу просмотра/редактирования опции шаблона
var done = assert.async();
- $.when(spajs.open({ menuId:"templates"})).done(function()
+ $.when(pmTasksTemplates.saveAndExecuteOption(itemIdForOptionTest)).done(function()
{
- assert.ok(true, 'Успешно открыто меню templates');
+ assert.ok(true, 'Опция успешно сохранена');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при открытиии меню templates');
+ assert.ok(false, 'Ошибка при сохранении опции');
render(done)
})
});
- syncQUnit.addTest('Новый template/new-task', function ( assert )
+ //открываем стрницу для создания новой опции для дальнейших тестов
+ syncQUnit.addTest('Открытие страницы создания новой опции шаблона задачи', function ( assert )
{
var done = assert.async();
-
- // Открытие пункта меню new-project
- $.when(spajs.open({ menuId:"template/new-task"})).done(function()
+ $.when(spajs.open({ menuId:"template/Task/"+itemIdForOptionTest+"/new-option"})).done(function()
{
- assert.ok(true, 'Успешно открыто меню new-project');
+ assert.ok(true, 'Успешно открыто меню templates/Task/item_id/new-option');
render(done)
}).fail(function()
{
debugger;
- assert.ok(false, 'Ошибка при открытиии меню new-project');
+ assert.ok(false, 'Ошибка при открытиии меню templates/Task/item_id/new-option');
render(done)
})
});
- var t = new Date();
- t = t.getTime()
-
- syncQUnit.addTest('Сохранение не валидного шаблона задачи', function ( assert )
+ syncQUnit.addTest('Сохранение новой опции с уже существующим именем', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- // Заполнение формы с данными project
- $("#Templates-name").val("!2 d#");
-
- jsonEditor.__devAddVar("syntax-check32", "syntax-check32")
+ $("#filed_option_name").val("test-option");
+ jsonEditor.jsonEditorRmVar("become2")
+ $("#new_json_nameprefix").val("become");
+ jsonEditor.jsonEditorAddVar();
- jsonEditor.jsonEditorImportVars("playbook", "prefix", "syntax-check=\n")
- jsonEditor.jsonEditorImportVars("playbook", "prefix", "syntax-check:\n")
- // Отправка формы с данными project
- $.when(pmTasksTemplates.addItem()).done(function()
+ $.when(pmTasksTemplates.saveNewOption(itemIdForOptionTest)).done(function()
{
debugger;
- assert.ok(false, 'Успешно template add Item, а не должно было');
+ assert.ok(false, 'Успешно сохранено, а не должно было');
render(done)
- }).fail(function()
- {
- assert.ok(true, 'Ошибка при template add Item, как и задумано');
+ }).fail(function(){
+ assert.ok(true, 'Ошибка при сохранении, как и задумано');
render(done)
})
});
- syncQUnit.addTest('Сохранение шаблона задачи', function ( assert )
+ syncQUnit.addTest('Сохранение новой опции с новым именем', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- // Заполнение формы с данными project
- $("#Templates-name").val("test-template-"+t);
- jsonEditor.jsonEditorRmVar("syntax-check32");
+ $("#filed_option_name").val("test-option2");
- // Отправка формы с данными project
- $.when(pmTasksTemplates.addItem()).done(function()
+ $.when(pmTasksTemplates.saveNewOption(itemIdForOptionTest)).done(function()
{
- assert.ok(true, 'Успешно template add Item');
+ assert.ok(true, 'Успешно сохранено');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при template add Item');
+ assert.ok(false, 'Ошибка при сохранении');
render(done)
})
});
- syncQUnit.addTest('Открытие страницы создания новой опции шаблона задачи', function ( assert )
+ syncQUnit.addTest('Удаление опции', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1];
- $.when(spajs.open({ menuId:"template/Task/"+itemId+"/new-option"})).done(function()
+ $.when(pmTasksTemplates.removeOption(itemIdForOptionTest)).done(function()
{
- assert.ok(true, 'Успешно открыто меню templates/Task/item_id/new-option');
+ assert.ok(true, 'Опция успешно удалена');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при открытиии меню templates/Task/item_id/new-option');
+ assert.ok(false, 'Ошибка при удалении опции');
render(done)
})
});
- syncQUnit.addTest('Сохранение новой невалидной опции шаблона задачи', function ( assert )
+ //конец тестирования опции шаблона
+
+ syncQUnit.addTest('Изменение не валидного шаблона', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- var itemId = /template\/Task\/([0-9]+)\/new-option/.exec(window.location.href)[1];
- $("#filed_option_name").val("test-option");
+ // Предполагается что мы от прошлого теста попали на страницу редактирования project
+ // с адресом http://192.168.0.12:8080/?group-5
+ var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
+
+ $("#playbook-autocomplete").val("test2-playbook-"+t);
+
+ jsonEditor.__devAddVar("syntax-check22", "syntax-check22")
- $.when(pmTasksTemplates.saveOption(itemId)).done(function()
+ $.when(pmTasksTemplates.updateItem(itemId)).done(function()
{
debugger;
- assert.ok(false, 'Успешно сохранено, а не должно было');
+ assert.ok(false, 'Успешно template update Item, а не должно было');
render(done)
- }).fail(function(){
- assert.ok(true, 'Ошибка при сохранении, как и задумано');
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при template update Item, как и задумано');
render(done)
})
-
-
});
- syncQUnit.addTest('Сохранение новой валидной опции шаблона задачи', function ( assert )
+ syncQUnit.addTest('Изменение шаблона', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- var itemId = /template\/Task\/([0-9]+)\/new-option/.exec(window.location.href)[1];
- jsonEditor.jsonEditorRmVar("become2")
- $("#new_json_nameprefix").val("become");
+ // Предполагается что мы от прошлого теста попали на страницу редактирования project
+ // с адресом http://192.168.0.12:8080/?group-5
+ var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
+ $("#playbook-autocomplete").val("test2-playbook-"+t);
+ $("#projects-autocomplete").val($("#projects-autocomplete option")[0].value).trigger('change.select2');
+ $("#inventories-autocomplete").val($("#inventories-autocomplete option")[0].value).trigger('change.select2');
+
+ jsonEditor.jsonEditorRmVar("syntax-check22");
+ $("#new_json_nameprefix").val("new-vault-password-file");
+ $("#new_json_valueprefix").val("syntax-check");
jsonEditor.jsonEditorAddVar();
- $.when(pmTasksTemplates.saveOption(itemId)).done(function()
+
+ $.when(pmTasksTemplates.updateItem(itemId)).done(function()
{
- assert.ok(true, 'Опция успешно сохранена');
+ assert.ok(true, 'Успешно update add Item');
render(done)
}).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при сохранении опции');
+ assert.ok(false, 'Ошибка при update add Item');
render(done)
})
});
- syncQUnit.addTest('Сохранение и запуск опции шаблона задачи', function ( assert )
+ var itemId = undefined
+ syncQUnit.addTest('Копирование template Task', function ( assert )
+ {
+ // Предполагается что мы от прошлого теста попали на страницу редактирования группы
+ // с адресом http://192.168.0.12:8080/?group-5
+ itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
+
+ var done = assert.async();
+ $.when(pmTasksTemplates.copyAndEdit(itemId)).done(function()
+ {
+ assert.ok(true, 'Успешно copyAndEdit add Item');
+ render(done)
+ }).fail(function(){
+ debugger;
+ assert.ok(false, 'Ошибка при copyAndEdit add Item');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Удаление копии template Task', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу просмотра/редактирования опции шаблона
var done = assert.async();
- var itemId = /template\/Task\/([0-9]+)\/option\/([A-z0-9 %\-.:,=]+)/.exec(window.location.href)[1];
- $.when(pmTasksTemplates.saveAndExecuteOption(itemId)).done(function()
+ // Предполагается что мы от прошлого теста попали на страницу редактирования пользователя
+ // с адресом http://192.168.0.12:8080/?user-5
+ var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1]
+
+ // Удаление пользователя.
+ $.when(pmTasksTemplates.deleteItem(itemId, true)).done(function()
{
- assert.ok(true, 'Опция успешно сохранена');
+ assert.ok(true, 'Успешно delete add Item');
render(done)
}).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при сохранении опции');
+ assert.ok(false, 'Ошибка при delete add Item');
render(done)
})
});
- syncQUnit.addTest('Удаление шаблона', function ( assert )
+
+ syncQUnit.addTest('Сохранение и запуск шаблона', function ( assert )
{
var done = assert.async();
- var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1];
+
$.when(spajs.open({ menuId:"template/Task/"+itemId})).done(function()
{
$.when(pmTasksTemplates.saveAndExecute(itemId)).done(function()
@@ -3028,10 +3044,43 @@ window.qunitTestsArray.push({
})
});
+ var tt_history_id = undefined;
+ syncQUnit.addTest('Страница списка task template History', function ( assert )
+ {
+
+ tt_history_id=/history\/([0-9]+)/.exec(window.location.href)[1];
+ var done = assert.async();
+ $.when(spajs.open({ menuId:'template/Task/'+itemId+'/history'})).done(function()
+ {
+ assert.ok(true, 'Страница открылась');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Страница не открылась');
+ render(done)
+ })
+ })
+
+ syncQUnit.addTest('Страница task template History Item', function ( assert )
+ {
+ var done = assert.async();
+ $.when(spajs.open({ menuId:'template/Task/'+itemId+'/history/'+tt_history_id})).done(function()
+ {
+ assert.ok(true, 'Страница открылась');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Страница не открылась');
+ render(done)
+ })
+ })
+
syncQUnit.addTest('Удаление шаблона', function ( assert )
{
var done = assert.async();
- var itemId = /template\/Task\/([0-9]+)/.exec(window.location.href)[1];
+
// Удаление project.
$.when(pmTasksTemplates.deleteItem(itemId, true)).done(function()
{
@@ -3095,9 +3144,9 @@ window.qunitTestsArray.push({
// Заполнение формы с данными project
$("#Templates-name").val("test-template-"+t);
-
- jsonEditor.__devAddVar("new-vault-password-file2", "syntax-check")
-
+
+ jsonEditor.__devAddVar("new-vault-password-file2", "syntax-check")
+
// Отправка формы с данными project
$.when(pmModuleTemplates.addItem()).done(function()
{
@@ -3110,9 +3159,9 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Сохранение шаблона модуля', function ( assert )
- {
+ {
// Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
@@ -3120,10 +3169,10 @@ window.qunitTestsArray.push({
$("#new_json_nameprefix").val("new-vault-password-file");
$("#new_json_valueprefix").val("syntax-check");
jsonEditor.jsonEditorAddVar();
-
+
$("#inventories-autocomplete").val($("#inventories-autocomplete option")[0].value).trigger('change.select2');
-
-
+
+
// Заполнение формы с данными project
$("#Templates-name").val("test-template-"+t);
@@ -3140,330 +3189,307 @@ window.qunitTestsArray.push({
})
});
- syncQUnit.addTest('Изменение не валидного шаблона модуля', function ( assert )
- {
+ //начало тестирования опций шаблона
+ var itemIdForOptionTest1=undefined;
+ syncQUnit.addTest('Открытие страницы создания новой опции шаблона модуля', function ( assert )
+ {
+ // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
+ itemIdForOptionTest1 = /template\/Module\/([0-9]+)/.exec(window.location.href)[1];
- // Предполагается что мы от прошлого теста попали на страницу редактирования project
- // с адресом http://192.168.0.12:8080/?group-5
- var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
-
- $("#module-autocomplete").val("test2-playbook-"+t);
- jsonEditor.__devAddVar("new-vault-password-file2", "syntax-check")
-
-
- $.when(pmModuleTemplates.updateItem(itemId)).done(function()
+ $.when(spajs.open({ menuId:"template/Module/"+itemIdForOptionTest1+"/new-option"})).done(function()
+ {
+ assert.ok(true, 'Успешно открыто меню templates/Module/item_id/new-option');
+ render(done)
+ }).fail(function()
{
debugger;
- assert.ok(false, 'Успешно update add Item, а не должно было');
- render(done)
- }).fail(function(){
- assert.ok(true, 'Ошибка при update add Item, как и задумано');
+ assert.ok(false, 'Ошибка при открытиии меню templates/Module/item_id/new-option');
render(done)
})
});
- syncQUnit.addTest('Изменение шаблона модуля', function ( assert )
+ syncQUnit.addTest('Сохранение новой невалидной опции шаблона модуля', function ( assert )
{
var done = assert.async();
-
- var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
-
- jsonEditor.jsonEditorRmVar("new-vault-password-file2")
- $("#module-autocomplete").val("test2-playbook-"+t);
- $("#new_json_nameprefix").val("new-vault-password-file");
- $("#new_json_valueprefix").val("syntax-check");
- jsonEditor.jsonEditorAddVar();
-
-
- $.when(pmModuleTemplates.updateItem(itemId)).done(function()
+ //пытаемся сохранить пустую опцию, даже не забав имя
+ $.when(pmModuleTemplates.saveNewOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'Успешно update add Item');
+ assert.ok(false, 'Опция успешно сохранена, а не должна была');
+ debugger;
render(done)
}).fail(function(){
- debugger;
- assert.ok(false, 'Ошибка при update add Item');
+ assert.ok(true, 'Ошибка при сохранении опции, что и ожидалось');
render(done)
})
});
- var itemId = undefined
- syncQUnit.addTest('Копирование template Module', function ( assert )
- {
- itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
-
+ syncQUnit.addTest('Сохранение новой невалидной опции шаблона модуля 2', function ( assert )
+ {
+ // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- $.when(pmModuleTemplates.copyAndEdit(itemId)).done(function()
+
+ $("#filed_option_name").val("test-option");
+
+ //пытаемся сохранить пустую опцию, с именем, но идентичную шаблону
+ $.when(pmModuleTemplates.saveOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'Успешно copyAndEdit add Item');
+ debugger;
+ assert.ok(false, 'Успешно сохранено, а не должно было');
render(done)
}).fail(function(){
- debugger;
- assert.ok(false, 'Ошибка при copyAndEdit add Item');
+ assert.ok(true, 'Ошибка при сохранении, как и задумано');
render(done)
})
});
-/*
- syncQUnit.addTest('Выполнение template Module', function ( assert )
- {
- var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
- debugger;
+
+ syncQUnit.addTest('Сохранение новой валидной опции шаблона модуля', function ( assert )
+ {
+ // Предполагается что мы от прошлого теста попали на страницу опции
var done = assert.async();
- $.when(pmModuleTemplates.execute(itemId)).done(function()
+
+ jsonEditor.jsonEditorRmVar('new-vault-password-file', 'prefix');
+ jsonEditor.jsonEditorRmVar("become2")
+ $("#new_json_nameprefix").val("become");
+ jsonEditor.jsonEditorAddVar();
+
+ $.when(pmModuleTemplates.saveNewOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'Успешно pmModuleTemplates.execute');
+ assert.ok(true, 'Опция успешно сохранена');
render(done)
}).fail(function(){
- assert.ok(false, 'Ошибка при pmModuleTemplates.execute');
+ debugger;
+ assert.ok(false, 'Ошибка при сохранении опции');
render(done)
})
- });*/
-
- syncQUnit.addTest('pmTemplates.exportToFile', function ( assert )
+ });
+
+ syncQUnit.addTest('Изменение опции шаблона модуля', function ( assert )
{
+ // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- $.when(pmTemplates.exportToFile([itemId])).done(function()
+ jsonEditor.jsonEditorRmVar("check2")
+ $("#new_json_nameprefix").val("check");
+ jsonEditor.jsonEditorAddVar();
+
+ $.when(pmModuleTemplates.saveOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'pmTemplates.exportToFile ok');
+ assert.ok(true, 'Опция успешно изменена');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'pmTemplates.exportToFile error');
+ assert.ok(false, 'Ошибка при изменении опции');
render(done)
})
});
- syncQUnit.addTest('Удаление копии template Module', function ( assert )
+ syncQUnit.addTest('Сохранение и запуск опции шаблона модуля', function ( assert )
{
+ // Предполагается что мы от прошлого теста попали на страницу просмотра/редактирования опции шаблона
var done = assert.async();
- // Предполагается что мы от прошлого теста попали на страницу редактирования пользователя
- // с адресом http://192.168.0.12:8080/?user-5
- var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
-
- // Удаление пользователя.
- $.when(pmModuleTemplates.deleteItem(itemId, true)).done(function()
+ $.when(pmModuleTemplates.saveAndExecuteOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'Успешно delete add Item');
+ assert.ok(true, 'Опция успешно сохранена');
render(done)
}).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при delete add Item');
+ assert.ok(false, 'Ошибка при сохранении опции');
render(done)
})
});
- syncQUnit.addTest('Удаление шаблона Module', function ( assert )
+ //открываем страницу создания новой опции для дальнейших тестов
+ syncQUnit.addTest('Открытие страницы создания новой опции шаблона модуля', function ( assert )
{
var done = assert.async();
-
- $.when(spajs.open({ menuId:"template/Module/"+itemId})).done(function()
- {
- $.when(pmModuleTemplates.saveAndExecute(itemId)).done(function()
- {
- assert.ok(true, 'Успешно pmModuleTemplates.saveAndExecute');
- render(done)
- }).fail(function(){
- debugger;
- assert.ok(false, 'Ошибка при pmModuleTemplates.saveAndExecute');
- render(done)
- })
+
+ $.when(spajs.open({ menuId:"template/Module/"+itemIdForOptionTest1+"/new-option"})).done(function()
+ {
+ assert.ok(true, 'Успешно открыто меню templates/Module/item_id/new-option');
+ render(done)
}).fail(function()
{
debugger;
- assert.ok(false, 'Ошибка при открытиии меню template/Module/'+itemId);
+ assert.ok(false, 'Ошибка при открытиии меню templates/Module/item_id/new-option');
render(done)
- })
+ })
});
-
- syncQUnit.addTest('Удаление шаблона', function ( assert )
+
+ syncQUnit.addTest('Сохранение опции шаблона модуля с уже существующем именем', function ( assert )
{
var done = assert.async();
- // Удаление project.
- $.when(pmModuleTemplates.deleteItem(itemId, true)).done(function()
+ jsonEditor.jsonEditorRmVar("become2")
+ $("#new_json_nameprefix").val("become");
+ jsonEditor.jsonEditorAddVar();
+ $("#filed_option_name").val("test-option");
+
+ $.when(pmModuleTemplates.saveNewOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'Успешно delete Item');
+ assert.ok(false, 'Опция успешно сохранена, а не должна была');
+ debugger;
render(done)
}).fail(function(){
- debugger;
- assert.ok(false, 'Ошибка при delete Item');
+ assert.ok(true, 'Ошибка при сохранении опции, что и ожидалось');
render(done)
})
});
- syncQUnit.addTest('Список шаблонов', function ( assert )
+ syncQUnit.addTest('Сохранение опции шаблона модуля с новым именем', function ( assert )
{
var done = assert.async();
- $.when(spajs.open({ menuId:"templates"})).done(function()
+ $("#filed_option_name").val("test-option2");
+
+ $.when(pmModuleTemplates.saveNewOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'Успешно открыто меню templates');
+ assert.ok(true, 'Опция успешно сохранена');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при открытиии меню templates');
+ assert.ok(false, 'Ошибка при сохранении опции');
render(done)
})
});
- syncQUnit.addTest('Новый template/new-module', function ( assert )
+ syncQUnit.addTest('Удаление опции шаблона модуля', function ( assert )
{
var done = assert.async();
- // Открытие пункта меню new-project
- $.when(spajs.open({ menuId:"template/new-module"})).done(function()
+ $.when(pmModuleTemplates.removeOption(itemIdForOptionTest1)).done(function()
{
- assert.ok(true, 'Успешно открыто меню new-project');
+ assert.ok(true, 'Опция успешно удалена');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при открытиии меню new-project');
+ assert.ok(false, 'Ошибка при удалении опции');
render(done)
})
});
+ //конец тестирования опции шаблона
- var t = new Date();
- t = t.getTime()
-
- syncQUnit.addTest('Сохранение не валидного шаблона модуля', function ( assert )
+ syncQUnit.addTest('Изменение не валидного шаблона модуля', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- // Заполнение формы с данными project
- $("#Templates-name").val("test-template-"+t);
+ // Предполагается что мы от прошлого теста попали на страницу редактирования project
+ // с адресом http://192.168.0.12:8080/?group-5
+ var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
+ $("#module-autocomplete").val("test2-playbook-"+t);
jsonEditor.__devAddVar("new-vault-password-file2", "syntax-check")
- // Отправка формы с данными project
- $.when(pmModuleTemplates.addItem()).done(function()
+
+ $.when(pmModuleTemplates.updateItem(itemId)).done(function()
{
debugger;
- assert.ok(false, 'Успешно template add Item, а не должно было');
+ assert.ok(false, 'Успешно update add Item, а не должно было');
render(done)
- }).fail(function()
- {
- assert.ok(true, 'Ошибка при template add Item, как и задумано');
+ }).fail(function(){
+ assert.ok(true, 'Ошибка при update add Item, как и задумано');
render(done)
})
});
- syncQUnit.addTest('Сохранение шаблона модуля', function ( assert )
+ syncQUnit.addTest('Изменение шаблона модуля', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
+ var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
+
jsonEditor.jsonEditorRmVar("new-vault-password-file2")
+ $("#module-autocomplete").val("test2-playbook-"+t);
+
$("#new_json_nameprefix").val("new-vault-password-file");
$("#new_json_valueprefix").val("syntax-check");
jsonEditor.jsonEditorAddVar();
- $("#inventories-autocomplete").val($("#inventories-autocomplete option")[0].value).trigger('change.select2');
-
-
- // Заполнение формы с данными project
- $("#Templates-name").val("test-template-"+t);
-
- // Отправка формы с данными project
- $.when(pmModuleTemplates.addItem()).done(function()
+ $.when(pmModuleTemplates.updateItem(itemId)).done(function()
{
- assert.ok(true, 'Успешно template add Item');
+ assert.ok(true, 'Успешно update add Item');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при template add Item');
+ assert.ok(false, 'Ошибка при update add Item');
render(done)
})
});
- syncQUnit.addTest('Открытие страницы создания новой опции шаблона модуля', function ( assert )
+ var itemId = undefined
+ syncQUnit.addTest('Копирование template Module', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
- var done = assert.async();
- var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1];
+ itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
- $.when(spajs.open({ menuId:"template/Module/"+itemId+"/new-option"})).done(function()
+ var done = assert.async();
+ $.when(pmModuleTemplates.copyAndEdit(itemId)).done(function()
{
- assert.ok(true, 'Успешно открыто меню templates/Module/item_id/new-option');
+ assert.ok(true, 'Успешно copyAndEdit add Item');
render(done)
- }).fail(function()
- {
+ }).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при открытиии меню templates/Module/item_id/new-option');
+ assert.ok(false, 'Ошибка при copyAndEdit add Item');
render(done)
})
});
-
- syncQUnit.addTest('Сохранение новой невалидной опции шаблона модуля', function ( assert )
+/*
+ syncQUnit.addTest('Выполнение template Module', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
+ var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
+ debugger;
var done = assert.async();
- var itemId = /template\/Module\/([0-9]+)\/new-option/.exec(window.location.href)[1];
-
- $("#filed_option_name").val("test-option");
-
- $.when(pmModuleTemplates.saveOption(itemId)).done(function()
+ $.when(pmModuleTemplates.execute(itemId)).done(function()
{
- debugger;
- assert.ok(false, 'Успешно сохранено, а не должно было');
+ assert.ok(true, 'Успешно pmModuleTemplates.execute');
render(done)
}).fail(function(){
- assert.ok(true, 'Ошибка при сохранении, как и задумано');
+ assert.ok(false, 'Ошибка при pmModuleTemplates.execute');
render(done)
})
+ });*/
-
- });
-
- syncQUnit.addTest('Сохранение новой валидной опции шаблона модуля', function ( assert )
+ syncQUnit.addTest('pmTemplates.exportToFile', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу создания project
var done = assert.async();
- var itemId = /template\/Module\/([0-9]+)\/new-option/.exec(window.location.href)[1];
-
- jsonEditor.jsonEditorRmVar('new-vault-password-file', 'prefix');
- jsonEditor.jsonEditorRmVar("become2")
- $("#new_json_nameprefix").val("become");
- jsonEditor.jsonEditorAddVar();
- $.when(pmModuleTemplates.saveOption(itemId)).done(function()
+ $.when(pmTemplates.exportToFile([itemId])).done(function()
{
- assert.ok(true, 'Опция успешно сохранена');
+ assert.ok(true, 'pmTemplates.exportToFile ok');
render(done)
- }).fail(function(){
+ }).fail(function()
+ {
debugger;
- assert.ok(false, 'Ошибка при сохранении опции');
+ assert.ok(false, 'pmTemplates.exportToFile error');
render(done)
})
});
- syncQUnit.addTest('Сохранение и запуск опции шаблона модуля', function ( assert )
+ syncQUnit.addTest('Удаление копии template Module', function ( assert )
{
- // Предполагается что мы от прошлого теста попали на страницу просмотра/редактирования опции шаблона
var done = assert.async();
- var itemId = /template\/Module\/([0-9]+)\/option\/([A-z0-9 %\-.:,=]+)/.exec(window.location.href)[1];
- $.when(pmModuleTemplates.saveAndExecuteOption(itemId)).done(function()
+ // Предполагается что мы от прошлого теста попали на страницу редактирования пользователя
+ // с адресом http://192.168.0.12:8080/?user-5
+ var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
+
+ // Удаление пользователя.
+ $.when(pmModuleTemplates.deleteItem(itemId, true)).done(function()
{
- assert.ok(true, 'Опция успешно сохранена');
+ assert.ok(true, 'Успешно delete add Item');
render(done)
}).fail(function(){
debugger;
- assert.ok(false, 'Ошибка при сохранении опции');
+ assert.ok(false, 'Ошибка при delete add Item');
render(done)
})
});
- syncQUnit.addTest('Удаление шаблона Module', function ( assert )
+
+ syncQUnit.addTest('Сохранение и запуск шаблона Module', function ( assert )
{
var done = assert.async();
- var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
+
$.when(spajs.open({ menuId:"template/Module/"+itemId})).done(function()
{
$.when(pmModuleTemplates.saveAndExecute(itemId)).done(function()
@@ -3481,12 +3507,45 @@ window.qunitTestsArray.push({
assert.ok(false, 'Ошибка при открытиии меню template/Module/'+itemId);
render(done)
})
- });
+ });
+
+ var tt_history_id_1 = undefined;
+ syncQUnit.addTest('Страница списка Module template History', function ( assert )
+ {
+
+ tt_history_id_1=/history\/([0-9]+)/.exec(window.location.href)[1];
+ var done = assert.async();
+ $.when(spajs.open({ menuId:'template/Module/'+itemId+'/history'})).done(function()
+ {
+ assert.ok(true, 'Страница открылась');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Страница не открылась');
+ render(done)
+ })
+ })
+
+ syncQUnit.addTest('Страница Module template History Item', function ( assert )
+ {
+ var done = assert.async();
+ $.when(spajs.open({ menuId:'template/Module/'+itemId+'/history/'+tt_history_id_1})).done(function()
+ {
+ assert.ok(true, 'Страница открылась');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Страница не открылась');
+ render(done)
+ })
+ })
syncQUnit.addTest('Удаление шаблона', function ( assert )
{
var done = assert.async();
- var itemId = /template\/Module\/([0-9]+)/.exec(window.location.href)[1]
+
// Удаление project.
$.when(pmModuleTemplates.deleteItem(itemId, true)).done(function()
{
@@ -3499,7 +3558,7 @@ window.qunitTestsArray.push({
})
});
}})
-
+
/**
* Тестирование pmDashboard
*/
@@ -3507,7 +3566,7 @@ window.qunitTestsArray.push({
step:900,
test:function()
{
-
+
syncQUnit.addTest('Страница dashboard', function ( assert )
{
var done = assert.async();
@@ -3515,15 +3574,15 @@ window.qunitTestsArray.push({
$.when(spajs.open({ menuId:"home"})).done(function()
{
assert.ok(true, 'Успешно открыто меню pmDashboard');
-
+
setTimeout(function(){// Ждём завершения всех асинхронных запросов на странице
-
- tabSignal.emit('pmLocalSettings.hideMenu', {type:'set', name:'hideMenu', value:false})
+
+ tabSignal.emit('pmLocalSettings.hideMenu', {type:'set', name:'hideMenu', value:false})
setTimeout(function()
- {
- render(done)
- }, 500)
- }, 5000)
+ {
+ render(done)
+ }, 500)
+ }, 5000)
}).fail(function()
{
debugger;
@@ -3541,7 +3600,7 @@ window.qunitTestsArray.push({
step:1000,
test:function()
{
-
+
syncQUnit.addTest('Поиск projects', function ( assert )
{
var done = assert.async();
@@ -3557,7 +3616,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Поиск templates', function ( assert )
{
var done = assert.async();
@@ -3573,7 +3632,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Поиск hosts', function ( assert )
{
var done = assert.async();
@@ -3589,7 +3648,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Поиск groups', function ( assert )
{
var done = assert.async();
@@ -3605,7 +3664,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Поиск history', function ( assert )
{
var done = assert.async();
@@ -3621,7 +3680,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Поиск inventories', function ( assert )
{
var done = assert.async();
@@ -3637,7 +3696,7 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
syncQUnit.addTest('Поиск users', function ( assert )
{
var done = assert.async();
@@ -3653,8 +3712,24 @@ window.qunitTestsArray.push({
render(done)
})
});
-
- syncQUnit.addTest('Страница ошибки 400 в history', function ( assert )
+
+ syncQUnit.addTest('Поиск hooks', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"hooks/search/hook-example"})).done(function()
+ {
+ assert.ok(true, 'Успешно открыто меню hooks/search/hook-example');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при открытиии меню hooks/search/hook-example');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в project history', function ( assert )
{
var done = assert.async();
@@ -3670,7 +3745,152 @@ window.qunitTestsArray.push({
})
});
-
+ syncQUnit.addTest('Страница ошибки 400 в project history search', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"project/9999999999/history/search/name"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню project/9999999999/history/search/name');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню project/9999999999/history/search/name');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в project history search page', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"project/9999999999/history/search/name/page/1"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню project/9999999999/history/search/name/page/1');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню project/9999999999/history/search/name/page/1');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в inventory history', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"inventory/9999999999/history"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню inventory/9999999999/history');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню inventory/9999999999/history');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в inventory history search', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"inventory/9999999999/history/search/name"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню inventory/9999999999/history/search/name');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню inventory/9999999999/history/search/name');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в inventory history search page', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"inventory/9999999999/history/search/name/page/1"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню inventory/9999999999/history/search/name/page/1');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню inventory/9999999999/history/search/name/page/1');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в task template history search', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"template/Task/9999999999/history/search/name"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню template/Task/9999999999/history/search/name');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню template/Task/9999999999/history/search/name');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в module template history search', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"template/Module/9999999999/history/search/name"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню template/Module/9999999999/history/search/name');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню template/Module/9999999999/history/search/name');
+ render(done)
+ })
+ });
+
+
+ syncQUnit.addTest('Страница ошибки 400 в task template history search page', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"template/Task/9999999999/history/search/name/page/1"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню template/Task/9999999999/history/search/name/page/1');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню template/Task/9999999999/history/search/name/page/1');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Страница ошибки 400 в module template history search page', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"template/Module/9999999999/history/search/name/page/1"})).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Успешно открыто меню template/Module/9999999999/history/search/name/page/1');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при открытиии меню template/Module/9999999999/history/search/name/page/1');
+ render(done)
+ })
+ });
+
+
}})
@@ -3697,13 +3917,13 @@ window.qunitTestsArray.push({
})
});
-
+
syncQUnit.addTest('Страница history toggleSelectEachItem', function ( assert )
- {
+ {
var done = assert.async();
-
- pmHistory.toggleSelectAll($('.multiple-select tr'), true);
-
+
+ pmHistory.toggleSelectAll($('.multiple-select tr'), true);
+
$.when(pmHistory.toggleSelectEachItem(true)).done(function()
{
assert.ok(true, 'ok:toggleSelectEachItem');
@@ -3715,13 +3935,13 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Страница history toggleSelectEachItem', function ( assert )
- {
+ {
var done = assert.async();
-
- pmHistory.toggleSelectAll($('.multiple-select tr'), false);
-
+
+ pmHistory.toggleSelectAll($('.multiple-select tr'), false);
+
$.when(pmHistory.toggleSelectEachItem(false)).done(function()
{
$.when(pmHistory.deleteSelected()).done(function()
@@ -3734,7 +3954,7 @@ window.qunitTestsArray.push({
assert.ok(false, 'error:deleteSelected');
render(done)
})
-
+
}).fail(function()
{
debugger;
@@ -3742,15 +3962,15 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Страница history deleteRows', function ( assert )
- {
+ {
var done = assert.async();
-
+
$.when(pmHistory.deleteRows([])).done(function()
- {
+ {
assert.ok(true, 'ok:deleteRows');
- render(done)
+ render(done)
}).fail(function()
{
debugger;
@@ -3758,15 +3978,15 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Страница history multiOperationsOnEachRow.loadItem', function ( assert )
- {
+ {
var done = assert.async();
-
+
$.when(pmHistory.multiOperationsOnEachRow([], 'loadItem', true)).done(function()
- {
+ {
assert.ok(true, 'ok:multiOperationsOnEachRow.loadItem');
- render(done)
+ render(done)
}).fail(function()
{
debugger;
@@ -3774,9 +3994,9 @@ window.qunitTestsArray.push({
render(done)
})
})
-
+
syncQUnit.addTest('Страница history 2', function ( assert )
- {
+ {
var done = assert.async();
if(!pmHistory.model.itemslist.results.length)
@@ -3812,6 +4032,139 @@ window.qunitTestsArray.push({
render(done)
})
});
-
+
}})
-
\ No newline at end of file
+
+
+/**
+ * Тестирование hooks
+ */
+window.qunitTestsArray.push({
+ step:1200,
+ test:function()
+{
+ syncQUnit.addTest('Страница hooks', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"hooks"})).done(function()
+ {
+ assert.ok(true, 'Успешно открыто меню hooks');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при открытиии меню hooks');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Открытие cтраницы new hook', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(spajs.open({ menuId:"new-hook"})).done(function()
+ {
+ assert.ok(true, 'Успешно открыто меню new-hook');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при открытиии меню new-hook');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Сохранение невалидного hook', function ( assert )
+ {
+ var done = assert.async();
+
+ $.when(pmHooks.addItem()).done(function()
+ {
+ debugger;
+ assert.ok(false, 'Хук успешно сохранен, а не должен был');
+ render(done)
+ }).fail(function()
+ {
+ assert.ok(true, 'Ошибка при сохранении хука, как и задумано');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Сохранение валидного hook', function ( assert )
+ {
+ var done = assert.async();
+
+ $('#filed_name').val('test-hook');
+ pmHooks.model.newItem.recipients='test-recipient';
+
+ $.when(pmHooks.addItem()).done(function()
+ {
+ assert.ok(true, 'Hook успешно создан');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при создании hook');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Изменение имени hook', function ( assert )
+ {
+ var done = assert.async();
+ var item_id=/hook\/([0-9]+)/.exec(window.location.href)[1]
+
+ $('#filed_name').val('test-hook2');
+
+ $.when(pmHooks.updateItem(item_id)).done(function()
+ {
+ assert.ok(true, 'Hook успешно изменен');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при изменении hook');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Изменение when hook на null', function ( assert )
+ {
+ var done = assert.async();
+ var item_id=/hook\/([0-9]+)/.exec(window.location.href)[1]
+
+ $('#hook-'+item_id+'-when').val('null');
+
+ $.when(pmHooks.updateItem(item_id)).done(function()
+ {
+ assert.ok(true, 'Hook успешно изменен');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при изменении hook');
+ render(done)
+ })
+ });
+
+ syncQUnit.addTest('Удаление hook', function ( assert )
+ {
+ var done = assert.async();
+ var item_id=/hook\/([0-9]+)/.exec(window.location.href)[1]
+
+ $('#filed_name').val('test-hook2');
+
+ $.when(pmHooks.deleteItem(item_id, true)).done(function()
+ {
+ assert.ok(true, 'Hook успешно удален');
+ render(done)
+ }).fail(function()
+ {
+ debugger;
+ assert.ok(false, 'Ошибка при удалении hook');
+ render(done)
+ })
+ });
+
+}})
\ No newline at end of file
diff --git a/polemarch/static/templates/filedsLib.html b/polemarch/static/templates/filedsLib.html
index 4569dcc5..f3d47eb7 100644
--- a/polemarch/static/templates/filedsLib.html
+++ b/polemarch/static/templates/filedsLib.html
@@ -74,4 +74,24 @@
<%- filed.help || '' %>