feat(calllog): Tags einer Gesprächsnotiz zuordnen (n:m)
Backend: - Neues CallLogTag-Model (Tabelle call_logs_tags) mit Relationship auf CallLog (cascade delete-orphan); to_dict liefert 'tags'. - Migration _db_V01_11 (idempotent via create_all). - _set_call_log_tags in create/update_call_log: ersetzt Tag-Zuordnungen, filtert is_parent-Tags, eliminiert Duplikate. - _parse_date wandelt ISO-Strings in date-Objekte (fixt autoflush- Crash bei Date-Spalten). Frontend: - iCallLog um tags (Lesen) und tag_ids (Schreiben) ergänzt. - Neues generisches MultiSelect-Widget (widgets/select.ts): Badges + Edit-Button, inline Modal mit Suchfeld, Checkbox-Liste, OK-Button; konfigurierbare Texte (placeholder, modalTitle, editTooltip). - Call_Log-Formular: Tag-Auswahl via MultiSelect, Submit via FormData.getAll; Tag-Badges in der Listenansicht hinter dem Betreff. Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
1 parent
5abcb2d96c
commit
d30adf1579
6 files changed
+421
-9
No files matched your search
@@ -259,12 +259,19 @@ class CallLog(dbapp.Model):
|
||||
erledigt = Column(Boolean, nullable=False, default=False)
|
||||
|
||||
projekt = relationship('Projekt')
|
||||
# n:m-Beziehung zu Tags über die Verknüpfungstabelle call_logs_tags.
|
||||
# cascade='all, delete-orphan' stellt sicher, dass die Zuordnungen
|
||||
# automatisch gelöscht werden, wenn die Gesprächsnotiz gelöscht wird.
|
||||
tags_rel = relationship(
|
||||
'CallLogTag', cascade='all, delete-orphan', back_populates='call_log'
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
"""
|
||||
Liefert die Gesprächsnotiz als Dictionary. Die Tabellenspalten werden
|
||||
über columns2dict serialisiert; projekt_name und kunden_name werden
|
||||
zusätzlich aus der Projekt-Relationship eingefügt.
|
||||
zusätzlich aus der Projekt-Relationship eingefügt. Die zugeordneten
|
||||
Tags werden als Liste von Tag-Dictionaries unter 'tags' ergänzt.
|
||||
"""
|
||||
result = columns2dict(self)
|
||||
if self.projekt:
|
||||
@@ -273,9 +280,33 @@ class CallLog(dbapp.Model):
|
||||
else:
|
||||
result['projekt_name'] = None
|
||||
result['kunden_name'] = None
|
||||
# Zugeordnete Tags serialisieren (nur is_parent=False sind zuordenbar).
|
||||
result['tags'] = [clt.tag.to_dict() for clt in self.tags_rel]
|
||||
return result
|
||||
|
||||
|
||||
class CallLogTag(dbapp.Model):
|
||||
"""
|
||||
Verknüpfungstabelle für die n:m-Beziehung zwischen Gesprächsnotizen
|
||||
(CallLog) und Tags. Jede Zeile verknüpft eine Gesprächsnotiz mit einem
|
||||
Tag. Der UniqueConstraint stellt sicher, dass jeder Tag nur einmal pro
|
||||
Gesprächsnotiz zugeordnet werden kann.
|
||||
"""
|
||||
__tablename__ = 'call_logs_tags'
|
||||
__bind_key__ = BINDKEY
|
||||
__table_args__ = (
|
||||
UniqueConstraint('call_log_id', 'tag_id', name='uq_calllog_tag'),
|
||||
Index('ix_calllogtag_call_log_id', 'call_log_id'),
|
||||
Index('ix_calllogtag_tag_id', 'tag_id'),
|
||||
)
|
||||
id = Column(Integer, primary_key=True)
|
||||
call_log_id = Column(Integer, ForeignKey('call_logs.id'), nullable=False)
|
||||
tag_id = Column(Integer, ForeignKey('tags.id'), nullable=False)
|
||||
|
||||
call_log = relationship('CallLog', back_populates='tags_rel')
|
||||
tag = relationship('Tag')
|
||||
|
||||
|
||||
class Tag(dbapp.Model):
|
||||
"""
|
||||
Hierarchischer Tag (Taxonomie). Tags koennen beliebig verschachtelt
|
||||
|
||||
Reference in new issue
Block a user