ungana

Unnamed repository; edit this file 'description' to name the repository.
Info | Log | Files | Refs | README

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:
Mungana/cmd/args_parser.py | 34++++++++++++++++++++++++++++++++--
Mungana/ical/ical_manager.py | 27++++++++++++++++++++++++++-
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