Browse Source

Adding beesdoo_base module (version 9.0)

The beesdoo_base module is added, before upgrading it to version 12.0. Commits history can be found on branch 9.0, here : https://github.com/beescoop/Obeesdoo/commits/9.0/beesdoo_base
pull/105/head
Elouan 5 years ago
parent
commit
8bb743e095
  1. 4
      beesdoo_base/__init__.py
  2. 29
      beesdoo_base/__openerp__.py
  3. 1
      beesdoo_base/controllers/__init__.py
  4. 73
      beesdoo_base/controllers/report.py
  5. 10
      beesdoo_base/data/default_contact.xml
  6. 321
      beesdoo_base/i18n/fr_BE.po
  7. 1
      beesdoo_base/models/__init__.py
  8. 24
      beesdoo_base/models/membercard.py
  9. 91
      beesdoo_base/models/partner.py
  10. 177
      beesdoo_base/report/beescard.xml
  11. 6
      beesdoo_base/security/groups.xml
  12. 2
      beesdoo_base/security/ir.model.access.csv
  13. BIN
      beesdoo_base/static/font/Roboto-Bold.ttf
  14. BIN
      beesdoo_base/static/font/Roboto-Regular.ttf
  15. BIN
      beesdoo_base/static/src/img/blueline.png
  16. BIN
      beesdoo_base/static/src/img/logo.png
  17. BIN
      beesdoo_base/static/src/img/redline.png
  18. 120
      beesdoo_base/views/partner.xml
  19. 2
      beesdoo_base/wizard/__init__.py
  20. 52
      beesdoo_base/wizard/member_card.py
  21. 21
      beesdoo_base/wizard/partner.py
  22. 26
      beesdoo_base/wizard/portal_wizard.py
  23. 82
      beesdoo_base/wizard/views/member_card.xml
  24. 34
      beesdoo_base/wizard/views/partner.xml

4
beesdoo_base/__init__.py

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
import models
import wizard
import controllers

29
beesdoo_base/__openerp__.py

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
{
'name': "Beescoop Base Module",
'summary': """
Module that customize the base module and contains some python tools
""",
'description': """
""",
'author': "Beescoop - Cellule IT",
'website': "https://github.com/beescoop/Obeesdoo",
'category': 'Project Management',
'version': '9.0.1.0.1',
'depends': ['point_of_sale', 'purchase', 'report', 'portal', 'partner_firstname'],
'data': [
'security/groups.xml',
'security/ir.model.access.csv',
'views/partner.xml',
'wizard/views/member_card.xml',
'wizard/views/partner.xml',
'data/default_contact.xml',
'report/beescard.xml',
],
}

1
beesdoo_base/controllers/__init__.py

@ -0,0 +1 @@
import report

73
beesdoo_base/controllers/report.py

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from openerp.addons.web.http import Controller, route, request
from openerp.addons.web.controllers.main import _serialize_exception, content_disposition
from openerp.tools import html_escape
import json
import time
from werkzeug import url_decode
from werkzeug.test import Client
from werkzeug.wrappers import BaseResponse
from werkzeug.datastructures import Headers
from openerp.addons.report.controllers.main import ReportController
from openerp.tools.safe_eval import safe_eval
class ReportCustom(ReportController):
@route(['/report/download'], type='http', auth="user")
def report_download(self, data, token):
"""This function is used by 'qwebactionmanager.js' in order to trigger the download of
a pdf/controller report.
:param data: a javascript array JSON.stringified containg report internal url ([0]) and
type [1]
:returns: Response with a filetoken cookie and an attachment header
"""
requestcontent = json.loads(data)
url, type = requestcontent[0], requestcontent[1]
try:
if type == 'qweb-pdf':
reportname = url.split('/report/pdf/')[1].split('?')[0]
docids = None
if '/' in reportname:
reportname, docids = reportname.split('/')
if docids:
# Generic report:
response = self.report_routes(reportname, docids=docids, converter='pdf')
else:
# Particular report:
data = url_decode(url.split('?')[1]).items() # decoding the args represented in JSON
response = self.report_routes(reportname, converter='pdf', **dict(data))
cr, uid = request.cr, request.uid
report = request.registry['report']._get_report_from_name(cr, uid, reportname)
filename = "%s.%s" % (report.name, "pdf")
if docids:
ids = [int(x) for x in docids.split(",")]
obj = request.env[report.model].browse(ids)
if report.attachment and not len(obj) > 1:
filename = safe_eval(report.attachment, {'object': obj, 'time': time})
response.headers.add('Content-Disposition', content_disposition(filename))
response.set_cookie('fileToken', token)
return response
elif type =='controller':
reqheaders = Headers(request.httprequest.headers)
response = Client(request.httprequest.app, BaseResponse).get(url, headers=reqheaders, follow_redirects=True)
response.set_cookie('fileToken', token)
return response
else:
return
except Exception, e:
se = _serialize_exception(e)
error = {
'code': 200,
'message': "Odoo Server Error",
'data': se
}
return request.make_response(html_escape(json.dumps(error)))

