Skip to content

Commit 21a06e1

Browse files
committed
camlquery builder
1 parent 2a2efac commit 21a06e1

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

office365/sharepoint/helpers/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import logging
2+
3+
from office365.sharepoint.caml_query import CamlQuery
4+
from office365.sharepoint.helpers.utils import to_camel
5+
6+
logger = logging.getLogger(__name__)
7+
8+
9+
def recursive_builder(queries, operator='And'):
10+
if queries:
11+
query = queries.pop()
12+
if len(queries) == 0:
13+
return query
14+
elif len(queries) == 1:
15+
last_query = queries.pop()
16+
return f'<{operator}>' + query + last_query + f'</{operator}>'
17+
else:
18+
return f'<{operator}>' + query + recursive_builder(queries) + f'</{operator}>'
19+
return ''
20+
21+
22+
class CamlQueryBuilder:
23+
date_operators = ['Geq', 'Gt', 'Leq', 'Lt']
24+
mapping_operator = {
25+
'gte': 'Geq',
26+
'gt': 'Gt',
27+
'lte': 'Leq',
28+
'lt': 'Lt',
29+
'not': 'Neq',
30+
'contains': 'Contains',
31+
'eq': 'Eq',
32+
}
33+
34+
filters = {}
35+
36+
def __init__(self, filters, scope=None):
37+
super().__init__()
38+
self.scope = scope
39+
40+
if filters:
41+
self.filters = filters
42+
43+
def create_query(self):
44+
where_condition = ''
45+
46+
if self.filters.keys():
47+
filter_queries = []
48+
for filter_name, filter_value in self.filters.items():
49+
querystring_operator = filter_name.split('__')[-1]
50+
operator = self.mapping_operator.get(querystring_operator, 'Eq')
51+
52+
filter_name = to_camel(filter_name.split('__')[0])
53+
if operator in self.date_operators:
54+
column_type, value = 'DateTime', "{}T00:00:00Z".format(filter_value) # 2016-03-26
55+
query = '<{}><FieldRef Name="{}" /><Value Type="{}">{}</Value></{}>'.format(
56+
operator, filter_name, column_type, value, operator)
57+
elif operator == 'Contains':
58+
column_type, values = 'Note', filter_value
59+
query = '<{}><FieldRef Name="{}" /><Value Type="{}">{}</Value></{}>'.format(
60+
operator, filter_name, column_type, filter_value, operator)
61+
else:
62+
column_type, values = 'Text', filter_value.split(',')
63+
query = ''
64+
for value in values:
65+
query = query + '<{}><FieldRef Name="{}" /><Value Type="{}">{}</Value></{}>'.format(
66+
operator, filter_name, column_type, value, operator)
67+
if len(values) > 1:
68+
query = f'<Or>{query}</Or>'
69+
filter_queries.append(query)
70+
where_condition = recursive_builder(filter_queries)
71+
if len(filter_queries) > 1:
72+
where_condition = f"<And>{where_condition}</And>"
73+
74+
scope = f' Scope="{self.scope}"' if self.scope else ''
75+
query = f'<View{scope}><Query><Where>{where_condition}</Where></Query></View>'
76+
return query
77+
78+
def get_query(self):
79+
return CamlQuery.create_custom_query(self.create_query())

office365/sharepoint/querystring_builder.py renamed to office365/sharepoint/helpers/querystring_builder.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import logging
22

3-
logger = logging.getLogger(__name__)
4-
3+
from office365.sharepoint.helpers.utils import to_camel
54

6-
def to_camel(snake_str):
7-
return ''.join(x.title() for x in snake_str.split('_'))
5+
logger = logging.getLogger(__name__)
86

97

108
class QueryStringBuilder:

office365/sharepoint/helpers/utils.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def to_camel(snake_str):
2+
return ''.join(x.title() for x in snake_str.split('_'))

0 commit comments

Comments
 (0)