~ubuntu-branches/ubuntu/natty/openerp-web/natty

« back to all changes in this revision

Viewing changes to openerp/controllers/tinycalendar.py

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2010-09-13 09:21:22 UTC
  • Revision ID: james.westby@ubuntu.com-20100913092122-0eovj11cxresot89
Tags: upstream-5.0.12+dfsg
ImportĀ upstreamĀ versionĀ 5.0.12+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
###############################################################################
 
2
#
 
3
# Copyright (C) 2007-TODAY Tiny ERP Pvt Ltd. All Rights Reserved.
 
4
#
 
5
# $Id$
 
6
#
 
7
# Developed by Tiny (http://openerp.com) and Axelor (http://axelor.com).
 
8
#
 
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
 
11
# restrictions:
 
12
#
 
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
 
17
#     added.
 
18
#
 
19
# -   All distributions of the software must keep source code with OEPL.
 
20
#
 
21
# -   All integrations to any other software must keep source code with OEPL.
 
22
#
 
23
# If you need commercial licence to remove this kind of restriction please
 
24
# contact us.
 
25
#
 
26
# You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html
 
27
#
 
28
###############################################################################
 
29
 
 
30
import time
 
31
import math
 
32
 
 
33
from openerp.tools import expose
 
34
 
 
35
import cherrypy
 
36
 
 
37
from openerp import rpc
 
38
from openerp import tools
 
39
from openerp import common
 
40
 
 
41
from openerp.i18n import format
 
42
from openerp.utils import TinyDict
 
43
from openerp.controllers.base import SecuredController
 
44
 
 
45
from form import Form
 
46
 
 
47
import openerp.widgets.tinycalendar as tc
 
48
 
 
49
class TinyCalendar(Form):
 
50
 
 
51
    @expose()
 
52
    def mini(self, year, month, forweek=False):
 
53
        params = TinyDict()
 
54
 
 
55
        params.year = year
 
56
        params.month = month
 
57
        params.forweek = forweek
 
58
 
 
59
        day = tc.utils.Day(params.year, params.month, 1)
 
60
        minical = tc.widgets.MiniCalendar(day, forweek=params.forweek, highlight=False)
 
61
 
 
62
        return minical.render()
 
63
 
 
64
    @expose()
 
65
    def get(self, day, mode, **kw):
 
66
 
 
67
        params, data = TinyDict.split(kw)
 
68
 
 
69
        options = TinyDict()
 
70
        options.selected_day = params.selected_day
 
71
 
 
72
        day = time.strptime(day, '%Y-%m-%d')
 
73
 
 
74
        options.year = day[0]
 
75
        options.month = day[1]
 
76
 
 
77
        options.date1 = day
 
78
        options.mode = mode
 
79
 
 
80
        if params.colors:
 
81
            #options.colors = params.colors
 
82
            try:
 
83
                options.colors = eval(kw['_terp_colors'])
 
84
            except:
 
85
                pass
 
86
 
 
87
        if params.color_values:
 
88
            options.color_values = ustr(params.color_values).split(',')
 
89
 
 
90
        options.search_domain = params.search_domain or []
 
91
        options.use_search = params.use_search
 
92
 
 
93
        params.kalendar = options
 
94
 
 
95
        form = self.create_form(params)
 
96
        return form.screen.widget.render()
 
97
 
 
98
    @expose('json')
 
99
    def delete(self, **kw):
 
100
 
 
101
        params, data = TinyDict.split(kw)
 
102
 
 
103
        error = None
 
104
        
 
105
        ctx = rpc.session.context.copy()
 
106
        ctx.update(params.context or {})
 
107
        ctx = tools.context_with_concurrency_info(ctx, params.concurrency_info)
 
108
        
 
109
        proxy = rpc.RPCProxy(params.model)
 
110
 
 
111
        try:
 
112
            proxy.unlink([params.id], ctx)
 
113
        except Exception, e:
 
114
            error = ustr(e)
 
115
 
 
116
        return dict(error=error)
 
117
 
 
118
    @expose('json')
 
119
    def save(self, **kw):
 
120
        params, data = TinyDict.split(kw)
 
121
 
 
122
        data = {}
 
123
        ds = tc.utils.parse_datetime(params.starts)
 
124
        de = tc.utils.parse_datetime(params.ends)
 
125
 
 
126
        data[params.fields['date_start']['name']] = format.parse_datetime(ds.timetuple())
 
127
 
 
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']
 
133
 
 
134
            tds = time.mktime(ds.timetuple())
 
135
            tde = time.mktime(de.timetuple())
 
136
 
 
137
            n = (tde - tds) / (60 * 60)
 
138
 
 
139
            if n > day_length:
 
140
                d = math.floor(n / 24)
 
141
                h = n % 24
 
142
 
 
143
                n = d * day_length + h
 
144
 
 
145
            data[params.fields['date_delay']['name']] = n
 
146
 
 
147
        ctx = rpc.session.context.copy()
 
148
        ctx.update(params.context or {})
 
149
        ctx = tools.context_with_concurrency_info(ctx, params.concurrency_info)
 
150
 
 
151
        error = None
 
