[MERGE] saas-4 report_webkit missing dependency on report
authorAntony Lesuisse <al@openerp.com>
Thu, 1 May 2014 16:11:56 +0000 (18:11 +0200)
committerAntony Lesuisse <al@openerp.com>
Thu, 1 May 2014 16:11:56 +0000 (18:11 +0200)
bzr revid: al@openerp.com-20140501152604-4cobh5ui47dt4pem
bzr revid: al@openerp.com-20140501155633-gefnc3zqcsr2rhaz
bzr revid: al@openerp.com-20140501161156-4wbsvhh8gz4r22h3

27 files changed:
1  2 
addons/account/account_move_line.py
addons/account/partner_view.xml
addons/account_voucher/account_voucher.py
addons/crm/crm_lead.py
addons/crm/crm_lead_view.xml
addons/crm/crm_phonecall_view.xml
addons/delivery/delivery.py
addons/hr_timesheet_sheet/hr_timesheet_sheet.py
addons/mail/mail_mail.py
addons/mass_mailing/views/mass_mailing.xml
addons/note/__openerp__.py
addons/purchase/purchase_view.xml
addons/report/views/layouts.xml
addons/sale/sale_view.xml
addons/sale_stock/sale_stock.py
addons/stock/static/description/index.html
addons/stock/stock.py
addons/stock/stock_view.xml
addons/website/controllers/main.py
addons/website/views/website_templates.xml
addons/website_event/views/website_event.xml
addons/website_forum/views/website_forum.xml
openerp/addons/base/ir/ir_qweb.py
openerp/addons/base/ir/ir_ui_view.py
openerp/addons/base/res/res_partner_view.xml
openerp/addons/base/res/res_users.py
openerp/http.py

Simple merge
Simple merge
Simple merge
Simple merge
                 <separator/>
                 <filter string="Phone Calls Assigned to Me or My Team(s)" icon="terp-personal+" domain="['|', ('section_id.user_id','=',uid), ('user_id', '=', uid)]"
                         help="Phone Calls Assigned to the current user or with a team having the current user as team leader"/>
-                <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
+                <field name="partner_id" operator="child_of"/>
                 <field name="user_id"/>
 +               <field name="opportunity_id"/>
                 <field name="section_id" string="Sales Team"
                          groups="base.group_multi_salesteams"/>
                 <group expand="0" string="Group By...">
Simple merge
@@@ -62,28 -63,56 +63,56 @@@ class hr_timesheet_sheet(osv.osv)
      def copy(self, cr, uid, ids, *args, **argv):
          raise osv.except_osv(_('Error!'), _('You cannot duplicate a timesheet.'))
  
-     def create(self, cr, uid, vals, *args, **argv):
+     def create(self, cr, uid, vals, context=None):
          if 'employee_id' in vals:
-             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).user_id:
+             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id'], context=context).user_id:
 -                raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must assign it to a user.'))
 +                raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link him/her to a user.'))
-             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id:
+             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id'], context=context).product_id:
                  raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link the employee to a product, like \'Consultant\'.'))
-             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id:
+             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id'], context=context).journal_id:
                  raise osv.except_osv(_('Configuration Error!'), _('In order to create a timesheet for this employee, you must assign an analytic journal to the employee, like \'Timesheet Journal\'.'))
-         return super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv)
+         if vals.get('attendances_ids'):
+             # If attendances, we sort them by date asc before writing them, to satisfy the alternance constraint
+             vals['attendances_ids'] = self.sort_attendances(cr, uid, vals['attendances_ids'], context=context)
+         return super(hr_timesheet_sheet, self).create(cr, uid, vals, context=context)
  
-     def write(self, cr, uid, ids, vals, *args, **argv):
+     def write(self, cr, uid, ids, vals, context=None):
          if 'employee_id' in vals:
-             new_user_id = self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).user_id.id or False
+             new_user_id = self.pool.get('hr.employee').browse(cr, uid, vals['employee_id'], context=context).user_id.id or False
              if not new_user_id:
 -                raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must assign it to a user.'))
 +                raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link him/her to a user.'))
-             if not self._sheet_date(cr, uid, ids, forced_user_id=new_user_id):
+             if not self._sheet_date(cr, uid, ids, forced_user_id=new_user_id, context=context):
                  raise osv.except_osv(_('Error!'), _('You cannot have 2 timesheets that overlap!\nYou should use the menu \'My Timesheet\' to avoid this problem.'))
-             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id:
+             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id'], context=context).product_id:
                  raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link the employee to a product.'))
-             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id:
+             if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id'], context=context).journal_id:
                  raise osv.except_osv(_('Configuration Error!'), _('In order to create a timesheet for this employee, you must assign an analytic journal to the employee, like \'Timesheet Journal\'.'))
