[MERGE] merging notes + small cleaning

bzr revid: fp@openerp.com-20120916171015-e0n1lq2a5c10a0nb
This commit is contained in:
Fabien Pinckaers 2012-09-16 19:10:15 +02:00
commit 5000fffb1e
19 changed files with 694 additions and 274 deletions

View File

@ -9,9 +9,11 @@
<field name="inherit_id" ref="base.res_partner_kanban_view"/> <field name="inherit_id" ref="base.res_partner_kanban_view"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//div[@class='oe_kanban_partner_categories']" position="inside"> <xpath expr="//div[@class='oe_kanban_partner_categories']" position="inside">
<t t-foreach="record.category_id.raw_value" t-as="category"> <span class="oe_kanban_list_many2many" data-model="res.partner.category">
<span class="oe_tag" t-att-data-category_id="category"/> <t t-foreach="record.category_id.raw_value" t-as="category">
</t> <span class="oe_tag" t-att-data-list_id="category"/>
</t>
</span>
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@ -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]);
});
});
}
}
});
};

View File

@ -1,4 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 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_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_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 access_mail_thread,mail.thread,model_mail_thread,base.group_user,1,1,1,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mail_global mail.mail model_mail_mail base.group_system 1 1 1 1
3 access_mail_message_all mail.message.all model_mail_message 1 0 0 0
4 access_mail_message_group_user mail.message.group.user model_mail_message base.group_user 1 1 1 1
5 access_mail_thread mail.thread model_mail_thread base.group_user 1 1 1 0

View File

