Files
2026-06-14 08:25:15 +02:00

54 lines
2.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Orientacni srovnani: online (Graph totalItemCount) vs Mongo po slozkach."""
import sys
import msal, requests
from pymongo import MongoClient
TENANT="7d269944-37a4-43a1-8140-c7517dc426e9"
CLIENT="4b222bfd-78c9-4239-a53f-43006b3ed07f"
SECRET="Txg8Q~MjhocuopxsJyJBhPmDfMxZ2r5WpTFj1dfk"
GRAPH="https://graph.microsoft.com/v1.0"
MBOX = sys.argv[1] if len(sys.argv)>1 else "michaela.buzalkova@buzalka.cz"
app=msal.ConfidentialClientApplication(CLIENT,authority=f"https://login.microsoftonline.com/{TENANT}",client_credential=SECRET)
tok=app.acquire_token_for_client(scopes=["https://graph.microsoft.com/.default"])["access_token"]
H={"Authorization":f"Bearer {tok}"}
def folders(parent=None,ppath=""):
url=f"{GRAPH}/users/{MBOX}/mailFolders" if parent is None else f"{GRAPH}/users/{MBOX}/mailFolders/{parent}/childFolders"
params={"$top":100,"$select":"id,displayName,totalItemCount,childFolderCount"}
out=[]
while url:
d=requests.get(url,headers=H,params=params,timeout=60).json()
for f in d.get("value",[]):
path=f"{ppath}/{f['displayName']}".lstrip("/")
out.append((path,f.get("totalItemCount",0)))
if f.get("childFolderCount",0)>0:
out+=folders(f["id"],path)
url=d.get("@odata.nextLink"); params=None
return out
online=folders()
online_d={p:c for p,c in online}
cli=MongoClient("mongodb://192.168.1.76:27017")
col=cli["emaily"][MBOX]
mongo_d={}
for r in col.aggregate([{"$group":{"_id":"$folder_path","n":{"$sum":1}}}]):
mongo_d[r["_id"]]=r["n"]
deleted=col.count_documents({"permanently_deleted":True})
allpaths=sorted(set(online_d)|set(mongo_d))
print(f"{'SLOZKA':40} {'ONLINE':>8} {'MONGO':>8} {'ROZDIL':>8}")
print("-"*68)
to=tm=0
for p in allpaths:
o=online_d.get(p); m=mongo_d.get(p,0)
to+=(o or 0); tm+=m
print(f"{(p or '(none)')[:40]:40} {('-' if o is None else o):>8} {m:>8} {('' if o is None else o-m):>8}")
print("-"*68)
print(f"{'CELKEM':40} {to:>8} {tm:>8} {to-tm:>8}")
print(f"\nMongo total docs: {col.count_documents({})} | z toho permanently_deleted: {deleted}")
print(f"Online folders: {len(online_d)} | Mongo folders: {len(mongo_d)}")