from netforce.model import Model, fields, get_model from netforce.access import get_active_company class Department(Model): _name="clinic.department" _string="Department" _key=['code'] _fields={ "name": fields.Char("Name",required=True,search=True), "code": fields.Char("Code",required=True,search=True), "parent_id": fields.Many2One("clinic.department", "Parent"), 'company_id': fields.Many2One("company","Company"), 'branch_id': fields.Many2One("clinic.branch","Branch"), "pick_out_journal_id": fields.Many2One("stock.journal","Stock Journal",required=True), 'patients': fields.One2Many("clinic.patient","department_id","Patients"), 'products': fields.One2Many("clinic.department.product","product_id","Products"), 'staffs': fields.One2Many("clinic.staff","department_id","Staffs"), 'active': fields.Boolean("Active"), 'product_wharehouse': fields.Boolean("Get Location From Product Warehouse"), } def _get_branch(self,context={}): b_ids=get_model('clinic.branch').search([]) if b_ids: return b_ids[0] _defaults={ 'company_id': lambda *a: get_active_company(), 'branch_id': _get_branch, 'active': True, } _order="code" def create_profile(self,ids,context={}): for obj in self.browse(ids): code=obj.code or '' pf_ids=get_model('profile').search(['code','=',code]) if pf_ids: raise Exception("Profile %s is already exist"%(code)) return except_perms=['Clinic Menu Settings','Clinic Staff Tab Accounting'] other_perms=[] for otp in get_model('permission').search_read(['name','ilike','clinic'],['name']): name=otp['name'] if name in except_perms: continue other_perms.append(otp['id']) except_model=['clinic.cycle','clinic.department'] perms=[] for model in get_model('model').search_read([['name','ilike','clinic']],['name']): vals={ 'model_id': model['id'], 'perm_read': True, 'perm_create': True, 'perm_write': True, 'perm_delete': True, } name=model['name'] if name in except_model: vals['perm_create']=False vals['perm_write']=False vals['perm_delete']=False perms.append(('create', vals)) profile_id=get_model('profile').create({ 'perms': perms, 'code': code, 'name': code, 'perms': perms, 'other_perms': [('set',other_perms)], 'login_company_id': get_active_company(), 'home_action': 'clinic_visit_board', }) print("create profile %s"%(code)) return profile_id def create_sharing(self,ids,context={}): #rule: branch_code-deparment_code profile_id=context.get('profile_id') if not profile_id: raise Exception("Profile not found") models=[ ['clinic.patient','location','ilike'], ['clinic.patient.cycle','department_id.code','='], ['clinic.staff','location','ilike'], ['clinic.staff.rotation','staff_id.department_id.code','='], ['clinic.visit','department_id.code','='], ['clinic.hd.case','department_id.code','='], ['clinic.cycle.item','department_id.code','='], ['clinic.sickbed','department_id.code','='], ['clinic.shop','department_id.code','='], ['clinic.department','code','='], #XXX #['clinic.dialyzer','department_id.code','='], # support to use different location ['clinic.schedule','department_id.code','='], ] for obj in self.browse(ids): for sa in get_model('share.access').search_browse([]): if obj.code in sa.domain or not sa.profiles: print("profile %s is deleted"%(obj.code)) sa.delete() for model,field_dom, op in models: for model_id in get_model("model").search(['name','=',model]): get_model('share.access').create({ 'model_id': model_id, 'profiles': [['set',[profile_id]]], #need to include another profile ex: profile of branch 'default_access': 'custom', 'filter_type': 'rw', 'select_profile': 'include', 'domain': '[["%s","%s","%s"]]'%(field_dom,op,obj.code), }) print("Done!") def share_access(self,ids,context={}): obj=self.browse(ids)[0] context['profile_id']=obj.create_profile() obj.create_sharing(context=context) # create sharing setting return { 'next': { 'name': 'clinic_department', 'active_id': obj.id, 'mode': 'form', }, 'flash': 'Department %s is shared sucessfully'%obj.code, } Department.register()