10
beesdoo_base/data/default_contact.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record model="res.partner" id="commande_beescoop">
<field name="name">commande@bees-coop.be</field>
<field name="email">commande@bees-coop.be</field>
<field name="active">True</field>
</record>
</data>
</odoo>

321
beesdoo_base/i18n/fr_BE.po

@ -0,0 +1,321 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * beesdoo_base
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0c\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-13 15:16+0000\n"
"PO-Revision-Date: 2016-11-13 15:16+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_valid
msgid "Active"
msgstr "Actif"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_barcode
msgid "Barcode"
msgstr "Code Barre"
#. module: beesdoo_base
#: model:res.groups,name:beesdoo_base.group_force_barcode
msgid "Bees Card Force Barcode"
msgstr "Bees Card Force Barcode"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.Eater Wizard
#: model:ir.ui.view,arch_db:beesdoo_base.MemberCard Wizard
#: model:ir.ui.view,arch_db:beesdoo_base.membercard_set_as_printed_wizard
#: model:ir.ui.view,arch_db:beesdoo_base.printing_membercard_request_wizard
msgid "Cancel"
msgstr "Annuler"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "Cards"
msgstr "Cards"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_child_eater_ids
msgid "Child eater ids"
msgstr "Child eater ids"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.Eater Wizard
#: model:ir.ui.view,arch_db:beesdoo_base.MemberCard Wizard
msgid "Create"
msgstr "Créer"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.Eater Wizard
msgid "Create a new eater"
msgstr "Create a new eater"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_create_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_create_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_create_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard_create_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_create_date
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_create_date
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_create_date
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard_create_date
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard_create_date
msgid "Created on"
msgstr "Créé le"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_display_name
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_display_name
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_display_name
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard_display_name
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard_display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: beesdoo_base
#: selection:res.partner,eater:0
msgid "Eater"
msgstr "Eater"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_eater
msgid "Eater/Worker"
msgstr "Eater/Worker"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "Eaters"
msgstr "Eaters"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_email
msgid "Email"
msgstr "Courriel"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_end_date
msgid "Expiration Date"
msgstr "Date d'expiration"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_first_name
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_first_name
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "First Name"
msgstr "Prénom"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_force_barcode
msgid "Force Barcode"
msgstr "Force Barcode"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_id
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_id
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_id
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard_id
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard_id
msgid "ID"
msgstr "ID"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard___last_update
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card___last_update
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard___last_update
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard___last_update
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard___last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_last_name
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_last_name
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "Last Name"
msgstr "Nom"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_write_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_write_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_write_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard_write_uid
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard_write_uid
msgid "Last Updated by"
msgstr "Mis à jour par"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_write_date
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_write_date
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_write_date
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard_write_date
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard_write_date
msgid "Last Updated on"
msgstr "Mis à jour le"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_last_printed
msgid "Last printed on"
msgstr "Last printed on"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "Member Card"
msgstr "Member Card"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_member_card_ids
msgid "Member card ids"
msgstr "Member card ids"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "New Card"
msgstr "New Card"
#. module: beesdoo_base
#: model:ir.actions.act_window,name:beesdoo_base.action_eater_wizard
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "New Eater"
msgstr "New Eater"
#. module: beesdoo_base
#: model:ir.actions.act_window,name:beesdoo_base.action_membercard_wizard
msgid "New Member Card"
msgstr "New Member Card"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_parent_barcode
msgid "Parent Barcode"
msgstr "Parent Barcode"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_parent_eater_id
msgid "Parent Worker"
msgstr "Parent Worker"
#. module: beesdoo_base
#: model:ir.model,name:beesdoo_base.model_res_partner
msgid "Partner"
msgstr "Partenaire"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_eater_new_wizard_partner_id
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_partner_id
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_partner_id
msgid "Partner id"
msgstr "Partner id"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_requestprinting_wizard_partner_ids
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_set_as_printed_wizard_partner_ids
msgid "Partner ids"
msgstr "Partner ids"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_res_partner_member_card_to_be_printed
msgid "Print BEES card?"
msgstr "Print BEES card?"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.beesdoo_partner_form_view
msgid "Printing"
msgstr "Printing"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_comment
#: model:ir.model.fields,field_description:beesdoo_base.field_membercard_new_wizard_new_comment
#: model:ir.ui.view,arch_db:beesdoo_base.MemberCard Wizard
msgid "Reason"
msgstr "Motif"
#. module: beesdoo_base
#: model:ir.actions.act_window,name:beesdoo_base.beesdoo_base_action_request_membercard_printing
msgid "Request BEES card printing"
msgstr "Request BEES card printing"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.printing_membercard_request_wizard
msgid "Request Beescard Printing"
msgstr "Request Beescard Printing"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.printing_membercard_request_wizard
msgid "Request Printing for"
msgstr "Request Printing for"
#. module: beesdoo_base
#: model:ir.model.fields,field_description:beesdoo_base.field_member_card_responsible_id
msgid "Responsible"
msgstr "Responsable"
#. module: beesdoo_base
#: model:ir.actions.act_window,name:beesdoo_base.beesdoo_base_action_set_membercard_as_printed
msgid "Set BEES card as printed"
msgstr "Set BEES card as printed"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.membercard_set_as_printed_wizard
msgid "Set as Printed"
msgstr "Set as Printed"
#. module: beesdoo_base
#: model:ir.ui.view,arch_db:beesdoo_base.membercard_set_as_printed_wizard
msgid "Set as Printed for"
msgstr "Set as Printed for"
#. module: beesdoo_base
#: selection:res.partner,eater:0
msgid "Worker and Eater"
msgstr "Worker and Eater"
#. module: beesdoo_base
#: code:addons/beesdoo_base/models/partner.py:42
#, python-format
msgid "You can only set two additional eaters per worker"
msgstr "You can only set two additional eaters per worker"
#. module: beesdoo_base
#: code:addons/beesdoo_base/models/partner.py:47
#, python-format
msgid "You try to assign a eater to a worker but this easer is alread assign to %s please remove it before"
msgstr "You try to assign a eater to a worker but this easer is alread assign to %s please remove it before"
#. module: beesdoo_base
#: model:ir.model,name:beesdoo_base.model_eater_new_wizard
msgid "eater.new.wizard"
msgstr "eater.new.wizard"
#. module: beesdoo_base
#: model:ir.model,name:beesdoo_base.model_member_card
msgid "member.card"
msgstr "member.card"
#. module: beesdoo_base
#: model:ir.model,name:beesdoo_base.model_membercard_new_wizard
msgid "membercard.new.wizard"
msgstr "membercard.new.wizard"
#. module: beesdoo_base
#: model:ir.model,name:beesdoo_base.model_membercard_requestprinting_wizard
msgid "membercard.requestprinting.wizard"
msgstr "membercard.requestprinting.wizard"
#. module: beesdoo_base
#: model:ir.model,name:beesdoo_base.model_membercard_set_as_printed_wizard
msgid "membercard.set_as_printed.wizard"
msgstr "membercard.set_as_printed.wizard"