152
        info = {}
 
153
        proxy = rpc.RPCProxy(params.model)
 
154
 
 
155
        try:
 
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}
 
159
        except Exception, e:
 
160
            error = ustr(e)
 
161
 
 
162
        return dict(error=error, info=info)
 
163
 
 
164
    @expose('json')
 
165
    def duplicate(self, **kw):
 
166
        params, data = TinyDict.split(kw)
 
167
 
 
168
        id = params.id
 
169
        ctx = params.context
 
170
        model = params.model
 
171
 
 
172
        proxy = rpc.RPCProxy(model)
 
173
        new_id = False
 
174
        try:
 
175
            new_id = proxy.copy(id, {}, ctx)
 
176
        except Exception, e:
 
177
            pass
 
178
 
 
179
        return dict(id=new_id)
 
180
 
 
181
    def _get_gantt_records(self, model, ids=None, group=None):
 
182
 
 
183
        if group:
 
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'])
 
190
            return [record]
 
191
 
 
192
        proxy = rpc.RPCProxy(model)
 
193
        ctx = rpc.session.context.copy()
 
194
 
 
195
        records = []
 
196
        for id in ids:
 
197
            record = {'id': id}
 
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
 
203
 
 
204
            records.append(record)
 
205
 
 
206
        return records
 
207
 
 
208
    @expose('json')
 
209
    def gantt_data(self, **kw):
 
210
        params, data = TinyDict.split(kw)
 
211
        records = []
 
212
 
 
213
        if params.groups:
 
214
            for group in params.groups:
 
215
                records += self._get_gantt_records(params.model, None, group)
 
216
        else:
 
217
            records = self._get_gantt_records(params.model, params.ids or [])
 
218
 
 
219
        return dict(records=records)
 
220
 
 
221
    @expose('json')
 
222
    def gantt_reorder(self, **kw):
 
223
        params, data = TinyDict.split(kw)
 
224
 
 
225
        id = params.id
 
226
        ids = params.ids or []
 
227
        model = params.model
 
228
        level = params.level
 
229
        level_value = params.level_value
 
230
 
 
231
        proxy = rpc.RPCProxy(model)
 
232
        fields = proxy.fields_get([])
 
233
 
 
234
        if id and level and level_value:
 
235
            try:
 
236
                proxy.write([id], {level['link']: level_value})
 
237
            except Exception, e:
 
238
                return dict(error=ustr(e))
 
239
 
 
240
        if 'sequence' not in fields:
 
241
            return dict(error=None)
 
242
 
 
243
        res = proxy.read(ids, ['sequence'])
 
244
 
 
245
        sequence = [r['sequence'] for r in res]
 
246
        sequence.sort()
 
247
 
 
248
        sequence2 = []
 
249
        for seq in sequence:
 
250
            if seq not in sequence2:
 
251
                sequence2.append(seq)
 
252
            else:
 
253
                sequence2.append(sequence2[-1]+1)
 
254
 
 
255
        for n, id in enumerate(ids):
 
256
            seq = sequence2[n]
 
257
            try:
 
258
                proxy.write([id], {'sequence': seq})
 
259
            except Exception, e:
 
260
                return dict(error=ustr(e))
 
261
 
 
262
        return dict()
 
263
 
 
264
class CalendarPopup(Form):
 
265
 
 
266
    path = '/calpopup'    # mapping from root
 
267
 
 
268
    @expose(template="templates/calpopup.mako")
 
269
    def create(self, params, tg_errors=None):
 
270
        params.editable = True
 
271
 
 
272
        if params.id and cherrypy.request.path_info == '/calpopup/view':
 
273
            params.load_counter = 2
 
274
 
 
275
        form = self.create_form(params, tg_errors)
 
276
        return dict(form=form, params=params)
 
277
 
 
278
    @expose('json')
 
279
    def get_defaults(self, **kw):
 
280
        params, data = TinyDict.split(kw)
 
281
        data = {}
 
282
 
 
283
        ds = tc.utils.parse_datetime(params.starts)
 
284
        de = tc.utils.parse_datetime(params.ends)
 
285
 
 
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)
 
289
 
 
290
        elif 'date_delay' in params.fields:
 
291
            # convert the end time in hours
 
292
            day_length = params.fields['day_length']
 
293
 
 
294
            tds = time.mktime(ds.timetuple())
 
295
            tde = time.mktime(de.timetuple())
 
296
 
 
297
            n = (tde - tds) / (60 * 60)
 
298
 
 
299
            if n > day_length:
 
300
                d = math.floor(n / 24)
 
301
                h = n % 24
 
302
 
 
303
                n = d * day_length + h
 
304
 
 
305
            data[params.fields['date_delay']['name']] = n
 
306
 
 
307
        kind = params.fields['date_start']['kind']
 
308
        data[params.fields['date_start']['name']] = format.format_datetime(ds.timetuple(), kind)
 
309
 
 
310
        ctx = rpc.session.context.copy()
 
311
        ctx.update(params.context or {})
 
312
 
 
313
        return data
 
314
 
 
315
# vim: ts=4 sts=4 sw=4 si et
 
316