def write(cls, *args): super(Badge, cls).write(*args) badges = sum(args[0:None:2], []) cls.isonas_badge_sync(badges, []) isonas = Isonasacs( config.get('Isonas', 'host'), config.get('Isonas', 'port')) isonas.logon( config.get('Isonas', 'clientid'), config.get('Isonas', 'password')) for badge in badges: if badge.disabled: isonas.update('BADGES', badge.code.encode('ascii'), 0, 0, '', '') else: isonas.update('BADGES', badge.code.encode('ascii'), 0, 0, 0, '')
def write(cls, *args): super(Party, cls).write(*args) parties = sum(args[0:None:2], []) #pool = Pool() #Badge = pool.get('access.control.badge') #Badge.isonas_badge_sync([], parties) isonas = Isonasacs( config.get('Isonas', 'host'), config.get('Isonas', 'port')) isonas.logon( config.get('Isonas', 'clientid'), config.get('Isonas', 'password')) for party in parties: if party.badges: try: idfile = isonas.query('IDFILE', party.code.encode('ascii')) except IsonasacsError: pass else: party_name = party.name.encode('ascii', 'replace') if idfile[0] != party_name: isonas.update('IDFILE', party_name, '', '', party.code.encode('ascii'))
def isonas_badge_sync(cls): """ Method used with Cron to synchronise Tryton Badges with Isonas method used by cron to search for all badges and synchronise between Tryton and Isonas. Currently cron is set every 2 hours. isonas_ - queryall -> create a set with all the IDS - create a set from Tryton badges - check for the difference of the sets ( authority is TRYTON set) - set of isonas - set of tryton = badges to delete from isonas - set of tryton - set of isonas = badges to create in isonas - what about badges to disable.... """ start_time = time() tryton_badges = cls.search([ ]) # get all badges from Tryton tryton_badges_dict = {} print '#### CREATE badge dictionary' for badge in tryton_badges: tryton_badges_dict[badge.code] = badge tryton_badges_codes = set(b.code for b in tryton_badges) # set of all badge numbers Party = Pool().get('party.party') tryton_idfiles = Party.search([('badges', '!=', None)]) tryton_idfiles_dict = {} ## Create a dictionary of parties for idfile in tryton_idfiles: tryton_idfiles_dict[idfile.code] = idfile tryton_idfiles_codes = set(p.code for p in tryton_idfiles) #print 'tryton_idfiles_codes %s' % tryton_idfiles_codes print 'connect to ISONAS' Isonas_connection = Isonasacs(config.get('Isonas', 'host'), \ config.get('Isonas', 'port')) Isonas_connection.logon(config.get('Isonas', 'clientid'), \ config.get('Isonas', 'password')) isonas_idfile_groupname = config.get('Isonas','groupname') # get all 'IDFILES' of the tryton_user group isonas_tryton_group_idfiles = Isonas_connection.query('GROUP', \ isonas_idfile_groupname) # get al 'IDFILES' for updating isonas_all_idfiles = Isonas_connection.query_all('IDFILE') isonas_idfiles_codes = set() isonas_idfiles_dict = {} for idfile_code in isonas_tryton_group_idfiles: isonas_idfiles_codes.add(idfile_code[1]) isonas_idfiles_dict[idfile_code[1]] = Isonas_connection.query('IDFILE',idfile_code[1]) # get all the badges from ISONAS controller isonas_badges = Isonas_connection.query_all('BADGES') isonas_badges_codes = set(badge[0] for badge in isonas_badges) idfiles_to_delete = isonas_idfiles_codes - tryton_idfiles_codes # !!!! Can I delete idfiles that have badges? yes - it will delete the badges too for idfile_idstring in idfiles_to_delete: #print 'idfile_idstring %s ' % idfile_idstring Isonas_connection.delete('IDFILE', idfile_idstring) # print '#### badges to delete' # for badge in badges_to_delete: # print 'badge %s' % badge # Isonas_connection.delete('BADGES', badge) idfiles_to_create = tryton_idfiles_codes - isonas_idfiles_codes idfiles_to_update = tryton_idfiles_codes - idfiles_to_create badges_to_create = tryton_badges_codes - isonas_badges_codes badges_to_update = tryton_badges_codes - badges_to_create ##### CREATE ###### print '#### CREATE IDFILES' for idfile_code in idfiles_to_create: Isonas_connection.add('IDFILE', tryton_idfiles_dict[idfile_code].name.encode('ascii'),'','',idfile_code.encode('ascii')) Isonas_connection.add('GROUPS', idfile_code.encode('ascii'), isonas_idfile_groupname.encode('ascii')) print '--- %s seconds ---' % (time() - start_time) print '#### CREATE BADGES' for badge in badges_to_create: badgestatus = tryton_badges_dict[badge].disabled if tryton_badges_dict[badge].disabled: Isonas_connection.add('BADGES', tryton_badges_dict[badge].party.code.encode('ascii'), badge.encode('ascii'), 0, 0,'','',2 ) else: Isonas_connection.add('BADGES', tryton_badges_dict[badge].party.code.encode('ascii'), badge.encode('ascii'), 0, 0,0,'',2) print '--- %s seconds ---' % (time() - start_time) #### UPDATE idfiles' print '#### UPDATE IDFILES' for idfile_code in idfiles_to_update: isonasidfile = Isonas_connection.query('IDFILE', idfile_code.encode('ascii') ) if isonasidfile[0] != tryton_idfiles_dict[idfile_code].name: Isonas_connection.update('IDFILE',tryton_idfiles_dict[idfile_code].name.encode('ascii'),'','', idfile_code.encode('ascii') ) print '--- %s seconds ---' % (time() - start_time) print '#### UPDATE badges' for badge in badges_to_update: if tryton_badges_dict[badge].disabled: Isonas_connection.update('BADGES',badge.encode('ascii'),0,'',) else: Isonas_connection.update('BADGES',badge.encode('ascii'),0,'',) print '--- %s seconds ---' % (time() - start_time) # @classmethod # def create(cls, vlist): # """ # ir.cron( needs id ) # nextcall = now or now # ir.model.data has a method getid(<modulename>,<xmlid>) return id in db # """ # Sequence = Pool().get('ir.sequence') # Configuration = Pool().get('party.access.control.isonas.configuration') # vlist = [x.copy() for x in vlist] # for values in vlist: # if not values.get('code'): # config = Configuration(1) # values['code'] = Sequence.get_id(config.party_sequence.id) # values.setdefault('addresses', None) # return super(Party, cls).create(vlist)
def isonas_badge_sync(cls, badges=None, parties=None): """ Method used with Cron to synchronise Tryton Badges with Isonas method used by cron to search for all badges and synchronise between Tryton and Isonas. Currently cron is set every 2 hours. isonas_ - queryall -> create a set with all the IDS - create a set from Tryton badges - check for the difference of the sets ( authority is TRYTON set) - set of isonas - set of tryton = badges to delete from isonas - set of tryton - set of isonas = badges to create in isonas - what about badges to disable.... """ pool = Pool() Party = pool.get('party.party') start_time = time() # get all badges from Tryton if badges is None and parties is None: tryton_badges = {b.code: b for b in cls.search([])} else: tryton_badges = {b.code: b for b in badges} if badges is None and parties is None: tryton_idfiles = {p.code: p for p in Party.search([('badges', '!=', None)])} else: tryton_idfiles = {p.code: p for p in parties} isonas = Isonasacs( config.get('Isonas', 'host'), config.get('Isonas', 'port')) isonas.logon( config.get('Isonas', 'clientid'), config.get('Isonas', 'password')) groupname = config.get('Isonas', 'groupname') print '--- BEFORE IDFILE QUERY %s seconds ---' % (time() - start_time) # get all 'IDFILES' of the groupname isonas_group_idfiles_codes = set(idfile[1] for idfile in isonas.query('GROUP', groupname)) print '--- AFTER GROUP QUERY %s seconds ---' % (time() - start_time) # get all 'IDFILES' from ISONAS isonas_all_idfiles_codes = set(idfile[0] for idfile in isonas.query_all('IDFILE')) print '--- AFTER IDFILE QUERY %s seconds ---' % (time() - start_time) # get all the badges from ISONAS controller isonas_badges = {b[0]: b for b in isonas.query_all('BADGES')} print '--- AFTER BADGES QUERY %s seconds ---' % (time() - start_time) tryton_idfiles_codes = set(tryton_idfiles.keys()) tryton_badges_codes = set(tryton_badges.keys()) isonas_badges_codes = set(isonas_badges.keys()) # uncomment following section to allow deletion # if badges is None and parties is None: # idfiles_to_delete = isonas_all_idfiles_codes - tryton_idfiles_codes # else: # Partial synchronisation so nothing to delete #idfiles_to_delete = [] idfiles_to_create = tryton_idfiles_codes - isonas_all_idfiles_codes idfiles_to_update = tryton_idfiles_codes.intersection(isonas_all_idfiles_codes) idfiles_to_add_to_group = tryton_idfiles_codes - isonas_group_idfiles_codes # idfiles_to_add_to_group = idfiles_to_add_to_group - idfiles_to_create badges_to_create = tryton_badges_codes - isonas_badges_codes badges_to_update = tryton_badges_codes.intersection(isonas_badges_codes) ### DELETE # uncomment following section to allow deletion # XXX Can I delete idfiles that have badges? # yes - it will delete the badges too # for idstring in idfiles_to_delete: # print '** delete idfile %s' % idstring # isonas.delete('IDFILE', idstring) ### CREATE for code in idfiles_to_create: party = tryton_idfiles[code] name = party.name.encode('ascii', 'replace') isonas.add('IDFILE', name, '', '', code.encode('ascii')) # isonas.add('GROUPS', code.encode('ascii'), groupname.encode('ascii')) print '--- FINISHED creating idfiles %s seconds ---' % (time() - start_time) for code in badges_to_create: badge = tryton_badges[code] if badge.disabled: isonas.add('BADGES', badge.party.code.encode('ascii'), code.encode('ascii'), 0, 0, '', '', 2) else: isonas.add('BADGES', badge.party.code.encode('ascii'), code.encode('ascii'), 0, 0, 0, '', 2) print '--- FINISHED creating badges %s seconds ---' % (time() - start_time) #### UPDATE GROUP for code in idfiles_to_add_to_group: isonas.add('GROUPS', code.encode('ascii'), groupname.encode('ascii')) print '--- FINISHED updating groups %s seconds ---' % (time() - start_time) ### UPDATE idfiles' # get the details of all the IDFILES' isonas_idfiles_details = {} for idstring in idfiles_to_update: isonas_idfiles_details[idstring] = isonas.query('IDFILE', idstring.encode('ascii')) for code in idfiles_to_update: idfile = isonas_idfiles_details[code] party = tryton_idfiles[code] party_name = party.name.encode('ascii', 'replace')[:20] if idfile[0] != party_name: isonas.update('IDFILE', party_name, '', '', code.encode('ascii')) for code in badges_to_update: badge = tryton_badges[code] if badge.disabled: isonas.update('BADGES', code.encode('ascii'), 0, 0, '', '') else: isonas.update('BADGES', code.encode('ascii'), 0, 0, 0, '')
class TestISONASACS(unittest.TestCase): def setUp(self): _Telnet = Mock() self._telnet = _Telnet() self._telnet.read_until.return_value = '<LOGON>' self.isonasacs = Isonasacs('localhost', 7101, _Telnet=_Telnet) self._telnet.reset_mock() def test_logon(self): self._telnet.read_until.return_value = '<LOGON ACCEPTED>|' self.isonasacs.logon('clientid', 'password') self._telnet.write.assert_called_once_with( '<LOGON><clientid><password>|') def test_logon_failure(self): self._telnet.read_until.return_value = '<ERROR>Access Denied|' self.assertRaises(IsonasacsError, self.isonasacs.logon, 'clientid', 'wrongpassword') def test_add(self): self._telnet.read_until.return_value = '<ACK>|' self.isonasacs.add('IDFILE', 'LastName', 'ID') self._telnet.write.assert_called_once_with( '<ADD><IDFILE><LastName><ID>|') def test_add_failure(self): self._telnet.read_until.return_value = '<ERROR>|' self.assertRaises(IsonasacsError, self.isonasacs.add, 'foo') def test_delete(self): self._telnet.read_until.return_value = '<ACK>|' self.isonasacs.delete('IDFILE', 'ID') self._telnet.write.assert_called_once_with( '<DELETE><IDFILE><ID>|') def test_update(self): self._telnet.read_until.return_value = '<ACK>|' self.isonasacs.update('IDFILE', 'ID', 'LastName') self._telnet.write.assert_called_once_with( '<UPDATE><IDFILE><ID><LastName>|') def test_query_all(self): self._telnet.read_until.side_effect = [ '<ALL IDFILE><1>|', '<ALL IDFILE><2>|', '<ALL IDFILE><3>|', '<END IDFILE>|'] self.assertEqual(self.isonasacs.query_all('IDFILE'), [['1'], ['2'], ['3']]) self._telnet.write.assert_called_once_with( '<QUERY><ALL IDFILE>|') def test_query(self): self._telnet.read_until.return_value = ( '<IDFILE><LastName><FirstName><Initial><1>|') self.assertEqual(self.isonasacs.query('IDFILE', '1'), ['LastName', 'FirstName', 'Initial', '1']) self._telnet.write.assert_called_once_with( '<QUERY><IDFILE><1>|') def test_query_group(self): self._telnet.read_until.side_effect = [ '<GROUP><group><1>|', '<GROUP><group><2>|', '<END GROUP>|'] self.assertEqual(self.isonasacs.query('GROUP', 'group'), [['group', '1'], ['group', '2']]) self._telnet.write.assert_called_once_with( '<QUERY><GROUP><group>|')