From 1aa8b6fd2b6ba491f161d115e630af67d0085718 Mon Sep 17 00:00:00 2001 From: Logan Hanks Date: Mon, 31 Oct 2011 10:34:44 -0700 Subject: [PATCH] Make it possible to unflair deleted accounts. --- r2/r2/controllers/api.py | 12 ++++++++---- r2/r2/controllers/validator/validator.py | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/r2/r2/controllers/api.py b/r2/r2/controllers/api.py index 1f27abee7..31d865aec 100644 --- a/r2/r2/controllers/api.py +++ b/r2/r2/controllers/api.py @@ -1896,7 +1896,8 @@ class ApiController(RedditController): @validatedForm(VFlairManager(), VModhash(), - user = VExistingUname("name"), + user = VExistingUname("name", allow_deleted=True, + prefer_existing=True), text = VFlairText("text"), css_class = VFlairCss("css_class")) def POST_flair(self, form, jquery, user, text, css_class): @@ -1941,7 +1942,8 @@ class ApiController(RedditController): @validatedForm(VFlairManager(), VModhash(), - user = VExistingUname("name")) + user = VExistingUname("name", allow_deleted=True, + prefer_existing=True)) def POST_deleteflair(self, form, jquery, user): # Check validation. if form.has_errors('name', errors.USER_DOESNT_EXIST, errors.NO_USER): @@ -1978,7 +1980,8 @@ class ApiController(RedditController): line_result.error('row', 'improperly formatted row, ignoring') continue - user = VExistingUname('name').run(name) + user = VExistingUname('name', allow_deleted=True, + prefer_existing=True).run(name) if not user: line_result.error('user', "unable to resolve user `%s', ignoring" @@ -2042,7 +2045,8 @@ class ApiController(RedditController): @paginated_listing(max_page_size=1000) @validate(VFlairManager(), - user = VOptionalExistingUname('name')) + user = VOptionalExistingUname('name', allow_deleted=True, + prefer_existing=True)) def GET_flairlist(self, num, after, reverse, count, user): flair = FlairList(num, after, reverse, '', user) return BoringPage(_("API"), content = flair).render() diff --git a/r2/r2/controllers/validator/validator.py b/r2/r2/controllers/validator/validator.py index 26df3114e..925c0fe0d 100644 --- a/r2/r2/controllers/validator/validator.py +++ b/r2/r2/controllers/validator/validator.py @@ -898,26 +898,37 @@ class VUrl(VRequired): return self.error(errors.BAD_URL) class VOptionalExistingUname(VRequired): - def __init__(self, item, allow_deleted=False, *a, **kw): + def __init__(self, item, allow_deleted=False, prefer_existing=False, + *a, **kw): self.allow_deleted = allow_deleted + self.prefer_existing = prefer_existing VRequired.__init__(self, item, errors.NO_USER, *a, **kw) def run(self, name): + if self.prefer_existing: + result = self._lookup(name, False) + if not result and self.allow_deleted: + result = self._lookup(name, True) + else: + result = self._lookup(name, self.allow_deleted) + return result or self.error(errors.USER_DOESNT_EXIST) + + def _lookup(self, name, allow_deleted): if name and name.startswith('~') and c.user_is_admin: try: user_id = int(name[1:]) return Account._byID(user_id, True) except (NotFound, ValueError): - return self.error(errors.USER_DOESNT_EXIST) + return None # make sure the name satisfies our user name regexp before # bothering to look it up. name = chkuser(name) if name: try: - return Account._by_name(name, allow_deleted=self.allow_deleted) + return Account._by_name(name, allow_deleted=allow_deleted) except NotFound: - return self.error(errors.USER_DOESNT_EXIST) + return None class VExistingUname(VOptionalExistingUname): def run(self, name):