2012-01-31 15:52:57 +00:00
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
2012-03-13 16:19:02 +00:00
# Copyright (C) 2010-today OpenERP SA (<http://www.openerp.com>)
2012-01-31 15:52:57 +00:00
#
# 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/>
#
2012-01-31 15:54:12 +00:00
##############################################################################
2012-03-29 07:32:09 +00:00
import datetime as DT
import io
import openerp
import openerp . tools as tools
2012-04-02 13:43:54 +00:00
from operator import itemgetter
2012-01-31 15:54:12 +00:00
from osv import osv
from osv import fields
2012-03-07 15:34:45 +00:00
from PIL import Image
2012-03-29 07:32:09 +00:00
import StringIO
import tools
from tools . translate import _
2012-06-27 10:20:05 +00:00
from lxml import etree
2012-03-07 15:34:45 +00:00
2012-01-31 15:54:12 +00:00
class mail_group ( osv . osv ) :
"""
2012-03-13 16:19:02 +00:00
A mail_group is a collection of users sharing messages in a discussion
group . Group users are users that follow the mail group , using the
2012-04-04 14:11:19 +00:00
subscription / follow mechanism of OpenSocial . A mail group has nothing
in common wih res . users . group .
Additional information on fields :
- ` ` member_ids ` ` : user member of the groups are calculated with
` ` message_get_subscribers ` ` method from mail . thread
- ` ` member_count ` ` : calculated with member_ids
- ` ` is_subscriber ` ` : calculated with member_ids
2012-01-31 15:54:12 +00:00
"""
2012-03-29 16:10:00 +00:00
_description = ' Discussion group '
2012-01-31 15:54:12 +00:00
_name = ' mail.group '
2012-02-02 09:48:45 +00:00
_inherit = [ ' mail.thread ' ]
2012-06-22 05:25:57 +00:00
_inherits = { ' mail.alias ' : ' alias_id ' }
2012-04-04 14:11:19 +00:00
def action_group_join ( self , cr , uid , ids , context = { } ) :
return self . message_subscribe ( cr , uid , ids , context = context ) ;
def action_group_leave ( self , cr , uid , ids , context = { } ) :
return self . message_unsubscribe ( cr , uid , ids , context = context ) ;
2012-03-29 07:32:09 +00:00
def onchange_photo ( self , cr , uid , ids , value , context = None ) :
if not value :
return { ' value ' : { ' avatar_big ' : value , ' avatar ' : value } }
return { ' value ' : { ' photo_big ' : value , ' photo ' : self . _photo_resize ( cr , uid , value ) } }
2012-03-07 15:34:45 +00:00
2012-03-29 07:32:09 +00:00
def _set_photo ( self , cr , uid , id , name , value , args , context = None ) :
if value :
return self . write ( cr , uid , [ id ] , { ' photo_big ' : value } , context = context )
else :
return self . write ( cr , uid , [ id ] , { ' photo_big ' : value } , context = context )
2012-02-03 11:21:16 +00:00
2012-03-29 07:32:09 +00:00
def _photo_resize ( self , cr , uid , photo , width = 128 , height = 128 , context = None ) :
2012-03-13 16:19:02 +00:00
image_stream = io . BytesIO ( photo . decode ( ' base64 ' ) )
img = Image . open ( image_stream )
2012-03-29 07:32:09 +00:00
img . thumbnail ( ( width , height ) , Image . ANTIALIAS )
2012-03-13 16:19:02 +00:00
img_stream = StringIO . StringIO ( )
img . save ( img_stream , " JPEG " )
return img_stream . getvalue ( ) . encode ( ' base64 ' )
2012-03-29 07:32:09 +00:00
def _get_photo ( self , cr , uid , ids , name , args , context = None ) :
result = dict . fromkeys ( ids , False )
2012-03-13 16:19:02 +00:00
for group in self . browse ( cr , uid , ids , context = context ) :
2012-03-29 07:32:09 +00:00
if group . photo_big :
result [ group . id ] = self . _photo_resize ( cr , uid , group . photo_big , context = context )
2012-03-13 16:19:02 +00:00
return result
2012-03-29 16:10:00 +00:00
def get_member_ids ( self , cr , uid , ids , field_names , args , context = None ) :
if context is None :
context = { }
result = dict . fromkeys ( ids )
2012-03-07 17:02:54 +00:00
for id in ids :
2012-03-29 16:10:00 +00:00
result [ id ] = { }
2012-06-05 13:14:44 +00:00
result [ id ] [ ' member_ids ' ] = self . message_get_subscribers ( cr , uid , [ id ] , context = context )
2012-04-02 13:43:54 +00:00
result [ id ] [ ' member_count ' ] = len ( result [ id ] [ ' member_ids ' ] )
result [ id ] [ ' is_subscriber ' ] = uid in result [ id ] [ ' member_ids ' ]
2012-03-07 17:02:54 +00:00
return result
2012-03-29 16:10:00 +00:00
def search_member_ids ( self , cr , uid , obj , name , args , context = None ) :
if context is None :
context = { }
sub_obj = self . pool . get ( ' mail.subscription ' )
sub_ids = sub_obj . search ( cr , uid , [ ' & ' , ( ' res_model ' , ' = ' , obj . _name ) , ( ' user_id ' , ' = ' , args [ 0 ] [ 2 ] ) ] , context = context )
subs = sub_obj . read ( cr , uid , sub_ids , context = context )
2012-04-02 13:43:54 +00:00
return [ ( ' id ' , ' in ' , map ( itemgetter ( ' res_id ' ) , subs ) ) ]
2012-03-29 16:10:00 +00:00
2012-03-29 07:32:09 +00:00
def get_last_month_msg_nbr ( self , cr , uid , ids , name , args , context = None ) :
2012-03-07 17:23:50 +00:00
result = { }
2012-03-29 07:32:09 +00:00
message_obj = self . pool . get ( ' mail.message ' )
2012-03-07 17:23:50 +00:00
for id in ids :
2012-03-29 07:32:09 +00:00
lower_date = ( DT . datetime . now ( ) - DT . timedelta ( days = 30 ) ) . strftime ( tools . DEFAULT_SERVER_DATE_FORMAT )
result [ id ] = message_obj . search ( cr , uid , [ ' & ' , ' & ' , ( ' model ' , ' = ' , self . _name ) , ( ' res_id ' , ' in ' , ids ) , ( ' date ' , ' >= ' , lower_date ) ] , count = True , context = context )
2012-03-07 17:23:50 +00:00
return result
2012-03-29 07:32:09 +00:00
def _get_default_photo ( self , cr , uid , context = None ) :
avatar_path = openerp . modules . get_module_resource ( ' mail ' , ' static/src/img ' , ' groupdefault.png ' )
return self . _photo_resize ( cr , uid , open ( avatar_path , ' rb ' ) . read ( ) . encode ( ' base64 ' ) , context = context )
2012-01-31 15:54:12 +00:00
_columns = {
2012-02-02 09:48:45 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True ) ,
2012-01-31 15:54:12 +00:00
' description ' : fields . text ( ' Description ' ) ,
' responsible_id ' : fields . many2one ( ' res.users ' , string = ' Responsible ' ,
2012-04-02 13:43:54 +00:00
ondelete = ' set null ' , required = True , select = 1 ,
help = " Responsible of the group that has all rights on the record. " ) ,
' public ' : fields . boolean ( ' Public ' , help = ' This group is visible by non members. Invisible groups can add members through the invite button. ' ) ,
2012-03-29 07:32:09 +00:00
' photo_big ' : fields . binary ( ' Full-size photo ' , help = ' Field holding the full-sized PIL-supported and base64 encoded version of the group image. The photo field is used as an interface for this field. ' ) ,
' photo ' : fields . function ( _get_photo , fnct_inv = _set_photo , string = ' Photo ' , type = " binary " ,
2012-03-07 15:34:45 +00:00
store = {
2012-03-29 07:32:09 +00:00
' mail.group ' : ( lambda self , cr , uid , ids , c = { } : ids , [ ' photo_big ' ] , 10 ) ,
} , help = ' Field holding the automatically resized (128x128) PIL-supported and base64 encoded version of the group image. ' ) ,
2012-03-29 16:10:00 +00:00
' member_ids ' : fields . function ( get_member_ids , fnct_search = search_member_ids , type = ' many2many ' ,
2012-04-02 13:43:54 +00:00
relation = ' res.users ' , string = ' Group members ' , multi = ' get_member_ids ' ) ,
' member_count ' : fields . function ( get_member_ids , type = ' integer ' , string = ' Member count ' , multi = ' get_member_ids ' ) ,
' is_subscriber ' : fields . function ( get_member_ids , type = ' boolean ' , string = ' Joined ' , multi = ' get_member_ids ' ) ,
2012-03-29 07:32:09 +00:00
' last_month_msg_nbr ' : fields . function ( get_last_month_msg_nbr , type = ' integer ' , string = ' Messages count for last month ' ) ,
2012-07-05 06:59:39 +00:00
' alias_id ' : fields . many2one ( ' mail.alias ' , ' Mail Alias ' , ondelete = " restrict " , required = True ,
2012-07-02 11:39:13 +00:00
help = " This Unique Mail Box Alias of the Group allows to manage the Seamless email communication between Mail Box and OpenERP, "
" This Alias MailBox manage the Group email communication. " )
2012-01-31 15:54:12 +00:00
}
_defaults = {
' public ' : True ,
2012-03-13 16:19:02 +00:00
' responsible_id ' : ( lambda s , cr , uid , ctx : uid ) ,
2012-03-29 07:32:09 +00:00
' photo ' : _get_default_photo ,
2012-01-31 15:54:12 +00:00
}
2012-06-22 05:25:57 +00:00
def create ( self , cr , uid , vals , context = None ) :
2012-06-22 09:08:19 +00:00
alias_pool = self . pool . get ( ' mail.alias ' )
2012-07-04 07:19:02 +00:00
if not vals . get ( ' alias_id ' ) :
2012-07-05 05:38:40 +00:00
name = vals . get ( ' alias_name ' ) or vals [ ' name ' ]
alias_id = alias_pool . create_unique_alias ( cr , uid ,
2012-07-05 05:52:13 +00:00
{ ' alias_name ' : " mail_group_ " + name ,
2012-07-05 05:38:40 +00:00
' alias_model_id ' : self . _name } , context = context )
alias = alias_pool . read ( cr , uid , alias_id , [ ' alias_name ' ] , context )
vals . update ( { ' alias_id ' : alias_id , ' alias_name ' : alias [ ' alias_name ' ] } )
2012-07-04 06:20:24 +00:00
res = super ( mail_group , self ) . create ( cr , uid , vals , context )
alias_pool . write ( cr , uid , [ vals [ ' alias_id ' ] ] , { " alias_force_thread_id " : res } , context )
2012-06-22 09:16:58 +00:00
return res
2012-07-04 06:20:24 +00:00