def search_view(self, request, **kwargs): fields = self.list_fields or ['pk'] q = request.GET.get('q', None) qs = [] # Makes the cache key cache_key = self.make_search_cache_key(q) # Tries to return from cache first from_cache = cache.get(cache_key) if from_cache: return JsonResponse(from_cache) if q and self.search_fields: # Basic query qs = self.get_queryset(request) # Filter by query string criteria = dict([(k+'__icontains',q) for k in self.search_fields]) qs = qs.filter_if_any(**criteria) # Converts to values qs = qs.values(*fields) # Limited list results max_results = min([int(request.GET.get('_max', self.max_results)), self.max_results]) if max_results: qs = qs[:max_results] # Prepares for JSON and to store in cache results = [self.prepare_for_json(obj) for obj in qs] if app_settings.CACHE_TIMEOUT: cache.set(cache_key, results, app_settings.CACHE_TIMEOUT) return JsonResponse(results)
def minify(content, ext): """Uses YUICompressor to minify JavaScript and CSS content.""" hsh = hashlib.sha1(content).hexdigest() cache_key = 'minify-'+hsh # Loads from cache ret = cache.get(cache_key, None) if ret: return ret jar_path = app_settings.YUICOMPRESSOR_PATH # Saves content in temporary file f_name = hsh f_path = os.path.join(settings.TEMP_DIR, '%s-all.%s'%(f_name, ext)) new_path = os.path.join(settings.TEMP_DIR, '%s-min.%s'%(f_name, ext)) fp = file(f_path, 'w') fp.write(content) fp.close() # Runs YUICompressor os.system("%s -o %s %s"%(jar_path, new_path, f_path)) if app_settings.MINIFY and os.path.exists(new_path): # Checks if the minified file exists, otherwise returns the merged one fp = file(new_path) content = fp.read() fp.close() # Saves in cache cache.set(cache_key, content) return content
def get_source(self, environment, template): if ":" in template: active_theme, template_name = template.split(":", 1) active_theme = Theme.query().get(name=active_theme) elif getattr(environment, "theme", None): template_name = template active_theme = environment.theme else: template_name = template active_theme = None if app_settings.CACHE_EXPIRATION: try: active_theme = Theme.query().get(pk=cache.get("themes:active", None)) except Theme.DoesNotExist: pass if not active_theme: try: theme = Theme.query().get(is_default=True) if app_settings.CACHE_EXPIRATION: cache.set("themes:active", theme["pk"], app_settings.CACHE_EXPIRATION) active_theme = theme except Theme.DoesNotExist: # raise JinjaTemplateNotFound('There\'s no active theme.') pass try: reg_template = get_registered_template(template) except KeyError: if app_settings.ALLOW_NOT_REGISTERED: reg_template = {} else: raise JinjaTemplateNotFound('Template "%s" is not registered.' % template) content = None uptodate = lambda: True full_name = None engine = None if active_theme: try: # Using cache to restore/store template content cache_key = "themes:%s|%s" % (active_theme["name"], template_name) content = cache.get(cache_key, None) if app_settings.CACHE_EXPIRATION else None if not content or not content.split(";", 1)[-1] or content.split(";", 1)[-1] == "None": tpl = ThemeTemplate.query().get(theme=active_theme, name=template_name) engine = tpl["engine"] content = tpl["content"] if app_settings.CACHE_EXPIRATION: cache.set(cache_key, "engine:%s;%s" % (engine, content or ""), app_settings.CACHE_EXPIRATION) full_name = "%s:%s" % (active_theme["name"], template_name) except ThemeTemplate.DoesNotExist: content = None if reg_template and not content: content = reg_template.get("content", None) if not content: if ( reg_template and reg_template.get("mirroring", None) and reg_template.get("mirroring", None) != template_name ): # Trying this firstly... try: return self.get_source(environment, reg_template["mirroring"]) except JinjaTemplateNotFound as e: pass # If get no success, tries by the hardest way, from file system... ret = environment.get_template(reg_template["mirroring"]) if ret: f = open(ret.filename) try: contents = f.read() finally: f.close() return contents.decode("utf-8"), ret.filename, ret.is_up_to_date raise JinjaTemplateNotFound('Template "%s" doesn\'t exist in active theme.' % template_name) if content.startswith("engine:"): engine, content = content.split(";", 1) engine = engine.split(":")[1] return content, full_name, uptodate
def themetemplate_post_save(instance, sender, **kwargs): # Cache invalidation cache_key = 'themes:%s|%s'%(instance['theme']['name'], instance['name']) if app_settings.CACHE_EXPIRATION and cache.get(cache_key): cache.set(cache_key, None, 1) # Expires fastly, to clear cache storage