Skip to content

Commit aa64557

Browse files
committed
Update stats module to use SqlAlchemy 2.x syntax
1 parent b230bb2 commit aa64557

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

server/mergin/stats/models.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
#
33
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial
44

5+
import uuid
56
from dataclasses import dataclass
67
from typing import Optional
7-
import uuid
8-
from sqlalchemy.dialects.postgresql import UUID, JSONB
9-
from datetime import datetime, timezone
8+
from datetime import datetime
9+
from sqlalchemy.dialects.postgresql import JSONB
10+
from sqlalchemy.orm import Mapped, mapped_column
1011

1112
from ..app import db
1213

@@ -30,8 +31,8 @@ class ServerCallhomeData:
3031
class MerginInfo(db.Model):
3132
"""Information about deployment"""
3233

33-
service_id = db.Column(UUID(as_uuid=True), primary_key=True)
34-
last_reported = db.Column(db.DateTime)
34+
service_id: Mapped[uuid.UUID] = mapped_column(primary_key=True)
35+
last_reported: Mapped[Optional[datetime]]
3536

3637
def __init__(self, service_id: str = None):
3738
if service_id:
@@ -43,9 +44,7 @@ def __init__(self, service_id: str = None):
4344
class MerginStatistics(db.Model):
4445
"""Information about deployment"""
4546

46-
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
47-
created_at = db.Column(
48-
db.DateTime, index=True, nullable=False, default=datetime.utcnow
49-
)
47+
id: Mapped[int] = mapped_column(primary_key=True)
48+
created_at: Mapped[datetime] = mapped_column(index=True, default=datetime.utcnow)
5049
# data with statistics
51-
data = db.Column(JSONB, nullable=False)
50+
data: Mapped[dict] = mapped_column(JSONB)

server/mergin/stats/tasks.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from flask import current_app
1111
from sqlalchemy.sql.operators import is_
1212
from sqlalchemy import inspect
13+
from sqlalchemy.sql import select, func
1314

1415
from .models import MerginInfo, MerginStatistics, ServerCallhomeData
1516
from ..celery import celery
@@ -22,21 +23,25 @@ def get_callhome_data(info: MerginInfo | None = None) -> ServerCallhomeData:
2223
"""
2324
Get data about server to send to callhome service
2425
"""
25-
last_change_item = (
26-
db.session.query(Project.updated).order_by(Project.updated.desc()).first()
27-
)
26+
last_change = db.session.scalars(
27+
select(Project.updated).order_by(Project.updated.desc())
28+
).first()
2829
service_uuid = str(info.service_id) if info else None
2930
data = ServerCallhomeData(
3031
service_uuid=service_uuid,
3132
url=current_app.config["MERGIN_BASE_URL"],
3233
contact_email=current_app.config["CONTACT_EMAIL"],
3334
licence=current_app.config["SERVER_TYPE"],
34-
projects_count=Project.query.filter(Project.removed_at.is_(None)).count(),
35-
users_count=User.query.filter(
36-
is_(User.username.ilike("deleted_%"), False)
37-
).count(),
35+
projects_count=db.session.scalar(
36+
select(func.count(Project.id)).where(is_(Project.removed_at, None))
37+
),
38+
users_count=db.session.scalar(
39+
select(func.count(User.id)).where(
40+
is_(User.username.ilike("deleted_%"), False)
41+
)
42+
),
3843
workspaces_count=current_app.ws_handler.workspace_count(),
39-
last_change=str(last_change_item.updated) + "Z" if last_change_item else "",
44+
last_change=str(last_change) + "Z" if last_change else "",
4045
server_version=current_app.config["VERSION"],
4146
monthly_contributors=current_app.ws_handler.monthly_contributors_count(),
4247
editors=current_app.ws_handler.server_editors_count(),
@@ -48,7 +53,7 @@ def get_callhome_data(info: MerginInfo | None = None) -> ServerCallhomeData:
4853
@celery.task(ignore_result=True)
4954
def save_statistics():
5055
"""Save statistics about usage."""
51-
info = MerginInfo.query.first()
56+
info = db.session.execute(select(MerginInfo)).scalar_one_or_none()
5257
data = get_callhome_data(info)
5358
stat = MerginStatistics(data=data)
5459
db.session.add(stat)
@@ -77,7 +82,7 @@ def send_statistics():
7782
logging.warning("Database not initialized")
7883
return
7984

80-
info = MerginInfo.query.first()
85+
info = db.session.execute(select(MerginInfo)).scalar_one_or_none()
8186
if not info:
8287
# create new info with random service id
8388
service_id = current_app.config.get("SERVICE_ID", None)

0 commit comments

Comments
 (0)