class EventOrgEditForm(form.SchemaForm): """ Define Form handling """ schema = IEventOrgSchema ignoreContext = False label = u"Calendar settings" description = u"Community Calendar settings for this organization." # form_name = u"Calendar settings" # attributes we'll be setting and getting from the # context. The rest will come from the database. context_attributes = ( 'catOptions', 'defaultMajorCats', 'udf1_name', 'udf2_name', ) # attributes we'll get from the database view database_attributes = ( 'name', 'description', 'acronym', 'url', 'alt_cal_url', 'contact', 'email', 'phone', 'ccal_link', ) def __init__(self, context, request): assert(INavigationRoot.providedBy(context)) super(EventOrgEditForm, self).__init__(context, request) self.database = IEventDatabaseProvider(context) request['disable_border'] = 1 request['disable_plone.rightcolumn'] = 1 # self.evq_view = getMultiAdapter((self.context, self.request), name=u'eventquery_view') def getContent(self): """ fill and return a content object """ obj = OrgContext() # orgCatSource will need to be able to get at the database obj._database = self.database for key in EventOrgEditForm.context_attributes: value = getattr(self.context, key, '') setattr(obj, key, value) if self.database.db_org_id: org_data = self.database.getOrgData() for key in EventOrgEditForm.database_attributes: value = org_data.get(key) setattr(obj, key, value) obj.org_categories = [c.title for c in self.database.getOrgCats()] else: obj.name = getattr(self.context, 'title', u"Organization Name") obj.description = getattr(self.context, 'description', u"Organization Description") return obj @button.buttonAndHandler(u'Save') def handleApply(self, action): data, errors = self.extractData() # get write access to the database portal_state = getMultiAdapter( (self.context, self.request), name=u'plone_portal_state' ) navigation_root = portal_state.navigation_root() writer = IEventDatabaseWriteProvider(navigation_root) if errors: self.status = self.formErrorsMessage return for key in EventOrgEditForm.context_attributes: value = data.get(key) setattr(self.context, key, value) org_data = {} for key in EventOrgEditForm.database_attributes: org_data[key] = data.get(key) if writer.db_org_id == 0: db_org_id = writer.insertOrg(**org_data) setattr(navigation_root, 'dbOrgId', db_org_id) else: writer.updateOrgData(**org_data) writer.updateOrgCats(data.get('org_categories', [])) messages = IStatusMessage(self.request) messages.add(u"Organization event settings updated", type=u"info") self.request.response.redirect("caledit") @button.buttonAndHandler(u"Cancel") def handleCancel(self, action): """User cancelled. Redirect back to the front page. """ self.request.response.redirect("caledit")
class EventEditForm(form.SchemaForm): """ Define Form handling """ schema = IEventEditForm ignoreContext = False # attributes we'll get from the database view database_attributes = ( 'eid', 'title', 'description', 'location', 'eventUrl', 'eventContact', 'eventEmail', 'eventPhone', 'begins', 'ends', ) def __init__(self, context, request): assert(INavigationRoot.providedBy(context)) super(EventEditForm, self).__init__(context, request) self.database = IEventDatabaseProvider(context) # get eid from 'eid' or 'form.widgets.eid' self.eid = int( request.form.get('eid', request.form.get('form.widgets.eid', '0').replace(',', '') ) ) self.pdtcal = parsedatetime.Calendar() request['disable_border'] = 1 request['disable_plone.rightcolumn'] = 1 def updateWidgets(self): super(EventEditForm, self).updateWidgets() self.widgets['eid'].mode = z3c.form.interfaces.HIDDEN_MODE def updateActions(self): super(EventEditForm, self).updateActions() delete_action = self.actions.get('handleDelete') if delete_action: delete_action.onclick = u"return confirm('Delete this event?')" def getContent(self): """ fill and return a content object """ def strToDate(s): yr, mo, day = s.split('-') return date(int(yr), int(mo), int(day)) def findRecurs(dates): last_delta = None starts = [d.start for d in dates] prev = strToDate(starts[0]) for start in starts[1:]: dt = strToDate(start) delta = dt - prev if last_delta and delta != last_delta: return None prev = dt last_delta = delta if delta.days == 1: recurs = "daily" elif delta.days == 7: recurs = "weekly" elif delta.days == 7: recurs = "biweekly" else: return None # we need to return an object with start, end, recurs # attributes obj = Recurrence() obj.start = starts[0] obj.end = starts[-1] obj.recurs = recurs return obj obj = EventContext() obj._database = self.database eid = self.eid if eid: event_data = self.database.getEvent(eid) for key in EventEditForm.database_attributes: value = event_data.get(key) setattr(obj, key, value) for key in ('public', 'free', 'community'): setattr(obj, key, event_data[key] == "Y") cats = [c.gcid for c in self.database.getEventCats(eid)] my_cats = [c.gcid for c in self.database.getOrgCats()] org_cats = [] major_cats = [] for gcid in cats: if gcid in my_cats: org_cats.append(gcid) else: major_cats.append(gcid) obj.majorCats = major_cats obj.orgCats = org_cats dates = self.database.getEventDates(eid) # check to see if this is an old-style date list # that happens to recur regularly if len(dates) > 1: recurs = findRecurs(dates) if recurs: # we can normalize it to start, end, recurs dates = [recurs] if len(dates) == 1: # simple scheduling obj.start = strToDate(dates[0].start) obj.end = strToDate(dates[0].end) obj.recurs = dates[0].recurs else: # we are irregularly scheduled obj.start = date.today() obj.end = date.today() obj.recurs = 'irregular' if len(dates): wkdates = [] for d in dates: yr, mo, dy = d.start.split('-') wkdates.append("/".join((mo, dy, yr[2:]))) obj.dates = ", ".join(wkdates) else: obj.start = date.today() obj.end = date.today() portal_state = getMultiAdapter( (self.context, self.request), name=u'plone_portal_state') navigation_root = portal_state.navigation_root() obj.majorCats = getattr(navigation_root, 'defaultMajorCats', []) return obj def _getWriter(self): """ return a database writer """ portal_state = getMultiAdapter( (self.context, self.request), name=u'plone_portal_state' ) navigation_root = portal_state.navigation_root() return IEventDatabaseWriteProvider(navigation_root) @button.buttonAndHandler(u'Save Event') def handleApply(self, action): data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return # get write access to the database writer = self._getWriter() form = self.request.form portal_state = getMultiAdapter( (self.context, self.request), name=u'plone_portal_state' ) member = portal_state.member() eid = data['eid'] event_data = {} for key in EventEditForm.database_attributes: if key != 'eid': if key == 'begins': # ##:## time from struct_time event_data['startTime'] = struct_time2str(form['begins_time']) elif key == 'ends': event_data['endTime'] = struct_time2str(form['ends_time']) else: event_data[key] = data.get(key) for key in ('public', 'free', 'community'): event_data[key] = data.get(key) and "Y" or "N" if eid: writer.updateEvent(eid, member, **event_data) writer.deleteEventCats(eid) writer.deleteEventDates(eid) else: eid = writer.eventInsert(member, **event_data) writer.evCatsInsert(eid, list(data['orgCats'].union(data['majorCats']))) if data['recurs'] == 'irregular': # irregular scheduling; save a list of dates writer.evDatesInsert( eid, [(dt, dt, u"daily") for dt in form['date_list']] ) else: # regular scheduling writer.evDatesInsert(eid, ((data['start'], data['end'], data['recurs']), )) messages = IStatusMessage(self.request) messages.add(u"Event saved", type=u"info") self.request.response.redirect("@@caledit") @button.buttonAndHandler(u"Delete Event", name="handleDelete", condition=lambda form: form.eid != 0) def handleDelete(self, action): """ Delete this event. """ eid = self.eid assert(eid != 0) writer = self._getWriter() writer.deleteEventCats(eid) writer.deleteEventDates(eid) writer.deleteEvent(eid) messages = IStatusMessage(self.request) messages.add(u"Event deleted", type=u"info") self.request.response.redirect("caledit") @button.buttonAndHandler(u"Cancel Edits") def handleCancel(self, action): """User cancelled. Redirect back to the front page. """ self.request.response.redirect("caledit")