From b014ed596b94304a1ed3fbdf6794ebc422c74fb7 Mon Sep 17 00:00:00 2001 From: David Malinowski Date: Fri, 10 Apr 2026 16:38:11 +0200 Subject: [PATCH] feat: add Git fields on IT Object, Contact custom fields, translations - IT Object: git_remote_url, git_branch, git_path_on_host (visible only when type = Git Repository) - Contact custom fields: teams_user_id, is_external_contractor, contractor_for (via fixtures) - Remove x509_certificate hooks from hooks.py (moved to DocType controller) - Add Custom Field fixture export filter to hooks.py - German translations (de.csv) for all new DocTypes and fields Co-Authored-By: Claude Opus 4.6 (1M context) --- msp/fixtures/custom_field.json | 38 ++++++++ msp/hooks.py | 7 +- msp/msp/doctype/it_object/it_object.json | 38 +++++++- msp/translations/de.csv | 116 +++++++++++++++++++++++ 4 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 msp/fixtures/custom_field.json create mode 100644 msp/translations/de.csv diff --git a/msp/fixtures/custom_field.json b/msp/fixtures/custom_field.json new file mode 100644 index 0000000..9492505 --- /dev/null +++ b/msp/fixtures/custom_field.json @@ -0,0 +1,38 @@ +[ + { + "name": "Contact-teams_user_id", + "doctype": "Custom Field", + "dt": "Contact", + "module": "MSP", + "fieldname": "teams_user_id", + "fieldtype": "Data", + "label": "Teams User ID", + "description": "MS Graph User-ID fuer Chat-Zuordnung", + "insert_after": "department" + }, + { + "name": "Contact-is_external_contractor", + "doctype": "Custom Field", + "dt": "Contact", + "module": "MSP", + "fieldname": "is_external_contractor", + "fieldtype": "Check", + "label": "Is External Contractor", + "description": "Dienstleister (z.B. Solutions Factory)", + "default": "0", + "insert_after": "teams_user_id" + }, + { + "name": "Contact-contractor_for", + "doctype": "Custom Field", + "dt": "Contact", + "module": "MSP", + "fieldname": "contractor_for", + "fieldtype": "Link", + "label": "Contractor For", + "options": "Customer", + "description": "Deren Arbeit zaehlt als Kundenzeit", + "depends_on": "eval:doc.is_external_contractor", + "insert_after": "is_external_contractor" + } +] diff --git a/msp/hooks.py b/msp/hooks.py index 6ffb9d3..7c33d6b 100644 --- a/msp/hooks.py +++ b/msp/hooks.py @@ -98,10 +98,6 @@ doc_events = { "Location": { "before_save": "msp.hooked_methods.build_full_location_path" }, - "x509_certificate": { - "before_save": "msp.certificate_methods.process_certficate_data", - "after_insert": "msp.certificate_methods.set_doctype_name" - }, 'Service Report': { 'before_save': 'msp.tools.save_backlinks', 'on_cancel': 'msp.tools.handle_backlinks', @@ -166,5 +162,6 @@ override_doctype_class = { } fixtures = [ - {"doctype": "Print Format", "filters": {"name": "Standard IT Landscape Documentation"}} + {"doctype": "Print Format", "filters": {"name": "Standard IT Landscape Documentation"}}, + {"doctype": "Custom Field", "filters": {"module": "MSP"}}, ] diff --git a/msp/msp/doctype/it_object/it_object.json b/msp/msp/doctype/it_object/it_object.json index f4f4d5c..1b4256c 100644 --- a/msp/msp/doctype/it_object/it_object.json +++ b/msp/msp/doctype/it_object/it_object.json @@ -64,7 +64,12 @@ "oitc_host_uuid", "documentation_section", "visible_in_documentation", - "documentation_text" + "documentation_text", + "git_section", + "git_remote_url", + "git_branch", + "git_column_break", + "git_path_on_host" ], "fields": [ { @@ -413,11 +418,40 @@ "fieldtype": "Datetime", "label": "Last AD Sync", "read_only": 1 + }, + { + "collapsible": 1, + "depends_on": "eval:doc.type === 'Git Repository'", + "fieldname": "git_section", + "fieldtype": "Section Break", + "label": "Git Repository" + }, + { + "depends_on": "eval:doc.type === 'Git Repository'", + "fieldname": "git_remote_url", + "fieldtype": "Data", + "label": "Git Remote URL" + }, + { + "depends_on": "eval:doc.type === 'Git Repository'", + "fieldname": "git_branch", + "fieldtype": "Data", + "label": "Default Branch" + }, + { + "fieldname": "git_column_break", + "fieldtype": "Column Break" + }, + { + "depends_on": "eval:doc.type === 'Git Repository'", + "fieldname": "git_path_on_host", + "fieldtype": "Data", + "label": "Path on Host" } ], "image_field": "image", "links": [], - "modified": "2026-01-22 10:00:00.000000", + "modified": "2026-04-09 00:00:00.000000", "modified_by": "Administrator", "module": "MSP", "name": "IT Object", diff --git a/msp/translations/de.csv b/msp/translations/de.csv new file mode 100644 index 0000000..7ea7af2 --- /dev/null +++ b/msp/translations/de.csv @@ -0,0 +1,116 @@ +SSL Certificate,SSL-Zertifikat +SSL Certificate Domain,SSL-Zertifikat Domain +SSL Certificate Installation,SSL-Zertifikat Installation +Certificate Name,Zertifikatsname +Common Name (CN),Common Name (CN) +Certificate Type,Zertifikatstyp +Is Wildcard,Ist Wildcard +Not Valid Before,Gültig ab +Not Valid After,Gültig bis +Certificate ZIP,Zertifikat-ZIP +Certificate (PEM),Zertifikat (PEM) +CA Chain (PEM),CA-Kette (PEM) +Private Key (PEM),Privater Schlüssel (PEM) +CSR (PEM),CSR (PEM) +Private Key Match,Schlüssel-Übereinstimmung +CA Chain Valid,CA-Kette gültig +Certificate Details,Zertifikat-Details +Certificate Information,Zertifikat-Informationen +CA Information,CA-Informationen +PEM Data,PEM-Daten +Renewal,Verlängerung +Auto Renew,Automatische Verlängerung +Renewal Method,Verlängerungsmethode +SAN Domains,SAN-Domains +Installations,Installationen +IT Domain,IT-Domain +Domain Type,Domain-Typ +Is Email Domain,Ist E-Mail-Domain +Is Hosting Domain,Ist Hosting-Domain +Registrar & DNS,Registrar & DNS +Registration Date,Registrierungsdatum +Expiry Date,Ablaufdatum +DNS Provider,DNS-Anbieter +Nameservers,Nameserver +Registry Handles,Registry-Handles +Handle Holder,Handle Inhaber +Handle Admin-c,Handle Admin-c +Handle Tech-c,Handle Tech-c +Handle Zone-c,Handle Zone-c +Registrant,Registrant +Registrant Name,Name des Inhabers +Registrant Email,E-Mail des Inhabers +Registrant Address,Adresse des Inhabers +Resolved Info,Aufgelöste Informationen +IP Address,IP-Adresse +MX Records,MX-Einträge +Website Title,Website-Titel +SSL Issuer,SSL-Aussteller +SSL Expiry,SSL-Ablaufdatum +Last Enriched,Zuletzt angereichert +Hosted On,Gehostet auf +IT Contract,IT-Vertrag +Domain,Domain +Customer,Kunde +IT Landscape,IT-Landschaft +Worklog Mapping,Worklog-Zuordnung +Source Type,Quelltyp +Work Tracker Project,Work-Tracker-Projekt +Local Directory,Lokales Verzeichnis +Chat Participant,Chat-Teilnehmer +Pattern,Muster +Employee,Mitarbeiter +Note,Notiz +Notes,Notizen +Nicht zugeordnet,Nicht zugeordnet +Abgelaufen,Abgelaufen +Läuft bald ab,Läuft bald ab +Active,Aktiv +Expired,Abgelaufen +Revoked,Widerrufen +Pending,Ausstehend +Primary,Primär +Alias,Alias +Internal,Intern +Self-hosted,Selbst gehostet +Kein MX,Kein MX +Extern,Extern +Domain Import Wizard,Domain-Import-Assistent +Kunden zuordnen,Kunden zuordnen +Alle anreichern (DNS/HTTP),Alle anreichern (DNS/HTTP) +Hetzner Domain CSV,Hetzner Domain-CSV +Hetzner Handle CSV,Hetzner Handle-CSV +Importieren,Importieren +Schliessen,Schließen +Weiter zur Kundenzuordnung,Weiter zur Kundenzuordnung +Domain-CSV,Domain-CSV +Handle-CSV (optional),Handle-CSV (optional) +DomainReselling.de Zugangsdaten,DomainReselling.de Zugangsdaten +Alle sicheren Vorschlaege zuweisen,Alle sicheren Vorschläge zuweisen +Kunde waehlen,Kunde wählen +Zuweisen,Zuweisen +Zugewiesen,Zugewiesen +Ueberspringen,Überspringen +Domain / Inhaber,Domain / Inhaber +Kunde,Kunde +Match,Übereinstimmung +Enrich (DNS/HTTP/SSL),Anreichern (DNS/HTTP/SSL) +Download,Herunterladen +Copy to Clipboard,In Zwischenablage kopieren +Certificate,Zertifikat +Private Key,Privater Schlüssel +Fullchain,Vollständige Kette +Cert + Key,Zertifikat + Schlüssel +CA Chain,CA-Kette +In Zwischenablage kopiert,In Zwischenablage kopiert +heruntergeladen,heruntergeladen +Nicht vorhanden,Nicht vorhanden +Saved,Gespeichert +Import,Import +Hosting,Hosting +Verification,Überprüfung +Status,Status +IT Object,IT-Objekt +Service,Dienst +Path,Pfad +Domain Name,Domainname