~ubuntu-branches/ubuntu/trusty/openerp-client/trusty

« back to all changes in this revision

Viewing changes to bin/widget/view/form_gtk/calendar.py

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-12-07 20:17:00 UTC
  • Revision ID: james.westby@ubuntu.com-20081207201700-a875pic3sd7xkoru
Tags: upstream-5.0.0~alpha
ImportĀ upstreamĀ versionĀ 5.0.0~alpha

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- encoding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
4
#    OpenERP, Open Source Management Solution   
 
5
#    Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
 
6
#    $Id$
 
7
#
 
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.
 
12
#
 
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.
 
17
#
 
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/>.
 
20
#
 
21
##############################################################################
 
22
 
 
23
import time
 
24
import datetime as DT
 
25
import gtk
 
26
 
 
27
import gettext
 
28
 
 
29
import common
 
30
import interface
 
31
import locale
 
32
import rpc
 
33
import service
 
34
import tools
 
35
 
 
36
import date_widget
 
37
 
 
38
DT_FORMAT = '%Y-%m-%d'
 
39
DHM_FORMAT = '%Y-%m-%d %H:%M:%S'
 
40
HM_FORMAT = '%H:%M:%S'
 
41
 
 
42
LDFMT = locale.nl_langinfo(locale.D_FMT)
 
43
for x,y in [('%y','%Y'),('%B',''),('%A','')]:
 
44
    LDFMT = LDFMT.replace(x, y)
 
45
 
 
46
class calendar(interface.widget_interface):
 
47
    def __init__(self, window, parent, model, attrs={}):
 
48
        interface.widget_interface.__init__(self, window, parent, attrs=attrs)
 
49
        self.format = LDFMT
 
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())
 
57
 
 
58
        tooltips = gtk.Tooltips()
 
59
        self.eb = gtk.EventBox()
 
60
        tooltips.set_tip(self.eb, _('Open the calendar widget'))
 
61
        tooltips.enable()
 
62
        self.eb.set_events(gtk.gdk.BUTTON_PRESS)
 
63
        self.eb.connect('button_press_event', self.cal_open, model, self._window)
 
64
        img = gtk.Image()
 
65
        img.set_from_stock('gtk-zoom-in', gtk.ICON_SIZE_MENU)
 
66
        img.set_alignment(0.5, 0.5)
 
67
        self.eb.add(img)
 
68
        self.widget.pack_start(self.eb, expand=False, fill=False)
 
69
 
 
70
        self.readonly=False
 
71
 
 
72
    def _color_widget(self):
 
73
        return self.entry
 
74
 
 
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)
 
80
 
 
81
    def get_value(self, model):
 
82
        str = self.entry.get_text()
 
83
        if str=='':
 
84
            return False
 
85
        try:
 
86
            date = time.strptime(str, self.format)
 
87
        except:
 
88
            return False
 
89
        return time.strftime(DT_FORMAT, date)
 
90
 
 
91
    def set_value(self, model, model_field):
 
92
        model_field.set_client(model, self.get_value(model))
 
93
        return True
 
94
 
 
95
    def display(self, model, model_field):
 
96
        if not model_field:
 
97
            self.entry.clear()
 
98
            return False
 
99
        super(calendar, self).display(model, model_field)
 
100
        value = model_field.get(model)
 
101
        if not value:
 
102
            self.entry.clear()
 
103
        else:
 
104
            if len(value)>10:
 
105
                value=value[:10]
 
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)
 
111
        return True
 
112
 
 
113
    def cal_open(self, widget, event, model=None, window=None):
 
114
        if self.readonly:
 
115
            common.message(_('This widget is readonly !'))
 
116
            return True
 
117
 
 
118
        if not window:
 
119
            window = service.LocalService('gui.main').window
 
120
 
 
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)
 
126
 
 
127
        cal = gtk.Calendar()
 
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)
 
131
        win.show_all()
 
132
 
 
133
        try:
 
134
            val = self.get_value(model)
 
135
            if val:
 
136
                cal.select_month(int(val[5:7])-1, int(val[0:4]))
 
137
                cal.select_day(int(val[8:10]))
 
138
        except ValueError:
 
139
            pass
 
140
 
 
141
        response = win.run()
 
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))
 
146
        self._focus_out()
 
147
        window.present()
 
148
        win.destroy()
 
149
 
 
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())
 
160
 
 
161
        tooltips = gtk.Tooltips()
 
162
        eb = gtk.EventBox()
 
163
        tooltips.set_tip(eb, _('Open the calendar widget'))
 
164
        tooltips.enable()
 
165
        eb.set_events(gtk.gdk.BUTTON_PRESS)
 
166
        eb.connect('button_press_event', self.cal_open, model, self._window)
 
167
        img = gtk.Image()
 
168
        img.set_from_stock('gtk-zoom-in', gtk.ICON_SIZE_MENU)
 
