Added utility to find project ID from URL.

This is mostly useful for the CLI interface, as the majority of our Pillar
code actually needs more project information than just the ID.
This commit is contained in:
Sybren A. Stüvel 2017-11-03 14:33:19 +01:00
parent 33d3ff07db
commit 390d687f61
2 changed files with 41 additions and 1 deletions

View File

@ -1,10 +1,10 @@
import logging
from bson import ObjectId
from flask import current_app
from werkzeug import exceptions as wz_exceptions
from werkzeug.exceptions import abort
from pillar import current_app
from pillar.auth import current_user
log = logging.getLogger(__name__)
@ -133,3 +133,14 @@ def get_node_type(project, node_type_name):
return next((nt for nt in project['node_types']
if nt['name'] == node_type_name), None)
def project_id(project_url: str) -> ObjectId:
"""Returns the object ID, or raises a ValueError when not found."""
proj_coll = current_app.db('projects')
proj = proj_coll.find_one({'url': project_url}, projection={'_id': True})
if not proj:
raise ValueError(f'project with url={project_url!r} not found')
return proj['_id']

View File

@ -0,0 +1,29 @@
# -*- encoding: utf-8 -*-
"""Unit tests for pillar.api.project.utils."""
import logging
from bson import ObjectId
from pillar.tests import AbstractPillarTest
log = logging.getLogger(__name__)
class ProjectUtilsTest(AbstractPillarTest):
def test_project_id_from_url(self):
self.enter_app_context()
self.ensure_project_exists({'_id': ObjectId(24 * 'a'), 'url': 'project1'})
self.ensure_project_exists({'_id': ObjectId(24 * 'b'), 'url': 'project2'})
self.ensure_project_exists({'_id': ObjectId(24 * 'c'), 'url': 'project3'})
from pillar.api.projects.utils import project_id
pid1 = project_id('project1')
pid2 = project_id('project2')
pid3 = project_id('project3')
self.assertEqual(ObjectId(24 * 'a'), pid1)
self.assertEqual(ObjectId(24 * 'b'), pid2)
self.assertEqual(ObjectId(24 * 'c'), pid3)