projects
/
osm
/
NBI.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Added coverage tests in tox
[osm/NBI.git]
/
osm_nbi
/
base_topic.py
diff --git
a/osm_nbi/base_topic.py
b/osm_nbi/base_topic.py
index
1f7f5d4
..
daa7a6b
100644
(file)
--- a/
osm_nbi/base_topic.py
+++ b/
osm_nbi/base_topic.py
@@
-69,6
+69,7
@@
class BaseTopic:
# static variables for all instance classes
topic = None # to_override
topic_msg = None # to_override
# static variables for all instance classes
topic = None # to_override
topic_msg = None # to_override
+ quota_name = None # to_override. If not provided topic will be used for quota_name
schema_new = None # to_override
schema_edit = None # to_override
multiproject = True # True if this Topic can be shared by several projects. Then it contains _admin.projects_read
schema_new = None # to_override
schema_edit = None # to_override
multiproject = True # True if this Topic can be shared by several projects. Then it contains _admin.projects_read
@@
-107,12
+108,12
@@
class BaseTopic:
"""
Check whether topic quota is exceeded by the given project
Used by relevant topics' 'new' function to decide whether or not creation of the new item should be allowed
"""
Check whether topic quota is exceeded by the given project
Used by relevant topics' 'new' function to decide whether or not creation of the new item should be allowed
- :param
projects
: projects (tuple) for which quota should be checked
- :param
override: boolean. If true, don't raise ValidationError even though quota be exceeded
+ :param
session[project_id]
: projects (tuple) for which quota should be checked
+ :param
session[force]: boolean. If true, skip quota checking
:return: None
:raise:
DbException if project not found
:return: None
:raise:
DbException if project not found
- ValidationError if quota exceeded
and not overridden
+ ValidationError if quota exceeded
in one of the projects
"""
if session["force"]:
return
"""
if session["force"]:
return
@@
-120,11
+121,12
@@
class BaseTopic:
for project in projects:
proj = self.auth.get_project(project)
pid = proj["_id"]
for project in projects:
proj = self.auth.get_project(project)
pid = proj["_id"]
- quota = proj.get("quotas", {}).get(self.topic, self.default_quota)
+ quota_name = self.quota_name or self.topic
+ quota = proj.get("quotas", {}).get(quota_name, self.default_quota)
count = self.db.count(self.topic, {"_admin.projects_read": pid})
if count >= quota:
name = proj["name"]
count = self.db.count(self.topic, {"_admin.projects_read": pid})
if count >= quota:
name = proj["name"]
- raise ValidationError("quota ({}={}) exceeded for project {} ({})".format(
self.topic
, quota, name, pid),
+ raise ValidationError("quota ({}={}) exceeded for project {} ({})".format(
quota_name
, quota, name, pid),
http_code=HTTPStatus.UNAUTHORIZED)
def _validate_input_new(self, input, force=False):
http_code=HTTPStatus.UNAUTHORIZED)
def _validate_input_new(self, input, force=False):
@@
-323,12
+325,23
@@
class BaseTopic:
update_content = update_content[kitem_old]
if isinstance(update_content, dict):
kitem_old = kitem
update_content = update_content[kitem_old]
if isinstance(update_content, dict):
kitem_old = kitem
+ if not isinstance(update_content.get(kitem_old), (dict, list)):
+ update_content[kitem_old] = {}
elif isinstance(update_content, list):
elif isinstance(update_content, list):
+ # key must be an index of the list, must be integer
kitem_old = int(kitem)
kitem_old = int(kitem)
+ # if index greater than list, extend the list
+ if kitem_old >= len(update_content):
+ update_content += [None] * (kitem_old - len(update_content) + 1)
+ if not isinstance(update_content[kitem_old], (dict, list)):
+ update_content[kitem_old] = {}
else:
raise EngineException(
"Invalid query string '{}'. Descriptor is not a list nor dict at '{}'".format(k, kitem))
else:
raise EngineException(
"Invalid query string '{}'. Descriptor is not a list nor dict at '{}'".format(k, kitem))
- update_content[kitem_old] = v if not yaml_format else safe_load(v)
+ if v is None:
+ del update_content[kitem_old]
+ else:
+ update_content[kitem_old] = v if not yaml_format else safe_load(v)
except KeyError:
raise EngineException(
"Invalid query string '{}'. Descriptor does not contain '{}'".format(k, kitem_old))
except KeyError:
raise EngineException(
"Invalid query string '{}'. Descriptor does not contain '{}'".format(k, kitem_old))
@@
-484,14
+497,14
@@
class BaseTopic:
# remove reference from project_read if there are more projects referencing it. If it last one,
# do not remove reference, but delete
other_projects_referencing = next((p for p in item_content["_admin"]["projects_read"]
# remove reference from project_read if there are more projects referencing it. If it last one,
# do not remove reference, but delete
other_projects_referencing = next((p for p in item_content["_admin"]["projects_read"]
- if p not in session["project_id"]), None)
+ if p not in session["project_id"]
and p != "ANY"
), None)
# check if there are projects referencing it (apart from ANY, that means, public)....
if other_projects_referencing:
# remove references but not delete
# check if there are projects referencing it (apart from ANY, that means, public)....
if other_projects_referencing:
# remove references but not delete
- update_dict_pull = {"_admin.projects_read
.{}".format(p): None for p in session["project_id"]}
- update_dict_pull.update({"_admin.projects_write.{}".format(p): None for p in session["project_id"]})
- self.db.set_one(self.topic, filter_q, update_dict=None, pull=update_dict_pull)
+ update_dict_pull = {"_admin.projects_read
": session["project_id"],
+ "_admin.projects_write": session["project_id"]}
+ self.db.set_one(self.topic, filter_q, update_dict=None, pull
_list
=update_dict_pull)
return None
else:
can_write = next((p for p in item_content["_admin"]["projects_write"] if p == "ANY" or
return None
else:
can_write = next((p for p in item_content["_admin"]["projects_write"] if p == "ANY" or