Esempio n. 1
0
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")
Esempio n. 2
0
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")