Skip to content

Commit 33d61e2

Browse files
committed
Update memgraph image to memgraph/memgraph-mage:1.19-memgraph-2.19-no-ml
Remove all null attributes from queries to workaround memgraph bug Fix unbound variables for memgraph
1 parent 15e92ab commit 33d61e2

File tree

11 files changed

+52
-57
lines changed

11 files changed

+52
-57
lines changed

backend/infrahub/core/migrations/graph/m003_relationship_parent_optional.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
2828
WHERE av1.value = "Parent" AND av2.value = true AND all(r IN relationships(path) WHERE ( %(filters)s ))
2929
CALL {
3030
WITH n
31-
MATCH path = (av2:AttributeValue)-[r22:HAS_VALUE]-(a2:Attribute {name: "optional"})-[:HAS_ATTRIBUTE]-(n:SchemaRelationship)-[:HAS_ATTRIBUTE]-(:Attribute {name:"kind"})-[:HAS_VALUE]-(av1:AttributeValue)
32-
WHERE av1.value = "Parent" AND av2.value = true AND all(r IN relationships(path) WHERE ( %(filters)s ))
33-
RETURN av2 as av2_sub, r22, a2, path as path2
31+
MATCH path22 = (av22:AttributeValue)-[r22:HAS_VALUE]-(a2:Attribute {name: "optional"})-[:HAS_ATTRIBUTE]-(n:SchemaRelationship)-[:HAS_ATTRIBUTE]-(:Attribute {name:"kind"})-[:HAS_VALUE]-(av11:AttributeValue)
32+
WHERE av11.value = "Parent" AND av22.value = true AND all(r IN relationships(path22) WHERE ( %(filters)s ))
33+
RETURN av22 as av2_sub, r22, a2, path22 as path2
3434
ORDER BY r22.branch_level DESC, r22.from DESC
3535
LIMIT 1
3636
}
3737
WITH av2_sub as av2, r22, a2, path2
3838
WHERE all(r IN relationships(path2) WHERE r.status = "active")
3939
MERGE (new_value: AttributeValue { value: false, is_default: false })
40-
CREATE (a2)-[:HAS_VALUE { branch: r22.branch, branch_level: r22.branch_level, status: "active", from: $at, to: null } ]->(new_value)
40+
CREATE (a2)-[:HAS_VALUE { branch: r22.branch, branch_level: r22.branch_level, status: "active", from: $at } ]->(new_value)
4141
SET r22.to = $at
4242
""" % {"filters": filters}
4343
self.add_to_query(query)

backend/infrahub/core/migrations/graph/m013_convert_git_password_credential.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
100100
WHERE git_attr_name.name = "name"
101101
CALL {
102102
WITH git_repo
103-
MATCH path1 = (git_repo)-[r1:HAS_ATTRIBUTE]-(git_attr_name:Attribute)-[r2:HAS_VALUE]->(git_name_value:AttributeValue)
104-
WHERE git_attr_name.name = "name"
103+
MATCH path1 = (git_repo)-[r1:HAS_ATTRIBUTE]-(git_attr_name2:Attribute)-[r2:HAS_VALUE]->(git_name_value2:AttributeValue)
104+
WHERE git_attr_name2.name = "name"
105105
AND all(r IN relationships(path1) WHERE %(filters)s)
106-
RETURN git_repo as n1, r1 as r11, r2 as r22, git_name_value as av1
106+
RETURN git_repo as n1, r1 as r11, r2 as r22, git_name_value2 as av1
107107
ORDER BY r1.branch_level DESC, r1.from DESC
108108
LIMIT 1
109109
}

backend/infrahub/core/migrations/query/schema_attribute_update.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: dict[str, Any]) -> No
8686

8787
query = """
8888
MERGE (new_value: AttributeValue { value: $attr_new_value, is_default: false })
89-
CREATE (attr)-[:HAS_VALUE { branch: rel.branch, branch_level: rel.branch_level, status: "active", from: $at, to: null } ]->(new_value)
89+
CREATE (attr)-[:HAS_VALUE { branch: rel.branch, branch_level: rel.branch_level, status: "active", from: $at } ]->(new_value)
9090
SET rel.to = $at
9191
"""
9292
self.add_to_query(query)

backend/infrahub/core/query/attribute.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
6868
query = """
6969
MATCH (a:Attribute { uuid: $attr_uuid })
7070
MERGE (av:%(labels)s { %(props)s } )
71-
CREATE (a)-[r:%(rel_label)s { branch: $branch, branch_level: $branch_level, status: "active", from: $at, to: null }]->(av)
71+
CREATE (a)-[r:%(rel_label)s { branch: $branch, branch_level: $branch_level, status: "active", from: $at }]->(av)
7272
""" % {"rel_label": self.attr._rel_to_value_label, "labels": ":".join(labels), "props": ", ".join(prop_list)}
7373

7474
self.add_to_query(query)
@@ -108,7 +108,7 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
108108
query = """
109109
MATCH (a:Attribute { uuid: $attr_uuid })
110110
MERGE (flag:Boolean { value: $flag_value })
111-
CREATE (a)-[r:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at, to: null }]->(flag)
111+
CREATE (a)-[r:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at }]->(flag)
112112
""" % self.flag_name.upper()
113113

114114
self.add_to_query(query)
@@ -148,7 +148,7 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
148148
"""
149149
MATCH (a:Attribute { uuid: $attr_uuid })
150150
MATCH (np:Node { uuid: $prop_id })
151-
CREATE (a)-[r:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at, to: null }]->(np)
151+
CREATE (a)-[r:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at }]->(np)
152152
"""
153153
% rel_name
154154
)

backend/infrahub/core/query/branch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None:
2525
MATCH (root:Root)
2626
MATCH (d) WHERE %(id_func)s(d) = $node_id
2727
WITH root,d
28-
CREATE (d)-[r:IS_PART_OF { branch: $branch, branch_level: $branch_level, from: $now, to: null, status: $status }]->(root)
28+
CREATE (d)-[r:IS_PART_OF { branch: $branch, branch_level: $branch_level, from: $now, status: $status }]->(root)
2929
RETURN %(id_func)s(r)
3030
""" % {
3131
"id_func": db.get_id_function_name(),

backend/infrahub/core/query/node.py

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
177177
"from": at.to_string(),
178178
}
179179

