[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="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>

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

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',
'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',
],

View File

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

View File

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

View File

@ -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.
* 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 name="memo"><![CDATA[Call Marc
<br/><br/>]]>
</field>
<field name="stage_id" ref="note_stage_01"/>
</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
]]>
<field name="memo"><![CDATA[Project N.947.5
<br/><br/>]]>
</field>
<field name="stage_id" ref="note_stage_02"/>
</record>
<record id="note_5" model="note.note">
<field name="note"><![CDATA[New computer specs
* Motherboard
according to processor
* 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 name="memo"><![CDATA[Shop for family dinner
<br/>* stuffed turkey
<br/>* wine
]]>
</field>
<field name="stage_id" ref="note_stage_02"/>
<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
]]>
<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_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 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_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
<field name="memo"><![CDATA[New computer specs
<br/><br/>* Motherboard
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 name="stage_id" ref="note_stage_03"/>
<field name="color">5</field>
<field name="color">3</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
<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_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 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"/>

View File

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

View File

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

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
sass -t expanded note.sass note.css
memo.css: memo.sass
sass -t expanded memo.sass memo.css

View File

@ -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;
}
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-transform: rotate(4deg);
-o-transform: rotate(4deg);
-moz-transform:rotate(4deg);
@-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 .oe_kanban_card {
-webkit-transform: rotate(2deg);
-o-transform: rotate(2deg);
-moz-transform:rotate(2deg);
.oe_kanban_color_2 {
background-color: red;
}
.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);
.oe_kanban_column .note_text_line_through {
text-decoration: line-through;
}
.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);
.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 .oe_kanban_card {
-webkit-transform: rotate(-2deg);
-o-transform: rotate(-2deg);
-moz-transform:rotate(-2deg);
.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: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_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_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);
}

View File

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

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>