@ -20,31 +20,31 @@
############################################################################## ##############################################################################
{ {
'name': 'Notes', 'name': 'Memos',
'version': '0.1', 'version': '1.0',
'category': 'Tools', 'category': 'Tools',
'description': """ '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 Use memos 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. Memos are available to
their authors only, but they can share notes to others users so that several their authors only, but they can share memos to others users so that several
people can work on the same note in real time. It's very efficient to share people can work on the same memo in real time. It's very efficient to share
meeting minutes. meeting minutes.
Notes can be found in the 'Home' menu. Memos can be found in the 'Home' menu.
""", """,
'author': 'OpenERP SA', 'author': 'OpenERP SA',
'website': 'http://openerp.com', 'website': 'http://openerp.com',
'summary': 'Sticky Notes, Collaborative', 'summary': 'Sticky notes, Collaborative, Memos',
'depends': [ 'depends': [
'base_tools', 'base_tools',
'mail', 'mail',
'pad',
], ],
'data': [ 'data': [
'security/note_security.xml', 'security/res.groups.csv',
'security/ir.rule.xml',
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'note_data.xml', 'note_data.xml',
'note_view.xml', 'note_view.xml',
@ -52,6 +52,8 @@ Notes can be found in the 'Home' menu.
'demo': [ 'demo': [
'note_demo.xml', 'note_demo.xml',
], ],
'test': [
],
'css': [ 'css': [
'static/src/css/note.css', 'static/src/css/note.css',
], ],

View File

@ -21,16 +21,17 @@
from openerp.osv import osv, fields from openerp.osv import osv, fields
from tools.translate import _ from tools.translate import _
import re
class note_stage(osv.osv): class note_stage(osv.osv):
""" Category of Note """ """ Category of Note """
_name = "note.stage" _name = "note.stage"
_description = "Note Stage" _description = "Note Stage"
_columns = { _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"), '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), 'user_id': fields.many2one('res.users', 'Owner', help="Owner of the note stage.", required=True),
'fold': fields.boolean('Folded'), 'fold': fields.boolean('Folded by Default'),
} }
_order = 'sequence asc' _order = 'sequence asc'
_defaults = { _defaults = {
@ -39,59 +40,150 @@ class note_stage(osv.osv):
'sequence' : 1, '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): class note_note(osv.osv):
""" Note """ """ Note """
_name = 'note.note' _name = 'note.note'
_inherit = ['mail.thread','pad.common'] _inherit = ['mail.thread']
_pad_fields = ['note_pad']
_description = "Note" _description = "Note"
def _set_note_first_line(self, cr, uid, id, name, value, args, context=None): #writing method (no modification of values)
return self.write(cr, uid, [id], {'note': value}, context=context) 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 = {} res = {}
for note in self.browse(cr, uid, ids, context=context): 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 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): 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 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): def _set_stage_per_user(self, cr, uid, id, name, value, args=None, context=None):
access_rights_uid = access_rights_uid or uid note = self.browse(cr, uid, id, context=context)
stage_obj = self.pool.get('note.stage') 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 def _get_stage_per_user(self, cr, uid, ids, name, args, context=None):
search_domain = [('user_id', '=', uid)] 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 = { _columns = {
'name': fields.function(_get_note_first_line, fnct_inv=_set_note_first_line, string='Note Summary', type="text"), 'name': fields.function(_get_note_first_line,
'note': fields.text('Pad Content'), string='Note Summary',
'note_pad_url': fields.char('Pad Url', size=250), type='text', store=True),
'memo': fields.html('Note Content'),
'sequence': fields.integer('Sequence'), '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'), 'active': fields.boolean('Active'),
'date_done': fields.date('Date done'),
'color': fields.integer('Color Index'), 'color': fields.integer('Color Index'),
# to be replaced by message_follower_ids 'tag_ids' : fields.many2many('note.tag','note_tags_rel','note_id','tag_id','Tags'),
'follower_ids': fields.many2many('res.users', 'mail_subscription', 'res_id', 'user_id', 'Followers') 'current_partner_id' : fields.function(_get_my_current_partner),
} }
_defaults = { _defaults = {
'active' : 1, 'active' : 1,
'stage_id' : _get_default_stage_id, 'stage_id' : _get_default_stage_id,
'note_pad_url': lambda self, cr, uid, context: self.pad_generate_url(cr, uid, context),
} }
_order = 'sequence asc' _order = 'sequence'
_group_by_full = {
'stage_id' : _read_group_stage_ids, 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'),
} }

View File

@ -3,19 +3,19 @@
<data> <data>
<record model="note.stage" id="note_stage_01"> <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="sequence">1</field>
<field name="user_id" eval="ref('base.user_root')"/> <field name="user_id" eval="ref('base.user_root')"/>
</record> </record>
<record model="note.stage" id="note_stage_02"> <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="sequence">2</field>
<field name="user_id" eval="ref('base.user_root')"/> <field name="user_id" eval="ref('base.user_root')"/>
</record> </record>
<record model="note.stage" id="note_stage_03"> <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="sequence">3</field>
<field name="user_id" eval="ref('base.user_root')"/> <field name="user_id" eval="ref('base.user_root')"/>
</record> </record>

View File

@ -1,128 +1,147 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<openerp> <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"> <record id="note_1" model="note.note">
<field name="note"><![CDATA[Buying list <field name="name">Customer report #349872</field>
* coffee <field name="memo"><![CDATA[Customer report #349872
* fruits <br/><br/>* Calendar app in Home
* ice cream <br/>* The base_calendar module should create a menu in Home, like described above.
* towels <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>
<field name="stage_id" ref="note_stage_01"/> <field name="stage_id" ref="note_stage_01"/>
<field name="color">2</field> <field name="color">2</field>
</record> </record>
<record id="note_2" model="note.note"> <record id="note_2" model="note.note">
<field name="note"><![CDATA[Buying list <field name="memo"><![CDATA[Call Fabien
* more coffee <br/><br/>* Followed by the telephone conversation and mail about D.544.3
* tee
* sugar
* towels
]]> ]]>
</field> </field>
<field name="stage_id" ref="note_stage_01"/> <field name="stage_id" ref="note_stage_01"/>
</record> </record>
<record id="note_3" model="note.note"> <record id="note_3" model="note.note">
<field name="note"><![CDATA[Idea to develop <field name="memo"><![CDATA[Call Marc
* Phasellus vel eros lorem, vel tristique risus. <br/><br/>]]>
* 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.
* 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.
Ut id magna massa, quis scelerisque sapien.
]]>
</field> </field>
<field name="stage_id" ref="note_stage_01"/> <field name="stage_id" ref="note_stage_01"/>
</record> </record>
<record id="note_4" model="note.note"> <record id="note_4" model="note.note">
<field name="note"><![CDATA[Read some documentation about OpenERP before diving into the code <field name="memo"><![CDATA[Project N.947.5
* Open ERP: a modern approach to integrated business management <br/><br/>]]>
* Open ERP for Retail and Industrial Management
]]>
</field> </field>
<field name="stage_id" ref="note_stage_02"/> <field name="stage_id" ref="note_stage_02"/>
</record> </record>
<record id="note_5" model="note.note"> <record id="note_5" model="note.note">
<field name="note"><![CDATA[New computer specs <field name="memo"><![CDATA[Shop for family dinner
* Motherboard <br/>* stuffed turkey
according to processor <br/>* wine
* Processor ]]>
need to decide
* Graphic card
with great performance for games !
* Hard drive
big, for lot of internet backups
* Tower
silent, better when watching films
* Blueray drive ?
is it interesting yet ?
* Screen
a big one, full of pixels, of course !
]]>
</field> </field>
<field name="stage_id" ref="note_stage_02"/> <field name="stage_id" ref="note_stage_02"/>
<field name="color">3</field>
</record> </record>
<record id="note_6" model="note.note"> <record id="note_6" model="note.note">
<field name="note"><![CDATA[Read those books <field name="memo"><![CDATA[Idea to develop
* Open ERP: a modern approach to integrated business management <br/><br/>* Create a module note_pad
* Open ERP for Retail and Industrial Management it transforms the html editable memo text field into widget='pad', similar to project_pad depends on 'memo' and 'pad' modules
]]> ]]>
</field> </field>
<field name="stage_id" ref="note_stage_02"/> <field name="stage_id" ref="note_stage_02"/>
</record> </record>
<record id="note_7" model="note.note"> <record id="note_7" model="note.note">
<field name="note"><![CDATA[Read some documentation about OpenERP before diving into the code <field name="memo"><![CDATA[Read some documentation about OpenERP before diving into the code
* Open ERP: a modern approach to integrated business management <br/><br/>* Open ERP: a modern approach to integrated business management
* Open ERP for Retail and Industrial Management <br/>* Open ERP for Retail and Industrial Management
]]> ]]>
</field> </field>
<field name="stage_id" ref="note_stage_03"/> <field name="stage_id" ref="note_stage_03"/>
</record> </record>
<record id="note_8" model="note.note"> <record id="note_8" model="note.note">
<field name="note"><![CDATA[Read those books <field name="memo"><![CDATA[New computer specs
* Open ERP: a modern approach to integrated business management <br/><br/>* Motherboard
* Open ERP for Retail and Industrial Management according to processor
<br/>* Processor
need to decide
<br/>* Graphic card
with great performance for games !
<br/>* Hard drive
big, for lot of internet backups
<br/>* Tower
silent, better when watching films
<br/>* Blueray drive ?
is it interesting yet ?
<br/>* Screen
a big one, full of pixels, of course !
]]> ]]>
</field> </field>
<field name="stage_id" ref="note_stage_03"/> <field name="stage_id" ref="note_stage_03"/>
<field name="color">5</field> <field name="color">3</field>
</record> </record>
<record id="note_9" model="note.note"> <record id="note_9" model="note.note">
<field name="note"><![CDATA[Read some documentation about OpenERP before diving into the code <field name="memo"><![CDATA[Read those books
* Open ERP: a modern approach to integrated business management <br/><br/>* Open ERP: a modern approach to integrated business management
* Open ERP for Retail and Industrial Management <br/>* Open ERP for Retail and Industrial Management
]]>
</field>
<field name="stage_id" ref="note_stage_02"/>
</record>
<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"/>
</record>
<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>
<field name="stage_id" ref="note_stage_03"/> <field name="stage_id" ref="note_stage_03"/>
<field name="color">7</field> <field name="color">7</field>
</record> </record>
<record id="note_10" model="note.note"> <record id="note_13" model="note.note">
<field name="note"><![CDATA[Read those books <field name="memo"><![CDATA[Read those books
* Open ERP: a modern approach to integrated business management <br/><br/>* Open ERP: a modern approach to integrated business management
* Open ERP for Retail and Industrial Management <br/>* Open ERP for Retail and Industrial Management
]]> ]]>
</field> </field>
<field name="stage_id" ref="note_stage_03"/> <field name="stage_id" ref="note_stage_03"/>

View File

@ -4,7 +4,7 @@
<menuitem name="Organizer" id="note_my_stuff" parent="mail.mail_feeds_main"/> <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"> <record model="ir.ui.view" id="view_note_stage_form">
<field name="name">note.stage.form</field> <field name="name">note.stage.form</field>
<field name="model">note.stage</field> <field name="model">note.stage</field>
@ -17,117 +17,175 @@
</field> </field>
</record> </record>
<!-- Note Stage Tree View --> <!-- note Stage Tree View -->
<record model="ir.ui.view" id="view_note_stage_tree"> <record model="ir.ui.view" id="view_note_stage_tree">
<field name="name">note.stage.tree</field> <field name="name">note.stage.tree</field>
<field name="model">note.stage</field> <field name="model">note.stage</field>
<field name="field_parent"></field> <field name="field_parent"></field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Stages of notes" editable="bottom"> <tree string="Stages of Notes" editable="bottom">
<field name="sequence" widget="handle"/> <field name="sequence" widget="handle"/>
<field name="name"/> <field name="name"/>
<field name="fold"/> <field name="fold"/>
</tree> </tree>
</field> </field>
</record> </record>
<!-- Note Stage Action --> <!-- note Stage Action -->
<record model="ir.actions.act_window" id="action_note_stage"> <record model="ir.actions.act_window" id="action_note_stage">
<field name="name">Stages</field> <field name="name">Stages</field>
<field name="res_model">note.stage</field> <field name="res_model">note.stage</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
<field name="domain">[('user_id','=',uid)]</field> <field name="domain">[('user_id','=',uid)]</field>
</record> </record>
<menuitem name="Categories" <menuitem name="Categories" id="menu_notes_stage" parent="note_my_stuff" action="action_note_stage" sequence="40" groups="base.group_no_one"/>
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"> <record model="ir.ui.view" id="view_note_note_kanban">
<field name="name">note.note.kanban</field> <field name="name">note.note.kanban</field>
<field name="model">note.note</field> <field name="model">note.note</field>
<field name="arch" type="xml"> <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="color"/>
<field name="sequence"/> <field name="sequence"/>
<field name="name"/> <field name="name"/>
<field name="stage_id"/> <field name="stage_id"/>
<field name="active"/> <field name="active"/>
<field name="note"/> <field name="memo"/>
<field name="follower_ids"/> <field name="date_done"/>
<field name="current_partner_id"/>
<field name="message_follower_ids"/>
<field name="tag_ids"/>
<templates> <templates>
<t t-name="kanban-box"> <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 --> <t t-set="record.group_fancy" t-value="1" groups="note.group_note_fancy"/>
<div class="oe_dropdown_toggle oe_dropdown_kanban">
<span class="oe_e">í</span> <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' : ''}">
<ul class="oe_dropdown_menu"> <div class="oe_dropdown_kanban">
<li><a type="edit">Edit...</a></li> <span>
<li><a type="delete">Delete</a></li> <a name="onclick_note_is_done" type="object" t-if="record.active.raw_value" class="oe_e">W</a>
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li> <a name="onclick_note_not_done" type="object" t-if="!record.active.raw_value" class="oe_e">è</a>
</ul> </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> </div>
<!-- kanban note --> <!-- kanban note -->
<div class="oe_kanban_content"> <div t-attf-class="oe_kanban_content #{record.active.raw_value ? '' : 'note_text_line_through'}">
<!-- title --> <!-- title -->
<field name="name"/> <field name="name"/>
</div> </div>
<div widget="many2many_tags" t-att-data="record.tag_ids.raw_value" model="note.tag"/>
<div class="oe_kanban_project_avatars"> <div class="oe_right">
<t t-foreach="record.follower_ids.raw_value" t-as="follower"> <t t-foreach="record.message_follower_ids.raw_value" t-as="follower">
<img t-att-src="kanban_image('res.users', 'image_small', follower)" t-att-data-member_id="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> </t>
</div> </div>
<div class="oe_clear"></div>
</div> </div>
<div class="oe_clear"></div>
</t> </t>
</templates> </templates>
</kanban> </kanban>
</field> </field>
</record> </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"> <record model="ir.ui.view" id="view_note_note_form">
<field name="name">note.note.form</field> <field name="name">note.note.form</field>
<field name="model">note.note</field> <field name="model">note.note</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Note" version="7.0"> <form string="Note" version="7.0">
<header> <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> </header>
<field name="note"/> <field name="memo" widget="html"/><!-- editor_width="100%%" editor_height="60%%" -->
<field name="note_pad_url" invisible="1"/> <group groups="note.group_note_tags" col="2">
<div class="oe_chatter"> <field name="tag_ids" widget="many2many_tags"/>
<field name="message_ids" widget="mail_thread"/> </group>
</div> <field name="message_follower_ids" widget="mail_followers"/>
<field class="oe_chatter" name="message_ids" widget="mail_thread"/>
</form> </form>
</field> </field>
</record> </record>
<!-- Search Note --> <!-- Search note -->
<record model="ir.ui.view" id="view_note_note_filter"> <record model="ir.ui.view" id="view_note_note_filter">
<field name="name">note.note.search</field> <field name="name">note.note.search</field>
<field name="model">note.note</field> <field name="model">note.note</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Notes"> <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"/> <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..."> <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 sticky note Category" context="{'group_by':'stage_id'}"/>
<filter icon="terp-stock_symbol-selection" string="Stage" help="By Note Category" context="{'group_by':'stage_id'}"/>
</group> </group>
</search> </search>
</field> </field>
</record> </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"> <record model="ir.actions.act_window" id="action_note_note">
<field name="name">Notes</field> <field name="name">Notes</field>
<field name="res_model">note.note</field> <field name="res_model">note.note</field>
<field name="view_type">form</field> <field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field> <field name="view_mode">kanban,tree,form</field>
<field name="search_view_id" ref="view_note_note_filter"/> <field name="search_view_id" ref="view_note_note_filter"/>
<field name="context">{'search_default_active_true':True}</field>
</record> </record>
<menuitem name="Notes" id="note_notes" parent="note_my_stuff" sequence="20" action="action_note_note"/> <menuitem name="Notes" id="note_notes" parent="note_my_stuff" sequence="20" action="action_note_note"/>

View File

@ -1,3 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 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_stage,note.stage,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_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

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_note_stage_user access_note_stage note.stage user note.stage model_note_stage base.group_user 1 1 1 1
3 access_note_note_user access_note_note note.note user note.note model_note_note base.group_user 1 1 1 1
4 access_note_tag note.tag model_note_tag base.group_user 1 1 1 1

View File

@ -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>

View File

@ -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>

View File

@ -0,0 +1,3 @@
id,name,implied_ids/id
group_note_tags,Memo / Display tags,
group_note_fancy,Memo / Fancy mode,
1 id name implied_ids/id
2 group_note_tags Memo / Display tags
3 group_note_fancy Memo / Fancy mode

View File

@ -1,3 +1,3 @@
note.css: note.sass memo.css: memo.sass
sass -t expanded note.sass note.css sass -t expanded memo.sass memo.css

View File

@ -1,78 +1,143 @@
.openerp .oe_notes .oe_fold_column .oe_kanban_card { @charset "utf-8";
text-decoration:none; @font-face {
color:#000; font-family: "mnmliconsRegular";
display:block; src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot");
padding:1em; src: url("/web/static/src/font/mnmliconsv21-webfont.woff") format("woff");
margin-right: 1em; src: url("/web/static/src/font/mnmliconsv21-webfont.ttf") format("truetype");
margin-bottom: 1em; src: url("/web/static/src/font/mnmliconsv21-webfont.svg") format("svg") active;
font-weight: normal;
-moz-box-shadow:5px 5px 7px rgba(33,33,33,1); font-style: normal;
-webkit-box-shadow: 5px 5px 7px rgba(33,33,33,.7);
box-shadow: 5px 5px 7px rgba(33,33,33,.7);
} }
.openerp .oe_notes .oe_kanban_record .oe_kanban_card { @font-face {
-webkit-transform: rotate(-2deg); font-family: "EntypoRegular";
-o-transform: rotate(-2deg); src: url("/web/static/src/font/entypo-webfont.eot") format("eot");
-moz-transform:rotate(-2deg); 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 { @-moz-keyframes bounce {
-webkit-transform: rotate(1deg); 0% {
-o-transform: rotate(1deg); -moz-transform: scale(0);
-moz-transform:rotate(1deg); opacity: 0;
}
50% {
-moz-transform: scale(1.3);
opacity: 0.4;
}
75% {
-moz-transform: scale(0.9);
opacity: 0.7;
}
100% {
-moz-transform: scale(1);
opacity: 1;
}
} }
.openerp .oe_notes .oe_kanban_record:nth-of-type(3n) .oe_kanban_card { @-webkit-keyframes bounce {
-webkit-transform: rotate(4deg); 0% {
-o-transform: rotate(4deg); -webkit-transform: scale(0);
-moz-transform:rotate(4deg); 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 .oe_kanban_card { .oe_kanban_color_2 {
-webkit-transform: rotate(2deg); background-color: red;
-o-transform: rotate(2deg);
-moz-transform:rotate(2deg);
} }
.openerp .oe_notes .oe_kanban_column:nth-of-type(even) .oe_kanban_record:nth-of-type(even) .oe_kanban_card { .oe_kanban_column .note_text_line_through {
-webkit-transform: rotate(-3deg); text-decoration: line-through;
-o-transform: rotate(-3deg);
-moz-transform:rotate(-3deg);
} }
.openerp .oe_notes .oe_kanban_column:nth-of-type(even) .oe_kanban_record:nth-of-type(3n) .oe_kanban_card { .openerp .oe_fold_column .oe_kanban_card_fancy {
-webkit-transform: rotate(1deg); text-decoration: none;
-o-transform: rotate(1deg); color: black;
-moz-transform:rotate(1deg); 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 .oe_kanban_card { .openerp .oe_kanban_record .oe_kanban_card_fancy {
-webkit-transform: rotate(-2deg); -webkit-transform: rotate(-2deg);
-o-transform: rotate(-2deg); -o-transform: rotate(-2deg);
-moz-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:nth-of-type(3n) .oe_kanban_record:nth-of-type(even) .oe_kanban_card { .openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:hover,
-webkit-transform: rotate(1deg); .openerp .oe_kanban_column .oe_fold_column .oe_kanban_card_fancy:focus {
-o-transform: rotate(1deg); box-shadow: 10px 10px 7px rgba(0, 0, 0, 0.7);
-moz-transform:rotate(1deg); -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;
.openerp .oe_notes .oe_kanban_column:nth-of-type(3n) .oe_kanban_record:nth-of-type(3n) .oe_kanban_card { z-index: 5;
-webkit-transform: rotate(-1deg); -webkit-transform: rotate(0);
-o-transform: rotate(-1deg); -o-transform: rotate(0);
-moz-transform:rotate(-1deg); -moz-transform: rotate(0);
}
.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;
} }

View File

@ -42,10 +42,10 @@ $sheet-max-width: 860px
background-color: $startColor background-color: $startColor
background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)) /* Saf4+, Chrome */ 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: -webkit-linear-gradient(top, $startColor, $endColor) /* Chrome 10+, Saf5.1+, iOS 5+ */
background-image: -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */ background-image: -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */
background-image: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */ background-image: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */
background-image: -o-linear-gradient(top, $startColor, $endColor) /* Opera 11.10+ */ background-image: -o-linear-gradient(top, $startColor, $endColor) /* Opera 11.10+ */
background-image: linear-gradient(to bottom, $startColor, $endColor) background-image: linear-gradient(to bottom, $startColor, $endColor)
@mixin radial-gradient($gradient) @mixin radial-gradient($gradient)
background-position: center center background-position: center center
@ -93,7 +93,7 @@ $sheet-max-width: 860px
font-size: 1px font-size: 1px
letter-spacing: -1px letter-spacing: -1px
color: transparent color: transparent
&:before &: before
font: 21px "mnmliconsRegular" font: 21px "mnmliconsRegular"
content: $icon-name content: $icon-name
color: $color color: $color
@ -131,7 +131,79 @@ $sheet-max-width: 860px
.oe_kanban_color_2 .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

View File

@ -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

View File

@ -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:

View File

@ -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),
#}

View File

@ -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>