1
beesdoo_base/models/__init__.py

@ -0,0 +1 @@
import partner, membercard

24
beesdoo_base/models/membercard.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from openerp import models, fields, api
import uuid
class MemberCard(models.Model):
def _get_current_user(self):
return self.env.uid
def _compute_bar_code(self):
rule = self.env['barcode.rule'].search([('name', '=', 'Customer Barcodes')])[0]
size = 13 - len(rule.pattern)
ean = rule.pattern + str(uuid.uuid4().fields[-1])[:size]
return ean[0:12] + str(self.env['barcode.nomenclature'].ean_checksum(ean))
_name = 'member.card'
_order = 'create_date desc'
valid = fields.Boolean(default=True, string="Active")
barcode = fields.Char("Barcode", oldname='ean13', default=_compute_bar_code)
partner_id = fields.Many2one('res.partner') #, default=_get_current_client)
responsible_id = fields.Many2one('res.users', default=_get_current_user, string="Responsible")
end_date = fields.Date(readonly=True, string="Expiration Date")
comment = fields.Char("Reason", required=True)

91
beesdoo_base/models/partner.py

@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
from openerp import models, fields, api, _
from openerp.exceptions import ValidationError
class Partner(models.Model):
_inherit = 'res.partner'
eater = fields.Selection([('eater', 'Eater'), ('worker_eater', 'Worker and Eater')], string="Eater/Worker")
child_eater_ids = fields.One2many("res.partner", "parent_eater_id", domain=[('customer', '=', True),
('eater', '=', 'eater')])
parent_eater_id = fields.Many2one("res.partner", string="Parent Worker", readonly=True)
barcode = fields.Char(compute="_get_bar_code", string='Barcode', store=True)
parent_barcode = fields.Char(compute="_get_bar_code", string='Parent Barcode', store=True)
member_card_ids = fields.One2many('member.card', 'partner_id')
country_id = fields.Many2one(required=True, default=lambda self: self.env.ref('base.be'))
member_card_to_be_printed = fields.Boolean('Print BEES card?')
last_printed = fields.Datetime('Last printed on')
cooperator_type = fields.Selection([('share_a', 'Share A'), ('share_b', 'Share B'), ('share_c', 'Share C')], store=True, compute=None)
@api.one
@api.depends('parent_eater_id', 'parent_eater_id.barcode', 'eater', 'member_card_ids')
def _get_bar_code(self):
if self.eater == 'eater':
self.parent_barcode = self.parent_eater_id.barcode
elif self.member_card_ids:
for c in self.member_card_ids:
if c.valid:
self.barcode = c.barcode
@api.one
@api.constrains('child_eater_ids', 'parent_eater_id')
def _check_number_of_eaters(self):
"""The owner of an A share can have a maximum of two eaters but
the owner of a B share can have a maximum of three eaters.
"""
# Get the default_code of the share for the current eater and his parent
share_type_code = self.cooperator_type
parent_share_type_code = self.parent_eater_id.cooperator_type
# Raise exception
if share_type_code == 'share_b' or parent_share_type_code == 'share_b':
if len(self.child_eater_ids) > 3 or len(self.parent_eater_id.child_eater_ids) > 3:
raise ValidationError(_('You can only set three additional eaters per worker'))
else:
if len(self.child_eater_ids) > 2 or len(self.parent_eater_id.child_eater_ids) > 2:
raise ValidationError(_('You can only set two additional eaters per worker'))
@api.multi
def write(self, values):
if values.get('parent_eater_id') and self.parent_eater_id:
raise ValidationError(_('You try to assign a eater to a worker but this easer is alread assign to %s please remove it before') % self.parent_eater_id.name)
# replace many2many command when writing on child_eater_ids to just remove the link
if 'child_eater_ids' in values:
for command in values['child_eater_ids']:
if command[0] == 2:
command[0] = 3
return super(Partner, self).write(values)
@api.one
def _deactivate_active_cards(self):
for card in self.member_card_ids.filtered('valid'):
card.valid = False
card.end_date = fields.Date.today()
@api.multi
def _new_card(self, reason, user_id, barcode=False):
card_data = {
'partner_id' : self.id,
'responsible_id' : user_id,
'comment' : reason,
}
if barcode:
card_data['barcode'] = barcode
self.env['member.card'].create(card_data)
@api.multi
def _new_eater(self, surname, name, email):
partner_data = {
'lastname' : name,
'firstname' : surname,
'is_customer' : True,
'eater' : 'eater',
'parent_eater_id' : self.id,
'email' : email,
'country_id' : self.country_id.id
}
return self.env['res.partner'].create(partner_data)

