def create(self, **kw): ''' Add new fax to DB ''' f = Fax() f.type = 0 # 0=Sent, 1=Received f.comment = kw['comment'] f.dest = kw['dest'] f.filename = kw['file'].filename u = DBSession.query(User).filter(User.user_name==request.identity['repoze.who.userid']).one() f.user_id = u.user_id try: f.src = u.phone[0].exten except: f.src = None # Try to insert file in DB: might fail if name already exists try: DBSession.add(f) DBSession.flush() except: flash(u'Impossible de créer le fax', 'error') redirect('/fax/') ret, pdf_data = process_file(kw['file'], f.fax_id, kw['dest'], u.email_address) if ret is not None: flash(ret,'error') DBSession.delete(f) redirect('/fax/') f.pdf = pdf_data flash(u'"%s" en cours d\'envoi à %s' % (kw['file'].filename, kw['dest'])) redirect('/fax/')
def create(self, **kw): ''' Add new pickup to DB ''' if DBSession.query(Pickup).filter(Pickup.name==kw['name']).all(): flash(u'Ce groupe existe déjà, pas créé', 'error') redirect('/pickups/') # Find new pickup group (0-63) i = 0 for p in DBSession.query(Pickup).order_by(Pickup.pickup_id): if p.pickup_id!=i: break i += 1 if i>63: flash(u'Nombre maximum de groupe d\'interceptions atteint, création impossible', 'error') else: p = Pickup() p.pickup_id = i p.name = kw['name'] p.comment = kw['comment'] DBSession.add(p) flash(u'Nouveau groupe d\'interception "%s" créé' % (kw['name'])) redirect('/pickups/')
def save(self, name, comment, type, begin, end, file, active=None): log.debug('Save "%s"!' % file) c = Campaign() c.name = name c.comment = comment c.type = type c.active = active c.begin = begin c.end = end DBSession.add(c) DBSession.flush() log.debug(u'nouvelle campagne %s créée' % c.cmp_id) msg = u'Campagne "%s" créée' % name if file is not None: l, e, m = process_file(file, c.cmp_id) if l==0: msg += m else: msg += u', %d lignes intégrées' % l if e!=0: msg += u', %d erreurs' % e flash(msg) redirect('/cc_campaign/')
def create(self, **kw): ''' Add new shortcut to DB ''' if DBSession.query(Shortcut).filter(Shortcut.exten==kw['exten']).all() or \ DBSession.query(Shortcut).filter(Shortcut.number==kw['number']).all(): flash(u'Erreur : raccourci %s ou numéro %s existe déjà' % ( kw['exten'], kw['number']), 'error') redirect('/shortcuts/') s = Shortcut() s.exten = kw['exten'] s.number = kw['number'] s.comment = kw['comment'] s.phone = kw['phone'] DBSession.add(s) flash(u'Nouveau raccourci "%s -> %s" créé' % (s.exten, s.number)) if p.exten is not None: # Create new hint (extensions.conf) res = Globals.manager.update_config( directory_asterisk + 'extensions.conf', None, [('Append', 'shortcuts', 'exten', '>%s,1,%s/%s' % \ (p.exten, 'SIP' if sip_type=='sip' else 'PJSIP', p.sip_id))]) log.debug('Update hints extensions.conf returns %s' % res) redirect('/shortcuts/')
def create(self, pwd1, pwd2, **kw): ''' Add new user to DB ''' if DBSession.query(User).filter(User.user_name==kw['user_name']).all(): flash(u'Ce compte existe déjà, utilisateur pas créé', 'error') redirect('/users/') log.info('new ' + kw['user_name']) u = User() u.user_name = kw['user_name'] u.firstname = kw['firstname'] u.lastname = kw['lastname'] u.email_address = kw['email_address'] u.fax = kw['fax'] u.voicemail = kw['voicemail'] u.email_voicemail = kw['email_voicemail'] u.password = pwd1 u.display_name = u.lastname + ' ' + u.firstname u.ascii_name = asterisk_string(u.display_name) over = kw.get('over') if over is not None: Globals.manager.send_action({'Action': 'DBput', 'Family': 'over', 'Key': over, 'Val': 'context'}) if 'groups' in kw: u.groups = DBSession.query(Group).\ filter(Group.group_id.in_(kw['groups'])).all() DBSession.add(u) flash(u'Nouvel utilisateur "%s" créé' % (kw['user_name'])) redirect('/users/')
def originate(self, exten, cust): ''' Originate call ''' uphones = DBSession.query(User).get(request.identity['user'].user_id).phone if len(uphones)<1: return dict(status=2) o = Outcall() o.user_id = request.identity['user'].user_id o.cust_id = cust o.cookie = randint(-2147483648, 2147483647) DBSession.add(o) DBSession.flush() # needed to get the out_id chan = uphones[0].sip_id exten = sub(r'\D', '', exten) log.debug('originate: outcall %d from extension %s to %s' % ( o.out_id, chan, exten)) res = Globals.manager.originate( 'SIP/' + chan.encode('iso-8859-1'), # Channel exten.encode('iso-8859-1'), # Extension context=chan.encode('iso-8859-1'), priority='1', caller_id=default_cid, variables= {'OUTCALL': o.out_id, 'COOKIE': o.cookie}, async = True # Seems to be needed else DB is not commited and # call to uniqueid below fails with "inexistant call" ) status = o.out_id if res.headers['Response']==u'Success' else -1 log.debug('originate: res=%s, outcall=%d, status=%s, cookie=%d' % ( res, o.out_id, status, o.cookie)) return dict(status=status)
def create_phones(base): for i in range(0,100): p = Phone() p.number = '%s%02d' % (base, i) p.department_id = -1 DBSession.add(p) DBSession.flush() transaction.commit()
def record(self, name, channel, queue, custom1=None, custom2=None): '''Record a queue member Called from call center monitor web page Action: Monitor Mix: 1 File: test Channel: SIP/pEpSNlcv-000001b9 ''' log.debug('Record request "%s" (%s) on "%s"' % (name, channel, queue)) # Check channel exists, else abort for cha in Globals.asterisk.channels.keys(): if cha.startswith(channel): unique_id = Globals.asterisk.channels[cha]['Uniqueid'] break else: log.warning('No active channel for %s ?' % channel) return dict(status=0) # XXX Authentification # Gather data from database user_id = DBSession.query(User).filter( User.user_name==request.identity['repoze.who.userid']).one().user_id member_id = DBSession.query(Phone).filter( Phone.sip_id==channel[-8:]).one().user_id queue_id = DBSession.query(Queue).filter( Queue.name==queue).one().queue_id # Create filename and send record action to Asterisk via manager f = 'rec-%s' % unique_id res = Globals.manager.send_action( { 'Action': 'Monitor', 'Mix': 1, 'Channel': cha, 'File': f}) log.info('Record request from userid "%s" to channel %s returns "%s"' % ( user_id, cha, res)) if res.get_header('Response')=='Success': status = 0 # Set "recorded" flag on member Globals.asterisk.members[name]['Recorded'] = True # Insert record info into database r = Record() r.uniqueid = unique_id r.queue_id = queue_id r.member_id = member_id r.user_id = user_id r.custom1 = custom1 r.custom2 = custom2 DBSession.add(r) else: status = 1 return dict(status=status)
def create(self, **kw): ''' Add new group to DB ''' g = Group() g.group_name = kw['group_name'] g.display_name = kw['display_name'] DBSession.add(g) flash(u'Nouveau groupe "%s" créé' % (kw['group_name'])) redirect('/groups/')
def create(self, **kw): ''' Add new holiday to DB ''' h = Holiday() h.name = kw['name'] h.day = kw['date'].day h.month = kw['date'].month DBSession.add(h) update_extensions() flash(u'Nouveau jour férié "%s" créé' % (kw['name'])) redirect('/holidays/')
def create(self, **kw): ''' Add new sound to DB ''' s = Sound() s.name = kw['name'] if kw['type'] == 'moh': s.type = 0 elif kw['type'] == 'ringtone': s.type = 2 else: s.type = 1 s.comment = kw['comment'] s.language = kw['lang'] if 'owner_id' in kw.keys(): s.owner_id = kw['owner_id'] else: s.owner_id = request.identity['user'].user_id # Try to insert file in DB: might fail if name already exists try: DBSession.add(s) DBSession.flush() except: flash(u'Impossible de créer le son (vérifier son nom)', 'error') redirect('/moh/') if kw['record']: uphones = DBSession.query(User).get(request.identity['user'].user_id).phone # XXX if len(uphones)<1: # return dict(status=2) chan = uphones[0].sip_id.encode('iso-8859-1') filename = '/tmp/record-%s.wav' % chan filetype = 'audio/wav' else: wav = kw['file'] filetype = wav.type filedata = wav.file filename = '%s/%d_%s' % (dir_tmp, s.sound_id, wav.filename) # Temporarily save uploaded audio file out = open(filename, 'w') out.write(filedata.read()) out.close() ret = process_file(filename, filetype, s.sound_id, s.type, s.name, kw['lang']) if ret: flash(ret,'error') DBSession.delete(s) redirect('/moh/') flash(u'"%s" ajouté à votre bibliothèque sonore' % (s.name)) redirect('/moh/')
def setup(self): try: new_attrs = {} new_attrs.update(self.attrs) new_attrs.update(self.do_get_dependencies()) self.obj = self.klass(**new_attrs) DBSession.add(self.obj) DBSession.flush() return self.obj except: DBSession.rollback() raise
def create(self, **kw): ''' Add new department to DB ''' if DBSession.query(Department).filter(Department.name==kw['name']).all(): flash(u'Ce service existe déjà, pas créé', 'error') redirect('/departments/') d = Department() d.name = kw['name'] d.comment = kw['comment'] DBSession.add(d) flash(u'Nouveau service "%s" créé' % (kw['name'])) redirect('/departments/')
def process_file(csv, cmp_id): # Check file filename = csv.filename filetype = csv.type filedata = csv.file log.debug('process_file: <%s> <%s> <%s>' % (filename, filetype, filedata)) if filetype not in ('text/csv', 'application/csv', 'application/vnd.ms-excel'): log.warning('process_file: not CSV : <%s> <%s> <%s>' % ( filename, filetype, filedata)) return 0, 0, u'Le fichier doit être de type CSV !' # Temporarily save uploaded file tmpfn = '/tmp/customer-%d-%d.csv' % (cmp_id, int(time())) tmp = open(tmpfn, 'w') tmp.write(filedata.read()) tmp.close() # Then read it tmp = open(tmpfn, 'U') lines = errors = 0 for l in tmp: lines += 1 if lines==1: continue data = line2data(l) if len(data)!=10: log.warning('process_file: invalid data %s' % data) errors += 1 continue c = Customer() c.cmp_id = cmp_id c.active = True c.code = data[0] c.gender = data[1] c.lastname = data[2] c.firstname = data[3] c.phone1 = data[4] c.phone2 = data[5] c.phone3 = data[6] c.phone4 = data[7] c.phone5 = data[8] c.email = data[9] c.filename = filename DBSession.add(c) tmp.close() # remove uploaded file # unlink(tmp) return lines, errors, ''
def save_scenario(self, id, **kw): if kw.has_key("scenario[]"): scenario = kw["scenario[]"] else: log.error(u"No scenario to save ???") scenario = None return dict(result=0) # XXX ? positions = {} if type(kw["positions[]"]) != type([]): kw["positions[]"] = (kw["positions[]"],) for p in kw["positions[]"]: log.debug(p) (context, top, left) = p.split("::") positions[context] = (int(float(top)), int(float(left))) log.info("save_scenario %s, type %s" % (id, type(scenario))) application = DBSession.query(Application).get(int(id)) # 1. Delete old entries DBSession.query(Scenario).filter(Scenario.app_id == int(id)).delete() # 2. Create new ones if scenario: if type(scenario) != type([]): scenario = (scenario,) for s in scenario: sc = Scenario() (c, i, e, p, a, m) = s.split("::", 5) p = 1 + int(p) (sc.comments, sc.app_id, sc.context, sc.extension, sc.step, sc.action, sc.parameters) = ( c, id, i, e, p, a, m, ) if p == 1: i = "context_%s" % i log.debug(u"position %s" % i) if i in positions.keys(): sc.top = positions[i][0] sc.left = positions[i][1] DBSession.add(sc) return dict(result=generate_dialplan())
def create(self, firstname, lastname, company, phone1, phone2, phone3, email, private=None): ''' Add new phonebook entry to DB ''' d = Phonebook() d.firstname = firstname d.lastname = lastname d.company = company d.phone1 = phone1 d.phone2 = phone2 d.phone3 = phone3 d.email = email d.private = private d.user_id = request.identity['user'].user_id DBSession.add(d) flash(u'Nouveau contact "%s %s" créé' % (firstname, lastname)) redirect('/phonebook/')
def save(self, uid, member, queue, custom1, custom2, send_or_save, subject, customer, number, manager, message, cc): if manager != "null": m = DBSession.query(Phonebook).filter(Phonebook.code == manager).one() to = m.email name = m.firstname + " " if m.firstname is not None else u"" name += m.lastname if m.lastname is not None else u"" manager = "%s (%s)" % (manager, name) else: to = name = manager = None if send_or_save == "send" and to is not None: sender = request.identity["user"].email_address email(sender, to, customer, number, name, message, subjects_dict[subject], cc) html = u"Message envoyé" else: html = u"Compte-rendu sauvé" r = Report() r.user_id = request.identity["user"].user_id r.uniqueid = uid try: u = DBSession.query(User).filter(User.ascii_name == member).first() r.member_id = u.user_id except: log.error('user "%s" not found' % member) try: r.queue_id = DBSession.query(Queue).filter(Queue.name == queue).one().queue_id except: log.error('queue "%s" not found' % queue) r.custom1 = custom1 r.custom2 = custom2 r.subject = subject r.customer = customer r.manager = manager r.message = message r.email = to r.cc = cc r.number = number DBSession.add(r) return dict(title=html)
def auto_record(self, name, channel, queue, uid, custom1, custom2): ''' Auto record Called from Asterisk dialplan / func_curl ''' log.debug('auto_record: name %s, channel %s, queue %s, uid %s, custom1 %s, custom2 %s' % ( name, channel, queue, uid, custom1, custom2)) # Check channel exists, else abort for cha in Globals.asterisk.channels.keys(): if cha.startswith(channel): unique_id = Globals.asterisk.channels[cha]['Uniqueid'] break else: log.warning('auto_record: no active channel for %s ?' % channel) return '1' # Poor man's authentification! if uid!=unique_id: log.warning('auto_record: unique_id "%s" != "%s"' % (unique_id, uid)) return '1' # Set "recorded" flag on member Globals.asterisk.members[name]['Recorded'] = True # Insert record info into database r = Record() r.user_id = -2 # Auto_record pseudo-user! r.uniqueid = unique_id r.queue_id = DBSession.query(Queue).filter( Queue.name==queue).one().queue_id try: u = DBSession.query(User).filter(User.ascii_name==name).first() log.debug(u' * * * %s' % u) r.member_id = u.user_id except: r.member_id = 1 log.error('user "%s" not found' % name) r.custom1 = custom1 r.custom2 = custom2 DBSession.add(r) return '0'
def put(self, name, comment, type, begin, end, file, cmp_id, active=None): log.debug('Save "%s"!' % file) c = DBSession.query(Campaign).get(cmp_id) c.name = name c.comment = comment c.type = type c.active = active c.begin = begin c.end = end DBSession.add(c) DBSession.flush() log.debug(u'nouvelle campagne %s modifiée' % c.cmp_id) if file is not None: process_file(file, c.cmp_id) flash(u'Campagne "%s" modifiée' % name) redirect('/cc_campaign/')
def create(self, name, exten, dnis, comment, app_begin=None, app_end=None, active=True, owner_id=None, **kw): """ Add new application and initial dialplan to DB """ a = Application() a.name = name a.exten = exten a.dnis = dnis a.active = active a.begin = app_begin a.end = app_end a.comment = comment a.created_by = request.identity["user"].user_id if owner_id: a.owner_id = owner_id else: a.owner_id = request.identity["user"].user_id # Try to insert file in DB: might fail if name already exists try: DBSession.add(a) DBSession.flush() except: log.error(u"Insert failed %s" % a) flash(u"Impossible de créer l'application (vérifier son nom)", "error") redirect("/applications/") s = Scenario() s.app_id = a.app_id s.context = "Entrant" s.extension = "s" s.step = 1 s.action = 0 s.parameters = None DBSession.add(s) flash(u'Nouvelle application "%s" créée' % (name)) redirect("/applications/")
def main(): args = parse_args() load_config(args.conf_file) if len(DBSession.query(Phone).all())==0: create_phones('4643') create_phones('4752') data = csv.reader(open(args.csv_file,'rb'), delimiter=',') try: dptm = '' for row in data: uname = unicode(re.sub('\W', '', (row[1][0:2] + row[0]).lower()), 'utf-8') dname = unicode(row[0] + ' ' + row[1], 'utf-8') num = unicode(row[3].replace(' ',''), 'utf-8') fax = unicode(row[4].replace(' ',''), 'utf-8') dptm = unicode(row[5], 'utf-8') #print ' * * * ', uname, dname, num, dptm try: p = DBSession.query(Phone).filter(Phone.number==num).one() except NoResultFound, e: # Nouveau tél ??? p = Phone() p.number = num p.department_id = -1 DBSession.add(p) try: d = DBSession.query(Department).filter(Department.name==dptm).one() except NoResultFound, e: # Nouveau département d = Department() d.name = dptm DBSession.add(d) u = User() u.user_name = uname u.display_name = dname u.phone = [p] u.password = u'n5oBwdpytxdvj~Rz1uum' p.department = d DBSession.add(u) DBSession.add(p)
def create(self, **kw): ''' Add new queue to DB ''' q = Queue() q.name = kw['name'] q.comment = kw['comment'] id = int(kw['music']) if id!=-1: q.music_id = id id = int(kw['announce']) if id!=-1: q.announce_id = id q.strategy = kw['strategy'] q.wrapuptime = int(kw['wrapuptime']) q.announce_frequency = int(kw['announce_frequency']) q.min_announce_frequency = int(kw['min_announce_frequency']) q.announce_holdtime = 1 if kw['announce_holdtime']=='yes' else 0 q.announce_position = 1 if kw['announce_position']=='yes' else 0 q.priority = int(kw['priority']) q.monitor = True if kw['monitor']=='1' else False q.connectdelay = int(kw['connectdelay']) q.connecturl = kw['connecturl'] q.hangupurl = kw['hangupurl'] q.timeout = kw['timeout'] DBSession.add(q) # Create new group for supervisors g = Group() g.group_name = u'SV %s' % q.name g.display_name = u'Superviseurs groupe d\'appels %s' % q.name DBSession.add(g) # Create new group for members g = Group() g.group_name = u'AG %s' % q.name g.display_name = u'Agents groupe d\'appels %s' % q.name DBSession.add(g) # Create Asterisk queue asterisk_update_queue(q) # Add to list of queues Globals.asterisk.queues[q.name] = {} Globals.manager.send_action({'Action': 'QueueStatus'}) flash(u'Nouveau groupe d\'appel "%s" créé' % (kw['name'])) redirect('/queues/')
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'}
email = uid = None log.write('uid=%s, email=%s\n' % (uid, email)) f = Fax() f.type = 1 # => received fax f.hyla_id = hyla_id f.user_id = uid f.src = src f.dest = dst f.filename = pdf if pdf is not None: try: fpdf = open('/var/spool/hylafax/astportal/' + pdf) f.pdf = fpdf.read() fpdf.close log.write('PDF imported from file /var/spool/hylafax/astportal/%s\n' % pdf) except: log.write('ERROR: PDF file /var/spool/hylafax/astportal/%s\n' % pdf) DBSession.add(f) DBSession.flush() transaction.commit() log.write('New fax added to database\n') if email is not None: log.write('SENDTO=%s\n' % email) print 'SENDTO=%s' % email log.write('\n' + '<' * 40 + '\n')
#from astportal2.model import * from astportal2.model import init_model, DBSession, Phone config = ConfigParser.ConfigParser({'here': os.getcwd()}) config.read(os.path.join(os.getcwd(), 'development.ini')) sqlalchemy_url = config.get('app:main', 'sqlalchemy.url') engine = create_engine(sqlalchemy_url) init_model(engine) import csv, sys numbers = [p.number for p in DBSession.query(Phone.number).all()] #for i in range(0,400): #for i in range(500,700): for i in range(800,900): n = '2%03d' % i if n not in numbers: p = Phone() p.number = n p.department_id = 28 try: DBSession.add(p) DBSession.flush() except: sys.exit('ERREUR sur poste ' + n) print n, 'OK !' transaction.commit()
c.src = d[3] c.dst = d[4] c.dcontext = d[5] c.channel = d[6] c.dstchannel = d[7] c.lastapp = d[8] c.lastdata = d[9] c.duration = d[10] c.billsec = d[11] c.disposition = d[12] c.amaflags = d[13] c.accountcode = d[14] c.uniqueid = d[15] c.userfield = d[16] c.ut = d[17] c.ht = d[18] c.ttc = d[19] c.department = d[20] c.user= d[21] DBSession.add(c) try: DBSession.flush() except: err += 1 print i, d[0], c sys.exit(1) transaction.commit() print i, 'inserts', err, 'erreurs'