169
        img.set_alignment(0.5, 0.5)
 
170
        eb.add(img)
 
171
        self.widget.pack_start(eb, expand=False, fill=False)
 
172
 
 
173
        self.readonly=False
 
174
 
 
175
    def _color_widget(self):
 
176
        return self.entry
 
177
 
 
178
    def _readonly_set(self, value):
 
179
        self.readonly = value
 
180
        self.entry.set_editable(not value)
 
181
        self.entry.set_sensitive(not value)
 
182
 
 
183
    def get_value(self, model, timezone=True):
 
184
        str = self.entry.get_text()
 
185
        if str=='':
 
186
            return False
 
187
        try:
 
188
            date = time.strptime(str, self.format)
 
189
        except:
 
190
            return False
 
191
        if 'tz' in rpc.session.context and timezone:
 
192
            try:
 
193
                import pytz
 
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()
 
200
            except:
 
201
                pass
 
202
        return time.strftime(DHM_FORMAT, date)
 
203
 
 
204
    def set_value(self, model, model_field):
 
205
        model_field.set_client(model, self.get_value(model))
 
206
        return True
 
207
 
 
208
    def display(self, model, model_field):
 
209
        if not model_field:
 
210
            return self.show(False)
 
211
        super(datetime, self).display(model, model_field)
 
212
        self.show(model_field.get(model))
 
213
 
 
214
    def show(self, dt_val, timezone=True):
 
215
        if not dt_val:
 
216
            self.entry.clear()
 
217
        else:
 
218
            date = time.strptime(dt_val, DHM_FORMAT)
 
219
            if 'tz' in rpc.session.context and timezone:
 
220
                try:
 
221
                    import pytz
 
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()
 
228
                except:
 
229
                    pass
 
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)
 
234
        return True
 
235
 
 
236
    def cal_open(self, widget, event, model=None, window=None):
 
237
        if self.readonly:
 
238
            common.message(_('This widget is readonly !'))
 
239
            return True
 
240
 
 
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))
 
245
 
 
246
        hbox = gtk.HBox()
 
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)
 
254
 
 
255
        cal = gtk.Calendar()
 
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)
 
259
        win.show_all()
 
260
 
 
261
        try:
 
262
            val = self.get_value(model, timezone=False)
 
263
            if val:
 
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]))
 
268
            else:
 
269
                hour.set_value(time.localtime()[3])
 
270
                minute.set_value(time.localtime()[4])
 
271
        except ValueError:
 
272
            pass
 
273
        response = win.run()
 
274
        if response == gtk.RESPONSE_OK:
 
275
            hr = int(hour.get_value())
 
276
            mi = int(minute.get_value())
 
277
            dt = cal.get_date()
 
278
            month = int(dt[1])+1
 
279
            day = int(dt[2])
 
280
            date = DT.datetime(dt[0], month, day, hr, mi)
 
281
            value = time.strftime(DHM_FORMAT, date.timetuple())
 
282
            self.show(value, timezone=False)
 
283
        self._focus_out()
 
284
        win.destroy()
 
285
 
 
286
 
 
287
class stime(interface.widget_interface):
 
288
    def __init__(self, window, parent, model, attrs={}):
 
289
        interface.widget_interface.__init__(self, parent, attrs=attrs)
 
290
 
 
291
        self.format = '%H:%M:%S'
 
292
        self.widget = date_widget.ComplexEntry(self.format, spacing=3)
 
293
        self.entry = self.widget.widget
 
294
        self.value=False
 
295
 
 
296
    def _readonly_set(self, value):
 
297
        self.readonly = value
 
298
        self.entry.set_editable(not value)
 
299
        self.entry.set_sensitive(not value)
 
300
 
 
301
    def _color_widget(self):
 
302
        return self.entry
 
303
 
 
304
    def get_value(self, model):
 
305
        str = self.entry.get_text()
 
306
        if str=='':
 
307
            res = False
 
308
        try:
 
309
            t = time.strptime(str, self.format)
 
310
        except:
 
311
            return False
 
312
        return time.strftime(HM_FORMAT, t)
 
313
 
 
314
    def set_value(self, model, model_field):
 
315
        res = self.get_value(model)
 
316
        model_field.set_client(model, res)
 
317
        return True
 
318
 
 
319
    def display(self, model, model_field):
 
320
        if not 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')
 
324
        return True
 
325
 
 
326
    def show(self, dt_val, timezone=True):
 
327
        if not dt_val:
 
328
            self.entry.clear()
 
329
        else:
 
330
            date = time.strptime(dt_val, HM_FORMAT)
 
331
            if 'tz' in rpc.session.context and timezone:
 
332
                try:
 
333
                    import pytz
 
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()
 
340
                except:
 
341
                    pass
 
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)
 
346
        return True
 
347
 
 
348
 
 
349
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
350