177
beesdoo_base/report/beescard.xml

@ -0,0 +1,177 @@
<odoo>
<report id="report_beescard_cm" string="Beescaard" model="res.partner"
report_type="qweb-html" file="beesdoo_base.beescard_template_cm"
name="beesdoo_base.beescard_template_cm" />
<!-- Use paper format a4 low margin -->
<template id="beescard_template_cm">
<head>
<style type="text/css">
/* Roboto Regular */
@font-face {
font-family: 'Roboto-Regular';
font-style: normal;
src: local('Roboto Regular'),
url('/beesdoo_base/static/font/Roboto-Regular.ttf')
format('truetype');
}
/* Roboto Bold */
@font-face {
font-family: 'Roboto-Bold';
font-style: normal;
src: local('Roboto Bold'),
url('/beesdoo_base/static/font/Roboto-Bold.ttf')
format('truetype');
}
</style>
</head>
<!-- X1.133 -->
<t t-call="report.html_container">
<div class="page">
<t t-foreach="docs" t-as="partner">
<table
style="width: 14.02cm;height: 9.39cm;table-layout:fixed;display: inline-block;">
<tr>
<td
style="border-bottom: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
<td
style="border-left: 1px solid black;border-right: 1px solid black;"
colspan="2"></td>
<td
style="border-bottom: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
</tr>
<tr>
<td></td>
<td
style="width: 4.98cm;vertical-align:bottom;height: 6.87cm;">
<div
style="padding-top:0.2cm;padding-left:0.1cm;padding-bottom:0.2cm;">
<img alt="Embedded Image"
t-att-src="'data:image/png;base64,' + partner.image"
style="width:4.7cm;height:6.4cm" />
</div>
</td>
<td
style="vertical-align:top;width:7.72cm;height: 6.87cm;position: relative;">
<p style="text-align: left;padding-top: 0.2cm;font-size: 1.2em;">
<span t-raw="partner.firstname and partner.firstname[:30] or ''" style="font-family:Roboto-Regular" />
<br />
<span t-raw="partner.lastname and partner.lastname[:26] or ''" style="font-family:Roboto-Bold;" />
<br />
</p>
<p style="text-align: left;padding-top: 0.2cm;font-size: 1em;">
<t t-if="partner.parent_eater_id and partner.eater == 'eater'">
<!--fix here -->
<span t-raw="partner.parent_eater_id.firstname and partner.parent_eater_id.firstname[:30] or ''" style="font-family:Roboto-Regular;" />
<span t-raw="partner.parent_eater_id.lastname and partner.parent_eater_id.lastname[:26] or ''" style="font-family:Roboto-Regular;" />
</t>
<t t-if="partner.parent_eater_id and partner.parent_eater_id.cooperator_type == 'share_b'">
<!--fix here never true-->
<span
t-raw="'[' + (partner.parent_eater_id.name[:60] or '') + ']'"
style="font-family:Roboto-Regular" />
</t>
</p>
<div style="position: absolute;bottom: 0;">
<div style="padding-top:0.3cm">
<img
t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s&amp;humanreadable=%s'%('EAN13', partner.barcode if not partner.parent_eater_id else partner.parent_barcode, 340, 70, 1)"
style="width:7.2cm;height:2.52cm" />
</div>
<div
style="padding-top:0.2cm;padding-bottom:0.2cm;">
<t t-if="partner.cooperator_type == 'share_a' or partner.parent_eater_id.cooperator_type == 'share_a'">
<img
src="/beesdoo_base/static/src/img/redline.png"
style="width:7.2cm;height:0.2cm" />
</t>
<t t-if="partner.cooperator_type == 'share_b' or partner.parent_eater_id.cooperator_type == 'share_b'">
<img
src="/beesdoo_base/static/src/img/blueline.png"
style="width:7.2cm;height:0.2cm" />
</t>
</div>
</div>
</td>
<td></td>
</tr>
<tr>
<td></td>
<td colspan="2"
style="vertical-align:center;height: 1.20cm;">
<p
style="text-align:center;font-size:0.8em;font-family:Roboto-Regular">En cas de perte,
prévenez-nous via
membre@bees-coop.be
</p>
</td>
<td></td>
</tr>
<tr>
<td
style="border-top: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
<td
style="border-left: 1px solid black;border-right: 1px solid black;"
colspan="2"></td>
<td
style="border-top: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
</tr>
</table>
<table
style="width: 14.02cm;height: 9.39cm;table-layout:fixed;display: inline-block;">
<tr>
<td
style="border-bottom: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
<td
style="border-left: 1px solid black;border-right: 1px solid black;"
colspan="2"></td>
<td
style="border-bottom: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
</tr>
<tr>
<td></td>
<td style="width: 12.7cm;height: 6.87cm;">
<img
src="/beesdoo_base/static/src/img/logo.png"
style="display: block;margin-left: auto;margin-right: auto;margin-top:0.2cm;margin-bottom:0.2cm;width:6.46cm;height:6.46cm" />
</td>
<td></td>
</tr>
<tr>
<td></td>
<td style="height: 1.20cm;">
<p
style="text-align:center;font-family:Roboto-Regular;font-size:1.1em;">www.bees-coop.be
</p>
</td>
<td></td>
</tr>
<tr>
<td
style="border-top: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
<td
style="border-left: 1px solid black;border-right: 1px solid black;"
colspan="2"></td>
<td
style="border-top: 1px solid black;width: 0.66cm;height: 0.66cm;"></td>
</tr>
</table>
<br />
</t>
</div>
</t>
</template>
</odoo>

