1
###############################################################################
3
# Copyright (C) 2007-TODAY Tiny ERP Pvt Ltd. All Rights Reserved.
7
# Developed by Tiny (http://openerp.com) and Axelor (http://axelor.com).
9
# The OpenERP web client is distributed under the "OpenERP Public License".
10
# It's based on Mozilla Public License Version (MPL) 1.1 with following
13
# - All names, links and logos of Tiny, Open ERP and Axelor must be
14
# kept as in original distribution without any changes in all software
15
# screens, especially in start-up page and the software header, even if
16
# the application source code has been changed or updated or code has been
19
# - All distributions of the software must keep source code with OEPL.
21
# - All integrations to any other software must keep source code with OEPL.
23
# If you need commercial licence to remove this kind of restriction please
26
# You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html
28
###############################################################################
33
from openerp.tools import expose
37
from openerp import rpc
38
from openerp import tools
39
from openerp import common
41
from openerp.i18n import format
42
from openerp.utils import TinyDict
43
from openerp.controllers.base import SecuredController
47
import openerp.widgets.tinycalendar as tc
49
class TinyCalendar(Form):
52
def mini(self, year, month, forweek=False):
57
params.forweek = forweek
59
day = tc.utils.Day(params.year, params.month, 1)
60
minical = tc.widgets.MiniCalendar(day, forweek=params.forweek, highlight=False)
62
return minical.render()
65
def get(self, day, mode, **kw):
67
params, data = TinyDict.split(kw)
70
options.selected_day = params.selected_day
72
day = time.strptime(day, '%Y-%m-%d')
75
options.month = day[1]
81
#options.colors = params.colors
83
options.colors = eval(kw['_terp_colors'])
87
if params.color_values:
88
options.color_values = ustr(params.color_values).split(',')
90
options.search_domain = params.search_domain or []
91
options.use_search = params.use_search
93
params.kalendar = options
95
form = self.create_form(params)
96
return form.screen.widget.render()
99
def delete(self, **kw):
101
params, data = TinyDict.split(kw)
105
ctx = rpc.session.context.copy()
106
ctx.update(params.context or {})
107
ctx = tools.context_with_concurrency_info(ctx, params.concurrency_info)
109
proxy = rpc.RPCProxy(params.model)
112
proxy.unlink([params.id], ctx)
116
return dict(error=error)
119
def save(self, **kw):
120
params, data = TinyDict.split(kw)
123
ds = tc.utils.parse_datetime(params.starts)
124
de = tc.utils.parse_datetime(params.ends)
126
data[params.fields['date_start']['name']] = format.parse_datetime(ds.timetuple())
128
if 'date_stop' in params.fields:
129
data[params.fields['date_stop']['name']] = format.parse_datetime(de.timetuple())
130
elif 'date_delay' in params.fields:
131
# convert the end time in hours
132
day_length = params.fields['day_length']
134
tds = time.mktime(ds.timetuple())
135
tde = time.mktime(de.timetuple())
137
n = (tde - tds) / (60 * 60)
140
d = math.floor(n / 24)
143
n = d * day_length + h
145
data[params.fields['date_delay']['name']] = n
147
ctx = rpc.session.context.copy()
148
ctx.update(params.context or {})
149
ctx = tools.context_with_concurrency_info(ctx, params.concurrency_info)
153
proxy = rpc.RPCProxy(params.model)
156
res = proxy.write([params.id], data, ctx)
157
info = proxy.read([params.id], ['__last_update'])[0]['__last_update']
158
info = {'%s,%s'%(params.model, params.id): info}
162
return dict(error=error, info=info)
165
def duplicate(self, **kw):
166
params, data = TinyDict.split(kw)
172
proxy = rpc.RPCProxy(model)
175
new_id = proxy.copy(id, {}, ctx)
179
return dict(id=new_id)
181
def _get_gantt_records(self, model, ids=None, group=None):
184
record = {'id': group['id']}
185
record['items'] = {'name': group['title']}
186
record['action'] = None
187
record['target'] = None
188
record['icon'] = None
189
record['children'] = self._get_gantt_records(model, group['items'])
192
proxy = rpc.RPCProxy(model)
193
ctx = rpc.session.context.copy()
198
record['items'] = {'name': proxy.name_get([id], ctx)[0][-1]}
199
record['action'] = 'javascript: void(0)'
200
record['target'] = None
201
record['icon'] = None
202
record['children'] = None
204
records.append(record)
209
def gantt_data(self, **kw):
210
params, data = TinyDict.split(kw)
214
for group in params.groups:
215
records += self._get_gantt_records(params.model, None, group)
217
records = self._get_gantt_records(params.model, params.ids or [])
219
return dict(records=records)
222
def gantt_reorder(self, **kw):
223
params, data = TinyDict.split(kw)
226
ids = params.ids or []
229
level_value = params.level_value
231
proxy = rpc.RPCProxy(model)
232
fields = proxy.fields_get([])
234
if id and level and level_value:
236
proxy.write([id], {level['link']: level_value})
238
return dict(error=ustr(e))
240
if 'sequence' not in fields:
241
return dict(error=None)
243
res = proxy.read(ids, ['sequence'])
245
sequence = [r['sequence'] for r in res]
250
if seq not in sequence2:
251
sequence2.append(seq)
253
sequence2.append(sequence2[-1]+1)
255
for n, id in enumerate(ids):
258
proxy.write([id], {'sequence': seq})
260
return dict(error=ustr(e))
264
class CalendarPopup(Form):
266
path = '/calpopup' # mapping from root
268
@expose(template="templates/calpopup.mako")
269
def create(self, params, tg_errors=None):
270
params.editable = True
272
if params.id and cherrypy.request.path_info == '/calpopup/view':
273
params.load_counter = 2
275
form = self.create_form(params, tg_errors)
276
return dict(form=form, params=params)
279
def get_defaults(self, **kw):
280
params, data = TinyDict.split(kw)
283
ds = tc.utils.parse_datetime(params.starts)
284
de = tc.utils.parse_datetime(params.ends)
286
if 'date_stop' in params.fields:
287
kind = params.fields['date_stop']['kind']
288
data[params.fields['date_stop']['name']] = format.format_datetime(de.timetuple(), kind)
290
elif 'date_delay' in params.fields:
291
# convert the end time in hours
292
day_length = params.fields['day_length']
294
tds = time.mktime(ds.timetuple())
295
tde = time.mktime(de.timetuple())
297
n = (tde - tds) / (60 * 60)
300
d = math.floor(n / 24)
303
n = d * day_length + h
305
data[params.fields['date_delay']['name']] = n
307
kind = params.fields['date_start']['kind']
308
data[params.fields['date_start']['name']] = format.format_datetime(ds.timetuple(), kind)
310
ctx = rpc.session.context.copy()
311
ctx.update(params.context or {})
315
# vim: ts=4 sts=4 sw=4 si et