diff --git a/r2/r2/lib/db/userrel.py b/r2/r2/lib/db/userrel.py index 2551952db..f70de305e 100644 --- a/r2/r2/lib/db/userrel.py +++ b/r2/r2/lib/db/userrel.py @@ -21,7 +21,7 @@ ################################################################################ from r2.lib.memoize import memoize, clear_memo -def UserRel(name, relation): +def UserRel(name, relation, disable_ids_fn = False, disable_reverse_ids_fn = False): exists_fn_name = 'is_' + name def userrel_exists(self, user): @@ -33,6 +33,14 @@ def UserRel(name, relation): if r: return r + update_caches_fn_name = name + 'update_' + name + '_caches' + def update_caches(self, user): + if not disable_ids_fn: + getattr(self, ids_fn_name)(_update = True) + + if not disable_reverse_ids_fn: + getattr(self, reverse_ids_fn_name)(user, _update = True) + add_fn_name = 'add_' + name def userrel_add(self, user): fn = getattr(self, exists_fn_name) @@ -41,11 +49,7 @@ def UserRel(name, relation): s._commit() #update caches - clear_memo(ids_fn_name, self) - clear_memo(reverse_ids_fn_name, user) - - #getattr(self, ids_fn_name)(_update = True) - #getattr(self, reverse_ids_fn_name)(user, _update = True) + getattr(self, update_caches_fn_name)(user) return s remove_fn_name = 'remove_' + name @@ -56,11 +60,7 @@ def UserRel(name, relation): s._delete() #update caches - clear_memo(ids_fn_name, self) - clear_memo(reverse_ids_fn_name, user) - - #getattr(self, ids_fn_name)(_update = True) - #getattr(self, reverse_ids_fn_name)(user, _update = True) + getattr(self, update_caches_fn_name)(user) return True ids_fn_name = name + '_ids' @@ -81,11 +81,14 @@ def UserRel(name, relation): class UR: pass + setattr(UR, update_caches_fn_name, update_caches) setattr(UR, exists_fn_name, userrel_exists) setattr(UR, add_fn_name, userrel_add) setattr(UR, remove_fn_name, userrel_remove) - setattr(UR, ids_fn_name, userrel_ids) - setattr(UR, reverse_ids_fn_name, reverse_ids) + if not disable_ids_fn: + setattr(UR, ids_fn_name, userrel_ids) + if not disable_reverse_ids_fn: + setattr(UR, reverse_ids_fn_name, reverse_ids) return UR diff --git a/r2/r2/models/account.py b/r2/r2/models/account.py index ed9572a56..aedfc74ff 100644 --- a/r2/r2/models/account.py +++ b/r2/r2/models/account.py @@ -304,7 +304,7 @@ def register(name, password): return a class Friend(Relation(Account, Account)): pass -Account.__bases__ += (UserRel('friend', Friend),) +Account.__bases__ += (UserRel('friend', Friend, disable_reverse_ids_fn = True),) class DeletedUser(FakeAccount): @property diff --git a/r2/r2/models/subreddit.py b/r2/r2/models/subreddit.py index fa852e536..9ae0796ef 100644 --- a/r2/r2/models/subreddit.py +++ b/r2/r2/models/subreddit.py @@ -322,6 +322,9 @@ class Subreddit(Thing, Printable): def subscribe_defaults(cls, user): if not user.has_subscribed: for sr in Subreddit.default_srs(c.content_langs): + #this will call reverse_subscriber_ids after every + #addition. if it becomes a problem we should make an + #add_multiple_subscriber fn if sr.add_subscriber(c.user): sr._incr('_ups', 1) user.has_subscribed = True @@ -574,5 +577,5 @@ Default = DefaultSR() class SRMember(Relation(Subreddit, Account)): pass Subreddit.__bases__ += (UserRel('moderator', SRMember), UserRel('contributor', SRMember), - UserRel('subscriber', SRMember), + UserRel('subscriber', SRMember, disable_ids_fn = True), UserRel('banned', SRMember))