6
beesdoo_base/security/groups.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="group_force_barcode" model="res.groups">
<field name="name">Bees Card Force Barcode</field>
</record>
</odoo>

2
beesdoo_base/security/ir.model.access.csv

@ -0,0 +1,2 @@
"id","name","model_id/id","group_id/id","perm_read","perm_write","perm_create","perm_unlink"
"member_card_read_all","member card read all","beesdoo_base.model_member_card","","True","False","False","False"

BIN
beesdoo_base/static/font/Roboto-Bold.ttf

BIN
beesdoo_base/static/font/Roboto-Regular.ttf

BIN
beesdoo_base/static/src/img/blueline.png

After

Width: 430  |  Height: 12  |  Size: 225 B

BIN
beesdoo_base/static/src/img/logo.png

After

Width: 567  |  Height: 567  |  Size: 42 KiB

BIN
beesdoo_base/static/src/img/redline.png

After

Width: 430  |  Height: 12  |  Size: 223 B

120
beesdoo_base/views/partner.xml

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.actions.act_window" id="action_membercard_wizard">
<field name="name">New Member Card</field>
<field name="res_model">membercard.new.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.actions.act_window" id="action_eater_wizard">
<field name="name">New Eater</field>
<field name="res_model">eater.new.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="beesdoo_partner_form_view">
<field name="name">beesdoo.partner.form.view</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="point_of_sale.view_partner_property_form" />
<field name="arch" type="xml">
<field name="type" position="before">
<field name="cooperator_type" />
</field>
<field name="website" position="after">
<field name="eater"
attrs="{'invisible': [('customer', '=', False)]}" />
<field name="parent_eater_id"
attrs="{'invisible' : [('eater', '!=', 'eater')]}" />
</field>
<xpath expr="//notebook/page[1]" position="attributes">
<attribute name="attrs">{'invisible':
[('cooperator_type', '=', 'share_a')]}</attribute>
</xpath>
<xpath expr="//notebook" position="inside">
<page string="Worker information"
attrs="{'invisible': [('cooperator_type', '!=', 'share_a')]}"
name="work">
<group name="info_session" />
</page>
<page string="Member Card"
attrs="{'invisible': ['|', ('customer', '=', False), ('eater', 'not in', ('worker_eater', 'eater'))]}">
<group>
<group>
<field name="member_card_to_be_printed" />
<field name="last_printed" />
</group>
</group>
<group attrs="{'invisible': ['|', ('customer', '=', False), ('eater', '!=', 'worker_eater')]}">
<separator string="Eaters" />
<field name="child_eater_ids" widget="many2many_tags"
options="{'no_create': True}"
context="{'default_eater' : 'eater', 'default_customer' : True}" />
<group>
<button string="New Eater" name="%(action_eater_wizard)d"
type="action" />
</group>
<separator string="Cards" />
<field string="Cards" name="member_card_ids">
<tree editable="bottom">
<field name="barcode" />
<field name="create_date" />
<field name="end_date" />
<field name="responsible_id" />
<field name="comment" />
<field name="valid" />
</tree>
</field>
<group>
<button string="New Card"
name="%(action_membercard_wizard)d" type="action" />
</group>
</group>
</page>
</xpath>
<field name="barcode" position="attributes">
<attribute name="attrs">{'invisible' : [('eater',
'!=',
'worker_eater')]}
</attribute>
</field>
<field name="barcode" position="after">
<field name="parent_barcode"
attrs="{'invisible' : [('eater', '!=', 'eater')]}" />
</field>
<!-- Temporary fix for the partner_view -->
<xpath expr="//field[@name='customer']" position='before'>
<field name="is_company" invisible="True" />
</xpath>
</field>
</record>
<record model="ir.ui.view" id="beesdoo_partner_search_view">
<field name="name">beesdoo.partner.search.view</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter" />
<field name="arch" type="xml">
<filter name="type_person" position="after">
<filter name="type_a" string="Cooperator type A" domain="[('cooperator_type', '=', 'share_a')]" />
<filter name="type_b" string="Cooperator type B" domain="[('cooperator_type', '=', 'share_b')]" />
<filter name="type_c" string="Cooperator type C" domain="[('cooperator_type', '=', 'share_c')]" />
</filter>
</field>
</record>
<!-- S022 : By default a supplier should be a company -->
<record id="base.action_partner_supplier_form" model="ir.actions.act_window">
<field name="context">{
'search_default_supplier': 1,
'default_customer': 0,
'default_supplier': 1,
'default_is_company' : True,
'default_company_type' : 'company',
}
</field>
</record>
</odoo>

