| Conditions | 21 | 
| Total Lines | 165 | 
| Code Lines | 119 | 
| Lines | 0 | 
| Ratio | 0 % | 
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Complex classes like backend.tracim_backend.lib.webdav.dav_provider.Provider.getResourceInst() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
| 1 | # coding: utf8 | ||
| 62 | def getResourceInst(self, path: str, environ: dict): | ||
| 63 | """ | ||
| 64 | Called by wsgidav whenever a request is called to get the _DAVResource corresponding to the path | ||
| 65 | """ | ||
| 66 | user = environ['tracim_user'] | ||
| 67 | session = environ['tracim_dbsession'] | ||
| 68 | if not self.exists(path, environ): | ||
| 69 | return None | ||
| 70 | path = normpath(path) | ||
| 71 | root_path = environ['http_authenticator.realm'] | ||
| 72 | |||
| 73 | # If the requested path is the root, then we return a RootResource resource | ||
| 74 | if path == root_path: | ||
| 75 | return resources.RootResource( | ||
| 76 | path=path, | ||
| 77 | environ=environ, | ||
| 78 | user=user, | ||
| 79 | session=session | ||
| 80 | ) | ||
| 81 | |||
| 82 | workspace_api = WorkspaceApi( | ||
| 83 | current_user=user, | ||
| 84 | session=session, | ||
| 85 | config=self.app_config, | ||
| 86 | ) | ||
| 87 | workspace = self.get_workspace_from_path(path, workspace_api) | ||
| 88 | |||
| 89 | # If the request path is in the form root/name, then we return a WorkspaceResource resource | ||
| 90 | parent_path = dirname(path) | ||
| 91 | if parent_path == root_path: | ||
| 92 | if not workspace: | ||
| 93 | return None | ||
| 94 | return resources.WorkspaceResource( | ||
| 95 | path=path, | ||
| 96 | environ=environ, | ||
| 97 | workspace=workspace, | ||
| 98 | user=user, | ||
| 99 | session=session, | ||
| 100 | ) | ||
| 101 | |||
| 102 | # And now we'll work on the path to establish which type or resource is requested | ||
| 103 | |||
| 104 | content_api = ContentApi( | ||
| 105 | current_user=user, | ||
| 106 | session=session, | ||
| 107 | config=self.app_config, | ||
| 108 | show_archived=False, # self._show_archive, | ||
| 109 | show_deleted=False, # self._show_delete | ||
| 110 | ) | ||
| 111 | |||
| 112 | content = self.get_content_from_path( | ||
| 113 | path=path, | ||
| 114 | content_api=content_api, | ||
| 115 | workspace=workspace | ||
| 116 | ) | ||
| 117 | |||
| 118 | |||
| 119 | # Easy cases : path either end with /.deleted, /.archived or /.history, then we return corresponding resources | ||
| 120 | if path.endswith(SpecialFolderExtension.Archived) and self._show_archive: | ||
| 121 | return resources.ArchivedFolderResource( | ||
| 122 | path=path, | ||
| 123 | environ=environ, | ||
| 124 | workspace=workspace, | ||
| 125 | user=user, | ||
| 126 | content=content, | ||
| 127 | session=session, | ||
| 128 | ) | ||
| 129 | |||
| 130 | if path.endswith(SpecialFolderExtension.Deleted) and self._show_delete: | ||
| 131 | return resources.DeletedFolderResource( | ||
| 132 | path=path, | ||
| 133 | environ=environ, | ||
| 134 | workspace=workspace, | ||
| 135 | user=user, | ||
| 136 | content=content, | ||
| 137 | session=session, | ||
| 138 | ) | ||
| 139 | |||
| 140 | if path.endswith(SpecialFolderExtension.History) and self._show_history: | ||
| 141 | is_deleted_folder = re.search(r'/\.deleted/\.history$', path) is not None | ||
| 142 | is_archived_folder = re.search(r'/\.archived/\.history$', path) is not None | ||
| 143 | |||
| 144 | type = HistoryType.Deleted if is_deleted_folder \ | ||
| 145 | else HistoryType.Archived if is_archived_folder \ | ||
| 146 | else HistoryType.Standard | ||
| 147 | |||
| 148 | return resources.HistoryFolderResource( | ||
| 149 | path=path, | ||
| 150 | environ=environ, | ||
| 151 | workspace=workspace, | ||
| 152 | user=user, | ||
| 153 | content=content, | ||
| 154 | session=session, | ||
| 155 | type=type | ||
| 156 | ) | ||
| 157 | |||
| 158 | # Now that's more complicated, we're trying to find out if the path end with /.history/file_name | ||
| 159 | is_history_file_folder = re.search(r'/\.history/([^/]+)$', path) is not None | ||
| 160 | |||
| 161 | if is_history_file_folder and self._show_history: | ||
| 162 | return resources.HistoryFileFolderResource( | ||
| 163 | path=path, | ||
| 164 | environ=environ, | ||
| 165 | user=user, | ||
| 166 | content=content, | ||
| 167 | session=session, | ||
| 168 | ) | ||
| 169 | # And here next step : | ||
| 170 | is_history_file = re.search(r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) .+', path) is not None | ||
| 171 | |||
| 172 | if self._show_history and is_history_file: | ||
| 173 | |||
| 174 | revision_id = re.search(r'/\.history/[^/]+/\((\d+) - [a-zA-Z]+\) ([^/].+)$', path).group(1) | ||
| 175 | |||
| 176 | content_revision = content_api.get_one_revision(revision_id) | ||
| 177 | content = self.get_content_from_revision(content_revision, content_api) | ||
| 178 | |||
| 179 | if content.type == content_type_list.File.slug: | ||
| 180 | return resources.HistoryFileResource( | ||
| 181 | path=path, | ||
| 182 | environ=environ, | ||
| 183 | user=user, | ||
| 184 | content=content, | ||
| 185 | content_revision=content_revision, | ||
| 186 | session=session, | ||
| 187 | ) | ||
| 188 | else: | ||
| 189 | return resources.HistoryOtherFile( | ||
| 190 | path=path, | ||
| 191 | environ=environ, | ||
| 192 | user=user, | ||
| 193 | content=content, | ||
| 194 | content_revision=content_revision, | ||
| 195 | session=session, | ||
| 196 | ) | ||
| 197 | |||
| 198 | # And if we're still going, the client is asking for a standard Folder/File/Page/Thread so we check the type7 | ||
| 199 | # and return the corresponding resource | ||
| 200 | |||
| 201 | if content is None: | ||
| 202 | return None | ||
| 203 | if content.type == content_type_list.Folder.slug: | ||
| 204 | return resources.FolderResource( | ||
| 205 | path=path, | ||
| 206 | environ=environ, | ||
| 207 | workspace=content.workspace, | ||
| 208 | content=content, | ||
| 209 | session=session, | ||
| 210 | user=user, | ||
| 211 | ) | ||
| 212 | elif content.type == content_type_list.File.slug: | ||
| 213 | return resources.FileResource( | ||
| 214 | path=path, | ||
| 215 | environ=environ, | ||
| 216 | content=content, | ||
| 217 | session=session, | ||
| 218 | user=user | ||
| 219 | ) | ||
| 220 | else: | ||
| 221 | return resources.OtherFileResource( | ||
| 222 | path=path, | ||
| 223 | environ=environ, | ||
| 224 | content=content, | ||
| 225 | session=session, | ||
| 226 | user=user, | ||
| 227 | ) | ||
| 373 |