[FIX] Dataset is used to read records (read_ids method).
bzr revid: cpa@tinyerp.com-20110415093253-qx78tf0001u1cg4d
This commit is contained in:
parent
a0d4acefb1
commit
96d2e9b535
|
@ -3,8 +3,8 @@
|
||||||
"version": "2.0",
|
"version": "2.0",
|
||||||
"depends": ['base'],
|
"depends": ['base'],
|
||||||
"js": [
|
"js": [
|
||||||
'static/lib/dhtmlxGantt/codebase/dhtmlxcommon.js',
|
'static/lib/dhtmlxGantt/sources/dhtmlxcommon.js',
|
||||||
'static/lib/dhtmlxGantt/codebase/dhtmlxgantt.js',
|
'static/lib/dhtmlxGantt/sources/dhtmlxgantt.js',
|
||||||
'static/src/js/gantt.js'
|
'static/src/js/gantt.js'
|
||||||
],
|
],
|
||||||
"css": ['static/lib/dhtmlxGantt/codebase/dhtmlxgantt.css'],
|
"css": ['static/lib/dhtmlxGantt/codebase/dhtmlxgantt.css'],
|
||||||
|
|
|
@ -1,184 +1,24 @@
|
||||||
import glob, os
|
|
||||||
from xml.etree import ElementTree
|
|
||||||
import math
|
|
||||||
import simplejson
|
|
||||||
import openerpweb
|
import openerpweb
|
||||||
import time
|
from base.controllers.main import View
|
||||||
import datetime
|
|
||||||
from base.controllers.main import Xml2Json
|
|
||||||
|
|
||||||
|
|
||||||
COLOR_PALETTE = ['#f57900', '#cc0000', '#d400a8', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400',
|
class GanttView(View):
|
||||||
'#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f',
|
|
||||||
'#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00',
|
|
||||||
'#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900', ]
|
|
||||||
|
|
||||||
_colorline = ['#%02x%02x%02x' % (25 + ((r + 10) % 11) * 23, 5 + ((g + 1) % 11) * 20, 25 + ((b + 4) % 11) * 23) for r in range(11) for g in range(11) for b in range(11) ]
|
|
||||||
|
|
||||||
def choice_colors(n):
|
|
||||||
if n > len(COLOR_PALETTE):
|
|
||||||
return _colorline[0:-1:len(_colorline) / (n + 1)]
|
|
||||||
elif n:
|
|
||||||
return COLOR_PALETTE[:n]
|
|
||||||
return []
|
|
||||||
|
|
||||||
class GanttView(openerpweb.Controller):
|
|
||||||
_cp_path = "/base_gantt/ganttview"
|
_cp_path = "/base_gantt/ganttview"
|
||||||
|
|
||||||
date_start = None
|
|
||||||
date_delay = None
|
|
||||||
date_stop = None
|
|
||||||
color_field = None
|
|
||||||
|
|
||||||
day_length = 8
|
|
||||||
fields = {}
|
|
||||||
events = []
|
|
||||||
calendar_fields = {}
|
|
||||||
ids = []
|
|
||||||
model = ''
|
model = ''
|
||||||
domain = []
|
domain = []
|
||||||
context = {}
|
context = {}
|
||||||
event_res = []
|
|
||||||
colors = {}
|
|
||||||
color_values = []
|
|
||||||
|
|
||||||
@openerpweb.jsonrequest
|
@openerpweb.jsonrequest
|
||||||
def load(self, req, model, view_id):
|
def load(self, req, model, view_id):
|
||||||
m = req.session.model(model)
|
fields_view = self.fields_view_get(req, model, view_id, 'gantt')
|
||||||
r = m.fields_view_get(view_id, 'gantt')
|
return {'fields_view':fields_view}
|
||||||
r["arch"] = Xml2Json.convert_to_structure(r["arch"])
|
|
||||||
return {'fields_view':r}
|
|
||||||
|
|
||||||
@openerpweb.jsonrequest
|
|
||||||
def get_events(self, req, **kw):
|
|
||||||
|
|
||||||
self.model = kw['model']
|
|
||||||
self.fields = kw['fields']
|
|
||||||
self.day_length = kw['day_length']
|
|
||||||
self.calendar_fields = kw['calendar_fields']
|
|
||||||
self.color_field = kw.get('color_field') or self.color_field or None
|
|
||||||
self.fields[self.color_field] = ""
|
|
||||||
self.colors = kw.get('colors') or {}
|
|
||||||
self.text = self.calendar_fields['text']['name']
|
|
||||||
|
|
||||||
self.date_start = self.calendar_fields['date_start']['name']
|
|
||||||
self.fields[self.date_start] = ""
|
|
||||||
|
|
||||||
if self.calendar_fields.get('date_stop'):
|
|
||||||
self.date_stop = self.calendar_fields['date_stop']['name']
|
|
||||||
self.fields[self.date_stop] = ""
|
|
||||||
if self.calendar_fields.get('date_delay'):
|
|
||||||
self.date_delay = self.calendar_fields['date_delay']['name']
|
|
||||||
self.fields[self.date_delay] = ""
|
|
||||||
if self.calendar_fields.get('parent'):
|
|
||||||
self.parent = self.calendar_fields['parent']['name']
|
|
||||||
self.fields[self.parent] = ""
|
|
||||||
|
|
||||||
model = req.session.model(self.model)
|
|
||||||
event_ids = model.search([])
|
|
||||||
|
|
||||||
return self.create_event(event_ids, model)
|
|
||||||
|
|
||||||
def create_event(self, event_ids, model):
|
|
||||||
|
|
||||||
self.events = model.read(event_ids, self.fields.keys())
|
|
||||||
result = []
|
|
||||||
for evt in self.events:
|
|
||||||
|
|
||||||
event_res = {}
|
|
||||||
key = evt[self.color_field]
|
|
||||||
name = key
|
|
||||||
value = key
|
|
||||||
if isinstance(key, list): # M2O, XMLRPC returns List instead of Tuple
|
|
||||||
name = key[0]
|
|
||||||
value = key[-1]
|
|
||||||
evt[self.color_field] = key = key[-1]
|
|
||||||
if isinstance(key, tuple): # M2O
|
|
||||||
value, name = key
|
|
||||||
|
|
||||||
self.colors[key] = (name, value, None)
|
|
||||||
|
|
||||||
st_date = evt.get(self.date_start)
|
|
||||||
if st_date:
|
|
||||||
self.set_format(st_date)
|
|
||||||
if self.date_delay:
|
|
||||||
duration = evt.get(self.date_delay)
|
|
||||||
else:
|
|
||||||
en_date = evt.get(self.date_stop)
|
|
||||||
|
|
||||||
duration = (time.mktime(time.strptime(en_date, self.format))-\
|
|
||||||
time.mktime(time.strptime(st_date, self.format)))/ (60 * 60)
|
|
||||||
|
|
||||||
if duration > self.day_length :
|
|
||||||
d = math.floor(duration / 24)
|
|
||||||
h = duration % 24
|
|
||||||
duration = d * self.day_length + h
|
|
||||||
|
|
||||||
event_res = {}
|
|
||||||
event_res['start_date'] = st_date
|
|
||||||
event_res['duration'] = duration
|
|
||||||
event_res['text'] = evt.get(self.text)
|
|
||||||
event_res['id'] = evt['id']
|
|
||||||
event_res['parent'] = evt.get(self.parent)
|
|
||||||
result.append(event_res)
|
|
||||||
|
|
||||||
colors = choice_colors(len(self.colors))
|
|
||||||
for i, (key, value) in enumerate(self.colors.items()):
|
|
||||||
self.colors[key] = [value[0], value[1], colors[i]]
|
|
||||||
|
|
||||||
return {'result': result,'sidebar': self.colors}
|
|
||||||
|
|
||||||
def set_format(self, st_date):
|
|
||||||
if len(st_date) == 10 :
|
|
||||||
self.format = "%Y-%m-%d"
|
|
||||||
else :
|
|
||||||
self.format = "%Y-%m-%d %H:%M:%S"
|
|
||||||
return
|
|
||||||
|
|
||||||
def check_format(self, date):
|
|
||||||
if self.format == "%Y-%m-%d %H:%M:%S":
|
|
||||||
date = date + " 00:00:00"
|
|
||||||
return date
|
|
||||||
|
|
||||||
@openerpweb.jsonrequest
|
|
||||||
def on_event_resize(self, req, **kw):
|
|
||||||
if self.date_delay:
|
|
||||||
key = self.date_delay
|
|
||||||
value = kw['duration']
|
|
||||||
else:
|
|
||||||
key = self.date_stop
|
|
||||||
value = self.check_format(kw['end_date'])
|
|
||||||
try:
|
|
||||||
model = req.session.model(self.model)
|
|
||||||
res = model.write(kw['id'], {key : value})
|
|
||||||
except Exception, e:
|
|
||||||
print "eeeeeeeeeeeeeeeeeeeeeeeeeee",e
|
|
||||||
return True
|
|
||||||
|
|
||||||
@openerpweb.jsonrequest
|
|
||||||
def on_event_drag(self, req, **kw):
|
|
||||||
start_date = self.check_format(kw['start_date'])
|
|
||||||
if self.date_delay:
|
|
||||||
key = self.date_delay
|
|
||||||
value = kw['duration']
|
|
||||||
else:
|
|
||||||
key = self.date_stop
|
|
||||||
value = self.check_format(kw['end_date'])
|
|
||||||
try:
|
|
||||||
model = req.session.model(self.model)
|
|
||||||
res = model.write(kw['id'], {self.date_start : start_date, key : value})
|
|
||||||
except Exception, e:
|
|
||||||
print "eeeeeeeeeeeeeeeeeeeeeeeeeee",e
|
|
||||||
return True
|
|
||||||
|
|
||||||
@openerpweb.jsonrequest
|
@openerpweb.jsonrequest
|
||||||
def reload_gantt(self, req, **kw):
|
def reload_gantt(self, req, **kw):
|
||||||
|
|
||||||
model = req.session.model(kw['model'])
|
model = req.session.model(kw['model'])
|
||||||
if (kw['domain']):
|
domain = kw['domain']
|
||||||
domain = (kw['color_field'],'in', kw['domain'])
|
|
||||||
event_ids = model.search([domain])
|
event_ids = model.search(domain)
|
||||||
else:
|
return event_ids
|
||||||
event_ids = model.search([])
|
|
||||||
return self.create_event(event_ids, model)
|
|
||||||
|
|
|
@ -348,7 +348,7 @@ GanttProject.prototype.create = function()
|
||||||
* @type: public
|
* @type: public
|
||||||
* @topic: 0
|
* @topic: 0
|
||||||
*/
|
*/
|
||||||
function GanttChart()
|
function GanttChart(day_length)
|
||||||
{
|
{
|
||||||
this.Error = new GanttError();
|
this.Error = new GanttError();
|
||||||
this.dhtmlXMLSenderObject = new dhtmlXMLSenderObject(this);
|
this.dhtmlXMLSenderObject = new dhtmlXMLSenderObject(this);
|
||||||
|
@ -356,7 +356,7 @@ function GanttChart()
|
||||||
//settings
|
//settings
|
||||||
this.heightTaskItem = 12;
|
this.heightTaskItem = 12;
|
||||||
this.dayInPixels = 24;
|
this.dayInPixels = 24;
|
||||||
this.hoursInDay = 8;
|
this.hoursInDay = day_length;
|
||||||
this._showTreePanel = true;
|
this._showTreePanel = true;
|
||||||
this._showTooltip = true;
|
this._showTooltip = true;
|
||||||
this.isShowDescTask = false;
|
this.isShowDescTask = false;
|
||||||
|
|
|
@ -7,7 +7,8 @@ QWeb.add_template('/base_gantt/static/src/xml/base_gantt.xml');
|
||||||
openerp.base.views.add('gantt', 'openerp.base_gantt.GanttView');
|
openerp.base.views.add('gantt', 'openerp.base_gantt.GanttView');
|
||||||
openerp.base_gantt.GanttView = openerp.base.Controller.extend({
|
openerp.base_gantt.GanttView = openerp.base.Controller.extend({
|
||||||
|
|
||||||
init: function(view_manager, session, element_id, dataset, view_id) {
|
init: function(view_manager, session, element_id, dataset, view_id) {
|
||||||
|
|
||||||
this._super(session, element_id);
|
this._super(session, element_id);
|
||||||
this.view_manager = view_manager;
|
this.view_manager = view_manager;
|
||||||
this.dataset = dataset;
|
this.dataset = dataset;
|
||||||
|
@ -16,82 +17,224 @@ openerp.base_gantt.GanttView = openerp.base.Controller.extend({
|
||||||
this.fields_views = {};
|
this.fields_views = {};
|
||||||
this.widgets = {};
|
this.widgets = {};
|
||||||
this.widgets_counter = 0;
|
this.widgets_counter = 0;
|
||||||
this.fields = {};
|
this.fields = this.dataset.fields ? this.dataset.fields: {};
|
||||||
this.datarecord = {};
|
this.ids = this.dataset.ids;
|
||||||
this.calendar_fields = {};
|
this.name = "";
|
||||||
},
|
this.date_start = "";
|
||||||
do_show: function () {
|
this.date_delay = "";
|
||||||
// TODO: re-trigger search
|
this.date_stop = "";
|
||||||
this.$element.show();
|
this.color_field = "";
|
||||||
},
|
this.day_lenth = 8;
|
||||||
do_hide: function () {
|
this.colors = [];
|
||||||
this.$element.hide();
|
this.color_values = [];
|
||||||
|
this.calendar_fields = {};
|
||||||
|
this.info_fields = [];
|
||||||
|
this.domain = this.dataset._domain ? this.dataset._domain: [];
|
||||||
|
this.context = {};
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
start: function() {
|
start: function() {
|
||||||
|
|
||||||
this.rpc("/base_gantt/ganttview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
|
this.rpc("/base_gantt/ganttview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
on_loaded: function(data) {
|
on_loaded: function(data) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
this.fields_view = data.fields_view;
|
this.fields_view = data.fields_view;
|
||||||
var self = this;
|
|
||||||
this.name = this.fields_view.name || this.fields_view.arch.attrs.string;
|
this.name = this.fields_view.name || this.fields_view.arch.attrs.string;
|
||||||
this.view_id = this.fields_view.view_id;
|
this.view_id = this.fields_view.view_id;
|
||||||
|
|
||||||
this.date_start = this.fields_view.arch.attrs.date_start;
|
this.date_start = this.fields_view.arch.attrs.date_start;
|
||||||
this.date_delay = this.fields_view.arch.attrs.date_delay;
|
this.date_delay = this.fields_view.arch.attrs.date_delay;
|
||||||
this.date_stop = this.fields_view.arch.attrs.date_stop;
|
this.date_stop = this.fields_view.arch.attrs.date_stop;
|
||||||
this.color_field = this.fields_view.arch.attrs.color;
|
|
||||||
|
|
||||||
|
this.color_field = this.fields_view.arch.attrs.color;
|
||||||
this.day_length = this.fields_view.arch.attrs.day_length || 8;
|
this.day_length = this.fields_view.arch.attrs.day_length || 8;
|
||||||
this.colors = this.fields_view.arch.attrs.colors;
|
this.colors = this.fields_view.arch.attrs.colors;
|
||||||
this.fields = this.fields_view.fields;
|
|
||||||
|
|
||||||
this.text = this.fields_view.arch.children[0].children[0].attrs.name;
|
this.text = this.fields_view.arch.children[0].children[0].attrs.name;
|
||||||
this.parent = this.fields_view.arch.children[0].attrs.link;
|
this.parent = this.fields_view.arch.children[0].attrs.link;
|
||||||
|
|
||||||
this.calendar_fields['parent'] = {'name': this.parent};
|
this.format = "%Y-%m-%d";
|
||||||
this.calendar_fields['date_start'] = {'name': this.date_start};
|
this.time = "00:00:00";
|
||||||
this.calendar_fields['text'] = {'name': this.text};
|
|
||||||
if(this.date_delay)
|
self.create_gantt();
|
||||||
this.calendar_fields['date_delay'] = {'name': this.date_delay};
|
self.get_events(self.ids);
|
||||||
if(this.date_stop)
|
|
||||||
this.calendar_fields['date_stop'] = {'name': this.date_stop};
|
|
||||||
|
|
||||||
this.calendar_fields['day_length'] = this.day_length;
|
|
||||||
this.rpc('/base_gantt/ganttview/get_events',
|
|
||||||
{'model': this.model,
|
|
||||||
'fields': this.fields,
|
|
||||||
'color_field': this.color_field,
|
|
||||||
'day_length': this.day_length,
|
|
||||||
'calendar_fields': this.calendar_fields,
|
|
||||||
'colors': this.colors,
|
|
||||||
'info_fields': this.info_fields
|
|
||||||
},
|
|
||||||
function(res) {
|
|
||||||
self.create_gantt();
|
|
||||||
self.load_event(res);
|
|
||||||
})
|
|
||||||
this.$element.html(QWeb.render("GanttView", {"view": this, "fields_view": this.fields_view}));
|
this.$element.html(QWeb.render("GanttView", {"view": this, "fields_view": this.fields_view}));
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
create_gantt: function() {
|
||||||
|
|
||||||
|
ganttChartControl = new GanttChart(this.day_length);
|
||||||
|
ganttChartControl.setImagePath("/base_gantt/static/lib/dhtmlxGantt/codebase/imgs/");
|
||||||
|
ganttChartControl.setEditable(true);
|
||||||
|
ganttChartControl.showTreePanel(true);
|
||||||
|
ganttChartControl.showContextMenu(true);
|
||||||
|
ganttChartControl.showDescTask(true,'d,s-f');
|
||||||
|
ganttChartControl.showDescProject(true,'n,d');
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
get_events: function(event_ids) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
this.dataset.read_ids(event_ids, {}, function(result) {
|
||||||
|
self.load_event(result);
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
load_event: function(events) {
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
var result = events;
|
||||||
|
var project_id = new Array();
|
||||||
|
var project = new Array();
|
||||||
|
var sidebar = {}
|
||||||
|
var j = -1;
|
||||||
|
|
||||||
|
for (i in result) {
|
||||||
|
|
||||||
|
if (result[i][this.date_start] != false){
|
||||||
|
var parent_id = result[i][this.parent][0];
|
||||||
|
var parent_name = result[i][this.parent][1];
|
||||||
|
|
||||||
|
if (jQuery.inArray(parent_id, project_id) == -1){
|
||||||
|
if (parent_id == undefined){
|
||||||
|
parent_name = "";
|
||||||
|
}
|
||||||
|
j = j + 1;
|
||||||
|
project[j] = new GanttProjectInfo(parent_id, parent_name, new Date(2011, 1, 1));
|
||||||
|
project_id[j] = parent_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
var id = result[i]['id'];
|
||||||
|
var text = result[i][this.text];
|
||||||
|
|
||||||
|
var start_date = this.convert_date_format(result[i][this.date_start]);
|
||||||
|
|
||||||
|
if (this.date_stop != undefined){
|
||||||
|
if (result[i][this.date_stop] != false){
|
||||||
|
var stop_date = this.convert_date_format(result[i][this.date_stop]);
|
||||||
|
var duration= self.hours_between(start_date, stop_date);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
var duration = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
var duration = result[i][this.date_delay];
|
||||||
|
}
|
||||||
|
if (duration == false)
|
||||||
|
duration = 0
|
||||||
|
|
||||||
|
var task = new GanttTaskInfo(id, text, start_date, duration, 100, "");
|
||||||
|
|
||||||
|
k = project_id.indexOf(parent_id);
|
||||||
|
project[k].addTask(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i in project_id){
|
||||||
|
ganttChartControl.addProject(project[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
ganttChartControl.create("GanttDiv");
|
||||||
|
ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_task_end_resize(task);})
|
||||||
|
ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_task_end_drag(task);})
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
hours_between: function(date1, date2) {
|
||||||
|
|
||||||
|
var ONE_DAY = 1000 * 60 * 60 * 24
|
||||||
|
var date1_ms = date1.getTime()
|
||||||
|
var date2_ms = date2.getTime()
|
||||||
|
var difference_ms = Math.abs(date1_ms - date2_ms)
|
||||||
|
|
||||||
|
d = Math.round(difference_ms / ONE_DAY)
|
||||||
|
h = Math.round(difference_ms % ONE_DAY)
|
||||||
|
|
||||||
|
return (d * this.day_length) + h;
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
on_task_end_resize : function(task) {
|
||||||
|
|
||||||
|
var event_id = task.getId();
|
||||||
|
var data = {};
|
||||||
|
|
||||||
|
if (this.date_stop != undefined){
|
||||||
|
data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate());
|
||||||
|
}else{
|
||||||
|
data[this.date_delay] = task.getDuration();
|
||||||
|
}
|
||||||
|
this.dataset.write(event_id, data, function(result) {});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
on_task_end_drag : function(task) {
|
||||||
|
|
||||||
|
var event_id = task.getId();
|
||||||
|
var data = {};
|
||||||
|
|
||||||
|
data[this.date_start] = this.reverse_convert_date_format(task.getEST());
|
||||||
|
|
||||||
|
if (this.date_stop != undefined){
|
||||||
|
data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate());
|
||||||
|
}else{
|
||||||
|
data[this.date_delay] = task.getDuration();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.dataset.write(event_id, data, function(result) {});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
do_show: function () {
|
||||||
|
|
||||||
|
this.$element.show();
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
do_hide: function () {
|
||||||
|
|
||||||
|
this.$element.hide();
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
convert_date_format: function(date) {
|
convert_date_format: function(date) {
|
||||||
date=date+"";
|
var self = this;
|
||||||
if(typeof (date)!="string"||date.length===0){
|
|
||||||
|
if (date.length == 19){
|
||||||
|
self.format = "%Y-%m-%d %H:%M:%S";
|
||||||
|
self.time = date.split(' ')[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
date = date+"";
|
||||||
|
if(typeof (date) != "string" || date.length === 0){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var iso=date.split("-");
|
var iso=date.split("-");
|
||||||
if(iso.length===0){
|
if(iso.length === 0){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
var day = iso[2];
|
var day = iso[2];
|
||||||
|
|
||||||
var iso_hours = day.split(' ');
|
var iso_hours = day.split(' ');
|
||||||
|
|
||||||
if (iso_hours.length > 1) {
|
if (iso_hours.length > 1) {
|
||||||
day = iso_hours[0];
|
day = iso_hours[0];
|
||||||
var iso_date_hours = iso_hours[1].split(':')
|
var iso_date_hours = iso_hours[1].split(':');
|
||||||
var new_date = new Date(iso[0], iso[1] - 1, day);
|
var new_date = new Date(iso[0], iso[1] - 1, day);
|
||||||
new_date.setHours(iso_date_hours[0]);
|
new_date.setHours(iso_date_hours[0]);
|
||||||
new_date.setMinutes(iso_date_hours[1]);
|
new_date.setMinutes(iso_date_hours[1]);
|
||||||
new_date.setSeconds(iso_date_hours[2]);
|
new_date.setSeconds(iso_date_hours[2]);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var new_date = new Date(iso[0], iso[1] - 1, day);
|
var new_date = new Date(iso[0], iso[1] - 1, day);
|
||||||
|
@ -100,125 +243,52 @@ openerp.base_gantt.GanttView = openerp.base.Controller.extend({
|
||||||
new_date.setMonth(iso[1]-1);
|
new_date.setMonth(iso[1]-1);
|
||||||
new_date.setDate(day);
|
new_date.setDate(day);
|
||||||
return new_date;
|
return new_date;
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
create_gantt: function() {
|
reverse_convert_date_format: function(date) {
|
||||||
ganttChartControl = new GanttChart();
|
var self = this;
|
||||||
ganttChartControl.setImagePath("/base_gantt/static/lib/dhtmlxGantt/codebase/imgs/");
|
|
||||||
ganttChartControl.setEditable(true);
|
|
||||||
ganttChartControl.showTreePanel(true);
|
|
||||||
ganttChartControl.showContextMenu(true);
|
|
||||||
ganttChartControl.showDescTask(true,'d,s-f');
|
|
||||||
ganttChartControl.showDescProject(true,'n,d');
|
|
||||||
},
|
|
||||||
load_event: function(res) {
|
|
||||||
var self = this
|
|
||||||
var result = res.result;
|
|
||||||
var sidebar = res.sidebar;
|
|
||||||
var project_id = new Array();
|
|
||||||
var project = new Array();
|
|
||||||
var j = -1;
|
|
||||||
var self = this;
|
|
||||||
for (i in result) {
|
|
||||||
|
|
||||||
var parent_id = result[i]['parent'][0];
|
|
||||||
var parent_name = result[i]['parent'][1];
|
|
||||||
|
|
||||||
if (jQuery.inArray(parent_id, project_id) == -1){
|
|
||||||
if (parent_id == undefined){
|
|
||||||
parent_name = "";
|
|
||||||
}
|
|
||||||
j = j + 1;
|
|
||||||
project[j] = new GanttProjectInfo(parent_id, parent_name, new Date(2011, 1, 1));
|
|
||||||
project_id[j] = parent_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
var id = result[i]['id'];
|
|
||||||
var text = result[i]['text'];
|
|
||||||
var start_date = this.convert_date_format(result[i]['start_date']);
|
|
||||||
var duration = result[i]['duration'];
|
|
||||||
|
|
||||||
var task = new GanttTaskInfo(id, text, start_date, duration, 100, "");
|
|
||||||
|
|
||||||
k = project_id.indexOf(parent_id);
|
|
||||||
project[k].addTask(task);
|
|
||||||
|
|
||||||
}
|
if (self.format == "%Y-%m-%d %H:%M:%S")
|
||||||
for (i in project_id){
|
{
|
||||||
ganttChartControl.addProject(project[i]);
|
return date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate()+' '+self.time;
|
||||||
}
|
}
|
||||||
ganttChartControl.create("GanttDiv");
|
else
|
||||||
ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_task_end_resize(task);})
|
{
|
||||||
ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_task_end_drag(task);})
|
return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
|
||||||
|
}
|
||||||
|
|
||||||
//Create Sidebar
|
|
||||||
if (jQuery('#cal-sidebar-option').length == 0){
|
|
||||||
jQuery('#gantt-sidebar').append(
|
|
||||||
jQuery('<table>',{'width':'100%','cellspacing': 0, 'cellpadding': 0, 'id':'cal-sidebar-option'})
|
|
||||||
)
|
|
||||||
for(s in sidebar) {
|
|
||||||
jQuery('#cal-sidebar-option').append(
|
|
||||||
jQuery('<tr>').append(
|
|
||||||
jQuery('<td>').append(
|
|
||||||
jQuery('<div>')
|
|
||||||
.append(
|
|
||||||
jQuery('<input>',
|
|
||||||
{
|
|
||||||
'type': 'checkbox',
|
|
||||||
'id':sidebar[s][0],
|
|
||||||
'value':sidebar[s][0]
|
|
||||||
}).bind('click',function(){
|
|
||||||
self.reload_gantt(self.color_field,self.model)
|
|
||||||
}),
|
|
||||||
sidebar[s][1]
|
|
||||||
)
|
|
||||||
.css('background-color',sidebar[s][sidebar[s].length-1])
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
reload_gantt: function(color_field, model) {
|
|
||||||
var domain = [];
|
reload_gantt: function(domain) {
|
||||||
var self = this;
|
|
||||||
jQuery('input[type=checkbox]:checked','#cal-sidebar-option').each(function() {
|
var self = this;
|
||||||
domain.push(parseInt(jQuery(this).attr('id')))
|
|
||||||
});
|
|
||||||
this.rpc('/base_gantt/ganttview/reload_gantt',{
|
this.rpc('/base_gantt/ganttview/reload_gantt',{
|
||||||
'domain':domain,
|
'domain': domain,
|
||||||
'color_field':color_field,
|
'model': self.model
|
||||||
'model': model
|
},function(event_ids) {
|
||||||
},function(res) {
|
|
||||||
ganttChartControl.clearAll();
|
ganttChartControl.clearAll();
|
||||||
jQuery("#GanttDiv").children().remove();
|
jQuery("#GanttDiv").children().remove();
|
||||||
self.load_event(res);
|
self.get_events(event_ids);
|
||||||
});
|
});
|
||||||
},
|
|
||||||
reverse_convert_date_format: function(date) {
|
|
||||||
return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
on_task_end_resize : function(task) {
|
do_search: function (domains, contexts, groupbys) {
|
||||||
this.rpc('/base_gantt/ganttview/on_event_resize',
|
var self = this;
|
||||||
{'id' : task.getId(),
|
return this.rpc('/base/session/eval_domain_and_context', {
|
||||||
'end_date' : this.reverse_convert_date_format(task.getFinishDate()),
|
domains: domains,
|
||||||
'duration' : task.getDuration()
|
contexts: contexts,
|
||||||
},
|
group_by_seq: groupbys
|
||||||
function(result) {
|
}, function (results) {
|
||||||
})
|
|
||||||
},
|
self.dataset.context = results.context;
|
||||||
on_task_end_drag : function(task) {
|
self.dataset.domain = results.domain;
|
||||||
this.rpc('/base_gantt/ganttview/on_event_drag',
|
return self.reload_gantt(self.dataset.domain);
|
||||||
{'id' : task.getId(),
|
});
|
||||||
'start_date' : this.reverse_convert_date_format(task.getEST()),
|
|
||||||
'end_date' : this.reverse_convert_date_format(task.getFinishDate()),
|
|
||||||
'duration' : task.getDuration()
|
|
||||||
},
|
|
||||||
function(result) {
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// here you may tweak globals object, if any, and play with on_* or do_* callbacks on them
|
// here you may tweak globals object, if any, and play with on_* or do_* callbacks on them
|
||||||
|
|
|
@ -3,12 +3,9 @@
|
||||||
<h3 class="title"><t t-esc="view.fields_view.arch.attrs.string"/></h3>
|
<h3 class="title"><t t-esc="view.fields_view.arch.attrs.string"/></h3>
|
||||||
<table class="gantt-view" width="100%" height="100%" cellspacing="0" cellpadding="0">
|
<table class="gantt-view" width="100%" height="100%" cellspacing="0" cellpadding="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:85%">
|
<td>
|
||||||
<div style="width:100%;height:300px;position:relative" id="GanttDiv"/>
|
<div style="width:100%;height:300px;position:relative" id="GanttDiv"/>
|
||||||
</td>
|
</td>
|
||||||
<td valign = "top">
|
|
||||||
<div id="gantt-sidebar"/>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</t>
|
</t>
|
||||||
|
|
Loading…
Reference in New Issue