def rss_explore(request, tag_string, s_type=None): from apps.plus_lib.redis_lib import redis feed_type = 'rss2.0' # XXX decide how to send this as parameter to link key = "feed:" + feed_type + ":" + tag_string if redis.exists(key): return HttpResponse(redis.get(key), mimetype="application/xhtml+xml") else: feed = Rss201rev2Feed( title=settings.SITE_NAME + " : " + tag_string, link='http://' + settings.DOMAIN_NAME + reverse('explore_filtered_feed', args=(tag_string, )), description=_("Items tagged with %s" % tag_string)) # XXX decide how to parameterize which feed type, title, description, link form = SearchForm(request.GET) if form.is_valid(): search, order = set_search_order(request, form) else: search = '' order = '' side_search = side_search_args('', '') if s_type: search_types = narrow_search_types(s_type) else: search_types = get_search_types() head_title = settings.EXPLORE_NAME listing_args_dict = listing_args('explore', 'explore_filtered', tag_string=tag_string, search_terms=search, multitabbed=True, order=order, template_base="site_base.html", search_type_label=head_title) search_dict = plus_search(listing_args_dict['tag_filter'], search, search_types, order) for item_ref in search_dict['All']: item = item_ref.obj item = secure_wrap(item, request.user) try: feed.add_item(title=item.get_display_name(), link=item.get_url(), description=item.get_description(), author_name=item.get_author_name(), author_copyright=item.get_author_copyright(), pubdate=item.get_created_date(), **(item.get_feed_extras())) except PlusPermissionsNoAccessException, e: pass feed_string = feed.writeString('utf-8') # uncomment the following when we start to cache #redis.set(key,feed_string) #redis.expire(key,60*60*1) # sets expire every 1 hour return HttpResponse(feed_string, mimetype="application/xhtml+xml")
def get_enclosure_set(self, seen=None): key = cache_key(MULTI_LEVEL_MEMBERSHIP_KEY, self) if redis.exists(key): return TgGroup.objects.filter(id__in=redis.smembers(key)) es = get_enclosure_id_set(self.__class__, self.id) add_to_cached_set(key, es) return TgGroup.objects.filter(id__in=[x for x in es])
def get_enclosure_set(self, seen=None): key = cache_key(MULTI_LEVEL_MEMBERSHIP_KEY, self) if redis.exists(key) : return TgGroup.objects.filter(id__in=redis.smembers(key)) es = get_enclosure_id_set(self.__class__, self.id) add_to_cached_set(key, es) return TgGroup.objects.filter(id__in=[x for x in es])
def rss_explore(request, tag_string, s_type=None) : from apps.plus_lib.redis_lib import redis feed_type = 'rss2.0' # XXX decide how to send this as parameter to link key = "feed:"+feed_type+":"+tag_string if redis.exists(key) : return HttpResponse(redis.get(key),mimetype="application/xhtml+xml") else : feed = Rss201rev2Feed(title=settings.SITE_NAME+" : "+tag_string, link='http://'+settings.DOMAIN_NAME+reverse('explore_filtered_feed',args=(tag_string,)), description=_("Items tagged with %s" % tag_string) ) # XXX decide how to parameterize which feed type, title, description, link form = SearchForm(request.GET) if form.is_valid(): search, order = set_search_order(request, form) else: search = '' order = '' side_search = side_search_args('', '') if s_type : search_types = narrow_search_types(s_type) else : search_types = get_search_types() head_title = settings.EXPLORE_NAME listing_args_dict = listing_args('explore', 'explore_filtered', tag_string=tag_string, search_terms=search, multitabbed=True, order=order, template_base="site_base.html", search_type_label=head_title) search_dict = plus_search(listing_args_dict['tag_filter'], search, search_types, order) for item_ref in search_dict['All']: item = item_ref.obj item=secure_wrap(item,request.user) try : feed.add_item(title=item.get_display_name(), link=item.get_url(), description=item.get_description(), author_name=item.get_author_name(), author_copyright=item.get_author_copyright(), pubdate=item.get_created_date(), **(item.get_feed_extras()) ) except PlusPermissionsNoAccessException, e : pass feed_string = feed.writeString('utf-8') # uncomment the following when we start to cache #redis.set(key,feed_string) #redis.expire(key,60*60*1) # sets expire every 1 hour return HttpResponse(feed_string, mimetype="application/xhtml+xml")
def get_enclosure_ids(cls, id): """ Note, these are depth 1 membership ids. And note also that all enclosures, are, by definition TgGroup cls is the actual python class (django model class) ... cache_key takes its name """ key = cache_key(ONE_LEVEL_MEMBERSHIP_KEY, cls=cls, id=id) if redis.exists(key): return redis.smembers(key) # if not cached, get the object and get its enclosures obj = cls.objects.get(id=id) memberships = set([x.id for x in obj.get_enclosures()]) add_to_cached_set(key, memberships) return memberships
def get_enclosure_ids(cls,id) : """ Note, these are depth 1 membership ids. And note also that all enclosures, are, by definition TgGroup cls is the actual python class (django model class) ... cache_key takes its name """ key = cache_key(ONE_LEVEL_MEMBERSHIP_KEY, cls=cls, id=id) if redis.exists(key) : return redis.smembers(key) # if not cached, get the object and get its enclosures obj = cls.objects.get(id=id) memberships = set([x.id for x in obj.get_enclosures()]) add_to_cached_set(key, memberships) return memberships
def get_for(self, receiver, start_stop = None) : """ Feed items for receiver. If we already have a redis list for this receiver, then just pull from it, otherwise, recreate from db receiver is user or group""" key = feed_for_key(receiver) if redis.exists(key) : if not start_stop : start,stop=[0,39] else : start,stop = start_stop ids = redis.lrange(key,start,stop) else : # ok, we're going to recreate the whole feed again ids = recreate_feed(key, receiver) return self.filter(id__in=ids).order_by('-sent')
def get_enclosures(self, levels=None) : # XXX TO-DO given that this is now different for Users and Groups # no need to have one function assigned to both with a different test # just put different versions into respective classes """Give us all the things of which this user/group is a member_of """ key = cache_key(ONE_LEVEL_MEMBERSHIP_KEY, self) if redis.exists(key) : return TgGroup.objects.filter(id__in=get_enclosure_ids(self.__class__, self.id)) if levels == None: levels = ['member', 'host', 'public'] if isinstance(self, User): return self.groups.filter(level__in=levels) elif isinstance(self, TgGroup): return self.parent_groups.filter(level__in=levels)
def get_enclosures(self, levels=None): # XXX TO-DO given that this is now different for Users and Groups # no need to have one function assigned to both with a different test # just put different versions into respective classes """Give us all the things of which this user/group is a member_of """ key = cache_key(ONE_LEVEL_MEMBERSHIP_KEY, self) if redis.exists(key): return TgGroup.objects.filter( id__in=get_enclosure_ids(self.__class__, self.id)) if levels == None: levels = ['member', 'host', 'public'] if isinstance(self, User): return self.groups.filter(level__in=levels) elif isinstance(self, TgGroup): return self.parent_groups.filter(level__in=levels)
def get_enclosure_id_set(cls, self_id, seen=None): key = cache_key(MULTI_LEVEL_MEMBERSHIP_KEY, cls=cls, id=self_id) if redis.exists(key): return redis.smembers(key) if not seen: seen = set([self_id]) if cls == TgGroup: es = set([self_id]) else: es = set([]) for e_id in get_enclosure_ids(cls, self_id): if e_id not in seen: seen.add(e_id) multi_memberships = get_enclosure_id_set(TgGroup, e_id, seen) es = es.union(set(multi_memberships)) seen = seen.union([m for m in multi_memberships]) add_to_cached_set(key, es) return es
def get_enclosure_id_set(cls, self_id, seen=None) : key = cache_key(MULTI_LEVEL_MEMBERSHIP_KEY,cls=cls, id=self_id) if redis.exists(key) : return redis.smembers(key) if not seen : seen = set([self_id]) if cls == TgGroup : es = set([self_id]) else : es = set([]) for e_id in get_enclosure_ids(cls, self_id ) : if e_id not in seen : seen.add(e_id) multi_memberships = get_enclosure_id_set(TgGroup, e_id, seen) es = es.union(set(multi_memberships)) seen = seen.union([m for m in multi_memberships]) add_to_cached_set(key, es) return es