def create(self, **kw): ''' Create phone: Create provisionning file. If an extension is attached to the phone, create exten in Asterisk database. If a user is attached to the phone, add callerid to phone; if the user has email, add voicemail info to sip.conf and add entry in voicemail.conf Create entry in Asterisk sip.conf. ''' # Check exten is not already used if kw['exten']: log.debug('Check exten ' + kw['exten']) p = DBSession.query(Phone).filter(Phone.exten==kw['exten']).all() if len(p): return dict(status='bad_exten') exten = re.sub(r'\D', '', kw['exten']) # Check dnis is not already used if kw['dnis']: log.debug('Check dnis ' + kw['dnis']) p = DBSession.query(Phone).filter(Phone.dnis==kw['dnis']).all() if len(p): return dict(status='bad_dnis') dnis = re.sub(r'\D', '', kw['dnis']) # Generate SIP id and secret while True: sip_id = ''.join([choice(letters + digits) for i in xrange(8)]) log.debug('Generate SIP id: ' + sip_id) try: DBSession.query(Phone).filter(Phone.sip_id==sip_id).one() except: pwd = ''.join([choice(letters + digits) for i in xrange(8)]) break # Configure phone sip_display_name = None mwi_subscribe = 0 need_voicemail_update = False sip_server = server_sip sip_server2 = server_sip2 sip_display_name = '' mwi_subscribe = 0 if kw['user_id']!='-9999': u = DBSession.query(User).get(kw['user_id']) sip_display_name = u.ascii_name if u.email_address: mwi_subscribe = 1 need_voicemail_update = True # Save phone info to database log.debug('Save to database ' + kw['mac']) p = Phone() p.sip_id = sip_id new_phone = None if kw['mac']: new_phone = session['new_phone'] p.mac = kw['mac'] p.vendor = new_phone.vendor p.model = new_phone.model log.debug('%s %s, session %s', new_phone.vendor, new_phone.model, new_phone.sid ) p.password = pwd if kw['exten']: p.exten = exten if kw['dnis']: p.dnis = dnis if kw['dptm_id']!='-9999': p.department_id = kw['dptm_id'] if kw['user_id']!='-9999': p.user_id = kw['user_id'] if 'callgroups' in kw: p.callgroups = ','.join([str(x) for x in kw['callgroups']]) if 'pickupgroups' in kw: p.pickupgroups = ','.join([str(x) for x in kw['pickupgroups']]) if 'contexts' in kw: p.contexts = ','.join([str(x) for x in kw['contexts']]) p.hide_from_phonebook = True if kw['hide_from_phonebook']==u'True' else False p.fax = True if kw['fax']==u'True' else False p.block_cid_in = True if kw['block_cid_in']==u'True' else False p.block_cid_out = True if kw['block_cid_out']==u'True' else False p.priority = True if kw['priority']==u'True' else False p.phonebook_label = kw['phonebook_label'] p.secretary = kw['secretary'] DBSession.add(p) asterisk_update_phone(p) if new_phone: # Create provisionning file if MAC exists log.debug('Configure ' + kw['mac']) new_phone.configure( pwd, directory_tftp, server_firmware + '/phones/firmware', server_config + '/phones/config', server_ntp, server_config, '', '', '', sip_server, sip_id, sip_display_name, mwi_subscribe, screen_url = server_config, exten=p.exten, sip_server2=sip_server2) session.save() flash(u'Nouveau téléphone "%s" créé' % (kw['exten'])) return {'status': 'created'}
def put(self, phone_id, dptm_id, user_id, exten, dnis, contexts, hide_from_phonebook, fax, block_cid_in, block_cid_out, priority, phonebook_label, secretary, callgroups=None, pickupgroups=None): ''' Update phone User and exten information is independant from phone, there is no need to modify provisionning file. Create or update entry in Asterisk sip.conf. If a exten is attached to the phone, create exten in Asterisk database. If a user is attached to the phone, add callerid to SIP account ; if the user has email, add voicemail info to sip.conf and add entry in voicemail.conf. ''' log.info('update %d' % phone_id) log.debug('Contexts %s' % contexts) log.debug('Callgroups %s' % callgroups) log.debug('Pickupgroups %s' % pickupgroups) log.debug('Hide from phonebook %s' % hide_from_phonebook) log.debug('Fax %s' % fax) log.debug('Block cid in %s' % block_cid_in) log.debug('Block cid out %s' % block_cid_out) p = DBSession.query(Phone).get(phone_id) old_exten = p.exten old_dnis = p.dnis if exten!=p.exten: exten = re.sub(r'\D', '', exten) log.debug('Exten has changed, %s -> %s' % (p.exten, exten)) if exten=='': p.exten = None else: p.exten = exten if dnis!=p.dnis: dnis = re.sub(r'\D', '', dnis) if dnis is not None else '' log.debug('DNIS has changed, %s -> %s' % (p.dnis, dnis)) if dnis=='': p.dnis = None else: p.dnis = dnis if p.department_id!=dptm_id: if dptm_id==-9999: p.department_id = None else: p.department_id = dptm_id if p.user_id!=user_id: if user_id==-9999: p.user_id = None else: p.user_id = user_id x = ','.join([str(x) for x in contexts]) if p.contexts != x: log.debug('New contexts !') p.contexts = x x = ','.join([str(x) for x in callgroups]) if p.callgroups != x: p.callgroups = x x = ','.join([str(x) for x in pickupgroups]) if p.pickupgroups != x: p.pickupgroups = x p.hide_from_phonebook = hide_from_phonebook p.fax = fax p.block_cid_in = block_cid_in p.block_cid_out = block_cid_out p.priority = priority p.phonebook_label = phonebook_label p.secretary = secretary asterisk_update_phone(p, old_exten, old_dnis) flash(u'Téléphone modifié') redirect('/phones/%d/edit' % phone_id)
def put(self, phone_id, dptm_id, user_id, exten, dnis, contexts, hide_from_phonebook, fax, block_cid_in, block_cid_out, priority, phonebook_label, secretary, ringtone_id, callgroups=None, pickupgroups=None): ''' Update phone User and exten information is independant from phone, there is no need to modify provisionning file. Create or update entry in Asterisk sip.conf. If a exten is attached to the phone, create exten in Asterisk database. If a user is attached to the phone, add callerid to SIP account ; if the user has email, add voicemail info to sip.conf and add entry in voicemail.conf. ''' log.info('update %d' % phone_id) log.debug('Contexts %s' % contexts) log.debug('Callgroups %s' % callgroups) log.debug('Pickupgroups %s' % pickupgroups) log.debug('Hide from phonebook %s' % hide_from_phonebook) log.debug('Fax %s' % fax) log.debug('Block cid in %s' % block_cid_in) log.debug('Block cid out %s' % block_cid_out) p = DBSession.query(Phone).get(phone_id) old_exten = p.exten old_dnis = p.dnis if exten!=p.exten: exten = re.sub(r'\D', '', exten) log.debug('Exten has changed, %s -> %s' % (p.exten, exten)) if exten=='': p.exten = None else: p.exten = exten if dnis!=p.dnis: dnis = re.sub(r'\D', '', dnis) if dnis is not None else '' log.debug('DNIS has changed, %s -> %s' % (p.dnis, dnis)) if dnis=='': p.dnis = None else: p.dnis = dnis if p.department_id!=dptm_id: if dptm_id==-9999: p.department_id = None else: p.department_id = dptm_id if p.user_id!=user_id: if user_id==-9999: p.user_id = None else: p.user_id = user_id ringtone_id = int(ringtone_id) log.debug('before ringtone = %s', ringtone_id) if ringtone_id==-1: p.ringtone_id = None ringtone = None else: p.ringtone_id = ringtone_id try: ringtone = DBSession.query(Sound).get(int(ringtone_id)).name except: ringtone = None p.ringtone_id = None log.debug('after ringtone = %s (%s)', ringtone, ringtone_id) x = ','.join([str(x) for x in contexts]) if p.contexts != x: log.debug('New contexts !') p.contexts = x x = ','.join([str(x) for x in callgroups]) if p.callgroups != x: p.callgroups = x x = ','.join([str(x) for x in pickupgroups]) if p.pickupgroups != x: p.pickupgroups = x p.hide_from_phonebook = hide_from_phonebook p.fax = fax p.block_cid_in = block_cid_in p.block_cid_out = block_cid_out p.priority = priority p.phonebook_label = phonebook_label p.secretary = secretary asterisk_update_phone(p, old_exten, old_dnis) if p.vendor == 'Grandstream': # Create provisionning file and configure phone ip, ua, state = peer_info(p.sip_id, p.exten) log.info('Configure %s %s %s %s', p.mac, ip, ua, state) gs = Grandstream(ip, p.mac) gs.login(p.password) gs.infos() mwi_subscribe = 0 sip_display_name = None if p.user_id!='-9999': try: u = DBSession.query(User).get(p.user_id) sip_display_name = u.ascii_name if u.email_address: mwi_subscribe = 1 except: pass gs.configure( p.password, directory_tftp, server_firmware + '/phones/firmware', server_config + '/phones/config', server_ntp, server_config, '', '', '', server_sip, p.sip_id, sip_display_name, mwi_subscribe, screen_url = server_config, exten=p.exten, sip_server2=server_sip2, secretary=secretary, ringtone=ringtone) flash(u'Téléphone modifié') redirect('/phones/%d/edit' % phone_id)