def _get_context(self, environ, davres): """ @see: http://www.webdav.org/specs/rfc4918.html#rfc.section.9.4 """ assert davres.is_collection dirConfig = environ["wsgidav.config"].get("dir_browser", {}) isReadOnly = environ["wsgidav.provider"].is_readonly() context = { "htdocs": (self.config.get("mount_path") or "") + ASSET_SHARE, "rows": [], "version": __version__, "displaypath": compat.unquote(davres.get_href()), "url": davres.get_href(), # util.make_complete_url(environ), "parentUrl": util.get_uri_parent(davres.get_href()), "config": dirConfig, "is_readonly": isReadOnly, } trailer = dirConfig.get("response_trailer") if trailer is True: trailer = "${version} - ${time}" if trailer: trailer = trailer.replace( "${version}", "<a href='https://github.com/mar10/wsgidav/'>WsgiDAV/{}</a>".format( __version__ ), ) trailer = trailer.replace("${time}", util.get_rfc1123_time()) context["trailer"] = trailer rows = context["rows"] # Ask collection for member info list dirInfoList = davres.get_directory_info() if dirInfoList is None: # No pre-build info: traverse members dirInfoList = [] childList = davres.get_descendants(depth="1", addSelf=False) for res in childList: di = res.get_display_info() href = res.get_href() classes = [] if res.is_collection: classes.append("directory") if not isReadOnly and not res.is_collection: ext = os.path.splitext(href)[1].lstrip(".").lower() officeType = msOfficeExtToTypeMap.get(ext) if officeType: if dirConfig.get("ms_sharepoint_plugin"): classes.append("msoffice") elif dirConfig.get("ms_sharepoint_urls"): href = "ms-{}:ofe|u|{}".format(officeType, href) entry = { "href": href, "class": " ".join(classes), "displayName": res.get_display_name(), "lastModified": res.get_last_modified(), "is_collection": res.is_collection, "contentLength": res.get_content_length(), "displayType": di.get("type"), "displayTypeComment": di.get("typeComment"), } dirInfoList.append(entry) # ignore_patterns = dirConfig.get("ignore", []) if compat.is_basestring(ignore_patterns): ignore_patterns = ignore_patterns.split(",") for entry in dirInfoList: # Skip ignore patterns ignore = False for pat in ignore_patterns: if fnmatch(entry["displayName"], pat): _logger.debug("Ignore {}".format(entry["displayName"])) ignore = True break if ignore: continue # lastModified = entry.get("lastModified") if lastModified is None: entry["strModified"] = "" else: entry["strModified"] = util.get_rfc1123_time(lastModified) entry["strSize"] = "-" if not entry.get("is_collection"): contentLength = entry.get("contentLength") if contentLength is not None: entry["strSize"] = util.byte_number_string(contentLength) rows.append(entry) # sort sort = "name" if sort == "name": rows.sort( key=lambda v: "{}{}".format( not v["is_collection"], v["displayName"].lower() ) ) if "http_authenticator.username" in environ: context["username"] = ( environ.get("http_authenticator.username") or "anonymous" ) context["realm"] = environ.get("http_authenticator.realm") return context
def _get_context(self, environ, dav_res): """ @see: http://www.webdav.org/specs/rfc4918.html#rfc.section.9.4 """ assert dav_res.is_collection is_readonly = environ["wsgidav.provider"].is_readonly() context = { "htdocs": (self.config.get("mount_path") or "") + ASSET_SHARE, "rows": [], "version": __version__, "display_path": compat.unquote(dav_res.get_href()), "url": dav_res.get_href(), # util.make_complete_url(environ), "parent_url": util.get_uri_parent(dav_res.get_href()), "config": self.dir_config, "is_readonly": is_readonly, "access": "read-only" if is_readonly else "read-write", "is_authenticated": False, } trailer = self.dir_config.get("response_trailer") if trailer is True: trailer = "${version} - ${time}" if trailer: trailer = trailer.replace( "${version}", "<a href='https://github.com/mar10/wsgidav/'>WsgiDAV/{}</a>".format( __version__ ), ) trailer = trailer.replace("${time}", util.get_rfc1123_time()) context["trailer"] = trailer rows = context["rows"] # Ask collection for member info list dirInfoList = dav_res.get_directory_info() if dirInfoList is None: # No pre-build info: traverse members dirInfoList = [] childList = dav_res.get_descendants(depth="1", add_self=False) for res in childList: di = res.get_display_info() href = res.get_href() ofe_prefix = None tr_classes = [] a_classes = [] if res.is_collection: tr_classes.append("directory") if not is_readonly and not res.is_collection: ext = os.path.splitext(href)[1].lstrip(".").lower() officeType = msOfficeExtToTypeMap.get(ext) if officeType: if self.dir_config.get("ms_sharepoint_support"): ofe_prefix = "ms-{}:ofe|u|".format(officeType) a_classes.append("msoffice") # elif self.dir_config.get("ms_sharepoint_plugin"): # a_classes.append("msoffice") # elif self.dir_config.get("ms_sharepoint_urls"): # href = "ms-{}:ofe|u|{}".format(officeType, href) entry = { "href": href, "ofe_prefix": ofe_prefix, "a_class": " ".join(a_classes), "tr_class": " ".join(tr_classes), "display_name": res.get_display_name(), "last_modified": res.get_last_modified(), "is_collection": res.is_collection, "content_length": res.get_content_length(), "display_type": di.get("type"), "display_type_comment": di.get("typeComment"), } dirInfoList.append(entry) # ignore_patterns = self.dir_config.get("ignore", []) if compat.is_basestring(ignore_patterns): ignore_patterns = ignore_patterns.split(",") ignored_list = [] for entry in dirInfoList: # Skip ignore patterns ignore = False for pat in ignore_patterns: if fnmatch(entry["display_name"], pat): ignored_list.append(entry["display_name"]) # _logger.debug("Ignore {}".format(entry["display_name"])) ignore = True break if ignore: continue # last_modified = entry.get("last_modified") if last_modified is None: entry["str_modified"] = "" else: entry["str_modified"] = util.get_rfc1123_time(last_modified) entry["str_size"] = "-" if not entry.get("is_collection"): content_length = entry.get("content_length") if content_length is not None: entry["str_size"] = util.byte_number_string(content_length) rows.append(entry) if ignored_list: _logger.debug( "Dir browser ignored {} entries: {}".format( len(ignored_list), ignored_list ) ) # sort sort = "name" if sort == "name": rows.sort( key=lambda v: "{}{}".format( not v["is_collection"], v["display_name"].lower() ) ) if "wsgidav.auth.user_name" in environ: context.update( { "is_authenticated": True, "user_name": (environ.get("wsgidav.auth.user_name") or "anonymous"), "realm": environ.get("wsgidav.auth.realm"), "user_roles": ", ".join(environ.get("wsgidav.auth.roles") or []), "user_permissions": ", ".join( environ.get("wsgidav.auth.permissions") or [] ), } ) return context