Ejemplo n.º 1
0
   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'}
Ejemplo n.º 2
0
   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)
Ejemplo n.º 3
0
   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)