129 lines
5.3 KiB
Python
129 lines
5.3 KiB
Python
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()
|