2
beesdoo_base/wizard/__init__.py

@ -0,0 +1,2 @@
import member_card, partner, portal_wizard

52
beesdoo_base/wizard/member_card.py

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
from openerp import models, fields, api
class NewMemberCardWizard(models.TransientModel):
"""
A transient model for the creation of a new card.
The user can only define the raison why a new card is
needed and the eater/worker that is concerned.
"""
_name = 'membercard.new.wizard'
def _get_default_partner(self):
return self.env.context['active_id']
new_comment = fields.Char('Reason', required=True)
partner_id = fields.Many2one('res.partner', default=_get_default_partner)
force_barcode = fields.Char('Force Barcode', groups="beesdoo_base.group_force_barcode")
@api.one
def create_new_card(self):
client = self.partner_id.sudo()
client._deactivate_active_cards()
client._new_card(self.new_comment, self.env.uid, barcode=self.force_barcode)
client.member_card_to_be_printed = True
class RequestMemberCardPrintingWizard(models.TransientModel):
_name = 'membercard.requestprinting.wizard'
def _get_selected_partners(self):
return self.env.context['active_ids']
partner_ids = fields.Many2many('res.partner', default=_get_selected_partners)
@api.one
def request_printing(self):
self.partner_ids.write({'member_card_to_be_printed' : True})
class SetAsPrintedWizard(models.TransientModel):
_name = 'membercard.set_as_printed.wizard'
def _get_selected_partners(self):
return self.env.context['active_ids']
partner_ids = fields.Many2many('res.partner', default=_get_selected_partners)
@api.one
def set_as_printed(self):
self.partner_ids.write({'member_card_to_be_printed' : False,
'last_printed' : fields.Datetime.now()})

