def test_process_books(self): converters = [pipe_to_book, slash_to_book, csv_to_book] file_parse_info = zip(get_input_files(), ["|", "/", ","], converters) books = get_books_from_files(file_parse_info) self.assertEquals(len(process_books(books, "", False, False)), 9) books = get_books_from_files(file_parse_info) self.assertEquals(process_books(books, None, False, False)[0], Book("Kent", "Beck", "Implementation Patterns", "2007")) books = get_books_from_files(file_parse_info) self.assertEquals(process_books(books, None, False, True)[-1], Book("Kent", "Beck", "Implementation Patterns", "2007")) books = get_books_from_files(file_parse_info) self.assertEquals(process_books(books, None, True, False)[0], Book("Fred", "Brooks", "The Mythical Man-Month", "1975"))
def get_or_create(cls, queries, *args, **kwargs): item = Book.get_by_queries(**queries) if not item: item = Book(*args, **kwargs) item.save() return item
class __init__(): def __init__(self, bot): self.icons = {} self.queue = [] self.delay = 0 self.menu = {} self.menu_count = 1 self.req = {'enabled': False} self.bot = bot self.bot.events.add('ui', 0, 0, 'load', self.load_gui) if self.bot.ui_loaded: wx.CallAfter(self.load_gui) def load_gui(self): self.wrapper = self.bot.wrapper.wx self.bni = self.wrapper.load_library('bni', bni) #GUI - START self.frame = wx.Frame(None, wx.ID_ANY, self.bot.ver(), size=(800, 450)) self.panel = wx.Panel(self.frame) #TASK BAR ICON self.tray_icon = wx.Icon('icons' + sep + 'tray_icon.gif', wx.BITMAP_TYPE_GIF) self.tb_icon = wx.TaskBarIcon() self.frame.Bind(wx.EVT_ICONIZE, self.create_icon) self.tb_icon.Bind(wx.EVT_TASKBAR_LEFT_UP, self.remove_icon) self.frame.SetIcon(self.tray_icon) #MENU BAR self.menu_bar = wx.MenuBar() self.frame.SetMenuBar(self.menu_bar) #CHAT BOX, SEND BOX, CHANNEL HEADER self.nb_disp = Book('disp', self.bot, self, self.panel, wx.aui.AUI_NB_WINDOWLIST_BUTTON |\ wx.aui.AUI_NB_CLOSE_BUTTON |\ wx.aui.AUI_NB_CLOSE_ON_ALL_TABS |\ wx.aui.AUI_NB_SCROLL_BUTTONS) self.txt_chat() self.bot.events.add(self, 'ui', 'disp', 'closed', 0, 0, 'main', self.txt_chat) self.cb_send = wx.ComboBox(self.panel, style=wx.CB_DROPDOWN |\ wx.TE_PROCESS_ENTER) self.frame.Bind(wx.EVT_TEXT_ENTER, self.send_text, self.cb_send) self.frame.Bind(wx.EVT_TEXT_PASTE, self.text_pasted, self.cb_send) #CHANNEL LIST self.nb_list = Book('list', self.bot, self, self.panel, wx.aui.AUI_NB_WINDOWLIST_BUTTON |\ wx.aui.AUI_NB_BOTTOM |\ wx.aui.AUI_NB_SCROLL_BUTTONS) #COLOURS - Inherit doesn't work for me ;( self.cb_send.SetBackgroundColour('#000000') self.cb_send.SetForegroundColour('#FFFFFF') #SIZING / POSITIONING self.grid = wx.GridBagSizer() self.grid.Add(self.cb_send, wx.GBPosition(1, 0), flag=wx.EXPAND) self.grid.Add(self.nb_list.book, wx.GBPosition(0, 1), flag=wx.EXPAND, span=wx.GBSpan(2, 1)) self.grid.Add(self.nb_disp.book, wx.GBPosition(0, 0), flag=wx.EXPAND) #SIZING - RESIZING self.grid.AddGrowableCol(0, 1) self.grid.AddGrowableRow(0, 1) self.grid.SetFlexibleDirection(wx.BOTH) #SIZING - MINIMUMS self.nb_disp.book.SetSizeHints(1, 1) self.nb_list.book.SetSizeHints(300, 1) #GET READY self.panel.SetSizerAndFit(self.grid, True) self.frame.Show(True) self.add_events() #ADDCHAT READY self.bot.addchat(self.bot.ver()) self.bot.events.call('ui', 'start') self.menu_add('Window', 'Clear current display(s)\tCTRL-S', self.clear_chat) if self.bot.ui_loaded: self.bot.events.call('ui', 'reload') self.cb_send.SetFocus() def txt_chat(self, name=''): self.nb_disp.page_add('disp', 'main', 'Main') def text_pasted(self, event): if wx.TheClipboard.Open(): if wx.TheClipboard.IsSupported(wx.DataFormat(wx.DF_TEXT)): data = wx.TextDataObject() wx.TheClipboard.GetData(data) msg = str(data.GetText()) if msg.find('\n') == -1: event.Skip(True) else: for line in msg.split('\n'): line = line.strip('\n\r') if line != '': self.bot.send(line) self.cb_send.Insert(line, 0) wx.TheClipboard.Close() def menu_add(self, *rest): wx.CallAfter(self.do_menu_add, *rest) def do_menu_add(self, menu, *rest): key = menu.lower() if (key in self.menu) == False: self.menu[key] = (wx.Menu(), self.menu_bar.GetMenuCount()) self.menu_bar.Append(self.menu[key][0], menu) for x in range(0, len(rest), 2): mi = wx.MenuItem(self.menu[key][0], self.menu_count, rest[x]) self.menu[key][0].AppendItem(mi) wx.EVT_MENU(self.frame, self.menu_count, rest[x+1]) self.menu_count += 1 def menu_remove(self, menu): try: self.menu_bar.Remove(self.menu[menu][1]) self.menu[menu][0].Destroy() del self.menu[menu] except KeyError: pass def add_events(self): self.bot.events.add(self, 'IO', -1, -1, 'addchat', self.main_addchat, 'input', self.req_input) self.bot.events.add(self, 'ui', 'menu', 0, 0, 'add', self.menu_add, 'remove', self.menu_remove) self.bot.events.add(self, 'ui', 0, 0, 'config', self.show_config, 'confirm', self.confirm, 'get_profile', self.request_profile) self.bot.events.add(self, 'ui', 'send', 0, 0, 'send', self.send_send, 'clear', self.clear_send) self.bot.events.add(self, 'profile', 0, 0, 'received', self.got_profile) def load_icons(self, x=28, y=14, **kwargs): if kwargs == {}: il = self.bni.il icons = None count = self.bni.count else: il = wx.ImageList(x, y) icons = {} count = 0 for k, v in kwargs.iteritems(): icons[k] = il.Add(wx.Bitmap(v)) count += 1 return icons, il, count def get_lag_idx(self, arg): ping, flags = arg if (flags & 0x10) == 0x10: return self.bni.legacy[49]['idx'] elif ping <= 0: return self.bni.legacy[42]['idx'] elif ping < 200: return self.bni.legacy[43]['idx'] elif ping > 700: return self.bni.legacy[48]['idx'] else: return self.bni.legacy[ping / 100 + 42]['idx'] def get_bni_idx(self, user, draw): il = self.bni.il try: icon = user['icon'][-4:] or user['product'][-4:] except KeyError: icon = user['product'][-4:] flags = user['flags'] idx = -1 for x in self.bni.flag: if (flags & x['flags']) == x['flags']: idx = x['idx'] return idx if (icon in ['STAR', 'SEXP', 'SSHR', 'JSTR']): try: if user['ladder_rank'] != 0: if user['ladder_rank'] == 1: idx = self.bni.legacy[13]['idx'] else: idx = self.bni.legacy[12]['idx'] elif user['ladder_rating'] != 0: idx = self.bni.legacy[11]['idx'] elif user['wins'] > 0: idx = ((user['wins'] > 10) and 10) or\ user['wins'] idx = self.bni.legacy[idx]['idx'] return idx except KeyError: pass elif icon == 'W2BN': try: if user['ladder_rank'] != 0: if user['ladder_rank'] == 1: idx = self.bni.legacy[28]['idx'] else: idx = self.bni.legacy[26]['idx'] elif user['ladder_rating'] != 0: idx = self.bni.legacy[25]['idx'] elif user['wins'] > 0: idx = (((user['wins'] > 10) and 10) or\ user['wins']) + 14 return idx except KeyError: pass elif icon in ['DRTL', 'DSHR']: try: if user['class_num'] != -1: idx = 30 + user['class_num'] + 3 * user['dots'] except KeyError: pass elif user['product'] in ['WAR3', 'W3XP']: try: if user['level'] == 0: icon = user['product'] #Override to more specific icon except KeyError: icon = user['product'] if idx == -1: try: idx = self.bni.prod[icon]['idx'] except KeyError: return -1 if 'level' in user: if user['level'] == 0: return idx bitm = il.GetBitmap(idx) mdc = wx.MemoryDC(bitm) mdc.SetTextForeground('#3399FF') font = wx.Font(6, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) mdc.SetFont(font) if user['product'] in ['WAR3', 'W3XP']: mdc.DrawText(str(user['level']), 22, 3) elif user['product'] in ['DRTL', 'DSHR']: mdc.DrawText(str(user['level']), 16, 3) elif user['product'] in ['D2DV', 'D2XP']: mdc.DrawText(str(user['level']), 16, 3) mdc.SelectObjectAsSource(wx.NullBitmap) idx = self.bni.add(bitm) draw.append(idx) return idx if 'ladder_rating' in user: if user['ladder_rating'] == 0: return idx bitm = il.GetBitmap(idx) mdc = wx.MemoryDC(bitm) font = wx.Font(6, wx.FONTFAMILY_ROMAN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) mdc.SetFont(font) mdc.SetTextForeground('#FFFFFF') mdc.DrawText(str(user['ladder_rating']), 5, 3) #if user['ladder_rank'] != 0: # mdc.SetTextForeground('#3399FF') # mdc.DrawText(str(user['ladder_rank']), 26, 10) #Not enough space anymore mdc.SelectObjectAsSource(wx.NullBitmap) idx = self.bni.add(bitm) draw.append(idx) return idx return idx def notify_tab(self, msg): idx, name, kind = self.nb_disp.page_current() keep = [name, msg] self.bot.events.call('ui', kind, name, 'send', [keep]) msg = keep[1] idx, name, kind = self.nb_list.page_current() keep = [name, msg] self.bot.events.call('ui', kind, name, 'send', [keep]) return keep[1] def confirm(self, title, msg, func_yes, func_no=None): md = wx.MessageDialog(self.panel, msg, title, wx.YES_NO | wx.ICON_QUESTION) if md.ShowModal() == wx.ID_YES: func_yes() else: if func_no != None: func_no() def create_icon(self, evt_icon): if evt_icon.Iconized(): self.tb_icon.SetIcon(self.tray_icon) self.frame.Lower() self.frame.Show(False) def remove_icon(self, *rest): self.tb_icon.RemoveIcon() self.frame.Restore() self.frame.Raise() self.frame.Show(True) def send_send(self, pre='', post='', clear=True): self.cb_send.SetValue(str(self.cb_send.GetValue())) self.send_text(clear=clear, pre=pre, post=post) def request_profile(self, names): self.bot.events.call('profile', 'request', name) def got_profile(self, names, results): wx.CallAfter(self.got_profile2, names, results) def got_profile2(self, name, keys): self.nb_disp.page_add('profile', 'prof_'+name, 'Profile: ' + name, name, keys, select=True) def req_input(self, req): self.bot.addchat('info', req['query']) self.req = req self.req['enabled'] = True def show_config(self, *rest): self.config = Config(self.bot) def clear_chat(self, cmd=None): idx, name, kind = self.nb_disp.page_current() if kind == 'disp': self.bot.events.call('ui', kind, name, 'clear') idx, name, kind = self.nb_list.page_current() if kind == 'disp': self.bot.events.call('ui', kind, name, 'clear') def send_text(self, wtf=0, clear=True, pre='', post=''): msg = pre+str(self.cb_send.GetValue())+post if msg == '': return if self.req['enabled'] == False: msg = self.notify_tab(msg) self.bot.send(msg) else: self.req['enabled'] = False #Can't delete req dict. ret_func disappears self.req['ret_func'](msg) if clear == True: self.clear_send() self.cb_send.Insert(msg, 0) def clear_send(self): self.cb_send.SetValue('') def main_addchat(self, *args): self.bot.events.call('ui', 'disp', 'main', 'append', list(args)) def __del__(self, *rest): self.frame.Destroy()
def load_gui(self): self.wrapper = self.bot.wrapper.wx self.bni = self.wrapper.load_library('bni', bni) #GUI - START self.frame = wx.Frame(None, wx.ID_ANY, self.bot.ver(), size=(800, 450)) self.panel = wx.Panel(self.frame) #TASK BAR ICON self.tray_icon = wx.Icon('icons' + sep + 'tray_icon.gif', wx.BITMAP_TYPE_GIF) self.tb_icon = wx.TaskBarIcon() self.frame.Bind(wx.EVT_ICONIZE, self.create_icon) self.tb_icon.Bind(wx.EVT_TASKBAR_LEFT_UP, self.remove_icon) self.frame.SetIcon(self.tray_icon) #MENU BAR self.menu_bar = wx.MenuBar() self.frame.SetMenuBar(self.menu_bar) #CHAT BOX, SEND BOX, CHANNEL HEADER self.nb_disp = Book('disp', self.bot, self, self.panel, wx.aui.AUI_NB_WINDOWLIST_BUTTON |\ wx.aui.AUI_NB_CLOSE_BUTTON |\ wx.aui.AUI_NB_CLOSE_ON_ALL_TABS |\ wx.aui.AUI_NB_SCROLL_BUTTONS) self.txt_chat() self.bot.events.add(self, 'ui', 'disp', 'closed', 0, 0, 'main', self.txt_chat) self.cb_send = wx.ComboBox(self.panel, style=wx.CB_DROPDOWN |\ wx.TE_PROCESS_ENTER) self.frame.Bind(wx.EVT_TEXT_ENTER, self.send_text, self.cb_send) self.frame.Bind(wx.EVT_TEXT_PASTE, self.text_pasted, self.cb_send) #CHANNEL LIST self.nb_list = Book('list', self.bot, self, self.panel, wx.aui.AUI_NB_WINDOWLIST_BUTTON |\ wx.aui.AUI_NB_BOTTOM |\ wx.aui.AUI_NB_SCROLL_BUTTONS) #COLOURS - Inherit doesn't work for me ;( self.cb_send.SetBackgroundColour('#000000') self.cb_send.SetForegroundColour('#FFFFFF') #SIZING / POSITIONING self.grid = wx.GridBagSizer() self.grid.Add(self.cb_send, wx.GBPosition(1, 0), flag=wx.EXPAND) self.grid.Add(self.nb_list.book, wx.GBPosition(0, 1), flag=wx.EXPAND, span=wx.GBSpan(2, 1)) self.grid.Add(self.nb_disp.book, wx.GBPosition(0, 0), flag=wx.EXPAND) #SIZING - RESIZING self.grid.AddGrowableCol(0, 1) self.grid.AddGrowableRow(0, 1) self.grid.SetFlexibleDirection(wx.BOTH) #SIZING - MINIMUMS self.nb_disp.book.SetSizeHints(1, 1) self.nb_list.book.SetSizeHints(300, 1) #GET READY self.panel.SetSizerAndFit(self.grid, True) self.frame.Show(True) self.add_events() #ADDCHAT READY self.bot.addchat(self.bot.ver()) self.bot.events.call('ui', 'start') self.menu_add('Window', 'Clear current display(s)\tCTRL-S', self.clear_chat) if self.bot.ui_loaded: self.bot.events.call('ui', 'reload') self.cb_send.SetFocus()