apimodellist & articlelist

This commit is contained in:
Ludovic Stephan 2017-03-08 10:47:51 -03:00
parent d5dfd5fa93
commit a05a075962

View file

@ -251,7 +251,7 @@ class APIModelObject extends ModelObject {
$.getJSON(this.url_object, api_options) $.getJSON(this.url_object, api_options)
.done(function (json, textStatus, jqXHR) { .done(function (json, textStatus, jqXHR) {
that.from(json) that.from(json);
on_success(json, textStatus, jqXHR); on_success(json, textStatus, jqXHR);
}) })
.fail(on_error); .fail(on_error);
@ -498,7 +498,7 @@ class ArticleCategory extends ModelObject {
* @default <tt>'article_category'</tt> * @default <tt>'article_category'</tt>
* @see {@link Models.ModelObject.verbose_name[ModelObject.verbose_name} * @see {@link Models.ModelObject.verbose_name[ModelObject.verbose_name}
*/ */
static get verbose_name() { return 'article_category'; } static get verbose_name() { return 'category'; }
/** /**
* @default {@link Formatters.ArticleCategoryFormatter} * @default {@link Formatters.ArticleCategoryFormatter}
@ -589,13 +589,6 @@ class ModelList {
}); });
} }
/**
* Templates used to render the different elements
* @abstract
* @type {string[]}
*/
static get templates() { return []; }
/** /**
* Creates empty instance and populates it with data if given * Creates empty instance and populates it with data if given
* @param {Object[]} [datalist=[]] * @param {Object[]} [datalist=[]]
@ -664,31 +657,32 @@ class ModelList {
} }
/** /**
* Renders an element (and all its offspring) and appends it to the given container. * Renders an element (and all its offspring) and returns the
* Returns the completed container * corresponding jQuery object.
* @param {jQuery} $container
* @param {Models.ModelObject} elt * @param {Models.ModelObject} elt
* @param {Object} templates Templates to render each model
* @param {Object} [options] Options for element render method * @param {Object} [options] Options for element render method
*/ */
render_element($container, elt, options) { render_element(elt, templates, options) {
var depth = this.names.indexOf(elt.constructor.verbose_name); var name = elt.constructor.verbose_name;
var depth = this.names.indexOf(name);
var template = templates[name];
if (depth == -1) { if (depth == -1) {
return $(); return $();
} else if (depth == 0) { } else if (depth == 0) {
$container.append(elt.display($(this.constructor.templates[0]), options)); return elt.display($(template), options);
return $container;
} else { } else {
var name = this.constructor.names[depth];
var child_model = this.constructor.models[depth-1]; var child_model = this.constructor.models[depth-1];
var children = this.data[child_model.verbose_name] var children = this.data[child_model.verbose_name]
.filter(v => v[name].id == elt.id) ; .filter(v => v[name].id == elt.id) ;
children.sort(child_model.compare); children.sort(child_model.compare);
$container.append(elt.display($(this.constructor.templates[depth]), options)); $container = elt.display($(template), options);
$container.attr('data'+name+'id', elt.id);
for (let child of children) { for (let child of children) {
this.render_element($container, child, options); $container.append(this.render_element(child, templates, options));
} }
return $container; return $container;
@ -698,21 +692,110 @@ class ModelList {
/** /**
* Display stored data in container. * Display stored data in container.
* @param {jQuery} $container * @param {jQuery} $container
* @param {Object} templates Templates to render each model
* @param {Object} [options] Options for element render method * @param {Object} [options] Options for element render method
*/ */
display($container, options) { display($container, templates, options) {
var root_model = this.constructor.models[this.constructor.models.length-1]; var root_model = this.constructor.models[this.constructor.models.length-1];
var roots = this.data[root_model.verbose_name]; var roots = this.data[root_model.verbose_name];
roots.sort(root_model.compare); roots.sort(root_model.compare);
for (let root of roots) { for (let root of roots) {
this.render_element($container, root, options); $container.append(this.render_element(root, templates, options);
} }
return $container; return $container;
} }
/**
* Find instance in data matching given properties.
* @param {class} model
* @param {Object} props Properties to match
*/
find(model, props) {
if (!this.constructor.models.find(model)) {
return undefined ;
}
return this.data[model.verbose_name].find(function(v) {
for (let key in props) {
if (v[key] !== props[key])
return false;
}
return true;
});
}
} }
/**
* Describes a model list that can be filled through API.
* @extends Models.ModelList
* @memberof Models
*/
class APIModelList extends ModelList {
/**
* Request url to fill the model.
* @abstract
* @type {string}
*/
static get url_model() {}
/**
* Fills the instance with distant data. It sends a GET HTTP request to
* {@link Models.APIModelList#url_model}.
* @param {object} [api_options] Additional data appended to the request.
* @param {jQueryAjaxSuccess} [on_success] A function to be called if the request succeeds.
* @param {jQueryAjaxError} [on_error] A function to be called if the request fails.
*/
fromAPI(api_options, on_success, on_error) {
var that = this;
api_options = api_options || {}
on_success = on_success || $.noop;
on_error = on_error || $.noop;
api_options['format'] = 'json';
$.getJSON(this.url_model, api_options)
.done(function(json, textStatus, jqXHR) {
that.from(json);
on_success(json, textStatus, jqXHR);
})
.fail(on_error);
}
}
/**
* ArticleList model. Can be accessed through API.
* @extends Models.APIModelList
* @memberof Models
*/
class ArticleList extends APIModelList {
/**
* Default structure for ArticleList instances
* @abstract
* @default <tt>[Article, ArticleCategory]</tt>
*/
static get models() {
return [Article, ArticleCategory];
}
/**
* Default url to get ArticlList data
* @abstract
* @default <tt>django-js-reverse('kfet.kpsul.articles_data')</tt>
* @see {@link Models.APIModelList.url_model|APIModelList.url_model}
*/
static get url_model {
return Urls['kfet.kpsul.articles_data'];
}
/* ---------- ---------- */ /* ---------- ---------- */
/** /**