feat: Mini-Cloud Plattform - komplette Implementierung Phase 0-8
Selbstgehostete Web-Cloud mit Dateiverwaltung, Kalender, Kontakte, Email-Webclient, Office-Viewer und Passwort-Manager. Backend (Flask/Python): - JWT-Auth mit Access/Refresh Tokens, Benutzerverwaltung - Dateien: Upload/Download, Ordner, Berechtigungen, Share-Links - Kalender: CRUD, Teilen, iCal-Export, CalDAV well-known URLs - Kontakte: Adressbuecher, vCard-Export, Teilen - Email: IMAP/SMTP-Proxy, Multi-Account - Office-Viewer: DOCX/XLSX/PPTX/PDF Vorschau - Passwort-Manager: AES-256-GCM clientseitig, KeePass-Import - Sync-API fuer Desktop/Mobile-Clients - SQLite mit WAL-Modus Frontend (Vue 3 + PrimeVue): - Datei-Explorer mit Breadcrumbs und Share-Dialogen - Monatskalender mit Event-Verwaltung - Kontaktliste mit Adressbuch-Sidebar - Email-Client mit 3-Spalten-Layout - Passwort-Manager mit TOTP und Passwort-Generator - Admin-Panel, Settings, oeffentliche Share-Seite Docker: Multi-Stage Build, Bind Mounts (keine Volumes) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from app.extensions import db
|
||||
|
||||
|
||||
class EmailAccount(db.Model):
|
||||
__tablename__ = 'email_accounts'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False, index=True)
|
||||
display_name = db.Column(db.String(100), nullable=False) # e.g. "Arbeit", "Privat"
|
||||
email_address = db.Column(db.String(255), nullable=False)
|
||||
imap_host = db.Column(db.String(255), nullable=False)
|
||||
imap_port = db.Column(db.Integer, default=993)
|
||||
imap_ssl = db.Column(db.Boolean, default=True)
|
||||
smtp_host = db.Column(db.String(255), nullable=False)
|
||||
smtp_port = db.Column(db.Integer, default=587)
|
||||
smtp_ssl = db.Column(db.Boolean, default=True) # STARTTLS
|
||||
username = db.Column(db.String(255), nullable=False)
|
||||
password_encrypted = db.Column(db.LargeBinary, nullable=False)
|
||||
is_default = db.Column(db.Boolean, default=False)
|
||||
sort_order = db.Column(db.Integer, default=0)
|
||||
created_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc))
|
||||
updated_at = db.Column(db.DateTime, default=lambda: datetime.now(timezone.utc),
|
||||
onupdate=lambda: datetime.now(timezone.utc))
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'display_name': self.display_name,
|
||||
'email_address': self.email_address,
|
||||
'imap_host': self.imap_host,
|
||||
'imap_port': self.imap_port,
|
||||
'imap_ssl': self.imap_ssl,
|
||||
'smtp_host': self.smtp_host,
|
||||
'smtp_port': self.smtp_port,
|
||||
'smtp_ssl': self.smtp_ssl,
|
||||
'username': self.username,
|
||||
'is_default': self.is_default,
|
||||
'sort_order': self.sort_order,
|
||||
}
|
||||
Reference in New Issue
Block a user