X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Fbase_topic.py;h=095e26511e794d4c4a83c414ddb3ea36fc262fca;hp=49df35e99b83c8fcaebb31a878f3f614b7f96eb5;hb=c061f56a0218c562315f563b001a72fbdfa550c6;hpb=587aeea73f8cdf5561a451dbc87107daef6efe04 diff --git a/osm_nbi/base_topic.py b/osm_nbi/base_topic.py index 49df35e..095e265 100644 --- a/osm_nbi/base_topic.py +++ b/osm_nbi/base_topic.py @@ -18,7 +18,7 @@ from uuid import uuid4 from http import HTTPStatus from time import time from osm_common.dbbase import deep_update_rfc7396 -from validation import validate_input, ValidationError +from validation import validate_input, ValidationError, is_valid_uuid __author__ = "Alfonso Tierno " @@ -56,12 +56,26 @@ class BaseTopic: schema_new = None # to_override schema_edit = None # to_override + # Alternative ID Fields for some Topics + alt_id_field = { + "projects": "name", + "users": "username" + } + def __init__(self, db, fs, msg): self.db = db self.fs = fs self.msg = msg self.logger = logging.getLogger("nbi.engine") + @staticmethod + def id_field(topic, value): + "Returns ID Field for given topic and field value" + if topic in ["projects", "users"] and not is_valid_uuid(value): + return BaseTopic.alt_id_field[topic] + else: + return "_id" + @staticmethod def _remove_envelop(indata=None): if not indata: @@ -201,7 +215,7 @@ class BaseTopic: Update descriptor with the kwargs. It contains dot separated keys :param desc: dictionary to be updated :param kwargs: plain dictionary to be used for updating. - :return: None, 'desc' is modified. It raises EngineException. + :return: None, 'desc' is modified. It raises EngineException. """ if not kwargs: return @@ -239,7 +253,8 @@ class BaseTopic: :return: dictionary, raise exception if not found. """ filter_db = self._get_project_filter(session, write=False, show_all=True) - filter_db["_id"] = _id + # To allow project&user addressing by name AS WELL AS _id + filter_db[BaseTopic.id_field(self.topic, _id)] = _id return self.db.get_one(self.topic, filter_db) # TODO transform data for SOL005 URL requests # TODO remove _admin if not admin @@ -339,7 +354,8 @@ class BaseTopic: # data = self.get_item(topic, _id) self.check_conflict_on_del(session, _id, force) filter_q = self._get_project_filter(session, write=True, show_all=True) - filter_q["_id"] = _id + # To allow project addressing by name AS WELL AS _id + filter_q[BaseTopic.id_field(self.topic, _id)] = _id if not dry_run: v = self.db.del_one(self.topic, filter_q) self._send_msg("deleted", {"_id": _id}) @@ -361,7 +377,10 @@ class BaseTopic: deep_update_rfc7396(content, indata) self.check_conflict_on_edit(session, content, indata, _id=_id, force=force) self.format_on_edit(content, indata) - self.db.replace(self.topic, _id, content) + # To allow project addressing by name AS WELL AS _id + # self.db.replace(self.topic, _id, content) + cid = content.get("_id") + self.db.replace(self.topic, cid if cid else _id, content) indata.pop("_admin", None) indata["_id"] = _id