21
beesdoo_base/wizard/partner.py

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
from openerp import models, fields, api
class NewEaterWizard(models.TransientModel):
"""
A transient model for the creation of a eater related to a worker.
"""
_name = 'eater.new.wizard'
def _get_default_partner(self):
return self.env.context['active_id']
first_name = fields.Char('First Name', required=True)
last_name = fields.Char('Last Name', required=True)
email = fields.Char('Email')
partner_id = fields.Many2one('res.partner', default=_get_default_partner)
@api.one
def create_new_eater(self):
self.partner_id._new_eater(self.first_name, self.last_name, self.email)

26
beesdoo_base/wizard/portal_wizard.py

@ -0,0 +1,26 @@
from openerp import models, fields, api
from openerp import SUPERUSER_ID
class BeesdooWizard(models.TransientModel):
_inherit = 'portal.wizard'
@api.onchange('portal_id')
def onchange_portal(self):
# for each partner, determine corresponding portal.wizard.user records
res_partner = self.env['res.partner']
partner_ids = self._context.get('active_ids', [])
contact_ids = set()
for partner in res_partner.browse(partner_ids):
for contact in (partner.child_ids | partner):
# make sure that each contact appears at most once in the list
if contact.id not in contact_ids:
contact_ids.add(contact.id)
in_portal = self.portal_id in contact.user_ids.mapped('groups_id')
self.user_ids |= self.env['portal.wizard.user'].new({
'partner_id': contact.id,
'email': contact.email,
'in_portal': in_portal,
})

