Skip to content

Commit 9492a56

Browse files
committed
update tenant namespace method and types
1 parent c9467cd commit 9492a56

File tree

19 files changed

+432
-76
lines changed

19 files changed

+432
-76
lines changed
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22

3-
from office365.migration.assessment.list_scanner import ListScanner
3+
from office365.migration.assessment.scanners.list import ListScanner
4+
from office365.migration.assessment.scanners.site import SiteScanner
45
from office365.sharepoint.client_context import ClientContext
56
from tests import test_team_site_url, test_user_credentials
67

@@ -10,10 +11,13 @@
1011

1112

1213
ctx = ClientContext(test_team_site_url).with_credentials(test_user_credentials)
13-
lib = ctx.web.default_document_library()
14-
scanner = ListScanner(lib)
14+
# lib = ctx.web.default_document_library()
15+
# scanner = ListScanner(lib)
16+
17+
scanner = SiteScanner(ctx.site)
1518
scan_info = scanner.scan()
19+
1620
logging.info(
17-
"List_Usage %s",
18-
scan_info,
21+
"Site_Usage %s",
22+
scan_info.properties,
1923
)

generator/import_metadata.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ def export_to_file(path, content):
2626
"--endpoint",
2727
dest="endpoint",
2828
help="Import metadata endpoint",
29-
default="graph",
29+
default="sharepoint",
3030
)
3131
parser.add_argument(
3232
"-p",
3333
"--path",
3434
dest="path",
35-
default="./metadata/Graph.xml",
35+
default="./metadata/SharePoint.xml",
3636
help="Import metadata endpoint",
3737
)
3838

generator/metadata/SharePoint.xml

Lines changed: 198 additions & 10 deletions
Large diffs are not rendered by default.

office365/migration/assessment/base_scanner.py

Lines changed: 0 additions & 30 deletions
This file was deleted.

office365/migration/assessment/scanners/__init__.py

Whitespace-only changes.
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from abc import ABC, abstractmethod
2+
from functools import wraps
3+
from typing import Any, Dict, Generic
4+
5+
from typing_extensions import Self
6+
7+
from office365.runtime.client_object import T
8+
9+
10+
def mapped_property(name):
11+
# type: (str) -> callable
12+
"""
13+
Decorator that maps a property to a specific key in _properties
14+
15+
Args:
16+
name: The key to use when storing in _properties dictionary
17+
"""
18+
19+
def decorator(func):
20+
# type: (callable) -> property
21+
@wraps(func)
22+
def wrapper(self):
23+
# type: (Any) -> Any
24+
value = func(self)
25+
if hasattr(self, "_properties"):
26+
self._properties[name] = value
27+
return value
28+
29+
wrapper._serialized = True
30+
return property(wrapper)
31+
32+
return decorator
33+
34+
35+
class BaseScanner(ABC, Generic[T]):
36+
37+
def __init__(self, source):
38+
# type: (T) -> None
39+
self.source = source
40+
self._properties = {} # type: Dict[str, Any]
41+
42+
@abstractmethod
43+
def build_query(self):
44+
# type: () -> Self
45+
pass
46+
47+
def scan(self):
48+
# type: () -> Self
49+
self.build_query()
50+
self.source.execute_query()
51+
self.process()
52+
return self
53+
54+
def process(self):
55+
# type: () -> None
56+
for name, attr in self.__class__.__dict__.items():
57+
if isinstance(attr, property) and hasattr(attr.fget, "_serialized"):
58+
getattr(self, name)
59+
60+
@property
61+
def properties(self):
62+
return self._properties
63+
64+
def __repr__(self):
65+
return f"{self.__class__.__name__}({self._properties})"
Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,36 @@
1-
from typing import Dict, Self
1+
from typing import Self
22

3-
from office365.migration.assessment.base_scanner import BaseScanner
3+
from office365.migration.assessment.scanners.base import BaseScanner, mapped_property
44
from office365.sharepoint.listitems.collection import ListItemCollection
55
from office365.sharepoint.lists.list import List
66

77

88
class ListScanner(BaseScanner[List]):
99

10+
@property
11+
def files_count(self):
12+
return self._properties.get("FilesCount", None)
13+
14+
@property
15+
def folders_count(self):
16+
return self._properties.get("FoldersCount", None)
17+
18+
@mapped_property("ItemsCount")
19+
def items_count(self):
20+
return self.source.item_count
21+
22+
@mapped_property("FieldsCount")
23+
def fields_count(self):
24+
return len(self.source.fields)
25+
26+
@mapped_property("ContentTypesCount")
27+
def content_types_count(self):
28+
return len(self.source.content_types)
29+
30+
@property
31+
def list_template(self):
32+
return self.source.base_template
33+
1034
def build_query(self):
1135
# type: () -> Self
1236
self._query_list_metadata()
@@ -15,28 +39,6 @@ def build_query(self):
1539

1640
return self
1741

18-
def process(self):
19-
# type: () -> Dict
20-
return {
21-
"ListTemplate": self.source.base_template,
22-
"NumOfAllItems": self.source.item_count,
23-
# "NumOfPages": -1,
24-
# "NumOfCheckedOutFiles": -1,
25-
# "NumOfItems_HasUniquePermission": -1,
26-
"NumOfUniquePermissions": (
27-
len(self.source.role_assignments)
28-
if self.source.has_unique_role_assignments
29-
else 0
30-
),
31-
"NumOfContentTypes": len(self.source.content_types),
32-
"NumOfFields": len(self.source.fields),
33-
# "NumOfLookupFields": -1,
34-
# "TotalFileVersions": -1,
35-
# "Size": -1,
36-
"NumOfFiles": self._result["NumOfFiles"],
37-
"NumOfFolders": self._result["NumOfFolders"],
38-
}
39-
4042
def _query_list_metadata(self):
4143
self.source.select(
4244
[
@@ -60,10 +62,10 @@ def _query_list_items(self):
6062

6163
def _process_item(self, items):
6264
# type: (ListItemCollection) -> None
63-
self._result.setdefault("NumOfFiles", 0)
64-
self._result.setdefault("NumOfFolders", 0)
65+
self._properties.setdefault("FilesCount", 0)
66+
self._properties.setdefault("FoldersCount", 0)
6567

6668
file_count = sum(1 for item in items if item.properties.get("FSObjType") == 0)
6769
folder_count = sum(1 for item in items if item.properties.get("FSObjType") == 1)
68-
self._result["NumOfFiles"] += file_count
69-
self._result["NumOfFolders"] += folder_count
70+
self._properties["FilesCount"] += file_count
71+
self._properties["FoldersCount"] += folder_count
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from office365.migration.assessment.scanners.base import BaseScanner, mapped_property
2+
from office365.sharepoint.sites.site import Site
3+
4+
5+
class SiteScanner(BaseScanner[Site]):
6+
""" """
7+
8+
@mapped_property("FeaturesCount")
9+
def features_count(self):
10+
return len(self.source.features)
11+
12+
@mapped_property("UsersCount")
13+
def users_count(self):
14+
return len(self.source.root_web.site_users)
15+
16+
@mapped_property("GroupsCount")
17+
def groups_count(self):
18+
return len(self.source.root_web.site_groups)
19+
20+
def build_query(self):
21+
self.source.select(["UsageInfo", "Features/Name"]).expand(["Features"]).get()
22+
23+
self.source.root_web.site_users.get()
24+
self.source.root_web.site_groups.get()
25+
return self

office365/sharepoint/administration/archiving/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from office365.sharepoint.entity import Entity
2+
3+
4+
class ArchiveFileSizeMetric(Entity):
5+
""" """

0 commit comments

Comments
 (0)