|  | 
| 49 | 49 | from sqlalchemy.orm.exc import NoResultFound | 
| 50 | 50 | from werkzeug.local import LocalProxy | 
| 51 | 51 | 
 | 
|  | 52 | +from cap.modules.auth.ext import _fetch_token | 
| 52 | 53 | from cap.modules.deposit.errors import DisconnectWebhookError, FileUploadError | 
| 53 | 54 | from cap.modules.deposit.validators import NoRequiredValidator | 
| 54 | 55 | from cap.modules.experiments.permissions import exp_need_factory | 
|  | 
| 76 | 77 |                           UpdateDepositPermission) | 
| 77 | 78 | 
 | 
| 78 | 79 | from .review import Reviewable | 
|  | 80 | +from .tasks import upload_to_zenodo | 
|  | 81 | +from .utils import create_zenodo_deposit | 
| 79 | 82 | 
 | 
| 80 | 83 | _datastore = LocalProxy(lambda: current_app.extensions['security'].datastore) | 
| 81 | 84 | 
 | 
| @@ -256,53 +259,82 @@ def upload(self, pid, *args, **kwargs): | 
| 256 | 259 |                 _, rec = request.view_args.get('pid_value').data | 
| 257 | 260 |                 record_uuid = str(rec.id) | 
| 258 | 261 |                 data = request.get_json() | 
| 259 |  | -                webhook = data.get('webhook', False) | 
| 260 |  | -                event_type = data.get('event_type', 'release') | 
| 261 |  | - | 
| 262 |  | -                try: | 
| 263 |  | -                    url = data['url'] | 
| 264 |  | -                except KeyError: | 
| 265 |  | -                    raise FileUploadError('Missing url parameter.') | 
| 266 |  | - | 
| 267 |  | -                try: | 
| 268 |  | -                    host, owner, repo, branch, filepath = parse_git_url(url) | 
| 269 |  | -                    api = create_git_api(host, owner, repo, branch, | 
| 270 |  | -                                         current_user.id) | 
| 271 |  | - | 
| 272 |  | -                    if filepath: | 
| 273 |  | -                        if webhook: | 
| 274 |  | -                            raise FileUploadError( | 
| 275 |  | -                                'You cannot create a webhook on a file') | 
| 276 |  | - | 
| 277 |  | -                        download_repo_file( | 
| 278 |  | -                            record_uuid, | 
| 279 |  | -                            f'repositories/{host}/{owner}/{repo}/{api.branch or api.sha}/{filepath}',  # noqa | 
| 280 |  | -                            *api.get_file_download(filepath), | 
| 281 |  | -                            api.auth_headers, | 
| 282 |  | -                        ) | 
| 283 |  | -                    elif webhook: | 
| 284 |  | -                        if event_type == 'release': | 
| 285 |  | -                            if branch: | 
| 286 |  | -                                raise FileUploadError( | 
| 287 |  | -                                    'You cannot create a release webhook' | 
| 288 |  | -                                    ' for a specific branch or sha.') | 
|  | 262 | +                target = data.get('target') | 
|  | 263 | + | 
|  | 264 | +                if target == 'zenodo': | 
|  | 265 | +                    # check for token | 
|  | 266 | +                    token = _fetch_token('zenodo') | 
|  | 267 | +                    if not token: | 
|  | 268 | +                        raise FileUploadError( | 
|  | 269 | +                            'Please connect your Zenodo account ' | 
|  | 270 | +                            'before creating a deposit.') | 
|  | 271 | + | 
|  | 272 | +                    files = data.get('files') | 
|  | 273 | +                    bucket = data.get('bucket') | 
|  | 274 | +                    zenodo_data = data.get('zenodo_data', {}) | 
|  | 275 | + | 
|  | 276 | +                    if files and bucket: | 
|  | 277 | +                        zenodo_deposit = create_zenodo_deposit(token, zenodo_data)  # noqa | 
|  | 278 | +                        self.setdefault('_zenodo', []).append(zenodo_deposit) | 
|  | 279 | +                        self.commit() | 
|  | 280 | + | 
|  | 281 | +                        # upload files to zenodo deposit | 
|  | 282 | +                        upload_to_zenodo.delay( | 
|  | 283 | +                            files, bucket, token, | 
|  | 284 | +                            zenodo_deposit['id'], | 
|  | 285 | +                            zenodo_deposit['links']['bucket']) | 
|  | 286 | +                    else: | 
|  | 287 | +                        raise FileUploadError( | 
|  | 288 | +                            'You cannot create an empty Zenodo deposit. ' | 
|  | 289 | +                            'Please add some files.') | 
|  | 290 | +                else: | 
|  | 291 | +                    webhook = data.get('webhook', False) | 
|  | 292 | +                    event_type = data.get('event_type', 'release') | 
| 289 | 293 | 
 | 
