def createPeriodicBookings(self, periodicity_type, periodicity_end_date, **kwargs): """ create one object for each item return by getPeriodicityInfos method date already booked will be ignored """ request = self.REQUEST response = request.RESPONSE btool = getToolByName(self, 'portal_booking') booked_obj = self.getBookedObject() infos = self.getPeriodicityInfos(periodicity_type, periodicity_end_date, **kwargs) ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset response.setHeader('Content-type', 'text/plain; charset=%s' % charset) if not infos: msg = _("message_no_booking_created", default=u"No booking created.") return msg created = 0 already_booked = 0 # Get self field values title = self.Title() description = self.Description() fullname = self.getFullName() phone = self.getPhone() email = self.getEmail() periodicity_uid = self.getPeriodicityUID() # create periodic items for pstart_ts, pend_ts, b_booked in infos: if b_booked: already_booked += 1 continue obj_id = self.generateUniqueId('Booking') booked_obj.invokeFactory('Booking', obj_id) obj = getattr(self, obj_id) args = { 'startDate' : btool.ts2zdt(pstart_ts), 'endDate' : btool.ts2zdt(pend_ts), 'title' : title, 'description' : description, 'fullName' : fullname, 'phone' : phone, 'email' : email, 'periodicityUID' : periodicity_uid} obj.edit(**args) created += 1 mapping = {} mapping['created'] = str(created) mapping['already_booked'] = str(already_booked) msg = _("message_create_periodic_bookings", mapping=mapping, default="${created} items created, ${already_booked} already booked") return msg
def post_validate(self, REQUEST, errors): """Validate booked objects""" request = self.REQUEST response = request.RESPONSE ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset start_date = DateTime(REQUEST.get('startDate')) end_date = DateTime(REQUEST.get('endDate')) booked_object_uid = self.getBookedObjectUID() booking_brains = self.getBookingBrains(start_date=start_date, end_date=end_date, getBookedObjectUID=booked_object_uid, review_state=('pending', 'booked')) obj_path = '/'.join(self.getPhysicalPath()) translation_service = getToolByName(self, 'translation_service') _ = translation_service.utranslate if end_date <= start_date: response.setHeader('Content-type', 'text/plain; charset=%s' % charset) msg = _("message_end_date_before_start", default=u"End date has to be strictly after start date.") errors['endDate'] = msg if booking_brains: if len(booking_brains) == 1: brain_path = booking_brains[0].getPath() if obj_path == brain_path: return response.setHeader('Content-type', 'text/plain; charset=%s' % charset) msg = _("message_date_already_booked", default=u"An object is already booked at this date.", domain='plonebooking', context=self) errors['startDate'] = msg errors['endDate'] = msg
def checkValues(self): try: self.start = DateTime(int(self.request.form.get("ts_start", None))) self.end = DateTime(int(self.request.form.get("ts_end", None))) except: self.postMessage( _( u"error_key_error", default = u"Key error" ), "error" ) return False if self.start > self.end: self.postMessage( _(u'error_end_before_start', default = u"Start date great than End date." ), "error" ) return False if self.start + EXPORT_MAX_RANGE_DAYS < self.end: # in this case, the range is too big: we filter to have a range # that is less than EXPORT_MAX_RANGE_DAYS value. self.postMessage( _(u'error_range_too_large', default = u"Please enter a range that fits into ${number} monthes.", mapping = {u"number": int(EXPORT_MAX_RANGE_DAYS/30)} ), "error" ) return False # all tests passed return True
def checkValues(self): try: self.start = DateTime(int(self.request.form.get("ts_start", None))) self.end = DateTime(int(self.request.form.get("ts_end", None))) except: self.postMessage(_(u"error_key_error", default=u"Key error"), "error") return False if self.start > self.end: self.postMessage( _(u'error_end_before_start', default=u"Start date great than End date."), "error") return False if self.start + EXPORT_MAX_RANGE_DAYS < self.end: # in this case, the range is too big: we filter to have a range # that is less than EXPORT_MAX_RANGE_DAYS value. self.postMessage( _(u'error_range_too_large', default= u"Please enter a range that fits into ${number} monthes.", mapping={u"number": int(EXPORT_MAX_RANGE_DAYS / 30)}), "error") return False # all tests passed return True
def post_validate(self, REQUEST, errors): """Validate booked objects""" request = self.REQUEST response = request.RESPONSE ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset start_date = DateTime(REQUEST.get('startDate')) end_date = DateTime(REQUEST.get('endDate')) booked_object_uid = self.getBookedObjectUID() booking_brains = self.getBookingBrains(start_date=start_date, end_date=end_date, getBookedObjectUID=booked_object_uid, review_state=('pending', 'booked')) obj_path = '/'.join(self.getPhysicalPath()) response.setHeader('X-Theme-Disabled', 'True') if end_date <= start_date: response.setHeader('Content-type', 'text/html; charset=%s' % charset) msg = _("message_end_date_before_start", default=u"End date has to be strictly after start date.") errors['endDate'] = msg if booking_brains: if len(booking_brains) == 1: brain_path = booking_brains[0].getPath() if obj_path == brain_path: return response.setHeader('Content-type', 'text/html; charset=%s' % charset) # translation_service = getToolByName(self, 'translation_service') # _ = translation_service.utranslate msg = _("message_date_already_booked", default=u"An object is already booked at this date.", domain='plonebooking', context=self) errors['startDate'] = msg errors['endDate'] = msg
def getFields(self): """ Return the labels of all the fields for this export """ return [ _("label_booking_user_full_name", "Full Name"), _("label_booking_user_phone", "Phone"), _("label_booking_user_email", "Email"), _("label_booking_start_date", "Booking start date"), _("label_booking_end_date", "Booking end date"), ]
def testBookingPeriod(self, REQUEST): """ Test if there are no bookings on the new period defined on this booking """ request = self.REQUEST response = request.RESPONSE errorMessages = "" kwargs = request.form ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset response.setHeader('Content-type', 'text/html; charset=%s' % charset) if kwargs.has_key('start_ts') and kwargs.has_key('end_ts'): start_ts = kwargs.pop('start_ts') end_ts = kwargs.pop('end_ts') if not self._testBookingPeriod(start_ts, end_ts): msg = _( u"message_date_already_booked", default=u"An object is already booked at this date." ) errorMessages += '\n' + msg if errorMessages: btool = getToolByName(self, 'portal_booking') return "%s:%s%s" % ( btool.zdt2ts(self.getStartDate()), btool.zdt2ts(self.getEndDate()), errorMessages ) return True
def getBookingDefaultTitle(self): """Returns booking default title. It is used when no title is defined on booking""" msg_id = "label_booking" msg_default = "Booking" return _(msg_default, msg_id)
def testBookingPeriod(self, REQUEST): """ Test if there are no bookings on the new period defined on this booking """ request = self.REQUEST response = request.RESPONSE errorMessages = "" kwargs = request.form ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset response.setHeader('Content-type', 'text/html; charset=%s' % charset) if kwargs.has_key('start_ts') and kwargs.has_key('end_ts'): start_ts = kwargs.pop('start_ts') end_ts = kwargs.pop('end_ts') if not self._testBookingPeriod(start_ts, end_ts): msg = _(u"message_date_already_booked", default=u"An object is already booked at this date.") errorMessages += '\n' + msg if errorMessages: btool = getToolByName(self, 'portal_booking') return "%s:%s%s" % (btool.zdt2ts(self.getStartDate()), btool.zdt2ts(self.getEndDate()), errorMessages) return True
def updateBooking(self, REQUEST): """ Allow to modify dates with ajax requests """ request = self.REQUEST response = request.RESPONSE errorMessages = "" kwargs = request.form ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset response.setHeader('Content-type', 'text/html; charset=%s' % charset) if kwargs.has_key('start_ts') and kwargs.has_key('end_ts'): start_ts = kwargs.pop('start_ts') end_ts = kwargs.pop('end_ts') if not self._testBookingPeriod(start_ts, end_ts): msg = _(u"message_date_already_booked", default=u"An object is already booked at this date.") errorMessages += '\n' + msg kwargs['startDate'] = DateTime(int(start_ts)) kwargs['endDate'] = DateTime(int(end_ts)) fieldsToValidate = ['fullName', 'phone', 'email'] for fieldName in fieldsToValidate: if kwargs.has_key(fieldName): field = self.getField(fieldName) result = field.validate(kwargs[fieldName], self, errors={}) if result: errorMessages += '\n' + result if errorMessages: btool = getToolByName(self, 'portal_booking') return "%s:%s%s" % (btool.zdt2ts(self.getStartDate()), btool.zdt2ts(self.getEndDate()), errorMessages) else: ftool = getToolByName(self, "portal_factory") try: new_context = ftool.doCreate(self, self.getId()) except AttributeError: # Fallback for AT + plain CMF where we don't have a # portal_factory new_context = self # Initialize end and start dates start_date = kwargs.pop('startDate', None) if start_date is not None: new_context.setStartDate(start_date) end_date = kwargs.pop('endDate', None) if end_date is not None: new_context.setEndDate(end_date) new_context.processForm(values=kwargs) return True
def getFields(self): """Return the labels of all the fields for this export """ return [ _(u"label_booking_title", u"Title"), _(u"label_booking_user_full_name", u"Full Name"), _(u"label_booking_user_phone", u"Phone"), _(u"label_booking_user_email", u"Email"), _(u"label_booking_start_date", u"Booking start date"), _(u"label_booking_end_date", u"Booking end date"), _(u"label_booking_description", u"Booking note"), ]
def __call__(self): self.exporter = getUtility(IBookingExporter) self.formAction = self.request.form.get("form.action", None) is not None self.formResults = None if self.formAction and self.checkValues(): values = self.exporter.getValues(self.getBrains()) if len(values) == 0: self.postMessage(_(u"info_no_results", default=u"There is no booking matching your criteria."), "info") return self.result_template() if self.request.form.get("export_type") == "csv": return self.exportToCsv(values) if self.request.form.get("export_type") == "html": self.formResults = values return self.result_template()
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.exporter = getUtility(IBookingExporter) self.catalog = getToolByName(self.context, "portal_catalog") if request.form.get("export_type") == "csv": self.__call__ = self.exportToCsv elif request.form.get("export_type") == "html": self.values = self.getValues() if len(self.values) < 1: self.context.plone_utils.addPortalMessage( _('info_no_results', "There is no booking matching your criteria."), "info", ) else: self.values = None
def __call__(self): self.exporter = getUtility(IBookingExporter) self.formAction = self.request.form.get("form.action", None) is not None self.formResults = None if self.formAction and self.checkValues(): values = self.exporter.getValues(self.getBrains()) if len(values) == 0: self.postMessage( _(u"info_no_results", default=u"There is no booking matching your criteria."), "info") return self.result_template() if self.request.form.get("export_type") == "csv": return self.exportToCsv(values) if self.request.form.get("export_type") == "html": self.formResults = values return self.result_template()
def __init__(self, context, request): BrowserView.__init__(self, context, request) self.exporter = getUtility(IBookingExporter) self.catalog = getToolByName(self.context, "portal_catalog") if request.form.get("export_type") == "csv": self.__call__ = self.exportToCsv elif request.form.get("export_type") == "html": self.values = self.getValues() if len(self.values) < 1: self.context.plone_utils.addPortalMessage( _( 'info_no_results', "There is no booking matching your criteria." ), "info", ) else: self.values = None
def getValues(self): try: self.start = DateTime(int(self.context.request.form["ts_start"])) self.end = DateTime(int(self.context.request.form["ts_end"])) except KeyError: self.context.request.response.redirect( self.context.absolute_url() + "/export_form") if self.start + 6000 < self.end: # in this case, the range is too big: we filter to have a range # that is less than 60 days. self.context.plone_utils.addPortalMessage( _('error_range_too_large', "Please enter a range that fits into 2 monthes."), "error", ) self.context.request.response.redirect( self.context.absolute_url() + "/export_form") return self.exporter.getValues(self.getBrains())
def testBookingPeriod(self, REQUEST): """ Test if there are no bookings on the new period defined on this booking """ request = self.REQUEST response = request.RESPONSE errorMessages = "" kwargs = request.form ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset response.setHeader('Content-type', 'text/html; charset=%s' % charset) response.setHeader('X-Theme-Disabled', 'True') if 'start_ts'in kwargs and 'end_ts' in kwargs: start_ts = kwargs.pop('start_ts') end_ts = kwargs.pop('end_ts') if not self._testBookingPeriod(start_ts, end_ts): translation_service = getToolByName(self, 'translation_service') _ = translation_service.utranslate msg = _("message_date_already_booked", default=u"An object is already booked at this date.", domain='plonebooking', context=self) errorMessages += '\n' + msg if errorMessages: btool = getToolByName(self, 'portal_booking') return "%s:%s%s" % ( btool.zdt2ts(self.getStartDate()), btool.zdt2ts(self.getEndDate()), errorMessages ) return True
def getValues(self): try: self.start = DateTime(int(self.context.request.form["ts_start"])) self.end = DateTime(int(self.context.request.form["ts_end"])) except KeyError: self.context.request.response.redirect( self.context.absolute_url() + "/export_form" ) if self.start + 6000 < self.end: # in this case, the range is too big: we filter to have a range # that is less than 60 days. self.context.plone_utils.addPortalMessage( _( 'error_range_too_large', "Please enter a range that fits into 2 monthes." ), "error", ) self.context.request.response.redirect( self.context.absolute_url() + "/export_form" ) return self.exporter.getValues(self.getBrains())
def createPeriodicBookings(self, periodicity_type, periodicity_end_date, **kwargs): """ create one object for each item return by getPeriodicityInfos method date already booked will be ignored """ request = self.REQUEST response = request.RESPONSE btool = getToolByName(self, 'portal_booking') booked_obj = self.getBookedObject() infos = self.getPeriodicityInfos(periodicity_type, periodicity_end_date, **kwargs) ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset response.setHeader('Content-type', 'text/html; charset=%s' % charset) if not infos: msg = _(u"message_no_booking_created", default=u"No booking created.") return msg created = 0 already_booked = 0 # Get self field values title = self.Title() description = self.Description() fullname = self.getFullName() phone = self.getPhone() email = self.getEmail() periodicity_uid = self.getPeriodicityUID() # create periodic items for pstart_ts, pend_ts, b_booked in infos: if b_booked: already_booked += 1 continue obj_id = self.generateUniqueId('Booking') booked_obj.invokeFactory('Booking', obj_id) obj = getattr(self, obj_id) args = { 'startDate': btool.ts2zdt(pstart_ts), 'endDate': btool.ts2zdt(pend_ts), 'title': title, 'description': description, 'fullName': fullname, 'phone': phone, 'email': email, 'periodicityUID': periodicity_uid } obj.edit(**args) created += 1 mapping = {} mapping['created'] = str(created) mapping['already_booked'] = str(already_booked) msg = _( u"message_create_periodic_bookings", default=u"${created} items created, ${already_booked} already"\ " booked" ) return msg
from Products.PloneBooking.content.vocabulary import GLOBAL_BOOKING_REVIEW_MODES from Products.PloneBooking.content.vocabulary import CALENDAR_REFRESH_MODES from Products.PloneBooking.config import PROJECTNAME, I18N_DOMAIN from Products.PloneBooking.interfaces import IBookingCenter from Products.PloneBooking import BookingPermissions from Products.PloneBooking import _ DISPLAY_SCHEMATA = 'display' BookingCenterSchema = ATFolderSchema.copy() + Schema(( LinesField( 'types', required=True, widget=LinesWidget( label=_( u'label_types', default=u'Types' ), description= _( u'label_bookingcenter_types', default=u'You can define here a list of bookable object'\ ' types (1 by line)' ), ), ), LinesField( 'categories', required=False, widget=LinesWidget( label=_( u'label_categories', default=u'Categories'
GLOBAL_BOOKING_REVIEW_MODES, CALENDAR_REFRESH_MODES, ) from Products.PloneBooking.config import PROJECTNAME, I18N_DOMAIN from Products.PloneBooking.interfaces import IBookingCenter from Products.PloneBooking import BookingPermissions DISPLAY_SCHEMATA = "display" BookingCenterSchema = ATFolderSchema.copy() + Schema( ( LinesField( "types", required=True, widget=LinesWidget( label=_(u"Types"), description=_( "label_bookingcenter_types", u"You can define here a list of bookable object types (1 by line)" ), ), ), LinesField( "categories", required=False, widget=LinesWidget( label="Categories", description=" ", description_msgid="help_bookingcenter_categories", label_msgid="label_bookingcenter_categories", i18n_domain=I18N_DOMAIN, ),
def updateBooking(self, REQUEST): """ Allow to modify dates with ajax requests """ request = self.REQUEST response = request.RESPONSE errorMessages = "" kwargs = request.form ptool = getToolByName(self, 'portal_properties') charset = ptool.site_properties.default_charset response.setHeader('Content-type', 'text/plain; charset=%s' % charset) if kwargs.has_key('start_ts') and kwargs.has_key('end_ts'): start_ts = kwargs.pop('start_ts') end_ts = kwargs.pop('end_ts') if not self._testBookingPeriod(start_ts, end_ts): translation_service = getToolByName(self, 'translation_service') _ = translation_service.utranslate msg = _("message_date_already_booked", default=u"An object is already booked at this date.", domain='plonebooking', context=self) errorMessages += '\n' + msg kwargs['startDate'] = DateTime(int(start_ts)) kwargs['endDate'] = DateTime(int(end_ts)) fieldsToValidate = ['fullName', 'phone', 'email'] for fieldName in fieldsToValidate: if kwargs.has_key(fieldName): field = self.getField(fieldName) result = field.validate(kwargs[fieldName], self, errors={}) if result: errorMessages += '\n' + result if errorMessages: btool = getToolByName(self, 'portal_booking') return "%s:%s%s" % ( btool.zdt2ts(self.getStartDate()), btool.zdt2ts(self.getEndDate()), errorMessages ) else: ftool = getToolByName(self, "portal_factory") try: new_context = ftool.doCreate(self, self.getId()) except AttributeError: # Fallback for AT + plain CMF where we don't have a portal_factory new_context = self # Initialize end and start dates start_date = kwargs.pop('startDate', None) if start_date is not None: new_context.setStartDate(start_date) end_date = kwargs.pop('endDate', None) if end_date is not None: new_context.setEndDate(end_date) new_context.processForm(values=kwargs) return True
VIEW_MODES, LISTING_VIEWS, GLOBAL_BOOKING_REVIEW_MODES, CALENDAR_REFRESH_MODES) from Products.PloneBooking.config import PROJECTNAME, I18N_DOMAIN from Products.PloneBooking.interfaces import IBookingCenter from Products.PloneBooking import BookingPermissions DISPLAY_SCHEMATA = 'display' BookingCenterSchema = ATFolderSchema.copy() + Schema(( LinesField( 'types', required=True, widget=LinesWidget( label=_(u'Types'), description=_('label_bookingcenter_types', u'You can define here a list of bookable object types (1 by line)'), ), ), LinesField( 'categories', required=False, widget=LinesWidget( label='Categories', description=' ', description_msgid='help_bookingcenter_categories', label_msgid='label_bookingcenter_categories', i18n_domain=I18N_DOMAIN, ), ),
def getBookingDefaultTitle(self): """Returns booking default title. It is used when no title is defined on booking""" return _("label_booking", default=u"Booking")