|
|
|
|
|
from mongoengine import Document, fields, signals |
|
|
from datetime import datetime |
|
|
import hashlib |
|
|
import os |
|
|
|
|
|
class FileAccessLog(Document): |
|
|
"""Journal d'accès aux fichiers""" |
|
|
meta = {'collection': 'file_access_logs'} |
|
|
|
|
|
file_id = fields.ObjectIdField(required=True) |
|
|
user_id = fields.StringField(required=True) |
|
|
access_type = fields.StringField(choices=['view', 'download', 'upload', 'delete']) |
|
|
ip_address = fields.StringField() |
|
|
user_agent = fields.StringField() |
|
|
timestamp = fields.DateTimeField(default=datetime.now) |
|
|
success = fields.BooleanField(default=True) |
|
|
|
|
|
class FileMetadata(Document): |
|
|
"""Métadonnées des fichiers stockés""" |
|
|
meta = {'collection': 'file_metadata'} |
|
|
|
|
|
|
|
|
filename = fields.StringField(required=True, max_length=255) |
|
|
original_filename = fields.StringField(required=True, max_length=255) |
|
|
file_path = fields.StringField(required=True) |
|
|
file_size = fields.IntField(required=True) |
|
|
file_hash = fields.StringField(required=True, unique=True) |
|
|
mime_type = fields.StringField() |
|
|
|
|
|
|
|
|
category = fields.StringField(choices=[ |
|
|
'document', 'image', 'video', 'audio', 'archive', 'other' |
|
|
]) |
|
|
tags = fields.ListField(fields.StringField()) |
|
|
|
|
|
|
|
|
owner_id = fields.StringField(required=True) |
|
|
owner_name = fields.StringField() |
|
|
is_public = fields.BooleanField(default=False) |
|
|
allowed_users = fields.ListField(fields.StringField()) |
|
|
|
|
|
|
|
|
created_at = fields.DateTimeField(default=datetime.now) |
|
|
updated_at = fields.DateTimeField(default=datetime.now) |
|
|
last_accessed = fields.DateTimeField() |
|
|
|
|
|
|
|
|
download_count = fields.IntField(default=0) |
|
|
view_count = fields.IntField(default=0) |
|
|
|
|
|
def calculate_hash(self): |
|
|
"""Calculer le hash SHA256 du fichier""" |
|
|
hash_sha256 = hashlib.sha256() |
|
|
try: |
|
|
with open(self.file_path, "rb") as f: |
|
|
for chunk in iter(lambda: f.read(4096), b""): |
|
|
hash_sha256.update(chunk) |
|
|
return hash_sha256.hexdigest() |
|
|
except: |
|
|
return None |
|
|
|
|
|
class UserPermission(Document): |
|
|
"""Gestion des permissions utilisateur""" |
|
|
meta = {'collection': 'user_permissions'} |
|
|
|
|
|
user_id = fields.StringField(required=True, unique=True) |
|
|
username = fields.StringField(required=True) |
|
|
email = fields.EmailField() |
|
|
|
|
|
|
|
|
is_admin = fields.BooleanField(default=False) |
|
|
can_upload = fields.BooleanField(default=True) |
|
|
can_download = fields.BooleanField(default=True) |
|
|
can_delete_own = fields.BooleanField(default=True) |
|
|
can_delete_others = fields.BooleanField(default=False) |
|
|
|
|
|
|
|
|
storage_limit = fields.IntField(default=1073741824) |
|
|
current_storage_used = fields.IntField(default=0) |
|
|
|
|
|
|
|
|
is_active = fields.BooleanField(default=True) |
|
|
last_login = fields.DateTimeField() |
|
|
created_at = fields.DateTimeField(default=datetime.now) |
|
|
|
|
|
|
|
|
signals.pre_save.connect(lambda sender, document: setattr(document, 'updated_at', datetime.now()), sender=FileMetadata) |