ungana

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

commit 6b55189244d9d3b56e892f7234aa706b85542825
parent 09c91c0daa2c55d6eee44658396f73c66ce0cc33
Author: Carlosokumu <carlosokumu254@gmail.com>
Date:   Thu, 14 Aug 2025 21:07:11 +0300

add parsing for editing an ical file

Diffstat:
Mcalendarapp/cmd/args_parser.py | 99++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 80 insertions(+), 19 deletions(-)

diff --git a/calendarapp/cmd/args_parser.py b/calendarapp/cmd/args_parser.py @@ -47,29 +47,39 @@ class ArgsParser: def _add_arguments(self): subparsers = self.parser.add_subparsers(dest='command', required=True) - create_event_parser = subparsers.add_parser('create', help='Create a new calendar event') - - required_event_fields = create_event_parser.add_argument_group('required arguments') - required_event_fields.add_argument("-s", "--summary", required=True, + def add_event_field_args(parser, required_flags=False): + parser.add_argument("-s", "--summary", required=required_flags, help="Event summary (text or via --summary-file)") - required_event_fields.add_argument("--sf", "--summary-file", dest="summary_file", + parser.add_argument("--sf", "--summary-file", dest="summary_file", help="File containing event summary") - required_event_fields.add_argument("-d", "--description", required=True, + parser.add_argument("-d", "--description", required=required_flags, help="Event description (text or via --description-file)") - required_event_fields.add_argument("--df", "--description-file", dest="description_file", + parser.add_argument("--df", "--description-file", dest="description_file", help="File containing event description") - required_event_fields.add_argument("--start", required=True, type=self._validate_datetime, + parser.add_argument("--start", type=self._validate_datetime, required=required_flags, help="Event start time (ISO format or DD-MM-YYYY HH:MM)") - required_event_fields.add_argument("-l", "--location", required=True, help="Event location") - required_event_fields.add_argument("-o", "--organizer", required=True, help="Event organizer") - required_event_fields.add_argument("--tzid", required=True, + parser.add_argument("-l", "--location", required=required_flags, + help="Event location") + parser.add_argument("-o", "--organizer", required=required_flags, + help="Event organizer") + parser.add_argument("--tzid", required=required_flags, help="Time zone ID (e.g., 'Europe/Berlin')") - - event_duration = create_event_parser.add_argument_group('time specification (use one)') - event_duration.add_argument("--end", type=self._validate_datetime, - help="Event end time (ISO format or DD-MM-YYYY HH:MM)") - event_duration.add_argument("--duration", type=self._validate_duration, + parser.add_argument("--duration", type=self._validate_duration, help="Event duration (e.g., '2h' or '30m')") + parser.add_argument("--end", type=self._validate_datetime, + help="Event end time (ISO format or DD-MM-YYYY HH:MM)") + + + create_event_parser = subparsers.add_parser('create', help='Create a new calendar event') + add_event_field_args(create_event_parser, required_flags=True) + + edit_event_parser = subparsers.add_parser('edit', help='Edit a calendar ical file') + edit_event_parser.add_argument("-i", "--ical", required=True, + help="Path to ical file to edit") + edit_event_parser.add_argument("-a", "--all", action="store_true", + help="If your ical file has more than one event, interactively choose one to edit") + add_event_field_args(edit_event_parser, required_flags=False) + def parse_args(self): """Parses CLI args and resolves file-based inputs.""" @@ -92,7 +102,6 @@ class ArgsParser: duration = end_dt - args.start_dt args.duration = f"{duration.seconds//3600}h{(duration.seconds%3600)//60}m" - manager = ICalManager() event_data = { 'start': args.start_dt, 'duration': args.duration, @@ -102,7 +111,59 @@ class ArgsParser: 'organizer': args.organizer, 'tzid': args.tzid } - event = manager.create_event(event_data) - manager.save_to_file(event, 'event.ics') + event = self.ical_manager.create_event(event_data) + self.ical_manager.save_to_file(event, 'event.ics') + if args.command == 'edit': + if not args.ical: + self.parser.error("missing required ical file path to edit") + + try: + cal = self.ical_manager.load_ical_file(args.ical) + except (FileNotFoundError, ValueError) as e: + self.parser.error("corrupted or missing ical file") + + if args.all: + events = self.ical_manager.get_all_events(cal) + + if not events: + self.parser.error("no events found for the selected ical file") + return + + for idx, e in enumerate(events, start=1): + summary = e.get("SUMMARY", "No title") + start = e.get("DTSTART") + print(f"{idx}. {summary} — {start.dt if start else 'No date'}") + + try: + choice = int(input("\nEnter the number of the event you want to edit: ")) + if not (1 <= choice <= len(events)): + raise ValueError + except ValueError: + print("Invalid selection.") + return + + event = events[choice - 1] + + else: + updates = {} + + if args.start is not None: + updates["DTSTART"] = args.start + + if args.duration is not None: + updates["DURATION"] = args.duration + + if args.summary is not None: + updates["SUMMARY"] = args.summary + + if args.location is not None: + updates["LOCATION"] = args.location + + if args.description is not None: + updates["DESCRIPTION"] = args.description + + ##TODO: use ical_manager to update the associated ical event file + + return args \ No newline at end of file