def rename(self, key): """ Renames a channel category and updates all relevant fields. Args: key (str): The category's new name. Can include ANSI codes. Returns: key (ANSIString): The successful key set. """ if '|' in key and not key.endswith('|n'): key += '|n' key = ANSIString(key) clean_key = str(key.clean()) if '|' in clean_key: raise ValueError("Malformed ANSI in Channel CategoryName.") if not self.re_name.match(clean_key): raise ValueError( "Channel Category name does not meet standards. Avoid double spaces and special characters." ) bridge = self.bridge if bridge.db_system.channel_categories.filter( db_iname=clean_key.lower()).exclude(db_script=self).count(): raise ValueError("Name conflicts with another Channel Category.") self.key = clean_key bridge.db_name = clean_key bridge.db_iname = clean_key.lower() bridge.db_cname = key.raw() bridge.save(update_fields=['db_name', 'db_iname', 'db_cname']) return key
def test_slice_insert(self): """ Inserting a slice should not remove ansi markup (issue #2205) """ string = ANSIString("|rTest|n") split_string = string[:0] + "Test" + string[4:] self.assertEqual(string.raw(), split_string.raw())
def create_post(self, account, character, subject, text, date=None): if not date: date = utcnow() name = ANSIString(subject) if '|' in name: raise ValueError("Malformed ANSI in post subject!") cname = name.raw() next = self.next_post_id new_post = self.posts.create(account=account, character=character, name=name.clean(), cname=cname, order=next, body=text, date_created=date, date_modified=date) new_post.update_read(account) next += 1 return new_post
def create_bbs_category(cls, key, abbr, **kwargs): if '|' in key and not key.endswith('|n'): key += '|n' key = ANSIString(key) if '|' in abbr and not abbr.endswith('|n'): abbr += '|n' abbr = ANSIString(abbr) clean_key = str(key.clean()) clean_abbr = str(abbr.clean()) if '|' in clean_key or '|' in clean_abbr: raise ValueError("Malformed ANSI in BBSCategory Name or Prefix.") if not cls.re_name.match(clean_key): raise ValueError("BBS Categories must have simpler names than that!") if not cls.re_abbr.match(clean_abbr): raise ValueError("Prefixes must be between 0-3 alphabetical characters.") if BBSCategoryBridge.objects.filter(Q(db_iname=clean_key.lower()) | Q(db_iabbr=clean_abbr.lower())).count(): raise ValueError("Name or Prefix conflicts with another BBSCategory.") script, errors = cls.create(clean_key, persistent=True, **kwargs) if script: script.create_bridge(key.raw(), clean_key, abbr.raw(), clean_abbr) script.setup_locks() else: raise ValueError(errors) return script
def create_channel(cls, category, key, unique_key=None): key = ANSIString(key) clean_key = str(key.clean()) if '|' in clean_key: raise ValueError("Malformed ANSI in Channel Name.") if not cls.re_name.match(clean_key): raise ValueError("Channel Names must be EXPLANATION HERE.") if category.channel_category_bridge.channels.filter( db_iname=clean_key.lower()).count(): raise ValueError("Name conflicts with another Channel.") channel, errors = cls.create(clean_key) if channel: channel.create_bridge(category, key.raw(), clean_key, unique_key) else: raise ValueError(errors) return channel
def create_channel_category(cls, chan_sys, key): if '|' in key and not key.endswith('|n'): key += '|n' key = ANSIString(key) clean_key = str(key.clean()) if '|' in clean_key: raise ValueError("Malformed ANSI in Channel Category Name.") if not cls.re_name.match(clean_key): raise ValueError("Channel Category names must be EXPLANATION.") if chan_sys.channel_system_bridge.channel_categories.filter( db_iname=clean_key.lower()).count(): raise ValueError("Name conflicts with another Channel Category.") script, errors = cls.create(clean_key, persistent=True) if script: script.create_bridge(chan_sys, key.raw(), clean_key) else: raise ValueError(errors) return script
def create_bbs_board(cls, category, key, order, **kwargs): if '|' in key and not key.endswith('|n'): key += '|n' key = ANSIString(key) clean_key = str(key.clean()) if '|' in clean_key: raise ValueError("Malformed ANSI in BBSCategory Name.") if not cls.re_name.match(clean_key): raise ValueError("BBS Board Names must <qualifier>") if BBSBoardBridge.objects.filter(db_category=category.bbs_category_bridge).filter( Q(db_iname=clean_key.lower()) | Q(db_order=order)).count(): raise ValueError("Name or Order conflicts with another BBS Board in this category.") script, errors = cls.create(clean_key, persistent=True, **kwargs) if script: script.create_bridge(category, key.raw(), clean_key, order) script.setup_locks() else: raise ValueError(errors) return script
class TestANSIString(TestCase): """ Verifies that ANSIString's string-API works as intended. """ def setUp(self): self.example_raw = "|relectric |cboogaloo|n" self.example_ansi = ANSIString(self.example_raw) self.example_str = "electric boogaloo" self.example_output = "\x1b[1m\x1b[31melectric \x1b[1m\x1b[36mboogaloo\x1b[0m" def test_length(self): self.assertEqual(len(self.example_ansi), 17) def test_clean(self): self.assertEqual(self.example_ansi.clean(), self.example_str) def test_raw(self): self.assertEqual(self.example_ansi.raw(), self.example_output) def test_format(self): self.assertEqual(f"{self.example_ansi:0<20}", self.example_output + "000")
def test_slice_full(self): string = ANSIString("A bigger |rTest|n of things |bwith more color|n") split_string = string[:] self.assertEqual(string.raw(), split_string.raw())