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:
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