commit d798361603998ba187afdcf18b17662ff6a7c012
parent 461d76f8082c6555a362d66dfcf3ee7fbaacff5f
Author: Carlosokumu <carlosokumu254@gmail.com>
Date: Tue, 2 Sep 2025 23:24:04 +0300
allow setting contact and attachment on the create command.
Diffstat:
2 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/ungana/cmd/args_parser.py b/ungana/cmd/args_parser.py
@@ -87,6 +87,10 @@ class ArgsParser:
non_interactive.add_argument("--summary-file", dest="summary_file", help="File containing event summary")
non_interactive.add_argument("--description-file", dest="description_file", help="File containing event description")
non_interactive.add_argument("--tzid", help="Time zone ID")
+ non_interactive.add_argument("-p", "--poster", help="Event headline image")
+ non_interactive.add_argument("--long", type= self._ensure_no_multiline_input,help="Exhaustive description of the event")
+ non_interactive.add_argument("-c", "--contact",type=self._ensure_no_multiline_input, help="Contact details")
+
parser.add_argument("ics_filename", nargs="?", help="Output .ics filename (default: event_<date>.ics)")
parser.add_argument("--domain", type=self._ensure_no_multiline_input,help="Domain used to generate event UID (default: ungana.local)",default="ungana.local")
@@ -99,7 +103,7 @@ class ArgsParser:
def add_edit_args(self, parser):
self.add_common_args(parser, required=False)
parser.add_argument("-p", "--poster", help="Event headline image")
- parser.add_argument("--long", help="Exhaustive description of the event")
+ parser.add_argument("--long", type= self._ensure_no_multiline_input,help="Exhaustive description of the event")
parser.add_argument("-c", "--contact",type=self._ensure_no_multiline_input, help="Contact details")
@@ -401,6 +405,7 @@ class ArgsParser:
def _validate_and_get_create_event_args(self, args):
+ attachments = []
if args.summary_file:
args.summary = self._read_file_or_exit(args.summary_file)
if args.description_file:
@@ -445,6 +450,29 @@ class ArgsParser:
if args.domain:
domain = args.domain
+
+ if args.contact:
+ value, params = self._process_contact_arg(args.contact)
+ if not params and self.EMAIL_RE.match(value):
+ params = {"ALTREP": f"mailto:{value}"}
+ contact = (value, params)
+ elif params:
+ contact = (value, params)
+ else:
+ contact = value
+ else:
+ contact = None,
+
+
+ for ctx_name in ("poster", "long"):
+ arg_val = getattr(args, ctx_name, None)
+ if arg_val:
+ try:
+ prop, value, params = self.attachment_manager.create_attachment(arg_val, ctx=ctx_name)
+ attachments.append((prop, value, params))
+ except Exception as e:
+ self.parser.error(f"Unexpected error: {e}")
+
event_data = {
'summary': args.summary,
'description': args.description,
@@ -453,7 +481,9 @@ class ArgsParser:
'start': args.start_dt,
'duration': args.duration,
'tzid': args.tzid,
- 'domain': domain
+ 'contact': contact,
+ 'domain': domain,
+ 'attachments': attachments
}
return event_data
diff --git a/ungana/ical/ical_manager.py b/ungana/ical/ical_manager.py
@@ -1,5 +1,5 @@
import os
-from icalendar import Calendar, Event, vDatetime
+from icalendar import Calendar, Event, vDatetime, vText
from datetime import datetime,timezone
from typing import Dict, Any
@@ -59,6 +59,31 @@ class ICalManager:
event_status = "CONFIRMED"
event.add("status", event_status)
+
+ if event_data.get("contact"):
+ contact = event_data["contact"]
+ if isinstance(contact, tuple):
+ value, params = contact
+ event.add("contact", vText(value), encode=0)
+ for k, v in params.items():
+ event["contact"].params[k] = v
+ else:
+ event.add("contact", vText(contact), encode=0)
+
+ if event_data.get("attachments"):
+ existing_attachments = set()
+ for attachment in event_data["attachments"]:
+ if isinstance(attachment, tuple) and len(attachment) == 3:
+ prop, value, params = attachment
+ if value not in existing_attachments:
+ event.add(prop, value, parameters=params)
+ existing_attachments.add(value)
+ else:
+ value = str(attachment)
+ if value not in existing_attachments:
+ event.add("ATTACH", value)
+ existing_attachments.add(value)
+
return event