| 290 |  | -                        if event_type == 'push' and \ | 
| 291 |  | -                                api.branch is None and api.sha: | 
| 292 |  | -                            raise FileUploadError( | 
| 293 |  | -                                'You cannot create a push webhook' | 
| 294 |  | -                                ' for a specific sha.') | 
|  | 294 | +                    try: | 
|  | 295 | +                        url = data['url'] | 
|  | 296 | +                    except KeyError: | 
|  | 297 | +                        raise FileUploadError('Missing url parameter.') | 
| 295 | 298 | 
 | 
| 296 |  | -                        create_webhook(record_uuid, api, event_type) | 
| 297 |  | -                    else: | 
| 298 |  | -                        download_repo.delay( | 
| 299 |  | -                            record_uuid, | 
| 300 |  | -                            f'repositories/{host}/{owner}/{repo}/{api.branch or api.sha}.tar.gz',  # noqa | 
| 301 |  | -                            api.get_repo_download(), | 
| 302 |  | -                            api.auth_headers) | 
| 303 |  | - | 
| 304 |  | -                except GitError as e: | 
| 305 |  | -                    raise FileUploadError(str(e)) | 
|  | 299 | +                    try: | 
|  | 300 | +                        host, owner, repo, branch, filepath = parse_git_url(url)  # noqa | 
|  | 301 | +                        api = create_git_api(host, owner, repo, branch, | 
|  | 302 | +                                             current_user.id) | 
|  | 303 | + | 
|  | 304 | +                        if filepath: | 
|  | 305 | +                            if webhook: | 
|  | 306 | +                                raise FileUploadError( | 
|  | 307 | +                                    'You cannot create a webhook on a file') | 
|  | 308 | + | 
|  | 309 | +                            download_repo_file( | 
|  | 310 | +                                record_uuid, | 
|  | 311 | +                                f'repositories/{host}/{owner}/{repo}/{api.branch or api.sha}/{filepath}',  # noqa | 
|  | 312 | +                                *api.get_file_download(filepath), | 
|  | 313 | +                                api.auth_headers, | 
|  | 314 | +                            ) | 
|  | 315 | +                        elif webhook: | 
|  | 316 | +                            if event_type == 'release': | 
|  | 317 | +                                if branch: | 
|  | 318 | +                                    raise FileUploadError( | 
|  | 319 | +                                        'You cannot create a release webhook' | 
|  | 320 | +                                        ' for a specific branch or sha.') | 
|  | 321 | + | 
|  | 322 | +                            if event_type == 'push' and \ | 
|  | 323 | +                                    api.branch is None and api.sha: | 
|  | 324 | +                                raise FileUploadError( | 
|  | 325 | +                                    'You cannot create a push webhook' | 
|  | 326 | +                                    ' for a specific sha.') | 
|  | 327 | + | 
|  | 328 | +                            create_webhook(record_uuid, api, event_type) | 
|  | 329 | +                        else: | 
|  | 330 | +                            download_repo.delay( | 
|  | 331 | +                                record_uuid, | 
|  | 332 | +                                f'repositories/{host}/{owner}/{repo}/{api.branch or api.sha}.tar.gz',  # noqa | 
|  | 333 | +                                api.get_repo_download(), | 
|  | 334 | +                                api.auth_headers) | 
|  | 335 | + | 
|  | 336 | +                    except GitError as e: | 
|  | 337 | +                        raise FileUploadError(str(e)) | 
| 306 | 338 | 
 | 
| 307 | 339 |             return self | 
| 308 | 340 | 
 | 
|  | 
0 commit comments