-         return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv)
+         if vals.get('attendances_ids'):
+             # If attendances, we sort them by date asc before writing them, to satisfy the alternance constraint
+             # In addition to the date order, deleting attendances are done before inserting attendances
+             vals['attendances_ids'] = self.sort_attendances(cr, uid, vals['attendances_ids'], context=context)
+         res = super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, context=context)
+         if vals.get('attendances_ids'):
+             for timesheet in self.browse(cr, uid, ids):
+                 if not self.pool['hr.attendance']._altern_si_so(cr, uid, [att.id for att in timesheet.attendances_ids]):
+                     raise osv.except_osv(_('Warning !'), _('Error ! Sign in (resp. Sign out) must follow Sign out (resp. Sign in)'))
+         return res
+     def sort_attendances(self, cr, uid, attendance_tuples, context=None):
+         date_attendances = []
+         for att_tuple in attendance_tuples:
+             if att_tuple[0] in [0,1,4]:
+                 if att_tuple[0] in [0,1]:
+                     name = att_tuple[2]['name']
+                 else:
+                     name = self.pool['hr.attendance'].browse(cr, uid, att_tuple[1]).name
+                 date_attendances.append((1, name, att_tuple))
+             elif att_tuple[0] in [2,3]:
+                 date_attendances.append((0, self.pool['hr.attendance'].browse(cr, uid, att_tuple[1]).name, att_tuple))
+             else: 
+                 date_attendances.append((0, False, att_tuple))
+         date_attendances.sort()
+         return [att[2] for att in date_attendances]
  
      def button_confirm(self, cr, uid, ids, context=None):
          for sheet in self.browse(cr, uid, ids, context=context):
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -381,14 -392,26 +384,22 @@@ class Website(openerp.addons.web.contro
  
          image = Image.open(cStringIO.StringIO(data))
          response.mimetype = Image.MIME[image.format]
+         # record provides a pre-resized version of the base field, use that
+         # directly
+         if record.get(presized):
+             response.data = data
+             return response
+         fit = int(max_width), int(max_height)
          w, h = image.size
 -        max_w, max_h = fit
 -
 +        max_w, max_h = int(max_width), int(max_height)
          if w < max_w and h < max_h:
-             response.set_data(data)
+             response.data = data
          else:
 -            image.thumbnail(fit, Image.ANTIALIAS)
 +            image.thumbnail((max_w, max_h), Image.ANTIALIAS)
              image.save(response.stream, image.format)
 -            # invalidate content-length computed by make_conditional as
 -            # writing to response.stream does not do it (as of werkzeug 0.9.3)
              del response.headers['Content-Length']
 -
          return response
  
      #------------------------------------------------------
@@@ -8,29 -8,7 +8,30 @@@
  
  <template id="website.theme" name="Theme">
      <link id="bootstrap_css" rel='stylesheet' href='/web/static/lib/bootstrap/css/bootstrap.css' t-ignore="true"/>
 -    <link id="website_css" rel='stylesheet' href='/website/static/src/css/website.css' t-ignore="true"/>
 +    <link rel="stylesheet" href='/website/static/src/css/website.css' t-ignore="true"/>
 +</template>
 +
 +<template id="website.assets_frontend" name="Website assets">
 +    <t t-call="web.assets_common"/>
 +    <t t-call="website.theme"/>
 +
++    <script type="text/javascript" src="/web/static/src/js/watch.js"></script>
 +    <script type="text/javascript" src="/web/static/lib/qweb/qweb2.js"></script>
 +    <script type="text/javascript" src="/web/static/src/js/openerpframework.js"></script>
 +
 +    <script type="text/javascript" src="/website/static/src/js/website.js"></script>
 +
 +    <script type="text/javascript" src="/website/static/src/js/website.snippets.animation.js"></script>
 +    <script type="text/javascript" src="/web/static/lib/bootstrap/js/bootstrap.js"></script>
 +
 +</template>
 +
 +<template id="assets_backend" name="website assets for backend" inherit_id="web.assets_backend">
 +    <xpath expr="." position="inside">
 +        <link rel="stylesheet" href="/website/static/src/css/website.backend.css"/>
 +
 +        <script type="text/javascript" src="/website/static/src/js/website.backend.js"></script>
 +    </xpath>
  </template>
  
  <template id="website.submenu" name="Submenu">
Simple merge
@@@ -868,10 -862,12 +872,13 @@@ class view(osv.osv)
              values = dict()
          qcontext = dict(
              keep_query=keep_query,
 -            request=request,
 +            request=request, # might be unbound if we're not in an httprequest context
 +            debug=request.debug if request else False,
              json=simplejson,
              quote_plus=werkzeug.url_quote_plus,
+             time=time,
+             datetime=datetime,
+             relativedelta=relativedelta,
          )
          qcontext.update(values)
  
Simple merge
diff --cc openerp/http.py
Simple merge