diff options
| author | Fabien Pinckaers <fp@openerp.com> | 2012-09-16 19:10:15 +0200 |
|---|---|---|
| committer | Fabien Pinckaers <fp@openerp.com> | 2012-09-16 19:10:15 +0200 |
| commit | 5000fffb1e9462b01de17a7d5f07d19bc7bad3f7 (patch) | |
| tree | 710681d4aa681f84376255fe9e2c8fcb5e9ae524 | |
| parent | 8985e6aea9fc4d10609bc93270ebf97d26a89062 (diff) | |
| parent | 378b77a5e4e79ac761e6c072591fd84a295eb1bf (diff) | |
[MERGE] merging notes + small cleaning
bzr revid: fp@openerp.com-20120916171015-e0n1lq2a5c10a0nb
| -rw-r--r-- | addons/base_setup/res_partner_view.xml | 8 | ||||
| -rw-r--r-- | addons/base_setup/static/src/js/base_setup.js | 24 | ||||
| -rw-r--r-- | addons/mail/security/ir.model.access.csv | 1 | ||||
| -rw-r--r-- | addons/note/__openerp__.py | 24 | ||||
| -rw-r--r-- | addons/note/note.py | 158 | ||||
| -rw-r--r-- | addons/note/note_data.xml | 6 | ||||
| -rw-r--r-- | addons/note/note_demo.xml | 161 | ||||
| -rw-r--r-- | addons/note/note_view.xml | 146 | ||||
| -rw-r--r-- | addons/note/security/ir.model.access.csv | 5 | ||||
| -rw-r--r-- | addons/note/security/ir.rule.xml | 12 | ||||
| -rw-r--r-- | addons/note/security/note_security.xml | 12 | ||||
| -rw-r--r-- | addons/note/security/res.groups.csv | 3 | ||||
| -rw-r--r-- | addons/note/static/src/css/Makefile | 4 | ||||
| -rw-r--r-- | addons/note/static/src/css/note.css | 183 | ||||
| -rw-r--r-- | addons/note/static/src/css/note.sass | 88 | ||||
| -rw-r--r-- | addons/note_pad/__init__.py | 23 | ||||
| -rw-r--r-- | addons/note_pad/__openerp__.py | 50 | ||||
| -rw-r--r-- | addons/note_pad/note_pad.py | 41 | ||||
| -rw-r--r-- | addons/note_pad/note_pad_view.xml | 15 |
19 files changed, 692 insertions, 272 deletions
diff --git a/addons/base_setup/res_partner_view.xml b/addons/base_setup/res_partner_view.xml index 5aa24b3474d..5e54c0b8629 100644 --- a/addons/base_setup/res_partner_view.xml +++ b/addons/base_setup/res_partner_view.xml @@ -9,9 +9,11 @@ <field name="inherit_id" ref="base.res_partner_kanban_view"/> <field name="arch" type="xml"> <xpath expr="//div[@class='oe_kanban_partner_categories']" position="inside"> - <t t-foreach="record.category_id.raw_value" t-as="category"> - <span class="oe_tag" t-att-data-category_id="category"/> - </t> + <span class="oe_kanban_list_many2many" data-model="res.partner.category"> + <t t-foreach="record.category_id.raw_value" t-as="category"> + <span class="oe_tag" t-att-data-list_id="category"/> + </t> + </span> </xpath> </field> </record> diff --git a/addons/base_setup/static/src/js/base_setup.js b/addons/base_setup/static/src/js/base_setup.js deleted file mode 100644 index db217b71b38..00000000000 --- a/addons/base_setup/static/src/js/base_setup.js +++ /dev/null @@ -1,24 +0,0 @@ -openerp.base_setup = function(openerp) { - /* extend kanban to include the names of partner categories in the kanban view of partners */ - openerp.web_kanban.KanbanView.include({ - on_groups_started: function() { - var self = this; - self._super.apply(this, arguments); - if (this.dataset.model === 'res.partner') { - /* Set names for partner categories */ - var category_ids = []; - this.$el.find('.oe_kanban_partner_categories span').each(function() { - category_ids.push($(this).data('category_id')); - }); - var dataset = new openerp.web.DataSetSearch(this, 'res.partner.category', self.session.context); - dataset.name_get(_.uniq(category_ids)).then(function(result) { - _.each(result, function(value) { - self.$el - .find('.oe_kanban_partner_categories span[data-category_id=' + value[0] + ']') - .html(value[1]); - }); - }); - } - } - }); -}; diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 29f11fd0b1b..dbc84c86ded 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -1,4 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_mail_global,mail.mail,model_mail_mail,base.group_system,1,1,1,1
access_mail_message_all,mail.message.all,model_mail_message,,1,0,0,0
access_mail_message_group_user,mail.message.group.user,model_mail_message,base.group_user,1,1,1,1
access_mail_thread,mail.thread,model_mail_thread,base.group_user,1,1,1,0
diff --git a/addons/note/__openerp__.py b/addons/note/__openerp__.py index 62d9962634a..d22094902db 100644 --- a/addons/note/__openerp__.py +++ b/addons/note/__openerp__.py @@ -20,31 +20,31 @@ ############################################################################## { - 'name': 'Notes', - 'version': '0.1', + 'name': 'Memos', + 'version': '1.0', 'category': 'Tools', 'description': """ -This module allows users to create their own notes inside OpenERP +This module allows users to create their own memos inside OpenERP ================================================================= -Use notes to write meeting minutes, organize ideas, organize personnal todo -lists, etc. Each user manages his own personnal notes. Notes are available to -their authors only, but they can share notes to others users so that several -people can work on the same note in real time. It's very efficient to share +Use memos to write meeting minutes, organize ideas, organize personnal todo +lists, etc. Each user manages his own personnal memos. Memos are available to +their authors only, but they can share memos to others users so that several +people can work on the same memo in real time. It's very efficient to share meeting minutes. -Notes can be found in the 'Home' menu. +Memos can be found in the 'Home' menu. """, 'author': 'OpenERP SA', 'website': 'http://openerp.com', - 'summary': 'Sticky Notes, Collaborative', + 'summary': 'Sticky notes, Collaborative, Memos', 'depends': [ 'base_tools', 'mail', - 'pad', ], 'data': [ - 'security/note_security.xml', + 'security/res.groups.csv', + 'security/ir.rule.xml', 'security/ir.model.access.csv', 'note_data.xml', 'note_view.xml', @@ -52,6 +52,8 @@ Notes can be found in the 'Home' menu. 'demo': [ 'note_demo.xml', ], + 'test': [ + ], 'css': [ 'static/src/css/note.css', ], diff --git a/addons/note/note.py b/addons/note/note.py index abc7dca297e..65848ed7828 100644 --- a/addons/note/note.py +++ b/addons/note/note.py @@ -21,16 +21,17 @@ from openerp.osv import osv, fields from tools.translate import _ +import re class note_stage(osv.osv): """ Category of Note """ _name = "note.stage" _description = "Note Stage" _columns = { - 'name': fields.char('Category Name', size=64, required=True), + 'name': fields.char('Stage Name', required=True), 'sequence': fields.integer('Sequence', help="Used to order the note stages"), - 'user_id': fields.many2one('res.users', 'Owner', help="Owner of the note stage.", required=True, readonly=True), - 'fold': fields.boolean('Folded'), + 'user_id': fields.many2one('res.users', 'Owner', help="Owner of the note stage.", required=True), + 'fold': fields.boolean('Folded by Default'), } _order = 'sequence asc' _defaults = { @@ -39,59 +40,150 @@ class note_stage(osv.osv): 'sequence' : 1, } +class note_tag(osv.osv): + _name = "note.tag" + _description = "Note Tag" + _columns = { + 'name' : fields.char('Tag Name', required=True), + } + class note_note(osv.osv): """ Note """ _name = 'note.note' - _inherit = ['mail.thread','pad.common'] - _pad_fields = ['note_pad'] + _inherit = ['mail.thread'] _description = "Note" - def _set_note_first_line(self, cr, uid, id, name, value, args, context=None): - return self.write(cr, uid, [id], {'note': value}, context=context) + #writing method (no modification of values) + def name_create(self, cr, uid, name, context=None): + rec_id = self.create(cr, uid, {'memo': name}, context=context) + return self.name_get(cr, uid, [rec_id], context)[0] - def _get_note_first_line(self, cr, uid, ids, name, args, context=None): + #read the first line (convert hml into text) + def _get_note_first_line(self, cr, uid, ids, name="", args={}, context=None): res = {} for note in self.browse(cr, uid, ids, context=context): - res[note.id] = (note.note or '').strip().split('\n')[0] + text_note = (note.memo or '').strip().split('\n')[0] + text_note = re.sub(r'(\S?)(<br[ /]*>|<[/]?p>|<[/]?div>|<table>)[\s\S]*',r'\1',text_note) + text_note = re.sub(r'<[^>]+>','',text_note) + res[note.id] = text_note return res + #unactivate a sticky note and record the date + def onclick_note_is_done(self, cr, uid, ids, context=None): + self.write(cr, uid, ids, { 'active' : False, 'date_done' : fields.date.today() }) + self.message_post(cr, uid, ids[0], body='Note is done.', subject=False, + type='notification', parent_id=False, attachments=None, context=context) + return False + + #activate a note + def onclick_note_not_done(self, cr, uid, ids, context=None): + self.write(cr, uid, ids, {'active' : True}) + self.message_post(cr, uid, ids[0], body='Note has been activated.', subject=False, + type='notification', parent_id=False, attachments=None, context=context) + return False + + #used for undisplay the follower if it's the current user + def _get_my_current_partner(self, cr, uid, ids, name, args, context=None): + user = self.pool.get('res.users').browse(cr, uid, uid, context=context) + pid = user.partner_id and user.partner_id.id or False + return dict.fromkeys(ids, pid) + + #return the default stage for the uid user def _get_default_stage_id(self,cr,uid,context=None): - ids = self.pool.get('note.stage').search(cr,uid,[('user_id','=',uid)]) + ids = self.pool.get('note.stage').search(cr,uid,[('user_id','=',uid)], context=context) return ids and ids[0] or False - def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, access_rights_uid=None, context=None): - access_rights_uid = access_rights_uid or uid - stage_obj = self.pool.get('note.stage') + def _set_stage_per_user(self, cr, uid, id, name, value, args=None, context=None): + note = self.browse(cr, uid, id, context=context) + if not value: return False + return self.write(cr, uid, [id], {'stage_ids': [(4, value)]}, context=context) - # only show stage groups not folded and owned by user - search_domain = [('user_id', '=', uid)] + def _get_stage_per_user(self, cr, uid, ids, name, args, context=None): + result = dict.fromkeys(ids, False) + for record in self.browse(cr, uid, ids, context=context): + for stage in record.stage_ids: + if stage.user_id.id == uid: + result[record.id] = stage.id + return result - stage_ids = stage_obj._search(cr, uid, search_domain, order=self._order, access_rights_uid=access_rights_uid, context=context) - result = stage_obj.name_get(cr, access_rights_uid, stage_ids, context=context) - - fold = {} - for stage in stage_obj.browse(cr, access_rights_uid, stage_ids, context=context): - fold[stage.id] = stage.fold or False - return result, fold _columns = { - 'name': fields.function(_get_note_first_line, fnct_inv=_set_note_first_line, string='Note Summary', type="text"), - 'note': fields.text('Pad Content'), - 'note_pad_url': fields.char('Pad Url', size=250), + 'name': fields.function(_get_note_first_line, + string='Note Summary', + type='text', store=True), + 'memo': fields.html('Note Content'), 'sequence': fields.integer('Sequence'), - 'stage_id': fields.many2one('note.stage', 'Stage'), + 'stage_id': fields.function(_get_stage_per_user, + fnct_inv=_set_stage_per_user, + string='Stage', + type='many2one', + relation='note.stage'), + 'stage_ids': fields.many2many('note.stage','note_stage_rel','note_id','stage_id','Stages of Users'), 'active': fields.boolean('Active'), + 'date_done': fields.date('Date done'), 'color': fields.integer('Color Index'), - # to be replaced by message_follower_ids - 'follower_ids': fields.many2many('res.users', 'mail_subscription', 'res_id', 'user_id', 'Followers') + 'tag_ids' : fields.many2many('note.tag','note_tags_rel','note_id','tag_id','Tags'), + 'current_partner_id' : fields.function(_get_my_current_partner), } - _defaults = { 'active' : 1, 'stage_id' : _get_default_stage_id, - 'note_pad_url': lambda self, cr, uid, context: self.pad_generate_url(cr, uid, context), } - _order = 'sequence asc' - _group_by_full = { - 'stage_id' : _read_group_stage_ids, + _order = 'sequence' + + def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False): + if groupby and groupby[0]=="stage_id": + + #search all stages + current_stage_ids = self.pool.get('note.stage').search(cr,uid,[('user_id','=',uid)], context=context) + + if current_stage_ids: #if the user have some stages + + #dict of stages: map les ids sur les noms + stage_name = dict(self.pool.get('note.stage').name_get(cr, uid, current_stage_ids, context=context)) + + result = [{ #notes by stage for stages user + '__context': {'group_by': groupby[1:]}, + '__domain': domain + [('stage_ids.id', '=', current_stage_id)], + 'stage_id': (current_stage_id, stage_name[current_stage_id]), + 'stage_id_count': self.search(cr,uid, domain+[('stage_ids', '=', current_stage_id)], context=context, count=True) + } for current_stage_id in current_stage_ids] + + #note without user's stage + nb_notes_ws = self.search(cr,uid, domain+[('stage_ids', 'not in', current_stage_ids)], context=context, count=True) + if nb_notes_ws: + result += [{ #notes for unknown stage and if stage_ids is not empty + '__context': {'group_by': groupby[1:]}, + '__domain': domain + [('stage_ids', 'not in', current_stage_ids)], + 'stage_id': (0, 'Unknown'), + 'stage_id_count':nb_notes_ws + }] + + else: # if stage_ids is empty + + #note without user's stage + nb_notes_ws = self.search(cr,uid, domain, context=context, count=True) + if nb_notes_ws: + result = [{ #notes for unknown stage + '__context': {'group_by': groupby[1:]}, + '__domain': domain, + 'stage_id': (0, 'Unknown'), + 'stage_id_count':nb_notes_ws + }] + else: + result = [] + return result + + else: + return super(note_note, self).read_group(self, cr, uid, domain, fields, groupby, + offset=offset, limit=limit, context=context, orderby=orderby) + + +#upgrade config setting page to configure pad, fancy and tags mode +class note_base_config_settings(osv.osv_memory): + _inherit = 'base.config.settings' + _columns = { + 'module_note_pad': fields.boolean('Use collaborative pads (etherpad)'), + 'group_note_fancy': fields.boolean('Use fancy layouts for notes', implied_group='note.group_note_fancy'), + 'group_note_tags': fields.boolean('Allow setting tags on notes', implied_group='note.group_note_tags'), } diff --git a/addons/note/note_data.xml b/addons/note/note_data.xml index 670b4c89269..91684640d97 100644 --- a/addons/note/note_data.xml +++ b/addons/note/note_data.xml @@ -3,19 +3,19 @@ <data> <record model="note.stage" id="note_stage_01"> - <field name="name">Todo today</field> + <field name="name">Today</field> <field name="sequence">1</field> <field name="user_id" eval="ref('base.user_root')"/> </record> <record model="note.stage" id="note_stage_02"> - <field name="name">Todo later</field> + <field name="name">Later</field> <field name="sequence">2</field> <field name="user_id" eval="ref('base.user_root')"/> </record> <record model="note.stage" id="note_stage_03"> - <field name="name">For Info</field> + <field name="name">Notes</field> <field name="sequence">3</field> <field name="user_id" eval="ref('base.user_root')"/> </record> diff --git a/addons/note/note_demo.xml b/addons/note/note_demo.xml index 5e776664fe5..82601f903c0 100644 --- a/addons/note/note_demo.xml +++ b/addons/note/note_demo.xml @@ -1,128 +1,147 @@ <?xml version="1.0"?> <openerp> - <data> + <data noupdate="1"> + <record model="note.stage" id="demo_note_stage_01"> + <field name="name">Today</field> + <field name="sequence">1</field> + <field name="user_id" eval="ref('base.user_demo')"/> + </record> + + <record model="note.stage" id="demo_note_stage_02"> + <field name="name">Tomorrow</field> + <field name="sequence">2</field> + <field name="user_id" eval="ref('base.user_demo')"/> + </record> + + <record model="note.stage" id="demo_note_stage_03"> + <field name="name">Later</field> + <field name="sequence">3</field> + <field name="user_id" eval="ref('base.user_demo')"/> + </record> + + <record model="note.stage" id="demo_note_stage_04"> + <field name="name">Notes</field> + <field name="sequence">4</field> + <field name="user_id" eval="ref('base.user_demo')"/> + </record> + <record id="note_1" model="note.note"> - <field name="note"><![CDATA[Buying list - * coffee - * fruits - * ice cream - * towels - ]]> + <field name="name">Customer report #349872</field> + <field name="memo"><![CDATA[Customer report #349872 + <br/><br/>* Calendar app in Home + <br/>* The base_calendar module should create a menu in Home, like described above. + <br/>* This module should become a main application (in the first screen at installation) + <br/>* We should use the term Calendar, not Meeting. + ]]> </field> <field name="stage_id" ref="note_stage_01"/> <field name="color">2</field> </record> + <record id="note_2" model="note.note"> - <field name="note"><![CDATA[Buying list - * more coffee - * tee - * sugar - * towels + <field name="memo"><![CDATA[Call Fabien + <br/><br/>* Followed by the telephone conversation and mail about D.544.3 ]]> </field> <field name="stage_id" ref="note_stage_01"/> </record> <record id="note_3" model="note.note"> - <field name="note"><![CDATA[Idea to develop - * Phasellus vel eros lorem, vel tristique risus. - * Cras elementum risus ut massa bibendum ac sollicitudin quam feugiat. - * Phasellus ullamcorper mauris quis lectus volutpat non dignissim elit lacinia. - - Nulla vitae metus risus, nec placerat diam. - Proin quis nunc sodales dolor tempus eleifend. - Praesent iaculis libero ut orci egestas a dapibus libero ornare. - - * Proin at nisl sit amet ante feugiat euismod nec at orci. - * Nam aliquam massa id neque tincidunt eu pellentesque neque euismod. - * Proin eget mi sit amet erat tempus pellentesque. + <field name="memo"><![CDATA[Call Marc + <br/><br/>]]> + </field> + <field name="stage_id" ref="note_stage_01"/> + </record> - * Phasellus congue est lectus, vitae semper arcu. - * Suspendisse sodales tortor ut odio volutpat fringilla. - * Vestibulum mattis est quis risus dignissim sit amet faucibus nisl mattis. - * Pellentesque ullamcorper neque neque, vitae rhoncus massa. + <record id="note_4" model="note.note"> + <field name="memo"><![CDATA[Project N.947.5 + <br/><br/>]]> + </field> + <field name="stage_id" ref="note_stage_02"/> + </record> - Ut id magna massa, quis scelerisque sapien. + <record id="note_5" model="note.note"> + <field name="memo"><![CDATA[Shop for family dinner + <br/>* stuffed turkey + <br/>* wine + ]]> + </field> + <field name="stage_id" ref="note_stage_02"/> + </record> + <record id="note_6" model="note.note"> + <field name="memo"><![CDATA[Idea to develop + <br/><br/>* Create a module note_pad + it transforms the html editable memo text field into widget='pad', similar to project_pad depends on 'memo' and 'pad' modules ]]> </field> - <field name="stage_id" ref="note_stage_01"/> + <field name="stage_id" ref="note_stage_02"/> </record> - <record id="note_4" model="note.note"> - <field name="note"><![CDATA[Read some documentation about OpenERP before diving into the code - * Open ERP: a modern approach to integrated business management - * Open ERP for Retail and Industrial Management + <record id="note_7" model="note.note"> + <field name="memo"><![CDATA[Read some documentation about OpenERP before diving into the code + <br/><br/>* Open ERP: a modern approach to integrated business management + <br/>* Open ERP for Retail and Industrial Management ]]> </field> - <field name="stage_id" ref="note_stage_02"/> + <field name="stage_id" ref="note_stage_03"/> </record> - <record id="note_5" model="note.note"> - <field name="note"><![CDATA[New computer specs - * Motherboard + <record id="note_8" model="note.note"> + <field name="memo"><![CDATA[New computer specs + <br/><br/>* Motherboard according to processor - * Processor + <br/>* Processor need to decide - * Graphic card + <br/>* Graphic card with great performance for games ! - * Hard drive + <br/>* Hard drive big, for lot of internet backups - * Tower + <br/>* Tower silent, better when watching films - * Blueray drive ? + <br/>* Blueray drive ? is it interesting yet ? - * Screen + <br/>* Screen a big one, full of pixels, of course ! ]]> </field> - <field name="stage_id" ref="note_stage_02"/> + <field name="stage_id" ref="note_stage_03"/> <field name="color">3</field> </record> - <record id="note_6" model="note.note"> - <field name="note"><![CDATA[Read those books - * Open ERP: a modern approach to integrated business management - * Open ERP for Retail and Industrial Management + <record id="note_9" model="note.note"> + <field name="memo"><![CDATA[Read those books + <br/><br/>* Open ERP: a modern approach to integrated business management + <br/>* Open ERP for Retail and Industrial Management ]]> </field> <field name="stage_id" ref="note_stage_02"/> </record> - <record id="note_7" model="note.note"> - <field name="note"><![CDATA[Read some documentation about OpenERP before diving into the code - * Open ERP: a modern approach to integrated business management - * Open ERP for Retail and Industrial Management - ]]> - </field> - <field name="stage_id" ref="note_stage_03"/> - </record> - - <record id="note_8" model="note.note"> - <field name="note"><![CDATA[Read those books - * Open ERP: a modern approach to integrated business management - * Open ERP for Retail and Industrial Management + <record id="note_10" model="note.note"> + <field name="memo"><![CDATA[Read some documentation about OpenERP before diving into the code + <br/><br/>* Open ERP: a modern approach to integrated business management + <br/>* Open ERP for Retail and Industrial Management ]]> </field> <field name="stage_id" ref="note_stage_03"/> - <field name="color">5</field> </record> - <record id="note_9" model="note.note"> - <field name="note"><![CDATA[Read some documentation about OpenERP before diving into the code - * Open ERP: a modern approach to integrated business management - * Open ERP for Retail and Industrial Management + <record id="note_12" model="note.note"> + <field name="memo"><![CDATA[Read some documentation about OpenERP before diving into the code + <br/><br/>* Open ERP: a modern approach to integrated business management + <br/>* Open ERP for Retail and Industrial Management ]]> </field> <field name="stage_id" ref="note_stage_03"/> <field name="color">7</field> </record> - <record id="note_10" model="note.note"> - <field name="note"><![CDATA[Read those books - * Open ERP: a modern approach to integrated business management - * Open ERP for Retail and Industrial Management + <record id="note_13" model="note.note"> + <field name="memo"><![CDATA[Read those books + <br/><br/>* Open ERP: a modern approach to integrated business management + <br/>* Open ERP for Retail and Industrial Management ]]> </field> <field name="stage_id" ref="note_stage_03"/> diff --git a/addons/note/note_view.xml b/addons/note/note_view.xml index 73636ce1a9a..1166e687750 100644 --- a/addons/note/note_view.xml +++ b/addons/note/note_view.xml @@ -4,7 +4,7 @@ <menuitem name="Organizer" id="note_my_stuff" parent="mail.mail_feeds_main"/> - <!-- Note Stage Form View --> + <!-- note Stage Form View --> <record model="ir.ui.view" id="view_note_stage_form"> <field name="name">note.stage.form</field> <field name="model">note.stage</field> @@ -17,117 +17,175 @@ </field> </record> - <!-- Note Stage Tree View --> + <!-- note Stage Tree View --> <record model="ir.ui.view" id="view_note_stage_tree"> <field name="name">note.stage.tree</field> <field name="model">note.stage</field> <field name="field_parent"></field> <field name="arch" type="xml"> - <tree string="Stages of notes" editable="bottom"> - <field name="sequence" widget="handle"/> - <field name="name"/> - <field name="fold"/> + <tree string="Stages of Notes" editable="bottom"> + <field name="sequence" widget="handle"/> + <field name="name"/> + <field name="fold"/> </tree> </field> </record> - <!-- Note Stage Action --> + <!-- note Stage Action --> <record model="ir.actions.act_window" id="action_note_stage"> - <field name="name">Stages</field> - <field name="res_model">note.stage</field> - <field name="view_mode">tree,form</field> - <field name="domain">[('user_id','=',uid)]</field> + <field name="name">Stages</field> + <field name="res_model">note.stage</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('user_id','=',uid)]</field> </record> - <menuitem name="Categories" - id="menu_notes_stage" parent="note_my_stuff" action="action_note_stage" sequence="40" groups="base.group_no_one"/> + <menuitem name="Categories" id="menu_notes_stage" parent="note_my_stuff" action="action_note_stage" sequence="40" groups="base.group_no_one"/> - <!-- New Note Kanban View --> + <!-- New note Kanban View --> <record model="ir.ui.view" id="view_note_note_kanban"> <field name="name">note.note.kanban</field> <field name="model">note.note</field> <field name="arch" type="xml"> - <kanban default_group_by="stage_id" class="oe_notes" version="7.0"> + <kanban default_group_by="stage_id" class="oe_notes oe_kanban_quickcreate_textarea" version="7.0"> <field name="color"/> <field name="sequence"/> <field name="name"/> <field name="stage_id"/> <field name="active"/> - <field name="note"/> - <field name="follower_ids"/> + <field name="memo"/> + <field name="date_done"/> + <field name="current_partner_id"/> + <field name="message_follower_ids"/> + <field name="tag_ids"/> <templates> <t t-name="kanban-box"> - <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click oe_semantic_html_override"> - <!-- dropdown menu --> - <div class="oe_dropdown_toggle oe_dropdown_kanban"> - <span class="oe_e">í</span> - <ul class="oe_dropdown_menu"> - <li><a type="edit">Edit...</a></li> - <li><a type="delete">Delete</a></li> - <li><ul class="oe_kanban_colorpicker" data-field="color"/></li> - </ul> + + <t t-set="record.group_fancy" t-value="1" groups="note.group_note_fancy"/> + + <div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_global_click_edit oe_semantic_html_override oe_kanban_card #{record.group_fancy==1 ? 'oe_kanban_card_fancy' : ''}"> + <div class="oe_dropdown_kanban"> + <span> + <a name="onclick_note_is_done" type="object" t-if="record.active.raw_value" class="oe_e">W</a> + <a name="onclick_note_not_done" type="object" t-if="!record.active.raw_value" class="oe_e">è</a> + </span> + + <!-- dropdown menu --> + <div class="oe_dropdown_toggle"> + <span class="oe_e">í</span> + <ul class="oe_dropdown_menu"> + <li><a type="delete">Delete</a></li> + <li><ul class="oe_kanban_colorpicker" data-field="color"/></li> + </ul> + </div> </div> <!-- kanban note --> - <div class="oe_kanban_content"> + <div t-attf-class="oe_kanban_content #{record.active.raw_value ? '' : 'note_text_line_through'}"> <!-- title --> <field name="name"/> </div> - - <div class="oe_kanban_project_avatars"> - <t t-foreach="record.follower_ids.raw_value" t-as="follower"> - <img t-att-src="kanban_image('res.users', 'image_small', follower)" t-att-data-member_id="follower"/> + <div widget="many2many_tags" t-att-data="record.tag_ids.raw_value" model="note.tag"/> + <div class="oe_right"> + <t t-foreach="record.message_follower_ids.raw_value" t-as="follower"> + <img t-if="record.current_partner_id.raw_value!=follower" t-att-src="kanban_image('res.partner', 'image_small', follower)" width="24" height="24" class="oe_kanban_avatar" t-att-data-member_id="follower"/> </t> </div> + <div class="oe_clear"></div> </div> - <div class="oe_clear"></div> </t> </templates> </kanban> </field> </record> - <!-- New Note Form View --> + <!-- New note Form View --> + <record model="ir.ui.view" id="view_note_note_tree"> + <field name="name">note.note.tree</field> + <field name="model">note.note</field> + <field name="arch" type="xml"> + <tree string="Stages"> + <field name="name"/> + <field name="active"/> + <field name="stage_id"/> + <field name="tag_ids" widget="many2many_tags" groups="note.group_note_tags"/> + </tree> + </field> + </record> + + <!-- New note Form View --> <record model="ir.ui.view" id="view_note_note_form"> <field name="name">note.note.form</field> <field name="model">note.note</field> <field name="arch" type="xml"> <form string="Note" version="7.0"> <header> - <field name="stage_id" domain="[('user_id','=',uid)]" widget="statusbar" clickable="1"/> + <field name="stage_id" domain="[('user_id','=',uid)]" widget="statusbar" clickable="1"/> </header> - <field name="note"/> - <field name="note_pad_url" invisible="1"/> - <div class="oe_chatter"> - <field name="message_ids" widget="mail_thread"/> - </div> + <field name="memo" widget="html"/><!-- editor_width="100%%" editor_height="60%%" --> + <group groups="note.group_note_tags" col="2"> + <field name="tag_ids" widget="many2many_tags"/> + </group> + <field name="message_follower_ids" widget="mail_followers"/> + <field class="oe_chatter" name="message_ids" widget="mail_thread"/> </form> </field> </record> - <!-- Search Note --> + <!-- Search note --> <record model="ir.ui.view" id="view_note_note_filter"> <field name="name">note.note.search</field> <field name="model">note.note</field> <field name="arch" type="xml"> <search string="Notes"> - <field name="note" string="Note"/> + <field name="memo" string="Note"/> + <field name="tag_ids" groups="note.group_note_tags"/> <field name="stage_id"/> + <filter name="active_true" string="Active" domain="['|',('active', '=', True),('date_done','=',time.strftime('%%Y-%%m-%%d'))]"/> + <filter name="active_false" string="Old" domain="[('active', '=', False)]"/> <group expand="0" string="Group By..."> - <filter icon="terp-personal" string="Creator" help="By Creators" context="{'group_by':'create_uid'}"/> - <filter icon="terp-stock_symbol-selection" string="Stage" help="By Note Category" context="{'group_by':'stage_id'}"/> + <filter icon="terp-stock_symbol-selection" string="Stage" help="By sticky note Category" context="{'group_by':'stage_id'}"/> </group> </search> </field> </record> - <!-- Note Action --> + + <!-- general settings --> + <record model="ir.ui.view" id="view_general_settings_note_form"> + <field name="name">note.view.general_settings.form</field> + <field name="model">base.config.settings</field> + <field name="inherit_id" ref="base_setup.view_general_configuration"/> + <field name="arch" type="xml"> + <xpath expr="//label[@string='Authentication']/.." position="after"> + <group> + <label for="id" string="Notes"/> + <div name="note"> + <div> + <field name="module_note_pad" class="oe_inline"/> + <label for="module_note_pad"/> + </div> + <div> + <field name="group_note_fancy" class="oe_inline"/> + <label for="group_note_fancy"/> + </div> + <div> + <field name="group_note_tags" class="oe_inline"/> + <label for="group_note_tags"/> + </div> + </div> + </group> + </xpath> + </field> + </record> + + <!-- Action --> <record model="ir.actions.act_window" id="action_note_note"> <field name="name">Notes</field> <field name="res_model">note.note</field> <field name="view_type">form</field> <field name="view_mode">kanban,tree,form</field> <field name="search_view_id" ref="view_note_note_filter"/> + <field name="context">{'search_default_active_true':True}</field> </record> <menuitem name="Notes" id="note_notes" parent="note_my_stuff" sequence="20" action="action_note_note"/> diff --git a/addons/note/security/ir.model.access.csv b/addons/note/security/ir.model.access.csv index fdd6030ca51..cbe11cba94e 100644 --- a/addons/note/security/ir.model.access.csv +++ b/addons/note/security/ir.model.access.csv @@ -1,3 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_note_stage_user,note.stage user,model_note_stage,base.group_user,1,1,1,1
-access_note_note_user,note.note user,model_note_note,base.group_user,1,1,1,1
+access_note_stage,note.stage,model_note_stage,base.group_user,1,1,1,1
+access_note_note,note.note,model_note_note,base.group_user,1,1,1,1
+access_note_tag,note.tag,model_note_tag,base.group_user,1,1,1,1
diff --git a/addons/note/security/ir.rule.xml b/addons/note/security/ir.rule.xml new file mode 100644 index 00000000000..3d2f0d242f6 --- /dev/null +++ b/addons/note/security/ir.rule.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<openerp> +<data> + <record id="note_note_rule_global" model="ir.rule"> + <field name="name">Only followers can access a sticky notes</field> + <field model="ir.model" ref="model_note_note" name="model_id"/> + <field name="domain_force">['|',('message_follower_ids','=',False),('message_follower_ids','=',user.partner_id.id)]</field> + <field eval="True" name="global"/> + </record> +</data> +</openerp> + diff --git a/addons/note/security/note_security.xml b/addons/note/security/note_security.xml deleted file mode 100644 index 46eebee629c..00000000000 --- a/addons/note/security/note_security.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0"?> -<openerp> -<data> - <record id="note_note_global" model="ir.rule"> - <field name="name">My notes</field> - <field ref="model_note_note" name="model_id"/> - <field eval="1" name="global"/> - <field name="domain_force">[('follower_ids','=',user.id)]</field> - </record> -</data> -</openerp> - diff --git a/addons/note/security/res.groups.csv b/addons/note/security/res.groups.csv new file mode 100644 index 00000000000..61c54c964ff --- /dev/null +++ b/addons/note/security/res.groups.csv @@ -0,0 +1,3 @@ +id,name,implied_ids/id
+group_note_tags,Memo / Display tags,
+group_note_fancy,Memo / Fancy mode,
diff --git a/addons/note/static/src/css/Makefile b/addons/note/static/src/css/Makefile index d6019f4ed4a..91b3abc9333 100644 --- a/addons/note/static/src/css/Makefile +++ b/addons/note/static/src/css/Makefile @@ -1,3 +1,3 @@ -note.css: note.sass - sass -t expanded note.sass note.css +memo.css: memo.sass + sass -t expanded memo.sass memo.css diff --git a/addons/note/static/src/css/note.css b/addons/note/static/src/css/note.css index 7e79438b46a..6ada8d6cd14 100644 --- a/addons/note/static/src/css/note.css +++ b/addons/note/static/src/css/note.css @@ -1,78 +1,143 @@ -.openerp .oe_notes .oe_fold_column .oe_kanban_card { - text-decoration:none; - color:#000; - display:block; - padding:1em; - margin-right: 1em; - margin-bottom: 1em; - - -moz-box-shadow:5px 5px 7px rgba(33,33,33,1); - -webkit-box-shadow: 5px 5px 7px rgba(33,33,33,.7); - box-shadow: 5px 5px 7px rgba(33,33,33,.7); +@charset "utf-8"; +@font-face { + font-family: "mnmliconsRegular"; + src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot"); + src: url("/web/static/src/font/mnmliconsv21-webfont.woff") format("woff"); + src: url("/web/static/src/font/mnmliconsv21-webfont.ttf") format("truetype"); + src: url("/web/static/src/font/mnmliconsv21-webfont.svg") format("svg") active; + font-weight: normal; + font-style: normal; } -.openerp .oe_notes .oe_kanban_record .oe_kanban_card { - -webkit-transform: rotate(-2deg); - -o-transform: rotate(-2deg); - -moz-transform:rotate(-2deg); +@font-face { + font-family: "EntypoRegular"; + src: url("/web/static/src/font/entypo-webfont.eot") format("eot"); + src: url("/web/static/src/font/entypo-webfont.eot?#iefix") format("embedded-opentype"); + src: url("/web/static/src/font/entypo-webfont.woff") format("woff"); + src: url("/web/static/src/font/entypo-webfont.ttf") format("truetype"); + src: url("/web/static/src/font/entypo-webfont.svg") format("svg") active; + font-weight: normal; + font-style: normal; } -.openerp .oe_notes .oe_kanban_record:nth-of-type(even) .oe_kanban_card { - -webkit-transform: rotate(1deg); - -o-transform: rotate(1deg); - -moz-transform:rotate(1deg); -} +@-moz-keyframes bounce { + 0% { + -moz-transform: scale(0); + opacity: 0; + } -.openerp .oe_notes .oe_kanban_record:nth-of-type(3n) .oe_kanban_card { - -webkit-transform: rotate(4deg); - -o-transform: rotate(4deg); - -moz-transform:rotate(4deg); -} + 50% { + -moz-transform: scale(1.3); + opacity: 0.4; + } + + 75% { + -moz-transform: scale(0.9); + opacity: 0.7; + } -.openerp .oe_notes .oe_kanban_column:nth-of-type(even) .oe_kanban_record .oe_kanban_card { - -webkit-transform: rotate(2deg); - -o-transform: rotate(2deg); - -moz-transform:rotate(2deg); + 100% { + -moz-transform: scale(1); + opacity: 1; + } } -.openerp .oe_notes .oe_kanban_column:nth-of-type(even) .oe_kanban_record:nth-of-type(even) .oe_kanban_card { - -webkit-transform: rotate(-3deg); - -o-transform: rotate(-3deg); - -moz-transform:rotate(-3deg); +@-webkit-keyframes bounce { + 0% { + -webkit-transform: scale(0); + opacity: 0; + } + + 50% { + -webkit-transform: scale(1.3); + opacity: 0.4; + } + + 75% { + -webkit-transform: scale(0.9); + opacity: 0.7; + } + + 100% { + -webkit-transform: scale(1); + opacity: 1; + } } -.openerp .oe_notes .oe_kanban_column:nth-of-type(even) .oe_kanban_record:nth-of-type(3n) .oe_kanban_card { - -webkit-transform: rotate(1deg); - -o-transform: rotate(1deg); - -moz-transform:rotate(1deg); +.oe_kanban_color_2 { + background-color: red; } -.openerp .oe_notes .oe_kanban_column:nth-of-type(3n) .oe_kanban_record .oe_kanban_card { - -webkit-transform: rotate(-2deg); - -o-transform: rotate(-2deg); - -moz-transform:rotate(-2deg); +.oe_kanban_column .note_text_line_through { + text-decoration: line-through; } -.openerp .oe_notes .oe_kanban_column:nth-of-type(3n) .oe_kanban_record:nth-of-type(even) .oe_kanban_card { - -webkit-transform: rotate(1deg); - -o-transform: rotate(1deg); - -moz-transform:rotate(1deg); +.openerp .oe_fold_column .oe_kanban_card_fancy { + text-decoration: none; + color: black; + display: block; + padding: 1em; + margin-right: 1em; + margin-bottom: 1em; + -moz-box-shadow: 5px 5px 7px #212121; + -webkit-box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7); + box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7); } -.openerp .oe_notes .oe_kanban_column:nth-of-type(3n) .oe_kanban_record:nth-of-type(3n) .oe_kanban_card { - -webkit-transform: rotate(-1deg); - -o-transform: rotate(-1deg); - -moz-transform:rotate(-1deg); +.openerp .oe_kanban_record .oe_kanban_card_fancy { + -webkit-transform: rotate(-2deg); + -o-transform: rotate(-2deg); + -moz-transform: rotate(-2deg); +} +.openerp .oe_kanban_record:nth-of-type(even) .oe_kanban_card_fancy { + -webkit-transform: rotate(1deg); + -o-transform: rotate(1deg); + -moz-transform: rotate(1deg); +} +.openerp .oe_kanban_record:nth-of-type(3n) .oe_kanban_card_fancy { + -webkit-transform: rotate(4deg); + -o-transform: rotate(4deg); + -moz-transform: rotate(4deg); +} +.openerp .oe_kanban_column:nth-of-type(even) .oe_kanban_card_fancy { + -webkit-transform: rotate(2deg); + -o-transform: rotate(2deg); + -moz-transform: rotate(2deg); +} +.openerp .oe_kanban_column:nth-of-type(even) .oe_kanban_record:nth-of-type(even) .oe_kanban_card_fancy { + -webkit-transform: rotate(-3deg); + -o-transform: rotate(-3deg); + -moz-transform: rotate(-3deg); +} +.openerp .oe_kanban_column:nth-of-type(even) .oe_kanban_record:nth-of-type(3n) .oe_kanban_card_fancy { + -webkit-transform: rotate(1deg); + -o-transform: rotate(1deg); + -moz-transform: rotate(1deg); +} +.openerp .oe_kanban_column:nth-of-type(3n) .oe_kanban_card_fancy { + -webkit-transform: rotate(-2deg); + -o-transform: rotate(-2deg); + -moz-transform: rotate(-2deg); +} +.openerp .oe_kanban_column:nth-of-type(3n) .oe_kanban_record:nth-of-type(even) .oe_kanban_card_fancy { + -webkit-transform: rotate(1deg); + -o-transform: rotate(1deg); + -moz-transform: rotate(1deg); +} +.openerp .oe_kanban_column:nth-of-type(3n) .oe_kanban_record:nth-of-type(3n) .oe_kanban_card_fancy { + -webkit-transform: rotate(-1deg); + -o-transform: rotate(-1deg); + -moz-transform: rotate(-1deg); } -.openerp .oe_notes .oe_kanban_column .oe_fold_column .oe_kanban_card:hover, -.openerp .oe_notes .oe_kanban_column .oe_fold_column .oe_kanban_card:focus { - box-shadow:10px 10px 7px rgba(0,0,0,.7); - -moz-box-shadow:10px 10px 7px rgba(0,0,0,.7); - -webkit-box-shadow: 10px 10px 7px rgba(0,0,0,.7); - -webkit-transform: rotate(0); - -moz-transform: rotate(0); - -o-transform: rotate(0); - position:relative; - z-index:5; +.openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:hover, +.openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:focus { + box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7); + -moz-box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7); + -webkit-box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7); + position: relative; + z-index: 5; + -webkit-transform: rotate(0); + -o-transform: rotate(0); + -moz-transform: rotate(0); } diff --git a/addons/note/static/src/css/note.sass b/addons/note/static/src/css/note.sass index cd04015dcbb..56aa91abc44 100644 --- a/addons/note/static/src/css/note.sass +++ b/addons/note/static/src/css/note.sass @@ -42,10 +42,10 @@ $sheet-max-width: 860px background-color: $startColor background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)) /* Saf4+, Chrome */ background-image: -webkit-linear-gradient(top, $startColor, $endColor) /* Chrome 10+, Saf5.1+, iOS 5+ */ - background-image: -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */ - background-image: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */ - background-image: -o-linear-gradient(top, $startColor, $endColor) /* Opera 11.10+ */ - background-image: linear-gradient(to bottom, $startColor, $endColor) + background-image: -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */ + background-image: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */ + background-image: -o-linear-gradient(top, $startColor, $endColor) /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, $startColor, $endColor) @mixin radial-gradient($gradient) background-position: center center @@ -93,7 +93,7 @@ $sheet-max-width: 860px font-size: 1px letter-spacing: -1px color: transparent - &:before + &: before font: 21px "mnmliconsRegular" content: $icon-name color: $color @@ -131,7 +131,79 @@ $sheet-max-width: 860px .oe_kanban_color_2 - background-color:red + background-color: red -// au BufWritePost,FileWritePost *.sass :!sass --style expanded --line-numbers <afile> > "%:p:r.css" - +// au BufWritePost,FileWritePost *.sass : !sass --style expanded --line-numbers <afile> > "%: p: r.css" + +.oe_kanban_column + .note_text_line_through + text-decoration: line-through + + +.openerp + .oe_fold_column + .oe_kanban_card_fancy + text-decoration: none + color: #000 + display: block + padding: 1em + margin-right: 1em + margin-bottom: 1em + -moz-box-shadow: 5px 5px 7px rgba(33,33,33,1) + -webkit-box-shadow: 5px 5px 7px rgba(33,33,33,.7) + box-shadow: 5px 5px 7px rgba(33,33,33,.7) + + +@mixin rotate($a) + -webkit-transform: rotate($a) + -o-transform: rotate($a) + -moz-transform: rotate($a) + +.openerp + .oe_kanban_record + .oe_kanban_card_fancy + @include rotate(-2deg) + .oe_kanban_record:nth-of-type(even) + .oe_kanban_card_fancy + @include rotate(1deg) + .oe_kanban_record:nth-of-type(3n) + .oe_kanban_card_fancy + @include rotate(4deg) + .oe_kanban_column:nth-of-type(even) + .oe_kanban_card_fancy + @include rotate(2deg) + .oe_kanban_column:nth-of-type(even) + .oe_kanban_record:nth-of-type(even) + .oe_kanban_card_fancy + @include rotate(-3deg) + .oe_kanban_column:nth-of-type(even) + .oe_kanban_record:nth-of-type(3n) + .oe_kanban_card_fancy + @include rotate(1deg) + .oe_kanban_column:nth-of-type(3n) + .oe_kanban_card_fancy + @include rotate(-2deg) + .oe_kanban_column:nth-of-type(3n) + .oe_kanban_record:nth-of-type(even) + .oe_kanban_card_fancy + @include rotate(1deg) + .oe_kanban_column:nth-of-type(3n) + .oe_kanban_record:nth-of-type(3n) + .oe_kanban_card_fancy + @include rotate(-1deg) + + +@mixin oe_kanban_card_fancy + box-shadow: 10px 10px 7px rgba(0,0,0,.7) + -moz-box-shadow: 10px 10px 7px rgba(0,0,0,.7) + -webkit-box-shadow: 10px 10px 7px rgba(0,0,0,.7) + position: relative + z-index: 5 + @include rotate(0) + +.openerp + .oe_kanban_column + .oe_fold_column + .oe_kanban_card_fancy:hover, + .oe_kanban_card_fancy:focus + @include oe_kanban_card_fancy diff --git a/addons/note_pad/__init__.py b/addons/note_pad/__init__.py new file mode 100644 index 00000000000..44a484adac4 --- /dev/null +++ b/addons/note_pad/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +import note_pad + diff --git a/addons/note_pad/__openerp__.py b/addons/note_pad/__openerp__.py new file mode 100644 index 00000000000..1a40ef80cc6 --- /dev/null +++ b/addons/note_pad/__openerp__.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +{ + 'name': 'Memos pad', + 'version': '0.1', + 'category': 'Tools', + 'description': """ +This module update memos inside OpenERP for using an external pad +=================================================================== + +Use for update your text memo in real time with the following user that you invite. + +""", + 'author': 'OpenERP SA', + 'website': 'http://openerp.com', + 'summary': 'Sticky memos, Collaborative', + 'depends': [ + 'base_tools', + 'mail', + 'pad', + 'note', + ], + 'data': [ + 'note_pad_view.xml', + ], + 'installable': True, + 'application': False, + 'auto_install': False, +} + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/note_pad/note_pad.py b/addons/note_pad/note_pad.py new file mode 100644 index 00000000000..9864f0ae14f --- /dev/null +++ b/addons/note_pad/note_pad.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## + +from openerp.osv import osv, fields +from tools.translate import _ + +class note_pad_note(osv.osv): + """ memo pad """ + + _name = 'note.note' + _inherit = ['pad.common','note.note'] + + _pad_fields = ['note_pad'] + + _columns = { + 'note_pad_url': fields.char('Pad Url', + pad_content_field='memo', + size=250 ), + } + + #_defaults = { + # 'note_pad_url': lambda self, cr, uid, context: self.pad_generate_url(cr, uid, context), + #} diff --git a/addons/note_pad/note_pad_view.xml b/addons/note_pad/note_pad_view.xml new file mode 100644 index 00000000000..9e45a3952f1 --- /dev/null +++ b/addons/note_pad/note_pad_view.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" ?> +<openerp> + <data> + <record model="ir.ui.view" id="view_note_note_pad_form"> + <field name="name">note_pad.view.form</field> + <field name="model">note.note</field> + <field name="inherit_id" ref="note.view_note_note_form"/> + <field name="arch" type="xml"> + <field name="memo" position="replace"> + <field name="note_pad_url" widget="pad"/> + </field> + </field> + </record> + </data> +</openerp> |
