diff --git a/r2/r2/controllers/api.py b/r2/r2/controllers/api.py index 7cc065076..0b0b67441 100644 --- a/r2/r2/controllers/api.py +++ b/r2/r2/controllers/api.py @@ -2035,6 +2035,11 @@ class ApiController(RedditController): text_editable = VBoolean('text_editable')) def POST_flairtemplate(self, form, jquery, flair_template_id, text, css_class, text_editable): + if text is None: + text = '' + if css_class is None: + css_class = '' + # Check validation. if form.has_errors('css_class', errors.BAD_CSS_NAME): form.set_html(".status:first", _('invalid css class')) @@ -2071,6 +2076,11 @@ class ApiController(RedditController): jquery('input[name="css_class"]').data('saved', css_class) form.set_html('.status', _('saved')) + @validatedForm(VFlairManager(), VModhash()) + def POST_clearflairtemplates(self, form, jquery): + FlairTemplateBySubredditIndex.clear(c.site._id) + jquery.refresh() + def POST_flairselector(self): return FlairSelector().render() diff --git a/r2/r2/lib/db/tdb_cassandra.py b/r2/r2/lib/db/tdb_cassandra.py index 9e67ee504..e4d57b915 100644 --- a/r2/r2/lib/db/tdb_cassandra.py +++ b/r2/r2/lib/db/tdb_cassandra.py @@ -617,6 +617,17 @@ class ThingBase(object): def __setitem__(self, key, value): return self.__setattr__(key, value) + def __delitem__(self, key): + try: + del self._dirties[key] + except KeyError: + pass + try: + del self._column_ttls[key] + except KeyError: + pass + self._deletes.add(key) + def _get(self, key, default = None): try: return self.__getattr__(key) @@ -911,19 +922,6 @@ class View(ThingBase): # can we be smarter here? thing_cache.delete(cls._cache_key_id(row_key)) - def __delitem__(self, key): - # only implemented on Views right now, but at present there's - # no technical reason for this - try: - del self._dirties[key] - except KeyError: - pass - try: - del self._column_ttls[key] - except KeyError: - pass - self._deletes.add(key) - def schema_report(): manager = get_manager() print manager.describe_keyspace(keyspace) diff --git a/r2/r2/models/flair.py b/r2/r2/models/flair.py index a5c7db328..379bddcbd 100644 --- a/r2/r2/models/flair.py +++ b/r2/r2/models/flair.py @@ -146,29 +146,26 @@ class FlairTemplateBySubredditIndex(tdb_cassandra.Thing): return idx @classmethod - def _get_or_create_template(cls, sr_id, text, css_class, text_editable): + def by_sr(cls, sr_id, create=False): try: - idx = cls._byID(to36(sr_id)) + return cls._byID(to36(sr_id)) except tdb_cassandra.NotFound: - idx = cls._new(sr_id) - - existing_ft_ids = list(idx) + if create: + return cls._new(sr_id) + raise @classmethod def create_template(cls, sr_id, text='', css_class='', text_editable=False): + idx = cls.by_sr(sr_id, create=True) ft = FlairTemplate._new(text=text, css_class=css_class, text_editable=text_editable) - try: - idx = cls._byID(to36(sr_id)) - except tdb_cassandra.NotFound: - idx = cls._new(sr_id) idx.insert(ft._id) return ft @classmethod def get_template_ids(cls, sr_id): try: - return list(cls._byID(to36(sr_id))) + return list(cls.by_sr(sr_id)) except tdb_cassandra.NotFound: return [] @@ -178,6 +175,20 @@ class FlairTemplateBySubredditIndex(tdb_cassandra.Thing): return None return FlairTemplate._byID(ft_id) + @classmethod + def clear(cls, sr_id): + try: + idx = cls.by_sr(sr_id) + except tdb_cassandra.NotFound: + # Everything went better than expected. + pass + + for k in idx._index_keys(): + del idx[k] + # TODO: delete the dangling reference this leaves behind + + idx._commit() + def _index_keys(self): keys = set(self._dirties.iterkeys()) keys |= frozenset(self._orig.iterkeys()) diff --git a/r2/r2/public/static/js/flair.js b/r2/r2/public/static/js/flair.js index 9c055e538..ec91599dd 100644 --- a/r2/r2/public/static/js/flair.js +++ b/r2/r2/public/static/js/flair.js @@ -112,6 +112,8 @@ $(function() { makeOnSubmit('flairtemplate')); $(".flairlist").delegate("form.flair-entry", "submit", makeOnSubmit('flair')); + $(".flairlist").delegate("form.clearflairtemplates", "submit", + makeOnSubmit('clearflairtemplates')); $(".flairlist").delegate(".flaircell input", "focus", onFocus); $(".flairlist").delegate(".flaircell input", "keyup", onEdit); $(".flairlist").delegate(".flaircell input", "change", onEdit); diff --git a/r2/r2/templates/flairtemplatelist.html b/r2/r2/templates/flairtemplatelist.html index d5a69cd0b..67d45ef32 100644 --- a/r2/r2/templates/flairtemplatelist.html +++ b/r2/r2/templates/flairtemplatelist.html @@ -41,4 +41,10 @@ ${FlairTemplateEditor(empty_template)} +