def post(self, repository_id):
        repo = Repository.query.get(repository_id)
        if repo is None:
            return "", 404

        args = self.parser.parse_args()

        if args.url:
            repo.url = args.url
        if args.backend:
            repo.backend = RepositoryBackend[args.backend]

        needs_import = False
        if args.status == "inactive":
            repo.status = RepositoryStatus.inactive
        elif args.status == "active" and repo.status == RepositoryStatus.inactive:
            repo.status = RepositoryStatus.active
            needs_import = True

        db.session.add(repo)
        db.session.commit()

        if needs_import:
            import_repo.delay_if_needed(repo_id=repo.id.hex, task_id=repo.id.hex)

        return self.respond(repo)
    def post(self, repository_id):
        repo = Repository.query.get(repository_id)
        if repo is None:
            return '', 404

        args = self.parser.parse_args()

        if args.url:
            repo.url = args.url
        if args.backend:
            repo.backend = RepositoryBackend[args.backend]

        needs_import = False
        if args.status == 'inactive':
            repo.status = RepositoryStatus.inactive
        elif args.status == 'active' and repo.status == RepositoryStatus.inactive:
            repo.status = RepositoryStatus.active
            needs_import = True

        db.session.add(repo)

        for name in OPTION_DEFAULTS.keys():
            value = args[name]
            if value is None:
                continue

            # special case phabricator.callsign since we can't enforce a unique
            # constraint
            if name == 'phabricator.callsign':
                existing = ItemOption.query.filter(
                    ItemOption.item_id != repo.id,
                    ItemOption.name == name,
                    ItemOption.value == value,
                ).first()
                if existing:
                    return '{"error": "A repository already exists with the given Phabricator callsign"}', 400

            create_or_update(ItemOption,
                             where={
                                 'item_id': repo.id,
                                 'name': name,
                             },
                             values={
                                 'value': value,
                             })

        db.session.commit()

        if needs_import:
            import_repo.delay_if_needed(
                repo_id=repo.id.hex,
                task_id=repo.id.hex,
            )

        context = self.serialize(repo)
        context['options'] = self._get_options(repo)

        return self.respond(context, serialize=False)
Example #3
0
    def post(self, repository_id):
        repo = Repository.query.get(repository_id)
        if repo is None:
            return '', 404

        args = self.parser.parse_args()

        if args.url:
            repo.url = args.url
        if args.backend:
            repo.backend = RepositoryBackend[args.backend]

        needs_import = False
        if args.status == 'inactive':
            repo.status = RepositoryStatus.inactive
        elif args.status == 'active' and repo.status == RepositoryStatus.inactive:
            repo.status = RepositoryStatus.active
            needs_import = True

        db.session.add(repo)

        for name in OPTION_DEFAULTS.keys():
            value = args[name]
            if value is None:
                continue

            # special case phabricator.callsign since we can't enforce a unique
            # constraint
            if name == 'phabricator.callsign':
                existing = ItemOption.query.filter(
                    ItemOption.item_id != repo.id,
                    ItemOption.name == name,
                    ItemOption.value == value,
                ).first()
                if existing:
                    return '{"error": "A repository already exists with the given Phabricator callsign"}', 400

            create_or_update(ItemOption, where={
                'item_id': repo.id,
                'name': name,
            }, values={
                'value': value,
            })

        db.session.commit()

        if needs_import:
            import_repo.delay_if_needed(
                repo_id=repo.id.hex,
                task_id=repo.id.hex,
            )

        context = self.serialize(repo)
        context['options'] = self._get_options(repo)

        return self.respond(context, serialize=False)