# HG changeset patch # User Paul Boddie # Date 1445116147 -7200 # Node ID 851df2f4cfed31706366c584e674448e0e804b31 # Parent 295bb865bfe904affe4affb64310d224a1252973 Allow objects to always be changed. Obtain period sets only after identifying periods to be removed. diff -r 295bb865bfe9 -r 851df2f4cfed imipweb/event.py --- a/imipweb/event.py Sat Oct 17 19:52:09 2015 +0200 +++ b/imipweb/event.py Sat Oct 17 23:09:07 2015 +0200 @@ -53,9 +53,6 @@ (None, "Not indicated"), ] - def can_change_object(self): - return self.is_organiser() or self._is_request() - def can_remove_recurrence(self, recurrence): """ @@ -63,8 +60,7 @@ without notification. """ - return self.can_change_object() and \ - (self.can_edit_recurrence(recurrence) or not self.is_organiser()) and \ + return (self.can_edit_recurrence(recurrence) or not self.is_organiser()) and \ recurrence.origin != "RRULE" def can_edit_recurrence(self, recurrence): @@ -86,8 +82,7 @@ notification. """ - return self.can_change_object() and \ - (self.can_edit_attendee(attendee) or attendee == self.user and self.is_organiser()) + return self.can_edit_attendee(attendee) or attendee == self.user and self.is_organiser() def can_edit_attendee(self, attendee): @@ -237,7 +232,7 @@ if name in "ATTENDEE": rowspan = len(attendees) + 1 elif name == "DTEND": - rowspan = self.can_change_object() and 2 or 1 + rowspan = 2 elif not items: continue @@ -281,7 +276,7 @@ # After the end datetime, show a control to add recurrences. - if name == "DTEND" and self.can_change_object(): + if name == "DTEND": page.tr() page.td() self.control("recur-add", "submit", "add", id="recur-add", class_="add") @@ -321,15 +316,14 @@ # Allow more attendees to be specified. - if self.can_change_object(): - if not first: - page.tr() + if not first: + page.tr() - page.td() - self.control("add", "submit", "add", id="add", class_="add") - page.label("Add attendee", for_="add", class_="add") - page.td.close() - page.tr.close() + page.td() + self.control("add", "submit", "add", id="add", class_="add") + page.label("Add attendee", for_="add", class_="add") + page.td.close() + page.tr.close() # Handle potentially many values of other kinds. @@ -377,7 +371,7 @@ # Show a form control as organiser for new attendees. - if self.can_change_object() and self.can_edit_attendee(attendee_uri): + if self.can_edit_attendee(attendee_uri): self.control("attendee", "value", attendee, size="40") else: self.control("attendee", "hidden", attendee) @@ -450,34 +444,10 @@ page.p("This event occurs on the following occasions within the next %d days:" % self.get_window_size()) - # Show each recurrence in a separate table if editable. - - if self.can_change_object() and recurrences: - - for index, period in enumerate(recurrences): - self.show_recurrence(index, period, self.recurrenceid, recurrenceids, errors) - - # Otherwise, use a compact single table. + # Show each recurrence in a separate table. - else: - page.table(cellspacing=5, cellpadding=5, class_="recurrence") - page.caption("Occurrences") - page.thead() - page.tr() - page.th("Start", class_="objectheading start") - page.th("End", class_="objectheading end") - page.tr.close() - page.thead.close() - page.tbody() - - for index, period in enumerate(recurrences): - page.tr() - self.show_recurrence_label(index, period, self.recurrenceid, recurrenceids, True) - self.show_recurrence_label(index, period, self.recurrenceid, recurrenceids, False) - page.tr.close() - - page.tbody.close() - page.table.close() + for index, period in enumerate(recurrences): + self.show_recurrence(index, period, self.recurrenceid, recurrenceids, errors) def show_recurrence(self, index, period, recurrenceid, recurrenceids, errors=None): @@ -842,49 +812,45 @@ if reply or create or cancel or save: - # Update principal event details if organiser. + # Update time periods (main and recurring). - if self.can_change_object(): - - # Update time periods (main and recurring). + try: + period = self.handle_main_period() + except PeriodError, exc: + return exc.args - try: - period = self.handle_main_period() - except PeriodError, exc: - return exc.args + try: + periods = self.handle_recurrence_periods() + except PeriodError, exc: + return exc.args - try: - periods = self.handle_recurrence_periods() - except PeriodError, exc: - return exc.args + # Set the periods in the object, first obtaining removed and + # modified period information. - # Set the periods in the object, first obtaining removed and - # modified period information. - - to_unschedule, to_exclude = self.get_removed_periods(periods) + to_unschedule, to_exclude = self.get_removed_periods(periods) + periods = set(periods) - changed = self.obj.set_period(period) or changed - changed = self.obj.set_periods(periods) or changed - changed = self.obj.update_exceptions(to_exclude) or changed - changed = self.revert_cancellations(periods) or changed + changed = self.obj.set_period(period) or changed + changed = self.obj.set_periods(periods) or changed + changed = self.obj.update_exceptions(to_exclude) or changed + changed = self.revert_cancellations(periods) or changed - # Organiser-only changes... + # Organiser-only changes... - if self.is_organiser(): + if self.is_organiser(): - # Update summary. + # Update summary. - if args.has_key("summary"): - self.obj["SUMMARY"] = [(args["summary"][0], {})] + if args.has_key("summary"): + self.obj["SUMMARY"] = [(args["summary"][0], {})] - # Obtain any new participants and those to be removed. + # Obtain any new participants and those to be removed. - if self.can_change_object(): - attendees = self.get_attendees_from_page() - removed = [attendees[int(i)] for i in args.get("remove", [])] - added, to_cancel = self.update_attendees(attendees, removed) - single_user = not attendees or attendees == [self.user] - changed = added or changed + attendees = self.get_attendees_from_page() + removed = [attendees[int(i)] for i in args.get("remove", [])] + added, to_cancel = self.update_attendees(attendees, removed) + single_user = not attendees or attendees == [self.user] + changed = added or changed # Update attendee participation for the current user. @@ -996,7 +962,7 @@ "Return period details for the recurrences specified for an event." - return set([p.as_event_period(i) for i, p in enumerate(self.get_recurrences_from_page())]) + return [p.as_event_period(i) for i, p in enumerate(self.get_recurrences_from_page())] # Access to form-originating object information. @@ -1210,7 +1176,7 @@ on whether editing has begun or whether the object has just been loaded. """ - if self.is_initial_load() or not self.can_change_object(): + if self.is_initial_load(): return self.get_stored_main_period() else: return self.get_main_period_from_page() @@ -1222,7 +1188,7 @@ details where no editing is in progress, using form data otherwise. """ - if self.is_initial_load() or not self.can_change_object(): + if self.is_initial_load(): return self.get_stored_recurrences() else: return self.get_recurrences_from_page() @@ -1231,7 +1197,7 @@ "Return an updated collection of recurrences for the current object." - if self.is_initial_load() or not self.can_change_object(): + if self.is_initial_load(): return self.get_stored_recurrences() else: return self.update_recurrences_from_page() @@ -1244,7 +1210,7 @@ form. """ - if self.is_initial_load() or not self.can_change_object(): + if self.is_initial_load(): return self.get_stored_attendees() else: return self.get_attendees_from_page() @@ -1253,7 +1219,7 @@ "Return an updated collection of attendees for the current object." - if self.is_initial_load() or not self.can_change_object(): + if self.is_initial_load(): return self.get_stored_attendees() else: return self.update_attendees_from_page() diff -r 295bb865bfe9 -r 851df2f4cfed imipweb/resource.py --- a/imipweb/resource.py Sat Oct 17 19:52:09 2015 +0200 +++ b/imipweb/resource.py Sat Oct 17 23:09:07 2015 +0200 @@ -611,39 +611,29 @@ page = self.page - # Show controls for editing as organiser. - - if self.can_change_object(): - page.td(class_="objectvalue dt%s" % (show_start and "start" or "end")) + # Show controls for editing. - if show_start: - page.div(class_="dt enabled") - self.date_controls("dtstart", formdate) - page.br() - page.label("Specify times", for_="dttimes-enable", class_="time disabled enable") - page.label("Specify dates only", for_="dttimes-enable", class_="time enabled disable") - page.div.close() + page.td(class_="objectvalue dt%s" % (show_start and "start" or "end")) - else: - page.div(class_="dt disabled") - page.label("Specify end date", for_="dtend-enable", class_="enable") - page.div.close() - page.div(class_="dt enabled") - self.date_controls("dtend", formdate) - page.br() - page.label("End on same day", for_="dtend-enable", class_="disable") - page.div.close() - - page.td.close() - - # Show a label as attendee. + if show_start: + page.div(class_="dt enabled") + self.date_controls("dtstart", formdate) + page.br() + page.label("Specify times", for_="dttimes-enable", class_="time disabled enable") + page.label("Specify dates only", for_="dttimes-enable", class_="time enabled disable") + page.div.close() else: - dt = formdate.as_datetime() - if dt: - page.td(self.format_datetime(dt, "full")) - else: - page.td("(Unrecognised date)") + page.div(class_="dt disabled") + page.label("Specify end date", for_="dtend-enable", class_="enable") + page.div.close() + page.div(class_="dt enabled") + self.date_controls("dtend", formdate) + page.br() + page.label("End on same day", for_="dtend-enable", class_="disable") + page.div.close() + + page.td.close() def show_recurrence_controls(self, index, period, recurrenceid, recurrenceids, show_start): @@ -673,9 +663,9 @@ period = form_period_from_period(period) - # Show controls for editing as organiser. + # Show controls for editing. - if self.can_change_object() and not replaced: + if not replaced: error = errors and (show_start and ("dtstart", index) in errors or not show_start and ("dtend", index) in errors) and " error" or "" page.td(class_="objectvalue dt%s%s" % (show_start and "start" or "end", error))