mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 05:51:15 +02:00
feat(api): add Snapshot.created and type NodeFile timestamps as date-time
This commit is contained in:
4 files changed
+38
-8
No files matched your search
@@ -480,11 +480,13 @@ class Project:
|
||||
stat_info = await wait_run_in_executor(lambda e=entry: e.stat())
|
||||
is_dir = await wait_run_in_executor(lambda e=entry: e.is_dir())
|
||||
if is_dir:
|
||||
created_at: str | None = None
|
||||
modified_at: str | None = None
|
||||
try:
|
||||
created_at = datetime.datetime.fromtimestamp(stat_info.st_ctime).isoformat()
|
||||
modified_at = datetime.datetime.fromtimestamp(stat_info.st_mtime).isoformat()
|
||||
except (OSError, OverflowError, ValueError):
|
||||
created_at = modified_at = ""
|
||||
created_at = modified_at = None
|
||||
files.append(
|
||||
{
|
||||
"path": rel_path,
|
||||
@@ -506,7 +508,7 @@ class Project:
|
||||
created_at = datetime.datetime.fromtimestamp(stat_info.st_ctime).isoformat()
|
||||
modified_at = datetime.datetime.fromtimestamp(stat_info.st_mtime).isoformat()
|
||||
except (OSError, OverflowError, ValueError):
|
||||
created_at = modified_at = ""
|
||||
created_at = modified_at = None
|
||||
files.append(
|
||||
{
|
||||
"path": rel_path,
|
||||
@@ -537,7 +539,7 @@ class Project:
|
||||
created_at = datetime.datetime.fromtimestamp(stat_info.st_ctime).isoformat()
|
||||
modified_at = datetime.datetime.fromtimestamp(stat_info.st_mtime).isoformat()
|
||||
except (OSError, OverflowError, ValueError):
|
||||
created_at = modified_at = ""
|
||||
created_at = modified_at = None
|
||||
files.append(
|
||||
{
|
||||
"path": os.path.relpath(dir_full_path, base_path),
|
||||
@@ -567,7 +569,7 @@ class Project:
|
||||
modified_at = datetime.datetime.fromtimestamp(stat_info.st_mtime).isoformat()
|
||||
except (OSError, OverflowError, ValueError) as e:
|
||||
log.warning(f"Invalid timestamp for '{rel_path}': {e}")
|
||||
created_at = modified_at = ""
|
||||
created_at = modified_at = None
|
||||
files.append(
|
||||
{
|
||||
"path": rel_path,
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
from typing import List, Optional
|
||||
from uuid import UUID
|
||||
@@ -111,8 +112,8 @@ class NodeFile(BaseModel):
|
||||
|
||||
path: str = Field(..., description="File name")
|
||||
size: int = Field(..., description="File size in bytes")
|
||||
created_at: str = Field(..., description="File creation time (ISO 8601)")
|
||||
modified_at: str = Field(..., description="File modification time (ISO 8601)")
|
||||
created_at: Optional[datetime] = Field(None, description="File creation time (ISO 8601)")
|
||||
modified_at: Optional[datetime] = Field(None, description="File modification time (ISO 8601)")
|
||||
file_type: str = Field(..., description="File type determined by the file command")
|
||||
|
||||
|
||||
|
||||
@@ -15,10 +15,11 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
from datetime import datetime, timezone
|
||||
from typing import Optional
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
from pydantic import BaseModel, Field, model_validator
|
||||
|
||||
|
||||
class SnapshotBase(BaseModel):
|
||||
@@ -44,4 +45,14 @@ class Snapshot(SnapshotBase):
|
||||
name: str = Field(..., description="Name of the snapshot")
|
||||
filename: str = Field(..., description="Filename of the snapshot")
|
||||
description: str = Field(..., description="Description of the snapshot")
|
||||
created_at: int = Field(..., description="Date of the snapshot (UTC timestamp)")
|
||||
created_at: int = Field(
|
||||
..., description="Date of the snapshot (UTC timestamp). Deprecated: use created", deprecated=True
|
||||
)
|
||||
created: datetime = Field(..., description="Date of the snapshot (ISO 8601, UTC)")
|
||||
|
||||
@model_validator(mode="before")
|
||||
@classmethod
|
||||
def _derive_created(cls, data):
|
||||
if isinstance(data, dict) and "created" not in data and data.get("created_at") is not None:
|
||||
data = {**data, "created": datetime.fromtimestamp(data["created_at"], tz=timezone.utc)}
|
||||
return data
|
||||
Reference in new issue
Block a user