180-
rel_prop_str = "{ branch: rel.branch, branch_level: rel.branch_level, status: rel.status, hierarchy: rel.hierarchical, from: $at, to: null }"
180+
rel_prop_str = "{ branch: rel.branch, branch_level: rel.branch_level, status: rel.status, hierarchy: rel.hierarchical, from: $at }"
181181

182182
iphost_prop = {
183183
"value": "attr.content.value",
@@ -205,56 +205,56 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
205205
WITH distinct n
206206
FOREACH ( attr IN $attrs |
207207
CREATE (a:Attribute { uuid: attr.uuid, name: attr.name, branch_support: attr.branch_support })
208-
CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(a)
208+
CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(a)
209209
MERGE (av:AttributeValue { value: attr.content.value, is_default: attr.content.is_default })
210-
CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(av)
210+
CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(av)
211211
MERGE (ip:Boolean { value: attr.is_protected })
212212
MERGE (iv:Boolean { value: attr.is_visible })
213-
CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(ip)
214-
CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(iv)
213+
CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(ip)
214+
CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(iv)
215215
FOREACH ( prop IN attr.source_prop |
216216
MERGE (peer:Node { uuid: prop.peer_id })
217-
CREATE (a)-[:HAS_SOURCE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(peer)
217+
CREATE (a)-[:HAS_SOURCE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(peer)
218218
)
219219
FOREACH ( prop IN attr.owner_prop |
220220
MERGE (peer:Node { uuid: prop.peer_id })
221-
CREATE (a)-[:HAS_OWNER { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(peer)
221+
CREATE (a)-[:HAS_OWNER { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(peer)
222222
)
223223
)
224224
FOREACH ( attr IN $attrs_iphost |
225225
CREATE (a:Attribute { uuid: attr.uuid, name: attr.name, branch_support: attr.branch_support })
226-
CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(a)
226+
CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(a)
227227
MERGE (av:AttributeValue:AttributeIPHost { %(iphost_prop)s })
228-
CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(av)
228+
CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(av)
229229
MERGE (ip:Boolean { value: attr.is_protected })
230230
MERGE (iv:Boolean { value: attr.is_visible })
231-
CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(ip)
232-
CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(iv)
231+
CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(ip)
232+
CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(iv)
233233
FOREACH ( prop IN attr.source_prop |
234234
MERGE (peer:Node { uuid: prop.peer_id })
235-
CREATE (a)-[:HAS_SOURCE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(peer)
235+
CREATE (a)-[:HAS_SOURCE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(peer)
236236
)
237237
FOREACH ( prop IN attr.owner_prop |
238238
MERGE (peer:Node { uuid: prop.peer_id })
239-
CREATE (a)-[:HAS_OWNER { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(peer)
239+
CREATE (a)-[:HAS_OWNER { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(peer)
240240
)
241241
)
242242
FOREACH ( attr IN $attrs_ipnetwork |
243243
CREATE (a:Attribute { uuid: attr.uuid, name: attr.name, branch_support: attr.branch_support })
244-
CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(a)
244+
CREATE (n)-[:HAS_ATTRIBUTE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(a)
245245
MERGE (av:AttributeValue:AttributeIPNetwork { %(ipnetwork_prop)s })
246-
CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(av)
246+
CREATE (a)-[:HAS_VALUE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(av)
247247
MERGE (ip:Boolean { value: attr.is_protected })
248248
MERGE (iv:Boolean { value: attr.is_visible })
249-
CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(ip)
250-
CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(iv)
249+
CREATE (a)-[:IS_PROTECTED { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(ip)
250+
CREATE (a)-[:IS_VISIBLE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(iv)
251251
FOREACH ( prop IN attr.source_prop |
252252
MERGE (peer:Node { uuid: prop.peer_id })
253-
CREATE (a)-[:HAS_SOURCE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(peer)
253+
CREATE (a)-[:HAS_SOURCE { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(peer)
254254
)
255255
FOREACH ( prop IN attr.owner_prop |
256256
MERGE (peer:Node { uuid: prop.peer_id })
257-
CREATE (a)-[:HAS_OWNER { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at, to: null }]->(peer)
257+
CREATE (a)-[:HAS_OWNER { branch: attr.branch, branch_level: attr.branch_level, status: attr.status, from: $at }]->(peer)
258258
)
259259
)
260260
FOREACH ( rel IN $rels_bidir |
@@ -264,15 +264,15 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
264264
CREATE (d)-[:IS_RELATED %(rel_prop)s ]->(rl)
265265
MERGE (ip:Boolean { value: rel.is_protected })
266266
MERGE (iv:Boolean { value: rel.is_visible })
267-
CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(ip)
268-
CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(iv)
267+
CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(ip)
268+
CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(iv)
269269
FOREACH ( prop IN rel.source_prop |
270270
MERGE (peer:Node { uuid: prop.peer_id })
271-
CREATE (rl)-[:HAS_SOURCE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(peer)
271+
CREATE (rl)-[:HAS_SOURCE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
272272
)
273273
FOREACH ( prop IN rel.owner_prop |
274274
MERGE (peer:Node { uuid: prop.peer_id })
275-
CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(peer)
275+
CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
276276
)
277277
)
278278
FOREACH ( rel IN $rels_out |
@@ -282,15 +282,15 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
282282
CREATE (d)<-[:IS_RELATED %(rel_prop)s ]-(rl)
283283
MERGE (ip:Boolean { value: rel.is_protected })
284284
MERGE (iv:Boolean { value: rel.is_visible })
285-
CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(ip)
286-
CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(iv)
285+
CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(ip)
286+
CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(iv)
287287
FOREACH ( prop IN rel.source_prop |
288288
MERGE (peer:Node { uuid: prop.peer_id })
289-
CREATE (rl)-[:HAS_SOURCE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(peer)
289+
CREATE (rl)-[:HAS_SOURCE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
290290
)
291291
FOREACH ( prop IN rel.owner_prop |
292292
MERGE (peer:Node { uuid: prop.peer_id })
293-
CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(peer)
293+
CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
294294
)
295295
)
296296
FOREACH ( rel IN $rels_in |
@@ -300,15 +300,15 @@ async def query_init(self, db: InfrahubDatabase, **kwargs):
300300
CREATE (d)-[:IS_RELATED %(rel_prop)s ]->(rl)
301301
MERGE (ip:Boolean { value: rel.is_protected })
302302
MERGE (iv:Boolean { value: rel.is_visible })
303-
CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(ip)
304-
CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(iv)
303+
CREATE (rl)-[:IS_PROTECTED { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(ip)
304+
CREATE (rl)-[:IS_VISIBLE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(iv)
305305
FOREACH ( prop IN rel.source_prop |
306306
MERGE (peer:Node { uuid: prop.peer_id })
307-
CREATE (rl)-[:HAS_SOURCE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(peer)
307+
CREATE (rl)-[:HAS_SOURCE { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
308308
)
309309
FOREACH ( prop IN rel.owner_prop |
310310
MERGE (peer:Node { uuid: prop.peer_id })
311-
CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at, to: null }]->(peer)
311+
CREATE (rl)-[:HAS_OWNER { branch: rel.branch, branch_level: rel.branch_level, status: rel.status, from: $at }]->(peer)
312312
)
313313
)
314314
WITH distinct n
@@ -1205,10 +1205,10 @@ async def query_init(self, db: InfrahubDatabase, **kwargs: Any) -> None: # pyli
12051205
MATCH path = (n)%(filter)s(peer)
12061206
WHERE all(r IN relationships(path) WHERE (%(branch_filter)s))
12071207
WITH %(with_clause)s
1208-
RETURN peer as peer1, path as path1, all(r IN relationships(path) WHERE (r.status = "active")) AS is_active
1208+
RETURN peer as peer1, all(r IN relationships(path) WHERE (r.status = "active")) AS is_active
12091209
ORDER BY branch_level DESC, froms[-1] DESC, froms[-2] DESC, is_active DESC
12101210
}
1211-
WITH peer1 as peer, path1 as path, is_active
1211+
WITH peer1 as peer, is_active
12121212
""" % {"filter": filter_str, "branch_filter": branch_filter, "with_clause": with_clause}
12131213

12141214
self.add_to_query(query)

backend/infrahub/core/query/relationship.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ def get_relationship_properties_dict(self, status: RelationshipStatus) -> dict[s
182182
"branch_level": self.branch.hierarchy_level,
183183
"status": status.value,
184184
"from": self.at.to_string(),
185-
"to": None,
186185
}
187186
if self.schema.hierarchical:
188187
rel_prop_dict["hierarchy"] = self.schema.hierarchical
@@ -267,7 +266,7 @@ def query_add_all_node_property_create(self):
267266

268267
def query_add_node_property_create(self, name: str):
269268
query = """
270-
CREATE (rl)-[:HAS_%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at, to: null }]->(%s)
269+
CREATE (rl)-[:HAS_%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at }]->(%s)
271270
""" % (
272271
name.upper(),
273272
name,
@@ -335,7 +334,7 @@ def query_add_all_flag_property_create(self):
335334

336335
def query_add_flag_property_create(self, name: str):
337336
query = """
338-
CREATE (rl)-[:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at, to: null }]->(prop_%s)
337+
CREATE (rl)-[:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at }]->(prop_%s)
339338
""" % (
340339
name.upper(),
341340
name,
@@ -349,7 +348,7 @@ def query_add_all_node_property_create(self):
349348

350349
def query_add_node_property_create(self, name: str):
351350
query = """
352-
CREATE (rl)-[:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at, to: null }]->(prop_%s)
351+
CREATE (rl)-[:%s { branch: $branch, branch_level: $branch_level, status: "active", from: $at }]->(prop_%s)
353352
""" % (
354353
"HAS_" + name.upper(),
355354
name,

0 commit comments

Comments
 (0)