diff options
| author | Sanjay Gohel (Open ERP) <sgo@tinyerp.com> | 2012-09-17 12:27:40 +0530 |
|---|---|---|
| committer | Sanjay Gohel (Open ERP) <sgo@tinyerp.com> | 2012-09-17 12:27:40 +0530 |
| commit | e6cdcb6b51d49539a33d4d32d79f8ba07467bdbd (patch) | |
| tree | 4147ec7e183e9488012197c52ac755435e1ad027 /addons/note | |
| parent | ca38083f17c2f9b0e4f58b5e6102fbc5f9e2f791 (diff) | |
| parent | cd644106f30d303738fdd0a04b9b15e5e4a33bbf (diff) | |
[MERGE]merge with trunk addons
bzr revid: sgo@tinyerp.com-20120917065740-w9a3xhe632368t2n
Diffstat (limited to 'addons/note')
| -rw-r--r-- | addons/note/__openerp__.py | 16 | ||||
| -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 | 181 | ||||
| -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 |
12 files changed, 553 insertions, 261 deletions
diff --git a/addons/note/__openerp__.py b/addons/note/__openerp__.py index 62d9962634a..7d6cac5b85b 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 ================================================================= Use notes to write meeting minutes, organize ideas, organize personnal todo -lists, etc. Each user manages his own personnal notes. Notes are available to +lists, etc. Each user manages his own personnal memos. 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 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 e6ab25198a6..82601f903c0 100644 --- a/addons/note/note_demo.xml +++ b/addons/note/note_demo.xml @@ -1,151 +1,150 @@ <?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="note_pad"></field> <field name="stage_id" ref="note_stage_01"/> - <field name="user_id" ref="base.user_root"/> <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="note_pad"></field> <field name="stage_id" ref="note_stage_01"/> - <field name="user_id" ref="base.user_root"/> </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="note_pad"></field> - <field name="stage_id" ref="note_stage_01"/> - <field name="user_id" ref="base.user_root"/> + <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="note_pad"></field> - <field name="stage_id" ref="note_stage_02"/> - <field name="user_id" ref="base.user_root"/> + <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="note_pad"></field> - <field name="stage_id" ref="note_stage_02"/> - <field name="user_id" ref="base.user_root"/> + <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="note_pad"></field> <field name="stage_id" ref="note_stage_02"/> - <field name="user_id" ref="base.user_root"/> </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="note_pad"></field> - <field name="stage_id" ref="note_stage_03"/> - <field name="user_id" ref="base.user_root"/> - </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="note_pad"></field> <field name="stage_id" ref="note_stage_03"/> - <field name="user_id" ref="base.user_root"/> - <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="note_pad"></field> <field name="stage_id" ref="note_stage_03"/> - <field name="user_id" ref="base.user_root"/> <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="note_pad"></field> <field name="stage_id" ref="note_stage_03"/> - <field name="user_id" ref="base.user_root"/> </record> </data> 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 |