82
beesdoo_base/wizard/views/member_card.xml

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- New card generation wizard -->
<record id="MemberCard Wizard" model="ir.ui.view">
<field name="name">New MemberCard Wizard</field>
<field name="model">membercard.new.wizard</field>
<field name="arch" type="xml">
<form>
<group groups="beesdoo_base.group_force_barcode">
<field name="force_barcode" />
</group>
<separator string="Reason" />
<field name="new_comment" string="Reason" editable="True" />
<field name="partner_id" invisible="1" />
<footer>
<button type="object" name="create_new_card" string="Create"
class="oe_highlight" />
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
</record>
<record id="printing_membercard_request_wizard" model="ir.ui.view">
<field name="name">Request Membercard Printing Wizard</field>
<field name="model">membercard.requestprinting.wizard</field>
<field name="arch" type="xml">
<form>
<separator string="Request Printing for" />
<field name="partner_ids" />
<footer>
<button
type="object"
name="request_printing"
string="Request Beescard Printing"
class="oe_highlight" />
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
</record>
<act_window name="Request BEES card printing"
res_model="membercard.requestprinting.wizard"
src_model="res.partner"
view_mode="form"
target="new"
key2="client_action_multi"
id="beesdoo_base_action_request_membercard_printing"
/>
<record id="membercard_set_as_printed_wizard" model="ir.ui.view">
<field name="name">Set Membercard as Printed Wizard</field>
<field name="model">membercard.set_as_printed.wizard</field>
<field name="arch" type="xml">
<form>
<separator string="Set as Printed for" />
<field name="partner_ids" />
<footer>
<button
type="object"
name="set_as_printed"
string="Set as Printed"
class="oe_highlight" />
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
</record>
<act_window name="Set BEES card as printed"
res_model="membercard.set_as_printed.wizard"
src_model="res.partner"
view_mode="form"
target="new"
key2="client_action_multi"
id="beesdoo_base_action_set_membercard_as_printed"
/>
</odoo>

34
beesdoo_base/wizard/views/partner.xml

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- New eater generation wizard -->
<record id="Eater Wizard" model="ir.ui.view">
<field name="name">New Eater Wizard</field>
<field name="model">eater.new.wizard</field>
<field name="arch" type="xml">
<form string="Create a new eater">
<group>
<field name="first_name" />
<field name="last_name" />
<field name="email" />
</group>
<footer>
<button type="object" name="create_new_eater"
string="Create" class="oe_highlight" />
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
</record>
<record id="beesdoo_portal_wizard_view" model="ir.ui.view">
<field name="name">Unfuck Portal Wizard</field>
<field name="model">portal.wizard</field>
<field name="inherit_id" ref="portal.wizard_view" />
<field name="arch" type="xml">
<field name="portal_id" position="attributes">
<attribute name="on_change" />
</field>
</field>
</record>
</odoo>
Loading…
Cancel
Save