1
# -*- encoding: utf-8 -*-
2
##############################################################################
4
# OpenERP, Open Source Management Solution
5
# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
8
# This program is free software: you can redistribute it and/or modify
9
# it under the terms of the GNU General Public License as published by
10
# the Free Software Foundation, either version 3 of the License, or
11
# (at your option) any later version.
13
# This program is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
15
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
# GNU General Public License for more details.
18
# You should have received a copy of the GNU General Public License
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
21
##############################################################################
38
DT_FORMAT = '%Y-%m-%d'
39
DHM_FORMAT = '%Y-%m-%d %H:%M:%S'
40
HM_FORMAT = '%H:%M:%S'
42
LDFMT = locale.nl_langinfo(locale.D_FMT)
43
for x,y in [('%y','%Y'),('%B',''),('%A','')]:
44
LDFMT = LDFMT.replace(x, y)
46
class calendar(interface.widget_interface):
47
def __init__(self, window, parent, model, attrs={}):
48
interface.widget_interface.__init__(self, window, parent, attrs=attrs)
50
self.widget = date_widget.ComplexEntry(self.format, spacing=3)
51
self.entry = self.widget.widget
52
self.entry.set_property('activates_default', True)
53
self.entry.connect('button_press_event', self._menu_open)
54
self.entry.connect('activate', self.sig_activate)
55
self.entry.connect('focus-in-event', lambda x,y: self._focus_in())
56
self.entry.connect('focus-out-event', lambda x,y: self._focus_out())
58
tooltips = gtk.Tooltips()
59
self.eb = gtk.EventBox()
60
tooltips.set_tip(self.eb, _('Open the calendar widget'))
62
self.eb.set_events(gtk.gdk.BUTTON_PRESS)
63
self.eb.connect('button_press_event', self.cal_open, model, self._window)
65
img.set_from_stock('gtk-zoom-in', gtk.ICON_SIZE_MENU)
66
img.set_alignment(0.5, 0.5)
68
self.widget.pack_start(self.eb, expand=False, fill=False)
72
def _color_widget(self):
75
def _readonly_set(self, value):
76
interface.widget_interface._readonly_set(self, value)
77
self.entry.set_editable(not value)
78
self.entry.set_sensitive(not value)
79
self.eb.set_sensitive(not value)
81
def get_value(self, model):
82
str = self.entry.get_text()
86
date = time.strptime(str, self.format)
89
return time.strftime(DT_FORMAT, date)
91
def set_value(self, model, model_field):
92
model_field.set_client(model, self.get_value(model))
95
def display(self, model, model_field):
99
super(calendar, self).display(model, model_field)
100
value = model_field.get(model)
106
date = time.strptime(value, DT_FORMAT)
107
t=time.strftime(self.format, date)
108
if len(t) > self.entry.get_width_chars():
109
self.entry.set_width_chars(len(t))
110
self.entry.set_text(t)
113
def cal_open(self, widget, event, model=None, window=None):
115
common.message(_('This widget is readonly !'))
119
window = service.LocalService('gui.main').window
121
win = gtk.Dialog(_('OpenERP - Date selection'), window,
122
gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
123
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
124
gtk.STOCK_OK, gtk.RESPONSE_OK))
125
win.set_icon(common.OPENERP_ICON)
128
cal.display_options(gtk.CALENDAR_SHOW_HEADING|gtk.CALENDAR_SHOW_DAY_NAMES|gtk.CALENDAR_SHOW_WEEK_NUMBERS)
129
cal.connect('day-selected-double-click', lambda *x: win.response(gtk.RESPONSE_OK))
130
win.vbox.pack_start(cal, expand=True, fill=True)
134
val = self.get_value(model)
136
cal.select_month(int(val[5:7])-1, int(val[0:4]))
137
cal.select_day(int(val[8:10]))
142
if response == gtk.RESPONSE_OK:
143
year, month, day = cal.get_date()
144
dt = DT.date(year, month+1, day)
145
self.entry.set_text(dt.strftime(LDFMT))
150
class datetime(interface.widget_interface):
151
def __init__(self, window, parent, model, attrs={}):
152
interface.widget_interface.__init__(self, window, parent, model, attrs=attrs)
153
self.format = LDFMT+' %H:%M:%S'
154
self.widget = date_widget.ComplexEntry(self.format, spacing=3)
155
self.entry = self.widget.widget
156
self.entry.set_property('activates_default', True)
157
self.entry.connect('button_press_event', self._menu_open)
158
self.entry.connect('focus-in-event', lambda x,y: self._focus_in())
159
self.entry.connect('focus-out-event', lambda x,y: self._focus_out())
161
tooltips = gtk.Tooltips()
163
tooltips.set_tip(eb, _('Open the calendar widget'))
165
eb.set_events(gtk.gdk.BUTTON_PRESS)
166
eb.connect('button_press_event', self.cal_open, model, self._window)
168
img.set_from_stock('gtk-zoom-in', gtk.ICON_SIZE_MENU)
169
img.set_alignment(0.5, 0.5)
171
self.widget.pack_start(eb, expand=False, fill=False)
175
def _color_widget(self):
178
def _readonly_set(self, value):
179
self.readonly = value
180
self.entry.set_editable(not value)
181
self.entry.set_sensitive(not value)
183
def get_value(self, model, timezone=True):
184
str = self.entry.get_text()
188
date = time.strptime(str, self.format)
191
if 'tz' in rpc.session.context and timezone:
194
lzone = pytz.timezone(rpc.session.context['tz'])
195
szone = pytz.timezone(rpc.session.timezone)
196
dt = DT.datetime(date[0], date[1], date[2], date[3], date[4], date[5], date[6])
197
ldt = lzone.localize(dt, is_dst=True)
198
sdt = ldt.astimezone(szone)
199
date = sdt.timetuple()
202
return time.strftime(DHM_FORMAT, date)
204
def set_value(self, model, model_field):
205
model_field.set_client(model, self.get_value(model))
208
def display(self, model, model_field):
210
return self.show(False)
211
super(datetime, self).display(model, model_field)
212
self.show(model_field.get(model))
214
def show(self, dt_val, timezone=True):
218
date = time.strptime(dt_val, DHM_FORMAT)
219
if 'tz' in rpc.session.context and timezone:
222
lzone = pytz.timezone(rpc.session.context['tz'])
223
szone = pytz.timezone(rpc.session.timezone)
224
dt = DT.datetime(date[0], date[1], date[2], date[3], date[4], date[5], date[6])
225
sdt = szone.localize(dt, is_dst=True)
226
ldt = sdt.astimezone(lzone)
227
date = ldt.timetuple()
230
t=time.strftime(self.format, date)
231
if len(t) > self.entry.get_width_chars():
232
self.entry.set_width_chars(len(t))
233
self.entry.set_text(t)
236
def cal_open(self, widget, event, model=None, window=None):
238
common.message(_('This widget is readonly !'))
241
win = gtk.Dialog(_('OpenERP - Date selection'), window,
242
gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT,
243
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
244
gtk.STOCK_OK, gtk.RESPONSE_OK))
247
hbox.pack_start(gtk.Label(_('Hour:')), expand=False, fill=False)
248
hour = gtk.SpinButton(gtk.Adjustment(0, 0, 23, 1, 5), 1, 0)
249
hbox.pack_start(hour, expand=True, fill=True)
250
hbox.pack_start(gtk.Label(_('Minute:')), expand=False, fill=False)
251
minute = gtk.SpinButton(gtk.Adjustment(0, 0, 59, 1, 10), 1, 0)
252
hbox.pack_start(minute, expand=True, fill=True)
253
win.vbox.pack_start(hbox, expand=False, fill=True)
256
cal.display_options(gtk.CALENDAR_SHOW_HEADING|gtk.CALENDAR_SHOW_DAY_NAMES|gtk.CALENDAR_SHOW_WEEK_NUMBERS)
257
cal.connect('day-selected-double-click', lambda *x: win.response(gtk.RESPONSE_OK))
258
win.vbox.pack_start(cal, expand=True, fill=True)
262
val = self.get_value(model, timezone=False)
264
hour.set_value(int(val[11:13]))
265
minute.set_value(int(val[-5:-3]))
266
cal.select_month(int(val[5:7])-1, int(val[0:4]))
267
cal.select_day(int(val[8:10]))
269
hour.set_value(time.localtime()[3])
270
minute.set_value(time.localtime()[4])
274
if response == gtk.RESPONSE_OK:
275
hr = int(hour.get_value())
276
mi = int(minute.get_value())
280
date = DT.datetime(dt[0], month, day, hr, mi)
281
value = time.strftime(DHM_FORMAT, date.timetuple())
282
self.show(value, timezone=False)
287
class stime(interface.widget_interface):
288
def __init__(self, window, parent, model, attrs={}):
289
interface.widget_interface.__init__(self, parent, attrs=attrs)
291
self.format = '%H:%M:%S'
292
self.widget = date_widget.ComplexEntry(self.format, spacing=3)
293
self.entry = self.widget.widget
296
def _readonly_set(self, value):
297
self.readonly = value
298
self.entry.set_editable(not value)
299
self.entry.set_sensitive(not value)
301
def _color_widget(self):
304
def get_value(self, model):
305
str = self.entry.get_text()
309
t = time.strptime(str, self.format)
312
return time.strftime(HM_FORMAT, t)
314
def set_value(self, model, model_field):
315
res = self.get_value(model)
316
model_field.set_client(model, res)
319
def display(self, model, model_field):
321
return self.show(False)
322
super(stime, self).display(model, model_field)
323
self.entry.set_text(model_field.get(model) or '00:00:00')
326
def show(self, dt_val, timezone=True):
330
date = time.strptime(dt_val, HM_FORMAT)
331
if 'tz' in rpc.session.context and timezone:
334
lzone = pytz.timezone(rpc.session.context['tz'])
335
szone = pytz.timezone(rpc.session.timezone)
336
dt = DT.datetime(date[0], date[1], date[2], date[3], date[4], date[5], date[6])
337
sdt = szone.localize(dt, is_dst=True)
338
ldt = sdt.astimezone(lzone)
339
date = ldt.timetuple()
342
t=time.strftime(self.format, date)
343
if len(t) > self.entry.get_width_chars():
344
self.entry.set_width_chars(len(t))
345
self.entry.set_text(t)
349
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: